@avenue-ticketing/ui 0.4.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/dist/react/avatar.d.ts +42 -0
  2. package/dist/react/avatar.js +159 -0
  3. package/dist/react/avatar.js.map +1 -0
  4. package/dist/react/badge.d.ts +12 -0
  5. package/dist/react/badge.js +35 -1
  6. package/dist/react/badge.js.map +1 -1
  7. package/dist/react/button.d.ts +1 -1
  8. package/dist/react/button.js +3 -3
  9. package/dist/react/button.js.map +1 -1
  10. package/dist/react/calendar.d.ts +13 -0
  11. package/dist/react/calendar.js +4639 -0
  12. package/dist/react/calendar.js.map +1 -0
  13. package/dist/react/card.d.ts +11 -0
  14. package/dist/react/card.js +113 -0
  15. package/dist/react/card.js.map +1 -0
  16. package/dist/react/checkbox.d.ts +11 -0
  17. package/dist/react/checkbox.js +131 -0
  18. package/dist/react/checkbox.js.map +1 -0
  19. package/dist/react/datetime-picker.d.ts +21 -0
  20. package/dist/react/datetime-picker.js +6124 -0
  21. package/dist/react/datetime-picker.js.map +1 -0
  22. package/dist/react/dialog.js +1 -1
  23. package/dist/react/dialog.js.map +1 -1
  24. package/dist/react/dropdown.d.ts +26 -9
  25. package/dist/react/dropdown.js +194 -96
  26. package/dist/react/dropdown.js.map +1 -1
  27. package/dist/react/input.d.ts +7 -0
  28. package/dist/react/input.js +15 -2
  29. package/dist/react/input.js.map +1 -1
  30. package/dist/react/pagination.d.ts +28 -0
  31. package/dist/react/pagination.js +262 -0
  32. package/dist/react/pagination.js.map +1 -0
  33. package/dist/react/popover.d.ts +76 -0
  34. package/dist/react/popover.js +564 -0
  35. package/dist/react/popover.js.map +1 -0
  36. package/dist/react/scroll-header.js +13 -1
  37. package/dist/react/scroll-header.js.map +1 -1
  38. package/dist/react/scroll-wheel.d.ts +45 -0
  39. package/dist/react/scroll-wheel.js +557 -0
  40. package/dist/react/scroll-wheel.js.map +1 -0
  41. package/dist/react/select.d.ts +62 -0
  42. package/dist/react/select.js +889 -0
  43. package/dist/react/select.js.map +1 -0
  44. package/dist/react/sheet.js +1 -1
  45. package/dist/react/sheet.js.map +1 -1
  46. package/dist/react/switch.d.ts +38 -0
  47. package/dist/react/switch.js +117 -0
  48. package/dist/react/switch.js.map +1 -0
  49. package/dist/react/table-pagination.d.ts +15 -0
  50. package/dist/react/table-pagination.js +1153 -0
  51. package/dist/react/table-pagination.js.map +1 -0
  52. package/dist/react/table-view/column-menu.d.ts +15 -0
  53. package/dist/react/table-view/column-menu.js +918 -0
  54. package/dist/react/table-view/column-menu.js.map +1 -0
  55. package/dist/react/table-view/index.d.ts +70 -0
  56. package/dist/react/table-view/index.js +2155 -0
  57. package/dist/react/table-view/index.js.map +1 -0
  58. package/dist/react/table.d.ts +86 -0
  59. package/dist/react/table.js +414 -0
  60. package/dist/react/table.js.map +1 -0
  61. package/dist/react/tabs.d.ts +9 -3
  62. package/dist/react/tabs.js +204 -48
  63. package/dist/react/tabs.js.map +1 -1
  64. package/dist/react/textarea.d.ts +6 -0
  65. package/dist/react/textarea.js +33 -0
  66. package/dist/react/textarea.js.map +1 -0
  67. package/dist/react/time-picker.d.ts +22 -0
  68. package/dist/react/time-picker.js +856 -0
  69. package/dist/react/time-picker.js.map +1 -0
  70. package/dist/react/tooltip.d.ts +45 -0
  71. package/dist/react/tooltip.js +540 -0
  72. package/dist/react/tooltip.js.map +1 -0
  73. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/lib/utils.ts","../../src/react/button.tsx","../../src/react/dropdown.tsx"],"names":["React","jsx"],"mappings":"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","file":"dropdown.js","sourcesContent":["import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import * as React from \"react\";\n\nimport { cn } from \"@/lib/utils\";\n\nconst sizeClass = {\n xs: \"h-8 min-h-8 gap-2 px-4 text-xs has-[>svg]:px-3 [&_svg:not([class*='size-'])]:size-3\",\n default:\n \"h-10 min-h-10 gap-2 px-5 text-sm has-[>svg]:px-4 [&_svg:not([class*='size-'])]:size-4\",\n lg: \"h-11 min-h-11 gap-2 px-6 text-base has-[>svg]:px-5 [&_svg:not([class*='size-'])]:size-5\",\n} as const;\n\n/** Square hit targets for `iconOnly` — same keys as `sizeClass` (`default` | `lg`). */\nconst iconOnlySizeClass = {\n xs: \"size-8 min-h-8 min-w-8 gap-0 p-0 [&_svg:not([class*='size-'])]:size-3\",\n default:\n \"size-10 min-h-10 min-w-10 gap-0 p-0 [&_svg:not([class*='size-'])]:size-4\",\n lg: \"size-11 min-h-11 min-w-11 gap-0 p-0 [&_svg:not([class*='size-'])]:size-5\",\n} as const;\n\nconst roundedClass = {\n full: \"rounded-full\",\n lg: \"rounded-lg\",\n md: \"rounded-md\",\n} as const;\n\nconst variantClass = {\n primary:\n \"bg-primary text-background border border-transparent hover:bg-primary/90 active:bg-primary/85\",\n secondary:\n \"bg-background text-primary border border-primary/10 hover:bg-primary/5\",\n destructive:\n \"bg-background text-red-500 border border-red-500/25 hover:bg-red-500/5\",\n success:\n \"bg-background text-green-500 border border-green-500/25 hover:bg-green-500/5\",\n} as const;\n\nexport type ButtonProps = React.ComponentProps<\"button\"> & {\n /**\n * Visual style: neutral (`secondary`, `primary`), or outline (`destructive`,\n * `success`) using Tailwind `red-500` / `green-500` text and matching borders on\n * `bg-background` (no solid fill).\n */\n variant?: keyof typeof variantClass;\n /**\n * Corner radius. Labeled buttons default to `full` (pill). `iconOnly` buttons\n * default to `md` (square corners) unless you pass `rounded` explicitly.\n */\n rounded?: keyof typeof roundedClass;\n /** Height and horizontal padding: `default` or `lg` only. */\n size?: keyof typeof sizeClass;\n /**\n * Square icon-only control; same `size` presets (`default` | `lg`). Pair with\n * `aria-label` (or `title`) when there is no visible text.\n */\n iconOnly?: boolean;\n};\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n className,\n type = \"button\",\n variant = \"secondary\",\n rounded: roundedProp,\n size = \"default\",\n iconOnly = false,\n disabled,\n ...props\n },\n ref,\n ) => {\n const rounded = roundedProp ?? (iconOnly ? \"md\" : \"full\");\n\n return (\n <button\n type={type}\n disabled={disabled}\n data-slot=\"button\"\n data-icon-only={iconOnly ? \"\" : undefined}\n className={cn(\n \"inline-flex shrink-0 cursor-pointer items-center justify-center whitespace-nowrap outline-none transition-[color,background-color,box-shadow,transform] duration-150 ease-out active:scale-[0.98] [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n \"disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50\",\n \"focus-visible:border-ring font-bold tracking-wide focus-visible:ring-ring/50 focus-visible:ring-[3px]\",\n iconOnly ? iconOnlySizeClass[size] : sizeClass[size],\n roundedClass[rounded],\n variantClass[variant],\n className,\n )}\n ref={ref}\n {...props}\n />\n );\n },\n);\nButton.displayName = \"Button\";\n\nexport { Button };\n","\"use client\";\nimport React, {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { Check, ChevronDown, ChevronRight, X } from \"lucide-react\";\nimport { Button, type ButtonProps } from \"./button\";\nimport { cn } from \"@/lib/utils\";\n\n/** Panel transform motion — matches `sheet.tsx` `PANEL_OPEN_EASING` / `PANEL_CLOSE_EASING`. */\nconst DROPDOWN_PANEL_OPEN_EASING = \"cubic-bezier(0,0.55,0.45,1)\";\nconst DROPDOWN_PANEL_CLOSE_EASING = \"cubic-bezier(0.55,0,1,0.45)\";\n\n/** Scrim opacity — matches `sheet.tsx` `BACKDROP_OPEN_EASING` / `BACKDROP_CLOSE_EASING`. */\nconst DROPDOWN_BACKDROP_OPEN_EASING = \"cubic-bezier(0.85,0,0.15,1)\";\nconst DROPDOWN_BACKDROP_CLOSE_EASING = \"cubic-bezier(0.55,0,1,0.45)\";\n\n/** Floor for `minWidth=\"trigger\"` so narrow triggers don’t produce an overly tight menu (12rem). */\nconst DROPDOWN_MENU_MIN_WIDTH_PX = 192;\n\n/** Mobile menu as bottom sheet — matches `dialog.tsx` (`DIALOG_MOBILE_BOTTOM_SHEET_MAX_PX` + `DIALOG_MOTION_MS`). */\nconst DROPDOWN_MOBILE_SHEET_MAX_PX = 1024;\n/** Mobile sheet panel + backdrop (slightly under `DIALOG_MOTION_MS` for snappier feel). */\nconst DROPDOWN_MOBILE_SHEET_MOTION_MS = 175;\nconst DROPDOWN_MOBILE_SHEET_ENTRY_EASING = \"cubic-bezier(0.85, 0, 0.15, 1)\";\nconst DROPDOWN_MOBILE_SHEET_EXIT_EASING = \"cubic-bezier(0.85, 0, 1, 0.15)\";\n\n/** Default slide distance for mobile sheet when `slideEntrance` — matches `SLIDE_ENTRANCE_OFFSET_PX.full` in `dialog.tsx`. */\nconst DROPDOWN_MOBILE_SHEET_SLIDE_ENTRANCE_OFFSET_DEFAULT_PX = 120;\n\n/** Mark portaled sub-menus so root outside-dismiss ignores clicks inside them. */\nconst DROPDOWN_SUB_CONTENT_ATTR = \"data-dropdown-sub-content\";\n\n/**\n * Slightly larger menu copy when viewport ≤1024px — same cutoff as the mobile\n * bottom sheet (`DROPDOWN_MOBILE_SHEET_MAX_PX`). Padding unchanged.\n */\nconst DROPDOWN_SHEET_MENU_TEXT = \"max-[1024px]:text-base\";\nconst DROPDOWN_SHEET_MENU_SHORTCUT = \"max-[1024px]:text-sm\";\nconst DROPDOWN_SHEET_MENU_LABEL_TEXT = \"max-[1024px]:text-sm\";\n\n//////////////////////////////////////////////// Positioning helpers\n\ntype Side = \"top\" | \"bottom\" | \"left\" | \"right\";\ntype Align = \"start\" | \"center\" | \"end\";\n\ninterface Pos {\n top: number;\n left: number;\n side: Side;\n}\n\n/** `transformOrigin` / pre-mount transform for the root floating menu (not sub-menus). */\nconst DROPDOWN_CONTENT_ORIGIN: Record<Side, string> = {\n bottom: \"top center\",\n top: \"bottom center\",\n left: \"right center\",\n right: \"left center\",\n};\nconst DROPDOWN_CONTENT_HIDDEN: Record<Side, string> = {\n bottom: \"translateY(-4px) scale(0.97)\",\n top: \"translateY(4px) scale(0.97)\",\n left: \"translateX(4px) scale(0.97)\",\n right: \"translateX(-4px) scale(0.97)\",\n};\n\n/** Sub-menu flyout uses a different origin on the horizontal axis. */\nconst SUB_CONTENT_ORIGIN: Record<Side, string> = {\n bottom: \"top center\",\n top: \"bottom center\",\n left: \"right top\",\n right: \"left top\",\n};\n\nfunction computePos(\n trigger: HTMLElement,\n menu: HTMLElement,\n side: Side,\n align: Align,\n offset: number,\n pad: number,\n): Pos {\n const tr = trigger.getBoundingClientRect();\n const mr = menu.getBoundingClientRect();\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n const sx = window.scrollX;\n const sy = window.scrollY;\n\n let top = 0;\n let left = 0;\n let effectiveSide = side;\n\n const calc = (s: Side) => {\n switch (s) {\n case \"bottom\":\n top = tr.bottom + sy + offset;\n if (align === \"start\") left = tr.left + sx;\n else if (align === \"end\") left = tr.right + sx - mr.width;\n else left = tr.left + sx + tr.width / 2 - mr.width / 2;\n break;\n case \"top\":\n top = tr.top + sy - mr.height - offset;\n if (align === \"start\") left = tr.left + sx;\n else if (align === \"end\") left = tr.right + sx - mr.width;\n else left = tr.left + sx + tr.width / 2 - mr.width / 2;\n break;\n case \"right\":\n left = tr.right + sx + offset;\n if (align === \"start\") top = tr.top + sy;\n else if (align === \"end\") top = tr.bottom + sy - mr.height;\n else top = tr.top + sy + tr.height / 2 - mr.height / 2;\n break;\n case \"left\":\n left = tr.left + sx - mr.width - offset;\n if (align === \"start\") top = tr.top + sy;\n else if (align === \"end\") top = tr.bottom + sy - mr.height;\n else top = tr.top + sy + tr.height / 2 - mr.height / 2;\n break;\n }\n };\n\n calc(side);\n\n // flip\n if (side === \"bottom\" && top + mr.height > vh + sy - pad) {\n const ft = tr.top + sy - mr.height - offset;\n if (ft >= sy + pad) {\n effectiveSide = \"top\";\n top = ft;\n }\n } else if (side === \"top\" && top < sy + pad) {\n const ft = tr.bottom + sy + offset;\n if (ft + mr.height <= vh + sy - pad) {\n effectiveSide = \"bottom\";\n top = ft;\n }\n } else if (side === \"right\" && left + mr.width > vw + sx - pad) {\n const fl = tr.left + sx - mr.width - offset;\n if (fl >= sx + pad) {\n effectiveSide = \"left\";\n left = fl;\n }\n } else if (side === \"left\" && left < sx + pad) {\n const fl = tr.right + sx + offset;\n if (fl + mr.width <= vw + sx - pad) {\n effectiveSide = \"right\";\n left = fl;\n }\n }\n\n // clamp\n left = Math.max(sx + pad, Math.min(left, vw + sx - mr.width - pad));\n top = Math.max(sy + pad, Math.min(top, vh + sy - mr.height - pad));\n\n return { top, left, side: effectiveSide };\n}\n\n//////////////////////////////////////////////// Mobile detection\n\nfunction useIsMobile(breakpoint = 1025): boolean {\n const [isMobile, setIsMobile] = useState(false);\n useEffect(() => {\n const mq = window.matchMedia(`(max-width: ${breakpoint - 1}px)`);\n setIsMobile(mq.matches);\n const handler = (e: MediaQueryListEvent) => setIsMobile(e.matches);\n mq.addEventListener(\"change\", handler);\n return () => mq.removeEventListener(\"change\", handler);\n }, [breakpoint]);\n return isMobile;\n}\n\n//////////////////////////////////////////////// Context\n\ntype DropdownCtx = {\n open: boolean;\n setOpen: (v: boolean) => void;\n triggerRef: React.RefObject<HTMLElement | null>;\n radioValues: Record<string, string>;\n setRadioValue: (group: string, value: string) => void;\n};\n\nconst DropdownContext = React.createContext<DropdownCtx | undefined>(undefined);\n\nfunction useDropdown() {\n const ctx = React.useContext(DropdownContext);\n if (!ctx)\n throw new Error(\"Dropdown components must be used within <Dropdown />\");\n return ctx;\n}\n\n// Sub-menu context (for nested menus)\ntype SubCtx = {\n open: boolean;\n setOpen: (v: boolean) => void;\n triggerRef: React.RefObject<HTMLElement | null>;\n};\nconst SubContext = React.createContext<SubCtx | undefined>(undefined);\n\n//////////////////////////////////////////////// Root\n\ninterface DropdownProps {\n children: React.ReactNode;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n}\n\nexport const Dropdown: React.FC<DropdownProps> = ({\n children,\n open: controlledOpen,\n onOpenChange,\n}) => {\n const [internalOpen, setInternalOpen] = useState(false);\n const isControlled = controlledOpen !== undefined;\n const open = isControlled ? controlledOpen : internalOpen;\n const triggerRef = useRef<HTMLElement | null>(null);\n const [radioValues, setRadioValues] = useState<Record<string, string>>({});\n\n const setOpen = useCallback(\n (v: boolean) => {\n if (!isControlled) setInternalOpen(v);\n onOpenChange?.(v);\n },\n [isControlled, onOpenChange],\n );\n\n const setRadioValue = useCallback((group: string, value: string) => {\n setRadioValues((prev) => ({ ...prev, [group]: value }));\n }, []);\n\n const ctx = useMemo(\n () => ({ open, setOpen, triggerRef, radioValues, setRadioValue }),\n [open, setOpen, radioValues, setRadioValue],\n );\n\n return (\n <DropdownContext.Provider value={ctx}>{children}</DropdownContext.Provider>\n );\n};\n\n//////////////////////////////////////////////// Trigger\n\nexport type DropdownTriggerProps = Omit<ButtonProps, \"type\"> & {\n /**\n * Merge trigger behavior onto a single child (e.g. your own `Button`).\n * Without `asChild`, the trigger renders the shared `Button` primitive.\n */\n asChild?: boolean;\n};\n\nfunction mergeTriggerRef(\n triggerRef: React.RefObject<HTMLElement | null>,\n node: HTMLElement | null,\n childRef: React.Ref<HTMLElement> | undefined,\n) {\n triggerRef.current = node;\n if (typeof childRef === \"function\") childRef(node);\n else if (childRef && typeof childRef === \"object\")\n (childRef as React.MutableRefObject<HTMLElement | null>).current = node;\n}\n\nexport const DropdownTrigger = React.forwardRef<\n HTMLButtonElement,\n DropdownTriggerProps\n>(\n (\n {\n children,\n asChild,\n className,\n onClick: onClickProp,\n disabled,\n ...buttonProps\n },\n ref,\n ) => {\n const { open, setOpen, triggerRef } = useDropdown();\n\n const handleClick = useCallback(\n (e: React.MouseEvent<HTMLElement>) => {\n onClickProp?.(e as React.MouseEvent<HTMLButtonElement>);\n e.stopPropagation();\n if (disabled) return;\n setOpen(!open);\n },\n [disabled, onClickProp, open, setOpen],\n );\n\n const setButtonRef = useCallback(\n (el: HTMLButtonElement | null) => {\n triggerRef.current = el;\n if (typeof ref === \"function\") ref(el);\n else if (ref) ref.current = el;\n },\n [ref, triggerRef],\n );\n\n if (asChild && React.isValidElement(children)) {\n const child = children as React.ReactElement<{\n onClick?: React.MouseEventHandler<HTMLElement>;\n ref?: React.Ref<HTMLElement>;\n className?: string;\n \"aria-expanded\"?: boolean;\n \"aria-haspopup\"?: string;\n \"data-state\"?: string;\n }>;\n return React.cloneElement(child, {\n ref: (node: HTMLElement | null) => {\n mergeTriggerRef(\n triggerRef,\n node,\n (\n child as React.ReactElement<unknown> & {\n ref?: React.Ref<HTMLElement>;\n }\n ).ref,\n );\n },\n className: cn(\"group\", child.props.className),\n onClick: (e: React.MouseEvent<HTMLElement>) => {\n child.props.onClick?.(e);\n handleClick(e);\n },\n \"aria-expanded\": open,\n \"aria-haspopup\": \"menu\",\n \"data-state\": open ? \"open\" : \"closed\",\n ...(disabled !== undefined\n ? {\n disabled,\n }\n : {}),\n } as Partial<typeof child.props>);\n }\n\n return (\n <Button\n ref={setButtonRef}\n type=\"button\"\n {...buttonProps}\n disabled={disabled}\n className={cn(\"group\", className)}\n aria-expanded={open}\n aria-haspopup=\"menu\"\n data-state={open ? \"open\" : \"closed\"}\n onClick={handleClick as React.MouseEventHandler<HTMLButtonElement>}\n >\n {children}\n </Button>\n );\n },\n);\nDropdownTrigger.displayName = \"DropdownTrigger\";\n\n/** Chevron for menu triggers; rotates 180° when the menu is open. */\nexport function DropdownChevron({\n className,\n ...props\n}: React.ComponentProps<typeof ChevronDown>) {\n const { open } = useDropdown();\n return (\n <ChevronDown\n aria-hidden\n className={cn(\"size-4 shrink-0\", open && \"rotate-180\", className)}\n {...props}\n />\n );\n}\n\n//////////////////////////////////////////////// Mobile sheet close\n\nexport interface DropdownMobileCloseProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {}\n\n/**\n * Dismiss control for the mobile bottom-sheet menu. Styling matches\n * {@link DialogCloseButton} (circular hit target, X icon).\n */\nexport const DropdownMobileClose = React.forwardRef<\n HTMLButtonElement,\n DropdownMobileCloseProps\n>(({ className, type = \"button\", ...props }, ref) => {\n return (\n <button\n ref={ref}\n type={type}\n className={cn(\n \"z-100 flex size-12 shrink-0 cursor-pointer items-center justify-center rounded-full transition-all hover:bg-secondary-background active:scale-[0.96]\",\n className,\n )}\n {...props}\n >\n <X className=\"size-5.5\" />\n <span className=\"sr-only\">Close</span>\n </button>\n );\n});\nDropdownMobileClose.displayName = \"DropdownMobileClose\";\n\n//////////////////////////////////////////////// Mobile bottom sheet (shared root + sub)\n\ninterface DropdownMobileBottomSheetPortalProps extends Omit<\n React.HTMLAttributes<HTMLDivElement>,\n \"ref\"\n> {\n children: React.ReactNode;\n open: boolean;\n isAnimating: boolean;\n slideEntrance: boolean;\n slideOffsetPx: number;\n mobileTitle?: string;\n onRequestClose: () => void;\n menuRef: React.RefObject<HTMLDivElement | null>;\n /** Root menu uses `z-50`; nested sub-menu sheet should stack above (e.g. `z-[70]`). */\n portalZClassName?: string;\n}\n\nfunction DropdownMobileBottomSheetPortal({\n open,\n isAnimating,\n slideEntrance,\n slideOffsetPx,\n mobileTitle,\n onRequestClose,\n menuRef,\n portalZClassName = \"z-50\",\n children,\n className,\n style,\n ...panelProps\n}: DropdownMobileBottomSheetPortalProps) {\n const sheetMotion = open\n ? DROPDOWN_MOBILE_SHEET_ENTRY_EASING\n : DROPDOWN_MOBILE_SHEET_EXIT_EASING;\n const sheetHiddenTransform = slideEntrance\n ? `translateY(${slideOffsetPx}px)`\n : \"translateY(100%)\";\n\n return createPortal(\n <div\n className={cn(\n \"fixed inset-0 flex items-end justify-center p-0\",\n portalZClassName,\n )}\n >\n <div\n className={cn(\n \"fixed inset-0 bg-black/40 dark:bg-black/60\",\n isAnimating ? \"opacity-100\" : \"opacity-0\",\n )}\n style={{\n transitionProperty: \"opacity\",\n transitionDuration: `${DROPDOWN_MOBILE_SHEET_MOTION_MS}ms`,\n transitionTimingFunction: sheetMotion,\n }}\n onClick={onRequestClose}\n />\n <div\n {...panelProps}\n ref={menuRef}\n className={cn(\n \"bg-background border-primary/10 relative z-10 flex w-full max-h-[min(90dvh,calc(100dvh-env(safe-area-inset-bottom,0px)))] flex-col overflow-hidden shadow-2xl outline-none\",\n \"rounded-t-2xl rounded-b-none border-x-0 border-b-0 border-t\",\n className,\n )}\n style={{\n transform: isAnimating ? \"translateY(0)\" : sheetHiddenTransform,\n opacity: isAnimating ? 1 : 0,\n transitionProperty: \"transform, opacity\",\n transitionDuration: `${DROPDOWN_MOBILE_SHEET_MOTION_MS}ms`,\n transitionTimingFunction: sheetMotion,\n ...style,\n }}\n >\n <div\n className={cn(\n \"flex w-full shrink-0 items-center py-2 pl-4 pr-2\",\n mobileTitle ? \"justify-between gap-3\" : \"justify-end\",\n )}\n >\n {mobileTitle ? (\n <p className=\"text-foreground min-w-0 flex-1 truncate text-base font-semibold\">\n {mobileTitle}\n </p>\n ) : null}\n <DropdownMobileClose\n onClick={(e) => {\n e.stopPropagation();\n onRequestClose();\n }}\n />\n </div>\n <div className=\"min-h-0 flex-1 overflow-y-auto pb-[max(0.375rem,env(safe-area-inset-bottom,0px))]\">\n <div className=\"pb-1\">{children}</div>\n </div>\n </div>\n </div>,\n document.body,\n );\n}\n\n//////////////////////////////////////////////// Content\n\ninterface DropdownContentProps extends React.HTMLAttributes<HTMLDivElement> {\n side?: Side;\n align?: Align;\n /** Gap in px between the trigger and the menu edge (default 10). */\n offset?: number;\n duration?: number;\n viewportPadding?: number;\n closeOnEscape?: boolean;\n /** Minimum width in px, or `\"trigger\"` to match the trigger (never below 192px). */\n minWidth?: number | \"trigger\";\n /** Loop keyboard focus at list boundaries */\n loop?: boolean;\n /**\n * On viewports ≤1024px (same as `Dialog` mobile bottom sheet), render as a\n * bottom sheet instead of a floating menu. Defaults to true.\n */\n mobileSheet?: boolean;\n /** Title shown in the mobile sheet header (optional) */\n mobileTitle?: string;\n /**\n * Mobile bottom sheet only. When `true` (default), panel motion matches Dialog\n * `slideEntrance`: `translateY(slideEntranceOffsetPx)` + opacity, with the same\n * double-RAF open timing as `DialogContent`. When `false`, uses full\n * `translateY(100%)` like Dialog’s default narrow-viewport bottom sheet.\n */\n slideEntrance?: boolean;\n /** Mobile sheet only; defaults to 120px (same as Dialog `slideEntrance` for `size=\"full\"`). */\n slideEntranceOffsetPx?: number;\n}\n\nexport const DropdownContent: React.FC<DropdownContentProps> = ({\n children,\n side = \"bottom\",\n align = \"start\",\n offset = 10,\n duration = 80,\n viewportPadding = 8,\n closeOnEscape = true,\n minWidth = \"trigger\",\n loop = true,\n mobileSheet = true,\n mobileTitle,\n slideEntrance = true,\n slideEntranceOffsetPx: slideEntranceOffsetPxProp,\n className,\n style,\n ...props\n}) => {\n const isMobile = useIsMobile(DROPDOWN_MOBILE_SHEET_MAX_PX + 1);\n const { open, setOpen, triggerRef } = useDropdown();\n const [shouldRender, setShouldRender] = useState(false);\n const [isAnimating, setIsAnimating] = useState(false);\n const [pos, setPos] = useState<Pos>({ top: -9999, left: -9999, side });\n const [triggerW, setTriggerW] = useState(0);\n const menuRef = useRef<HTMLDivElement>(null);\n\n const slideOffsetPx = useMemo(\n () =>\n slideEntranceOffsetPxProp ??\n DROPDOWN_MOBILE_SHEET_SLIDE_ENTRANCE_OFFSET_DEFAULT_PX,\n [slideEntranceOffsetPxProp],\n );\n\n const closeDuration =\n isMobile && mobileSheet ? DROPDOWN_MOBILE_SHEET_MOTION_MS : duration;\n\n const closeMenu = useCallback(() => setOpen(false), [setOpen]);\n\n /** Same open/close sequencing as `useDialogRenderLifecycle` in `dialog.tsx`. */\n useEffect(() => {\n if (open) {\n setShouldRender(true);\n } else {\n setIsAnimating(false);\n const timer = setTimeout(() => setShouldRender(false), closeDuration);\n return () => clearTimeout(timer);\n }\n }, [open, closeDuration]);\n\n useEffect(() => {\n if (!shouldRender || !open) return;\n let raf2 = 0;\n const raf1 = requestAnimationFrame(() => {\n raf2 = requestAnimationFrame(() => setIsAnimating(true));\n });\n return () => {\n cancelAnimationFrame(raf1);\n if (raf2) cancelAnimationFrame(raf2);\n };\n }, [shouldRender, open]);\n\n // Position\n useLayoutEffect(() => {\n if (!shouldRender || !triggerRef.current || !menuRef.current) return;\n const update = () => {\n if (!triggerRef.current || !menuRef.current) return;\n setTriggerW(triggerRef.current.getBoundingClientRect().width);\n setPos(\n computePos(\n triggerRef.current,\n menuRef.current,\n side,\n align,\n offset,\n viewportPadding,\n ),\n );\n };\n update();\n window.addEventListener(\"resize\", update);\n window.addEventListener(\"scroll\", update, true);\n return () => {\n window.removeEventListener(\"resize\", update);\n window.removeEventListener(\"scroll\", update, true);\n };\n }, [shouldRender, side, align, offset, viewportPadding]);\n\n // Focus the menu surface on open (not the first item) so nothing looks\n // “selected” until the user arrows or hovers. ArrowDown moves to items[0].\n useEffect(() => {\n if (isAnimating && menuRef.current) {\n menuRef.current.focus();\n }\n }, [isAnimating]);\n\n // Close on outside click\n useEffect(() => {\n if (!open) return;\n const handler = (e: MouseEvent) => {\n const t = e.target as Node;\n if (menuRef.current?.contains(t) || triggerRef.current?.contains(t))\n return;\n const el = e.target instanceof Element ? e.target : null;\n if (el?.closest?.(`[${DROPDOWN_SUB_CONTENT_ATTR}]`)) return;\n setOpen(false);\n };\n document.addEventListener(\"mousedown\", handler);\n return () => document.removeEventListener(\"mousedown\", handler);\n }, [open, setOpen, triggerRef]);\n\n // Keyboard navigation\n useEffect(() => {\n if (!open) return;\n const handler = (e: KeyboardEvent) => {\n const menu = menuRef.current;\n if (!menu) return;\n const focusedEl = document.activeElement as HTMLElement | null;\n // Sub-menus portal outside `menu`; don't hijack keys meant for them\n if (focusedEl && !menu.contains(focusedEl)) return;\n const items = getItems(menu);\n const idx = items.indexOf(focusedEl!);\n\n switch (e.key) {\n case \"Escape\":\n if (closeOnEscape) {\n e.preventDefault();\n setOpen(false);\n triggerRef.current?.focus();\n }\n break;\n case \"ArrowDown\":\n e.preventDefault();\n if (items.length === 0) break;\n if (idx === -1 || (idx === items.length - 1 && loop))\n items[0]?.focus();\n else if (idx < items.length - 1) items[idx + 1]?.focus();\n break;\n case \"ArrowUp\":\n e.preventDefault();\n if (items.length === 0) break;\n if (idx <= 0 && loop) items[items.length - 1]?.focus();\n else if (idx > 0) items[idx - 1]?.focus();\n break;\n case \"Home\":\n e.preventDefault();\n items[0]?.focus();\n break;\n case \"End\":\n e.preventDefault();\n items[items.length - 1]?.focus();\n break;\n case \"Tab\":\n setOpen(false);\n break;\n }\n };\n window.addEventListener(\"keydown\", handler);\n return () => window.removeEventListener(\"keydown\", handler);\n }, [open, closeOnEscape, loop, setOpen, triggerRef]);\n\n // Body scroll lock\n useEffect(() => {\n if (open && isMobile && mobileSheet) {\n document.body.style.overflow = \"hidden\";\n }\n return () => {\n document.body.style.overflow = \"\";\n };\n }, [open, isMobile, mobileSheet]);\n\n if (!shouldRender || typeof document === \"undefined\") return null;\n\n // ─── Mobile bottom-sheet mode (chrome + motion match `Dialog` bottom sheet) ─\n if (isMobile && mobileSheet) {\n return (\n <DropdownMobileBottomSheetPortal\n {...props}\n open={open}\n isAnimating={isAnimating}\n slideEntrance={slideEntrance}\n slideOffsetPx={slideOffsetPx}\n mobileTitle={mobileTitle}\n onRequestClose={closeMenu}\n menuRef={menuRef}\n portalZClassName=\"z-50\"\n className={className}\n style={style}\n role=\"menu\"\n aria-orientation=\"vertical\"\n tabIndex={-1}\n >\n {children}\n </DropdownMobileBottomSheetPortal>\n );\n }\n\n // ─── Desktop floating menu mode ──────────────────────────────────────────\n const resolvedMinW =\n minWidth === \"trigger\"\n ? Math.max(triggerW, DROPDOWN_MENU_MIN_WIDTH_PX)\n : minWidth;\n\n return createPortal(\n <div\n {...props}\n ref={menuRef}\n role=\"menu\"\n aria-orientation=\"vertical\"\n tabIndex={-1}\n className={cn(\n \"bg-background border-primary/10 absolute z-50 overflow-hidden rounded-xl border py-1.5 shadow-xl outline-none\",\n className,\n )}\n style={{\n position: \"absolute\",\n top: pos.top,\n left: pos.left,\n minWidth: resolvedMinW,\n transformOrigin: DROPDOWN_CONTENT_ORIGIN[pos.side],\n transform: isAnimating ? \"none\" : DROPDOWN_CONTENT_HIDDEN[pos.side],\n opacity: isAnimating ? 1 : 0,\n transitionProperty: \"opacity, transform\",\n transitionDuration: `${duration}ms`,\n transitionTimingFunction: isAnimating\n ? DROPDOWN_PANEL_OPEN_EASING\n : DROPDOWN_PANEL_CLOSE_EASING,\n ...style,\n }}\n >\n {children}\n </div>,\n document.body,\n );\n};\n\n/** Returns all focusable menu items, excluding disabled ones */\nfunction getItems(menu: HTMLElement): HTMLElement[] {\n return Array.from(\n menu.querySelectorAll<HTMLElement>(\n '[role=\"menuitem\"]:not([aria-disabled=\"true\"]),' +\n '[role=\"menuitemcheckbox\"]:not([aria-disabled=\"true\"]),' +\n '[role=\"menuitemradio\"]:not([aria-disabled=\"true\"])',\n ),\n );\n}\n\n//////////////////////////////////////////////// Item\n\ninterface DropdownItemProps extends React.HTMLAttributes<HTMLDivElement> {\n disabled?: boolean;\n destructive?: boolean;\n icon?: React.ReactNode;\n shortcut?: string;\n /** Close menu on click (default true) */\n closeOnSelect?: boolean;\n inset?: boolean;\n}\n\nexport const DropdownItem: React.FC<DropdownItemProps> = ({\n children,\n disabled = false,\n destructive = false,\n icon,\n shortcut,\n closeOnSelect = true,\n inset = false,\n className,\n onClick,\n ...props\n}) => {\n const { setOpen } = useDropdown();\n\n const handleClick = (e: React.MouseEvent<HTMLDivElement>) => {\n if (disabled) return;\n onClick?.(e);\n if (closeOnSelect) setOpen(false);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n handleClick(e as unknown as React.MouseEvent<HTMLDivElement>);\n }\n };\n\n return (\n <div\n {...props}\n role=\"menuitem\"\n tabIndex={disabled ? undefined : -1}\n aria-disabled={disabled}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n className={cn(\n \"relative mx-1.5 flex items-center gap-2 rounded-md px-3 py-2 text-sm transition-colors outline-none select-none\",\n DROPDOWN_SHEET_MENU_TEXT,\n inset && \"pl-9\",\n !disabled && \"cursor-pointer\",\n disabled && \"lg:cursor-not-allowed\",\n !disabled &&\n !destructive &&\n \"text-foreground hover:bg-primary/8 focus-visible:bg-primary/8 dark:hover:bg-primary/4 dark:focus-visible:bg-primary/4\",\n !disabled &&\n destructive &&\n \"text-destructive hover:bg-destructive/10 focus-visible:bg-destructive/10 dark:text-destructive-foreground dark:hover:bg-destructive-foreground/18 dark:focus-visible:bg-destructive-foreground/18\",\n disabled &&\n !destructive &&\n \"text-foreground/45 dark:text-foreground/50\",\n disabled &&\n destructive &&\n \"bg-destructive/5 text-destructive/75 dark:bg-destructive-foreground/12 dark:text-destructive-foreground/78\",\n className,\n )}\n >\n {icon && (\n <span className=\"flex size-4 shrink-0 items-center justify-center\">\n {icon}\n </span>\n )}\n <span className=\"flex-1\">{children}</span>\n {shortcut ? (\n <span\n className={cn(\n \"ml-auto text-xs tracking-widest\",\n DROPDOWN_SHEET_MENU_SHORTCUT,\n destructive\n ? \"text-destructive/70 dark:text-destructive-foreground/80\"\n : \"opacity-40\",\n )}\n >\n {shortcut}\n </span>\n ) : null}\n </div>\n );\n};\n\n//////////////////////////////////////////////// Separator\n\nexport const DropdownSeparator: React.FC<\n React.HTMLAttributes<HTMLDivElement>\n> = ({ className, ...props }) => (\n <div\n role=\"separator\"\n className={cn(\"border-primary/10 my-1.5 border-t\", className)}\n {...props}\n />\n);\n\n//////////////////////////////////////////////// Label\n\nexport const DropdownLabel: React.FC<\n React.HTMLAttributes<HTMLDivElement> & { inset?: boolean }\n> = ({ className, inset, ...props }) => (\n <div\n className={cn(\n \"text-primary/50 px-4 py-2 text-xs font-medium\",\n DROPDOWN_SHEET_MENU_LABEL_TEXT,\n inset && \"pl-9\",\n className,\n )}\n {...props}\n />\n);\n\n//////////////////////////////////////////////// Checkbox Item\n\n/** Brief pause so the filled box reads before the stroke draws (Fresha-style tick). */\nconst DROPDOWN_CHECKBOX_TICK_DELAY_MS = 60;\n/** Time for the check polyline to draw from first vertex to the end. */\nconst DROPDOWN_CHECKBOX_TICK_DRAW_MS = 200;\n\n/**\n * Same check shape as Lucide (two segments), vertex order reversed so the\n * stroke-dash reveal runs along the path in the intended direction.\n */\nfunction DropdownCheckboxItemCheckMark() {\n const lineRef = useRef<SVGPolylineElement>(null);\n\n useLayoutEffect(() => {\n const poly = lineRef.current;\n if (!poly || typeof poly.getTotalLength !== \"function\") return;\n const len = poly.getTotalLength();\n if (len <= 0) return;\n\n poly.style.strokeDasharray = `${len}`;\n poly.style.strokeDashoffset = `${len}`;\n\n if (typeof poly.animate !== \"function\") {\n poly.style.strokeDashoffset = \"0\";\n return;\n }\n\n const anim = poly.animate(\n [{ strokeDashoffset: len }, { strokeDashoffset: 0 }],\n {\n duration: DROPDOWN_CHECKBOX_TICK_DRAW_MS,\n delay: DROPDOWN_CHECKBOX_TICK_DELAY_MS,\n easing: \"cubic-bezier(0.45, 0, 0.2, 1)\",\n fill: \"forwards\",\n },\n );\n return () => anim.cancel();\n }, []);\n\n return (\n <svg\n className=\"size-4 shrink-0 overflow-visible\"\n viewBox=\"0 0 24 24\"\n aria-hidden\n >\n <polyline\n ref={lineRef}\n points=\"4 12 9 17 20 6\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\ninterface DropdownCheckboxItemProps extends Omit<DropdownItemProps, \"icon\"> {\n checked?: boolean;\n onCheckedChange?: (checked: boolean) => void;\n}\n\nexport const DropdownCheckboxItem: React.FC<DropdownCheckboxItemProps> = ({\n children,\n checked = false,\n onCheckedChange,\n disabled = false,\n shortcut,\n closeOnSelect = false,\n className,\n onClick,\n ...props\n}) => {\n const { setOpen } = useDropdown();\n\n const handleClick = (e: React.MouseEvent<HTMLDivElement>) => {\n if (disabled) return;\n onCheckedChange?.(!checked);\n onClick?.(e);\n if (closeOnSelect) setOpen(false);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n handleClick(e as unknown as React.MouseEvent<HTMLDivElement>);\n }\n };\n\n return (\n <div\n {...props}\n role=\"menuitemcheckbox\"\n aria-checked={checked}\n tabIndex={disabled ? undefined : -1}\n aria-disabled={disabled}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n className={cn(\n \"mx-1.5 flex items-center gap-2 rounded-md px-3 py-2 text-sm transition-colors outline-none select-none\",\n DROPDOWN_SHEET_MENU_TEXT,\n !disabled &&\n \"cursor-pointer text-foreground hover:bg-primary/8 focus-visible:bg-primary/8 dark:hover:bg-primary/4 dark:focus-visible:bg-primary/4\",\n disabled &&\n \"lg:cursor-not-allowed text-foreground/45 dark:text-foreground/50\",\n className,\n )}\n >\n <span\n aria-hidden\n className={cn(\n \"pointer-events-none flex size-5 shrink-0 items-center justify-center rounded-[4px] border mr-1\",\n !disabled &&\n (checked\n ? \"border-primary bg-primary text-background\"\n : \"border-primary/20 bg-background\"),\n disabled &&\n (checked\n ? \"border-primary/40 bg-primary/45 text-primary-foreground\"\n : \"border-primary/10 bg-muted/25\"),\n )}\n >\n {checked ? <DropdownCheckboxItemCheckMark /> : null}\n </span>\n <span className=\"min-w-0 flex-1\">{children}</span>\n {shortcut && (\n <span\n className={cn(\n \"ml-auto text-xs tracking-widest opacity-40\",\n DROPDOWN_SHEET_MENU_SHORTCUT,\n )}\n >\n {shortcut}\n </span>\n )}\n </div>\n );\n};\n\n//////////////////////////////////////////////// Radio Group + Item\n\nexport const DropdownRadioGroup: React.FC<{\n children: React.ReactNode;\n value?: string;\n onValueChange?: (value: string) => void;\n group: string;\n}> = ({ children, value, onValueChange, group }) => {\n const { setRadioValue, radioValues } = useDropdown();\n\n const resolvedValue = value ?? radioValues[group] ?? \"\";\n\n const handleValueChange = useCallback(\n (v: string) => {\n setRadioValue(group, v);\n onValueChange?.(v);\n },\n [group, onValueChange, setRadioValue],\n );\n\n const radioCtx = useMemo(\n () => ({\n group,\n value: resolvedValue,\n onValueChange: handleValueChange,\n }),\n [group, resolvedValue, handleValueChange],\n );\n\n return (\n <RadioGroupContext.Provider value={radioCtx}>\n {children}\n </RadioGroupContext.Provider>\n );\n};\n\ntype RadioGroupCtx = {\n group: string;\n value: string;\n onValueChange: (v: string) => void;\n};\nconst RadioGroupContext = React.createContext<RadioGroupCtx | undefined>(\n undefined,\n);\n\nfunction useRadioGroup() {\n const ctx = React.useContext(RadioGroupContext);\n if (!ctx)\n throw new Error(\"DropdownRadioItem must be inside DropdownRadioGroup\");\n return ctx;\n}\n\ninterface DropdownRadioItemProps extends Omit<DropdownItemProps, \"icon\"> {\n value: string;\n}\n\nexport const DropdownRadioItem: React.FC<DropdownRadioItemProps> = ({\n children,\n value,\n disabled = false,\n shortcut,\n closeOnSelect = false,\n className,\n onClick,\n ...props\n}) => {\n const { setOpen } = useDropdown();\n const { value: groupValue, onValueChange } = useRadioGroup();\n const checked = groupValue === value;\n\n const handleClick = (e: React.MouseEvent<HTMLDivElement>) => {\n if (disabled) return;\n onValueChange(value);\n onClick?.(e);\n if (closeOnSelect) setOpen(false);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n handleClick(e as unknown as React.MouseEvent<HTMLDivElement>);\n }\n };\n\n return (\n <div\n {...props}\n role=\"menuitemradio\"\n aria-checked={checked}\n tabIndex={disabled ? undefined : -1}\n aria-disabled={disabled}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n className={cn(\n \"relative mx-1.5 flex items-center gap-2 rounded-md px-3 py-2 text-sm transition-colors outline-none select-none\",\n DROPDOWN_SHEET_MENU_TEXT,\n !disabled &&\n \"cursor-pointer text-foreground hover:bg-primary/8 focus-visible:bg-primary/8 dark:hover:bg-primary/4 dark:focus-visible:bg-primary/4\",\n disabled &&\n \"lg:cursor-not-allowed text-foreground/45 dark:text-foreground/50\",\n className,\n )}\n >\n <span className=\"min-w-0 flex-1\">{children}</span>\n {shortcut ? (\n <span\n className={cn(\n \"shrink-0 text-xs tracking-widest opacity-40\",\n DROPDOWN_SHEET_MENU_SHORTCUT,\n )}\n >\n {shortcut}\n </span>\n ) : null}\n <span\n className=\"flex size-4 shrink-0 items-center justify-center\"\n aria-hidden\n >\n {checked ? <Check className=\"size-3.5\" strokeWidth={2.5} /> : null}\n </span>\n </div>\n );\n};\n\n//////////////////////////////////////////////// Sub-menu\n\nexport const DropdownSub: React.FC<{ children: React.ReactNode }> = ({\n children,\n}) => {\n const [open, setOpen] = useState(false);\n const triggerRef = useRef<HTMLElement | null>(null);\n const subCtx = useMemo(\n () => ({ open, setOpen, triggerRef }),\n [open, setOpen],\n );\n return <SubContext.Provider value={subCtx}>{children}</SubContext.Provider>;\n};\n\nexport const DropdownSubTrigger: React.FC<\n React.HTMLAttributes<HTMLDivElement> & {\n icon?: React.ReactNode;\n inset?: boolean;\n disabled?: boolean;\n }\n> = ({ children, icon, inset, disabled = false, className, ...props }) => {\n const sub = React.useContext(SubContext);\n if (!sub) throw new Error(\"DropdownSubTrigger must be inside DropdownSub\");\n const { open, setOpen, triggerRef } = sub;\n /** Same cutoff as mobile bottom sheet — touch / narrow viewports must not use hover. */\n const isMobile = useIsMobile(DROPDOWN_MOBILE_SHEET_MAX_PX + 1);\n\n return (\n <div\n {...props}\n ref={(el) => {\n triggerRef.current = el;\n }}\n role=\"menuitem\"\n aria-haspopup=\"menu\"\n aria-expanded={open}\n tabIndex={disabled ? undefined : -1}\n aria-disabled={disabled}\n onMouseEnter={() => {\n if (disabled || isMobile) return;\n setOpen(true);\n }}\n onMouseLeave={() => {\n if (isMobile) return;\n setOpen(false);\n }}\n onKeyDown={(e) => {\n if (disabled) return;\n if (e.key === \"ArrowRight\" || e.key === \"Enter\") {\n e.preventDefault();\n setOpen(true);\n }\n }}\n onClick={() => {\n if (disabled) return;\n setOpen(!open);\n }}\n className={cn(\n \"relative mx-1.5 flex items-center gap-2 rounded-md px-3 py-2 text-sm transition-colors outline-none select-none\",\n DROPDOWN_SHEET_MENU_TEXT,\n inset && \"pl-9\",\n !disabled &&\n \"cursor-pointer text-foreground hover:bg-primary/8 focus-visible:bg-primary/8 dark:hover:bg-primary/4 dark:focus-visible:bg-primary/4\",\n disabled &&\n \"lg:cursor-not-allowed text-foreground/45 dark:text-foreground/50\",\n className,\n )}\n >\n {icon && (\n <span className=\"flex size-4 shrink-0 items-center justify-center\">\n {icon}\n </span>\n )}\n <span className=\"flex-1\">{children}</span>\n <ChevronRight className=\"ml-auto size-4 opacity-50\" />\n </div>\n );\n};\n\nexport const DropdownSubContent: React.FC<\n React.HTMLAttributes<HTMLDivElement> & {\n duration?: number;\n viewportPadding?: number;\n /** Same breakpoint and sheet as {@link DropdownContent}; default true. */\n mobileSheet?: boolean;\n mobileTitle?: string;\n /** Same as {@link DropdownContent} slideEntrance; default true. */\n slideEntrance?: boolean;\n slideEntranceOffsetPx?: number;\n }\n> = ({\n children,\n duration = 80,\n viewportPadding = 8,\n mobileSheet = true,\n mobileTitle,\n slideEntrance = true,\n slideEntranceOffsetPx: slideEntranceOffsetPxProp,\n className,\n style,\n onKeyDown: onKeyDownProp,\n ...props\n}) => {\n const sub = React.useContext(SubContext);\n if (!sub) throw new Error(\"DropdownSubContent must be inside DropdownSub\");\n const { open, setOpen, triggerRef } = sub;\n\n const isMobile = useIsMobile(DROPDOWN_MOBILE_SHEET_MAX_PX + 1);\n const slideOffsetPx = useMemo(\n () =>\n slideEntranceOffsetPxProp ??\n DROPDOWN_MOBILE_SHEET_SLIDE_ENTRANCE_OFFSET_DEFAULT_PX,\n [slideEntranceOffsetPxProp],\n );\n\n const [shouldRender, setShouldRender] = useState(false);\n const [isAnimating, setIsAnimating] = useState(false);\n const [pos, setPos] = useState<Pos>({\n top: -9999,\n left: -9999,\n side: \"right\",\n });\n const menuRef = useRef<HTMLDivElement>(null);\n\n const closeDuration =\n isMobile && mobileSheet ? DROPDOWN_MOBILE_SHEET_MOTION_MS : duration;\n\n const closeSub = useCallback(() => setOpen(false), [setOpen]);\n\n useEffect(() => {\n if (open) {\n setShouldRender(true);\n } else {\n setIsAnimating(false);\n const timer = setTimeout(() => setShouldRender(false), closeDuration);\n return () => clearTimeout(timer);\n }\n }, [open, closeDuration]);\n\n useEffect(() => {\n if (!shouldRender || !open) return;\n let raf2 = 0;\n const raf1 = requestAnimationFrame(() => {\n raf2 = requestAnimationFrame(() => setIsAnimating(true));\n });\n return () => {\n cancelAnimationFrame(raf1);\n if (raf2) cancelAnimationFrame(raf2);\n };\n }, [shouldRender, open]);\n\n useLayoutEffect(() => {\n if (!shouldRender || !triggerRef.current || !menuRef.current) return;\n if (isMobile && mobileSheet) return;\n const update = () => {\n if (!triggerRef.current || !menuRef.current) return;\n setPos(\n computePos(\n triggerRef.current,\n menuRef.current,\n \"right\",\n \"start\",\n -8,\n viewportPadding,\n ),\n );\n };\n update();\n window.addEventListener(\"resize\", update);\n window.addEventListener(\"scroll\", update, true);\n return () => {\n window.removeEventListener(\"resize\", update);\n window.removeEventListener(\"scroll\", update, true);\n };\n }, [shouldRender, viewportPadding, isMobile, mobileSheet]);\n\n useEffect(() => {\n if (isAnimating && menuRef.current) {\n menuRef.current.focus();\n }\n }, [isAnimating]);\n\n useEffect(() => {\n if (!open) return;\n const handler = (e: MouseEvent) => {\n const t = e.target as Node;\n if (menuRef.current?.contains(t) || triggerRef.current?.contains(t))\n return;\n const el = e.target instanceof Element ? e.target : null;\n const subPanel = el?.closest?.(`[${DROPDOWN_SUB_CONTENT_ATTR}]`);\n if (subPanel && subPanel !== menuRef.current) return;\n setOpen(false);\n };\n document.addEventListener(\"mousedown\", handler);\n return () => document.removeEventListener(\"mousedown\", handler);\n }, [open, setOpen, triggerRef]);\n\n const handleSubMenuKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLDivElement>) => {\n onKeyDownProp?.(e);\n if (e.defaultPrevented) return;\n const menu = menuRef.current;\n if (!menu) return;\n const items = getItems(menu);\n const focused = document.activeElement as HTMLElement;\n const idx = items.indexOf(focused);\n\n switch (e.key) {\n case \"ArrowLeft\":\n case \"Escape\":\n e.preventDefault();\n setOpen(false);\n triggerRef.current?.focus();\n break;\n case \"ArrowDown\":\n e.preventDefault();\n if (items.length === 0) break;\n if (idx === -1 || idx === items.length - 1) items[0]?.focus();\n else items[idx + 1]?.focus();\n break;\n case \"ArrowUp\":\n e.preventDefault();\n if (items.length === 0) break;\n if (idx <= 0) items[items.length - 1]?.focus();\n else items[idx - 1]?.focus();\n break;\n case \"Home\":\n e.preventDefault();\n items[0]?.focus();\n break;\n case \"End\":\n e.preventDefault();\n items[items.length - 1]?.focus();\n break;\n }\n },\n [onKeyDownProp, setOpen, triggerRef],\n );\n\n if (!shouldRender || typeof document === \"undefined\") return null;\n\n if (isMobile && mobileSheet) {\n return (\n <DropdownMobileBottomSheetPortal\n {...props}\n open={open}\n isAnimating={isAnimating}\n slideEntrance={slideEntrance}\n slideOffsetPx={slideOffsetPx}\n mobileTitle={mobileTitle}\n onRequestClose={closeSub}\n menuRef={menuRef}\n portalZClassName=\"z-[70]\"\n className={className}\n style={style}\n role=\"menu\"\n tabIndex={-1}\n onKeyDown={handleSubMenuKeyDown}\n data-dropdown-sub-content=\"\"\n >\n {children}\n </DropdownMobileBottomSheetPortal>\n );\n }\n\n return createPortal(\n <div\n {...props}\n ref={menuRef}\n role=\"menu\"\n tabIndex={-1}\n onMouseEnter={() => setOpen(true)}\n onMouseLeave={() => setOpen(false)}\n onKeyDown={handleSubMenuKeyDown}\n data-dropdown-sub-content=\"\"\n className={cn(\n \"bg-background border-primary/10 absolute z-60 overflow-hidden rounded-xl border py-1.5 shadow-xl outline-none\",\n className,\n )}\n style={{\n position: \"absolute\",\n top: pos.top,\n left: pos.left,\n minWidth: DROPDOWN_MENU_MIN_WIDTH_PX,\n transformOrigin: SUB_CONTENT_ORIGIN[pos.side],\n transform: isAnimating ? \"none\" : DROPDOWN_CONTENT_HIDDEN[pos.side],\n opacity: isAnimating ? 1 : 0,\n transitionProperty: \"opacity, transform\",\n transitionDuration: `${duration}ms`,\n transitionTimingFunction: isAnimating\n ? DROPDOWN_PANEL_OPEN_EASING\n : DROPDOWN_PANEL_CLOSE_EASING,\n ...style,\n }}\n >\n {children}\n </div>,\n document.body,\n );\n};\n"]}
1
+ {"version":3,"sources":["../../src/lib/utils.ts","../../src/react/button.tsx","../../src/react/checkbox.tsx","../../src/react/dropdown.tsx"],"names":["React","jsx","React2","useState","useRef","useLayoutEffect"],"mappings":"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","file":"dropdown.js","sourcesContent":["import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import * as React from \"react\";\n\nimport { cn } from \"@/lib/utils\";\n\nconst sizeClass = {\n xs: \"h-8 min-h-8 gap-2 px-4 text-sm has-[>svg]:px-3 [&_svg:not([class*='size-'])]:size-3\",\n default:\n \"h-10 min-h-10 gap-2 px-5 text-sm has-[>svg]:px-4 [&_svg:not([class*='size-'])]:size-4\",\n lg: \"h-11 min-h-11 gap-2 px-6 text-base has-[>svg]:px-5 [&_svg:not([class*='size-'])]:size-5\",\n} as const;\n\n/** Square hit targets for `iconOnly` — same keys as `sizeClass` (`default` | `lg`). */\nconst iconOnlySizeClass = {\n xs: \"size-8 min-h-8 min-w-8 gap-0 p-0 [&_svg:not([class*='size-'])]:size-3\",\n default:\n \"size-10 min-h-10 min-w-10 gap-0 p-0 [&_svg:not([class*='size-'])]:size-4\",\n lg: \"size-11 min-h-11 min-w-11 gap-0 p-0 [&_svg:not([class*='size-'])]:size-5\",\n} as const;\n\nconst roundedClass = {\n full: \"rounded-full\",\n lg: \"rounded-lg\",\n md: \"rounded-md\",\n} as const;\n\nconst variantClass = {\n primary:\n \"bg-primary text-background border border-transparent hover:bg-primary/90 active:bg-primary/85\",\n secondary:\n \"bg-background text-primary border border-primary/10 hover:bg-primary/5\",\n destructive:\n \"bg-background text-red-500 border border-red-500/25 hover:bg-red-500/5\",\n success:\n \"bg-background text-green-500 border border-green-500/25 hover:bg-green-500/5\",\n} as const;\n\nexport type ButtonProps = React.ComponentProps<\"button\"> & {\n /**\n * Visual style: neutral (`secondary`, `primary`), or outline (`destructive`,\n * `success`) using Tailwind `red-500` / `green-500` text and matching borders on\n * `bg-background` (no solid fill).\n */\n variant?: keyof typeof variantClass;\n /**\n * Corner radius. Labeled buttons default to `full` (pill). `iconOnly` buttons\n * default to `md` (square corners) unless you pass `rounded` explicitly.\n */\n rounded?: keyof typeof roundedClass;\n /** Height and horizontal padding: `default` or `lg` only. */\n size?: keyof typeof sizeClass;\n /**\n * Square icon-only control; same `size` presets (`default` | `lg`). Pair with\n * `aria-label` (or `title`) when there is no visible text.\n */\n iconOnly?: boolean;\n};\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n className,\n type = \"button\",\n variant = \"secondary\",\n rounded: roundedProp,\n size = \"default\",\n iconOnly = false,\n disabled,\n ...props\n },\n ref,\n ) => {\n const rounded = roundedProp ?? (iconOnly ? \"md\" : \"full\");\n\n return (\n <button\n type={type}\n disabled={disabled}\n data-slot=\"button\"\n data-icon-only={iconOnly ? \"\" : undefined}\n className={cn(\n \"inline-flex shrink-0 cursor-pointer items-center justify-center whitespace-nowrap outline-none scale-100 transition-[color,background-color,box-shadow,transform] duration-150 ease-out active:scale-[0.98] active:duration-100 active:ease-linear [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n \"disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50\",\n \"focus-visible:border-ring font-medium lg:tracking-wide focus-visible:ring-ring/50 focus-visible:ring-[3px]\",\n iconOnly ? iconOnlySizeClass[size] : sizeClass[size],\n roundedClass[rounded],\n variantClass[variant],\n className,\n )}\n ref={ref}\n {...props}\n />\n );\n },\n);\nButton.displayName = \"Button\";\n\nexport { Button };\n","\"use client\";\n\nimport * as React from \"react\";\nimport { useLayoutEffect, useRef, useState } from \"react\";\n\nimport { cn } from \"@/lib/utils\";\n\nconst CHECKBOX_TICK_DELAY_MS = 60;\nconst CHECKBOX_TICK_DRAW_MS = 100;\n\nfunction CheckboxAnimatedCheckMark() {\n const lineRef = useRef<SVGPolylineElement>(null);\n\n useLayoutEffect(() => {\n const poly = lineRef.current;\n if (!poly || typeof poly.getTotalLength !== \"function\") return;\n const len = poly.getTotalLength();\n if (len <= 0) return;\n\n poly.style.strokeDasharray = `${len}`;\n poly.style.strokeDashoffset = `${len}`;\n\n if (typeof poly.animate !== \"function\") {\n poly.style.strokeDashoffset = \"0\";\n return;\n }\n\n const anim = poly.animate(\n [{ strokeDashoffset: len }, { strokeDashoffset: 0 }],\n {\n duration: CHECKBOX_TICK_DRAW_MS,\n delay: CHECKBOX_TICK_DELAY_MS,\n easing: \"cubic-bezier(0.45, 0, 0.2, 1)\",\n fill: \"forwards\",\n },\n );\n return () => anim.cancel();\n }, []);\n\n return (\n <svg\n className=\"size-4 shrink-0 overflow-visible\"\n viewBox=\"0 0 24 24\"\n aria-hidden\n >\n <polyline\n ref={lineRef}\n points=\"4 12 9 17 20 6\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n\nexport type CheckboxProps = Omit<\n React.ComponentProps<\"button\">,\n \"type\" | \"role\" | \"aria-checked\" | \"children\"\n> & {\n checked?: boolean;\n defaultChecked?: boolean;\n onCheckedChange?: (next: boolean) => void;\n // tri-state: same frame as checked; center shows a visible “blank” (inner surface)\n indeterminate?: boolean;\n};\n\nconst Checkbox = React.forwardRef<HTMLButtonElement, CheckboxProps>(\n (\n {\n checked: checkedProp,\n defaultChecked = false,\n onCheckedChange,\n indeterminate = false,\n disabled = false,\n className,\n onClick,\n ...rest\n },\n ref,\n ) => {\n const isControlled = checkedProp !== undefined;\n const [uncontrolledChecked, setUncontrolledChecked] = useState(\n defaultChecked,\n );\n const checked = isControlled ? checkedProp : uncontrolledChecked;\n const ariaChecked: boolean | \"mixed\" = indeterminate\n ? \"mixed\"\n : checked\n ? true\n : false;\n\n return (\n <button\n ref={ref}\n type=\"button\"\n role=\"checkbox\"\n data-slot=\"checkbox\"\n data-state={\n indeterminate ? \"indeterminate\" : checked ? \"checked\" : \"unchecked\"\n }\n disabled={disabled}\n aria-checked={ariaChecked}\n className={cn(\n \"ring-offset-background focus-visible:ring-primary/40 inline-flex shrink-0 items-center justify-center rounded-md border border-transparent p-0 outline-none select-none\",\n \"focus-visible:ring-2 focus-visible:ring-offset-2\",\n \"disabled:cursor-not-allowed\",\n className,\n )}\n onClick={(e) => {\n onClick?.(e);\n if (e.defaultPrevented) return;\n if (disabled) return;\n if (isControlled) {\n onCheckedChange?.(!checked);\n return;\n }\n setUncontrolledChecked((prev) => {\n const next = !prev;\n onCheckedChange?.(next);\n return next;\n });\n }}\n {...rest}\n >\n <span className=\"pointer-events-none\">\n <span\n aria-hidden\n className={cn(\n \"flex size-5 shrink-0 items-center justify-center rounded-[4px] border\",\n !disabled &&\n (indeterminate\n ? \"border-primary bg-primary text-background\"\n : checked\n ? \"border-primary bg-primary text-background\"\n : \"border-primary/20 bg-background\"),\n disabled &&\n (indeterminate\n ? \"border-primary/40 bg-primary/45 text-primary-foreground\"\n : checked\n ? \"border-primary/40 bg-primary/45 text-primary-foreground\"\n : \"border-primary/10 bg-muted/25\"),\n )}\n >\n {indeterminate ? (\n <span\n className=\"size-2.5 shrink-0 rounded-[2px] border border-primary/20 bg-background\"\n aria-hidden\n />\n ) : checked ? (\n <CheckboxAnimatedCheckMark />\n ) : null}\n </span>\n </span>\n </button>\n );\n },\n);\nCheckbox.displayName = \"Checkbox\";\n\nexport { Checkbox };\n","\"use client\";\nimport React, {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { Check, ChevronDown, ChevronRight, X } from \"lucide-react\";\nimport { Button, type ButtonProps } from \"./button\";\nimport { Checkbox } from \"./checkbox\";\nimport { cn } from \"@/lib/utils\";\n\n/** Panel transform motion — matches `sheet.tsx` `PANEL_OPEN_EASING` / `PANEL_CLOSE_EASING`. */\nconst DROPDOWN_PANEL_OPEN_EASING = \"cubic-bezier(0,0.55,0.45,1)\";\nconst DROPDOWN_PANEL_CLOSE_EASING = \"cubic-bezier(0.55,0,1,0.45)\";\n\n/** Floor for `minWidth=\"trigger\"` so narrow triggers don’t produce an overly tight menu (12rem). */\nconst DROPDOWN_MENU_MIN_WIDTH_PX = 192;\n\n/** Mobile menu as bottom sheet — matches `dialog.tsx` (`DIALOG_MOBILE_BOTTOM_SHEET_MAX_PX` + `DIALOG_MOTION_MS`). */\nconst DROPDOWN_MOBILE_SHEET_MAX_PX = 1024;\n/** Mobile sheet panel + backdrop (slightly under `DIALOG_MOTION_MS` for snappier feel). */\nconst DROPDOWN_MOBILE_SHEET_MOTION_MS = 175;\nconst DROPDOWN_MOBILE_SHEET_ENTRY_EASING = \"cubic-bezier(0.85, 0, 0.15, 1)\";\nconst DROPDOWN_MOBILE_SHEET_EXIT_EASING = \"cubic-bezier(0.85, 0, 1, 0.15)\";\n\n/** Default slide distance for mobile sheet when `slideEntrance` — matches `SLIDE_ENTRANCE_OFFSET_PX.full` in `dialog.tsx`. */\nconst DROPDOWN_MOBILE_SHEET_SLIDE_ENTRANCE_OFFSET_DEFAULT_PX = 120;\n\n/**\n * Narrow-viewport (≤1024px) bottom-sheet options for {@link DropdownContent}\n * and {@link DropdownSubContent}. `className` merges onto the same panel as\n * `DropdownContent`’s root `className` (after base sheet styles); use it for\n * overrides such as `max-h-[…]`.\n */\nexport interface DropdownMobileSheetOptions {\n /** When `false`, keep the floating menu on narrow viewports. Default `true`. */\n sheet?: boolean;\n /** Optional header title on the same row as the close control. */\n title?: string;\n /** Extra classes on the sheet panel (merged after base sheet styles, before root `className`). */\n className?: string;\n /**\n * Extra classes on the scrollable body below the header (merged after the\n * default `pb-20` and safe-area bottom padding).\n */\n contentClassName?: string;\n}\n\nfunction resolveDropdownMobileSheet(\n mobileOptions: DropdownMobileSheetOptions | undefined,\n) {\n return {\n sheet: mobileOptions?.sheet ?? true,\n title: mobileOptions?.title,\n sheetExtraClassName: mobileOptions?.className,\n contentClassName: mobileOptions?.contentClassName,\n };\n}\n\n/** Mark portaled sub-menus so root outside-dismiss ignores clicks inside them. */\nconst DROPDOWN_SUB_CONTENT_ATTR = \"data-dropdown-sub-content\";\n\n/**\n * Slightly larger menu copy when viewport ≤1024px — same cutoff as the mobile\n * bottom sheet (`DROPDOWN_MOBILE_SHEET_MAX_PX`). Padding unchanged.\n */\nconst DROPDOWN_SHEET_MENU_TEXT = \"max-[1024px]:text-base\";\nconst DROPDOWN_SHEET_MENU_SHORTCUT = \"max-[1024px]:text-sm\";\nconst DROPDOWN_SHEET_MENU_LABEL_TEXT = \"max-[1024px]:text-sm\";\n\n//////////////////////////////////////////////// Positioning helpers\n\ntype Side = \"top\" | \"bottom\" | \"left\" | \"right\";\ntype Align = \"start\" | \"center\" | \"end\";\n\ninterface Pos {\n top: number;\n left: number;\n side: Side;\n}\n\n/** `transformOrigin` / pre-mount transform for the root floating menu (not sub-menus). */\nconst DROPDOWN_CONTENT_ORIGIN: Record<Side, string> = {\n bottom: \"top center\",\n top: \"bottom center\",\n left: \"right center\",\n right: \"left center\",\n};\nconst DROPDOWN_CONTENT_HIDDEN: Record<Side, string> = {\n bottom: \"translateY(-4px) scale(0.97)\",\n top: \"translateY(4px) scale(0.97)\",\n left: \"translateX(4px) scale(0.97)\",\n right: \"translateX(-4px) scale(0.97)\",\n};\n\n/** Sub-menu flyout uses a different origin on the horizontal axis. */\nconst SUB_CONTENT_ORIGIN: Record<Side, string> = {\n bottom: \"top center\",\n top: \"bottom center\",\n left: \"right top\",\n right: \"left top\",\n};\n\nfunction computePos(\n trigger: HTMLElement,\n menu: HTMLElement,\n side: Side,\n align: Align,\n offset: number,\n pad: number,\n): Pos {\n const tr = trigger.getBoundingClientRect();\n const mr = menu.getBoundingClientRect();\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n const sx = window.scrollX;\n const sy = window.scrollY;\n\n let top = 0;\n let left = 0;\n let effectiveSide = side;\n\n const calc = (s: Side) => {\n switch (s) {\n case \"bottom\":\n top = tr.bottom + sy + offset;\n if (align === \"start\") left = tr.left + sx;\n else if (align === \"end\") left = tr.right + sx - mr.width;\n else left = tr.left + sx + tr.width / 2 - mr.width / 2;\n break;\n case \"top\":\n top = tr.top + sy - mr.height - offset;\n if (align === \"start\") left = tr.left + sx;\n else if (align === \"end\") left = tr.right + sx - mr.width;\n else left = tr.left + sx + tr.width / 2 - mr.width / 2;\n break;\n case \"right\":\n left = tr.right + sx + offset;\n if (align === \"start\") top = tr.top + sy;\n else if (align === \"end\") top = tr.bottom + sy - mr.height;\n else top = tr.top + sy + tr.height / 2 - mr.height / 2;\n break;\n case \"left\":\n left = tr.left + sx - mr.width - offset;\n if (align === \"start\") top = tr.top + sy;\n else if (align === \"end\") top = tr.bottom + sy - mr.height;\n else top = tr.top + sy + tr.height / 2 - mr.height / 2;\n break;\n }\n };\n\n calc(side);\n\n // flip\n if (side === \"bottom\" && top + mr.height > vh + sy - pad) {\n const ft = tr.top + sy - mr.height - offset;\n if (ft >= sy + pad) {\n effectiveSide = \"top\";\n top = ft;\n }\n } else if (side === \"top\" && top < sy + pad) {\n const ft = tr.bottom + sy + offset;\n if (ft + mr.height <= vh + sy - pad) {\n effectiveSide = \"bottom\";\n top = ft;\n }\n } else if (side === \"right\" && left + mr.width > vw + sx - pad) {\n const fl = tr.left + sx - mr.width - offset;\n if (fl >= sx + pad) {\n effectiveSide = \"left\";\n left = fl;\n }\n } else if (side === \"left\" && left < sx + pad) {\n const fl = tr.right + sx + offset;\n if (fl + mr.width <= vw + sx - pad) {\n effectiveSide = \"right\";\n left = fl;\n }\n }\n\n // clamp\n left = Math.max(sx + pad, Math.min(left, vw + sx - mr.width - pad));\n top = Math.max(sy + pad, Math.min(top, vh + sy - mr.height - pad));\n\n return { top, left, side: effectiveSide };\n}\n\n//////////////////////////////////////////////// Mobile detection\n\nfunction useIsMobile(breakpoint = 1025): boolean {\n const [isMobile, setIsMobile] = useState(false);\n useEffect(() => {\n const mq = window.matchMedia(`(max-width: ${breakpoint - 1}px)`);\n setIsMobile(mq.matches);\n const handler = (e: MediaQueryListEvent) => setIsMobile(e.matches);\n mq.addEventListener(\"change\", handler);\n return () => mq.removeEventListener(\"change\", handler);\n }, [breakpoint]);\n return isMobile;\n}\n\n//////////////////////////////////////////////// Context\n\ntype DropdownCtx = {\n open: boolean;\n setOpen: (v: boolean) => void;\n triggerRef: React.RefObject<HTMLElement | null>;\n radioValues: Record<string, string>;\n setRadioValue: (group: string, value: string) => void;\n};\n\nconst DropdownContext = React.createContext<DropdownCtx | undefined>(undefined);\n\nfunction useDropdown() {\n const ctx = React.useContext(DropdownContext);\n if (!ctx)\n throw new Error(\"Dropdown components must be used within <Dropdown />\");\n return ctx;\n}\n\n// Sub-menu context (for nested menus)\ntype SubCtx = {\n open: boolean;\n setOpen: (v: boolean) => void;\n triggerRef: React.RefObject<HTMLElement | null>;\n};\nconst SubContext = React.createContext<SubCtx | undefined>(undefined);\n\n//////////////////////////////////////////////// Root\n\ninterface DropdownProps {\n children: React.ReactNode;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n}\n\nexport const Dropdown: React.FC<DropdownProps> = ({\n children,\n open: controlledOpen,\n onOpenChange,\n}) => {\n const [internalOpen, setInternalOpen] = useState(false);\n const isControlled = controlledOpen !== undefined;\n const open = isControlled ? controlledOpen : internalOpen;\n const triggerRef = useRef<HTMLElement | null>(null);\n const [radioValues, setRadioValues] = useState<Record<string, string>>({});\n\n const setOpen = useCallback(\n (v: boolean) => {\n if (!isControlled) setInternalOpen(v);\n onOpenChange?.(v);\n },\n [isControlled, onOpenChange],\n );\n\n const setRadioValue = useCallback((group: string, value: string) => {\n setRadioValues((prev) => ({ ...prev, [group]: value }));\n }, []);\n\n const ctx = useMemo(\n () => ({ open, setOpen, triggerRef, radioValues, setRadioValue }),\n [open, setOpen, radioValues, setRadioValue],\n );\n\n return (\n <DropdownContext.Provider value={ctx}>{children}</DropdownContext.Provider>\n );\n};\n\n//////////////////////////////////////////////// Trigger\n\nexport type DropdownTriggerProps = Omit<ButtonProps, \"type\"> & {\n /**\n * Merge trigger behavior onto a single child (e.g. your own `Button`).\n * Without `asChild`, the trigger renders the shared `Button` primitive.\n */\n asChild?: boolean;\n};\n\nfunction mergeTriggerRef(\n triggerRef: React.RefObject<HTMLElement | null>,\n node: HTMLElement | null,\n childRef: React.Ref<HTMLElement> | undefined,\n) {\n triggerRef.current = node;\n if (typeof childRef === \"function\") childRef(node);\n else if (childRef && typeof childRef === \"object\")\n (childRef as React.MutableRefObject<HTMLElement | null>).current = node;\n}\n\nexport const DropdownTrigger = React.forwardRef<\n HTMLButtonElement,\n DropdownTriggerProps\n>(\n (\n {\n children,\n asChild,\n className,\n onClick: onClickProp,\n disabled,\n ...buttonProps\n },\n ref,\n ) => {\n const { open, setOpen, triggerRef } = useDropdown();\n\n const handleClick = useCallback(\n (e: React.MouseEvent<HTMLElement>) => {\n onClickProp?.(e as React.MouseEvent<HTMLButtonElement>);\n e.stopPropagation();\n if (disabled) return;\n setOpen(!open);\n },\n [disabled, onClickProp, open, setOpen],\n );\n\n const setButtonRef = useCallback(\n (el: HTMLButtonElement | null) => {\n triggerRef.current = el;\n if (typeof ref === \"function\") ref(el);\n else if (ref) ref.current = el;\n },\n [ref, triggerRef],\n );\n\n if (asChild && React.isValidElement(children)) {\n const child = children as React.ReactElement<{\n onClick?: React.MouseEventHandler<HTMLElement>;\n ref?: React.Ref<HTMLElement>;\n className?: string;\n \"aria-expanded\"?: boolean;\n \"aria-haspopup\"?: string;\n \"data-state\"?: string;\n }>;\n return React.cloneElement(child, {\n ref: (node: HTMLElement | null) => {\n mergeTriggerRef(\n triggerRef,\n node,\n (\n child as React.ReactElement<unknown> & {\n ref?: React.Ref<HTMLElement>;\n }\n ).ref,\n );\n },\n className: cn(\"group\", child.props.className),\n onClick: (e: React.MouseEvent<HTMLElement>) => {\n child.props.onClick?.(e);\n handleClick(e);\n },\n \"aria-expanded\": open,\n \"aria-haspopup\": \"menu\",\n \"data-state\": open ? \"open\" : \"closed\",\n ...(disabled !== undefined\n ? {\n disabled,\n }\n : {}),\n } as Partial<typeof child.props>);\n }\n\n return (\n <Button\n ref={setButtonRef}\n type=\"button\"\n {...buttonProps}\n disabled={disabled}\n className={cn(\"group\", className)}\n aria-expanded={open}\n aria-haspopup=\"menu\"\n data-state={open ? \"open\" : \"closed\"}\n onClick={handleClick as React.MouseEventHandler<HTMLButtonElement>}\n >\n {children}\n </Button>\n );\n },\n);\nDropdownTrigger.displayName = \"DropdownTrigger\";\n\n/** Chevron for menu triggers; rotates 180° when the menu is open. */\nexport function DropdownChevron({\n className,\n ...props\n}: React.ComponentProps<typeof ChevronDown>) {\n const { open } = useDropdown();\n return (\n <ChevronDown\n aria-hidden\n className={cn(\"size-4 shrink-0\", open && \"rotate-180\", className)}\n {...props}\n />\n );\n}\n\n//////////////////////////////////////////////// Mobile sheet close\n\nexport interface DropdownMobileCloseProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {}\n\n/**\n * Dismiss control for the mobile bottom-sheet menu. Styling matches\n * {@link DialogCloseButton} (circular hit target, X icon).\n */\nexport const DropdownMobileClose = React.forwardRef<\n HTMLButtonElement,\n DropdownMobileCloseProps\n>(({ className, type = \"button\", ...props }, ref) => {\n return (\n <button\n ref={ref}\n type={type}\n className={cn(\n \"z-100 flex size-12 shrink-0 cursor-pointer items-center justify-center rounded-full transition-all hover:bg-secondary-background active:scale-[0.96]\",\n className,\n )}\n {...props}\n >\n <X className=\"size-5.5\" />\n <span className=\"sr-only\">Close</span>\n </button>\n );\n});\nDropdownMobileClose.displayName = \"DropdownMobileClose\";\n\n//////////////////////////////////////////////// Mobile bottom sheet (shared root + sub)\n\ninterface DropdownMobileBottomSheetPortalProps extends Omit<\n React.HTMLAttributes<HTMLDivElement>,\n \"ref\"\n> {\n children: React.ReactNode;\n open: boolean;\n isAnimating: boolean;\n slideEntrance: boolean;\n slideOffsetPx: number;\n sheetTitle?: string;\n /** Merged onto the sheet panel after base classes (from `mobileOptions.className`). */\n sheetExtraClassName?: string;\n /** Merged onto the scrollable region below the header. */\n contentClassName?: string;\n onRequestClose: () => void;\n menuRef: React.RefObject<HTMLDivElement | null>;\n /** Root menu uses `z-50`; nested sub-menu sheet should stack above (e.g. `z-[70]`). */\n portalZClassName?: string;\n}\n\nfunction DropdownMobileBottomSheetPortal({\n open,\n isAnimating,\n slideEntrance,\n slideOffsetPx,\n sheetTitle,\n sheetExtraClassName,\n contentClassName,\n onRequestClose,\n menuRef,\n portalZClassName = \"z-50\",\n children,\n className,\n style,\n ...panelProps\n}: DropdownMobileBottomSheetPortalProps) {\n const sheetMotion = open\n ? DROPDOWN_MOBILE_SHEET_ENTRY_EASING\n : DROPDOWN_MOBILE_SHEET_EXIT_EASING;\n const sheetHiddenTransform = slideEntrance\n ? `translateY(${slideOffsetPx}px)`\n : \"translateY(100%)\";\n\n return createPortal(\n <div\n className={cn(\n \"fixed inset-0 flex items-end justify-center p-0\",\n portalZClassName,\n )}\n >\n <div\n className={cn(\n \"fixed inset-0 bg-black/40 dark:bg-black/60\",\n isAnimating ? \"opacity-100\" : \"opacity-0\",\n )}\n style={{\n transitionProperty: \"opacity\",\n transitionDuration: `${DROPDOWN_MOBILE_SHEET_MOTION_MS}ms`,\n transitionTimingFunction: sheetMotion,\n }}\n onClick={onRequestClose}\n />\n <div\n {...panelProps}\n ref={menuRef}\n className={cn(\n \"bg-background border-primary/10 relative z-10 flex w-full max-h-[min(90dvh,calc(100dvh-env(safe-area-inset-bottom,0px)))] flex-col overflow-hidden shadow-2xl outline-none\",\n \"rounded-t-2xl rounded-b-none border-x-0 border-b-0 border-t\",\n sheetExtraClassName,\n className,\n )}\n style={{\n transform: isAnimating ? \"translateY(0)\" : sheetHiddenTransform,\n opacity: isAnimating ? 1 : 0,\n transitionProperty: \"transform, opacity\",\n transitionDuration: `${DROPDOWN_MOBILE_SHEET_MOTION_MS}ms`,\n transitionTimingFunction: sheetMotion,\n ...style,\n }}\n >\n <div\n className={cn(\n \"flex w-full shrink-0 items-center py-2 pl-4 pr-2\",\n sheetTitle ? \"justify-between gap-3\" : \"justify-end\",\n )}\n >\n {sheetTitle ? (\n <p className=\"text-foreground min-w-0 flex-1 truncate text-base font-semibold\">\n {sheetTitle}\n </p>\n ) : null}\n <DropdownMobileClose\n onClick={(e) => {\n e.stopPropagation();\n onRequestClose();\n }}\n />\n </div>\n <div\n className={cn(\n \"min-h-0 flex-1 overflow-y-auto pb-[calc(5rem+env(safe-area-inset-bottom,0px))]\",\n contentClassName,\n )}\n >\n {children}\n </div>\n </div>\n </div>,\n document.body,\n );\n}\n\n//////////////////////////////////////////////// Content\n\ninterface DropdownContentProps extends React.HTMLAttributes<HTMLDivElement> {\n side?: Side;\n align?: Align;\n /** Gap in px between the trigger and the menu edge (default 10). */\n offset?: number;\n duration?: number;\n viewportPadding?: number;\n closeOnEscape?: boolean;\n /** Minimum width in px, or `\"trigger\"` to match the trigger (never below 192px). */\n minWidth?: number | \"trigger\";\n /** Loop keyboard focus at list boundaries */\n loop?: boolean;\n /**\n * Mobile (≤1024px) bottom-sheet configuration (`sheet`, `title`, panel\n * `className`, optional scroll body `contentClassName` after default `pb-20`\n * + safe area).\n */\n mobileOptions?: DropdownMobileSheetOptions;\n /**\n * Mobile bottom sheet only. When `true` (default), panel motion matches Dialog\n * `slideEntrance`: `translateY(slideEntranceOffsetPx)` + opacity, with the same\n * double-RAF open timing as `DialogContent`. When `false`, uses full\n * `translateY(100%)` like Dialog’s default narrow-viewport bottom sheet.\n */\n slideEntrance?: boolean;\n /** Mobile sheet only; defaults to 120px (same as Dialog `slideEntrance` for `size=\"full\"`). */\n slideEntranceOffsetPx?: number;\n}\n\nexport const DropdownContent: React.FC<DropdownContentProps> = ({\n children,\n side = \"bottom\",\n align = \"start\",\n offset = 10,\n duration = 80,\n viewportPadding = 8,\n closeOnEscape = true,\n minWidth = \"trigger\",\n loop = true,\n mobileOptions,\n slideEntrance = true,\n slideEntranceOffsetPx: slideEntranceOffsetPxProp,\n className,\n style,\n ...props\n}) => {\n const isMobile = useIsMobile(DROPDOWN_MOBILE_SHEET_MAX_PX + 1);\n const { open, setOpen, triggerRef } = useDropdown();\n const [shouldRender, setShouldRender] = useState(false);\n const [isAnimating, setIsAnimating] = useState(false);\n const [pos, setPos] = useState<Pos>({ top: -9999, left: -9999, side });\n const [triggerW, setTriggerW] = useState(0);\n const menuRef = useRef<HTMLDivElement>(null);\n\n const resolvedMobile = useMemo(\n () => resolveDropdownMobileSheet(mobileOptions),\n [mobileOptions],\n );\n\n const slideOffsetPx = useMemo(\n () =>\n slideEntranceOffsetPxProp ??\n DROPDOWN_MOBILE_SHEET_SLIDE_ENTRANCE_OFFSET_DEFAULT_PX,\n [slideEntranceOffsetPxProp],\n );\n\n const closeDuration =\n isMobile && resolvedMobile.sheet\n ? DROPDOWN_MOBILE_SHEET_MOTION_MS\n : duration;\n\n const closeMenu = useCallback(() => setOpen(false), [setOpen]);\n\n /** Same open/close sequencing as `useDialogRenderLifecycle` in `dialog.tsx`. */\n useEffect(() => {\n if (open) {\n setShouldRender(true);\n } else {\n setIsAnimating(false);\n const timer = setTimeout(() => setShouldRender(false), closeDuration);\n return () => clearTimeout(timer);\n }\n }, [open, closeDuration]);\n\n useEffect(() => {\n if (!shouldRender || !open) return;\n let raf2 = 0;\n const raf1 = requestAnimationFrame(() => {\n raf2 = requestAnimationFrame(() => setIsAnimating(true));\n });\n return () => {\n cancelAnimationFrame(raf1);\n if (raf2) cancelAnimationFrame(raf2);\n };\n }, [shouldRender, open]);\n\n // Position\n useLayoutEffect(() => {\n if (!shouldRender || !triggerRef.current || !menuRef.current) return;\n const update = () => {\n if (!triggerRef.current || !menuRef.current) return;\n setTriggerW(triggerRef.current.getBoundingClientRect().width);\n setPos(\n computePos(\n triggerRef.current,\n menuRef.current,\n side,\n align,\n offset,\n viewportPadding,\n ),\n );\n };\n update();\n window.addEventListener(\"resize\", update);\n window.addEventListener(\"scroll\", update, true);\n return () => {\n window.removeEventListener(\"resize\", update);\n window.removeEventListener(\"scroll\", update, true);\n };\n }, [shouldRender, side, align, offset, viewportPadding]);\n\n // Focus the menu surface on open (not the first item) so nothing looks\n // “selected” until the user arrows or hovers. ArrowDown moves to items[0].\n useEffect(() => {\n if (isAnimating && menuRef.current) {\n menuRef.current.focus();\n }\n }, [isAnimating]);\n\n // Close on outside click\n useEffect(() => {\n if (!open) return;\n const handler = (e: MouseEvent) => {\n const t = e.target as Node;\n if (menuRef.current?.contains(t) || triggerRef.current?.contains(t))\n return;\n const el = e.target instanceof Element ? e.target : null;\n if (el?.closest?.(`[${DROPDOWN_SUB_CONTENT_ATTR}]`)) return;\n setOpen(false);\n };\n document.addEventListener(\"mousedown\", handler);\n return () => document.removeEventListener(\"mousedown\", handler);\n }, [open, setOpen, triggerRef]);\n\n // Keyboard navigation\n useEffect(() => {\n if (!open) return;\n const handler = (e: KeyboardEvent) => {\n const menu = menuRef.current;\n if (!menu) return;\n const focusedEl = document.activeElement as HTMLElement | null;\n // Sub-menus portal outside `menu`; don't hijack keys meant for them\n if (focusedEl && !menu.contains(focusedEl)) return;\n const items = getItems(menu);\n const idx = items.indexOf(focusedEl!);\n\n switch (e.key) {\n case \"Escape\":\n if (closeOnEscape) {\n e.preventDefault();\n setOpen(false);\n triggerRef.current?.focus();\n }\n break;\n case \"ArrowDown\":\n e.preventDefault();\n if (items.length === 0) break;\n if (idx === -1 || (idx === items.length - 1 && loop))\n items[0]?.focus();\n else if (idx < items.length - 1) items[idx + 1]?.focus();\n break;\n case \"ArrowUp\":\n e.preventDefault();\n if (items.length === 0) break;\n if (idx <= 0 && loop) items[items.length - 1]?.focus();\n else if (idx > 0) items[idx - 1]?.focus();\n break;\n case \"Home\":\n e.preventDefault();\n items[0]?.focus();\n break;\n case \"End\":\n e.preventDefault();\n items[items.length - 1]?.focus();\n break;\n case \"Tab\":\n setOpen(false);\n break;\n }\n };\n window.addEventListener(\"keydown\", handler);\n return () => window.removeEventListener(\"keydown\", handler);\n }, [open, closeOnEscape, loop, setOpen, triggerRef]);\n\n // Body scroll lock\n useEffect(() => {\n if (open && isMobile && resolvedMobile.sheet) {\n document.body.style.overflow = \"hidden\";\n }\n return () => {\n document.body.style.overflow = \"\";\n };\n }, [open, isMobile, resolvedMobile.sheet]);\n\n if (!shouldRender || typeof document === \"undefined\") return null;\n\n // ─── Mobile bottom-sheet mode (chrome + motion match `Dialog` bottom sheet) ─\n if (isMobile && resolvedMobile.sheet) {\n return (\n <DropdownMobileBottomSheetPortal\n {...props}\n open={open}\n isAnimating={isAnimating}\n slideEntrance={slideEntrance}\n slideOffsetPx={slideOffsetPx}\n sheetTitle={resolvedMobile.title}\n sheetExtraClassName={resolvedMobile.sheetExtraClassName}\n contentClassName={resolvedMobile.contentClassName}\n onRequestClose={closeMenu}\n menuRef={menuRef}\n portalZClassName=\"z-50\"\n className={className}\n style={style}\n role=\"menu\"\n aria-orientation=\"vertical\"\n tabIndex={-1}\n >\n {children}\n </DropdownMobileBottomSheetPortal>\n );\n }\n\n // ─── Desktop floating menu mode ──────────────────────────────────────────\n const resolvedMinW =\n minWidth === \"trigger\"\n ? Math.max(triggerW, DROPDOWN_MENU_MIN_WIDTH_PX)\n : minWidth;\n\n return createPortal(\n <div\n {...props}\n ref={menuRef}\n role=\"menu\"\n aria-orientation=\"vertical\"\n tabIndex={-1}\n className={cn(\n \"bg-background border-primary/10 absolute z-50 overflow-hidden rounded-xl border py-1.5 shadow-xl outline-none\",\n className,\n )}\n style={{\n position: \"absolute\",\n top: pos.top,\n left: pos.left,\n minWidth: resolvedMinW,\n transformOrigin: DROPDOWN_CONTENT_ORIGIN[pos.side],\n transform: isAnimating ? \"none\" : DROPDOWN_CONTENT_HIDDEN[pos.side],\n opacity: isAnimating ? 1 : 0,\n transitionProperty: \"opacity, transform\",\n transitionDuration: `${duration}ms`,\n transitionTimingFunction: isAnimating\n ? DROPDOWN_PANEL_OPEN_EASING\n : DROPDOWN_PANEL_CLOSE_EASING,\n ...style,\n }}\n >\n {children}\n </div>,\n document.body,\n );\n};\n\n/** Returns all focusable menu items, excluding disabled ones */\nfunction getItems(menu: HTMLElement): HTMLElement[] {\n return Array.from(\n menu.querySelectorAll<HTMLElement>(\n '[role=\"menuitem\"]:not([aria-disabled=\"true\"]),' +\n '[role=\"menuitemcheckbox\"]:not([aria-disabled=\"true\"]),' +\n '[role=\"menuitemradio\"]:not([aria-disabled=\"true\"])',\n ),\n );\n}\n\n//////////////////////////////////////////////// Item\n\ninterface DropdownItemProps extends React.HTMLAttributes<HTMLDivElement> {\n disabled?: boolean;\n destructive?: boolean;\n icon?: React.ReactNode;\n shortcut?: string;\n /** Close menu on click (default true) */\n closeOnSelect?: boolean;\n inset?: boolean;\n}\n\nexport const DropdownItem: React.FC<DropdownItemProps> = ({\n children,\n disabled = false,\n destructive = false,\n icon,\n shortcut,\n closeOnSelect = true,\n inset = false,\n className,\n onClick,\n ...props\n}) => {\n const { setOpen } = useDropdown();\n\n const handleClick = (e: React.MouseEvent<HTMLDivElement>) => {\n if (disabled) return;\n onClick?.(e);\n if (closeOnSelect) setOpen(false);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n handleClick(e as unknown as React.MouseEvent<HTMLDivElement>);\n }\n };\n\n return (\n <div\n {...props}\n role=\"menuitem\"\n tabIndex={disabled ? undefined : -1}\n aria-disabled={disabled}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n className={cn(\n \"relative mx-1.5 flex items-center gap-2 rounded-md px-3 py-2 text-sm transition-colors duration-0 outline-none select-none\",\n DROPDOWN_SHEET_MENU_TEXT,\n inset && \"pl-9\",\n !disabled && \"cursor-pointer\",\n disabled && \"lg:cursor-not-allowed\",\n !disabled &&\n !destructive &&\n \"text-foreground hover:bg-primary/8 focus-visible:bg-primary/8 dark:hover:bg-primary/4 dark:focus-visible:bg-primary/4\",\n !disabled &&\n destructive &&\n \"text-destructive hover:bg-destructive/10 focus-visible:bg-destructive/10 dark:text-destructive-foreground dark:hover:bg-destructive-foreground/18 dark:focus-visible:bg-destructive-foreground/18\",\n disabled &&\n !destructive &&\n \"text-foreground/45 dark:text-foreground/50\",\n disabled &&\n destructive &&\n \"bg-destructive/5 text-destructive/75 dark:bg-destructive-foreground/12 dark:text-destructive-foreground/78\",\n className,\n )}\n >\n {icon && (\n <span className=\"flex size-4 shrink-0 items-center justify-center\">\n {icon}\n </span>\n )}\n <span className=\"flex-1\">{children}</span>\n {shortcut ? (\n <span\n className={cn(\n \"ml-auto text-xs tracking-widest\",\n DROPDOWN_SHEET_MENU_SHORTCUT,\n destructive\n ? \"text-destructive/70 dark:text-destructive-foreground/80\"\n : \"opacity-40\",\n )}\n >\n {shortcut}\n </span>\n ) : null}\n </div>\n );\n};\n\n//////////////////////////////////////////////// Separator\n\nexport const DropdownSeparator: React.FC<\n React.HTMLAttributes<HTMLDivElement>\n> = ({ className, ...props }) => (\n <div\n role=\"separator\"\n className={cn(\"border-primary/10 my-1.5 border-t\", className)}\n {...props}\n />\n);\n\n//////////////////////////////////////////////// Label\n\nexport const DropdownLabel: React.FC<\n React.HTMLAttributes<HTMLDivElement> & { inset?: boolean }\n> = ({ className, inset, ...props }) => (\n <div\n className={cn(\n \"text-primary/50 px-4 py-2 text-xs font-medium\",\n DROPDOWN_SHEET_MENU_LABEL_TEXT,\n inset && \"pl-9\",\n className,\n )}\n {...props}\n />\n);\n\n//////////////////////////////////////////////// Checkbox Item\n\ninterface DropdownCheckboxItemProps extends Omit<DropdownItemProps, \"icon\"> {\n checked?: boolean;\n onCheckedChange?: (checked: boolean) => void;\n}\n\nexport const DropdownCheckboxItem: React.FC<DropdownCheckboxItemProps> = ({\n children,\n checked = false,\n onCheckedChange,\n disabled = false,\n shortcut,\n closeOnSelect = false,\n className,\n onClick,\n ...props\n}) => {\n const { setOpen } = useDropdown();\n\n const handleClick = (e: React.MouseEvent<HTMLDivElement>) => {\n if (disabled) return;\n onCheckedChange?.(!checked);\n onClick?.(e);\n if (closeOnSelect) setOpen(false);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n handleClick(e as unknown as React.MouseEvent<HTMLDivElement>);\n }\n };\n\n return (\n <div\n {...props}\n role=\"menuitemcheckbox\"\n aria-checked={checked}\n tabIndex={disabled ? undefined : -1}\n aria-disabled={disabled}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n className={cn(\n \"mx-1.5 flex items-center gap-2 rounded-md px-3 py-2 text-sm transition-colors duration-0 outline-none select-none\",\n DROPDOWN_SHEET_MENU_TEXT,\n !disabled &&\n \"cursor-pointer text-foreground hover:bg-primary/8 focus-visible:bg-primary/8 dark:hover:bg-primary/4 dark:focus-visible:bg-primary/4\",\n disabled &&\n \"lg:cursor-not-allowed text-foreground/45 dark:text-foreground/50\",\n className,\n )}\n >\n <span className=\"mr-1 inline-flex shrink-0\" aria-hidden>\n <Checkbox\n checked={checked}\n disabled={disabled}\n tabIndex={-1}\n className=\"pointer-events-none\"\n />\n </span>\n <span className=\"min-w-0 flex-1\">{children}</span>\n {shortcut && (\n <span\n className={cn(\n \"ml-auto text-xs tracking-widest opacity-40\",\n DROPDOWN_SHEET_MENU_SHORTCUT,\n )}\n >\n {shortcut}\n </span>\n )}\n </div>\n );\n};\n\n//////////////////////////////////////////////// Radio Group + Item\n\nexport const DropdownRadioGroup: React.FC<{\n children: React.ReactNode;\n value?: string;\n onValueChange?: (value: string) => void;\n group: string;\n}> = ({ children, value, onValueChange, group }) => {\n const { setRadioValue, radioValues } = useDropdown();\n\n const resolvedValue = value ?? radioValues[group] ?? \"\";\n\n const handleValueChange = useCallback(\n (v: string) => {\n setRadioValue(group, v);\n onValueChange?.(v);\n },\n [group, onValueChange, setRadioValue],\n );\n\n const radioCtx = useMemo(\n () => ({\n group,\n value: resolvedValue,\n onValueChange: handleValueChange,\n }),\n [group, resolvedValue, handleValueChange],\n );\n\n return (\n <RadioGroupContext.Provider value={radioCtx}>\n {children}\n </RadioGroupContext.Provider>\n );\n};\n\ntype RadioGroupCtx = {\n group: string;\n value: string;\n onValueChange: (v: string) => void;\n};\nconst RadioGroupContext = React.createContext<RadioGroupCtx | undefined>(\n undefined,\n);\n\nfunction useRadioGroup() {\n const ctx = React.useContext(RadioGroupContext);\n if (!ctx)\n throw new Error(\"DropdownRadioItem must be inside DropdownRadioGroup\");\n return ctx;\n}\n\ninterface DropdownRadioItemProps extends Omit<DropdownItemProps, \"icon\"> {\n value: string;\n}\n\nexport const DropdownRadioItem: React.FC<DropdownRadioItemProps> = ({\n children,\n value,\n disabled = false,\n shortcut,\n closeOnSelect = false,\n className,\n onClick,\n ...props\n}) => {\n const { setOpen } = useDropdown();\n const { value: groupValue, onValueChange } = useRadioGroup();\n const checked = groupValue === value;\n\n const handleClick = (e: React.MouseEvent<HTMLDivElement>) => {\n if (disabled) return;\n onValueChange(value);\n onClick?.(e);\n if (closeOnSelect) setOpen(false);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n handleClick(e as unknown as React.MouseEvent<HTMLDivElement>);\n }\n };\n\n return (\n <div\n {...props}\n role=\"menuitemradio\"\n aria-checked={checked}\n tabIndex={disabled ? undefined : -1}\n aria-disabled={disabled}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n className={cn(\n \"relative mx-1.5 flex items-center gap-2 rounded-md px-3 py-2 text-sm transition-colors duration-0 outline-none select-none\",\n DROPDOWN_SHEET_MENU_TEXT,\n !disabled &&\n \"cursor-pointer text-foreground hover:bg-primary/8 focus-visible:bg-primary/8 dark:hover:bg-primary/4 dark:focus-visible:bg-primary/4\",\n disabled &&\n \"lg:cursor-not-allowed text-foreground/45 dark:text-foreground/50\",\n className,\n )}\n >\n <span className=\"min-w-0 flex-1\">{children}</span>\n {shortcut ? (\n <span\n className={cn(\n \"shrink-0 text-xs tracking-widest opacity-40\",\n DROPDOWN_SHEET_MENU_SHORTCUT,\n )}\n >\n {shortcut}\n </span>\n ) : null}\n <span\n className=\"flex size-4 shrink-0 items-center justify-center\"\n aria-hidden\n >\n {checked ? <Check className=\"size-3.5\" strokeWidth={2.5} /> : null}\n </span>\n </div>\n );\n};\n\n//////////////////////////////////////////////// Sub-menu\n\nexport const DropdownSub: React.FC<{ children: React.ReactNode }> = ({\n children,\n}) => {\n const [open, setOpen] = useState(false);\n const triggerRef = useRef<HTMLElement | null>(null);\n const subCtx = useMemo(\n () => ({ open, setOpen, triggerRef }),\n [open, setOpen],\n );\n return <SubContext.Provider value={subCtx}>{children}</SubContext.Provider>;\n};\n\nexport const DropdownSubTrigger: React.FC<\n React.HTMLAttributes<HTMLDivElement> & {\n icon?: React.ReactNode;\n inset?: boolean;\n disabled?: boolean;\n }\n> = ({ children, icon, inset, disabled = false, className, ...props }) => {\n const sub = React.useContext(SubContext);\n if (!sub) throw new Error(\"DropdownSubTrigger must be inside DropdownSub\");\n const { open, setOpen, triggerRef } = sub;\n /** Same cutoff as mobile bottom sheet — touch / narrow viewports must not use hover. */\n const isMobile = useIsMobile(DROPDOWN_MOBILE_SHEET_MAX_PX + 1);\n\n return (\n <div\n {...props}\n ref={(el) => {\n triggerRef.current = el;\n }}\n role=\"menuitem\"\n aria-haspopup=\"menu\"\n aria-expanded={open}\n tabIndex={disabled ? undefined : -1}\n aria-disabled={disabled}\n onMouseEnter={() => {\n if (disabled || isMobile) return;\n setOpen(true);\n }}\n onMouseLeave={() => {\n if (isMobile) return;\n setOpen(false);\n }}\n onKeyDown={(e) => {\n if (disabled) return;\n if (e.key === \"ArrowRight\" || e.key === \"Enter\") {\n e.preventDefault();\n setOpen(true);\n }\n }}\n onClick={() => {\n if (disabled) return;\n setOpen(!open);\n }}\n className={cn(\n \"relative mx-1.5 flex items-center gap-2 rounded-md px-3 py-2 text-sm transition-colors duration-0 outline-none select-none\",\n DROPDOWN_SHEET_MENU_TEXT,\n inset && \"pl-9\",\n !disabled &&\n \"cursor-pointer text-foreground hover:bg-primary/8 focus-visible:bg-primary/8 dark:hover:bg-primary/4 dark:focus-visible:bg-primary/4\",\n disabled &&\n \"lg:cursor-not-allowed text-foreground/45 dark:text-foreground/50\",\n className,\n )}\n >\n {icon && (\n <span className=\"flex size-4 shrink-0 items-center justify-center\">\n {icon}\n </span>\n )}\n <span className=\"flex-1\">{children}</span>\n <ChevronRight className=\"ml-auto size-4 opacity-50\" />\n </div>\n );\n};\n\nexport const DropdownSubContent: React.FC<\n React.HTMLAttributes<HTMLDivElement> & {\n duration?: number;\n viewportPadding?: number;\n /** Same meaning as {@link DropdownContent}. */\n mobileOptions?: DropdownMobileSheetOptions;\n /** Same as {@link DropdownContent} slideEntrance; default true. */\n slideEntrance?: boolean;\n slideEntranceOffsetPx?: number;\n }\n> = ({\n children,\n duration = 80,\n viewportPadding = 8,\n mobileOptions,\n slideEntrance = true,\n slideEntranceOffsetPx: slideEntranceOffsetPxProp,\n className,\n style,\n onKeyDown: onKeyDownProp,\n ...props\n}) => {\n const sub = React.useContext(SubContext);\n if (!sub) throw new Error(\"DropdownSubContent must be inside DropdownSub\");\n const { open, setOpen, triggerRef } = sub;\n\n const isMobile = useIsMobile(DROPDOWN_MOBILE_SHEET_MAX_PX + 1);\n const slideOffsetPx = useMemo(\n () =>\n slideEntranceOffsetPxProp ??\n DROPDOWN_MOBILE_SHEET_SLIDE_ENTRANCE_OFFSET_DEFAULT_PX,\n [slideEntranceOffsetPxProp],\n );\n\n const resolvedMobile = useMemo(\n () => resolveDropdownMobileSheet(mobileOptions),\n [mobileOptions],\n );\n\n const [shouldRender, setShouldRender] = useState(false);\n const [isAnimating, setIsAnimating] = useState(false);\n const [pos, setPos] = useState<Pos>({\n top: -9999,\n left: -9999,\n side: \"right\",\n });\n const menuRef = useRef<HTMLDivElement>(null);\n\n const closeDuration =\n isMobile && resolvedMobile.sheet\n ? DROPDOWN_MOBILE_SHEET_MOTION_MS\n : duration;\n\n const closeSub = useCallback(() => setOpen(false), [setOpen]);\n\n useEffect(() => {\n if (open) {\n setShouldRender(true);\n } else {\n setIsAnimating(false);\n const timer = setTimeout(() => setShouldRender(false), closeDuration);\n return () => clearTimeout(timer);\n }\n }, [open, closeDuration]);\n\n useEffect(() => {\n if (!shouldRender || !open) return;\n let raf2 = 0;\n const raf1 = requestAnimationFrame(() => {\n raf2 = requestAnimationFrame(() => setIsAnimating(true));\n });\n return () => {\n cancelAnimationFrame(raf1);\n if (raf2) cancelAnimationFrame(raf2);\n };\n }, [shouldRender, open]);\n\n useLayoutEffect(() => {\n if (!shouldRender || !triggerRef.current || !menuRef.current) return;\n if (isMobile && resolvedMobile.sheet) return;\n const update = () => {\n if (!triggerRef.current || !menuRef.current) return;\n setPos(\n computePos(\n triggerRef.current,\n menuRef.current,\n \"right\",\n \"start\",\n -8,\n viewportPadding,\n ),\n );\n };\n update();\n window.addEventListener(\"resize\", update);\n window.addEventListener(\"scroll\", update, true);\n return () => {\n window.removeEventListener(\"resize\", update);\n window.removeEventListener(\"scroll\", update, true);\n };\n }, [shouldRender, viewportPadding, isMobile, resolvedMobile.sheet]);\n\n useEffect(() => {\n if (isAnimating && menuRef.current) {\n menuRef.current.focus();\n }\n }, [isAnimating]);\n\n useEffect(() => {\n if (!open) return;\n const handler = (e: MouseEvent) => {\n const t = e.target as Node;\n if (menuRef.current?.contains(t) || triggerRef.current?.contains(t))\n return;\n const el = e.target instanceof Element ? e.target : null;\n const subPanel = el?.closest?.(`[${DROPDOWN_SUB_CONTENT_ATTR}]`);\n if (subPanel && subPanel !== menuRef.current) return;\n setOpen(false);\n };\n document.addEventListener(\"mousedown\", handler);\n return () => document.removeEventListener(\"mousedown\", handler);\n }, [open, setOpen, triggerRef]);\n\n const handleSubMenuKeyDown = useCallback(\n (e: React.KeyboardEvent<HTMLDivElement>) => {\n onKeyDownProp?.(e);\n if (e.defaultPrevented) return;\n const menu = menuRef.current;\n if (!menu) return;\n const items = getItems(menu);\n const focused = document.activeElement as HTMLElement;\n const idx = items.indexOf(focused);\n\n switch (e.key) {\n case \"ArrowLeft\":\n case \"Escape\":\n e.preventDefault();\n setOpen(false);\n triggerRef.current?.focus();\n break;\n case \"ArrowDown\":\n e.preventDefault();\n if (items.length === 0) break;\n if (idx === -1 || idx === items.length - 1) items[0]?.focus();\n else items[idx + 1]?.focus();\n break;\n case \"ArrowUp\":\n e.preventDefault();\n if (items.length === 0) break;\n if (idx <= 0) items[items.length - 1]?.focus();\n else items[idx - 1]?.focus();\n break;\n case \"Home\":\n e.preventDefault();\n items[0]?.focus();\n break;\n case \"End\":\n e.preventDefault();\n items[items.length - 1]?.focus();\n break;\n }\n },\n [onKeyDownProp, setOpen, triggerRef],\n );\n\n if (!shouldRender || typeof document === \"undefined\") return null;\n\n if (isMobile && resolvedMobile.sheet) {\n return (\n <DropdownMobileBottomSheetPortal\n {...props}\n open={open}\n isAnimating={isAnimating}\n slideEntrance={slideEntrance}\n slideOffsetPx={slideOffsetPx}\n sheetTitle={resolvedMobile.title}\n sheetExtraClassName={resolvedMobile.sheetExtraClassName}\n contentClassName={resolvedMobile.contentClassName}\n onRequestClose={closeSub}\n menuRef={menuRef}\n portalZClassName=\"z-[70]\"\n className={className}\n style={style}\n role=\"menu\"\n tabIndex={-1}\n onKeyDown={handleSubMenuKeyDown}\n data-dropdown-sub-content=\"\"\n >\n {children}\n </DropdownMobileBottomSheetPortal>\n );\n }\n\n return createPortal(\n <div\n {...props}\n ref={menuRef}\n role=\"menu\"\n tabIndex={-1}\n onMouseEnter={() => setOpen(true)}\n onMouseLeave={() => setOpen(false)}\n onKeyDown={handleSubMenuKeyDown}\n data-dropdown-sub-content=\"\"\n className={cn(\n \"bg-background border-primary/10 absolute z-60 overflow-hidden rounded-xl border py-1.5 shadow-xl outline-none\",\n className,\n )}\n style={{\n position: \"absolute\",\n top: pos.top,\n left: pos.left,\n minWidth: DROPDOWN_MENU_MIN_WIDTH_PX,\n transformOrigin: SUB_CONTENT_ORIGIN[pos.side],\n transform: isAnimating ? \"none\" : DROPDOWN_CONTENT_HIDDEN[pos.side],\n opacity: isAnimating ? 1 : 0,\n transitionProperty: \"opacity, transform\",\n transitionDuration: `${duration}ms`,\n transitionTimingFunction: isAnimating\n ? DROPDOWN_PANEL_OPEN_EASING\n : DROPDOWN_PANEL_CLOSE_EASING,\n ...style,\n }}\n >\n {children}\n </div>,\n document.body,\n );\n};\n"]}
@@ -5,6 +5,11 @@ declare const sizeClass: {
5
5
  readonly default: "h-10 min-h-10 px-3.5 text-sm";
6
6
  readonly lg: "h-11 min-h-11 px-4 text-base file:h-8 file:text-base";
7
7
  };
8
+ declare const roundedClass: {
9
+ readonly full: "rounded-full";
10
+ readonly lg: "rounded-lg";
11
+ readonly md: "rounded-md";
12
+ };
8
13
  type InputProps = Omit<React.ComponentProps<"input">, "size"> & {
9
14
  /**
10
15
  * Visual height and padding. This replaces the native HTML `size` attribute
@@ -14,6 +19,8 @@ type InputProps = Omit<React.ComponentProps<"input">, "size"> & {
14
19
  * Defaults to `"lg"` (large). Use `"default"` for a denser medium height.
15
20
  */
16
21
  size?: keyof typeof sizeClass;
22
+ /** Corner radius. Defaults to `md` (same as previous hard-coded styling). */
23
+ rounded?: keyof typeof roundedClass;
17
24
  };
18
25
  declare const Input: React.ForwardRefExoticComponent<Omit<InputProps, "ref"> & React.RefAttributes<HTMLInputElement>>;
19
26
 
@@ -12,8 +12,20 @@ var sizeClass = {
12
12
  default: "h-10 min-h-10 px-3.5 text-sm",
13
13
  lg: "h-11 min-h-11 px-4 text-base file:h-8 file:text-base"
14
14
  };
15
+ var roundedClass = {
16
+ full: "rounded-full",
17
+ lg: "rounded-lg",
18
+ md: "rounded-md"
19
+ };
15
20
  var Input = React.forwardRef(
16
- ({ className, type = "text", size = "lg", disabled, ...props }, ref) => {
21
+ ({
22
+ className,
23
+ type = "text",
24
+ size = "lg",
25
+ rounded = "md",
26
+ disabled,
27
+ ...props
28
+ }, ref) => {
17
29
  return /* @__PURE__ */ jsx(
18
30
  "input",
19
31
  {
@@ -21,7 +33,8 @@ var Input = React.forwardRef(
21
33
  disabled,
22
34
  "data-slot": "input",
23
35
  className: cn(
24
- "border-input bg-background text-foreground placeholder:text-primary/30 selection:bg-primary selection:text-primary-foreground flex w-full min-w-0 rounded-md border outline-none transition-[color,box-shadow]",
36
+ "border-input bg-background text-foreground placeholder:text-primary/30 selection:bg-primary selection:text-primary-foreground flex w-full min-w-0 border outline-none transition-[color,box-shadow]",
37
+ roundedClass[rounded],
25
38
  "disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50",
26
39
  "focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]",
27
40
  "aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40",
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/lib/utils.ts","../../src/react/input.tsx"],"names":[],"mappings":";;;;;;AAGO,SAAS,MAAM,MAAA,EAAsB;AAC1C,EAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAC,CAAA;AAC7B;ACDA,IAAM,SAAA,GAAY;AAAA,EAChB,EAAA,EAAI,0BAAA;AAAA,EACJ,OAAA,EAAS,8BAAA;AAAA,EACT,EAAA,EAAI;AACN,CAAA;AAaA,IAAM,KAAA,GAAc,KAAA,CAAA,UAAA;AAAA,EAClB,CAAC,EAAE,SAAA,EAAW,IAAA,GAAO,MAAA,EAAQ,IAAA,GAAO,IAAA,EAAM,QAAA,EAAU,GAAG,KAAA,EAAM,EAAG,GAAA,KAAQ;AACtE,IAAA,uBACE,GAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,IAAA;AAAA,QACA,QAAA;AAAA,QACA,WAAA,EAAU,OAAA;AAAA,QACV,SAAA,EAAW,EAAA;AAAA,UACT,gNAAA;AAAA,UACA,8EAAA;AAAA,UACA,+EAAA;AAAA,UACA,wGAAA;AAAA,UACA,gHAAA;AAAA,UACA,UAAU,IAAI,CAAA;AAAA,UACd;AAAA,SACF;AAAA,QACA,GAAA;AAAA,QACC,GAAG;AAAA;AAAA,KACN;AAAA,EAEJ;AACF;AACA,KAAA,CAAM,WAAA,GAAc,OAAA","file":"input.js","sourcesContent":["import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import * as React from \"react\";\n\nimport { cn } from \"@/lib/utils\";\n\nconst sizeClass = {\n sm: \"h-9 min-h-9 px-3 text-sm\",\n default: \"h-10 min-h-10 px-3.5 text-sm\",\n lg: \"h-11 min-h-11 px-4 text-base file:h-8 file:text-base\",\n} as const;\n\nexport type InputProps = Omit<React.ComponentProps<\"input\">, \"size\"> & {\n /**\n * Visual height and padding. This replaces the native HTML `size` attribute\n * (character width); that numeric attribute is not supported on this\n * component.\n *\n * Defaults to `\"lg\"` (large). Use `\"default\"` for a denser medium height.\n */\n size?: keyof typeof sizeClass;\n};\n\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(\n ({ className, type = \"text\", size = \"lg\", disabled, ...props }, ref) => {\n return (\n <input\n type={type}\n disabled={disabled}\n data-slot=\"input\"\n className={cn(\n \"border-input bg-background text-foreground placeholder:text-primary/30 selection:bg-primary selection:text-primary-foreground flex w-full min-w-0 rounded-md border outline-none transition-[color,box-shadow]\",\n \"disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50\",\n \"focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]\",\n \"aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40\",\n \"file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground\",\n sizeClass[size],\n className,\n )}\n ref={ref}\n {...props}\n />\n );\n },\n);\nInput.displayName = \"Input\";\n\nexport { Input };\n"]}
1
+ {"version":3,"sources":["../../src/lib/utils.ts","../../src/react/input.tsx"],"names":[],"mappings":";;;;;;AAGO,SAAS,MAAM,MAAA,EAAsB;AAC1C,EAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAC,CAAA;AAC7B;ACDA,IAAM,SAAA,GAAY;AAAA,EAChB,EAAA,EAAI,0BAAA;AAAA,EACJ,OAAA,EAAS,8BAAA;AAAA,EACT,EAAA,EAAI;AACN,CAAA;AAEA,IAAM,YAAA,GAAe;AAAA,EACnB,IAAA,EAAM,cAAA;AAAA,EACN,EAAA,EAAI,YAAA;AAAA,EACJ,EAAA,EAAI;AACN,CAAA;AAeA,IAAM,KAAA,GAAc,KAAA,CAAA,UAAA;AAAA,EAClB,CACE;AAAA,IACE,SAAA;AAAA,IACA,IAAA,GAAO,MAAA;AAAA,IACP,IAAA,GAAO,IAAA;AAAA,IACP,OAAA,GAAU,IAAA;AAAA,IACV,QAAA;AAAA,IACA,GAAG;AAAA,KAEL,GAAA,KACG;AACH,IAAA,uBACE,GAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,IAAA;AAAA,QACA,QAAA;AAAA,QACA,WAAA,EAAU,OAAA;AAAA,QACV,SAAA,EAAW,EAAA;AAAA,UACT,qMAAA;AAAA,UACA,aAAa,OAAO,CAAA;AAAA,UACpB,8EAAA;AAAA,UACA,+EAAA;AAAA,UACA,wGAAA;AAAA,UACA,gHAAA;AAAA,UACA,UAAU,IAAI,CAAA;AAAA,UACd;AAAA,SACF;AAAA,QACA,GAAA;AAAA,QACC,GAAG;AAAA;AAAA,KACN;AAAA,EAEJ;AACF;AACA,KAAA,CAAM,WAAA,GAAc,OAAA","file":"input.js","sourcesContent":["import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","import * as React from \"react\";\n\nimport { cn } from \"@/lib/utils\";\n\nconst sizeClass = {\n sm: \"h-9 min-h-9 px-3 text-sm\",\n default: \"h-10 min-h-10 px-3.5 text-sm\",\n lg: \"h-11 min-h-11 px-4 text-base file:h-8 file:text-base\",\n} as const;\n\nconst roundedClass = {\n full: \"rounded-full\",\n lg: \"rounded-lg\",\n md: \"rounded-md\",\n} as const;\n\nexport type InputProps = Omit<React.ComponentProps<\"input\">, \"size\"> & {\n /**\n * Visual height and padding. This replaces the native HTML `size` attribute\n * (character width); that numeric attribute is not supported on this\n * component.\n *\n * Defaults to `\"lg\"` (large). Use `\"default\"` for a denser medium height.\n */\n size?: keyof typeof sizeClass;\n /** Corner radius. Defaults to `md` (same as previous hard-coded styling). */\n rounded?: keyof typeof roundedClass;\n};\n\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(\n (\n {\n className,\n type = \"text\",\n size = \"lg\",\n rounded = \"md\",\n disabled,\n ...props\n },\n ref,\n ) => {\n return (\n <input\n type={type}\n disabled={disabled}\n data-slot=\"input\"\n className={cn(\n \"border-input bg-background text-foreground placeholder:text-primary/30 selection:bg-primary selection:text-primary-foreground flex w-full min-w-0 border outline-none transition-[color,box-shadow]\",\n roundedClass[rounded],\n \"disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50\",\n \"focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px]\",\n \"aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40\",\n \"file:inline-flex file:h-7 file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground\",\n sizeClass[size],\n className,\n )}\n ref={ref}\n {...props}\n />\n );\n },\n);\nInput.displayName = \"Input\";\n\nexport { Input };\n"]}
@@ -0,0 +1,28 @@
1
+ import * as React from 'react';
2
+ import { ButtonProps } from './button.js';
3
+
4
+ type PaginationMeta = {
5
+ currentPage: number;
6
+ totalItems: number;
7
+ itemsPerPage: number;
8
+ /** omit to derive `ceil(totalItems / itemsPerPage)` (minimum 1) */
9
+ totalPages?: number;
10
+ };
11
+ type PaginationProps = {
12
+ meta: PaginationMeta;
13
+ onPageChange?: (page: number) => void;
14
+ className?: string;
15
+ /** max page numbers in the sliding window (excluding first/last when ellipses show; default 3) */
16
+ maxVisibleButtons?: number;
17
+ disabled?: boolean;
18
+ /**
19
+ * density preset → resolved `Button` size for every control (`xs` → `default`;
20
+ * `default` / `lg` → `lg`) so chevrons and page cells share one hit grid.
21
+ */
22
+ size?: ButtonProps["size"];
23
+ /** same as `Button` `rounded`; pagination defaults to `full` */
24
+ rounded?: NonNullable<ButtonProps["rounded"]>;
25
+ };
26
+ declare const Pagination: React.NamedExoticComponent<PaginationProps & React.RefAttributes<HTMLDivElement>>;
27
+
28
+ export { Pagination, type PaginationMeta, type PaginationProps };