Spaces:
Runtime error
Runtime error
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; | |