import * as React from "react" import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu" import { cn } from "../libs/utils" import { CheckIcon, ChevronRightIcon } from "lucide-react" const HoverMenuContext = React.createContext(false); function DropdownMenu({ ...props }: React.ComponentProps) { return } function DropdownMenuPortal({ ...props }: React.ComponentProps) { return ( ) } function DropdownMenuTrigger({ ...props }: React.ComponentProps) { return ( ) } function DropdownMenuContent({ className, align = "start", sideOffset = 4, ...props }: React.ComponentProps) { return ( ) } function DropdownMenuGroup({ ...props }: React.ComponentProps) { return ( ) } function DropdownMenuItem({ className, inset, variant = "default", ...props }: React.ComponentProps & { inset?: boolean variant?: "default" | "destructive" }) { return ( ) } function DropdownMenuCheckboxItem({ className, children, checked, inset, ...props }: React.ComponentProps & { inset?: boolean }) { return ( {children} ) } function DropdownMenuRadioGroup({ ...props }: React.ComponentProps) { return ( ) } function DropdownMenuRadioItem({ className, children, inset, ...props }: React.ComponentProps & { inset?: boolean }) { return ( {children} ) } function DropdownMenuLabel({ className, inset, ...props }: React.ComponentProps & { inset?: boolean }) { return ( ) } function DropdownMenuSeparator({ className, ...props }: React.ComponentProps) { return ( ) } function DropdownMenuShortcut({ className, ...props }: React.ComponentProps<"span">) { return ( ) } function DropdownMenuSub({ ...props }: React.ComponentProps) { return } function DropdownMenuSubTrigger({ className, inset, children, ...props }: React.ComponentProps & { inset?: boolean }) { return ( {children} ) } function DropdownMenuSubContent({ className, ...props }: React.ComponentProps) { return ( ) } export { DropdownMenu, DropdownMenuPortal, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuGroup, DropdownMenuLabel, DropdownMenuItem, DropdownMenuCheckboxItem, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubTrigger, DropdownMenuSubContent, } // High-level convenience components const alignMap = { left: 'start', center: 'center', right: 'end' } as const; interface DropdownProps { trigger: React.ReactNode; children: React.ReactNode | React.ReactNode[]; align?: 'left' | 'center' | 'right'; hover?: boolean; } export function Dropdown({ trigger, children, align = 'right', hover }: DropdownProps) { const [open, setOpen] = React.useState(false); const closeTimer = React.useRef | null>(null); if (hover) { const onEnter = () => { if (closeTimer.current) clearTimeout(closeTimer.current); setOpen(true); }; const onLeave = () => { closeTimer.current = setTimeout(() => setOpen(false), 80); }; const alignClass = align === 'right' ? 'right-0' : align === 'center' ? 'left-1/2 -translate-x-1/2' : 'left-0'; return (
{trigger} {open && (
{children}
)}
); } return ( {trigger} {children} ); } interface MenuGroupProps { children: React.ReactNode | React.ReactNode[]; label?: string; } export function MenuGroup({ children, label }: MenuGroupProps) { return ( {label && {label}} {children} ); } interface MenuItemProps { children: React.ReactNode | React.ReactNode[]; onClick?: (ev: React.MouseEvent) => void; href?: string; closeOnClick?: boolean; isDisabled?: boolean; variant?: "default" | "destructive"; className?: string; } export function MenuItem({ children, href, onClick, isDisabled = false, variant = "default", className }: MenuItemProps) { const isHoverMenu = React.useContext(HoverMenuContext); const baseClass = cn( "w-full gap-2 rounded-md px-1.5 py-1 text-sm text-nowrap [&_svg:not([class*='size-'])]:size-4 flex cursor-default items-center select-none [&_svg]:pointer-events-none [&_svg]:shrink-0", variant === 'destructive' ? 'text-destructive' : '', isDisabled ? 'pointer-events-none opacity-50' : 'hover:bg-muted focus:bg-muted', className ); if (isHoverMenu) { const handleClick = (e: React.MouseEvent) => { e.stopPropagation(); onClick?.(e); }; return href ? {children} : ; } return ( { e.stopPropagation(); onClick?.(e); }} asChild={!!href} > {href ? {children} : <>{children}} ); }