@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,185 @@
|
|
|
1
|
+
import { cn } from "./classNames-BzrkDnOD.js";
|
|
2
|
+
import { useArgoDesign } from "./context-KxxeMHbR.js";
|
|
3
|
+
import { X } from "./icons-Cek151jC.js";
|
|
4
|
+
import { Button } from "./Button-nzmDNS2q.js";
|
|
5
|
+
import { ModalDescription, ModalOverlay, ModalTitle } from "./ModalTitle-C76ke2eo.js";
|
|
6
|
+
import { Separator } from "./internal/components/Separator.js";
|
|
7
|
+
import { useEffect, useState } from "react";
|
|
8
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
9
|
+
import { Close, Content, Portal, Root, Trigger } from "@radix-ui/react-dialog";
|
|
10
|
+
//#region src/components/Modal/ModalBody.tsx
|
|
11
|
+
/**
|
|
12
|
+
* Scrollable body slot for `Modal`. Place form fields, content blocks, or detail panels here.
|
|
13
|
+
* Takes available height inside `Modal.Content` and scrolls when content overflows.
|
|
14
|
+
*/
|
|
15
|
+
const ModalBody = ({ className, ...props }) => /* @__PURE__ */ jsx("div", {
|
|
16
|
+
"data-slot": "modal-body",
|
|
17
|
+
className: cn("tw:flex-1", "tw:overflow-y-auto", "tw:group-data-[argo=true]/modal:scroll-fade-y", "tw:group-data-[argo=false]/modal:px-7", "tw:group-data-[argo=true]/modal:px-4", "tw:py-1", "tw:[&_svg.lucide:not([class*='tw:size-'])]:size-4", "tw:[&_svg]:shrink-0", className),
|
|
18
|
+
...props
|
|
19
|
+
});
|
|
20
|
+
//#endregion
|
|
21
|
+
//#region src/components/Modal/ModalContent.tsx
|
|
22
|
+
const ModalContent = ({ size = "medium", className, children, onEscapeKeyDown, ...props }) => {
|
|
23
|
+
const renderArgo = useArgoDesign();
|
|
24
|
+
const handleEscapeKeyDown = (event) => {
|
|
25
|
+
event.stopPropagation();
|
|
26
|
+
onEscapeKeyDown?.(event);
|
|
27
|
+
};
|
|
28
|
+
return /* @__PURE__ */ jsx(Portal, { children: /* @__PURE__ */ jsx(ModalOverlay, { children: /* @__PURE__ */ jsx(Content, {
|
|
29
|
+
...props,
|
|
30
|
+
"data-argo": renderArgo,
|
|
31
|
+
"data-size": size,
|
|
32
|
+
className: cn("tailwindcss-preflight", "tw:group/modal", "tw:fixed", "tw:left-1/2", "tw:-translate-x-1/2", "tw:z-[1051]", "tw:data-[argo=false]:top-20", "tw:data-[argo=true]:top-1/2", "tw:data-[argo=true]:-translate-y-1/2", "tw:w-full", "tw:max-w-2xl", "tw:max-h-[calc(100vh-2*theme(spacing.20))]", "tw:flex", "tw:flex-col", "tw:gap-4", "tw:data-[argo=false]:rounded-lg", "tw:data-[argo=true]:rounded-3xl", "tw:bg-card", "tw:text-card-foreground", "tw:data-[argo=false]:py-8", "tw:data-[argo=true]:py-4", "tw:duration-200", "tw:data-[state=open]:animate-in", "tw:data-[state=open]:fade-in-0", "tw:data-[state=closed]:animate-out", "tw:data-[state=closed]:fade-out-0", "tw:data-[argo=false]:data-[state=open]:zoom-in-80", "tw:data-[argo=false]:data-[state=open]:slide-in-from-top-[48%]", "tw:data-[argo=false]:data-[state=closed]:zoom-out-80", "tw:data-[argo=false]:data-[state=closed]:slide-out-to-top-[48%]", "tw:data-[argo=true]:data-[state=open]:zoom-in-95", "tw:data-[argo=true]:data-[state=closed]:zoom-out-95", {
|
|
33
|
+
"tw:max-w-[480px]": size === "small",
|
|
34
|
+
"tw:max-w-4xl": size === "large"
|
|
35
|
+
}, className),
|
|
36
|
+
onEscapeKeyDown: handleEscapeKeyDown,
|
|
37
|
+
children
|
|
38
|
+
}) }) });
|
|
39
|
+
};
|
|
40
|
+
//#endregion
|
|
41
|
+
//#region src/components/Modal/ModalFooter.tsx
|
|
42
|
+
const ModalFooter = ({ className, ...props }) => /* @__PURE__ */ jsx("div", {
|
|
43
|
+
...props,
|
|
44
|
+
className: cn("tw:group-data-[argo=false]/modal:px-7", "tw:group-data-[argo=true]/modal:px-4", className)
|
|
45
|
+
});
|
|
46
|
+
//#endregion
|
|
47
|
+
//#region src/components/Modal/ModalActions.tsx
|
|
48
|
+
/**
|
|
49
|
+
* Container for the header's top-right controls — any `actions` passed to `Modal.Header` plus the
|
|
50
|
+
* close icon. Sits in the header grid's last column, top-aligned. Mirrors `Alert`'s action slot.
|
|
51
|
+
*/
|
|
52
|
+
const ModalActions = ({ className, ...props }) => /* @__PURE__ */ jsx("div", {
|
|
53
|
+
className: cn("tw:col-start-3", "tw:row-start-1", "tw:self-start", "tw:flex", "tw:items-center", "tw:gap-1", "tw:group-data-[argo=true]/modal:ml-3", className),
|
|
54
|
+
...props
|
|
55
|
+
});
|
|
56
|
+
//#endregion
|
|
57
|
+
//#region src/components/Modal/ModalHeader.tsx
|
|
58
|
+
/** Modal header: `[icon] | title (children) | actions + close` on row 1, `description` on row 2. */
|
|
59
|
+
const ModalHeader = ({ className, icon, description, "aria-description": ariaDescription, actions, hideCloseIcon = false, children, ...props }) => /* @__PURE__ */ jsxs("div", {
|
|
60
|
+
...props,
|
|
61
|
+
"data-slot": "modal-header",
|
|
62
|
+
className: cn("tw:grid", "tw:grid-cols-[auto_1fr_auto]", "tw:items-center", "tw:group-data-[argo=false]/modal:px-7", "tw:group-data-[argo=true]/modal:px-4", className),
|
|
63
|
+
children: [
|
|
64
|
+
icon,
|
|
65
|
+
children && /* @__PURE__ */ jsx(ModalTitle, {
|
|
66
|
+
className: "tw:col-start-2 tw:row-start-1",
|
|
67
|
+
children
|
|
68
|
+
}),
|
|
69
|
+
(actions || !hideCloseIcon) && /* @__PURE__ */ jsxs(ModalActions, { children: [actions, !hideCloseIcon && /* @__PURE__ */ jsx(Close, {
|
|
70
|
+
asChild: true,
|
|
71
|
+
children: /* @__PURE__ */ jsxs(Button, {
|
|
72
|
+
variant: "invisible",
|
|
73
|
+
size: "icon-sm",
|
|
74
|
+
children: [/* @__PURE__ */ jsx(X, {}), /* @__PURE__ */ jsx("span", {
|
|
75
|
+
className: "tw:sr-only",
|
|
76
|
+
children: "Close"
|
|
77
|
+
})]
|
|
78
|
+
})
|
|
79
|
+
})] }),
|
|
80
|
+
(description || ariaDescription) && /* @__PURE__ */ jsx(ModalDescription, {
|
|
81
|
+
className: cn("tw:col-start-1", "tw:col-end-4", "tw:row-start-2", description ? "tw:mt-1" : "tw:sr-only"),
|
|
82
|
+
children: description ?? ariaDescription
|
|
83
|
+
}),
|
|
84
|
+
/* @__PURE__ */ jsx("div", {
|
|
85
|
+
className: cn("tw:col-start-1", "tw:col-end-4", "tw:mt-5", "tw:hidden", "tw:group-data-[argo=false]/modal:[[data-slot=modal-header]:has(~[data-slot=modal-body])_&]:block", "tw:group-data-[argo=false]/modal:[[data-slot=modal-header]:has(~[data-slot=modal-body]_[data-slot=tabs-root])_&]:!hidden"),
|
|
86
|
+
children: /* @__PURE__ */ jsx(Separator, { orientation: "horizontal" })
|
|
87
|
+
})
|
|
88
|
+
]
|
|
89
|
+
});
|
|
90
|
+
//#endregion
|
|
91
|
+
//#region src/components/Modal/ModalIcon.tsx
|
|
92
|
+
const NAMED_COLORS = /* @__PURE__ */ new Set([
|
|
93
|
+
"orange",
|
|
94
|
+
"blue",
|
|
95
|
+
"red",
|
|
96
|
+
"green",
|
|
97
|
+
"gray",
|
|
98
|
+
"violet"
|
|
99
|
+
]);
|
|
100
|
+
/**
|
|
101
|
+
* Status-coloured icon for `Modal`. Authored inside `Modal.Header`. For a remote image badge (a
|
|
102
|
+
* component or backend logo fetched by URL) use `Modal.Image` instead.
|
|
103
|
+
*
|
|
104
|
+
* - **Legacy anatomy:** a solid-filled circular badge docked to the top-left of `Modal.Content`
|
|
105
|
+
* (absolutely positioned, so it renders identically wherever it is authored).
|
|
106
|
+
* - **Argo anatomy** (`data-argo` on `Modal.Content`): a small soft-tinted inline badge in the
|
|
107
|
+
* header grid, next to the title.
|
|
108
|
+
*
|
|
109
|
+
* Both variants are rendered and toggled purely via CSS (`group-data-[argo=true]/modal:`) — no
|
|
110
|
+
* context. Use the categorical `color` (`red` destructive, `orange` warning, `green` success,
|
|
111
|
+
* `blue` info, `gray` neutral, `violet` agent) to encode meaning; the palette stays fixed across
|
|
112
|
+
* brand themes.
|
|
113
|
+
*/
|
|
114
|
+
const ModalIcon = ({ color, icon }) => {
|
|
115
|
+
const customColor = color && !NAMED_COLORS.has(color) ? color : void 0;
|
|
116
|
+
return /* @__PURE__ */ jsx("span", {
|
|
117
|
+
"data-slot": "modal-icon",
|
|
118
|
+
className: cn("tw:flex", "tw:shrink-0", "tw:items-center", "tw:justify-center", "tw:[&_svg]:aspect-square", "tw:group-data-[argo=false]/modal:absolute", "tw:group-data-[argo=false]/modal:top-0", "tw:group-data-[argo=false]/modal:left-8", "tw:group-data-[argo=false]/modal:-translate-y-1/2", "tw:group-data-[argo=false]/modal:size-12", "tw:group-data-[argo=false]/modal:rounded-full", "tw:group-data-[argo=false]/modal:[&_svg:not([class*=\"tw:size-\"])]:size-6", "tw:group-data-[argo=true]/modal:col-start-1", "tw:group-data-[argo=true]/modal:row-start-1", "tw:group-data-[argo=true]/modal:self-start", "tw:group-data-[argo=true]/modal:mr-3", "tw:group-data-[argo=true]/modal:size-8", "tw:group-data-[argo=true]/modal:rounded", "tw:group-data-[argo=true]/modal:overflow-hidden", "tw:group-data-[argo=true]/modal:[&_svg:not([class*=\"tw:size-\"])]:size-5", {
|
|
119
|
+
"tw:group-data-[argo=false]/modal:bg-warning-500": color === "orange",
|
|
120
|
+
"tw:group-data-[argo=false]/modal:bg-blue-500": color === "blue",
|
|
121
|
+
"tw:group-data-[argo=false]/modal:bg-green-500": color === "green",
|
|
122
|
+
"tw:group-data-[argo=false]/modal:bg-error-500": color === "red",
|
|
123
|
+
"tw:group-data-[argo=false]/modal:bg-neutral-150": color === "gray",
|
|
124
|
+
"tw:group-data-[argo=false]/modal:bg-purple-100": color === "violet",
|
|
125
|
+
"tw:group-data-[argo=false]/modal:text-white": color !== "violet",
|
|
126
|
+
"tw:group-data-[argo=false]/modal:text-purple-500": color === "violet"
|
|
127
|
+
}, {
|
|
128
|
+
"tw:group-data-[argo=true]/modal:bg-warning-100 tw:group-data-[argo=true]/modal:text-warning-500": color === "orange",
|
|
129
|
+
"tw:group-data-[argo=true]/modal:bg-blue-100 tw:group-data-[argo=true]/modal:text-blue-600": color === "blue",
|
|
130
|
+
"tw:group-data-[argo=true]/modal:bg-green-100 tw:group-data-[argo=true]/modal:text-green-900": color === "green",
|
|
131
|
+
"tw:group-data-[argo=true]/modal:bg-error-100 tw:group-data-[argo=true]/modal:text-error-500": color === "red",
|
|
132
|
+
"tw:group-data-[argo=true]/modal:bg-neutral-100 tw:group-data-[argo=true]/modal:text-neutral-500": color === "gray",
|
|
133
|
+
"tw:group-data-[argo=true]/modal:bg-purple-100 tw:group-data-[argo=true]/modal:text-purple-500": color === "violet"
|
|
134
|
+
}, { "tw:text-white": !!customColor }),
|
|
135
|
+
style: customColor ? { backgroundColor: customColor } : void 0,
|
|
136
|
+
children: icon
|
|
137
|
+
});
|
|
138
|
+
};
|
|
139
|
+
//#endregion
|
|
140
|
+
//#region src/components/Modal/ModalImage.tsx
|
|
141
|
+
const ModalImage = ({ src, alt = "" }) => {
|
|
142
|
+
const [hasImageError, setHasImageError] = useState(false);
|
|
143
|
+
useEffect(() => setHasImageError(false), [src]);
|
|
144
|
+
if (hasImageError) return null;
|
|
145
|
+
return /* @__PURE__ */ jsx("span", {
|
|
146
|
+
"data-slot": "modal-image",
|
|
147
|
+
className: cn("tw:shrink-0", "tw:overflow-hidden", "tw:group-data-[argo=false]/modal:absolute", "tw:group-data-[argo=false]/modal:top-0", "tw:group-data-[argo=false]/modal:left-8", "tw:group-data-[argo=false]/modal:-translate-y-1/2", "tw:group-data-[argo=false]/modal:size-12", "tw:group-data-[argo=false]/modal:rounded-full", "tw:group-data-[argo=true]/modal:flex", "tw:group-data-[argo=true]/modal:col-start-1", "tw:group-data-[argo=true]/modal:row-start-1", "tw:group-data-[argo=true]/modal:self-start", "tw:group-data-[argo=true]/modal:mr-3", "tw:group-data-[argo=true]/modal:items-center", "tw:group-data-[argo=true]/modal:justify-center", "tw:group-data-[argo=true]/modal:rounded", "tw:group-data-[argo=true]/modal:size-8"),
|
|
148
|
+
children: /* @__PURE__ */ jsx("img", {
|
|
149
|
+
src,
|
|
150
|
+
alt,
|
|
151
|
+
className: "tw:size-full tw:object-contain",
|
|
152
|
+
onError: () => setHasImageError(true)
|
|
153
|
+
})
|
|
154
|
+
});
|
|
155
|
+
};
|
|
156
|
+
//#endregion
|
|
157
|
+
//#region src/components/Modal/Modal.tsx
|
|
158
|
+
/**
|
|
159
|
+
* Blocking dialog for confirmations, forms, and detail views. Built on Radix Dialog.
|
|
160
|
+
*
|
|
161
|
+
* **When to use:** the user must act before continuing (confirm a destructive action, fill a short form,
|
|
162
|
+
* view a focused detail panel). Use the compound parts `Modal.Trigger`, `Modal.Content`, `Modal.Header`,
|
|
163
|
+
* `Modal.Body`, `Modal.Footer`, and optionally `Modal.Icon` for a status-coloured header glyph.
|
|
164
|
+
* **When NOT to use:** for slide-in side editing use `Sheet`; for an inline destructive confirmation anchored
|
|
165
|
+
* to its trigger use `Popconfirm`; for hover previews use `HoverCard`.
|
|
166
|
+
* **Composition:** wrap `Modal.Content` around `Modal.Header` + `Modal.Body` + `Modal.Footer`. Put `useAppForm`
|
|
167
|
+
* `FormBody` inside `Modal.Body` and the submit / cancel buttons inside `Modal.Footer`.
|
|
168
|
+
*
|
|
169
|
+
* @see RECIPES.md#modal-form — for the canonical form-in-modal composition
|
|
170
|
+
* @see RECIPES.md#confirm-dialog — for destructive-confirm dialogs
|
|
171
|
+
*/
|
|
172
|
+
const Modal = (props) => /* @__PURE__ */ jsx(Root, { ...props });
|
|
173
|
+
Modal.Close = Close;
|
|
174
|
+
Modal.Trigger = Trigger;
|
|
175
|
+
Modal.Content = ModalContent;
|
|
176
|
+
Modal.Body = ModalBody;
|
|
177
|
+
Modal.Icon = ModalIcon;
|
|
178
|
+
Modal.Image = ModalImage;
|
|
179
|
+
Modal.Footer = ModalFooter;
|
|
180
|
+
Modal.Header = ModalHeader;
|
|
181
|
+
Modal.Overlay = ModalOverlay;
|
|
182
|
+
//#endregion
|
|
183
|
+
export { Modal };
|
|
184
|
+
|
|
185
|
+
//# sourceMappingURL=Modal-BA5Wc3sx.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Modal-BA5Wc3sx.js","names":[],"sources":["../src/components/Modal/ModalBody.tsx","../src/components/Modal/ModalContent.tsx","../src/components/Modal/ModalFooter.tsx","../src/components/Modal/ModalActions.tsx","../src/components/Modal/ModalHeader.tsx","../src/components/Modal/ModalIcon.tsx","../src/components/Modal/ModalImage.tsx","../src/components/Modal/Modal.tsx"],"sourcesContent":["import type { ComponentProps } from 'react';\n\nimport { cn } from '../../utils';\n\n/** Props for `Modal.Body`. Accepts all `<div>` attributes; `as=\"form\"` is reserved for future use. */\ntype Props = ComponentProps<'div'> & {\n as?: 'form';\n};\n\n/**\n * Scrollable body slot for `Modal`. Place form fields, content blocks, or detail panels here.\n * Takes available height inside `Modal.Content` and scrolls when content overflows.\n */\nexport const ModalBody = ({ className, ...props }: Props) => (\n <div\n data-slot=\"modal-body\"\n className={cn(\n // scrollable body - takes available space and scrolls when content overflows\n 'tw:flex-1',\n 'tw:overflow-y-auto',\n\n // argo: soft top/bottom edge fade in place of header/footer separators (pure-CSS utility)\n 'tw:group-data-[argo=true]/modal:scroll-fade-y',\n\n // Own horizontal padding, matching Header/Footer so content edges align (ModalContent adds none)\n 'tw:group-data-[argo=false]/modal:px-7',\n 'tw:group-data-[argo=true]/modal:px-4',\n 'tw:py-1',\n\n // normalize nested Lucide icon sizing, matching Popover/HoverCard/Alert content surfaces\n \"tw:[&_svg.lucide:not([class*='tw:size-'])]:size-4\",\n 'tw:[&_svg]:shrink-0',\n className,\n )}\n {...props}\n />\n);\n","import type { ComponentProps } from 'react';\nimport { Content, Portal } from '@radix-ui/react-dialog';\n\nimport { cn } from '../../utils';\nimport { useArgoDesign } from '../ThemeProvider/context';\n\nimport { ModalOverlay } from './ModalOverlay';\n\ntype Props = ComponentProps<typeof Content> & {\n size?: 'small' | 'medium' | 'large';\n};\n\nexport const ModalContent = ({\n size = 'medium',\n className,\n children,\n onEscapeKeyDown,\n ...props\n}: Props) => {\n const renderArgo = useArgoDesign();\n\n const handleEscapeKeyDown: typeof onEscapeKeyDown = (event) => {\n // Stop propagation to prevent parent modals (like FullScreenModal) from closing\n event.stopPropagation();\n onEscapeKeyDown?.(event);\n };\n\n return (\n <Portal>\n <ModalOverlay>\n <Content\n // props first so callers can't override the computed data-argo / data-size\n {...props}\n data-argo={renderArgo}\n data-size={size}\n className={cn(\n 'tailwindcss-preflight',\n 'tw:group/modal',\n\n // positioning - horizontally centered; vertical anchor depends on the design language\n 'tw:fixed',\n 'tw:left-1/2',\n 'tw:-translate-x-1/2',\n 'tw:z-[1051]',\n\n // legacy: anchored near the top; argo: centered in the viewport (like AlertModal)\n 'tw:data-[argo=false]:top-20',\n 'tw:data-[argo=true]:top-1/2',\n 'tw:data-[argo=true]:-translate-y-1/2',\n\n // sizing - responsive max dimensions\n 'tw:w-full',\n 'tw:max-w-2xl',\n 'tw:max-h-[calc(100vh-2*theme(spacing.20))]',\n\n // layout\n 'tw:flex',\n 'tw:flex-col',\n 'tw:gap-4',\n 'tw:data-[argo=false]:rounded-lg',\n 'tw:data-[argo=true]:rounded-3xl',\n 'tw:bg-card',\n 'tw:text-card-foreground',\n\n // Vertical (edge) padding lives here so it survives an omitted Header or Footer.\n // Horizontal padding is owned by Header / Body / Footer, so the Body runs full-bleed and\n // its scrollbar sits at the modal edge (see ModalBody).\n 'tw:data-[argo=false]:py-8',\n 'tw:data-[argo=true]:py-4',\n\n // animation — shared\n 'tw:duration-200',\n 'tw:data-[state=open]:animate-in',\n 'tw:data-[state=open]:fade-in-0',\n 'tw:data-[state=closed]:animate-out',\n 'tw:data-[state=closed]:fade-out-0',\n\n // NOTE: no `slide-*-left-1/2` (both) or argo `slide-*-top-1/2`. Those re-pinned the\n // -50%/-50% centring during the animation under v3, where centring and the animation\n // shared the `transform` property (the animation overrode it). Under v4 the centring\n // uses the `translate` PROPERTY while tw-animate-css animates `transform` — they compose\n // instead of overriding, so a -50% enter-translate stacks on the -50% centring (= -100%)\n // and the modal flies in from the top-left. Centring now persists on its own, so we\n // animate transform-only (zoom + fade) and the modal stays put.\n\n // legacy: slide-down + zoom (top-anchored via `top-20`, so no `translate-y` to double)\n 'tw:data-[argo=false]:data-[state=open]:zoom-in-80',\n 'tw:data-[argo=false]:data-[state=open]:slide-in-from-top-[48%]',\n 'tw:data-[argo=false]:data-[state=closed]:zoom-out-80',\n 'tw:data-[argo=false]:data-[state=closed]:slide-out-to-top-[48%]',\n\n // argo: pop from the centre — zoom only\n 'tw:data-[argo=true]:data-[state=open]:zoom-in-95',\n 'tw:data-[argo=true]:data-[state=closed]:zoom-out-95',\n\n {\n 'tw:max-w-[480px]': size === 'small',\n 'tw:max-w-4xl': size === 'large',\n },\n\n className,\n )}\n onEscapeKeyDown={handleEscapeKeyDown}\n >\n {children}\n </Content>\n </ModalOverlay>\n </Portal>\n );\n};\n","import type { ComponentPropsWithRef } from 'react';\n\nimport { cn } from '../../utils';\n\ntype Props = ComponentPropsWithRef<'div'>;\n\nexport const ModalFooter = ({ className, ...props }: Props) => (\n <div\n {...props}\n className={cn(\n // Own horizontal padding (ModalContent owns the vertical edge padding)\n 'tw:group-data-[argo=false]/modal:px-7',\n 'tw:group-data-[argo=true]/modal:px-4',\n className,\n )}\n />\n);\n","import type { ComponentProps } from 'react';\n\nimport { cn } from '../../utils';\n\ntype Props = ComponentProps<'div'>;\n\n/**\n * Container for the header's top-right controls — any `actions` passed to `Modal.Header` plus the\n * close icon. Sits in the header grid's last column, top-aligned. Mirrors `Alert`'s action slot.\n */\nexport const ModalActions = ({ className, ...props }: Props) => (\n <div\n className={cn(\n 'tw:col-start-3',\n 'tw:row-start-1',\n 'tw:self-start',\n 'tw:flex',\n 'tw:items-center',\n 'tw:gap-1',\n // argo: gutter separating the actions/close from the title (carried here so the grid needs no\n // column gap — see ModalHeader)\n 'tw:group-data-[argo=true]/modal:ml-3',\n className,\n )}\n {...props}\n />\n);\n","import type { ComponentProps, ReactNode } from 'react';\nimport { Close } from '@radix-ui/react-dialog';\n\nimport { X } from '../../icons';\nimport { cn } from '../../utils';\nimport { Button } from '../Button';\nimport { Separator } from '../Separator';\n\nimport { ModalActions } from './ModalActions';\nimport { ModalDescription } from './ModalDescription';\nimport { ModalTitle } from './ModalTitle';\n\ntype Props = {\n /** Status icon slot — `<Modal.Icon />` or `<Modal.Image />`. */\n icon?: ReactNode;\n /** Visible subtitle below the title (also fills `aria-describedby`). */\n description?: ReactNode;\n /** Screen-reader-only description; fills `aria-describedby` without rendering visibly. */\n 'aria-description'?: string;\n /** Controls rendered top-right, before the close icon. */\n actions?: ReactNode;\n /** Hide the top-right close icon. */\n hideCloseIcon?: boolean;\n} & ComponentProps<'div'>;\n\n/** Modal header: `[icon] | title (children) | actions + close` on row 1, `description` on row 2. */\nexport const ModalHeader = ({\n className,\n icon,\n description,\n 'aria-description': ariaDescription,\n actions,\n hideCloseIcon = false,\n children,\n ...props\n}: Props) => (\n <div\n {...props}\n data-slot=\"modal-header\"\n className={cn(\n 'tw:grid',\n 'tw:grid-cols-[auto_1fr_auto]',\n 'tw:items-center',\n 'tw:group-data-[argo=false]/modal:px-7',\n 'tw:group-data-[argo=true]/modal:px-4',\n className,\n )}\n >\n {icon}\n\n {children && <ModalTitle className=\"tw:col-start-2 tw:row-start-1\">{children}</ModalTitle>}\n {(actions || !hideCloseIcon) && (\n <ModalActions>\n {actions}\n {!hideCloseIcon && (\n <Close asChild>\n <Button variant=\"invisible\" size=\"icon-sm\">\n <X />\n <span className=\"tw:sr-only\">Close</span>\n </Button>\n </Close>\n )}\n </ModalActions>\n )}\n {(description || ariaDescription) && (\n <ModalDescription\n className={cn(\n 'tw:col-start-1',\n 'tw:col-end-4',\n 'tw:row-start-2',\n description ? 'tw:mt-1' : 'tw:sr-only',\n )}\n >\n {description ?? ariaDescription}\n </ModalDescription>\n )}\n\n {/* Legacy-only separator; shown when a Body follows, hidden when that body hosts Tabs. */}\n <div\n className={cn(\n 'tw:col-start-1',\n 'tw:col-end-4',\n 'tw:mt-5',\n 'tw:hidden',\n 'tw:group-data-[argo=false]/modal:[[data-slot=modal-header]:has(~[data-slot=modal-body])_&]:block',\n 'tw:group-data-[argo=false]/modal:[[data-slot=modal-header]:has(~[data-slot=modal-body]_[data-slot=tabs-root])_&]:!hidden',\n )}\n >\n <Separator orientation=\"horizontal\" />\n </div>\n </div>\n);\n","import type { ReactNode } from 'react';\n\nimport { cn } from '../../utils';\n\ntype NamedColor = 'orange' | 'blue' | 'red' | 'green' | 'gray' | 'violet';\n\ntype Props = {\n color: NamedColor | (string & {});\n icon: ReactNode;\n};\n\nconst NAMED_COLORS = new Set<string>(['orange', 'blue', 'red', 'green', 'gray', 'violet']);\n\n/**\n * Status-coloured icon for `Modal`. Authored inside `Modal.Header`. For a remote image badge (a\n * component or backend logo fetched by URL) use `Modal.Image` instead.\n *\n * - **Legacy anatomy:** a solid-filled circular badge docked to the top-left of `Modal.Content`\n * (absolutely positioned, so it renders identically wherever it is authored).\n * - **Argo anatomy** (`data-argo` on `Modal.Content`): a small soft-tinted inline badge in the\n * header grid, next to the title.\n *\n * Both variants are rendered and toggled purely via CSS (`group-data-[argo=true]/modal:`) — no\n * context. Use the categorical `color` (`red` destructive, `orange` warning, `green` success,\n * `blue` info, `gray` neutral, `violet` agent) to encode meaning; the palette stays fixed across\n * brand themes.\n */\nexport const ModalIcon = ({ color, icon }: Props) => {\n const customColor = color && !NAMED_COLORS.has(color) ? color : undefined;\n\n return (\n <span\n data-slot=\"modal-icon\"\n className={cn(\n 'tw:flex',\n 'tw:shrink-0',\n 'tw:items-center',\n 'tw:justify-center',\n 'tw:[&_svg]:aspect-square',\n\n // legacy: solid-filled circular badge floating at the modal's top-left\n 'tw:group-data-[argo=false]/modal:absolute',\n 'tw:group-data-[argo=false]/modal:top-0',\n 'tw:group-data-[argo=false]/modal:left-8',\n 'tw:group-data-[argo=false]/modal:-translate-y-1/2',\n 'tw:group-data-[argo=false]/modal:size-12',\n 'tw:group-data-[argo=false]/modal:rounded-full',\n 'tw:group-data-[argo=false]/modal:[&_svg:not([class*=\"tw:size-\"])]:size-6',\n\n // argo: soft-tinted inline badge in the header grid's first column\n 'tw:group-data-[argo=true]/modal:col-start-1',\n 'tw:group-data-[argo=true]/modal:row-start-1',\n 'tw:group-data-[argo=true]/modal:self-start',\n 'tw:group-data-[argo=true]/modal:mr-3',\n 'tw:group-data-[argo=true]/modal:size-8',\n 'tw:group-data-[argo=true]/modal:rounded',\n 'tw:group-data-[argo=true]/modal:overflow-hidden',\n 'tw:group-data-[argo=true]/modal:[&_svg:not([class*=\"tw:size-\"])]:size-5',\n\n // legacy palette: solid fill + white glyph (violet is the exception — tinted)\n {\n 'tw:group-data-[argo=false]/modal:bg-warning-500': color === 'orange',\n 'tw:group-data-[argo=false]/modal:bg-blue-500': color === 'blue',\n 'tw:group-data-[argo=false]/modal:bg-green-500': color === 'green',\n 'tw:group-data-[argo=false]/modal:bg-error-500': color === 'red',\n 'tw:group-data-[argo=false]/modal:bg-neutral-150': color === 'gray',\n 'tw:group-data-[argo=false]/modal:bg-purple-100': color === 'violet',\n 'tw:group-data-[argo=false]/modal:text-white': color !== 'violet',\n 'tw:group-data-[argo=false]/modal:text-purple-500': color === 'violet',\n },\n\n // argo palette: soft tint + matching glyph colour\n {\n 'tw:group-data-[argo=true]/modal:bg-warning-100 tw:group-data-[argo=true]/modal:text-warning-500':\n color === 'orange',\n 'tw:group-data-[argo=true]/modal:bg-blue-100 tw:group-data-[argo=true]/modal:text-blue-600':\n color === 'blue',\n 'tw:group-data-[argo=true]/modal:bg-green-100 tw:group-data-[argo=true]/modal:text-green-900':\n color === 'green',\n 'tw:group-data-[argo=true]/modal:bg-error-100 tw:group-data-[argo=true]/modal:text-error-500':\n color === 'red',\n 'tw:group-data-[argo=true]/modal:bg-neutral-100 tw:group-data-[argo=true]/modal:text-neutral-500':\n color === 'gray',\n 'tw:group-data-[argo=true]/modal:bg-purple-100 tw:group-data-[argo=true]/modal:text-purple-500':\n color === 'violet',\n },\n\n // custom (non-named) colour: caller-provided fill + white glyph\n { 'tw:text-white': !!customColor },\n )}\n style={customColor ? { backgroundColor: customColor } : undefined}\n >\n {icon}\n </span>\n );\n};\n","import { useEffect, useState } from 'react';\n\nimport { cn } from '../../utils';\n\ntype Props = {\n src: string;\n /** Accessible alt text. Defaults to `\"\"` (decorative) — provide it when the image carries meaning. */\n alt?: string;\n};\n\nexport const ModalImage = ({ src, alt = '' }: Props) => {\n const [hasImageError, setHasImageError] = useState(false);\n\n // Reset the error state when the source changes, so a reused badge (new logo, or a retry after a\n // transient failure) isn't permanently hidden by an earlier onError.\n useEffect(() => setHasImageError(false), [src]);\n\n if (hasImageError) return null;\n\n return (\n <span\n data-slot=\"modal-image\"\n className={cn(\n 'tw:shrink-0',\n 'tw:overflow-hidden',\n\n // legacy: circular badge floating at the top-left of the modal\n 'tw:group-data-[argo=false]/modal:absolute',\n 'tw:group-data-[argo=false]/modal:top-0',\n 'tw:group-data-[argo=false]/modal:left-8',\n 'tw:group-data-[argo=false]/modal:-translate-y-1/2',\n 'tw:group-data-[argo=false]/modal:size-12',\n 'tw:group-data-[argo=false]/modal:rounded-full',\n\n // argo: inline badge in the header grid's first column\n 'tw:group-data-[argo=true]/modal:flex',\n 'tw:group-data-[argo=true]/modal:col-start-1',\n 'tw:group-data-[argo=true]/modal:row-start-1',\n 'tw:group-data-[argo=true]/modal:self-start',\n 'tw:group-data-[argo=true]/modal:mr-3',\n 'tw:group-data-[argo=true]/modal:items-center',\n 'tw:group-data-[argo=true]/modal:justify-center',\n 'tw:group-data-[argo=true]/modal:rounded',\n 'tw:group-data-[argo=true]/modal:size-8',\n )}\n >\n <img\n src={src}\n alt={alt}\n className=\"tw:size-full tw:object-contain\"\n onError={() => setHasImageError(true)}\n />\n </span>\n );\n};\n","import type { ComponentProps } from 'react';\nimport { Close, Root, Trigger } from '@radix-ui/react-dialog';\n\nimport { ModalBody } from './ModalBody';\nimport { ModalContent } from './ModalContent';\nimport { ModalFooter } from './ModalFooter';\nimport { ModalHeader } from './ModalHeader';\nimport { ModalIcon } from './ModalIcon';\nimport { ModalImage } from './ModalImage';\nimport { ModalOverlay } from './ModalOverlay';\n\ntype Props = ComponentProps<typeof Root>;\n\n/**\n * Blocking dialog for confirmations, forms, and detail views. Built on Radix Dialog.\n *\n * **When to use:** the user must act before continuing (confirm a destructive action, fill a short form,\n * view a focused detail panel). Use the compound parts `Modal.Trigger`, `Modal.Content`, `Modal.Header`,\n * `Modal.Body`, `Modal.Footer`, and optionally `Modal.Icon` for a status-coloured header glyph.\n * **When NOT to use:** for slide-in side editing use `Sheet`; for an inline destructive confirmation anchored\n * to its trigger use `Popconfirm`; for hover previews use `HoverCard`.\n * **Composition:** wrap `Modal.Content` around `Modal.Header` + `Modal.Body` + `Modal.Footer`. Put `useAppForm`\n * `FormBody` inside `Modal.Body` and the submit / cancel buttons inside `Modal.Footer`.\n *\n * @see RECIPES.md#modal-form — for the canonical form-in-modal composition\n * @see RECIPES.md#confirm-dialog — for destructive-confirm dialogs\n */\nexport const Modal = (props: Props) => <Root {...props} />;\n\nModal.Close = Close;\nModal.Trigger = Trigger;\n\nModal.Content = ModalContent;\nModal.Body = ModalBody;\nModal.Icon = ModalIcon;\nModal.Image = ModalImage;\nModal.Footer = ModalFooter;\nModal.Header = ModalHeader;\nModal.Overlay = ModalOverlay;\n"],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { cn } from "./classNames-BzrkDnOD.js";
|
|
2
|
+
import { jsx } from "react/jsx-runtime";
|
|
3
|
+
import * as DialogPrimitive from "@radix-ui/react-dialog";
|
|
4
|
+
import { Overlay, Title } from "@radix-ui/react-dialog";
|
|
5
|
+
//#region src/components/Modal/ModalOverlay.tsx
|
|
6
|
+
const ModalOverlay = ({ ref, className, disableTransition = false, ...props }) => /* @__PURE__ */ jsx(Overlay, {
|
|
7
|
+
...props,
|
|
8
|
+
ref,
|
|
9
|
+
className: cn("tw:fixed", "tw:inset-0", "tw:z-[1051]", "tw:bg-black/50", "tw:data-[state=open]:duration-500", "tw:data-[state=open]:fade-in-0", "tw:data-[state=closed]:duration-500", "tw:data-[state=closed]:fade-out-0", { "tw:data-[state=open]:animate-in tw:data-[state=closed]:animate-out": !disableTransition }, className),
|
|
10
|
+
onClick: (event) => event.stopPropagation()
|
|
11
|
+
});
|
|
12
|
+
//#endregion
|
|
13
|
+
//#region src/components/Modal/ModalDescription.tsx
|
|
14
|
+
const ModalDescription = ({ className, ...props }) => /* @__PURE__ */ jsx(DialogPrimitive.Description, {
|
|
15
|
+
className: cn("tw:text-sm", "tw:font-sans", "tw:tracking-normal", "tw:font-normal", "tw:text-neutral-400", className),
|
|
16
|
+
...props
|
|
17
|
+
});
|
|
18
|
+
//#endregion
|
|
19
|
+
//#region src/components/Modal/ModalTitle.tsx
|
|
20
|
+
const ModalTitle = ({ children, className, ...props }) => /* @__PURE__ */ jsx(Title, {
|
|
21
|
+
...props,
|
|
22
|
+
className: cn("tw:flex-1", "tw:break-anywhere", "tw:text-base", "tw:font-semibold", className),
|
|
23
|
+
children
|
|
24
|
+
});
|
|
25
|
+
//#endregion
|
|
26
|
+
export { ModalDescription, ModalOverlay, ModalTitle };
|
|
27
|
+
|
|
28
|
+
//# sourceMappingURL=ModalTitle-C76ke2eo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ModalTitle-C76ke2eo.js","names":[],"sources":["../src/components/Modal/ModalOverlay.tsx","../src/components/Modal/ModalDescription.tsx","../src/components/Modal/ModalTitle.tsx"],"sourcesContent":["import type { ComponentProps } from 'react';\nimport { Overlay } from '@radix-ui/react-dialog';\n\nimport { cn } from '../../utils';\n\ntype Props = ComponentProps<typeof Overlay> & {\n disableTransition?: boolean;\n};\n\nexport const ModalOverlay = ({ ref, className, disableTransition = false, ...props }: Props) => (\n <Overlay\n {...props}\n ref={ref}\n className={cn(\n // positioning\n 'tw:fixed',\n 'tw:inset-0',\n 'tw:z-[1051]',\n\n // background\n 'tw:bg-black/50',\n\n // opening animation\n 'tw:data-[state=open]:duration-500',\n 'tw:data-[state=open]:fade-in-0',\n\n // closing animation\n 'tw:data-[state=closed]:duration-500',\n 'tw:data-[state=closed]:fade-out-0',\n {\n 'tw:data-[state=open]:animate-in tw:data-[state=closed]:animate-out': !disableTransition,\n },\n className,\n )}\n onClick={(event) => event.stopPropagation()}\n />\n);\n","import type { ComponentProps } from 'react';\nimport * as DialogPrimitive from '@radix-ui/react-dialog';\n\nimport { cn } from '../../utils';\n\ntype Props = ComponentProps<typeof DialogPrimitive.Description>;\n\nexport const ModalDescription = ({ className, ...props }: Props) => (\n <DialogPrimitive.Description\n className={cn(\n 'tw:text-sm',\n 'tw:font-sans',\n 'tw:tracking-normal',\n 'tw:font-normal',\n 'tw:text-neutral-400',\n className,\n )}\n {...props}\n />\n);\n","import type { ComponentProps } from 'react';\nimport { Title } from '@radix-ui/react-dialog';\n\nimport { cn } from '../../utils';\n\ntype Props = ComponentProps<typeof Title>;\n\nexport const ModalTitle = ({ children, className, ...props }: Props) => (\n <Title\n {...props}\n className={cn('tw:flex-1', 'tw:break-anywhere', 'tw:text-base', 'tw:font-semibold', className)}\n >\n {children}\n </Title>\n);\n"],"mappings":";;;;;AASA,MAAa,gBAAgB,EAAE,KAAK,WAAW,oBAAoB,OAAO,GAAG,YAC3E,oBAAC,SAAD;CACE,GAAI;CACC;CACL,WAAW,GAET,YACA,cACA,eAGA,kBAGA,qCACA,kCAGA,uCACA,qCACA,EACE,sEAAsE,CAAC,kBACzE,GACA,SACF;CACA,UAAU,UAAU,MAAM,gBAAgB;AAC3C,CAAA;;;AC5BH,MAAa,oBAAoB,EAAE,WAAW,GAAG,YAC/C,oBAAC,gBAAgB,aAAjB;CACE,WAAW,GACT,cACA,gBACA,sBACA,kBACA,uBACA,SACF;CACA,GAAI;AACL,CAAA;;;ACXH,MAAa,cAAc,EAAE,UAAU,WAAW,GAAG,YACnD,oBAAC,OAAD;CACE,GAAI;CACJ,WAAW,GAAG,aAAa,qBAAqB,gBAAgB,oBAAoB,SAAS;CAE5F;AACI,CAAA"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { cn } from "./classNames-BzrkDnOD.js";
|
|
2
|
+
import { Tooltip } from "./utils-D0c5VAyF.js";
|
|
3
|
+
import { Button } from "./Button-nzmDNS2q.js";
|
|
4
|
+
import { ButtonGroup } from "./internal/components/ButtonGroup.js";
|
|
5
|
+
import { jsx } from "react/jsx-runtime";
|
|
6
|
+
//#region src/blocks/MultiActionButtonGroup/MultiActionButton.tsx
|
|
7
|
+
const MultiActionButton = ({ disabled, icon, isLoading, label, onClick, tooltipContent, tooltipVariant, "data-testid": dataTestId }) => /* @__PURE__ */ jsx(Tooltip, {
|
|
8
|
+
placement: "top",
|
|
9
|
+
tooltip: tooltipContent,
|
|
10
|
+
triggerAsChild: true,
|
|
11
|
+
variant: tooltipVariant,
|
|
12
|
+
children: /* @__PURE__ */ jsx(Button, {
|
|
13
|
+
disabled,
|
|
14
|
+
isLoading,
|
|
15
|
+
"aria-label": label,
|
|
16
|
+
onClick,
|
|
17
|
+
variant: "invisible",
|
|
18
|
+
size: "icon",
|
|
19
|
+
"data-testid": dataTestId,
|
|
20
|
+
children: !isLoading && icon
|
|
21
|
+
})
|
|
22
|
+
});
|
|
23
|
+
//#endregion
|
|
24
|
+
//#region src/blocks/MultiActionButtonGroup/MultiActionButtonGroup.tsx
|
|
25
|
+
const MultiActionButtonGroup = ({ children, className }) => /* @__PURE__ */ jsx(ButtonGroup, {
|
|
26
|
+
className: cn("tw:text-nowrap", className),
|
|
27
|
+
children
|
|
28
|
+
});
|
|
29
|
+
MultiActionButtonGroup.Button = MultiActionButton;
|
|
30
|
+
//#endregion
|
|
31
|
+
export { MultiActionButtonGroup };
|
|
32
|
+
|
|
33
|
+
//# sourceMappingURL=MultiActionButtonGroup-CiBHxsSk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MultiActionButtonGroup-CiBHxsSk.js","names":[],"sources":["../src/blocks/MultiActionButtonGroup/MultiActionButton.tsx","../src/blocks/MultiActionButtonGroup/MultiActionButtonGroup.tsx"],"sourcesContent":["import type { ComponentProps, ReactNode } from 'react';\n\nimport { Button } from '../../components/Button';\nimport { Tooltip } from '../../components/Tooltip';\n\ntype Props = {\n disabled?: boolean;\n icon: ReactNode;\n isLoading?: boolean;\n label: string;\n onClick: ComponentProps<typeof Button>['onClick'];\n tooltipContent: ReactNode;\n tooltipVariant?: ComponentProps<typeof Tooltip>['variant'];\n 'data-testid'?: string;\n};\n\nexport const MultiActionButton = ({\n disabled,\n icon,\n isLoading,\n label,\n onClick,\n tooltipContent,\n tooltipVariant,\n 'data-testid': dataTestId,\n}: Props) => (\n <Tooltip placement=\"top\" tooltip={tooltipContent} triggerAsChild variant={tooltipVariant}>\n <Button\n disabled={disabled}\n isLoading={isLoading}\n aria-label={label}\n onClick={onClick}\n variant=\"invisible\"\n size=\"icon\"\n data-testid={dataTestId}\n >\n {!isLoading && icon}\n </Button>\n </Tooltip>\n);\n","import type { PropsWithChildren } from 'react';\n\nimport { ButtonGroup } from '../../components/ButtonGroup';\nimport { cn } from '../../utils';\n\nimport { MultiActionButton } from './MultiActionButton';\n\ntype Props = {\n className?: string;\n} & PropsWithChildren;\n\nexport const MultiActionButtonGroup = ({ children, className }: Props) => (\n <ButtonGroup className={cn('tw:text-nowrap', className)}>{children}</ButtonGroup>\n);\n\nMultiActionButtonGroup.Button = MultiActionButton;\n"],"mappings":";;;;;;AAgBA,MAAa,qBAAqB,EAChC,UACA,MACA,WACA,OACA,SACA,gBACA,gBACA,eAAe,iBAEf,oBAAC,SAAD;CAAS,WAAU;CAAM,SAAS;CAAgB,gBAAA;CAAe,SAAS;CACxE,UAAA,oBAAC,QAAD;EACY;EACC;EACX,cAAY;EACH;EACT,SAAQ;EACR,MAAK;EACL,eAAa;EAEZ,UAAA,CAAC,aAAa;CACT,CAAA;AACD,CAAA;;;AC3BX,MAAa,0BAA0B,EAAE,UAAU,gBACjD,oBAAC,aAAD;CAAa,WAAW,GAAG,kBAAkB,SAAS;CAAI;AAAsB,CAAA;AAGlF,uBAAuB,SAAS"}
|
|
@@ -0,0 +1,322 @@
|
|
|
1
|
+
import { cn } from "./classNames-BzrkDnOD.js";
|
|
2
|
+
import { Search } from "./icons-Cek151jC.js";
|
|
3
|
+
import { ScrollArea } from "./internal/components/ScrollArea.js";
|
|
4
|
+
import { BrandLogo } from "./BrandLogo-CJkRd0F8.js";
|
|
5
|
+
import { Root, Slot, Slottable } from "@radix-ui/react-slot";
|
|
6
|
+
import { cva } from "class-variance-authority";
|
|
7
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
8
|
+
import BoringAvatar from "boring-avatars";
|
|
9
|
+
import * as RadixAvatar from "@radix-ui/react-avatar";
|
|
10
|
+
//#region src/components/Navbar/NavbarContent.tsx
|
|
11
|
+
const NavbarContent = ({ children, className }) => /* @__PURE__ */ jsx(ScrollArea, {
|
|
12
|
+
type: "auto",
|
|
13
|
+
orientation: "horizontal",
|
|
14
|
+
className: "tw:flex-1",
|
|
15
|
+
scrollBarClassName: "tw:h-1.5",
|
|
16
|
+
children: /* @__PURE__ */ jsx("div", {
|
|
17
|
+
className: cn("tw:flex", "tw:py-1.5", className),
|
|
18
|
+
children
|
|
19
|
+
})
|
|
20
|
+
});
|
|
21
|
+
//#endregion
|
|
22
|
+
//#region src/components/Navbar/NavbarFooter.tsx
|
|
23
|
+
const NavbarFooter = ({ children, className, ...rest }) => /* @__PURE__ */ jsx("div", {
|
|
24
|
+
...rest,
|
|
25
|
+
className: cn("tw:flex tw:items-center tw:gap-2 tw:py-1.5", className),
|
|
26
|
+
children
|
|
27
|
+
});
|
|
28
|
+
//#endregion
|
|
29
|
+
//#region src/components/Navbar/NavbarHeader.tsx
|
|
30
|
+
const NavbarHeader = ({ children, className, ...rest }) => /* @__PURE__ */ jsx("div", {
|
|
31
|
+
...rest,
|
|
32
|
+
className: cn("tw:overflow-hidden", "tw:py-1.5", className),
|
|
33
|
+
children: children ?? /* @__PURE__ */ jsx(BrandLogo, {
|
|
34
|
+
variant: "wordmark",
|
|
35
|
+
className: "tw:h-7"
|
|
36
|
+
})
|
|
37
|
+
});
|
|
38
|
+
//#endregion
|
|
39
|
+
//#region src/components/Navbar/NavbarMenu.tsx
|
|
40
|
+
const variants$2 = cva([
|
|
41
|
+
"tw:m-0",
|
|
42
|
+
"tw:p-0",
|
|
43
|
+
"tw:flex",
|
|
44
|
+
"tw:items-center",
|
|
45
|
+
"tw:justify-center",
|
|
46
|
+
"tw:gap-2"
|
|
47
|
+
], {
|
|
48
|
+
variants: { marker: {
|
|
49
|
+
none: [],
|
|
50
|
+
"forward-slash": [
|
|
51
|
+
"tw:[&_li]:flex",
|
|
52
|
+
"tw:[&_li]:items-center",
|
|
53
|
+
"tw:[&_li]:before:content-[\"/\"]",
|
|
54
|
+
"tw:[&_li]:before:text-border",
|
|
55
|
+
"tw:[&_li]:before:text-sm",
|
|
56
|
+
"tw:[&_li]:before:mr-0.5",
|
|
57
|
+
"tw:[&_li:not(:first-child)]:before:ml-0.5"
|
|
58
|
+
]
|
|
59
|
+
} },
|
|
60
|
+
defaultVariants: { marker: "none" }
|
|
61
|
+
});
|
|
62
|
+
const NavbarMenu = ({ className, marker, ...rest }) => /* @__PURE__ */ jsx("ul", {
|
|
63
|
+
...rest,
|
|
64
|
+
className: variants$2({
|
|
65
|
+
marker,
|
|
66
|
+
className
|
|
67
|
+
})
|
|
68
|
+
});
|
|
69
|
+
//#endregion
|
|
70
|
+
//#region src/components/Navbar/NavbarMenuAvatar.tsx
|
|
71
|
+
const NavbarMenuAvatar = ({ ref, className, type = "button", src, alt, ...rest }) => {
|
|
72
|
+
const altText = alt ?? "Avatar";
|
|
73
|
+
return /* @__PURE__ */ jsx("button", {
|
|
74
|
+
...rest,
|
|
75
|
+
ref,
|
|
76
|
+
type,
|
|
77
|
+
className: cn("tw:flex", "tw:items-center", "tw:justify-center", "tw:size-8", "tw:aspect-square", "tw:overflow-hidden", "tw:shrink-0", "tw:rounded-lg", "tw:bg-transparent", "tw:cursor-pointer", "tw:disabled:opacity-50", "tw:disabled:cursor-not-allowed", "tw:focus-visible:outline-hidden", "tw:focus-visible:ring-2", "tw:focus-visible:ring-sidebar-ring/50", className),
|
|
78
|
+
children: /* @__PURE__ */ jsxs(RadixAvatar.Root, { children: [/* @__PURE__ */ jsx(RadixAvatar.Image, {
|
|
79
|
+
src,
|
|
80
|
+
alt: altText,
|
|
81
|
+
className: "tw:size-full tw:object-cover"
|
|
82
|
+
}), /* @__PURE__ */ jsx(RadixAvatar.Fallback, {
|
|
83
|
+
asChild: true,
|
|
84
|
+
children: /* @__PURE__ */ jsx(BoringAvatar, {
|
|
85
|
+
square: true,
|
|
86
|
+
name: altText,
|
|
87
|
+
variant: "beam",
|
|
88
|
+
colors: [
|
|
89
|
+
"#1F8FFF",
|
|
90
|
+
"#004787",
|
|
91
|
+
"#28D8FF",
|
|
92
|
+
"#925cff",
|
|
93
|
+
"#A8C2E6"
|
|
94
|
+
],
|
|
95
|
+
size: 32
|
|
96
|
+
})
|
|
97
|
+
})] })
|
|
98
|
+
});
|
|
99
|
+
};
|
|
100
|
+
//#endregion
|
|
101
|
+
//#region src/components/Navbar/NavbarMenuItemAdornment.tsx
|
|
102
|
+
const variants$1 = cva([
|
|
103
|
+
"tw:flex",
|
|
104
|
+
"tw:justify-center",
|
|
105
|
+
"tw:items-center",
|
|
106
|
+
"tw:[&_svg:not([class*=\"tw:size-\"])]:size-3",
|
|
107
|
+
"tw:[&:not(svg)]:h-5",
|
|
108
|
+
"tw:[&:not(svg)]:min-w-5",
|
|
109
|
+
"tw:p-1",
|
|
110
|
+
"tw:aspect-square",
|
|
111
|
+
"tw:rounded-md"
|
|
112
|
+
], {
|
|
113
|
+
defaultVariants: { variant: "icon-accent" },
|
|
114
|
+
variants: { variant: {
|
|
115
|
+
icon: ["tw:text-sidebar-foreground", "tw:[&_svg]:text-sidebar-foreground"],
|
|
116
|
+
"icon-emphasized": ["tw:text-white", "tw:[&_svg]:text-white"],
|
|
117
|
+
"icon-accent": [
|
|
118
|
+
"tw:group-data-[accent=blue]/navbar:text-sidebar-primary",
|
|
119
|
+
"tw:group-data-[accent=blue]/navbar:[&_svg]:text-sidebar-primary",
|
|
120
|
+
"tw:group-data-[accent=purple]/navbar:text-purple-500",
|
|
121
|
+
"tw:group-data-[accent=purple]/navbar:[&_svg]:text-purple-500",
|
|
122
|
+
"tw:group-data-[accent=orange]/navbar:text-warning-500",
|
|
123
|
+
"tw:group-data-[accent=orange]/navbar:[&_svg]:text-warning-500",
|
|
124
|
+
"tw:group-data-[accent=green]/navbar:text-primary-500",
|
|
125
|
+
"tw:group-data-[accent=green]/navbar:[&_svg]:text-primary-500"
|
|
126
|
+
],
|
|
127
|
+
"icon-accent-emphasized": [
|
|
128
|
+
"tw:text-white",
|
|
129
|
+
"tw:[&_svg]:text-white",
|
|
130
|
+
"tw:group-data-[accent=blue]/navbar:bg-sidebar-primary",
|
|
131
|
+
"tw:group-data-[accent=purple]/navbar:bg-purple-500",
|
|
132
|
+
"tw:group-data-[accent=orange]/navbar:bg-warning-500",
|
|
133
|
+
"tw:group-data-[accent=green]/navbar:bg-primary-500"
|
|
134
|
+
],
|
|
135
|
+
"icon-button": [
|
|
136
|
+
"tw:size-4",
|
|
137
|
+
"tw:!p-0",
|
|
138
|
+
"tw:[&_svg:not([class*=\"tw:size-\"])]:size-4"
|
|
139
|
+
],
|
|
140
|
+
shortcut: [
|
|
141
|
+
"tw:bg-muted",
|
|
142
|
+
"tw:text-sidebar-foreground",
|
|
143
|
+
"tw:ml-auto"
|
|
144
|
+
]
|
|
145
|
+
} }
|
|
146
|
+
});
|
|
147
|
+
const NavbarMenuItemAdornment = ({ ref, asChild = false, className, variant = "icon-accent", ...props }) => {
|
|
148
|
+
return /* @__PURE__ */ jsx(asChild ? Slot : "span", {
|
|
149
|
+
...props,
|
|
150
|
+
ref,
|
|
151
|
+
className: variants$1({
|
|
152
|
+
variant,
|
|
153
|
+
className
|
|
154
|
+
})
|
|
155
|
+
});
|
|
156
|
+
};
|
|
157
|
+
//#endregion
|
|
158
|
+
//#region src/components/Navbar/NavbarMenuButton.tsx
|
|
159
|
+
const variants = cva([
|
|
160
|
+
"tw:group/navbar-menu-button",
|
|
161
|
+
"tw:box-border",
|
|
162
|
+
"tw:flex",
|
|
163
|
+
"tw:items-center",
|
|
164
|
+
"tw:gap-2",
|
|
165
|
+
"tw:bg-transparent",
|
|
166
|
+
"tw:leading-9",
|
|
167
|
+
"tw:border",
|
|
168
|
+
"tw:rounded-lg",
|
|
169
|
+
"tw:whitespace-nowrap",
|
|
170
|
+
"tw:select-none",
|
|
171
|
+
"tw:!outline-hidden",
|
|
172
|
+
"tw:focus-visible:ring-2",
|
|
173
|
+
"tw:focus-visible:ring-sidebar-ring/50",
|
|
174
|
+
"tw:disabled:opacity-50",
|
|
175
|
+
"tw:disabled:hover:bg-transparent",
|
|
176
|
+
"tw:disabled:cursor-not-allowed"
|
|
177
|
+
], {
|
|
178
|
+
defaultVariants: { variant: "default" },
|
|
179
|
+
variants: { variant: {
|
|
180
|
+
default: [
|
|
181
|
+
"tw:max-h-9",
|
|
182
|
+
"tw:border-transparent",
|
|
183
|
+
"tw:py-2",
|
|
184
|
+
"tw:px-1.5",
|
|
185
|
+
"tw:text-sidebar-foreground",
|
|
186
|
+
"tw:hover:bg-sidebar-accent",
|
|
187
|
+
"tw:aria-expanded:bg-sidebar-accent"
|
|
188
|
+
],
|
|
189
|
+
emphasized: [
|
|
190
|
+
"tw:max-h-9",
|
|
191
|
+
"tw:border-transparent",
|
|
192
|
+
"tw:py-2",
|
|
193
|
+
"tw:px-1.5",
|
|
194
|
+
"tw:text-sidebar-foreground",
|
|
195
|
+
"tw:hover:bg-sidebar-accent",
|
|
196
|
+
"tw:aria-expanded:bg-sidebar-accent",
|
|
197
|
+
"tw:font-semibold"
|
|
198
|
+
],
|
|
199
|
+
icon: [
|
|
200
|
+
"tw:size-8",
|
|
201
|
+
"tw:aspect-square",
|
|
202
|
+
"tw:justify-center",
|
|
203
|
+
"tw:font-normal",
|
|
204
|
+
"tw:border-transparent",
|
|
205
|
+
"tw:text-primary",
|
|
206
|
+
"tw:[&_svg]:!text-primary",
|
|
207
|
+
"tw:hover:bg-sidebar-accent",
|
|
208
|
+
"tw:aria-expanded:bg-sidebar-accent"
|
|
209
|
+
],
|
|
210
|
+
search: [
|
|
211
|
+
"tw:max-h-8",
|
|
212
|
+
"tw:min-w-52",
|
|
213
|
+
"tw:px-3",
|
|
214
|
+
"tw:py-1",
|
|
215
|
+
"tw:font-normal",
|
|
216
|
+
"tw:border-input",
|
|
217
|
+
"tw:text-muted-foreground",
|
|
218
|
+
"tw:[&_svg]:!text-muted-foreground"
|
|
219
|
+
]
|
|
220
|
+
} }
|
|
221
|
+
});
|
|
222
|
+
const NavbarMenuButton = ({ ref, className, type = "button", children, icon, asChild = false, variant = "default", ...rest }) => {
|
|
223
|
+
const Comp = asChild ? Root : "button";
|
|
224
|
+
const isSearchVariant = variant === "search";
|
|
225
|
+
const isEmphasizedVariant = variant === "emphasized";
|
|
226
|
+
const adornment = isSearchVariant ? /* @__PURE__ */ jsx(Search, {}) : icon;
|
|
227
|
+
const adornmentVariant = (() => {
|
|
228
|
+
if (isSearchVariant || variant === "icon") return "icon-button";
|
|
229
|
+
if (isEmphasizedVariant) return "icon-accent-emphasized";
|
|
230
|
+
return "icon-accent";
|
|
231
|
+
})();
|
|
232
|
+
return /* @__PURE__ */ jsxs(Comp, {
|
|
233
|
+
...rest,
|
|
234
|
+
ref,
|
|
235
|
+
type,
|
|
236
|
+
"data-variant": variant,
|
|
237
|
+
className: cn(variants({
|
|
238
|
+
className,
|
|
239
|
+
variant
|
|
240
|
+
})),
|
|
241
|
+
children: [adornment && /* @__PURE__ */ jsx(NavbarMenuItemAdornment, {
|
|
242
|
+
variant: adornmentVariant,
|
|
243
|
+
children: adornment
|
|
244
|
+
}), /* @__PURE__ */ jsx(Slottable, { children })]
|
|
245
|
+
});
|
|
246
|
+
};
|
|
247
|
+
//#endregion
|
|
248
|
+
//#region src/components/Navbar/NavbarMenuItem.tsx
|
|
249
|
+
const NavbarMenuItem = ({ className, ...rest }) => /* @__PURE__ */ jsx("li", {
|
|
250
|
+
...rest,
|
|
251
|
+
className: cn("tw:flex", "tw:items-center", "tw:gap-2", className)
|
|
252
|
+
});
|
|
253
|
+
//#endregion
|
|
254
|
+
//#region src/components/Navbar/Navbar.tsx
|
|
255
|
+
const navbarClassnames = cva([
|
|
256
|
+
"tailwindcss-preflight",
|
|
257
|
+
"tw:group/navbar",
|
|
258
|
+
"tw:sticky",
|
|
259
|
+
"tw:top-0",
|
|
260
|
+
"tw:z-50",
|
|
261
|
+
"tw:flex",
|
|
262
|
+
"tw:gap-2",
|
|
263
|
+
"tw:items-center",
|
|
264
|
+
"tw:pl-2",
|
|
265
|
+
"tw:pr-3",
|
|
266
|
+
"tw:bg-sidebar",
|
|
267
|
+
"tw:text-sidebar-foreground",
|
|
268
|
+
"tw:text-xs",
|
|
269
|
+
"tw:leading-4"
|
|
270
|
+
], {
|
|
271
|
+
defaultVariants: { bordered: false },
|
|
272
|
+
variants: { bordered: {
|
|
273
|
+
true: [
|
|
274
|
+
"tw:before:content",
|
|
275
|
+
"tw:before:h-0.5",
|
|
276
|
+
"tw:before:w-full",
|
|
277
|
+
"tw:before:absolute",
|
|
278
|
+
"tw:before:left-0",
|
|
279
|
+
"tw:before:top-0",
|
|
280
|
+
"tw:before:data-[accent=blue]:bg-sidebar-primary",
|
|
281
|
+
"tw:before:data-[accent=purple]:bg-purple-500",
|
|
282
|
+
"tw:before:data-[accent=green]:bg-primary-500",
|
|
283
|
+
"tw:before:data-[accent=orange]:bg-warning-500"
|
|
284
|
+
],
|
|
285
|
+
false: ""
|
|
286
|
+
} }
|
|
287
|
+
});
|
|
288
|
+
/**
|
|
289
|
+
* Top navigation bar for the app shell. Host inside `<AppShell.Header>` to give a
|
|
290
|
+
* top-nav (or `keboola-legacy` top-bar) layout its primary navigation, brand mark,
|
|
291
|
+
* and account/actions area.
|
|
292
|
+
*
|
|
293
|
+
* **Composition:** `Navbar.Header` (left — brand / logo), `Navbar.Content` (center —
|
|
294
|
+
* primary `Navbar.Menu` of `Navbar.MenuItem` + `Navbar.MenuButton`, horizontally
|
|
295
|
+
* scrollable), and `Navbar.Footer` (right — search, notifications, `Navbar.MenuAvatar`).
|
|
296
|
+
* `bordered` renders a top accent hairline whose color follows `accent`. Renders a
|
|
297
|
+
* `<nav>` landmark with a default `aria-label` — override it via `aria-label` /
|
|
298
|
+
* `aria-labelledby` when a page has more than one nav.
|
|
299
|
+
*
|
|
300
|
+
* @see AppShell — pair with `AppShell.Header`; the sidebar rail uses `Sidebar` instead.
|
|
301
|
+
*/
|
|
302
|
+
const Navbar = ({ className, accent = "blue", bordered = false, ...rest }) => /* @__PURE__ */ jsx("nav", {
|
|
303
|
+
"aria-label": "Main navigation",
|
|
304
|
+
...rest,
|
|
305
|
+
"data-accent": accent,
|
|
306
|
+
className: navbarClassnames({
|
|
307
|
+
bordered,
|
|
308
|
+
className
|
|
309
|
+
})
|
|
310
|
+
});
|
|
311
|
+
Navbar.Header = NavbarHeader;
|
|
312
|
+
Navbar.Footer = NavbarFooter;
|
|
313
|
+
Navbar.Content = NavbarContent;
|
|
314
|
+
Navbar.Menu = NavbarMenu;
|
|
315
|
+
Navbar.MenuItem = NavbarMenuItem;
|
|
316
|
+
Navbar.MenuButton = NavbarMenuButton;
|
|
317
|
+
Navbar.MenuItemAdornment = NavbarMenuItemAdornment;
|
|
318
|
+
Navbar.MenuAvatar = NavbarMenuAvatar;
|
|
319
|
+
//#endregion
|
|
320
|
+
export { Navbar };
|
|
321
|
+
|
|
322
|
+
//# sourceMappingURL=Navbar-t16usFZQ.js.map
|