@vritti/quantum-ui 0.3.8 → 0.3.11
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/dist/Avatar.js +5 -5
- package/dist/BarChart.js +1 -9
- package/dist/BarChart.js.map +1 -1
- package/dist/Breadcrumb.js +1 -1
- package/dist/Breadcrumb.js.map +1 -1
- package/dist/Button.js +14 -6
- package/dist/Button.js.map +1 -1
- package/dist/Checkbox2.js +5 -5
- package/dist/CheckboxGroup.js +64 -6
- package/dist/CheckboxGroup.js.map +1 -1
- package/dist/Collapsible.js +1 -1
- package/dist/Collapsible.js.map +1 -1
- package/dist/ConfirmHost.js +5 -17
- package/dist/ConfirmHost.js.map +1 -1
- package/dist/CurrencyField.js +1 -1
- package/dist/CurrencyFilter.js.map +1 -1
- package/dist/DateRangePicker.js +4 -2
- package/dist/DateRangePicker.js.map +1 -1
- package/dist/DateTimePicker.js +1 -1
- package/dist/DateTimeRangePicker.js +4 -2
- package/dist/DateTimeRangePicker.js.map +1 -1
- package/dist/DetailSectionSkeleton.js +14 -1
- package/dist/DetailSectionSkeleton.js.map +1 -1
- package/dist/Dialog.js +1 -1
- package/dist/Dialog.js.map +1 -1
- package/dist/ErrorBoundary.js +1 -108
- package/dist/ErrorBoundary.js.map +1 -1
- package/dist/FilePreview.js +1 -145
- package/dist/FilePreview.js.map +1 -1
- package/dist/HierarchyGraph.js +12 -8
- package/dist/HierarchyGraph.js.map +1 -1
- package/dist/IconSelect.js +31393 -0
- package/dist/IconSelect.js.map +1 -0
- package/dist/Kbd.js +11 -19
- package/dist/Kbd.js.map +1 -1
- package/dist/LocationSelector.js +13 -15
- package/dist/LocationSelector.js.map +1 -1
- package/dist/OTPField.js +1 -12
- package/dist/OTPField.js.map +1 -1
- package/dist/PageContent.js.map +1 -1
- package/dist/PageHeaderSkeleton.js +1 -1
- package/dist/PageHeaderSkeleton.js.map +1 -1
- package/dist/PermissionGate.js +31 -0
- package/dist/PermissionGate.js.map +1 -0
- package/dist/PieChart.js.map +1 -1
- package/dist/Progress.js +2 -2
- package/dist/QuantSelector.js.map +1 -1
- package/dist/RadialChart.js.map +1 -1
- package/dist/RadioGroup.js +7 -7
- package/dist/Select.js +32 -188
- package/dist/Select.js.map +1 -1
- package/dist/SerialSelector.js +13 -15
- package/dist/SerialSelector.js.map +1 -1
- package/dist/Sidebar.js +8 -19
- package/dist/Sidebar.js.map +1 -1
- package/dist/Sonner.js +2 -17
- package/dist/Sonner.js.map +1 -1
- package/dist/SupplierItemSelector.js.map +1 -1
- package/dist/Switch.js +7 -5
- package/dist/Switch.js.map +1 -1
- package/dist/TabsSkeleton.js +49 -23
- package/dist/TabsSkeleton.js.map +1 -1
- package/dist/ThemeToggle.js +1 -41
- package/dist/ThemeToggle.js.map +1 -1
- package/dist/Toggle.js +1 -1
- package/dist/Tooltip.js +19 -0
- package/dist/Tooltip.js.map +1 -0
- package/dist/UomSelector.js +6 -1
- package/dist/UomSelector.js.map +1 -1
- package/dist/UploadFile.js +1 -35
- package/dist/UploadFile.js.map +1 -1
- package/dist/ValueFilter.js.map +1 -1
- package/dist/ViewTabs.js +1 -16
- package/dist/ViewTabs.js.map +1 -1
- package/dist/assets/quantum-ui.css +109 -4
- package/dist/calendar2.js +2 -13
- package/dist/calendar2.js.map +1 -1
- package/dist/check-check.js +18 -0
- package/dist/check-check.js.map +1 -0
- package/dist/chevron-left.js +15 -0
- package/dist/chevron-left.js.map +1 -0
- package/dist/circle-question-mark.js +19 -0
- package/dist/circle-question-mark.js.map +1 -0
- package/dist/circle-x.js +19 -0
- package/dist/circle-x.js.map +1 -0
- package/dist/circle.js +15 -0
- package/dist/circle.js.map +1 -0
- package/dist/components/DataTable.js +1 -1
- package/dist/components/DetailField.js +1 -1
- package/dist/components/FormattedDate.js.map +1 -1
- package/dist/components/PermissionGate.js +2 -0
- package/dist/components/PermissionGate.js.map +1 -0
- package/dist/components/RichTextEditor.js +1 -1
- package/dist/components/ScanBarcodeButton.js +1 -20
- package/dist/components/ScanBarcodeButton.js.map +1 -1
- package/dist/components/Switch.js +1 -1
- package/dist/components/Tooltip.js +2 -0
- package/dist/components/Tooltip.js.map +1 -0
- package/dist/components/TreeView.js +4 -4
- package/dist/dot.js +15 -0
- package/dist/dot.js.map +1 -0
- package/dist/dropdown-menu.js +11 -22
- package/dist/dropdown-menu.js.map +1 -1
- package/dist/file.js +148 -0
- package/dist/file.js.map +1 -0
- package/dist/globe.js +19 -0
- package/dist/globe.js.map +1 -0
- package/dist/icons.js +21 -0
- package/dist/icons.js.map +1 -0
- package/dist/image-component.js +37 -96
- package/dist/image-component.js.map +1 -1
- package/dist/index.js +7 -4
- package/dist/index.js.map +1 -1
- package/dist/index12.js +7 -7
- package/dist/index13.js +7 -7
- package/dist/index14.js +11 -11
- package/dist/index15.js +1 -1
- package/dist/index16.js +1 -1
- package/dist/index17.js +168 -175
- package/dist/index17.js.map +1 -1
- package/dist/index18.js +173 -201
- package/dist/index18.js.map +1 -1
- package/dist/index19.js +203 -69
- package/dist/index19.js.map +1 -1
- package/dist/index20.js +70 -211
- package/dist/index20.js.map +1 -1
- package/dist/index21.js +206 -116
- package/dist/index21.js.map +1 -1
- package/dist/index22.js +122 -70
- package/dist/index22.js.map +1 -1
- package/dist/index23.js +74 -11
- package/dist/index23.js.map +1 -1
- package/dist/index24.js +13 -1134
- package/dist/index24.js.map +1 -1
- package/dist/index25.js +1120 -219
- package/dist/index25.js.map +1 -1
- package/dist/index26.js +202 -2506
- package/dist/index26.js.map +1 -1
- package/dist/index27.js +2527 -23
- package/dist/index27.js.map +1 -1
- package/dist/index28.js +32 -4
- package/dist/index28.js.map +1 -1
- package/dist/index29.js +3 -1124
- package/dist/index29.js.map +1 -1
- package/dist/index30.js +1123 -35
- package/dist/index30.js.map +1 -1
- package/dist/index31.js +36 -310
- package/dist/index31.js.map +1 -1
- package/dist/index32.js +309 -7
- package/dist/index32.js.map +1 -1
- package/dist/index33.js +8 -30
- package/dist/index33.js.map +1 -1
- package/dist/index34.js +29 -59
- package/dist/index34.js.map +1 -1
- package/dist/index35.js +59 -10
- package/dist/index35.js.map +1 -1
- package/dist/index36.js +10 -35
- package/dist/index36.js.map +1 -1
- package/dist/index37.js +27 -36809
- package/dist/index37.js.map +1 -1
- package/dist/index38.js +35362 -70
- package/dist/index38.js.map +1 -1
- package/dist/index39.js +72 -187
- package/dist/index39.js.map +1 -1
- package/dist/index4.js +5 -5
- package/dist/index40.js +199 -0
- package/dist/index40.js.map +1 -0
- package/dist/lib/components/BarChart/BarChart.d.ts.map +1 -1
- package/dist/lib/components/Button/Button.d.ts +1 -0
- package/dist/lib/components/Button/Button.d.ts.map +1 -1
- package/dist/lib/components/CheckboxGroup/CheckboxGroup.d.ts +1 -0
- package/dist/lib/components/CheckboxGroup/CheckboxGroup.d.ts.map +1 -1
- package/dist/lib/components/Collapsible/Collapsible.d.ts.map +1 -1
- package/dist/lib/components/ConfirmHost/ConfirmHost.d.ts +3 -0
- package/dist/lib/components/ConfirmHost/ConfirmHost.d.ts.map +1 -1
- package/dist/lib/components/DataTable/components/RowActions.d.ts +1 -0
- package/dist/lib/components/DataTable/components/RowActions.d.ts.map +1 -1
- package/dist/lib/components/DataTable/index.d.ts +2 -2
- package/dist/lib/components/DataTable/index.d.ts.map +1 -1
- package/dist/lib/components/DateRangePicker/DateRangePicker.d.ts.map +1 -1
- package/dist/lib/components/DateTimeRangePicker/DateTimeRangePicker.d.ts.map +1 -1
- package/dist/lib/components/DetailField/DetailHeader.d.ts +10 -0
- package/dist/lib/components/DetailField/DetailHeader.d.ts.map +1 -0
- package/dist/lib/components/DetailField/index.d.ts +1 -0
- package/dist/lib/components/DetailField/index.d.ts.map +1 -1
- package/dist/lib/components/Dialog/Dialog.d.ts.map +1 -1
- package/dist/lib/components/Editor/context/editor-config-context.d.ts +2 -2
- package/dist/lib/components/Editor/context/editor-config-context.d.ts.map +1 -1
- package/dist/lib/components/Editor/context/toolbar-context.d.ts +1 -1
- package/dist/lib/components/Editor/context/toolbar-context.d.ts.map +1 -1
- package/dist/lib/components/Editor/editor-hooks/use-debounce.d.ts.map +1 -1
- package/dist/lib/components/Editor/editor-hooks/use-modal.d.ts.map +1 -1
- package/dist/lib/components/Editor/editor-hooks/use-update-toolbar.d.ts.map +1 -1
- package/dist/lib/components/Editor/editor-ui/button-group.d.ts +3 -3
- package/dist/lib/components/Editor/editor-ui/button-group.d.ts.map +1 -1
- package/dist/lib/components/Editor/editor-ui/button.d.ts +2 -2
- package/dist/lib/components/Editor/editor-ui/button.d.ts.map +1 -1
- package/dist/lib/components/Editor/editor-ui/code-button.d.ts.map +1 -1
- package/dist/lib/components/Editor/editor-ui/color-picker.d.ts +8 -8
- package/dist/lib/components/Editor/editor-ui/color-picker.d.ts.map +1 -1
- package/dist/lib/components/Editor/editor-ui/command.d.ts +2 -2
- package/dist/lib/components/Editor/editor-ui/command.d.ts.map +1 -1
- package/dist/lib/components/Editor/editor-ui/content-editable.d.ts +1 -1
- package/dist/lib/components/Editor/editor-ui/content-editable.d.ts.map +1 -1
- package/dist/lib/components/Editor/editor-ui/dialog.d.ts +4 -4
- package/dist/lib/components/Editor/editor-ui/dialog.d.ts.map +1 -1
- package/dist/lib/components/Editor/editor-ui/image-component.d.ts +3 -3
- package/dist/lib/components/Editor/editor-ui/image-component.d.ts.map +1 -1
- package/dist/lib/components/Editor/editor-ui/image-resizer.d.ts +2 -2
- package/dist/lib/components/Editor/editor-ui/image-resizer.d.ts.map +1 -1
- package/dist/lib/components/Editor/editor-ui/input.d.ts +2 -2
- package/dist/lib/components/Editor/editor-ui/input.d.ts.map +1 -1
- package/dist/lib/components/Editor/editor-ui/label.d.ts +2 -2
- package/dist/lib/components/Editor/editor-ui/label.d.ts.map +1 -1
- package/dist/lib/components/Editor/editor-ui/popover.d.ts +2 -2
- package/dist/lib/components/Editor/editor-ui/popover.d.ts.map +1 -1
- package/dist/lib/components/Editor/editor-ui/scroll-area.d.ts +2 -2
- package/dist/lib/components/Editor/editor-ui/scroll-area.d.ts.map +1 -1
- package/dist/lib/components/Editor/editor-ui/select.d.ts +3 -3
- package/dist/lib/components/Editor/editor-ui/select.d.ts.map +1 -1
- package/dist/lib/components/Editor/editor-ui/separator.d.ts +2 -2
- package/dist/lib/components/Editor/editor-ui/separator.d.ts.map +1 -1
- package/dist/lib/components/Editor/editor-ui/tabs.d.ts +2 -2
- package/dist/lib/components/Editor/editor-ui/tabs.d.ts.map +1 -1
- package/dist/lib/components/Editor/editor-ui/toggle-group.d.ts +2 -2
- package/dist/lib/components/Editor/editor-ui/toggle-group.d.ts.map +1 -1
- package/dist/lib/components/Editor/editor-ui/toggle.d.ts +2 -2
- package/dist/lib/components/Editor/editor-ui/toggle.d.ts.map +1 -1
- package/dist/lib/components/Editor/editor-ui/tooltip.d.ts +2 -2
- package/dist/lib/components/Editor/editor-ui/tooltip.d.ts.map +1 -1
- package/dist/lib/components/Editor/index.d.ts.map +1 -1
- package/dist/lib/components/Editor/nodes/autocomplete-node.d.ts +2 -2
- package/dist/lib/components/Editor/nodes/autocomplete-node.d.ts.map +1 -1
- package/dist/lib/components/Editor/nodes/embeds/tweet-node.d.ts +2 -2
- package/dist/lib/components/Editor/nodes/embeds/tweet-node.d.ts.map +1 -1
- package/dist/lib/components/Editor/nodes/embeds/youtube-node.d.ts +1 -1
- package/dist/lib/components/Editor/nodes/embeds/youtube-node.d.ts.map +1 -1
- package/dist/lib/components/Editor/nodes/emoji-node.d.ts.map +1 -1
- package/dist/lib/components/Editor/nodes/image-node.d.ts +5 -5
- package/dist/lib/components/Editor/nodes/image-node.d.ts.map +1 -1
- package/dist/lib/components/Editor/nodes/keyword-node.d.ts.map +1 -1
- package/dist/lib/components/Editor/nodes/layout-container-node.d.ts.map +1 -1
- package/dist/lib/components/Editor/nodes/layout-item-node.d.ts.map +1 -1
- package/dist/lib/components/Editor/nodes/mention-node.d.ts +1 -1
- package/dist/lib/components/Editor/nodes/mention-node.d.ts.map +1 -1
- package/dist/lib/components/Editor/nodes/nodes.d.ts.map +1 -1
- package/dist/lib/components/Editor/nodes.d.ts.map +1 -1
- package/dist/lib/components/Editor/plugins/actions/character-limit-plugin.d.ts +2 -2
- package/dist/lib/components/Editor/plugins/actions/character-limit-plugin.d.ts.map +1 -1
- package/dist/lib/components/Editor/plugins/actions/clear-editor-plugin.d.ts.map +1 -1
- package/dist/lib/components/Editor/plugins/actions/counter-character-plugin.d.ts +2 -2
- package/dist/lib/components/Editor/plugins/actions/counter-character-plugin.d.ts.map +1 -1
- package/dist/lib/components/Editor/plugins/actions/edit-mode-toggle-plugin.d.ts.map +1 -1
- package/dist/lib/components/Editor/plugins/actions/import-export-plugin.d.ts.map +1 -1
- package/dist/lib/components/Editor/plugins/actions/markdown-toggle-plugin.d.ts.map +1 -1
- package/dist/lib/components/Editor/plugins/actions/max-length-plugin.d.ts.map +1 -1
- package/dist/lib/components/Editor/plugins/actions/share-content-plugin.d.ts.map +1 -1
- package/dist/lib/components/Editor/plugins/actions/speech-to-text-plugin.d.ts.map +1 -1
- package/dist/lib/components/Editor/plugins/actions/tree-view-plugin.d.ts.map +1 -1
- package/dist/lib/components/Editor/plugins/auto-link-plugin.d.ts.map +1 -1
- package/dist/lib/components/Editor/plugins/autocomplete-plugin.d.ts.map +1 -1
- package/dist/lib/components/Editor/plugins/code-action-menu-plugin.d.ts.map +1 -1
- package/dist/lib/components/Editor/plugins/code-highlight-plugin.d.ts.map +1 -1
- package/dist/lib/components/Editor/plugins/component-picker-menu-plugin.d.ts +1 -1
- package/dist/lib/components/Editor/plugins/component-picker-menu-plugin.d.ts.map +1 -1
- package/dist/lib/components/Editor/plugins/context-menu-plugin.d.ts.map +1 -1
- package/dist/lib/components/Editor/plugins/drag-drop-paste-plugin.d.ts.map +1 -1
- package/dist/lib/components/Editor/plugins/draggable-block-plugin.d.ts +1 -1
- package/dist/lib/components/Editor/plugins/draggable-block-plugin.d.ts.map +1 -1
- package/dist/lib/components/Editor/plugins/embeds/auto-embed-plugin.d.ts +1 -1
- package/dist/lib/components/Editor/plugins/embeds/auto-embed-plugin.d.ts.map +1 -1
- package/dist/lib/components/Editor/plugins/embeds/twitter-plugin.d.ts +1 -1
- package/dist/lib/components/Editor/plugins/embeds/twitter-plugin.d.ts.map +1 -1
- package/dist/lib/components/Editor/plugins/embeds/youtube-plugin.d.ts +1 -1
- package/dist/lib/components/Editor/plugins/embeds/youtube-plugin.d.ts.map +1 -1
- package/dist/lib/components/Editor/plugins/emoji-picker-plugin.d.ts.map +1 -1
- package/dist/lib/components/Editor/plugins/emojis-plugin.d.ts.map +1 -1
- package/dist/lib/components/Editor/plugins/floating-link-editor-plugin.d.ts.map +1 -1
- package/dist/lib/components/Editor/plugins/floating-text-format-plugin.d.ts.map +1 -1
- package/dist/lib/components/Editor/plugins/images-plugin.d.ts +4 -4
- package/dist/lib/components/Editor/plugins/images-plugin.d.ts.map +1 -1
- package/dist/lib/components/Editor/plugins/keywords-plugin.d.ts.map +1 -1
- package/dist/lib/components/Editor/plugins/layout-plugin.d.ts +1 -1
- package/dist/lib/components/Editor/plugins/layout-plugin.d.ts.map +1 -1
- package/dist/lib/components/Editor/plugins/link-plugin.d.ts.map +1 -1
- package/dist/lib/components/Editor/plugins/list-max-indent-level-plugin.d.ts +1 -1
- package/dist/lib/components/Editor/plugins/list-max-indent-level-plugin.d.ts.map +1 -1
- package/dist/lib/components/Editor/plugins/mentions-plugin.d.ts.map +1 -1
- package/dist/lib/components/Editor/plugins/picker/alignment-picker-plugin.d.ts +2 -2
- package/dist/lib/components/Editor/plugins/picker/alignment-picker-plugin.d.ts.map +1 -1
- package/dist/lib/components/Editor/plugins/picker/bulleted-list-picker-plugin.d.ts.map +1 -1
- package/dist/lib/components/Editor/plugins/picker/check-list-picker-plugin.d.ts.map +1 -1
- package/dist/lib/components/Editor/plugins/picker/code-picker-plugin.d.ts.map +1 -1
- package/dist/lib/components/Editor/plugins/picker/columns-layout-picker-plugin.d.ts.map +1 -1
- package/dist/lib/components/Editor/plugins/picker/component-picker-menu-plugin.d.ts.map +1 -1
- package/dist/lib/components/Editor/plugins/picker/component-picker-option.d.ts +1 -1
- package/dist/lib/components/Editor/plugins/picker/component-picker-option.d.ts.map +1 -1
- package/dist/lib/components/Editor/plugins/picker/divider-picker-plugin.d.ts.map +1 -1
- package/dist/lib/components/Editor/plugins/picker/embeds-picker-plugin.d.ts +2 -2
- package/dist/lib/components/Editor/plugins/picker/embeds-picker-plugin.d.ts.map +1 -1
- package/dist/lib/components/Editor/plugins/picker/heading-picker-plugin.d.ts.map +1 -1
- package/dist/lib/components/Editor/plugins/picker/image-picker-plugin.d.ts.map +1 -1
- package/dist/lib/components/Editor/plugins/picker/numbered-list-picker-plugin.d.ts.map +1 -1
- package/dist/lib/components/Editor/plugins/picker/paragraph-picker-plugin.d.ts.map +1 -1
- package/dist/lib/components/Editor/plugins/picker/quote-picker-plugin.d.ts.map +1 -1
- package/dist/lib/components/Editor/plugins/picker/table-picker-plugin.d.ts +1 -1
- package/dist/lib/components/Editor/plugins/picker/table-picker-plugin.d.ts.map +1 -1
- package/dist/lib/components/Editor/plugins/plugins.d.ts +1 -1
- package/dist/lib/components/Editor/plugins/plugins.d.ts.map +1 -1
- package/dist/lib/components/Editor/plugins/tab-focus-plugin.d.ts.map +1 -1
- package/dist/lib/components/Editor/plugins/table-plugin.d.ts +2 -3
- package/dist/lib/components/Editor/plugins/table-plugin.d.ts.map +1 -1
- package/dist/lib/components/Editor/plugins/toolbar/block-format/block-format-data.d.ts.map +1 -1
- package/dist/lib/components/Editor/plugins/toolbar/block-format/format-heading.d.ts.map +1 -1
- package/dist/lib/components/Editor/plugins/toolbar/block-format-toolbar-plugin.d.ts +1 -1
- package/dist/lib/components/Editor/plugins/toolbar/block-format-toolbar-plugin.d.ts.map +1 -1
- package/dist/lib/components/Editor/plugins/toolbar/block-insert/insert-horizontal-rule.d.ts.map +1 -1
- package/dist/lib/components/Editor/plugins/toolbar/block-insert/insert-image.d.ts.map +1 -1
- package/dist/lib/components/Editor/plugins/toolbar/block-insert/insert-table.d.ts.map +1 -1
- package/dist/lib/components/Editor/plugins/toolbar/block-insert-plugin.d.ts.map +1 -1
- package/dist/lib/components/Editor/plugins/toolbar/clear-formatting-toolbar-plugin.d.ts.map +1 -1
- package/dist/lib/components/Editor/plugins/toolbar/code-language-toolbar-plugin.d.ts.map +1 -1
- package/dist/lib/components/Editor/plugins/toolbar/element-format-toolbar-plugin.d.ts +1 -1
- package/dist/lib/components/Editor/plugins/toolbar/element-format-toolbar-plugin.d.ts.map +1 -1
- package/dist/lib/components/Editor/plugins/toolbar/font-background-toolbar-plugin.d.ts.map +1 -1
- package/dist/lib/components/Editor/plugins/toolbar/font-color-toolbar-plugin.d.ts.map +1 -1
- package/dist/lib/components/Editor/plugins/toolbar/font-family-toolbar-plugin.d.ts.map +1 -1
- package/dist/lib/components/Editor/plugins/toolbar/font-format-toolbar-plugin.d.ts.map +1 -1
- package/dist/lib/components/Editor/plugins/toolbar/font-size-toolbar-plugin.d.ts.map +1 -1
- package/dist/lib/components/Editor/plugins/toolbar/history-toolbar-plugin.d.ts.map +1 -1
- package/dist/lib/components/Editor/plugins/toolbar/horizontal-rule-toolbar-plugin.d.ts.map +1 -1
- package/dist/lib/components/Editor/plugins/toolbar/image-toolbar-plugin.d.ts.map +1 -1
- package/dist/lib/components/Editor/plugins/toolbar/link-toolbar-plugin.d.ts +1 -1
- package/dist/lib/components/Editor/plugins/toolbar/link-toolbar-plugin.d.ts.map +1 -1
- package/dist/lib/components/Editor/plugins/toolbar/subsuper-toolbar-plugin.d.ts.map +1 -1
- package/dist/lib/components/Editor/plugins/toolbar/table-toolbar-plugin.d.ts.map +1 -1
- package/dist/lib/components/Editor/plugins/toolbar/toolbar-plugin.d.ts +1 -1
- package/dist/lib/components/Editor/plugins/toolbar/toolbar-plugin.d.ts.map +1 -1
- package/dist/lib/components/Editor/plugins/typing-pref-plugin.d.ts.map +1 -1
- package/dist/lib/components/Editor/plugins.d.ts.map +1 -1
- package/dist/lib/components/Editor/shared/can-use-dom.d.ts.map +1 -1
- package/dist/lib/components/Editor/shared/caret-from-point.d.ts.map +1 -1
- package/dist/lib/components/Editor/shared/environment.d.ts.map +1 -1
- package/dist/lib/components/Editor/shared/invariant.d.ts +1 -1
- package/dist/lib/components/Editor/shared/invariant.d.ts.map +1 -1
- package/dist/lib/components/Editor/shared/react-test-utils.d.ts +1 -1
- package/dist/lib/components/Editor/shared/react-test-utils.d.ts.map +1 -1
- package/dist/lib/components/Editor/shared/simple-diff-with-cursor.d.ts.map +1 -1
- package/dist/lib/components/Editor/shared/use-layout-effect.d.ts.map +1 -1
- package/dist/lib/components/Editor/themes/editor-theme.d.ts.map +1 -1
- package/dist/lib/components/Editor/transformers/index.d.ts +6 -6
- package/dist/lib/components/Editor/transformers/index.d.ts.map +1 -1
- package/dist/lib/components/Editor/transformers/markdown-emoji-transformer.d.ts.map +1 -1
- package/dist/lib/components/Editor/transformers/markdown-hr-transformer.d.ts.map +1 -1
- package/dist/lib/components/Editor/transformers/markdown-image-transformer.d.ts.map +1 -1
- package/dist/lib/components/Editor/transformers/markdown-table-transformer.d.ts.map +1 -1
- package/dist/lib/components/Editor/transformers/markdown-tweet-transformer.d.ts.map +1 -1
- package/dist/lib/components/Editor/types.d.ts.map +1 -1
- package/dist/lib/components/Editor/utils/can-use-dom.d.ts.map +1 -1
- package/dist/lib/components/Editor/utils/doc-serialization.d.ts.map +1 -1
- package/dist/lib/components/Editor/utils/emoji-list.d.ts.map +1 -1
- package/dist/lib/components/Editor/utils/get-dom-range-rect.d.ts.map +1 -1
- package/dist/lib/components/Editor/utils/get-selected-node.d.ts.map +1 -1
- package/dist/lib/components/Editor/utils/set-floating-elem-position.d.ts.map +1 -1
- package/dist/lib/components/Editor/utils/swipe.d.ts.map +1 -1
- package/dist/lib/components/Editor/utils/url.d.ts.map +1 -1
- package/dist/lib/components/FormattedDate/FormattedDate.d.ts.map +1 -1
- package/dist/lib/components/FormattedDate/index.d.ts +1 -1
- package/dist/lib/components/FormattedDate/index.d.ts.map +1 -1
- package/dist/lib/components/HierarchyGraph/HierarchyGraph.d.ts.map +1 -1
- package/dist/lib/components/Kbd/Kbd.d.ts.map +1 -1
- package/dist/lib/components/Kbd/index.d.ts +1 -1
- package/dist/lib/components/Kbd/index.d.ts.map +1 -1
- package/dist/lib/components/PageContent/PageContent.d.ts.map +1 -1
- package/dist/lib/components/PermissionGate/PermissionGate.d.ts +18 -0
- package/dist/lib/components/PermissionGate/PermissionGate.d.ts.map +1 -0
- package/dist/lib/components/PermissionGate/index.d.ts +2 -0
- package/dist/lib/components/PermissionGate/index.d.ts.map +1 -0
- package/dist/lib/components/PieChart/PieChart.d.ts.map +1 -1
- package/dist/lib/components/RadialChart/RadialChart.d.ts.map +1 -1
- package/dist/lib/components/Select/Select.d.ts.map +1 -1
- package/dist/lib/components/Select/components/MultiSelect/MultiSelect.d.ts.map +1 -1
- package/dist/lib/components/Select/hooks/useSelect.d.ts +2 -1
- package/dist/lib/components/Select/hooks/useSelect.d.ts.map +1 -1
- package/dist/lib/components/Sidebar/Sidebar.d.ts +2 -0
- package/dist/lib/components/Sidebar/Sidebar.d.ts.map +1 -1
- package/dist/lib/components/Switch/Switch.d.ts +2 -0
- package/dist/lib/components/Switch/Switch.d.ts.map +1 -1
- package/dist/lib/components/Switch/index.d.ts +2 -2
- package/dist/lib/components/Switch/index.d.ts.map +1 -1
- package/dist/lib/components/Tabs/Tabs.d.ts +2 -1
- package/dist/lib/components/Tabs/Tabs.d.ts.map +1 -1
- package/dist/lib/components/Tooltip/Tooltip.d.ts +12 -0
- package/dist/lib/components/Tooltip/Tooltip.d.ts.map +1 -0
- package/dist/lib/components/Tooltip/index.d.ts +3 -0
- package/dist/lib/components/Tooltip/index.d.ts.map +1 -0
- package/dist/lib/components/ValueFilter/ValueFilter.d.ts.map +1 -1
- package/dist/lib/components/index.d.ts +5 -3
- package/dist/lib/components/index.d.ts.map +1 -1
- package/dist/lib/hooks/useFormatters.d.ts.map +1 -1
- package/dist/lib/icons/icon-names.json.d.ts +13731 -0
- package/dist/lib/icons/index.d.ts +4 -0
- package/dist/lib/icons/index.d.ts.map +1 -0
- package/dist/lib/selects/currency/CurrencyFilter.d.ts.map +1 -1
- package/dist/lib/selects/icon/IconSelect.d.ts +20 -0
- package/dist/lib/selects/icon/IconSelect.d.ts.map +1 -0
- package/dist/lib/selects/icon/index.d.ts +2 -0
- package/dist/lib/selects/icon/index.d.ts.map +1 -0
- package/dist/lib/selects/index.d.ts +3 -2
- package/dist/lib/selects/index.d.ts.map +1 -1
- package/dist/lib/selects/location/LocationSelector.d.ts.map +1 -1
- package/dist/lib/selects/location/index.d.ts +1 -1
- package/dist/lib/selects/location/index.d.ts.map +1 -1
- package/dist/lib/selects/purchase-order-item/PurchaseOrderItemSelector.d.ts.map +1 -1
- package/dist/lib/selects/quant/QuantSelector.d.ts.map +1 -1
- package/dist/lib/selects/serial/SerialSelector.d.ts.map +1 -1
- package/dist/lib/selects/supplier-item/SupplierItemSelector.d.ts.map +1 -1
- package/dist/lib/selects/uom/UomSelector.d.ts.map +1 -1
- package/dist/lib/utils/format.d.ts.map +1 -1
- package/dist/lib/utils/hotkeys.d.ts +1 -1
- package/dist/lib/utils/hotkeys.d.ts.map +1 -1
- package/dist/lib/utils/zod.d.ts.map +1 -1
- package/dist/lock-keyhole.js +19 -0
- package/dist/lock-keyhole.js.map +1 -0
- package/dist/panel-left.js +18 -0
- package/dist/panel-left.js.map +1 -0
- package/dist/scan-barcode.js +23 -0
- package/dist/scan-barcode.js.map +1 -0
- package/dist/selects/icon.js +2 -0
- package/dist/selects/icon.js.map +1 -0
- package/dist/selects/purchase-order-item.js.map +1 -1
- package/dist/shadcn/shadcnMultiSelect/multi-select.d.ts.map +1 -1
- package/dist/sun.js +44 -0
- package/dist/sun.js.map +1 -0
- package/dist/table-properties.js +351 -0
- package/dist/table-properties.js.map +1 -0
- package/dist/{tooltip.js → tooltip2.js} +1 -1
- package/dist/tooltip2.js.map +1 -0
- package/dist/{cells.js → useDataTable.js} +45 -381
- package/dist/useDataTable.js.map +1 -0
- package/dist/useFormatters.js.map +1 -1
- package/dist/user.js +38 -0
- package/dist/user.js.map +1 -0
- package/dist/utils/format.js +1 -0
- package/dist/utils/format.js.map +1 -1
- package/dist/utils/motion.js +2 -2
- package/dist/utils/zod.js.map +1 -1
- package/dist/value.js +1 -1
- package/dist/wifi-off.js +111 -0
- package/dist/wifi-off.js.map +1 -0
- package/dist/youtube.js +737 -0
- package/dist/youtube.js.map +1 -0
- package/package.json +19 -1
- package/dist/cells.js.map +0 -1
- package/dist/tooltip.js.map +0 -1
package/dist/TabsSkeleton.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
|
-
import { C as Content, L as List, T as Trigger, R as Root2 } from './
|
|
3
|
-
import {
|
|
2
|
+
import { C as Content, L as List, T as Trigger, R as Root2 } from './index18.js';
|
|
3
|
+
import { useState, useId } from 'react';
|
|
4
|
+
import { useParams, useNavigate, useLocation } from 'react-router-dom';
|
|
4
5
|
import { c as cn } from './utils.js';
|
|
5
|
-
import { L as LayoutGroup } from './
|
|
6
|
+
import { L as LayoutGroup } from './index39.js';
|
|
6
7
|
import { m as motion, A as AnimatePresence } from './proxy.js';
|
|
7
8
|
import { S as Skeleton } from './Skeleton.js';
|
|
8
9
|
|
|
@@ -56,27 +57,57 @@ function TabsContent$1({ className, ...props }) {
|
|
|
56
57
|
return /* @__PURE__ */ jsx(Content, { "data-slot": "tabs-content", className: cn("flex-1 outline-none", className), ...props });
|
|
57
58
|
}
|
|
58
59
|
|
|
59
|
-
function Tabs({
|
|
60
|
+
function Tabs(props) {
|
|
61
|
+
if (props.routeParam) return /* @__PURE__ */ jsx(RoutedTabs, { ...props, routeParam: props.routeParam });
|
|
62
|
+
return /* @__PURE__ */ jsx(StatefulTabs, { ...props });
|
|
63
|
+
}
|
|
64
|
+
Tabs.displayName = "Tabs";
|
|
65
|
+
function StatefulTabs({ routeParam: _routeParam, defaultValue, value, onValueChange, tabs, ...rest }) {
|
|
66
|
+
const [activeTab, setActiveTab] = useState(value ?? defaultValue ?? tabs[0]?.value);
|
|
67
|
+
function handleValueChange(newValue) {
|
|
68
|
+
setActiveTab(newValue);
|
|
69
|
+
onValueChange?.(newValue);
|
|
70
|
+
}
|
|
71
|
+
return /* @__PURE__ */ jsx(TabsView, { value: value ?? activeTab, onValueChange: handleValueChange, tabs, ...rest });
|
|
72
|
+
}
|
|
73
|
+
function RoutedTabs({ routeParam, defaultValue, onValueChange, tabs, ...rest }) {
|
|
74
|
+
const params = useParams();
|
|
75
|
+
const navigate = useNavigate();
|
|
76
|
+
const { pathname } = useLocation();
|
|
77
|
+
const fallback = defaultValue ?? tabs[0]?.value ?? "";
|
|
78
|
+
const current = params[routeParam] ?? fallback;
|
|
79
|
+
function handleValueChange(newValue) {
|
|
80
|
+
const existing = params[routeParam];
|
|
81
|
+
if (existing) {
|
|
82
|
+
const segments = pathname.split("/");
|
|
83
|
+
const index = segments.lastIndexOf(existing);
|
|
84
|
+
if (index >= 0) {
|
|
85
|
+
segments[index] = newValue;
|
|
86
|
+
navigate(segments.join("/"));
|
|
87
|
+
} else {
|
|
88
|
+
navigate(`${pathname.replace(/\/+$/, "")}/${newValue}`);
|
|
89
|
+
}
|
|
90
|
+
} else {
|
|
91
|
+
navigate(`${pathname.replace(/\/+$/, "")}/${newValue}`);
|
|
92
|
+
}
|
|
93
|
+
onValueChange?.(newValue);
|
|
94
|
+
}
|
|
95
|
+
return /* @__PURE__ */ jsx(TabsView, { value: current, onValueChange: handleValueChange, tabs, ...rest });
|
|
96
|
+
}
|
|
97
|
+
function TabsView({
|
|
98
|
+
value,
|
|
99
|
+
onValueChange,
|
|
60
100
|
tabs,
|
|
61
101
|
listClassName,
|
|
62
102
|
contentClassName,
|
|
63
103
|
disabled,
|
|
64
104
|
mountStrategy = "active",
|
|
65
105
|
animated = true,
|
|
66
|
-
defaultValue,
|
|
67
|
-
value,
|
|
68
|
-
onValueChange,
|
|
69
106
|
...props
|
|
70
107
|
}) {
|
|
71
108
|
const layoutId = useId();
|
|
72
|
-
const [activeTab, setActiveTab] = useState(value ?? defaultValue ?? tabs[0]?.value);
|
|
73
|
-
function handleValueChange(newValue) {
|
|
74
|
-
setActiveTab(newValue);
|
|
75
|
-
onValueChange?.(newValue);
|
|
76
|
-
}
|
|
77
|
-
const controlledValue = value ?? activeTab;
|
|
78
109
|
if (!animated) {
|
|
79
|
-
return /* @__PURE__ */ jsxs(Tabs$1, { value
|
|
110
|
+
return /* @__PURE__ */ jsxs(Tabs$1, { value, onValueChange, ...props, children: [
|
|
80
111
|
/* @__PURE__ */ jsx(TabsList$1, { className: listClassName, children: tabs.map((tab) => /* @__PURE__ */ jsx(
|
|
81
112
|
TabsTrigger$1,
|
|
82
113
|
{
|
|
@@ -99,8 +130,8 @@ function Tabs({
|
|
|
99
130
|
))
|
|
100
131
|
] });
|
|
101
132
|
}
|
|
102
|
-
const activeTabItem = tabs.find((t) => t.value ===
|
|
103
|
-
return /* @__PURE__ */ jsxs(Tabs$1, { value
|
|
133
|
+
const activeTabItem = tabs.find((t) => t.value === value);
|
|
134
|
+
return /* @__PURE__ */ jsxs(Tabs$1, { value, onValueChange, ...props, children: [
|
|
104
135
|
/* @__PURE__ */ jsx(LayoutGroup, { id: layoutId, children: /* @__PURE__ */ jsx(TabsList$1, { className: listClassName, children: tabs.map((tab) => /* @__PURE__ */ jsxs(
|
|
105
136
|
Trigger,
|
|
106
137
|
{
|
|
@@ -119,16 +150,12 @@ function Tabs({
|
|
|
119
150
|
tab.className
|
|
120
151
|
),
|
|
121
152
|
children: [
|
|
122
|
-
|
|
153
|
+
value === tab.value && /* @__PURE__ */ jsx(
|
|
123
154
|
motion.span,
|
|
124
155
|
{
|
|
125
156
|
layoutId: "tab-pill",
|
|
126
157
|
className: "absolute inset-0 rounded-md bg-background shadow-sm",
|
|
127
|
-
transition: {
|
|
128
|
-
type: "spring",
|
|
129
|
-
visualDuration: 0.3,
|
|
130
|
-
bounce: 0.05
|
|
131
|
-
}
|
|
158
|
+
transition: { type: "spring", visualDuration: 0.3, bounce: 0.05 }
|
|
132
159
|
}
|
|
133
160
|
),
|
|
134
161
|
/* @__PURE__ */ jsx("span", { className: "relative z-10", children: tab.label })
|
|
@@ -150,7 +177,6 @@ function Tabs({
|
|
|
150
177
|
) })
|
|
151
178
|
] });
|
|
152
179
|
}
|
|
153
|
-
Tabs.displayName = "Tabs";
|
|
154
180
|
const TabsList = TabsList$1;
|
|
155
181
|
const TabsContent = TabsContent$1;
|
|
156
182
|
const TabsTrigger = TabsTrigger$1;
|
package/dist/TabsSkeleton.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TabsSkeleton.js","sources":["../shadcn/shadcnTabs/tabs.tsx","../lib/components/Tabs/Tabs.tsx","../lib/components/Tabs/TabsSkeleton.tsx"],"sourcesContent":["import * as TabsPrimitive from '@radix-ui/react-tabs';\nimport type * as React from 'react';\nimport { cn } from '../utils';\n\n// Tabs root component wrapping Radix Tabs primitive\nfunction Tabs({ className, ...props }: React.ComponentPropsWithoutRef<typeof TabsPrimitive.Root>) {\n return <TabsPrimitive.Root data-slot=\"tabs\" className={cn('flex flex-col gap-2', className)} {...props} />;\n}\n\n// Container for tab trigger buttons\nfunction TabsList({ className, ...props }: React.ComponentPropsWithoutRef<typeof TabsPrimitive.List>) {\n return (\n <TabsPrimitive.List\n data-slot=\"tabs-list\"\n className={cn(\n 'bg-muted text-muted-foreground inline-flex h-9 w-fit items-center justify-center rounded-lg p-[3px]',\n className,\n )}\n {...props}\n />\n );\n}\n\n// Individual tab trigger button\nfunction TabsTrigger({ className, ...props }: React.ComponentPropsWithoutRef<typeof TabsPrimitive.Trigger>) {\n return (\n <TabsPrimitive.Trigger\n data-slot=\"tabs-trigger\"\n className={cn(\n // layout\n 'inline-flex items-center justify-center gap-1.5',\n // sizing & spacing\n 'rounded-md border border-transparent px-3 py-1',\n // typography\n 'text-sm font-medium whitespace-nowrap',\n // colors\n 'text-muted-foreground dark:text-muted-foreground',\n // active state\n 'data-[state=active]:bg-background data-[state=active]:text-foreground dark:data-[state=active]:text-foreground data-[state=active]:shadow-sm',\n // transitions\n 'transition-all',\n // focus\n 'focus-visible:outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50',\n // disabled\n 'disabled:pointer-events-none disabled:opacity-50',\n // svg children\n \"[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n {...props}\n />\n );\n}\n\n// Tab panel content shown when its trigger is active\nfunction TabsContent({ className, ...props }: React.ComponentPropsWithoutRef<typeof TabsPrimitive.Content>) {\n return <TabsPrimitive.Content data-slot=\"tabs-content\" className={cn('flex-1 outline-none', className)} {...props} />;\n}\n\nexport { Tabs, TabsList, TabsTrigger, TabsContent };\n","import * as TabsPrimitive from '@radix-ui/react-tabs';\nimport { AnimatePresence, LayoutGroup, motion } from 'motion/react';\nimport type React from 'react';\nimport { useId, useState } from 'react';\nimport {\n Tabs as ShadcnTabs,\n TabsContent as ShadcnTabsContent,\n TabsList as ShadcnTabsList,\n TabsTrigger as ShadcnTabsTrigger,\n} from '../../../shadcn/shadcnTabs';\nimport { cn } from '../../../shadcn/utils';\n\nexport interface TabItem {\n value: string;\n label: React.ReactNode;\n content: React.ReactNode;\n disabled?: boolean;\n className?: string;\n contentClassName?: string;\n}\n\nexport interface TabsProps extends React.ComponentPropsWithoutRef<typeof TabsPrimitive.Root> {\n tabs: TabItem[];\n listClassName?: string;\n contentClassName?: string;\n disabled?: boolean;\n mountStrategy?: 'active' | 'all';\n animated?: boolean;\n}\n\n// Tabs root — renders list and content panels from the tabs array\nexport function Tabs({\n tabs,\n listClassName,\n contentClassName,\n disabled,\n mountStrategy = 'active',\n animated = true,\n defaultValue,\n value,\n onValueChange,\n ...props\n}: TabsProps) {\n const layoutId = useId();\n const [activeTab, setActiveTab] = useState(value ?? defaultValue ?? tabs[0]?.value);\n\n function handleValueChange(newValue: string) {\n setActiveTab(newValue);\n onValueChange?.(newValue);\n }\n\n const controlledValue = value ?? activeTab;\n\n if (!animated) {\n return (\n <ShadcnTabs value={controlledValue} onValueChange={handleValueChange} {...props}>\n <ShadcnTabsList className={listClassName}>\n {tabs.map((tab) => (\n <ShadcnTabsTrigger\n key={tab.value}\n value={tab.value}\n disabled={disabled || tab.disabled}\n className={tab.className}\n >\n {tab.label}\n </ShadcnTabsTrigger>\n ))}\n </ShadcnTabsList>\n {tabs.map((tab) => (\n <ShadcnTabsContent\n key={tab.value}\n value={tab.value}\n forceMount={mountStrategy === 'all' ? true : undefined}\n className={cn(contentClassName, tab.contentClassName)}\n >\n {tab.content}\n </ShadcnTabsContent>\n ))}\n </ShadcnTabs>\n );\n }\n\n const activeTabItem = tabs.find((t) => t.value === controlledValue);\n\n return (\n <ShadcnTabs value={controlledValue} onValueChange={handleValueChange} {...props}>\n <LayoutGroup id={layoutId}>\n <ShadcnTabsList className={listClassName}>\n {tabs.map((tab) => (\n <TabsPrimitive.Trigger\n key={tab.value}\n value={tab.value}\n disabled={disabled || tab.disabled}\n className={cn(\n 'relative inline-flex items-center justify-center gap-1.5',\n 'rounded-md px-3 py-1',\n 'text-sm font-medium whitespace-nowrap',\n 'text-muted-foreground',\n 'data-[state=active]:text-foreground',\n 'transition-colors duration-150',\n 'focus-visible:outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50',\n 'disabled:pointer-events-none disabled:opacity-50',\n \"[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n tab.className,\n )}\n >\n {controlledValue === tab.value && (\n <motion.span\n layoutId=\"tab-pill\"\n className=\"absolute inset-0 rounded-md bg-background shadow-sm\"\n transition={{\n type: 'spring',\n visualDuration: 0.3,\n bounce: 0.05,\n }}\n />\n )}\n <span className=\"relative z-10\">{tab.label}</span>\n </TabsPrimitive.Trigger>\n ))}\n </ShadcnTabsList>\n </LayoutGroup>\n <AnimatePresence mode=\"wait\" initial={false}>\n {activeTabItem && (\n <motion.div\n key={activeTabItem.value}\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.15, ease: 'easeOut' }}\n className={cn('flex-1 outline-none', contentClassName, activeTabItem.contentClassName)}\n >\n {activeTabItem.content}\n </motion.div>\n )}\n </AnimatePresence>\n </ShadcnTabs>\n );\n}\n\nTabs.displayName = 'Tabs';\n\nexport const TabsList = ShadcnTabsList;\nexport const TabsContent = ShadcnTabsContent;\nexport const TabsTrigger = ShadcnTabsTrigger;\n","import type * as React from 'react';\nimport { cn } from '../../../shadcn/utils';\nimport { Skeleton } from '../Skeleton';\n\nconst DEFAULT_TAB_WIDTHS = ['w-20', 'w-14', 'w-16', 'w-24', 'w-18'];\n\nexport interface TabsSkeletonProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Number of tab triggers to render */\n count?: number;\n /** Height of the content area below the tabs */\n contentHeight?: string;\n /** Custom widths for each tab trigger (Tailwind width classes) */\n tabWidths?: string[];\n}\n\nexport const TabsSkeleton = ({\n count = 3,\n contentHeight = '500px',\n tabWidths,\n className,\n ...props\n}: TabsSkeletonProps) => {\n const widths = tabWidths ?? DEFAULT_TAB_WIDTHS;\n\n return (\n <div className={cn('flex flex-col gap-2', className)} {...props}>\n <div className=\"inline-flex h-9 w-fit items-center gap-0.5 rounded-lg bg-muted p-[3px]\">\n {Array.from({ length: count }, (_, i) => (\n <Skeleton\n // biome-ignore lint/suspicious/noArrayIndexKey: <static list of skeletons, not dynamic>\n key={i}\n className={cn('h-7 rounded-md', widths[i % widths.length], i === 0 && 'bg-background')}\n />\n ))}\n </div>\n <Skeleton className=\"w-full rounded-lg\" style={{ height: contentHeight }} />\n </div>\n );\n};\n\nTabsSkeleton.displayName = 'TabsSkeleton';\n"],"names":["Tabs","TabsPrimitive.Root","TabsList","TabsPrimitive.List","TabsTrigger","TabsPrimitive.Trigger","TabsContent","TabsPrimitive.Content","ShadcnTabs","ShadcnTabsList","ShadcnTabsTrigger","ShadcnTabsContent"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"TabsSkeleton.js","sources":["../shadcn/shadcnTabs/tabs.tsx","../lib/components/Tabs/Tabs.tsx","../lib/components/Tabs/TabsSkeleton.tsx"],"sourcesContent":["import * as TabsPrimitive from '@radix-ui/react-tabs';\nimport type * as React from 'react';\nimport { cn } from '../utils';\n\n// Tabs root component wrapping Radix Tabs primitive\nfunction Tabs({ className, ...props }: React.ComponentPropsWithoutRef<typeof TabsPrimitive.Root>) {\n return <TabsPrimitive.Root data-slot=\"tabs\" className={cn('flex flex-col gap-2', className)} {...props} />;\n}\n\n// Container for tab trigger buttons\nfunction TabsList({ className, ...props }: React.ComponentPropsWithoutRef<typeof TabsPrimitive.List>) {\n return (\n <TabsPrimitive.List\n data-slot=\"tabs-list\"\n className={cn(\n 'bg-muted text-muted-foreground inline-flex h-9 w-fit items-center justify-center rounded-lg p-[3px]',\n className,\n )}\n {...props}\n />\n );\n}\n\n// Individual tab trigger button\nfunction TabsTrigger({ className, ...props }: React.ComponentPropsWithoutRef<typeof TabsPrimitive.Trigger>) {\n return (\n <TabsPrimitive.Trigger\n data-slot=\"tabs-trigger\"\n className={cn(\n // layout\n 'inline-flex items-center justify-center gap-1.5',\n // sizing & spacing\n 'rounded-md border border-transparent px-3 py-1',\n // typography\n 'text-sm font-medium whitespace-nowrap',\n // colors\n 'text-muted-foreground dark:text-muted-foreground',\n // active state\n 'data-[state=active]:bg-background data-[state=active]:text-foreground dark:data-[state=active]:text-foreground data-[state=active]:shadow-sm',\n // transitions\n 'transition-all',\n // focus\n 'focus-visible:outline-none focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50',\n // disabled\n 'disabled:pointer-events-none disabled:opacity-50',\n // svg children\n \"[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n {...props}\n />\n );\n}\n\n// Tab panel content shown when its trigger is active\nfunction TabsContent({ className, ...props }: React.ComponentPropsWithoutRef<typeof TabsPrimitive.Content>) {\n return <TabsPrimitive.Content data-slot=\"tabs-content\" className={cn('flex-1 outline-none', className)} {...props} />;\n}\n\nexport { Tabs, TabsList, TabsTrigger, TabsContent };\n","import * as TabsPrimitive from '@radix-ui/react-tabs';\nimport { AnimatePresence, LayoutGroup, motion } from 'motion/react';\nimport type React from 'react';\nimport { useId, useState } from 'react';\nimport { useLocation, useNavigate, useParams } from 'react-router-dom';\nimport {\n Tabs as ShadcnTabs,\n TabsContent as ShadcnTabsContent,\n TabsList as ShadcnTabsList,\n TabsTrigger as ShadcnTabsTrigger,\n} from '../../../shadcn/shadcnTabs';\nimport { cn } from '../../../shadcn/utils';\n\nexport interface TabItem {\n value: string;\n label: React.ReactNode;\n content: React.ReactNode;\n disabled?: boolean;\n className?: string;\n contentClassName?: string;\n}\n\nexport interface TabsProps extends React.ComponentPropsWithoutRef<typeof TabsPrimitive.Root> {\n tabs: TabItem[];\n listClassName?: string;\n contentClassName?: string;\n disabled?: boolean;\n mountStrategy?: 'active' | 'all';\n animated?: boolean;\n // When set, the active tab is bound to this URL path param (e.g. \"versionTab\").\n // The route must include that segment; switching tabs navigates to update it,\n // so the selection is deep-linkable and survives refresh.\n routeParam?: string;\n}\n\ninterface TabsViewProps extends Omit<TabsProps, 'routeParam' | 'defaultValue' | 'value' | 'onValueChange'> {\n value: string;\n onValueChange: (value: string) => void;\n}\n\n// Tabs root — URL-path-bound when routeParam is set, otherwise internal/controlled state\nexport function Tabs(props: TabsProps) {\n if (props.routeParam) return <RoutedTabs {...props} routeParam={props.routeParam} />;\n return <StatefulTabs {...props} />;\n}\n\nTabs.displayName = 'Tabs';\n\n// Internal-state mode — preserves the original uncontrolled/`value`-controlled behavior\nfunction StatefulTabs({ routeParam: _routeParam, defaultValue, value, onValueChange, tabs, ...rest }: TabsProps) {\n const [activeTab, setActiveTab] = useState(value ?? defaultValue ?? tabs[0]?.value);\n\n function handleValueChange(newValue: string) {\n setActiveTab(newValue);\n onValueChange?.(newValue);\n }\n\n return <TabsView value={(value ?? activeTab) as string} onValueChange={handleValueChange} tabs={tabs} {...rest} />;\n}\n\n// URL-path mode — the active tab is read from / written to a route path param\nfunction RoutedTabs({ routeParam, defaultValue, onValueChange, tabs, ...rest }: TabsProps & { routeParam: string }) {\n const params = useParams();\n const navigate = useNavigate();\n const { pathname } = useLocation();\n\n const fallback = (defaultValue as string) ?? tabs[0]?.value ?? '';\n const current = params[routeParam] ?? fallback;\n\n function handleValueChange(newValue: string) {\n const existing = params[routeParam];\n if (existing) {\n const segments = pathname.split('/');\n const index = segments.lastIndexOf(existing);\n if (index >= 0) {\n segments[index] = newValue;\n navigate(segments.join('/'));\n } else {\n navigate(`${pathname.replace(/\\/+$/, '')}/${newValue}`);\n }\n } else {\n navigate(`${pathname.replace(/\\/+$/, '')}/${newValue}`);\n }\n onValueChange?.(newValue);\n }\n\n return <TabsView value={current} onValueChange={handleValueChange} tabs={tabs} {...rest} />;\n}\n\n// Presentational tabs — fully controlled by value + onValueChange\nfunction TabsView({\n value,\n onValueChange,\n tabs,\n listClassName,\n contentClassName,\n disabled,\n mountStrategy = 'active',\n animated = true,\n ...props\n}: TabsViewProps) {\n const layoutId = useId();\n\n if (!animated) {\n return (\n <ShadcnTabs value={value} onValueChange={onValueChange} {...props}>\n <ShadcnTabsList className={listClassName}>\n {tabs.map((tab) => (\n <ShadcnTabsTrigger\n key={tab.value}\n value={tab.value}\n disabled={disabled || tab.disabled}\n className={tab.className}\n >\n {tab.label}\n </ShadcnTabsTrigger>\n ))}\n </ShadcnTabsList>\n {tabs.map((tab) => (\n <ShadcnTabsContent\n key={tab.value}\n value={tab.value}\n forceMount={mountStrategy === 'all' ? true : undefined}\n className={cn(contentClassName, tab.contentClassName)}\n >\n {tab.content}\n </ShadcnTabsContent>\n ))}\n </ShadcnTabs>\n );\n }\n\n const activeTabItem = tabs.find((t) => t.value === value);\n\n return (\n <ShadcnTabs value={value} onValueChange={onValueChange} {...props}>\n <LayoutGroup id={layoutId}>\n <ShadcnTabsList className={listClassName}>\n {tabs.map((tab) => (\n <TabsPrimitive.Trigger\n key={tab.value}\n value={tab.value}\n disabled={disabled || tab.disabled}\n className={cn(\n 'relative inline-flex items-center justify-center gap-1.5',\n 'rounded-md px-3 py-1',\n 'text-sm font-medium whitespace-nowrap',\n 'text-muted-foreground',\n 'data-[state=active]:text-foreground',\n 'transition-colors duration-150',\n 'focus-visible:outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50',\n 'disabled:pointer-events-none disabled:opacity-50',\n \"[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n tab.className,\n )}\n >\n {value === tab.value && (\n <motion.span\n layoutId=\"tab-pill\"\n className=\"absolute inset-0 rounded-md bg-background shadow-sm\"\n transition={{ type: 'spring', visualDuration: 0.3, bounce: 0.05 }}\n />\n )}\n <span className=\"relative z-10\">{tab.label}</span>\n </TabsPrimitive.Trigger>\n ))}\n </ShadcnTabsList>\n </LayoutGroup>\n <AnimatePresence mode=\"wait\" initial={false}>\n {activeTabItem && (\n <motion.div\n key={activeTabItem.value}\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n exit={{ opacity: 0 }}\n transition={{ duration: 0.15, ease: 'easeOut' }}\n className={cn('flex-1 outline-none', contentClassName, activeTabItem.contentClassName)}\n >\n {activeTabItem.content}\n </motion.div>\n )}\n </AnimatePresence>\n </ShadcnTabs>\n );\n}\n\nexport const TabsList = ShadcnTabsList;\nexport const TabsContent = ShadcnTabsContent;\nexport const TabsTrigger = ShadcnTabsTrigger;\n","import type * as React from 'react';\nimport { cn } from '../../../shadcn/utils';\nimport { Skeleton } from '../Skeleton';\n\nconst DEFAULT_TAB_WIDTHS = ['w-20', 'w-14', 'w-16', 'w-24', 'w-18'];\n\nexport interface TabsSkeletonProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Number of tab triggers to render */\n count?: number;\n /** Height of the content area below the tabs */\n contentHeight?: string;\n /** Custom widths for each tab trigger (Tailwind width classes) */\n tabWidths?: string[];\n}\n\nexport const TabsSkeleton = ({\n count = 3,\n contentHeight = '500px',\n tabWidths,\n className,\n ...props\n}: TabsSkeletonProps) => {\n const widths = tabWidths ?? DEFAULT_TAB_WIDTHS;\n\n return (\n <div className={cn('flex flex-col gap-2', className)} {...props}>\n <div className=\"inline-flex h-9 w-fit items-center gap-0.5 rounded-lg bg-muted p-[3px]\">\n {Array.from({ length: count }, (_, i) => (\n <Skeleton\n // biome-ignore lint/suspicious/noArrayIndexKey: <static list of skeletons, not dynamic>\n key={i}\n className={cn('h-7 rounded-md', widths[i % widths.length], i === 0 && 'bg-background')}\n />\n ))}\n </div>\n <Skeleton className=\"w-full rounded-lg\" style={{ height: contentHeight }} />\n </div>\n );\n};\n\nTabsSkeleton.displayName = 'TabsSkeleton';\n"],"names":["Tabs","TabsPrimitive.Root","TabsList","TabsPrimitive.List","TabsTrigger","TabsPrimitive.Trigger","TabsContent","TabsPrimitive.Content","ShadcnTabs","ShadcnTabsList","ShadcnTabsTrigger","ShadcnTabsContent"],"mappings":"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"}
|
package/dist/ThemeToggle.js
CHANGED
|
@@ -1,47 +1,7 @@
|
|
|
1
1
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
2
|
import { u as useTheme } from './useTheme.js';
|
|
3
3
|
import { B as Button } from './Button.js';
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* @license lucide-react v0.562.0 - ISC
|
|
8
|
-
*
|
|
9
|
-
* This source code is licensed under the ISC license.
|
|
10
|
-
* See the LICENSE file in the root directory of this source tree.
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
const __iconNode$1 = [
|
|
15
|
-
[
|
|
16
|
-
"path",
|
|
17
|
-
{
|
|
18
|
-
d: "M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401",
|
|
19
|
-
key: "kfwtm"
|
|
20
|
-
}
|
|
21
|
-
]
|
|
22
|
-
];
|
|
23
|
-
const Moon = createLucideIcon("moon", __iconNode$1);
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* @license lucide-react v0.562.0 - ISC
|
|
27
|
-
*
|
|
28
|
-
* This source code is licensed under the ISC license.
|
|
29
|
-
* See the LICENSE file in the root directory of this source tree.
|
|
30
|
-
*/
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
const __iconNode = [
|
|
34
|
-
["circle", { cx: "12", cy: "12", r: "4", key: "4exip2" }],
|
|
35
|
-
["path", { d: "M12 2v2", key: "tus03m" }],
|
|
36
|
-
["path", { d: "M12 20v2", key: "1lh1kg" }],
|
|
37
|
-
["path", { d: "m4.93 4.93 1.41 1.41", key: "149t6j" }],
|
|
38
|
-
["path", { d: "m17.66 17.66 1.41 1.41", key: "ptbguv" }],
|
|
39
|
-
["path", { d: "M2 12h2", key: "1t8f8n" }],
|
|
40
|
-
["path", { d: "M20 12h2", key: "1q8mjw" }],
|
|
41
|
-
["path", { d: "m6.34 17.66-1.41 1.41", key: "1m8zz5" }],
|
|
42
|
-
["path", { d: "m19.07 4.93-1.41 1.41", key: "1shlcs" }]
|
|
43
|
-
];
|
|
44
|
-
const Sun = createLucideIcon("sun", __iconNode);
|
|
4
|
+
import { S as Sun, M as Moon } from './sun.js';
|
|
45
5
|
|
|
46
6
|
const ThemeToggle = ({ className, size = "md" }) => {
|
|
47
7
|
const { theme, toggleTheme } = useTheme();
|
package/dist/ThemeToggle.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ThemeToggle.js","sources":["../
|
|
1
|
+
{"version":3,"file":"ThemeToggle.js","sources":["../lib/components/ThemeToggle/ThemeToggle.tsx"],"sourcesContent":["import { Moon, Sun } from 'lucide-react';\nimport type React from 'react';\nimport { useTheme } from '../../hooks/useTheme';\nimport { Button } from '../Button/Button';\n\nexport interface ThemeToggleProps {\n /**\n * Custom className for the toggle button\n */\n className?: string;\n\n /**\n * Size of the toggle button\n */\n size?: 'sm' | 'md' | 'lg';\n}\n\n/**\n * ThemeToggle component for switching between light and dark themes.\n *\n * Uses the useTheme hook internally for theme state management.\n *\n * @example\n * ```tsx\n * <ThemeToggle />\n * <ThemeToggle size=\"lg\" className=\"custom-class\" />\n * ```\n */\nexport const ThemeToggle: React.FC<ThemeToggleProps> = ({ className, size = 'md' }) => {\n const { theme, toggleTheme } = useTheme();\n const isDarkMode = theme === 'dark';\n\n return (\n <Button\n variant=\"ghost\"\n size={size === 'md' ? 'default' : size}\n onClick={toggleTheme}\n className={`text-foreground ${className}`}\n aria-label={`Switch to ${isDarkMode ? 'light' : 'dark'} theme`}\n >\n <Sun\n className={`h-4 w-4 transition-all ${isDarkMode ? 'scale-0 -rotate-90' : 'scale-100 rotate-0'}`}\n aria-hidden\n />\n <Moon\n className={`absolute h-4 w-4 transition-all ${isDarkMode ? 'scale-100 rotate-0' : 'scale-0 rotate-90'}`}\n aria-hidden\n />\n </Button>\n );\n};\n\nThemeToggle.displayName = 'ThemeToggle';\n"],"names":[],"mappings":";;;;;AA4BO,MAAM,cAA0C,CAAC,EAAE,SAAA,EAAW,IAAA,GAAO,MAAK,KAAM;AACrF,EAAA,MAAM,EAAE,KAAA,EAAO,WAAA,EAAY,GAAI,QAAA,EAAS;AACxC,EAAA,MAAM,aAAa,KAAA,KAAU,MAAA;AAE7B,EAAA,uBACE,IAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,OAAA,EAAQ,OAAA;AAAA,MACR,IAAA,EAAM,IAAA,KAAS,IAAA,GAAO,SAAA,GAAY,IAAA;AAAA,MAClC,OAAA,EAAS,WAAA;AAAA,MACT,SAAA,EAAW,mBAAmB,SAAS,CAAA,CAAA;AAAA,MACvC,YAAA,EAAY,CAAA,UAAA,EAAa,UAAA,GAAa,OAAA,GAAU,MAAM,CAAA,MAAA,CAAA;AAAA,MAEtD,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAAC,GAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,CAAA,uBAAA,EAA0B,UAAA,GAAa,oBAAA,GAAuB,oBAAoB,CAAA,CAAA;AAAA,YAC7F,aAAA,EAAW;AAAA;AAAA,SACb;AAAA,wBACA,GAAA;AAAA,UAAC,IAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,CAAA,gCAAA,EAAmC,UAAA,GAAa,oBAAA,GAAuB,mBAAmB,CAAA,CAAA;AAAA,YACrG,aAAA,EAAW;AAAA;AAAA;AACb;AAAA;AAAA,GACF;AAEJ;AAEA,WAAA,CAAY,WAAA,GAAc,aAAA;;;;"}
|
package/dist/Toggle.js
CHANGED
package/dist/Tooltip.js
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
|
+
import { T as TooltipProvider, a as Tooltip$1, b as TooltipTrigger, c as TooltipContent } from './tooltip2.js';
|
|
3
|
+
|
|
4
|
+
const Tooltip = ({
|
|
5
|
+
content,
|
|
6
|
+
children,
|
|
7
|
+
side = "top",
|
|
8
|
+
align = "center",
|
|
9
|
+
className,
|
|
10
|
+
delayDuration = 200,
|
|
11
|
+
asChild = true
|
|
12
|
+
}) => /* @__PURE__ */ jsx(TooltipProvider, { delayDuration, children: /* @__PURE__ */ jsxs(Tooltip$1, { children: [
|
|
13
|
+
/* @__PURE__ */ jsx(TooltipTrigger, { asChild, children }),
|
|
14
|
+
/* @__PURE__ */ jsx(TooltipContent, { side, align, className, children: content })
|
|
15
|
+
] }) });
|
|
16
|
+
Tooltip.displayName = "Tooltip";
|
|
17
|
+
|
|
18
|
+
export { Tooltip as T };
|
|
19
|
+
//# sourceMappingURL=Tooltip.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Tooltip.js","sources":["../lib/components/Tooltip/Tooltip.tsx"],"sourcesContent":["import type React from 'react';\nimport {\n Tooltip as ShadcnTooltip,\n TooltipContent as ShadcnTooltipContent,\n TooltipProvider as ShadcnTooltipProvider,\n TooltipTrigger as ShadcnTooltipTrigger,\n} from '../../../shadcn/shadcnTooltip';\n\nexport interface TooltipProps {\n /** The hover content shown in the floating tooltip */\n content: React.ReactNode;\n /** The trigger element the tooltip is anchored to */\n children: React.ReactNode;\n /** Side the tooltip opens toward */\n side?: 'top' | 'right' | 'bottom' | 'left';\n /** Alignment along the trigger edge */\n align?: 'start' | 'center' | 'end';\n /** Extra classes for the content surface */\n className?: string;\n /** Hover delay before opening (ms) */\n delayDuration?: number;\n /** When true (default), the trigger renders as its child instead of a wrapping button */\n asChild?: boolean;\n}\n\n// Composed single-import tooltip — pass `content` for the hover text and wrap the trigger as children.\nexport const Tooltip: React.FC<TooltipProps> = ({\n content,\n children,\n side = 'top',\n align = 'center',\n className,\n delayDuration = 200,\n asChild = true,\n}) => (\n <ShadcnTooltipProvider delayDuration={delayDuration}>\n <ShadcnTooltip>\n <ShadcnTooltipTrigger asChild={asChild}>{children}</ShadcnTooltipTrigger>\n <ShadcnTooltipContent side={side} align={align} className={className}>\n {content}\n </ShadcnTooltipContent>\n </ShadcnTooltip>\n </ShadcnTooltipProvider>\n);\n\nTooltip.displayName = 'Tooltip';\n"],"names":["ShadcnTooltipProvider","ShadcnTooltip","ShadcnTooltipTrigger","ShadcnTooltipContent"],"mappings":";;;AA0BO,MAAM,UAAkC,CAAC;AAAA,EAC9C,OAAA;AAAA,EACA,QAAA;AAAA,EACA,IAAA,GAAO,KAAA;AAAA,EACP,KAAA,GAAQ,QAAA;AAAA,EACR,SAAA;AAAA,EACA,aAAA,GAAgB,GAAA;AAAA,EAChB,OAAA,GAAU;AACZ,CAAA,qBACE,GAAA,CAACA,eAAA,EAAA,EAAsB,aAAA,EACrB,QAAA,kBAAA,IAAA,CAACC,SAAA,EAAA,EACC,QAAA,EAAA;AAAA,kBAAA,GAAA,CAACC,cAAA,EAAA,EAAqB,SAAmB,QAAA,EAAS,CAAA;AAAA,kBAClD,GAAA,CAACC,cAAA,EAAA,EAAqB,IAAA,EAAY,KAAA,EAAc,WAC7C,QAAA,EAAA,OAAA,EACH;AAAA,CAAA,EACF,CAAA,EACF;AAGF,OAAA,CAAQ,WAAA,GAAc,SAAA;;;;"}
|
package/dist/UomSelector.js
CHANGED
|
@@ -19,7 +19,12 @@ const UomFilter = Object.assign(
|
|
|
19
19
|
{ displayName: "UomFilter", defaultLabel: "Unit of Measure", defaultName: "uomId" }
|
|
20
20
|
);
|
|
21
21
|
|
|
22
|
-
const DEFAULT_FIELD_KEYS = {
|
|
22
|
+
const DEFAULT_FIELD_KEYS = {
|
|
23
|
+
valueKey: "id",
|
|
24
|
+
labelKey: "name",
|
|
25
|
+
additionalKeys: "allowDecimal",
|
|
26
|
+
groupIdKey: "dimensionId"
|
|
27
|
+
};
|
|
23
28
|
const UomSelector = forwardRef(({ fieldKeys, ...props }, ref) => /* @__PURE__ */ jsx(
|
|
24
29
|
Select,
|
|
25
30
|
{
|
package/dist/UomSelector.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UomSelector.js","sources":["../lib/selects/uom/UomFilter.tsx","../lib/selects/uom/UomSelector.tsx"],"sourcesContent":["import { forwardRef } from 'react';\nimport { SelectFilter, type SelectFilterProps } from '../../components/Select/SelectFilter';\n\nexport type UomFilterProps = Omit<SelectFilterProps, 'optionsEndpoint' | 'name'> & { name?: string };\n\n// Pre-configured SelectFilter for unit of measure filtering with async search\nexport const UomFilter = Object.assign(\n forwardRef<HTMLButtonElement, UomFilterProps>((props, ref) => (\n <SelectFilter\n ref={ref}\n name=\"uomId\"\n label=\"Unit of Measure\"\n placeholder=\"Select unit\"\n optionsEndpoint=\"commerce-api/uom/select\"\n fieldKeys={{ valueKey: 'id', labelKey: 'name' }}\n {...props}\n />\n )),\n { displayName: 'UomFilter', defaultLabel: 'Unit of Measure', defaultName: 'uomId' },\n);\n","import { forwardRef } from 'react';\nimport { Select, type SelectProps } from '../../components/Select/Select';\n\nexport type UomSelectorProps = Omit<SelectProps, 'optionsEndpoint'>;\n\nconst DEFAULT_FIELD_KEYS = {
|
|
1
|
+
{"version":3,"file":"UomSelector.js","sources":["../lib/selects/uom/UomFilter.tsx","../lib/selects/uom/UomSelector.tsx"],"sourcesContent":["import { forwardRef } from 'react';\nimport { SelectFilter, type SelectFilterProps } from '../../components/Select/SelectFilter';\n\nexport type UomFilterProps = Omit<SelectFilterProps, 'optionsEndpoint' | 'name'> & { name?: string };\n\n// Pre-configured SelectFilter for unit of measure filtering with async search\nexport const UomFilter = Object.assign(\n forwardRef<HTMLButtonElement, UomFilterProps>((props, ref) => (\n <SelectFilter\n ref={ref}\n name=\"uomId\"\n label=\"Unit of Measure\"\n placeholder=\"Select unit\"\n optionsEndpoint=\"commerce-api/uom/select\"\n fieldKeys={{ valueKey: 'id', labelKey: 'name' }}\n {...props}\n />\n )),\n { displayName: 'UomFilter', defaultLabel: 'Unit of Measure', defaultName: 'uomId' },\n);\n","import { forwardRef } from 'react';\nimport { Select, type SelectProps } from '../../components/Select/Select';\n\nexport type UomSelectorProps = Omit<SelectProps, 'optionsEndpoint'>;\n\nconst DEFAULT_FIELD_KEYS = {\n valueKey: 'id',\n labelKey: 'name',\n additionalKeys: 'allowDecimal',\n groupIdKey: 'dimensionId',\n} as const;\n\n// Pre-configured Select for unit of measure selection, grouped by dimension\nexport const UomSelector = forwardRef<HTMLButtonElement, UomSelectorProps>(({ fieldKeys, ...props }, ref) => (\n <Select\n ref={ref}\n label=\"Unit of Measure\"\n placeholder=\"Select unit\"\n searchable\n optionsEndpoint=\"commerce-api/uom/select\"\n {...props}\n fieldKeys={{ ...DEFAULT_FIELD_KEYS, ...fieldKeys }}\n />\n));\nUomSelector.displayName = 'UomSelector';\n"],"names":[],"mappings":";;;;;AAMO,MAAM,YAAY,MAAA,CAAO,MAAA;AAAA,EAC9B,UAAA,CAA8C,CAAC,KAAA,EAAO,GAAA,qBACpD,GAAA;AAAA,IAAC,YAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,IAAA,EAAK,OAAA;AAAA,MACL,KAAA,EAAM,iBAAA;AAAA,MACN,WAAA,EAAY,aAAA;AAAA,MACZ,eAAA,EAAgB,yBAAA;AAAA,MAChB,SAAA,EAAW,EAAE,QAAA,EAAU,IAAA,EAAM,UAAU,MAAA,EAAO;AAAA,MAC7C,GAAG;AAAA;AAAA,GAEP,CAAA;AAAA,EACD,EAAE,WAAA,EAAa,WAAA,EAAa,YAAA,EAAc,iBAAA,EAAmB,aAAa,OAAA;AAC5E;;ACdA,MAAM,kBAAA,GAAqB;AAAA,EACzB,QAAA,EAAU,IAAA;AAAA,EACV,QAAA,EAAU,MAAA;AAAA,EACV,cAAA,EAAgB,cAAA;AAAA,EAChB,UAAA,EAAY;AACd,CAAA;AAGO,MAAM,WAAA,GAAc,WAAgD,CAAC,EAAE,WAAW,GAAG,KAAA,IAAS,GAAA,qBACnG,GAAA;AAAA,EAAC,MAAA;AAAA,EAAA;AAAA,IACC,GAAA;AAAA,IACA,KAAA,EAAM,iBAAA;AAAA,IACN,WAAA,EAAY,aAAA;AAAA,IACZ,UAAA,EAAU,IAAA;AAAA,IACV,eAAA,EAAgB,yBAAA;AAAA,IACf,GAAG,KAAA;AAAA,IACJ,SAAA,EAAW,EAAE,GAAG,kBAAA,EAAoB,GAAG,SAAA;AAAU;AACnD,CACD;AACD,WAAA,CAAY,WAAA,GAAc,aAAA;;;;"}
|
package/dist/UploadFile.js
CHANGED
|
@@ -5,43 +5,9 @@ import { B as Button } from './Button.js';
|
|
|
5
5
|
import { F as FilePreview } from './FilePreview.js';
|
|
6
6
|
import { F as Field, e as FieldLabel, c as FieldError } from './field.js';
|
|
7
7
|
import { U as Upload } from './upload.js';
|
|
8
|
-
import {
|
|
8
|
+
import { C as Camera, U as User } from './user.js';
|
|
9
9
|
import { X } from './x.js';
|
|
10
10
|
|
|
11
|
-
/**
|
|
12
|
-
* @license lucide-react v0.562.0 - ISC
|
|
13
|
-
*
|
|
14
|
-
* This source code is licensed under the ISC license.
|
|
15
|
-
* See the LICENSE file in the root directory of this source tree.
|
|
16
|
-
*/
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
const __iconNode$1 = [
|
|
20
|
-
[
|
|
21
|
-
"path",
|
|
22
|
-
{
|
|
23
|
-
d: "M13.997 4a2 2 0 0 1 1.76 1.05l.486.9A2 2 0 0 0 18.003 7H20a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V9a2 2 0 0 1 2-2h1.997a2 2 0 0 0 1.759-1.048l.489-.904A2 2 0 0 1 10.004 4z",
|
|
24
|
-
key: "18u6gg"
|
|
25
|
-
}
|
|
26
|
-
],
|
|
27
|
-
["circle", { cx: "12", cy: "13", r: "3", key: "1vg3eu" }]
|
|
28
|
-
];
|
|
29
|
-
const Camera = createLucideIcon("camera", __iconNode$1);
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* @license lucide-react v0.562.0 - ISC
|
|
33
|
-
*
|
|
34
|
-
* This source code is licensed under the ISC license.
|
|
35
|
-
* See the LICENSE file in the root directory of this source tree.
|
|
36
|
-
*/
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
const __iconNode = [
|
|
40
|
-
["path", { d: "M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2", key: "975kel" }],
|
|
41
|
-
["circle", { cx: "12", cy: "7", r: "4", key: "17ys0d" }]
|
|
42
|
-
];
|
|
43
|
-
const User = createLucideIcon("user", __iconNode);
|
|
44
|
-
|
|
45
11
|
const AvatarPreview = ({ file, size }) => {
|
|
46
12
|
const [objectUrl, setObjectUrl] = useState(null);
|
|
47
13
|
useEffect(() => {
|
package/dist/UploadFile.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UploadFile.js","sources":["../node_modules/.pnpm/lucide-react@0.562.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/camera.js","../node_modules/.pnpm/lucide-react@0.562.0_react@19.2.3/node_modules/lucide-react/dist/esm/icons/user.js","../lib/components/UploadFile/UploadFile.tsx"],"sourcesContent":["/**\n * @license lucide-react v0.562.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\n \"path\",\n {\n d: \"M13.997 4a2 2 0 0 1 1.76 1.05l.486.9A2 2 0 0 0 18.003 7H20a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V9a2 2 0 0 1 2-2h1.997a2 2 0 0 0 1.759-1.048l.489-.904A2 2 0 0 1 10.004 4z\",\n key: \"18u6gg\"\n }\n ],\n [\"circle\", { cx: \"12\", cy: \"13\", r: \"3\", key: \"1vg3eu\" }]\n];\nconst Camera = createLucideIcon(\"camera\", __iconNode);\n\nexport { __iconNode, Camera as default };\n//# sourceMappingURL=camera.js.map\n","/**\n * @license lucide-react v0.562.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"path\", { d: \"M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2\", key: \"975kel\" }],\n [\"circle\", { cx: \"12\", cy: \"7\", r: \"4\", key: \"17ys0d\" }]\n];\nconst User = createLucideIcon(\"user\", __iconNode);\n\nexport { __iconNode, User as default };\n//# sourceMappingURL=user.js.map\n","import { Camera, Upload, User, X } from 'lucide-react';\nimport type React from 'react';\nimport { useEffect, useRef, useState } from 'react';\nimport { cn } from '../../../shadcn/utils';\nimport { Button } from '../Button';\nimport { Field, FieldError, FieldLabel } from '../Field';\nimport { FilePreview } from '../FilePreview';\n\n// Preset anchor string values\ntype AnchorPreset = 'dropzone' | 'button' | 'avatar';\n\ninterface UploadFileBaseProps {\n // Trigger style — preset string or custom ReactNode (default: 'dropzone')\n anchor?: AnchorPreset | React.ReactNode;\n // Allow multiple file selection (default: false, returns single File)\n multiple?: boolean;\n // File type filter (accepts all files by default)\n accept?: string;\n // Disable the file input\n disabled?: boolean;\n // Optional field label\n label?: string;\n // Validation error message\n error?: string;\n // Primary text on the anchor (varies by anchor type)\n placeholder?: string;\n // Secondary descriptive text (e.g., \"PNG, JPG up to 10MB\")\n hint?: string;\n // Current file value — injected by Form Controller or passed directly\n value?: File | File[] | null;\n // Shows a pulsing loading animation on the file row during upload/processing.\n isLoading?: boolean;\n}\n\n// Standalone usage — onChange is required\ninterface UploadFileStandaloneProps extends UploadFileBaseProps {\n name?: never;\n onChange: (files: File | File[] | undefined) => void;\n}\n\n// Form usage — Controller injects onChange via name prop\ninterface UploadFileFormProps extends UploadFileBaseProps {\n name: string;\n onChange?: (files: File | File[] | undefined) => void;\n}\n\nexport type UploadFileProps = UploadFileStandaloneProps | UploadFileFormProps;\n\n// Circular avatar preview used by the avatar anchor preset\nconst AvatarPreview: React.FC<{ file: File; size: number }> = ({ file, size }) => {\n const [objectUrl, setObjectUrl] = useState<string | null>(null);\n\n useEffect(() => {\n const url = URL.createObjectURL(file);\n setObjectUrl(url);\n return () => URL.revokeObjectURL(url);\n }, [file]);\n\n if (!objectUrl) return null;\n\n return (\n <img\n src={objectUrl}\n alt={file.name}\n className=\"rounded-full object-cover w-full h-full\"\n style={{ width: size, height: size }}\n />\n );\n};\n\n// File upload trigger with optional preset anchors and built-in file preview\nexport const UploadFile: React.FC<UploadFileProps> = ({\n anchor = 'dropzone',\n multiple = false,\n accept,\n disabled,\n label,\n error,\n placeholder,\n hint,\n value,\n onChange,\n isLoading,\n}) => {\n const inputRef = useRef<HTMLInputElement>(null);\n\n // Normalize value to an array for consistent handling\n const files: File[] = !value ? [] : Array.isArray(value) ? value : [value];\n const hasFiles = files.length > 0;\n\n // True when using a preset string anchor (not a custom ReactNode)\n const isPreset = anchor === 'dropzone' || anchor === 'button' || anchor === 'avatar';\n\n // Opens the native file picker\n function handleClick() {\n if (disabled) return;\n inputRef.current?.click();\n }\n\n // Forwards selected files to consumer and resets input\n function handleChange(event: React.ChangeEvent<HTMLInputElement>) {\n const fileList = event.target.files;\n if (!fileList || fileList.length === 0) return;\n\n if (multiple) {\n // Merge with existing files, avoiding duplicates by name+size\n const incoming = Array.from(fileList);\n const merged = [...files, ...incoming.filter((f) => !files.some((e) => e.name === f.name && e.size === f.size))];\n onChange?.(merged);\n } else {\n onChange?.(fileList[0]);\n }\n\n // Reset so the same file can be re-selected\n event.target.value = '';\n }\n\n // Removes a specific file from the selection\n function handleRemove(file: File) {\n if (multiple) {\n const remaining = files.filter((f) => f !== file);\n onChange?.(remaining.length ? remaining : undefined);\n } else {\n onChange?.(undefined);\n }\n }\n\n // Renders the clickable anchor element based on the anchor prop\n function renderAnchor() {\n // Custom ReactNode — preserve original headless behaviour\n if (!isPreset) {\n return (\n <button\n type=\"button\"\n onClick={handleClick}\n disabled={disabled}\n style={{ all: 'unset', display: 'inline-block', cursor: disabled ? 'default' : 'pointer' }}\n >\n {anchor as React.ReactNode}\n </button>\n );\n }\n\n if (anchor === 'dropzone') {\n // In single mode with a file selected, the file row replaces the dropzone\n if (!multiple && hasFiles) return null;\n\n return (\n <button\n type=\"button\"\n onClick={handleClick}\n disabled={disabled}\n className={cn(\n 'flex w-full flex-col items-center justify-center gap-2 rounded-lg border-2 border-dashed p-8 transition-colors',\n error ? 'border-destructive' : 'border-border',\n disabled ? 'cursor-default opacity-50' : 'cursor-pointer hover:bg-muted/50',\n )}\n >\n <Upload className=\"h-6 w-6 text-muted-foreground\" />\n <p className=\"text-sm text-muted-foreground\">{placeholder ?? 'Click or drag to upload'}</p>\n {hint && <p className=\"text-xs text-muted-foreground\">{hint}</p>}\n </button>\n );\n }\n\n if (anchor === 'button') {\n // In single mode with a file selected, the file row replaces the button\n if (!multiple && hasFiles) return null;\n\n return (\n <Button type=\"button\" variant=\"outline\" onClick={handleClick} disabled={disabled}>\n <Upload className=\"h-4 w-4\" />\n {placeholder ?? 'Upload file'}\n </Button>\n );\n }\n\n if (anchor === 'avatar') {\n const avatarSize = 80;\n const firstFile = files[0];\n const hasImage = hasFiles && firstFile.type.startsWith('image/');\n\n return (\n // Wrapper provides positioning context for the badge outside overflow-hidden\n <div className=\"relative inline-block\" style={{ width: avatarSize, height: avatarSize }}>\n <button\n type=\"button\"\n onClick={handleClick}\n disabled={disabled}\n className={cn(\n 'group relative h-full w-full overflow-hidden rounded-full bg-muted',\n disabled ? 'cursor-default opacity-50' : 'cursor-pointer',\n )}\n >\n {hasImage ? (\n <>\n <AvatarPreview file={firstFile} size={avatarSize} />\n {/* Camera overlay on hover */}\n <div className=\"absolute inset-0 flex items-center justify-center rounded-full bg-black/40 opacity-0 transition-opacity group-hover:opacity-100\">\n <Camera className=\"h-5 w-5 text-white\" />\n </div>\n </>\n ) : (\n <div className=\"flex h-full w-full items-center justify-center\">\n <User className=\"h-8 w-8 text-muted-foreground\" />\n </div>\n )}\n </button>\n\n {/* Badge sits outside overflow-hidden so it's never clipped */}\n {!hasImage && (\n <div className=\"pointer-events-none absolute -bottom-0.5 -right-0.5 flex h-6 w-6 items-center justify-center rounded-full bg-primary ring-2 ring-background\">\n <Upload className=\"h-3 w-3 text-primary-foreground\" />\n </div>\n )}\n </div>\n );\n }\n\n return null;\n }\n\n // Renders the file list below the anchor for preset anchors (not avatar)\n function renderFileList() {\n if (!isPreset || !hasFiles || anchor === 'avatar') return null;\n\n return (\n <div className=\"flex flex-col gap-2\">\n {files.map((file) => (\n <div\n key={`${file.name}-${file.size}`}\n className={cn(\n 'relative overflow-hidden flex items-center gap-3 rounded-lg border border-dashed p-3',\n isLoading ? 'border-primary/40 animate-pulse' : 'border-border',\n )}\n >\n {isLoading && <div className=\"absolute inset-0 bg-primary/5\" />}\n <div className=\"relative flex items-center gap-3 flex-1 min-w-0\">\n <FilePreview file={file} size={40} />\n <div className=\"flex-1 min-w-0\">\n <span className=\"block truncate text-sm\">{file.name}</span>\n {isLoading && <span className=\"text-xs text-muted-foreground\">Uploading...</span>}\n </div>\n {!isLoading && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8 shrink-0\"\n onClick={() => handleRemove(file)}\n disabled={disabled}\n >\n <X className=\"h-4 w-4\" />\n </Button>\n )}\n </div>\n </div>\n ))}\n </div>\n );\n }\n\n return (\n <Field data-disabled={disabled}>\n {label && <FieldLabel>{label}</FieldLabel>}\n\n {renderAnchor()}\n {renderFileList()}\n\n <input\n ref={inputRef}\n type=\"file\"\n multiple={multiple}\n accept={accept}\n disabled={disabled}\n onChange={handleChange}\n style={{ display: 'none' }}\n aria-hidden=\"true\"\n tabIndex={-1}\n />\n\n {error && <FieldError>{error}</FieldError>}\n </Field>\n );\n};\n\nUploadFile.displayName = 'UploadFile';\n"],"names":["__iconNode"],"mappings":"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","x_google_ignoreList":[0,1]}
|
|
1
|
+
{"version":3,"file":"UploadFile.js","sources":["../lib/components/UploadFile/UploadFile.tsx"],"sourcesContent":["import { Camera, Upload, User, X } from 'lucide-react';\nimport type React from 'react';\nimport { useEffect, useRef, useState } from 'react';\nimport { cn } from '../../../shadcn/utils';\nimport { Button } from '../Button';\nimport { Field, FieldError, FieldLabel } from '../Field';\nimport { FilePreview } from '../FilePreview';\n\n// Preset anchor string values\ntype AnchorPreset = 'dropzone' | 'button' | 'avatar';\n\ninterface UploadFileBaseProps {\n // Trigger style — preset string or custom ReactNode (default: 'dropzone')\n anchor?: AnchorPreset | React.ReactNode;\n // Allow multiple file selection (default: false, returns single File)\n multiple?: boolean;\n // File type filter (accepts all files by default)\n accept?: string;\n // Disable the file input\n disabled?: boolean;\n // Optional field label\n label?: string;\n // Validation error message\n error?: string;\n // Primary text on the anchor (varies by anchor type)\n placeholder?: string;\n // Secondary descriptive text (e.g., \"PNG, JPG up to 10MB\")\n hint?: string;\n // Current file value — injected by Form Controller or passed directly\n value?: File | File[] | null;\n // Shows a pulsing loading animation on the file row during upload/processing.\n isLoading?: boolean;\n}\n\n// Standalone usage — onChange is required\ninterface UploadFileStandaloneProps extends UploadFileBaseProps {\n name?: never;\n onChange: (files: File | File[] | undefined) => void;\n}\n\n// Form usage — Controller injects onChange via name prop\ninterface UploadFileFormProps extends UploadFileBaseProps {\n name: string;\n onChange?: (files: File | File[] | undefined) => void;\n}\n\nexport type UploadFileProps = UploadFileStandaloneProps | UploadFileFormProps;\n\n// Circular avatar preview used by the avatar anchor preset\nconst AvatarPreview: React.FC<{ file: File; size: number }> = ({ file, size }) => {\n const [objectUrl, setObjectUrl] = useState<string | null>(null);\n\n useEffect(() => {\n const url = URL.createObjectURL(file);\n setObjectUrl(url);\n return () => URL.revokeObjectURL(url);\n }, [file]);\n\n if (!objectUrl) return null;\n\n return (\n <img\n src={objectUrl}\n alt={file.name}\n className=\"rounded-full object-cover w-full h-full\"\n style={{ width: size, height: size }}\n />\n );\n};\n\n// File upload trigger with optional preset anchors and built-in file preview\nexport const UploadFile: React.FC<UploadFileProps> = ({\n anchor = 'dropzone',\n multiple = false,\n accept,\n disabled,\n label,\n error,\n placeholder,\n hint,\n value,\n onChange,\n isLoading,\n}) => {\n const inputRef = useRef<HTMLInputElement>(null);\n\n // Normalize value to an array for consistent handling\n const files: File[] = !value ? [] : Array.isArray(value) ? value : [value];\n const hasFiles = files.length > 0;\n\n // True when using a preset string anchor (not a custom ReactNode)\n const isPreset = anchor === 'dropzone' || anchor === 'button' || anchor === 'avatar';\n\n // Opens the native file picker\n function handleClick() {\n if (disabled) return;\n inputRef.current?.click();\n }\n\n // Forwards selected files to consumer and resets input\n function handleChange(event: React.ChangeEvent<HTMLInputElement>) {\n const fileList = event.target.files;\n if (!fileList || fileList.length === 0) return;\n\n if (multiple) {\n // Merge with existing files, avoiding duplicates by name+size\n const incoming = Array.from(fileList);\n const merged = [...files, ...incoming.filter((f) => !files.some((e) => e.name === f.name && e.size === f.size))];\n onChange?.(merged);\n } else {\n onChange?.(fileList[0]);\n }\n\n // Reset so the same file can be re-selected\n event.target.value = '';\n }\n\n // Removes a specific file from the selection\n function handleRemove(file: File) {\n if (multiple) {\n const remaining = files.filter((f) => f !== file);\n onChange?.(remaining.length ? remaining : undefined);\n } else {\n onChange?.(undefined);\n }\n }\n\n // Renders the clickable anchor element based on the anchor prop\n function renderAnchor() {\n // Custom ReactNode — preserve original headless behaviour\n if (!isPreset) {\n return (\n <button\n type=\"button\"\n onClick={handleClick}\n disabled={disabled}\n style={{ all: 'unset', display: 'inline-block', cursor: disabled ? 'default' : 'pointer' }}\n >\n {anchor as React.ReactNode}\n </button>\n );\n }\n\n if (anchor === 'dropzone') {\n // In single mode with a file selected, the file row replaces the dropzone\n if (!multiple && hasFiles) return null;\n\n return (\n <button\n type=\"button\"\n onClick={handleClick}\n disabled={disabled}\n className={cn(\n 'flex w-full flex-col items-center justify-center gap-2 rounded-lg border-2 border-dashed p-8 transition-colors',\n error ? 'border-destructive' : 'border-border',\n disabled ? 'cursor-default opacity-50' : 'cursor-pointer hover:bg-muted/50',\n )}\n >\n <Upload className=\"h-6 w-6 text-muted-foreground\" />\n <p className=\"text-sm text-muted-foreground\">{placeholder ?? 'Click or drag to upload'}</p>\n {hint && <p className=\"text-xs text-muted-foreground\">{hint}</p>}\n </button>\n );\n }\n\n if (anchor === 'button') {\n // In single mode with a file selected, the file row replaces the button\n if (!multiple && hasFiles) return null;\n\n return (\n <Button type=\"button\" variant=\"outline\" onClick={handleClick} disabled={disabled}>\n <Upload className=\"h-4 w-4\" />\n {placeholder ?? 'Upload file'}\n </Button>\n );\n }\n\n if (anchor === 'avatar') {\n const avatarSize = 80;\n const firstFile = files[0];\n const hasImage = hasFiles && firstFile.type.startsWith('image/');\n\n return (\n // Wrapper provides positioning context for the badge outside overflow-hidden\n <div className=\"relative inline-block\" style={{ width: avatarSize, height: avatarSize }}>\n <button\n type=\"button\"\n onClick={handleClick}\n disabled={disabled}\n className={cn(\n 'group relative h-full w-full overflow-hidden rounded-full bg-muted',\n disabled ? 'cursor-default opacity-50' : 'cursor-pointer',\n )}\n >\n {hasImage ? (\n <>\n <AvatarPreview file={firstFile} size={avatarSize} />\n {/* Camera overlay on hover */}\n <div className=\"absolute inset-0 flex items-center justify-center rounded-full bg-black/40 opacity-0 transition-opacity group-hover:opacity-100\">\n <Camera className=\"h-5 w-5 text-white\" />\n </div>\n </>\n ) : (\n <div className=\"flex h-full w-full items-center justify-center\">\n <User className=\"h-8 w-8 text-muted-foreground\" />\n </div>\n )}\n </button>\n\n {/* Badge sits outside overflow-hidden so it's never clipped */}\n {!hasImage && (\n <div className=\"pointer-events-none absolute -bottom-0.5 -right-0.5 flex h-6 w-6 items-center justify-center rounded-full bg-primary ring-2 ring-background\">\n <Upload className=\"h-3 w-3 text-primary-foreground\" />\n </div>\n )}\n </div>\n );\n }\n\n return null;\n }\n\n // Renders the file list below the anchor for preset anchors (not avatar)\n function renderFileList() {\n if (!isPreset || !hasFiles || anchor === 'avatar') return null;\n\n return (\n <div className=\"flex flex-col gap-2\">\n {files.map((file) => (\n <div\n key={`${file.name}-${file.size}`}\n className={cn(\n 'relative overflow-hidden flex items-center gap-3 rounded-lg border border-dashed p-3',\n isLoading ? 'border-primary/40 animate-pulse' : 'border-border',\n )}\n >\n {isLoading && <div className=\"absolute inset-0 bg-primary/5\" />}\n <div className=\"relative flex items-center gap-3 flex-1 min-w-0\">\n <FilePreview file={file} size={40} />\n <div className=\"flex-1 min-w-0\">\n <span className=\"block truncate text-sm\">{file.name}</span>\n {isLoading && <span className=\"text-xs text-muted-foreground\">Uploading...</span>}\n </div>\n {!isLoading && (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n className=\"h-8 w-8 shrink-0\"\n onClick={() => handleRemove(file)}\n disabled={disabled}\n >\n <X className=\"h-4 w-4\" />\n </Button>\n )}\n </div>\n </div>\n ))}\n </div>\n );\n }\n\n return (\n <Field data-disabled={disabled}>\n {label && <FieldLabel>{label}</FieldLabel>}\n\n {renderAnchor()}\n {renderFileList()}\n\n <input\n ref={inputRef}\n type=\"file\"\n multiple={multiple}\n accept={accept}\n disabled={disabled}\n onChange={handleChange}\n style={{ display: 'none' }}\n aria-hidden=\"true\"\n tabIndex={-1}\n />\n\n {error && <FieldError>{error}</FieldError>}\n </Field>\n );\n};\n\nUploadFile.displayName = 'UploadFile';\n"],"names":[],"mappings":"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"}
|
package/dist/ValueFilter.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ValueFilter.js","sources":["../lib/components/ValueFilter/ValueFilter.tsx"],"sourcesContent":["import { ChevronDown, ChevronDownIcon, ChevronUp, X } from 'lucide-react';\nimport { useCallback, useEffect, useId, useState } from 'react';\nimport { Input } from '../../../shadcn/shadcnInput';\nimport { Popover, PopoverContent, PopoverTrigger } from '../../../shadcn/shadcnPopover';\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../../../shadcn/shadcnSelect';\nimport { cn } from '../../../shadcn/utils';\nimport type { FilterCondition, FilterOperator, NumberOperator, StringOperator } from '../../types/table-filter';\nimport { Button } from '../Button';\n\nexport interface ValueFilterProps {\n name: string;\n label: string;\n fieldType: 'string' | 'number';\n value?: FilterCondition | null;\n onChange?: (value: FilterCondition | null | undefined) => void;\n className?: string;\n}\n\ninterface OperatorOption {\n value: FilterOperator;\n label: string;\n}\n\nconst STRING_OPERATORS: OperatorOption[] = [\n { value: 'contains', label: 'contains' },\n { value: 'notContains', label: \"doesn't contain\" },\n { value: 'equals', label: 'equals' },\n { value: 'notEquals', label: 'not equals' },\n];\n\nconst NUMBER_OPERATORS: OperatorOption[] = [\n { value: 'equals', label: '=' },\n { value: 'notEquals', label: '\\u2260' },\n { value: 'gt', label: '>' },\n { value: 'gte', label: '\\u2265' },\n { value: 'lt', label: '<' },\n { value: 'lte', label: '\\u2264' },\n];\n\nconst DEFAULT_STRING_OPERATOR: StringOperator = 'contains';\nconst DEFAULT_NUMBER_OPERATOR: NumberOperator = 'equals';\n\n// Resolves the display label for an operator given the field type\nfunction getOperatorLabel(operator: FilterOperator, fieldType: 'string' | 'number'): string {\n const options = fieldType === 'string' ? STRING_OPERATORS : NUMBER_OPERATORS;\n return options.find((o) => o.value === operator)?.label ?? operator;\n}\n\n// Compact filter chip with operator/value popover for building filter conditions\nexport const ValueFilter: React.FC<ValueFilterProps> = ({ name, label, fieldType, value, onChange, className }) => {\n const popoverId = useId();\n const [open, setOpen] = useState(false);\n const [draftOperator, setDraftOperator] = useState<FilterOperator>(\n value?.operator ?? (fieldType === 'string' ? DEFAULT_STRING_OPERATOR : DEFAULT_NUMBER_OPERATOR),\n );\n const [draftValue, setDraftValue] = useState<string>(value?.value !== undefined ? String(value.value) : '');\n\n // Sync draft state when the external value changes while popover is closed\n useEffect(() => {\n if (!open) {\n setDraftOperator(value?.operator ?? (fieldType === 'string' ? DEFAULT_STRING_OPERATOR : DEFAULT_NUMBER_OPERATOR));\n setDraftValue(value?.value !== undefined ? String(value.value) : '');\n }\n }, [value, fieldType, open]);\n\n // Commits the draft filter condition to the parent\n const handleApply = useCallback(() => {\n if (draftValue.trim() === '') return;\n\n const parsedValue = fieldType === 'number' ? Number(draftValue) : draftValue;\n if (fieldType === 'number' && Number.isNaN(parsedValue)) return;\n\n onChange?.({ field: name, operator: draftOperator, value: parsedValue });\n setOpen(false);\n }, [draftValue, draftOperator, name, fieldType, onChange]);\n\n // Clears the filter condition\n const handleClear = useCallback(() => {\n onChange?.(null);\n setDraftOperator(fieldType === 'string' ? DEFAULT_STRING_OPERATOR : DEFAULT_NUMBER_OPERATOR);\n setDraftValue('');\n setOpen(false);\n }, [onChange, fieldType]);\n\n // Clears inline from the chip without opening the popover\n const handleInlineClear = useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation();\n handleClear();\n },\n [handleClear],\n );\n\n if (!name) {\n return (\n <span className=\"inline-flex items-center rounded-md border border-destructive bg-destructive/10 px-3 py-2 text-xs text-destructive\">\n ValueFilter: missing required `name` prop\n </span>\n );\n }\n\n const operators = fieldType === 'string' ? STRING_OPERATORS : NUMBER_OPERATORS;\n const hasValue = value != null;\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n role=\"combobox\"\n aria-controls={popoverId}\n aria-expanded={open}\n className={cn(\n 'inline-flex items-center gap-2 rounded-md border px-3 py-2 text-sm whitespace-nowrap shadow-xs outline-none transition-colors disabled:cursor-not-allowed disabled:opacity-50',\n hasValue\n ? 'bg-primary text-primary-foreground border-primary hover:bg-primary/90'\n : 'border-input bg-transparent hover:bg-accent hover:text-accent-foreground',\n className,\n )}\n >\n <span className=\"truncate\">\n {hasValue ? `${label}: ${getOperatorLabel(value.operator, fieldType)} ${value.value}` : label}\n </span>\n {hasValue ? (\n <X className=\"size-3.5 shrink-0 opacity-70 hover:opacity-100\" onClick={handleInlineClear} />\n ) : (\n <ChevronDownIcon className=\"size-4 shrink-0 opacity-50\" />\n )}\n </button>\n </PopoverTrigger>\n\n <PopoverContent id={popoverId} className=\"w-[280px] p-0\" align=\"start\">\n <div className=\"flex items-center gap-1.5 border-b bg-muted/30 px-3 h-[42px]\">\n <span className=\"text-sm text-muted-foreground\">{label}</span>\n <Select value={draftOperator} onValueChange={(v) => setDraftOperator(v as FilterOperator)}>\n <SelectTrigger className=\"h-auto w-auto gap-1 border-0 bg-transparent p-0 shadow-none text-sm font-medium text-foreground focus-visible:ring-0\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {operators.map((op) => (\n <SelectItem key={op.value} value={op.value}>\n {op.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"space-y-3 px-4 py-4\">\n <div className=\"relative\">\n <Input\n type=\"text\"\n inputMode={fieldType === 'number' ? 'decimal' : undefined}\n pattern={fieldType === 'number' ? '^[0-9]*\\\\.?[0-9]*$' : undefined}\n placeholder={`Enter ${label.toLowerCase()}...`}\n value={draftValue}\n className={fieldType === 'number' ? 'pr-8' : undefined}\n onChange={(e) => {\n if (fieldType === 'number') {\n const filtered = e.target.value.replace(/[^0-9.]/g, '').replace(/(\\..*)\\./g, '$1');\n setDraftValue(filtered);\n } else {\n setDraftValue(e.target.value);\n }\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n handleApply();\n return;\n }\n if (fieldType === 'number') {\n if (e.key === '-' || e.key === 'e') {\n e.preventDefault();\n return;\n }\n if (e.key === 'ArrowUp') {\n e.preventDefault();\n setDraftValue((v) => String(Math.max(0, (Number.isFinite(Number(v)) ? Number(v) : 0) + 1)));\n return;\n }\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n setDraftValue((v) => String(Math.max(0, (Number.isFinite(Number(v)) ? Number(v) : 0) - 1)));\n }\n }\n }}\n />\n {fieldType === 'number' && (\n <div className=\"absolute inset-y-0 right-1.5 flex items-center\">\n <div className=\"flex h-7 w-4 flex-col overflow-hidden rounded-sm border border-border bg-background\">\n <button\n type=\"button\"\n tabIndex={-1}\n className=\"flex h-1/2 items-center justify-center border-b border-border text-muted-foreground hover:bg-accent\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => setDraftValue((v) => String(Math.max(0, (Number.isFinite(Number(v)) ? Number(v) : 0) + 1)))}\n aria-label=\"Increase value\"\n >\n <ChevronUp className=\"size-2.5\" />\n </button>\n <button\n type=\"button\"\n tabIndex={-1}\n className=\"flex h-1/2 items-center justify-center text-muted-foreground hover:bg-accent\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => setDraftValue((v) => String(Math.max(0, (Number.isFinite(Number(v)) ? Number(v) : 0) - 1)))}\n aria-label=\"Decrease value\"\n >\n <ChevronDown className=\"size-2.5\" />\n </button>\n </div>\n </div>\n )}\n </div>\n\n <div className=\"flex items-center justify-end gap-2\">\n <Button variant=\"ghost\" size=\"sm\" onClick={handleClear}>\n Clear\n </Button>\n <Button size=\"sm\" onClick={handleApply} disabled={draftValue.trim() === ''}>\n Save\n </Button>\n </div>\n </div>\n </PopoverContent>\n </Popover>\n );\n};\n\nValueFilter.displayName = 'ValueFilter';\n"],"names":["ChevronDownIcon"],"mappings":";;;;;;;;;;;AAuBA,MAAM,gBAAA,GAAqC;AAAA,EACzC,EAAE,KAAA,EAAO,UAAA,EAAY,KAAA,EAAO,UAAA,EAAW;AAAA,EACvC,EAAE,KAAA,EAAO,aAAA,EAAe,KAAA,EAAO,iBAAA,EAAkB;AAAA,EACjD,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,QAAA,EAAS;AAAA,EACnC,EAAE,KAAA,EAAO,WAAA,EAAa,KAAA,EAAO,YAAA;AAC/B,CAAA;AAEA,MAAM,gBAAA,GAAqC;AAAA,EACzC,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,GAAA,EAAI;AAAA,EAC9B,EAAE,KAAA,EAAO,WAAA,EAAa,KAAA,EAAO,GAAA,EAAS;AAAA,EACtC,EAAE,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,GAAA,EAAI;AAAA,EAC1B,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,GAAA,EAAS;AAAA,EAChC,EAAE,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,GAAA,EAAI;AAAA,EAC1B,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,GAAA;AACzB,CAAA;AAEA,MAAM,uBAAA,GAA0C,UAAA;AAChD,MAAM,uBAAA,GAA0C,QAAA;AAGhD,SAAS,gBAAA,CAAiB,UAA0B,SAAA,EAAwC;AAC1F,EAAA,MAAM,OAAA,GAAU,SAAA,KAAc,QAAA,GAAW,gBAAA,GAAmB,gBAAA;AAC5D,EAAA,OAAO,OAAA,CAAQ,KAAK,CAAC,CAAA,KAAM,EAAE,KAAA,KAAU,QAAQ,GAAG,KAAA,IAAS,QAAA;AAC7D;AAGO,MAAM,WAAA,GAA0C,CAAC,EAAE,IAAA,EAAM,OAAO,SAAA,EAAW,KAAA,EAAO,QAAA,EAAU,SAAA,EAAU,KAAM;AACjH,EAAA,MAAM,YAAY,KAAA,EAAM;AACxB,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,SAAS,KAAK,CAAA;AACtC,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAI,QAAA;AAAA,IACxC,KAAA,EAAO,QAAA,KAAa,SAAA,KAAc,QAAA,GAAW,uBAAA,GAA0B,uBAAA;AAAA,GACzE;AACA,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,QAAA,CAAiB,KAAA,EAAO,KAAA,KAAU,MAAA,GAAY,MAAA,CAAO,KAAA,CAAM,KAAK,CAAA,GAAI,EAAE,CAAA;AAG1G,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,gBAAA,CAAiB,KAAA,EAAO,QAAA,KAAa,SAAA,KAAc,QAAA,GAAW,0BAA0B,uBAAA,CAAwB,CAAA;AAChH,MAAA,aAAA,CAAc,OAAO,KAAA,KAAU,MAAA,GAAY,OAAO,KAAA,CAAM,KAAK,IAAI,EAAE,CAAA;AAAA,IACrE;AAAA,EACF,CAAA,EAAG,CAAC,KAAA,EAAO,SAAA,EAAW,IAAI,CAAC,CAAA;AAG3B,EAAA,MAAM,WAAA,GAAc,YAAY,MAAM;AACpC,IAAA,IAAI,UAAA,CAAW,IAAA,EAAK,KAAM,EAAA,EAAI;AAE9B,IAAA,MAAM,WAAA,GAAc,SAAA,KAAc,QAAA,GAAW,MAAA,CAAO,UAAU,CAAA,GAAI,UAAA;AAClE,IAAA,IAAI,SAAA,KAAc,QAAA,IAAY,MAAA,CAAO,KAAA,CAAM,WAAW,CAAA,EAAG;AAEzD,IAAA,QAAA,GAAW,EAAE,KAAA,EAAO,IAAA,EAAM,UAAU,aAAA,EAAe,KAAA,EAAO,aAAa,CAAA;AACvE,IAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,EACf,GAAG,CAAC,UAAA,EAAY,eAAe,IAAA,EAAM,SAAA,EAAW,QAAQ,CAAC,CAAA;AAGzD,EAAA,MAAM,WAAA,GAAc,YAAY,MAAM;AACpC,IAAA,QAAA,GAAW,IAAI,CAAA;AACf,IAAA,gBAAA,CAAiB,SAAA,KAAc,QAAA,GAAW,uBAAA,GAA0B,uBAAuB,CAAA;AAC3F,IAAA,aAAA,CAAc,EAAE,CAAA;AAChB,IAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,EACf,CAAA,EAAG,CAAC,QAAA,EAAU,SAAS,CAAC,CAAA;AAGxB,EAAA,MAAM,iBAAA,GAAoB,WAAA;AAAA,IACxB,CAAC,CAAA,KAAwB;AACvB,MAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,MAAA,WAAA,EAAY;AAAA,IACd,CAAA;AAAA,IACA,CAAC,WAAW;AAAA,GACd;AAEA,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,uBACE,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oHAAA,EAAqH,QAAA,EAAA,2CAAA,EAErI,CAAA;AAAA,EAEJ;AAEA,EAAA,MAAM,SAAA,GAAY,SAAA,KAAc,QAAA,GAAW,gBAAA,GAAmB,gBAAA;AAC9D,EAAA,MAAM,WAAW,KAAA,IAAS,IAAA;AAE1B,EAAA,uBACE,IAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAY,YAAA,EAAc,OAAA,EACjC,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,cAAA,EAAA,EAAe,SAAO,IAAA,EACrB,QAAA,kBAAA,IAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,IAAA,EAAK,UAAA;AAAA,QACL,eAAA,EAAe,SAAA;AAAA,QACf,eAAA,EAAe,IAAA;AAAA,QACf,SAAA,EAAW,EAAA;AAAA,UACT,+KAAA;AAAA,UACA,WACI,uEAAA,GACA,0EAAA;AAAA,UACJ;AAAA,SACF;AAAA,QAEA,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,UAAK,SAAA,EAAU,UAAA,EACb,QAAA,EAAA,QAAA,GAAW,CAAA,EAAG,KAAK,CAAA,EAAA,EAAK,gBAAA,CAAiB,KAAA,CAAM,QAAA,EAAU,SAAS,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,KAAK,KAAK,KAAA,EAC1F,CAAA;AAAA,UACC,QAAA,mBACC,GAAA,CAAC,CAAA,EAAA,EAAE,SAAA,EAAU,gDAAA,EAAiD,OAAA,EAAS,iBAAA,EAAmB,CAAA,mBAE1F,GAAA,CAACA,WAAA,EAAA,EAAgB,SAAA,EAAU,4BAAA,EAA6B;AAAA;AAAA;AAAA,KAE5D,EACF,CAAA;AAAA,yBAEC,cAAA,EAAA,EAAe,EAAA,EAAI,WAAW,SAAA,EAAU,eAAA,EAAgB,OAAM,OAAA,EAC7D,QAAA,EAAA;AAAA,sBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,8DAAA,EACb,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,+BAAA,EAAiC,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,wBACvD,IAAA,CAAC,UAAO,KAAA,EAAO,aAAA,EAAe,eAAe,CAAC,CAAA,KAAM,gBAAA,CAAiB,CAAmB,CAAA,EACtF,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,aAAA,EAAA,EAAc,SAAA,EAAU,sHAAA,EACvB,QAAA,kBAAA,GAAA,CAAC,eAAY,CAAA,EACf,CAAA;AAAA,8BACC,aAAA,EAAA,EACE,QAAA,EAAA,SAAA,CAAU,GAAA,CAAI,CAAC,uBACd,GAAA,CAAC,UAAA,EAAA,EAA0B,KAAA,EAAO,EAAA,CAAG,OAClC,QAAA,EAAA,EAAA,CAAG,KAAA,EAAA,EADW,EAAA,CAAG,KAEpB,CACD,CAAA,EACH;AAAA,SAAA,EACF;AAAA,OAAA,EACF,CAAA;AAAA,sBACA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EACb,QAAA,EAAA;AAAA,wBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,UAAA,EACb,QAAA,EAAA;AAAA,0BAAA,GAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,MAAA;AAAA,cACL,SAAA,EAAW,SAAA,KAAc,QAAA,GAAW,SAAA,GAAY,MAAA;AAAA,cAChD,OAAA,EAAS,SAAA,KAAc,QAAA,GAAW,oBAAA,GAAuB,MAAA;AAAA,cACzD,WAAA,EAAa,CAAA,MAAA,EAAS,KAAA,CAAM,WAAA,EAAa,CAAA,GAAA,CAAA;AAAA,cACzC,KAAA,EAAO,UAAA;AAAA,cACP,SAAA,EAAW,SAAA,KAAc,QAAA,GAAW,MAAA,GAAS,MAAA;AAAA,cAC7C,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,gBAAA,IAAI,cAAc,QAAA,EAAU;AAC1B,kBAAA,MAAM,QAAA,GAAW,CAAA,CAAE,MAAA,CAAO,KAAA,CAAM,OAAA,CAAQ,YAAY,EAAE,CAAA,CAAE,OAAA,CAAQ,WAAA,EAAa,IAAI,CAAA;AACjF,kBAAA,aAAA,CAAc,QAAQ,CAAA;AAAA,gBACxB,CAAA,MAAO;AACL,kBAAA,aAAA,CAAc,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,gBAC9B;AAAA,cACF,CAAA;AAAA,cACA,SAAA,EAAW,CAAC,CAAA,KAAM;AAChB,gBAAA,IAAI,CAAA,CAAE,QAAQ,OAAA,EAAS;AACrB,kBAAA,CAAA,CAAE,cAAA,EAAe;AACjB,kBAAA,WAAA,EAAY;AACZ,kBAAA;AAAA,gBACF;AACA,gBAAA,IAAI,cAAc,QAAA,EAAU;AAC1B,kBAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,GAAA,IAAO,CAAA,CAAE,QAAQ,GAAA,EAAK;AAClC,oBAAA,CAAA,CAAE,cAAA,EAAe;AACjB,oBAAA;AAAA,kBACF;AACA,kBAAA,IAAI,CAAA,CAAE,QAAQ,SAAA,EAAW;AACvB,oBAAA,CAAA,CAAE,cAAA,EAAe;AACjB,oBAAA,aAAA,CAAc,CAAC,CAAA,KAAM,MAAA,CAAO,KAAK,GAAA,CAAI,CAAA,EAAA,CAAI,OAAO,QAAA,CAAS,MAAA,CAAO,CAAC,CAAC,IAAI,MAAA,CAAO,CAAC,IAAI,CAAA,IAAK,CAAC,CAAC,CAAC,CAAA;AAC1F,oBAAA;AAAA,kBACF;AACA,kBAAA,IAAI,CAAA,CAAE,QAAQ,WAAA,EAAa;AACzB,oBAAA,CAAA,CAAE,cAAA,EAAe;AACjB,oBAAA,aAAA,CAAc,CAAC,CAAA,KAAM,MAAA,CAAO,KAAK,GAAA,CAAI,CAAA,EAAA,CAAI,OAAO,QAAA,CAAS,MAAA,CAAO,CAAC,CAAC,IAAI,MAAA,CAAO,CAAC,IAAI,CAAA,IAAK,CAAC,CAAC,CAAC,CAAA;AAAA,kBAC5F;AAAA,gBACF;AAAA,cACF;AAAA;AAAA,WACF;AAAA,UACC,SAAA,KAAc,4BACb,GAAA,CAAC,KAAA,EAAA,EAAI,WAAU,gDAAA,EACb,QAAA,kBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qFAAA,EACb,QAAA,EAAA;AAAA,4BAAA,GAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,QAAA,EAAU,EAAA;AAAA,gBACV,SAAA,EAAU,qGAAA;AAAA,gBACV,WAAA,EAAa,CAAC,CAAA,KAAM,CAAA,CAAE,cAAA,EAAe;AAAA,gBACrC,OAAA,EAAS,MAAM,aAAA,CAAc,CAAC,MAAM,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,EAAA,CAAI,MAAA,CAAO,SAAS,MAAA,CAAO,CAAC,CAAC,CAAA,GAAI,MAAA,CAAO,CAAC,CAAA,GAAI,CAAA,IAAK,CAAC,CAAC,CAAC,CAAA;AAAA,gBACzG,YAAA,EAAW,gBAAA;AAAA,gBAEX,QAAA,kBAAA,GAAA,CAAC,SAAA,EAAA,EAAU,SAAA,EAAU,UAAA,EAAW;AAAA;AAAA,aAClC;AAAA,4BACA,GAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,QAAA,EAAU,EAAA;AAAA,gBACV,SAAA,EAAU,8EAAA;AAAA,gBACV,WAAA,EAAa,CAAC,CAAA,KAAM,CAAA,CAAE,cAAA,EAAe;AAAA,gBACrC,OAAA,EAAS,MAAM,aAAA,CAAc,CAAC,MAAM,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,EAAA,CAAI,MAAA,CAAO,SAAS,MAAA,CAAO,CAAC,CAAC,CAAA,GAAI,MAAA,CAAO,CAAC,CAAA,GAAI,CAAA,IAAK,CAAC,CAAC,CAAC,CAAA;AAAA,gBACzG,YAAA,EAAW,gBAAA;AAAA,gBAEX,QAAA,kBAAA,GAAA,CAAC,WAAA,EAAA,EAAY,SAAA,EAAU,UAAA,EAAW;AAAA;AAAA;AACpC,WAAA,EACF,CAAA,EACF;AAAA,SAAA,EAEJ,CAAA;AAAA,wBAEA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qCAAA,EACb,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,UAAO,OAAA,EAAQ,OAAA,EAAQ,MAAK,IAAA,EAAK,OAAA,EAAS,aAAa,QAAA,EAAA,OAAA,EAExD,CAAA;AAAA,0BACA,GAAA,CAAC,MAAA,EAAA,EAAO,IAAA,EAAK,IAAA,EAAK,OAAA,EAAS,WAAA,EAAa,QAAA,EAAU,UAAA,CAAW,IAAA,EAAK,KAAM,EAAA,EAAI,QAAA,EAAA,MAAA,EAE5E;AAAA,SAAA,EACF;AAAA,OAAA,EACF;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AAEA,WAAA,CAAY,WAAA,GAAc,aAAA;;;;"}
|
|
1
|
+
{"version":3,"file":"ValueFilter.js","sources":["../lib/components/ValueFilter/ValueFilter.tsx"],"sourcesContent":["import { ChevronDown, ChevronDownIcon, ChevronUp, X } from 'lucide-react';\nimport { useCallback, useEffect, useId, useState } from 'react';\nimport { Input } from '../../../shadcn/shadcnInput';\nimport { Popover, PopoverContent, PopoverTrigger } from '../../../shadcn/shadcnPopover';\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../../../shadcn/shadcnSelect';\nimport { cn } from '../../../shadcn/utils';\nimport type { FilterCondition, FilterOperator, NumberOperator, StringOperator } from '../../types/table-filter';\nimport { Button } from '../Button';\n\nexport interface ValueFilterProps {\n name: string;\n label: string;\n fieldType: 'string' | 'number';\n value?: FilterCondition | null;\n onChange?: (value: FilterCondition | null | undefined) => void;\n className?: string;\n}\n\ninterface OperatorOption {\n value: FilterOperator;\n label: string;\n}\n\nconst STRING_OPERATORS: OperatorOption[] = [\n { value: 'contains', label: 'contains' },\n { value: 'notContains', label: \"doesn't contain\" },\n { value: 'equals', label: 'equals' },\n { value: 'notEquals', label: 'not equals' },\n];\n\nconst NUMBER_OPERATORS: OperatorOption[] = [\n { value: 'equals', label: '=' },\n { value: 'notEquals', label: '\\u2260' },\n { value: 'gt', label: '>' },\n { value: 'gte', label: '\\u2265' },\n { value: 'lt', label: '<' },\n { value: 'lte', label: '\\u2264' },\n];\n\nconst DEFAULT_STRING_OPERATOR: StringOperator = 'contains';\nconst DEFAULT_NUMBER_OPERATOR: NumberOperator = 'equals';\n\n// Resolves the display label for an operator given the field type\nfunction getOperatorLabel(operator: FilterOperator, fieldType: 'string' | 'number'): string {\n const options = fieldType === 'string' ? STRING_OPERATORS : NUMBER_OPERATORS;\n return options.find((o) => o.value === operator)?.label ?? operator;\n}\n\n// Compact filter chip with operator/value popover for building filter conditions\nexport const ValueFilter: React.FC<ValueFilterProps> = ({ name, label, fieldType, value, onChange, className }) => {\n const popoverId = useId();\n const [open, setOpen] = useState(false);\n const [draftOperator, setDraftOperator] = useState<FilterOperator>(\n value?.operator ?? (fieldType === 'string' ? DEFAULT_STRING_OPERATOR : DEFAULT_NUMBER_OPERATOR),\n );\n const [draftValue, setDraftValue] = useState<string>(value?.value !== undefined ? String(value.value) : '');\n\n // Sync draft state when the external value changes while popover is closed\n useEffect(() => {\n if (!open) {\n setDraftOperator(value?.operator ?? (fieldType === 'string' ? DEFAULT_STRING_OPERATOR : DEFAULT_NUMBER_OPERATOR));\n setDraftValue(value?.value !== undefined ? String(value.value) : '');\n }\n }, [value, fieldType, open]);\n\n // Commits the draft filter condition to the parent\n const handleApply = useCallback(() => {\n if (draftValue.trim() === '') return;\n\n const parsedValue = fieldType === 'number' ? Number(draftValue) : draftValue;\n if (fieldType === 'number' && Number.isNaN(parsedValue)) return;\n\n onChange?.({ field: name, operator: draftOperator, value: parsedValue });\n setOpen(false);\n }, [draftValue, draftOperator, name, fieldType, onChange]);\n\n // Clears the filter condition\n const handleClear = useCallback(() => {\n onChange?.(null);\n setDraftOperator(fieldType === 'string' ? DEFAULT_STRING_OPERATOR : DEFAULT_NUMBER_OPERATOR);\n setDraftValue('');\n setOpen(false);\n }, [onChange, fieldType]);\n\n // Clears inline from the chip without opening the popover\n const handleInlineClear = useCallback(\n (e: React.MouseEvent) => {\n e.stopPropagation();\n handleClear();\n },\n [handleClear],\n );\n\n if (!name) {\n return (\n <span className=\"inline-flex items-center rounded-md border border-destructive bg-destructive/10 px-3 py-2 text-xs text-destructive\">\n ValueFilter: missing required `name` prop\n </span>\n );\n }\n\n const operators = fieldType === 'string' ? STRING_OPERATORS : NUMBER_OPERATORS;\n const hasValue = value != null;\n\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n role=\"combobox\"\n aria-controls={popoverId}\n aria-expanded={open}\n className={cn(\n 'inline-flex items-center gap-2 rounded-md border px-3 py-2 text-sm whitespace-nowrap shadow-xs outline-none transition-colors disabled:cursor-not-allowed disabled:opacity-50',\n hasValue\n ? 'bg-primary text-primary-foreground border-primary hover:bg-primary/90'\n : 'border-input bg-transparent hover:bg-accent hover:text-accent-foreground',\n className,\n )}\n >\n <span className=\"truncate\">\n {hasValue ? `${label}: ${getOperatorLabel(value.operator, fieldType)} ${value.value}` : label}\n </span>\n {hasValue ? (\n <X className=\"size-3.5 shrink-0 opacity-70 hover:opacity-100\" onClick={handleInlineClear} />\n ) : (\n <ChevronDownIcon className=\"size-4 shrink-0 opacity-50\" />\n )}\n </button>\n </PopoverTrigger>\n\n <PopoverContent id={popoverId} className=\"w-[280px] p-0\" align=\"start\">\n <div className=\"flex items-center gap-1.5 border-b bg-muted/30 px-3 h-[42px]\">\n <span className=\"text-sm text-muted-foreground\">{label}</span>\n <Select value={draftOperator} onValueChange={(v) => setDraftOperator(v as FilterOperator)}>\n <SelectTrigger className=\"h-auto w-auto gap-1 border-0 bg-transparent p-0 shadow-none text-sm font-medium text-foreground focus-visible:ring-0\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {operators.map((op) => (\n <SelectItem key={op.value} value={op.value}>\n {op.label}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </div>\n <div className=\"space-y-3 px-4 py-4\">\n <div className=\"relative\">\n <Input\n type=\"text\"\n inputMode={fieldType === 'number' ? 'decimal' : undefined}\n pattern={fieldType === 'number' ? '^[0-9]*\\\\.?[0-9]*$' : undefined}\n placeholder={`Enter ${label.toLowerCase()}...`}\n value={draftValue}\n className={fieldType === 'number' ? 'pr-8' : undefined}\n onChange={(e) => {\n if (fieldType === 'number') {\n const filtered = e.target.value.replace(/[^0-9.]/g, '').replace(/(\\..*)\\./g, '$1');\n setDraftValue(filtered);\n } else {\n setDraftValue(e.target.value);\n }\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n handleApply();\n return;\n }\n if (fieldType === 'number') {\n if (e.key === '-' || e.key === 'e') {\n e.preventDefault();\n return;\n }\n if (e.key === 'ArrowUp') {\n e.preventDefault();\n setDraftValue((v) => String(Math.max(0, (Number.isFinite(Number(v)) ? Number(v) : 0) + 1)));\n return;\n }\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n setDraftValue((v) => String(Math.max(0, (Number.isFinite(Number(v)) ? Number(v) : 0) - 1)));\n }\n }\n }}\n />\n {fieldType === 'number' && (\n <div className=\"absolute inset-y-0 right-1.5 flex items-center\">\n <div className=\"flex h-7 w-4 flex-col overflow-hidden rounded-sm border border-border bg-background\">\n <button\n type=\"button\"\n tabIndex={-1}\n className=\"flex h-1/2 items-center justify-center border-b border-border text-muted-foreground hover:bg-accent\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={() =>\n setDraftValue((v) => String(Math.max(0, (Number.isFinite(Number(v)) ? Number(v) : 0) + 1)))\n }\n aria-label=\"Increase value\"\n >\n <ChevronUp className=\"size-2.5\" />\n </button>\n <button\n type=\"button\"\n tabIndex={-1}\n className=\"flex h-1/2 items-center justify-center text-muted-foreground hover:bg-accent\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={() =>\n setDraftValue((v) => String(Math.max(0, (Number.isFinite(Number(v)) ? Number(v) : 0) - 1)))\n }\n aria-label=\"Decrease value\"\n >\n <ChevronDown className=\"size-2.5\" />\n </button>\n </div>\n </div>\n )}\n </div>\n\n <div className=\"flex items-center justify-end gap-2\">\n <Button variant=\"ghost\" size=\"sm\" onClick={handleClear}>\n Clear\n </Button>\n <Button size=\"sm\" onClick={handleApply} disabled={draftValue.trim() === ''}>\n Save\n </Button>\n </div>\n </div>\n </PopoverContent>\n </Popover>\n );\n};\n\nValueFilter.displayName = 'ValueFilter';\n"],"names":["ChevronDownIcon"],"mappings":";;;;;;;;;;;AAuBA,MAAM,gBAAA,GAAqC;AAAA,EACzC,EAAE,KAAA,EAAO,UAAA,EAAY,KAAA,EAAO,UAAA,EAAW;AAAA,EACvC,EAAE,KAAA,EAAO,aAAA,EAAe,KAAA,EAAO,iBAAA,EAAkB;AAAA,EACjD,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,QAAA,EAAS;AAAA,EACnC,EAAE,KAAA,EAAO,WAAA,EAAa,KAAA,EAAO,YAAA;AAC/B,CAAA;AAEA,MAAM,gBAAA,GAAqC;AAAA,EACzC,EAAE,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,GAAA,EAAI;AAAA,EAC9B,EAAE,KAAA,EAAO,WAAA,EAAa,KAAA,EAAO,GAAA,EAAS;AAAA,EACtC,EAAE,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,GAAA,EAAI;AAAA,EAC1B,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,GAAA,EAAS;AAAA,EAChC,EAAE,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,GAAA,EAAI;AAAA,EAC1B,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,GAAA;AACzB,CAAA;AAEA,MAAM,uBAAA,GAA0C,UAAA;AAChD,MAAM,uBAAA,GAA0C,QAAA;AAGhD,SAAS,gBAAA,CAAiB,UAA0B,SAAA,EAAwC;AAC1F,EAAA,MAAM,OAAA,GAAU,SAAA,KAAc,QAAA,GAAW,gBAAA,GAAmB,gBAAA;AAC5D,EAAA,OAAO,OAAA,CAAQ,KAAK,CAAC,CAAA,KAAM,EAAE,KAAA,KAAU,QAAQ,GAAG,KAAA,IAAS,QAAA;AAC7D;AAGO,MAAM,WAAA,GAA0C,CAAC,EAAE,IAAA,EAAM,OAAO,SAAA,EAAW,KAAA,EAAO,QAAA,EAAU,SAAA,EAAU,KAAM;AACjH,EAAA,MAAM,YAAY,KAAA,EAAM;AACxB,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,CAAA,GAAI,SAAS,KAAK,CAAA;AACtC,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAI,QAAA;AAAA,IACxC,KAAA,EAAO,QAAA,KAAa,SAAA,KAAc,QAAA,GAAW,uBAAA,GAA0B,uBAAA;AAAA,GACzE;AACA,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,QAAA,CAAiB,KAAA,EAAO,KAAA,KAAU,MAAA,GAAY,MAAA,CAAO,KAAA,CAAM,KAAK,CAAA,GAAI,EAAE,CAAA;AAG1G,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,IAAA,EAAM;AACT,MAAA,gBAAA,CAAiB,KAAA,EAAO,QAAA,KAAa,SAAA,KAAc,QAAA,GAAW,0BAA0B,uBAAA,CAAwB,CAAA;AAChH,MAAA,aAAA,CAAc,OAAO,KAAA,KAAU,MAAA,GAAY,OAAO,KAAA,CAAM,KAAK,IAAI,EAAE,CAAA;AAAA,IACrE;AAAA,EACF,CAAA,EAAG,CAAC,KAAA,EAAO,SAAA,EAAW,IAAI,CAAC,CAAA;AAG3B,EAAA,MAAM,WAAA,GAAc,YAAY,MAAM;AACpC,IAAA,IAAI,UAAA,CAAW,IAAA,EAAK,KAAM,EAAA,EAAI;AAE9B,IAAA,MAAM,WAAA,GAAc,SAAA,KAAc,QAAA,GAAW,MAAA,CAAO,UAAU,CAAA,GAAI,UAAA;AAClE,IAAA,IAAI,SAAA,KAAc,QAAA,IAAY,MAAA,CAAO,KAAA,CAAM,WAAW,CAAA,EAAG;AAEzD,IAAA,QAAA,GAAW,EAAE,KAAA,EAAO,IAAA,EAAM,UAAU,aAAA,EAAe,KAAA,EAAO,aAAa,CAAA;AACvE,IAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,EACf,GAAG,CAAC,UAAA,EAAY,eAAe,IAAA,EAAM,SAAA,EAAW,QAAQ,CAAC,CAAA;AAGzD,EAAA,MAAM,WAAA,GAAc,YAAY,MAAM;AACpC,IAAA,QAAA,GAAW,IAAI,CAAA;AACf,IAAA,gBAAA,CAAiB,SAAA,KAAc,QAAA,GAAW,uBAAA,GAA0B,uBAAuB,CAAA;AAC3F,IAAA,aAAA,CAAc,EAAE,CAAA;AAChB,IAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,EACf,CAAA,EAAG,CAAC,QAAA,EAAU,SAAS,CAAC,CAAA;AAGxB,EAAA,MAAM,iBAAA,GAAoB,WAAA;AAAA,IACxB,CAAC,CAAA,KAAwB;AACvB,MAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,MAAA,WAAA,EAAY;AAAA,IACd,CAAA;AAAA,IACA,CAAC,WAAW;AAAA,GACd;AAEA,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,uBACE,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,oHAAA,EAAqH,QAAA,EAAA,2CAAA,EAErI,CAAA;AAAA,EAEJ;AAEA,EAAA,MAAM,SAAA,GAAY,SAAA,KAAc,QAAA,GAAW,gBAAA,GAAmB,gBAAA;AAC9D,EAAA,MAAM,WAAW,KAAA,IAAS,IAAA;AAE1B,EAAA,uBACE,IAAA,CAAC,OAAA,EAAA,EAAQ,IAAA,EAAY,YAAA,EAAc,OAAA,EACjC,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,cAAA,EAAA,EAAe,SAAO,IAAA,EACrB,QAAA,kBAAA,IAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,IAAA,EAAK,UAAA;AAAA,QACL,eAAA,EAAe,SAAA;AAAA,QACf,eAAA,EAAe,IAAA;AAAA,QACf,SAAA,EAAW,EAAA;AAAA,UACT,+KAAA;AAAA,UACA,WACI,uEAAA,GACA,0EAAA;AAAA,UACJ;AAAA,SACF;AAAA,QAEA,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,UAAK,SAAA,EAAU,UAAA,EACb,QAAA,EAAA,QAAA,GAAW,CAAA,EAAG,KAAK,CAAA,EAAA,EAAK,gBAAA,CAAiB,KAAA,CAAM,QAAA,EAAU,SAAS,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,KAAK,KAAK,KAAA,EAC1F,CAAA;AAAA,UACC,QAAA,mBACC,GAAA,CAAC,CAAA,EAAA,EAAE,SAAA,EAAU,gDAAA,EAAiD,OAAA,EAAS,iBAAA,EAAmB,CAAA,mBAE1F,GAAA,CAACA,WAAA,EAAA,EAAgB,SAAA,EAAU,4BAAA,EAA6B;AAAA;AAAA;AAAA,KAE5D,EACF,CAAA;AAAA,yBAEC,cAAA,EAAA,EAAe,EAAA,EAAI,WAAW,SAAA,EAAU,eAAA,EAAgB,OAAM,OAAA,EAC7D,QAAA,EAAA;AAAA,sBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,8DAAA,EACb,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,+BAAA,EAAiC,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,wBACvD,IAAA,CAAC,UAAO,KAAA,EAAO,aAAA,EAAe,eAAe,CAAC,CAAA,KAAM,gBAAA,CAAiB,CAAmB,CAAA,EACtF,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,aAAA,EAAA,EAAc,SAAA,EAAU,sHAAA,EACvB,QAAA,kBAAA,GAAA,CAAC,eAAY,CAAA,EACf,CAAA;AAAA,8BACC,aAAA,EAAA,EACE,QAAA,EAAA,SAAA,CAAU,GAAA,CAAI,CAAC,uBACd,GAAA,CAAC,UAAA,EAAA,EAA0B,KAAA,EAAO,EAAA,CAAG,OAClC,QAAA,EAAA,EAAA,CAAG,KAAA,EAAA,EADW,EAAA,CAAG,KAEpB,CACD,CAAA,EACH;AAAA,SAAA,EACF;AAAA,OAAA,EACF,CAAA;AAAA,sBACA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qBAAA,EACb,QAAA,EAAA;AAAA,wBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,UAAA,EACb,QAAA,EAAA;AAAA,0BAAA,GAAA;AAAA,YAAC,KAAA;AAAA,YAAA;AAAA,cACC,IAAA,EAAK,MAAA;AAAA,cACL,SAAA,EAAW,SAAA,KAAc,QAAA,GAAW,SAAA,GAAY,MAAA;AAAA,cAChD,OAAA,EAAS,SAAA,KAAc,QAAA,GAAW,oBAAA,GAAuB,MAAA;AAAA,cACzD,WAAA,EAAa,CAAA,MAAA,EAAS,KAAA,CAAM,WAAA,EAAa,CAAA,GAAA,CAAA;AAAA,cACzC,KAAA,EAAO,UAAA;AAAA,cACP,SAAA,EAAW,SAAA,KAAc,QAAA,GAAW,MAAA,GAAS,MAAA;AAAA,cAC7C,QAAA,EAAU,CAAC,CAAA,KAAM;AACf,gBAAA,IAAI,cAAc,QAAA,EAAU;AAC1B,kBAAA,MAAM,QAAA,GAAW,CAAA,CAAE,MAAA,CAAO,KAAA,CAAM,OAAA,CAAQ,YAAY,EAAE,CAAA,CAAE,OAAA,CAAQ,WAAA,EAAa,IAAI,CAAA;AACjF,kBAAA,aAAA,CAAc,QAAQ,CAAA;AAAA,gBACxB,CAAA,MAAO;AACL,kBAAA,aAAA,CAAc,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,gBAC9B;AAAA,cACF,CAAA;AAAA,cACA,SAAA,EAAW,CAAC,CAAA,KAAM;AAChB,gBAAA,IAAI,CAAA,CAAE,QAAQ,OAAA,EAAS;AACrB,kBAAA,CAAA,CAAE,cAAA,EAAe;AACjB,kBAAA,WAAA,EAAY;AACZ,kBAAA;AAAA,gBACF;AACA,gBAAA,IAAI,cAAc,QAAA,EAAU;AAC1B,kBAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,GAAA,IAAO,CAAA,CAAE,QAAQ,GAAA,EAAK;AAClC,oBAAA,CAAA,CAAE,cAAA,EAAe;AACjB,oBAAA;AAAA,kBACF;AACA,kBAAA,IAAI,CAAA,CAAE,QAAQ,SAAA,EAAW;AACvB,oBAAA,CAAA,CAAE,cAAA,EAAe;AACjB,oBAAA,aAAA,CAAc,CAAC,CAAA,KAAM,MAAA,CAAO,KAAK,GAAA,CAAI,CAAA,EAAA,CAAI,OAAO,QAAA,CAAS,MAAA,CAAO,CAAC,CAAC,IAAI,MAAA,CAAO,CAAC,IAAI,CAAA,IAAK,CAAC,CAAC,CAAC,CAAA;AAC1F,oBAAA;AAAA,kBACF;AACA,kBAAA,IAAI,CAAA,CAAE,QAAQ,WAAA,EAAa;AACzB,oBAAA,CAAA,CAAE,cAAA,EAAe;AACjB,oBAAA,aAAA,CAAc,CAAC,CAAA,KAAM,MAAA,CAAO,KAAK,GAAA,CAAI,CAAA,EAAA,CAAI,OAAO,QAAA,CAAS,MAAA,CAAO,CAAC,CAAC,IAAI,MAAA,CAAO,CAAC,IAAI,CAAA,IAAK,CAAC,CAAC,CAAC,CAAA;AAAA,kBAC5F;AAAA,gBACF;AAAA,cACF;AAAA;AAAA,WACF;AAAA,UACC,SAAA,KAAc,4BACb,GAAA,CAAC,KAAA,EAAA,EAAI,WAAU,gDAAA,EACb,QAAA,kBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qFAAA,EACb,QAAA,EAAA;AAAA,4BAAA,GAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,QAAA,EAAU,EAAA;AAAA,gBACV,SAAA,EAAU,qGAAA;AAAA,gBACV,WAAA,EAAa,CAAC,CAAA,KAAM,CAAA,CAAE,cAAA,EAAe;AAAA,gBACrC,OAAA,EAAS,MACP,aAAA,CAAc,CAAC,MAAM,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,EAAA,CAAI,MAAA,CAAO,SAAS,MAAA,CAAO,CAAC,CAAC,CAAA,GAAI,MAAA,CAAO,CAAC,CAAA,GAAI,CAAA,IAAK,CAAC,CAAC,CAAC,CAAA;AAAA,gBAE5F,YAAA,EAAW,gBAAA;AAAA,gBAEX,QAAA,kBAAA,GAAA,CAAC,SAAA,EAAA,EAAU,SAAA,EAAU,UAAA,EAAW;AAAA;AAAA,aAClC;AAAA,4BACA,GAAA;AAAA,cAAC,QAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,QAAA,EAAU,EAAA;AAAA,gBACV,SAAA,EAAU,8EAAA;AAAA,gBACV,WAAA,EAAa,CAAC,CAAA,KAAM,CAAA,CAAE,cAAA,EAAe;AAAA,gBACrC,OAAA,EAAS,MACP,aAAA,CAAc,CAAC,MAAM,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,EAAA,CAAI,MAAA,CAAO,SAAS,MAAA,CAAO,CAAC,CAAC,CAAA,GAAI,MAAA,CAAO,CAAC,CAAA,GAAI,CAAA,IAAK,CAAC,CAAC,CAAC,CAAA;AAAA,gBAE5F,YAAA,EAAW,gBAAA;AAAA,gBAEX,QAAA,kBAAA,GAAA,CAAC,WAAA,EAAA,EAAY,SAAA,EAAU,UAAA,EAAW;AAAA;AAAA;AACpC,WAAA,EACF,CAAA,EACF;AAAA,SAAA,EAEJ,CAAA;AAAA,wBAEA,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,qCAAA,EACb,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,UAAO,OAAA,EAAQ,OAAA,EAAQ,MAAK,IAAA,EAAK,OAAA,EAAS,aAAa,QAAA,EAAA,OAAA,EAExD,CAAA;AAAA,0BACA,GAAA,CAAC,MAAA,EAAA,EAAO,IAAA,EAAK,IAAA,EAAK,OAAA,EAAS,WAAA,EAAa,QAAA,EAAU,UAAA,CAAW,IAAA,EAAK,KAAM,EAAA,EAAI,QAAA,EAAA,MAAA,EAE5E;AAAA,SAAA,EACF;AAAA,OAAA,EACF;AAAA,KAAA,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;AAEA,WAAA,CAAY,WAAA,GAAc,aAAA;;;;"}
|
package/dist/ViewTabs.js
CHANGED
|
@@ -6,27 +6,12 @@ import { D as DropdownMenu } from './DropdownMenu.js';
|
|
|
6
6
|
import { S as Spinner } from './Spinner.js';
|
|
7
7
|
import { C as Check } from './check.js';
|
|
8
8
|
import { X } from './x.js';
|
|
9
|
-
import {
|
|
9
|
+
import { G as Globe } from './globe.js';
|
|
10
10
|
import { L as Lock } from './lock.js';
|
|
11
11
|
import { P as Pencil, T as Trash2, a as Plus } from './trash-2.js';
|
|
12
12
|
import { S as Save, a as Share2 } from './share-2.js';
|
|
13
13
|
import { E as Ellipsis } from './ellipsis.js';
|
|
14
14
|
|
|
15
|
-
/**
|
|
16
|
-
* @license lucide-react v0.562.0 - ISC
|
|
17
|
-
*
|
|
18
|
-
* This source code is licensed under the ISC license.
|
|
19
|
-
* See the LICENSE file in the root directory of this source tree.
|
|
20
|
-
*/
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
const __iconNode = [
|
|
24
|
-
["circle", { cx: "12", cy: "12", r: "10", key: "1mglay" }],
|
|
25
|
-
["path", { d: "M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20", key: "13o1zl" }],
|
|
26
|
-
["path", { d: "M2 12h20", key: "9i4pu4" }]
|
|
27
|
-
];
|
|
28
|
-
const Globe = createLucideIcon("globe", __iconNode);
|
|
29
|
-
|
|
30
15
|
const ViewTabs = ({
|
|
31
16
|
defaultLabel = "All",
|
|
32
17
|
views,
|