@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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"components/ui/dropdrawer.js","sources":["../../../src/components/ui/dropdrawer.tsx"],"sourcesContent":["\"use client\";\r\n\r\n/* eslint-disable react/no-children-prop, react-x/no-children-for-each, react-x/no-children-map, react-x/no-children-to-array, react-x/no-clone-element, sonarjs/function-return-type, sonarjs/no-identical-functions, sonarjs/no-unused-vars, max-lines, unicorn/no-array-callback-reference, unicorn/no-useless-undefined, unicorn/prefer-at, unicorn/prefer-dom-node-dataset, jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions */\r\n\r\nimport {Drawer as BaseDrawer} from \"@base-ui/react/drawer\";\r\nimport {Menu as BaseMenu} from \"@base-ui/react/menu\";\r\nimport {mergeProps} from \"@base-ui/react/merge-props\";\r\nimport {useRender} from \"@base-ui/react/use-render\";\r\nimport {ChevronLeftIcon, ChevronRightIcon} from \"lucide-react\";\r\nimport {AnimatePresence, motion, type Transition} from \"motion/react\";\r\nimport * as React from \"react\";\r\n\r\nimport {useIsMobile} from \"@/hooks/useIsMobile\";\r\nimport {cn} from \"@/lib/utilities\";\r\nimport styles from \"./dropdrawer.module.css\";\r\n\r\nconst MOBILE_MENU_TITLE = \"Menu\";\r\nconst MOBILE_SUBMENU_TITLE = \"Submenu\";\r\nconst MOBILE_BACK_LABEL = \"Go back\";\r\n\r\ninterface DropDrawerContextValue {\r\n isMobile: boolean;\r\n}\r\n\r\nconst DropDrawerContext = React.createContext<DropDrawerContextValue | null>(null);\r\n\r\nconst useDropDrawerContext = (): DropDrawerContextValue => {\r\n const context = React.useContext(DropDrawerContext);\r\n\r\n if (context === null) {\r\n throw new Error(\"DropDrawer components cannot be rendered outside the Context\");\r\n }\r\n\r\n return context;\r\n};\r\n\r\nconst Drawer = BaseDrawer.Root;\r\nconst DrawerPortal = BaseDrawer.Portal;\r\n\r\nfunction DrawerTrigger(props: Readonly<React.ComponentPropsWithRef<typeof BaseDrawer.Trigger> & {asChild?: boolean}>): React.ReactElement {\r\n const {asChild = false, children, className, render, ...otherProps} = props;\r\n const renderProp = asChild && React.isValidElement(children) ? children : render;\r\n\r\n return (\r\n <BaseDrawer.Trigger\r\n {...otherProps}\r\n render={useRender({\r\n defaultTagName: \"button\",\r\n render: renderProp as never,\r\n props: mergeProps({className}, {}),\r\n })}>\r\n {renderProp ? undefined : children}\r\n </BaseDrawer.Trigger>\r\n );\r\n}\r\n\r\nfunction DrawerOverlay(props: Readonly<React.ComponentPropsWithRef<typeof BaseDrawer.Backdrop>>): React.ReactElement {\r\n const {className, render, ...otherProps} = props;\r\n\r\n return (\r\n <BaseDrawer.Backdrop\r\n {...otherProps}\r\n render={useRender({\r\n defaultTagName: \"div\",\r\n render: render as never,\r\n props: mergeProps({className: cn(styles.drawerOverlay, className)}, {}),\r\n })}\r\n />\r\n );\r\n}\r\n\r\nfunction DrawerContent(\r\n props: Readonly<React.ComponentPropsWithRef<typeof BaseDrawer.Popup> & {children?: React.ReactNode}>,\r\n): React.ReactElement {\r\n const {className, children, render, ...otherProps} = props;\r\n\r\n return (\r\n <DrawerPortal>\r\n <DrawerOverlay />\r\n <BaseDrawer.Viewport className={styles.drawerViewport}>\r\n <BaseDrawer.Popup\r\n {...otherProps}\r\n render={useRender({\r\n defaultTagName: \"div\",\r\n render: render as never,\r\n props: mergeProps({className: cn(styles.drawerContent, className)}, {}),\r\n })}>\r\n <div className={styles.drawerHandle} />\r\n <BaseDrawer.Content className={styles.drawerInnerContent}>{children}</BaseDrawer.Content>\r\n </BaseDrawer.Popup>\r\n </BaseDrawer.Viewport>\r\n </DrawerPortal>\r\n );\r\n}\r\n\r\nfunction DrawerHeader(\r\n props: Readonly<React.ComponentPropsWithRef<\"div\"> & {render?: useRender.RenderProp<Record<string, never>>}>,\r\n): React.ReactElement {\r\n const {className, children, render, ...otherProps} = props;\r\n\r\n return useRender({\r\n defaultTagName: \"div\",\r\n render: render as never,\r\n props: mergeProps({className: cn(styles.drawerHeader, className)}, otherProps, {children}),\r\n });\r\n}\r\n\r\nfunction DrawerFooter(\r\n props: Readonly<React.ComponentPropsWithRef<\"div\"> & {render?: useRender.RenderProp<Record<string, never>>}>,\r\n): React.ReactElement {\r\n const {className, children, render, ...otherProps} = props;\r\n\r\n return useRender({\r\n defaultTagName: \"div\",\r\n render: render as never,\r\n props: mergeProps({className: cn(styles.drawerFooter, className)}, otherProps, {children}),\r\n });\r\n}\r\n\r\nfunction DrawerTitle(props: Readonly<React.ComponentPropsWithRef<typeof BaseDrawer.Title>>): React.ReactElement {\r\n const {className, children, render, ...otherProps} = props;\r\n\r\n return (\r\n <BaseDrawer.Title\r\n {...otherProps}\r\n render={useRender({\r\n defaultTagName: \"h2\",\r\n render: render as never,\r\n props: mergeProps({className: cn(styles.drawerTitle, className)}, {}),\r\n })}>\r\n {children}\r\n </BaseDrawer.Title>\r\n );\r\n}\r\n\r\nconst DropdownMenu = BaseMenu.Root;\r\nconst DropdownMenuSub = BaseMenu.SubmenuRoot;\r\n\r\nfunction DropdownMenuTrigger(\r\n props: Readonly<React.ComponentPropsWithRef<typeof BaseMenu.Trigger> & {asChild?: boolean}>,\r\n): React.ReactElement {\r\n const {asChild = false, children, className, render, ...otherProps} = props;\r\n const renderProp = asChild && React.isValidElement(children) ? children : render;\r\n\r\n return (\r\n <BaseMenu.Trigger\r\n {...otherProps}\r\n render={useRender({\r\n defaultTagName: \"button\",\r\n render: renderProp as never,\r\n props: mergeProps({className}, {}),\r\n })}>\r\n {renderProp ? undefined : children}\r\n </BaseMenu.Trigger>\r\n );\r\n}\r\n\r\nfunction DropdownMenuContent(\r\n props: Readonly<React.ComponentPropsWithRef<typeof BaseMenu.Positioner> & {children?: React.ReactNode}>,\r\n): React.ReactElement {\r\n const {className, children, render, ...otherProps} = props;\r\n\r\n return (\r\n <BaseMenu.Portal>\r\n <BaseMenu.Positioner\r\n {...otherProps}\r\n render={useRender({\r\n defaultTagName: \"div\",\r\n props: mergeProps({className: styles.dropdownPositioner}, {}),\r\n })}>\r\n <BaseMenu.Popup\r\n render={useRender({\r\n defaultTagName: \"div\",\r\n render: render as never,\r\n props: mergeProps({className: cn(styles.dropdownContent, className)}, {}),\r\n })}>\r\n {children}\r\n </BaseMenu.Popup>\r\n </BaseMenu.Positioner>\r\n </BaseMenu.Portal>\r\n );\r\n}\r\n\r\ninterface DropdownMenuItemProps extends React.ComponentPropsWithRef<typeof BaseMenu.Item> {\r\n /** @deprecated Prefer Base UI's `render` prop. */\r\n asChild?: boolean;\r\n /**\r\n * Whether to apply inset spacing to align with grouped menu content.\r\n * @default false\r\n */\r\n inset?: boolean;\r\n}\r\n\r\nfunction DropdownMenuItem(props: Readonly<DropdownMenuItemProps>): React.ReactElement {\r\n const {asChild = false, children, className, inset = false, render, ...otherProps} = props;\r\n const renderProp = asChild && React.isValidElement(children) ? children : render;\r\n\r\n return (\r\n <BaseMenu.Item\r\n {...otherProps}\r\n render={useRender({\r\n defaultTagName: \"div\",\r\n render: renderProp as never,\r\n props: mergeProps({className: cn(styles.desktopItem, inset && styles.inset, className)}, {}),\r\n })}>\r\n {renderProp ? undefined : children}\r\n </BaseMenu.Item>\r\n );\r\n}\r\n\r\nfunction DropdownMenuLabel(props: Readonly<React.ComponentPropsWithRef<typeof BaseMenu.GroupLabel>>): React.ReactElement {\r\n const {className, children, render, ...otherProps} = props;\r\n\r\n return (\r\n <BaseMenu.GroupLabel\r\n {...otherProps}\r\n render={useRender({\r\n defaultTagName: \"div\",\r\n render: render as never,\r\n props: mergeProps({className: cn(styles.desktopLabel, className)}, {}),\r\n })}>\r\n {children}\r\n </BaseMenu.GroupLabel>\r\n );\r\n}\r\n\r\nfunction DropdownMenuSeparator(props: Readonly<React.ComponentPropsWithRef<typeof BaseMenu.Separator>>): React.ReactElement {\r\n const {className, render, ...otherProps} = props;\r\n\r\n return (\r\n <BaseMenu.Separator\r\n {...otherProps}\r\n render={useRender({\r\n defaultTagName: \"div\",\r\n render: render as never,\r\n props: mergeProps({className: cn(styles.desktopSeparator, className)}, {}),\r\n })}\r\n />\r\n );\r\n}\r\n\r\nfunction DropdownMenuSubTrigger(\r\n props: Readonly<React.ComponentPropsWithRef<typeof BaseMenu.SubmenuTrigger> & {inset?: boolean}>,\r\n): React.ReactElement {\r\n const {className, children, inset = false, render, ...otherProps} = props;\r\n\r\n return (\r\n <BaseMenu.SubmenuTrigger\r\n {...otherProps}\r\n render={useRender({\r\n defaultTagName: \"div\",\r\n render: render as never,\r\n props: mergeProps({className: cn(styles.desktopSubTrigger, inset && styles.inset, className)}, {}),\r\n })}>\r\n {children}\r\n <ChevronRightIcon className={styles.chevron} />\r\n </BaseMenu.SubmenuTrigger>\r\n );\r\n}\r\n\r\nfunction DropdownMenuSubContent(\r\n props: Readonly<React.ComponentPropsWithRef<typeof BaseMenu.Positioner> & {children?: React.ReactNode}>,\r\n): React.ReactElement {\r\n const {className, children, render, ...otherProps} = props;\r\n\r\n return (\r\n <BaseMenu.Positioner\r\n {...otherProps}\r\n render={useRender({\r\n defaultTagName: \"div\",\r\n props: mergeProps({className: styles.dropdownPositioner}, {}),\r\n })}>\r\n <BaseMenu.Popup\r\n render={useRender({\r\n defaultTagName: \"div\",\r\n render: render as never,\r\n props: mergeProps({className: cn(styles.dropdownSubContent, className)}, {}),\r\n })}>\r\n {children}\r\n </BaseMenu.Popup>\r\n </BaseMenu.Positioner>\r\n );\r\n}\r\n\r\ntype DropDrawerRootProps = React.ComponentProps<typeof Drawer> | React.ComponentProps<typeof DropdownMenu>;\r\ntype DropDrawerTriggerProps =\r\n | React.ComponentPropsWithoutRef<typeof DrawerTrigger>\r\n | React.ComponentPropsWithoutRef<typeof DropdownMenuTrigger>;\r\ntype DropDrawerContentProps =\r\n | React.ComponentPropsWithoutRef<typeof DrawerContent>\r\n | React.ComponentPropsWithoutRef<typeof DropdownMenuContent>;\r\n\r\ninterface MobileSubmenuDataAttributes {\r\n \"data-parent-submenu-id\"?: string;\r\n \"data-parent-submenu\"?: string;\r\n \"data-submenu-id\"?: string;\r\n}\r\n\r\ninterface SharedDropDrawerItemProps\r\n extends Omit<React.ComponentPropsWithoutRef<typeof BaseMenu.Item>, \"children\" | \"onClick\" | \"onSelect\">, MobileSubmenuDataAttributes {\r\n /**\r\n * Item contents.\r\n * @default undefined\r\n */\r\n children?: React.ReactNode;\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 * Whether the desktop dropdown should close after the item is activated.\r\n * @default undefined\r\n */\r\n closeOnClick?: boolean;\r\n /**\r\n * Optional trailing icon or affordance rendered alongside the item content.\r\n * @default undefined\r\n */\r\n icon?: React.ReactNode;\r\n /**\r\n * Whether to apply inset spacing to align the item with grouped content.\r\n * @default undefined\r\n */\r\n inset?: boolean;\r\n /**\r\n * Mouse click handler invoked when the item is activated.\r\n * @default undefined\r\n */\r\n onClick?: React.MouseEventHandler<HTMLElement>;\r\n /**\r\n * Selection callback invoked with the native event when the item is activated.\r\n * @default undefined\r\n */\r\n onSelect?: (event: Event) => void;\r\n}\r\n\r\ninterface SubmenuContextType {\r\n activeSubmenu: string | null;\r\n navigateToSubmenu?: (id: string, title: string) => void;\r\n registerSubmenuContent?: (id: string, content: ReadonlyArray<React.ReactNode>) => void;\r\n setActiveSubmenu: (id: string | null) => void;\r\n setSubmenuTitle: (title: string | null) => void;\r\n submenuTitle: string | null;\r\n}\r\n\r\nconst SubmenuContext = React.createContext<SubmenuContextType>({\r\n activeSubmenu: null,\r\n navigateToSubmenu: undefined,\r\n registerSubmenuContent: undefined,\r\n setActiveSubmenu: () => undefined,\r\n setSubmenuTitle: () => undefined,\r\n submenuTitle: null,\r\n});\r\n\r\n/**\r\n * Provides a responsive dropdown-on-desktop, drawer-on-mobile navigation surface.\r\n *\r\n * @remarks\r\n * - Renders either Base UI `Menu.Root` or `Drawer.Root` depending on viewport size\r\n * - Built on Base UI Menu and Drawer primitives\r\n *\r\n * @example\r\n * ```tsx\r\n * <DropDrawer>\r\n * <DropDrawerTrigger>Open menu</DropDrawerTrigger>\r\n * <DropDrawerContent>\r\n * <DropDrawerItem>Profile</DropDrawerItem>\r\n * </DropDrawerContent>\r\n * </DropDrawer>\r\n * ```\r\n *\r\n * @see {@link https://base-ui.com/react/components/menu | Base UI Menu Docs}\r\n */\r\nfunction DropDrawer({children, ...props}: DropDrawerRootProps): React.JSX.Element {\r\n const isMobile = useIsMobile();\r\n\r\n return (\r\n <DropDrawerContext.Provider value={{isMobile}}>\r\n {isMobile ? (\r\n <Drawer\r\n data-slot='drop-drawer'\r\n {...(props as React.ComponentProps<typeof Drawer>)}>\r\n {children}\r\n </Drawer>\r\n ) : (\r\n <DropdownMenu\r\n data-slot='drop-drawer'\r\n {...(props as React.ComponentProps<typeof DropdownMenu>)}>\r\n {children}\r\n </DropdownMenu>\r\n )}\r\n </DropDrawerContext.Provider>\r\n );\r\n}\r\n\r\n/**\r\n * Renders the control that opens the dropdown or drawer surface.\r\n *\r\n * @remarks\r\n * - Renders either a Base UI menu trigger or drawer trigger\r\n * - Built on Base UI Menu and Drawer primitives\r\n *\r\n * @example\r\n * ```tsx\r\n * <DropDrawerTrigger>Open menu</DropDrawerTrigger>\r\n * ```\r\n *\r\n * @see {@link https://base-ui.com/react/components/drawer | Base UI Drawer Docs}\r\n */\r\nfunction DropDrawerTrigger({className, children, ...props}: DropDrawerTriggerProps): React.JSX.Element {\r\n const {isMobile} = useDropDrawerContext();\r\n\r\n return isMobile ? (\r\n <DrawerTrigger\r\n data-slot='drop-drawer-trigger'\r\n className={className}\r\n {...(props as React.ComponentProps<typeof DrawerTrigger>)}>\r\n {children}\r\n </DrawerTrigger>\r\n ) : (\r\n <DropdownMenuTrigger\r\n data-slot='drop-drawer-trigger'\r\n className={className}\r\n {...(props as React.ComponentProps<typeof DropdownMenuTrigger>)}>\r\n {children}\r\n </DropdownMenuTrigger>\r\n );\r\n}\r\n\r\n/**\r\n * Renders the responsive dropdown or drawer content surface.\r\n *\r\n * @remarks\r\n * - Renders a Base UI popup on desktop and drawer content on mobile\r\n * - Built on Base UI Menu and Drawer primitives with animated mobile submenu navigation\r\n *\r\n * @example\r\n * ```tsx\r\n * <DropDrawerContent>\r\n * <DropDrawerItem>Settings</DropDrawerItem>\r\n * </DropDrawerContent>\r\n * ```\r\n *\r\n * @see {@link https://base-ui.com/react/components/menu | Base UI Menu Docs}\r\n */\r\nfunction DropDrawerContent({className, children, ...props}: DropDrawerContentProps): React.JSX.Element {\r\n const {isMobile} = useDropDrawerContext();\r\n const [activeSubmenu, setActiveSubmenu] = React.useState<string | null>(null);\r\n const [submenuTitle, setSubmenuTitle] = React.useState<string | null>(null);\r\n const [submenuStack, setSubmenuStack] = React.useState<ReadonlyArray<{id: string; title: string}>>([]);\r\n const [animationDirection, setAnimationDirection] = React.useState<\"forward\" | \"backward\">(\"forward\");\r\n const submenuContentRef = React.useRef(new Map<string, ReadonlyArray<React.ReactNode>>());\r\n\r\n React.useEffect(() => {\r\n submenuContentRef.current.clear();\r\n }, [children]);\r\n\r\n const navigateToSubmenu = React.useCallback((id: string, title: string): void => {\r\n setAnimationDirection(\"forward\");\r\n setActiveSubmenu(id);\r\n setSubmenuTitle(title);\r\n setSubmenuStack((previousStack) => [...previousStack, {id, title}]);\r\n }, []);\r\n\r\n const goBack = React.useCallback((): void => {\r\n setAnimationDirection(\"backward\");\r\n\r\n if (submenuStack.length <= 1) {\r\n setActiveSubmenu(null);\r\n setSubmenuTitle(null);\r\n setSubmenuStack([]);\r\n return;\r\n }\r\n\r\n const newStack = [...submenuStack];\r\n newStack.pop();\r\n const previousSubmenu = newStack[newStack.length - 1];\r\n\r\n if (!previousSubmenu) {\r\n setActiveSubmenu(null);\r\n setSubmenuTitle(null);\r\n setSubmenuStack([]);\r\n return;\r\n }\r\n\r\n setActiveSubmenu(previousSubmenu.id);\r\n setSubmenuTitle(previousSubmenu.title);\r\n setSubmenuStack(newStack);\r\n }, [submenuStack]);\r\n\r\n const registerSubmenuContent = React.useCallback((id: string, content: ReadonlyArray<React.ReactNode>): void => {\r\n submenuContentRef.current.set(id, content);\r\n }, []);\r\n\r\n const extractSubmenuContent = React.useCallback((elements: React.ReactNode, targetId: string): ReadonlyArray<React.ReactNode> => {\r\n const result: Array<React.ReactNode> = [];\r\n\r\n const findSubmenuContent = (node: React.ReactNode): void => {\r\n if (!React.isValidElement(node)) {\r\n return;\r\n }\r\n\r\n const element = node as React.ReactElement<{\r\n \"data-submenu-id\"?: string;\r\n children?: React.ReactNode;\r\n id?: string;\r\n }>;\r\n\r\n if (element.type === DropDrawerSub) {\r\n const elementId = element.props.id;\r\n const dataSubmenuId = element.props[\"data-submenu-id\"];\r\n\r\n if (elementId === targetId || dataSubmenuId === targetId) {\r\n if (element.props.children) {\r\n React.Children.forEach(element.props.children, (child) => {\r\n if (React.isValidElement(child) && child.type === DropDrawerSubContent) {\r\n const subContentElement = child as React.ReactElement<{children?: React.ReactNode}>;\r\n\r\n React.Children.forEach(subContentElement.props.children, (contentChild) => {\r\n result.push(contentChild);\r\n });\r\n }\r\n });\r\n }\r\n\r\n return;\r\n }\r\n }\r\n\r\n if (element.props.children) {\r\n React.Children.forEach(element.props.children, findSubmenuContent);\r\n }\r\n };\r\n\r\n React.Children.forEach(elements, findSubmenuContent);\r\n return result;\r\n }, []);\r\n\r\n const getSubmenuContent = React.useCallback(\r\n (id: string): ReadonlyArray<React.ReactNode> => {\r\n const cachedContent = submenuContentRef.current.get(id);\r\n\r\n if (cachedContent && cachedContent.length > 0) {\r\n return cachedContent;\r\n }\r\n\r\n const submenuContent = extractSubmenuContent(children, id);\r\n\r\n if (submenuContent.length > 0) {\r\n submenuContentRef.current.set(id, submenuContent);\r\n }\r\n\r\n return submenuContent;\r\n },\r\n [children, extractSubmenuContent],\r\n );\r\n\r\n const variants = {\r\n center: {\r\n opacity: 1,\r\n x: 0,\r\n },\r\n enter: (direction: \"forward\" | \"backward\") => ({\r\n opacity: 0,\r\n x: direction === \"forward\" ? \"100%\" : \"-100%\",\r\n }),\r\n exit: (direction: \"forward\" | \"backward\") => ({\r\n opacity: 0,\r\n x: direction === \"forward\" ? \"-100%\" : \"100%\",\r\n }),\r\n };\r\n\r\n const transition = {\r\n duration: 0.3,\r\n ease: [0.25, 0.1, 0.25, 1],\r\n } satisfies Transition;\r\n\r\n if (isMobile) {\r\n return (\r\n <SubmenuContext.Provider\r\n value={{\r\n activeSubmenu,\r\n navigateToSubmenu,\r\n registerSubmenuContent,\r\n setActiveSubmenu: (id) => {\r\n if (id === null) {\r\n setActiveSubmenu(null);\r\n setSubmenuTitle(null);\r\n setSubmenuStack([]);\r\n }\r\n },\r\n setSubmenuTitle,\r\n submenuTitle,\r\n }}>\r\n <DrawerContent\r\n data-slot='drop-drawer-content'\r\n className={cn(styles.mobileContent, className)}\r\n {...(props as React.ComponentProps<typeof DrawerContent>)}>\r\n {activeSubmenu ? (\r\n <>\r\n <DrawerHeader>\r\n <div className={styles.mobileHeaderRow}>\r\n <button\r\n type='button'\r\n aria-label={MOBILE_BACK_LABEL}\r\n onClick={goBack}\r\n className={styles.backButton}>\r\n <ChevronLeftIcon className={styles.chevron} />\r\n </button>\r\n <DrawerTitle>{submenuTitle || MOBILE_SUBMENU_TITLE}</DrawerTitle>\r\n </div>\r\n </DrawerHeader>\r\n <div className={styles.mobileViewport}>\r\n <AnimatePresence\r\n initial={false}\r\n mode='wait'\r\n custom={animationDirection}>\r\n <motion.div\r\n key={activeSubmenu}\r\n custom={animationDirection}\r\n variants={variants}\r\n initial='enter'\r\n animate='center'\r\n exit='exit'\r\n transition={transition}\r\n className={styles.mobileMotionPanel}>\r\n {getSubmenuContent(activeSubmenu)}\r\n </motion.div>\r\n </AnimatePresence>\r\n </div>\r\n </>\r\n ) : (\r\n <>\r\n <DrawerHeader className={styles.screenReaderOnlyHeader}>\r\n <DrawerTitle>{MOBILE_MENU_TITLE}</DrawerTitle>\r\n </DrawerHeader>\r\n <div className={styles.mobileMainViewport}>\r\n <AnimatePresence\r\n initial={false}\r\n mode='wait'\r\n custom={animationDirection}>\r\n <motion.div\r\n key='main-menu'\r\n custom={animationDirection}\r\n variants={variants}\r\n initial='enter'\r\n animate='center'\r\n exit='exit'\r\n transition={transition}\r\n className={styles.mobileMotionPanel}>\r\n {children}\r\n </motion.div>\r\n </AnimatePresence>\r\n </div>\r\n </>\r\n )}\r\n </DrawerContent>\r\n </SubmenuContext.Provider>\r\n );\r\n }\r\n\r\n return (\r\n <SubmenuContext.Provider\r\n value={{\r\n activeSubmenu,\r\n registerSubmenuContent,\r\n setActiveSubmenu,\r\n setSubmenuTitle,\r\n submenuTitle,\r\n }}>\r\n <DropdownMenuContent\r\n data-slot='drop-drawer-content'\r\n align='end'\r\n sideOffset={4}\r\n className={cn(styles.desktopContent, className)}\r\n {...(props as React.ComponentProps<typeof DropdownMenuContent>)}>\r\n {children}\r\n </DropdownMenuContent>\r\n </SubmenuContext.Provider>\r\n );\r\n}\r\n\r\n/**\r\n * Renders an actionable item inside the drop drawer surface.\r\n *\r\n * @remarks\r\n * - Renders a Base UI menu item on desktop and a keyboard-accessible `<div>` on mobile\r\n * - Built on Base UI Menu and Drawer close primitives\r\n *\r\n * @example\r\n * ```tsx\r\n * <DropDrawerItem icon={<ChevronRightIcon />}>Account</DropDrawerItem>\r\n * ```\r\n *\r\n * @see {@link https://base-ui.com/react/components/menu | Base UI Menu Docs}\r\n */\r\nfunction DropDrawerItem({\r\n className,\r\n children,\r\n closeOnClick,\r\n disabled,\r\n icon,\r\n inset,\r\n onClick,\r\n onSelect,\r\n ...props\r\n}: SharedDropDrawerItemProps): React.JSX.Element {\r\n const {isMobile} = useDropDrawerContext();\r\n\r\n const isInGroup = React.useCallback((element: HTMLElement | null): boolean => {\r\n if (!element) {\r\n return false;\r\n }\r\n\r\n let parent = element.parentElement;\r\n\r\n while (parent) {\r\n if (parent.hasAttribute(\"data-drop-drawer-group\")) {\r\n return true;\r\n }\r\n\r\n parent = parent.parentElement;\r\n }\r\n\r\n return false;\r\n }, []);\r\n\r\n const itemRef = React.useRef<HTMLDivElement>(null);\r\n const [isInsideGroup, setIsInsideGroup] = React.useState(false);\r\n\r\n React.useEffect(() => {\r\n if (!isMobile) {\r\n return;\r\n }\r\n\r\n const timer = globalThis.window.setTimeout(() => {\r\n if (itemRef.current) {\r\n setIsInsideGroup(isInGroup(itemRef.current));\r\n }\r\n }, 0);\r\n\r\n return () => globalThis.window.clearTimeout(timer);\r\n }, [isInGroup, isMobile]);\r\n\r\n const handleSelect = React.useCallback(\r\n (event: Event): void => {\r\n if (!disabled) {\r\n onSelect?.(event);\r\n }\r\n },\r\n [disabled, onSelect],\r\n );\r\n\r\n if (isMobile) {\r\n const handleClick: React.MouseEventHandler<HTMLDivElement> = (event): void => {\r\n if (disabled) {\r\n return;\r\n }\r\n\r\n onClick?.(event);\r\n handleSelect(event.nativeEvent);\r\n };\r\n\r\n const handleKeyDown: React.KeyboardEventHandler<HTMLDivElement> = (event): void => {\r\n if (event.key !== \"Enter\" && event.key !== \" \") {\r\n return;\r\n }\r\n\r\n event.preventDefault();\r\n event.currentTarget.click();\r\n };\r\n\r\n const content = (\r\n <div\r\n ref={itemRef}\r\n data-slot='drop-drawer-item'\r\n data-disabled={disabled}\r\n data-inset={inset}\r\n role='menuitem'\r\n tabIndex={disabled ? -1 : 0}\r\n className={cn(\r\n styles.mobileItem,\r\n !isInsideGroup && styles.mobileStandaloneItem,\r\n isInsideGroup && styles.mobileGroupedItem,\r\n inset && styles.inset,\r\n className,\r\n )}\r\n onClick={handleClick}\r\n onKeyDown={handleKeyDown}\r\n aria-disabled={disabled}\r\n {...props}>\r\n <div className={styles.itemChildren}>{children}</div>\r\n {icon ? <div className={styles.itemIcon}>{icon}</div> : null}\r\n </div>\r\n );\r\n\r\n const parentSubmenuId = props[\"data-parent-submenu-id\"] ?? props[\"data-parent-submenu\"];\r\n\r\n if (parentSubmenuId) {\r\n return content;\r\n }\r\n\r\n return (\r\n <BaseDrawer.Close\r\n nativeButton={false}\r\n render={content}\r\n />\r\n );\r\n }\r\n\r\n const handleDesktopClick: React.MouseEventHandler<HTMLElement> = (event): void => {\r\n if (disabled) {\r\n return;\r\n }\r\n\r\n onClick?.(event);\r\n handleSelect(event.nativeEvent);\r\n };\r\n\r\n return (\r\n <DropdownMenuItem\r\n data-slot='drop-drawer-item'\r\n data-inset={inset}\r\n className={cn(styles.desktopItem, className)}\r\n closeOnClick={closeOnClick}\r\n disabled={disabled}\r\n inset={inset}\r\n onClick={handleDesktopClick}\r\n {...props}>\r\n <div className={styles.itemRow}>\r\n <div className={styles.itemChildren}>{children}</div>\r\n {icon ? <div className={styles.itemIcon}>{icon}</div> : null}\r\n </div>\r\n </DropdownMenuItem>\r\n );\r\n}\r\n\r\n/**\r\n * Renders a visual separator between desktop drop drawer sections.\r\n *\r\n * @remarks\r\n * - Renders a separator only in desktop dropdown mode\r\n * - Built on Base UI Menu separator primitives\r\n *\r\n * @example\r\n * ```tsx\r\n * <DropDrawerSeparator />\r\n * ```\r\n *\r\n * @see {@link https://base-ui.com/react/components/menu | Base UI Menu Docs}\r\n */\r\nfunction DropDrawerSeparator({\r\n className,\r\n ...props\r\n}: React.ComponentPropsWithoutRef<typeof DropdownMenuSeparator>): React.JSX.Element | null {\r\n const {isMobile} = useDropDrawerContext();\r\n\r\n if (isMobile) {\r\n return null;\r\n }\r\n\r\n return (\r\n <DropdownMenuSeparator\r\n data-slot='drop-drawer-separator'\r\n className={className}\r\n {...props}\r\n />\r\n );\r\n}\r\n\r\n/**\r\n * Renders a section label for the drop drawer surface.\r\n *\r\n * @remarks\r\n * - Renders a drawer title on mobile and a menu label on desktop\r\n * - Built on Base UI Drawer and Menu primitives\r\n *\r\n * @example\r\n * ```tsx\r\n * <DropDrawerLabel>Actions</DropDrawerLabel>\r\n * ```\r\n *\r\n * @see {@link https://base-ui.com/react/components/menu | Base UI Menu Docs}\r\n */\r\nfunction DropDrawerLabel({\r\n className,\r\n children,\r\n ...props\r\n}: React.ComponentProps<typeof DropdownMenuLabel> | React.ComponentProps<typeof DrawerTitle>): React.JSX.Element {\r\n const {isMobile} = useDropDrawerContext();\r\n\r\n return isMobile ? (\r\n <DrawerHeader className={styles.mobileLabelWrapper}>\r\n <DrawerTitle\r\n data-slot='drop-drawer-label'\r\n className={cn(styles.mobileLabel, className)}\r\n {...(props as React.ComponentProps<typeof DrawerTitle>)}>\r\n {children}\r\n </DrawerTitle>\r\n </DrawerHeader>\r\n ) : (\r\n <DropdownMenuLabel\r\n data-slot='drop-drawer-label'\r\n className={className}\r\n {...(props as React.ComponentProps<typeof DropdownMenuLabel>)}>\r\n {children}\r\n </DropdownMenuLabel>\r\n );\r\n}\r\n\r\n/**\r\n * Renders footer content aligned to the bottom of the responsive surface.\r\n *\r\n * @remarks\r\n * - Renders a drawer footer on mobile and a styled `<div>` on desktop\r\n * - Built on Base UI Drawer primitives for mobile layouts\r\n *\r\n * @example\r\n * ```tsx\r\n * <DropDrawerFooter>Signed in as Alex</DropDrawerFooter>\r\n * ```\r\n *\r\n * @see {@link https://base-ui.com/react/components/drawer | Base UI Drawer Docs}\r\n */\r\nfunction DropDrawerFooter({\r\n className,\r\n children,\r\n ...props\r\n}: React.ComponentProps<typeof DrawerFooter> | React.ComponentProps<\"div\">): React.JSX.Element {\r\n const {isMobile} = useDropDrawerContext();\r\n\r\n return isMobile ? (\r\n <DrawerFooter\r\n data-slot='drop-drawer-footer'\r\n className={cn(styles.mobileFooter, className)}\r\n {...(props as React.ComponentProps<typeof DrawerFooter>)}>\r\n {children}\r\n </DrawerFooter>\r\n ) : (\r\n <div\r\n data-slot='drop-drawer-footer'\r\n className={cn(styles.desktopFooter, className)}\r\n {...props}>\r\n {children}\r\n </div>\r\n );\r\n}\r\n\r\n/**\r\n * Renders a grouped collection of drop drawer items.\r\n *\r\n * @remarks\r\n * - Renders a Base UI menu group on desktop and a `<div role=\"group\">` on mobile\r\n * - Inserts mobile-only separators between adjacent children\r\n *\r\n * @example\r\n * ```tsx\r\n * <DropDrawerGroup>\r\n * <DropDrawerItem>Profile</DropDrawerItem>\r\n * <DropDrawerItem>Billing</DropDrawerItem>\r\n * </DropDrawerGroup>\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\nfunction DropDrawerGroup({className, children, ...props}: React.ComponentProps<\"div\"> & {children: React.ReactNode}): React.JSX.Element {\r\n const {isMobile} = useDropDrawerContext();\r\n\r\n const childrenWithSeparators = React.useMemo(() => {\r\n if (!isMobile) {\r\n return children;\r\n }\r\n\r\n const childArray = React.Children.toArray(children);\r\n const filteredChildren = childArray.filter((child) => !(React.isValidElement(child) && child.type === DropDrawerSeparator));\r\n\r\n return filteredChildren.flatMap((child, index) => {\r\n if (index === filteredChildren.length - 1) {\r\n return [child];\r\n }\r\n\r\n return [\r\n child,\r\n <div\r\n key={`separator-${index}`}\r\n className={styles.mobileGroupSeparator}\r\n aria-hidden='true'\r\n />,\r\n ];\r\n });\r\n }, [children, isMobile]);\r\n\r\n return isMobile ? (\r\n <div\r\n data-drop-drawer-group\r\n data-slot='drop-drawer-group'\r\n role='group'\r\n className={cn(styles.mobileGroup, className)}\r\n {...props}>\r\n {childrenWithSeparators}\r\n </div>\r\n ) : (\r\n <BaseMenu.Group\r\n data-drop-drawer-group\r\n data-slot='drop-drawer-group'\r\n className={className}\r\n {...(props as React.ComponentPropsWithoutRef<typeof BaseMenu.Group>)}>\r\n {children}\r\n </BaseMenu.Group>\r\n );\r\n}\r\n\r\n/**\r\n * Renders a submenu root within the drop drawer surface.\r\n *\r\n * @remarks\r\n * - Renders a Base UI submenu on desktop and a mobile-aware container on small screens\r\n * - Registers submenu content for animated mobile drill-down navigation\r\n *\r\n * @example\r\n * ```tsx\r\n * <DropDrawerSub>\r\n * <DropDrawerSubTrigger>More</DropDrawerSubTrigger>\r\n * <DropDrawerSubContent>\r\n * <DropDrawerItem>Sub item</DropDrawerItem>\r\n * </DropDrawerSubContent>\r\n * </DropDrawerSub>\r\n * ```\r\n *\r\n * @see {@link https://base-ui.com/react/components/menu | Base UI Menu Docs}\r\n */\r\nfunction DropDrawerSub({\r\n children,\r\n id,\r\n ...props\r\n}: React.ComponentPropsWithoutRef<typeof DropdownMenuSub> & {children?: React.ReactNode; id?: string}): React.JSX.Element {\r\n const {isMobile} = useDropDrawerContext();\r\n const {registerSubmenuContent} = React.useContext(SubmenuContext);\r\n const generatedId = React.useId();\r\n const submenuId = id || generatedId;\r\n\r\n React.useEffect(() => {\r\n if (!registerSubmenuContent) {\r\n return;\r\n }\r\n\r\n const contentItems: Array<React.ReactNode> = [];\r\n\r\n React.Children.forEach(children, (child) => {\r\n if (React.isValidElement(child) && child.type === DropDrawerSubContent) {\r\n const childElement = child as React.ReactElement<{children?: React.ReactNode}>;\r\n\r\n React.Children.forEach(childElement.props.children, (contentChild) => {\r\n contentItems.push(contentChild);\r\n });\r\n }\r\n });\r\n\r\n if (contentItems.length > 0) {\r\n registerSubmenuContent(submenuId, contentItems);\r\n }\r\n }, [children, registerSubmenuContent, submenuId]);\r\n\r\n if (isMobile) {\r\n const processedChildren = React.Children.map(children, (child) => {\r\n if (!React.isValidElement(child)) {\r\n return child;\r\n }\r\n\r\n if (child.type === DropDrawerSubTrigger || child.type === DropDrawerSubContent) {\r\n return React.cloneElement(child as React.ReactElement<MobileSubmenuDataAttributes>, {\r\n \"data-parent-submenu\": submenuId,\r\n \"data-parent-submenu-id\": submenuId,\r\n \"data-submenu-id\": submenuId,\r\n });\r\n }\r\n\r\n return child;\r\n });\r\n\r\n return (\r\n <div\r\n data-slot='drop-drawer-sub'\r\n data-submenu-id={submenuId}\r\n id={submenuId}>\r\n {processedChildren}\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <DropdownMenuSub\r\n data-slot='drop-drawer-sub'\r\n data-submenu-id={submenuId}\r\n {...props}>\r\n {children}\r\n </DropdownMenuSub>\r\n );\r\n}\r\n\r\ninterface DropDrawerSubTriggerProps\r\n extends Omit<React.ComponentPropsWithoutRef<typeof DropdownMenuSubTrigger>, \"children\" | \"onClick\">, MobileSubmenuDataAttributes {\r\n /**\r\n * Trigger contents.\r\n * @default undefined\r\n */\r\n children?: React.ReactNode;\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 * Whether to apply inset spacing to align the trigger with grouped content.\r\n * @default undefined\r\n */\r\n inset?: boolean;\r\n /**\r\n * Mouse click handler invoked before submenu navigation occurs.\r\n * @default undefined\r\n */\r\n onClick?: React.MouseEventHandler<HTMLElement>;\r\n}\r\n\r\n/**\r\n * Renders the trigger that opens a nested submenu.\r\n *\r\n * @remarks\r\n * - Renders a Base UI submenu trigger on desktop and a keyboard-accessible `<div>` on mobile\r\n * - Built on Base UI Menu submenu primitives\r\n *\r\n * @example\r\n * ```tsx\r\n * <DropDrawerSubTrigger>Advanced</DropDrawerSubTrigger>\r\n * ```\r\n *\r\n * @see {@link https://base-ui.com/react/components/menu | Base UI Menu Docs}\r\n */\r\nfunction DropDrawerSubTrigger({className, inset, children, onClick, ...props}: DropDrawerSubTriggerProps): React.JSX.Element {\r\n const {isMobile} = useDropDrawerContext();\r\n const {navigateToSubmenu} = React.useContext(SubmenuContext);\r\n\r\n const isInGroup = React.useCallback((element: HTMLElement | null): boolean => {\r\n if (!element) {\r\n return false;\r\n }\r\n\r\n let parent = element.parentElement;\r\n\r\n while (parent) {\r\n if (parent.hasAttribute(\"data-drop-drawer-group\")) {\r\n return true;\r\n }\r\n\r\n parent = parent.parentElement;\r\n }\r\n\r\n return false;\r\n }, []);\r\n\r\n const itemRef = React.useRef<HTMLDivElement>(null);\r\n const [isInsideGroup, setIsInsideGroup] = React.useState(false);\r\n\r\n React.useEffect(() => {\r\n if (!isMobile) {\r\n return;\r\n }\r\n\r\n const timer = globalThis.window.setTimeout(() => {\r\n if (itemRef.current) {\r\n setIsInsideGroup(isInGroup(itemRef.current));\r\n }\r\n }, 0);\r\n\r\n return () => globalThis.window.clearTimeout(timer);\r\n }, [isInGroup, isMobile]);\r\n\r\n if (isMobile) {\r\n const navigate = (eventTarget: HTMLElement): void => {\r\n let submenuId: string | null = null;\r\n const closestElement = eventTarget.closest(\"[data-submenu-id]\");\r\n const closestId = closestElement?.getAttribute(\"data-submenu-id\");\r\n\r\n if (closestId) {\r\n submenuId = closestId;\r\n }\r\n\r\n if (!submenuId) {\r\n submenuId = props[\"data-parent-submenu-id\"] ?? props[\"data-parent-submenu\"] ?? null;\r\n }\r\n\r\n if (!submenuId) {\r\n return;\r\n }\r\n\r\n const title = typeof children === \"string\" ? children : MOBILE_SUBMENU_TITLE;\r\n navigateToSubmenu?.(submenuId, title);\r\n };\r\n\r\n const handleClick: React.MouseEventHandler<HTMLDivElement> = (event): void => {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n onClick?.(event);\r\n navigate(event.currentTarget);\r\n };\r\n\r\n const handleKeyDown: React.KeyboardEventHandler<HTMLDivElement> = (event): void => {\r\n if (event.key !== \"Enter\" && event.key !== \" \") {\r\n return;\r\n }\r\n\r\n event.preventDefault();\r\n event.stopPropagation();\r\n event.currentTarget.click();\r\n };\r\n\r\n return (\r\n <div\r\n ref={itemRef}\r\n data-slot='drop-drawer-sub-trigger'\r\n data-inset={inset}\r\n role='menuitem'\r\n tabIndex={0}\r\n className={cn(\r\n styles.mobileItem,\r\n !isInsideGroup && styles.mobileStandaloneItem,\r\n isInsideGroup && styles.mobileGroupedItem,\r\n inset && styles.inset,\r\n className,\r\n )}\r\n onClick={handleClick}\r\n onKeyDown={handleKeyDown}\r\n {...props}>\r\n <div className={styles.itemChildren}>{children}</div>\r\n <ChevronRightIcon className={styles.chevron} />\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <DropdownMenuSubTrigger\r\n data-slot='drop-drawer-sub-trigger'\r\n data-inset={inset}\r\n className={className}\r\n inset={inset}\r\n onClick={onClick}\r\n {...props}>\r\n {children}\r\n </DropdownMenuSubTrigger>\r\n );\r\n}\r\n\r\n/**\r\n * Renders the content region for a nested submenu.\r\n *\r\n * @remarks\r\n * - Renders only in desktop dropdown mode\r\n * - Built on Base UI Menu submenu popup primitives\r\n *\r\n * @example\r\n * ```tsx\r\n * <DropDrawerSubContent>\r\n * <DropDrawerItem>Details</DropDrawerItem>\r\n * </DropDrawerSubContent>\r\n * ```\r\n *\r\n * @see {@link https://base-ui.com/react/components/menu | Base UI Menu Docs}\r\n */\r\nfunction DropDrawerSubContent({\r\n className,\r\n sideOffset = 4,\r\n children,\r\n ...props\r\n}: React.ComponentProps<typeof DropdownMenuSubContent>): React.JSX.Element | null {\r\n const {isMobile} = useDropDrawerContext();\r\n\r\n if (isMobile) {\r\n return null;\r\n }\r\n\r\n return (\r\n <DropdownMenuSubContent\r\n data-slot='drop-drawer-sub-content'\r\n sideOffset={sideOffset}\r\n className={cn(styles.dropdownSubContent, className)}\r\n {...props}>\r\n {children}\r\n </DropdownMenuSubContent>\r\n );\r\n}\r\n\r\nDropDrawer.displayName = \"DropDrawer\";\r\nDropDrawerTrigger.displayName = \"DropDrawerTrigger\";\r\nDropDrawerContent.displayName = \"DropDrawerContent\";\r\nDropDrawerItem.displayName = \"DropDrawerItem\";\r\nDropDrawerSeparator.displayName = \"DropDrawerSeparator\";\r\nDropDrawerLabel.displayName = \"DropDrawerLabel\";\r\nDropDrawerFooter.displayName = \"DropDrawerFooter\";\r\nDropDrawerGroup.displayName = \"DropDrawerGroup\";\r\nDropDrawerSub.displayName = \"DropDrawerSub\";\r\nDropDrawerSubTrigger.displayName = \"DropDrawerSubTrigger\";\r\nDropDrawerSubContent.displayName = \"DropDrawerSubContent\";\r\n\r\nexport {\r\n DropDrawer,\r\n DropDrawerContent,\r\n DropDrawerFooter,\r\n DropDrawerGroup,\r\n DropDrawerItem,\r\n DropDrawerLabel,\r\n DropDrawerSeparator,\r\n DropDrawerSub,\r\n DropDrawerSubContent,\r\n DropDrawerSubTrigger,\r\n DropDrawerTrigger,\r\n};\r\n"],"names":["MOBILE_MENU_TITLE","MOBILE_SUBMENU_TITLE","MOBILE_BACK_LABEL","DropDrawerContext","React","useDropDrawerContext","context","Error","Drawer","BaseDrawer","DrawerPortal","DrawerTrigger","props","asChild","children","className","render","otherProps","renderProp","useRender","mergeProps","undefined","DrawerOverlay","cn","styles","DrawerContent","DrawerHeader","DrawerFooter","DrawerTitle","DropdownMenu","BaseMenu","DropdownMenuSub","DropdownMenuTrigger","DropdownMenuContent","DropdownMenuItem","inset","DropdownMenuLabel","DropdownMenuSeparator","DropdownMenuSubTrigger","ChevronRightIcon","DropdownMenuSubContent","SubmenuContext","DropDrawer","isMobile","useIsMobile","DropDrawerTrigger","DropDrawerContent","activeSubmenu","setActiveSubmenu","submenuTitle","setSubmenuTitle","submenuStack","setSubmenuStack","animationDirection","setAnimationDirection","submenuContentRef","Map","navigateToSubmenu","id","title","previousStack","goBack","newStack","previousSubmenu","registerSubmenuContent","content","extractSubmenuContent","elements","targetId","result","findSubmenuContent","node","element","DropDrawerSub","elementId","dataSubmenuId","child","DropDrawerSubContent","subContentElement","contentChild","getSubmenuContent","cachedContent","submenuContent","variants","direction","transition","ChevronLeftIcon","AnimatePresence","motion","DropDrawerItem","closeOnClick","disabled","icon","onClick","onSelect","isInGroup","parent","itemRef","isInsideGroup","setIsInsideGroup","timer","globalThis","handleSelect","event","handleClick","handleKeyDown","parentSubmenuId","handleDesktopClick","DropDrawerSeparator","DropDrawerLabel","DropDrawerFooter","DropDrawerGroup","childrenWithSeparators","childArray","filteredChildren","index","generatedId","submenuId","contentItems","childElement","processedChildren","DropDrawerSubTrigger","navigate","eventTarget","closestElement","closestId","sideOffset"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"components/ui/dropdrawer.js","sources":["../../../src/components/ui/dropdrawer.tsx"],"sourcesContent":["\"use client\";\r\n\r\n/* eslint-disable react/no-children-prop, react-x/no-children-for-each, react-x/no-children-map, react-x/no-children-to-array, react-x/no-clone-element, sonarjs/function-return-type, sonarjs/no-identical-functions, sonarjs/no-unused-vars, max-lines, unicorn/no-array-callback-reference, unicorn/no-useless-undefined, unicorn/prefer-at, unicorn/prefer-dom-node-dataset, jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions */\r\n\r\nimport {Drawer as BaseDrawer} from \"@base-ui/react/drawer\";\r\nimport {Menu as BaseMenu} from \"@base-ui/react/menu\";\r\nimport {mergeProps} from \"@base-ui/react/merge-props\";\r\nimport {useRender} from \"@base-ui/react/use-render\";\r\nimport {ChevronLeftIcon, ChevronRightIcon} from \"lucide-react\";\r\nimport {AnimatePresence, motion, type Transition} from \"motion/react\";\r\nimport * as React from \"react\";\r\n\r\nimport {useIsMobile} from \"@/hooks/useIsMobile\";\r\nimport {cn} from \"@/lib/utilities\";\r\nimport styles from \"./dropdrawer.module.css\";\r\n\r\nconst MOBILE_MENU_TITLE = \"Menu\";\r\nconst MOBILE_SUBMENU_TITLE = \"Submenu\";\r\nconst MOBILE_BACK_LABEL = \"Go back\";\r\n\r\ninterface DropDrawerContextValue {\r\n isMobile: boolean;\r\n}\r\n\r\nconst DropDrawerContext = React.createContext<DropDrawerContextValue | null>(null);\r\n\r\nconst useDropDrawerContext = (): DropDrawerContextValue => {\r\n const context = React.useContext(DropDrawerContext);\r\n\r\n if (context === null) {\r\n throw new Error(\"DropDrawer components cannot be rendered outside the Context\");\r\n }\r\n\r\n return context;\r\n};\r\n\r\nconst Drawer = BaseDrawer.Root;\r\nconst DrawerPortal = BaseDrawer.Portal;\r\n\r\nconst DrawerTrigger = React.forwardRef<HTMLButtonElement, React.ComponentPropsWithRef<typeof BaseDrawer.Trigger> & {asChild?: boolean}>(\r\n function DrawerTrigger(props, forwardedRef) {\r\n const {asChild = false, children, className, render, ...otherProps} = props;\r\n const renderProp = asChild && React.isValidElement(children) ? children : render;\r\n\r\n return (\r\n <BaseDrawer.Trigger\r\n {...otherProps}\r\n ref={forwardedRef}\r\n render={useRender({\r\n defaultTagName: \"button\",\r\n render: renderProp as never,\r\n props: mergeProps({className}, {}),\r\n })}>\r\n {renderProp ? undefined : children}\r\n </BaseDrawer.Trigger>\r\n );\r\n },\r\n);\r\n\r\nfunction DrawerOverlay(props: Readonly<React.ComponentPropsWithRef<typeof BaseDrawer.Backdrop>>): React.ReactElement {\r\n const {className, render, ...otherProps} = props;\r\n\r\n return (\r\n <BaseDrawer.Backdrop\r\n {...otherProps}\r\n render={useRender({\r\n defaultTagName: \"div\",\r\n render: render as never,\r\n props: mergeProps({className: cn(styles.drawerOverlay, className)}, {}),\r\n })}\r\n />\r\n );\r\n}\r\n\r\nconst DrawerContent = React.forwardRef<HTMLDivElement, React.ComponentPropsWithRef<typeof BaseDrawer.Popup> & {children?: React.ReactNode}>(\r\n function DrawerContent(props, forwardedRef) {\r\n const {className, children, render, ...otherProps} = props;\r\n\r\n return (\r\n <DrawerPortal>\r\n <DrawerOverlay />\r\n <BaseDrawer.Viewport className={styles.drawerViewport}>\r\n <BaseDrawer.Popup\r\n {...otherProps}\r\n ref={forwardedRef}\r\n render={useRender({\r\n defaultTagName: \"div\",\r\n render: render as never,\r\n props: mergeProps({className: cn(styles.drawerContent, className)}, {}),\r\n })}>\r\n <div className={styles.drawerHandle} />\r\n <BaseDrawer.Content className={styles.drawerInnerContent}>{children}</BaseDrawer.Content>\r\n </BaseDrawer.Popup>\r\n </BaseDrawer.Viewport>\r\n </DrawerPortal>\r\n );\r\n },\r\n);\r\n\r\nfunction DrawerHeader(\r\n props: Readonly<React.ComponentPropsWithRef<\"div\"> & {render?: useRender.RenderProp<Record<string, never>>}>,\r\n): React.ReactElement {\r\n const {className, children, render, ...otherProps} = props;\r\n\r\n return useRender({\r\n defaultTagName: \"div\",\r\n render: render as never,\r\n props: mergeProps({className: cn(styles.drawerHeader, className)}, otherProps, {children}),\r\n });\r\n}\r\n\r\nfunction DrawerFooter(\r\n props: Readonly<React.ComponentPropsWithRef<\"div\"> & {render?: useRender.RenderProp<Record<string, never>>}>,\r\n): React.ReactElement {\r\n const {className, children, render, ...otherProps} = props;\r\n\r\n return useRender({\r\n defaultTagName: \"div\",\r\n render: render as never,\r\n props: mergeProps({className: cn(styles.drawerFooter, className)}, otherProps, {children}),\r\n });\r\n}\r\n\r\nfunction DrawerTitle(props: Readonly<React.ComponentPropsWithRef<typeof BaseDrawer.Title>>): React.ReactElement {\r\n const {className, children, render, ...otherProps} = props;\r\n\r\n return (\r\n <BaseDrawer.Title\r\n {...otherProps}\r\n render={useRender({\r\n defaultTagName: \"h2\",\r\n render: render as never,\r\n props: mergeProps({className: cn(styles.drawerTitle, className)}, {}),\r\n })}>\r\n {children}\r\n </BaseDrawer.Title>\r\n );\r\n}\r\n\r\nconst DropdownMenu = BaseMenu.Root;\r\nconst DropdownMenuSub = BaseMenu.SubmenuRoot;\r\n\r\nconst DropdownMenuTrigger = React.forwardRef<HTMLButtonElement, React.ComponentPropsWithRef<typeof BaseMenu.Trigger> & {asChild?: boolean}>(\r\n function DropdownMenuTrigger(props, forwardedRef) {\r\n const {asChild = false, children, className, render, ...otherProps} = props;\r\n const renderProp = asChild && React.isValidElement(children) ? children : render;\r\n\r\n return (\r\n <BaseMenu.Trigger\r\n {...otherProps}\r\n ref={forwardedRef}\r\n render={useRender({\r\n defaultTagName: \"button\",\r\n render: renderProp as never,\r\n props: mergeProps({className}, {}),\r\n })}>\r\n {renderProp ? undefined : children}\r\n </BaseMenu.Trigger>\r\n );\r\n },\r\n);\r\n\r\nconst DropdownMenuContent = React.forwardRef<\r\n HTMLDivElement,\r\n React.ComponentPropsWithRef<typeof BaseMenu.Positioner> & {children?: React.ReactNode}\r\n>(function DropdownMenuContent(props, forwardedRef) {\r\n const {className, children, render, ...otherProps} = props;\r\n\r\n return (\r\n <BaseMenu.Portal>\r\n <BaseMenu.Positioner\r\n {...otherProps}\r\n ref={forwardedRef}\r\n render={useRender({\r\n defaultTagName: \"div\",\r\n props: mergeProps({className: styles.dropdownPositioner}, {}),\r\n })}>\r\n <BaseMenu.Popup\r\n render={useRender({\r\n defaultTagName: \"div\",\r\n render: render as never,\r\n props: mergeProps({className: cn(styles.dropdownContent, className)}, {}),\r\n })}>\r\n {children}\r\n </BaseMenu.Popup>\r\n </BaseMenu.Positioner>\r\n </BaseMenu.Portal>\r\n );\r\n});\r\n\r\ninterface DropdownMenuItemProps extends React.ComponentPropsWithRef<typeof BaseMenu.Item> {\r\n /** @deprecated Prefer Base UI's `render` prop. */\r\n asChild?: boolean;\r\n /**\r\n * Whether to apply inset spacing to align with grouped menu content.\r\n * @default false\r\n */\r\n inset?: boolean;\r\n}\r\n\r\nfunction DropdownMenuItem(props: Readonly<DropdownMenuItemProps>): React.ReactElement {\r\n // eslint-disable-next-line sonarjs/deprecation -- backward-compatible asChild API\r\n const {asChild = false, children, className, inset = false, render, ...otherProps} = props;\r\n const renderProp = asChild && React.isValidElement(children) ? children : render;\r\n\r\n return (\r\n <BaseMenu.Item\r\n {...otherProps}\r\n render={useRender({\r\n defaultTagName: \"div\",\r\n render: renderProp as never,\r\n props: mergeProps({className: cn(styles.desktopItem, inset && styles.inset, className)}, {}),\r\n })}>\r\n {renderProp ? undefined : children}\r\n </BaseMenu.Item>\r\n );\r\n}\r\n\r\nfunction DropdownMenuLabel(props: Readonly<React.ComponentPropsWithRef<typeof BaseMenu.GroupLabel>>): React.ReactElement {\r\n const {className, children, render, ...otherProps} = props;\r\n\r\n return (\r\n <BaseMenu.GroupLabel\r\n {...otherProps}\r\n render={useRender({\r\n defaultTagName: \"div\",\r\n render: render as never,\r\n props: mergeProps({className: cn(styles.desktopLabel, className)}, {}),\r\n })}>\r\n {children}\r\n </BaseMenu.GroupLabel>\r\n );\r\n}\r\n\r\nfunction DropdownMenuSeparator(props: Readonly<React.ComponentPropsWithRef<typeof BaseMenu.Separator>>): React.ReactElement {\r\n const {className, render, ...otherProps} = props;\r\n\r\n return (\r\n <BaseMenu.Separator\r\n {...otherProps}\r\n render={useRender({\r\n defaultTagName: \"div\",\r\n render: render as never,\r\n props: mergeProps({className: cn(styles.desktopSeparator, className)}, {}),\r\n })}\r\n />\r\n );\r\n}\r\n\r\nfunction DropdownMenuSubTrigger(\r\n props: Readonly<React.ComponentPropsWithRef<typeof BaseMenu.SubmenuTrigger> & {inset?: boolean}>,\r\n): React.ReactElement {\r\n const {className, children, inset = false, render, ...otherProps} = props;\r\n\r\n return (\r\n <BaseMenu.SubmenuTrigger\r\n {...otherProps}\r\n render={useRender({\r\n defaultTagName: \"div\",\r\n render: render as never,\r\n props: mergeProps({className: cn(styles.desktopSubTrigger, inset && styles.inset, className)}, {}),\r\n })}>\r\n {children}\r\n <ChevronRightIcon className={styles.chevron} />\r\n </BaseMenu.SubmenuTrigger>\r\n );\r\n}\r\n\r\nfunction DropdownMenuSubContent(\r\n props: Readonly<React.ComponentPropsWithRef<typeof BaseMenu.Positioner> & {children?: React.ReactNode}>,\r\n): React.ReactElement {\r\n const {className, children, render, ...otherProps} = props;\r\n\r\n return (\r\n <BaseMenu.Positioner\r\n {...otherProps}\r\n render={useRender({\r\n defaultTagName: \"div\",\r\n props: mergeProps({className: styles.dropdownPositioner}, {}),\r\n })}>\r\n <BaseMenu.Popup\r\n render={useRender({\r\n defaultTagName: \"div\",\r\n render: render as never,\r\n props: mergeProps({className: cn(styles.dropdownSubContent, className)}, {}),\r\n })}>\r\n {children}\r\n </BaseMenu.Popup>\r\n </BaseMenu.Positioner>\r\n );\r\n}\r\n\r\ntype DropDrawerRootProps = React.ComponentProps<typeof Drawer> | React.ComponentProps<typeof DropdownMenu>;\r\ntype DropDrawerTriggerProps =\r\n | React.ComponentPropsWithoutRef<typeof DrawerTrigger>\r\n | React.ComponentPropsWithoutRef<typeof DropdownMenuTrigger>;\r\ntype DropDrawerContentProps =\r\n | React.ComponentPropsWithoutRef<typeof DrawerContent>\r\n | React.ComponentPropsWithoutRef<typeof DropdownMenuContent>;\r\n\r\ninterface MobileSubmenuDataAttributes {\r\n \"data-parent-submenu-id\"?: string;\r\n \"data-parent-submenu\"?: string;\r\n \"data-submenu-id\"?: string;\r\n}\r\n\r\ninterface SharedDropDrawerItemProps\r\n extends Omit<React.ComponentPropsWithoutRef<typeof BaseMenu.Item>, \"children\" | \"onClick\" | \"onSelect\">, MobileSubmenuDataAttributes {\r\n /**\r\n * Item contents.\r\n * @default undefined\r\n */\r\n children?: React.ReactNode;\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 * Whether the desktop dropdown should close after the item is activated.\r\n * @default undefined\r\n */\r\n closeOnClick?: boolean;\r\n /**\r\n * Optional trailing icon or affordance rendered alongside the item content.\r\n * @default undefined\r\n */\r\n icon?: React.ReactNode;\r\n /**\r\n * Whether to apply inset spacing to align the item with grouped content.\r\n * @default undefined\r\n */\r\n inset?: boolean;\r\n /**\r\n * Mouse click handler invoked when the item is activated.\r\n * @default undefined\r\n */\r\n onClick?: React.MouseEventHandler<HTMLElement>;\r\n /**\r\n * Selection callback invoked with the native event when the item is activated.\r\n * @default undefined\r\n */\r\n onSelect?: (event: Event) => void;\r\n}\r\n\r\ninterface SubmenuContextType {\r\n activeSubmenu: string | null;\r\n navigateToSubmenu?: (id: string, title: string) => void;\r\n registerSubmenuContent?: (id: string, content: ReadonlyArray<React.ReactNode>) => void;\r\n setActiveSubmenu: (id: string | null) => void;\r\n setSubmenuTitle: (title: string | null) => void;\r\n submenuTitle: string | null;\r\n}\r\n\r\nconst SubmenuContext = React.createContext<SubmenuContextType>({\r\n activeSubmenu: null,\r\n navigateToSubmenu: undefined,\r\n registerSubmenuContent: undefined,\r\n setActiveSubmenu: () => undefined,\r\n setSubmenuTitle: () => undefined,\r\n submenuTitle: null,\r\n});\r\n\r\n/**\r\n * Provides a responsive dropdown-on-desktop, drawer-on-mobile navigation surface.\r\n *\r\n * @remarks\r\n * - Renders either Base UI `Menu.Root` or `Drawer.Root` depending on viewport size\r\n * - Built on Base UI Menu and Drawer primitives\r\n *\r\n * @example\r\n * ```tsx\r\n * <DropDrawer>\r\n * <DropDrawerTrigger>Open menu</DropDrawerTrigger>\r\n * <DropDrawerContent>\r\n * <DropDrawerItem>Profile</DropDrawerItem>\r\n * </DropDrawerContent>\r\n * </DropDrawer>\r\n * ```\r\n *\r\n * @see {@link https://base-ui.com/react/components/menu | Base UI Menu Docs}\r\n */\r\nfunction DropDrawer({children, ...props}: DropDrawerRootProps): React.JSX.Element {\r\n const isMobile = useIsMobile();\r\n\r\n return (\r\n <DropDrawerContext.Provider value={{isMobile}}>\r\n {isMobile ? (\r\n <Drawer\r\n data-slot='drop-drawer'\r\n {...(props as React.ComponentProps<typeof Drawer>)}>\r\n {children}\r\n </Drawer>\r\n ) : (\r\n <DropdownMenu\r\n data-slot='drop-drawer'\r\n {...(props as React.ComponentProps<typeof DropdownMenu>)}>\r\n {children}\r\n </DropdownMenu>\r\n )}\r\n </DropDrawerContext.Provider>\r\n );\r\n}\r\n\r\n/**\r\n * Renders the control that opens the dropdown or drawer surface.\r\n *\r\n * @remarks\r\n * - Renders either a Base UI menu trigger or drawer trigger\r\n * - Built on Base UI Menu and Drawer primitives\r\n *\r\n * @example\r\n * ```tsx\r\n * <DropDrawerTrigger>Open menu</DropDrawerTrigger>\r\n * ```\r\n *\r\n * @see {@link https://base-ui.com/react/components/drawer | Base UI Drawer Docs}\r\n */\r\nconst DropDrawerTrigger = React.forwardRef<HTMLButtonElement, DropDrawerTriggerProps>(function DropDrawerTrigger(\r\n {className, children, ...props},\r\n forwardedRef,\r\n) {\r\n const {isMobile} = useDropDrawerContext();\r\n\r\n return isMobile ? (\r\n <DrawerTrigger\r\n ref={forwardedRef}\r\n data-slot='drop-drawer-trigger'\r\n className={className}\r\n {...(props as React.ComponentProps<typeof DrawerTrigger>)}>\r\n {children}\r\n </DrawerTrigger>\r\n ) : (\r\n <DropdownMenuTrigger\r\n ref={forwardedRef}\r\n data-slot='drop-drawer-trigger'\r\n className={className}\r\n {...(props as React.ComponentProps<typeof DropdownMenuTrigger>)}>\r\n {children}\r\n </DropdownMenuTrigger>\r\n );\r\n});\r\n\r\n/**\r\n * Renders the responsive dropdown or drawer content surface.\r\n *\r\n * @remarks\r\n * - Renders a Base UI popup on desktop and drawer content on mobile\r\n * - Built on Base UI Menu and Drawer primitives with animated mobile submenu navigation\r\n *\r\n * @example\r\n * ```tsx\r\n * <DropDrawerContent>\r\n * <DropDrawerItem>Settings</DropDrawerItem>\r\n * </DropDrawerContent>\r\n * ```\r\n *\r\n * @see {@link https://base-ui.com/react/components/menu | Base UI Menu Docs}\r\n */\r\nconst DropDrawerContent = React.forwardRef<HTMLDivElement, DropDrawerContentProps>(function DropDrawerContent(\r\n {className, children, ...props},\r\n forwardedRef,\r\n) {\r\n const {isMobile} = useDropDrawerContext();\r\n const [activeSubmenu, setActiveSubmenu] = React.useState<string | null>(null);\r\n const [submenuTitle, setSubmenuTitle] = React.useState<string | null>(null);\r\n const [submenuStack, setSubmenuStack] = React.useState<ReadonlyArray<{id: string; title: string}>>([]);\r\n const [animationDirection, setAnimationDirection] = React.useState<\"forward\" | \"backward\">(\"forward\");\r\n const submenuContentRef = React.useRef(new Map<string, ReadonlyArray<React.ReactNode>>());\r\n\r\n React.useEffect(() => {\r\n submenuContentRef.current.clear();\r\n }, [children]);\r\n\r\n const navigateToSubmenu = React.useCallback((id: string, title: string): void => {\r\n setAnimationDirection(\"forward\");\r\n setActiveSubmenu(id);\r\n setSubmenuTitle(title);\r\n setSubmenuStack((previousStack) => [...previousStack, {id, title}]);\r\n }, []);\r\n\r\n const goBack = React.useCallback((): void => {\r\n setAnimationDirection(\"backward\");\r\n\r\n if (submenuStack.length <= 1) {\r\n setActiveSubmenu(null);\r\n setSubmenuTitle(null);\r\n setSubmenuStack([]);\r\n return;\r\n }\r\n\r\n const newStack = [...submenuStack];\r\n newStack.pop();\r\n const previousSubmenu = newStack[newStack.length - 1];\r\n\r\n if (!previousSubmenu) {\r\n setActiveSubmenu(null);\r\n setSubmenuTitle(null);\r\n setSubmenuStack([]);\r\n return;\r\n }\r\n\r\n setActiveSubmenu(previousSubmenu.id);\r\n setSubmenuTitle(previousSubmenu.title);\r\n setSubmenuStack(newStack);\r\n }, [submenuStack]);\r\n\r\n const registerSubmenuContent = React.useCallback((id: string, content: ReadonlyArray<React.ReactNode>): void => {\r\n submenuContentRef.current.set(id, content);\r\n }, []);\r\n\r\n const extractSubmenuContent = React.useCallback((elements: React.ReactNode, targetId: string): ReadonlyArray<React.ReactNode> => {\r\n const result: Array<React.ReactNode> = [];\r\n\r\n const findSubmenuContent = (node: React.ReactNode): void => {\r\n if (!React.isValidElement(node)) {\r\n return;\r\n }\r\n\r\n const element = node as React.ReactElement<{\r\n \"data-submenu-id\"?: string;\r\n children?: React.ReactNode;\r\n id?: string;\r\n }>;\r\n\r\n if (element.type === DropDrawerSub) {\r\n const elementId = element.props.id;\r\n const dataSubmenuId = element.props[\"data-submenu-id\"];\r\n\r\n if (elementId === targetId || dataSubmenuId === targetId) {\r\n if (element.props.children) {\r\n React.Children.forEach(element.props.children, (child) => {\r\n if (React.isValidElement(child) && child.type === DropDrawerSubContent) {\r\n const subContentElement = child as React.ReactElement<{children?: React.ReactNode}>;\r\n\r\n React.Children.forEach(subContentElement.props.children, (contentChild) => {\r\n result.push(contentChild);\r\n });\r\n }\r\n });\r\n }\r\n\r\n return;\r\n }\r\n }\r\n\r\n if (element.props.children) {\r\n React.Children.forEach(element.props.children, findSubmenuContent);\r\n }\r\n };\r\n\r\n React.Children.forEach(elements, findSubmenuContent);\r\n return result;\r\n }, []);\r\n\r\n const getSubmenuContent = React.useCallback(\r\n (id: string): ReadonlyArray<React.ReactNode> => {\r\n const cachedContent = submenuContentRef.current.get(id);\r\n\r\n if (cachedContent && cachedContent.length > 0) {\r\n return cachedContent;\r\n }\r\n\r\n const submenuContent = extractSubmenuContent(children, id);\r\n\r\n if (submenuContent.length > 0) {\r\n submenuContentRef.current.set(id, submenuContent);\r\n }\r\n\r\n return submenuContent;\r\n },\r\n [children, extractSubmenuContent],\r\n );\r\n\r\n const variants = {\r\n center: {\r\n opacity: 1,\r\n x: 0,\r\n },\r\n enter: (direction: \"forward\" | \"backward\") => ({\r\n opacity: 0,\r\n x: direction === \"forward\" ? \"100%\" : \"-100%\",\r\n }),\r\n exit: (direction: \"forward\" | \"backward\") => ({\r\n opacity: 0,\r\n x: direction === \"forward\" ? \"-100%\" : \"100%\",\r\n }),\r\n };\r\n\r\n const transition = {\r\n duration: 0.3,\r\n ease: [0.25, 0.1, 0.25, 1],\r\n } satisfies Transition;\r\n\r\n if (isMobile) {\r\n return (\r\n <SubmenuContext.Provider\r\n value={{\r\n activeSubmenu,\r\n navigateToSubmenu,\r\n registerSubmenuContent,\r\n setActiveSubmenu: (id) => {\r\n if (id === null) {\r\n setActiveSubmenu(null);\r\n setSubmenuTitle(null);\r\n setSubmenuStack([]);\r\n }\r\n },\r\n setSubmenuTitle,\r\n submenuTitle,\r\n }}>\r\n <DrawerContent\r\n ref={forwardedRef}\r\n data-slot='drop-drawer-content'\r\n className={cn(styles.mobileContent, className)}\r\n {...(props as React.ComponentProps<typeof DrawerContent>)}>\r\n {activeSubmenu ? (\r\n <>\r\n <DrawerHeader>\r\n <div className={styles.mobileHeaderRow}>\r\n <button\r\n type='button'\r\n aria-label={MOBILE_BACK_LABEL}\r\n onClick={goBack}\r\n className={styles.backButton}>\r\n <ChevronLeftIcon className={styles.chevron} />\r\n </button>\r\n <DrawerTitle>{submenuTitle || MOBILE_SUBMENU_TITLE}</DrawerTitle>\r\n </div>\r\n </DrawerHeader>\r\n <div className={styles.mobileViewport}>\r\n <AnimatePresence\r\n initial={false}\r\n mode='wait'\r\n custom={animationDirection}>\r\n <motion.div\r\n key={activeSubmenu}\r\n custom={animationDirection}\r\n variants={variants}\r\n initial='enter'\r\n animate='center'\r\n exit='exit'\r\n transition={transition}\r\n className={styles.mobileMotionPanel}>\r\n {getSubmenuContent(activeSubmenu)}\r\n </motion.div>\r\n </AnimatePresence>\r\n </div>\r\n </>\r\n ) : (\r\n <>\r\n <DrawerHeader className={styles.screenReaderOnlyHeader}>\r\n <DrawerTitle>{MOBILE_MENU_TITLE}</DrawerTitle>\r\n </DrawerHeader>\r\n <div className={styles.mobileMainViewport}>\r\n <AnimatePresence\r\n initial={false}\r\n mode='wait'\r\n custom={animationDirection}>\r\n <motion.div\r\n key='main-menu'\r\n custom={animationDirection}\r\n variants={variants}\r\n initial='enter'\r\n animate='center'\r\n exit='exit'\r\n transition={transition}\r\n className={styles.mobileMotionPanel}>\r\n {children}\r\n </motion.div>\r\n </AnimatePresence>\r\n </div>\r\n </>\r\n )}\r\n </DrawerContent>\r\n </SubmenuContext.Provider>\r\n );\r\n }\r\n\r\n return (\r\n <SubmenuContext.Provider\r\n value={{\r\n activeSubmenu,\r\n registerSubmenuContent,\r\n setActiveSubmenu,\r\n setSubmenuTitle,\r\n submenuTitle,\r\n }}>\r\n <DropdownMenuContent\r\n ref={forwardedRef}\r\n data-slot='drop-drawer-content'\r\n align='end'\r\n sideOffset={4}\r\n className={cn(styles.desktopContent, className)}\r\n {...(props as React.ComponentProps<typeof DropdownMenuContent>)}>\r\n {children}\r\n </DropdownMenuContent>\r\n </SubmenuContext.Provider>\r\n );\r\n});\r\n\r\n/**\r\n * Renders an actionable item inside the drop drawer surface.\r\n *\r\n * @remarks\r\n * - Renders a Base UI menu item on desktop and a keyboard-accessible `<div>` on mobile\r\n * - Built on Base UI Menu and Drawer close primitives\r\n *\r\n * @example\r\n * ```tsx\r\n * <DropDrawerItem icon={<ChevronRightIcon />}>Account</DropDrawerItem>\r\n * ```\r\n *\r\n * @see {@link https://base-ui.com/react/components/menu | Base UI Menu Docs}\r\n */\r\nfunction DropDrawerItem({\r\n className,\r\n children,\r\n closeOnClick,\r\n disabled,\r\n icon,\r\n inset,\r\n onClick,\r\n onSelect,\r\n ...props\r\n}: SharedDropDrawerItemProps): React.JSX.Element {\r\n const {isMobile} = useDropDrawerContext();\r\n\r\n const isInGroup = React.useCallback((element: HTMLElement | null): boolean => {\r\n if (!element) {\r\n return false;\r\n }\r\n\r\n let parent = element.parentElement;\r\n\r\n while (parent) {\r\n if (parent.hasAttribute(\"data-drop-drawer-group\")) {\r\n return true;\r\n }\r\n\r\n parent = parent.parentElement;\r\n }\r\n\r\n return false;\r\n }, []);\r\n\r\n const itemRef = React.useRef<HTMLDivElement>(null);\r\n const [isInsideGroup, setIsInsideGroup] = React.useState(false);\r\n\r\n React.useEffect(() => {\r\n if (!isMobile) {\r\n return;\r\n }\r\n\r\n const timer = globalThis.window.setTimeout(() => {\r\n if (itemRef.current) {\r\n setIsInsideGroup(isInGroup(itemRef.current));\r\n }\r\n }, 0);\r\n\r\n return () => globalThis.window.clearTimeout(timer);\r\n }, [isInGroup, isMobile]);\r\n\r\n const handleSelect = React.useCallback(\r\n (event: Event): void => {\r\n if (!disabled) {\r\n onSelect?.(event);\r\n }\r\n },\r\n [disabled, onSelect],\r\n );\r\n\r\n if (isMobile) {\r\n const handleClick: React.MouseEventHandler<HTMLDivElement> = (event): void => {\r\n if (disabled) {\r\n return;\r\n }\r\n\r\n onClick?.(event);\r\n handleSelect(event.nativeEvent);\r\n };\r\n\r\n const handleKeyDown: React.KeyboardEventHandler<HTMLDivElement> = (event): void => {\r\n if (event.key !== \"Enter\" && event.key !== \" \") {\r\n return;\r\n }\r\n\r\n event.preventDefault();\r\n event.currentTarget.click();\r\n };\r\n\r\n const content = (\r\n <div\r\n ref={itemRef}\r\n data-slot='drop-drawer-item'\r\n data-disabled={disabled}\r\n data-inset={inset}\r\n role='menuitem'\r\n tabIndex={disabled ? -1 : 0}\r\n className={cn(\r\n styles.mobileItem,\r\n !isInsideGroup && styles.mobileStandaloneItem,\r\n isInsideGroup && styles.mobileGroupedItem,\r\n inset && styles.inset,\r\n className,\r\n )}\r\n onClick={handleClick}\r\n onKeyDown={handleKeyDown}\r\n aria-disabled={disabled}\r\n {...props}>\r\n <div className={styles.itemChildren}>{children}</div>\r\n {icon ? <div className={styles.itemIcon}>{icon}</div> : null}\r\n </div>\r\n );\r\n\r\n const parentSubmenuId = props[\"data-parent-submenu-id\"] ?? props[\"data-parent-submenu\"];\r\n\r\n if (parentSubmenuId) {\r\n return content;\r\n }\r\n\r\n return (\r\n <BaseDrawer.Close\r\n nativeButton={false}\r\n render={content}\r\n />\r\n );\r\n }\r\n\r\n const handleDesktopClick: React.MouseEventHandler<HTMLElement> = (event): void => {\r\n if (disabled) {\r\n return;\r\n }\r\n\r\n onClick?.(event);\r\n handleSelect(event.nativeEvent);\r\n };\r\n\r\n return (\r\n <DropdownMenuItem\r\n data-slot='drop-drawer-item'\r\n data-inset={inset}\r\n className={cn(styles.desktopItem, className)}\r\n closeOnClick={closeOnClick}\r\n disabled={disabled}\r\n inset={inset}\r\n onClick={handleDesktopClick}\r\n {...props}>\r\n <div className={styles.itemRow}>\r\n <div className={styles.itemChildren}>{children}</div>\r\n {icon ? <div className={styles.itemIcon}>{icon}</div> : null}\r\n </div>\r\n </DropdownMenuItem>\r\n );\r\n}\r\n\r\n/**\r\n * Renders a visual separator between desktop drop drawer sections.\r\n *\r\n * @remarks\r\n * - Renders a separator only in desktop dropdown mode\r\n * - Built on Base UI Menu separator primitives\r\n *\r\n * @example\r\n * ```tsx\r\n * <DropDrawerSeparator />\r\n * ```\r\n *\r\n * @see {@link https://base-ui.com/react/components/menu | Base UI Menu Docs}\r\n */\r\nfunction DropDrawerSeparator({\r\n className,\r\n ...props\r\n}: React.ComponentPropsWithoutRef<typeof DropdownMenuSeparator>): React.JSX.Element | null {\r\n const {isMobile} = useDropDrawerContext();\r\n\r\n if (isMobile) {\r\n return null;\r\n }\r\n\r\n return (\r\n <DropdownMenuSeparator\r\n data-slot='drop-drawer-separator'\r\n className={className}\r\n {...props}\r\n />\r\n );\r\n}\r\n\r\n/**\r\n * Renders a section label for the drop drawer surface.\r\n *\r\n * @remarks\r\n * - Renders a drawer title on mobile and a menu label on desktop\r\n * - Built on Base UI Drawer and Menu primitives\r\n *\r\n * @example\r\n * ```tsx\r\n * <DropDrawerLabel>Actions</DropDrawerLabel>\r\n * ```\r\n *\r\n * @see {@link https://base-ui.com/react/components/menu | Base UI Menu Docs}\r\n */\r\nfunction DropDrawerLabel({\r\n className,\r\n children,\r\n ...props\r\n}: React.ComponentProps<typeof DropdownMenuLabel> | React.ComponentProps<typeof DrawerTitle>): React.JSX.Element {\r\n const {isMobile} = useDropDrawerContext();\r\n\r\n return isMobile ? (\r\n <DrawerHeader className={styles.mobileLabelWrapper}>\r\n <DrawerTitle\r\n data-slot='drop-drawer-label'\r\n className={cn(styles.mobileLabel, className)}\r\n {...(props as React.ComponentProps<typeof DrawerTitle>)}>\r\n {children}\r\n </DrawerTitle>\r\n </DrawerHeader>\r\n ) : (\r\n <DropdownMenuLabel\r\n data-slot='drop-drawer-label'\r\n className={className}\r\n {...(props as React.ComponentProps<typeof DropdownMenuLabel>)}>\r\n {children}\r\n </DropdownMenuLabel>\r\n );\r\n}\r\n\r\n/**\r\n * Renders footer content aligned to the bottom of the responsive surface.\r\n *\r\n * @remarks\r\n * - Renders a drawer footer on mobile and a styled `<div>` on desktop\r\n * - Built on Base UI Drawer primitives for mobile layouts\r\n *\r\n * @example\r\n * ```tsx\r\n * <DropDrawerFooter>Signed in as Alex</DropDrawerFooter>\r\n * ```\r\n *\r\n * @see {@link https://base-ui.com/react/components/drawer | Base UI Drawer Docs}\r\n */\r\nfunction DropDrawerFooter({\r\n className,\r\n children,\r\n ...props\r\n}: React.ComponentProps<typeof DrawerFooter> | React.ComponentProps<\"div\">): React.JSX.Element {\r\n const {isMobile} = useDropDrawerContext();\r\n\r\n return isMobile ? (\r\n <DrawerFooter\r\n data-slot='drop-drawer-footer'\r\n className={cn(styles.mobileFooter, className)}\r\n {...(props as React.ComponentProps<typeof DrawerFooter>)}>\r\n {children}\r\n </DrawerFooter>\r\n ) : (\r\n <div\r\n data-slot='drop-drawer-footer'\r\n className={cn(styles.desktopFooter, className)}\r\n {...props}>\r\n {children}\r\n </div>\r\n );\r\n}\r\n\r\n/**\r\n * Renders a grouped collection of drop drawer items.\r\n *\r\n * @remarks\r\n * - Renders a Base UI menu group on desktop and a `<div role=\"group\">` on mobile\r\n * - Inserts mobile-only separators between adjacent children\r\n *\r\n * @example\r\n * ```tsx\r\n * <DropDrawerGroup>\r\n * <DropDrawerItem>Profile</DropDrawerItem>\r\n * <DropDrawerItem>Billing</DropDrawerItem>\r\n * </DropDrawerGroup>\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\nfunction DropDrawerGroup({className, children, ...props}: React.ComponentProps<\"div\"> & {children: React.ReactNode}): React.JSX.Element {\r\n const {isMobile} = useDropDrawerContext();\r\n\r\n const childrenWithSeparators = React.useMemo(() => {\r\n if (!isMobile) {\r\n return children;\r\n }\r\n\r\n const childArray = React.Children.toArray(children);\r\n const filteredChildren = childArray.filter((child) => !(React.isValidElement(child) && child.type === DropDrawerSeparator));\r\n\r\n return filteredChildren.flatMap((child, index) => {\r\n if (index === filteredChildren.length - 1) {\r\n return [child];\r\n }\r\n\r\n return [\r\n child,\r\n <div\r\n key={`separator-${index}`}\r\n className={styles.mobileGroupSeparator}\r\n aria-hidden='true'\r\n />,\r\n ];\r\n });\r\n }, [children, isMobile]);\r\n\r\n return isMobile ? (\r\n <div\r\n data-drop-drawer-group\r\n data-slot='drop-drawer-group'\r\n role='group'\r\n className={cn(styles.mobileGroup, className)}\r\n {...props}>\r\n {childrenWithSeparators}\r\n </div>\r\n ) : (\r\n <BaseMenu.Group\r\n data-drop-drawer-group\r\n data-slot='drop-drawer-group'\r\n className={className}\r\n {...(props as React.ComponentPropsWithoutRef<typeof BaseMenu.Group>)}>\r\n {children}\r\n </BaseMenu.Group>\r\n );\r\n}\r\n\r\n/**\r\n * Renders a submenu root within the drop drawer surface.\r\n *\r\n * @remarks\r\n * - Renders a Base UI submenu on desktop and a mobile-aware container on small screens\r\n * - Registers submenu content for animated mobile drill-down navigation\r\n *\r\n * @example\r\n * ```tsx\r\n * <DropDrawerSub>\r\n * <DropDrawerSubTrigger>More</DropDrawerSubTrigger>\r\n * <DropDrawerSubContent>\r\n * <DropDrawerItem>Sub item</DropDrawerItem>\r\n * </DropDrawerSubContent>\r\n * </DropDrawerSub>\r\n * ```\r\n *\r\n * @see {@link https://base-ui.com/react/components/menu | Base UI Menu Docs}\r\n */\r\nfunction DropDrawerSub({\r\n children,\r\n id,\r\n ...props\r\n}: React.ComponentPropsWithoutRef<typeof DropdownMenuSub> & {children?: React.ReactNode; id?: string}): React.JSX.Element {\r\n const {isMobile} = useDropDrawerContext();\r\n const {registerSubmenuContent} = React.useContext(SubmenuContext);\r\n const generatedId = React.useId();\r\n const submenuId = id || generatedId;\r\n\r\n React.useEffect(() => {\r\n if (!registerSubmenuContent) {\r\n return;\r\n }\r\n\r\n const contentItems: Array<React.ReactNode> = [];\r\n\r\n React.Children.forEach(children, (child) => {\r\n if (React.isValidElement(child) && child.type === DropDrawerSubContent) {\r\n const childElement = child as React.ReactElement<{children?: React.ReactNode}>;\r\n\r\n React.Children.forEach(childElement.props.children, (contentChild) => {\r\n contentItems.push(contentChild);\r\n });\r\n }\r\n });\r\n\r\n if (contentItems.length > 0) {\r\n registerSubmenuContent(submenuId, contentItems);\r\n }\r\n }, [children, registerSubmenuContent, submenuId]);\r\n\r\n if (isMobile) {\r\n const processedChildren = React.Children.map(children, (child) => {\r\n if (!React.isValidElement(child)) {\r\n return child;\r\n }\r\n\r\n if (child.type === DropDrawerSubTrigger || child.type === DropDrawerSubContent) {\r\n return React.cloneElement(child as React.ReactElement<MobileSubmenuDataAttributes>, {\r\n \"data-parent-submenu\": submenuId,\r\n \"data-parent-submenu-id\": submenuId,\r\n \"data-submenu-id\": submenuId,\r\n });\r\n }\r\n\r\n return child;\r\n });\r\n\r\n return (\r\n <div\r\n data-slot='drop-drawer-sub'\r\n data-submenu-id={submenuId}\r\n id={submenuId}>\r\n {processedChildren}\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <DropdownMenuSub\r\n data-slot='drop-drawer-sub'\r\n data-submenu-id={submenuId}\r\n {...props}>\r\n {children}\r\n </DropdownMenuSub>\r\n );\r\n}\r\n\r\ninterface DropDrawerSubTriggerProps\r\n extends Omit<React.ComponentPropsWithoutRef<typeof DropdownMenuSubTrigger>, \"children\" | \"onClick\">, MobileSubmenuDataAttributes {\r\n /**\r\n * Trigger contents.\r\n * @default undefined\r\n */\r\n children?: React.ReactNode;\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 * Whether to apply inset spacing to align the trigger with grouped content.\r\n * @default undefined\r\n */\r\n inset?: boolean;\r\n /**\r\n * Mouse click handler invoked before submenu navigation occurs.\r\n * @default undefined\r\n */\r\n onClick?: React.MouseEventHandler<HTMLElement>;\r\n}\r\n\r\n/**\r\n * Renders the trigger that opens a nested submenu.\r\n *\r\n * @remarks\r\n * - Renders a Base UI submenu trigger on desktop and a keyboard-accessible `<div>` on mobile\r\n * - Built on Base UI Menu submenu primitives\r\n *\r\n * @example\r\n * ```tsx\r\n * <DropDrawerSubTrigger>Advanced</DropDrawerSubTrigger>\r\n * ```\r\n *\r\n * @see {@link https://base-ui.com/react/components/menu | Base UI Menu Docs}\r\n */\r\nfunction DropDrawerSubTrigger({className, inset, children, onClick, ...props}: DropDrawerSubTriggerProps): React.JSX.Element {\r\n const {isMobile} = useDropDrawerContext();\r\n const {navigateToSubmenu} = React.useContext(SubmenuContext);\r\n\r\n const isInGroup = React.useCallback((element: HTMLElement | null): boolean => {\r\n if (!element) {\r\n return false;\r\n }\r\n\r\n let parent = element.parentElement;\r\n\r\n while (parent) {\r\n if (parent.hasAttribute(\"data-drop-drawer-group\")) {\r\n return true;\r\n }\r\n\r\n parent = parent.parentElement;\r\n }\r\n\r\n return false;\r\n }, []);\r\n\r\n const itemRef = React.useRef<HTMLDivElement>(null);\r\n const [isInsideGroup, setIsInsideGroup] = React.useState(false);\r\n\r\n React.useEffect(() => {\r\n if (!isMobile) {\r\n return;\r\n }\r\n\r\n const timer = globalThis.window.setTimeout(() => {\r\n if (itemRef.current) {\r\n setIsInsideGroup(isInGroup(itemRef.current));\r\n }\r\n }, 0);\r\n\r\n return () => globalThis.window.clearTimeout(timer);\r\n }, [isInGroup, isMobile]);\r\n\r\n if (isMobile) {\r\n const navigate = (eventTarget: HTMLElement): void => {\r\n let submenuId: string | null = null;\r\n const closestElement = eventTarget.closest(\"[data-submenu-id]\");\r\n const closestId = closestElement?.getAttribute(\"data-submenu-id\");\r\n\r\n if (closestId) {\r\n submenuId = closestId;\r\n }\r\n\r\n if (!submenuId) {\r\n submenuId = props[\"data-parent-submenu-id\"] ?? props[\"data-parent-submenu\"] ?? null;\r\n }\r\n\r\n if (!submenuId) {\r\n return;\r\n }\r\n\r\n const title = typeof children === \"string\" ? children : MOBILE_SUBMENU_TITLE;\r\n navigateToSubmenu?.(submenuId, title);\r\n };\r\n\r\n const handleClick: React.MouseEventHandler<HTMLDivElement> = (event): void => {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n onClick?.(event);\r\n navigate(event.currentTarget);\r\n };\r\n\r\n const handleKeyDown: React.KeyboardEventHandler<HTMLDivElement> = (event): void => {\r\n if (event.key !== \"Enter\" && event.key !== \" \") {\r\n return;\r\n }\r\n\r\n event.preventDefault();\r\n event.stopPropagation();\r\n event.currentTarget.click();\r\n };\r\n\r\n return (\r\n <div\r\n ref={itemRef}\r\n data-slot='drop-drawer-sub-trigger'\r\n data-inset={inset}\r\n role='menuitem'\r\n tabIndex={0}\r\n className={cn(\r\n styles.mobileItem,\r\n !isInsideGroup && styles.mobileStandaloneItem,\r\n isInsideGroup && styles.mobileGroupedItem,\r\n inset && styles.inset,\r\n className,\r\n )}\r\n onClick={handleClick}\r\n onKeyDown={handleKeyDown}\r\n {...props}>\r\n <div className={styles.itemChildren}>{children}</div>\r\n <ChevronRightIcon className={styles.chevron} />\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <DropdownMenuSubTrigger\r\n data-slot='drop-drawer-sub-trigger'\r\n data-inset={inset}\r\n className={className}\r\n inset={inset}\r\n onClick={onClick}\r\n {...props}>\r\n {children}\r\n </DropdownMenuSubTrigger>\r\n );\r\n}\r\n\r\n/**\r\n * Renders the content region for a nested submenu.\r\n *\r\n * @remarks\r\n * - Renders only in desktop dropdown mode\r\n * - Built on Base UI Menu submenu popup primitives\r\n *\r\n * @example\r\n * ```tsx\r\n * <DropDrawerSubContent>\r\n * <DropDrawerItem>Details</DropDrawerItem>\r\n * </DropDrawerSubContent>\r\n * ```\r\n *\r\n * @see {@link https://base-ui.com/react/components/menu | Base UI Menu Docs}\r\n */\r\nfunction DropDrawerSubContent({\r\n className,\r\n sideOffset = 4,\r\n children,\r\n ...props\r\n}: React.ComponentProps<typeof DropdownMenuSubContent>): React.JSX.Element | null {\r\n const {isMobile} = useDropDrawerContext();\r\n\r\n if (isMobile) {\r\n return null;\r\n }\r\n\r\n return (\r\n <DropdownMenuSubContent\r\n data-slot='drop-drawer-sub-content'\r\n sideOffset={sideOffset}\r\n className={cn(styles.dropdownSubContent, className)}\r\n {...props}>\r\n {children}\r\n </DropdownMenuSubContent>\r\n );\r\n}\r\n\r\nDropDrawer.displayName = \"DropDrawer\";\r\nDropDrawerTrigger.displayName = \"DropDrawerTrigger\";\r\nDropDrawerContent.displayName = \"DropDrawerContent\";\r\nDropDrawerItem.displayName = \"DropDrawerItem\";\r\nDropDrawerSeparator.displayName = \"DropDrawerSeparator\";\r\nDropDrawerLabel.displayName = \"DropDrawerLabel\";\r\nDropDrawerFooter.displayName = \"DropDrawerFooter\";\r\nDropDrawerGroup.displayName = \"DropDrawerGroup\";\r\nDropDrawerSub.displayName = \"DropDrawerSub\";\r\nDropDrawerSubTrigger.displayName = \"DropDrawerSubTrigger\";\r\nDropDrawerSubContent.displayName = \"DropDrawerSubContent\";\r\n\r\nexport {\r\n DropDrawer,\r\n DropDrawerContent,\r\n DropDrawerFooter,\r\n DropDrawerGroup,\r\n DropDrawerItem,\r\n DropDrawerLabel,\r\n DropDrawerSeparator,\r\n DropDrawerSub,\r\n DropDrawerSubContent,\r\n DropDrawerSubTrigger,\r\n DropDrawerTrigger,\r\n};\r\n"],"names":["MOBILE_MENU_TITLE","MOBILE_SUBMENU_TITLE","MOBILE_BACK_LABEL","DropDrawerContext","React","useDropDrawerContext","context","Error","Drawer","BaseDrawer","DrawerPortal","DrawerTrigger","props","forwardedRef","asChild","children","className","render","otherProps","renderProp","useRender","mergeProps","undefined","DrawerOverlay","cn","styles","DrawerContent","DrawerHeader","DrawerFooter","DrawerTitle","DropdownMenu","BaseMenu","DropdownMenuSub","DropdownMenuTrigger","DropdownMenuContent","DropdownMenuItem","inset","DropdownMenuLabel","DropdownMenuSeparator","DropdownMenuSubTrigger","ChevronRightIcon","DropdownMenuSubContent","SubmenuContext","DropDrawer","isMobile","useIsMobile","DropDrawerTrigger","DropDrawerContent","activeSubmenu","setActiveSubmenu","submenuTitle","setSubmenuTitle","submenuStack","setSubmenuStack","animationDirection","setAnimationDirection","submenuContentRef","Map","navigateToSubmenu","id","title","previousStack","goBack","newStack","previousSubmenu","registerSubmenuContent","content","extractSubmenuContent","elements","targetId","result","findSubmenuContent","node","element","DropDrawerSub","elementId","dataSubmenuId","child","DropDrawerSubContent","subContentElement","contentChild","getSubmenuContent","cachedContent","submenuContent","variants","direction","transition","ChevronLeftIcon","AnimatePresence","motion","DropDrawerItem","closeOnClick","disabled","icon","onClick","onSelect","isInGroup","parent","itemRef","isInsideGroup","setIsInsideGroup","timer","globalThis","handleSelect","event","handleClick","handleKeyDown","parentSubmenuId","handleDesktopClick","DropDrawerSeparator","DropDrawerLabel","DropDrawerFooter","DropDrawerGroup","childrenWithSeparators","childArray","filteredChildren","index","generatedId","submenuId","contentItems","childElement","processedChildren","DropDrawerSubTrigger","navigate","eventTarget","closestElement","closestId","sideOffset"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["webpack://./home/runner/work/arolariu.ro/arolariu.ro/packages/components/src/components/ui/dropdrawer.module.css","webpack://./src/components/ui/dropdrawer.module.css"],"names":[],"mappings":"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","sourcesContent":[".drawerOverlay{background:rgba(0,0,0,.55);inset:0;position:fixed;transition:opacity var(--ac-transition-normal);z-index:50;@supports (-webkit-touch-callout:none){position:absolute}}.drawerOverlay[data-ending-style],.drawerOverlay[data-starting-style]{opacity:0}.drawerViewport{align-items:flex-end;display:flex;inset:0;justify-content:center;pointer-events:none;position:fixed;z-index:51}.drawerContent{background:var(--ac-popover);border:1px solid var(--ac-border);border-bottom:0;border-radius:var(--ac-radius-lg) var(--ac-radius-lg) 0 0;box-shadow:0 -16px 40px -16px rgba(0,0,0,.35);color:var(--ac-popover-foreground);display:flex;flex-direction:column;inset-inline:0;margin-top:6rem;max-height:95vh;padding:1rem 1rem 1.5rem;pointer-events:auto;position:relative;transition:opacity var(--ac-transition-normal),transform var(--ac-transition-normal);width:min(100%,48rem)}.drawerContent[data-ending-style],.drawerContent[data-starting-style]{opacity:0;transform:translateY(1rem)}.drawerInnerContent{display:flex;flex:1;flex-direction:column;min-height:0}.drawerHandle{background:var(--ac-border);border-radius:9999px;height:.25rem;margin:0 auto 1rem;width:4rem}.drawerHeader{display:grid;gap:.375rem;padding:0 0 1rem;text-align:center}.drawerTitle{font-size:var(--ac-text-lg);font-weight:600;letter-spacing:-.02em;line-height:1.2}.drawerFooter,.mobileFooter{display:flex;flex-direction:column;gap:.5rem;margin-top:auto;padding-top:1rem}.desktopFooter{padding:.5rem}.dropdownPositioner{z-index:50}.desktopContent,.dropdownContent,.dropdownSubContent{background:var(--ac-popover);border:1px solid var(--ac-border);border-radius:var(--ac-radius-md);box-shadow:0 16px 40px -16px rgba(0,0,0,.35);color:var(--ac-popover-foreground);min-width:13.75rem;overflow:hidden auto;transition:opacity var(--ac-transition-normal),transform var(--ac-transition-normal)}.desktopContent[data-ending-style],.desktopContent[data-starting-style],.dropdownContent[data-ending-style],.dropdownContent[data-starting-style],.dropdownSubContent[data-ending-style],.dropdownSubContent[data-starting-style]{opacity:0;transform:scale(.96)}.desktopContent,.dropdownContent{max-height:min(70vh,var(--available-height,70vh));padding:.25rem}.dropdownSubContent{max-height:min(60vh,var(--available-height,60vh));padding:.25rem}.desktopItem,.desktopSubTrigger{align-items:center;border-radius:var(--ac-radius-sm);color:inherit;cursor:default;display:flex;font-size:var(--ac-text-sm);gap:.5rem;min-height:2rem;outline:none;padding:.375rem .5rem;position:relative;user-select:none;width:100%}.desktopItem[data-highlighted],.desktopSubTrigger[data-highlighted],.desktopSubTrigger[data-popup-open]{background:var(--ac-accent);color:var(--ac-accent-foreground)}.desktopItem[data-disabled],.desktopSubTrigger[data-disabled]{opacity:.5;pointer-events:none}.desktopLabel{font-size:var(--ac-text-sm);font-weight:600;padding:.375rem .5rem}.desktopSeparator{background:var(--ac-border);height:1px;margin:.25rem -.25rem}.mobileContent{max-height:90vh}.mobileHeaderRow{align-items:center;display:flex;gap:.5rem}.backButton{align-items:center;background:transparent;border:0;border-radius:9999px;color:inherit;display:inline-flex;height:2rem;justify-content:center;padding:.25rem;width:2rem}.backButton:hover{background:color-mix(in oklch,var(--ac-muted),transparent 50%)}.backButton:focus-visible,.mobileItem:focus-visible{outline:2px solid var(--ac-ring);outline-offset:2px}.mobileMainViewport,.mobileViewport{overflow-y:auto}.mobileViewport{flex:1;max-height:70vh;position:relative}.mobileMainViewport{max-height:70vh}.mobileMotionPanel{min-height:100%;padding-bottom:1.5rem;width:100%}.screenReaderOnlyHeader{height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;clip:rect(0,0,0,0);border:0;white-space:nowrap}.mobileItem{align-items:center;background:transparent;border:0;color:inherit;cursor:pointer;display:flex;justify-content:space-between;padding:1rem;text-align:left;width:100%}.mobileStandaloneItem{background:var(--ac-muted);border-radius:var(--ac-radius-md);margin:.375rem .5rem}.mobileGroupedItem{background:transparent}.mobileLabelWrapper{padding:0}.mobileLabel{color:var(--ac-muted-foreground);font-size:var(--ac-text-sm);font-weight:500;padding:.5rem 1rem}.mobileGroup{background:var(--ac-muted);border-radius:var(--ac-radius-xl);margin:.75rem .5rem;overflow:hidden}.mobileGroupSeparator{background:var(--ac-border);height:1px}.itemChildren,.itemRow{align-items:center;display:flex;gap:.5rem}.itemRow{justify-content:space-between;width:100%}.chevron,.itemIcon{flex-shrink:0}.chevron{height:1rem;width:1rem}.inset{padding-left:2rem}.mobileItem[data-disabled=true]{opacity:.5;pointer-events:none}@media (min-width:640px){.drawerHeader{text-align:left}}",".drawerOverlay {\n transition: opacity var(--ac-transition-normal);\n z-index: 50;\n background: #0000008c;\n position: fixed;\n inset: 0;\n\n @supports (-webkit-touch-callout: none) {\n position: absolute;\n }\n}\n\n.drawerOverlay[data-ending-style], .drawerOverlay[data-starting-style] {\n opacity: 0;\n}\n\n.drawerViewport {\n pointer-events: none;\n z-index: 51;\n justify-content: center;\n align-items: flex-end;\n display: flex;\n position: fixed;\n inset: 0;\n}\n\n.drawerContent {\n background: var(--ac-popover);\n border: 1px solid var(--ac-border);\n border-radius: var(--ac-radius-lg) var(--ac-radius-lg) 0 0;\n color: var(--ac-popover-foreground);\n pointer-events: auto;\n max-height: 95vh;\n transition: opacity var(--ac-transition-normal),transform var(--ac-transition-normal);\n border-bottom: 0;\n flex-direction: column;\n width: min(100%, 48rem);\n margin-top: 6rem;\n padding: 1rem 1rem 1.5rem;\n display: flex;\n position: relative;\n inset-inline: 0;\n box-shadow: 0 -16px 40px -16px #00000059;\n}\n\n.drawerContent[data-ending-style], .drawerContent[data-starting-style] {\n opacity: 0;\n transform: translateY(1rem);\n}\n\n.drawerInnerContent {\n flex-direction: column;\n flex: 1;\n min-height: 0;\n display: flex;\n}\n\n.drawerHandle {\n background: var(--ac-border);\n border-radius: 9999px;\n width: 4rem;\n height: .25rem;\n margin: 0 auto 1rem;\n}\n\n.drawerHeader {\n text-align: center;\n gap: .375rem;\n padding: 0 0 1rem;\n display: grid;\n}\n\n.drawerTitle {\n font-size: var(--ac-text-lg);\n letter-spacing: -.02em;\n font-weight: 600;\n line-height: 1.2;\n}\n\n.drawerFooter, .mobileFooter {\n flex-direction: column;\n gap: .5rem;\n margin-top: auto;\n padding-top: 1rem;\n display: flex;\n}\n\n.desktopFooter {\n padding: .5rem;\n}\n\n.dropdownPositioner {\n z-index: 50;\n}\n\n.desktopContent, .dropdownContent, .dropdownSubContent {\n background: var(--ac-popover);\n border: 1px solid var(--ac-border);\n border-radius: var(--ac-radius-md);\n color: var(--ac-popover-foreground);\n min-width: 13.75rem;\n transition: opacity var(--ac-transition-normal),transform var(--ac-transition-normal);\n overflow: hidden auto;\n box-shadow: 0 16px 40px -16px #00000059;\n}\n\n.desktopContent[data-ending-style], .desktopContent[data-starting-style], .dropdownContent[data-ending-style], .dropdownContent[data-starting-style], .dropdownSubContent[data-ending-style], .dropdownSubContent[data-starting-style] {\n opacity: 0;\n transform: scale(.96);\n}\n\n.desktopContent, .dropdownContent {\n max-height: min(70vh,var(--available-height, 70vh));\n padding: .25rem;\n}\n\n.dropdownSubContent {\n max-height: min(60vh,var(--available-height, 60vh));\n padding: .25rem;\n}\n\n.desktopItem, .desktopSubTrigger {\n border-radius: var(--ac-radius-sm);\n color: inherit;\n cursor: default;\n font-size: var(--ac-text-sm);\n -webkit-user-select: none;\n user-select: none;\n outline: none;\n align-items: center;\n gap: .5rem;\n width: 100%;\n min-height: 2rem;\n padding: .375rem .5rem;\n display: flex;\n position: relative;\n}\n\n.desktopItem[data-highlighted], .desktopSubTrigger[data-highlighted], .desktopSubTrigger[data-popup-open] {\n background: var(--ac-accent);\n color: var(--ac-accent-foreground);\n}\n\n.desktopItem[data-disabled], .desktopSubTrigger[data-disabled] {\n opacity: .5;\n pointer-events: none;\n}\n\n.desktopLabel {\n font-size: var(--ac-text-sm);\n padding: .375rem .5rem;\n font-weight: 600;\n}\n\n.desktopSeparator {\n background: var(--ac-border);\n height: 1px;\n margin: .25rem -.25rem;\n}\n\n.mobileContent {\n max-height: 90vh;\n}\n\n.mobileHeaderRow {\n align-items: center;\n gap: .5rem;\n display: flex;\n}\n\n.backButton {\n color: inherit;\n background: none;\n border: 0;\n border-radius: 9999px;\n justify-content: center;\n align-items: center;\n width: 2rem;\n height: 2rem;\n padding: .25rem;\n display: inline-flex;\n}\n\n.backButton:hover {\n background: color-mix(in oklch,var(--ac-muted),transparent 50%);\n}\n\n.backButton:focus-visible, .mobileItem:focus-visible {\n outline: 2px solid var(--ac-ring);\n outline-offset: 2px;\n}\n\n.mobileMainViewport, .mobileViewport {\n overflow-y: auto;\n}\n\n.mobileViewport {\n flex: 1;\n max-height: 70vh;\n position: relative;\n}\n\n.mobileMainViewport {\n max-height: 70vh;\n}\n\n.mobileMotionPanel {\n width: 100%;\n min-height: 100%;\n padding-bottom: 1.5rem;\n}\n\n.screenReaderOnlyHeader {\n clip: rect(0,0,0,0);\n white-space: nowrap;\n border: 0;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n position: absolute;\n overflow: hidden;\n}\n\n.mobileItem {\n color: inherit;\n cursor: pointer;\n text-align: left;\n background: none;\n border: 0;\n justify-content: space-between;\n align-items: center;\n width: 100%;\n padding: 1rem;\n display: flex;\n}\n\n.mobileStandaloneItem {\n background: var(--ac-muted);\n border-radius: var(--ac-radius-md);\n margin: .375rem .5rem;\n}\n\n.mobileGroupedItem {\n background: none;\n}\n\n.mobileLabelWrapper {\n padding: 0;\n}\n\n.mobileLabel {\n color: var(--ac-muted-foreground);\n font-size: var(--ac-text-sm);\n padding: .5rem 1rem;\n font-weight: 500;\n}\n\n.mobileGroup {\n background: var(--ac-muted);\n border-radius: var(--ac-radius-xl);\n margin: .75rem .5rem;\n overflow: hidden;\n}\n\n.mobileGroupSeparator {\n background: var(--ac-border);\n height: 1px;\n}\n\n.itemChildren, .itemRow {\n align-items: center;\n gap: .5rem;\n display: flex;\n}\n\n.itemRow {\n justify-content: space-between;\n width: 100%;\n}\n\n.chevron, .itemIcon {\n flex-shrink: 0;\n}\n\n.chevron {\n width: 1rem;\n height: 1rem;\n}\n\n.inset {\n padding-left: 2rem;\n}\n\n.mobileItem[data-disabled=\"true\"] {\n opacity: .5;\n pointer-events: none;\n}\n\n@media (width >= 640px) {\n .drawerHeader {\n text-align: left;\n }\n}\n"],"sourceRoot":""}
|
|
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/dropdrawer.module.css","webpack://./src/components/ui/dropdrawer.module.css"],"names":[],"mappings":"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","sourcesContent":[".drawerOverlay{background:rgba(0,0,0,.55);inset:0;position:fixed;transition:opacity var(--ac-transition-normal);z-index:50;@supports (-webkit-touch-callout:none){position:absolute}}.drawerOverlay[data-ending-style],.drawerOverlay[data-starting-style]{opacity:0}.drawerViewport{align-items:flex-end;display:flex;inset:0;justify-content:center;pointer-events:none;position:fixed;z-index:51}.drawerContent{background:var(--ac-popover);border:1px solid var(--ac-border);border-bottom:0;border-radius:var(--ac-radius-lg) var(--ac-radius-lg) 0 0;box-shadow:0 -16px 40px -16px rgba(0,0,0,.35);color:var(--ac-popover-foreground);display:flex;flex-direction:column;inset-inline:0;margin-top:6rem;max-height:95vh;padding:1rem 1rem 1.5rem;pointer-events:auto;position:relative;transition:opacity var(--ac-transition-normal),transform var(--ac-transition-normal);width:min(100%,48rem)}.drawerContent[data-ending-style],.drawerContent[data-starting-style]{opacity:0;transform:translateY(1rem)}.drawerInnerContent{display:flex;flex:1;flex-direction:column;min-height:0}.drawerHandle{background:var(--ac-border);border-radius:9999px;height:.25rem;margin:0 auto 1rem;width:4rem}.drawerHeader{display:grid;gap:.375rem;padding:0 0 1rem;text-align:center}.drawerTitle{font-size:var(--ac-text-lg);font-weight:600;letter-spacing:-.02em;line-height:1.2}.drawerFooter,.mobileFooter{display:flex;flex-direction:column;gap:.5rem;margin-top:auto;padding-top:1rem}.desktopFooter{padding:.5rem}.dropdownPositioner{z-index:50}.desktopContent,.dropdownContent,.dropdownSubContent{background:var(--ac-popover);border:1px solid var(--ac-border);border-radius:var(--ac-radius-md);box-shadow:0 16px 40px -16px rgba(0,0,0,.35);color:var(--ac-popover-foreground);min-width:13.75rem;overflow:hidden auto;transition:opacity var(--ac-transition-normal),transform var(--ac-transition-normal)}.desktopContent[data-ending-style],.desktopContent[data-starting-style],.dropdownContent[data-ending-style],.dropdownContent[data-starting-style],.dropdownSubContent[data-ending-style],.dropdownSubContent[data-starting-style]{opacity:0;transform:scale(.96)}.desktopContent,.dropdownContent{max-height:min(70vh,var(--available-height,70vh));padding:.25rem}.dropdownSubContent{max-height:min(60vh,var(--available-height,60vh));padding:.25rem}.desktopItem,.desktopSubTrigger{align-items:center;border-radius:var(--ac-radius-sm);color:inherit;cursor:default;display:flex;font-size:var(--ac-text-sm);gap:.5rem;min-height:2rem;outline:none;padding:.375rem .5rem;position:relative;user-select:none;width:100%}.desktopItem[data-highlighted],.desktopSubTrigger[data-highlighted],.desktopSubTrigger[data-popup-open]{background:var(--ac-accent);color:var(--ac-accent-foreground)}.desktopItem[data-disabled],.desktopSubTrigger[data-disabled]{opacity:.5;pointer-events:none}.desktopLabel{font-size:var(--ac-text-sm);font-weight:600;padding:.375rem .5rem}.desktopSeparator{background:var(--ac-border);height:1px;margin:.25rem -.25rem}.mobileContent{max-height:90vh}.mobileHeaderRow{align-items:center;display:flex;gap:.5rem}.backButton{align-items:center;background:transparent;border:0;border-radius:9999px;color:inherit;display:inline-flex;height:2rem;justify-content:center;padding:.25rem;width:2rem}.backButton:hover{background:color-mix(in oklch,var(--ac-muted),transparent 50%)}.backButton:focus-visible,.mobileItem:focus-visible{outline:2px solid var(--ac-ring);outline-offset:2px}.mobileMainViewport,.mobileViewport{overflow-y:auto}.mobileViewport{flex:1;max-height:70vh;position:relative}.mobileMainViewport{max-height:70vh}.mobileMotionPanel{min-height:100%;padding-bottom:1.5rem;width:100%}.screenReaderOnlyHeader{height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;clip:rect(0,0,0,0);border:0;white-space:nowrap}.mobileItem{align-items:center;background:transparent;border:0;color:inherit;cursor:pointer;display:flex;justify-content:space-between;padding:1rem;text-align:left;width:100%}.mobileStandaloneItem{background:var(--ac-muted);border-radius:var(--ac-radius-md);margin:.375rem .5rem}.mobileGroupedItem{background:transparent}.mobileLabelWrapper{padding:0}.mobileLabel{color:var(--ac-muted-foreground);font-size:var(--ac-text-sm);font-weight:500;padding:.5rem 1rem}.mobileGroup{background:var(--ac-muted);border-radius:var(--ac-radius-xl);margin:.75rem .5rem;overflow:hidden}.mobileGroupSeparator{background:var(--ac-border);height:1px}.itemChildren,.itemRow{align-items:center;display:flex;gap:.5rem}.itemRow{justify-content:space-between;width:100%}.chevron,.itemIcon{flex-shrink:0}.chevron{height:1rem;width:1rem}.inset{padding-left:2rem}.mobileItem[data-disabled=true]{opacity:.5;pointer-events:none}@media (min-width:640px){.drawerHeader{text-align:left}}",".drawerOverlay {\n transition: opacity var(--ac-transition-normal);\n z-index: 50;\n background: #0000008c;\n position: fixed;\n inset: 0;\n\n @supports (-webkit-touch-callout: none) {\n position: absolute;\n }\n}\n\n.drawerOverlay[data-ending-style], .drawerOverlay[data-starting-style] {\n opacity: 0;\n}\n\n.drawerViewport {\n pointer-events: none;\n z-index: 51;\n justify-content: center;\n align-items: flex-end;\n display: flex;\n position: fixed;\n inset: 0;\n}\n\n.drawerContent {\n background: var(--ac-popover);\n border: 1px solid var(--ac-border);\n border-radius: var(--ac-radius-lg) var(--ac-radius-lg) 0 0;\n color: var(--ac-popover-foreground);\n pointer-events: auto;\n max-height: 95vh;\n transition: opacity var(--ac-transition-normal),transform var(--ac-transition-normal);\n border-bottom: 0;\n flex-direction: column;\n width: min(100%, 48rem);\n margin-top: 6rem;\n padding: 1rem 1rem 1.5rem;\n display: flex;\n position: relative;\n inset-inline: 0;\n box-shadow: 0 -16px 40px -16px #00000059;\n}\n\n.drawerContent[data-ending-style], .drawerContent[data-starting-style] {\n opacity: 0;\n transform: translateY(1rem);\n}\n\n.drawerInnerContent {\n flex-direction: column;\n flex: 1;\n min-height: 0;\n display: flex;\n}\n\n.drawerHandle {\n background: var(--ac-border);\n border-radius: 9999px;\n width: 4rem;\n height: .25rem;\n margin: 0 auto 1rem;\n}\n\n.drawerHeader {\n text-align: center;\n gap: .375rem;\n padding: 0 0 1rem;\n display: grid;\n}\n\n.drawerTitle {\n font-size: var(--ac-text-lg);\n letter-spacing: -.02em;\n font-weight: 600;\n line-height: 1.2;\n}\n\n.drawerFooter, .mobileFooter {\n flex-direction: column;\n gap: .5rem;\n margin-top: auto;\n padding-top: 1rem;\n display: flex;\n}\n\n.desktopFooter {\n padding: .5rem;\n}\n\n.dropdownPositioner {\n z-index: 50;\n}\n\n.desktopContent, .dropdownContent, .dropdownSubContent {\n background: var(--ac-popover);\n border: 1px solid var(--ac-border);\n border-radius: var(--ac-radius-md);\n color: var(--ac-popover-foreground);\n min-width: 13.75rem;\n transition: opacity var(--ac-transition-normal),transform var(--ac-transition-normal);\n overflow: hidden auto;\n box-shadow: 0 16px 40px -16px #00000059;\n}\n\n.desktopContent[data-ending-style], .desktopContent[data-starting-style], .dropdownContent[data-ending-style], .dropdownContent[data-starting-style], .dropdownSubContent[data-ending-style], .dropdownSubContent[data-starting-style] {\n opacity: 0;\n transform: scale(.96);\n}\n\n.desktopContent, .dropdownContent {\n max-height: min(70vh,var(--available-height, 70vh));\n padding: .25rem;\n}\n\n.dropdownSubContent {\n max-height: min(60vh,var(--available-height, 60vh));\n padding: .25rem;\n}\n\n.desktopItem, .desktopSubTrigger {\n border-radius: var(--ac-radius-sm);\n color: inherit;\n cursor: default;\n font-size: var(--ac-text-sm);\n -webkit-user-select: none;\n user-select: none;\n outline: none;\n align-items: center;\n gap: .5rem;\n width: 100%;\n min-height: 2rem;\n padding: .375rem .5rem;\n display: flex;\n position: relative;\n}\n\n.desktopItem[data-highlighted], .desktopSubTrigger[data-highlighted], .desktopSubTrigger[data-popup-open] {\n background: var(--ac-accent);\n color: var(--ac-accent-foreground);\n}\n\n.desktopItem[data-disabled], .desktopSubTrigger[data-disabled] {\n opacity: .5;\n pointer-events: none;\n}\n\n.desktopLabel {\n font-size: var(--ac-text-sm);\n padding: .375rem .5rem;\n font-weight: 600;\n}\n\n.desktopSeparator {\n background: var(--ac-border);\n height: 1px;\n margin: .25rem -.25rem;\n}\n\n.mobileContent {\n max-height: 90vh;\n}\n\n.mobileHeaderRow {\n align-items: center;\n gap: .5rem;\n display: flex;\n}\n\n.backButton {\n color: inherit;\n background: none;\n border: 0;\n border-radius: 9999px;\n justify-content: center;\n align-items: center;\n width: 2rem;\n height: 2rem;\n padding: .25rem;\n display: inline-flex;\n}\n\n.backButton:hover {\n background: color-mix(in oklch,var(--ac-muted),transparent 50%);\n}\n\n.backButton:focus-visible, .mobileItem:focus-visible {\n outline: 2px solid var(--ac-ring);\n outline-offset: 2px;\n}\n\n.mobileMainViewport, .mobileViewport {\n overflow-y: auto;\n}\n\n.mobileViewport {\n flex: 1;\n max-height: 70vh;\n position: relative;\n}\n\n.mobileMainViewport {\n max-height: 70vh;\n}\n\n.mobileMotionPanel {\n width: 100%;\n min-height: 100%;\n padding-bottom: 1.5rem;\n}\n\n.screenReaderOnlyHeader {\n clip: rect(0,0,0,0);\n white-space: nowrap;\n border: 0;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n position: absolute;\n overflow: hidden;\n}\n\n.mobileItem {\n color: inherit;\n cursor: pointer;\n text-align: left;\n background: none;\n border: 0;\n justify-content: space-between;\n align-items: center;\n width: 100%;\n padding: 1rem;\n display: flex;\n}\n\n.mobileStandaloneItem {\n background: var(--ac-muted);\n border-radius: var(--ac-radius-md);\n margin: .375rem .5rem;\n}\n\n.mobileGroupedItem {\n background: none;\n}\n\n.mobileLabelWrapper {\n padding: 0;\n}\n\n.mobileLabel {\n color: var(--ac-muted-foreground);\n font-size: var(--ac-text-sm);\n padding: .5rem 1rem;\n font-weight: 500;\n}\n\n.mobileGroup {\n background: var(--ac-muted);\n border-radius: var(--ac-radius-xl);\n margin: .75rem .5rem;\n overflow: hidden;\n}\n\n.mobileGroupSeparator {\n background: var(--ac-border);\n height: 1px;\n}\n\n.itemChildren, .itemRow {\n align-items: center;\n gap: .5rem;\n display: flex;\n}\n\n.itemRow {\n justify-content: space-between;\n width: 100%;\n}\n\n.chevron, .itemIcon {\n flex-shrink: 0;\n}\n\n.chevron {\n width: 1rem;\n height: 1rem;\n}\n\n.inset {\n padding-left: 2rem;\n}\n\n.mobileItem[data-disabled=\"true\"] {\n opacity: .5;\n pointer-events: none;\n}\n\n@media (width >= 640px) {\n .drawerHeader {\n text-align: left;\n }\n}\n"],"sourceRoot":""}
|
|
@@ -1,39 +1,39 @@
|
|
|
1
1
|
import { jsx } from "react/jsx-runtime";
|
|
2
|
-
import { forwardRef } from "react";
|
|
3
2
|
import { cn } from "../../lib/utilities.js";
|
|
4
3
|
import empty_module from "./empty.module.js";
|
|
5
|
-
|
|
4
|
+
import * as __rspack_external_react from "react";
|
|
5
|
+
const Empty = /*#__PURE__*/ __rspack_external_react.forwardRef(({ className, ...props }, ref)=>/*#__PURE__*/ jsx("div", {
|
|
6
6
|
ref: ref,
|
|
7
7
|
"data-slot": "empty",
|
|
8
8
|
className: cn(empty_module.empty, className),
|
|
9
9
|
...props
|
|
10
10
|
}));
|
|
11
|
-
const EmptyHeader = /*#__PURE__*/ forwardRef(({ className, ...props }, ref)=>/*#__PURE__*/ jsx("div", {
|
|
11
|
+
const EmptyHeader = /*#__PURE__*/ __rspack_external_react.forwardRef(({ className, ...props }, ref)=>/*#__PURE__*/ jsx("div", {
|
|
12
12
|
ref: ref,
|
|
13
13
|
"data-slot": "empty-header",
|
|
14
14
|
className: cn(empty_module.header, className),
|
|
15
15
|
...props
|
|
16
16
|
}));
|
|
17
|
-
const EmptyMedia = /*#__PURE__*/ forwardRef(({ className, variant = "default", ...props }, ref)=>/*#__PURE__*/ jsx("div", {
|
|
17
|
+
const EmptyMedia = /*#__PURE__*/ __rspack_external_react.forwardRef(({ className, variant = "default", ...props }, ref)=>/*#__PURE__*/ jsx("div", {
|
|
18
18
|
ref: ref,
|
|
19
19
|
"data-slot": "empty-icon",
|
|
20
20
|
"data-variant": variant,
|
|
21
21
|
className: cn(empty_module.media, "icon" === variant && empty_module.mediaIcon, className),
|
|
22
22
|
...props
|
|
23
23
|
}));
|
|
24
|
-
const EmptyTitle = /*#__PURE__*/ forwardRef(({ className, ...props }, ref)=>/*#__PURE__*/ jsx("div", {
|
|
24
|
+
const EmptyTitle = /*#__PURE__*/ __rspack_external_react.forwardRef(({ className, ...props }, ref)=>/*#__PURE__*/ jsx("div", {
|
|
25
25
|
ref: ref,
|
|
26
26
|
"data-slot": "empty-title",
|
|
27
27
|
className: cn(empty_module.title, className),
|
|
28
28
|
...props
|
|
29
29
|
}));
|
|
30
|
-
const EmptyDescription = /*#__PURE__*/ forwardRef(({ className, ...props }, ref)=>/*#__PURE__*/ jsx("p", {
|
|
30
|
+
const EmptyDescription = /*#__PURE__*/ __rspack_external_react.forwardRef(({ className, ...props }, ref)=>/*#__PURE__*/ jsx("p", {
|
|
31
31
|
ref: ref,
|
|
32
32
|
"data-slot": "empty-description",
|
|
33
33
|
className: cn(empty_module.description, className),
|
|
34
34
|
...props
|
|
35
35
|
}));
|
|
36
|
-
const EmptyContent = /*#__PURE__*/ forwardRef(({ className, ...props }, ref)=>/*#__PURE__*/ jsx("div", {
|
|
36
|
+
const EmptyContent = /*#__PURE__*/ __rspack_external_react.forwardRef(({ className, ...props }, ref)=>/*#__PURE__*/ jsx("div", {
|
|
37
37
|
ref: ref,
|
|
38
38
|
"data-slot": "empty-content",
|
|
39
39
|
className: cn(empty_module.content, className),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"components/ui/empty.js","sources":["../../../src/components/ui/empty.tsx"],"sourcesContent":["import * as React from \"react\";\r\n\r\nimport {cn} from \"@/lib/utilities\";\r\nimport styles from \"./empty.module.css\";\r\n\r\n/** Supported visual treatments for {@link EmptyMedia}. */\r\nexport type EmptyMediaVariant = \"default\" | \"icon\";\r\n\r\n/**\r\n * Props for the {@link Empty} component.\r\n */\r\nexport type EmptyProps = React.ComponentPropsWithoutRef<\"div\">;\r\n\r\n/**\r\n * Props for the {@link EmptyHeader} component.\r\n */\r\nexport type EmptyHeaderProps = React.ComponentPropsWithoutRef<\"div\">;\r\n\r\n/**\r\n * Props for the {@link EmptyMedia} component.\r\n */\r\nexport interface EmptyMediaProps extends React.ComponentPropsWithoutRef<\"div\"> {\r\n /** Visual presentation applied to the media container. @default \"default\" */\r\n variant?: EmptyMediaVariant;\r\n}\r\n\r\n/**\r\n * Props for the {@link EmptyTitle} component.\r\n */\r\nexport type EmptyTitleProps = React.ComponentPropsWithoutRef<\"div\">;\r\n\r\n/**\r\n * Props for the {@link EmptyDescription} component.\r\n */\r\nexport type EmptyDescriptionProps = React.ComponentPropsWithoutRef<\"p\">;\r\n\r\n/**\r\n * Props for the {@link EmptyContent} component.\r\n */\r\nexport type EmptyContentProps = React.ComponentPropsWithoutRef<\"div\">;\r\n\r\n/**\r\n * Creates a structured empty-state container.\r\n *\r\n * @remarks\r\n * - Pure CSS component (no Base UI primitive)\r\n * - Renders a `<div>` element\r\n * - Styling via CSS Modules with `--ac-*` custom properties\r\n *\r\n * @example\r\n * ```tsx\r\n * <Empty>\r\n * <EmptyHeader />\r\n * </Empty>\r\n * ```\r\n *\r\n * @see {@link EmptyProps} for available props\r\n */\r\nconst Empty = React.forwardRef<HTMLDivElement, EmptyProps>(\r\n ({className, ...props}: Readonly<EmptyProps>, ref): React.JSX.Element => (\r\n <div\r\n ref={ref}\r\n data-slot='empty'\r\n className={cn(styles.empty, className)}\r\n {...props}\r\n />\r\n ),\r\n);\r\n\r\n/**\r\n * Groups the leading header content for an empty state.\r\n *\r\n * @remarks\r\n * - Pure CSS component (no Base UI primitive)\r\n * - Renders a `<div>` element\r\n * - Styling via CSS Modules with `--ac-*` custom properties\r\n *\r\n * @example\r\n * ```tsx\r\n * <EmptyHeader>Nothing here yet</EmptyHeader>\r\n * ```\r\n *\r\n * @see {@link EmptyHeaderProps} for available props\r\n */\r\nconst EmptyHeader = React.forwardRef<HTMLDivElement, EmptyHeaderProps>(\r\n ({className, ...props}: Readonly<EmptyHeaderProps>, ref): React.JSX.Element => (\r\n <div\r\n ref={ref}\r\n data-slot='empty-header'\r\n className={cn(styles.header, className)}\r\n {...props}\r\n />\r\n ),\r\n);\r\n\r\n/**\r\n * Hosts media or icon content for an empty state.\r\n *\r\n * @remarks\r\n * - Pure CSS component (no Base UI primitive)\r\n * - Renders a `<div>` element\r\n * - Styling via CSS Modules with `--ac-*` custom properties\r\n *\r\n * @example\r\n * ```tsx\r\n * <EmptyMedia variant='icon'>📭</EmptyMedia>\r\n * ```\r\n *\r\n * @see {@link EmptyMediaProps} for available props\r\n */\r\nconst EmptyMedia = React.forwardRef<HTMLDivElement, EmptyMediaProps>(\r\n ({className, variant = \"default\", ...props}: Readonly<EmptyMediaProps>, ref): React.JSX.Element => (\r\n <div\r\n ref={ref}\r\n data-slot='empty-icon'\r\n data-variant={variant}\r\n className={cn(styles.media, variant === \"icon\" && styles.mediaIcon, className)}\r\n {...props}\r\n />\r\n ),\r\n);\r\n\r\n/**\r\n * Renders the primary title for an empty state.\r\n *\r\n * @remarks\r\n * - Pure CSS component (no Base UI primitive)\r\n * - Renders a `<div>` element\r\n * - Styling via CSS Modules with `--ac-*` custom properties\r\n *\r\n * @example\r\n * ```tsx\r\n * <EmptyTitle>No results found</EmptyTitle>\r\n * ```\r\n *\r\n * @see {@link EmptyTitleProps} for available props\r\n */\r\nconst EmptyTitle = React.forwardRef<HTMLDivElement, EmptyTitleProps>(\r\n ({className, ...props}: Readonly<EmptyTitleProps>, ref): React.JSX.Element => (\r\n <div\r\n ref={ref}\r\n data-slot='empty-title'\r\n className={cn(styles.title, className)}\r\n {...props}\r\n />\r\n ),\r\n);\r\n\r\n/**\r\n * Renders supporting copy for an empty state.\r\n *\r\n * @remarks\r\n * - Pure CSS component (no Base UI primitive)\r\n * - Renders a `<p>` element\r\n * - Styling via CSS Modules with `--ac-*` custom properties\r\n *\r\n * @example\r\n * ```tsx\r\n * <EmptyDescription>Try adjusting your filters.</EmptyDescription>\r\n * ```\r\n *\r\n * @see {@link EmptyDescriptionProps} for available props\r\n */\r\nconst EmptyDescription = React.forwardRef<HTMLParagraphElement, EmptyDescriptionProps>(\r\n ({className, ...props}: Readonly<EmptyDescriptionProps>, ref): React.JSX.Element => (\r\n <p\r\n ref={ref}\r\n data-slot='empty-description'\r\n className={cn(styles.description, className)}\r\n {...props}\r\n />\r\n ),\r\n);\r\n\r\n/**\r\n * Hosts trailing actions or supplemental content for an empty state.\r\n *\r\n * @remarks\r\n * - Pure CSS component (no Base UI primitive)\r\n * - Renders a `<div>` element\r\n * - Styling via CSS Modules with `--ac-*` custom properties\r\n *\r\n * @example\r\n * ```tsx\r\n * <EmptyContent>\r\n * <button type='button'>Create item</button>\r\n * </EmptyContent>\r\n * ```\r\n *\r\n * @see {@link EmptyContentProps} for available props\r\n */\r\nconst EmptyContent = React.forwardRef<HTMLDivElement, EmptyContentProps>(\r\n ({className, ...props}: Readonly<EmptyContentProps>, ref): React.JSX.Element => (\r\n <div\r\n ref={ref}\r\n data-slot='empty-content'\r\n className={cn(styles.content, className)}\r\n {...props}\r\n />\r\n ),\r\n);\r\n\r\nEmpty.displayName = \"Empty\";\r\nEmptyHeader.displayName = \"EmptyHeader\";\r\nEmptyMedia.displayName = \"EmptyMedia\";\r\nEmptyTitle.displayName = \"EmptyTitle\";\r\nEmptyDescription.displayName = \"EmptyDescription\";\r\nEmptyContent.displayName = \"EmptyContent\";\r\n\r\nexport {Empty, EmptyContent, EmptyDescription, EmptyHeader, EmptyMedia, EmptyTitle};\r\n"],"names":["Empty","React","className","props","ref","cn","styles","EmptyHeader","EmptyMedia","variant","EmptyTitle","EmptyDescription","EmptyContent"],"mappings":";;;;AA0DA,MAAMA,QAAQ,WAAHA,GAAGC,
|
|
1
|
+
{"version":3,"file":"components/ui/empty.js","sources":["../../../src/components/ui/empty.tsx"],"sourcesContent":["import * as React from \"react\";\r\n\r\nimport {cn} from \"@/lib/utilities\";\r\nimport styles from \"./empty.module.css\";\r\n\r\n/** Supported visual treatments for {@link EmptyMedia}. */\r\nexport type EmptyMediaVariant = \"default\" | \"icon\";\r\n\r\n/**\r\n * Props for the {@link Empty} component.\r\n */\r\nexport type EmptyProps = React.ComponentPropsWithoutRef<\"div\">;\r\n\r\n/**\r\n * Props for the {@link EmptyHeader} component.\r\n */\r\nexport type EmptyHeaderProps = React.ComponentPropsWithoutRef<\"div\">;\r\n\r\n/**\r\n * Props for the {@link EmptyMedia} component.\r\n */\r\nexport interface EmptyMediaProps extends React.ComponentPropsWithoutRef<\"div\"> {\r\n /** Visual presentation applied to the media container. @default \"default\" */\r\n variant?: EmptyMediaVariant;\r\n}\r\n\r\n/**\r\n * Props for the {@link EmptyTitle} component.\r\n */\r\nexport type EmptyTitleProps = React.ComponentPropsWithoutRef<\"div\">;\r\n\r\n/**\r\n * Props for the {@link EmptyDescription} component.\r\n */\r\nexport type EmptyDescriptionProps = React.ComponentPropsWithoutRef<\"p\">;\r\n\r\n/**\r\n * Props for the {@link EmptyContent} component.\r\n */\r\nexport type EmptyContentProps = React.ComponentPropsWithoutRef<\"div\">;\r\n\r\n/**\r\n * Creates a structured empty-state container.\r\n *\r\n * @remarks\r\n * - Pure CSS component (no Base UI primitive)\r\n * - Renders a `<div>` element\r\n * - Styling via CSS Modules with `--ac-*` custom properties\r\n *\r\n * @example\r\n * ```tsx\r\n * <Empty>\r\n * <EmptyHeader />\r\n * </Empty>\r\n * ```\r\n *\r\n * @see {@link EmptyProps} for available props\r\n */\r\nconst Empty = React.forwardRef<HTMLDivElement, EmptyProps>(\r\n ({className, ...props}: Readonly<EmptyProps>, ref): React.JSX.Element => (\r\n <div\r\n ref={ref}\r\n data-slot='empty'\r\n className={cn(styles.empty, className)}\r\n {...props}\r\n />\r\n ),\r\n);\r\n\r\n/**\r\n * Groups the leading header content for an empty state.\r\n *\r\n * @remarks\r\n * - Pure CSS component (no Base UI primitive)\r\n * - Renders a `<div>` element\r\n * - Styling via CSS Modules with `--ac-*` custom properties\r\n *\r\n * @example\r\n * ```tsx\r\n * <EmptyHeader>Nothing here yet</EmptyHeader>\r\n * ```\r\n *\r\n * @see {@link EmptyHeaderProps} for available props\r\n */\r\nconst EmptyHeader = React.forwardRef<HTMLDivElement, EmptyHeaderProps>(\r\n ({className, ...props}: Readonly<EmptyHeaderProps>, ref): React.JSX.Element => (\r\n <div\r\n ref={ref}\r\n data-slot='empty-header'\r\n className={cn(styles.header, className)}\r\n {...props}\r\n />\r\n ),\r\n);\r\n\r\n/**\r\n * Hosts media or icon content for an empty state.\r\n *\r\n * @remarks\r\n * - Pure CSS component (no Base UI primitive)\r\n * - Renders a `<div>` element\r\n * - Styling via CSS Modules with `--ac-*` custom properties\r\n *\r\n * @example\r\n * ```tsx\r\n * <EmptyMedia variant='icon'>📭</EmptyMedia>\r\n * ```\r\n *\r\n * @see {@link EmptyMediaProps} for available props\r\n */\r\nconst EmptyMedia = React.forwardRef<HTMLDivElement, EmptyMediaProps>(\r\n ({className, variant = \"default\", ...props}: Readonly<EmptyMediaProps>, ref): React.JSX.Element => (\r\n <div\r\n ref={ref}\r\n data-slot='empty-icon'\r\n data-variant={variant}\r\n className={cn(styles.media, variant === \"icon\" && styles.mediaIcon, className)}\r\n {...props}\r\n />\r\n ),\r\n);\r\n\r\n/**\r\n * Renders the primary title for an empty state.\r\n *\r\n * @remarks\r\n * - Pure CSS component (no Base UI primitive)\r\n * - Renders a `<div>` element\r\n * - Styling via CSS Modules with `--ac-*` custom properties\r\n *\r\n * @example\r\n * ```tsx\r\n * <EmptyTitle>No results found</EmptyTitle>\r\n * ```\r\n *\r\n * @see {@link EmptyTitleProps} for available props\r\n */\r\nconst EmptyTitle = React.forwardRef<HTMLDivElement, EmptyTitleProps>(\r\n ({className, ...props}: Readonly<EmptyTitleProps>, ref): React.JSX.Element => (\r\n <div\r\n ref={ref}\r\n data-slot='empty-title'\r\n className={cn(styles.title, className)}\r\n {...props}\r\n />\r\n ),\r\n);\r\n\r\n/**\r\n * Renders supporting copy for an empty state.\r\n *\r\n * @remarks\r\n * - Pure CSS component (no Base UI primitive)\r\n * - Renders a `<p>` element\r\n * - Styling via CSS Modules with `--ac-*` custom properties\r\n *\r\n * @example\r\n * ```tsx\r\n * <EmptyDescription>Try adjusting your filters.</EmptyDescription>\r\n * ```\r\n *\r\n * @see {@link EmptyDescriptionProps} for available props\r\n */\r\nconst EmptyDescription = React.forwardRef<HTMLParagraphElement, EmptyDescriptionProps>(\r\n ({className, ...props}: Readonly<EmptyDescriptionProps>, ref): React.JSX.Element => (\r\n <p\r\n ref={ref}\r\n data-slot='empty-description'\r\n className={cn(styles.description, className)}\r\n {...props}\r\n />\r\n ),\r\n);\r\n\r\n/**\r\n * Hosts trailing actions or supplemental content for an empty state.\r\n *\r\n * @remarks\r\n * - Pure CSS component (no Base UI primitive)\r\n * - Renders a `<div>` element\r\n * - Styling via CSS Modules with `--ac-*` custom properties\r\n *\r\n * @example\r\n * ```tsx\r\n * <EmptyContent>\r\n * <button type='button'>Create item</button>\r\n * </EmptyContent>\r\n * ```\r\n *\r\n * @see {@link EmptyContentProps} for available props\r\n */\r\nconst EmptyContent = React.forwardRef<HTMLDivElement, EmptyContentProps>(\r\n ({className, ...props}: Readonly<EmptyContentProps>, ref): React.JSX.Element => (\r\n <div\r\n ref={ref}\r\n data-slot='empty-content'\r\n className={cn(styles.content, className)}\r\n {...props}\r\n />\r\n ),\r\n);\r\n\r\nEmpty.displayName = \"Empty\";\r\nEmptyHeader.displayName = \"EmptyHeader\";\r\nEmptyMedia.displayName = \"EmptyMedia\";\r\nEmptyTitle.displayName = \"EmptyTitle\";\r\nEmptyDescription.displayName = \"EmptyDescription\";\r\nEmptyContent.displayName = \"EmptyContent\";\r\n\r\nexport {Empty, EmptyContent, EmptyDescription, EmptyHeader, EmptyMedia, EmptyTitle};\r\n"],"names":["Empty","React","className","props","ref","cn","styles","EmptyHeader","EmptyMedia","variant","EmptyTitle","EmptyDescription","EmptyContent"],"mappings":";;;;AA0DA,MAAMA,QAAQ,WAAHA,GAAGC,wBAAAA,UAAgB,CAC5B,CAAC,EAACC,SAAS,EAAE,GAAGC,OAA4B,EAAEC,MAAAA,WAAAA,GAC5C,IAAC;QACC,KAAKA;QACL,aAAU;QACV,WAAWC,GAAGC,aAAAA,KAAY,EAAEJ;QAC3B,GAAGC,KAAK;;AAoBf,MAAMI,cAAc,WAAHA,GAAGN,wBAAAA,UAAgB,CAClC,CAAC,EAACC,SAAS,EAAE,GAAGC,OAAkC,EAAEC,MAAAA,WAAAA,GAClD,IAAC;QACC,KAAKA;QACL,aAAU;QACV,WAAWC,GAAGC,aAAAA,MAAa,EAAEJ;QAC5B,GAAGC,KAAK;;AAoBf,MAAMK,aAAa,WAAHA,GAAGP,wBAAAA,UAAgB,CACjC,CAAC,EAACC,SAAS,EAAEO,UAAU,SAAS,EAAE,GAAGN,OAAiC,EAAEC,MAAAA,WAAAA,GACtE,IAAC;QACC,KAAKA;QACL,aAAU;QACV,gBAAcK;QACd,WAAWJ,GAAGC,aAAAA,KAAY,EAAEG,AAAY,WAAZA,WAAsBH,aAAAA,SAAgB,EAAEJ;QACnE,GAAGC,KAAK;;AAoBf,MAAMO,aAAa,WAAHA,GAAGT,wBAAAA,UAAgB,CACjC,CAAC,EAACC,SAAS,EAAE,GAAGC,OAAiC,EAAEC,MAAAA,WAAAA,GACjD,IAAC;QACC,KAAKA;QACL,aAAU;QACV,WAAWC,GAAGC,aAAAA,KAAY,EAAEJ;QAC3B,GAAGC,KAAK;;AAoBf,MAAMQ,mBAAmB,WAAHA,GAAGV,wBAAAA,UAAgB,CACvC,CAAC,EAACC,SAAS,EAAE,GAAGC,OAAuC,EAAEC,MAAAA,WAAAA,GACvD,IAAC;QACC,KAAKA;QACL,aAAU;QACV,WAAWC,GAAGC,aAAAA,WAAkB,EAAEJ;QACjC,GAAGC,KAAK;;AAsBf,MAAMS,eAAe,WAAHA,GAAGX,wBAAAA,UAAgB,CACnC,CAAC,EAACC,SAAS,EAAE,GAAGC,OAAmC,EAAEC,MAAAA,WAAAA,GACnD,IAAC;QACC,KAAKA;QACL,aAAU;QACV,WAAWC,GAAGC,aAAAA,OAAc,EAAEJ;QAC7B,GAAGC,KAAK;;AAKfH,MAAM,WAAW,GAAG;AACpBO,YAAY,WAAW,GAAG;AAC1BC,WAAW,WAAW,GAAG;AACzBE,WAAW,WAAW,GAAG;AACzBC,iBAAiB,WAAW,GAAG;AAC/BC,aAAa,WAAW,GAAG"}
|
|
@@ -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/empty.module.css","webpack://./src/components/ui/empty.module.css"],"names":[],"mappings":"AAAA;ECCE,mCAAmC;EACnC,kCAAkC;EAClC,sBAAsB;EACtB,YAAY;EACZ,0BAA0B;EAC1B,UAAU;EACV,uBAAuB;AACzB;;ADR6K;ECW3K,kBAAkB;EAClB,sBAAsB;EACtB,mBAAmB;EACnB,aAAa;AACf;;ADfoQ;ECkBlQ,sBAAsB;EACtB,gBAAgB;AAClB;;ADpBkT;ECuBhT,gCAAgC;EAChC,uBAAuB;EACvB,mBAAmB;EACnB,aAAa;AACf;;AD3BgZ;EC8B9Y,cAAc;AAChB;;AD/Bgb;ECkC9a,iCAAiC;EACjC,kCAAkC;EAClC,kCAAkC;EAClC,2BAA2B;EAC3B,aAAa;EACb,cAAc;AAChB;;ADxCslB;EC2CplB,aAAa;EACb,cAAc;AAChB;;AD7CgoB;ECgD9nB,2BAA2B;EAC3B,4BAA4B;EAC5B,sBAAsB;EACtB,gBAAgB;AAClB;;ADpDouB;ECuDluB,iCAAiC;EACjC,4BAA4B;EAC5B,gBAAgB;AAClB;;AD1D8zB;EC6D5zB,cAAc;EACd,0BAA0B;EAC1B,0BAA0B;AAC5B;;ADhE+4B;EAAqB;ICoEh6B,2BAA2B;EAC7B;AACF;;ADtEq9B;ECyEn9B,4BAA4B;EAC5B,mBAAmB;EACnB,sBAAsB;EACtB,sBAAsB;EACtB,WAAW;EACX,YAAY;EACZ,gBAAgB;EAChB,aAAa;AACf","sourcesContent":[".empty{border:1px dashed var(--ac-border);border-radius:var(--ac-radius-lg);flex:1 1 auto;gap:var(--ac-space-6);justify-content:center;min-width:0;padding:var(--ac-space-6)}.empty,.header{align-items:center;display:flex;flex-direction:column;text-align:center}.header{gap:var(--ac-space-2);max-width:24rem}.media{align-items:center;display:flex;justify-content:center;margin-bottom:var(--ac-space-2)}.media,.media svg{flex-shrink:0}.mediaIcon{background-color:var(--ac-muted);border:1px solid var(--ac-border);border-radius:var(--ac-radius-lg);color:var(--ac-foreground);height:2.5rem;width:2.5rem}.mediaIcon svg{height:1.5rem;width:1.5rem}.title{color:var(--ac-foreground);font-size:var(--ac-text-lg);font-weight:600;letter-spacing:-.01em}.description{color:var(--ac-muted-foreground);font-size:var(--ac-text-sm);line-height:1.6}.description a{color:inherit;text-decoration:underline;text-underline-offset:4px}@media (hover:hover){.description a:hover{color:var(--ac-foreground)}}.content{align-items:center;display:flex;flex-direction:column;font-size:var(--ac-text-sm);gap:var(--ac-space-4);max-width:24rem;min-width:0;width:100%}",".empty {\n border: 1px dashed var(--ac-border);\n border-radius: var(--ac-radius-lg);\n gap: var(--ac-space-6);\n min-width: 0;\n padding: var(--ac-space-6);\n flex: auto;\n justify-content: center;\n}\n\n.empty, .header {\n text-align: center;\n flex-direction: column;\n align-items: center;\n display: flex;\n}\n\n.header {\n gap: var(--ac-space-2);\n max-width: 24rem;\n}\n\n.media {\n margin-bottom: var(--ac-space-2);\n justify-content: center;\n align-items: center;\n display: flex;\n}\n\n.media, .media svg {\n flex-shrink: 0;\n}\n\n.mediaIcon {\n background-color: var(--ac-muted);\n border: 1px solid var(--ac-border);\n border-radius: var(--ac-radius-lg);\n color: var(--ac-foreground);\n width: 2.5rem;\n height: 2.5rem;\n}\n\n.mediaIcon svg {\n width: 1.5rem;\n height: 1.5rem;\n}\n\n.title {\n color: var(--ac-foreground);\n font-size: var(--ac-text-lg);\n letter-spacing: -.01em;\n font-weight: 600;\n}\n\n.description {\n color: var(--ac-muted-foreground);\n font-size: var(--ac-text-sm);\n line-height: 1.6;\n}\n\n.description a {\n color: inherit;\n text-underline-offset: 4px;\n text-decoration: underline;\n}\n\n@media (hover: hover) {\n .description a:hover {\n color: var(--ac-foreground);\n }\n}\n\n.content {\n font-size: var(--ac-text-sm);\n align-items: center;\n gap: var(--ac-space-4);\n flex-direction: column;\n width: 100%;\n min-width: 0;\n max-width: 24rem;\n display: flex;\n}\n"],"sourceRoot":""}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
-
import { Component } from "react";
|
|
4
3
|
import error_boundary_module from "./error-boundary.module.js";
|
|
5
|
-
|
|
4
|
+
import * as __rspack_external_react from "react";
|
|
5
|
+
class ErrorBoundary extends __rspack_external_react.Component {
|
|
6
6
|
static getDerivedStateFromError(error) {
|
|
7
7
|
return {
|
|
8
8
|
error
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"components/ui/error-boundary.js","sources":["../../../src/components/ui/error-boundary.tsx"],"sourcesContent":["\"use client\";\r\n\r\nimport * as React from \"react\";\r\n\r\nimport styles from \"./error-boundary.module.css\";\r\n\r\n/**\r\n * Represents the configurable props for the {@link ErrorBoundary} component.\r\n *\r\n * @remarks\r\n * Accepts child content plus an optional fallback renderer and error callback for\r\n * recovery-oriented error handling in React client trees.\r\n */\r\ninterface ErrorBoundaryProps {\r\n /**\r\n * Content rendered when no error has been captured.\r\n */\r\n children: React.ReactNode;\r\n /**\r\n * Custom fallback UI or render function invoked with the current error and reset action.\r\n */\r\n fallback?: React.ReactNode | ((error: Error, reset: () => void) => React.ReactNode);\r\n /**\r\n * Callback invoked after an error has been captured.\r\n */\r\n onError?: (error: Error, errorInfo: React.ErrorInfo) => void;\r\n}\r\n\r\n/**\r\n * Represents the tracked state for the {@link ErrorBoundary} component.\r\n *\r\n * @remarks\r\n * Stores the most recent rendering error so the boundary can swap to fallback UI and\r\n * later clear that error when `reset()` is invoked.\r\n */\r\ninterface ErrorBoundaryState {\r\n /**\r\n * The latest captured error, or `null` when the subtree is healthy.\r\n */\r\n error: Error | null;\r\n}\r\n\r\n/**\r\n * Catches JavaScript errors in descendant client components and renders fallback UI.\r\n *\r\n * @remarks\r\n * **Rendering Context**: Client component.\r\n *\r\n * React currently requires class components for error boundaries. This implementation\r\n * captures render-time and lifecycle errors, not asynchronous event handler exceptions,\r\n * and exposes a `reset()` pathway so callers can retry the failed subtree.\r\n *\r\n * @example\r\n * ```tsx\r\n * <ErrorBoundary\r\n * fallback={(error, reset) => (\r\n * <div>\r\n * <p>Error: {error.message}</p>\r\n * <button onClick={reset}>Try again</button>\r\n * </div>\r\n * )}>\r\n * <DashboardPanel />\r\n * </ErrorBoundary>\r\n * ```\r\n *\r\n * @see {@link ErrorBoundaryProps} for available props\r\n */\r\nclass ErrorBoundary extends React.Component<ErrorBoundaryProps, ErrorBoundaryState> {\r\n static getDerivedStateFromError(error: Error): ErrorBoundaryState {\r\n return {error};\r\n }\r\n\r\n static readonly displayName = \"ErrorBoundary\";\r\n\r\n constructor(props: ErrorBoundaryProps) {\r\n super(props);\r\n this.state = {error: null};\r\n }\r\n\r\n override shouldComponentUpdate(nextProps: Readonly<ErrorBoundaryProps>, nextState: Readonly<ErrorBoundaryState>): boolean {\r\n const {children, fallback, onError} = this.props;\r\n const {error} = this.state;\r\n\r\n return nextProps.children !== children || nextProps.fallback !== fallback || nextProps.onError !== onError || nextState.error !== error;\r\n }\r\n\r\n override componentDidCatch(error: Error, errorInfo: React.ErrorInfo): void {\r\n const {onError} = this.props;\r\n\r\n onError?.(error, errorInfo);\r\n }\r\n\r\n handleReset = (): void => {\r\n // eslint-disable-next-line react/no-set-state -- Error boundaries must clear internal error state to retry rendering.\r\n this.setState({error: null});\r\n };\r\n\r\n // eslint-disable-next-line sonarjs/function-return-type -- Error boundary render paths intentionally return generic ReactNode content.\r\n override render(): React.ReactNode {\r\n const {error} = this.state;\r\n const {children, fallback} = this.props;\r\n const content: React.ReactNode =\r\n error === null\r\n ? children\r\n : typeof fallback === \"function\"\r\n ? fallback(error, this.handleReset)\r\n : (fallback ?? (\r\n <div\r\n className={styles.fallback}\r\n role='alert'>\r\n <p className={styles.title}>Something went wrong</p>\r\n <p className={styles.message}>{error.message}</p>\r\n <button\r\n type='button'\r\n className={styles.retry}\r\n onClick={this.handleReset}>\r\n Try again\r\n </button>\r\n </div>\r\n ));\r\n\r\n return content;\r\n }\r\n}\r\n\r\nexport {ErrorBoundary};\r\nexport type {ErrorBoundaryProps};\r\n"],"names":["ErrorBoundary","React","error","props","nextProps","nextState","children","fallback","onError","errorInfo","content","styles"],"mappings":";;;;AAmEA,MAAMA,sBAAsBC;
|
|
1
|
+
{"version":3,"file":"components/ui/error-boundary.js","sources":["../../../src/components/ui/error-boundary.tsx"],"sourcesContent":["\"use client\";\r\n\r\nimport * as React from \"react\";\r\n\r\nimport styles from \"./error-boundary.module.css\";\r\n\r\n/**\r\n * Represents the configurable props for the {@link ErrorBoundary} component.\r\n *\r\n * @remarks\r\n * Accepts child content plus an optional fallback renderer and error callback for\r\n * recovery-oriented error handling in React client trees.\r\n */\r\ninterface ErrorBoundaryProps {\r\n /**\r\n * Content rendered when no error has been captured.\r\n */\r\n children: React.ReactNode;\r\n /**\r\n * Custom fallback UI or render function invoked with the current error and reset action.\r\n */\r\n fallback?: React.ReactNode | ((error: Error, reset: () => void) => React.ReactNode);\r\n /**\r\n * Callback invoked after an error has been captured.\r\n */\r\n onError?: (error: Error, errorInfo: React.ErrorInfo) => void;\r\n}\r\n\r\n/**\r\n * Represents the tracked state for the {@link ErrorBoundary} component.\r\n *\r\n * @remarks\r\n * Stores the most recent rendering error so the boundary can swap to fallback UI and\r\n * later clear that error when `reset()` is invoked.\r\n */\r\ninterface ErrorBoundaryState {\r\n /**\r\n * The latest captured error, or `null` when the subtree is healthy.\r\n */\r\n error: Error | null;\r\n}\r\n\r\n/**\r\n * Catches JavaScript errors in descendant client components and renders fallback UI.\r\n *\r\n * @remarks\r\n * **Rendering Context**: Client component.\r\n *\r\n * React currently requires class components for error boundaries. This implementation\r\n * captures render-time and lifecycle errors, not asynchronous event handler exceptions,\r\n * and exposes a `reset()` pathway so callers can retry the failed subtree.\r\n *\r\n * @example\r\n * ```tsx\r\n * <ErrorBoundary\r\n * fallback={(error, reset) => (\r\n * <div>\r\n * <p>Error: {error.message}</p>\r\n * <button onClick={reset}>Try again</button>\r\n * </div>\r\n * )}>\r\n * <DashboardPanel />\r\n * </ErrorBoundary>\r\n * ```\r\n *\r\n * @see {@link ErrorBoundaryProps} for available props\r\n */\r\nclass ErrorBoundary extends React.Component<ErrorBoundaryProps, ErrorBoundaryState> {\r\n static getDerivedStateFromError(error: Error): ErrorBoundaryState {\r\n return {error};\r\n }\r\n\r\n static readonly displayName = \"ErrorBoundary\";\r\n\r\n constructor(props: ErrorBoundaryProps) {\r\n super(props);\r\n this.state = {error: null};\r\n }\r\n\r\n override shouldComponentUpdate(nextProps: Readonly<ErrorBoundaryProps>, nextState: Readonly<ErrorBoundaryState>): boolean {\r\n const {children, fallback, onError} = this.props;\r\n const {error} = this.state;\r\n\r\n return nextProps.children !== children || nextProps.fallback !== fallback || nextProps.onError !== onError || nextState.error !== error;\r\n }\r\n\r\n override componentDidCatch(error: Error, errorInfo: React.ErrorInfo): void {\r\n const {onError} = this.props;\r\n\r\n onError?.(error, errorInfo);\r\n }\r\n\r\n handleReset = (): void => {\r\n // eslint-disable-next-line react/no-set-state -- Error boundaries must clear internal error state to retry rendering.\r\n this.setState({error: null});\r\n };\r\n\r\n // eslint-disable-next-line sonarjs/function-return-type -- Error boundary render paths intentionally return generic ReactNode content.\r\n override render(): React.ReactNode {\r\n const {error} = this.state;\r\n const {children, fallback} = this.props;\r\n const content: React.ReactNode =\r\n error === null\r\n ? children\r\n : typeof fallback === \"function\"\r\n ? fallback(error, this.handleReset)\r\n : (fallback ?? (\r\n <div\r\n className={styles.fallback}\r\n role='alert'>\r\n <p className={styles.title}>Something went wrong</p>\r\n <p className={styles.message}>{error.message}</p>\r\n <button\r\n type='button'\r\n className={styles.retry}\r\n onClick={this.handleReset}>\r\n Try again\r\n </button>\r\n </div>\r\n ));\r\n\r\n return content;\r\n }\r\n}\r\n\r\nexport {ErrorBoundary};\r\nexport type {ErrorBoundaryProps};\r\n"],"names":["ErrorBoundary","React","error","props","nextProps","nextState","children","fallback","onError","errorInfo","content","styles"],"mappings":";;;;AAmEA,MAAMA,sBAAsBC,wBAAAA,SAAe;IACzC,OAAO,yBAAyBC,KAAY,EAAsB;QAChE,OAAO;YAACA;QAAK;IACf;;aAEgB,WAAW,GAAG;;IAE9B,YAAYC,KAAyB,CAAE;QACrC,KAAK,CAACA,QAAAA,IAAAA,CAiBR,WAAW,GAAG;YAEZ,IAAI,CAAC,QAAQ,CAAC;gBAAC,OAAO;YAAI;QAC5B;QAnBE,IAAI,CAAC,KAAK,GAAG;YAAC,OAAO;QAAI;IAC3B;IAES,sBAAsBC,SAAuC,EAAEC,SAAuC,EAAW;QACxH,MAAM,EAACC,QAAQ,EAAEC,QAAQ,EAAEC,OAAO,EAAC,GAAG,IAAI,CAAC,KAAK;QAChD,MAAM,EAACN,KAAK,EAAC,GAAG,IAAI,CAAC,KAAK;QAE1B,OAAOE,UAAU,QAAQ,KAAKE,YAAYF,UAAU,QAAQ,KAAKG,YAAYH,UAAU,OAAO,KAAKI,WAAWH,UAAU,KAAK,KAAKH;IACpI;IAES,kBAAkBA,KAAY,EAAEO,SAA0B,EAAQ;QACzE,MAAM,EAACD,OAAO,EAAC,GAAG,IAAI,CAAC,KAAK;QAE5BA,UAAUN,OAAOO;IACnB;IAQS,SAA0B;QACjC,MAAM,EAACP,KAAK,EAAC,GAAG,IAAI,CAAC,KAAK;QAC1B,MAAM,EAACI,QAAQ,EAAEC,QAAQ,EAAC,GAAG,IAAI,CAAC,KAAK;QACvC,MAAMG,UACJR,AAAU,SAAVA,QACII,WACA,AAAoB,cAApB,OAAOC,WACLA,SAASL,OAAO,IAAI,CAAC,WAAW,IAC/BK,YAAY,WAAZA,GACC,KAAC;YACC,WAAWI,sBAAAA,QAAe;YAC1B,MAAK;;8BACL,IAAC;oBAAE,WAAWA,sBAAAA,KAAY;8BAAE;;8BAC5B,IAAC;oBAAE,WAAWA,sBAAAA,OAAc;8BAAGT,MAAM,OAAO;;8BAC5C,IAAC;oBACC,MAAK;oBACL,WAAWS,sBAAAA,KAAY;oBACvB,SAAS,IAAI,CAAC,WAAW;8BAAE;;;;QAMzC,OAAOD;IACT;AACF"}
|
|
@@ -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/error-boundary.module.css","webpack://./src/components/ui/error-boundary.module.css"],"names":[],"mappings":"AAAA;ECCE,mBAAmB;EACnB,sBAAsB;EACtB,0BAA0B;EAC1B,kBAAkB;EAClB,sBAAsB;EACtB,uBAAuB;EACvB,aAAa;AACf;;ADRyJ;ECWvJ,4BAA4B;EAC5B,4BAA4B;EAC5B,gBAAgB;AAClB;;ADdwO;ECiBtO,iCAAiC;EACjC,gBAAgB;AAClB;;ADnBkS;ECsBhS,4BAA4B;AAC9B;;ADvB8U;EC0B5U,sCAAsC;EACtC,kCAAkC;EAClC,kCAAkC;EAClC,2BAA2B;EAC3B,eAAe;EACf,4CAA4C;EAC5C,sDAAsD;AACxD;;ADjC2kB;ECoCzkB,kCAAkC;AACpC","sourcesContent":[".fallback{align-items:center;display:flex;flex-direction:column;gap:var(--ac-space-3);justify-content:center;padding:var(--ac-space-8);text-align:center}.title{color:var(--ac-destructive);font-size:var(--ac-text-lg);font-weight:600}.message{color:var(--ac-muted-foreground);max-width:32rem}.message,.retry{font-size:var(--ac-text-sm)}.retry{background-color:var(--ac-background);border:1px solid var(--ac-border);border-radius:var(--ac-radius-md);color:var(--ac-foreground);cursor:pointer;padding:var(--ac-space-2) var(--ac-space-4);transition:background-color var(--ac-transition-fast)}.retry:hover{background-color:var(--ac-accent)}",".fallback {\n align-items: center;\n gap: var(--ac-space-3);\n padding: var(--ac-space-8);\n text-align: center;\n flex-direction: column;\n justify-content: center;\n display: flex;\n}\n\n.title {\n color: var(--ac-destructive);\n font-size: var(--ac-text-lg);\n font-weight: 600;\n}\n\n.message {\n color: var(--ac-muted-foreground);\n max-width: 32rem;\n}\n\n.message, .retry {\n font-size: var(--ac-text-sm);\n}\n\n.retry {\n background-color: var(--ac-background);\n border: 1px solid var(--ac-border);\n border-radius: var(--ac-radius-md);\n color: var(--ac-foreground);\n cursor: pointer;\n padding: var(--ac-space-2) var(--ac-space-4);\n transition: background-color var(--ac-transition-fast);\n}\n\n.retry:hover {\n background-color: var(--ac-accent);\n}\n"],"sourceRoot":""}
|