mirror of
https://github.com/vercel/commerce.git
synced 2025-05-12 20:57:51 +00:00
96 lines
3.8 KiB
TypeScript
96 lines
3.8 KiB
TypeScript
'use client';
|
|
|
|
import { Popover, PopoverGroup, PopoverPanel, Transition } from '@headlessui/react';
|
|
import clsx from 'clsx';
|
|
import { Menu } from 'lib/shopify/types';
|
|
import Link from 'next/link';
|
|
import { usePathname } from 'next/navigation';
|
|
import { Fragment, useState } from 'react';
|
|
|
|
const MainMenu = ({ menu }: { menu: Menu[] }) => {
|
|
const pathname = usePathname();
|
|
const [open, setOpen] = useState('');
|
|
|
|
return menu.length ? (
|
|
<div className="mt-2 hidden h-11 w-full border-b text-sm font-medium md:flex">
|
|
<PopoverGroup as={Fragment}>
|
|
<div className="z-10 flex h-full w-full items-center justify-center gap-8 px-4 lg:gap-16">
|
|
{menu.map((item: Menu) => {
|
|
const isActiveItem =
|
|
item.path === pathname ||
|
|
item.items.some((subItem: Menu) => subItem.path === pathname);
|
|
if (!item.items.length) {
|
|
return (
|
|
<Link
|
|
key={`navbar-${item.title}-${item.path}`}
|
|
href={item.path}
|
|
className={`flex h-full items-center ${isActiveItem ? 'text-black' : 'text-neutral-600 hover:text-black'}`}
|
|
>
|
|
{item.title}
|
|
</Link>
|
|
);
|
|
}
|
|
|
|
const isOpen = open === item.path;
|
|
return (
|
|
<Popover key={`navbar-${item.title}-${item.path}`} className="relative flex h-full">
|
|
<div
|
|
className="relative flex"
|
|
onMouseOver={() => setOpen(item.path)}
|
|
onMouseLeave={() => setOpen('')}
|
|
>
|
|
<Link
|
|
href={item.path}
|
|
className={clsx(
|
|
'relative z-10 flex items-center border-b-2 px-2 pt-px transition-colors duration-200 ease-out focus-visible:ring-0 focus-visible:ring-offset-0',
|
|
{
|
|
'border-gray-500 text-black': isOpen || isActiveItem,
|
|
'border-transparent text-neutral-600 hover:text-black':
|
|
!isOpen && !isActiveItem
|
|
}
|
|
)}
|
|
>
|
|
{item.title}
|
|
</Link>
|
|
<Transition
|
|
as={Fragment}
|
|
enter="transition ease-out duration-200"
|
|
enterFrom="opacity-0"
|
|
enterTo="opacity-100"
|
|
leave="transition ease-in duration-150"
|
|
leaveFrom="opacity-100"
|
|
leaveTo="opacity-0"
|
|
show={isOpen}
|
|
>
|
|
<PopoverPanel
|
|
static
|
|
className="absolute inset-x-0 left-1/2 top-full z-10 mt-1 min-w-32 max-w-sm -translate-x-1/2 transform text-sm"
|
|
>
|
|
<div className="overflow-hidden rounded-md shadow-lg ring-1 ring-black/5">
|
|
<ul className="flex flex-col space-y-3 bg-white px-4 py-3">
|
|
{item.items.map((subItem: Menu) => (
|
|
<li key={`sub-nav-${subItem.title}-${subItem.path}`}>
|
|
<Link
|
|
href={subItem.path}
|
|
className={`border-b ${subItem.path === pathname ? 'border-black text-black' : 'border-transparent text-neutral-600 hover:text-black'}`}
|
|
>
|
|
{subItem.title}
|
|
</Link>
|
|
</li>
|
|
))}
|
|
</ul>
|
|
</div>
|
|
</PopoverPanel>
|
|
</Transition>
|
|
</div>
|
|
</Popover>
|
|
);
|
|
})}
|
|
</div>
|
|
</PopoverGroup>
|
|
</div>
|
|
) : null;
|
|
};
|
|
|
|
export default MainMenu;
|