@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,308 @@
|
|
|
1
|
+
import { cn } from "./classNames-BzrkDnOD.js";
|
|
2
|
+
import { useArgoDesign } from "./context-KxxeMHbR.js";
|
|
3
|
+
import { Slot } from "@radix-ui/react-slot";
|
|
4
|
+
import { useEffect, useState } from "react";
|
|
5
|
+
import { Content, Portal, Provider, Root as Root$1, Trigger } from "@radix-ui/react-tooltip";
|
|
6
|
+
import { cva } from "class-variance-authority";
|
|
7
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
8
|
+
//#region src/utils/copyToClipboard.ts
|
|
9
|
+
/**
|
|
10
|
+
* The async Clipboard API requires the document to be focused and rejects with
|
|
11
|
+
* `NotAllowedError: Document is not focused` otherwise — which is the normal state
|
|
12
|
+
* for a page inside an iframe that has not taken focus, such as Storybook's canvas
|
|
13
|
+
* or an embedded preview. `execCommand` has no such requirement because it copies
|
|
14
|
+
* the selection of a node we focus ourselves, so it covers that gap.
|
|
15
|
+
*/
|
|
16
|
+
const copyViaSelection = (text) => {
|
|
17
|
+
const node = document.createElement("textarea");
|
|
18
|
+
node.value = text;
|
|
19
|
+
node.setAttribute("readonly", "");
|
|
20
|
+
node.style.cssText = "position:fixed;top:0;left:0;opacity:0";
|
|
21
|
+
document.body.append(node);
|
|
22
|
+
node.select();
|
|
23
|
+
try {
|
|
24
|
+
return document.execCommand("copy");
|
|
25
|
+
} finally {
|
|
26
|
+
node.remove();
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
const copyToClipboard = async (text) => {
|
|
30
|
+
try {
|
|
31
|
+
await navigator.clipboard.writeText(text);
|
|
32
|
+
} catch (error) {
|
|
33
|
+
if (!copyViaSelection(text)) throw error;
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
//#endregion
|
|
37
|
+
//#region src/utils/createChangeInputEvent.ts
|
|
38
|
+
const createChangeInputEvent = (input) => {
|
|
39
|
+
const changeEvent = {
|
|
40
|
+
target: input,
|
|
41
|
+
currentTarget: input,
|
|
42
|
+
type: "change",
|
|
43
|
+
nativeEvent: new Event("change", { bubbles: true }),
|
|
44
|
+
bubbles: true,
|
|
45
|
+
cancelable: false,
|
|
46
|
+
defaultPrevented: false,
|
|
47
|
+
eventPhase: 2,
|
|
48
|
+
isTrusted: false,
|
|
49
|
+
preventDefault: () => {},
|
|
50
|
+
isDefaultPrevented: () => false,
|
|
51
|
+
stopPropagation: () => {},
|
|
52
|
+
isPropagationStopped: () => false,
|
|
53
|
+
persist: () => {},
|
|
54
|
+
timeStamp: Date.now()
|
|
55
|
+
};
|
|
56
|
+
Object.defineProperty(changeEvent, "target", {
|
|
57
|
+
value: input,
|
|
58
|
+
writable: false
|
|
59
|
+
});
|
|
60
|
+
return changeEvent;
|
|
61
|
+
};
|
|
62
|
+
//#endregion
|
|
63
|
+
//#region src/constants/keyCodes.ts
|
|
64
|
+
const keyCodes = {
|
|
65
|
+
ENTER: "Enter",
|
|
66
|
+
ESCAPE: "Escape",
|
|
67
|
+
SPACE: " "
|
|
68
|
+
};
|
|
69
|
+
//#endregion
|
|
70
|
+
//#region src/components/Tooltip/TooltipContent.tsx
|
|
71
|
+
const tooltipVariants = cva([
|
|
72
|
+
"tailwindcss-preflight",
|
|
73
|
+
"tw:inline-block",
|
|
74
|
+
"tw:break-anywhere",
|
|
75
|
+
"tw:max-h-96",
|
|
76
|
+
"tw:overflow-y-auto",
|
|
77
|
+
"tw:z-[1060]",
|
|
78
|
+
"tw:rounded",
|
|
79
|
+
"tw:bg-neutral-800",
|
|
80
|
+
"tw:text-white",
|
|
81
|
+
"tw:data-[argo=true]:rounded-2xl",
|
|
82
|
+
"tw:data-[argo=true]:border",
|
|
83
|
+
"tw:data-[argo=true]:border-solid",
|
|
84
|
+
"tw:data-[argo=true]:border-border",
|
|
85
|
+
"tw:data-[argo=true]:bg-popover",
|
|
86
|
+
"tw:data-[argo=true]:text-popover-foreground",
|
|
87
|
+
"tw:data-[argo=true]:shadow-md",
|
|
88
|
+
"tw:data-[argo=true]:data-[state=delayed-open]:animate-in",
|
|
89
|
+
"tw:data-[argo=true]:data-[state=instant-open]:animate-in",
|
|
90
|
+
"tw:data-[argo=true]:data-[state=delayed-open]:fade-in-0",
|
|
91
|
+
"tw:data-[argo=true]:data-[state=instant-open]:fade-in-0",
|
|
92
|
+
"tw:data-[argo=true]:data-[state=delayed-open]:zoom-in-95",
|
|
93
|
+
"tw:data-[argo=true]:data-[state=instant-open]:zoom-in-95",
|
|
94
|
+
"tw:data-[argo=true]:data-[state=closed]:animate-out",
|
|
95
|
+
"tw:data-[argo=true]:data-[state=closed]:fade-out-0",
|
|
96
|
+
"tw:data-[argo=true]:data-[state=closed]:zoom-out-95",
|
|
97
|
+
"tw:data-[argo=true]:data-[side=bottom]:slide-in-from-top-2",
|
|
98
|
+
"tw:data-[argo=true]:data-[side=left]:slide-in-from-right-2",
|
|
99
|
+
"tw:data-[argo=true]:data-[side=right]:slide-in-from-left-2",
|
|
100
|
+
"tw:data-[argo=true]:data-[side=top]:slide-in-from-bottom-2"
|
|
101
|
+
], {
|
|
102
|
+
defaultVariants: { variant: "action" },
|
|
103
|
+
variants: { variant: {
|
|
104
|
+
action: [
|
|
105
|
+
"tw:max-w-fit",
|
|
106
|
+
"tw:px-3",
|
|
107
|
+
"tw:py-2",
|
|
108
|
+
"tw:text-center",
|
|
109
|
+
"tw:text-xs",
|
|
110
|
+
"tw:font-medium",
|
|
111
|
+
"tw:uppercase",
|
|
112
|
+
"tw:tracking-wider",
|
|
113
|
+
"tw:[[data-brand=keboola]_&]:normal-case",
|
|
114
|
+
"tw:[[data-brand=keboola]_&]:tracking-normal"
|
|
115
|
+
],
|
|
116
|
+
explanatory: [
|
|
117
|
+
"tw:max-w-80",
|
|
118
|
+
"tw:px-4",
|
|
119
|
+
"tw:py-3",
|
|
120
|
+
"tw:text-left",
|
|
121
|
+
"tw:text-sm",
|
|
122
|
+
"tw:font-normal"
|
|
123
|
+
]
|
|
124
|
+
} }
|
|
125
|
+
});
|
|
126
|
+
const TooltipContent = ({ className, variant, keepOpenOnPointerDownOutside = false, children, onPointerDownOutside, sideOffset = 8, collisionPadding = 8, hideWhenDetached = true, placement = "right", ...rest }) => {
|
|
127
|
+
const renderArgo = useArgoDesign();
|
|
128
|
+
const handlePointerDownOutside = (event) => {
|
|
129
|
+
if (keepOpenOnPointerDownOutside) event.preventDefault();
|
|
130
|
+
onPointerDownOutside?.(event);
|
|
131
|
+
};
|
|
132
|
+
return /* @__PURE__ */ jsx(Portal, { children: /* @__PURE__ */ jsx(Content, {
|
|
133
|
+
...rest,
|
|
134
|
+
"data-tooltip-content": renderArgo ? void 0 : true,
|
|
135
|
+
"data-argo": renderArgo,
|
|
136
|
+
sideOffset,
|
|
137
|
+
collisionPadding,
|
|
138
|
+
onPointerDownOutside: handlePointerDownOutside,
|
|
139
|
+
className: tooltipVariants({
|
|
140
|
+
className,
|
|
141
|
+
variant
|
|
142
|
+
}),
|
|
143
|
+
hideWhenDetached,
|
|
144
|
+
side: placement,
|
|
145
|
+
children
|
|
146
|
+
}) });
|
|
147
|
+
};
|
|
148
|
+
//#endregion
|
|
149
|
+
//#region src/components/Tooltip/TooltipRoot.tsx
|
|
150
|
+
const DELAY_SHOW_TOOLTIP = 300;
|
|
151
|
+
const TooltipRoot = ({ children, delayDuration = DELAY_SHOW_TOOLTIP, ...rest }) => /* @__PURE__ */ jsx(Root$1, {
|
|
152
|
+
...rest,
|
|
153
|
+
delayDuration,
|
|
154
|
+
children
|
|
155
|
+
});
|
|
156
|
+
//#endregion
|
|
157
|
+
//#region src/components/Tooltip/TooltipTrigger.tsx
|
|
158
|
+
/**
|
|
159
|
+
* Radix stamps the tooltip's own open/closed `data-state` onto the trigger. Merged onto an
|
|
160
|
+
* `asChild` child that keeps a `data-state` of its own — `ToggleGroup.Item`, `Switch`, a `Tabs`
|
|
161
|
+
* trigger — it wins, because those primitives spread incoming props *after* their own attribute.
|
|
162
|
+
* The child then silently loses every `data-[state=…]` style it has, which is usually the only
|
|
163
|
+
* thing marking it as selected.
|
|
164
|
+
*
|
|
165
|
+
* The tooltip's trigger state is styled nowhere, so it is dropped before it reaches the child.
|
|
166
|
+
*/
|
|
167
|
+
const WithoutTooltipState = ({ children, ...props }) => {
|
|
168
|
+
const { "data-state": _tooltipState, ...rest } = props;
|
|
169
|
+
return /* @__PURE__ */ jsx(Slot, {
|
|
170
|
+
...rest,
|
|
171
|
+
children
|
|
172
|
+
});
|
|
173
|
+
};
|
|
174
|
+
const TooltipTrigger = ({ ref, children, className, keepOpenOnClick = false, onClick, onPointerDown, asChild, ...rest }) => {
|
|
175
|
+
const handleClick = (event) => {
|
|
176
|
+
if (keepOpenOnClick) event.preventDefault();
|
|
177
|
+
onClick?.(event);
|
|
178
|
+
};
|
|
179
|
+
const handlePointerDown = (event) => {
|
|
180
|
+
if (keepOpenOnClick) event.preventDefault();
|
|
181
|
+
onPointerDown?.(event);
|
|
182
|
+
};
|
|
183
|
+
return /* @__PURE__ */ jsx(Trigger, {
|
|
184
|
+
...rest,
|
|
185
|
+
asChild: true,
|
|
186
|
+
ref,
|
|
187
|
+
className: cn("tailwindcss-preflight", className),
|
|
188
|
+
onClick: handleClick,
|
|
189
|
+
onPointerDown: handlePointerDown,
|
|
190
|
+
children: asChild ? /* @__PURE__ */ jsx(WithoutTooltipState, { children }) : /* @__PURE__ */ jsx("span", {
|
|
191
|
+
className: "tw:inline-flex tw:items-center",
|
|
192
|
+
children
|
|
193
|
+
})
|
|
194
|
+
});
|
|
195
|
+
};
|
|
196
|
+
//#endregion
|
|
197
|
+
//#region src/components/Tooltip/Tooltip.tsx
|
|
198
|
+
const ACTION_TOOLTIP_LIMIT = 30;
|
|
199
|
+
/** Re-export of Radix `Tooltip.Provider`. Mount once at the app root so tooltips share delay state. */
|
|
200
|
+
const TooltipProvider = Provider;
|
|
201
|
+
/**
|
|
202
|
+
* Short plain-text label that appears on hover or focus.
|
|
203
|
+
*
|
|
204
|
+
* **When to use:** describing an icon-only `Button`, explaining a disabled control, or labelling a
|
|
205
|
+
* truncated value. Plain text only — auto-switches to the longer `"explanatory"` variant when the string
|
|
206
|
+
* exceeds 30 characters.
|
|
207
|
+
* **When NOT to use:** for rich preview content (multiple lines, formatted text, structured data) use
|
|
208
|
+
* `HoverCard`; for tooltips containing links or buttons use `Popover` (interactive elements break a11y
|
|
209
|
+
* inside a `Tooltip`).
|
|
210
|
+
* **Composition:** wrap any focusable element via `triggerAsChild` so the tooltip targets the underlying
|
|
211
|
+
* native element. Mount `TooltipProvider` once at the app root.
|
|
212
|
+
*
|
|
213
|
+
* @see RECIPES.md#disabled-button-tooltip — for the disabled-button + tooltip pattern
|
|
214
|
+
*/
|
|
215
|
+
const Tooltip = ({ tooltip, children, className, keepOpenOnTriggerClick = false, variant, placement = "right", forceHide = false, forceShow = false, delayDuration, triggerAsChild = false }) => {
|
|
216
|
+
const [open, setOpen] = useState(false);
|
|
217
|
+
const resolvedVariant = (() => {
|
|
218
|
+
if (!!variant) return variant;
|
|
219
|
+
if (typeof tooltip === "string" && tooltip.length > ACTION_TOOLTIP_LIMIT) return "explanatory";
|
|
220
|
+
return "action";
|
|
221
|
+
})();
|
|
222
|
+
const isActionVariant = resolvedVariant === "action";
|
|
223
|
+
const handleKeyUp = (event) => {
|
|
224
|
+
if (![keyCodes.ENTER, keyCodes.SPACE].includes(event.key)) return;
|
|
225
|
+
event.stopPropagation();
|
|
226
|
+
};
|
|
227
|
+
return /* @__PURE__ */ jsxs(TooltipRoot, {
|
|
228
|
+
open: !!tooltip && (open || forceShow) && !forceHide,
|
|
229
|
+
onOpenChange: setOpen,
|
|
230
|
+
delayDuration,
|
|
231
|
+
disableHoverableContent: isActionVariant,
|
|
232
|
+
children: [/* @__PURE__ */ jsx(TooltipTrigger, {
|
|
233
|
+
asChild: triggerAsChild,
|
|
234
|
+
keepOpenOnClick: keepOpenOnTriggerClick,
|
|
235
|
+
onKeyUp: handleKeyUp,
|
|
236
|
+
children
|
|
237
|
+
}), /* @__PURE__ */ jsx(TooltipContent, {
|
|
238
|
+
className,
|
|
239
|
+
variant: resolvedVariant,
|
|
240
|
+
placement,
|
|
241
|
+
keepOpenOnPointerDownOutside: keepOpenOnTriggerClick,
|
|
242
|
+
children: tooltip
|
|
243
|
+
})]
|
|
244
|
+
});
|
|
245
|
+
};
|
|
246
|
+
Tooltip.Root = TooltipRoot;
|
|
247
|
+
Tooltip.Content = TooltipContent;
|
|
248
|
+
Tooltip.Trigger = TooltipTrigger;
|
|
249
|
+
//#endregion
|
|
250
|
+
//#region src/utils/decorators.tsx
|
|
251
|
+
const withTooltipProvider = (Story) => /* @__PURE__ */ jsx(TooltipProvider, { children: /* @__PURE__ */ jsx(Story, {}) });
|
|
252
|
+
const withHiddenFullscreen = (Story) => /* @__PURE__ */ jsx("div", {
|
|
253
|
+
className: "tw:[&_[aria-label=Fullscreen]]:hidden",
|
|
254
|
+
children: /* @__PURE__ */ jsx(Story, {})
|
|
255
|
+
});
|
|
256
|
+
//#endregion
|
|
257
|
+
//#region src/utils/createPrefixedString.ts
|
|
258
|
+
const createPrefixedString = (prefix) => (literals) => literals.reduce((acc, literal) => acc + literal, `${prefix}-`);
|
|
259
|
+
//#endregion
|
|
260
|
+
//#region src/utils/noop.ts
|
|
261
|
+
const noop = () => void 0;
|
|
262
|
+
//#endregion
|
|
263
|
+
//#region src/utils/debounce.ts
|
|
264
|
+
const debounce = (fn, delay) => {
|
|
265
|
+
let timeoutId;
|
|
266
|
+
const debounced = (...args) => {
|
|
267
|
+
clearTimeout(timeoutId);
|
|
268
|
+
timeoutId = setTimeout(() => fn(...args), delay);
|
|
269
|
+
};
|
|
270
|
+
debounced.cancel = () => clearTimeout(timeoutId);
|
|
271
|
+
return debounced;
|
|
272
|
+
};
|
|
273
|
+
//#endregion
|
|
274
|
+
//#region src/utils/isMac.ts
|
|
275
|
+
const getIsMac = () => {
|
|
276
|
+
if (typeof navigator !== "undefined" && "userAgentData" in navigator) {
|
|
277
|
+
const platform = navigator.userAgentData.platform;
|
|
278
|
+
if (typeof platform === "string") return platform.toLowerCase() === "macos";
|
|
279
|
+
}
|
|
280
|
+
if (typeof navigator !== "undefined" && typeof navigator.platform === "string") return navigator.platform.toUpperCase().indexOf("MAC") >= 0;
|
|
281
|
+
return false;
|
|
282
|
+
};
|
|
283
|
+
const isMac = getIsMac();
|
|
284
|
+
//#endregion
|
|
285
|
+
//#region src/utils/useSHA256.ts
|
|
286
|
+
const sha256 = async (text) => {
|
|
287
|
+
const msgUint8 = new TextEncoder().encode(text);
|
|
288
|
+
const hashBuffer = await crypto.subtle.digest("SHA-256", msgUint8);
|
|
289
|
+
return Array.from(new Uint8Array(hashBuffer)).map((b) => b.toString(16).padStart(2, "0")).join("");
|
|
290
|
+
};
|
|
291
|
+
const useSHA256 = (text) => {
|
|
292
|
+
const [hash, setHash] = useState("");
|
|
293
|
+
useEffect(() => {
|
|
294
|
+
if (!text) return;
|
|
295
|
+
let cancelled = false;
|
|
296
|
+
sha256(text).then((h) => {
|
|
297
|
+
if (!cancelled) setHash(h);
|
|
298
|
+
});
|
|
299
|
+
return () => {
|
|
300
|
+
cancelled = true;
|
|
301
|
+
};
|
|
302
|
+
}, [text]);
|
|
303
|
+
return text ? hash : "";
|
|
304
|
+
};
|
|
305
|
+
//#endregion
|
|
306
|
+
export { Tooltip, TooltipProvider, copyToClipboard, createChangeInputEvent, createPrefixedString, debounce, isMac, keyCodes, noop, useSHA256, withHiddenFullscreen, withTooltipProvider };
|
|
307
|
+
|
|
308
|
+
//# sourceMappingURL=utils-D0c5VAyF.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils-D0c5VAyF.js","names":["Root"],"sources":["../src/utils/copyToClipboard.ts","../src/utils/createChangeInputEvent.ts","../src/constants/keyCodes.ts","../src/components/Tooltip/TooltipContent.tsx","../src/components/Tooltip/TooltipRoot.tsx","../src/components/Tooltip/TooltipTrigger.tsx","../src/components/Tooltip/Tooltip.tsx","../src/utils/decorators.tsx","../src/utils/createPrefixedString.ts","../src/utils/noop.ts","../src/utils/debounce.ts","../src/utils/isMac.ts","../src/utils/useSHA256.ts"],"sourcesContent":["/**\n * The async Clipboard API requires the document to be focused and rejects with\n * `NotAllowedError: Document is not focused` otherwise — which is the normal state\n * for a page inside an iframe that has not taken focus, such as Storybook's canvas\n * or an embedded preview. `execCommand` has no such requirement because it copies\n * the selection of a node we focus ourselves, so it covers that gap.\n */\nconst copyViaSelection = (text: string) => {\n const node = document.createElement('textarea');\n node.value = text;\n node.setAttribute('readonly', '');\n node.style.cssText = 'position:fixed;top:0;left:0;opacity:0';\n document.body.append(node);\n node.select();\n\n try {\n return document.execCommand('copy');\n } finally {\n node.remove();\n }\n};\n\nexport const copyToClipboard = async (text: string) => {\n try {\n await navigator.clipboard.writeText(text);\n } catch (error) {\n if (!copyViaSelection(text)) throw error;\n }\n};\n","import type { ChangeEvent } from 'react';\n\nexport const createChangeInputEvent = (input: HTMLInputElement) => {\n const changeEvent: ChangeEvent<HTMLInputElement> = {\n target: input,\n currentTarget: input,\n type: 'change',\n nativeEvent: new Event('change', { bubbles: true }),\n bubbles: true,\n cancelable: false,\n defaultPrevented: false,\n eventPhase: 2, // AT_TARGET\n isTrusted: false, // Synthetic events are not trusted\n preventDefault: () => {}, // Provide dummy functions if not needed\n isDefaultPrevented: () => false,\n stopPropagation: () => {},\n isPropagationStopped: () => false,\n persist: () => {},\n timeStamp: Date.now(),\n };\n\n Object.defineProperty(changeEvent, 'target', {\n value: input,\n writable: false,\n });\n\n return changeEvent;\n};\n","export const keyCodes = {\n ENTER: 'Enter',\n ESCAPE: 'Escape',\n SPACE: ' ',\n};\n","import type { ComponentProps } from 'react';\nimport { Content, Portal } from '@radix-ui/react-tooltip';\nimport type { VariantProps } from 'class-variance-authority';\nimport { cva } from 'class-variance-authority';\n\nimport { useArgoDesign } from '../ThemeProvider/context';\n\nconst tooltipVariants = cva(\n [\n 'tailwindcss-preflight',\n 'tw:inline-block',\n 'tw:break-anywhere',\n 'tw:max-h-96',\n 'tw:overflow-y-auto',\n 'tw:z-[1060]',\n\n // legacy (dark) chrome — default\n 'tw:rounded',\n 'tw:bg-neutral-800',\n 'tw:text-white',\n\n // argo chrome overrides — semantic floating-panel tokens\n 'tw:data-[argo=true]:rounded-2xl',\n 'tw:data-[argo=true]:border',\n 'tw:data-[argo=true]:border-solid',\n 'tw:data-[argo=true]:border-border',\n 'tw:data-[argo=true]:bg-popover',\n 'tw:data-[argo=true]:text-popover-foreground',\n 'tw:data-[argo=true]:shadow-md',\n\n // argo open animation\n 'tw:data-[argo=true]:data-[state=delayed-open]:animate-in',\n 'tw:data-[argo=true]:data-[state=instant-open]:animate-in',\n 'tw:data-[argo=true]:data-[state=delayed-open]:fade-in-0',\n 'tw:data-[argo=true]:data-[state=instant-open]:fade-in-0',\n 'tw:data-[argo=true]:data-[state=delayed-open]:zoom-in-95',\n 'tw:data-[argo=true]:data-[state=instant-open]:zoom-in-95',\n\n // argo closed animation\n 'tw:data-[argo=true]:data-[state=closed]:animate-out',\n 'tw:data-[argo=true]:data-[state=closed]:fade-out-0',\n 'tw:data-[argo=true]:data-[state=closed]:zoom-out-95',\n\n // argo position animation\n 'tw:data-[argo=true]:data-[side=bottom]:slide-in-from-top-2',\n 'tw:data-[argo=true]:data-[side=left]:slide-in-from-right-2',\n 'tw:data-[argo=true]:data-[side=right]:slide-in-from-left-2',\n 'tw:data-[argo=true]:data-[side=top]:slide-in-from-bottom-2',\n ],\n {\n defaultVariants: {\n variant: 'action',\n },\n variants: {\n variant: {\n action: [\n 'tw:max-w-fit',\n 'tw:px-3',\n 'tw:py-2',\n\n 'tw:text-center',\n 'tw:text-xs',\n 'tw:font-medium',\n // Legacy chrome uppercases the action tooltip; the Keboola V2 brand\n // (`data-brand=\"keboola\"`) renders it in standard case instead.\n 'tw:uppercase',\n 'tw:tracking-wider',\n 'tw:[[data-brand=keboola]_&]:normal-case',\n 'tw:[[data-brand=keboola]_&]:tracking-normal',\n ],\n explanatory: [\n 'tw:max-w-80',\n 'tw:px-4',\n 'tw:py-3',\n 'tw:text-left',\n\n 'tw:text-sm',\n 'tw:font-normal',\n ],\n },\n },\n },\n);\n\ntype Props = {\n keepOpenOnPointerDownOutside?: boolean;\n placement?: ComponentProps<typeof Content>['side'];\n} & Omit<ComponentProps<typeof Content>, 'side'> &\n VariantProps<typeof tooltipVariants>;\n\nexport const TooltipContent = ({\n className,\n variant,\n keepOpenOnPointerDownOutside = false,\n children,\n onPointerDownOutside,\n sideOffset = 8,\n collisionPadding = 8,\n hideWhenDetached = true,\n placement = 'right',\n ...rest\n}: Props) => {\n const renderArgo = useArgoDesign();\n\n const handlePointerDownOutside: ComponentProps<typeof Content>['onPointerDownOutside'] = (\n event,\n ) => {\n if (keepOpenOnPointerDownOutside) event.preventDefault();\n onPointerDownOutside?.(event);\n };\n\n return (\n <Portal>\n <Content\n {...rest}\n // Marks the dark (non-argo) tooltip chrome so styles.css can invert\n // nested `.tw\\:prose` for contrast.\n data-tooltip-content={renderArgo ? undefined : true}\n data-argo={renderArgo}\n sideOffset={sideOffset}\n collisionPadding={collisionPadding}\n onPointerDownOutside={handlePointerDownOutside}\n className={tooltipVariants({ className, variant })}\n hideWhenDetached={hideWhenDetached}\n side={placement}\n >\n {children}\n </Content>\n </Portal>\n );\n};\n","import type { ComponentProps } from 'react';\nimport { Root } from '@radix-ui/react-tooltip';\n\ntype Props = ComponentProps<typeof Root>;\n\nconst DELAY_SHOW_TOOLTIP = 300;\n\nexport const TooltipRoot = ({ children, delayDuration = DELAY_SHOW_TOOLTIP, ...rest }: Props) => (\n <Root {...rest} delayDuration={delayDuration}>\n {children}\n </Root>\n);\n","import type { ComponentProps } from 'react';\nimport { Slot } from '@radix-ui/react-slot';\nimport { Trigger } from '@radix-ui/react-tooltip';\n\nimport { cn } from '../../utils';\n\n/**\n * Radix stamps the tooltip's own open/closed `data-state` onto the trigger. Merged onto an\n * `asChild` child that keeps a `data-state` of its own — `ToggleGroup.Item`, `Switch`, a `Tabs`\n * trigger — it wins, because those primitives spread incoming props *after* their own attribute.\n * The child then silently loses every `data-[state=…]` style it has, which is usually the only\n * thing marking it as selected.\n *\n * The tooltip's trigger state is styled nowhere, so it is dropped before it reaches the child.\n */\nconst WithoutTooltipState = ({\n children,\n ...props\n // `Slot`'s own props, plus the one attribute this exists to remove: React's types declare no\n // `data-*`, so it has to be named to be destructured away.\n}: ComponentProps<typeof Slot> & { 'data-state'?: string }) => {\n const { 'data-state': _tooltipState, ...rest } = props;\n\n return <Slot {...rest}>{children}</Slot>;\n};\n\ntype Props = {\n keepOpenOnClick?: boolean;\n} & ComponentProps<typeof Trigger>;\n\nexport const TooltipTrigger = ({\n ref,\n children,\n className,\n keepOpenOnClick = false,\n onClick,\n onPointerDown,\n asChild,\n ...rest\n}: Props) => {\n const handleClick: ComponentProps<typeof Trigger>['onClick'] = (event) => {\n if (keepOpenOnClick) event.preventDefault();\n onClick?.(event);\n };\n\n const handlePointerDown: ComponentProps<typeof Trigger>['onPointerDown'] = (event) => {\n if (keepOpenOnClick) event.preventDefault();\n onPointerDown?.(event);\n };\n\n return (\n <Trigger\n {...rest}\n asChild\n ref={ref}\n className={cn('tailwindcss-preflight', className)}\n onClick={handleClick}\n onPointerDown={handlePointerDown}\n >\n {asChild ? (\n <WithoutTooltipState>{children}</WithoutTooltipState>\n ) : (\n // Default-mode trigger wraps children in a span so Radix has a\n // single DOM element to attach handlers to. `tailwindcss-preflight`\n // (merged in via Slot) activates Tailwind's preflight inside the\n // span, which sets `svg { display: block }` — without an inline-flex\n // container that would stack any bare Lucide icon onto its own\n // line. `tw:inline-flex tw:items-center` keeps icon + text aligned.\n <span className=\"tw:inline-flex tw:items-center\">{children}</span>\n )}\n </Trigger>\n );\n};\n","import { useState } from 'react';\nimport type { ComponentProps, ReactNode } from 'react';\nimport type { Content, Trigger } from '@radix-ui/react-tooltip';\nimport { Provider } from '@radix-ui/react-tooltip';\n\nimport { keyCodes } from '../../constants/keyCodes';\n\nimport { TooltipContent } from './TooltipContent';\nimport { TooltipRoot } from './TooltipRoot';\nimport { TooltipTrigger } from './TooltipTrigger';\n\nconst ACTION_TOOLTIP_LIMIT = 30;\n\ntype TriggerProps = {\n triggerAsChild?: boolean;\n};\n\n/**\n * Props for `Tooltip`. `tooltip` is the popup content; `children` is the trigger element.\n * `variant` auto-resolves to `\"explanatory\"` for strings >30 chars, else `\"action\"`.\n */\nexport type Props = {\n /** Keep the tooltip visible when the user clicks the trigger (useful for click-to-copy feedback). */\n keepOpenOnTriggerClick?: boolean;\n /** Content rendered inside the tooltip. Plain text only — no interactive elements (use `HoverCard` or `Popover` for that). */\n tooltip: ReactNode;\n children: ReactNode;\n placement?: ComponentProps<typeof Content>['side'];\n /** Forcibly hide the tooltip regardless of hover state. */\n forceHide?: boolean;\n /** Forcibly show the tooltip regardless of hover state. Useful for guided-tour overlays. */\n forceShow?: boolean;\n /** Hover delay before the tooltip opens, in ms. Defaults to the shared 300ms. */\n delayDuration?: number;\n className?: string;\n} & TriggerProps &\n Pick<ComponentProps<typeof TooltipContent>, 'variant' | 'className'>;\n\n/** Re-export of Radix `Tooltip.Provider`. Mount once at the app root so tooltips share delay state. */\nexport const TooltipProvider = Provider;\n\n/**\n * Short plain-text label that appears on hover or focus.\n *\n * **When to use:** describing an icon-only `Button`, explaining a disabled control, or labelling a\n * truncated value. Plain text only — auto-switches to the longer `\"explanatory\"` variant when the string\n * exceeds 30 characters.\n * **When NOT to use:** for rich preview content (multiple lines, formatted text, structured data) use\n * `HoverCard`; for tooltips containing links or buttons use `Popover` (interactive elements break a11y\n * inside a `Tooltip`).\n * **Composition:** wrap any focusable element via `triggerAsChild` so the tooltip targets the underlying\n * native element. Mount `TooltipProvider` once at the app root.\n *\n * @see RECIPES.md#disabled-button-tooltip — for the disabled-button + tooltip pattern\n */\nexport const Tooltip = ({\n tooltip,\n children,\n className,\n keepOpenOnTriggerClick = false,\n variant,\n placement = 'right',\n forceHide = false,\n forceShow = false,\n delayDuration,\n // trigger props\n triggerAsChild = false,\n}: Props) => {\n const [open, setOpen] = useState(false);\n\n const resolvedVariant = (() => {\n if (!!variant) return variant;\n if (typeof tooltip === 'string' && tooltip.length > ACTION_TOOLTIP_LIMIT) return 'explanatory';\n\n return 'action';\n })();\n\n const isActionVariant = resolvedVariant === 'action';\n\n const handleKeyUp: ComponentProps<typeof Trigger>['onKeyUp'] = (event) => {\n if (![keyCodes.ENTER, keyCodes.SPACE].includes(event.key)) return;\n event.stopPropagation();\n };\n\n return (\n <TooltipRoot\n open={!!tooltip && (open || forceShow) && !forceHide}\n onOpenChange={setOpen}\n delayDuration={delayDuration}\n disableHoverableContent={isActionVariant}\n >\n <TooltipTrigger\n asChild={triggerAsChild}\n keepOpenOnClick={keepOpenOnTriggerClick}\n onKeyUp={handleKeyUp}\n >\n {children}\n </TooltipTrigger>\n\n <TooltipContent\n className={className}\n variant={resolvedVariant}\n placement={placement}\n keepOpenOnPointerDownOutside={keepOpenOnTriggerClick}\n >\n {tooltip}\n </TooltipContent>\n </TooltipRoot>\n );\n};\n\nTooltip.Root = TooltipRoot;\nTooltip.Content = TooltipContent;\nTooltip.Trigger = TooltipTrigger;\n","import type { ComponentType } from 'react';\n\nimport { TooltipProvider } from '../components/Tooltip';\n\nexport const withTooltipProvider = (Story: ComponentType) => (\n <TooltipProvider>\n <Story />\n </TooltipProvider>\n);\n\n// position:fixed only fills the Storybook iframe, not the browser window.\nexport const withHiddenFullscreen = (Story: ComponentType) => (\n <div className=\"tw:[&_[aria-label=Fullscreen]]:hidden\">\n <Story />\n </div>\n);\n","export const createPrefixedString = (prefix: string) => (literals: TemplateStringsArray) =>\n literals.reduce((acc, literal) => acc + literal, `${prefix}-`);\n","export const noop = () => void 0;\n","type DebouncedFn<T extends (...args: any[]) => void> = {\n (...args: Parameters<T>): void;\n cancel: () => void;\n};\n\nexport const debounce = <T extends (...args: any[]) => void>(\n fn: T,\n delay: number,\n): DebouncedFn<T> => {\n let timeoutId: ReturnType<typeof setTimeout>;\n const debounced = (...args: Parameters<T>) => {\n clearTimeout(timeoutId);\n timeoutId = setTimeout(() => fn(...args), delay);\n };\n debounced.cancel = () => clearTimeout(timeoutId);\n return debounced;\n};\n","// Platform detection\ntype NavigatorUAData = {\n platform: string;\n brands: { brand: string; version: string }[];\n mobile: boolean;\n};\n\nconst getIsMac = (): boolean => {\n // Modern approach using navigator.userAgentData\n if (typeof navigator !== 'undefined' && 'userAgentData' in navigator) {\n const platform = (navigator.userAgentData as NavigatorUAData).platform;\n\n if (typeof platform === 'string') {\n return platform.toLowerCase() === 'macos';\n }\n }\n\n if (typeof navigator !== 'undefined' && typeof navigator.platform === 'string') {\n return navigator.platform.toUpperCase().indexOf('MAC') >= 0;\n }\n\n // Server-side rendering fallback\n return false;\n};\n\nexport const isMac = getIsMac();\n","import { useEffect, useState } from 'react';\n\n// https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/digest#converting_a_digest_to_a_hex_string\nconst sha256 = async (text: string) => {\n const msgUint8 = new TextEncoder().encode(text);\n const hashBuffer = await crypto.subtle.digest('SHA-256', msgUint8);\n const hashArray = Array.from(new Uint8Array(hashBuffer));\n return hashArray.map((b) => b.toString(16).padStart(2, '0')).join('');\n};\n\nexport const useSHA256 = (text?: string) => {\n const [hash, setHash] = useState('');\n\n useEffect(() => {\n if (!text) return;\n let cancelled = false;\n sha256(text).then((h) => {\n if (!cancelled) setHash(h);\n });\n return () => {\n cancelled = true;\n };\n }, [text]);\n\n // Empty input has no hash — derive it during render instead of syncing state\n // in the effect (avoids the extra render and a stale-value frame).\n return text ? hash : '';\n};\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@keboola/design",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "11.0.1",
|
|
4
4
|
"description": "Keboola UI platform design system — shadcn-aligned React primitives, Keboola-branded blocks, and the form bindings built on TanStack Form.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -140,7 +140,7 @@
|
|
|
140
140
|
"storybook": "^10.2.19",
|
|
141
141
|
"tailwindcss": "^4.3.3",
|
|
142
142
|
"tailwindcss-scoped-preflight": "^4.0.6",
|
|
143
|
-
"
|
|
143
|
+
"tsdown": "^0.22.14",
|
|
144
144
|
"tsx": "^4.19.4",
|
|
145
145
|
"tw-animate-css": "^1.4.0",
|
|
146
146
|
"typescript": "npm:@typescript/typescript6@^6.0.2",
|
|
@@ -233,18 +233,18 @@
|
|
|
233
233
|
"remark-gfm": "^4.0.1",
|
|
234
234
|
"sonner": "^2.0.7",
|
|
235
235
|
"tailwind-merge": "^3.6.0",
|
|
236
|
-
"@keboola/
|
|
237
|
-
"@keboola/
|
|
238
|
-
"@keboola/
|
|
236
|
+
"@keboola/codemirror-lang-sql": "^0.7.1",
|
|
237
|
+
"@keboola/tailwind-config": "^1.1.0",
|
|
238
|
+
"@keboola/brand-registry": "^1.9.2"
|
|
239
239
|
},
|
|
240
240
|
"scripts": {
|
|
241
241
|
"dev": "storybook dev -p \"${PORT:-6006}\"",
|
|
242
242
|
"build-storybook": "storybook build",
|
|
243
243
|
"transit": "pnpm build",
|
|
244
244
|
"build": "pnpm build:js && pnpm build:css",
|
|
245
|
-
"build:js": "
|
|
245
|
+
"build:js": "tsdown",
|
|
246
246
|
"build:css": "tailwindcss -i src/styles.css -o dist/styles.css --minify",
|
|
247
|
-
"build:check": "attw --pack . --profile esm-only --exclude-entrypoints ./styles ./styles/compiled ./theme",
|
|
247
|
+
"build:check": "node ../../tooling/check-dist-exports.mjs && attw --pack . --profile esm-only --exclude-entrypoints ./styles ./styles/compiled ./theme",
|
|
248
248
|
"test": "vitest run --config vite.config.ts --passWithNoTests --reporter=dot",
|
|
249
249
|
"test:stories": "vitest run --config vitest.config.ts",
|
|
250
250
|
"test:stories:coverage": "vitest run --config vitest.config.ts --coverage",
|
|
@@ -257,13 +257,14 @@
|
|
|
257
257
|
"lint:format": "oxfmt --check",
|
|
258
258
|
"lint:oxlint": "oxlint . --quiet",
|
|
259
259
|
"lint:design": "designmd lint DESIGN.md",
|
|
260
|
-
"ci-checks": "pnpm check:api && pnpm check:icons && pnpm size",
|
|
260
|
+
"ci-checks": "pnpm check:api && pnpm check:icons && pnpm check:contrast && pnpm size",
|
|
261
261
|
"size": "size-limit",
|
|
262
262
|
"generate:api": "tsx scripts/generate-component-api.ts",
|
|
263
263
|
"check:api": "tsx scripts/generate-component-api.ts --check",
|
|
264
264
|
"audit:contrast": "tsx scripts/contrast-audit.ts",
|
|
265
265
|
"type-check": "tsc",
|
|
266
266
|
"generate:icons": "tsx scripts/generate-icon-exports.ts",
|
|
267
|
-
"check:icons": "tsx scripts/generate-icon-exports.ts && git diff --exit-code -- src/icons/index.ts"
|
|
267
|
+
"check:icons": "tsx scripts/generate-icon-exports.ts && git diff --exit-code -- src/icons/index.ts",
|
|
268
|
+
"check:contrast": "tsx scripts/contrast-audit.ts && git diff --exit-code -- CONTRAST-AUDIT.md"
|
|
268
269
|
}
|
|
269
270
|
}
|
package/src/styles.css
CHANGED
|
@@ -13,10 +13,16 @@
|
|
|
13
13
|
@import 'react-day-picker/src/style.css';
|
|
14
14
|
@import './theme.css';
|
|
15
15
|
|
|
16
|
-
/*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
16
|
+
/* Test files name utility classes as data — `customUtilities.test.ts` compiles every custom
|
|
17
|
+
* utility by name, `brandNeutrality.test.ts` spells out colour literals — and v4 scans them like
|
|
18
|
+
* any other source, emitting those candidates into the bundle apps ship. Nothing a test alone
|
|
19
|
+
* mentions belongs in it. */
|
|
20
|
+
@source not '**/*.test.{ts,tsx}';
|
|
21
|
+
|
|
22
|
+
/* The remaining v3 token surface plus typography and scroll-fade stay in JS, loaded
|
|
23
|
+
* via v4's `@config` bridge — this keeps `colors.ts` and the ThemeProvider/brand
|
|
24
|
+
* runtime-swap model unchanged (channel triples consumed as `rgb(var(--*) / <alpha>)`).
|
|
25
|
+
* Anything an app authors belongs in `theme.css` instead: this bridge is design-only. */
|
|
20
26
|
@config '../tailwind.config.js';
|
|
21
27
|
|
|
22
28
|
/* Scoped, opt-in preflight — the v4 replacement for v3's
|
|
@@ -31,7 +37,7 @@
|
|
|
31
37
|
/*
|
|
32
38
|
* Semantic color tokens — read by Tailwind via rgb(var(--*) / <alpha-value>) in
|
|
33
39
|
* packages/tailwind-config/colors.ts. Channel values are stored as space-separated RGB so
|
|
34
|
-
* Tailwind opacity modifiers (e.g. `tw
|
|
40
|
+
* Tailwind opacity modifiers (e.g. `tw:bg-muted/50`) resolve correctly.
|
|
35
41
|
* Primitive scales (neutral-*, primary-*, error-*, warning-*, etc.) remain hardcoded in colors.ts.
|
|
36
42
|
*/
|
|
37
43
|
:root {
|
|
@@ -119,6 +125,14 @@
|
|
|
119
125
|
with a black shadow so it doesn't read as a light halo on dark surfaces. */
|
|
120
126
|
--shadow-raised: 0 2px 6px 0 rgb(100 135 153 / 0.13);
|
|
121
127
|
|
|
128
|
+
/* Runtime mirrors of the `shadow-card` / `shadow-table` @theme tokens, so a rule
|
|
129
|
+
can read `var(--shadow-card)` and follow the colour scheme. Declared here rather
|
|
130
|
+
than left to @theme: v4 inlines an @theme value into the utility it generates and
|
|
131
|
+
emits no custom property for it, so `var(--shadow-table)` would resolve to nothing
|
|
132
|
+
and drop the shadow entirely. Values match theme.css; the dark block overrides both. */
|
|
133
|
+
--shadow-card: 0px 1px 4px rgb(100 135 153 / 0.15);
|
|
134
|
+
--shadow-table: 0px 6px 6px -4px rgb(100 135 153 / 0.13);
|
|
135
|
+
|
|
122
136
|
/* Typography pairing — display + mono faces; a brand overrides via
|
|
123
137
|
`theme.typography.fontDisplay` / `fontMono`. Display defaults to the body
|
|
124
138
|
face (`--font-sans`), then the canonical Inter stack, so unset brands keep
|
|
@@ -250,6 +264,20 @@
|
|
|
250
264
|
blue-gray, which reads as a halo around Card / Search on dark surfaces. */
|
|
251
265
|
--shadow-raised: 0 2px 6px 0 rgb(0 0 0 / 0.4);
|
|
252
266
|
|
|
267
|
+
/* Same correction for the two elevation tokens apps author directly — the pale
|
|
268
|
+
blue-gray lights up against a dark surface instead of reading as depth, and under
|
|
269
|
+
a sticky table header it read as a glowing seam. `--shadow-table` is softer than
|
|
270
|
+
`--shadow-raised` because the header casts a full-width band.
|
|
271
|
+
|
|
272
|
+
Reaches rules that read `var(--shadow-table)` / `var(--shadow-card)` directly,
|
|
273
|
+
which is how kbc-ui's Less consumes them. It does NOT reach the `shadow-table` /
|
|
274
|
+
`shadow-card` Tailwind utilities: those are `@theme` tokens (theme.css), so v4
|
|
275
|
+
inlines the light literal into the generated class at build time. Making the
|
|
276
|
+
utilities scheme-aware needs the token to carry a `var(--runtime, fallback)`
|
|
277
|
+
shape, which is a separate change with control-ui / boilerplate to verify against. */
|
|
278
|
+
--shadow-card: 0px 1px 4px rgb(0 0 0 / 0.4);
|
|
279
|
+
--shadow-table: 0px 6px 6px -4px rgb(0 0 0 / 0.3);
|
|
280
|
+
|
|
253
281
|
/* Table header — lighter than card so the header row reads as raised on dark
|
|
254
282
|
(light value is the tailwind-config fallback: 219 225 235). */
|
|
255
283
|
--table-header: 54 55 65;
|
|
@@ -292,8 +320,8 @@
|
|
|
292
320
|
html {
|
|
293
321
|
/* Brand font opt-in: a brand's `typography.fontFamily` is injected as
|
|
294
322
|
`--font-sans` by ThemeProvider and inherited from `html`; absent a brand
|
|
295
|
-
the fallback reproduces the canonical `tw
|
|
296
|
-
rendering is unchanged. Elements that set `tw
|
|
323
|
+
the fallback reproduces the canonical `tw:font-sans` stack so default
|
|
324
|
+
rendering is unchanged. Elements that set `tw:font-sans` explicitly also
|
|
297
325
|
follow the brand — the Tailwind `fontFamily.sans` scale reads `--font-sans`
|
|
298
326
|
with the same `Inter` fallback. */
|
|
299
327
|
font-family: var(
|
package/src/theme.css
CHANGED
|
@@ -11,6 +11,20 @@
|
|
|
11
11
|
* design AND every v4 app) so those utilities resolve again. Each token keeps the
|
|
12
12
|
* v3 `var(--runtime-var, fallback)` shape so `ThemeProvider` can still re-skin it. */
|
|
13
13
|
@theme {
|
|
14
|
+
/* Body face — `font-sans`. Design keeps the v3 `fontFamily.sans` scale through its
|
|
15
|
+
* `@config` bridge, but the apps have no such bridge, so there `font-sans` resolved
|
|
16
|
+
* to v4's stock stack: no `Inter`, no brand hook. Every element that sets the
|
|
17
|
+
* utility explicitly (top-bar nav, inputs, menu descriptions) therefore rendered in
|
|
18
|
+
* a system face while its siblings inherited Inter from `html`. Re-registering the
|
|
19
|
+
* token restores the v3 value: the brand's `--font-sans` (emitted by ThemeProvider)
|
|
20
|
+
* first, then the canonical Inter stack. Safe as a @theme token because the emitted
|
|
21
|
+
* name is prefixed (`--tw-font-sans`) and so cannot cycle with the runtime var it
|
|
22
|
+
* reads — unlike `font-display`, which must stay an @utility. */
|
|
23
|
+
--font-sans:
|
|
24
|
+
var(--font-sans, Inter), system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', Arial,
|
|
25
|
+
'Noto Sans', 'Liberation Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji',
|
|
26
|
+
'Segoe UI Symbol', 'Noto Color Emoji';
|
|
27
|
+
|
|
14
28
|
/* Legacy Bootstrap-era breakpoints (screens). */
|
|
15
29
|
--breakpoint-sm-legacy: 992px;
|
|
16
30
|
--breakpoint-md-legacy: 1092px;
|
|
@@ -32,6 +46,12 @@
|
|
|
32
46
|
--shadow-table: 0px 6px 6px -4px rgba(100, 135, 153, 0.13);
|
|
33
47
|
--radius-card: 10px;
|
|
34
48
|
|
|
49
|
+
/* Raised-surface elevation — `shadow-raised`. Dark-aware: `styles.css` flips the runtime
|
|
50
|
+
* `--shadow-raised` to a black shadow under `[data-theme='dark']`. Reading a var of the same
|
|
51
|
+
* name is safe here because the emitted token is prefixed (`--tw-shadow-raised`), so the two
|
|
52
|
+
* cannot cycle — same reasoning as `--font-sans` above. */
|
|
53
|
+
--shadow-raised: var(--shadow-raised, 0 2px 6px 0 rgb(100 135 153 / 0.13));
|
|
54
|
+
|
|
35
55
|
/* Brand easing — `ease-brand`. The runtime override var (`--motion-easing`) differs from
|
|
36
56
|
* this @theme token name, so registering it here drops no fallback (unlike bg-brand /
|
|
37
57
|
* shadow-lift, whose runtime var name collides → they stay @utility below). */
|
|
@@ -41,6 +61,12 @@
|
|
|
41
61
|
--animate-progress-bar: progress-bar var(--progress-bar-duration, 3s) linear forwards;
|
|
42
62
|
--animate-spinner-dots: spinner-dots 1s ease-in-out infinite;
|
|
43
63
|
--animate-marching-ants: marching-ants 1s linear infinite;
|
|
64
|
+
|
|
65
|
+
/* Collapsible disclosure — keyframes below. `tw-animate-css` owns `collapsible-down`/`-up`
|
|
66
|
+
* and every app imports it unlayered, so those two names are unusable here.
|
|
67
|
+
* 300ms `ease` is the motion the retired `Collapse` had. */
|
|
68
|
+
--animate-collapsible-open: collapsible-open 300ms ease;
|
|
69
|
+
--animate-collapsible-close: collapsible-close 300ms ease;
|
|
44
70
|
}
|
|
45
71
|
|
|
46
72
|
@keyframes progress-bar {
|
|
@@ -68,6 +94,29 @@
|
|
|
68
94
|
stroke-dashoffset: -12;
|
|
69
95
|
}
|
|
70
96
|
}
|
|
97
|
+
/* `overflow` animates discretely — it flips mid-animation, so both endpoints must clip for the
|
|
98
|
+
* content to stay inside the box the whole way. No fill mode, so a settled-open panel is back to
|
|
99
|
+
* its own `overflow: visible` at its own height. */
|
|
100
|
+
@keyframes collapsible-open {
|
|
101
|
+
from {
|
|
102
|
+
height: 0;
|
|
103
|
+
overflow: hidden;
|
|
104
|
+
}
|
|
105
|
+
to {
|
|
106
|
+
height: var(--radix-collapsible-content-height);
|
|
107
|
+
overflow: hidden;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
@keyframes collapsible-close {
|
|
111
|
+
from {
|
|
112
|
+
height: var(--radix-collapsible-content-height);
|
|
113
|
+
overflow: hidden;
|
|
114
|
+
}
|
|
115
|
+
to {
|
|
116
|
+
height: 0;
|
|
117
|
+
overflow: hidden;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
71
120
|
|
|
72
121
|
/* Fallback-chain utilities (kept as @utility, not @theme, so the runtime-var +
|
|
73
122
|
* fallback chain is preserved exactly as v3 emitted it — a @theme token whose name
|
|
@@ -100,6 +149,21 @@
|
|
|
100
149
|
sans-serif;
|
|
101
150
|
}
|
|
102
151
|
|
|
152
|
+
/* Interaction-state variant — `not-disabled:hover:…`. Skips BOTH ways a control reports being
|
|
153
|
+
* disabled; v4's core `not-*` compound reads the same name as `:not(:disabled)` alone, so this
|
|
154
|
+
* deliberately shadows it. That shadowing is why the variant has to live here and not in an
|
|
155
|
+
* `addVariant` in design's `@config` plugin: an app's own build has no bridge to that plugin, so
|
|
156
|
+
* it fell through to the core variant and silently dropped the `data-disabled` half — every
|
|
157
|
+
* `tw:not-disabled:*` class kbc-ui authors that design's compiled CSS did not already carry
|
|
158
|
+
* still highlighted a `[data-disabled="true"]` control on hover and focus. */
|
|
159
|
+
@custom-variant not-disabled (&:not([data-disabled="true"]):not(:disabled));
|
|
160
|
+
|
|
161
|
+
/* `overflow-wrap: anywhere` — no v4 core utility covers it (`break-words` is `break-word`,
|
|
162
|
+
* which keeps long unbroken tokens overflowing). Authored in 16 app files. */
|
|
163
|
+
@utility break-anywhere {
|
|
164
|
+
overflow-wrap: anywhere;
|
|
165
|
+
}
|
|
166
|
+
|
|
103
167
|
@theme inline {
|
|
104
168
|
--color-inherit: inherit;
|
|
105
169
|
--color-transparent: rgba(255, 255, 255, 0);
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
export { MermaidDiagram } from './chunk-KPNAW5MU.js';
|
|
2
|
-
import './chunk-IJTHFNNJ.js';
|
|
3
|
-
import './chunk-VPPM7UUQ.js';
|
|
4
|
-
import './chunk-L37JJ6MR.js';
|
|
5
|
-
import './chunk-CTCFYWJC.js';
|
|
6
|
-
import './chunk-BOHNXTMM.js';
|
|
7
|
-
import './chunk-63NSN2VL.js';
|
|
8
|
-
import './chunk-JP7PNHLH.js';
|
|
9
|
-
//# sourceMappingURL=MermaidDiagram-EOKJHQQV.js.map
|
|
10
|
-
//# sourceMappingURL=MermaidDiagram-EOKJHQQV.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"MermaidDiagram-EOKJHQQV.js"}
|