/** * @factory/ui — DropdownMenu (Radix `@radix-ui/react-dropdown-menu` wrapper). * * Keyboard is HANDLED BY RADIX: ArrowUp/Down move the highlight, Home/End * jump, Enter/Space activates the highlighted item, Escape and Tab close * (Tab returns focus to the trigger). We only re-export the primitives and * add a small anchor-state hook for programmatic open/close. */ import * as React from "react"; import * as RadixMenu from "@radix-ui/react-dropdown-menu"; import { clsx } from "clsx"; export const DropdownMenu = RadixMenu.Root; export const DropdownMenuTrigger = RadixMenu.Trigger; export const DropdownMenuGroup = RadixMenu.Group; export const DropdownMenuPortal = RadixMenu.Portal; export const DropdownMenuRadioGroup = RadixMenu.RadioGroup; export const DropdownMenuContent = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef >(({ className, sideOffset = 4, ...props }, ref) => ( )); DropdownMenuContent.displayName = "DropdownMenuContent"; export const DropdownMenuItem = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef >(({ className, ...props }, ref) => ( )); DropdownMenuItem.displayName = "DropdownMenuItem"; export const DropdownMenuCheckboxItem = React.forwardRef< React.ElementRef, React.ComponentPropsWithoutRef >(({ className, children, checked, ...props }, ref) => ( ✓ {children} )); DropdownMenuCheckboxItem.displayName = "DropdownMenuCheckboxItem"; export const DropdownMenuLabel = ({ className, ...props }: React.HTMLAttributes) => (
); export const DropdownMenuSeparator = ({ className, ...props }: React.ComponentPropsWithoutRef) => ( ); export interface MenuState { open: boolean; anchor: { x: number; y: number } | null; openAt(x: number, y: number): void; close(): void; } /** Programmatic open/close state; pair with `DropdownMenu open={open} onOpenChange={…}`. */ export function useMenuState(): MenuState { const [open, setOpen] = React.useState(false); const [anchor, setAnchor] = React.useState<{ x: number; y: number } | null>(null); const openAt = React.useCallback((x: number, y: number) => { setAnchor({ x, y }); setOpen(true); }, []); const close = React.useCallback(() => setOpen(false), []); return { open, anchor, openAt, close } as const; }