Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Navbar not working when collapsed for small screen #47

Closed
diramazioni opened this issue Jun 7, 2023 · 4 comments
Closed

Navbar not working when collapsed for small screen #47

diramazioni opened this issue Jun 7, 2023 · 4 comments

Comments

@diramazioni
Copy link
Contributor

When the page is shown on small width screen the Navbar is collapsed, but clicking on it doesn't reveal the contents.
I think it's a pretty vital fix to make it usable on mobile

@PaulBratslavsky
Copy link
Contributor

PaulBratslavsky commented Jun 7, 2023

@diramazioni Thank you. That still needs to be implemented. Will add it to the todo list.

@diramazioni
Copy link
Contributor Author

Considering that I'm new to Next.js and Tailwindcss (with a little help of GPT) I was able to make it work please review it:
Navbar.tsx

"use client";
import Logo from "./Logo";
import Link from "next/link";
import { usePathname } from "next/navigation";
import { useState } from 'react';

interface NavLink {
  id: number;
  url: string;
  newTab: boolean;
  text: string;
}

function NavLink({ url, text }: NavLink) {
  const path = usePathname().replace(/^\/\w+/, '');
  const isActive = path === url;
  if (isActive) {
    return (
      <li className="flex">
        <span
          className={`flex items-center mx-4 -mb-1 border-b-2 dark:border-transparent dark:text-teal-400 dark:border-teal-400`}
        >
          {text}
        </span>
        </li>
    );
  }        
  return (
    <li className="flex">
      <Link
        href={url}
        className={`flex items-center mx-4 -mb-1 dark:border-transparent}`}
      >
        {text}
      </Link>
    </li>
  );
}

export default function Navbar({
  links,
  logoUrl,
  logoText,
}: {
  links: Array<NavLink>;
  logoUrl: string | null;
  logoText: string | null;
}) {
  const [isMenuOpen, setIsMenuOpen] = useState(false);

  const toggleMenu = () => {
    setIsMenuOpen(!isMenuOpen);
  };
  return (
    <div className="p-4 bg-col dark:text-gray-100">
      <div className="container flex justify-between h-16 mx-auto px-0 sm:px-6">
        <Logo src={logoUrl}>
          {logoText && <h2 className="text-2xl font-bold">{logoText}</h2>}
        </Logo>

        <div className="items-center flex-shrink-0 hidden lg:flex">
          <ul className="items-stretch hidden space-x-3 lg:flex">
            {links.map((item: NavLink) => (
              <NavLink key={item.id} {...item} />
            ))}
          </ul>
        </div>
      <div className="relative lg:hidden">      
        <button className="p-4"  onClick={toggleMenu}>
          <svg
            xmlns="http://www.w3.org/2000/svg"
            fill="none"
            viewBox="0 0 24 24"
            stroke="currentColor"
            className="w-6 h-6 dark:text-gray-100"
          >
            <path
              strokeLinecap="round"
              strokeLinejoin="round"
              strokeWidth="2"
              d="M4 6h16M4 12h16M4 18h16"
            ></path>
          </svg>
        </button>
        {isMenuOpen && (
          <ul className="absolute mt-2 py-2 w-30 bg-col rounded-md shadow-lg">
            {links.map((item: NavLink) => (
              <NavLink key={item.id} {...item} />
            ))}
          </ul>
        )}        
      </div>
      </div>
    </div>
  );
}

immagine
(don't look at the background I'm experimenting with different colors and this will be the subject of other issues)

One note: I've attempted to fix the fact that path was != url because the locale was present in the path:
const path = usePathname().replace(/^\/\w+/, '');
I don't know if there is a better way...

@AnasGamal
Copy link
Contributor

In pull request #62, I have included the necessary implementation to enhance the codebase.

To achieve cleaner icon importing, I have utilized the '@heroicons/react' library, an official tailwindcss library. This approach replaces the inline SVG method.

Furthermore, for the mobile menu modal functionality, I have employed the '@headlessui/react' library. This library, being an official tailwindcss component library, provides a convenient solution for creating the modal.

This is what it looks like:
homepageView
mobileMenuView

@PaulBratslavsky
Copy link
Contributor

Thank you all I am closing this issue since I merged @AnasGamal code that implement the mobile menu.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants