@arolariu/components 1.1.0 → 2.0.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.
- package/CHANGELOG.md +32 -0
- package/dist/components/ui/accordion.js +3 -3
- package/dist/components/ui/accordion.js.map +1 -1
- package/dist/components/ui/accordion_module.css.map +1 -1
- package/dist/components/ui/alert-dialog.js +8 -8
- package/dist/components/ui/alert-dialog.js.map +1 -1
- package/dist/components/ui/alert-dialog_module.css +1 -1
- package/dist/components/ui/alert-dialog_module.css.map +1 -1
- package/dist/components/ui/alert.js +4 -4
- package/dist/components/ui/alert.js.map +1 -1
- package/dist/components/ui/alert_module.css.map +1 -1
- package/dist/components/ui/aspect-ratio.js +2 -2
- package/dist/components/ui/aspect-ratio.js.map +1 -1
- package/dist/components/ui/aspect-ratio_module.css.map +1 -1
- package/dist/components/ui/async-boundary.js +2 -2
- package/dist/components/ui/async-boundary.js.map +1 -1
- package/dist/components/ui/avatar.js +4 -4
- package/dist/components/ui/avatar.js.map +1 -1
- package/dist/components/ui/avatar_module.css.map +1 -1
- package/dist/components/ui/background-beams.js +3 -3
- package/dist/components/ui/background-beams.js.map +1 -1
- package/dist/components/ui/background-beams_module.css.map +1 -1
- package/dist/components/ui/badge.js +2 -2
- package/dist/components/ui/badge.js.map +1 -1
- package/dist/components/ui/badge_module.css.map +1 -1
- package/dist/components/ui/breadcrumb.js +10 -10
- package/dist/components/ui/breadcrumb.js.map +1 -1
- package/dist/components/ui/breadcrumb_module.css.map +1 -1
- package/dist/components/ui/bubble-background.js +5 -5
- package/dist/components/ui/bubble-background.js.map +1 -1
- package/dist/components/ui/bubble-background_module.css.map +1 -1
- package/dist/components/ui/button-group.js +6 -6
- package/dist/components/ui/button-group.js.map +1 -1
- package/dist/components/ui/button-group_module.css.map +1 -1
- package/dist/components/ui/button.js +4 -4
- package/dist/components/ui/button.js.map +1 -1
- package/dist/components/ui/button_module.css.map +1 -1
- package/dist/components/ui/calendar.d.ts +2 -1
- package/dist/components/ui/calendar.d.ts.map +1 -1
- package/dist/components/ui/calendar.js +4 -4
- package/dist/components/ui/calendar.js.map +1 -1
- package/dist/components/ui/calendar_module.css.map +1 -1
- package/dist/components/ui/card-skeleton.js +2 -2
- package/dist/components/ui/card-skeleton.js.map +1 -1
- package/dist/components/ui/card-skeleton_module.css.map +1 -1
- package/dist/components/ui/card.js +8 -8
- package/dist/components/ui/card.js.map +1 -1
- package/dist/components/ui/card_module.css.map +1 -1
- package/dist/components/ui/carousel.js +16 -16
- package/dist/components/ui/carousel.js.map +1 -1
- package/dist/components/ui/carousel_module.css +1 -1
- package/dist/components/ui/carousel_module.css.map +1 -1
- package/dist/components/ui/chart.d.ts +6 -3
- package/dist/components/ui/chart.d.ts.map +1 -1
- package/dist/components/ui/chart.js +70 -136
- package/dist/components/ui/chart.js.map +1 -1
- package/dist/components/ui/chart_module.css.map +1 -1
- package/dist/components/ui/checkbox-group.js +2 -2
- package/dist/components/ui/checkbox-group.js.map +1 -1
- package/dist/components/ui/checkbox-group_module.css.map +1 -1
- package/dist/components/ui/checkbox.js +2 -2
- package/dist/components/ui/checkbox.js.map +1 -1
- package/dist/components/ui/checkbox_module.css.map +1 -1
- package/dist/components/ui/collapsible.js +4 -4
- package/dist/components/ui/collapsible.js.map +1 -1
- package/dist/components/ui/collapsible_module.css.map +1 -1
- package/dist/components/ui/combobox.js +13 -13
- package/dist/components/ui/combobox.js.map +1 -1
- package/dist/components/ui/combobox_module.css.map +1 -1
- package/dist/components/ui/command.js +40 -40
- package/dist/components/ui/command.js.map +1 -1
- package/dist/components/ui/command_module.css +1 -1
- package/dist/components/ui/command_module.css.map +1 -1
- package/dist/components/ui/context-menu.js +6 -6
- package/dist/components/ui/context-menu.js.map +1 -1
- package/dist/components/ui/context-menu_module.css.map +1 -1
- package/dist/components/ui/copy-button.js +6 -6
- package/dist/components/ui/copy-button.js.map +1 -1
- package/dist/components/ui/copy-button_module.css.map +1 -1
- package/dist/components/ui/counting-number.js +6 -6
- package/dist/components/ui/counting-number.js.map +1 -1
- package/dist/components/ui/counting-number_module.css.map +1 -1
- package/dist/components/ui/dialog.js +6 -6
- package/dist/components/ui/dialog.js.map +1 -1
- package/dist/components/ui/dialog_module.css +1 -1
- package/dist/components/ui/dialog_module.css.map +1 -1
- package/dist/components/ui/dot-background_module.css.map +1 -1
- package/dist/components/ui/drawer.js +5 -5
- package/dist/components/ui/drawer.js.map +1 -1
- package/dist/components/ui/drawer_module.css.map +1 -1
- package/dist/components/ui/dropdown-menu.js +6 -6
- package/dist/components/ui/dropdown-menu.js.map +1 -1
- package/dist/components/ui/dropdown-menu_module.css.map +1 -1
- package/dist/components/ui/dropdrawer.js +52 -52
- package/dist/components/ui/dropdrawer.js.map +1 -1
- package/dist/components/ui/dropdrawer_module.css.map +1 -1
- package/dist/components/ui/empty.js +7 -7
- package/dist/components/ui/empty.js.map +1 -1
- package/dist/components/ui/empty_module.css.map +1 -1
- package/dist/components/ui/error-boundary.js +2 -2
- package/dist/components/ui/error-boundary.js.map +1 -1
- package/dist/components/ui/error-boundary_module.css.map +1 -1
- package/dist/components/ui/field.js +12 -12
- package/dist/components/ui/field.js.map +1 -1
- package/dist/components/ui/field_module.css.map +1 -1
- package/dist/components/ui/fireworks-background.js +6 -6
- package/dist/components/ui/fireworks-background.js.map +1 -1
- package/dist/components/ui/fireworks-background_module.css.map +1 -1
- package/dist/components/ui/flip-button.js +5 -5
- package/dist/components/ui/flip-button.js.map +1 -1
- package/dist/components/ui/flip-button_module.css.map +1 -1
- package/dist/components/ui/focus-scope.js +6 -6
- package/dist/components/ui/focus-scope.js.map +1 -1
- package/dist/components/ui/focus-scope_module.css.map +1 -1
- package/dist/components/ui/form-skeleton.js +2 -2
- package/dist/components/ui/form-skeleton.js.map +1 -1
- package/dist/components/ui/form-skeleton_module.css.map +1 -1
- package/dist/components/ui/form.d.ts +3 -3
- package/dist/components/ui/form.d.ts.map +1 -1
- package/dist/components/ui/form.js +13 -13
- package/dist/components/ui/form.js.map +1 -1
- package/dist/components/ui/form_module.css.map +1 -1
- package/dist/components/ui/gradient-background.js +2 -2
- package/dist/components/ui/gradient-background.js.map +1 -1
- package/dist/components/ui/gradient-background_module.css.map +1 -1
- package/dist/components/ui/gradient-text.js +2 -2
- package/dist/components/ui/gradient-text.js.map +1 -1
- package/dist/components/ui/gradient-text_module.css.map +1 -1
- package/dist/components/ui/highlight-text.js +4 -4
- package/dist/components/ui/highlight-text.js.map +1 -1
- package/dist/components/ui/highlight-text_module.css.map +1 -1
- package/dist/components/ui/hole-background.js +21 -21
- package/dist/components/ui/hole-background.js.map +1 -1
- package/dist/components/ui/hole-background_module.css.map +1 -1
- package/dist/components/ui/hover-card.js +3 -3
- package/dist/components/ui/hover-card.js.map +1 -1
- package/dist/components/ui/hover-card_module.css.map +1 -1
- package/dist/components/ui/input-group.js +7 -7
- package/dist/components/ui/input-group.js.map +1 -1
- package/dist/components/ui/input-group_module.css.map +1 -1
- package/dist/components/ui/input-otp.d.ts +3 -3
- package/dist/components/ui/input-otp.d.ts.map +1 -1
- package/dist/components/ui/input-otp.js +6 -6
- package/dist/components/ui/input-otp.js.map +1 -1
- package/dist/components/ui/input-otp_module.css.map +1 -1
- package/dist/components/ui/input.js +2 -2
- package/dist/components/ui/input.js.map +1 -1
- package/dist/components/ui/input_module.css.map +1 -1
- package/dist/components/ui/item.js +13 -13
- package/dist/components/ui/item.js.map +1 -1
- package/dist/components/ui/item_module.css.map +1 -1
- package/dist/components/ui/kbd.js +3 -3
- package/dist/components/ui/kbd.js.map +1 -1
- package/dist/components/ui/kbd_module.css.map +1 -1
- package/dist/components/ui/label.js +2 -2
- package/dist/components/ui/label.js.map +1 -1
- package/dist/components/ui/label_module.css.map +1 -1
- package/dist/components/ui/list-skeleton.js +2 -2
- package/dist/components/ui/list-skeleton.js.map +1 -1
- package/dist/components/ui/list-skeleton_module.css.map +1 -1
- package/dist/components/ui/loading-overlay.js +2 -2
- package/dist/components/ui/loading-overlay.js.map +1 -1
- package/dist/components/ui/loading-overlay_module.css.map +1 -1
- package/dist/components/ui/menubar.js +4 -4
- package/dist/components/ui/menubar.js.map +1 -1
- package/dist/components/ui/menubar_module.css.map +1 -1
- package/dist/components/ui/meter.js +5 -5
- package/dist/components/ui/meter.js.map +1 -1
- package/dist/components/ui/meter_module.css.map +1 -1
- package/dist/components/ui/navigation-menu.js +5 -5
- package/dist/components/ui/navigation-menu.js.map +1 -1
- package/dist/components/ui/navigation-menu_module.css +1 -1
- package/dist/components/ui/navigation-menu_module.css.map +1 -1
- package/dist/components/ui/number-field.js +3 -3
- package/dist/components/ui/number-field.js.map +1 -1
- package/dist/components/ui/number-field_module.css.map +1 -1
- package/dist/components/ui/pagination.js +8 -8
- package/dist/components/ui/pagination.js.map +1 -1
- package/dist/components/ui/pagination_module.css.map +1 -1
- package/dist/components/ui/popover.js +5 -5
- package/dist/components/ui/popover.js.map +1 -1
- package/dist/components/ui/popover_module.css.map +1 -1
- package/dist/components/ui/progress.js +2 -2
- package/dist/components/ui/progress.js.map +1 -1
- package/dist/components/ui/progress_module.css.map +1 -1
- package/dist/components/ui/radio-group.js +3 -3
- package/dist/components/ui/radio-group.js.map +1 -1
- package/dist/components/ui/radio-group_module.css.map +1 -1
- package/dist/components/ui/resizable.d.ts +13 -29
- package/dist/components/ui/resizable.d.ts.map +1 -1
- package/dist/components/ui/resizable.js +8 -7
- package/dist/components/ui/resizable.js.map +1 -1
- package/dist/components/ui/resizable_module.css.map +1 -1
- package/dist/components/ui/ripple-button.js +9 -9
- package/dist/components/ui/ripple-button.js.map +1 -1
- package/dist/components/ui/ripple-button_module.css.map +1 -1
- package/dist/components/ui/scratcher_module.css.map +1 -1
- package/dist/components/ui/scroll-area.js +2 -2
- package/dist/components/ui/scroll-area.js.map +1 -1
- package/dist/components/ui/scroll-area_module.css.map +1 -1
- package/dist/components/ui/select.js +4 -4
- package/dist/components/ui/select.js.map +1 -1
- package/dist/components/ui/select_module.css.map +1 -1
- package/dist/components/ui/separator.js +2 -2
- package/dist/components/ui/separator.js.map +1 -1
- package/dist/components/ui/separator_module.css.map +1 -1
- package/dist/components/ui/sheet.js +6 -6
- package/dist/components/ui/sheet.js.map +1 -1
- package/dist/components/ui/sheet_module.css.map +1 -1
- package/dist/components/ui/sidebar.js +36 -36
- package/dist/components/ui/sidebar.js.map +1 -1
- package/dist/components/ui/sidebar_module.css.map +1 -1
- package/dist/components/ui/skeleton.js +2 -2
- package/dist/components/ui/skeleton.js.map +1 -1
- package/dist/components/ui/skeleton_module.css.map +1 -1
- package/dist/components/ui/slider.js +2 -2
- package/dist/components/ui/slider.js.map +1 -1
- package/dist/components/ui/slider_module.css.map +1 -1
- package/dist/components/ui/spinner.js +2 -2
- package/dist/components/ui/spinner.js.map +1 -1
- package/dist/components/ui/spinner_module.css.map +1 -1
- package/dist/components/ui/stepper.js +2 -2
- package/dist/components/ui/stepper.js.map +1 -1
- package/dist/components/ui/stepper_module.css.map +1 -1
- package/dist/components/ui/switch.js +2 -2
- package/dist/components/ui/switch.js.map +1 -1
- package/dist/components/ui/switch_module.css.map +1 -1
- package/dist/components/ui/table-skeleton.js +2 -2
- package/dist/components/ui/table-skeleton.js.map +1 -1
- package/dist/components/ui/table-skeleton_module.css.map +1 -1
- package/dist/components/ui/table.js +9 -9
- package/dist/components/ui/table.js.map +1 -1
- package/dist/components/ui/table_module.css.map +1 -1
- package/dist/components/ui/tabs.js +3 -3
- package/dist/components/ui/tabs.js.map +1 -1
- package/dist/components/ui/tabs_module.css.map +1 -1
- package/dist/components/ui/textarea.js +2 -2
- package/dist/components/ui/textarea.js.map +1 -1
- package/dist/components/ui/textarea_module.css.map +1 -1
- package/dist/components/ui/timeline.js +5 -5
- package/dist/components/ui/timeline.js.map +1 -1
- package/dist/components/ui/timeline_module.css.map +1 -1
- package/dist/components/ui/{sonner.d.ts → toast.d.ts} +10 -2
- package/dist/components/ui/toast.d.ts.map +1 -0
- package/dist/components/ui/{sonner.js → toast.js} +40 -40
- package/dist/components/ui/toast.js.map +1 -0
- package/dist/components/ui/toast.module.js +34 -0
- package/dist/components/ui/toast.module.js.map +1 -0
- package/dist/components/ui/{sonner_module.css → toast_module.css} +35 -35
- package/dist/components/ui/toast_module.css.map +1 -0
- package/dist/components/ui/toggle-group.js +5 -5
- package/dist/components/ui/toggle-group.js.map +1 -1
- package/dist/components/ui/toggle-group_module.css.map +1 -1
- package/dist/components/ui/toggle.js +2 -2
- package/dist/components/ui/toggle.js.map +1 -1
- package/dist/components/ui/toggle_module.css.map +1 -1
- package/dist/components/ui/toolbar.js +6 -6
- package/dist/components/ui/toolbar.js.map +1 -1
- package/dist/components/ui/toolbar_module.css.map +1 -1
- package/dist/components/ui/tooltip.js +4 -4
- package/dist/components/ui/tooltip.js.map +1 -1
- package/dist/components/ui/tooltip_module.css.map +1 -1
- package/dist/components/ui/typewriter.js +4 -4
- package/dist/components/ui/typewriter.js.map +1 -1
- package/dist/components/ui/typewriter_module.css.map +1 -1
- package/dist/components/ui/visually-hidden.js +2 -2
- package/dist/components/ui/visually-hidden.js.map +1 -1
- package/dist/components/ui/visually-hidden_module.css.map +1 -1
- package/dist/hooks/useAnnounce.js +5 -5
- package/dist/hooks/useAnnounce.js.map +1 -1
- package/dist/hooks/useClipboard.js +6 -6
- package/dist/hooks/useClipboard.js.map +1 -1
- package/dist/hooks/useControllableState.js +3 -3
- package/dist/hooks/useControllableState.js.map +1 -1
- package/dist/hooks/useDebounce.js +3 -3
- package/dist/hooks/useDebounce.js.map +1 -1
- package/dist/hooks/useEventCallback.js +4 -4
- package/dist/hooks/useEventCallback.js.map +1 -1
- package/dist/hooks/useFocusManager.js +6 -6
- package/dist/hooks/useFocusManager.js.map +1 -1
- package/dist/hooks/useFocusVisible.js +5 -5
- package/dist/hooks/useFocusVisible.js.map +1 -1
- package/dist/hooks/useId.js +4 -4
- package/dist/hooks/useId.js.map +1 -1
- package/dist/hooks/useIntersectionObserver.js +3 -3
- package/dist/hooks/useIntersectionObserver.js.map +1 -1
- package/dist/hooks/useInterval.js +4 -4
- package/dist/hooks/useInterval.js.map +1 -1
- package/dist/hooks/useLocalStorage.js +4 -4
- package/dist/hooks/useLocalStorage.js.map +1 -1
- package/dist/hooks/useMediaQuery.js +3 -3
- package/dist/hooks/useMediaQuery.js.map +1 -1
- package/dist/hooks/useMergedRefs.js +2 -2
- package/dist/hooks/useMergedRefs.js.map +1 -1
- package/dist/hooks/useOnClickOutside.js +2 -2
- package/dist/hooks/useOnClickOutside.js.map +1 -1
- package/dist/hooks/usePrevious.js +3 -3
- package/dist/hooks/usePrevious.js.map +1 -1
- package/dist/hooks/useThrottle.js +7 -7
- package/dist/hooks/useThrottle.js.map +1 -1
- package/dist/hooks/useTimeout.js +4 -4
- package/dist/hooks/useTimeout.js.map +1 -1
- package/dist/index.css.map +1 -1
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/motion/Collapse.js +2 -2
- package/dist/motion/Collapse.js.map +1 -1
- package/dist/motion/Collapse_module.css.map +1 -1
- package/package.json +7 -8
- package/src/components/ui/calendar.tsx +2 -1
- package/src/components/ui/chart.tsx +2 -2
- package/src/components/ui/form.tsx +28 -3
- package/src/components/ui/input-otp.tsx +3 -3
- package/src/components/ui/resizable.tsx +15 -18
- package/src/components/ui/{sonner.module.css → toast.module.css} +1 -1
- package/src/components/ui/{sonner.tsx → toast.tsx} +2 -2
- package/src/index.ts +4 -4
- package/dist/components/ui/sonner.d.ts.map +0 -1
- package/dist/components/ui/sonner.js.map +0 -1
- package/dist/components/ui/sonner.module.js +0 -34
- package/dist/components/ui/sonner.module.js.map +0 -1
- package/dist/components/ui/sonner_module.css.map +0 -1
- package/dist/rslib-runtime.js +0 -39
- package/dist/rslib-runtime.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"components/ui/combobox.js","sources":["../../../src/components/ui/combobox.tsx"],"sourcesContent":["\"use client\";\r\n\r\nimport {Check, ChevronsUpDown} from \"lucide-react\";\r\nimport * as React from \"react\";\r\n\r\nimport {useControllableState} from \"@/hooks/useControllableState\";\r\nimport {cn} from \"@/lib/utilities\";\r\n\r\nimport {Button} from \"./button\";\r\nimport {Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator} from \"./command\";\r\nimport {Popover, PopoverContent, PopoverTrigger} from \"./popover\";\r\n\r\nimport styles from \"./combobox.module.css\";\r\n\r\ninterface ComboboxContextValue {\r\n value: string;\r\n onValueChange: (value: string) => void;\r\n open: boolean;\r\n setOpen: (open: boolean) => void;\r\n placeholder?: string;\r\n searchPlaceholder?: string;\r\n emptyMessage?: string;\r\n disabled?: boolean;\r\n itemLabels: Map<string, string>;\r\n registerItem: (value: string, label: string) => void;\r\n unregisterItem: (value: string) => void;\r\n}\r\n\r\nconst ComboboxContext = React.createContext<ComboboxContextValue | null>(null);\r\n\r\nfunction useComboboxContext(componentName: string): ComboboxContextValue {\r\n const context = React.useContext(ComboboxContext);\r\n\r\n if (!context) {\r\n throw new Error(`${componentName} must be used within Combobox.`);\r\n }\r\n\r\n return context;\r\n}\r\n\r\ninterface ComboboxProps {\r\n /**\r\n * The controlled selected value.\r\n * @default undefined\r\n */\r\n value?: string;\r\n /**\r\n * The default value when uncontrolled.\r\n * @default \"\"\r\n */\r\n defaultValue?: string;\r\n /**\r\n * Callback fired when the selected value changes.\r\n * @default undefined\r\n */\r\n onValueChange?: (value: string) => void;\r\n /**\r\n * Whether the popover is controlled open state.\r\n * @default undefined\r\n */\r\n open?: boolean;\r\n /**\r\n * Whether the popover is open by default (uncontrolled).\r\n * @default false\r\n */\r\n defaultOpen?: boolean;\r\n /**\r\n * Callback fired when the open state changes.\r\n * @default undefined\r\n */\r\n onOpenChange?: (open: boolean) => void;\r\n /**\r\n * Placeholder text shown when no value is selected.\r\n * @default \"Select an item...\"\r\n */\r\n placeholder?: string;\r\n /**\r\n * Placeholder text shown in the search input.\r\n * @default \"Search...\"\r\n */\r\n searchPlaceholder?: string;\r\n /**\r\n * Message shown when no items match the search.\r\n * @default \"No items found.\"\r\n */\r\n emptyMessage?: string;\r\n /**\r\n * Whether the combobox is disabled.\r\n * @default false\r\n */\r\n disabled?: boolean;\r\n /**\r\n * Additional CSS classes merged with the combobox styles.\r\n * @default undefined\r\n */\r\n className?: string;\r\n /**\r\n * Combobox content and items.\r\n * @default undefined\r\n */\r\n children?: React.ReactNode;\r\n}\r\n\r\ninterface ComboboxTriggerProps {\r\n /**\r\n * Additional CSS classes merged with the trigger styles.\r\n * @default undefined\r\n */\r\n className?: string;\r\n /**\r\n * Trigger content. If not provided, shows selected item label or placeholder.\r\n * @default undefined\r\n */\r\n children?: React.ReactNode;\r\n}\r\n\r\ninterface ComboboxContentProps {\r\n /**\r\n * Additional CSS classes merged with the content styles.\r\n * @default undefined\r\n */\r\n className?: string;\r\n /**\r\n * Content children (typically ComboboxItem components).\r\n * @default undefined\r\n */\r\n children?: React.ReactNode;\r\n}\r\n\r\ninterface ComboboxItemProps {\r\n /**\r\n * The value associated with this item.\r\n */\r\n value: string;\r\n /**\r\n * Additional CSS classes merged with the item styles.\r\n * @default undefined\r\n */\r\n className?: string;\r\n /**\r\n * Item content (label).\r\n * @default undefined\r\n */\r\n children?: React.ReactNode;\r\n /**\r\n * Whether the item is disabled.\r\n * @default false\r\n */\r\n disabled?: boolean;\r\n /**\r\n * Callback fired when the item is selected.\r\n * @default undefined\r\n */\r\n onSelect?: (value: string) => void;\r\n /**\r\n * Additional search keywords for filtering.\r\n * @default []\r\n */\r\n keywords?: string[];\r\n}\r\n\r\ninterface ComboboxEmptyProps {\r\n /**\r\n * Additional CSS classes merged with the empty state styles.\r\n * @default undefined\r\n */\r\n className?: string;\r\n /**\r\n * Content shown when no items match. Defaults to context emptyMessage.\r\n * @default undefined\r\n */\r\n children?: React.ReactNode;\r\n}\r\n\r\ninterface ComboboxGroupProps {\r\n /**\r\n * Group heading text.\r\n * @default undefined\r\n */\r\n heading?: string;\r\n /**\r\n * Additional CSS classes merged with the group styles.\r\n * @default undefined\r\n */\r\n className?: string;\r\n /**\r\n * Group items.\r\n * @default undefined\r\n */\r\n children?: React.ReactNode;\r\n}\r\n\r\ninterface ComboboxSeparatorProps {\r\n /**\r\n * Additional CSS classes merged with the separator styles.\r\n * @default undefined\r\n */\r\n className?: string;\r\n}\r\n\r\n/**\r\n * A searchable select component combining Command, Popover, and Button.\r\n *\r\n * @remarks\r\n * - Composes Command (search), Popover (positioning), and Button (trigger)\r\n * - Supports both controlled and uncontrolled modes\r\n * - Provides keyboard navigation and filtering\r\n * - Built with Base UI primitives and CSS Modules\r\n *\r\n * @example Basic usage\r\n * ```tsx\r\n * <Combobox value={value} onValueChange={setValue}>\r\n * <ComboboxTrigger />\r\n * <ComboboxContent>\r\n * <ComboboxItem value=\"apple\">Apple</ComboboxItem>\r\n * <ComboboxItem value=\"banana\">Banana</ComboboxItem>\r\n * </ComboboxContent>\r\n * </Combobox>\r\n * ```\r\n *\r\n * @example With groups\r\n * ```tsx\r\n * <Combobox>\r\n * <ComboboxTrigger />\r\n * <ComboboxContent>\r\n * <ComboboxGroup heading=\"Fruits\">\r\n * <ComboboxItem value=\"apple\">Apple</ComboboxItem>\r\n * </ComboboxGroup>\r\n * <ComboboxSeparator />\r\n * <ComboboxGroup heading=\"Vegetables\">\r\n * <ComboboxItem value=\"carrot\">Carrot</ComboboxItem>\r\n * </ComboboxGroup>\r\n * </ComboboxContent>\r\n * </Combobox>\r\n * ```\r\n */\r\nfunction Combobox(props: Readonly<Combobox.Props>): React.ReactElement {\r\n const {\r\n value: controlledValue,\r\n defaultValue = \"\",\r\n onValueChange,\r\n open: controlledOpen,\r\n defaultOpen = false,\r\n onOpenChange,\r\n placeholder = \"Select an item...\",\r\n searchPlaceholder = \"Search...\",\r\n emptyMessage = \"No items found.\",\r\n disabled = false,\r\n className,\r\n children,\r\n } = props;\r\n\r\n const [value, setValue] = useControllableState({\r\n controlled: controlledValue,\r\n defaultValue,\r\n onChange: onValueChange,\r\n });\r\n\r\n const [open, setOpen] = useControllableState({\r\n controlled: controlledOpen,\r\n defaultValue: defaultOpen,\r\n onChange: onOpenChange,\r\n });\r\n\r\n const itemLabelsRef = React.useRef(new Map<string, string>());\r\n\r\n const registerItem = React.useCallback((itemValue: string, label: string) => {\r\n itemLabelsRef.current.set(itemValue, label);\r\n }, []);\r\n\r\n const unregisterItem = React.useCallback((itemValue: string) => {\r\n itemLabelsRef.current.delete(itemValue);\r\n }, []);\r\n\r\n const contextValue = React.useMemo<ComboboxContextValue>(\r\n () => ({\r\n value,\r\n onValueChange: setValue,\r\n open,\r\n setOpen,\r\n placeholder,\r\n searchPlaceholder,\r\n emptyMessage,\r\n disabled,\r\n itemLabels: itemLabelsRef.current,\r\n registerItem,\r\n unregisterItem,\r\n }),\r\n [value, setValue, open, setOpen, placeholder, searchPlaceholder, emptyMessage, disabled, registerItem, unregisterItem],\r\n );\r\n\r\n return (\r\n <ComboboxContext.Provider value={contextValue}>\r\n <Popover\r\n open={open}\r\n onOpenChange={setOpen}>\r\n <div className={cn(styles.combobox, className)}>{children}</div>\r\n </Popover>\r\n </ComboboxContext.Provider>\r\n );\r\n}\r\nCombobox.displayName = \"Combobox\";\r\n\r\n/**\r\n * Button that opens and closes the combobox popover.\r\n *\r\n * @remarks\r\n * - Renders as a Button with trigger behavior\r\n * - Shows selected item label or placeholder\r\n * - Supports custom children or auto-display\r\n *\r\n * @example Basic usage\r\n * ```tsx\r\n * <ComboboxTrigger />\r\n * ```\r\n *\r\n * @example Custom content\r\n * ```tsx\r\n * <ComboboxTrigger>\r\n * {selectedLabel || \"Choose...\"}\r\n * </ComboboxTrigger>\r\n * ```\r\n */\r\nconst ComboboxTrigger = React.forwardRef<HTMLButtonElement, ComboboxTrigger.Props>(\r\n (props: Readonly<ComboboxTrigger.Props>, ref): React.ReactElement => {\r\n const {className, children} = props;\r\n const {open, setOpen, value, placeholder, disabled, itemLabels} = useComboboxContext(\"ComboboxTrigger\");\r\n\r\n // Force re-render when value changes to update the selected label\r\n const [, forceUpdate] = React.useReducer((x: number) => x + 1, 0);\r\n\r\n React.useEffect(() => {\r\n forceUpdate();\r\n }, [value]);\r\n\r\n const selectedLabel = itemLabels.get(value) || \"\";\r\n\r\n return (\r\n <PopoverTrigger asChild>\r\n <Button\r\n ref={ref}\r\n variant='outline'\r\n role='combobox'\r\n aria-expanded={open}\r\n disabled={disabled}\r\n className={cn(styles.trigger, className)}\r\n onClick={() => setOpen(!open)}>\r\n {children ?? (\r\n <>\r\n <span className={cn(styles.triggerValue, !selectedLabel && styles.triggerPlaceholder)}>{selectedLabel || placeholder}</span>\r\n <ChevronsUpDown className={styles.triggerIcon} />\r\n </>\r\n )}\r\n </Button>\r\n </PopoverTrigger>\r\n );\r\n },\r\n);\r\nComboboxTrigger.displayName = \"ComboboxTrigger\";\r\n\r\n/**\r\n * The popover content containing the searchable command list.\r\n *\r\n * @remarks\r\n * - Wraps Command with Popover positioning\r\n * - Includes search input and items list\r\n * - Automatically closes on item selection\r\n *\r\n * @example Basic usage\r\n * ```tsx\r\n * <ComboboxContent>\r\n * <ComboboxItem value=\"item1\">Item 1</ComboboxItem>\r\n * </ComboboxContent>\r\n * ```\r\n */\r\nconst ComboboxContent = React.forwardRef<HTMLDivElement, ComboboxContent.Props>(\r\n (props: Readonly<ComboboxContent.Props>, ref): React.ReactElement => {\r\n const {className, children} = props;\r\n const {searchPlaceholder} = useComboboxContext(\"ComboboxContent\");\r\n\r\n return (\r\n <PopoverContent\r\n ref={ref}\r\n className={cn(styles.content, className)}\r\n sideOffset={4}>\r\n <Command className={styles.command}>\r\n <CommandInput\r\n placeholder={searchPlaceholder}\r\n className={styles.commandInput}\r\n />\r\n <CommandList className={styles.commandList}>\r\n <ComboboxEmpty />\r\n {children}\r\n </CommandList>\r\n </Command>\r\n </PopoverContent>\r\n );\r\n },\r\n);\r\nComboboxContent.displayName = \"ComboboxContent\";\r\n\r\n/**\r\n * A selectable item within the combobox.\r\n *\r\n * @remarks\r\n * - Uses CommandItem internally\r\n * - Shows check icon when selected\r\n * - Closes popover on selection\r\n *\r\n * @example Basic usage\r\n * ```tsx\r\n * <ComboboxItem value=\"apple\">Apple</ComboboxItem>\r\n * ```\r\n *\r\n * @example With custom select handler\r\n * ```tsx\r\n * <ComboboxItem\r\n * value=\"apple\"\r\n * onSelect={(value) => console.log(\"Selected:\", value)}\r\n * >\r\n * Apple\r\n * </ComboboxItem>\r\n * ```\r\n */\r\nfunction ComboboxItem(props: Readonly<ComboboxItem.Props>): React.ReactElement {\r\n const {value: itemValue, className, children, disabled = false, onSelect, keywords = []} = props;\r\n const {value: selectedValue, onValueChange, setOpen, registerItem, unregisterItem} = useComboboxContext(\"ComboboxItem\");\r\n\r\n const isSelected = selectedValue === itemValue;\r\n const label = typeof children === \"string\" ? children : itemValue;\r\n\r\n // Register this item's label when mounted\r\n React.useEffect(() => {\r\n registerItem(itemValue, label);\r\n return () => {\r\n unregisterItem(itemValue);\r\n };\r\n }, [itemValue, label, registerItem, unregisterItem]);\r\n\r\n const handleSelect = React.useCallback(\r\n (currentValue: string) => {\r\n const newValue = currentValue === selectedValue ? \"\" : currentValue;\r\n onValueChange(newValue);\r\n setOpen(false);\r\n onSelect?.(newValue);\r\n },\r\n [selectedValue, onValueChange, setOpen, onSelect],\r\n );\r\n\r\n return (\r\n <CommandItem\r\n value={itemValue}\r\n disabled={disabled}\r\n onSelect={handleSelect}\r\n keywords={keywords}\r\n className={cn(styles.item, isSelected && styles.itemSelected, className)}>\r\n <Check className={cn(styles.itemCheck, isSelected && styles.itemCheckVisible)} />\r\n <span className={styles.itemLabel}>{children}</span>\r\n </CommandItem>\r\n );\r\n}\r\nComboboxItem.displayName = \"ComboboxItem\";\r\n\r\n/**\r\n * Message shown when search returns no results.\r\n *\r\n * @remarks\r\n * - Uses CommandEmpty internally\r\n * - Defaults to context emptyMessage\r\n *\r\n * @example Basic usage\r\n * ```tsx\r\n * <ComboboxEmpty />\r\n * ```\r\n *\r\n * @example Custom message\r\n * ```tsx\r\n * <ComboboxEmpty>Nothing found</ComboboxEmpty>\r\n * ```\r\n */\r\nfunction ComboboxEmpty(props: Readonly<ComboboxEmpty.Props>): React.ReactElement {\r\n const {className, children} = props;\r\n const {emptyMessage} = useComboboxContext(\"ComboboxEmpty\");\r\n\r\n return <CommandEmpty className={cn(styles.empty, className)}>{children ?? emptyMessage}</CommandEmpty>;\r\n}\r\nComboboxEmpty.displayName = \"ComboboxEmpty\";\r\n\r\n/**\r\n * Groups related combobox items with an optional heading.\r\n *\r\n * @remarks\r\n * - Uses CommandGroup internally\r\n * - Supports visual grouping with headings\r\n *\r\n * @example Basic usage\r\n * ```tsx\r\n * <ComboboxGroup heading=\"Fruits\">\r\n * <ComboboxItem value=\"apple\">Apple</ComboboxItem>\r\n * </ComboboxGroup>\r\n * ```\r\n */\r\nfunction ComboboxGroup(props: Readonly<ComboboxGroup.Props>): React.ReactElement {\r\n const {heading, className, children} = props;\r\n\r\n return (\r\n <CommandGroup\r\n heading={heading}\r\n className={cn(styles.group, className)}>\r\n {children}\r\n </CommandGroup>\r\n );\r\n}\r\nComboboxGroup.displayName = \"ComboboxGroup\";\r\n\r\n/**\r\n * Visual separator between combobox groups.\r\n *\r\n * @remarks\r\n * - Uses CommandSeparator internally\r\n *\r\n * @example Basic usage\r\n * ```tsx\r\n * <ComboboxSeparator />\r\n * ```\r\n */\r\nfunction ComboboxSeparator(props: Readonly<ComboboxSeparator.Props>): React.ReactElement {\r\n const {className} = props;\r\n\r\n return <CommandSeparator className={cn(styles.separator, className)} />;\r\n}\r\nComboboxSeparator.displayName = \"ComboboxSeparator\";\r\n\r\n// eslint-disable-next-line no-redeclare -- required for the canonical component namespace typing API\r\nnamespace Combobox {\r\n export type Props = ComboboxProps;\r\n}\r\n\r\n// eslint-disable-next-line no-redeclare -- required for the canonical component namespace typing API\r\nnamespace ComboboxTrigger {\r\n export type Props = ComboboxTriggerProps;\r\n}\r\n\r\n// eslint-disable-next-line no-redeclare -- required for the canonical component namespace typing API\r\nnamespace ComboboxContent {\r\n export type Props = ComboboxContentProps;\r\n}\r\n\r\n// eslint-disable-next-line no-redeclare -- required for the canonical component namespace typing API\r\nnamespace ComboboxItem {\r\n export type Props = ComboboxItemProps;\r\n}\r\n\r\n// eslint-disable-next-line no-redeclare -- required for the canonical component namespace typing API\r\nnamespace ComboboxEmpty {\r\n export type Props = ComboboxEmptyProps;\r\n}\r\n\r\n// eslint-disable-next-line no-redeclare -- required for the canonical component namespace typing API\r\nnamespace ComboboxGroup {\r\n export type Props = ComboboxGroupProps;\r\n}\r\n\r\n// eslint-disable-next-line no-redeclare -- required for the canonical component namespace typing API\r\nnamespace ComboboxSeparator {\r\n export type Props = ComboboxSeparatorProps;\r\n}\r\n\r\nexport {Combobox, ComboboxContent, ComboboxEmpty, ComboboxGroup, ComboboxItem, ComboboxSeparator, ComboboxTrigger};\r\n"],"names":["ComboboxContext","React","useComboboxContext","componentName","context","Error","Combobox","props","controlledValue","defaultValue","onValueChange","controlledOpen","defaultOpen","onOpenChange","placeholder","searchPlaceholder","emptyMessage","disabled","className","children","value","setValue","useControllableState","open","setOpen","itemLabelsRef","Map","registerItem","itemValue","label","unregisterItem","contextValue","Popover","cn","styles","ComboboxTrigger","ref","itemLabels","forceUpdate","x","selectedLabel","PopoverTrigger","Button","ChevronsUpDown","ComboboxContent","PopoverContent","Command","CommandInput","CommandList","ComboboxEmpty","ComboboxItem","onSelect","keywords","selectedValue","isSelected","handleSelect","currentValue","newValue","CommandItem","Check","CommandEmpty","ComboboxGroup","heading","CommandGroup","ComboboxSeparator","CommandSeparator"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"components/ui/combobox.js","sources":["../../../src/components/ui/combobox.tsx"],"sourcesContent":["\"use client\";\r\n\r\nimport {Check, ChevronsUpDown} from \"lucide-react\";\r\nimport * as React from \"react\";\r\n\r\nimport {useControllableState} from \"@/hooks/useControllableState\";\r\nimport {cn} from \"@/lib/utilities\";\r\n\r\nimport {Button} from \"./button\";\r\nimport {Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator} from \"./command\";\r\nimport {Popover, PopoverContent, PopoverTrigger} from \"./popover\";\r\n\r\nimport styles from \"./combobox.module.css\";\r\n\r\ninterface ComboboxContextValue {\r\n value: string;\r\n onValueChange: (value: string) => void;\r\n open: boolean;\r\n setOpen: (open: boolean) => void;\r\n placeholder?: string;\r\n searchPlaceholder?: string;\r\n emptyMessage?: string;\r\n disabled?: boolean;\r\n itemLabels: Map<string, string>;\r\n registerItem: (value: string, label: string) => void;\r\n unregisterItem: (value: string) => void;\r\n}\r\n\r\nconst ComboboxContext = React.createContext<ComboboxContextValue | null>(null);\r\n\r\nfunction useComboboxContext(componentName: string): ComboboxContextValue {\r\n const context = React.useContext(ComboboxContext);\r\n\r\n if (!context) {\r\n throw new Error(`${componentName} must be used within Combobox.`);\r\n }\r\n\r\n return context;\r\n}\r\n\r\ninterface ComboboxProps {\r\n /**\r\n * The controlled selected value.\r\n * @default undefined\r\n */\r\n value?: string;\r\n /**\r\n * The default value when uncontrolled.\r\n * @default \"\"\r\n */\r\n defaultValue?: string;\r\n /**\r\n * Callback fired when the selected value changes.\r\n * @default undefined\r\n */\r\n onValueChange?: (value: string) => void;\r\n /**\r\n * Whether the popover is controlled open state.\r\n * @default undefined\r\n */\r\n open?: boolean;\r\n /**\r\n * Whether the popover is open by default (uncontrolled).\r\n * @default false\r\n */\r\n defaultOpen?: boolean;\r\n /**\r\n * Callback fired when the open state changes.\r\n * @default undefined\r\n */\r\n onOpenChange?: (open: boolean) => void;\r\n /**\r\n * Placeholder text shown when no value is selected.\r\n * @default \"Select an item...\"\r\n */\r\n placeholder?: string;\r\n /**\r\n * Placeholder text shown in the search input.\r\n * @default \"Search...\"\r\n */\r\n searchPlaceholder?: string;\r\n /**\r\n * Message shown when no items match the search.\r\n * @default \"No items found.\"\r\n */\r\n emptyMessage?: string;\r\n /**\r\n * Whether the combobox is disabled.\r\n * @default false\r\n */\r\n disabled?: boolean;\r\n /**\r\n * Additional CSS classes merged with the combobox styles.\r\n * @default undefined\r\n */\r\n className?: string;\r\n /**\r\n * Combobox content and items.\r\n * @default undefined\r\n */\r\n children?: React.ReactNode;\r\n}\r\n\r\ninterface ComboboxTriggerProps {\r\n /**\r\n * Additional CSS classes merged with the trigger styles.\r\n * @default undefined\r\n */\r\n className?: string;\r\n /**\r\n * Trigger content. If not provided, shows selected item label or placeholder.\r\n * @default undefined\r\n */\r\n children?: React.ReactNode;\r\n}\r\n\r\ninterface ComboboxContentProps {\r\n /**\r\n * Additional CSS classes merged with the content styles.\r\n * @default undefined\r\n */\r\n className?: string;\r\n /**\r\n * Content children (typically ComboboxItem components).\r\n * @default undefined\r\n */\r\n children?: React.ReactNode;\r\n}\r\n\r\ninterface ComboboxItemProps {\r\n /**\r\n * The value associated with this item.\r\n */\r\n value: string;\r\n /**\r\n * Additional CSS classes merged with the item styles.\r\n * @default undefined\r\n */\r\n className?: string;\r\n /**\r\n * Item content (label).\r\n * @default undefined\r\n */\r\n children?: React.ReactNode;\r\n /**\r\n * Whether the item is disabled.\r\n * @default false\r\n */\r\n disabled?: boolean;\r\n /**\r\n * Callback fired when the item is selected.\r\n * @default undefined\r\n */\r\n onSelect?: (value: string) => void;\r\n /**\r\n * Additional search keywords for filtering.\r\n * @default []\r\n */\r\n keywords?: string[];\r\n}\r\n\r\ninterface ComboboxEmptyProps {\r\n /**\r\n * Additional CSS classes merged with the empty state styles.\r\n * @default undefined\r\n */\r\n className?: string;\r\n /**\r\n * Content shown when no items match. Defaults to context emptyMessage.\r\n * @default undefined\r\n */\r\n children?: React.ReactNode;\r\n}\r\n\r\ninterface ComboboxGroupProps {\r\n /**\r\n * Group heading text.\r\n * @default undefined\r\n */\r\n heading?: string;\r\n /**\r\n * Additional CSS classes merged with the group styles.\r\n * @default undefined\r\n */\r\n className?: string;\r\n /**\r\n * Group items.\r\n * @default undefined\r\n */\r\n children?: React.ReactNode;\r\n}\r\n\r\ninterface ComboboxSeparatorProps {\r\n /**\r\n * Additional CSS classes merged with the separator styles.\r\n * @default undefined\r\n */\r\n className?: string;\r\n}\r\n\r\n/**\r\n * A searchable select component combining Command, Popover, and Button.\r\n *\r\n * @remarks\r\n * - Composes Command (search), Popover (positioning), and Button (trigger)\r\n * - Supports both controlled and uncontrolled modes\r\n * - Provides keyboard navigation and filtering\r\n * - Built with Base UI primitives and CSS Modules\r\n *\r\n * @example Basic usage\r\n * ```tsx\r\n * <Combobox value={value} onValueChange={setValue}>\r\n * <ComboboxTrigger />\r\n * <ComboboxContent>\r\n * <ComboboxItem value=\"apple\">Apple</ComboboxItem>\r\n * <ComboboxItem value=\"banana\">Banana</ComboboxItem>\r\n * </ComboboxContent>\r\n * </Combobox>\r\n * ```\r\n *\r\n * @example With groups\r\n * ```tsx\r\n * <Combobox>\r\n * <ComboboxTrigger />\r\n * <ComboboxContent>\r\n * <ComboboxGroup heading=\"Fruits\">\r\n * <ComboboxItem value=\"apple\">Apple</ComboboxItem>\r\n * </ComboboxGroup>\r\n * <ComboboxSeparator />\r\n * <ComboboxGroup heading=\"Vegetables\">\r\n * <ComboboxItem value=\"carrot\">Carrot</ComboboxItem>\r\n * </ComboboxGroup>\r\n * </ComboboxContent>\r\n * </Combobox>\r\n * ```\r\n */\r\nfunction Combobox(props: Readonly<Combobox.Props>): React.ReactElement {\r\n const {\r\n value: controlledValue,\r\n defaultValue = \"\",\r\n onValueChange,\r\n open: controlledOpen,\r\n defaultOpen = false,\r\n onOpenChange,\r\n placeholder = \"Select an item...\",\r\n searchPlaceholder = \"Search...\",\r\n emptyMessage = \"No items found.\",\r\n disabled = false,\r\n className,\r\n children,\r\n } = props;\r\n\r\n const [value, setValue] = useControllableState({\r\n controlled: controlledValue,\r\n defaultValue,\r\n onChange: onValueChange,\r\n });\r\n\r\n const [open, setOpen] = useControllableState({\r\n controlled: controlledOpen,\r\n defaultValue: defaultOpen,\r\n onChange: onOpenChange,\r\n });\r\n\r\n const itemLabelsRef = React.useRef(new Map<string, string>());\r\n\r\n const registerItem = React.useCallback((itemValue: string, label: string) => {\r\n itemLabelsRef.current.set(itemValue, label);\r\n }, []);\r\n\r\n const unregisterItem = React.useCallback((itemValue: string) => {\r\n itemLabelsRef.current.delete(itemValue);\r\n }, []);\r\n\r\n const contextValue = React.useMemo<ComboboxContextValue>(\r\n () => ({\r\n value,\r\n onValueChange: setValue,\r\n open,\r\n setOpen,\r\n placeholder,\r\n searchPlaceholder,\r\n emptyMessage,\r\n disabled,\r\n itemLabels: itemLabelsRef.current,\r\n registerItem,\r\n unregisterItem,\r\n }),\r\n [value, setValue, open, setOpen, placeholder, searchPlaceholder, emptyMessage, disabled, registerItem, unregisterItem],\r\n );\r\n\r\n return (\r\n <ComboboxContext.Provider value={contextValue}>\r\n <Popover\r\n open={open}\r\n onOpenChange={setOpen}>\r\n <div className={cn(styles.combobox, className)}>{children}</div>\r\n </Popover>\r\n </ComboboxContext.Provider>\r\n );\r\n}\r\nCombobox.displayName = \"Combobox\";\r\n\r\n/**\r\n * Button that opens and closes the combobox popover.\r\n *\r\n * @remarks\r\n * - Renders as a Button with trigger behavior\r\n * - Shows selected item label or placeholder\r\n * - Supports custom children or auto-display\r\n *\r\n * @example Basic usage\r\n * ```tsx\r\n * <ComboboxTrigger />\r\n * ```\r\n *\r\n * @example Custom content\r\n * ```tsx\r\n * <ComboboxTrigger>\r\n * {selectedLabel || \"Choose...\"}\r\n * </ComboboxTrigger>\r\n * ```\r\n */\r\nconst ComboboxTrigger = React.forwardRef<HTMLButtonElement, ComboboxTrigger.Props>(\r\n (props: Readonly<ComboboxTrigger.Props>, ref): React.ReactElement => {\r\n const {className, children} = props;\r\n const {open, setOpen, value, placeholder, disabled, itemLabels} = useComboboxContext(\"ComboboxTrigger\");\r\n\r\n // Force re-render when value changes to update the selected label\r\n const [, forceUpdate] = React.useReducer((x: number) => x + 1, 0);\r\n\r\n React.useEffect(() => {\r\n forceUpdate();\r\n }, [value]);\r\n\r\n const selectedLabel = itemLabels.get(value) || \"\";\r\n\r\n return (\r\n <PopoverTrigger asChild>\r\n <Button\r\n ref={ref}\r\n variant='outline'\r\n role='combobox'\r\n aria-expanded={open}\r\n disabled={disabled}\r\n className={cn(styles.trigger, className)}\r\n onClick={() => setOpen(!open)}>\r\n {children ?? (\r\n <>\r\n <span className={cn(styles.triggerValue, !selectedLabel && styles.triggerPlaceholder)}>{selectedLabel || placeholder}</span>\r\n <ChevronsUpDown className={styles.triggerIcon} />\r\n </>\r\n )}\r\n </Button>\r\n </PopoverTrigger>\r\n );\r\n },\r\n);\r\nComboboxTrigger.displayName = \"ComboboxTrigger\";\r\n\r\n/**\r\n * The popover content containing the searchable command list.\r\n *\r\n * @remarks\r\n * - Wraps Command with Popover positioning\r\n * - Includes search input and items list\r\n * - Automatically closes on item selection\r\n *\r\n * @example Basic usage\r\n * ```tsx\r\n * <ComboboxContent>\r\n * <ComboboxItem value=\"item1\">Item 1</ComboboxItem>\r\n * </ComboboxContent>\r\n * ```\r\n */\r\nconst ComboboxContent = React.forwardRef<HTMLDivElement, ComboboxContent.Props>(\r\n (props: Readonly<ComboboxContent.Props>, ref): React.ReactElement => {\r\n const {className, children} = props;\r\n const {searchPlaceholder} = useComboboxContext(\"ComboboxContent\");\r\n\r\n return (\r\n <PopoverContent\r\n ref={ref}\r\n className={cn(styles.content, className)}\r\n sideOffset={4}>\r\n <Command className={styles.command}>\r\n <CommandInput\r\n placeholder={searchPlaceholder}\r\n className={styles.commandInput}\r\n />\r\n <CommandList className={styles.commandList}>\r\n <ComboboxEmpty />\r\n {children}\r\n </CommandList>\r\n </Command>\r\n </PopoverContent>\r\n );\r\n },\r\n);\r\nComboboxContent.displayName = \"ComboboxContent\";\r\n\r\n/**\r\n * A selectable item within the combobox.\r\n *\r\n * @remarks\r\n * - Uses CommandItem internally\r\n * - Shows check icon when selected\r\n * - Closes popover on selection\r\n *\r\n * @example Basic usage\r\n * ```tsx\r\n * <ComboboxItem value=\"apple\">Apple</ComboboxItem>\r\n * ```\r\n *\r\n * @example With custom select handler\r\n * ```tsx\r\n * <ComboboxItem\r\n * value=\"apple\"\r\n * onSelect={(value) => console.log(\"Selected:\", value)}\r\n * >\r\n * Apple\r\n * </ComboboxItem>\r\n * ```\r\n */\r\nfunction ComboboxItem(props: Readonly<ComboboxItem.Props>): React.ReactElement {\r\n const {value: itemValue, className, children, disabled = false, onSelect, keywords = []} = props;\r\n const {value: selectedValue, onValueChange, setOpen, registerItem, unregisterItem} = useComboboxContext(\"ComboboxItem\");\r\n\r\n const isSelected = selectedValue === itemValue;\r\n const label = typeof children === \"string\" ? children : itemValue;\r\n\r\n // Register this item's label when mounted\r\n React.useEffect(() => {\r\n registerItem(itemValue, label);\r\n return () => {\r\n unregisterItem(itemValue);\r\n };\r\n }, [itemValue, label, registerItem, unregisterItem]);\r\n\r\n const handleSelect = React.useCallback(\r\n (currentValue: string) => {\r\n const newValue = currentValue === selectedValue ? \"\" : currentValue;\r\n onValueChange(newValue);\r\n setOpen(false);\r\n onSelect?.(newValue);\r\n },\r\n [selectedValue, onValueChange, setOpen, onSelect],\r\n );\r\n\r\n return (\r\n <CommandItem\r\n value={itemValue}\r\n disabled={disabled}\r\n onSelect={handleSelect}\r\n keywords={keywords}\r\n className={cn(styles.item, isSelected && styles.itemSelected, className)}>\r\n <Check className={cn(styles.itemCheck, isSelected && styles.itemCheckVisible)} />\r\n <span className={styles.itemLabel}>{children}</span>\r\n </CommandItem>\r\n );\r\n}\r\nComboboxItem.displayName = \"ComboboxItem\";\r\n\r\n/**\r\n * Message shown when search returns no results.\r\n *\r\n * @remarks\r\n * - Uses CommandEmpty internally\r\n * - Defaults to context emptyMessage\r\n *\r\n * @example Basic usage\r\n * ```tsx\r\n * <ComboboxEmpty />\r\n * ```\r\n *\r\n * @example Custom message\r\n * ```tsx\r\n * <ComboboxEmpty>Nothing found</ComboboxEmpty>\r\n * ```\r\n */\r\nfunction ComboboxEmpty(props: Readonly<ComboboxEmpty.Props>): React.ReactElement {\r\n const {className, children} = props;\r\n const {emptyMessage} = useComboboxContext(\"ComboboxEmpty\");\r\n\r\n return <CommandEmpty className={cn(styles.empty, className)}>{children ?? emptyMessage}</CommandEmpty>;\r\n}\r\nComboboxEmpty.displayName = \"ComboboxEmpty\";\r\n\r\n/**\r\n * Groups related combobox items with an optional heading.\r\n *\r\n * @remarks\r\n * - Uses CommandGroup internally\r\n * - Supports visual grouping with headings\r\n *\r\n * @example Basic usage\r\n * ```tsx\r\n * <ComboboxGroup heading=\"Fruits\">\r\n * <ComboboxItem value=\"apple\">Apple</ComboboxItem>\r\n * </ComboboxGroup>\r\n * ```\r\n */\r\nfunction ComboboxGroup(props: Readonly<ComboboxGroup.Props>): React.ReactElement {\r\n const {heading, className, children} = props;\r\n\r\n return (\r\n <CommandGroup\r\n heading={heading}\r\n className={cn(styles.group, className)}>\r\n {children}\r\n </CommandGroup>\r\n );\r\n}\r\nComboboxGroup.displayName = \"ComboboxGroup\";\r\n\r\n/**\r\n * Visual separator between combobox groups.\r\n *\r\n * @remarks\r\n * - Uses CommandSeparator internally\r\n *\r\n * @example Basic usage\r\n * ```tsx\r\n * <ComboboxSeparator />\r\n * ```\r\n */\r\nfunction ComboboxSeparator(props: Readonly<ComboboxSeparator.Props>): React.ReactElement {\r\n const {className} = props;\r\n\r\n return <CommandSeparator className={cn(styles.separator, className)} />;\r\n}\r\nComboboxSeparator.displayName = \"ComboboxSeparator\";\r\n\r\n// eslint-disable-next-line no-redeclare -- required for the canonical component namespace typing API\r\nnamespace Combobox {\r\n export type Props = ComboboxProps;\r\n}\r\n\r\n// eslint-disable-next-line no-redeclare -- required for the canonical component namespace typing API\r\nnamespace ComboboxTrigger {\r\n export type Props = ComboboxTriggerProps;\r\n}\r\n\r\n// eslint-disable-next-line no-redeclare -- required for the canonical component namespace typing API\r\nnamespace ComboboxContent {\r\n export type Props = ComboboxContentProps;\r\n}\r\n\r\n// eslint-disable-next-line no-redeclare -- required for the canonical component namespace typing API\r\nnamespace ComboboxItem {\r\n export type Props = ComboboxItemProps;\r\n}\r\n\r\n// eslint-disable-next-line no-redeclare -- required for the canonical component namespace typing API\r\nnamespace ComboboxEmpty {\r\n export type Props = ComboboxEmptyProps;\r\n}\r\n\r\n// eslint-disable-next-line no-redeclare -- required for the canonical component namespace typing API\r\nnamespace ComboboxGroup {\r\n export type Props = ComboboxGroupProps;\r\n}\r\n\r\n// eslint-disable-next-line no-redeclare -- required for the canonical component namespace typing API\r\nnamespace ComboboxSeparator {\r\n export type Props = ComboboxSeparatorProps;\r\n}\r\n\r\nexport {Combobox, ComboboxContent, ComboboxEmpty, ComboboxGroup, ComboboxItem, ComboboxSeparator, ComboboxTrigger};\r\n"],"names":["ComboboxContext","React","useComboboxContext","componentName","context","Error","Combobox","props","controlledValue","defaultValue","onValueChange","controlledOpen","defaultOpen","onOpenChange","placeholder","searchPlaceholder","emptyMessage","disabled","className","children","value","setValue","useControllableState","open","setOpen","itemLabelsRef","Map","registerItem","itemValue","label","unregisterItem","contextValue","Popover","cn","styles","ComboboxTrigger","ref","itemLabels","forceUpdate","x","selectedLabel","PopoverTrigger","Button","ChevronsUpDown","ComboboxContent","PopoverContent","Command","CommandInput","CommandList","ComboboxEmpty","ComboboxItem","onSelect","keywords","selectedValue","isSelected","handleSelect","currentValue","newValue","CommandItem","Check","CommandEmpty","ComboboxGroup","heading","CommandGroup","ComboboxSeparator","CommandSeparator"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["webpack
|
|
1
|
+
{"version":3,"sources":["webpack://./../../node_modules/@rslib/core/node_modules/@rsbuild/core/compiled/css-loader/index.js??ruleSet[1].rules[1].oneOf[2].use[1]!builtin:lightningcss-loader??ruleSet[1].rules[1].oneOf[2].use[2]!/home/runner/work/arolariu.ro/arolariu.ro/node_modules/@rslib/core/node_modules/@rsbuild/core/compiled/postcss-loader/index.js??ruleSet[1].rules[1].oneOf[2].use[3]!/home/runner/work/arolariu.ro/arolariu.ro/packages/components/src/components/ui/combobox.module.css","webpack://./src/components/ui/combobox.module.css"],"names":[],"mappings":"AAAA;ECCE,iBAAiB;AACnB;;ADF2B;ECKzB,8BAA8B;EAC9B,WAAW;EACX,gBAAgB;AAClB;;ADR6F;ECW3F,gBAAgB;EAChB,uBAAuB;EACvB,mBAAmB;EACnB,OAAO;EACP,gBAAgB;AAClB;;ADhB4L;ECmB1L,4BAA4B;AAC9B;;ADpB4O;ECuB1O,YAAY;EACZ,gCAAgC;EAChC,WAAW;EACX,cAAc;EACd,WAAW;AACb;;AD5ByU;EC+BvU,gBAAgB;EAChB,0BAA0B;EAC1B,UAAU;AACZ;;ADlCsY;ECqCpY,gBAAgB;EAChB,YAAY;AACd;;ADvC2a;EC0Cza,8CAA8C;EAC9C,gBAAgB;AAClB;;AD5Cuf;EC+Crf,iBAAiB;EACjB,gBAAgB;AAClB;;ADjDqiB;ECoDniB,kCAAkC;EAClC,eAAe;EACf,mBAAmB;EACnB,wBAAwB;EACxB,gDAAgD;EAChD,gCAAgC;EAChC,aAAa;AACf;;AD3DouB;EC8DluB,uCAAuC;AACzC;;AD/DuxB;ECkErxB,WAAW;EACX,oBAAoB;AACtB;;ADpE20B;ECuEz0B,uCAAuC;AACzC;;ADxEg4B;EC2E93B,UAAU;EACV,cAAc;EACd,WAAW;EACX,YAAY;EACZ,uBAAuB;AACzB;;ADhFi9B;ECmF/8B,UAAU;AACZ;;ADpF6+B;ECuF3+B,uBAAuB;EACvB,mBAAmB;EACnB,OAAO;EACP,gBAAgB;AAClB;;AD3FyjC;EC8FvjC,4BAA4B;EAC5B,iCAAiC;EACjC,gDAAgD;EAChD,kBAAkB;AACpB;;ADlG+rC;ECqG7rC,8BAA8B;AAChC;;ADtGouC;ECyGluC,uCAAuC;EACvC,WAAW;EACX,6BAA6B;AAC/B;;AD5G8zC;EC+G5zC,4BAA4B;AAC9B;;ADhH63C;ECmH33C,0CAA0C;AAC5C;;ADpHo8C;ECuHl8C,uCAAuC;AACzC;;ADxHsgD;EC2HpgD,uCAAuC;AACzC;;AD5H0kD;EC+HxkD,4BAA4B;AAC9B;;ADhI4nD;ECmI1nD,uCAAuC;AACzC;;ADpI6rD;EAAyB;ICwIltD,gBAAgB;EAClB;AACF","sourcesContent":[".combobox{display:contents}.trigger{justify-content:space-between;min-width:200px;width:100%}.triggerValue{flex:1;overflow:hidden;text-align:left;text-overflow:ellipsis;white-space:nowrap}.triggerPlaceholder{color:var(--ac-neutral-500)}.triggerIcon{flex-shrink:0;height:1rem;margin-left:var(--ac-spacing-2);opacity:.5;width:1rem}.content{min-width:200px;padding:0;width:var(--anchor-width)}.command{border:none;box-shadow:none}.commandInput{border-bottom:1px solid var(--ac-neutral-200);border-radius:0}.commandList{max-height:300px;overflow-y:auto}.item{align-items:center;border-radius:var(--ac-radius-sm);cursor:pointer;display:flex;gap:var(--ac-spacing-2);padding:var(--ac-spacing-2) var(--ac-spacing-3);transition:background-color .2s}.item:hover{background-color:var(--ac-neutral-100)}.item[data-disabled]{opacity:.5;pointer-events:none}.itemSelected{background-color:var(--ac-neutral-100)}.itemCheck{flex-shrink:0;height:1rem;opacity:0;transition:opacity .2s;width:1rem}.itemCheckVisible{opacity:1}.itemLabel{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.empty{color:var(--ac-neutral-500);font-size:var(--ac-font-size-sm);padding:var(--ac-spacing-6) var(--ac-spacing-4);text-align:center}.group{padding:var(--ac-spacing-1) 0}.separator{background-color:var(--ac-neutral-200);height:1px;margin:var(--ac-spacing-1) 0}:global(.dark) .triggerPlaceholder{color:var(--ac-neutral-400)}:global(.dark) .commandInput{border-bottom-color:var(--ac-neutral-700)}:global(.dark) .item:hover{background-color:var(--ac-neutral-800)}:global(.dark) .itemSelected{background-color:var(--ac-neutral-800)}:global(.dark) .empty{color:var(--ac-neutral-400)}:global(.dark) .separator{background-color:var(--ac-neutral-700)}@media (max-width:640px){.content,.trigger{min-width:150px}}",".combobox {\n display: contents;\n}\n\n.trigger {\n justify-content: space-between;\n width: 100%;\n min-width: 200px;\n}\n\n.triggerValue {\n text-align: left;\n text-overflow: ellipsis;\n white-space: nowrap;\n flex: 1;\n overflow: hidden;\n}\n\n.triggerPlaceholder {\n color: var(--ac-neutral-500);\n}\n\n.triggerIcon {\n height: 1rem;\n margin-left: var(--ac-spacing-2);\n opacity: .5;\n flex-shrink: 0;\n width: 1rem;\n}\n\n.content {\n min-width: 200px;\n width: var(--anchor-width);\n padding: 0;\n}\n\n.command {\n box-shadow: none;\n border: none;\n}\n\n.commandInput {\n border-bottom: 1px solid var(--ac-neutral-200);\n border-radius: 0;\n}\n\n.commandList {\n max-height: 300px;\n overflow-y: auto;\n}\n\n.item {\n border-radius: var(--ac-radius-sm);\n cursor: pointer;\n align-items: center;\n gap: var(--ac-spacing-2);\n padding: var(--ac-spacing-2) var(--ac-spacing-3);\n transition: background-color .2s;\n display: flex;\n}\n\n.item:hover {\n background-color: var(--ac-neutral-100);\n}\n\n.item[data-disabled] {\n opacity: .5;\n pointer-events: none;\n}\n\n.itemSelected {\n background-color: var(--ac-neutral-100);\n}\n\n.itemCheck {\n opacity: 0;\n flex-shrink: 0;\n width: 1rem;\n height: 1rem;\n transition: opacity .2s;\n}\n\n.itemCheckVisible {\n opacity: 1;\n}\n\n.itemLabel {\n text-overflow: ellipsis;\n white-space: nowrap;\n flex: 1;\n overflow: hidden;\n}\n\n.empty {\n color: var(--ac-neutral-500);\n font-size: var(--ac-font-size-sm);\n padding: var(--ac-spacing-6) var(--ac-spacing-4);\n text-align: center;\n}\n\n.group {\n padding: var(--ac-spacing-1) 0;\n}\n\n.separator {\n background-color: var(--ac-neutral-200);\n height: 1px;\n margin: var(--ac-spacing-1) 0;\n}\n\n:global(.dark) .triggerPlaceholder {\n color: var(--ac-neutral-400);\n}\n\n:global(.dark) .commandInput {\n border-bottom-color: var(--ac-neutral-700);\n}\n\n:global(.dark) .item:hover {\n background-color: var(--ac-neutral-800);\n}\n\n:global(.dark) .itemSelected {\n background-color: var(--ac-neutral-800);\n}\n\n:global(.dark) .empty {\n color: var(--ac-neutral-400);\n}\n\n:global(.dark) .separator {\n background-color: var(--ac-neutral-700);\n}\n\n@media (width <= 640px) {\n .content, .trigger {\n min-width: 150px;\n }\n}\n"],"sourceRoot":""}
|
|
@@ -3,11 +3,11 @@ import { jsx, jsxs } from "react/jsx-runtime";
|
|
|
3
3
|
import { Dialog } from "@base-ui/react/dialog";
|
|
4
4
|
import { Separator } from "@base-ui/react/separator";
|
|
5
5
|
import { Search } from "lucide-react";
|
|
6
|
-
import { createContext, forwardRef, useCallback, useContext, useEffect, useId, useLayoutEffect, useMemo, useRef, useState } from "react";
|
|
7
6
|
import { cn } from "../../lib/utilities.js";
|
|
8
7
|
import command_module from "./command.module.js";
|
|
9
|
-
|
|
10
|
-
const
|
|
8
|
+
import * as __rspack_external_react from "react";
|
|
9
|
+
const CommandContext = /*#__PURE__*/ __rspack_external_react.createContext(null);
|
|
10
|
+
const CommandGroupContext = /*#__PURE__*/ __rspack_external_react.createContext(null);
|
|
11
11
|
function assignRef(ref, value) {
|
|
12
12
|
if ("function" == typeof ref) return void ref(value);
|
|
13
13
|
if (ref) ref.current = value;
|
|
@@ -25,18 +25,18 @@ function defaultCommandFilter(value, search, keywords = []) {
|
|
|
25
25
|
return normalizedValue.includes(normalizedSearch) ? 1 : 0;
|
|
26
26
|
}
|
|
27
27
|
function useCommandContext(componentName) {
|
|
28
|
-
const context = useContext(CommandContext);
|
|
28
|
+
const context = __rspack_external_react.useContext(CommandContext);
|
|
29
29
|
if (!context) throw new Error(`${componentName} must be used within Command.`);
|
|
30
30
|
return context;
|
|
31
31
|
}
|
|
32
|
-
const Command = /*#__PURE__*/ forwardRef(({ children, className, defaultValue: _defaultValue, disablePointerSelection = false, filter, label, loop = false, onKeyDown, onValueChange: _onValueChange, shouldFilter = true, value: _value, vimBindings: _vimBindings, ...props }, ref)=>{
|
|
33
|
-
const [activeItemId, setActiveItemId] = useState(null);
|
|
34
|
-
const [search, setSearch] = useState("");
|
|
35
|
-
const itemOrderRef = useRef(0);
|
|
36
|
-
const itemsRef = useRef(new Map());
|
|
37
|
-
const [itemsVersion, setItemsVersion] = useState(0);
|
|
38
|
-
const listId = useId();
|
|
39
|
-
const registerItem = useCallback((item)=>{
|
|
32
|
+
const Command = /*#__PURE__*/ __rspack_external_react.forwardRef(({ children, className, defaultValue: _defaultValue, disablePointerSelection = false, filter, label, loop = false, onKeyDown, onValueChange: _onValueChange, shouldFilter = true, value: _value, vimBindings: _vimBindings, ...props }, ref)=>{
|
|
33
|
+
const [activeItemId, setActiveItemId] = __rspack_external_react.useState(null);
|
|
34
|
+
const [search, setSearch] = __rspack_external_react.useState("");
|
|
35
|
+
const itemOrderRef = __rspack_external_react.useRef(0);
|
|
36
|
+
const itemsRef = __rspack_external_react.useRef(new Map());
|
|
37
|
+
const [itemsVersion, setItemsVersion] = __rspack_external_react.useState(0);
|
|
38
|
+
const listId = __rspack_external_react.useId();
|
|
39
|
+
const registerItem = __rspack_external_react.useCallback((item)=>{
|
|
40
40
|
const existingItem = itemsRef.current.get(item.id);
|
|
41
41
|
const nextItem = {
|
|
42
42
|
...item,
|
|
@@ -47,17 +47,17 @@ const Command = /*#__PURE__*/ forwardRef(({ children, className, defaultValue: _
|
|
|
47
47
|
itemsRef.current.set(item.id, nextItem);
|
|
48
48
|
setItemsVersion((currentVersion)=>currentVersion + 1);
|
|
49
49
|
}, []);
|
|
50
|
-
const unregisterItem = useCallback((itemId)=>{
|
|
50
|
+
const unregisterItem = __rspack_external_react.useCallback((itemId)=>{
|
|
51
51
|
if (!itemsRef.current.delete(itemId)) return;
|
|
52
52
|
setItemsVersion((currentVersion)=>currentVersion + 1);
|
|
53
53
|
}, []);
|
|
54
|
-
const items = useMemo(()=>[
|
|
54
|
+
const items = __rspack_external_react.useMemo(()=>[
|
|
55
55
|
...itemsRef.current.values()
|
|
56
56
|
].toSorted((firstItem, secondItem)=>firstItem.order - secondItem.order), [
|
|
57
57
|
itemsVersion
|
|
58
58
|
]);
|
|
59
59
|
const isFiltering = shouldFilter && search.trim().length > 0;
|
|
60
|
-
const isItemVisible = useCallback((itemId)=>{
|
|
60
|
+
const isItemVisible = __rspack_external_react.useCallback((itemId)=>{
|
|
61
61
|
const item = itemsRef.current.get(itemId);
|
|
62
62
|
if (!item) return false;
|
|
63
63
|
if (item.forceMount || !shouldFilter || 0 === search.trim().length) return true;
|
|
@@ -69,21 +69,21 @@ const Command = /*#__PURE__*/ forwardRef(({ children, className, defaultValue: _
|
|
|
69
69
|
search,
|
|
70
70
|
shouldFilter
|
|
71
71
|
]);
|
|
72
|
-
const visibleItems = useMemo(()=>items.filter((item)=>isItemVisible(item.id)), [
|
|
72
|
+
const visibleItems = __rspack_external_react.useMemo(()=>items.filter((item)=>isItemVisible(item.id)), [
|
|
73
73
|
isItemVisible,
|
|
74
74
|
items
|
|
75
75
|
]);
|
|
76
|
-
const selectableItems = useMemo(()=>visibleItems.filter((item)=>!item.disabled), [
|
|
76
|
+
const selectableItems = __rspack_external_react.useMemo(()=>visibleItems.filter((item)=>!item.disabled), [
|
|
77
77
|
visibleItems
|
|
78
78
|
]);
|
|
79
|
-
useEffect(()=>{
|
|
79
|
+
__rspack_external_react.useEffect(()=>{
|
|
80
80
|
if (0 === selectableItems.length) return void setActiveItemId(null);
|
|
81
81
|
if (!activeItemId || !selectableItems.some((item)=>item.id === activeItemId)) setActiveItemId(selectableItems[0].id);
|
|
82
82
|
}, [
|
|
83
83
|
activeItemId,
|
|
84
84
|
selectableItems
|
|
85
85
|
]);
|
|
86
|
-
useEffect(()=>{
|
|
86
|
+
__rspack_external_react.useEffect(()=>{
|
|
87
87
|
if (!activeItemId) return;
|
|
88
88
|
itemsRef.current.get(activeItemId)?.ref.current?.scrollIntoView({
|
|
89
89
|
block: "nearest"
|
|
@@ -91,10 +91,10 @@ const Command = /*#__PURE__*/ forwardRef(({ children, className, defaultValue: _
|
|
|
91
91
|
}, [
|
|
92
92
|
activeItemId
|
|
93
93
|
]);
|
|
94
|
-
const selectSpecificItem = useCallback((itemId)=>{
|
|
94
|
+
const selectSpecificItem = __rspack_external_react.useCallback((itemId)=>{
|
|
95
95
|
setActiveItemId(itemId);
|
|
96
96
|
}, []);
|
|
97
|
-
const selectNextItem = useCallback(()=>{
|
|
97
|
+
const selectNextItem = __rspack_external_react.useCallback(()=>{
|
|
98
98
|
if (0 === selectableItems.length) return;
|
|
99
99
|
const currentIndex = selectableItems.findIndex((item)=>item.id === activeItemId);
|
|
100
100
|
if (-1 === currentIndex) return void setActiveItemId(selectableItems[0].id);
|
|
@@ -106,7 +106,7 @@ const Command = /*#__PURE__*/ forwardRef(({ children, className, defaultValue: _
|
|
|
106
106
|
loop,
|
|
107
107
|
selectableItems
|
|
108
108
|
]);
|
|
109
|
-
const selectPreviousItem = useCallback(()=>{
|
|
109
|
+
const selectPreviousItem = __rspack_external_react.useCallback(()=>{
|
|
110
110
|
if (0 === selectableItems.length) return;
|
|
111
111
|
const currentIndex = selectableItems.findIndex((item)=>item.id === activeItemId);
|
|
112
112
|
if (-1 === currentIndex) return void setActiveItemId(selectableItems[0].id);
|
|
@@ -118,19 +118,19 @@ const Command = /*#__PURE__*/ forwardRef(({ children, className, defaultValue: _
|
|
|
118
118
|
loop,
|
|
119
119
|
selectableItems
|
|
120
120
|
]);
|
|
121
|
-
const triggerActiveItem = useCallback(()=>{
|
|
121
|
+
const triggerActiveItem = __rspack_external_react.useCallback(()=>{
|
|
122
122
|
if (!activeItemId) return;
|
|
123
123
|
itemsRef.current.get(activeItemId)?.ref.current?.click();
|
|
124
124
|
}, [
|
|
125
125
|
activeItemId
|
|
126
126
|
]);
|
|
127
|
-
const hasVisibleItemsInGroup = useCallback((groupId)=>visibleItems.some((item)=>item.groupId === groupId), [
|
|
127
|
+
const hasVisibleItemsInGroup = __rspack_external_react.useCallback((groupId)=>visibleItems.some((item)=>item.groupId === groupId), [
|
|
128
128
|
visibleItems
|
|
129
129
|
]);
|
|
130
|
-
const getVisibleItemCount = useCallback(()=>visibleItems.length, [
|
|
130
|
+
const getVisibleItemCount = __rspack_external_react.useCallback(()=>visibleItems.length, [
|
|
131
131
|
visibleItems.length
|
|
132
132
|
]);
|
|
133
|
-
const contextValue = useMemo(()=>({
|
|
133
|
+
const contextValue = __rspack_external_react.useMemo(()=>({
|
|
134
134
|
activeItemId,
|
|
135
135
|
disablePointerSelection,
|
|
136
136
|
getVisibleItemCount,
|
|
@@ -238,11 +238,11 @@ function CommandDialog({ children, open, onOpenChange, title = "Command menu", .
|
|
|
238
238
|
});
|
|
239
239
|
}
|
|
240
240
|
CommandDialog.displayName = "CommandDialog";
|
|
241
|
-
const CommandInput = /*#__PURE__*/ forwardRef(({ className, onChange, onValueChange, value, ...props }, ref)=>{
|
|
241
|
+
const CommandInput = /*#__PURE__*/ __rspack_external_react.forwardRef(({ className, onChange, onValueChange, value, ...props }, ref)=>{
|
|
242
242
|
const { activeItemId, listId, search, selectSpecificItem, setSearch } = useCommandContext("CommandInput");
|
|
243
243
|
const isControlled = void 0 !== value;
|
|
244
244
|
const inputValue = isControlled ? value : search;
|
|
245
|
-
useEffect(()=>{
|
|
245
|
+
__rspack_external_react.useEffect(()=>{
|
|
246
246
|
if (!isControlled) return;
|
|
247
247
|
setSearch(value ?? "");
|
|
248
248
|
}, [
|
|
@@ -279,7 +279,7 @@ const CommandInput = /*#__PURE__*/ forwardRef(({ className, onChange, onValueCha
|
|
|
279
279
|
});
|
|
280
280
|
});
|
|
281
281
|
CommandInput.displayName = "CommandInput";
|
|
282
|
-
const CommandList = /*#__PURE__*/ forwardRef(({ className, label, ...props }, ref)=>{
|
|
282
|
+
const CommandList = /*#__PURE__*/ __rspack_external_react.forwardRef(({ className, label, ...props }, ref)=>{
|
|
283
283
|
const { listId } = useCommandContext("CommandList");
|
|
284
284
|
return /*#__PURE__*/ jsx("div", {
|
|
285
285
|
"aria-label": label,
|
|
@@ -291,7 +291,7 @@ const CommandList = /*#__PURE__*/ forwardRef(({ className, label, ...props }, re
|
|
|
291
291
|
});
|
|
292
292
|
});
|
|
293
293
|
CommandList.displayName = "CommandList";
|
|
294
|
-
const CommandEmpty = /*#__PURE__*/ forwardRef(({ className, ...props }, ref)=>{
|
|
294
|
+
const CommandEmpty = /*#__PURE__*/ __rspack_external_react.forwardRef(({ className, ...props }, ref)=>{
|
|
295
295
|
const { getVisibleItemCount } = useCommandContext("CommandEmpty");
|
|
296
296
|
if (getVisibleItemCount() > 0) return null;
|
|
297
297
|
return /*#__PURE__*/ jsx("div", {
|
|
@@ -302,8 +302,8 @@ const CommandEmpty = /*#__PURE__*/ forwardRef(({ className, ...props }, ref)=>{
|
|
|
302
302
|
});
|
|
303
303
|
});
|
|
304
304
|
CommandEmpty.displayName = "CommandEmpty";
|
|
305
|
-
const CommandGroup = /*#__PURE__*/ forwardRef(({ children, className, forceMount = false, heading, value: _value, ...props }, ref)=>{
|
|
306
|
-
const groupId = useId();
|
|
305
|
+
const CommandGroup = /*#__PURE__*/ __rspack_external_react.forwardRef(({ children, className, forceMount = false, heading, value: _value, ...props }, ref)=>{
|
|
306
|
+
const groupId = __rspack_external_react.useId();
|
|
307
307
|
const { hasVisibleItemsInGroup, isFiltering } = useCommandContext("CommandGroup");
|
|
308
308
|
if (!forceMount && isFiltering && !hasVisibleItemsInGroup(groupId)) return null;
|
|
309
309
|
return /*#__PURE__*/ jsx(CommandGroupContext.Provider, {
|
|
@@ -324,7 +324,7 @@ const CommandGroup = /*#__PURE__*/ forwardRef(({ children, className, forceMount
|
|
|
324
324
|
});
|
|
325
325
|
});
|
|
326
326
|
CommandGroup.displayName = "CommandGroup";
|
|
327
|
-
const CommandSeparator = /*#__PURE__*/ forwardRef(({ alwaysRender = false, className, orientation = "horizontal", ...props }, ref)=>{
|
|
327
|
+
const CommandSeparator = /*#__PURE__*/ __rspack_external_react.forwardRef(({ alwaysRender = false, className, orientation = "horizontal", ...props }, ref)=>{
|
|
328
328
|
const { isFiltering } = useCommandContext("CommandSeparator");
|
|
329
329
|
if (isFiltering && !alwaysRender) return null;
|
|
330
330
|
return /*#__PURE__*/ jsx(Separator, {
|
|
@@ -335,15 +335,15 @@ const CommandSeparator = /*#__PURE__*/ forwardRef(({ alwaysRender = false, class
|
|
|
335
335
|
});
|
|
336
336
|
});
|
|
337
337
|
CommandSeparator.displayName = "CommandSeparator";
|
|
338
|
-
const CommandItem = /*#__PURE__*/ forwardRef(({ children, className, disabled = false, forceMount = false, keywords = [], onClick, onMouseEnter, onSelect, value, ...props }, ref)=>{
|
|
338
|
+
const CommandItem = /*#__PURE__*/ __rspack_external_react.forwardRef(({ children, className, disabled = false, forceMount = false, keywords = [], onClick, onMouseEnter, onSelect, value, ...props }, ref)=>{
|
|
339
339
|
const { activeItemId, disablePointerSelection, isFiltering, isItemVisible, registerItem, selectSpecificItem, unregisterItem } = useCommandContext("CommandItem");
|
|
340
|
-
const groupId = useContext(CommandGroupContext);
|
|
341
|
-
const generatedId = useId();
|
|
342
|
-
const itemRef = useRef(null);
|
|
343
|
-
const keywordSignature = useMemo(()=>keywords.join("\u0000"), [
|
|
340
|
+
const groupId = __rspack_external_react.useContext(CommandGroupContext);
|
|
341
|
+
const generatedId = __rspack_external_react.useId();
|
|
342
|
+
const itemRef = __rspack_external_react.useRef(null);
|
|
343
|
+
const keywordSignature = __rspack_external_react.useMemo(()=>keywords.join("\u0000"), [
|
|
344
344
|
keywords
|
|
345
345
|
]);
|
|
346
|
-
useLayoutEffect(()=>{
|
|
346
|
+
__rspack_external_react.useLayoutEffect(()=>{
|
|
347
347
|
const textValue = value ?? itemRef.current?.textContent?.trim() ?? "";
|
|
348
348
|
registerItem({
|
|
349
349
|
disabled,
|
|
@@ -366,7 +366,7 @@ const CommandItem = /*#__PURE__*/ forwardRef(({ children, className, disabled =
|
|
|
366
366
|
registerItem,
|
|
367
367
|
value
|
|
368
368
|
]);
|
|
369
|
-
useEffect(()=>()=>{
|
|
369
|
+
__rspack_external_react.useEffect(()=>()=>{
|
|
370
370
|
unregisterItem(generatedId);
|
|
371
371
|
}, [
|
|
372
372
|
generatedId,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"components/ui/command.js","sources":["../../../src/components/ui/command.tsx"],"sourcesContent":["\"use client\";\r\n\r\nimport {Dialog as BaseDialog} from \"@base-ui/react/dialog\";\r\nimport {Separator as BaseSeparator} from \"@base-ui/react/separator\";\r\nimport {Search} from \"lucide-react\";\r\nimport * as React from \"react\";\r\n\r\nimport {cn} from \"@/lib/utilities\";\r\n\r\nimport styles from \"./command.module.css\";\r\n\r\ntype CommandFilter = (value: string, search: string, keywords?: string[]) => number;\r\n\r\ninterface CommandProps extends React.HTMLAttributes<HTMLDivElement> {\r\n /**\r\n * Command palette content.\r\n * @default undefined\r\n */\r\n children?: React.ReactNode;\r\n /**\r\n * Accessible label announced for the command region.\r\n * @default undefined\r\n */\r\n label?: string;\r\n /**\r\n * Whether items should be filtered automatically as the search value changes.\r\n * @default true\r\n */\r\n shouldFilter?: boolean;\r\n /**\r\n * Custom scoring function used to determine whether an item matches the current search value.\r\n * @default undefined\r\n */\r\n filter?: CommandFilter;\r\n /**\r\n * Deprecated uncontrolled search value placeholder retained for API compatibility.\r\n * @default undefined\r\n */\r\n defaultValue?: string;\r\n /**\r\n * Deprecated controlled search value placeholder retained for API compatibility.\r\n * @default undefined\r\n */\r\n value?: string;\r\n /**\r\n * Deprecated change callback retained for API compatibility.\r\n * @default undefined\r\n */\r\n onValueChange?: (value: string) => void;\r\n /**\r\n * Whether keyboard navigation should wrap from the last item to the first.\r\n * @default false\r\n */\r\n loop?: boolean;\r\n /**\r\n * Whether pointer hover should avoid changing the active item.\r\n * @default false\r\n */\r\n disablePointerSelection?: boolean;\r\n /**\r\n * Deprecated Vim keybinding toggle retained for API compatibility.\r\n * @default undefined\r\n */\r\n vimBindings?: boolean;\r\n}\r\n\r\ninterface CommandDialogProps extends Omit<React.ComponentPropsWithoutRef<typeof BaseDialog.Root>, \"children\"> {\r\n /**\r\n * Command palette content rendered inside the dialog popup.\r\n * @default undefined\r\n */\r\n children?: React.ReactNode;\r\n /**\r\n * Accessible dialog title announced to assistive technologies.\r\n * @default \"Command menu\"\r\n */\r\n title?: React.ReactNode;\r\n}\r\n\r\ninterface CommandInputProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, \"onChange\" | \"type\" | \"value\"> {\r\n /**\r\n * Controlled search value.\r\n * @default undefined\r\n */\r\n value?: string;\r\n /**\r\n * Native input change handler invoked before the command-specific callback.\r\n * @default undefined\r\n */\r\n onChange?: React.ChangeEventHandler<HTMLInputElement>;\r\n /**\r\n * Callback fired when the command search value changes.\r\n * @default undefined\r\n */\r\n onValueChange?: (search: string) => void;\r\n}\r\n\r\ninterface CommandListProps extends React.HTMLAttributes<HTMLDivElement> {\r\n /**\r\n * Command items and groups.\r\n * @default undefined\r\n */\r\n children?: React.ReactNode;\r\n /**\r\n * Accessible label for the listbox container.\r\n * @default undefined\r\n */\r\n label?: string;\r\n}\r\n\r\ninterface CommandGroupProps extends Omit<React.HTMLAttributes<HTMLDivElement>, \"value\"> {\r\n /**\r\n * Group contents.\r\n * @default undefined\r\n */\r\n children?: React.ReactNode;\r\n /**\r\n * Optional visual heading displayed above the group items.\r\n * @default undefined\r\n */\r\n heading?: React.ReactNode;\r\n /**\r\n * Optional stable value retained for API compatibility.\r\n * @default undefined\r\n */\r\n value?: string;\r\n /**\r\n * Whether the group should remain rendered even when it has no visible items.\r\n * @default false\r\n */\r\n forceMount?: boolean;\r\n}\r\n\r\ninterface CommandSeparatorProps extends React.ComponentPropsWithoutRef<typeof BaseSeparator> {\r\n /**\r\n * Whether the separator should remain visible while filtering is active.\r\n * @default false\r\n */\r\n alwaysRender?: boolean;\r\n}\r\n\r\ninterface CommandItemProps extends Omit<React.HTMLAttributes<HTMLDivElement>, \"onSelect\"> {\r\n /**\r\n * Item contents.\r\n * @default undefined\r\n */\r\n children?: React.ReactNode;\r\n /**\r\n * Whether the item is disabled and should be skipped by selection logic.\r\n * @default false\r\n */\r\n disabled?: boolean;\r\n /**\r\n * Callback invoked when the item is selected.\r\n * @default undefined\r\n */\r\n onSelect?: (value: string) => void;\r\n /**\r\n * Optional value used for filtering and selection callbacks.\r\n * @default undefined\r\n */\r\n value?: string;\r\n /**\r\n * Additional search keywords included in the filter match set.\r\n * @default []\r\n */\r\n keywords?: string[];\r\n /**\r\n * Whether the item should remain rendered even when filtered out.\r\n * @default false\r\n */\r\n forceMount?: boolean;\r\n}\r\n\r\ninterface CommandRegisteredItem {\r\n disabled: boolean;\r\n forceMount: boolean;\r\n groupId: string | null;\r\n id: string;\r\n keywords: string[];\r\n order: number;\r\n ref: React.RefObject<HTMLDivElement | null>;\r\n textValue: string;\r\n value?: string;\r\n}\r\n\r\ninterface CommandContextValue {\r\n activeItemId: string | null;\r\n disablePointerSelection: boolean;\r\n getVisibleItemCount: () => number;\r\n hasVisibleItemsInGroup: (groupId: string) => boolean;\r\n isFiltering: boolean;\r\n isItemVisible: (itemId: string) => boolean;\r\n listId: string;\r\n loop: boolean;\r\n registerItem: (item: Omit<CommandRegisteredItem, \"order\">) => void;\r\n search: string;\r\n setSearch: (value: string) => void;\r\n selectNextItem: () => void;\r\n selectPreviousItem: () => void;\r\n selectSpecificItem: (itemId: string | null) => void;\r\n shouldFilter: boolean;\r\n triggerActiveItem: () => void;\r\n unregisterItem: (itemId: string) => void;\r\n}\r\n\r\nconst CommandContext = React.createContext<CommandContextValue | null>(null);\r\nconst CommandGroupContext = React.createContext<string | null>(null);\r\n\r\nfunction assignRef<TValue>(ref: React.ForwardedRef<TValue>, value: TValue): void {\r\n if (typeof ref === \"function\") {\r\n ref(value);\r\n return;\r\n }\r\n\r\n if (ref) {\r\n ref.current = value;\r\n }\r\n}\r\n\r\nfunction normalizeCommandValue(value: string): string {\r\n return value.trim().toLowerCase();\r\n}\r\n\r\nfunction defaultCommandFilter(value: string, search: string, keywords: string[] = []): number {\r\n if (search.length === 0) {\r\n return 1;\r\n }\r\n\r\n const normalizedSearch = normalizeCommandValue(search);\r\n const normalizedValue = normalizeCommandValue([value, ...keywords].join(\" \"));\r\n\r\n return normalizedValue.includes(normalizedSearch) ? 1 : 0;\r\n}\r\n\r\nfunction useCommandContext(componentName: string): CommandContextValue {\r\n const context = React.useContext(CommandContext);\r\n\r\n if (!context) {\r\n throw new Error(`${componentName} must be used within Command.`);\r\n }\r\n\r\n return context;\r\n}\r\n\r\n/**\r\n * Provides a lightweight, filterable command surface without depending on cmdk.\r\n *\r\n * @remarks\r\n * This wrapper preserves the existing compound-component API while replacing the\r\n * underlying implementation with a small context-driven registry. It supports\r\n * text filtering, arrow-key navigation, Enter-to-select, and pointer hover\r\n * selection for common command palette use cases.\r\n *\r\n * @example\r\n * ```tsx\r\n * <Command label='Quick actions'>\r\n * <CommandInput placeholder='Search actions...' />\r\n * <CommandList>\r\n * <CommandItem onSelect={() => console.log(\"Open\")}>Open</CommandItem>\r\n * </CommandList>\r\n * </Command>\r\n * ```\r\n *\r\n * @see {@link https://base-ui.com/react/components/dialog | Base UI Dialog Docs}\r\n */\r\nconst Command = React.forwardRef<HTMLDivElement, CommandProps>(\r\n (\r\n {\r\n children,\r\n className,\r\n defaultValue: _defaultValue,\r\n disablePointerSelection = false,\r\n filter,\r\n label,\r\n loop = false,\r\n onKeyDown,\r\n onValueChange: _onValueChange,\r\n shouldFilter = true,\r\n value: _value,\r\n vimBindings: _vimBindings,\r\n ...props\r\n },\r\n ref,\r\n ) => {\r\n const [activeItemId, setActiveItemId] = React.useState<string | null>(null);\r\n const [search, setSearch] = React.useState(\"\");\r\n const itemOrderRef = React.useRef(0);\r\n const itemsRef = React.useRef(new Map<string, CommandRegisteredItem>());\r\n const [itemsVersion, setItemsVersion] = React.useState(0);\r\n const listId = React.useId();\r\n\r\n const registerItem = React.useCallback((item: Omit<CommandRegisteredItem, \"order\">): void => {\r\n const existingItem = itemsRef.current.get(item.id);\r\n const nextItem: CommandRegisteredItem = {\r\n ...item,\r\n order: existingItem?.order ?? itemOrderRef.current++,\r\n };\r\n\r\n const hasChanged =\r\n !existingItem\r\n || existingItem.disabled !== nextItem.disabled\r\n || existingItem.forceMount !== nextItem.forceMount\r\n || existingItem.groupId !== nextItem.groupId\r\n || existingItem.keywords.join(\"\\u0000\") !== nextItem.keywords.join(\"\\u0000\")\r\n || existingItem.ref !== nextItem.ref\r\n || existingItem.textValue !== nextItem.textValue\r\n || existingItem.value !== nextItem.value;\r\n\r\n if (!hasChanged) {\r\n return;\r\n }\r\n\r\n itemsRef.current.set(item.id, nextItem);\r\n setItemsVersion((currentVersion) => currentVersion + 1);\r\n }, []);\r\n\r\n const unregisterItem = React.useCallback((itemId: string): void => {\r\n if (!itemsRef.current.delete(itemId)) {\r\n return;\r\n }\r\n\r\n setItemsVersion((currentVersion) => currentVersion + 1);\r\n }, []);\r\n\r\n const items = React.useMemo(() => {\r\n return [...itemsRef.current.values()].toSorted((firstItem, secondItem) => firstItem.order - secondItem.order);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps -- itemsVersion is an intentional change counter\r\n }, [itemsVersion]);\r\n\r\n const isFiltering = shouldFilter && search.trim().length > 0;\r\n\r\n const isItemVisible = React.useCallback(\r\n (itemId: string): boolean => {\r\n const item = itemsRef.current.get(itemId);\r\n\r\n if (!item) {\r\n return false;\r\n }\r\n\r\n if (item.forceMount || !shouldFilter || search.trim().length === 0) {\r\n return true;\r\n }\r\n\r\n const itemValue = item.value ?? item.textValue;\r\n const itemFilter = filter ?? defaultCommandFilter;\r\n\r\n return itemFilter(itemValue, search, item.keywords) > 0;\r\n },\r\n [filter, search, shouldFilter],\r\n );\r\n\r\n const visibleItems = React.useMemo(() => items.filter((item) => isItemVisible(item.id)), [isItemVisible, items]);\r\n\r\n const selectableItems = React.useMemo(() => visibleItems.filter((item) => !item.disabled), [visibleItems]);\r\n\r\n React.useEffect(() => {\r\n if (selectableItems.length === 0) {\r\n // eslint-disable-next-line react-hooks-extra/no-direct-set-state-in-use-effect\r\n setActiveItemId(null);\r\n return;\r\n }\r\n\r\n if (!activeItemId || !selectableItems.some((item) => item.id === activeItemId)) {\r\n // eslint-disable-next-line react-hooks-extra/no-direct-set-state-in-use-effect\r\n setActiveItemId(selectableItems[0].id);\r\n }\r\n }, [activeItemId, selectableItems]);\r\n\r\n React.useEffect(() => {\r\n if (!activeItemId) {\r\n return;\r\n }\r\n\r\n itemsRef.current.get(activeItemId)?.ref.current?.scrollIntoView({\r\n block: \"nearest\",\r\n });\r\n }, [activeItemId]);\r\n\r\n const selectSpecificItem = React.useCallback((itemId: string | null): void => {\r\n setActiveItemId(itemId);\r\n }, []);\r\n\r\n const selectNextItem = React.useCallback((): void => {\r\n if (selectableItems.length === 0) {\r\n return;\r\n }\r\n\r\n const currentIndex = selectableItems.findIndex((item) => item.id === activeItemId);\r\n\r\n if (currentIndex === -1) {\r\n setActiveItemId(selectableItems[0].id);\r\n return;\r\n }\r\n\r\n const nextIndex = currentIndex + 1;\r\n\r\n if (nextIndex >= selectableItems.length) {\r\n setActiveItemId(loop ? selectableItems[0].id : selectableItems[currentIndex].id);\r\n return;\r\n }\r\n\r\n setActiveItemId(selectableItems[nextIndex].id);\r\n }, [activeItemId, loop, selectableItems]);\r\n\r\n const selectPreviousItem = React.useCallback((): void => {\r\n if (selectableItems.length === 0) {\r\n return;\r\n }\r\n\r\n const currentIndex = selectableItems.findIndex((item) => item.id === activeItemId);\r\n\r\n if (currentIndex === -1) {\r\n setActiveItemId(selectableItems[0].id);\r\n return;\r\n }\r\n\r\n const previousIndex = currentIndex - 1;\r\n\r\n if (previousIndex < 0) {\r\n setActiveItemId(loop ? (selectableItems.at(-1)?.id ?? selectableItems[0].id) : selectableItems[currentIndex].id);\r\n return;\r\n }\r\n\r\n setActiveItemId(selectableItems[previousIndex].id);\r\n }, [activeItemId, loop, selectableItems]);\r\n\r\n const triggerActiveItem = React.useCallback((): void => {\r\n if (!activeItemId) {\r\n return;\r\n }\r\n\r\n itemsRef.current.get(activeItemId)?.ref.current?.click();\r\n }, [activeItemId]);\r\n\r\n const hasVisibleItemsInGroup = React.useCallback(\r\n (groupId: string): boolean => visibleItems.some((item) => item.groupId === groupId),\r\n [visibleItems],\r\n );\r\n\r\n const getVisibleItemCount = React.useCallback((): number => visibleItems.length, [visibleItems.length]);\r\n\r\n const contextValue = React.useMemo<CommandContextValue>(\r\n () => ({\r\n activeItemId,\r\n disablePointerSelection,\r\n getVisibleItemCount,\r\n hasVisibleItemsInGroup,\r\n isFiltering,\r\n isItemVisible,\r\n listId,\r\n loop,\r\n registerItem,\r\n search,\r\n setSearch,\r\n selectNextItem,\r\n selectPreviousItem,\r\n selectSpecificItem,\r\n shouldFilter,\r\n triggerActiveItem,\r\n unregisterItem,\r\n }),\r\n [\r\n activeItemId,\r\n disablePointerSelection,\r\n getVisibleItemCount,\r\n hasVisibleItemsInGroup,\r\n isFiltering,\r\n isItemVisible,\r\n listId,\r\n loop,\r\n registerItem,\r\n search,\r\n setSearch,\r\n selectNextItem,\r\n selectPreviousItem,\r\n selectSpecificItem,\r\n shouldFilter,\r\n triggerActiveItem,\r\n unregisterItem,\r\n ],\r\n );\r\n\r\n return (\r\n <CommandContext.Provider value={contextValue}>\r\n <div\r\n ref={ref}\r\n aria-label={label}\r\n className={cn(styles.command, className)}\r\n role='toolbar'\r\n onKeyDown={(event) => {\r\n onKeyDown?.(event);\r\n\r\n if (event.defaultPrevented) {\r\n return;\r\n }\r\n\r\n switch (event.key) {\r\n case \"ArrowDown\": {\r\n event.preventDefault();\r\n selectNextItem();\r\n break;\r\n }\r\n\r\n case \"ArrowUp\": {\r\n event.preventDefault();\r\n selectPreviousItem();\r\n break;\r\n }\r\n\r\n case \"Home\": {\r\n if (selectableItems.length === 0) {\r\n return;\r\n }\r\n\r\n event.preventDefault();\r\n setActiveItemId(selectableItems[0].id);\r\n break;\r\n }\r\n\r\n case \"End\": {\r\n if (selectableItems.length === 0) {\r\n return;\r\n }\r\n\r\n event.preventDefault();\r\n setActiveItemId(selectableItems.at(-1)?.id ?? selectableItems[0].id);\r\n break;\r\n }\r\n\r\n case \"Enter\": {\r\n if (event.nativeEvent.isComposing) {\r\n return;\r\n }\r\n\r\n event.preventDefault();\r\n triggerActiveItem();\r\n break;\r\n }\r\n\r\n default: {\r\n break;\r\n }\r\n }\r\n }}\r\n {...props}>\r\n {children}\r\n </div>\r\n </CommandContext.Provider>\r\n );\r\n },\r\n);\r\nCommand.displayName = \"Command\";\r\n\r\n/**\r\n * Renders the command surface inside a modal dialog.\r\n *\r\n * @remarks\r\n * - Renders a Base UI dialog popup\r\n * - Built on Base UI Dialog primitives\r\n *\r\n * @example\r\n * ```tsx\r\n * <CommandDialog open={open} onOpenChange={setOpen}>\r\n * <CommandInput placeholder='Search...' />\r\n * </CommandDialog>\r\n * ```\r\n *\r\n * @see {@link https://base-ui.com/react/components/dialog | Base UI Dialog Docs}\r\n */\r\nfunction CommandDialog({children, open, onOpenChange, title = \"Command menu\", ...props}: Readonly<CommandDialogProps>): React.JSX.Element {\r\n return (\r\n <BaseDialog.Root\r\n open={open}\r\n onOpenChange={onOpenChange}\r\n {...props}>\r\n <BaseDialog.Portal>\r\n <BaseDialog.Backdrop className={styles.backdrop} />\r\n <BaseDialog.Popup className={styles.dialogPopup}>\r\n <BaseDialog.Title className={styles.srOnly}>{title}</BaseDialog.Title>\r\n <Command>{children}</Command>\r\n </BaseDialog.Popup>\r\n </BaseDialog.Portal>\r\n </BaseDialog.Root>\r\n );\r\n}\r\nCommandDialog.displayName = \"CommandDialog\";\r\n\r\n/**\r\n * Provides the searchable input surface for a command palette.\r\n *\r\n * @remarks\r\n * - Renders an `<input>` element inside a wrapper `<div>`\r\n * - Built on the shared command registry context\r\n *\r\n * @example\r\n * ```tsx\r\n * <CommandInput placeholder='Search...' />\r\n * ```\r\n *\r\n * @see {@link https://developer.mozilla.org/docs/Web/Accessibility/ARIA/Roles/combobox_role | ARIA Combobox Role}\r\n */\r\nconst CommandInput = React.forwardRef<HTMLInputElement, CommandInputProps>(({className, onChange, onValueChange, value, ...props}, ref) => {\r\n const {activeItemId, listId, search, selectSpecificItem, setSearch} = useCommandContext(\"CommandInput\");\r\n const isControlled = value !== undefined;\r\n const inputValue = isControlled ? value : search;\r\n\r\n React.useEffect(() => {\r\n if (!isControlled) {\r\n return;\r\n }\r\n\r\n setSearch(value ?? \"\");\r\n }, [isControlled, setSearch, value]);\r\n\r\n return (\r\n <div className={styles.inputWrapper}>\r\n <Search className={styles.searchIcon} />\r\n <input\r\n ref={ref}\r\n aria-activedescendant={activeItemId ?? undefined}\r\n aria-autocomplete='list'\r\n aria-controls={listId}\r\n aria-expanded='true'\r\n className={cn(styles.input, className)}\r\n onChange={(event) => {\r\n onChange?.(event);\r\n\r\n const nextSearchValue = event.currentTarget.value;\r\n setSearch(nextSearchValue);\r\n onValueChange?.(nextSearchValue);\r\n selectSpecificItem(null);\r\n }}\r\n role='combobox'\r\n type='text'\r\n value={inputValue}\r\n {...props}\r\n />\r\n </div>\r\n );\r\n});\r\nCommandInput.displayName = \"CommandInput\";\r\n\r\n/**\r\n * Renders the listbox container that hosts command items and groups.\r\n *\r\n * @remarks\r\n * - Renders a `<div>` element with `role=\"listbox\"`\r\n * - Built on the shared command registry context\r\n *\r\n * @example\r\n * ```tsx\r\n * <CommandList>\r\n * <CommandItem>Settings</CommandItem>\r\n * </CommandList>\r\n * ```\r\n *\r\n * @see {@link https://developer.mozilla.org/docs/Web/Accessibility/ARIA/Roles/listbox_role | ARIA Listbox Role}\r\n */\r\nconst CommandList = React.forwardRef<HTMLDivElement, CommandListProps>(({className, label, ...props}, ref) => {\r\n const {listId} = useCommandContext(\"CommandList\");\r\n\r\n return (\r\n <div\r\n aria-label={label}\r\n ref={ref}\r\n className={cn(styles.list, className)}\r\n id={listId}\r\n role='listbox'\r\n {...props}\r\n />\r\n );\r\n});\r\nCommandList.displayName = \"CommandList\";\r\n\r\n/**\r\n * Renders a fallback empty-state message when no command items are visible.\r\n *\r\n * @remarks\r\n * - Renders a `<div>` element with `role=\"status\"`\r\n * - Built on the shared command registry context\r\n *\r\n * @example\r\n * ```tsx\r\n * <CommandEmpty>No results found.</CommandEmpty>\r\n * ```\r\n *\r\n * @see {@link https://developer.mozilla.org/docs/Web/Accessibility/ARIA/Roles/status_role | ARIA Status Role}\r\n */\r\nconst CommandEmpty = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(({className, ...props}, ref) => {\r\n const {getVisibleItemCount} = useCommandContext(\"CommandEmpty\");\r\n\r\n if (getVisibleItemCount() > 0) {\r\n return null;\r\n }\r\n\r\n return (\r\n <div\r\n ref={ref}\r\n className={cn(styles.empty, className)}\r\n role='status'\r\n {...props}\r\n />\r\n );\r\n});\r\nCommandEmpty.displayName = \"CommandEmpty\";\r\n\r\n/**\r\n * Groups related command items under an optional heading.\r\n *\r\n * @remarks\r\n * - Renders a `<div>` element\r\n * - Built on the shared command registry context\r\n *\r\n * @example\r\n * ```tsx\r\n * <CommandGroup heading='Suggestions'>\r\n * <CommandItem>Profile</CommandItem>\r\n * </CommandGroup>\r\n * ```\r\n *\r\n * @see {@link https://developer.mozilla.org/docs/Web/Accessibility/ARIA/Roles/group_role | ARIA Group Role}\r\n */\r\nconst CommandGroup = React.forwardRef<HTMLDivElement, CommandGroupProps>(\r\n ({children, className, forceMount = false, heading, value: _value, ...props}, ref) => {\r\n const groupId = React.useId();\r\n const {hasVisibleItemsInGroup, isFiltering} = useCommandContext(\"CommandGroup\");\r\n\r\n if (!forceMount && isFiltering && !hasVisibleItemsInGroup(groupId)) {\r\n return null;\r\n }\r\n\r\n return (\r\n <CommandGroupContext.Provider value={groupId}>\r\n <div\r\n ref={ref}\r\n className={cn(styles.group, className)}\r\n data-command-group=''\r\n {...props}>\r\n {heading ? <div className={styles.groupHeading}>{heading}</div> : null}\r\n {children}\r\n </div>\r\n </CommandGroupContext.Provider>\r\n );\r\n },\r\n);\r\nCommandGroup.displayName = \"CommandGroup\";\r\n\r\n/**\r\n * Renders a separator between command groups or item sections.\r\n *\r\n * @remarks\r\n * - Renders the shared separator primitive\r\n * - Built on Base UI Separator\r\n *\r\n * @example\r\n * ```tsx\r\n * <CommandSeparator />\r\n * ```\r\n *\r\n * @see {@link https://base-ui.com/react/components/separator | Base UI Separator Docs}\r\n */\r\nconst CommandSeparator = React.forwardRef<HTMLDivElement, CommandSeparatorProps>(\r\n ({alwaysRender = false, className, orientation = \"horizontal\", ...props}, ref) => {\r\n const {isFiltering} = useCommandContext(\"CommandSeparator\");\r\n\r\n if (isFiltering && !alwaysRender) {\r\n return null;\r\n }\r\n\r\n return (\r\n <BaseSeparator\r\n ref={ref}\r\n className={cn(styles.separator, className)}\r\n orientation={orientation}\r\n {...props}\r\n />\r\n );\r\n },\r\n);\r\nCommandSeparator.displayName = \"CommandSeparator\";\r\n\r\n/**\r\n * Renders a selectable command option with filtering metadata and keyboard support.\r\n *\r\n * @remarks\r\n * - Renders a `<div>` element with `role=\"option\"`\r\n * - Built on the shared command registry context\r\n *\r\n * @example\r\n * ```tsx\r\n * <CommandItem keywords={[\"preferences\"]}>Settings</CommandItem>\r\n * ```\r\n *\r\n * @see {@link https://developer.mozilla.org/docs/Web/Accessibility/ARIA/Roles/option_role | ARIA Option Role}\r\n */\r\nconst CommandItem = React.forwardRef<HTMLDivElement, CommandItemProps>(\r\n ({children, className, disabled = false, forceMount = false, keywords = [], onClick, onMouseEnter, onSelect, value, ...props}, ref) => {\r\n const {activeItemId, disablePointerSelection, isFiltering, isItemVisible, registerItem, selectSpecificItem, unregisterItem} =\r\n useCommandContext(\"CommandItem\");\r\n const groupId = React.useContext(CommandGroupContext);\r\n const generatedId = React.useId();\r\n const itemRef = React.useRef<HTMLDivElement | null>(null);\r\n const keywordSignature = React.useMemo(() => keywords.join(\"\\u0000\"), [keywords]);\r\n\r\n React.useLayoutEffect(() => {\r\n const textValue = value ?? itemRef.current?.textContent?.trim() ?? \"\";\r\n\r\n registerItem({\r\n disabled,\r\n forceMount,\r\n groupId,\r\n id: generatedId,\r\n keywords,\r\n ref: itemRef,\r\n textValue,\r\n value,\r\n });\r\n }, [children, disabled, forceMount, generatedId, groupId, keywordSignature, keywords, registerItem, value]);\r\n\r\n React.useEffect(() => {\r\n return () => {\r\n unregisterItem(generatedId);\r\n };\r\n }, [generatedId, unregisterItem]);\r\n\r\n const isVisible = forceMount || !isFiltering || isItemVisible(generatedId);\r\n\r\n if (!isVisible) {\r\n return null;\r\n }\r\n\r\n const isSelected = activeItemId === generatedId;\r\n\r\n return (\r\n <div\r\n {...props}\r\n ref={(node) => {\r\n itemRef.current = node;\r\n assignRef(ref, node);\r\n }}\r\n aria-disabled={disabled || undefined}\r\n aria-selected={isSelected}\r\n className={cn(styles.item, className)}\r\n data-disabled={disabled ? \"true\" : undefined}\r\n data-selected={isSelected ? \"true\" : undefined}\r\n id={generatedId}\r\n onClick={(event) => {\r\n if (disabled) {\r\n event.preventDefault();\r\n return;\r\n }\r\n\r\n selectSpecificItem(generatedId);\r\n onSelect?.(value ?? itemRef.current?.textContent?.trim() ?? \"\");\r\n onClick?.(event);\r\n }}\r\n onKeyDown={(event) => {\r\n if (disabled) {\r\n event.preventDefault();\r\n return;\r\n }\r\n\r\n if (event.key === \"Enter\" || event.key === \" \") {\r\n event.preventDefault();\r\n selectSpecificItem(generatedId);\r\n onSelect?.(value ?? itemRef.current?.textContent?.trim() ?? \"\");\r\n }\r\n }}\r\n onFocus={() => {\r\n if (disabled) {\r\n return;\r\n }\r\n\r\n selectSpecificItem(generatedId);\r\n }}\r\n onMouseEnter={(event) => {\r\n onMouseEnter?.(event);\r\n\r\n if (disabled || disablePointerSelection) {\r\n return;\r\n }\r\n\r\n selectSpecificItem(generatedId);\r\n }}\r\n role='option'\r\n tabIndex={disabled ? -1 : 0}>\r\n {children}\r\n </div>\r\n );\r\n },\r\n);\r\nCommandItem.displayName = \"CommandItem\";\r\n\r\n/**\r\n * Renders auxiliary shortcut text aligned to the edge of a command item.\r\n *\r\n * @remarks\r\n * - Renders a `<span>` element\r\n * - Built as a lightweight presentational helper for command menus\r\n *\r\n * @example\r\n * ```tsx\r\n * <CommandShortcut>⌘K</CommandShortcut>\r\n * ```\r\n *\r\n * @see {@link https://developer.mozilla.org/docs/Web/HTML/Element/span | HTML span element}\r\n */\r\nconst CommandShortcut = ({className, ...props}: Readonly<React.HTMLAttributes<HTMLSpanElement>>): React.JSX.Element => {\r\n return (\r\n <span\r\n className={cn(styles.shortcut, className)}\r\n {...props}\r\n />\r\n );\r\n};\r\nCommandShortcut.displayName = \"CommandShortcut\";\r\n\r\nexport {Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, CommandShortcut};\r\n"],"names":["CommandContext","React","CommandGroupContext","assignRef","ref","value","normalizeCommandValue","defaultCommandFilter","search","keywords","normalizedSearch","normalizedValue","useCommandContext","componentName","context","Error","Command","children","className","_defaultValue","disablePointerSelection","filter","label","loop","onKeyDown","_onValueChange","shouldFilter","_value","_vimBindings","props","activeItemId","setActiveItemId","setSearch","itemOrderRef","itemsRef","Map","itemsVersion","setItemsVersion","listId","registerItem","item","existingItem","nextItem","hasChanged","currentVersion","unregisterItem","itemId","items","firstItem","secondItem","isFiltering","isItemVisible","itemValue","itemFilter","visibleItems","selectableItems","selectSpecificItem","selectNextItem","currentIndex","nextIndex","selectPreviousItem","previousIndex","triggerActiveItem","hasVisibleItemsInGroup","groupId","getVisibleItemCount","contextValue","cn","styles","event","CommandDialog","open","onOpenChange","title","BaseDialog","CommandInput","onChange","onValueChange","isControlled","undefined","inputValue","Search","nextSearchValue","CommandList","CommandEmpty","CommandGroup","forceMount","heading","CommandSeparator","alwaysRender","orientation","BaseSeparator","CommandItem","disabled","onClick","onMouseEnter","onSelect","generatedId","itemRef","keywordSignature","textValue","isVisible","isSelected","node","CommandShortcut"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"components/ui/command.js","sources":["../../../src/components/ui/command.tsx"],"sourcesContent":["\"use client\";\r\n\r\nimport {Dialog as BaseDialog} from \"@base-ui/react/dialog\";\r\nimport {Separator as BaseSeparator} from \"@base-ui/react/separator\";\r\nimport {Search} from \"lucide-react\";\r\nimport * as React from \"react\";\r\n\r\nimport {cn} from \"@/lib/utilities\";\r\n\r\nimport styles from \"./command.module.css\";\r\n\r\ntype CommandFilter = (value: string, search: string, keywords?: string[]) => number;\r\n\r\ninterface CommandProps extends React.HTMLAttributes<HTMLDivElement> {\r\n /**\r\n * Command palette content.\r\n * @default undefined\r\n */\r\n children?: React.ReactNode;\r\n /**\r\n * Accessible label announced for the command region.\r\n * @default undefined\r\n */\r\n label?: string;\r\n /**\r\n * Whether items should be filtered automatically as the search value changes.\r\n * @default true\r\n */\r\n shouldFilter?: boolean;\r\n /**\r\n * Custom scoring function used to determine whether an item matches the current search value.\r\n * @default undefined\r\n */\r\n filter?: CommandFilter;\r\n /**\r\n * Deprecated uncontrolled search value placeholder retained for API compatibility.\r\n * @default undefined\r\n */\r\n defaultValue?: string;\r\n /**\r\n * Deprecated controlled search value placeholder retained for API compatibility.\r\n * @default undefined\r\n */\r\n value?: string;\r\n /**\r\n * Deprecated change callback retained for API compatibility.\r\n * @default undefined\r\n */\r\n onValueChange?: (value: string) => void;\r\n /**\r\n * Whether keyboard navigation should wrap from the last item to the first.\r\n * @default false\r\n */\r\n loop?: boolean;\r\n /**\r\n * Whether pointer hover should avoid changing the active item.\r\n * @default false\r\n */\r\n disablePointerSelection?: boolean;\r\n /**\r\n * Deprecated Vim keybinding toggle retained for API compatibility.\r\n * @default undefined\r\n */\r\n vimBindings?: boolean;\r\n}\r\n\r\ninterface CommandDialogProps extends Omit<React.ComponentPropsWithoutRef<typeof BaseDialog.Root>, \"children\"> {\r\n /**\r\n * Command palette content rendered inside the dialog popup.\r\n * @default undefined\r\n */\r\n children?: React.ReactNode;\r\n /**\r\n * Accessible dialog title announced to assistive technologies.\r\n * @default \"Command menu\"\r\n */\r\n title?: React.ReactNode;\r\n}\r\n\r\ninterface CommandInputProps extends Omit<React.InputHTMLAttributes<HTMLInputElement>, \"onChange\" | \"type\" | \"value\"> {\r\n /**\r\n * Controlled search value.\r\n * @default undefined\r\n */\r\n value?: string;\r\n /**\r\n * Native input change handler invoked before the command-specific callback.\r\n * @default undefined\r\n */\r\n onChange?: React.ChangeEventHandler<HTMLInputElement>;\r\n /**\r\n * Callback fired when the command search value changes.\r\n * @default undefined\r\n */\r\n onValueChange?: (search: string) => void;\r\n}\r\n\r\ninterface CommandListProps extends React.HTMLAttributes<HTMLDivElement> {\r\n /**\r\n * Command items and groups.\r\n * @default undefined\r\n */\r\n children?: React.ReactNode;\r\n /**\r\n * Accessible label for the listbox container.\r\n * @default undefined\r\n */\r\n label?: string;\r\n}\r\n\r\ninterface CommandGroupProps extends Omit<React.HTMLAttributes<HTMLDivElement>, \"value\"> {\r\n /**\r\n * Group contents.\r\n * @default undefined\r\n */\r\n children?: React.ReactNode;\r\n /**\r\n * Optional visual heading displayed above the group items.\r\n * @default undefined\r\n */\r\n heading?: React.ReactNode;\r\n /**\r\n * Optional stable value retained for API compatibility.\r\n * @default undefined\r\n */\r\n value?: string;\r\n /**\r\n * Whether the group should remain rendered even when it has no visible items.\r\n * @default false\r\n */\r\n forceMount?: boolean;\r\n}\r\n\r\ninterface CommandSeparatorProps extends React.ComponentPropsWithoutRef<typeof BaseSeparator> {\r\n /**\r\n * Whether the separator should remain visible while filtering is active.\r\n * @default false\r\n */\r\n alwaysRender?: boolean;\r\n}\r\n\r\ninterface CommandItemProps extends Omit<React.HTMLAttributes<HTMLDivElement>, \"onSelect\"> {\r\n /**\r\n * Item contents.\r\n * @default undefined\r\n */\r\n children?: React.ReactNode;\r\n /**\r\n * Whether the item is disabled and should be skipped by selection logic.\r\n * @default false\r\n */\r\n disabled?: boolean;\r\n /**\r\n * Callback invoked when the item is selected.\r\n * @default undefined\r\n */\r\n onSelect?: (value: string) => void;\r\n /**\r\n * Optional value used for filtering and selection callbacks.\r\n * @default undefined\r\n */\r\n value?: string;\r\n /**\r\n * Additional search keywords included in the filter match set.\r\n * @default []\r\n */\r\n keywords?: string[];\r\n /**\r\n * Whether the item should remain rendered even when filtered out.\r\n * @default false\r\n */\r\n forceMount?: boolean;\r\n}\r\n\r\ninterface CommandRegisteredItem {\r\n disabled: boolean;\r\n forceMount: boolean;\r\n groupId: string | null;\r\n id: string;\r\n keywords: string[];\r\n order: number;\r\n ref: React.RefObject<HTMLDivElement | null>;\r\n textValue: string;\r\n value?: string;\r\n}\r\n\r\ninterface CommandContextValue {\r\n activeItemId: string | null;\r\n disablePointerSelection: boolean;\r\n getVisibleItemCount: () => number;\r\n hasVisibleItemsInGroup: (groupId: string) => boolean;\r\n isFiltering: boolean;\r\n isItemVisible: (itemId: string) => boolean;\r\n listId: string;\r\n loop: boolean;\r\n registerItem: (item: Omit<CommandRegisteredItem, \"order\">) => void;\r\n search: string;\r\n setSearch: (value: string) => void;\r\n selectNextItem: () => void;\r\n selectPreviousItem: () => void;\r\n selectSpecificItem: (itemId: string | null) => void;\r\n shouldFilter: boolean;\r\n triggerActiveItem: () => void;\r\n unregisterItem: (itemId: string) => void;\r\n}\r\n\r\nconst CommandContext = React.createContext<CommandContextValue | null>(null);\r\nconst CommandGroupContext = React.createContext<string | null>(null);\r\n\r\nfunction assignRef<TValue>(ref: React.ForwardedRef<TValue>, value: TValue): void {\r\n if (typeof ref === \"function\") {\r\n ref(value);\r\n return;\r\n }\r\n\r\n if (ref) {\r\n ref.current = value;\r\n }\r\n}\r\n\r\nfunction normalizeCommandValue(value: string): string {\r\n return value.trim().toLowerCase();\r\n}\r\n\r\nfunction defaultCommandFilter(value: string, search: string, keywords: string[] = []): number {\r\n if (search.length === 0) {\r\n return 1;\r\n }\r\n\r\n const normalizedSearch = normalizeCommandValue(search);\r\n const normalizedValue = normalizeCommandValue([value, ...keywords].join(\" \"));\r\n\r\n return normalizedValue.includes(normalizedSearch) ? 1 : 0;\r\n}\r\n\r\nfunction useCommandContext(componentName: string): CommandContextValue {\r\n const context = React.useContext(CommandContext);\r\n\r\n if (!context) {\r\n throw new Error(`${componentName} must be used within Command.`);\r\n }\r\n\r\n return context;\r\n}\r\n\r\n/**\r\n * Provides a lightweight, filterable command surface without depending on cmdk.\r\n *\r\n * @remarks\r\n * This wrapper preserves the existing compound-component API while replacing the\r\n * underlying implementation with a small context-driven registry. It supports\r\n * text filtering, arrow-key navigation, Enter-to-select, and pointer hover\r\n * selection for common command palette use cases.\r\n *\r\n * @example\r\n * ```tsx\r\n * <Command label='Quick actions'>\r\n * <CommandInput placeholder='Search actions...' />\r\n * <CommandList>\r\n * <CommandItem onSelect={() => console.log(\"Open\")}>Open</CommandItem>\r\n * </CommandList>\r\n * </Command>\r\n * ```\r\n *\r\n * @see {@link https://base-ui.com/react/components/dialog | Base UI Dialog Docs}\r\n */\r\nconst Command = React.forwardRef<HTMLDivElement, CommandProps>(\r\n (\r\n {\r\n children,\r\n className,\r\n defaultValue: _defaultValue,\r\n disablePointerSelection = false,\r\n filter,\r\n label,\r\n loop = false,\r\n onKeyDown,\r\n onValueChange: _onValueChange,\r\n shouldFilter = true,\r\n value: _value,\r\n vimBindings: _vimBindings,\r\n ...props\r\n },\r\n ref,\r\n ) => {\r\n const [activeItemId, setActiveItemId] = React.useState<string | null>(null);\r\n const [search, setSearch] = React.useState(\"\");\r\n const itemOrderRef = React.useRef(0);\r\n const itemsRef = React.useRef(new Map<string, CommandRegisteredItem>());\r\n const [itemsVersion, setItemsVersion] = React.useState(0);\r\n const listId = React.useId();\r\n\r\n const registerItem = React.useCallback((item: Omit<CommandRegisteredItem, \"order\">): void => {\r\n const existingItem = itemsRef.current.get(item.id);\r\n const nextItem: CommandRegisteredItem = {\r\n ...item,\r\n order: existingItem?.order ?? itemOrderRef.current++,\r\n };\r\n\r\n const hasChanged =\r\n !existingItem\r\n || existingItem.disabled !== nextItem.disabled\r\n || existingItem.forceMount !== nextItem.forceMount\r\n || existingItem.groupId !== nextItem.groupId\r\n || existingItem.keywords.join(\"\\u0000\") !== nextItem.keywords.join(\"\\u0000\")\r\n || existingItem.ref !== nextItem.ref\r\n || existingItem.textValue !== nextItem.textValue\r\n || existingItem.value !== nextItem.value;\r\n\r\n if (!hasChanged) {\r\n return;\r\n }\r\n\r\n itemsRef.current.set(item.id, nextItem);\r\n setItemsVersion((currentVersion) => currentVersion + 1);\r\n }, []);\r\n\r\n const unregisterItem = React.useCallback((itemId: string): void => {\r\n if (!itemsRef.current.delete(itemId)) {\r\n return;\r\n }\r\n\r\n setItemsVersion((currentVersion) => currentVersion + 1);\r\n }, []);\r\n\r\n const items = React.useMemo(() => {\r\n return [...itemsRef.current.values()].toSorted((firstItem, secondItem) => firstItem.order - secondItem.order);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps -- itemsVersion is an intentional change counter\r\n }, [itemsVersion]);\r\n\r\n const isFiltering = shouldFilter && search.trim().length > 0;\r\n\r\n const isItemVisible = React.useCallback(\r\n (itemId: string): boolean => {\r\n const item = itemsRef.current.get(itemId);\r\n\r\n if (!item) {\r\n return false;\r\n }\r\n\r\n if (item.forceMount || !shouldFilter || search.trim().length === 0) {\r\n return true;\r\n }\r\n\r\n const itemValue = item.value ?? item.textValue;\r\n const itemFilter = filter ?? defaultCommandFilter;\r\n\r\n return itemFilter(itemValue, search, item.keywords) > 0;\r\n },\r\n [filter, search, shouldFilter],\r\n );\r\n\r\n const visibleItems = React.useMemo(() => items.filter((item) => isItemVisible(item.id)), [isItemVisible, items]);\r\n\r\n const selectableItems = React.useMemo(() => visibleItems.filter((item) => !item.disabled), [visibleItems]);\r\n\r\n React.useEffect(() => {\r\n if (selectableItems.length === 0) {\r\n // eslint-disable-next-line react-hooks-extra/no-direct-set-state-in-use-effect\r\n setActiveItemId(null);\r\n return;\r\n }\r\n\r\n if (!activeItemId || !selectableItems.some((item) => item.id === activeItemId)) {\r\n // eslint-disable-next-line react-hooks-extra/no-direct-set-state-in-use-effect\r\n setActiveItemId(selectableItems[0].id);\r\n }\r\n }, [activeItemId, selectableItems]);\r\n\r\n React.useEffect(() => {\r\n if (!activeItemId) {\r\n return;\r\n }\r\n\r\n itemsRef.current.get(activeItemId)?.ref.current?.scrollIntoView({\r\n block: \"nearest\",\r\n });\r\n }, [activeItemId]);\r\n\r\n const selectSpecificItem = React.useCallback((itemId: string | null): void => {\r\n setActiveItemId(itemId);\r\n }, []);\r\n\r\n const selectNextItem = React.useCallback((): void => {\r\n if (selectableItems.length === 0) {\r\n return;\r\n }\r\n\r\n const currentIndex = selectableItems.findIndex((item) => item.id === activeItemId);\r\n\r\n if (currentIndex === -1) {\r\n setActiveItemId(selectableItems[0].id);\r\n return;\r\n }\r\n\r\n const nextIndex = currentIndex + 1;\r\n\r\n if (nextIndex >= selectableItems.length) {\r\n setActiveItemId(loop ? selectableItems[0].id : selectableItems[currentIndex].id);\r\n return;\r\n }\r\n\r\n setActiveItemId(selectableItems[nextIndex].id);\r\n }, [activeItemId, loop, selectableItems]);\r\n\r\n const selectPreviousItem = React.useCallback((): void => {\r\n if (selectableItems.length === 0) {\r\n return;\r\n }\r\n\r\n const currentIndex = selectableItems.findIndex((item) => item.id === activeItemId);\r\n\r\n if (currentIndex === -1) {\r\n setActiveItemId(selectableItems[0].id);\r\n return;\r\n }\r\n\r\n const previousIndex = currentIndex - 1;\r\n\r\n if (previousIndex < 0) {\r\n setActiveItemId(loop ? (selectableItems.at(-1)?.id ?? selectableItems[0].id) : selectableItems[currentIndex].id);\r\n return;\r\n }\r\n\r\n setActiveItemId(selectableItems[previousIndex].id);\r\n }, [activeItemId, loop, selectableItems]);\r\n\r\n const triggerActiveItem = React.useCallback((): void => {\r\n if (!activeItemId) {\r\n return;\r\n }\r\n\r\n itemsRef.current.get(activeItemId)?.ref.current?.click();\r\n }, [activeItemId]);\r\n\r\n const hasVisibleItemsInGroup = React.useCallback(\r\n (groupId: string): boolean => visibleItems.some((item) => item.groupId === groupId),\r\n [visibleItems],\r\n );\r\n\r\n const getVisibleItemCount = React.useCallback((): number => visibleItems.length, [visibleItems.length]);\r\n\r\n const contextValue = React.useMemo<CommandContextValue>(\r\n () => ({\r\n activeItemId,\r\n disablePointerSelection,\r\n getVisibleItemCount,\r\n hasVisibleItemsInGroup,\r\n isFiltering,\r\n isItemVisible,\r\n listId,\r\n loop,\r\n registerItem,\r\n search,\r\n setSearch,\r\n selectNextItem,\r\n selectPreviousItem,\r\n selectSpecificItem,\r\n shouldFilter,\r\n triggerActiveItem,\r\n unregisterItem,\r\n }),\r\n [\r\n activeItemId,\r\n disablePointerSelection,\r\n getVisibleItemCount,\r\n hasVisibleItemsInGroup,\r\n isFiltering,\r\n isItemVisible,\r\n listId,\r\n loop,\r\n registerItem,\r\n search,\r\n setSearch,\r\n selectNextItem,\r\n selectPreviousItem,\r\n selectSpecificItem,\r\n shouldFilter,\r\n triggerActiveItem,\r\n unregisterItem,\r\n ],\r\n );\r\n\r\n return (\r\n <CommandContext.Provider value={contextValue}>\r\n <div\r\n ref={ref}\r\n aria-label={label}\r\n className={cn(styles.command, className)}\r\n role='toolbar'\r\n onKeyDown={(event) => {\r\n onKeyDown?.(event);\r\n\r\n if (event.defaultPrevented) {\r\n return;\r\n }\r\n\r\n switch (event.key) {\r\n case \"ArrowDown\": {\r\n event.preventDefault();\r\n selectNextItem();\r\n break;\r\n }\r\n\r\n case \"ArrowUp\": {\r\n event.preventDefault();\r\n selectPreviousItem();\r\n break;\r\n }\r\n\r\n case \"Home\": {\r\n if (selectableItems.length === 0) {\r\n return;\r\n }\r\n\r\n event.preventDefault();\r\n setActiveItemId(selectableItems[0].id);\r\n break;\r\n }\r\n\r\n case \"End\": {\r\n if (selectableItems.length === 0) {\r\n return;\r\n }\r\n\r\n event.preventDefault();\r\n setActiveItemId(selectableItems.at(-1)?.id ?? selectableItems[0].id);\r\n break;\r\n }\r\n\r\n case \"Enter\": {\r\n if (event.nativeEvent.isComposing) {\r\n return;\r\n }\r\n\r\n event.preventDefault();\r\n triggerActiveItem();\r\n break;\r\n }\r\n\r\n default: {\r\n break;\r\n }\r\n }\r\n }}\r\n {...props}>\r\n {children}\r\n </div>\r\n </CommandContext.Provider>\r\n );\r\n },\r\n);\r\nCommand.displayName = \"Command\";\r\n\r\n/**\r\n * Renders the command surface inside a modal dialog.\r\n *\r\n * @remarks\r\n * - Renders a Base UI dialog popup\r\n * - Built on Base UI Dialog primitives\r\n *\r\n * @example\r\n * ```tsx\r\n * <CommandDialog open={open} onOpenChange={setOpen}>\r\n * <CommandInput placeholder='Search...' />\r\n * </CommandDialog>\r\n * ```\r\n *\r\n * @see {@link https://base-ui.com/react/components/dialog | Base UI Dialog Docs}\r\n */\r\nfunction CommandDialog({children, open, onOpenChange, title = \"Command menu\", ...props}: Readonly<CommandDialogProps>): React.JSX.Element {\r\n return (\r\n <BaseDialog.Root\r\n open={open}\r\n onOpenChange={onOpenChange}\r\n {...props}>\r\n <BaseDialog.Portal>\r\n <BaseDialog.Backdrop className={styles.backdrop} />\r\n <BaseDialog.Popup className={styles.dialogPopup}>\r\n <BaseDialog.Title className={styles.srOnly}>{title}</BaseDialog.Title>\r\n <Command>{children}</Command>\r\n </BaseDialog.Popup>\r\n </BaseDialog.Portal>\r\n </BaseDialog.Root>\r\n );\r\n}\r\nCommandDialog.displayName = \"CommandDialog\";\r\n\r\n/**\r\n * Provides the searchable input surface for a command palette.\r\n *\r\n * @remarks\r\n * - Renders an `<input>` element inside a wrapper `<div>`\r\n * - Built on the shared command registry context\r\n *\r\n * @example\r\n * ```tsx\r\n * <CommandInput placeholder='Search...' />\r\n * ```\r\n *\r\n * @see {@link https://developer.mozilla.org/docs/Web/Accessibility/ARIA/Roles/combobox_role | ARIA Combobox Role}\r\n */\r\nconst CommandInput = React.forwardRef<HTMLInputElement, CommandInputProps>(({className, onChange, onValueChange, value, ...props}, ref) => {\r\n const {activeItemId, listId, search, selectSpecificItem, setSearch} = useCommandContext(\"CommandInput\");\r\n const isControlled = value !== undefined;\r\n const inputValue = isControlled ? value : search;\r\n\r\n React.useEffect(() => {\r\n if (!isControlled) {\r\n return;\r\n }\r\n\r\n setSearch(value ?? \"\");\r\n }, [isControlled, setSearch, value]);\r\n\r\n return (\r\n <div className={styles.inputWrapper}>\r\n <Search className={styles.searchIcon} />\r\n <input\r\n ref={ref}\r\n aria-activedescendant={activeItemId ?? undefined}\r\n aria-autocomplete='list'\r\n aria-controls={listId}\r\n aria-expanded='true'\r\n className={cn(styles.input, className)}\r\n onChange={(event) => {\r\n onChange?.(event);\r\n\r\n const nextSearchValue = event.currentTarget.value;\r\n setSearch(nextSearchValue);\r\n onValueChange?.(nextSearchValue);\r\n selectSpecificItem(null);\r\n }}\r\n role='combobox'\r\n type='text'\r\n value={inputValue}\r\n {...props}\r\n />\r\n </div>\r\n );\r\n});\r\nCommandInput.displayName = \"CommandInput\";\r\n\r\n/**\r\n * Renders the listbox container that hosts command items and groups.\r\n *\r\n * @remarks\r\n * - Renders a `<div>` element with `role=\"listbox\"`\r\n * - Built on the shared command registry context\r\n *\r\n * @example\r\n * ```tsx\r\n * <CommandList>\r\n * <CommandItem>Settings</CommandItem>\r\n * </CommandList>\r\n * ```\r\n *\r\n * @see {@link https://developer.mozilla.org/docs/Web/Accessibility/ARIA/Roles/listbox_role | ARIA Listbox Role}\r\n */\r\nconst CommandList = React.forwardRef<HTMLDivElement, CommandListProps>(({className, label, ...props}, ref) => {\r\n const {listId} = useCommandContext(\"CommandList\");\r\n\r\n return (\r\n <div\r\n aria-label={label}\r\n ref={ref}\r\n className={cn(styles.list, className)}\r\n id={listId}\r\n role='listbox'\r\n {...props}\r\n />\r\n );\r\n});\r\nCommandList.displayName = \"CommandList\";\r\n\r\n/**\r\n * Renders a fallback empty-state message when no command items are visible.\r\n *\r\n * @remarks\r\n * - Renders a `<div>` element with `role=\"status\"`\r\n * - Built on the shared command registry context\r\n *\r\n * @example\r\n * ```tsx\r\n * <CommandEmpty>No results found.</CommandEmpty>\r\n * ```\r\n *\r\n * @see {@link https://developer.mozilla.org/docs/Web/Accessibility/ARIA/Roles/status_role | ARIA Status Role}\r\n */\r\nconst CommandEmpty = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(({className, ...props}, ref) => {\r\n const {getVisibleItemCount} = useCommandContext(\"CommandEmpty\");\r\n\r\n if (getVisibleItemCount() > 0) {\r\n return null;\r\n }\r\n\r\n return (\r\n <div\r\n ref={ref}\r\n className={cn(styles.empty, className)}\r\n role='status'\r\n {...props}\r\n />\r\n );\r\n});\r\nCommandEmpty.displayName = \"CommandEmpty\";\r\n\r\n/**\r\n * Groups related command items under an optional heading.\r\n *\r\n * @remarks\r\n * - Renders a `<div>` element\r\n * - Built on the shared command registry context\r\n *\r\n * @example\r\n * ```tsx\r\n * <CommandGroup heading='Suggestions'>\r\n * <CommandItem>Profile</CommandItem>\r\n * </CommandGroup>\r\n * ```\r\n *\r\n * @see {@link https://developer.mozilla.org/docs/Web/Accessibility/ARIA/Roles/group_role | ARIA Group Role}\r\n */\r\nconst CommandGroup = React.forwardRef<HTMLDivElement, CommandGroupProps>(\r\n ({children, className, forceMount = false, heading, value: _value, ...props}, ref) => {\r\n const groupId = React.useId();\r\n const {hasVisibleItemsInGroup, isFiltering} = useCommandContext(\"CommandGroup\");\r\n\r\n if (!forceMount && isFiltering && !hasVisibleItemsInGroup(groupId)) {\r\n return null;\r\n }\r\n\r\n return (\r\n <CommandGroupContext.Provider value={groupId}>\r\n <div\r\n ref={ref}\r\n className={cn(styles.group, className)}\r\n data-command-group=''\r\n {...props}>\r\n {heading ? <div className={styles.groupHeading}>{heading}</div> : null}\r\n {children}\r\n </div>\r\n </CommandGroupContext.Provider>\r\n );\r\n },\r\n);\r\nCommandGroup.displayName = \"CommandGroup\";\r\n\r\n/**\r\n * Renders a separator between command groups or item sections.\r\n *\r\n * @remarks\r\n * - Renders the shared separator primitive\r\n * - Built on Base UI Separator\r\n *\r\n * @example\r\n * ```tsx\r\n * <CommandSeparator />\r\n * ```\r\n *\r\n * @see {@link https://base-ui.com/react/components/separator | Base UI Separator Docs}\r\n */\r\nconst CommandSeparator = React.forwardRef<HTMLDivElement, CommandSeparatorProps>(\r\n ({alwaysRender = false, className, orientation = \"horizontal\", ...props}, ref) => {\r\n const {isFiltering} = useCommandContext(\"CommandSeparator\");\r\n\r\n if (isFiltering && !alwaysRender) {\r\n return null;\r\n }\r\n\r\n return (\r\n <BaseSeparator\r\n ref={ref}\r\n className={cn(styles.separator, className)}\r\n orientation={orientation}\r\n {...props}\r\n />\r\n );\r\n },\r\n);\r\nCommandSeparator.displayName = \"CommandSeparator\";\r\n\r\n/**\r\n * Renders a selectable command option with filtering metadata and keyboard support.\r\n *\r\n * @remarks\r\n * - Renders a `<div>` element with `role=\"option\"`\r\n * - Built on the shared command registry context\r\n *\r\n * @example\r\n * ```tsx\r\n * <CommandItem keywords={[\"preferences\"]}>Settings</CommandItem>\r\n * ```\r\n *\r\n * @see {@link https://developer.mozilla.org/docs/Web/Accessibility/ARIA/Roles/option_role | ARIA Option Role}\r\n */\r\nconst CommandItem = React.forwardRef<HTMLDivElement, CommandItemProps>(\r\n ({children, className, disabled = false, forceMount = false, keywords = [], onClick, onMouseEnter, onSelect, value, ...props}, ref) => {\r\n const {activeItemId, disablePointerSelection, isFiltering, isItemVisible, registerItem, selectSpecificItem, unregisterItem} =\r\n useCommandContext(\"CommandItem\");\r\n const groupId = React.useContext(CommandGroupContext);\r\n const generatedId = React.useId();\r\n const itemRef = React.useRef<HTMLDivElement | null>(null);\r\n const keywordSignature = React.useMemo(() => keywords.join(\"\\u0000\"), [keywords]);\r\n\r\n React.useLayoutEffect(() => {\r\n const textValue = value ?? itemRef.current?.textContent?.trim() ?? \"\";\r\n\r\n registerItem({\r\n disabled,\r\n forceMount,\r\n groupId,\r\n id: generatedId,\r\n keywords,\r\n ref: itemRef,\r\n textValue,\r\n value,\r\n });\r\n }, [children, disabled, forceMount, generatedId, groupId, keywordSignature, keywords, registerItem, value]);\r\n\r\n React.useEffect(() => {\r\n return () => {\r\n unregisterItem(generatedId);\r\n };\r\n }, [generatedId, unregisterItem]);\r\n\r\n const isVisible = forceMount || !isFiltering || isItemVisible(generatedId);\r\n\r\n if (!isVisible) {\r\n return null;\r\n }\r\n\r\n const isSelected = activeItemId === generatedId;\r\n\r\n return (\r\n <div\r\n {...props}\r\n ref={(node) => {\r\n itemRef.current = node;\r\n assignRef(ref, node);\r\n }}\r\n aria-disabled={disabled || undefined}\r\n aria-selected={isSelected}\r\n className={cn(styles.item, className)}\r\n data-disabled={disabled ? \"true\" : undefined}\r\n data-selected={isSelected ? \"true\" : undefined}\r\n id={generatedId}\r\n onClick={(event) => {\r\n if (disabled) {\r\n event.preventDefault();\r\n return;\r\n }\r\n\r\n selectSpecificItem(generatedId);\r\n onSelect?.(value ?? itemRef.current?.textContent?.trim() ?? \"\");\r\n onClick?.(event);\r\n }}\r\n onKeyDown={(event) => {\r\n if (disabled) {\r\n event.preventDefault();\r\n return;\r\n }\r\n\r\n if (event.key === \"Enter\" || event.key === \" \") {\r\n event.preventDefault();\r\n selectSpecificItem(generatedId);\r\n onSelect?.(value ?? itemRef.current?.textContent?.trim() ?? \"\");\r\n }\r\n }}\r\n onFocus={() => {\r\n if (disabled) {\r\n return;\r\n }\r\n\r\n selectSpecificItem(generatedId);\r\n }}\r\n onMouseEnter={(event) => {\r\n onMouseEnter?.(event);\r\n\r\n if (disabled || disablePointerSelection) {\r\n return;\r\n }\r\n\r\n selectSpecificItem(generatedId);\r\n }}\r\n role='option'\r\n tabIndex={disabled ? -1 : 0}>\r\n {children}\r\n </div>\r\n );\r\n },\r\n);\r\nCommandItem.displayName = \"CommandItem\";\r\n\r\n/**\r\n * Renders auxiliary shortcut text aligned to the edge of a command item.\r\n *\r\n * @remarks\r\n * - Renders a `<span>` element\r\n * - Built as a lightweight presentational helper for command menus\r\n *\r\n * @example\r\n * ```tsx\r\n * <CommandShortcut>⌘K</CommandShortcut>\r\n * ```\r\n *\r\n * @see {@link https://developer.mozilla.org/docs/Web/HTML/Element/span | HTML span element}\r\n */\r\nconst CommandShortcut = ({className, ...props}: Readonly<React.HTMLAttributes<HTMLSpanElement>>): React.JSX.Element => {\r\n return (\r\n <span\r\n className={cn(styles.shortcut, className)}\r\n {...props}\r\n />\r\n );\r\n};\r\nCommandShortcut.displayName = \"CommandShortcut\";\r\n\r\nexport {Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, CommandShortcut};\r\n"],"names":["CommandContext","React","CommandGroupContext","assignRef","ref","value","normalizeCommandValue","defaultCommandFilter","search","keywords","normalizedSearch","normalizedValue","useCommandContext","componentName","context","Error","Command","children","className","_defaultValue","disablePointerSelection","filter","label","loop","onKeyDown","_onValueChange","shouldFilter","_value","_vimBindings","props","activeItemId","setActiveItemId","setSearch","itemOrderRef","itemsRef","Map","itemsVersion","setItemsVersion","listId","registerItem","item","existingItem","nextItem","hasChanged","currentVersion","unregisterItem","itemId","items","firstItem","secondItem","isFiltering","isItemVisible","itemValue","itemFilter","visibleItems","selectableItems","selectSpecificItem","selectNextItem","currentIndex","nextIndex","selectPreviousItem","previousIndex","triggerActiveItem","hasVisibleItemsInGroup","groupId","getVisibleItemCount","contextValue","cn","styles","event","CommandDialog","open","onOpenChange","title","BaseDialog","CommandInput","onChange","onValueChange","isControlled","undefined","inputValue","Search","nextSearchValue","CommandList","CommandEmpty","CommandGroup","forceMount","heading","CommandSeparator","alwaysRender","orientation","BaseSeparator","CommandItem","disabled","onClick","onMouseEnter","onSelect","generatedId","itemRef","keywordSignature","textValue","isVisible","isSelected","node","CommandShortcut"],"mappings":"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"}
|