dia-gov's picture
Upload 569 files
cd6f98e verified
raw
history blame
2.06 kB
import { Menu as MenuPrimitive, Transition } from "@headlessui/react";
import clsx from "clsx";
import type { ReactNode } from "react";
import { Fragment } from "react";
import { FaChevronDown } from "react-icons/fa";
interface MenuProps {
icon?: ReactNode;
chevron?: boolean;
name?: string;
buttonPosition?: "top" | "bottom";
items: JSX.Element[];
}
function Menu({ icon, name, items, chevron, buttonPosition = "top" }: MenuProps) {
return (
<MenuPrimitive>
<div className="relative">
<MenuPrimitive.Button className="flex h-8 items-center gap-1 rounded-lg bg-slate-1 p-2 font-bold shadow-depth-1 hover:bg-slate-3">
<div>{icon}</div>
{name && <p className="text-gray/50 font-mono text-sm">{name}</p>}
{chevron && <FaChevronDown size={15} className="ml-2" />}
</MenuPrimitive.Button>
<MenuItems buttonPosition={buttonPosition} items={items} />
</div>
</MenuPrimitive>
);
}
type MenuItemsProps = {
buttonPosition: "top" | "bottom";
items: JSX.Element[];
show?: boolean;
};
export const MenuItems = ({ buttonPosition, items, show }: MenuItemsProps) => {
return (
<Transition
show={show ? true : undefined}
enter="transition duration-100 ease-out"
enterFrom="transform scale-95 opacity-0"
enterTo="transform scale-100 opacity-100"
leave="transition duration-75 ease-out"
leaveFrom="transform scale-100 opacity-100"
leaveTo="transform scale-95 opacity-0"
>
<MenuPrimitive.Items
className={clsx(
"background-color-3 absolute right-0 z-20 max-h-48 w-fit min-w-full overflow-hidden rounded-xl shadow-xl",
buttonPosition === "top" ? "top-full mt-1" : "bottom-full mb-9"
)}
>
{items.map((item, i) => {
return (
<MenuPrimitive.Item key={i} as={Fragment}>
<div className="w-full">{item}</div>
</MenuPrimitive.Item>
);
})}
</MenuPrimitive.Items>
</Transition>
);
};
export default Menu;