@keboola/design 10.1.0 → 11.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +2 -0
- package/dist/AIKit-Dre37SJr.js +1320 -0
- package/dist/AIKit-Dre37SJr.js.map +1 -0
- package/dist/Alert-DfZq9kGe.js +133 -0
- package/dist/Alert-DfZq9kGe.js.map +1 -0
- package/dist/AlertModal-BUC4Es8o.js +222 -0
- package/dist/AlertModal-BUC4Es8o.js.map +1 -0
- package/dist/AppShell-B5GQN6Zs.js +143 -0
- package/dist/AppShell-B5GQN6Zs.js.map +1 -0
- package/dist/AutoSaveTextarea-BeuWuszr.js +58 -0
- package/dist/AutoSaveTextarea-BeuWuszr.js.map +1 -0
- package/dist/Badge-Ch26CXoP.js +195 -0
- package/dist/Badge-Ch26CXoP.js.map +1 -0
- package/dist/BrandEditor-B8o9zdZO.js +903 -0
- package/dist/BrandEditor-B8o9zdZO.js.map +1 -0
- package/dist/BrandLogo-CJkRd0F8.js +46 -0
- package/dist/BrandLogo-CJkRd0F8.js.map +1 -0
- package/dist/Breadcrumb-DJp7WwSv.js +330 -0
- package/dist/Breadcrumb-DJp7WwSv.js.map +1 -0
- package/dist/Button-nzmDNS2q.js +391 -0
- package/dist/Button-nzmDNS2q.js.map +1 -0
- package/dist/Calendar-cG5NIJ4O.js +6768 -0
- package/dist/Calendar-cG5NIJ4O.js.map +1 -0
- package/dist/Card-BAoZ35CV.js +105 -0
- package/dist/Card-BAoZ35CV.js.map +1 -0
- package/dist/Checkbox-GJ8-srt4.js +97 -0
- package/dist/Checkbox-GJ8-srt4.js.map +1 -0
- package/dist/Clipboard-CBJZiviP.js +58 -0
- package/dist/Clipboard-CBJZiviP.js.map +1 -0
- package/dist/ClipboardButton-ez5V3fkk.js +43 -0
- package/dist/ClipboardButton-ez5V3fkk.js.map +1 -0
- package/dist/CodeEditor-BfQJfbhL.js +952 -0
- package/dist/CodeEditor-BfQJfbhL.js.map +1 -0
- package/dist/Collapsible-BQXWEOBC.js +34 -0
- package/dist/Collapsible-BQXWEOBC.js.map +1 -0
- package/dist/ColorInput-Dx8Dsv7Y.js +180 -0
- package/dist/ColorInput-Dx8Dsv7Y.js.map +1 -0
- package/dist/ColorModeSwitch-CCqj7tjE.js +77 -0
- package/dist/ColorModeSwitch-CCqj7tjE.js.map +1 -0
- package/dist/Combobox-c_xBjf0P.js +439 -0
- package/dist/Combobox-c_xBjf0P.js.map +1 -0
- package/dist/Command-CQ_bQsJp.js +102 -0
- package/dist/Command-CQ_bQsJp.js.map +1 -0
- package/dist/CopyField-BJ96zvXs.js +322 -0
- package/dist/CopyField-BJ96zvXs.js.map +1 -0
- package/dist/DateInput-CMD3dY-T.js +141 -0
- package/dist/DateInput-CMD3dY-T.js.map +1 -0
- package/dist/DatePicker-BbFbmsGl.js +24 -0
- package/dist/DatePicker-BbFbmsGl.js.map +1 -0
- package/dist/DateRangeInput-D3BhiKyk.js +139 -0
- package/dist/DateRangeInput-D3BhiKyk.js.map +1 -0
- package/dist/DateRangePicker-BiUgtt_M.js +159 -0
- package/dist/DateRangePicker-BiUgtt_M.js.map +1 -0
- package/dist/DiagramSkeleton-lwBS2YBa.js +11 -0
- package/dist/DiagramSkeleton-lwBS2YBa.js.map +1 -0
- package/dist/DiffView-ppTIzh2h.js +429 -0
- package/dist/DiffView-ppTIzh2h.js.map +1 -0
- package/dist/DropdownMenu-B6ZbYvaM.js +327 -0
- package/dist/DropdownMenu-B6ZbYvaM.js.map +1 -0
- package/dist/FieldBox-D7DYtX_m.js +70 -0
- package/dist/FieldBox-D7DYtX_m.js.map +1 -0
- package/dist/FileUpload-sXRv7JiY.js +2527 -0
- package/dist/FileUpload-sXRv7JiY.js.map +1 -0
- package/dist/Form-BDCef6O9.js +371 -0
- package/dist/Form-BDCef6O9.js.map +1 -0
- package/dist/FormGroup-S9mPNHKH.js +124 -0
- package/dist/FormGroup-S9mPNHKH.js.map +1 -0
- package/dist/FullScreenModal-CJa2VkJ2.js +96 -0
- package/dist/FullScreenModal-CJa2VkJ2.js.map +1 -0
- package/dist/HoverCard-WfDkLK1s.js +31 -0
- package/dist/HoverCard-WfDkLK1s.js.map +1 -0
- package/dist/InputGroup-BJWsI35s.js +292 -0
- package/dist/InputGroup-BJWsI35s.js.map +1 -0
- package/dist/Kbd-CxHAo1oo.js +111 -0
- package/dist/Kbd-CxHAo1oo.js.map +1 -0
- package/dist/MarkedText-Ckbft5mw.js +44 -0
- package/dist/MarkedText-Ckbft5mw.js.map +1 -0
- package/dist/MermaidDiagram-BB06gymm.js +399 -0
- package/dist/MermaidDiagram-BB06gymm.js.map +1 -0
- package/dist/Modal-BA5Wc3sx.js +185 -0
- package/dist/Modal-BA5Wc3sx.js.map +1 -0
- package/dist/ModalTitle-C76ke2eo.js +28 -0
- package/dist/ModalTitle-C76ke2eo.js.map +1 -0
- package/dist/MultiActionButtonGroup-CiBHxsSk.js +33 -0
- package/dist/MultiActionButtonGroup-CiBHxsSk.js.map +1 -0
- package/dist/Navbar-t16usFZQ.js +322 -0
- package/dist/Navbar-t16usFZQ.js.map +1 -0
- package/dist/OtpInput-CbbymqYs.js +93 -0
- package/dist/OtpInput-CbbymqYs.js.map +1 -0
- package/dist/PageHeader-Q3IpCnQd.js +177 -0
- package/dist/PageHeader-Q3IpCnQd.js.map +1 -0
- package/dist/PageLayout-DSVM-ASz.js +176 -0
- package/dist/PageLayout-DSVM-ASz.js.map +1 -0
- package/dist/PageToolbar-0_1OBzaZ.js +153 -0
- package/dist/PageToolbar-0_1OBzaZ.js.map +1 -0
- package/dist/Pagination-CM_Rszz-.js +70 -0
- package/dist/Pagination-CM_Rszz-.js.map +1 -0
- package/dist/Popconfirm-BGe1jLov.js +170 -0
- package/dist/Popconfirm-BGe1jLov.js.map +1 -0
- package/dist/Popover-Ca0V6AD1.js +92 -0
- package/dist/Popover-Ca0V6AD1.js.map +1 -0
- package/dist/RadioGroup-sIveSsNa.js +233 -0
- package/dist/RadioGroup-sIveSsNa.js.map +1 -0
- package/dist/Resizable-D3vYToZH.js +52 -0
- package/dist/Resizable-D3vYToZH.js.map +1 -0
- package/dist/Search-3UiqNZRj.js +184 -0
- package/dist/Search-3UiqNZRj.js.map +1 -0
- package/dist/SearchInput-D2fcOv7E.js +102 -0
- package/dist/SearchInput-D2fcOv7E.js.map +1 -0
- package/dist/SectionNav--7bw2b6u.js +276 -0
- package/dist/SectionNav--7bw2b6u.js.map +1 -0
- package/dist/Select-4YX38G5h.js +181 -0
- package/dist/Select-4YX38G5h.js.map +1 -0
- package/dist/Sheet-BQrX8-h5.js +169 -0
- package/dist/Sheet-BQrX8-h5.js.map +1 -0
- package/dist/Sidebar-ROaR_AqC.js +799 -0
- package/dist/Sidebar-ROaR_AqC.js.map +1 -0
- package/dist/Slider-Da_3mS5v.js +127 -0
- package/dist/Slider-Da_3mS5v.js.map +1 -0
- package/dist/Stepper-C8sm9ZFM.js +325 -0
- package/dist/Stepper-C8sm9ZFM.js.map +1 -0
- package/dist/Switch-CX2A0v50.js +201 -0
- package/dist/Switch-CX2A0v50.js.map +1 -0
- package/dist/Table-CvYuTuNU.js +104 -0
- package/dist/Table-CvYuTuNU.js.map +1 -0
- package/dist/Tabs-EAihyqCt.js +74 -0
- package/dist/Tabs-EAihyqCt.js.map +1 -0
- package/dist/TextInput-BGed-V13.js +110 -0
- package/dist/TextInput-BGed-V13.js.map +1 -0
- package/dist/ThemeProvider-QncUrfJn.js +203 -0
- package/dist/ThemeProvider-QncUrfJn.js.map +1 -0
- package/dist/TimePicker-B_NegL-7.js +98 -0
- package/dist/TimePicker-B_NegL-7.js.map +1 -0
- package/dist/Timeline-6btyJl4D.js +154 -0
- package/dist/Timeline-6btyJl4D.js.map +1 -0
- package/dist/Toast-DQSbs3oA.js +49 -0
- package/dist/Toast-DQSbs3oA.js.map +1 -0
- package/dist/ToggleGroup-Cy_10Mvu.js +47 -0
- package/dist/ToggleGroup-Cy_10Mvu.js.map +1 -0
- package/dist/Workbench-BzE-Vvd9.js +293 -0
- package/dist/Workbench-BzE-Vvd9.js.map +1 -0
- package/dist/ZoomableSvg-DG9PnAm8.js +248 -0
- package/dist/ZoomableSvg-DG9PnAm8.js.map +1 -0
- package/dist/charts.d.ts +124 -111
- package/dist/charts.js +303 -249
- package/dist/charts.js.map +1 -1
- package/dist/classNames-BzrkDnOD.js +9 -0
- package/dist/classNames-BzrkDnOD.js.map +1 -0
- package/dist/constants-D6JcsD4_.d.ts +41 -0
- package/dist/context-KxxeMHbR.js +62 -0
- package/dist/context-KxxeMHbR.js.map +1 -0
- package/dist/editors.d.ts +180 -173
- package/dist/editors.js +747 -420
- package/dist/editors.js.map +1 -1
- package/dist/escapeStringRegexp-8MxP2knR.js +6 -0
- package/dist/escapeStringRegexp-8MxP2knR.js.map +1 -0
- package/dist/icons-Cek151jC.js +640 -0
- package/dist/icons-Cek151jC.js.map +1 -0
- package/dist/icons.d.ts +2 -41
- package/dist/icons.js +2 -4
- package/dist/index-m-kQEWiY.d.ts +54 -0
- package/dist/index.d.ts +6192 -9904
- package/dist/index.js +112 -15803
- package/dist/internal/blocks/AIKit.js +2 -0
- package/dist/internal/blocks/AppShell.js +2 -0
- package/dist/internal/blocks/AutoSaveTextarea.js +2 -0
- package/dist/internal/blocks/BrandEditor.js +2 -0
- package/dist/internal/blocks/ChartPanel.js +46 -0
- package/dist/internal/blocks/ChartPanel.js.map +1 -0
- package/dist/internal/blocks/ClipboardButton.js +2 -0
- package/dist/internal/blocks/ColorInput.js +2 -0
- package/dist/internal/blocks/ColorModeSwitch.js +2 -0
- package/dist/internal/blocks/Command.js +2 -0
- package/dist/internal/blocks/CopyField.js +2 -0
- package/dist/internal/blocks/DashboardHero.js +59 -0
- package/dist/internal/blocks/DashboardHero.js.map +1 -0
- package/dist/internal/blocks/DateInput.js +2 -0
- package/dist/internal/blocks/DateRangeInput.js +2 -0
- package/dist/internal/blocks/EmptyConfigurationActionCard.js +16 -0
- package/dist/internal/blocks/EmptyConfigurationActionCard.js.map +1 -0
- package/dist/internal/blocks/EmptyState.js +142 -0
- package/dist/internal/blocks/EmptyState.js.map +1 -0
- package/dist/internal/blocks/ErrorState.js +179 -0
- package/dist/internal/blocks/ErrorState.js.map +1 -0
- package/dist/internal/blocks/ExportMenu.js +41 -0
- package/dist/internal/blocks/ExportMenu.js.map +1 -0
- package/dist/internal/blocks/Form.js +2 -0
- package/dist/internal/blocks/FormGroup.js +2 -0
- package/dist/internal/blocks/GoogleButton.js +95 -0
- package/dist/internal/blocks/GoogleButton.js.map +1 -0
- package/dist/internal/blocks/MicrosoftButton.js +64 -0
- package/dist/internal/blocks/MicrosoftButton.js.map +1 -0
- package/dist/internal/blocks/MultiActionButtonGroup.js +2 -0
- package/dist/internal/blocks/MultiCombobox.js +188 -0
- package/dist/internal/blocks/MultiCombobox.js.map +1 -0
- package/dist/internal/blocks/NumberInput.js +44 -0
- package/dist/internal/blocks/NumberInput.js.map +1 -0
- package/dist/internal/blocks/OtpInput.js +2 -0
- package/dist/internal/blocks/PageHeader.js +2 -0
- package/dist/internal/blocks/PageLayout.js +2 -0
- package/dist/internal/blocks/PageToolbar.js +2 -0
- package/dist/internal/blocks/PasswordInput.js +97 -0
- package/dist/internal/blocks/PasswordInput.js.map +1 -0
- package/dist/internal/blocks/SearchInput.js +2 -0
- package/dist/internal/blocks/SearchInputWithNavigation.js +65 -0
- package/dist/internal/blocks/SearchInputWithNavigation.js.map +1 -0
- package/dist/internal/blocks/SectionNav.js +2 -0
- package/dist/internal/blocks/SplitButton.js +46 -0
- package/dist/internal/blocks/SplitButton.js.map +1 -0
- package/dist/internal/blocks/StatCard.js +97 -0
- package/dist/internal/blocks/StatCard.js.map +1 -0
- package/dist/internal/blocks/TextInput.js +2 -0
- package/dist/internal/blocks/Textarea.js +32 -0
- package/dist/internal/blocks/Textarea.js.map +1 -0
- package/dist/internal/blocks/TimeInput.js +77 -0
- package/dist/internal/blocks/TimeInput.js.map +1 -0
- package/dist/internal/components/Alert.js +2 -0
- package/dist/internal/components/AlertModal.js +2 -0
- package/dist/internal/components/Avatar.js +53 -0
- package/dist/internal/components/Avatar.js.map +1 -0
- package/dist/internal/components/Badge.js +2 -0
- package/dist/internal/components/BrandLogo.js +2 -0
- package/dist/internal/components/Breadcrumb.js +2 -0
- package/dist/internal/components/Button.js +2 -0
- package/dist/internal/components/ButtonGroup.js +66 -0
- package/dist/internal/components/ButtonGroup.js.map +1 -0
- package/dist/internal/components/Calendar.js +2 -0
- package/dist/internal/components/Card.js +2 -0
- package/dist/internal/components/Checkbox.js +2 -0
- package/dist/internal/components/Clipboard.js +2 -0
- package/dist/internal/components/Collapsible.js +2 -0
- package/dist/internal/components/CollapsiblePanel.js +87 -0
- package/dist/internal/components/CollapsiblePanel.js.map +1 -0
- package/dist/internal/components/Combobox.js +2 -0
- package/dist/internal/components/DatePicker.js +2 -0
- package/dist/internal/components/DateRangePicker.js +2 -0
- package/dist/internal/components/DiffView.js +2 -0
- package/dist/internal/components/DotsLoader.js +18 -0
- package/dist/internal/components/DotsLoader.js.map +1 -0
- package/dist/internal/components/DropdownMenu.js +2 -0
- package/dist/internal/components/EmptySearchContent.js +12 -0
- package/dist/internal/components/EmptySearchContent.js.map +1 -0
- package/dist/internal/components/FileUpload.js +2 -0
- package/dist/internal/components/FullScreenModal.js +2 -0
- package/dist/internal/components/HelpBlock.js +25 -0
- package/dist/internal/components/HelpBlock.js.map +1 -0
- package/dist/internal/components/HoverCard.js +2 -0
- package/dist/internal/components/InputGroup.js +2 -0
- package/dist/internal/components/Kbd.js +2 -0
- package/dist/internal/components/Label.js +39 -0
- package/dist/internal/components/Label.js.map +1 -0
- package/dist/internal/components/Link.js +22 -0
- package/dist/internal/components/Link.js.map +1 -0
- package/dist/internal/components/MarkedText.js +2 -0
- package/dist/internal/components/MergeEditor/ConflictStatus/ConflictStatusIndicator.js +20 -0
- package/dist/internal/components/MergeEditor/ConflictStatus/ConflictStatusIndicator.js.map +1 -0
- package/dist/internal/components/MergeEditor/PaneHeader.js +13 -0
- package/dist/internal/components/MergeEditor/PaneHeader.js.map +1 -0
- package/dist/internal/components/MergeEditor/constants.js +18 -0
- package/dist/internal/components/MergeEditor/constants.js.map +1 -0
- package/dist/internal/components/MergeEditor/useMergeDiff.js +2 -0
- package/dist/internal/components/Modal.js +2 -0
- package/dist/internal/components/Navbar.js +2 -0
- package/dist/internal/components/Pagination.js +2 -0
- package/dist/internal/components/PanelWithDetails.js +31 -0
- package/dist/internal/components/PanelWithDetails.js.map +1 -0
- package/dist/internal/components/Popconfirm.js +2 -0
- package/dist/internal/components/Popover.js +2 -0
- package/dist/internal/components/Progress.js +47 -0
- package/dist/internal/components/Progress.js.map +1 -0
- package/dist/internal/components/RadioGroup.js +2 -0
- package/dist/internal/components/Resizable.js +2 -0
- package/dist/internal/components/ScrollArea.js +42 -0
- package/dist/internal/components/ScrollArea.js.map +1 -0
- package/dist/internal/components/Search.js +2 -0
- package/dist/internal/components/Select.js +2 -0
- package/dist/internal/components/Separator.js +84 -0
- package/dist/internal/components/Separator.js.map +1 -0
- package/dist/internal/components/Sheet.js +2 -0
- package/dist/internal/components/Sidebar.js +2 -0
- package/dist/internal/components/Skeleton/Skeleton.js +39 -0
- package/dist/internal/components/Skeleton/Skeleton.js.map +1 -0
- package/dist/internal/components/Skeleton/SkeletonList.js +41 -0
- package/dist/internal/components/Skeleton/SkeletonList.js.map +1 -0
- package/dist/internal/components/Slider.js +2 -0
- package/dist/internal/components/SpotlightBackdrop.js +132 -0
- package/dist/internal/components/SpotlightBackdrop.js.map +1 -0
- package/dist/internal/components/Stepper.js +2 -0
- package/dist/internal/components/Switch.js +2 -0
- package/dist/internal/components/Table.js +2 -0
- package/dist/internal/components/Tabs.js +2 -0
- package/dist/internal/components/ThemeProvider.js +3 -0
- package/dist/internal/components/TimePicker.js +2 -0
- package/dist/internal/components/Timeline.js +2 -0
- package/dist/internal/components/Toast.js +3 -0
- package/dist/internal/components/Toggle.js +169 -0
- package/dist/internal/components/Toggle.js.map +1 -0
- package/dist/internal/components/ToggleGroup.js +2 -0
- package/dist/internal/components/Tooltip.js +2 -0
- package/dist/internal/components/Truncated.js +45 -0
- package/dist/internal/components/Truncated.js.map +1 -0
- package/dist/internal/components/Workbench.js +2 -0
- package/dist/internal/components/ZoomableSvg.js +2 -0
- package/dist/internal/hooks/useAutosizeInput.js +77 -0
- package/dist/internal/hooks/useAutosizeInput.js.map +1 -0
- package/dist/internal/hooks/useScrollbarPosition.js +45 -0
- package/dist/internal/hooks/useScrollbarPosition.js.map +1 -0
- package/dist/internal/hooks/useStableCallback.js +29 -0
- package/dist/internal/hooks/useStableCallback.js.map +1 -0
- package/dist/internal/utils/mergeRefs.js +20 -0
- package/dist/internal/utils/mergeRefs.js.map +1 -0
- package/dist/internal/utils.js +5 -0
- package/dist/markdown-editor.d.ts +72 -72
- package/dist/markdown-editor.js +1122 -1193
- package/dist/markdown-editor.js.map +1 -1
- package/dist/mermaid.d.ts +12 -12
- package/dist/mermaid.js +2 -10
- package/dist/rjsf.d.ts +33 -34
- package/dist/rjsf.js +1543 -1600
- package/dist/rjsf.js.map +1 -1
- package/dist/rolldown-runtime-Bdc48AWt.js +33 -0
- package/dist/styles-DSUP_-9Z.js +158 -0
- package/dist/styles-DSUP_-9Z.js.map +1 -0
- package/dist/styles.css +1 -1
- package/dist/testing.d.ts +8 -7
- package/dist/testing.js +36 -16
- package/dist/testing.js.map +1 -1
- package/dist/themeTokens-BNg98Mu9.js +85 -0
- package/dist/themeTokens-BNg98Mu9.js.map +1 -0
- package/dist/toast-CjkURw0M.js +184 -0
- package/dist/toast-CjkURw0M.js.map +1 -0
- package/dist/useColorSchemeState-CYqcUfSH.js +61 -0
- package/dist/useColorSchemeState-CYqcUfSH.js.map +1 -0
- package/dist/useControllableState-M6494mCT.js +31 -0
- package/dist/useControllableState-M6494mCT.js.map +1 -0
- package/dist/useElement-DkF6esWL.js +15 -0
- package/dist/useElement-DkF6esWL.js.map +1 -0
- package/dist/useMergeDiff-CvowEXJ1.js +465 -0
- package/dist/useMergeDiff-CvowEXJ1.js.map +1 -0
- package/dist/utils-D0c5VAyF.js +308 -0
- package/dist/utils-D0c5VAyF.js.map +1 -0
- package/package.json +10 -9
- package/src/styles.css +35 -7
- package/src/theme.css +64 -0
- package/dist/MermaidDiagram-EOKJHQQV.js +0 -10
- package/dist/MermaidDiagram-EOKJHQQV.js.map +0 -1
- package/dist/chunk-63NSN2VL.js +0 -274
- package/dist/chunk-63NSN2VL.js.map +0 -1
- package/dist/chunk-6FPEI4EM.js +0 -6683
- package/dist/chunk-6FPEI4EM.js.map +0 -1
- package/dist/chunk-7PUUHEJQ.js +0 -1313
- package/dist/chunk-7PUUHEJQ.js.map +0 -1
- package/dist/chunk-BOHNXTMM.js +0 -606
- package/dist/chunk-BOHNXTMM.js.map +0 -1
- package/dist/chunk-C3L3TBBT.js +0 -242
- package/dist/chunk-C3L3TBBT.js.map +0 -1
- package/dist/chunk-CTCFYWJC.js +0 -407
- package/dist/chunk-CTCFYWJC.js.map +0 -1
- package/dist/chunk-ESBL3IPF.js +0 -23
- package/dist/chunk-ESBL3IPF.js.map +0 -1
- package/dist/chunk-IJTHFNNJ.js +0 -261
- package/dist/chunk-IJTHFNNJ.js.map +0 -1
- package/dist/chunk-JP7PNHLH.js +0 -40
- package/dist/chunk-JP7PNHLH.js.map +0 -1
- package/dist/chunk-KPNAW5MU.js +0 -229
- package/dist/chunk-KPNAW5MU.js.map +0 -1
- package/dist/chunk-L37JJ6MR.js +0 -152
- package/dist/chunk-L37JJ6MR.js.map +0 -1
- package/dist/chunk-Q7NWXLCT.js +0 -90
- package/dist/chunk-Q7NWXLCT.js.map +0 -1
- package/dist/chunk-SYIEF644.js +0 -1016
- package/dist/chunk-SYIEF644.js.map +0 -1
- package/dist/chunk-VMFSRV5H.js +0 -16
- package/dist/chunk-VMFSRV5H.js.map +0 -1
- package/dist/chunk-VPPM7UUQ.js +0 -47
- package/dist/chunk-VPPM7UUQ.js.map +0 -1
- package/dist/chunk-XV3UUOYF.js +0 -845
- package/dist/chunk-XV3UUOYF.js.map +0 -1
- package/dist/constants-D3gaMY-W.d.ts +0 -39
- package/dist/icons.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/mermaid.js.map +0 -1
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { cn } from "../../classNames-BzrkDnOD.js";
|
|
2
|
+
import { Google, Loader2 } from "../../icons-Cek151jC.js";
|
|
3
|
+
import { cva } from "class-variance-authority";
|
|
4
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
5
|
+
//#region src/blocks/GoogleButton/GoogleButton.tsx
|
|
6
|
+
const LABELS = {
|
|
7
|
+
signin: "Sign in with Google",
|
|
8
|
+
signup: "Sign up with Google",
|
|
9
|
+
continue: "Continue with Google",
|
|
10
|
+
"signin-short": "Sign in"
|
|
11
|
+
};
|
|
12
|
+
const GOOGLE_FONT_STACK = "'Roboto', arial, sans-serif";
|
|
13
|
+
const variants = cva([
|
|
14
|
+
"tailwindcss-preflight",
|
|
15
|
+
"tw:inline-flex",
|
|
16
|
+
"tw:items-center",
|
|
17
|
+
"tw:justify-center",
|
|
18
|
+
"tw:h-10",
|
|
19
|
+
"tw:border",
|
|
20
|
+
"tw:text-sm",
|
|
21
|
+
"tw:font-[500]",
|
|
22
|
+
"tw:leading-none",
|
|
23
|
+
"tw:whitespace-nowrap",
|
|
24
|
+
"tw:select-none",
|
|
25
|
+
"tw:cursor-pointer",
|
|
26
|
+
"tw:transition-shadow",
|
|
27
|
+
"tw:[&_svg]:shrink-0",
|
|
28
|
+
"tw:focus-visible:outline-hidden",
|
|
29
|
+
"tw:focus-visible:ring-2",
|
|
30
|
+
"tw:focus-visible:ring-[#4285f4]/60",
|
|
31
|
+
"tw:disabled:cursor-not-allowed",
|
|
32
|
+
"tw:disabled:opacity-60",
|
|
33
|
+
"tw:[[data-theme=dark]_&]:bg-[#131314]",
|
|
34
|
+
"tw:[[data-theme=dark]_&]:text-[#e3e3e3]",
|
|
35
|
+
"tw:[[data-theme=dark]_&]:border-[#8e918f]",
|
|
36
|
+
"tw:[[data-theme=dark]_&]:hover:not-disabled:bg-[#1e1f20]",
|
|
37
|
+
"tw:[[data-theme=dark]_&]:hover:not-disabled:shadow-none"
|
|
38
|
+
], {
|
|
39
|
+
defaultVariants: {
|
|
40
|
+
variant: "default",
|
|
41
|
+
shape: "rectangular",
|
|
42
|
+
size: "default"
|
|
43
|
+
},
|
|
44
|
+
variants: {
|
|
45
|
+
variant: {
|
|
46
|
+
default: [
|
|
47
|
+
"tw:bg-white",
|
|
48
|
+
"tw:text-[#1f1f1f]",
|
|
49
|
+
"tw:border-[#747775]",
|
|
50
|
+
"tw:hover:not-disabled:bg-[#f7f8f8]",
|
|
51
|
+
"tw:hover:not-disabled:shadow-[0_1px_2px_0_rgba(60,64,67,0.30),0_1px_3px_1px_rgba(60,64,67,0.15)]"
|
|
52
|
+
],
|
|
53
|
+
neutral: [
|
|
54
|
+
"tw:bg-[#f2f2f2]",
|
|
55
|
+
"tw:text-[#1f1f1f]",
|
|
56
|
+
"tw:border-transparent",
|
|
57
|
+
"tw:hover:not-disabled:bg-[#e8eaed]"
|
|
58
|
+
]
|
|
59
|
+
},
|
|
60
|
+
shape: {
|
|
61
|
+
rectangular: ["tw:rounded"],
|
|
62
|
+
circle: ["tw:rounded-full"]
|
|
63
|
+
},
|
|
64
|
+
size: {
|
|
65
|
+
default: ["tw:gap-2.5", "tw:px-3"],
|
|
66
|
+
icon: ["tw:w-10", "tw:p-0"]
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
const GoogleButton = ({ ref, variant = "default", shape = "rectangular", size = "default", label = "signin", isLoading = false, disabled = false, type = "button", className, children, style, ...buttonProps }) => /* @__PURE__ */ jsxs("button", {
|
|
71
|
+
...buttonProps,
|
|
72
|
+
ref,
|
|
73
|
+
type,
|
|
74
|
+
disabled,
|
|
75
|
+
style: {
|
|
76
|
+
...style,
|
|
77
|
+
fontFamily: GOOGLE_FONT_STACK
|
|
78
|
+
},
|
|
79
|
+
className: cn(variants({
|
|
80
|
+
variant,
|
|
81
|
+
shape,
|
|
82
|
+
size
|
|
83
|
+
}), className),
|
|
84
|
+
children: [isLoading ? /* @__PURE__ */ jsx(Loader2, {
|
|
85
|
+
className: "tw:size-5 tw:shrink-0 tw:animate-spin",
|
|
86
|
+
"aria-hidden": "true"
|
|
87
|
+
}) : /* @__PURE__ */ jsx(Google, { className: "tw:size-5" }), /* @__PURE__ */ jsx("span", {
|
|
88
|
+
className: cn({ "tw:sr-only": size === "icon" }),
|
|
89
|
+
children: children ?? LABELS[label]
|
|
90
|
+
})]
|
|
91
|
+
});
|
|
92
|
+
//#endregion
|
|
93
|
+
export { GoogleButton };
|
|
94
|
+
|
|
95
|
+
//# sourceMappingURL=GoogleButton.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GoogleButton.js","names":[],"sources":["../../../src/blocks/GoogleButton/GoogleButton.tsx"],"sourcesContent":["import type { ComponentPropsWithRef } from 'react';\nimport type { VariantProps } from 'class-variance-authority';\nimport { cva } from 'class-variance-authority';\n\nimport { Google, Loader2 } from '../../icons';\nimport { cn } from '../../utils';\n\nconst LABELS = {\n signin: 'Sign in with Google',\n signup: 'Sign up with Google',\n continue: 'Continue with Google',\n 'signin-short': 'Sign in',\n} as const;\n\nconst GOOGLE_FONT_STACK = \"'Roboto', arial, sans-serif\";\n\nconst variants = cva(\n [\n 'tailwindcss-preflight',\n 'tw:inline-flex',\n 'tw:items-center',\n 'tw:justify-center',\n 'tw:h-10',\n 'tw:border',\n 'tw:text-sm',\n // Literal weight (Google spec = 500). The `tw:font-*` scale is brand-overridable\n // (`--font-weight-*`), and this button must stay brand-independent.\n 'tw:font-[500]',\n 'tw:leading-none',\n 'tw:whitespace-nowrap',\n 'tw:select-none',\n 'tw:cursor-pointer',\n 'tw:transition-shadow',\n 'tw:[&_svg]:shrink-0',\n\n // focus — a neutral Google-blue ring, independent of the active brand.\n 'tw:focus-visible:outline-hidden',\n 'tw:focus-visible:ring-2',\n 'tw:focus-visible:ring-[#4285f4]/60',\n\n // disabled\n 'tw:disabled:cursor-not-allowed',\n 'tw:disabled:opacity-60',\n\n // dark treatment — auto-applied under html[data-theme=dark], overriding\n // whichever `variant` is active (the ancestor selector out-specifies the\n // variant's plain color classes).\n 'tw:[[data-theme=dark]_&]:bg-[#131314]',\n 'tw:[[data-theme=dark]_&]:text-[#e3e3e3]',\n 'tw:[[data-theme=dark]_&]:border-[#8e918f]',\n 'tw:[[data-theme=dark]_&]:hover:not-disabled:bg-[#1e1f20]',\n 'tw:[[data-theme=dark]_&]:hover:not-disabled:shadow-none',\n ],\n {\n defaultVariants: {\n variant: 'default',\n shape: 'rectangular',\n size: 'default',\n },\n variants: {\n // Google's approved light-scheme treatments; dark (above) overrides both.\n variant: {\n default: [\n 'tw:bg-white',\n 'tw:text-[#1f1f1f]',\n 'tw:border-[#747775]',\n 'tw:hover:not-disabled:bg-[#f7f8f8]',\n 'tw:hover:not-disabled:shadow-[0_1px_2px_0_rgba(60,64,67,0.30),0_1px_3px_1px_rgba(60,64,67,0.15)]',\n ],\n neutral: [\n 'tw:bg-[#f2f2f2]',\n 'tw:text-[#1f1f1f]',\n 'tw:border-transparent',\n 'tw:hover:not-disabled:bg-[#e8eaed]',\n ],\n },\n shape: {\n rectangular: ['tw:rounded'],\n circle: ['tw:rounded-full'],\n },\n size: {\n default: ['tw:gap-2.5', 'tw:px-3'],\n icon: ['tw:w-10', 'tw:p-0'],\n },\n },\n },\n);\n\ntype Props = ComponentPropsWithRef<'button'> &\n VariantProps<typeof variants> & {\n label?: keyof typeof LABELS;\n isLoading?: boolean;\n };\n\nexport const GoogleButton = ({\n ref,\n variant = 'default',\n shape = 'rectangular',\n size = 'default',\n label = 'signin',\n isLoading = false,\n disabled = false,\n type = 'button',\n className,\n children,\n style,\n ...buttonProps\n}: Props) => (\n <button\n {...buttonProps}\n ref={ref}\n type={type}\n disabled={disabled}\n style={{ ...style, fontFamily: GOOGLE_FONT_STACK }}\n className={cn(variants({ variant, shape, size }), className)}\n >\n {isLoading ? (\n <Loader2 className=\"tw:size-5 tw:shrink-0 tw:animate-spin\" aria-hidden=\"true\" />\n ) : (\n <Google className=\"tw:size-5\" />\n )}\n\n <span\n className={cn({\n 'tw:sr-only': size === 'icon',\n })}\n >\n {children ?? LABELS[label]}\n </span>\n </button>\n);\n"],"mappings":";;;;;AAOA,MAAM,SAAS;CACb,QAAQ;CACR,QAAQ;CACR,UAAU;CACV,gBAAgB;AAClB;AAEA,MAAM,oBAAoB;AAE1B,MAAM,WAAW,IACf;CACE;CACA;CACA;CACA;CACA;CACA;CACA;CAGA;CACA;CACA;CACA;CACA;CACA;CACA;CAGA;CACA;CACA;CAGA;CACA;CAKA;CACA;CACA;CACA;CACA;AACF,GACA;CACE,iBAAiB;EACf,SAAS;EACT,OAAO;EACP,MAAM;CACR;CACA,UAAU;EAER,SAAS;GACP,SAAS;IACP;IACA;IACA;IACA;IACA;GACF;GACA,SAAS;IACP;IACA;IACA;IACA;GACF;EACF;EACA,OAAO;GACL,aAAa,CAAC,YAAY;GAC1B,QAAQ,CAAC,iBAAiB;EAC5B;EACA,MAAM;GACJ,SAAS,CAAC,cAAc,SAAS;GACjC,MAAM,CAAC,WAAW,QAAQ;EAC5B;CACF;AACF,CACF;AAQA,MAAa,gBAAgB,EAC3B,KACA,UAAU,WACV,QAAQ,eACR,OAAO,WACP,QAAQ,UACR,YAAY,OACZ,WAAW,OACX,OAAO,UACP,WACA,UACA,OACA,GAAG,kBAEH,qBAAC,UAAD;CACE,GAAI;CACC;CACC;CACI;CACV,OAAO;EAAE,GAAG;EAAO,YAAY;CAAkB;CACjD,WAAW,GAAG,SAAS;EAAE;EAAS;EAAO;CAAK,CAAC,GAAG,SAAS;CAN7D,UAAA,CAQG,YACC,oBAAC,SAAD;EAAS,WAAU;EAAwC,eAAY;CAAQ,CAAA,IAE/E,oBAAC,QAAD,EAAQ,WAAU,YAAa,CAAA,GAGjC,oBAAC,QAAD;EACE,WAAW,GAAG,EACZ,cAAc,SAAS,OACzB,CAAC;EAEA,UAAA,YAAY,OAAO;CAChB,CAAA,CACA"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { cn } from "../../classNames-BzrkDnOD.js";
|
|
2
|
+
import { Loader2, Microsoft } from "../../icons-Cek151jC.js";
|
|
3
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
4
|
+
//#region src/blocks/MicrosoftButton/MicrosoftButton.tsx
|
|
5
|
+
/** The same Microsoft mark supports these call-to-action wordings. */
|
|
6
|
+
const LABELS = {
|
|
7
|
+
signin: "Sign in with Microsoft",
|
|
8
|
+
signup: "Sign up with Microsoft",
|
|
9
|
+
continue: "Continue with Microsoft"
|
|
10
|
+
};
|
|
11
|
+
/** Microsoft specifies the Segoe UI typeface; fall back gracefully when it isn't loaded. */
|
|
12
|
+
const MICROSOFT_FONT_STACK = "'Segoe UI', 'Helvetica Neue', Arial, sans-serif";
|
|
13
|
+
const CLASSES = [
|
|
14
|
+
"tailwindcss-preflight",
|
|
15
|
+
"tw:inline-flex",
|
|
16
|
+
"tw:items-center",
|
|
17
|
+
"tw:justify-center",
|
|
18
|
+
"tw:gap-3",
|
|
19
|
+
"tw:h-[41px]",
|
|
20
|
+
"tw:px-3",
|
|
21
|
+
"tw:rounded-none",
|
|
22
|
+
"tw:border",
|
|
23
|
+
"tw:text-[15px]",
|
|
24
|
+
"tw:font-[400]",
|
|
25
|
+
"tw:leading-none",
|
|
26
|
+
"tw:whitespace-nowrap",
|
|
27
|
+
"tw:select-none",
|
|
28
|
+
"tw:cursor-pointer",
|
|
29
|
+
"tw:transition-colors",
|
|
30
|
+
"tw:[&_svg]:shrink-0",
|
|
31
|
+
"tw:focus-visible:outline-hidden",
|
|
32
|
+
"tw:focus-visible:ring-2",
|
|
33
|
+
"tw:focus-visible:ring-[#0067b8]/60",
|
|
34
|
+
"tw:disabled:cursor-not-allowed",
|
|
35
|
+
"tw:disabled:opacity-60",
|
|
36
|
+
"tw:bg-white",
|
|
37
|
+
"tw:text-[#5e5e5e]",
|
|
38
|
+
"tw:border-[#8c8c8c]",
|
|
39
|
+
"tw:hover:not-disabled:bg-[#f3f3f3]",
|
|
40
|
+
"tw:[[data-theme=dark]_&]:bg-[#2f2f2f]",
|
|
41
|
+
"tw:[[data-theme=dark]_&]:text-white",
|
|
42
|
+
"tw:[[data-theme=dark]_&]:border-[#2f2f2f]",
|
|
43
|
+
"tw:[[data-theme=dark]_&]:hover:not-disabled:bg-[#3b3b3b]"
|
|
44
|
+
];
|
|
45
|
+
const MicrosoftButton = ({ ref, label = "signin", isLoading = false, disabled = false, type = "button", className, children, style, ...buttonProps }) => /* @__PURE__ */ jsxs("button", {
|
|
46
|
+
...buttonProps,
|
|
47
|
+
ref,
|
|
48
|
+
type,
|
|
49
|
+
disabled: disabled || isLoading,
|
|
50
|
+
"aria-disabled": disabled || isLoading,
|
|
51
|
+
style: {
|
|
52
|
+
fontFamily: MICROSOFT_FONT_STACK,
|
|
53
|
+
...style
|
|
54
|
+
},
|
|
55
|
+
className: cn(CLASSES, className),
|
|
56
|
+
children: [isLoading ? /* @__PURE__ */ jsx(Loader2, {
|
|
57
|
+
className: "tw:size-[21px] tw:shrink-0 tw:animate-spin",
|
|
58
|
+
"aria-hidden": "true"
|
|
59
|
+
}) : /* @__PURE__ */ jsx(Microsoft, { className: "tw:size-[21px]" }), /* @__PURE__ */ jsx("span", { children: children ?? LABELS[label] })]
|
|
60
|
+
});
|
|
61
|
+
//#endregion
|
|
62
|
+
export { MicrosoftButton };
|
|
63
|
+
|
|
64
|
+
//# sourceMappingURL=MicrosoftButton.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MicrosoftButton.js","names":[],"sources":["../../../src/blocks/MicrosoftButton/MicrosoftButton.tsx"],"sourcesContent":["import type { ComponentPropsWithRef } from 'react';\n\nimport { Loader2, Microsoft } from '../../icons';\nimport { cn } from '../../utils';\n\n/** The same Microsoft mark supports these call-to-action wordings. */\nconst LABELS = {\n signin: 'Sign in with Microsoft',\n signup: 'Sign up with Microsoft',\n continue: 'Continue with Microsoft',\n} as const;\n\n/** Microsoft specifies the Segoe UI typeface; fall back gracefully when it isn't loaded. */\nconst MICROSOFT_FONT_STACK = \"'Segoe UI', 'Helvetica Neue', Arial, sans-serif\";\n\nconst CLASSES = [\n 'tailwindcss-preflight',\n 'tw:inline-flex',\n 'tw:items-center',\n 'tw:justify-center',\n 'tw:gap-3',\n 'tw:h-[41px]',\n 'tw:px-3',\n 'tw:rounded-none',\n 'tw:border',\n 'tw:text-[15px]',\n // Literal weight (Microsoft spec = 400). The `tw:font-*` scale is brand-overridable\n // (`--font-weight-*`), and this button must stay brand-independent.\n 'tw:font-[400]',\n 'tw:leading-none',\n 'tw:whitespace-nowrap',\n 'tw:select-none',\n 'tw:cursor-pointer',\n 'tw:transition-colors',\n 'tw:[&_svg]:shrink-0',\n\n // focus — Microsoft's brand blue ring, independent of the active brand.\n 'tw:focus-visible:outline-hidden',\n 'tw:focus-visible:ring-2',\n 'tw:focus-visible:ring-[#0067b8]/60',\n\n // disabled\n 'tw:disabled:cursor-not-allowed',\n 'tw:disabled:opacity-60',\n\n // light treatment — the base.\n 'tw:bg-white',\n 'tw:text-[#5e5e5e]',\n 'tw:border-[#8c8c8c]',\n 'tw:hover:not-disabled:bg-[#f3f3f3]',\n\n // dark treatment — auto-applied under html[data-theme=dark] (the ancestor\n // selector out-specifies the plain light classes above).\n 'tw:[[data-theme=dark]_&]:bg-[#2f2f2f]',\n 'tw:[[data-theme=dark]_&]:text-white',\n 'tw:[[data-theme=dark]_&]:border-[#2f2f2f]',\n 'tw:[[data-theme=dark]_&]:hover:not-disabled:bg-[#3b3b3b]',\n];\n\ntype Props = ComponentPropsWithRef<'button'> & {\n label?: keyof typeof LABELS;\n isLoading?: boolean;\n};\n\nexport const MicrosoftButton = ({\n ref,\n label = 'signin',\n isLoading = false,\n disabled = false,\n type = 'button',\n className,\n children,\n style,\n ...buttonProps\n}: Props) => (\n <button\n {...buttonProps}\n ref={ref}\n type={type}\n disabled={disabled || isLoading}\n aria-disabled={disabled || isLoading}\n style={{ fontFamily: MICROSOFT_FONT_STACK, ...style }}\n className={cn(CLASSES, className)}\n >\n {isLoading ? (\n <Loader2 className=\"tw:size-[21px] tw:shrink-0 tw:animate-spin\" aria-hidden=\"true\" />\n ) : (\n <Microsoft className=\"tw:size-[21px]\" />\n )}\n <span>{children ?? LABELS[label]}</span>\n </button>\n);\n"],"mappings":";;;;;AAMA,MAAM,SAAS;CACb,QAAQ;CACR,QAAQ;CACR,UAAU;AACZ;;AAGA,MAAM,uBAAuB;AAE7B,MAAM,UAAU;CACd;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAGA;CACA;CACA;CACA;CACA;CACA;CACA;CAGA;CACA;CACA;CAGA;CACA;CAGA;CACA;CACA;CACA;CAIA;CACA;CACA;CACA;AACF;AAOA,MAAa,mBAAmB,EAC9B,KACA,QAAQ,UACR,YAAY,OACZ,WAAW,OACX,OAAO,UACP,WACA,UACA,OACA,GAAG,kBAEH,qBAAC,UAAD;CACE,GAAI;CACC;CACC;CACN,UAAU,YAAY;CACtB,iBAAe,YAAY;CAC3B,OAAO;EAAE,YAAY;EAAsB,GAAG;CAAM;CACpD,WAAW,GAAG,SAAS,SAAS;CAPlC,UAAA,CASG,YACC,oBAAC,SAAD;EAAS,WAAU;EAA6C,eAAY;CAAQ,CAAA,IAEpF,oBAAC,WAAD,EAAW,WAAU,iBAAkB,CAAA,GAEzC,oBAAC,QAAD,EAAA,UAAO,YAAY,OAAO,OAAa,CAAA,CACjC"}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import { useArgoDesign } from "../../context-KxxeMHbR.js";
|
|
2
|
+
import { ChevronDown, Plus, X } from "../../icons-Cek151jC.js";
|
|
3
|
+
import { InputGroup } from "../../InputGroup-BJWsI35s.js";
|
|
4
|
+
import { Combobox as Combobox$1, createCreatableItem, defaultGroupToLabel, defaultItemToDisabled, defaultItemToIcon, defaultItemToLabel, defaultQueryToCreateLabel, defaultToCreateValue, isCreatableItem, isGroupItem, isGroupItems, isLabeledItem, toLabel } from "../../Combobox-c_xBjf0P.js";
|
|
5
|
+
import { Fragment, useState } from "react";
|
|
6
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
7
|
+
import { Combobox } from "@base-ui/react/combobox";
|
|
8
|
+
//#region src/blocks/MultiCombobox/MultiCombobox.tsx
|
|
9
|
+
const selectAllItem = {
|
|
10
|
+
value: "__select_all__",
|
|
11
|
+
label: "Select All"
|
|
12
|
+
};
|
|
13
|
+
const isSelectAllItem = (item) => isLabeledItem(item) && item.value === "__select_all__";
|
|
14
|
+
/**
|
|
15
|
+
* Multi-selection combobox with chip display and search. Built on Base UI Combobox.
|
|
16
|
+
*
|
|
17
|
+
* **When to use:** picking several items from a searchable enumerated list (filter by tags, assign labels).
|
|
18
|
+
* Items render as chips above the input; `maxVisible` collapses excess into a `+N more` chip.
|
|
19
|
+
* **When NOT to use:** for single selection use `Combobox`; for short enums without search use `Select`.
|
|
20
|
+
* **Composition:** wrap in `FormGroup` for label + help text, or use `useAppForm` for form integration.
|
|
21
|
+
* Pass `allowSelectAll` for a sticky "Select All" item when the full enum is small. Pass `allowCreate`
|
|
22
|
+
* to let the user add free-form values that are not in `items` (e.g. entering column names by hand).
|
|
23
|
+
*
|
|
24
|
+
* @see RECIPES.md#creatable-multi-combobox — for free-form-plus-enumerated patterns
|
|
25
|
+
* @see RECIPES.md#filter-toolbar — for combining multi-select with other filter chips
|
|
26
|
+
*/
|
|
27
|
+
const MultiCombobox = ({ items: _itemsProp, value: _valueProp, defaultValue, onValueChange, itemToStringLabel, itemToStringValue, disabled, filter: filterProp, inputRef, variant, sizing, focusVariant, state, placeholder, allowClear, id, className, allowSelectAll = false, empty = "No items", indicator, allowCreate, queryToCreateValue, queryToCreateLabel = defaultQueryToCreateLabel, itemToDisabled = defaultItemToDisabled, itemToLabel = defaultItemToLabel, itemToIcon = defaultItemToIcon, groupToLabel = defaultGroupToLabel, itemToChipLabel, itemToChipColor, maxVisible = 3 }) => {
|
|
28
|
+
const itemsProp = _itemsProp ?? [];
|
|
29
|
+
const valueProp = _valueProp ?? [];
|
|
30
|
+
const chipVariant = useArgoDesign() ? "pill" : "default";
|
|
31
|
+
const [inputValue, setInputValue] = useState("");
|
|
32
|
+
const [createdItems, setCreatedItems] = useState([]);
|
|
33
|
+
const query = inputValue.trim();
|
|
34
|
+
const queryLower = query.toLowerCase();
|
|
35
|
+
const baseItems = (() => {
|
|
36
|
+
if (createdItems.length === 0) return itemsProp;
|
|
37
|
+
if (isGroupItems(itemsProp)) return [...itemsProp, { items: createdItems }];
|
|
38
|
+
return [...itemsProp, ...createdItems];
|
|
39
|
+
})();
|
|
40
|
+
const allFlatItems = baseItems.flatMap((item) => isGroupItem(item) ? item.items : item);
|
|
41
|
+
const sampleItem = allFlatItems[0];
|
|
42
|
+
const isAllSelected = allFlatItems.length === (valueProp?.length ?? 0);
|
|
43
|
+
const defaultFilter = Combobox.useFilter({
|
|
44
|
+
multiple: true,
|
|
45
|
+
value: valueProp
|
|
46
|
+
});
|
|
47
|
+
const itemsWithSelectAllItem = (() => {
|
|
48
|
+
if (!allowSelectAll) return baseItems;
|
|
49
|
+
return [selectAllItem, ...baseItems];
|
|
50
|
+
})();
|
|
51
|
+
const itemToString = (item) => itemToStringLabel?.(item) ?? toLabel(item);
|
|
52
|
+
const items = (() => {
|
|
53
|
+
const base = itemsWithSelectAllItem;
|
|
54
|
+
if (!allowCreate || disabled || !query) return base;
|
|
55
|
+
const exactMatch = allFlatItems.some((item) => itemToString(item).toLowerCase() === queryLower);
|
|
56
|
+
const alreadySelected = valueProp.some((item) => itemToString(item).toLowerCase() === queryLower);
|
|
57
|
+
if (exactMatch || alreadySelected) return base;
|
|
58
|
+
const creatable = createCreatableItem(query);
|
|
59
|
+
return isGroupItems(base) ? [...base, { items: [creatable] }] : [...base, creatable];
|
|
60
|
+
})();
|
|
61
|
+
const filter = (item, query, itemToString) => {
|
|
62
|
+
if (isSelectAllItem(item)) return true;
|
|
63
|
+
if (isCreatableItem(item)) return true;
|
|
64
|
+
if (filterProp) return filterProp(item, query, itemToString);
|
|
65
|
+
return defaultFilter.contains(item, query, itemToString);
|
|
66
|
+
};
|
|
67
|
+
const wrappedItemToStringLabel = !allowCreate ? itemToStringLabel : (item) => isCreatableItem(item) ? item.value : itemToString(item);
|
|
68
|
+
const wrappedItemToStringValue = !allowCreate || !itemToStringValue ? itemToStringValue : (item) => isCreatableItem(item) ? item.value : itemToStringValue(item);
|
|
69
|
+
const value = (() => {
|
|
70
|
+
if (!allowSelectAll) return valueProp;
|
|
71
|
+
return isAllSelected ? [...valueProp, selectAllItem] : valueProp;
|
|
72
|
+
})();
|
|
73
|
+
const handleValueChange = (next, event) => {
|
|
74
|
+
if (!onValueChange) return;
|
|
75
|
+
const created = [];
|
|
76
|
+
const converted = allowCreate ? next.map((item) => {
|
|
77
|
+
if (!isCreatableItem(item)) return item;
|
|
78
|
+
const value = defaultToCreateValue(item.value, sampleItem, queryToCreateValue);
|
|
79
|
+
created.push(value);
|
|
80
|
+
return value;
|
|
81
|
+
}) : next;
|
|
82
|
+
if (allowCreate) {
|
|
83
|
+
if (created.length > 0) setCreatedItems((prev) => [...prev, ...created]);
|
|
84
|
+
setInputValue("");
|
|
85
|
+
}
|
|
86
|
+
const hasSelectAll = converted.some((item) => isSelectAllItem(item));
|
|
87
|
+
onValueChange((() => {
|
|
88
|
+
if (!allowSelectAll) return converted;
|
|
89
|
+
if (!hasSelectAll) return isAllSelected ? [] : converted;
|
|
90
|
+
return isAllSelected ? converted.filter((item) => !isSelectAllItem(item)) : allFlatItems;
|
|
91
|
+
})(), event);
|
|
92
|
+
};
|
|
93
|
+
const renderItem = (item) => {
|
|
94
|
+
return /* @__PURE__ */ jsx(Combobox$1.Item, {
|
|
95
|
+
value: item,
|
|
96
|
+
indicator,
|
|
97
|
+
icon: itemToIcon(item),
|
|
98
|
+
disabled: itemToDisabled(item),
|
|
99
|
+
children: itemToLabel(item)
|
|
100
|
+
});
|
|
101
|
+
};
|
|
102
|
+
return /* @__PURE__ */ jsxs(Combobox$1.Root, {
|
|
103
|
+
multiple: true,
|
|
104
|
+
items,
|
|
105
|
+
value,
|
|
106
|
+
defaultValue,
|
|
107
|
+
filter,
|
|
108
|
+
onValueChange: handleValueChange,
|
|
109
|
+
itemToStringLabel: wrappedItemToStringLabel,
|
|
110
|
+
itemToStringValue: wrappedItemToStringValue,
|
|
111
|
+
disabled,
|
|
112
|
+
inputRef,
|
|
113
|
+
...allowCreate ? {
|
|
114
|
+
inputValue,
|
|
115
|
+
onInputValueChange: (nextValue) => setInputValue(nextValue)
|
|
116
|
+
} : {},
|
|
117
|
+
children: [/* @__PURE__ */ jsx(Combobox.Chips, {
|
|
118
|
+
render: /* @__PURE__ */ jsx(Fragment, {}),
|
|
119
|
+
children: /* @__PURE__ */ jsx(Combobox$1.InputGroup, {
|
|
120
|
+
variant,
|
|
121
|
+
sizing,
|
|
122
|
+
state,
|
|
123
|
+
focusVariant,
|
|
124
|
+
className,
|
|
125
|
+
children: /* @__PURE__ */ jsxs("div", {
|
|
126
|
+
className: "tw:flex tw:min-w-0 tw:flex-1 tw:flex-wrap tw:items-center tw:gap-1.5 tw:px-4 tw:py-1.5",
|
|
127
|
+
children: [/* @__PURE__ */ jsx(Combobox$1.Chips, {
|
|
128
|
+
maxVisible,
|
|
129
|
+
variant: chipVariant,
|
|
130
|
+
itemToChipLabel: itemToChipLabel ?? itemToLabel,
|
|
131
|
+
itemToChipColor
|
|
132
|
+
}), /* @__PURE__ */ jsxs("div", {
|
|
133
|
+
className: "tw:flex tw:flex-1 tw:items-center tw:gap-1",
|
|
134
|
+
children: [
|
|
135
|
+
/* @__PURE__ */ jsx(Combobox$1.Input, {
|
|
136
|
+
id,
|
|
137
|
+
placeholder,
|
|
138
|
+
disabled,
|
|
139
|
+
className: "tw:w-auto tw:min-w-[120px] tw:flex-1"
|
|
140
|
+
}),
|
|
141
|
+
allowClear && /* @__PURE__ */ jsx(InputGroup.Button, {
|
|
142
|
+
asChild: true,
|
|
143
|
+
"aria-label": "Clear",
|
|
144
|
+
disabled,
|
|
145
|
+
children: /* @__PURE__ */ jsx(Combobox.Clear, { children: /* @__PURE__ */ jsx(X, { className: "tw:size-4" }) })
|
|
146
|
+
}),
|
|
147
|
+
/* @__PURE__ */ jsx(InputGroup.Button, {
|
|
148
|
+
disabled,
|
|
149
|
+
asChild: true,
|
|
150
|
+
"aria-label": "Open combobox",
|
|
151
|
+
children: /* @__PURE__ */ jsx(Combobox.Trigger, { children: /* @__PURE__ */ jsx(ChevronDown, { className: "tw:size-4" }) })
|
|
152
|
+
})
|
|
153
|
+
]
|
|
154
|
+
})]
|
|
155
|
+
})
|
|
156
|
+
})
|
|
157
|
+
}), /* @__PURE__ */ jsxs(Combobox$1.Content, { children: [/* @__PURE__ */ jsx(Combobox$1.Empty, { children: empty }), /* @__PURE__ */ jsx(Combobox$1.List, { children: (itemOrGroup) => {
|
|
158
|
+
if (isSelectAllItem(itemOrGroup)) return /* @__PURE__ */ jsx(Combobox$1.Item, {
|
|
159
|
+
value: itemOrGroup,
|
|
160
|
+
indicator: "checkbox",
|
|
161
|
+
children: "Select All"
|
|
162
|
+
});
|
|
163
|
+
if (isCreatableItem(itemOrGroup)) return /* @__PURE__ */ jsx(Combobox$1.Item, {
|
|
164
|
+
value: itemOrGroup,
|
|
165
|
+
icon: /* @__PURE__ */ jsx(Plus, {}),
|
|
166
|
+
children: queryToCreateLabel(itemOrGroup.value)
|
|
167
|
+
});
|
|
168
|
+
if (isGroupItem(itemOrGroup)) {
|
|
169
|
+
const maybeCreatable = itemOrGroup.items[0];
|
|
170
|
+
if (isCreatableItem(maybeCreatable)) return /* @__PURE__ */ jsx(Combobox$1.Item, {
|
|
171
|
+
value: maybeCreatable,
|
|
172
|
+
icon: /* @__PURE__ */ jsx(Plus, {}),
|
|
173
|
+
children: queryToCreateLabel(maybeCreatable.value)
|
|
174
|
+
});
|
|
175
|
+
const groupLabel = groupToLabel(itemOrGroup);
|
|
176
|
+
return /* @__PURE__ */ jsxs(Combobox$1.Group, {
|
|
177
|
+
items: itemOrGroup.items,
|
|
178
|
+
children: [groupLabel && /* @__PURE__ */ jsx(Combobox$1.GroupLabel, { children: groupLabel }), /* @__PURE__ */ jsx(Combobox$1.GroupList, { children: renderItem })]
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
return renderItem(itemOrGroup);
|
|
182
|
+
} })] })]
|
|
183
|
+
});
|
|
184
|
+
};
|
|
185
|
+
//#endregion
|
|
186
|
+
export { MultiCombobox };
|
|
187
|
+
|
|
188
|
+
//# sourceMappingURL=MultiCombobox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MultiCombobox.js","names":["BaseCombobox","Combobox"],"sources":["../../../src/blocks/MultiCombobox/MultiCombobox.tsx"],"sourcesContent":["import { type ComponentProps, Fragment, type ReactNode, useState } from 'react';\nimport { Combobox as BaseCombobox } from '@base-ui/react/combobox';\n\nimport { Combobox } from '../../components/Combobox';\nimport type { Group, LabeledItem } from '../../components/Combobox/types';\nimport {\n createCreatableItem,\n defaultGroupToLabel,\n defaultItemToDisabled,\n defaultItemToIcon,\n defaultItemToLabel,\n defaultQueryToCreateLabel,\n defaultToCreateValue,\n isCreatableItem,\n isGroupItem,\n isGroupItems,\n isLabeledItem,\n toLabel,\n} from '../../components/Combobox/utils';\nimport { InputGroup } from '../../components/InputGroup';\nimport { useArgoDesign } from '../../components/ThemeProvider/context';\nimport { ChevronDown, Plus, X } from '../../icons';\n\ntype ComboboxProps<Value> = BaseCombobox.Root.Props<Value, true>;\ntype ComboboxInputProps = ComponentProps<typeof Combobox.Input>;\ntype ComboboxInputGroupProps = ComponentProps<typeof Combobox.InputGroup>;\ntype ComboboxItemProps = ComponentProps<typeof Combobox.Item>;\ntype ComboboxChipsProps = ComponentProps<typeof Combobox.Chips>;\n\ntype Indicator = NonNullable<ComboboxItemProps['indicator']>;\n\ntype CreatableProps<Value> = {\n allowCreate?: boolean;\n queryToCreateLabel?: (query: string) => ReactNode;\n queryToCreateValue?: (query: string) => Value;\n};\n\n/**\n * Props for `MultiCombobox`. Generic over `Value` (the item shape) and `GroupShape` (optional group wrapper).\n * Use `itemToLabel` / `itemToIcon` / `itemToDisabled` to project custom item shapes; use `filter` to override\n * the default substring matcher. Pass `allowCreate` to let the user add free-form values not in `items`.\n */\ntype Props<Value, GroupShape extends Group<Value> = Group<Value>> = Pick<\n ComboboxInputProps,\n 'placeholder' | 'id'\n> &\n Pick<ComboboxInputGroupProps, 'variant' | 'focusVariant' | 'sizing' | 'state' | 'className'> &\n Pick<\n ComboboxProps<Value>,\n | 'disabled'\n | 'inputRef'\n | 'value'\n | 'defaultValue'\n | 'onValueChange'\n | 'itemToStringLabel'\n | 'itemToStringValue'\n | 'filter'\n > &\n Pick<ComboboxChipsProps, 'itemToChipLabel' | 'itemToChipColor' | 'maxVisible'> &\n CreatableProps<Value> & {\n items?: readonly (Value | GroupShape)[];\n\n // root specific\n allowClear?: boolean;\n allowSelectAll?: boolean;\n empty?: ReactNode;\n indicator?: Indicator;\n\n // item specific\n itemToLabel?: (item: Value) => ReactNode;\n itemToIcon?: (item: Value) => ReactNode;\n itemToDisabled?: (item: Value) => boolean;\n\n // group specific\n groupToLabel?: (group: GroupShape) => ReactNode;\n };\n\nconst selectAllItem: LabeledItem = {\n value: '__select_all__',\n label: 'Select All',\n};\n\nconst isSelectAllItem = <Value,>(item: Value) =>\n isLabeledItem(item) && item.value === '__select_all__';\n\n/**\n * Multi-selection combobox with chip display and search. Built on Base UI Combobox.\n *\n * **When to use:** picking several items from a searchable enumerated list (filter by tags, assign labels).\n * Items render as chips above the input; `maxVisible` collapses excess into a `+N more` chip.\n * **When NOT to use:** for single selection use `Combobox`; for short enums without search use `Select`.\n * **Composition:** wrap in `FormGroup` for label + help text, or use `useAppForm` for form integration.\n * Pass `allowSelectAll` for a sticky \"Select All\" item when the full enum is small. Pass `allowCreate`\n * to let the user add free-form values that are not in `items` (e.g. entering column names by hand).\n *\n * @see RECIPES.md#creatable-multi-combobox — for free-form-plus-enumerated patterns\n * @see RECIPES.md#filter-toolbar — for combining multi-select with other filter chips\n */\nexport const MultiCombobox = <Value, GroupShape extends Group<Value> = Group<Value>>({\n // root props\n items: _itemsProp,\n value: _valueProp,\n defaultValue,\n onValueChange,\n itemToStringLabel,\n itemToStringValue,\n disabled,\n filter: filterProp,\n inputRef,\n\n // input props\n variant,\n sizing,\n focusVariant,\n state,\n placeholder,\n allowClear,\n id,\n className,\n\n // own props\n allowSelectAll = false,\n empty = 'No items',\n indicator,\n\n // creatable\n allowCreate,\n queryToCreateValue,\n queryToCreateLabel = defaultQueryToCreateLabel,\n\n // own item props\n itemToDisabled = defaultItemToDisabled,\n itemToLabel = defaultItemToLabel,\n itemToIcon = defaultItemToIcon,\n groupToLabel = defaultGroupToLabel,\n itemToChipLabel,\n itemToChipColor,\n maxVisible = 3,\n}: Props<Value, GroupShape>) => {\n const itemsProp = _itemsProp ?? [];\n const valueProp = _valueProp ?? [];\n const renderArgo = useArgoDesign();\n const chipVariant = renderArgo ? 'pill' : 'default';\n\n const [inputValue, setInputValue] = useState('');\n const [createdItems, setCreatedItems] = useState<Value[]>([]);\n const query = inputValue.trim();\n const queryLower = query.toLowerCase();\n\n // Created values are appended to `items` so Base UI can keep resolving them (as chips and as\n // list options) once the query clears — otherwise a value that isn't in `items` gets dropped.\n const baseItems = (() => {\n if (createdItems.length === 0) return itemsProp;\n if (isGroupItems(itemsProp))\n return [...itemsProp, { items: createdItems } as unknown as GroupShape];\n return [...itemsProp, ...createdItems];\n })();\n\n const allFlatItems = baseItems.flatMap((item) => (isGroupItem(item) ? item.items : item));\n const sampleItem = allFlatItems[0] as Value | undefined;\n const isAllSelected = allFlatItems.length === (valueProp?.length ?? 0);\n\n const defaultFilter = BaseCombobox.useFilter({\n multiple: true,\n value: valueProp,\n });\n\n const itemsWithSelectAllItem = (() => {\n if (!allowSelectAll) return baseItems;\n return [selectAllItem, ...baseItems];\n })();\n\n const itemToString = (item: Value) => itemToStringLabel?.(item) ?? toLabel(item);\n\n const items = (() => {\n const base = itemsWithSelectAllItem;\n if (!allowCreate || disabled || !query) return base;\n\n const exactMatch = allFlatItems.some((item) => itemToString(item).toLowerCase() === queryLower);\n const alreadySelected = valueProp.some(\n (item) => itemToString(item).toLowerCase() === queryLower,\n );\n if (exactMatch || alreadySelected) return base;\n\n const creatable = createCreatableItem(query);\n return isGroupItems(base)\n ? [...base, { items: [creatable] } as unknown as GroupShape]\n : [...base, creatable as unknown as Value];\n })();\n\n const filter = (item: Value, query: string, itemToString?: (value: Value) => string) => {\n // keep select always visible\n if (isSelectAllItem(item)) return true;\n // always offer the transient \"create\" option\n if (isCreatableItem(item)) return true;\n\n if (filterProp) return filterProp(item, query, itemToString);\n return defaultFilter.contains(item, query, itemToString);\n };\n\n const wrappedItemToStringLabel: ComboboxProps<Value>['itemToStringLabel'] = !allowCreate\n ? itemToStringLabel\n : (item) => (isCreatableItem(item) ? item.value : itemToString(item));\n\n const wrappedItemToStringValue: ComboboxProps<Value>['itemToStringValue'] =\n !allowCreate || !itemToStringValue\n ? itemToStringValue\n : (item) => (isCreatableItem(item) ? item.value : itemToStringValue(item));\n\n const value = (() => {\n if (!allowSelectAll) return valueProp;\n return isAllSelected ? [...valueProp, selectAllItem as Value] : valueProp;\n })();\n\n const handleValueChange: ComboboxProps<Value>['onValueChange'] = (next, event) => {\n if (!onValueChange) return;\n\n const created: Value[] = [];\n const converted = allowCreate\n ? next.map((item) => {\n if (!isCreatableItem(item)) return item;\n const value = defaultToCreateValue(item.value, sampleItem, queryToCreateValue) as Value;\n created.push(value);\n return value;\n })\n : next;\n\n if (allowCreate) {\n if (created.length > 0) setCreatedItems((prev) => [...prev, ...created]);\n setInputValue('');\n }\n\n const hasSelectAll = converted.some((item) => isSelectAllItem(item));\n const newValue = (() => {\n if (!allowSelectAll) return converted;\n if (!hasSelectAll) return isAllSelected ? [] : converted;\n return isAllSelected ? converted.filter((item) => !isSelectAllItem(item)) : allFlatItems;\n })();\n\n onValueChange(newValue, event);\n };\n\n const renderItem = (item: Value) => {\n return (\n <Combobox.Item\n value={item}\n indicator={indicator}\n icon={itemToIcon(item)}\n disabled={itemToDisabled(item)}\n >\n {itemToLabel(item)}\n </Combobox.Item>\n );\n };\n\n return (\n <Combobox.Root<Value, true>\n multiple\n items={items}\n value={value}\n defaultValue={defaultValue}\n filter={filter}\n onValueChange={handleValueChange}\n itemToStringLabel={wrappedItemToStringLabel}\n itemToStringValue={wrappedItemToStringValue}\n disabled={disabled}\n inputRef={inputRef}\n {...(allowCreate\n ? { inputValue, onInputValueChange: (nextValue: string) => setInputValue(nextValue) }\n : {})}\n >\n <BaseCombobox.Chips render={<Fragment />}>\n <Combobox.InputGroup\n variant={variant}\n sizing={sizing}\n state={state}\n focusVariant={focusVariant}\n className={className}\n >\n <div className=\"tw:flex tw:min-w-0 tw:flex-1 tw:flex-wrap tw:items-center tw:gap-1.5 tw:px-4 tw:py-1.5\">\n <Combobox.Chips<Value>\n maxVisible={maxVisible}\n variant={chipVariant}\n itemToChipLabel={itemToChipLabel ?? itemToLabel}\n itemToChipColor={itemToChipColor}\n />\n <div className=\"tw:flex tw:flex-1 tw:items-center tw:gap-1\">\n <Combobox.Input\n id={id}\n placeholder={placeholder}\n disabled={disabled}\n className=\"tw:w-auto tw:min-w-[120px] tw:flex-1\"\n />\n {allowClear && (\n <InputGroup.Button asChild aria-label=\"Clear\" disabled={disabled}>\n <BaseCombobox.Clear>\n <X className=\"tw:size-4\" />\n </BaseCombobox.Clear>\n </InputGroup.Button>\n )}\n <InputGroup.Button disabled={disabled} asChild aria-label=\"Open combobox\">\n <BaseCombobox.Trigger>\n <ChevronDown className=\"tw:size-4\" />\n </BaseCombobox.Trigger>\n </InputGroup.Button>\n </div>\n </div>\n </Combobox.InputGroup>\n </BaseCombobox.Chips>\n <Combobox.Content>\n <Combobox.Empty>{empty}</Combobox.Empty>\n <Combobox.List>\n {(itemOrGroup: Value | GroupShape) => {\n if (isSelectAllItem(itemOrGroup)) {\n return (\n <Combobox.Item value={itemOrGroup} indicator=\"checkbox\">\n Select All\n </Combobox.Item>\n );\n }\n\n if (isCreatableItem(itemOrGroup)) {\n return (\n <Combobox.Item value={itemOrGroup} icon={<Plus />}>\n {queryToCreateLabel(itemOrGroup.value)}\n </Combobox.Item>\n );\n }\n\n if (isGroupItem(itemOrGroup)) {\n const maybeCreatable = itemOrGroup.items[0];\n\n if (isCreatableItem(maybeCreatable)) {\n return (\n <Combobox.Item value={maybeCreatable} icon={<Plus />}>\n {queryToCreateLabel(maybeCreatable.value)}\n </Combobox.Item>\n );\n }\n\n const groupLabel = groupToLabel(itemOrGroup);\n return (\n <Combobox.Group items={itemOrGroup.items}>\n {groupLabel && <Combobox.GroupLabel>{groupLabel}</Combobox.GroupLabel>}\n <Combobox.GroupList>{renderItem}</Combobox.GroupList>\n </Combobox.Group>\n );\n }\n\n return renderItem(itemOrGroup);\n }}\n </Combobox.List>\n </Combobox.Content>\n </Combobox.Root>\n );\n};\n"],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { InputGroup } from "../../InputGroup-BJWsI35s.js";
|
|
2
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
|
+
//#region src/blocks/NumberInput/NumberInput.tsx
|
|
4
|
+
const toNumberOrNull = (event) => Number.isNaN(event.target.valueAsNumber) ? null : event.target.valueAsNumber;
|
|
5
|
+
const NumberInput = ({ ref, state, variant, focusVariant, sizing, className, value, defaultValue, onValueChange, onValueBlur, onChange, onBlur, prefix, suffix, ...inputProps }) => {
|
|
6
|
+
const handleChange = (event) => {
|
|
7
|
+
onValueChange?.(toNumberOrNull(event));
|
|
8
|
+
onChange?.(event);
|
|
9
|
+
};
|
|
10
|
+
const handleBlur = (event) => {
|
|
11
|
+
onValueBlur?.(toNumberOrNull(event));
|
|
12
|
+
onBlur?.(event);
|
|
13
|
+
};
|
|
14
|
+
const valueProp = value !== void 0 ? { value: value ?? "" } : { defaultValue: defaultValue ?? "" };
|
|
15
|
+
return /* @__PURE__ */ jsxs(InputGroup, {
|
|
16
|
+
state,
|
|
17
|
+
variant,
|
|
18
|
+
sizing,
|
|
19
|
+
focusVariant,
|
|
20
|
+
className,
|
|
21
|
+
children: [
|
|
22
|
+
prefix && /* @__PURE__ */ jsx(InputGroup.Addon, {
|
|
23
|
+
align: "inline-start",
|
|
24
|
+
children: prefix
|
|
25
|
+
}),
|
|
26
|
+
/* @__PURE__ */ jsx(InputGroup.Input, {
|
|
27
|
+
...inputProps,
|
|
28
|
+
...valueProp,
|
|
29
|
+
ref,
|
|
30
|
+
type: "number",
|
|
31
|
+
onChange: handleChange,
|
|
32
|
+
onBlur: handleBlur
|
|
33
|
+
}),
|
|
34
|
+
suffix && /* @__PURE__ */ jsx(InputGroup.Addon, {
|
|
35
|
+
align: "inline-end",
|
|
36
|
+
children: suffix
|
|
37
|
+
})
|
|
38
|
+
]
|
|
39
|
+
});
|
|
40
|
+
};
|
|
41
|
+
//#endregion
|
|
42
|
+
export { NumberInput };
|
|
43
|
+
|
|
44
|
+
//# sourceMappingURL=NumberInput.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NumberInput.js","names":[],"sources":["../../../src/blocks/NumberInput/NumberInput.tsx"],"sourcesContent":["import type {\n ChangeEvent,\n ChangeEventHandler,\n ComponentProps,\n FocusEventHandler,\n ReactNode,\n} from 'react';\n\nimport { InputGroup } from '../../components/InputGroup';\n\ntype InputGroupProps = Pick<\n ComponentProps<typeof InputGroup>,\n 'variant' | 'focusVariant' | 'state' | 'sizing'\n>;\n\ntype InputGroupInputProps = Omit<\n ComponentProps<typeof InputGroup.Input>,\n 'value' | 'defaultValue' | 'type' | 'prefix'\n>;\n\ntype Props = InputGroupProps &\n InputGroupInputProps & {\n value?: number | null;\n defaultValue?: number | null;\n onValueChange?: (value: number | null) => void;\n onValueBlur?: (value: number | null) => void;\n prefix?: ReactNode;\n suffix?: ReactNode;\n };\n\nconst toNumberOrNull = (event: ChangeEvent<HTMLInputElement>) =>\n Number.isNaN(event.target.valueAsNumber) ? null : event.target.valueAsNumber;\n\nexport const NumberInput = ({\n ref,\n state,\n variant,\n focusVariant,\n sizing,\n className,\n\n value,\n defaultValue,\n onValueChange,\n onValueBlur,\n onChange,\n onBlur,\n\n prefix,\n suffix,\n\n ...inputProps\n}: Props) => {\n const handleChange: ChangeEventHandler<HTMLInputElement> = (event) => {\n onValueChange?.(toNumberOrNull(event));\n onChange?.(event);\n };\n\n const handleBlur: FocusEventHandler<HTMLInputElement> = (event) => {\n onValueBlur?.(toNumberOrNull(event));\n onBlur?.(event);\n };\n\n const isControlled = value !== undefined;\n const valueProp = isControlled ? { value: value ?? '' } : { defaultValue: defaultValue ?? '' };\n\n return (\n <InputGroup\n state={state}\n variant={variant}\n sizing={sizing}\n focusVariant={focusVariant}\n className={className}\n >\n {prefix && <InputGroup.Addon align=\"inline-start\">{prefix}</InputGroup.Addon>}\n <InputGroup.Input\n {...inputProps}\n {...valueProp}\n ref={ref}\n type=\"number\"\n onChange={handleChange}\n onBlur={handleBlur}\n />\n {suffix && <InputGroup.Addon align=\"inline-end\">{suffix}</InputGroup.Addon>}\n </InputGroup>\n );\n};\n"],"mappings":";;;AA8BA,MAAM,kBAAkB,UACtB,OAAO,MAAM,MAAM,OAAO,aAAa,IAAI,OAAO,MAAM,OAAO;AAEjE,MAAa,eAAe,EAC1B,KACA,OACA,SACA,cACA,QACA,WAEA,OACA,cACA,eACA,aACA,UACA,QAEA,QACA,QAEA,GAAG,iBACQ;CACX,MAAM,gBAAsD,UAAU;EACpE,gBAAgB,eAAe,KAAK,CAAC;EACrC,WAAW,KAAK;CAClB;CAEA,MAAM,cAAmD,UAAU;EACjE,cAAc,eAAe,KAAK,CAAC;EACnC,SAAS,KAAK;CAChB;CAGA,MAAM,YADe,UAAU,KAAA,IACE,EAAE,OAAO,SAAS,GAAG,IAAI,EAAE,cAAc,gBAAgB,GAAG;CAE7F,OACE,qBAAC,YAAD;EACS;EACE;EACD;EACM;EACH;EALb,UAAA;GAOG,UAAU,oBAAC,WAAW,OAAZ;IAAkB,OAAM;IAAgB,UAAA;GAAyB,CAAA;GAC5E,oBAAC,WAAW,OAAZ;IACE,GAAI;IACJ,GAAI;IACC;IACL,MAAK;IACL,UAAU;IACV,QAAQ;GACT,CAAA;GACA,UAAU,oBAAC,WAAW,OAAZ;IAAkB,OAAM;IAAc,UAAA;GAAyB,CAAA;EAChE;;AAEhB"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { createChangeInputEvent } from "../../utils-D0c5VAyF.js";
|
|
2
|
+
import { mergeRefs } from "../utils/mergeRefs.js";
|
|
3
|
+
import { ArrowBigUpDash, Eye, EyeOff, X } from "../../icons-Cek151jC.js";
|
|
4
|
+
import { InputGroup } from "../../InputGroup-BJWsI35s.js";
|
|
5
|
+
import { useControllableState } from "../../useControllableState-M6494mCT.js";
|
|
6
|
+
import { useRef, useState } from "react";
|
|
7
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
8
|
+
//#region src/blocks/PasswordInput/PasswordInput.tsx
|
|
9
|
+
const PasswordInput = ({ ref, state, variant, focusVariant, sizing, className, value: valueProp, defaultValue, onValueChange, onValueBlur, onChange, onBlur, onKeyDown, onKeyUp, onMouseDown, allowClear = false, allowPasswordToggle = false, passwordToggleLabel, autoComplete = "new-password", defaultPasswordVisibility = false, disabled, readOnly, ...restInputProps }) => {
|
|
10
|
+
const inputRef = useRef(null);
|
|
11
|
+
const [value, setValue] = useControllableState({
|
|
12
|
+
prop: valueProp === null ? "" : valueProp,
|
|
13
|
+
defaultProp: defaultValue ?? "",
|
|
14
|
+
onChange: onValueChange
|
|
15
|
+
});
|
|
16
|
+
const [capsLock, setCapsLock] = useState(false);
|
|
17
|
+
const [isPasswordVisible, setIsPasswordVisible] = useState(defaultPasswordVisibility);
|
|
18
|
+
const canClear = allowClear && !!value && !disabled && !readOnly;
|
|
19
|
+
const handleChange = (event) => {
|
|
20
|
+
setValue(event.target.value);
|
|
21
|
+
onChange?.(event);
|
|
22
|
+
};
|
|
23
|
+
const handleBlur = (event) => {
|
|
24
|
+
if (capsLock) setCapsLock(false);
|
|
25
|
+
onValueBlur?.(event.target.value);
|
|
26
|
+
onBlur?.(event);
|
|
27
|
+
};
|
|
28
|
+
const handleKeyDown = (event) => {
|
|
29
|
+
const isOn = event.getModifierState("CapsLock");
|
|
30
|
+
if (isOn !== capsLock) setCapsLock(isOn);
|
|
31
|
+
onKeyDown?.(event);
|
|
32
|
+
};
|
|
33
|
+
const handleKeyUp = (event) => {
|
|
34
|
+
const isOn = event.getModifierState("CapsLock");
|
|
35
|
+
if (isOn !== capsLock) setCapsLock(isOn);
|
|
36
|
+
onKeyUp?.(event);
|
|
37
|
+
};
|
|
38
|
+
const handleMouseDown = (event) => {
|
|
39
|
+
const isOn = event.getModifierState("CapsLock");
|
|
40
|
+
if (isOn !== capsLock) setCapsLock(isOn);
|
|
41
|
+
onMouseDown?.(event);
|
|
42
|
+
};
|
|
43
|
+
const handleClear = () => {
|
|
44
|
+
if (!inputRef.current) return;
|
|
45
|
+
inputRef.current.value = "";
|
|
46
|
+
setValue("");
|
|
47
|
+
onChange?.(createChangeInputEvent(inputRef.current));
|
|
48
|
+
};
|
|
49
|
+
const handleTogglePasswordVisibility = () => {
|
|
50
|
+
setIsPasswordVisible((prev) => !prev);
|
|
51
|
+
};
|
|
52
|
+
return /* @__PURE__ */ jsxs(InputGroup, {
|
|
53
|
+
state,
|
|
54
|
+
variant,
|
|
55
|
+
sizing,
|
|
56
|
+
focusVariant,
|
|
57
|
+
className,
|
|
58
|
+
children: [/* @__PURE__ */ jsx(InputGroup.Input, {
|
|
59
|
+
...restInputProps,
|
|
60
|
+
ref: mergeRefs(ref ?? null, inputRef),
|
|
61
|
+
type: isPasswordVisible ? "text" : "password",
|
|
62
|
+
autoComplete,
|
|
63
|
+
value,
|
|
64
|
+
onChange: handleChange,
|
|
65
|
+
onBlur: handleBlur,
|
|
66
|
+
onKeyDown: handleKeyDown,
|
|
67
|
+
onKeyUp: handleKeyUp,
|
|
68
|
+
onMouseDown: handleMouseDown,
|
|
69
|
+
disabled,
|
|
70
|
+
readOnly
|
|
71
|
+
}), (capsLock || canClear || allowPasswordToggle) && /* @__PURE__ */ jsxs(InputGroup.Addon, {
|
|
72
|
+
align: "inline-end",
|
|
73
|
+
children: [
|
|
74
|
+
capsLock && /* @__PURE__ */ jsx(ArrowBigUpDash, {
|
|
75
|
+
className: "tw:size-4 tw:text-primary",
|
|
76
|
+
children: /* @__PURE__ */ jsx("title", { children: "Caps Lock is on" })
|
|
77
|
+
}),
|
|
78
|
+
canClear && /* @__PURE__ */ jsx(InputGroup.Button, {
|
|
79
|
+
"aria-label": "Clear password",
|
|
80
|
+
onMouseDown: (event) => event.preventDefault(),
|
|
81
|
+
onClick: handleClear,
|
|
82
|
+
children: /* @__PURE__ */ jsx(X, { className: "tw:size-4" })
|
|
83
|
+
}),
|
|
84
|
+
allowPasswordToggle && /* @__PURE__ */ jsx(InputGroup.Button, {
|
|
85
|
+
"aria-label": `${isPasswordVisible ? "Hide password" : "Show password"}${passwordToggleLabel ? `: ${passwordToggleLabel}` : ""}`,
|
|
86
|
+
onMouseDown: (event) => event.preventDefault(),
|
|
87
|
+
onClick: handleTogglePasswordVisibility,
|
|
88
|
+
children: isPasswordVisible ? /* @__PURE__ */ jsx(EyeOff, { className: "tw:size-4" }) : /* @__PURE__ */ jsx(Eye, { className: "tw:size-4" })
|
|
89
|
+
})
|
|
90
|
+
]
|
|
91
|
+
})]
|
|
92
|
+
});
|
|
93
|
+
};
|
|
94
|
+
//#endregion
|
|
95
|
+
export { PasswordInput };
|
|
96
|
+
|
|
97
|
+
//# sourceMappingURL=PasswordInput.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PasswordInput.js","names":[],"sources":["../../../src/blocks/PasswordInput/PasswordInput.tsx"],"sourcesContent":["import { useRef, useState } from 'react';\nimport type {\n ChangeEventHandler,\n ComponentProps,\n ComponentRef,\n FocusEventHandler,\n KeyboardEventHandler,\n MouseEventHandler,\n} from 'react';\n\nimport { InputGroup } from '../../components/InputGroup';\nimport { useControllableState } from '../../hooks/useControllableState';\nimport { ArrowBigUpDash, Eye, EyeOff, X } from '../../icons';\nimport { createChangeInputEvent, mergeRefs } from '../../utils';\n\ntype InputGroupProps = Pick<\n ComponentProps<typeof InputGroup>,\n 'variant' | 'focusVariant' | 'state' | 'sizing'\n>;\n\ntype InputGroupInputProps = Omit<\n ComponentProps<typeof InputGroup.Input>,\n 'value' | 'defaultValue' | 'type' | 'autoComplete'\n>;\n\ntype Props = InputGroupProps &\n InputGroupInputProps & {\n value?: string | null;\n defaultValue?: string | null;\n onValueChange?: (value: string) => void;\n onValueBlur?: (value: string) => void;\n allowClear?: boolean;\n allowPasswordToggle?: boolean;\n /**\n * Suffix appended to the reveal button's accessible name, e.g. the field\n * title. Use it to disambiguate multiple password fields on one form —\n * \"Show password: API token\" / \"Hide password: API token\". Omit for a\n * single field.\n */\n passwordToggleLabel?: string;\n autoComplete?: 'new-password' | 'current-password' | 'off';\n defaultPasswordVisibility?: boolean;\n };\n\nexport const PasswordInput = ({\n ref,\n\n // group props\n state,\n variant,\n focusVariant,\n sizing,\n className,\n\n // own props\n value: valueProp,\n defaultValue,\n onValueChange,\n onValueBlur,\n onChange,\n onBlur,\n onKeyDown,\n onKeyUp,\n onMouseDown,\n allowClear = false,\n allowPasswordToggle = false,\n passwordToggleLabel,\n autoComplete = 'new-password',\n defaultPasswordVisibility = false,\n\n // input props\n disabled,\n readOnly,\n ...restInputProps\n}: Props) => {\n const inputRef = useRef<ComponentRef<'input'>>(null);\n\n const [value, setValue] = useControllableState<string>({\n // A `null` controlled value stays controlled (coerced to ''); `undefined` is uncontrolled.\n prop: valueProp === null ? '' : valueProp,\n defaultProp: defaultValue ?? '',\n onChange: onValueChange,\n });\n\n const [capsLock, setCapsLock] = useState(false);\n const [isPasswordVisible, setIsPasswordVisible] = useState(defaultPasswordVisibility);\n\n const canClear = allowClear && !!value && !disabled && !readOnly;\n\n const handleChange: ChangeEventHandler<HTMLInputElement> = (event) => {\n setValue(event.target.value);\n onChange?.(event);\n };\n\n const handleBlur: FocusEventHandler<HTMLInputElement> = (event) => {\n if (capsLock) setCapsLock(false);\n onValueBlur?.(event.target.value);\n onBlur?.(event);\n };\n\n // Both keyDown and keyUp are needed: pressing the Caps Lock key itself\n // reports the *old* state on keyDown and the *new* state on keyUp, so\n // toggling Caps Lock off mid-typing is only caught on keyUp.\n const handleKeyDown: KeyboardEventHandler<HTMLInputElement> = (event) => {\n const isOn = event.getModifierState('CapsLock');\n if (isOn !== capsLock) setCapsLock(isOn);\n onKeyDown?.(event);\n };\n\n const handleKeyUp: KeyboardEventHandler<HTMLInputElement> = (event) => {\n const isOn = event.getModifierState('CapsLock');\n if (isOn !== capsLock) setCapsLock(isOn);\n onKeyUp?.(event);\n };\n\n // Catches the case where the user clicks into the field with Caps Lock\n // already on. Tab-focus / autofocus have no API to query modifier state.\n const handleMouseDown: MouseEventHandler<HTMLInputElement> = (event) => {\n const isOn = event.getModifierState('CapsLock');\n if (isOn !== capsLock) setCapsLock(isOn);\n onMouseDown?.(event);\n };\n\n const handleClear: MouseEventHandler<HTMLButtonElement> = () => {\n if (!inputRef.current) return;\n inputRef.current.value = '';\n setValue('');\n onChange?.(createChangeInputEvent(inputRef.current));\n };\n\n const handleTogglePasswordVisibility = () => {\n setIsPasswordVisible((prev) => !prev);\n };\n\n return (\n <InputGroup\n state={state}\n variant={variant}\n sizing={sizing}\n focusVariant={focusVariant}\n className={className}\n >\n <InputGroup.Input\n {...restInputProps}\n ref={mergeRefs(ref ?? null, inputRef)}\n type={isPasswordVisible ? 'text' : 'password'}\n autoComplete={autoComplete}\n value={value}\n onChange={handleChange}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n onKeyUp={handleKeyUp}\n onMouseDown={handleMouseDown}\n disabled={disabled}\n readOnly={readOnly}\n />\n\n {(capsLock || canClear || allowPasswordToggle) && (\n <InputGroup.Addon align=\"inline-end\">\n {capsLock && (\n <ArrowBigUpDash className=\"tw:size-4 tw:text-primary\">\n <title>Caps Lock is on</title>\n </ArrowBigUpDash>\n )}\n {canClear && (\n <InputGroup.Button\n aria-label=\"Clear password\"\n onMouseDown={(event) => event.preventDefault()}\n onClick={handleClear}\n >\n <X className=\"tw:size-4\" />\n </InputGroup.Button>\n )}\n {allowPasswordToggle && (\n <InputGroup.Button\n aria-label={`${isPasswordVisible ? 'Hide password' : 'Show password'}${\n passwordToggleLabel ? `: ${passwordToggleLabel}` : ''\n }`}\n onMouseDown={(event) => event.preventDefault()}\n onClick={handleTogglePasswordVisibility}\n >\n {isPasswordVisible ? <EyeOff className=\"tw:size-4\" /> : <Eye className=\"tw:size-4\" />}\n </InputGroup.Button>\n )}\n </InputGroup.Addon>\n )}\n </InputGroup>\n );\n};\n"],"mappings":";;;;;;;;AA4CA,MAAa,iBAAiB,EAC5B,KAGA,OACA,SACA,cACA,QACA,WAGA,OAAO,WACP,cACA,eACA,aACA,UACA,QACA,WACA,SACA,aACA,aAAa,OACb,sBAAsB,OACtB,qBACA,eAAe,gBACf,4BAA4B,OAG5B,UACA,UACA,GAAG,qBACQ;CACX,MAAM,WAAW,OAA8B,IAAI;CAEnD,MAAM,CAAC,OAAO,YAAY,qBAA6B;EAErD,MAAM,cAAc,OAAO,KAAK;EAChC,aAAa,gBAAgB;EAC7B,UAAU;CACZ,CAAC;CAED,MAAM,CAAC,UAAU,eAAe,SAAS,KAAK;CAC9C,MAAM,CAAC,mBAAmB,wBAAwB,SAAS,yBAAyB;CAEpF,MAAM,WAAW,cAAc,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC;CAExD,MAAM,gBAAsD,UAAU;EACpE,SAAS,MAAM,OAAO,KAAK;EAC3B,WAAW,KAAK;CAClB;CAEA,MAAM,cAAmD,UAAU;EACjE,IAAI,UAAU,YAAY,KAAK;EAC/B,cAAc,MAAM,OAAO,KAAK;EAChC,SAAS,KAAK;CAChB;CAKA,MAAM,iBAAyD,UAAU;EACvE,MAAM,OAAO,MAAM,iBAAiB,UAAU;EAC9C,IAAI,SAAS,UAAU,YAAY,IAAI;EACvC,YAAY,KAAK;CACnB;CAEA,MAAM,eAAuD,UAAU;EACrE,MAAM,OAAO,MAAM,iBAAiB,UAAU;EAC9C,IAAI,SAAS,UAAU,YAAY,IAAI;EACvC,UAAU,KAAK;CACjB;CAIA,MAAM,mBAAwD,UAAU;EACtE,MAAM,OAAO,MAAM,iBAAiB,UAAU;EAC9C,IAAI,SAAS,UAAU,YAAY,IAAI;EACvC,cAAc,KAAK;CACrB;CAEA,MAAM,oBAA0D;EAC9D,IAAI,CAAC,SAAS,SAAS;EACvB,SAAS,QAAQ,QAAQ;EACzB,SAAS,EAAE;EACX,WAAW,uBAAuB,SAAS,OAAO,CAAC;CACrD;CAEA,MAAM,uCAAuC;EAC3C,sBAAsB,SAAS,CAAC,IAAI;CACtC;CAEA,OACE,qBAAC,YAAD;EACS;EACE;EACD;EACM;EACH;EALb,UAAA,CAOE,oBAAC,WAAW,OAAZ;GACE,GAAI;GACJ,KAAK,UAAU,OAAO,MAAM,QAAQ;GACpC,MAAM,oBAAoB,SAAS;GACrB;GACP;GACP,UAAU;GACV,QAAQ;GACR,WAAW;GACX,SAAS;GACT,aAAa;GACH;GACA;EACX,CAAA,IAEC,YAAY,YAAY,wBACxB,qBAAC,WAAW,OAAZ;GAAkB,OAAM;GAAxB,UAAA;IACG,YACC,oBAAC,gBAAD;KAAgB,WAAU;KACxB,UAAA,oBAAC,SAAD,EAAA,UAAO,kBAAsB,CAAA;IACf,CAAA;IAEjB,YACC,oBAAC,WAAW,QAAZ;KACE,cAAW;KACX,cAAc,UAAU,MAAM,eAAe;KAC7C,SAAS;KAET,UAAA,oBAAC,GAAD,EAAG,WAAU,YAAa,CAAA;IACT,CAAA;IAEpB,uBACC,oBAAC,WAAW,QAAZ;KACE,cAAY,GAAG,oBAAoB,kBAAkB,kBACnD,sBAAsB,KAAK,wBAAwB;KAErD,cAAc,UAAU,MAAM,eAAe;KAC7C,SAAS;KAER,UAAA,oBAAoB,oBAAC,QAAD,EAAQ,WAAU,YAAa,CAAA,IAAI,oBAAC,KAAD,EAAK,WAAU,YAAa,CAAA;IACnE,CAAA;GAEL;EAEV,CAAA,CAAA;;AAEhB"}
|