@arolariu/components 1.0.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 +89 -0
- package/EXAMPLES.md +2510 -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.d.ts +4 -16
- package/dist/components/ui/alert-dialog.d.ts.map +1 -1
- package/dist/components/ui/alert-dialog.js +21 -17
- 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.d.ts +3 -12
- package/dist/components/ui/avatar.d.ts.map +1 -1
- package/dist/components/ui/avatar.js +18 -15
- 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.d.ts +1 -1
- package/dist/components/ui/button-group.d.ts.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 +3 -5
- package/dist/components/ui/calendar.d.ts.map +1 -1
- package/dist/components/ui/calendar.js +9 -9
- 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.d.ts.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 -70
- 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.d.ts +2 -6
- package/dist/components/ui/checkbox-group.d.ts.map +1 -1
- package/dist/components/ui/checkbox-group.js +8 -7
- 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.d.ts +3 -1
- package/dist/components/ui/checkbox.d.ts.map +1 -1
- package/dist/components/ui/checkbox.js +6 -3
- package/dist/components/ui/checkbox.js.map +1 -1
- package/dist/components/ui/checkbox_module.css.map +1 -1
- package/dist/components/ui/collapsible.d.ts.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.d.ts +335 -0
- package/dist/components/ui/combobox.d.ts.map +1 -0
- package/dist/components/ui/combobox.js +206 -0
- package/dist/components/ui/combobox.js.map +1 -0
- package/dist/components/ui/combobox.module.js +23 -0
- package/dist/components/ui/combobox.module.js.map +1 -0
- package/dist/components/ui/combobox_module.css +142 -0
- package/dist/components/ui/combobox_module.css.map +1 -0
- package/dist/components/ui/command.d.ts.map +1 -1
- package/dist/components/ui/command.js +62 -53
- 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.d.ts.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.d.ts.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.d.ts.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.d.ts +10 -16
- package/dist/components/ui/dropdrawer.d.ts.map +1 -1
- package/dist/components/ui/dropdrawer.js +73 -65
- 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.d.ts +1 -1
- package/dist/components/ui/item.d.ts.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.d.ts +11 -13
- package/dist/components/ui/menubar.d.ts.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.d.ts +8 -24
- package/dist/components/ui/meter.d.ts.map +1 -1
- package/dist/components/ui/meter.js +23 -19
- 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.d.ts +3 -12
- package/dist/components/ui/navigation-menu.d.ts.map +1 -1
- package/dist/components/ui/navigation-menu.js +15 -12
- 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.d.ts +6 -12
- package/dist/components/ui/number-field.d.ts.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.d.ts +1 -4
- package/dist/components/ui/progress.d.ts.map +1 -1
- package/dist/components/ui/progress.js +10 -9
- 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.d.ts +2 -4
- package/dist/components/ui/radio-group.d.ts.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.d.ts +1 -1
- package/dist/components/ui/scratcher.d.ts.map +1 -1
- package/dist/components/ui/scratcher.js +5 -4
- package/dist/components/ui/scratcher.js.map +1 -1
- package/dist/components/ui/scratcher_module.css.map +1 -1
- package/dist/components/ui/scroll-area.d.ts +2 -4
- package/dist/components/ui/scroll-area.d.ts.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.d.ts +1 -4
- package/dist/components/ui/separator.d.ts.map +1 -1
- package/dist/components/ui/separator.js +9 -8
- package/dist/components/ui/separator.js.map +1 -1
- package/dist/components/ui/separator_module.css.map +1 -1
- package/dist/components/ui/sheet.d.ts.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.d.ts +1 -1
- package/dist/components/ui/sidebar.d.ts.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} +15 -6
- package/dist/components/ui/toast.d.ts.map +1 -0
- package/dist/components/ui/{sonner.js → toast.js} +43 -42
- 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.d.ts +2 -8
- package/dist/components/ui/toggle-group.d.ts.map +1 -1
- package/dist/components/ui/toggle-group.js +14 -12
- 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.d.ts +10 -30
- package/dist/components/ui/toolbar.d.ts.map +1 -1
- package/dist/components/ui/toolbar.js +28 -23
- 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.d.ts +77 -0
- package/dist/hooks/useClipboard.d.ts.map +1 -0
- package/dist/hooks/useClipboard.js +42 -0
- package/dist/hooks/useClipboard.js.map +1 -0
- package/dist/hooks/useControllableState.d.ts +54 -0
- package/dist/hooks/useControllableState.d.ts.map +1 -0
- package/dist/hooks/useControllableState.js +29 -0
- package/dist/hooks/useControllableState.js.map +1 -0
- package/dist/hooks/useDebounce.d.ts +33 -0
- package/dist/hooks/useDebounce.d.ts.map +1 -0
- package/dist/hooks/useDebounce.js +20 -0
- package/dist/hooks/useDebounce.js.map +1 -0
- package/dist/hooks/useEventCallback.d.ts +34 -0
- package/dist/hooks/useEventCallback.d.ts.map +1 -0
- package/dist/hooks/useEventCallback.js +12 -0
- package/dist/hooks/useEventCallback.js.map +1 -0
- 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.d.ts +30 -0
- package/dist/hooks/useId.d.ts.map +1 -0
- package/dist/hooks/useId.js +9 -0
- package/dist/hooks/useId.js.map +1 -0
- package/dist/hooks/useIntersectionObserver.d.ts +51 -0
- package/dist/hooks/useIntersectionObserver.d.ts.map +1 -0
- package/dist/hooks/useIntersectionObserver.js +25 -0
- package/dist/hooks/useIntersectionObserver.js.map +1 -0
- package/dist/hooks/useInterval.d.ts +55 -0
- package/dist/hooks/useInterval.d.ts.map +1 -0
- package/dist/hooks/useInterval.js +24 -0
- package/dist/hooks/useInterval.js.map +1 -0
- package/dist/hooks/useLocalStorage.d.ts +43 -0
- package/dist/hooks/useLocalStorage.d.ts.map +1 -0
- package/dist/hooks/useLocalStorage.js +53 -0
- package/dist/hooks/useLocalStorage.js.map +1 -0
- package/dist/hooks/useMediaQuery.js +3 -3
- package/dist/hooks/useMediaQuery.js.map +1 -1
- package/dist/hooks/useMergedRefs.d.ts +27 -0
- package/dist/hooks/useMergedRefs.d.ts.map +1 -0
- package/dist/hooks/useMergedRefs.js +11 -0
- package/dist/hooks/useMergedRefs.js.map +1 -0
- package/dist/hooks/useOnClickOutside.d.ts +32 -0
- package/dist/hooks/useOnClickOutside.d.ts.map +1 -0
- package/dist/hooks/useOnClickOutside.js +23 -0
- package/dist/hooks/useOnClickOutside.js.map +1 -0
- package/dist/hooks/usePrevious.d.ts +33 -0
- package/dist/hooks/usePrevious.d.ts.map +1 -0
- package/dist/hooks/usePrevious.js +14 -0
- package/dist/hooks/usePrevious.js.map +1 -0
- package/dist/hooks/useThrottle.d.ts +37 -0
- package/dist/hooks/useThrottle.d.ts.map +1 -0
- package/dist/hooks/useThrottle.js +34 -0
- package/dist/hooks/useThrottle.js.map +1 -0
- package/dist/hooks/useTimeout.d.ts +28 -0
- package/dist/hooks/useTimeout.d.ts.map +1 -0
- package/dist/hooks/useTimeout.js +24 -0
- package/dist/hooks/useTimeout.js.map +1 -0
- package/dist/index.css.map +1 -1
- package/dist/index.d.ts +17 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +15 -1
- package/dist/lib/utilities.d.ts +2 -3
- package/dist/lib/utilities.d.ts.map +1 -1
- package/dist/lib/utilities.js.map +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/dist/motion/tokens.js +5 -5
- package/dist/motion/tokens.js.map +1 -1
- package/package.json +88 -10
- package/src/components/ui/alert-dialog.tsx +15 -8
- package/src/components/ui/avatar.tsx +9 -6
- package/src/components/ui/calendar.tsx +9 -14
- package/src/components/ui/carousel.tsx +2 -0
- package/src/components/ui/chart.tsx +65 -62
- package/src/components/ui/checkbox-group.tsx +4 -5
- package/src/components/ui/checkbox.tsx +10 -2
- package/src/components/ui/collapsible.tsx +1 -0
- package/src/components/ui/combobox.module.css +158 -0
- package/src/components/ui/combobox.tsx +569 -0
- package/src/components/ui/command.tsx +31 -15
- package/src/components/ui/context-menu.tsx +3 -0
- package/src/components/ui/drawer.tsx +2 -0
- package/src/components/ui/dropdown-menu.tsx +3 -0
- package/src/components/ui/dropdrawer.tsx +80 -62
- package/src/components/ui/form.tsx +28 -3
- package/src/components/ui/input-otp.tsx +3 -3
- package/src/components/ui/menubar.tsx +9 -10
- package/src/components/ui/meter.tsx +16 -17
- package/src/components/ui/navigation-menu.tsx +41 -33
- package/src/components/ui/number-field.tsx +6 -13
- package/src/components/ui/progress.tsx +3 -2
- package/src/components/ui/radio-group.tsx +2 -5
- package/src/components/ui/resizable.tsx +15 -18
- package/src/components/ui/scratcher.tsx +6 -10
- package/src/components/ui/scroll-area.tsx +2 -5
- package/src/components/ui/separator.tsx +4 -3
- package/src/components/ui/sheet.tsx +3 -0
- package/src/components/ui/sidebar.tsx +1 -0
- package/src/components/ui/{sonner.module.css → toast.module.css} +1 -1
- package/src/components/ui/{sonner.tsx → toast.tsx} +22 -14
- package/src/components/ui/toggle-group.tsx +6 -4
- package/src/components/ui/toolbar.tsx +20 -21
- package/src/hooks/useClipboard.tsx +137 -0
- package/src/hooks/useControllableState.tsx +81 -0
- package/src/hooks/useDebounce.tsx +50 -0
- package/src/hooks/useEventCallback.tsx +47 -0
- package/src/hooks/useId.tsx +36 -0
- package/src/hooks/useIntersectionObserver.tsx +81 -0
- package/src/hooks/useInterval.tsx +80 -0
- package/src/hooks/useLocalStorage.tsx +111 -0
- package/src/hooks/useMergedRefs.tsx +48 -0
- package/src/hooks/useOnClickOutside.tsx +55 -0
- package/src/hooks/usePrevious.tsx +44 -0
- package/src/hooks/useThrottle.tsx +78 -0
- package/src/hooks/useTimeout.tsx +51 -0
- package/src/index.ts +27 -4
- package/src/lib/utilities.ts +4 -4
- package/src/motion/tokens.ts +4 -4
- package/src/stories/DesignPrinciples.mdx +48 -0
- package/src/stories/GettingStarted.mdx +92 -0
- package/src/stories/Welcome.mdx +44 -0
- 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
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
interface ComboboxProps {
|
|
3
|
+
/**
|
|
4
|
+
* The controlled selected value.
|
|
5
|
+
* @default undefined
|
|
6
|
+
*/
|
|
7
|
+
value?: string;
|
|
8
|
+
/**
|
|
9
|
+
* The default value when uncontrolled.
|
|
10
|
+
* @default ""
|
|
11
|
+
*/
|
|
12
|
+
defaultValue?: string;
|
|
13
|
+
/**
|
|
14
|
+
* Callback fired when the selected value changes.
|
|
15
|
+
* @default undefined
|
|
16
|
+
*/
|
|
17
|
+
onValueChange?: (value: string) => void;
|
|
18
|
+
/**
|
|
19
|
+
* Whether the popover is controlled open state.
|
|
20
|
+
* @default undefined
|
|
21
|
+
*/
|
|
22
|
+
open?: boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Whether the popover is open by default (uncontrolled).
|
|
25
|
+
* @default false
|
|
26
|
+
*/
|
|
27
|
+
defaultOpen?: boolean;
|
|
28
|
+
/**
|
|
29
|
+
* Callback fired when the open state changes.
|
|
30
|
+
* @default undefined
|
|
31
|
+
*/
|
|
32
|
+
onOpenChange?: (open: boolean) => void;
|
|
33
|
+
/**
|
|
34
|
+
* Placeholder text shown when no value is selected.
|
|
35
|
+
* @default "Select an item..."
|
|
36
|
+
*/
|
|
37
|
+
placeholder?: string;
|
|
38
|
+
/**
|
|
39
|
+
* Placeholder text shown in the search input.
|
|
40
|
+
* @default "Search..."
|
|
41
|
+
*/
|
|
42
|
+
searchPlaceholder?: string;
|
|
43
|
+
/**
|
|
44
|
+
* Message shown when no items match the search.
|
|
45
|
+
* @default "No items found."
|
|
46
|
+
*/
|
|
47
|
+
emptyMessage?: string;
|
|
48
|
+
/**
|
|
49
|
+
* Whether the combobox is disabled.
|
|
50
|
+
* @default false
|
|
51
|
+
*/
|
|
52
|
+
disabled?: boolean;
|
|
53
|
+
/**
|
|
54
|
+
* Additional CSS classes merged with the combobox styles.
|
|
55
|
+
* @default undefined
|
|
56
|
+
*/
|
|
57
|
+
className?: string;
|
|
58
|
+
/**
|
|
59
|
+
* Combobox content and items.
|
|
60
|
+
* @default undefined
|
|
61
|
+
*/
|
|
62
|
+
children?: React.ReactNode;
|
|
63
|
+
}
|
|
64
|
+
interface ComboboxTriggerProps {
|
|
65
|
+
/**
|
|
66
|
+
* Additional CSS classes merged with the trigger styles.
|
|
67
|
+
* @default undefined
|
|
68
|
+
*/
|
|
69
|
+
className?: string;
|
|
70
|
+
/**
|
|
71
|
+
* Trigger content. If not provided, shows selected item label or placeholder.
|
|
72
|
+
* @default undefined
|
|
73
|
+
*/
|
|
74
|
+
children?: React.ReactNode;
|
|
75
|
+
}
|
|
76
|
+
interface ComboboxContentProps {
|
|
77
|
+
/**
|
|
78
|
+
* Additional CSS classes merged with the content styles.
|
|
79
|
+
* @default undefined
|
|
80
|
+
*/
|
|
81
|
+
className?: string;
|
|
82
|
+
/**
|
|
83
|
+
* Content children (typically ComboboxItem components).
|
|
84
|
+
* @default undefined
|
|
85
|
+
*/
|
|
86
|
+
children?: React.ReactNode;
|
|
87
|
+
}
|
|
88
|
+
interface ComboboxItemProps {
|
|
89
|
+
/**
|
|
90
|
+
* The value associated with this item.
|
|
91
|
+
*/
|
|
92
|
+
value: string;
|
|
93
|
+
/**
|
|
94
|
+
* Additional CSS classes merged with the item styles.
|
|
95
|
+
* @default undefined
|
|
96
|
+
*/
|
|
97
|
+
className?: string;
|
|
98
|
+
/**
|
|
99
|
+
* Item content (label).
|
|
100
|
+
* @default undefined
|
|
101
|
+
*/
|
|
102
|
+
children?: React.ReactNode;
|
|
103
|
+
/**
|
|
104
|
+
* Whether the item is disabled.
|
|
105
|
+
* @default false
|
|
106
|
+
*/
|
|
107
|
+
disabled?: boolean;
|
|
108
|
+
/**
|
|
109
|
+
* Callback fired when the item is selected.
|
|
110
|
+
* @default undefined
|
|
111
|
+
*/
|
|
112
|
+
onSelect?: (value: string) => void;
|
|
113
|
+
/**
|
|
114
|
+
* Additional search keywords for filtering.
|
|
115
|
+
* @default []
|
|
116
|
+
*/
|
|
117
|
+
keywords?: string[];
|
|
118
|
+
}
|
|
119
|
+
interface ComboboxEmptyProps {
|
|
120
|
+
/**
|
|
121
|
+
* Additional CSS classes merged with the empty state styles.
|
|
122
|
+
* @default undefined
|
|
123
|
+
*/
|
|
124
|
+
className?: string;
|
|
125
|
+
/**
|
|
126
|
+
* Content shown when no items match. Defaults to context emptyMessage.
|
|
127
|
+
* @default undefined
|
|
128
|
+
*/
|
|
129
|
+
children?: React.ReactNode;
|
|
130
|
+
}
|
|
131
|
+
interface ComboboxGroupProps {
|
|
132
|
+
/**
|
|
133
|
+
* Group heading text.
|
|
134
|
+
* @default undefined
|
|
135
|
+
*/
|
|
136
|
+
heading?: string;
|
|
137
|
+
/**
|
|
138
|
+
* Additional CSS classes merged with the group styles.
|
|
139
|
+
* @default undefined
|
|
140
|
+
*/
|
|
141
|
+
className?: string;
|
|
142
|
+
/**
|
|
143
|
+
* Group items.
|
|
144
|
+
* @default undefined
|
|
145
|
+
*/
|
|
146
|
+
children?: React.ReactNode;
|
|
147
|
+
}
|
|
148
|
+
interface ComboboxSeparatorProps {
|
|
149
|
+
/**
|
|
150
|
+
* Additional CSS classes merged with the separator styles.
|
|
151
|
+
* @default undefined
|
|
152
|
+
*/
|
|
153
|
+
className?: string;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* A searchable select component combining Command, Popover, and Button.
|
|
157
|
+
*
|
|
158
|
+
* @remarks
|
|
159
|
+
* - Composes Command (search), Popover (positioning), and Button (trigger)
|
|
160
|
+
* - Supports both controlled and uncontrolled modes
|
|
161
|
+
* - Provides keyboard navigation and filtering
|
|
162
|
+
* - Built with Base UI primitives and CSS Modules
|
|
163
|
+
*
|
|
164
|
+
* @example Basic usage
|
|
165
|
+
* ```tsx
|
|
166
|
+
* <Combobox value={value} onValueChange={setValue}>
|
|
167
|
+
* <ComboboxTrigger />
|
|
168
|
+
* <ComboboxContent>
|
|
169
|
+
* <ComboboxItem value="apple">Apple</ComboboxItem>
|
|
170
|
+
* <ComboboxItem value="banana">Banana</ComboboxItem>
|
|
171
|
+
* </ComboboxContent>
|
|
172
|
+
* </Combobox>
|
|
173
|
+
* ```
|
|
174
|
+
*
|
|
175
|
+
* @example With groups
|
|
176
|
+
* ```tsx
|
|
177
|
+
* <Combobox>
|
|
178
|
+
* <ComboboxTrigger />
|
|
179
|
+
* <ComboboxContent>
|
|
180
|
+
* <ComboboxGroup heading="Fruits">
|
|
181
|
+
* <ComboboxItem value="apple">Apple</ComboboxItem>
|
|
182
|
+
* </ComboboxGroup>
|
|
183
|
+
* <ComboboxSeparator />
|
|
184
|
+
* <ComboboxGroup heading="Vegetables">
|
|
185
|
+
* <ComboboxItem value="carrot">Carrot</ComboboxItem>
|
|
186
|
+
* </ComboboxGroup>
|
|
187
|
+
* </ComboboxContent>
|
|
188
|
+
* </Combobox>
|
|
189
|
+
* ```
|
|
190
|
+
*/
|
|
191
|
+
declare function Combobox(props: Readonly<Combobox.Props>): React.ReactElement;
|
|
192
|
+
declare namespace Combobox {
|
|
193
|
+
var displayName: string;
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Button that opens and closes the combobox popover.
|
|
197
|
+
*
|
|
198
|
+
* @remarks
|
|
199
|
+
* - Renders as a Button with trigger behavior
|
|
200
|
+
* - Shows selected item label or placeholder
|
|
201
|
+
* - Supports custom children or auto-display
|
|
202
|
+
*
|
|
203
|
+
* @example Basic usage
|
|
204
|
+
* ```tsx
|
|
205
|
+
* <ComboboxTrigger />
|
|
206
|
+
* ```
|
|
207
|
+
*
|
|
208
|
+
* @example Custom content
|
|
209
|
+
* ```tsx
|
|
210
|
+
* <ComboboxTrigger>
|
|
211
|
+
* {selectedLabel || "Choose..."}
|
|
212
|
+
* </ComboboxTrigger>
|
|
213
|
+
* ```
|
|
214
|
+
*/
|
|
215
|
+
declare const ComboboxTrigger: React.ForwardRefExoticComponent<ComboboxTriggerProps & React.RefAttributes<HTMLButtonElement>>;
|
|
216
|
+
/**
|
|
217
|
+
* The popover content containing the searchable command list.
|
|
218
|
+
*
|
|
219
|
+
* @remarks
|
|
220
|
+
* - Wraps Command with Popover positioning
|
|
221
|
+
* - Includes search input and items list
|
|
222
|
+
* - Automatically closes on item selection
|
|
223
|
+
*
|
|
224
|
+
* @example Basic usage
|
|
225
|
+
* ```tsx
|
|
226
|
+
* <ComboboxContent>
|
|
227
|
+
* <ComboboxItem value="item1">Item 1</ComboboxItem>
|
|
228
|
+
* </ComboboxContent>
|
|
229
|
+
* ```
|
|
230
|
+
*/
|
|
231
|
+
declare const ComboboxContent: React.ForwardRefExoticComponent<ComboboxContentProps & React.RefAttributes<HTMLDivElement>>;
|
|
232
|
+
/**
|
|
233
|
+
* A selectable item within the combobox.
|
|
234
|
+
*
|
|
235
|
+
* @remarks
|
|
236
|
+
* - Uses CommandItem internally
|
|
237
|
+
* - Shows check icon when selected
|
|
238
|
+
* - Closes popover on selection
|
|
239
|
+
*
|
|
240
|
+
* @example Basic usage
|
|
241
|
+
* ```tsx
|
|
242
|
+
* <ComboboxItem value="apple">Apple</ComboboxItem>
|
|
243
|
+
* ```
|
|
244
|
+
*
|
|
245
|
+
* @example With custom select handler
|
|
246
|
+
* ```tsx
|
|
247
|
+
* <ComboboxItem
|
|
248
|
+
* value="apple"
|
|
249
|
+
* onSelect={(value) => console.log("Selected:", value)}
|
|
250
|
+
* >
|
|
251
|
+
* Apple
|
|
252
|
+
* </ComboboxItem>
|
|
253
|
+
* ```
|
|
254
|
+
*/
|
|
255
|
+
declare function ComboboxItem(props: Readonly<ComboboxItem.Props>): React.ReactElement;
|
|
256
|
+
declare namespace ComboboxItem {
|
|
257
|
+
var displayName: string;
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Message shown when search returns no results.
|
|
261
|
+
*
|
|
262
|
+
* @remarks
|
|
263
|
+
* - Uses CommandEmpty internally
|
|
264
|
+
* - Defaults to context emptyMessage
|
|
265
|
+
*
|
|
266
|
+
* @example Basic usage
|
|
267
|
+
* ```tsx
|
|
268
|
+
* <ComboboxEmpty />
|
|
269
|
+
* ```
|
|
270
|
+
*
|
|
271
|
+
* @example Custom message
|
|
272
|
+
* ```tsx
|
|
273
|
+
* <ComboboxEmpty>Nothing found</ComboboxEmpty>
|
|
274
|
+
* ```
|
|
275
|
+
*/
|
|
276
|
+
declare function ComboboxEmpty(props: Readonly<ComboboxEmpty.Props>): React.ReactElement;
|
|
277
|
+
declare namespace ComboboxEmpty {
|
|
278
|
+
var displayName: string;
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Groups related combobox items with an optional heading.
|
|
282
|
+
*
|
|
283
|
+
* @remarks
|
|
284
|
+
* - Uses CommandGroup internally
|
|
285
|
+
* - Supports visual grouping with headings
|
|
286
|
+
*
|
|
287
|
+
* @example Basic usage
|
|
288
|
+
* ```tsx
|
|
289
|
+
* <ComboboxGroup heading="Fruits">
|
|
290
|
+
* <ComboboxItem value="apple">Apple</ComboboxItem>
|
|
291
|
+
* </ComboboxGroup>
|
|
292
|
+
* ```
|
|
293
|
+
*/
|
|
294
|
+
declare function ComboboxGroup(props: Readonly<ComboboxGroup.Props>): React.ReactElement;
|
|
295
|
+
declare namespace ComboboxGroup {
|
|
296
|
+
var displayName: string;
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* Visual separator between combobox groups.
|
|
300
|
+
*
|
|
301
|
+
* @remarks
|
|
302
|
+
* - Uses CommandSeparator internally
|
|
303
|
+
*
|
|
304
|
+
* @example Basic usage
|
|
305
|
+
* ```tsx
|
|
306
|
+
* <ComboboxSeparator />
|
|
307
|
+
* ```
|
|
308
|
+
*/
|
|
309
|
+
declare function ComboboxSeparator(props: Readonly<ComboboxSeparator.Props>): React.ReactElement;
|
|
310
|
+
declare namespace ComboboxSeparator {
|
|
311
|
+
var displayName: string;
|
|
312
|
+
}
|
|
313
|
+
declare namespace Combobox {
|
|
314
|
+
type Props = ComboboxProps;
|
|
315
|
+
}
|
|
316
|
+
declare namespace ComboboxTrigger {
|
|
317
|
+
type Props = ComboboxTriggerProps;
|
|
318
|
+
}
|
|
319
|
+
declare namespace ComboboxContent {
|
|
320
|
+
type Props = ComboboxContentProps;
|
|
321
|
+
}
|
|
322
|
+
declare namespace ComboboxItem {
|
|
323
|
+
type Props = ComboboxItemProps;
|
|
324
|
+
}
|
|
325
|
+
declare namespace ComboboxEmpty {
|
|
326
|
+
type Props = ComboboxEmptyProps;
|
|
327
|
+
}
|
|
328
|
+
declare namespace ComboboxGroup {
|
|
329
|
+
type Props = ComboboxGroupProps;
|
|
330
|
+
}
|
|
331
|
+
declare namespace ComboboxSeparator {
|
|
332
|
+
type Props = ComboboxSeparatorProps;
|
|
333
|
+
}
|
|
334
|
+
export { Combobox, ComboboxContent, ComboboxEmpty, ComboboxGroup, ComboboxItem, ComboboxSeparator, ComboboxTrigger };
|
|
335
|
+
//# sourceMappingURL=combobox.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"combobox.d.ts","sourceRoot":"","sources":["../../../src/components/ui/combobox.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { Check, ChevronsUpDown } from "lucide-react";
|
|
4
|
+
import { useControllableState } from "../../hooks/useControllableState.js";
|
|
5
|
+
import { cn } from "../../lib/utilities.js";
|
|
6
|
+
import { Button } from "./button.js";
|
|
7
|
+
import { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator } from "./command.js";
|
|
8
|
+
import { Popover, PopoverContent, PopoverTrigger } from "./popover.js";
|
|
9
|
+
import combobox_module from "./combobox.module.js";
|
|
10
|
+
import * as __rspack_external_react from "react";
|
|
11
|
+
const ComboboxContext = /*#__PURE__*/ __rspack_external_react.createContext(null);
|
|
12
|
+
function useComboboxContext(componentName) {
|
|
13
|
+
const context = __rspack_external_react.useContext(ComboboxContext);
|
|
14
|
+
if (!context) throw new Error(`${componentName} must be used within Combobox.`);
|
|
15
|
+
return context;
|
|
16
|
+
}
|
|
17
|
+
function Combobox(props) {
|
|
18
|
+
const { value: controlledValue, defaultValue = "", onValueChange, open: controlledOpen, defaultOpen = false, onOpenChange, placeholder = "Select an item...", searchPlaceholder = "Search...", emptyMessage = "No items found.", disabled = false, className, children } = props;
|
|
19
|
+
const [value, setValue] = useControllableState({
|
|
20
|
+
controlled: controlledValue,
|
|
21
|
+
defaultValue,
|
|
22
|
+
onChange: onValueChange
|
|
23
|
+
});
|
|
24
|
+
const [open, setOpen] = useControllableState({
|
|
25
|
+
controlled: controlledOpen,
|
|
26
|
+
defaultValue: defaultOpen,
|
|
27
|
+
onChange: onOpenChange
|
|
28
|
+
});
|
|
29
|
+
const itemLabelsRef = __rspack_external_react.useRef(new Map());
|
|
30
|
+
const registerItem = __rspack_external_react.useCallback((itemValue, label)=>{
|
|
31
|
+
itemLabelsRef.current.set(itemValue, label);
|
|
32
|
+
}, []);
|
|
33
|
+
const unregisterItem = __rspack_external_react.useCallback((itemValue)=>{
|
|
34
|
+
itemLabelsRef.current.delete(itemValue);
|
|
35
|
+
}, []);
|
|
36
|
+
const contextValue = __rspack_external_react.useMemo(()=>({
|
|
37
|
+
value,
|
|
38
|
+
onValueChange: setValue,
|
|
39
|
+
open,
|
|
40
|
+
setOpen,
|
|
41
|
+
placeholder,
|
|
42
|
+
searchPlaceholder,
|
|
43
|
+
emptyMessage,
|
|
44
|
+
disabled,
|
|
45
|
+
itemLabels: itemLabelsRef.current,
|
|
46
|
+
registerItem,
|
|
47
|
+
unregisterItem
|
|
48
|
+
}), [
|
|
49
|
+
value,
|
|
50
|
+
setValue,
|
|
51
|
+
open,
|
|
52
|
+
setOpen,
|
|
53
|
+
placeholder,
|
|
54
|
+
searchPlaceholder,
|
|
55
|
+
emptyMessage,
|
|
56
|
+
disabled,
|
|
57
|
+
registerItem,
|
|
58
|
+
unregisterItem
|
|
59
|
+
]);
|
|
60
|
+
return /*#__PURE__*/ jsx(ComboboxContext.Provider, {
|
|
61
|
+
value: contextValue,
|
|
62
|
+
children: /*#__PURE__*/ jsx(Popover, {
|
|
63
|
+
open: open,
|
|
64
|
+
onOpenChange: setOpen,
|
|
65
|
+
children: /*#__PURE__*/ jsx("div", {
|
|
66
|
+
className: cn(combobox_module.combobox, className),
|
|
67
|
+
children: children
|
|
68
|
+
})
|
|
69
|
+
})
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
Combobox.displayName = "Combobox";
|
|
73
|
+
const ComboboxTrigger = /*#__PURE__*/ __rspack_external_react.forwardRef((props, ref)=>{
|
|
74
|
+
const { className, children } = props;
|
|
75
|
+
const { open, setOpen, value, placeholder, disabled, itemLabels } = useComboboxContext("ComboboxTrigger");
|
|
76
|
+
const [, forceUpdate] = __rspack_external_react.useReducer((x)=>x + 1, 0);
|
|
77
|
+
__rspack_external_react.useEffect(()=>{
|
|
78
|
+
forceUpdate();
|
|
79
|
+
}, [
|
|
80
|
+
value
|
|
81
|
+
]);
|
|
82
|
+
const selectedLabel = itemLabels.get(value) || "";
|
|
83
|
+
return /*#__PURE__*/ jsx(PopoverTrigger, {
|
|
84
|
+
asChild: true,
|
|
85
|
+
children: /*#__PURE__*/ jsx(Button, {
|
|
86
|
+
ref: ref,
|
|
87
|
+
variant: "outline",
|
|
88
|
+
role: "combobox",
|
|
89
|
+
"aria-expanded": open,
|
|
90
|
+
disabled: disabled,
|
|
91
|
+
className: cn(combobox_module.trigger, className),
|
|
92
|
+
onClick: ()=>setOpen(!open),
|
|
93
|
+
children: children ?? /*#__PURE__*/ jsxs(Fragment, {
|
|
94
|
+
children: [
|
|
95
|
+
/*#__PURE__*/ jsx("span", {
|
|
96
|
+
className: cn(combobox_module.triggerValue, !selectedLabel && combobox_module.triggerPlaceholder),
|
|
97
|
+
children: selectedLabel || placeholder
|
|
98
|
+
}),
|
|
99
|
+
/*#__PURE__*/ jsx(ChevronsUpDown, {
|
|
100
|
+
className: combobox_module.triggerIcon
|
|
101
|
+
})
|
|
102
|
+
]
|
|
103
|
+
})
|
|
104
|
+
})
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
ComboboxTrigger.displayName = "ComboboxTrigger";
|
|
108
|
+
const ComboboxContent = /*#__PURE__*/ __rspack_external_react.forwardRef((props, ref)=>{
|
|
109
|
+
const { className, children } = props;
|
|
110
|
+
const { searchPlaceholder } = useComboboxContext("ComboboxContent");
|
|
111
|
+
return /*#__PURE__*/ jsx(PopoverContent, {
|
|
112
|
+
ref: ref,
|
|
113
|
+
className: cn(combobox_module.content, className),
|
|
114
|
+
sideOffset: 4,
|
|
115
|
+
children: /*#__PURE__*/ jsxs(Command, {
|
|
116
|
+
className: combobox_module.command,
|
|
117
|
+
children: [
|
|
118
|
+
/*#__PURE__*/ jsx(CommandInput, {
|
|
119
|
+
placeholder: searchPlaceholder,
|
|
120
|
+
className: combobox_module.commandInput
|
|
121
|
+
}),
|
|
122
|
+
/*#__PURE__*/ jsxs(CommandList, {
|
|
123
|
+
className: combobox_module.commandList,
|
|
124
|
+
children: [
|
|
125
|
+
/*#__PURE__*/ jsx(ComboboxEmpty, {}),
|
|
126
|
+
children
|
|
127
|
+
]
|
|
128
|
+
})
|
|
129
|
+
]
|
|
130
|
+
})
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
ComboboxContent.displayName = "ComboboxContent";
|
|
134
|
+
function ComboboxItem(props) {
|
|
135
|
+
const { value: itemValue, className, children, disabled = false, onSelect, keywords = [] } = props;
|
|
136
|
+
const { value: selectedValue, onValueChange, setOpen, registerItem, unregisterItem } = useComboboxContext("ComboboxItem");
|
|
137
|
+
const isSelected = selectedValue === itemValue;
|
|
138
|
+
const label = "string" == typeof children ? children : itemValue;
|
|
139
|
+
__rspack_external_react.useEffect(()=>{
|
|
140
|
+
registerItem(itemValue, label);
|
|
141
|
+
return ()=>{
|
|
142
|
+
unregisterItem(itemValue);
|
|
143
|
+
};
|
|
144
|
+
}, [
|
|
145
|
+
itemValue,
|
|
146
|
+
label,
|
|
147
|
+
registerItem,
|
|
148
|
+
unregisterItem
|
|
149
|
+
]);
|
|
150
|
+
const handleSelect = __rspack_external_react.useCallback((currentValue)=>{
|
|
151
|
+
const newValue = currentValue === selectedValue ? "" : currentValue;
|
|
152
|
+
onValueChange(newValue);
|
|
153
|
+
setOpen(false);
|
|
154
|
+
onSelect?.(newValue);
|
|
155
|
+
}, [
|
|
156
|
+
selectedValue,
|
|
157
|
+
onValueChange,
|
|
158
|
+
setOpen,
|
|
159
|
+
onSelect
|
|
160
|
+
]);
|
|
161
|
+
return /*#__PURE__*/ jsxs(CommandItem, {
|
|
162
|
+
value: itemValue,
|
|
163
|
+
disabled: disabled,
|
|
164
|
+
onSelect: handleSelect,
|
|
165
|
+
keywords: keywords,
|
|
166
|
+
className: cn(combobox_module.item, isSelected && combobox_module.itemSelected, className),
|
|
167
|
+
children: [
|
|
168
|
+
/*#__PURE__*/ jsx(Check, {
|
|
169
|
+
className: cn(combobox_module.itemCheck, isSelected && combobox_module.itemCheckVisible)
|
|
170
|
+
}),
|
|
171
|
+
/*#__PURE__*/ jsx("span", {
|
|
172
|
+
className: combobox_module.itemLabel,
|
|
173
|
+
children: children
|
|
174
|
+
})
|
|
175
|
+
]
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
ComboboxItem.displayName = "ComboboxItem";
|
|
179
|
+
function ComboboxEmpty(props) {
|
|
180
|
+
const { className, children } = props;
|
|
181
|
+
const { emptyMessage } = useComboboxContext("ComboboxEmpty");
|
|
182
|
+
return /*#__PURE__*/ jsx(CommandEmpty, {
|
|
183
|
+
className: cn(combobox_module.empty, className),
|
|
184
|
+
children: children ?? emptyMessage
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
ComboboxEmpty.displayName = "ComboboxEmpty";
|
|
188
|
+
function ComboboxGroup(props) {
|
|
189
|
+
const { heading, className, children } = props;
|
|
190
|
+
return /*#__PURE__*/ jsx(CommandGroup, {
|
|
191
|
+
heading: heading,
|
|
192
|
+
className: cn(combobox_module.group, className),
|
|
193
|
+
children: children
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
ComboboxGroup.displayName = "ComboboxGroup";
|
|
197
|
+
function ComboboxSeparator(props) {
|
|
198
|
+
const { className } = props;
|
|
199
|
+
return /*#__PURE__*/ jsx(CommandSeparator, {
|
|
200
|
+
className: cn(combobox_module.separator, className)
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
ComboboxSeparator.displayName = "ComboboxSeparator";
|
|
204
|
+
export { Combobox, ComboboxContent, ComboboxEmpty, ComboboxGroup, ComboboxItem, ComboboxSeparator, ComboboxTrigger };
|
|
205
|
+
|
|
206
|
+
//# sourceMappingURL=combobox.js.map
|
|
@@ -0,0 +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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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import "./combobox_module.css";
|
|
2
|
+
const combobox_module = {
|
|
3
|
+
combobox: "combobox-wmFvJE",
|
|
4
|
+
trigger: "trigger-asByxe",
|
|
5
|
+
triggerValue: "triggerValue-s6rRGO",
|
|
6
|
+
triggerPlaceholder: "triggerPlaceholder-T2THwp",
|
|
7
|
+
triggerIcon: "triggerIcon-Z1UTU8",
|
|
8
|
+
content: "content-uE5DAH",
|
|
9
|
+
command: "command-cdXzEx",
|
|
10
|
+
commandInput: "commandInput-s91u2v",
|
|
11
|
+
commandList: "commandList-YCmDON",
|
|
12
|
+
item: "item-ThEyJB",
|
|
13
|
+
itemSelected: "itemSelected-JsUZAF",
|
|
14
|
+
itemCheck: "itemCheck-j350UO",
|
|
15
|
+
itemCheckVisible: "itemCheckVisible-QMieBm",
|
|
16
|
+
itemLabel: "itemLabel-wCtpTY",
|
|
17
|
+
empty: "empty-EEImeI",
|
|
18
|
+
group: "group-w7Vcxw",
|
|
19
|
+
separator: "separator-nkP8ud"
|
|
20
|
+
};
|
|
21
|
+
export default combobox_module;
|
|
22
|
+
|
|
23
|
+
//# sourceMappingURL=combobox.module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"components/ui/combobox.module.js","sources":["../../../src/components/ui/combobox.module.css"],"sourcesContent":["// extracted by LIB_CSS_EXTRACT_LOADER\nimport \"./combobox_module.css\"\nexport default {\"combobox\":\"combobox-wmFvJE\",\"trigger\":\"trigger-asByxe\",\"triggerValue\":\"triggerValue-s6rRGO\",\"triggerPlaceholder\":\"triggerPlaceholder-T2THwp\",\"triggerIcon\":\"triggerIcon-Z1UTU8\",\"content\":\"content-uE5DAH\",\"command\":\"command-cdXzEx\",\"commandInput\":\"commandInput-s91u2v\",\"commandList\":\"commandList-YCmDON\",\"item\":\"item-ThEyJB\",\"itemSelected\":\"itemSelected-JsUZAF\",\"itemCheck\":\"itemCheck-j350UO\",\"itemCheckVisible\":\"itemCheckVisible-QMieBm\",\"itemLabel\":\"itemLabel-wCtpTY\",\"empty\":\"empty-EEImeI\",\"group\":\"group-w7Vcxw\",\"separator\":\"separator-nkP8ud\"};"],"names":[],"mappings":";AAEA,wBAAe;IAAC,UAAW;IAAkB,SAAU;IAAiB,cAAe;IAAsB,oBAAqB;IAA4B,aAAc;IAAqB,SAAU;IAAiB,SAAU;IAAiB,cAAe;IAAsB,aAAc;IAAqB,MAAO;IAAc,cAAe;IAAsB,WAAY;IAAmB,kBAAmB;IAA0B,WAAY;IAAmB,OAAQ;IAAe,OAAQ;IAAe,WAAY;AAAkB"}
|