@burtson-labs/ui 0.13.1 → 0.14.1
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/LICENSES/DEPENDENCIES.txt +2745 -0
- package/LICENSES/Radix-MIT.txt +21 -0
- package/LICENSES/cmdk-MIT.txt +21 -0
- package/LICENSES/overrides/react-remove-scroll-bar.txt +26 -0
- package/LICENSES/shadcn-MIT.txt +21 -0
- package/README.md +20 -12
- package/THIRD_PARTY_NOTICES.md +15 -3
- package/dist/components/accordion.d.ts +4 -4
- package/dist/components/accordion.js +22 -18
- package/dist/components/accordion.js.map +1 -1
- package/dist/components/alert-dialog.d.ts +13 -11
- package/dist/components/alert-dialog.js +41 -31
- package/dist/components/alert-dialog.js.map +1 -1
- package/dist/components/alert.d.ts +5 -3
- package/dist/components/alert.js +12 -7
- package/dist/components/alert.js.map +1 -1
- package/dist/components/app-shell.d.ts +7 -6
- package/dist/components/app-shell.js +22 -14
- package/dist/components/app-shell.js.map +1 -1
- package/dist/components/attachment.d.ts +3 -3
- package/dist/components/attachment.js +11 -7
- package/dist/components/attachment.js.map +1 -1
- package/dist/components/audio-player.d.ts +2 -2
- package/dist/components/audio-player.js +9 -6
- package/dist/components/audio-player.js.map +1 -1
- package/dist/components/avatar.d.ts +4 -4
- package/dist/components/avatar.js +16 -12
- package/dist/components/avatar.js.map +1 -1
- package/dist/components/badge.d.ts +1 -1
- package/dist/components/badge.js +15 -13
- package/dist/components/badge.js.map +1 -1
- package/dist/components/breadcrumb.d.ts +8 -8
- package/dist/components/breadcrumb.js +27 -20
- package/dist/components/breadcrumb.js.map +1 -1
- package/dist/components/button.d.ts +9 -2
- package/dist/components/button.js +15 -6
- package/dist/components/button.js.map +1 -1
- package/dist/components/card.d.ts +9 -9
- package/dist/components/card.js +33 -23
- package/dist/components/card.js.map +1 -1
- package/dist/components/chat-history.d.ts +1 -1
- package/dist/components/chat-history.js +11 -9
- package/dist/components/chat-history.js.map +1 -1
- package/dist/components/chat-layout.d.ts +1 -1
- package/dist/components/chat-layout.js +8 -3
- package/dist/components/chat-layout.js.map +1 -1
- package/dist/components/checkbox-card.d.ts +3 -3
- package/dist/components/checkbox-card.js +12 -10
- package/dist/components/checkbox-card.js.map +1 -1
- package/dist/components/checkbox.d.ts +24 -3
- package/dist/components/checkbox.js +52 -9
- package/dist/components/checkbox.js.map +1 -1
- package/dist/components/collapsible.d.ts +3 -3
- package/dist/components/collapsible.js +14 -11
- package/dist/components/collapsible.js.map +1 -1
- package/dist/components/combobox.d.ts +14 -4
- package/dist/components/combobox.js +19 -8
- package/dist/components/combobox.js.map +1 -1
- package/dist/components/command.d.ts +68 -12
- package/dist/components/command.js +48 -34
- package/dist/components/command.js.map +1 -1
- package/dist/components/composer.d.ts +2 -2
- package/dist/components/composer.js +10 -7
- package/dist/components/composer.js.map +1 -1
- package/dist/components/connection-status.d.ts +3 -3
- package/dist/components/connection-status.js +19 -14
- package/dist/components/connection-status.js.map +1 -1
- package/dist/components/context-menu.d.ts +15 -14
- package/dist/components/context-menu.js +52 -41
- package/dist/components/context-menu.js.map +1 -1
- package/dist/components/conversation.d.ts +1 -1
- package/dist/components/conversation.js +7 -5
- package/dist/components/conversation.js.map +1 -1
- package/dist/components/copy-button.d.ts +1 -1
- package/dist/components/copy-button.js +4 -2
- package/dist/components/copy-button.js.map +1 -1
- package/dist/components/data-table.d.ts +7 -2
- package/dist/components/data-table.js +17 -42
- package/dist/components/data-table.js.map +1 -1
- package/dist/components/dialog.d.ts +19 -10
- package/dist/components/dialog.js +50 -33
- package/dist/components/dialog.js.map +1 -1
- package/dist/components/dropdown-menu.d.ts +15 -14
- package/dist/components/dropdown-menu.js +52 -41
- package/dist/components/dropdown-menu.js.map +1 -1
- package/dist/components/editor-tabs.d.ts +1 -1
- package/dist/components/editor-tabs.js +7 -5
- package/dist/components/editor-tabs.js.map +1 -1
- package/dist/components/empty-state.d.ts +5 -5
- package/dist/components/empty-state.js +17 -11
- package/dist/components/empty-state.js.map +1 -1
- package/dist/components/error-summary.d.ts +21 -0
- package/dist/components/error-summary.js +62 -0
- package/dist/components/error-summary.js.map +1 -0
- package/dist/components/field.d.ts +66 -7
- package/dist/components/field.js +152 -20
- package/dist/components/field.js.map +1 -1
- package/dist/components/form-actions.d.ts +18 -0
- package/dist/components/form-actions.js +30 -0
- package/dist/components/form-actions.js.map +1 -0
- package/dist/components/icon-button.d.ts +3 -1
- package/dist/components/icon-button.js +6 -3
- package/dist/components/icon-button.js.map +1 -1
- package/dist/components/input.d.ts +42 -7
- package/dist/components/input.js +54 -10
- package/dist/components/input.js.map +1 -1
- package/dist/components/kbd.d.ts +2 -2
- package/dist/components/kbd.js +8 -5
- package/dist/components/kbd.js.map +1 -1
- package/dist/components/label.d.ts +7 -2
- package/dist/components/label.js +14 -7
- package/dist/components/label.js.map +1 -1
- package/dist/components/markdown.d.ts +4 -3
- package/dist/components/markdown.js +8 -6
- package/dist/components/markdown.js.map +1 -1
- package/dist/components/menubar.d.ts +17 -15
- package/dist/components/menubar.js +58 -45
- package/dist/components/menubar.js.map +1 -1
- package/dist/components/message-actions.d.ts +3 -3
- package/dist/components/message-actions.js +16 -12
- package/dist/components/message-actions.js.map +1 -1
- package/dist/components/message.d.ts +1 -1
- package/dist/components/message.js +6 -3
- package/dist/components/message.js.map +1 -1
- package/dist/components/mobile-nav.d.ts +1 -1
- package/dist/components/mobile-nav.js +7 -5
- package/dist/components/mobile-nav.js.map +1 -1
- package/dist/components/native-select.d.ts +16 -0
- package/dist/components/native-select.js +33 -0
- package/dist/components/native-select.js.map +1 -0
- package/dist/components/navigation-menu.d.ts +13 -12
- package/dist/components/navigation-menu.js +43 -33
- package/dist/components/navigation-menu.js.map +1 -1
- package/dist/components/number-input.d.ts +23 -0
- package/dist/components/number-input.js +45 -0
- package/dist/components/number-input.js.map +1 -0
- package/dist/components/onboarding-checklist.d.ts +1 -1
- package/dist/components/onboarding-checklist.js +5 -3
- package/dist/components/onboarding-checklist.js.map +1 -1
- package/dist/components/page-header.d.ts +7 -6
- package/dist/components/page-header.js +23 -15
- package/dist/components/page-header.js.map +1 -1
- package/dist/components/pagination.d.ts +1 -1
- package/dist/components/pagination.js +4 -2
- package/dist/components/pagination.js.map +1 -1
- package/dist/components/popover.d.ts +14 -11
- package/dist/components/popover.js +30 -23
- package/dist/components/popover.js.map +1 -1
- package/dist/components/progress.d.ts +2 -2
- package/dist/components/progress.js +11 -9
- package/dist/components/progress.js.map +1 -1
- package/dist/components/radio-group.d.ts +23 -4
- package/dist/components/radio-group.js +56 -14
- package/dist/components/radio-group.js.map +1 -1
- package/dist/components/reasoning.d.ts +3 -3
- package/dist/components/reasoning.js +14 -11
- package/dist/components/reasoning.js.map +1 -1
- package/dist/components/resizable.js +1 -0
- package/dist/components/resizable.js.map +1 -1
- package/dist/components/scroll-area.d.ts +4 -3
- package/dist/components/scroll-area.js +18 -14
- package/dist/components/scroll-area.js.map +1 -1
- package/dist/components/secret-input.d.ts +3 -2
- package/dist/components/secret-input.js +7 -4
- package/dist/components/secret-input.js.map +1 -1
- package/dist/components/select.d.ts +12 -7
- package/dist/components/select.js +42 -35
- package/dist/components/select.js.map +1 -1
- package/dist/components/separator.d.ts +2 -2
- package/dist/components/separator.js +8 -6
- package/dist/components/separator.js.map +1 -1
- package/dist/components/sheet.d.ts +11 -9
- package/dist/components/sheet.js +41 -29
- package/dist/components/sheet.js.map +1 -1
- package/dist/components/skeleton.d.ts +2 -1
- package/dist/components/skeleton.js +7 -4
- package/dist/components/skeleton.js.map +1 -1
- package/dist/components/slider.d.ts +10 -6
- package/dist/components/slider.js +16 -7
- package/dist/components/slider.js.map +1 -1
- package/dist/components/source.d.ts +2 -2
- package/dist/components/source.js +10 -7
- package/dist/components/source.js.map +1 -1
- package/dist/components/spinner.d.ts +4 -2
- package/dist/components/spinner.js +5 -3
- package/dist/components/spinner.js.map +1 -1
- package/dist/components/stat-card.d.ts +27 -2
- package/dist/components/stat-card.js +70 -9
- package/dist/components/stat-card.js.map +1 -1
- package/dist/components/status.d.ts +7 -6
- package/dist/components/status.js +12 -5
- package/dist/components/status.js.map +1 -1
- package/dist/components/steps.d.ts +1 -1
- package/dist/components/steps.js +5 -3
- package/dist/components/steps.js.map +1 -1
- package/dist/components/switch.d.ts +47 -3
- package/dist/components/switch.js +89 -11
- package/dist/components/switch.js.map +1 -1
- package/dist/components/table.d.ts +29 -12
- package/dist/components/table.js +80 -34
- package/dist/components/table.js.map +1 -1
- package/dist/components/tabs.d.ts +10 -5
- package/dist/components/tabs.js +29 -19
- package/dist/components/tabs.js.map +1 -1
- package/dist/components/textarea.d.ts +6 -1
- package/dist/components/textarea.js +4 -3
- package/dist/components/textarea.js.map +1 -1
- package/dist/components/toast.d.ts +11 -7
- package/dist/components/toast.js +37 -27
- package/dist/components/toast.js.map +1 -1
- package/dist/components/toaster.d.ts +4 -2
- package/dist/components/toaster.js +7 -2
- package/dist/components/toaster.js.map +1 -1
- package/dist/components/tool-call.d.ts +2 -2
- package/dist/components/tool-call.js +15 -12
- package/dist/components/tool-call.js.map +1 -1
- package/dist/components/toolbar.d.ts +9 -4
- package/dist/components/toolbar.js +15 -9
- package/dist/components/toolbar.js.map +1 -1
- package/dist/components/tooltip.d.ts +4 -3
- package/dist/components/tooltip.js +17 -13
- package/dist/components/tooltip.js.map +1 -1
- package/dist/components/tour.js +10 -8
- package/dist/components/tour.js.map +1 -1
- package/dist/components/tree-view.d.ts +1 -1
- package/dist/components/tree-view.js +10 -5
- package/dist/components/tree-view.js.map +1 -1
- package/dist/components/voice-recorder.d.ts +1 -1
- package/dist/components/voice-recorder.js +5 -2
- package/dist/components/voice-recorder.js.map +1 -1
- package/dist/index.d.ts +6 -1
- package/dist/index.js +17 -12
- package/dist/lib/media.d.ts +18 -0
- package/dist/lib/media.js +34 -0
- package/dist/lib/media.js.map +1 -0
- package/dist/lib/utils.d.ts +32 -0
- package/dist/lib/utils.js +33 -1
- package/dist/lib/utils.js.map +1 -1
- package/dist/mui/index.js +20 -8
- package/dist/mui/index.js.map +1 -1
- package/dist/primitives/vendor/cmdk/command-score.d.ts +1 -0
- package/dist/primitives/vendor/cmdk/command-score.js +64 -0
- package/dist/primitives/vendor/cmdk/command-score.js.map +1 -0
- package/dist/primitives/vendor/cmdk/index.d.ts +384 -0
- package/dist/primitives/vendor/cmdk/index.js +687 -0
- package/dist/primitives/vendor/cmdk/index.js.map +1 -0
- package/dist/primitives/vendor/radix/number/index.d.ts +1 -0
- package/dist/primitives/vendor/radix/number/number.d.ts +2 -0
- package/dist/primitives/vendor/radix/number/number.js +9 -0
- package/dist/primitives/vendor/radix/number/number.js.map +1 -0
- package/dist/primitives/vendor/radix/primitive/index.d.ts +2 -0
- package/dist/primitives/vendor/radix/primitive/is-development.d.ts +1 -0
- package/dist/primitives/vendor/radix/primitive/is-development.js +7 -0
- package/dist/primitives/vendor/radix/primitive/is-development.js.map +1 -0
- package/dist/primitives/vendor/radix/primitive/primitive.d.ts +14 -0
- package/dist/primitives/vendor/radix/primitive/primitive.js +12 -0
- package/dist/primitives/vendor/radix/primitive/primitive.js.map +1 -0
- package/dist/primitives/vendor/radix/primitive/types.d.ts +5 -0
- package/dist/primitives/vendor/radix/react-accordion/accordion.d.ts +112 -0
- package/dist/primitives/vendor/radix/react-accordion/accordion.js +266 -0
- package/dist/primitives/vendor/radix/react-accordion/accordion.js.map +1 -0
- package/dist/primitives/vendor/radix/react-accordion/index.d.ts +2 -0
- package/dist/primitives/vendor/radix/react-alert-dialog/alert-dialog.d.ts +49 -0
- package/dist/primitives/vendor/radix/react-alert-dialog/alert-dialog.js +122 -0
- package/dist/primitives/vendor/radix/react-alert-dialog/alert-dialog.js.map +1 -0
- package/dist/primitives/vendor/radix/react-alert-dialog/index.d.ts +2 -0
- package/dist/primitives/vendor/radix/react-arrow/arrow.d.ts +9 -0
- package/dist/primitives/vendor/radix/react-arrow/arrow.js +22 -0
- package/dist/primitives/vendor/radix/react-arrow/arrow.js.map +1 -0
- package/dist/primitives/vendor/radix/react-arrow/index.d.ts +2 -0
- package/dist/primitives/vendor/radix/react-avatar/avatar.d.ts +19 -0
- package/dist/primitives/vendor/radix/react-avatar/avatar.js +132 -0
- package/dist/primitives/vendor/radix/react-avatar/avatar.js.map +1 -0
- package/dist/primitives/vendor/radix/react-avatar/index.d.ts +2 -0
- package/dist/primitives/vendor/radix/react-checkbox/checkbox.d.ts +47 -0
- package/dist/primitives/vendor/radix/react-checkbox/checkbox.js +197 -0
- package/dist/primitives/vendor/radix/react-checkbox/checkbox.js.map +1 -0
- package/dist/primitives/vendor/radix/react-checkbox/index.d.ts +2 -0
- package/dist/primitives/vendor/radix/react-collapsible/collapsible.d.ts +31 -0
- package/dist/primitives/vendor/radix/react-collapsible/collapsible.js +133 -0
- package/dist/primitives/vendor/radix/react-collapsible/collapsible.js.map +1 -0
- package/dist/primitives/vendor/radix/react-collapsible/index.d.ts +2 -0
- package/dist/primitives/vendor/radix/react-collection/collection-legacy.d.ts +21 -0
- package/dist/primitives/vendor/radix/react-collection/collection-legacy.js +84 -0
- package/dist/primitives/vendor/radix/react-collection/collection-legacy.js.map +1 -0
- package/dist/primitives/vendor/radix/react-collection/collection.d.ts +32 -0
- package/dist/primitives/vendor/radix/react-collection/index.d.ts +4 -0
- package/dist/primitives/vendor/radix/react-collection/ordered-dictionary.d.ts +51 -0
- package/dist/primitives/vendor/radix/react-compose-refs/compose-refs.d.ts +13 -0
- package/dist/primitives/vendor/radix/react-compose-refs/compose-refs.js +43 -0
- package/dist/primitives/vendor/radix/react-compose-refs/compose-refs.js.map +1 -0
- package/dist/primitives/vendor/radix/react-compose-refs/index.d.ts +1 -0
- package/dist/primitives/vendor/radix/react-context/create-context.d.ts +45 -0
- package/dist/primitives/vendor/radix/react-context/create-context.js +74 -0
- package/dist/primitives/vendor/radix/react-context/create-context.js.map +1 -0
- package/dist/primitives/vendor/radix/react-context/index.d.ts +2 -0
- package/dist/primitives/vendor/radix/react-context-menu/context-menu.d.ts +95 -0
- package/dist/primitives/vendor/radix/react-context-menu/context-menu.js +279 -0
- package/dist/primitives/vendor/radix/react-context-menu/context-menu.js.map +1 -0
- package/dist/primitives/vendor/radix/react-context-menu/index.d.ts +2 -0
- package/dist/primitives/vendor/radix/react-dialog/dialog.d.ts +97 -0
- package/dist/primitives/vendor/radix/react-dialog/dialog.js +262 -0
- package/dist/primitives/vendor/radix/react-dialog/dialog.js.map +1 -0
- package/dist/primitives/vendor/radix/react-dialog/index.d.ts +4 -0
- package/dist/primitives/vendor/radix/react-direction/direction.d.ts +10 -0
- package/dist/primitives/vendor/radix/react-direction/direction.js +13 -0
- package/dist/primitives/vendor/radix/react-direction/direction.js.map +1 -0
- package/dist/primitives/vendor/radix/react-direction/index.d.ts +1 -0
- package/dist/primitives/vendor/radix/react-dismissable-layer/dismissable-layer.d.ts +61 -0
- package/dist/primitives/vendor/radix/react-dismissable-layer/dismissable-layer.js +336 -0
- package/dist/primitives/vendor/radix/react-dismissable-layer/dismissable-layer.js.map +1 -0
- package/dist/primitives/vendor/radix/react-dismissable-layer/index.d.ts +4 -0
- package/dist/primitives/vendor/radix/react-dropdown-menu/dropdown-menu.d.ts +95 -0
- package/dist/primitives/vendor/radix/react-dropdown-menu/dropdown-menu.js +257 -0
- package/dist/primitives/vendor/radix/react-dropdown-menu/dropdown-menu.js.map +1 -0
- package/dist/primitives/vendor/radix/react-dropdown-menu/index.d.ts +2 -0
- package/dist/primitives/vendor/radix/react-focus-guards/focus-guards.d.ts +11 -0
- package/dist/primitives/vendor/radix/react-focus-guards/focus-guards.js +49 -0
- package/dist/primitives/vendor/radix/react-focus-guards/focus-guards.js.map +1 -0
- package/dist/primitives/vendor/radix/react-focus-guards/index.d.ts +1 -0
- package/dist/primitives/vendor/radix/react-focus-scope/focus-scope.d.ts +31 -0
- package/dist/primitives/vendor/radix/react-focus-scope/focus-scope.js +221 -0
- package/dist/primitives/vendor/radix/react-focus-scope/focus-scope.js.map +1 -0
- package/dist/primitives/vendor/radix/react-focus-scope/index.d.ts +1 -0
- package/dist/primitives/vendor/radix/react-id/id.d.ts +2 -0
- package/dist/primitives/vendor/radix/react-id/id.js +17 -0
- package/dist/primitives/vendor/radix/react-id/id.js.map +1 -0
- package/dist/primitives/vendor/radix/react-id/index.d.ts +1 -0
- package/dist/primitives/vendor/radix/react-label/index.d.ts +2 -0
- package/dist/primitives/vendor/radix/react-label/label.d.ts +9 -0
- package/dist/primitives/vendor/radix/react-label/label.js +21 -0
- package/dist/primitives/vendor/radix/react-label/label.js.map +1 -0
- package/dist/primitives/vendor/radix/react-menu/index.d.ts +2 -0
- package/dist/primitives/vendor/radix/react-menu/menu.d.ts +173 -0
- package/dist/primitives/vendor/radix/react-menu/menu.js +806 -0
- package/dist/primitives/vendor/radix/react-menu/menu.js.map +1 -0
- package/dist/primitives/vendor/radix/react-menubar/index.d.ts +2 -0
- package/dist/primitives/vendor/radix/react-menubar/menubar.d.ts +106 -0
- package/dist/primitives/vendor/radix/react-menubar/menubar.js +377 -0
- package/dist/primitives/vendor/radix/react-menubar/menubar.js.map +1 -0
- package/dist/primitives/vendor/radix/react-navigation-menu/index.d.ts +2 -0
- package/dist/primitives/vendor/radix/react-navigation-menu/navigation-menu.d.ts +124 -0
- package/dist/primitives/vendor/radix/react-navigation-menu/navigation-menu.js +743 -0
- package/dist/primitives/vendor/radix/react-navigation-menu/navigation-menu.js.map +1 -0
- package/dist/primitives/vendor/radix/react-popover/index.d.ts +1 -0
- package/dist/primitives/vendor/radix/react-popover/popover.d.ts +83 -0
- package/dist/primitives/vendor/radix/react-popover/popover.js +236 -0
- package/dist/primitives/vendor/radix/react-popover/popover.js.map +1 -0
- package/dist/primitives/vendor/radix/react-popper/index.d.ts +2 -0
- package/dist/primitives/vendor/radix/react-popper/popper.d.ts +44 -0
- package/dist/primitives/vendor/radix/react-popper/popper.js +276 -0
- package/dist/primitives/vendor/radix/react-popper/popper.js.map +1 -0
- package/dist/primitives/vendor/radix/react-portal/index.d.ts +2 -0
- package/dist/primitives/vendor/radix/react-portal/portal.d.ts +13 -0
- package/dist/primitives/vendor/radix/react-portal/portal.js +21 -0
- package/dist/primitives/vendor/radix/react-portal/portal.js.map +1 -0
- package/dist/primitives/vendor/radix/react-presence/index.d.ts +2 -0
- package/dist/primitives/vendor/radix/react-presence/presence.d.ts +11 -0
- package/dist/primitives/vendor/radix/react-presence/presence.js +152 -0
- package/dist/primitives/vendor/radix/react-presence/presence.js.map +1 -0
- package/dist/primitives/vendor/radix/react-presence/use-state-machine.d.ts +10 -0
- package/dist/primitives/vendor/radix/react-presence/use-state-machine.js +12 -0
- package/dist/primitives/vendor/radix/react-presence/use-state-machine.js.map +1 -0
- package/dist/primitives/vendor/radix/react-primitive/index.d.ts +2 -0
- package/dist/primitives/vendor/radix/react-primitive/primitive.d.ts +56 -0
- package/dist/primitives/vendor/radix/react-primitive/primitive.js +84 -0
- package/dist/primitives/vendor/radix/react-primitive/primitive.js.map +1 -0
- package/dist/primitives/vendor/radix/react-progress/index.d.ts +2 -0
- package/dist/primitives/vendor/radix/react-progress/progress.d.ts +17 -0
- package/dist/primitives/vendor/radix/react-progress/progress.js +79 -0
- package/dist/primitives/vendor/radix/react-progress/progress.js.map +1 -0
- package/dist/primitives/vendor/radix/react-radio-group/index.d.ts +2 -0
- package/dist/primitives/vendor/radix/react-radio-group/radio-group.d.ts +55 -0
- package/dist/primitives/vendor/radix/react-radio-group/radio-group.js +173 -0
- package/dist/primitives/vendor/radix/react-radio-group/radio-group.js.map +1 -0
- package/dist/primitives/vendor/radix/react-radio-group/radio.d.ts +62 -0
- package/dist/primitives/vendor/radix/react-radio-group/radio.js +150 -0
- package/dist/primitives/vendor/radix/react-radio-group/radio.js.map +1 -0
- package/dist/primitives/vendor/radix/react-roving-focus/index.d.ts +2 -0
- package/dist/primitives/vendor/radix/react-roving-focus/roving-focus-group.d.ts +47 -0
- package/dist/primitives/vendor/radix/react-roving-focus/roving-focus-group.js +218 -0
- package/dist/primitives/vendor/radix/react-roving-focus/roving-focus-group.js.map +1 -0
- package/dist/primitives/vendor/radix/react-scroll-area/index.d.ts +2 -0
- package/dist/primitives/vendor/radix/react-scroll-area/scroll-area.d.ts +121 -0
- package/dist/primitives/vendor/radix/react-scroll-area/scroll-area.js +713 -0
- package/dist/primitives/vendor/radix/react-scroll-area/scroll-area.js.map +1 -0
- package/dist/primitives/vendor/radix/react-scroll-area/use-state-machine.d.ts +10 -0
- package/dist/primitives/vendor/radix/react-scroll-area/use-state-machine.js +12 -0
- package/dist/primitives/vendor/radix/react-scroll-area/use-state-machine.js.map +1 -0
- package/dist/primitives/vendor/radix/react-select/index.d.ts +2 -0
- package/dist/primitives/vendor/radix/react-select/select.d.ts +163 -0
- package/dist/primitives/vendor/radix/react-select/select.js +1040 -0
- package/dist/primitives/vendor/radix/react-select/select.js.map +1 -0
- package/dist/primitives/vendor/radix/react-separator/index.d.ts +2 -0
- package/dist/primitives/vendor/radix/react-separator/separator.d.ts +20 -0
- package/dist/primitives/vendor/radix/react-separator/separator.js +29 -0
- package/dist/primitives/vendor/radix/react-separator/separator.js.map +1 -0
- package/dist/primitives/vendor/radix/react-slot/index.d.ts +1 -0
- package/dist/primitives/vendor/radix/react-slot/slot.d.ts +29 -0
- package/dist/primitives/vendor/radix/react-slot/slot.js +107 -0
- package/dist/primitives/vendor/radix/react-slot/slot.js.map +1 -0
- package/dist/primitives/vendor/radix/react-switch/index.d.ts +2 -0
- package/dist/primitives/vendor/radix/react-switch/switch.d.ts +41 -0
- package/dist/primitives/vendor/radix/react-switch/switch.js +185 -0
- package/dist/primitives/vendor/radix/react-switch/switch.js.map +1 -0
- package/dist/primitives/vendor/radix/react-tabs/index.d.ts +2 -0
- package/dist/primitives/vendor/radix/react-tabs/tabs.d.ts +54 -0
- package/dist/primitives/vendor/radix/react-tabs/tabs.js +145 -0
- package/dist/primitives/vendor/radix/react-tabs/tabs.js.map +1 -0
- package/dist/primitives/vendor/radix/react-toast/index.d.ts +2 -0
- package/dist/primitives/vendor/radix/react-toast/toast.d.ts +125 -0
- package/dist/primitives/vendor/radix/react-toast/toast.js +557 -0
- package/dist/primitives/vendor/radix/react-toast/toast.js.map +1 -0
- package/dist/primitives/vendor/radix/react-tooltip/index.d.ts +2 -0
- package/dist/primitives/vendor/radix/react-tooltip/tooltip.d.ts +99 -0
- package/dist/primitives/vendor/radix/react-tooltip/tooltip.js +503 -0
- package/dist/primitives/vendor/radix/react-tooltip/tooltip.js.map +1 -0
- package/dist/primitives/vendor/radix/react-use-callback-ref/index.d.ts +1 -0
- package/dist/primitives/vendor/radix/react-use-callback-ref/use-callback-ref.d.ts +6 -0
- package/dist/primitives/vendor/radix/react-use-callback-ref/use-callback-ref.js +18 -0
- package/dist/primitives/vendor/radix/react-use-callback-ref/use-callback-ref.js.map +1 -0
- package/dist/primitives/vendor/radix/react-use-controllable-state/index.d.ts +2 -0
- package/dist/primitives/vendor/radix/react-use-controllable-state/use-controllable-state-reducer.d.ts +28 -0
- package/dist/primitives/vendor/radix/react-use-controllable-state/use-controllable-state.d.ts +11 -0
- package/dist/primitives/vendor/radix/react-use-controllable-state/use-controllable-state.js +59 -0
- package/dist/primitives/vendor/radix/react-use-controllable-state/use-controllable-state.js.map +1 -0
- package/dist/primitives/vendor/radix/react-use-effect-event/index.d.ts +1 -0
- package/dist/primitives/vendor/radix/react-use-effect-event/use-effect-event.d.ts +7 -0
- package/dist/primitives/vendor/radix/react-use-is-hydrated/index.d.ts +1 -0
- package/dist/primitives/vendor/radix/react-use-is-hydrated/use-is-hydrated-legacy.d.ts +1 -0
- package/dist/primitives/vendor/radix/react-use-is-hydrated/use-is-hydrated-legacy.js +18 -0
- package/dist/primitives/vendor/radix/react-use-is-hydrated/use-is-hydrated-legacy.js.map +1 -0
- package/dist/primitives/vendor/radix/react-use-is-hydrated/use-is-hydrated.d.ts +6 -0
- package/dist/primitives/vendor/radix/react-use-is-hydrated/use-is-hydrated.js +19 -0
- package/dist/primitives/vendor/radix/react-use-is-hydrated/use-is-hydrated.js.map +1 -0
- package/dist/primitives/vendor/radix/react-use-layout-effect/index.d.ts +1 -0
- package/dist/primitives/vendor/radix/react-use-layout-effect/use-layout-effect.d.ts +10 -0
- package/dist/primitives/vendor/radix/react-use-layout-effect/use-layout-effect.js +15 -0
- package/dist/primitives/vendor/radix/react-use-layout-effect/use-layout-effect.js.map +1 -0
- package/dist/primitives/vendor/radix/react-use-previous/index.d.ts +1 -0
- package/dist/primitives/vendor/radix/react-use-previous/use-previous.d.ts +2 -0
- package/dist/primitives/vendor/radix/react-use-previous/use-previous.js +20 -0
- package/dist/primitives/vendor/radix/react-use-previous/use-previous.js.map +1 -0
- package/dist/primitives/vendor/radix/react-use-size/index.d.ts +1 -0
- package/dist/primitives/vendor/radix/react-use-size/use-size.d.ts +5 -0
- package/dist/primitives/vendor/radix/react-use-size/use-size.js +42 -0
- package/dist/primitives/vendor/radix/react-use-size/use-size.js.map +1 -0
- package/dist/primitives/vendor/radix/react-visually-hidden/index.d.ts +2 -0
- package/dist/primitives/vendor/radix/react-visually-hidden/visually-hidden.d.ts +21 -0
- package/dist/primitives/vendor/radix/react-visually-hidden/visually-hidden.js +32 -0
- package/dist/primitives/vendor/radix/react-visually-hidden/visually-hidden.js.map +1 -0
- package/dist/primitives/vendor/radix/rect/index.d.ts +2 -0
- package/dist/primitives/vendor/radix/rect/observe-element-rect.d.ts +16 -0
- package/dist/styles.css +1 -1
- package/dist/theme.css +36 -17
- package/dist/tokens.d.ts +78 -36
- package/dist/tokens.js +63 -32
- package/dist/tokens.js.map +1 -1
- package/package.json +25 -13
- package/vendor-manifest.json +1101 -0
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { cn, noOutlineClasses } from "../lib/utils.js";
|
|
3
|
+
import { fieldWidthClasses } from "./input.js";
|
|
4
|
+
import * as React from "react";
|
|
5
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
6
|
+
//#region src/components/number-input.tsx
|
|
7
|
+
/**
|
|
8
|
+
* A number with its unit inside the field, right-aligned in tabular figures
|
|
9
|
+
* so a column of them lines up, with the numeric keyboard on phones. The box
|
|
10
|
+
* is the field: it carries the border, the focus ring and the invalid and
|
|
11
|
+
* disabled states, and the input inside is borderless. The value stays a
|
|
12
|
+
* string, as with any input: parse it on change.
|
|
13
|
+
*/
|
|
14
|
+
var NumberInput = React.forwardRef(function NumberInput({ prefix, suffix, width = "sm", decimal, className, containerClassName, disabled, ...props }, ref) {
|
|
15
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
16
|
+
"data-slot": "number-input",
|
|
17
|
+
"data-disabled": disabled || void 0,
|
|
18
|
+
className: cn("flex h-9 min-w-0 items-stretch rounded-md border border-input bg-surface text-base text-foreground shadow-xs transition-[border-color,box-shadow,background-color] hover:border-border-strong sm:text-sm dark:bg-surface-raised", "has-[input:focus-visible]:border-ring has-[input:focus-visible]:inset-ring-1 has-[input:focus-visible]:inset-ring-ring", "has-[input[aria-invalid=true]]:border-destructive has-[input[aria-invalid=true]:focus-visible]:inset-ring-destructive", "data-[disabled]:cursor-not-allowed data-[disabled]:bg-muted data-[disabled]:opacity-60", fieldWidthClasses[width], containerClassName),
|
|
19
|
+
children: [
|
|
20
|
+
prefix && /* @__PURE__ */ jsx("span", {
|
|
21
|
+
"aria-hidden": true,
|
|
22
|
+
className: "shrink-0 self-center pl-3 text-muted-foreground select-none",
|
|
23
|
+
children: prefix
|
|
24
|
+
}),
|
|
25
|
+
/* @__PURE__ */ jsx("input", {
|
|
26
|
+
ref,
|
|
27
|
+
"data-slot": "number-input-control",
|
|
28
|
+
inputMode: decimal ? "decimal" : "numeric",
|
|
29
|
+
autoComplete: "off",
|
|
30
|
+
disabled,
|
|
31
|
+
className: cn("w-full min-w-0 rounded-md bg-transparent px-3 text-right tabular-nums placeholder:text-muted-foreground disabled:cursor-not-allowed", noOutlineClasses, prefix && "pl-1.5", suffix && "pr-1.5", className),
|
|
32
|
+
...props
|
|
33
|
+
}),
|
|
34
|
+
suffix && /* @__PURE__ */ jsx("span", {
|
|
35
|
+
"aria-hidden": true,
|
|
36
|
+
className: "shrink-0 self-center pr-3 text-muted-foreground select-none",
|
|
37
|
+
children: suffix
|
|
38
|
+
})
|
|
39
|
+
]
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
//#endregion
|
|
43
|
+
export { NumberInput };
|
|
44
|
+
|
|
45
|
+
//# sourceMappingURL=number-input.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"number-input.js","names":[],"sources":["../../src/components/number-input.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { cn, noOutlineClasses } from '../lib/utils';\n\nimport { type FieldWidth, fieldWidthClasses } from './input';\n\nexport interface NumberInputProps extends Omit<React.ComponentProps<'input'>, 'prefix' | 'type'> {\n /** Inside the field, before the number: \"$\". */\n prefix?: React.ReactNode;\n /** Inside the field, after the number: \"gal\", \"min\", \"%\". */\n suffix?: React.ReactNode;\n /** How wide the field is from 640px up; `sm` (money, a count) by default. */\n width?: FieldWidth;\n /** Allows a decimal point on the phone keyboard (`inputMode=\"decimal\"`). */\n decimal?: boolean;\n /** Classes for the box; `className` goes to the input itself. */\n containerClassName?: string;\n}\n\n/**\n * A number with its unit inside the field, right-aligned in tabular figures\n * so a column of them lines up, with the numeric keyboard on phones. The box\n * is the field: it carries the border, the focus ring and the invalid and\n * disabled states, and the input inside is borderless. The value stays a\n * string, as with any input: parse it on change.\n */\nconst NumberInput = React.forwardRef<HTMLInputElement, NumberInputProps>(function NumberInput(\n {\n prefix,\n suffix,\n width = 'sm',\n decimal,\n className,\n containerClassName,\n disabled,\n ...props\n }: NumberInputProps,\n ref,\n) {\n return (\n <div\n data-slot=\"number-input\"\n data-disabled={disabled || undefined}\n className={cn(\n 'flex h-9 min-w-0 items-stretch rounded-md border border-input bg-surface text-base text-foreground shadow-xs transition-[border-color,box-shadow,background-color] hover:border-border-strong sm:text-sm dark:bg-surface-raised',\n 'has-[input:focus-visible]:border-ring has-[input:focus-visible]:inset-ring-1 has-[input:focus-visible]:inset-ring-ring',\n 'has-[input[aria-invalid=true]]:border-destructive has-[input[aria-invalid=true]:focus-visible]:inset-ring-destructive',\n 'data-[disabled]:cursor-not-allowed data-[disabled]:bg-muted data-[disabled]:opacity-60',\n fieldWidthClasses[width],\n containerClassName,\n )}\n >\n {prefix && (\n <span aria-hidden className=\"shrink-0 self-center pl-3 text-muted-foreground select-none\">\n {prefix}\n </span>\n )}\n <input\n ref={ref}\n data-slot=\"number-input-control\"\n inputMode={decimal ? 'decimal' : 'numeric'}\n autoComplete=\"off\"\n disabled={disabled}\n className={cn(\n 'w-full min-w-0 rounded-md bg-transparent px-3 text-right tabular-nums placeholder:text-muted-foreground disabled:cursor-not-allowed',\n noOutlineClasses,\n prefix && 'pl-1.5',\n suffix && 'pr-1.5',\n className,\n )}\n {...props}\n />\n {suffix && (\n <span aria-hidden className=\"shrink-0 self-center pr-3 text-muted-foreground select-none\">\n {suffix}\n </span>\n )}\n </div>\n );\n});\n\nexport { NumberInput };\n"],"mappings":";;;;;;;;;;;;;AA0BA,IAAM,cAAc,MAAM,WAA+C,SAAS,YAChF,EACE,QACA,QACA,QAAQ,MACR,SACA,WACA,oBACA,UACA,GAAG,SAEL,KACA;CACA,OACE,qBAAC,OAAD;EACE,aAAU;EACV,iBAAe,YAAY,KAAA;EAC3B,WAAW,GACT,mOACA,0HACA,yHACA,0FACA,kBAAkB,QAClB,kBACF;EAVF,UAAA;GAYG,UACC,oBAAC,QAAD;IAAM,eAAA;IAAY,WAAU;IACzB,UAAA;GACG,CAAA;GAER,oBAAC,SAAD;IACO;IACL,aAAU;IACV,WAAW,UAAU,YAAY;IACjC,cAAa;IACH;IACV,WAAW,GACT,uIACA,kBACA,UAAU,UACV,UAAU,UACV,SACF;IACA,GAAI;GACL,CAAA;GACA,UACC,oBAAC,QAAD;IAAM,eAAA;IAAY,WAAU;IACzB,UAAA;GACG,CAAA;EAEL;;AAET,CAAC"}
|
|
@@ -22,5 +22,5 @@ export interface OnboardingChecklistProps extends Omit<React.ComponentProps<'sec
|
|
|
22
22
|
* A short list of first tasks with progress. The app decides when each task
|
|
23
23
|
* is done and whether the list shows at all; this renders it.
|
|
24
24
|
*/
|
|
25
|
-
declare
|
|
25
|
+
declare const OnboardingChecklist: React.ForwardRefExoticComponent<Omit<OnboardingChecklistProps, "ref"> & React.RefAttributes<HTMLElement>>;
|
|
26
26
|
export { OnboardingChecklist };
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
"use client";
|
|
1
2
|
import { cn } from "../lib/utils.js";
|
|
2
3
|
import { Progress } from "./progress.js";
|
|
3
4
|
import * as React from "react";
|
|
@@ -10,11 +11,12 @@ import CircleDashed from "@burtson-labs/icons/react/circle-dashed";
|
|
|
10
11
|
* A short list of first tasks with progress. The app decides when each task
|
|
11
12
|
* is done and whether the list shows at all; this renders it.
|
|
12
13
|
*/
|
|
13
|
-
function OnboardingChecklist({ title, description, items, onDismiss, dismissLabel = "Dismiss checklist", complete, className, ...props }) {
|
|
14
|
+
var OnboardingChecklist = React.forwardRef(function OnboardingChecklist({ title, description, items, onDismiss, dismissLabel = "Dismiss checklist", complete, className, ...props }, ref) {
|
|
14
15
|
const titleId = React.useId();
|
|
15
16
|
const done = items.filter((i) => i.done).length;
|
|
16
17
|
const allDone = items.length > 0 && done === items.length;
|
|
17
18
|
return /* @__PURE__ */ jsxs("section", {
|
|
19
|
+
ref,
|
|
18
20
|
"data-slot": "onboarding-checklist",
|
|
19
21
|
"aria-labelledby": titleId,
|
|
20
22
|
className: cn("rounded-lg border bg-card p-4 text-[13px] text-card-foreground", className),
|
|
@@ -36,7 +38,7 @@ function OnboardingChecklist({ title, description, items, onDismiss, dismissLabe
|
|
|
36
38
|
type: "button",
|
|
37
39
|
"aria-label": dismissLabel,
|
|
38
40
|
onClick: onDismiss,
|
|
39
|
-
className: "-me-1 -mt-1 flex size-7 shrink-0 items-center justify-center rounded-sm text-muted-foreground
|
|
41
|
+
className: cn("-me-1 -mt-1 flex size-7 shrink-0 items-center justify-center rounded-sm text-muted-foreground hover:bg-muted hover:text-foreground", "outline-none focus-visible:outline-solid focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring", "relative pointer-coarse:before:absolute pointer-coarse:before:top-1/2 pointer-coarse:before:left-1/2 pointer-coarse:before:size-11 pointer-coarse:before:-translate-1/2 pointer-coarse:before:content-['']"),
|
|
40
42
|
children: /* @__PURE__ */ jsx(X, {
|
|
41
43
|
"aria-hidden": true,
|
|
42
44
|
className: "size-4"
|
|
@@ -99,7 +101,7 @@ function OnboardingChecklist({ title, description, items, onDismiss, dismissLabe
|
|
|
99
101
|
})
|
|
100
102
|
]
|
|
101
103
|
});
|
|
102
|
-
}
|
|
104
|
+
});
|
|
103
105
|
//#endregion
|
|
104
106
|
export { OnboardingChecklist };
|
|
105
107
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"onboarding-checklist.js","names":[],"sources":["../../src/components/onboarding-checklist.tsx"],"sourcesContent":["import CheckCircle from '@burtson-labs/icons/react/check-circle';\nimport CircleDashed from '@burtson-labs/icons/react/circle-dashed';\nimport X from '@burtson-labs/icons/react/x';\nimport * as React from 'react';\n\nimport { cn } from '../lib/utils';\n\nimport { Progress } from './progress';\n\nexport interface ChecklistItem {\n id: string;\n title: React.ReactNode;\n description?: React.ReactNode;\n /** Set from real app events (a repo opened, a provider tested), never from a click on the list. */\n done: boolean;\n /** A button or link that starts the task. Hidden once done. */\n action?: React.ReactNode;\n}\n\nexport interface OnboardingChecklistProps extends Omit<React.ComponentProps<'section'>, 'title'> {\n title: React.ReactNode;\n description?: React.ReactNode;\n items: ChecklistItem[];\n /** Shows a close button. Persist the dismissal yourself. */\n onDismiss?: () => void;\n dismissLabel?: string;\n /** Replaces the list once every item is done. */\n complete?: React.ReactNode;\n}\n\n/**\n * A short list of first tasks with progress. The app decides when each task\n * is done and whether the list shows at all; this renders it.\n */\
|
|
1
|
+
{"version":3,"file":"onboarding-checklist.js","names":[],"sources":["../../src/components/onboarding-checklist.tsx"],"sourcesContent":["import CheckCircle from '@burtson-labs/icons/react/check-circle';\nimport CircleDashed from '@burtson-labs/icons/react/circle-dashed';\nimport X from '@burtson-labs/icons/react/x';\nimport * as React from 'react';\n\nimport { cn, focusRingClasses, touchTargetClasses } from '../lib/utils';\n\nimport { Progress } from './progress';\n\nexport interface ChecklistItem {\n id: string;\n title: React.ReactNode;\n description?: React.ReactNode;\n /** Set from real app events (a repo opened, a provider tested), never from a click on the list. */\n done: boolean;\n /** A button or link that starts the task. Hidden once done. */\n action?: React.ReactNode;\n}\n\nexport interface OnboardingChecklistProps extends Omit<React.ComponentProps<'section'>, 'title'> {\n title: React.ReactNode;\n description?: React.ReactNode;\n items: ChecklistItem[];\n /** Shows a close button. Persist the dismissal yourself. */\n onDismiss?: () => void;\n dismissLabel?: string;\n /** Replaces the list once every item is done. */\n complete?: React.ReactNode;\n}\n\n/**\n * A short list of first tasks with progress. The app decides when each task\n * is done and whether the list shows at all; this renders it.\n */\nconst OnboardingChecklist = React.forwardRef<HTMLElement, OnboardingChecklistProps>(\n function OnboardingChecklist(\n {\n title,\n description,\n items,\n onDismiss,\n dismissLabel = 'Dismiss checklist',\n complete,\n className,\n ...props\n },\n ref,\n ) {\n const titleId = React.useId();\n const done = items.filter((i) => i.done).length;\n const allDone = items.length > 0 && done === items.length;\n return (\n <section\n ref={ref}\n data-slot=\"onboarding-checklist\"\n aria-labelledby={titleId}\n className={cn('rounded-lg border bg-card p-4 text-[13px] text-card-foreground', className)}\n {...props}\n >\n <div className=\"flex items-start gap-3\">\n <div className=\"min-w-0 flex-1\">\n <h2 id={titleId} className=\"text-sm font-semibold\">\n {title}\n </h2>\n {description && <p className=\"mt-0.5 text-muted-foreground\">{description}</p>}\n </div>\n {onDismiss && (\n <button\n type=\"button\"\n aria-label={dismissLabel}\n onClick={onDismiss}\n className={cn(\n '-me-1 -mt-1 flex size-7 shrink-0 items-center justify-center rounded-sm text-muted-foreground hover:bg-muted hover:text-foreground',\n focusRingClasses,\n touchTargetClasses,\n )}\n >\n <X aria-hidden className=\"size-4\" />\n </button>\n )}\n </div>\n <div className=\"mt-3 flex items-center gap-3\">\n <Progress\n value={done}\n max={Math.max(items.length, 1)}\n aria-label={`${done} of ${items.length} done`}\n className=\"flex-1\"\n />\n <span className=\"shrink-0 text-xs text-muted-foreground tabular-nums\" aria-hidden>\n {done}/{items.length}\n </span>\n </div>\n {allDone && complete ? (\n <div className=\"mt-3\">{complete}</div>\n ) : (\n <ul className=\"mt-3 flex flex-col gap-1\">\n {items.map((item) => (\n <li\n key={item.id}\n data-slot=\"onboarding-checklist-item\"\n data-state={item.done ? 'done' : 'todo'}\n className=\"flex items-start gap-2.5 rounded-md px-1 py-1.5\"\n >\n {item.done ? (\n <CheckCircle aria-hidden className=\"mt-px size-4 shrink-0 text-success\" />\n ) : (\n <CircleDashed\n aria-hidden\n className=\"mt-px size-4 shrink-0 text-muted-foreground\"\n />\n )}\n <div className=\"min-w-0 flex-1\">\n <p\n className={cn('font-medium', item.done && 'text-muted-foreground line-through')}\n >\n {item.title}\n <span className=\"sr-only\">{item.done ? ', done' : ', not done'}</span>\n </p>\n {item.description && !item.done && (\n <p className=\"mt-0.5 text-muted-foreground\">{item.description}</p>\n )}\n </div>\n {item.action && !item.done && <div className=\"shrink-0\">{item.action}</div>}\n </li>\n ))}\n </ul>\n )}\n </section>\n );\n },\n);\n\nexport { OnboardingChecklist };\n"],"mappings":";;;;;;;;;;;;;AAkCA,IAAM,sBAAsB,MAAM,WAChC,SAAS,oBACP,EACE,OACA,aACA,OACA,WACA,eAAe,qBACf,UACA,WACA,GAAG,SAEL,KACA;CACA,MAAM,UAAU,MAAM,MAAM;CAC5B,MAAM,OAAO,MAAM,QAAQ,MAAM,EAAE,IAAI,CAAC,CAAC;CACzC,MAAM,UAAU,MAAM,SAAS,KAAK,SAAS,MAAM;CACnD,OACE,qBAAC,WAAD;EACO;EACL,aAAU;EACV,mBAAiB;EACjB,WAAW,GAAG,kEAAkE,SAAS;EACzF,GAAI;EALN,UAAA;GAOE,qBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACE,qBAAC,OAAD;KAAK,WAAU;KAAf,UAAA,CACE,oBAAC,MAAD;MAAI,IAAI;MAAS,WAAU;MACxB,UAAA;KACC,CAAA,GACH,eAAe,oBAAC,KAAD;MAAG,WAAU;MAAgC,UAAA;KAAe,CAAA,CACzE;IACJ,CAAA,GAAA,aACC,oBAAC,UAAD;KACE,MAAK;KACL,cAAY;KACZ,SAAS;KACT,WAAW,GACT,sIAAA,8HAAA,4MAGF;KAEA,UAAA,oBAAC,GAAD;MAAG,eAAA;MAAY,WAAU;KAAU,CAAA;IAC7B,CAAA,CAEP;;GACL,qBAAC,OAAD;IAAK,WAAU;IAAf,UAAA,CACE,oBAAC,UAAD;KACE,OAAO;KACP,KAAK,KAAK,IAAI,MAAM,QAAQ,CAAC;KAC7B,cAAY,GAAG,KAAK,MAAM,MAAM,OAAO;KACvC,WAAU;IACX,CAAA,GACD,qBAAC,QAAD;KAAM,WAAU;KAAsD,eAAA;KAAtE,UAAA;MACG;MAAK;MAAE,MAAM;KACV;IACH,CAAA,CAAA;;GACJ,WAAW,WACV,oBAAC,OAAD;IAAK,WAAU;IAAQ,UAAA;GAAc,CAAA,IAErC,oBAAC,MAAD;IAAI,WAAU;IACX,UAAA,MAAM,KAAK,SACV,qBAAC,MAAD;KAEE,aAAU;KACV,cAAY,KAAK,OAAO,SAAS;KACjC,WAAU;KAJZ,UAAA;MAMG,KAAK,OACJ,oBAAC,aAAD;OAAa,eAAA;OAAY,WAAU;MAAsC,CAAA,IAEzE,oBAAC,cAAD;OACE,eAAA;OACA,WAAU;MACX,CAAA;MAEH,qBAAC,OAAD;OAAK,WAAU;OAAf,UAAA,CACE,qBAAC,KAAD;QACE,WAAW,GAAG,eAAe,KAAK,QAAQ,oCAAoC;QADhF,UAAA,CAGG,KAAK,OACN,oBAAC,QAAD;SAAM,WAAU;SAAW,UAAA,KAAK,OAAO,WAAW;QAAmB,CAAA,CACpE;OACF,CAAA,GAAA,KAAK,eAAe,CAAC,KAAK,QACzB,oBAAC,KAAD;QAAG,WAAU;QAAgC,UAAA,KAAK;OAAe,CAAA,CAEhE;;MACJ,KAAK,UAAU,CAAC,KAAK,QAAQ,oBAAC,OAAD;OAAK,WAAU;OAAY,UAAA,KAAK;MAAY,CAAA;KACxE;IAzBG,GAAA,KAAK,EAyBR,CACL;GACC,CAAA;EAEC;;AAEb,CACF"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
|
-
declare
|
|
3
|
-
declare
|
|
4
|
-
declare
|
|
5
|
-
declare
|
|
6
|
-
declare
|
|
7
|
-
|
|
2
|
+
declare const PageHeader: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLElement>, HTMLElement>, "ref"> & React.RefAttributes<HTMLElement>>;
|
|
3
|
+
declare const PageHeaderMain: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
4
|
+
declare const PageHeaderEyebrow: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
5
|
+
declare const PageHeaderTitle: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLHeadingElement>, HTMLHeadingElement>, "ref"> & React.RefAttributes<HTMLHeadingElement>>;
|
|
6
|
+
declare const PageHeaderDescription: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLParagraphElement>, HTMLParagraphElement>, "ref"> & React.RefAttributes<HTMLParagraphElement>>;
|
|
7
|
+
/** The actions: wrap under the title on narrow screens rather than squeezing it; share the row on phones. */
|
|
8
|
+
declare const PageHeaderActions: React.ForwardRefExoticComponent<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
8
9
|
export { PageHeader, PageHeaderActions, PageHeaderDescription, PageHeaderEyebrow, PageHeaderMain, PageHeaderTitle, };
|
|
@@ -1,50 +1,58 @@
|
|
|
1
|
+
"use client";
|
|
1
2
|
import { cn } from "../lib/utils.js";
|
|
2
|
-
import "react";
|
|
3
|
+
import * as React from "react";
|
|
3
4
|
import { jsx } from "react/jsx-runtime";
|
|
4
5
|
//#region src/components/page-header.tsx
|
|
5
|
-
function PageHeader({ className, ...props }) {
|
|
6
|
+
var PageHeader = React.forwardRef(function PageHeader({ className, ...props }, ref) {
|
|
6
7
|
return /* @__PURE__ */ jsx("header", {
|
|
8
|
+
ref,
|
|
7
9
|
"data-slot": "page-header",
|
|
8
|
-
className: cn("flex flex-col gap-4 border-b border-border pb-5 sm:flex-row sm:items-end sm:justify-between", className),
|
|
10
|
+
className: cn("flex flex-col gap-4 border-b border-border pb-5 sm:flex-row sm:flex-wrap sm:items-end sm:justify-between", className),
|
|
9
11
|
...props
|
|
10
12
|
});
|
|
11
|
-
}
|
|
12
|
-
function PageHeaderMain({ className, ...props }) {
|
|
13
|
+
});
|
|
14
|
+
var PageHeaderMain = React.forwardRef(function PageHeaderMain({ className, ...props }, ref) {
|
|
13
15
|
return /* @__PURE__ */ jsx("div", {
|
|
16
|
+
ref,
|
|
14
17
|
"data-slot": "page-header-main",
|
|
15
18
|
className: cn("min-w-0 space-y-1", className),
|
|
16
19
|
...props
|
|
17
20
|
});
|
|
18
|
-
}
|
|
19
|
-
function PageHeaderEyebrow({ className, ...props }) {
|
|
21
|
+
});
|
|
22
|
+
var PageHeaderEyebrow = React.forwardRef(function PageHeaderEyebrow({ className, ...props }, ref) {
|
|
20
23
|
return /* @__PURE__ */ jsx("div", {
|
|
24
|
+
ref,
|
|
21
25
|
"data-slot": "page-header-eyebrow",
|
|
22
26
|
className: cn("text-[11px] font-semibold tracking-[0.12em] text-brand uppercase", className),
|
|
23
27
|
...props
|
|
24
28
|
});
|
|
25
|
-
}
|
|
26
|
-
function PageHeaderTitle({ className, children, ...props }) {
|
|
29
|
+
});
|
|
30
|
+
var PageHeaderTitle = React.forwardRef(function PageHeaderTitle({ className, children, ...props }, ref) {
|
|
27
31
|
return /* @__PURE__ */ jsx("h1", {
|
|
32
|
+
ref,
|
|
28
33
|
"data-slot": "page-header-title",
|
|
29
34
|
className: cn("truncate text-xl font-semibold tracking-[-0.025em] text-foreground sm:text-2xl", className),
|
|
30
35
|
...props,
|
|
31
36
|
children
|
|
32
37
|
});
|
|
33
|
-
}
|
|
34
|
-
function PageHeaderDescription({ className, ...props }) {
|
|
38
|
+
});
|
|
39
|
+
var PageHeaderDescription = React.forwardRef(function PageHeaderDescription({ className, ...props }, ref) {
|
|
35
40
|
return /* @__PURE__ */ jsx("p", {
|
|
41
|
+
ref,
|
|
36
42
|
"data-slot": "page-header-description",
|
|
37
43
|
className: cn("max-w-3xl text-sm leading-5 text-muted-foreground", className),
|
|
38
44
|
...props
|
|
39
45
|
});
|
|
40
|
-
}
|
|
41
|
-
|
|
46
|
+
});
|
|
47
|
+
/** The actions: wrap under the title on narrow screens rather than squeezing it; share the row on phones. */
|
|
48
|
+
var PageHeaderActions = React.forwardRef(function PageHeaderActions({ className, ...props }, ref) {
|
|
42
49
|
return /* @__PURE__ */ jsx("div", {
|
|
50
|
+
ref,
|
|
43
51
|
"data-slot": "page-header-actions",
|
|
44
|
-
className: cn("flex shrink-0 flex-wrap items-center gap-2", className),
|
|
52
|
+
className: cn("flex shrink-0 flex-wrap items-center gap-2 max-sm:*:data-[slot=button]:min-w-0 max-sm:*:data-[slot=button]:flex-1", className),
|
|
45
53
|
...props
|
|
46
54
|
});
|
|
47
|
-
}
|
|
55
|
+
});
|
|
48
56
|
//#endregion
|
|
49
57
|
export { PageHeader, PageHeaderActions, PageHeaderDescription, PageHeaderEyebrow, PageHeaderMain, PageHeaderTitle };
|
|
50
58
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"page-header.js","names":[],"sources":["../../src/components/page-header.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { cn } from '../lib/utils';\n\
|
|
1
|
+
{"version":3,"file":"page-header.js","names":[],"sources":["../../src/components/page-header.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { cn } from '../lib/utils';\n\nconst PageHeader = React.forwardRef<HTMLElement, React.ComponentProps<'header'>>(\n function PageHeader({ className, ...props }, ref) {\n return (\n <header\n ref={ref}\n data-slot=\"page-header\"\n className={cn(\n 'flex flex-col gap-4 border-b border-border pb-5 sm:flex-row sm:flex-wrap sm:items-end sm:justify-between',\n className,\n )}\n {...props}\n />\n );\n },\n);\n\nconst PageHeaderMain = React.forwardRef<HTMLDivElement, React.ComponentProps<'div'>>(\n function PageHeaderMain({ className, ...props }, ref) {\n return (\n <div\n ref={ref}\n data-slot=\"page-header-main\"\n className={cn('min-w-0 space-y-1', className)}\n {...props}\n />\n );\n },\n);\n\nconst PageHeaderEyebrow = React.forwardRef<HTMLDivElement, React.ComponentProps<'div'>>(\n function PageHeaderEyebrow({ className, ...props }, ref) {\n return (\n <div\n ref={ref}\n data-slot=\"page-header-eyebrow\"\n className={cn(\n 'text-[11px] font-semibold tracking-[0.12em] text-brand uppercase',\n className,\n )}\n {...props}\n />\n );\n },\n);\n\nconst PageHeaderTitle = React.forwardRef<HTMLHeadingElement, React.ComponentProps<'h1'>>(\n function PageHeaderTitle({ className, children, ...props }, ref) {\n return (\n <h1\n ref={ref}\n data-slot=\"page-header-title\"\n className={cn(\n 'truncate text-xl font-semibold tracking-[-0.025em] text-foreground sm:text-2xl',\n className,\n )}\n {...props}\n >\n {children}\n </h1>\n );\n },\n);\n\nconst PageHeaderDescription = React.forwardRef<HTMLParagraphElement, React.ComponentProps<'p'>>(\n function PageHeaderDescription({ className, ...props }, ref) {\n return (\n <p\n ref={ref}\n data-slot=\"page-header-description\"\n className={cn('max-w-3xl text-sm leading-5 text-muted-foreground', className)}\n {...props}\n />\n );\n },\n);\n\n/** The actions: wrap under the title on narrow screens rather than squeezing it; share the row on phones. */\nconst PageHeaderActions = React.forwardRef<HTMLDivElement, React.ComponentProps<'div'>>(\n function PageHeaderActions({ className, ...props }, ref) {\n return (\n <div\n ref={ref}\n data-slot=\"page-header-actions\"\n className={cn(\n 'flex shrink-0 flex-wrap items-center gap-2 max-sm:*:data-[slot=button]:min-w-0 max-sm:*:data-[slot=button]:flex-1',\n className,\n )}\n {...props}\n />\n );\n },\n);\n\nexport {\n PageHeader,\n PageHeaderActions,\n PageHeaderDescription,\n PageHeaderEyebrow,\n PageHeaderMain,\n PageHeaderTitle,\n};\n"],"mappings":";;;;;AAIA,IAAM,aAAa,MAAM,WACvB,SAAS,WAAW,EAAE,WAAW,GAAG,SAAS,KAAK;CAChD,OACE,oBAAC,UAAD;EACO;EACL,aAAU;EACV,WAAW,GACT,4GACA,SACF;EACA,GAAI;CACL,CAAA;AAEL,CACF;AAEA,IAAM,iBAAiB,MAAM,WAC3B,SAAS,eAAe,EAAE,WAAW,GAAG,SAAS,KAAK;CACpD,OACE,oBAAC,OAAD;EACO;EACL,aAAU;EACV,WAAW,GAAG,qBAAqB,SAAS;EAC5C,GAAI;CACL,CAAA;AAEL,CACF;AAEA,IAAM,oBAAoB,MAAM,WAC9B,SAAS,kBAAkB,EAAE,WAAW,GAAG,SAAS,KAAK;CACvD,OACE,oBAAC,OAAD;EACO;EACL,aAAU;EACV,WAAW,GACT,oEACA,SACF;EACA,GAAI;CACL,CAAA;AAEL,CACF;AAEA,IAAM,kBAAkB,MAAM,WAC5B,SAAS,gBAAgB,EAAE,WAAW,UAAU,GAAG,SAAS,KAAK;CAC/D,OACE,oBAAC,MAAD;EACO;EACL,aAAU;EACV,WAAW,GACT,kFACA,SACF;EACA,GAAI;EAEH;CACC,CAAA;AAER,CACF;AAEA,IAAM,wBAAwB,MAAM,WAClC,SAAS,sBAAsB,EAAE,WAAW,GAAG,SAAS,KAAK;CAC3D,OACE,oBAAC,KAAD;EACO;EACL,aAAU;EACV,WAAW,GAAG,qDAAqD,SAAS;EAC5E,GAAI;CACL,CAAA;AAEL,CACF;;AAGA,IAAM,oBAAoB,MAAM,WAC9B,SAAS,kBAAkB,EAAE,WAAW,GAAG,SAAS,KAAK;CACvD,OACE,oBAAC,OAAD;EACO;EACL,aAAU;EACV,WAAW,GACT,qHACA,SACF;EACA,GAAI;CACL,CAAA;AAEL,CACF"}
|
|
@@ -115,5 +115,5 @@ export interface PaginationProps extends Omit<React.ComponentProps<'nav'>, 'onCh
|
|
|
115
115
|
* previous and next buttons. Buttons are real buttons, keyboard-reachable,
|
|
116
116
|
* and 44px on touch screens.
|
|
117
117
|
*/
|
|
118
|
-
declare
|
|
118
|
+
declare const Pagination: React.ForwardRefExoticComponent<Omit<PaginationProps, "ref"> & React.RefAttributes<HTMLElement>>;
|
|
119
119
|
export { Pagination };
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
"use client";
|
|
1
2
|
import { cn } from "../lib/utils.js";
|
|
2
3
|
import { Button } from "./button.js";
|
|
3
4
|
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "./select.js";
|
|
@@ -180,7 +181,7 @@ function usePagination(rows, options = {}) {
|
|
|
180
181
|
* previous and next buttons. Buttons are real buttons, keyboard-reachable,
|
|
181
182
|
* and 44px on touch screens.
|
|
182
183
|
*/
|
|
183
|
-
function Pagination({ page: requestedPage, pageCount: requestedCount, onPageChange, siblings = 1, summary, total, pageSize, pageSizeOptions = DEFAULT_PAGE_SIZES, onPageSizeChange, pageSizeLabel = "Rows per page", formatPageSize = (size) => `${size} per page`, className, ...props }) {
|
|
184
|
+
var Pagination = React.forwardRef(function Pagination({ page: requestedPage, pageCount: requestedCount, onPageChange, siblings = 1, summary, total, pageSize, pageSizeOptions = DEFAULT_PAGE_SIZES, onPageSizeChange, pageSizeLabel = "Rows per page", formatPageSize = (size) => `${size} per page`, className, ...props }, ref) {
|
|
184
185
|
const pageCount = Number.isFinite(requestedCount) ? Math.max(0, Math.floor(requestedCount)) : 0;
|
|
185
186
|
const page = pageCount === 0 ? 0 : Number.isFinite(requestedPage) ? Math.max(1, Math.min(pageCount, Math.floor(requestedPage))) : 1;
|
|
186
187
|
const pages = paginationRange(page, pageCount, siblings);
|
|
@@ -193,6 +194,7 @@ function Pagination({ page: requestedPage, pageCount: requestedCount, onPageChan
|
|
|
193
194
|
const sizes = pageSize !== void 0 && !pageSizeOptions.includes(pageSize) ? [...pageSizeOptions, pageSize].sort((a, b) => a - b) : pageSizeOptions;
|
|
194
195
|
const position = `Page ${page} of ${pageCount}`;
|
|
195
196
|
return /* @__PURE__ */ jsxs("nav", {
|
|
197
|
+
ref,
|
|
196
198
|
"aria-label": "Pagination",
|
|
197
199
|
"data-slot": "pagination",
|
|
198
200
|
className: cn("flex flex-wrap items-center justify-between gap-x-3 gap-y-2", className),
|
|
@@ -277,7 +279,7 @@ function Pagination({ page: requestedPage, pageCount: requestedCount, onPageChan
|
|
|
277
279
|
})
|
|
278
280
|
]
|
|
279
281
|
});
|
|
280
|
-
}
|
|
282
|
+
});
|
|
281
283
|
//#endregion
|
|
282
284
|
export { DEFAULT_PAGE_SIZES, Pagination, clampPage, pageCountFor, pageWindow, paginate, paginationRange, paginationSummary, usePagination };
|
|
283
285
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pagination.js","names":[],"sources":["../../src/components/pagination.tsx"],"sourcesContent":["import ChevronLeft from '@burtson-labs/icons/react/chevron-left';\nimport ChevronRight from '@burtson-labs/icons/react/chevron-right';\nimport * as React from 'react';\n\nimport { cn } from '../lib/utils';\n\nimport { Button } from './button';\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from './select';\n\n/**\n * The page numbers to show: always the first and last page, `siblings` pages\n * either side of the current one, and 'ellipsis' for the gaps.\n */\nexport function paginationRange(\n page: number,\n pageCount: number,\n siblings = 1,\n): (number | 'ellipsis')[] {\n pageCount = Number.isFinite(pageCount) ? Math.max(0, Math.floor(pageCount)) : 0;\n siblings = Number.isFinite(siblings) ? Math.min(5, Math.max(0, Math.floor(siblings))) : 1;\n page = Number.isFinite(page) ? Math.max(1, Math.min(pageCount, Math.floor(page))) : 1;\n if (pageCount <= 0) return [];\n const window = siblings * 2 + 5; // first, last, current, siblings, two gaps\n if (pageCount <= window) return Array.from({ length: pageCount }, (_, i) => i + 1);\n const start = Math.max(2, page - siblings);\n const end = Math.min(pageCount - 1, page + siblings);\n const out: (number | 'ellipsis')[] = [1];\n if (start > 2) out.push('ellipsis');\n for (let p = start; p <= end; p += 1) out.push(p);\n if (end < pageCount - 1) out.push('ellipsis');\n out.push(pageCount);\n return out;\n}\n\n/* ------------------------------------------------------------------------ */\n/* Paging arithmetic: no React, for any list, table or server query. */\n/* ------------------------------------------------------------------------ */\n\n/** The page sizes offered by default: 25, 50 or 100 rows. */\nexport const DEFAULT_PAGE_SIZES: readonly number[] = [25, 50, 100];\n\nexport interface PageWindow {\n /** 1-based, clamped to the pages that exist (1 when there are no rows). */\n page: number;\n /** At least 1, so \"Page 1 of 1\" reads sensibly for an empty list. */\n pageCount: number;\n pageSize: number;\n total: number;\n /** 1-based index of the first row on this page; 0 when there are none. */\n from: number;\n /** 1-based index of the last row on this page; 0 when there are none. */\n to: number;\n}\n\n/** Pages needed for `total` rows, never less than 1. */\nexport function pageCountFor(total: number, pageSize: number): number {\n if (!Number.isFinite(total) || total <= 0) return 1;\n const size = Number.isFinite(pageSize) ? Math.max(1, Math.floor(pageSize)) : 1;\n return Math.max(1, Math.ceil(total / size));\n}\n\n/** A requested page clamped to 1…pageCount. Anything unreadable (\"abc\", NaN) is page 1. */\nexport function clampPage(page: unknown, pageCount: number): number {\n const n = typeof page === 'number' ? page : Number(page);\n if (!Number.isFinite(n)) return 1;\n return Math.min(Math.max(1, Math.floor(n)), Math.max(1, Math.floor(pageCount) || 1));\n}\n\n/** Where page `page` of `total` rows starts and ends, for server-side paging. */\nexport function pageWindow({\n page,\n pageSize,\n total,\n}: {\n page: unknown;\n pageSize: number;\n total: number;\n}): PageWindow {\n const size = Number.isFinite(pageSize) ? Math.max(1, Math.floor(pageSize)) : 1;\n const safeTotal = Number.isFinite(total) ? Math.max(0, Math.floor(total)) : 0;\n const pageCount = pageCountFor(safeTotal, size);\n const p = clampPage(page, pageCount);\n const start = (p - 1) * size;\n const to = Math.min(start + size, safeTotal);\n return {\n page: p,\n pageCount,\n pageSize: size,\n total: safeTotal,\n from: safeTotal ? start + 1 : 0,\n to: safeTotal ? to : 0,\n };\n}\n\n/** One page of `rows`, with the numbers for the page controls. */\nexport function paginate<T>(\n rows: readonly T[],\n page: unknown,\n pageSize: number,\n): PageWindow & { rows: T[] } {\n const w = pageWindow({ page, pageSize, total: rows.length });\n return { ...w, rows: rows.slice(w.from ? w.from - 1 : 0, w.to) };\n}\n\n/**\n * \"1–25 of 312\", \"7 of 7\" when everything fits, \"0 of 0\" when empty. Numbers\n * use the locale's grouping (\"1,025\"); pass `locale` to pin it.\n */\nexport function paginationSummary(\n { from, to, total }: Pick<PageWindow, 'from' | 'to' | 'total'>,\n locale?: string,\n): string {\n const fmt = new Intl.NumberFormat(locale);\n if (!total) return '0 of 0';\n if (from === 1 && to === total) return `${fmt.format(total)} of ${fmt.format(total)}`;\n return `${fmt.format(from)}–${fmt.format(to)} of ${fmt.format(total)}`;\n}\n\nconst storedSizeKey = (key: string) => `bl-page-size:${key}`;\n\nfunction readStoredSize(key: string | undefined, options: readonly number[]): number | undefined {\n if (!key) return undefined;\n try {\n const n = Number(globalThis.localStorage?.getItem(storedSizeKey(key)));\n return options.includes(n) ? n : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction writeStoredSize(key: string | undefined, size: number) {\n if (!key) return;\n try {\n globalThis.localStorage?.setItem(storedSizeKey(key), String(size));\n } catch {\n // Storage blocked (private mode, a sandboxed frame): the size is not remembered.\n }\n}\n\nexport interface UsePaginationOptions {\n /** Controlled page (e.g. read from the URL). Leave out to let the hook keep it. */\n page?: number;\n /** Starting page when uncontrolled. */\n defaultPage?: number;\n onPageChange?: (page: number) => void;\n /** Controlled page size. */\n pageSize?: number;\n /** Starting page size when uncontrolled; the first option by default. */\n defaultPageSize?: number;\n onPageSizeChange?: (pageSize: number) => void;\n /** Sizes offered by the page-size menu. */\n pageSizeOptions?: readonly number[];\n /**\n * Whatever decides which rows are listed (search text, a filter, a tab).\n * When it changes, paging goes back to page 1. The first render never\n * resets, so a link to page 3 stays on page 3.\n */\n resetKey?: unknown;\n /** Remembers the chosen page size in localStorage under this key. */\n storageKey?: string;\n /**\n * The full row count when the server pages: `rows` is then already the\n * current page and is not sliced.\n */\n total?: number;\n /** Locale for the summary's numbers. */\n locale?: string;\n}\n\nexport interface UsePaginationResult<T> extends PageWindow {\n /** The rows to render on this page. */\n rows: T[];\n pageSizeOptions: readonly number[];\n /** \"1–25 of 312\". */\n summary: string;\n /** More rows than the smallest page size: worth showing controls for. */\n hasPages: boolean;\n setPage: (page: number) => void;\n /** Changes the size and goes back to page 1. */\n setPageSize: (pageSize: number) => void;\n /** Spread onto Pagination (or pass to DataTable's paging props). */\n paginationProps: Pick<\n PaginationProps,\n 'page' | 'pageCount' | 'onPageChange' | 'pageSize' | 'pageSizeOptions' | 'onPageSizeChange'\n > & { summary: string };\n}\n\n/**\n * Headless paging for a list or table: slices `rows`, clamps the page,\n * returns to page 1 when `resetKey` changes, and optionally remembers the\n * page size. Controlled `page` / `pageSize` let an app keep them in the URL.\n */\nexport function usePagination<T>(\n rows: readonly T[],\n options: UsePaginationOptions = {},\n): UsePaginationResult<T> {\n const {\n page: pageProp,\n defaultPage = 1,\n onPageChange,\n pageSize: pageSizeProp,\n defaultPageSize,\n onPageSizeChange,\n pageSizeOptions = DEFAULT_PAGE_SIZES,\n resetKey,\n storageKey,\n total: serverTotal,\n locale,\n } = options;\n\n const [pageState, setPageState] = React.useState(defaultPage);\n const [sizeState, setSizeState] = React.useState<number>(\n () =>\n readStoredSize(storageKey, pageSizeOptions) ?? defaultPageSize ?? pageSizeOptions[0] ?? 25,\n );\n const page = pageProp ?? pageState;\n const pageSize = pageSizeProp ?? sizeState;\n\n // Keep the latest callbacks without making the setters change every render.\n const latest = React.useRef({ onPageChange, onPageSizeChange, pageProp, storageKey });\n React.useEffect(() => {\n latest.current = { onPageChange, onPageSizeChange, pageProp, storageKey };\n });\n\n const setPage = React.useCallback((next: number) => {\n setPageState(next);\n latest.current.onPageChange?.(next);\n }, []);\n const setPageSize = React.useCallback((next: number) => {\n writeStoredSize(latest.current.storageKey, next);\n setSizeState(next);\n setPageState(1);\n latest.current.onPageSizeChange?.(next);\n latest.current.onPageChange?.(1);\n }, []);\n\n // A new filter starts again at page 1: during render for local state (no\n // flash of an empty page), and after it for a controlled page.\n const [lastKey, setLastKey] = React.useState(resetKey);\n if (!Object.is(lastKey, resetKey)) {\n setLastKey(resetKey);\n setPageState(1);\n }\n const committedKey = React.useRef(resetKey);\n React.useEffect(() => {\n if (Object.is(committedKey.current, resetKey)) return;\n committedKey.current = resetKey;\n const { pageProp: controlled, onPageChange: report } = latest.current;\n if (controlled !== undefined && controlled !== 1) report?.(1);\n }, [resetKey]);\n\n const w =\n serverTotal === undefined\n ? paginate(rows, page, pageSize)\n : { ...pageWindow({ page, pageSize, total: serverTotal }), rows: [...rows] };\n const summary = paginationSummary(w, locale);\n // pageSize first: Math.min() of an empty options list is Infinity.\n const hasPages = w.total > Math.min(w.pageSize, ...pageSizeOptions);\n\n return {\n ...w,\n pageSizeOptions,\n summary,\n hasPages,\n setPage,\n setPageSize,\n paginationProps: {\n page: w.page,\n pageCount: w.pageCount,\n onPageChange: setPage,\n pageSize: w.pageSize,\n pageSizeOptions,\n onPageSizeChange: setPageSize,\n summary,\n },\n };\n}\n\n/* ------------------------------------------------------------------------ */\n/* The controls. */\n/* ------------------------------------------------------------------------ */\n\nexport interface PaginationProps extends Omit<React.ComponentProps<'nav'>, 'onChange'> {\n /** 1-based current page. */\n page: number;\n pageCount: number;\n onPageChange: (page: number) => void;\n siblings?: number;\n /** Summary on the left, e.g. \"1–25 of 312\". Worked out from `total` when left out. */\n summary?: React.ReactNode;\n /** Total rows: with `pageSize`, gives the default summary. */\n total?: number;\n /** Rows per page, shown in the page-size menu. */\n pageSize?: number;\n /** Sizes in the page-size menu (25, 50, 100 by default). */\n pageSizeOptions?: readonly number[];\n /** Adds a rows-per-page menu. */\n onPageSizeChange?: (pageSize: number) => void;\n /** The page-size menu's accessible name. */\n pageSizeLabel?: string;\n /** An option's text, e.g. \"25 per page\". */\n formatPageSize?: (size: number) => string;\n}\n\n/**\n * Page controls for a table or list: a summary, the pages, and optionally a\n * rows-per-page menu. Below 640px it becomes \"Page 2 of 13\" between large\n * previous and next buttons. Buttons are real buttons, keyboard-reachable,\n * and 44px on touch screens.\n */\nfunction Pagination({\n page: requestedPage,\n pageCount: requestedCount,\n onPageChange,\n siblings = 1,\n summary,\n total,\n pageSize,\n pageSizeOptions = DEFAULT_PAGE_SIZES,\n onPageSizeChange,\n pageSizeLabel = 'Rows per page',\n formatPageSize = (size) => `${size} per page`,\n className,\n ...props\n}: PaginationProps) {\n const pageCount = Number.isFinite(requestedCount) ? Math.max(0, Math.floor(requestedCount)) : 0;\n const page =\n pageCount === 0\n ? 0\n : Number.isFinite(requestedPage)\n ? Math.max(1, Math.min(pageCount, Math.floor(requestedPage)))\n : 1;\n const pages = paginationRange(page, pageCount, siblings);\n const go = (p: number) => onPageChange(Math.min(Math.max(1, p), Math.max(1, pageCount)));\n const shownSummary =\n summary ??\n (total !== undefined && pageSize\n ? paginationSummary(pageWindow({ page: page || 1, pageSize, total }))\n : null);\n const sizes =\n pageSize !== undefined && !pageSizeOptions.includes(pageSize)\n ? [...pageSizeOptions, pageSize].sort((a, b) => a - b)\n : pageSizeOptions;\n const position = `Page ${page} of ${pageCount}`;\n return (\n <nav\n aria-label=\"Pagination\"\n data-slot=\"pagination\"\n className={cn('flex flex-wrap items-center justify-between gap-x-3 gap-y-2', className)}\n {...props}\n >\n <div\n data-slot=\"pagination-summary\"\n className=\"min-w-0 text-xs text-muted-foreground tabular-nums max-sm:order-2\"\n >\n {shownSummary}\n </div>\n {/* Announced when the page changes; the visible \"Page 2 of 13\" is for phones. */}\n <span role=\"status\" className=\"sr-only\">\n {pageCount > 0 ? position : ''}\n </span>\n <ul className=\"flex items-center gap-1 max-sm:order-1 max-sm:w-full max-sm:justify-between\">\n <li>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => go(page - 1)}\n disabled={page <= 1}\n aria-label=\"Previous page\"\n className=\"max-sm:size-11 max-sm:border max-sm:border-border max-sm:px-0\"\n >\n <ChevronLeft aria-hidden />\n <span className=\"hidden sm:inline\">Previous</span>\n </Button>\n </li>\n {pages.map((p, i) =>\n p === 'ellipsis' ? (\n <li key={`e${i}`} aria-hidden className=\"hidden px-1 text-muted-foreground sm:block\">\n …\n </li>\n ) : (\n <li key={p} className=\"hidden sm:block\">\n <Button\n variant={p === page ? 'outline' : 'ghost'}\n size=\"icon-sm\"\n onClick={() => go(p)}\n aria-current={p === page ? 'page' : undefined}\n aria-label={`Page ${p}`}\n className={cn('tabular-nums', p === page && 'border-brand/40 text-brand')}\n >\n {p}\n </Button>\n </li>\n ),\n )}\n <li\n aria-hidden\n data-slot=\"pagination-position\"\n className=\"px-2 text-sm font-medium tabular-nums sm:hidden\"\n >\n {pageCount > 0 ? position : ''}\n </li>\n <li>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => go(page + 1)}\n disabled={page >= pageCount}\n aria-label=\"Next page\"\n className=\"max-sm:size-11 max-sm:border max-sm:border-border max-sm:px-0\"\n >\n <span className=\"hidden sm:inline\">Next</span>\n <ChevronRight aria-hidden />\n </Button>\n </li>\n </ul>\n {onPageSizeChange && (\n <Select\n value={pageSize !== undefined ? String(pageSize) : undefined}\n onValueChange={(v) => onPageSizeChange(Number(v))}\n >\n <SelectTrigger\n size=\"sm\"\n aria-label={pageSizeLabel}\n className=\"w-auto gap-1.5 text-xs tabular-nums max-sm:order-3 pointer-coarse:h-11\"\n >\n <SelectValue />\n </SelectTrigger>\n <SelectContent align=\"end\">\n {sizes.map((s) => (\n <SelectItem key={s} value={String(s)}>\n {formatPageSize(s)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n )}\n </nav>\n );\n}\n\nexport { Pagination };\n"],"mappings":";;;;;;;;;;;;AAaA,SAAgB,gBACd,MACA,WACA,WAAW,GACc;CACzB,YAAY,OAAO,SAAS,SAAS,IAAI,KAAK,IAAI,GAAG,KAAK,MAAM,SAAS,CAAC,IAAI;CAC9E,WAAW,OAAO,SAAS,QAAQ,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,KAAK,MAAM,QAAQ,CAAC,CAAC,IAAI;CACxF,OAAO,OAAO,SAAS,IAAI,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,WAAW,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI;CACpF,IAAI,aAAa,GAAG,OAAO,CAAC;CAC5B,MAAM,SAAS,WAAW,IAAI;CAC9B,IAAI,aAAa,QAAQ,OAAO,MAAM,KAAK,EAAE,QAAQ,UAAU,IAAI,GAAG,MAAM,IAAI,CAAC;CACjF,MAAM,QAAQ,KAAK,IAAI,GAAG,OAAO,QAAQ;CACzC,MAAM,MAAM,KAAK,IAAI,YAAY,GAAG,OAAO,QAAQ;CACnD,MAAM,MAA+B,CAAC,CAAC;CACvC,IAAI,QAAQ,GAAG,IAAI,KAAK,UAAU;CAClC,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,KAAK,GAAG,IAAI,KAAK,CAAC;CAChD,IAAI,MAAM,YAAY,GAAG,IAAI,KAAK,UAAU;CAC5C,IAAI,KAAK,SAAS;CAClB,OAAO;AACT;;AAOA,IAAa,qBAAwC;CAAC;CAAI;CAAI;AAAG;;AAgBjE,SAAgB,aAAa,OAAe,UAA0B;CACpE,IAAI,CAAC,OAAO,SAAS,KAAK,KAAK,SAAS,GAAG,OAAO;CAElD,OAAO,KAAK,IAAI,GAAG,KAAK,KAAK,SADhB,OAAO,SAAS,QAAQ,IAAI,KAAK,IAAI,GAAG,KAAK,MAAM,QAAQ,CAAC,IAAI,EACpC,CAAC;AAC5C;;AAGA,SAAgB,UAAU,MAAe,WAA2B;CAClE,MAAM,IAAI,OAAO,SAAS,WAAW,OAAO,OAAO,IAAI;CACvD,IAAI,CAAC,OAAO,SAAS,CAAC,GAAG,OAAO;CAChC,OAAO,KAAK,IAAI,KAAK,IAAI,GAAG,KAAK,MAAM,CAAC,CAAC,GAAG,KAAK,IAAI,GAAG,KAAK,MAAM,SAAS,KAAK,CAAC,CAAC;AACrF;;AAGA,SAAgB,WAAW,EACzB,MACA,UACA,SAKa;CACb,MAAM,OAAO,OAAO,SAAS,QAAQ,IAAI,KAAK,IAAI,GAAG,KAAK,MAAM,QAAQ,CAAC,IAAI;CAC7E,MAAM,YAAY,OAAO,SAAS,KAAK,IAAI,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,CAAC,IAAI;CAC5E,MAAM,YAAY,aAAa,WAAW,IAAI;CAC9C,MAAM,IAAI,UAAU,MAAM,SAAS;CACnC,MAAM,SAAS,IAAI,KAAK;CACxB,MAAM,KAAK,KAAK,IAAI,QAAQ,MAAM,SAAS;CAC3C,OAAO;EACL,MAAM;EACN;EACA,UAAU;EACV,OAAO;EACP,MAAM,YAAY,QAAQ,IAAI;EAC9B,IAAI,YAAY,KAAK;CACvB;AACF;;AAGA,SAAgB,SACd,MACA,MACA,UAC4B;CAC5B,MAAM,IAAI,WAAW;EAAE;EAAM;EAAU,OAAO,KAAK;CAAO,CAAC;CAC3D,OAAO;EAAE,GAAG;EAAG,MAAM,KAAK,MAAM,EAAE,OAAO,EAAE,OAAO,IAAI,GAAG,EAAE,EAAE;CAAE;AACjE;;;;;AAMA,SAAgB,kBACd,EAAE,MAAM,IAAI,SACZ,QACQ;CACR,MAAM,MAAM,IAAI,KAAK,aAAa,MAAM;CACxC,IAAI,CAAC,OAAO,OAAO;CACnB,IAAI,SAAS,KAAK,OAAO,OAAO,OAAO,GAAG,IAAI,OAAO,KAAK,EAAE,MAAM,IAAI,OAAO,KAAK;CAClF,OAAO,GAAG,IAAI,OAAO,IAAI,EAAE,GAAG,IAAI,OAAO,EAAE,EAAE,MAAM,IAAI,OAAO,KAAK;AACrE;AAEA,IAAM,iBAAiB,QAAgB,gBAAgB;AAEvD,SAAS,eAAe,KAAyB,SAAgD;CAC/F,IAAI,CAAC,KAAK,OAAO,KAAA;CACjB,IAAI;EACF,MAAM,IAAI,OAAO,WAAW,cAAc,QAAQ,cAAc,GAAG,CAAC,CAAC;EACrE,OAAO,QAAQ,SAAS,CAAC,IAAI,IAAI,KAAA;CACnC,QAAQ;EACN;CACF;AACF;AAEA,SAAS,gBAAgB,KAAyB,MAAc;CAC9D,IAAI,CAAC,KAAK;CACV,IAAI;EACF,WAAW,cAAc,QAAQ,cAAc,GAAG,GAAG,OAAO,IAAI,CAAC;CACnE,QAAQ,CAER;AACF;;;;;;AAuDA,SAAgB,cACd,MACA,UAAgC,CAAC,GACT;CACxB,MAAM,EACJ,MAAM,UACN,cAAc,GACd,cACA,UAAU,cACV,iBACA,kBACA,kBAAkB,oBAClB,UACA,YACA,OAAO,aACP,WACE;CAEJ,MAAM,CAAC,WAAW,gBAAgB,MAAM,SAAS,WAAW;CAC5D,MAAM,CAAC,WAAW,gBAAgB,MAAM,eAEpC,eAAe,YAAY,eAAe,KAAK,mBAAmB,gBAAgB,MAAM,EAC5F;CACA,MAAM,OAAO,YAAY;CACzB,MAAM,WAAW,gBAAgB;CAGjC,MAAM,SAAS,MAAM,OAAO;EAAE;EAAc;EAAkB;EAAU;CAAW,CAAC;CACpF,MAAM,gBAAgB;EACpB,OAAO,UAAU;GAAE;GAAc;GAAkB;GAAU;EAAW;CAC1E,CAAC;CAED,MAAM,UAAU,MAAM,aAAa,SAAiB;EAClD,aAAa,IAAI;EACjB,OAAO,QAAQ,eAAe,IAAI;CACpC,GAAG,CAAC,CAAC;CACL,MAAM,cAAc,MAAM,aAAa,SAAiB;EACtD,gBAAgB,OAAO,QAAQ,YAAY,IAAI;EAC/C,aAAa,IAAI;EACjB,aAAa,CAAC;EACd,OAAO,QAAQ,mBAAmB,IAAI;EACtC,OAAO,QAAQ,eAAe,CAAC;CACjC,GAAG,CAAC,CAAC;CAIL,MAAM,CAAC,SAAS,cAAc,MAAM,SAAS,QAAQ;CACrD,IAAI,CAAC,OAAO,GAAG,SAAS,QAAQ,GAAG;EACjC,WAAW,QAAQ;EACnB,aAAa,CAAC;CAChB;CACA,MAAM,eAAe,MAAM,OAAO,QAAQ;CAC1C,MAAM,gBAAgB;EACpB,IAAI,OAAO,GAAG,aAAa,SAAS,QAAQ,GAAG;EAC/C,aAAa,UAAU;EACvB,MAAM,EAAE,UAAU,YAAY,cAAc,WAAW,OAAO;EAC9D,IAAI,eAAe,KAAA,KAAa,eAAe,GAAG,SAAS,CAAC;CAC9D,GAAG,CAAC,QAAQ,CAAC;CAEb,MAAM,IACJ,gBAAgB,KAAA,IACZ,SAAS,MAAM,MAAM,QAAQ,IAC7B;EAAE,GAAG,WAAW;GAAE;GAAM;GAAU,OAAO;EAAY,CAAC;EAAG,MAAM,CAAC,GAAG,IAAI;CAAE;CAC/E,MAAM,UAAU,kBAAkB,GAAG,MAAM;CAE3C,MAAM,WAAW,EAAE,QAAQ,KAAK,IAAI,EAAE,UAAU,GAAG,eAAe;CAElE,OAAO;EACL,GAAG;EACH;EACA;EACA;EACA;EACA;EACA,iBAAiB;GACf,MAAM,EAAE;GACR,WAAW,EAAE;GACb,cAAc;GACd,UAAU,EAAE;GACZ;GACA,kBAAkB;GAClB;EACF;CACF;AACF;;;;;;;AAkCA,SAAS,WAAW,EAClB,MAAM,eACN,WAAW,gBACX,cACA,WAAW,GACX,SACA,OACA,UACA,kBAAkB,oBAClB,kBACA,gBAAgB,iBAChB,kBAAkB,SAAS,GAAG,KAAK,YACnC,WACA,GAAG,SACe;CAClB,MAAM,YAAY,OAAO,SAAS,cAAc,IAAI,KAAK,IAAI,GAAG,KAAK,MAAM,cAAc,CAAC,IAAI;CAC9F,MAAM,OACJ,cAAc,IACV,IACA,OAAO,SAAS,aAAa,IAC3B,KAAK,IAAI,GAAG,KAAK,IAAI,WAAW,KAAK,MAAM,aAAa,CAAC,CAAC,IAC1D;CACR,MAAM,QAAQ,gBAAgB,MAAM,WAAW,QAAQ;CACvD,MAAM,MAAM,MAAc,aAAa,KAAK,IAAI,KAAK,IAAI,GAAG,CAAC,GAAG,KAAK,IAAI,GAAG,SAAS,CAAC,CAAC;CACvF,MAAM,eACJ,YACC,UAAU,KAAA,KAAa,WACpB,kBAAkB,WAAW;EAAE,MAAM,QAAQ;EAAG;EAAU;CAAM,CAAC,CAAC,IAClE;CACN,MAAM,QACJ,aAAa,KAAA,KAAa,CAAC,gBAAgB,SAAS,QAAQ,IACxD,CAAC,GAAG,iBAAiB,QAAQ,CAAC,CAAC,MAAM,GAAG,MAAM,IAAI,CAAC,IACnD;CACN,MAAM,WAAW,QAAQ,KAAK,MAAM;CACpC,OACE,qBAAC,OAAD;EACE,cAAW;EACX,aAAU;EACV,WAAW,GAAG,+DAA+D,SAAS;EACtF,GAAI;EAJN,UAAA;GAME,oBAAC,OAAD;IACE,aAAU;IACV,WAAU;IAET,UAAA;GACE,CAAA;GAEL,oBAAC,QAAD;IAAM,MAAK;IAAS,WAAU;IAC3B,UAAA,YAAY,IAAI,WAAW;GACxB,CAAA;GACN,qBAAC,MAAD;IAAI,WAAU;IAAd,UAAA;KACE,oBAAC,MAAD,EAAA,UACE,qBAAC,QAAD;MACE,SAAQ;MACR,MAAK;MACL,eAAe,GAAG,OAAO,CAAC;MAC1B,UAAU,QAAQ;MAClB,cAAW;MACX,WAAU;MANZ,UAAA,CAQE,oBAAC,aAAD,EAAa,eAAA,KAAa,CAAA,GAC1B,oBAAC,QAAD;OAAM,WAAU;OAAmB,UAAA;MAAc,CAAA,CAC3C;KACN,CAAA,EAAA,CAAA;KACH,MAAM,KAAK,GAAG,MACb,MAAM,aACJ,oBAAC,MAAD;MAAkB,eAAA;MAAY,WAAU;MAA6C,UAAA;KAEjF,GAFK,IAAI,GAET,IAEJ,oBAAC,MAAD;MAAY,WAAU;MACpB,UAAA,oBAAC,QAAD;OACE,SAAS,MAAM,OAAO,YAAY;OAClC,MAAK;OACL,eAAe,GAAG,CAAC;OACnB,gBAAc,MAAM,OAAO,SAAS,KAAA;OACpC,cAAY,QAAQ;OACpB,WAAW,GAAG,gBAAgB,MAAM,QAAQ,4BAA4B;OAEvE,UAAA;MACK,CAAA;KACN,GAXK,CAWL,CAER;KACA,oBAAC,MAAD;MACE,eAAA;MACA,aAAU;MACV,WAAU;MAET,UAAA,YAAY,IAAI,WAAW;KAC1B,CAAA;KACJ,oBAAC,MAAD,EAAA,UACE,qBAAC,QAAD;MACE,SAAQ;MACR,MAAK;MACL,eAAe,GAAG,OAAO,CAAC;MAC1B,UAAU,QAAQ;MAClB,cAAW;MACX,WAAU;MANZ,UAAA,CAQE,oBAAC,QAAD;OAAM,WAAU;OAAmB,UAAA;MAAU,CAAA,GAC7C,oBAAC,cAAD,EAAc,eAAA,KAAa,CAAA,CACrB;KACN,CAAA,EAAA,CAAA;IACF;;GACH,oBACC,qBAAC,QAAD;IACE,OAAO,aAAa,KAAA,IAAY,OAAO,QAAQ,IAAI,KAAA;IACnD,gBAAgB,MAAM,iBAAiB,OAAO,CAAC,CAAC;IAFlD,UAAA,CAIE,oBAAC,eAAD;KACE,MAAK;KACL,cAAY;KACZ,WAAU;KAEV,UAAA,oBAAC,aAAD,CAAc,CAAA;IACD,CAAA,GACf,oBAAC,eAAD;KAAe,OAAM;KAClB,UAAA,MAAM,KAAK,MACV,oBAAC,YAAD;MAAoB,OAAO,OAAO,CAAC;MAChC,UAAA,eAAe,CAAC;KACP,GAFK,CAEL,CACb;IACY,CAAA,CACT;;EAEP;;AAET"}
|
|
1
|
+
{"version":3,"file":"pagination.js","names":[],"sources":["../../src/components/pagination.tsx"],"sourcesContent":["import ChevronLeft from '@burtson-labs/icons/react/chevron-left';\nimport ChevronRight from '@burtson-labs/icons/react/chevron-right';\nimport * as React from 'react';\n\nimport { cn } from '../lib/utils';\n\nimport { Button } from './button';\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from './select';\n\n/**\n * The page numbers to show: always the first and last page, `siblings` pages\n * either side of the current one, and 'ellipsis' for the gaps.\n */\nexport function paginationRange(\n page: number,\n pageCount: number,\n siblings = 1,\n): (number | 'ellipsis')[] {\n pageCount = Number.isFinite(pageCount) ? Math.max(0, Math.floor(pageCount)) : 0;\n siblings = Number.isFinite(siblings) ? Math.min(5, Math.max(0, Math.floor(siblings))) : 1;\n page = Number.isFinite(page) ? Math.max(1, Math.min(pageCount, Math.floor(page))) : 1;\n if (pageCount <= 0) return [];\n const window = siblings * 2 + 5; // first, last, current, siblings, two gaps\n if (pageCount <= window) return Array.from({ length: pageCount }, (_, i) => i + 1);\n const start = Math.max(2, page - siblings);\n const end = Math.min(pageCount - 1, page + siblings);\n const out: (number | 'ellipsis')[] = [1];\n if (start > 2) out.push('ellipsis');\n for (let p = start; p <= end; p += 1) out.push(p);\n if (end < pageCount - 1) out.push('ellipsis');\n out.push(pageCount);\n return out;\n}\n\n/* ------------------------------------------------------------------------ */\n/* Paging arithmetic: no React, for any list, table or server query. */\n/* ------------------------------------------------------------------------ */\n\n/** The page sizes offered by default: 25, 50 or 100 rows. */\nexport const DEFAULT_PAGE_SIZES: readonly number[] = [25, 50, 100];\n\nexport interface PageWindow {\n /** 1-based, clamped to the pages that exist (1 when there are no rows). */\n page: number;\n /** At least 1, so \"Page 1 of 1\" reads sensibly for an empty list. */\n pageCount: number;\n pageSize: number;\n total: number;\n /** 1-based index of the first row on this page; 0 when there are none. */\n from: number;\n /** 1-based index of the last row on this page; 0 when there are none. */\n to: number;\n}\n\n/** Pages needed for `total` rows, never less than 1. */\nexport function pageCountFor(total: number, pageSize: number): number {\n if (!Number.isFinite(total) || total <= 0) return 1;\n const size = Number.isFinite(pageSize) ? Math.max(1, Math.floor(pageSize)) : 1;\n return Math.max(1, Math.ceil(total / size));\n}\n\n/** A requested page clamped to 1…pageCount. Anything unreadable (\"abc\", NaN) is page 1. */\nexport function clampPage(page: unknown, pageCount: number): number {\n const n = typeof page === 'number' ? page : Number(page);\n if (!Number.isFinite(n)) return 1;\n return Math.min(Math.max(1, Math.floor(n)), Math.max(1, Math.floor(pageCount) || 1));\n}\n\n/** Where page `page` of `total` rows starts and ends, for server-side paging. */\nexport function pageWindow({\n page,\n pageSize,\n total,\n}: {\n page: unknown;\n pageSize: number;\n total: number;\n}): PageWindow {\n const size = Number.isFinite(pageSize) ? Math.max(1, Math.floor(pageSize)) : 1;\n const safeTotal = Number.isFinite(total) ? Math.max(0, Math.floor(total)) : 0;\n const pageCount = pageCountFor(safeTotal, size);\n const p = clampPage(page, pageCount);\n const start = (p - 1) * size;\n const to = Math.min(start + size, safeTotal);\n return {\n page: p,\n pageCount,\n pageSize: size,\n total: safeTotal,\n from: safeTotal ? start + 1 : 0,\n to: safeTotal ? to : 0,\n };\n}\n\n/** One page of `rows`, with the numbers for the page controls. */\nexport function paginate<T>(\n rows: readonly T[],\n page: unknown,\n pageSize: number,\n): PageWindow & { rows: T[] } {\n const w = pageWindow({ page, pageSize, total: rows.length });\n return { ...w, rows: rows.slice(w.from ? w.from - 1 : 0, w.to) };\n}\n\n/**\n * \"1–25 of 312\", \"7 of 7\" when everything fits, \"0 of 0\" when empty. Numbers\n * use the locale's grouping (\"1,025\"); pass `locale` to pin it.\n */\nexport function paginationSummary(\n { from, to, total }: Pick<PageWindow, 'from' | 'to' | 'total'>,\n locale?: string,\n): string {\n const fmt = new Intl.NumberFormat(locale);\n if (!total) return '0 of 0';\n if (from === 1 && to === total) return `${fmt.format(total)} of ${fmt.format(total)}`;\n return `${fmt.format(from)}–${fmt.format(to)} of ${fmt.format(total)}`;\n}\n\nconst storedSizeKey = (key: string) => `bl-page-size:${key}`;\n\nfunction readStoredSize(key: string | undefined, options: readonly number[]): number | undefined {\n if (!key) return undefined;\n try {\n const n = Number(globalThis.localStorage?.getItem(storedSizeKey(key)));\n return options.includes(n) ? n : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction writeStoredSize(key: string | undefined, size: number) {\n if (!key) return;\n try {\n globalThis.localStorage?.setItem(storedSizeKey(key), String(size));\n } catch {\n // Storage blocked (private mode, a sandboxed frame): the size is not remembered.\n }\n}\n\nexport interface UsePaginationOptions {\n /** Controlled page (e.g. read from the URL). Leave out to let the hook keep it. */\n page?: number;\n /** Starting page when uncontrolled. */\n defaultPage?: number;\n onPageChange?: (page: number) => void;\n /** Controlled page size. */\n pageSize?: number;\n /** Starting page size when uncontrolled; the first option by default. */\n defaultPageSize?: number;\n onPageSizeChange?: (pageSize: number) => void;\n /** Sizes offered by the page-size menu. */\n pageSizeOptions?: readonly number[];\n /**\n * Whatever decides which rows are listed (search text, a filter, a tab).\n * When it changes, paging goes back to page 1. The first render never\n * resets, so a link to page 3 stays on page 3.\n */\n resetKey?: unknown;\n /** Remembers the chosen page size in localStorage under this key. */\n storageKey?: string;\n /**\n * The full row count when the server pages: `rows` is then already the\n * current page and is not sliced.\n */\n total?: number;\n /** Locale for the summary's numbers. */\n locale?: string;\n}\n\nexport interface UsePaginationResult<T> extends PageWindow {\n /** The rows to render on this page. */\n rows: T[];\n pageSizeOptions: readonly number[];\n /** \"1–25 of 312\". */\n summary: string;\n /** More rows than the smallest page size: worth showing controls for. */\n hasPages: boolean;\n setPage: (page: number) => void;\n /** Changes the size and goes back to page 1. */\n setPageSize: (pageSize: number) => void;\n /** Spread onto Pagination (or pass to DataTable's paging props). */\n paginationProps: Pick<\n PaginationProps,\n 'page' | 'pageCount' | 'onPageChange' | 'pageSize' | 'pageSizeOptions' | 'onPageSizeChange'\n > & { summary: string };\n}\n\n/**\n * Headless paging for a list or table: slices `rows`, clamps the page,\n * returns to page 1 when `resetKey` changes, and optionally remembers the\n * page size. Controlled `page` / `pageSize` let an app keep them in the URL.\n */\nexport function usePagination<T>(\n rows: readonly T[],\n options: UsePaginationOptions = {},\n): UsePaginationResult<T> {\n const {\n page: pageProp,\n defaultPage = 1,\n onPageChange,\n pageSize: pageSizeProp,\n defaultPageSize,\n onPageSizeChange,\n pageSizeOptions = DEFAULT_PAGE_SIZES,\n resetKey,\n storageKey,\n total: serverTotal,\n locale,\n } = options;\n\n const [pageState, setPageState] = React.useState(defaultPage);\n const [sizeState, setSizeState] = React.useState<number>(\n () =>\n readStoredSize(storageKey, pageSizeOptions) ?? defaultPageSize ?? pageSizeOptions[0] ?? 25,\n );\n const page = pageProp ?? pageState;\n const pageSize = pageSizeProp ?? sizeState;\n\n // Keep the latest callbacks without making the setters change every render.\n const latest = React.useRef({ onPageChange, onPageSizeChange, pageProp, storageKey });\n React.useEffect(() => {\n latest.current = { onPageChange, onPageSizeChange, pageProp, storageKey };\n });\n\n const setPage = React.useCallback((next: number) => {\n setPageState(next);\n latest.current.onPageChange?.(next);\n }, []);\n const setPageSize = React.useCallback((next: number) => {\n writeStoredSize(latest.current.storageKey, next);\n setSizeState(next);\n setPageState(1);\n latest.current.onPageSizeChange?.(next);\n latest.current.onPageChange?.(1);\n }, []);\n\n // A new filter starts again at page 1: during render for local state (no\n // flash of an empty page), and after it for a controlled page.\n const [lastKey, setLastKey] = React.useState(resetKey);\n if (!Object.is(lastKey, resetKey)) {\n setLastKey(resetKey);\n setPageState(1);\n }\n const committedKey = React.useRef(resetKey);\n React.useEffect(() => {\n if (Object.is(committedKey.current, resetKey)) return;\n committedKey.current = resetKey;\n const { pageProp: controlled, onPageChange: report } = latest.current;\n if (controlled !== undefined && controlled !== 1) report?.(1);\n }, [resetKey]);\n\n const w =\n serverTotal === undefined\n ? paginate(rows, page, pageSize)\n : { ...pageWindow({ page, pageSize, total: serverTotal }), rows: [...rows] };\n const summary = paginationSummary(w, locale);\n // pageSize first: Math.min() of an empty options list is Infinity.\n const hasPages = w.total > Math.min(w.pageSize, ...pageSizeOptions);\n\n return {\n ...w,\n pageSizeOptions,\n summary,\n hasPages,\n setPage,\n setPageSize,\n paginationProps: {\n page: w.page,\n pageCount: w.pageCount,\n onPageChange: setPage,\n pageSize: w.pageSize,\n pageSizeOptions,\n onPageSizeChange: setPageSize,\n summary,\n },\n };\n}\n\n/* ------------------------------------------------------------------------ */\n/* The controls. */\n/* ------------------------------------------------------------------------ */\n\nexport interface PaginationProps extends Omit<React.ComponentProps<'nav'>, 'onChange'> {\n /** 1-based current page. */\n page: number;\n pageCount: number;\n onPageChange: (page: number) => void;\n siblings?: number;\n /** Summary on the left, e.g. \"1–25 of 312\". Worked out from `total` when left out. */\n summary?: React.ReactNode;\n /** Total rows: with `pageSize`, gives the default summary. */\n total?: number;\n /** Rows per page, shown in the page-size menu. */\n pageSize?: number;\n /** Sizes in the page-size menu (25, 50, 100 by default). */\n pageSizeOptions?: readonly number[];\n /** Adds a rows-per-page menu. */\n onPageSizeChange?: (pageSize: number) => void;\n /** The page-size menu's accessible name. */\n pageSizeLabel?: string;\n /** An option's text, e.g. \"25 per page\". */\n formatPageSize?: (size: number) => string;\n}\n\n/**\n * Page controls for a table or list: a summary, the pages, and optionally a\n * rows-per-page menu. Below 640px it becomes \"Page 2 of 13\" between large\n * previous and next buttons. Buttons are real buttons, keyboard-reachable,\n * and 44px on touch screens.\n */\nconst Pagination = React.forwardRef<HTMLElement, PaginationProps>(function Pagination(\n {\n page: requestedPage,\n pageCount: requestedCount,\n onPageChange,\n siblings = 1,\n summary,\n total,\n pageSize,\n pageSizeOptions = DEFAULT_PAGE_SIZES,\n onPageSizeChange,\n pageSizeLabel = 'Rows per page',\n formatPageSize = (size) => `${size} per page`,\n className,\n ...props\n },\n ref,\n) {\n const pageCount = Number.isFinite(requestedCount) ? Math.max(0, Math.floor(requestedCount)) : 0;\n const page =\n pageCount === 0\n ? 0\n : Number.isFinite(requestedPage)\n ? Math.max(1, Math.min(pageCount, Math.floor(requestedPage)))\n : 1;\n const pages = paginationRange(page, pageCount, siblings);\n const go = (p: number) => onPageChange(Math.min(Math.max(1, p), Math.max(1, pageCount)));\n const shownSummary =\n summary ??\n (total !== undefined && pageSize\n ? paginationSummary(pageWindow({ page: page || 1, pageSize, total }))\n : null);\n const sizes =\n pageSize !== undefined && !pageSizeOptions.includes(pageSize)\n ? [...pageSizeOptions, pageSize].sort((a, b) => a - b)\n : pageSizeOptions;\n const position = `Page ${page} of ${pageCount}`;\n return (\n <nav\n ref={ref}\n aria-label=\"Pagination\"\n data-slot=\"pagination\"\n className={cn('flex flex-wrap items-center justify-between gap-x-3 gap-y-2', className)}\n {...props}\n >\n <div\n data-slot=\"pagination-summary\"\n className=\"min-w-0 text-xs text-muted-foreground tabular-nums max-sm:order-2\"\n >\n {shownSummary}\n </div>\n {/* Announced when the page changes; the visible \"Page 2 of 13\" is for phones. */}\n <span role=\"status\" className=\"sr-only\">\n {pageCount > 0 ? position : ''}\n </span>\n <ul className=\"flex items-center gap-1 max-sm:order-1 max-sm:w-full max-sm:justify-between\">\n <li>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => go(page - 1)}\n disabled={page <= 1}\n aria-label=\"Previous page\"\n className=\"max-sm:size-11 max-sm:border max-sm:border-border max-sm:px-0\"\n >\n <ChevronLeft aria-hidden />\n <span className=\"hidden sm:inline\">Previous</span>\n </Button>\n </li>\n {pages.map((p, i) =>\n p === 'ellipsis' ? (\n <li key={`e${i}`} aria-hidden className=\"hidden px-1 text-muted-foreground sm:block\">\n …\n </li>\n ) : (\n <li key={p} className=\"hidden sm:block\">\n <Button\n variant={p === page ? 'outline' : 'ghost'}\n size=\"icon-sm\"\n onClick={() => go(p)}\n aria-current={p === page ? 'page' : undefined}\n aria-label={`Page ${p}`}\n className={cn('tabular-nums', p === page && 'border-brand/40 text-brand')}\n >\n {p}\n </Button>\n </li>\n ),\n )}\n <li\n aria-hidden\n data-slot=\"pagination-position\"\n className=\"px-2 text-sm font-medium tabular-nums sm:hidden\"\n >\n {pageCount > 0 ? position : ''}\n </li>\n <li>\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={() => go(page + 1)}\n disabled={page >= pageCount}\n aria-label=\"Next page\"\n className=\"max-sm:size-11 max-sm:border max-sm:border-border max-sm:px-0\"\n >\n <span className=\"hidden sm:inline\">Next</span>\n <ChevronRight aria-hidden />\n </Button>\n </li>\n </ul>\n {onPageSizeChange && (\n <Select\n value={pageSize !== undefined ? String(pageSize) : undefined}\n onValueChange={(v) => onPageSizeChange(Number(v))}\n >\n <SelectTrigger\n size=\"sm\"\n aria-label={pageSizeLabel}\n className=\"w-auto gap-1.5 text-xs tabular-nums max-sm:order-3 pointer-coarse:h-11\"\n >\n <SelectValue />\n </SelectTrigger>\n <SelectContent align=\"end\">\n {sizes.map((s) => (\n <SelectItem key={s} value={String(s)}>\n {formatPageSize(s)}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n )}\n </nav>\n );\n});\n\nexport { Pagination };\n"],"mappings":"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"}
|
|
@@ -1,19 +1,22 @@
|
|
|
1
|
-
import { Popover as PopoverPrimitive } from 'radix-ui';
|
|
2
1
|
import * as React from 'react';
|
|
2
|
+
import * as PopoverPrimitive from '../primitives/vendor/radix/react-popover';
|
|
3
3
|
/**
|
|
4
4
|
* The floating surface shared by popovers, menus and select lists: raised,
|
|
5
|
-
* with a strong border, and the
|
|
5
|
+
* with a strong border, 12px radius and the floating shadow (elevation 4).
|
|
6
6
|
*/
|
|
7
|
-
export declare const surfaceClasses = "z-50 animate-in rounded-lg border border-border-strong bg-surface-raised text-popover-foreground shadow-
|
|
7
|
+
export declare const surfaceClasses = "z-50 animate-in rounded-lg border border-border-strong bg-surface-raised text-popover-foreground shadow-lg data-[state=closed]:animate-out data-[side=bottom]:[--bl-ty:-6px] data-[side=top]:[--bl-ty:6px] data-[side=left]:[--bl-tx:6px] data-[side=right]:[--bl-tx:-6px]";
|
|
8
8
|
/**
|
|
9
|
-
* A menu row: 32px, 8px radius (the surface's 12px
|
|
10
|
-
* focused row is a quiet secondary fill (muted is
|
|
11
|
-
* surface in dark mode to read). The outline is
|
|
12
|
-
* with !important so a host page's global focus outline cannot box
|
|
9
|
+
* A menu row: 32px (44px on touch screens), 8px radius (the surface's 12px
|
|
10
|
+
* less its 4px padding); the focused row is a quiet secondary fill (muted is
|
|
11
|
+
* too close to the raised surface in dark mode to read). The outline is
|
|
12
|
+
* suppressed with !important so a host page's global focus outline cannot box
|
|
13
|
+
* the row; forced-colors mode gets a system outline instead.
|
|
13
14
|
*/
|
|
14
|
-
export declare const menuItemClasses = "relative flex min-h-8 cursor-default items-center gap-2 rounded-sm px-2 text-[13px] outline-
|
|
15
|
+
export declare const menuItemClasses = "relative flex min-h-8 cursor-default items-center gap-2 rounded-sm px-2 text-[13px] outline-none! forced-colors:focus-visible:[outline:2px_solid_Highlight]! forced-colors:focus-visible:outline-offset-2 select-none focus:bg-secondary focus:text-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 pointer-coarse:min-h-11 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground";
|
|
16
|
+
/** The small uppercase heading over a group of rows, shared by menus and Select. */
|
|
17
|
+
export declare const menuLabelClasses = "px-2 pt-2 pb-1 text-[11px] font-semibold tracking-[0.06em] text-muted-foreground uppercase";
|
|
15
18
|
declare function Popover(props: React.ComponentProps<typeof PopoverPrimitive.Root>): React.JSX.Element;
|
|
16
|
-
declare
|
|
17
|
-
declare
|
|
18
|
-
declare
|
|
19
|
+
declare const PopoverTrigger: React.ForwardRefExoticComponent<Omit<PopoverPrimitive.PopoverTriggerProps & React.RefAttributes<HTMLButtonElement>, "ref"> & React.RefAttributes<HTMLButtonElement>>;
|
|
20
|
+
declare const PopoverAnchor: React.ForwardRefExoticComponent<Omit<PopoverPrimitive.PopoverAnchorProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
21
|
+
declare const PopoverContent: React.ForwardRefExoticComponent<Omit<PopoverPrimitive.PopoverContentProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
19
22
|
export { Popover, PopoverAnchor, PopoverContent, PopoverTrigger };
|
|
@@ -1,48 +1,55 @@
|
|
|
1
|
-
|
|
2
|
-
import {
|
|
3
|
-
import "react";
|
|
1
|
+
"use client";
|
|
2
|
+
import { cn, noOutlineClasses } from "../lib/utils.js";
|
|
3
|
+
import { Anchor, Content, Portal, Root, Trigger } from "../primitives/vendor/radix/react-popover/popover.js";
|
|
4
|
+
import * as React from "react";
|
|
4
5
|
import { jsx } from "react/jsx-runtime";
|
|
5
6
|
//#region src/components/popover.tsx
|
|
6
7
|
/**
|
|
7
8
|
* The floating surface shared by popovers, menus and select lists: raised,
|
|
8
|
-
* with a strong border, and the
|
|
9
|
+
* with a strong border, 12px radius and the floating shadow (elevation 4).
|
|
9
10
|
*/
|
|
10
|
-
var surfaceClasses = "z-50 animate-in rounded-lg border border-border-strong bg-surface-raised text-popover-foreground shadow-
|
|
11
|
+
var surfaceClasses = "z-50 animate-in rounded-lg border border-border-strong bg-surface-raised text-popover-foreground shadow-lg data-[state=closed]:animate-out data-[side=bottom]:[--bl-ty:-6px] data-[side=top]:[--bl-ty:6px] data-[side=left]:[--bl-tx:6px] data-[side=right]:[--bl-tx:-6px]";
|
|
11
12
|
/**
|
|
12
|
-
* A menu row: 32px, 8px radius (the surface's 12px
|
|
13
|
-
* focused row is a quiet secondary fill (muted is
|
|
14
|
-
* surface in dark mode to read). The outline is
|
|
15
|
-
* with !important so a host page's global focus outline cannot box
|
|
13
|
+
* A menu row: 32px (44px on touch screens), 8px radius (the surface's 12px
|
|
14
|
+
* less its 4px padding); the focused row is a quiet secondary fill (muted is
|
|
15
|
+
* too close to the raised surface in dark mode to read). The outline is
|
|
16
|
+
* suppressed with !important so a host page's global focus outline cannot box
|
|
17
|
+
* the row; forced-colors mode gets a system outline instead.
|
|
16
18
|
*/
|
|
17
|
-
var menuItemClasses =
|
|
18
|
-
|
|
19
|
-
|
|
19
|
+
var menuItemClasses = `relative flex min-h-8 cursor-default items-center gap-2 rounded-sm px-2 text-[13px] ${noOutlineClasses} select-none focus:bg-secondary focus:text-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 pointer-coarse:min-h-11 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground`;
|
|
20
|
+
/** The small uppercase heading over a group of rows, shared by menus and Select. */
|
|
21
|
+
var menuLabelClasses = "px-2 pt-2 pb-1 text-[11px] font-semibold tracking-[0.06em] text-muted-foreground uppercase";
|
|
22
|
+
function Popover(props) {
|
|
23
|
+
return /* @__PURE__ */ jsx(Root, {
|
|
20
24
|
"data-slot": "popover",
|
|
21
25
|
...props
|
|
22
26
|
});
|
|
23
27
|
}
|
|
24
|
-
function PopoverTrigger(props) {
|
|
25
|
-
return /* @__PURE__ */ jsx(
|
|
28
|
+
var PopoverTrigger = React.forwardRef(function PopoverTrigger(props, ref) {
|
|
29
|
+
return /* @__PURE__ */ jsx(Trigger, {
|
|
30
|
+
ref,
|
|
26
31
|
"data-slot": "popover-trigger",
|
|
27
32
|
...props
|
|
28
33
|
});
|
|
29
|
-
}
|
|
30
|
-
function PopoverAnchor(props) {
|
|
31
|
-
return /* @__PURE__ */ jsx(
|
|
34
|
+
});
|
|
35
|
+
var PopoverAnchor = React.forwardRef(function PopoverAnchor(props, ref) {
|
|
36
|
+
return /* @__PURE__ */ jsx(Anchor, {
|
|
37
|
+
ref,
|
|
32
38
|
"data-slot": "popover-anchor",
|
|
33
39
|
...props
|
|
34
40
|
});
|
|
35
|
-
}
|
|
36
|
-
function PopoverContent({ className, align = "center", sideOffset = 6, ...props }) {
|
|
37
|
-
return /* @__PURE__ */ jsx(
|
|
41
|
+
});
|
|
42
|
+
var PopoverContent = React.forwardRef(function PopoverContent({ className, align = "center", sideOffset = 6, ...props }, ref) {
|
|
43
|
+
return /* @__PURE__ */ jsx(Portal, { children: /* @__PURE__ */ jsx(Content, {
|
|
44
|
+
ref,
|
|
38
45
|
"data-slot": "popover-content",
|
|
39
46
|
align,
|
|
40
47
|
sideOffset,
|
|
41
|
-
className: cn(surfaceClasses, "w-72 max-w-[calc(100vw-2rem)] max-h-(--radix-popover-content-available-height) overflow-y-auto origin-(--radix-popover-content-transform-origin) p-4 outline-
|
|
48
|
+
className: cn(surfaceClasses, "w-72 max-w-[calc(100vw-2rem)] max-h-(--radix-popover-content-available-height) overflow-y-auto origin-(--radix-popover-content-transform-origin) p-4 outline-none", className),
|
|
42
49
|
...props
|
|
43
50
|
}) });
|
|
44
|
-
}
|
|
51
|
+
});
|
|
45
52
|
//#endregion
|
|
46
|
-
export { Popover
|
|
53
|
+
export { Popover, PopoverAnchor, PopoverContent, PopoverTrigger, menuItemClasses, menuLabelClasses, surfaceClasses };
|
|
47
54
|
|
|
48
55
|
//# sourceMappingURL=popover.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"popover.js","names":["
|
|
1
|
+
{"version":3,"file":"popover.js","names":["PopoverPrimitive.Root","PopoverPrimitive.Trigger","PopoverPrimitive.Anchor","PopoverPrimitive.Portal","PopoverPrimitive.Content"],"sources":["../../src/components/popover.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { cn, noOutlineClasses } from '../lib/utils';\nimport * as PopoverPrimitive from '../primitives/vendor/radix/react-popover';\n\n/**\n * The floating surface shared by popovers, menus and select lists: raised,\n * with a strong border, 12px radius and the floating shadow (elevation 4).\n */\nexport const surfaceClasses =\n 'z-50 animate-in rounded-lg border border-border-strong bg-surface-raised text-popover-foreground shadow-lg data-[state=closed]:animate-out data-[side=bottom]:[--bl-ty:-6px] data-[side=top]:[--bl-ty:6px] data-[side=left]:[--bl-tx:6px] data-[side=right]:[--bl-tx:-6px]';\n\n/**\n * A menu row: 32px (44px on touch screens), 8px radius (the surface's 12px\n * less its 4px padding); the focused row is a quiet secondary fill (muted is\n * too close to the raised surface in dark mode to read). The outline is\n * suppressed with !important so a host page's global focus outline cannot box\n * the row; forced-colors mode gets a system outline instead.\n */\nexport const menuItemClasses = `relative flex min-h-8 cursor-default items-center gap-2 rounded-sm px-2 text-[13px] ${noOutlineClasses} select-none focus:bg-secondary focus:text-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[inset]:pl-8 pointer-coarse:min-h-11 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground`;\n\n/** The small uppercase heading over a group of rows, shared by menus and Select. */\nexport const menuLabelClasses =\n 'px-2 pt-2 pb-1 text-[11px] font-semibold tracking-[0.06em] text-muted-foreground uppercase';\n\nfunction Popover(props: React.ComponentProps<typeof PopoverPrimitive.Root>) {\n return <PopoverPrimitive.Root data-slot=\"popover\" {...props} />;\n}\n\nconst PopoverTrigger = React.forwardRef<\n HTMLButtonElement,\n React.ComponentProps<typeof PopoverPrimitive.Trigger>\n>(function PopoverTrigger(props, ref) {\n return <PopoverPrimitive.Trigger ref={ref} data-slot=\"popover-trigger\" {...props} />;\n});\n\nconst PopoverAnchor = React.forwardRef<\n HTMLDivElement,\n React.ComponentProps<typeof PopoverPrimitive.Anchor>\n>(function PopoverAnchor(props, ref) {\n return <PopoverPrimitive.Anchor ref={ref} data-slot=\"popover-anchor\" {...props} />;\n});\n\nconst PopoverContent = React.forwardRef<\n HTMLDivElement,\n React.ComponentProps<typeof PopoverPrimitive.Content>\n>(function PopoverContent({ className, align = 'center', sideOffset = 6, ...props }, ref) {\n return (\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n ref={ref}\n data-slot=\"popover-content\"\n align={align}\n sideOffset={sideOffset}\n className={cn(\n surfaceClasses,\n 'w-72 max-w-[calc(100vw-2rem)] max-h-(--radix-popover-content-available-height) overflow-y-auto origin-(--radix-popover-content-transform-origin) p-4 outline-none',\n className,\n )}\n {...props}\n />\n </PopoverPrimitive.Portal>\n );\n});\n\nexport { Popover, PopoverAnchor, PopoverContent, PopoverTrigger };\n"],"mappings":";;;;;;;;;;AASA,IAAa,iBACX;;;;;;;;AASF,IAAa,kBAAkB,uFAAuF,iBAAiB;;AAGvI,IAAa,mBACX;AAEF,SAAS,QAAQ,OAA2D;CAC1E,OAAO,oBAACA,MAAD;EAAuB,aAAU;EAAU,GAAI;CAAQ,CAAA;AAChE;AAEA,IAAM,iBAAiB,MAAM,WAG3B,SAAS,eAAe,OAAO,KAAK;CACpC,OAAO,oBAACC,SAAD;EAA+B;EAAK,aAAU;EAAkB,GAAI;CAAQ,CAAA;AACrF,CAAC;AAED,IAAM,gBAAgB,MAAM,WAG1B,SAAS,cAAc,OAAO,KAAK;CACnC,OAAO,oBAACC,QAAD;EAA8B;EAAK,aAAU;EAAiB,GAAI;CAAQ,CAAA;AACnF,CAAC;AAED,IAAM,iBAAiB,MAAM,WAG3B,SAAS,eAAe,EAAE,WAAW,QAAQ,UAAU,aAAa,GAAG,GAAG,SAAS,KAAK;CACxF,OACE,oBAACC,QAAD,EAAA,UACE,oBAACC,SAAD;EACO;EACL,aAAU;EACH;EACK;EACZ,WAAW,GACT,gBACA,qKACA,SACF;EACA,GAAI;CACL,CAAA,EACsB,CAAA;AAE7B,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Progress as ProgressPrimitive } from 'radix-ui';
|
|
2
1
|
import * as React from 'react';
|
|
3
|
-
|
|
2
|
+
import * as ProgressPrimitive from '../primitives/vendor/radix/react-progress';
|
|
3
|
+
declare const Progress: React.ForwardRefExoticComponent<Omit<ProgressPrimitive.ProgressProps & React.RefAttributes<HTMLDivElement>, "ref"> & React.RefAttributes<HTMLDivElement>>;
|
|
4
4
|
export { Progress };
|