@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,104 @@
|
|
|
1
|
+
import { cn } from "./classNames-BzrkDnOD.js";
|
|
2
|
+
import { ChevronDown, ChevronUp, ChevronsUpDown } from "./icons-Cek151jC.js";
|
|
3
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
4
|
+
//#region src/components/Table/TableBody.tsx
|
|
5
|
+
const TableBody = ({ withBorderSeparator = true, className, ...props }) => {
|
|
6
|
+
return /* @__PURE__ */ jsx("tbody", {
|
|
7
|
+
className: cn({ "tw:[&_tr]:border-0 tw:[&_tr]:border-b-border tw:[&_tr]:border-b tw:[&_tr]:border-solid tw:[&_tr:last-child]:border-0": withBorderSeparator }, className),
|
|
8
|
+
...props
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
//#endregion
|
|
12
|
+
//#region src/components/Table/TableCell.tsx
|
|
13
|
+
const TableCell = ({ className, ...props }) => {
|
|
14
|
+
return /* @__PURE__ */ jsx("td", {
|
|
15
|
+
className: cn("tw:px-3 tw:py-2", className),
|
|
16
|
+
...props
|
|
17
|
+
});
|
|
18
|
+
};
|
|
19
|
+
//#endregion
|
|
20
|
+
//#region src/components/Table/TableFooter.tsx
|
|
21
|
+
const TableFooter = ({ className, ...props }) => {
|
|
22
|
+
return /* @__PURE__ */ jsx("tfoot", {
|
|
23
|
+
className: cn("tw:bg-muted/50 tw:border-t tw:border-border tw:font-medium tw:[&>tr]:last:border-b-0", className),
|
|
24
|
+
...props
|
|
25
|
+
});
|
|
26
|
+
};
|
|
27
|
+
//#endregion
|
|
28
|
+
//#region src/components/Table/TableHead.tsx
|
|
29
|
+
const TableHead = ({ className, ...props }) => {
|
|
30
|
+
return /* @__PURE__ */ jsx("th", {
|
|
31
|
+
className: cn("tw:px-3 tw:py-2 tw:text-left tw:font-medium tw:whitespace-nowrap tw:[&:has([role=checkbox])]:pr-0 tw:[&>[role=checkbox]]:translate-y-[2px] tw:focus-within:ring-2 tw:focus-within:ring-ring/50", className),
|
|
32
|
+
...props
|
|
33
|
+
});
|
|
34
|
+
};
|
|
35
|
+
//#endregion
|
|
36
|
+
//#region src/components/Table/TableHeader.tsx
|
|
37
|
+
const TableHeader = ({ withShadow = false, className, ...props }) => {
|
|
38
|
+
return /* @__PURE__ */ jsx("thead", {
|
|
39
|
+
className: cn("tw:sticky tw:top-0 tw:z-10 tw:[&_tr]:bg-table-header tw:[&_tr]:hover:bg-table-header tw:[&_tr]:border-b tw:[&_tr]:border-border", { "tw:shadow-table": withShadow }, className),
|
|
40
|
+
...props
|
|
41
|
+
});
|
|
42
|
+
};
|
|
43
|
+
//#endregion
|
|
44
|
+
//#region src/components/Table/TableRow.tsx
|
|
45
|
+
const TableRow = ({ ref, className, ...props }) => /* @__PURE__ */ jsx("tr", {
|
|
46
|
+
ref,
|
|
47
|
+
className: cn("tw:hover:bg-muted/50 tw:aria-selected:bg-accent tw:aria-selected:hover:bg-accent", className),
|
|
48
|
+
...props
|
|
49
|
+
});
|
|
50
|
+
//#endregion
|
|
51
|
+
//#region src/components/Table/TableSortHeader.tsx
|
|
52
|
+
/** Maps a sort direction to the `aria-sort` value for the enclosing `Table.Head`. */
|
|
53
|
+
const tableAriaSort = (sorted) => sorted === "asc" ? "ascending" : sorted === "desc" ? "descending" : "none";
|
|
54
|
+
/**
|
|
55
|
+
* Clickable column-header label with a sort-direction chevron, for use inside `Table.Head`.
|
|
56
|
+
*
|
|
57
|
+
* Presentational only — it owns no sort state. Pair it with your sort model (a `useState`
|
|
58
|
+
* key/direction pair, or `@tanstack/react-table`'s `getToggleSortingHandler()` / `getIsSorted()`)
|
|
59
|
+
* and set `aria-sort` on the enclosing `Table.Head` via {@link tableAriaSort}.
|
|
60
|
+
*/
|
|
61
|
+
const TableSortHeader = ({ sorted, children, className, ...props }) => {
|
|
62
|
+
const Icon = sorted === false ? ChevronsUpDown : sorted === "asc" ? ChevronUp : ChevronDown;
|
|
63
|
+
return /* @__PURE__ */ jsxs("button", {
|
|
64
|
+
className: cn("tw:group tw:flex tw:cursor-pointer tw:items-center tw:gap-1 tw:border-0 tw:bg-transparent tw:p-0 tw:font-medium tw:text-inherit", className),
|
|
65
|
+
...props,
|
|
66
|
+
type: "button",
|
|
67
|
+
children: [children, /* @__PURE__ */ jsx(Icon, { className: "tw:size-3 tw:text-muted-foreground" })]
|
|
68
|
+
});
|
|
69
|
+
};
|
|
70
|
+
//#endregion
|
|
71
|
+
//#region src/components/Table/Table.tsx
|
|
72
|
+
/**
|
|
73
|
+
* Tabular data surface with header / body / row / cell compound parts.
|
|
74
|
+
*
|
|
75
|
+
* **When to use:** tabular data with named columns — entity lists with shared schema (jobs, buckets,
|
|
76
|
+
* tables), sortable rows, row-level actions. Compose `Table.Header` + `Table.Body` + `Table.Row` +
|
|
77
|
+
* `Table.Head` / `Table.Cell`.
|
|
78
|
+
* **When NOT to use:** for heterogeneous lists where each row has its own shape use a `Card` list;
|
|
79
|
+
* for tree / hierarchy layouts use a custom recursive list with `Table` per level.
|
|
80
|
+
* **Composition:** wrap in `PageLayout.Content`. For sortable / filterable behaviour bring your own
|
|
81
|
+
* state library (TanStack Table is a common pairing); this component is presentational.
|
|
82
|
+
*
|
|
83
|
+
* @see RECIPES.md#list-detail — for a list-table + row-click-to-detail pattern
|
|
84
|
+
*/
|
|
85
|
+
const Table = ({ borderCollapsed = true, bordered = false, containerClassName, className, ...props }) => {
|
|
86
|
+
return /* @__PURE__ */ jsx("div", {
|
|
87
|
+
className: cn("tw:relative tw:w-full", bordered && "tw:overflow-auto tw:rounded-[10px] tw:border tw:border-solid tw:border-border", containerClassName),
|
|
88
|
+
children: /* @__PURE__ */ jsx("table", {
|
|
89
|
+
className: cn("tw:w-full tw:caption-bottom tw:text-sm tw:text-foreground", borderCollapsed ? "tw:border-collapse" : "tw:border-separate tw:border-spacing-y-1", className),
|
|
90
|
+
...props
|
|
91
|
+
})
|
|
92
|
+
});
|
|
93
|
+
};
|
|
94
|
+
Table.Header = TableHeader;
|
|
95
|
+
Table.Head = TableHead;
|
|
96
|
+
Table.Body = TableBody;
|
|
97
|
+
Table.Row = TableRow;
|
|
98
|
+
Table.Cell = TableCell;
|
|
99
|
+
Table.Footer = TableFooter;
|
|
100
|
+
Table.SortHeader = TableSortHeader;
|
|
101
|
+
//#endregion
|
|
102
|
+
export { Table, TableSortHeader, tableAriaSort };
|
|
103
|
+
|
|
104
|
+
//# sourceMappingURL=Table-CvYuTuNU.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Table-CvYuTuNU.js","names":[],"sources":["../src/components/Table/TableBody.tsx","../src/components/Table/TableCell.tsx","../src/components/Table/TableFooter.tsx","../src/components/Table/TableHead.tsx","../src/components/Table/TableHeader.tsx","../src/components/Table/TableRow.tsx","../src/components/Table/TableSortHeader.tsx","../src/components/Table/Table.tsx"],"sourcesContent":["import type { ComponentProps } from 'react';\n\nimport { cn } from '../../utils';\n\nexport const TableBody = ({\n withBorderSeparator = true,\n className,\n ...props\n}: { withBorderSeparator?: boolean } & ComponentProps<'tbody'>) => {\n return (\n <tbody\n className={cn(\n {\n 'tw:[&_tr]:border-0 tw:[&_tr]:border-b-border tw:[&_tr]:border-b tw:[&_tr]:border-solid tw:[&_tr:last-child]:border-0':\n withBorderSeparator,\n },\n className,\n )}\n {...props}\n />\n );\n};\n","import type { ComponentProps } from 'react';\n\nimport { cn } from '../../utils';\n\nexport const TableCell = ({ className, ...props }: ComponentProps<'td'>) => {\n return <td className={cn('tw:px-3 tw:py-2', className)} {...props} />;\n};\n","import type { ComponentProps } from 'react';\n\nimport { cn } from '../../utils';\n\nexport const TableFooter = ({ className, ...props }: ComponentProps<'tfoot'>) => {\n return (\n <tfoot\n className={cn(\n 'tw:bg-muted/50 tw:border-t tw:border-border tw:font-medium tw:[&>tr]:last:border-b-0',\n className,\n )}\n {...props}\n />\n );\n};\n","import type { ComponentProps } from 'react';\n\nimport { cn } from '../../utils';\n\nexport const TableHead = ({ className, ...props }: ComponentProps<'th'>) => {\n return (\n <th\n className={cn(\n 'tw:px-3 tw:py-2 tw:text-left tw:font-medium tw:whitespace-nowrap tw:[&:has([role=checkbox])]:pr-0 tw:[&>[role=checkbox]]:translate-y-[2px] tw:focus-within:ring-2 tw:focus-within:ring-ring/50',\n className,\n )}\n {...props}\n />\n );\n};\n","import type { ComponentProps } from 'react';\n\nimport { cn } from '../../utils';\n\nexport const TableHeader = ({\n withShadow = false,\n className,\n ...props\n}: { withShadow?: boolean } & ComponentProps<'thead'>) => {\n return (\n <thead\n className={cn(\n // `[&_tr]:hover:` (0,2,1) outranks `TableRow`'s own `hover:bg-muted/50` (0,2,0), so the\n // header row keeps its background instead of flashing muted — a header is not hoverable.\n 'tw:sticky tw:top-0 tw:z-10 tw:[&_tr]:bg-table-header tw:[&_tr]:hover:bg-table-header tw:[&_tr]:border-b tw:[&_tr]:border-border',\n { 'tw:shadow-table': withShadow },\n className,\n )}\n {...props}\n />\n );\n};\n","import type { ComponentProps } from 'react';\n\nimport { cn } from '../../utils';\n\nexport const TableRow = ({ ref, className, ...props }: ComponentProps<'tr'>) => (\n <tr\n ref={ref}\n className={cn(\n 'tw:hover:bg-muted/50 tw:aria-selected:bg-accent tw:aria-selected:hover:bg-accent',\n className,\n )}\n {...props}\n />\n);\n","import type { ComponentProps, ReactNode } from 'react';\n\nimport { ChevronDown, ChevronsUpDown, ChevronUp } from '../../icons';\nimport { cn } from '../../utils';\n\nexport type TableSortDirection = 'asc' | 'desc' | false;\n\n/** Maps a sort direction to the `aria-sort` value for the enclosing `Table.Head`. */\nexport const tableAriaSort = (sorted: TableSortDirection): ComponentProps<'th'>['aria-sort'] =>\n sorted === 'asc' ? 'ascending' : sorted === 'desc' ? 'descending' : 'none';\n\ntype Props = {\n /** Current sort state for this column: `'asc'`, `'desc'`, or `false` when unsorted. */\n sorted: TableSortDirection;\n children: ReactNode;\n} & Omit<ComponentProps<'button'>, 'children' | 'type'>;\n\n/**\n * Clickable column-header label with a sort-direction chevron, for use inside `Table.Head`.\n *\n * Presentational only — it owns no sort state. Pair it with your sort model (a `useState`\n * key/direction pair, or `@tanstack/react-table`'s `getToggleSortingHandler()` / `getIsSorted()`)\n * and set `aria-sort` on the enclosing `Table.Head` via {@link tableAriaSort}.\n */\nexport const TableSortHeader = ({ sorted, children, className, ...props }: Props) => {\n const Icon = sorted === false ? ChevronsUpDown : sorted === 'asc' ? ChevronUp : ChevronDown;\n return (\n <button\n className={cn(\n 'tw:group tw:flex tw:cursor-pointer tw:items-center tw:gap-1 tw:border-0 tw:bg-transparent tw:p-0 tw:font-medium tw:text-inherit',\n className,\n )}\n {...props}\n type=\"button\"\n >\n {children}\n <Icon className=\"tw:size-3 tw:text-muted-foreground\" />\n </button>\n );\n};\n","import type { ComponentProps } from 'react';\n\nimport { cn } from '../../utils';\n\nimport { TableBody } from './TableBody';\nimport { TableCell } from './TableCell';\nimport { TableFooter } from './TableFooter';\nimport { TableHead } from './TableHead';\nimport { TableHeader } from './TableHeader';\nimport { TableRow } from './TableRow';\nimport { TableSortHeader } from './TableSortHeader';\n\n/**\n * Props for `Table`. `borderCollapsed` toggles standard collapsed borders vs separate row spacing;\n * `bordered` wraps the table in a rounded bordered container with overflow scrolling.\n */\ntype Props = {\n borderCollapsed?: boolean;\n bordered?: boolean;\n containerClassName?: string;\n} & ComponentProps<'table'>;\n\n/**\n * Tabular data surface with header / body / row / cell compound parts.\n *\n * **When to use:** tabular data with named columns — entity lists with shared schema (jobs, buckets,\n * tables), sortable rows, row-level actions. Compose `Table.Header` + `Table.Body` + `Table.Row` +\n * `Table.Head` / `Table.Cell`.\n * **When NOT to use:** for heterogeneous lists where each row has its own shape use a `Card` list;\n * for tree / hierarchy layouts use a custom recursive list with `Table` per level.\n * **Composition:** wrap in `PageLayout.Content`. For sortable / filterable behaviour bring your own\n * state library (TanStack Table is a common pairing); this component is presentational.\n *\n * @see RECIPES.md#list-detail — for a list-table + row-click-to-detail pattern\n */\nexport const Table = ({\n borderCollapsed = true,\n bordered = false,\n containerClassName,\n className,\n ...props\n}: Props) => {\n return (\n <div\n className={cn(\n 'tw:relative tw:w-full',\n bordered && 'tw:overflow-auto tw:rounded-[10px] tw:border tw:border-solid tw:border-border',\n containerClassName,\n )}\n >\n <table\n className={cn(\n // `tw:text-foreground` (a semantic token) so header + cell text flips\n // under `[data-theme='dark']` instead of inheriting a fixed dark color.\n 'tw:w-full tw:caption-bottom tw:text-sm tw:text-foreground',\n borderCollapsed ? 'tw:border-collapse' : 'tw:border-separate tw:border-spacing-y-1',\n className,\n )}\n {...props}\n />\n </div>\n );\n};\n\nTable.Header = TableHeader;\nTable.Head = TableHead;\nTable.Body = TableBody;\nTable.Row = TableRow;\nTable.Cell = TableCell;\nTable.Footer = TableFooter;\nTable.SortHeader = TableSortHeader;\n"],"mappings":";;;;AAIA,MAAa,aAAa,EACxB,sBAAsB,MACtB,WACA,GAAG,YAC8D;CACjE,OACE,oBAAC,SAAD;EACE,WAAW,GACT,EACE,wHACE,oBACJ,GACA,SACF;EACA,GAAI;CACL,CAAA;AAEL;;;ACjBA,MAAa,aAAa,EAAE,WAAW,GAAG,YAAkC;CAC1E,OAAO,oBAAC,MAAD;EAAI,WAAW,GAAG,mBAAmB,SAAS;EAAG,GAAI;CAAQ,CAAA;AACtE;;;ACFA,MAAa,eAAe,EAAE,WAAW,GAAG,YAAqC;CAC/E,OACE,oBAAC,SAAD;EACE,WAAW,GACT,wFACA,SACF;EACA,GAAI;CACL,CAAA;AAEL;;;ACVA,MAAa,aAAa,EAAE,WAAW,GAAG,YAAkC;CAC1E,OACE,oBAAC,MAAD;EACE,WAAW,GACT,kMACA,SACF;EACA,GAAI;CACL,CAAA;AAEL;;;ACVA,MAAa,eAAe,EAC1B,aAAa,OACb,WACA,GAAG,YACqD;CACxD,OACE,oBAAC,SAAD;EACE,WAAW,GAGT,mIACA,EAAE,mBAAmB,WAAW,GAChC,SACF;EACA,GAAI;CACL,CAAA;AAEL;;;ACjBA,MAAa,YAAY,EAAE,KAAK,WAAW,GAAG,YAC5C,oBAAC,MAAD;CACO;CACL,WAAW,GACT,oFACA,SACF;CACA,GAAI;AACL,CAAA;;;;ACJH,MAAa,iBAAiB,WAC5B,WAAW,QAAQ,cAAc,WAAW,SAAS,eAAe;;;;;;;;AAetE,MAAa,mBAAmB,EAAE,QAAQ,UAAU,WAAW,GAAG,YAAmB;CACnF,MAAM,OAAO,WAAW,QAAQ,iBAAiB,WAAW,QAAQ,YAAY;CAChF,OACE,qBAAC,UAAD;EACE,WAAW,GACT,mIACA,SACF;EACA,GAAI;EACJ,MAAK;EANP,UAAA,CAQG,UACD,oBAAC,MAAD,EAAM,WAAU,qCAAsC,CAAA,CAChD;;AAEZ;;;;;;;;;;;;;;;;ACJA,MAAa,SAAS,EACpB,kBAAkB,MAClB,WAAW,OACX,oBACA,WACA,GAAG,YACQ;CACX,OACE,oBAAC,OAAD;EACE,WAAW,GACT,yBACA,YAAY,iFACZ,kBACF;EAEA,UAAA,oBAAC,SAAD;GACE,WAAW,GAGT,6DACA,kBAAkB,uBAAuB,4CACzC,SACF;GACA,GAAI;EACL,CAAA;CACE,CAAA;AAET;AAEA,MAAM,SAAS;AACf,MAAM,OAAO;AACb,MAAM,OAAO;AACb,MAAM,MAAM;AACZ,MAAM,OAAO;AACb,MAAM,SAAS;AACf,MAAM,aAAa"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { cn } from "./classNames-BzrkDnOD.js";
|
|
2
|
+
import { X } from "./icons-Cek151jC.js";
|
|
3
|
+
import { Button } from "./Button-nzmDNS2q.js";
|
|
4
|
+
import { ScrollArea } from "./internal/components/ScrollArea.js";
|
|
5
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
6
|
+
import * as RadixTabs from "@radix-ui/react-tabs";
|
|
7
|
+
//#region src/components/Tabs/styles.ts
|
|
8
|
+
const tabsListWrapperClass = "tw:shrink-0 tw:border-t-0 tw:border-x-0 tw:border-b tw:border-solid tw:border-border";
|
|
9
|
+
const tabsListClass = "tw:flex tw:gap-8 tw:shrink-0 tw:w-max";
|
|
10
|
+
const tabsTriggerGroupClass = "tw:group/tab-trigger-group tw:flex tw:shrink-0 tw:items-center";
|
|
11
|
+
const tabsTriggerClass = "tw:focus-visible:outline-hidden tw:focus-visible:ring-2 tw:focus-visible:ring-inset tw:focus-visible:ring-ring tw:flex tw:justify-center tw:items-center tw:gap-1.5 tw:bg-transparent tw:shrink-0 tw:border-t-0 tw:border-x-0 tw:border-b-[3px] tw:border-solid tw:border-transparent tw:pt-2.5 tw:pb-5 tw:px-0 tw:m-0 tw:font-medium tw:leading-5 tw:text-muted-foreground tw:text-base tw:data-[state=active]:text-primary tw:data-[state=active]:border-primary tw:data-[disabled]:text-muted-foreground tw:data-[disabled]:opacity-50 tw:data-[disabled]:cursor-not-allowed tw:group-hover/tab-trigger-group:enabled:text-primary tw:group-hover/tab-trigger-group:enabled:border-primary tw:group-hover/tab-trigger-group:enabled:cursor-pointer";
|
|
12
|
+
//#endregion
|
|
13
|
+
//#region src/components/Tabs/TabsList.tsx
|
|
14
|
+
const TabsList = ({ className, children, ...rest }) => /* @__PURE__ */ jsx(ScrollArea, {
|
|
15
|
+
orientation: "horizontal",
|
|
16
|
+
className: tabsListWrapperClass,
|
|
17
|
+
children: /* @__PURE__ */ jsx(RadixTabs.List, {
|
|
18
|
+
...rest,
|
|
19
|
+
"data-slot": "tabs-list",
|
|
20
|
+
className: cn(tabsListClass, className),
|
|
21
|
+
children
|
|
22
|
+
})
|
|
23
|
+
});
|
|
24
|
+
//#endregion
|
|
25
|
+
//#region src/components/Tabs/TabsTrigger.tsx
|
|
26
|
+
const TabsTrigger = ({ className, compact = false, ...rest }) => /* @__PURE__ */ jsx(RadixTabs.Trigger, {
|
|
27
|
+
"data-slot": "tabs-trigger",
|
|
28
|
+
...rest,
|
|
29
|
+
className: cn(tabsTriggerClass, compact && "tw:text-sm tw:pb-4", className)
|
|
30
|
+
});
|
|
31
|
+
//#endregion
|
|
32
|
+
//#region src/components/Tabs/Tabs.tsx
|
|
33
|
+
const Tabs = ({ triggers, compact = false, children, defaultValue, onValueChange, rootClassName, listClassName, triggerClassName, triggerGroupClassName, ...rest }) => /* @__PURE__ */ jsxs(RadixTabs.Root, {
|
|
34
|
+
...rest,
|
|
35
|
+
"data-slot": "tabs-root",
|
|
36
|
+
className: cn("tw:flex tw:flex-col tw:gap-6", rootClassName),
|
|
37
|
+
defaultValue: defaultValue ?? triggers[0]?.value,
|
|
38
|
+
onValueChange,
|
|
39
|
+
children: [/* @__PURE__ */ jsx(TabsList, {
|
|
40
|
+
className: listClassName,
|
|
41
|
+
children: triggers.map(({ value, title, onClose, className: callerClassName, ...triggerRest }) => /* @__PURE__ */ jsxs("div", {
|
|
42
|
+
className: cn(tabsTriggerGroupClass, triggerGroupClassName),
|
|
43
|
+
"data-slot": "tabs-trigger-group",
|
|
44
|
+
children: [/* @__PURE__ */ jsx(TabsTrigger, {
|
|
45
|
+
value,
|
|
46
|
+
compact,
|
|
47
|
+
...triggerRest,
|
|
48
|
+
className: cn(triggerClassName, callerClassName),
|
|
49
|
+
children: title
|
|
50
|
+
}), onClose && /* @__PURE__ */ jsx(Button, {
|
|
51
|
+
type: "button",
|
|
52
|
+
variant: "inline",
|
|
53
|
+
size: "icon-3xs",
|
|
54
|
+
disabled: triggerRest.disabled,
|
|
55
|
+
onClick: () => onClose(value),
|
|
56
|
+
onMouseDown: (e) => e.preventDefault(),
|
|
57
|
+
className: "tw:!size-8 tw:opacity-0 tw:duration-200 tw:focus-visible:opacity-100 tw:group-focus-within/tab-trigger-group:opacity-100 tw:group-hover/tab-trigger-group:opacity-100",
|
|
58
|
+
"aria-label": typeof title === "string" ? `Close ${title}` : "Close tab",
|
|
59
|
+
children: /* @__PURE__ */ jsx(X, { className: "tw:size-4" })
|
|
60
|
+
})]
|
|
61
|
+
}, value))
|
|
62
|
+
}), children]
|
|
63
|
+
});
|
|
64
|
+
//#endregion
|
|
65
|
+
//#region src/components/Tabs/TabsContent.tsx
|
|
66
|
+
const TabsContent = (props) => /* @__PURE__ */ jsx(RadixTabs.Content, {
|
|
67
|
+
"data-slot": "tabs-content",
|
|
68
|
+
tabIndex: -1,
|
|
69
|
+
...props
|
|
70
|
+
});
|
|
71
|
+
//#endregion
|
|
72
|
+
export { Tabs, TabsContent };
|
|
73
|
+
|
|
74
|
+
//# sourceMappingURL=Tabs-EAihyqCt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Tabs-EAihyqCt.js","names":[],"sources":["../src/components/Tabs/styles.ts","../src/components/Tabs/TabsList.tsx","../src/components/Tabs/TabsTrigger.tsx","../src/components/Tabs/Tabs.tsx","../src/components/Tabs/TabsContent.tsx"],"sourcesContent":["// Directional resets (border-t-0/border-x-0), NOT border-0: under Tailwind v4 a\n// consumer app's `border-0` utility can land after design's compiled bottom-border in\n// the shared `utilities` layer and zero its width (same layer + specificity → source\n// order wins), dropping the line. With directional resets, only the bottom-border\n// utility (`border-b` on the wrapper, `border-b-[3px]` on the trigger) sets the bottom.\nexport const tabsListWrapperClass =\n 'tw:shrink-0 tw:border-t-0 tw:border-x-0 tw:border-b tw:border-solid tw:border-border';\n\nexport const tabsListClass = 'tw:flex tw:gap-8 tw:shrink-0 tw:w-max';\n\nexport const tabsTriggerGroupClass =\n 'tw:group/tab-trigger-group tw:flex tw:shrink-0 tw:items-center';\n\n// The focus ring is **inset**, not an outline. `TabsList` wraps the row in a horizontal\n// `ScrollArea`, whose viewport is `overflow-y: hidden`, and a trigger is exactly as tall as that\n// viewport — so there is 0px of slack for anything painted outside the border box, and a focus\n// outline (the browser's, or a host app's global rule) gets cropped on the top and bottom edges,\n// plus the left edge on the first trigger. Painting inside the box cannot be clipped by any\n// ancestor. Owning the affordance here is also what stops the consumer's global rule applying.\nexport const tabsTriggerClass =\n 'tw:focus-visible:outline-hidden tw:focus-visible:ring-2 tw:focus-visible:ring-inset tw:focus-visible:ring-ring tw:flex tw:justify-center tw:items-center tw:gap-1.5 tw:bg-transparent tw:shrink-0 tw:border-t-0 tw:border-x-0 tw:border-b-[3px] tw:border-solid tw:border-transparent tw:pt-2.5 tw:pb-5 tw:px-0 tw:m-0 tw:font-medium tw:leading-5 tw:text-muted-foreground tw:text-base tw:data-[state=active]:text-primary tw:data-[state=active]:border-primary tw:data-[disabled]:text-muted-foreground tw:data-[disabled]:opacity-50 tw:data-[disabled]:cursor-not-allowed tw:group-hover/tab-trigger-group:enabled:text-primary tw:group-hover/tab-trigger-group:enabled:border-primary tw:group-hover/tab-trigger-group:enabled:cursor-pointer';\n\nexport const tabsTriggerCompactClass = 'tw:text-sm tw:pb-4';\n","import * as RadixTabs from '@radix-ui/react-tabs';\n\nimport { cn } from '../../utils';\nimport { ScrollArea } from '../ScrollArea';\n\nimport { tabsListClass, tabsListWrapperClass } from './styles';\n\ntype Props = Omit<RadixTabs.TabsListProps, 'asChild'>;\n\nexport const TabsList = ({ className, children, ...rest }: Props) => (\n <ScrollArea orientation=\"horizontal\" className={tabsListWrapperClass}>\n <RadixTabs.List {...rest} data-slot=\"tabs-list\" className={cn(tabsListClass, className)}>\n {children}\n </RadixTabs.List>\n </ScrollArea>\n);\n","import * as RadixTabs from '@radix-ui/react-tabs';\n\nimport { cn } from '../../utils';\n\nimport { tabsTriggerClass, tabsTriggerCompactClass } from './styles';\n\ntype Props = Omit<RadixTabs.TabsTriggerProps, 'asChild'> & {\n compact?: boolean;\n};\n\nexport const TabsTrigger = ({ className, compact = false, ...rest }: Props) => (\n <RadixTabs.Trigger\n data-slot=\"tabs-trigger\"\n {...rest}\n className={cn(tabsTriggerClass, compact && tabsTriggerCompactClass, className)}\n />\n);\n","import type { ReactNode } from 'react';\nimport * as RadixTabs from '@radix-ui/react-tabs';\n\nimport { X } from '../../icons';\nimport { cn } from '../../utils';\nimport { Button } from '../Button';\n\nimport { tabsTriggerGroupClass } from './styles';\nimport { TabsList } from './TabsList';\nimport { TabsTrigger } from './TabsTrigger';\n\nexport type Trigger<T extends string> = {\n value: T;\n title: ReactNode;\n onClose?: (value: T) => void;\n} & Omit<RadixTabs.TabsTriggerProps, 'title' | 'asChild'>;\n\ntype Props<T extends string> = {\n triggers: readonly Trigger<T>[];\n compact?: boolean;\n children: ReactNode;\n defaultValue?: string;\n onValueChange?: (value: T) => void;\n rootClassName?: string;\n listClassName?: string;\n triggerClassName?: string;\n triggerGroupClassName?: string;\n} & Omit<RadixTabs.TabsProps, 'onValueChange'>;\n\nexport const Tabs = <T extends string>({\n triggers,\n compact = false,\n children,\n defaultValue,\n onValueChange,\n rootClassName,\n listClassName,\n triggerClassName,\n triggerGroupClassName,\n ...rest\n}: Props<T>) => (\n <RadixTabs.Root\n {...rest}\n data-slot=\"tabs-root\"\n className={cn('tw:flex tw:flex-col tw:gap-6', rootClassName)}\n defaultValue={defaultValue ?? triggers[0]?.value}\n onValueChange={onValueChange as (value: string) => void}\n >\n <TabsList className={listClassName}>\n {triggers.map(({ value, title, onClose, className: callerClassName, ...triggerRest }) => (\n <div\n key={value}\n className={cn(tabsTriggerGroupClass, triggerGroupClassName)}\n data-slot=\"tabs-trigger-group\"\n >\n <TabsTrigger\n value={value}\n compact={compact}\n {...triggerRest}\n className={cn(triggerClassName, callerClassName)}\n >\n {title}\n </TabsTrigger>\n {onClose && (\n <Button\n type=\"button\"\n variant=\"inline\"\n size=\"icon-3xs\"\n disabled={triggerRest.disabled}\n onClick={() => onClose(value)}\n onMouseDown={(e) => e.preventDefault()}\n className=\"tw:!size-8 tw:opacity-0 tw:duration-200 tw:focus-visible:opacity-100 tw:group-focus-within/tab-trigger-group:opacity-100 tw:group-hover/tab-trigger-group:opacity-100\"\n aria-label={typeof title === 'string' ? `Close ${title}` : 'Close tab'}\n >\n <X className=\"tw:size-4\" />\n </Button>\n )}\n </div>\n ))}\n </TabsList>\n {children}\n </RadixTabs.Root>\n);\n","import * as RadixTabs from '@radix-ui/react-tabs';\n\nexport const TabsContent = (props: RadixTabs.TabsContentProps) => (\n <RadixTabs.Content data-slot=\"tabs-content\" tabIndex={-1} {...props} />\n);\n"],"mappings":";;;;;;;AAKA,MAAa,uBACX;AAEF,MAAa,gBAAgB;AAE7B,MAAa,wBACX;AAQF,MAAa,mBACX;;;ACXF,MAAa,YAAY,EAAE,WAAW,UAAU,GAAG,WACjD,oBAAC,YAAD;CAAY,aAAY;CAAa,WAAW;CAC9C,UAAA,oBAAC,UAAU,MAAX;EAAgB,GAAI;EAAM,aAAU;EAAY,WAAW,GAAG,eAAe,SAAS;EACnF;CACa,CAAA;AACN,CAAA;;;ACJd,MAAa,eAAe,EAAE,WAAW,UAAU,OAAO,GAAG,WAC3D,oBAAC,UAAU,SAAX;CACE,aAAU;CACV,GAAI;CACJ,WAAW,GAAG,kBAAkB,WAAA,sBAAoC,SAAS;AAC9E,CAAA;;;ACcH,MAAa,QAA0B,EACrC,UACA,UAAU,OACV,UACA,cACA,eACA,eACA,eACA,kBACA,uBACA,GAAG,WAEH,qBAAC,UAAU,MAAX;CACE,GAAI;CACJ,aAAU;CACV,WAAW,GAAG,gCAAgC,aAAa;CAC3D,cAAc,gBAAgB,SAAS,EAAE,EAAE;CAC5B;CALjB,UAAA,CAOE,oBAAC,UAAD;EAAU,WAAW;EAClB,UAAA,SAAS,KAAK,EAAE,OAAO,OAAO,SAAS,WAAW,iBAAiB,GAAG,kBACrE,qBAAC,OAAD;GAEE,WAAW,GAAG,uBAAuB,qBAAqB;GAC1D,aAAU;GAHZ,UAAA,CAKE,oBAAC,aAAD;IACS;IACE;IACT,GAAI;IACJ,WAAW,GAAG,kBAAkB,eAAe;IAE9C,UAAA;GACU,CAAA,GACZ,WACC,oBAAC,QAAD;IACE,MAAK;IACL,SAAQ;IACR,MAAK;IACL,UAAU,YAAY;IACtB,eAAe,QAAQ,KAAK;IAC5B,cAAc,MAAM,EAAE,eAAe;IACrC,WAAU;IACV,cAAY,OAAO,UAAU,WAAW,SAAS,UAAU;IAE3D,UAAA,oBAAC,GAAD,EAAG,WAAU,YAAa,CAAA;GACpB,CAAA,CAEP;EA1BE,GAAA,KA0BF,CACN;CACO,CAAA,GACT,QACa;;;;AC/ElB,MAAa,eAAe,UAC1B,oBAAC,UAAU,SAAX;CAAmB,aAAU;CAAe,UAAU;CAAI,GAAI;AAAQ,CAAA"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { cn } from "./classNames-BzrkDnOD.js";
|
|
2
|
+
import { createChangeInputEvent, createPrefixedString } from "./utils-D0c5VAyF.js";
|
|
3
|
+
import { mergeRefs } from "./internal/utils/mergeRefs.js";
|
|
4
|
+
import { X } from "./icons-Cek151jC.js";
|
|
5
|
+
import { InputGroup } from "./InputGroup-BJWsI35s.js";
|
|
6
|
+
import { useControllableState } from "./useControllableState-M6494mCT.js";
|
|
7
|
+
import { useRef } from "react";
|
|
8
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
9
|
+
//#region src/blocks/TextInput/utils.ts
|
|
10
|
+
const genInputTestId = (prefix = "") => {
|
|
11
|
+
const ps = createPrefixedString(prefix);
|
|
12
|
+
return {
|
|
13
|
+
toString: () => prefix,
|
|
14
|
+
inputWrapper: ps`input-wrapper`,
|
|
15
|
+
input: ps`input`,
|
|
16
|
+
clearButton: ps`clear-button`
|
|
17
|
+
};
|
|
18
|
+
};
|
|
19
|
+
//#endregion
|
|
20
|
+
//#region src/blocks/TextInput/TextInput.tsx
|
|
21
|
+
const sanitizeTextInputValue = (value) => {
|
|
22
|
+
if (typeof value === "string" && value.trim() === "") return "";
|
|
23
|
+
return value;
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Standard text input with a string-only API, built on `InputGroup` chrome — addons, clear button,
|
|
27
|
+
* sizing, focus variants. The default choice for a bare text input.
|
|
28
|
+
*
|
|
29
|
+
* **When to use:** any plain text / email / password / date-input field outside `useAppForm`. Pair with
|
|
30
|
+
* `onValueChange` instead of unwrapping `event.target.value` from `onChange`.
|
|
31
|
+
* **When NOT to use:** for fields inside a labelled group use `FormGroup.TextInput`; for forms with
|
|
32
|
+
* validation use `useAppForm` + `field.TextField`; for search use `SearchInput`.
|
|
33
|
+
* **Composition:** wrap in a `FormGroup` for shared error / help-text state, or render directly inside
|
|
34
|
+
* page layouts. Chrome resolves from the active brand automatically: a modern brand always renders argo
|
|
35
|
+
* (any `variant` is ignored), while `variant` only tunes the legacy-brand chrome.
|
|
36
|
+
*/
|
|
37
|
+
const TextInput = ({ ref: forwardedRef, state = "default", sizing = "default", className, prefix = null, rightSuffix = null, rightSuffixVariant = "default", leftSuffix = null, allowClear = false, onClear, disabled = false, testId: prefixTestId = "", autoFocus = false, id, name, variant, readOnly, type = "text", focusVariant = "default", onChange, onBlur, onValueChange, onValueBlur, value: valueProp, defaultValue, ...inputProps }) => {
|
|
38
|
+
const inputRef = useRef(null);
|
|
39
|
+
const [value, setValue] = useControllableState({
|
|
40
|
+
prop: valueProp === void 0 ? void 0 : sanitizeTextInputValue(valueProp) ?? "",
|
|
41
|
+
defaultProp: sanitizeTextInputValue(defaultValue) ?? "",
|
|
42
|
+
onChange: onValueChange
|
|
43
|
+
});
|
|
44
|
+
const testId = genInputTestId(prefixTestId);
|
|
45
|
+
const isClearButtonVisible = !!value && !disabled && !readOnly || !!onClear;
|
|
46
|
+
const handleChange = (event) => {
|
|
47
|
+
setValue(event.target.value);
|
|
48
|
+
onChange?.(event);
|
|
49
|
+
};
|
|
50
|
+
const handleBlur = (event) => {
|
|
51
|
+
onValueBlur?.(event.target.value);
|
|
52
|
+
onBlur?.(event);
|
|
53
|
+
};
|
|
54
|
+
const handleClear = () => {
|
|
55
|
+
if (inputRef.current === null) return;
|
|
56
|
+
inputRef.current.value = "";
|
|
57
|
+
inputRef.current.focus();
|
|
58
|
+
onClear?.();
|
|
59
|
+
handleChange(createChangeInputEvent(inputRef.current));
|
|
60
|
+
};
|
|
61
|
+
return /* @__PURE__ */ jsxs(InputGroup, {
|
|
62
|
+
state,
|
|
63
|
+
variant,
|
|
64
|
+
sizing,
|
|
65
|
+
focusVariant,
|
|
66
|
+
className,
|
|
67
|
+
"data-testid": testId.inputWrapper,
|
|
68
|
+
children: [
|
|
69
|
+
prefix && /* @__PURE__ */ jsx(InputGroup.Addon, {
|
|
70
|
+
align: "inline-start",
|
|
71
|
+
children: prefix
|
|
72
|
+
}),
|
|
73
|
+
/* @__PURE__ */ jsx(InputGroup.Input, {
|
|
74
|
+
...inputProps,
|
|
75
|
+
value,
|
|
76
|
+
autoFocus,
|
|
77
|
+
type,
|
|
78
|
+
onChange: handleChange,
|
|
79
|
+
onBlur: handleBlur,
|
|
80
|
+
ref: mergeRefs(forwardedRef ?? null, inputRef),
|
|
81
|
+
disabled,
|
|
82
|
+
id,
|
|
83
|
+
name,
|
|
84
|
+
readOnly,
|
|
85
|
+
"data-testid": testId.input
|
|
86
|
+
}),
|
|
87
|
+
(leftSuffix || allowClear || rightSuffix) && /* @__PURE__ */ jsxs(InputGroup.Addon, {
|
|
88
|
+
align: "inline-end",
|
|
89
|
+
children: [
|
|
90
|
+
leftSuffix,
|
|
91
|
+
allowClear && isClearButtonVisible && /* @__PURE__ */ jsx(InputGroup.Button, {
|
|
92
|
+
"aria-label": "Clear",
|
|
93
|
+
onMouseDown: (e) => e.preventDefault(),
|
|
94
|
+
onClick: handleClear,
|
|
95
|
+
"data-testid": testId.clearButton,
|
|
96
|
+
children: /* @__PURE__ */ jsx(X, { className: "tw:size-4" })
|
|
97
|
+
}),
|
|
98
|
+
rightSuffix && /* @__PURE__ */ jsx("div", {
|
|
99
|
+
className: cn({ "tw:whitespace-nowrap tw:bg-muted tw:px-4 tw:-mr-4 tw:py-2.5": rightSuffixVariant === "addon" }),
|
|
100
|
+
children: rightSuffix
|
|
101
|
+
})
|
|
102
|
+
]
|
|
103
|
+
})
|
|
104
|
+
]
|
|
105
|
+
});
|
|
106
|
+
};
|
|
107
|
+
//#endregion
|
|
108
|
+
export { TextInput };
|
|
109
|
+
|
|
110
|
+
//# sourceMappingURL=TextInput-BGed-V13.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TextInput-BGed-V13.js","names":[],"sources":["../src/blocks/TextInput/utils.ts","../src/blocks/TextInput/TextInput.tsx"],"sourcesContent":["import { createPrefixedString } from '../../utils';\n\nexport const genInputTestId = (prefix: string = '') => {\n const ps = createPrefixedString(prefix);\n return {\n toString: () => prefix,\n inputWrapper: ps`input-wrapper`,\n input: ps`input`,\n clearButton: ps`clear-button`,\n };\n};\n","import { useRef } from 'react';\nimport type {\n ChangeEventHandler,\n ComponentProps,\n ComponentRef,\n FocusEventHandler,\n MouseEventHandler,\n ReactNode,\n} from 'react';\n\nimport { InputGroup } from '../../components/InputGroup';\nimport { useControllableState } from '../../hooks/useControllableState';\nimport { X } from '../../icons';\nimport { cn, createChangeInputEvent, mergeRefs } from '../../utils';\n\nimport { genInputTestId } from './utils';\n\ntype InputGroupProps = Pick<\n ComponentProps<typeof InputGroup>,\n 'variant' | 'focusVariant' | 'sizing' | 'state'\n>;\n\ntype OwnProps = {\n prefix?: ReactNode;\n rightSuffix?: ReactNode;\n rightSuffixVariant?: 'addon' | 'default';\n leftSuffix?: ReactNode;\n allowClear?: boolean;\n onClear?: () => void;\n testId?: string;\n value?: string | null;\n defaultValue?: string | null;\n /** Called with the unwrapped string value on every change. For the raw event use `onChange`. */\n onValueChange?: (value: string) => void;\n /** Called with the unwrapped string value on blur. For the raw event use `onBlur`. */\n onValueBlur?: (value: string) => void;\n type?: 'text' | 'email' | 'password' | 'datetime-local' | 'date';\n};\n\n/**\n * Props for `TextInput`. Combines `InputGroup` chrome (variant / sizing / state / focusVariant) with\n * input-specific slots (`prefix`, `leftSuffix`, `rightSuffix`, `allowClear`) and a string-typed\n * `value` / `defaultValue` plus convenience `onValueChange` / `onValueBlur` callbacks. `null` /\n * `undefined` are coerced to empty strings.\n */\nexport type Props = InputGroupProps &\n OwnProps &\n Omit<ComponentProps<'input'>, 'prefix' | 'value' | 'defaultValue' | 'type' | 'accept' | 'step'>;\n\nconst sanitizeTextInputValue = (value: string | null | undefined) => {\n if (typeof value === 'string' && value.trim() === '') return '';\n return value;\n};\n\n/**\n * Standard text input with a string-only API, built on `InputGroup` chrome — addons, clear button,\n * sizing, focus variants. The default choice for a bare text input.\n *\n * **When to use:** any plain text / email / password / date-input field outside `useAppForm`. Pair with\n * `onValueChange` instead of unwrapping `event.target.value` from `onChange`.\n * **When NOT to use:** for fields inside a labelled group use `FormGroup.TextInput`; for forms with\n * validation use `useAppForm` + `field.TextField`; for search use `SearchInput`.\n * **Composition:** wrap in a `FormGroup` for shared error / help-text state, or render directly inside\n * page layouts. Chrome resolves from the active brand automatically: a modern brand always renders argo\n * (any `variant` is ignored), while `variant` only tunes the legacy-brand chrome.\n */\nexport const TextInput = ({\n ref: forwardedRef,\n state = 'default',\n sizing = 'default',\n className,\n prefix = null,\n rightSuffix = null,\n rightSuffixVariant = 'default',\n leftSuffix = null,\n allowClear = false,\n onClear,\n disabled = false,\n testId: prefixTestId = '',\n autoFocus = false,\n id,\n name,\n variant,\n readOnly,\n type = 'text',\n focusVariant = 'default',\n onChange,\n onBlur,\n onValueChange,\n onValueBlur,\n value: valueProp,\n defaultValue,\n ...inputProps\n}: Props) => {\n const inputRef = useRef<ComponentRef<'input'>>(null);\n\n const [value, setValue] = useControllableState<string>({\n // `undefined` stays uncontrolled; any provided value (incl. `null`) is controlled and coerced\n // to a string. Whitespace-only input collapses to '' via `sanitizeTextInputValue`.\n prop: valueProp === undefined ? undefined : (sanitizeTextInputValue(valueProp) ?? ''),\n defaultProp: sanitizeTextInputValue(defaultValue) ?? '',\n onChange: onValueChange,\n });\n\n const testId = genInputTestId(prefixTestId);\n const isClearButtonVisible = (!!value && !disabled && !readOnly) || !!onClear;\n\n const handleChange: ChangeEventHandler<HTMLInputElement> = (event) => {\n setValue(event.target.value);\n onChange?.(event);\n };\n\n const handleBlur: FocusEventHandler<HTMLInputElement> = (event) => {\n onValueBlur?.(event.target.value);\n onBlur?.(event);\n };\n\n const handleClear: MouseEventHandler<HTMLButtonElement> = () => {\n if (inputRef.current === null) return;\n inputRef.current.value = ''; // keep the DOM node in sync before firing the synthetic change\n inputRef.current.focus();\n onClear?.();\n handleChange(createChangeInputEvent(inputRef.current));\n };\n\n return (\n <InputGroup\n state={state}\n variant={variant}\n sizing={sizing}\n focusVariant={focusVariant}\n className={className}\n data-testid={testId.inputWrapper}\n >\n {prefix && <InputGroup.Addon align=\"inline-start\">{prefix}</InputGroup.Addon>}\n\n <InputGroup.Input\n {...inputProps}\n value={value}\n autoFocus={autoFocus}\n type={type}\n onChange={handleChange}\n onBlur={handleBlur}\n ref={mergeRefs(forwardedRef ?? null, inputRef)}\n disabled={disabled}\n id={id}\n name={name}\n readOnly={readOnly}\n data-testid={testId.input}\n />\n\n {(leftSuffix || allowClear || rightSuffix) && (\n <InputGroup.Addon align=\"inline-end\">\n {leftSuffix}\n {allowClear && isClearButtonVisible && (\n <InputGroup.Button\n aria-label=\"Clear\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={handleClear}\n data-testid={testId.clearButton}\n >\n <X className=\"tw:size-4\" />\n </InputGroup.Button>\n )}\n {rightSuffix && (\n <div\n className={cn({\n 'tw:whitespace-nowrap tw:bg-muted tw:px-4 tw:-mr-4 tw:py-2.5':\n rightSuffixVariant === 'addon',\n })}\n >\n {rightSuffix}\n </div>\n )}\n </InputGroup.Addon>\n )}\n </InputGroup>\n );\n};\n"],"mappings":";;;;;;;;;AAEA,MAAa,kBAAkB,SAAiB,OAAO;CACrD,MAAM,KAAK,qBAAqB,MAAM;CACtC,OAAO;EACL,gBAAgB;EAChB,cAAc,EAAE;EAChB,OAAO,EAAE;EACT,aAAa,EAAE;CACjB;AACF;;;ACuCA,MAAM,0BAA0B,UAAqC;CACnE,IAAI,OAAO,UAAU,YAAY,MAAM,KAAK,MAAM,IAAI,OAAO;CAC7D,OAAO;AACT;;;;;;;;;;;;;AAcA,MAAa,aAAa,EACxB,KAAK,cACL,QAAQ,WACR,SAAS,WACT,WACA,SAAS,MACT,cAAc,MACd,qBAAqB,WACrB,aAAa,MACb,aAAa,OACb,SACA,WAAW,OACX,QAAQ,eAAe,IACvB,YAAY,OACZ,IACA,MACA,SACA,UACA,OAAO,QACP,eAAe,WACf,UACA,QACA,eACA,aACA,OAAO,WACP,cACA,GAAG,iBACQ;CACX,MAAM,WAAW,OAA8B,IAAI;CAEnD,MAAM,CAAC,OAAO,YAAY,qBAA6B;EAGrD,MAAM,cAAc,KAAA,IAAY,KAAA,IAAa,uBAAuB,SAAS,KAAK;EAClF,aAAa,uBAAuB,YAAY,KAAK;EACrD,UAAU;CACZ,CAAC;CAED,MAAM,SAAS,eAAe,YAAY;CAC1C,MAAM,uBAAwB,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,YAAa,CAAC,CAAC;CAEtE,MAAM,gBAAsD,UAAU;EACpE,SAAS,MAAM,OAAO,KAAK;EAC3B,WAAW,KAAK;CAClB;CAEA,MAAM,cAAmD,UAAU;EACjE,cAAc,MAAM,OAAO,KAAK;EAChC,SAAS,KAAK;CAChB;CAEA,MAAM,oBAA0D;EAC9D,IAAI,SAAS,YAAY,MAAM;EAC/B,SAAS,QAAQ,QAAQ;EACzB,SAAS,QAAQ,MAAM;EACvB,UAAU;EACV,aAAa,uBAAuB,SAAS,OAAO,CAAC;CACvD;CAEA,OACE,qBAAC,YAAD;EACS;EACE;EACD;EACM;EACH;EACX,eAAa,OAAO;EANtB,UAAA;GAQG,UAAU,oBAAC,WAAW,OAAZ;IAAkB,OAAM;IAAgB,UAAA;GAAyB,CAAA;GAE5E,oBAAC,WAAW,OAAZ;IACE,GAAI;IACG;IACI;IACL;IACN,UAAU;IACV,QAAQ;IACR,KAAK,UAAU,gBAAgB,MAAM,QAAQ;IACnC;IACN;IACE;IACI;IACV,eAAa,OAAO;GACrB,CAAA;IAEC,cAAc,cAAc,gBAC5B,qBAAC,WAAW,OAAZ;IAAkB,OAAM;IAAxB,UAAA;KACG;KACA,cAAc,wBACb,oBAAC,WAAW,QAAZ;MACE,cAAW;MACX,cAAc,MAAM,EAAE,eAAe;MACrC,SAAS;MACT,eAAa,OAAO;MAEpB,UAAA,oBAAC,GAAD,EAAG,WAAU,YAAa,CAAA;KACT,CAAA;KAEpB,eACC,oBAAC,OAAD;MACE,WAAW,GAAG,EACZ,+DACE,uBAAuB,QAC3B,CAAC;MAEA,UAAA;KACE,CAAA;IAES;;EAEV;;AAEhB"}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
import { TooltipProvider } from "./utils-D0c5VAyF.js";
|
|
2
|
+
import { DEFAULT_BRANDS, ThemeContext, createCssVars, createTheme, defaultBrand } from "./context-KxxeMHbR.js";
|
|
3
|
+
import { useBrandState, useColorSchemeState } from "./useColorSchemeState-CYqcUfSH.js";
|
|
4
|
+
import { useInsertionEffect, useMemo } from "react";
|
|
5
|
+
import { brandSchema, exampleCustomer, keboola as keboola$1, keboolaLegacySidebar as keboolaLegacySidebar$1, keboolaLegacyTopnav as keboolaLegacyTopnav$1 } from "@keboola/brand-registry";
|
|
6
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
7
|
+
//#region src/components/ThemeProvider/AIGradientSvg.tsx
|
|
8
|
+
const AIGradientsSvg = () => /* @__PURE__ */ jsx("svg", {
|
|
9
|
+
width: "0",
|
|
10
|
+
height: "0",
|
|
11
|
+
style: {
|
|
12
|
+
position: "absolute",
|
|
13
|
+
visibility: "hidden"
|
|
14
|
+
},
|
|
15
|
+
children: /* @__PURE__ */ jsxs("defs", { children: [/* @__PURE__ */ jsxs("linearGradient", {
|
|
16
|
+
id: "aigradient-600",
|
|
17
|
+
x1: "0%",
|
|
18
|
+
y1: "0%",
|
|
19
|
+
x2: "100%",
|
|
20
|
+
y2: "100%",
|
|
21
|
+
children: [
|
|
22
|
+
/* @__PURE__ */ jsx("stop", {
|
|
23
|
+
offset: "0%",
|
|
24
|
+
stopColor: "#61E4FF"
|
|
25
|
+
}),
|
|
26
|
+
/* @__PURE__ */ jsx("stop", {
|
|
27
|
+
offset: "50%",
|
|
28
|
+
stopColor: "#1F8FFF"
|
|
29
|
+
}),
|
|
30
|
+
/* @__PURE__ */ jsx("stop", {
|
|
31
|
+
offset: "100%",
|
|
32
|
+
stopColor: "#7C5CFF"
|
|
33
|
+
})
|
|
34
|
+
]
|
|
35
|
+
}), /* @__PURE__ */ jsxs("linearGradient", {
|
|
36
|
+
id: "aigradient-700",
|
|
37
|
+
x1: "0%",
|
|
38
|
+
y1: "0%",
|
|
39
|
+
x2: "100%",
|
|
40
|
+
y2: "100%",
|
|
41
|
+
children: [/* @__PURE__ */ jsx("stop", {
|
|
42
|
+
offset: "0%",
|
|
43
|
+
stopColor: "#075fb8"
|
|
44
|
+
}), /* @__PURE__ */ jsx("stop", {
|
|
45
|
+
offset: "100%",
|
|
46
|
+
stopColor: "#5b2cb8"
|
|
47
|
+
})]
|
|
48
|
+
})] })
|
|
49
|
+
});
|
|
50
|
+
//#endregion
|
|
51
|
+
//#region src/components/ThemeProvider/useThemeTokens.ts
|
|
52
|
+
const brandThemeToTokens = (theme, scheme) => ({
|
|
53
|
+
colors: scheme === "dark" ? theme.colorsDark : theme.colors,
|
|
54
|
+
typography: theme.typography,
|
|
55
|
+
radii: theme.radii,
|
|
56
|
+
shadows: theme.shadows,
|
|
57
|
+
spacing: theme.spacing,
|
|
58
|
+
motion: theme.motion,
|
|
59
|
+
gradient: theme.gradient
|
|
60
|
+
});
|
|
61
|
+
const tokensToCssVars = ({ colors, typography, radii, shadows, spacing, motion, gradient }) => {
|
|
62
|
+
const vars = createCssVars();
|
|
63
|
+
vars.set("--background", colors?.background);
|
|
64
|
+
vars.set("--foreground", colors?.foreground);
|
|
65
|
+
vars.set("--muted", colors?.muted);
|
|
66
|
+
vars.set("--muted-foreground", colors?.mutedForeground);
|
|
67
|
+
vars.set("--border", colors?.border);
|
|
68
|
+
vars.set("--input", colors?.input);
|
|
69
|
+
vars.set("--input-background", colors?.inputBackground);
|
|
70
|
+
vars.set("--ring", colors?.ring);
|
|
71
|
+
vars.set("--ring-offset", colors?.ringOffset);
|
|
72
|
+
vars.set("--primary", colors?.primary);
|
|
73
|
+
vars.set("--primary-foreground", colors?.primaryForeground);
|
|
74
|
+
vars.set("--secondary", colors?.secondary);
|
|
75
|
+
vars.set("--secondary-foreground", colors?.secondaryForeground);
|
|
76
|
+
vars.set("--accent", colors?.accent);
|
|
77
|
+
vars.set("--accent-foreground", colors?.accentForeground);
|
|
78
|
+
vars.set("--card", colors?.card);
|
|
79
|
+
vars.set("--card-foreground", colors?.cardForeground);
|
|
80
|
+
vars.set("--popover", colors?.popover);
|
|
81
|
+
vars.set("--popover-foreground", colors?.popoverForeground);
|
|
82
|
+
vars.set("--destructive", colors?.destructive);
|
|
83
|
+
vars.set("--destructive-foreground", colors?.destructiveForeground);
|
|
84
|
+
vars.set("--success", colors?.success);
|
|
85
|
+
vars.set("--success-foreground", colors?.successForeground);
|
|
86
|
+
vars.set("--warning", colors?.warning);
|
|
87
|
+
vars.set("--warning-foreground", colors?.warningForeground);
|
|
88
|
+
vars.set("--info", colors?.info);
|
|
89
|
+
vars.set("--info-foreground", colors?.infoForeground);
|
|
90
|
+
vars.set("--chart-1", colors?.chart?.chart1);
|
|
91
|
+
vars.set("--chart-2", colors?.chart?.chart2);
|
|
92
|
+
vars.set("--chart-3", colors?.chart?.chart3);
|
|
93
|
+
vars.set("--chart-4", colors?.chart?.chart4);
|
|
94
|
+
vars.set("--chart-5", colors?.chart?.chart5);
|
|
95
|
+
vars.set("--sidebar", colors?.sidebar?.sidebar);
|
|
96
|
+
vars.set("--sidebar-foreground", colors?.sidebar?.sidebarForeground);
|
|
97
|
+
vars.set("--sidebar-primary", colors?.sidebar?.sidebarPrimary);
|
|
98
|
+
vars.set("--sidebar-primary-foreground", colors?.sidebar?.sidebarPrimaryForeground);
|
|
99
|
+
vars.set("--sidebar-accent", colors?.sidebar?.sidebarAccent);
|
|
100
|
+
vars.set("--sidebar-accent-foreground", colors?.sidebar?.sidebarAccentForeground);
|
|
101
|
+
vars.set("--sidebar-border", colors?.sidebar?.sidebarBorder);
|
|
102
|
+
vars.set("--sidebar-ring", colors?.sidebar?.sidebarRing);
|
|
103
|
+
/**
|
|
104
|
+
* TYPOGRAPHY
|
|
105
|
+
*/
|
|
106
|
+
vars.set("--font-sans", typography?.fontFamily?.trim() || void 0);
|
|
107
|
+
vars.set("--font-display", typography?.fontDisplay?.trim() || void 0);
|
|
108
|
+
vars.set("--font-mono", typography?.fontMono?.trim() || void 0);
|
|
109
|
+
vars.set("--font-weight-normal", typography?.weight?.normal);
|
|
110
|
+
vars.set("--font-weight-medium", typography?.weight?.medium);
|
|
111
|
+
vars.set("--font-weight-semibold", typography?.weight?.semibold);
|
|
112
|
+
vars.set("--font-weight-bold", typography?.weight?.bold);
|
|
113
|
+
vars.set("--letter-spacing-chrome", typography?.letterSpacing?.chrome);
|
|
114
|
+
vars.set("--type-display-size", typography?.typeScale?.display?.size);
|
|
115
|
+
vars.set("--type-display-weight", typography?.typeScale?.display?.weight);
|
|
116
|
+
vars.set("--type-display-leading", typography?.typeScale?.display?.leading);
|
|
117
|
+
vars.set("--type-display-tracking", typography?.typeScale?.display?.tracking);
|
|
118
|
+
vars.set("--type-heading-size", typography?.typeScale?.heading?.size);
|
|
119
|
+
vars.set("--type-heading-weight", typography?.typeScale?.heading?.weight);
|
|
120
|
+
vars.set("--type-heading-leading", typography?.typeScale?.heading?.leading);
|
|
121
|
+
vars.set("--type-heading-tracking", typography?.typeScale?.heading?.tracking);
|
|
122
|
+
vars.set("--type-body-size", typography?.typeScale?.body?.size);
|
|
123
|
+
vars.set("--type-body-weight", typography?.typeScale?.body?.weight);
|
|
124
|
+
vars.set("--type-body-leading", typography?.typeScale?.body?.leading);
|
|
125
|
+
vars.set("--type-body-tracking", typography?.typeScale?.body?.tracking);
|
|
126
|
+
vars.set("--radius-sm", radii?.sm);
|
|
127
|
+
vars.set("--radius-md", radii?.md);
|
|
128
|
+
vars.set("--radius-lg", radii?.lg);
|
|
129
|
+
/**
|
|
130
|
+
* ELEVATION / DENSITY / MOTION / GRADIENT
|
|
131
|
+
*/
|
|
132
|
+
vars.set("--shadow-sm", shadows?.sm);
|
|
133
|
+
vars.set("--shadow-md", shadows?.md);
|
|
134
|
+
vars.set("--shadow-lg", shadows?.lg);
|
|
135
|
+
vars.set("--shadow-lift", shadows?.lift);
|
|
136
|
+
vars.set("--space-gutter", spacing?.gutter);
|
|
137
|
+
vars.set("--space-inset", spacing?.inset);
|
|
138
|
+
vars.set("--motion-duration", motion?.duration);
|
|
139
|
+
vars.set("--motion-easing", motion?.easing);
|
|
140
|
+
vars.set("--gradient-brand", gradient?.brand);
|
|
141
|
+
return vars.expose();
|
|
142
|
+
};
|
|
143
|
+
const setTokens = (node, vars) => {
|
|
144
|
+
for (const [name, value] of Object.entries(vars)) node.style.setProperty(name, value);
|
|
145
|
+
};
|
|
146
|
+
const removeTokens = (node, vars) => {
|
|
147
|
+
for (const name of Object.keys(vars)) node.style.removeProperty(name);
|
|
148
|
+
};
|
|
149
|
+
const useThemeTokens = (tokens) => {
|
|
150
|
+
useInsertionEffect(() => {
|
|
151
|
+
if (typeof document === "undefined") return;
|
|
152
|
+
const root = document.documentElement;
|
|
153
|
+
const vars = tokensToCssVars(tokens);
|
|
154
|
+
setTokens(root, vars);
|
|
155
|
+
return () => removeTokens(root, vars);
|
|
156
|
+
}, [tokens]);
|
|
157
|
+
};
|
|
158
|
+
//#endregion
|
|
159
|
+
//#region src/components/ThemeProvider/ThemeProvider.tsx
|
|
160
|
+
const ThemeProvider = ({ defaultScheme, scheme, onSchemeChange, defaultBrandId, brandId, onBrandIdChange, brands = DEFAULT_BRANDS, children }) => {
|
|
161
|
+
const colorSchemeState = useColorSchemeState({
|
|
162
|
+
defaultScheme,
|
|
163
|
+
scheme,
|
|
164
|
+
onSchemeChange
|
|
165
|
+
});
|
|
166
|
+
const brandState = useBrandState({
|
|
167
|
+
defaultBrandId,
|
|
168
|
+
brandId,
|
|
169
|
+
onBrandIdChange
|
|
170
|
+
});
|
|
171
|
+
const brand = useMemo(() => brands.find((item) => item.id === brandState.brandId) ?? defaultBrand, [brands, brandState.brandId]);
|
|
172
|
+
const themes = useMemo(() => brands.map(createTheme), [brands]);
|
|
173
|
+
const currentTheme = useMemo(() => createTheme(brand), [brand]);
|
|
174
|
+
const themeTokens = useMemo(() => brandThemeToTokens(brand.theme, colorSchemeState.resolvedScheme), [brand, colorSchemeState.resolvedScheme]);
|
|
175
|
+
useThemeTokens(themeTokens);
|
|
176
|
+
const { scheme: activeScheme, resolvedScheme, setScheme } = colorSchemeState;
|
|
177
|
+
const { brandId: activeBrandId, setBrand } = brandState;
|
|
178
|
+
const context = useMemo(() => ({
|
|
179
|
+
scheme: activeScheme,
|
|
180
|
+
resolvedScheme,
|
|
181
|
+
setScheme,
|
|
182
|
+
brandId: activeBrandId,
|
|
183
|
+
setBrand,
|
|
184
|
+
themes,
|
|
185
|
+
currentTheme
|
|
186
|
+
}), [
|
|
187
|
+
activeScheme,
|
|
188
|
+
resolvedScheme,
|
|
189
|
+
setScheme,
|
|
190
|
+
activeBrandId,
|
|
191
|
+
setBrand,
|
|
192
|
+
themes,
|
|
193
|
+
currentTheme
|
|
194
|
+
]);
|
|
195
|
+
return /* @__PURE__ */ jsxs(ThemeContext, {
|
|
196
|
+
value: context,
|
|
197
|
+
children: [/* @__PURE__ */ jsx(AIGradientsSvg, {}), /* @__PURE__ */ jsx(TooltipProvider, { children })]
|
|
198
|
+
});
|
|
199
|
+
};
|
|
200
|
+
//#endregion
|
|
201
|
+
export { ThemeProvider, brandSchema, exampleCustomer, keboola$1 as keboola, keboolaLegacySidebar$1 as keboolaLegacySidebar, keboolaLegacyTopnav$1 as keboolaLegacyTopnav };
|
|
202
|
+
|
|
203
|
+
//# sourceMappingURL=ThemeProvider-QncUrfJn.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ThemeProvider-QncUrfJn.js","names":[],"sources":["../src/components/ThemeProvider/AIGradientSvg.tsx","../src/components/ThemeProvider/useThemeTokens.ts","../src/components/ThemeProvider/ThemeProvider.tsx"],"sourcesContent":["export const AIGradientsSvg = () => (\n <svg width=\"0\" height=\"0\" style={{ position: 'absolute', visibility: 'hidden' }}>\n <defs>\n {/*aigradient-600*/}\n <linearGradient id=\"aigradient-600\" x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"100%\">\n <stop offset=\"0%\" stopColor=\"#61E4FF\" />\n <stop offset=\"50%\" stopColor=\"#1F8FFF\" />\n <stop offset=\"100%\" stopColor=\"#7C5CFF\" />\n </linearGradient>\n\n {/*aigradient-700*/}\n <linearGradient id=\"aigradient-700\" x1=\"0%\" y1=\"0%\" x2=\"100%\" y2=\"100%\">\n <stop offset=\"0%\" stopColor=\"#075fb8\" />\n <stop offset=\"100%\" stopColor=\"#5b2cb8\" />\n </linearGradient>\n </defs>\n </svg>\n);\n","import { useInsertionEffect } from 'react';\n\nimport type {\n BrandTheme,\n Colors,\n Gradient,\n Motion,\n Radii,\n Shadows,\n Spacing,\n Typography,\n} from '@keboola/brand-registry';\n\nimport type { ResolvedColorScheme } from './types';\nimport { createCssVars } from './utils';\n\nexport type ThemeTokens = {\n colors?: Colors;\n typography?: Typography;\n radii?: Radii;\n shadows?: Shadows;\n spacing?: Spacing;\n motion?: Motion;\n gradient?: Gradient;\n};\n\nexport const brandThemeToTokens = (\n theme: BrandTheme,\n scheme: ResolvedColorScheme,\n): ThemeTokens => ({\n colors: scheme === 'dark' ? theme.colorsDark : theme.colors,\n typography: theme.typography,\n radii: theme.radii,\n // Scheme-independent — the same values apply in light and dark.\n shadows: theme.shadows,\n spacing: theme.spacing,\n motion: theme.motion,\n gradient: theme.gradient,\n});\n\nexport const tokensToCssVars = ({\n colors,\n typography,\n radii,\n shadows,\n spacing,\n motion,\n gradient,\n}: ThemeTokens): Record<string, string> => {\n const vars = createCssVars();\n\n vars.set('--background', colors?.background);\n vars.set('--foreground', colors?.foreground);\n vars.set('--muted', colors?.muted);\n vars.set('--muted-foreground', colors?.mutedForeground);\n vars.set('--border', colors?.border);\n vars.set('--input', colors?.input);\n vars.set('--input-background', colors?.inputBackground);\n vars.set('--ring', colors?.ring);\n vars.set('--ring-offset', colors?.ringOffset);\n vars.set('--primary', colors?.primary);\n vars.set('--primary-foreground', colors?.primaryForeground);\n vars.set('--secondary', colors?.secondary);\n vars.set('--secondary-foreground', colors?.secondaryForeground);\n vars.set('--accent', colors?.accent);\n vars.set('--accent-foreground', colors?.accentForeground);\n vars.set('--card', colors?.card);\n vars.set('--card-foreground', colors?.cardForeground);\n vars.set('--popover', colors?.popover);\n vars.set('--popover-foreground', colors?.popoverForeground);\n vars.set('--destructive', colors?.destructive);\n vars.set('--destructive-foreground', colors?.destructiveForeground);\n vars.set('--success', colors?.success);\n vars.set('--success-foreground', colors?.successForeground);\n vars.set('--warning', colors?.warning);\n vars.set('--warning-foreground', colors?.warningForeground);\n vars.set('--info', colors?.info);\n vars.set('--info-foreground', colors?.infoForeground);\n\n vars.set('--chart-1', colors?.chart?.chart1);\n vars.set('--chart-2', colors?.chart?.chart2);\n vars.set('--chart-3', colors?.chart?.chart3);\n vars.set('--chart-4', colors?.chart?.chart4);\n vars.set('--chart-5', colors?.chart?.chart5);\n\n vars.set('--sidebar', colors?.sidebar?.sidebar);\n vars.set('--sidebar-foreground', colors?.sidebar?.sidebarForeground);\n vars.set('--sidebar-primary', colors?.sidebar?.sidebarPrimary);\n vars.set('--sidebar-primary-foreground', colors?.sidebar?.sidebarPrimaryForeground);\n vars.set('--sidebar-accent', colors?.sidebar?.sidebarAccent);\n vars.set('--sidebar-accent-foreground', colors?.sidebar?.sidebarAccentForeground);\n vars.set('--sidebar-border', colors?.sidebar?.sidebarBorder);\n vars.set('--sidebar-ring', colors?.sidebar?.sidebarRing);\n\n /**\n * TYPOGRAPHY\n */\n vars.set('--font-sans', typography?.fontFamily?.trim() || undefined);\n vars.set('--font-display', typography?.fontDisplay?.trim() || undefined);\n vars.set('--font-mono', typography?.fontMono?.trim() || undefined);\n\n // Chrome font-weight slots — read by Tailwind's `fontWeight` scale.\n vars.set('--font-weight-normal', typography?.weight?.normal);\n vars.set('--font-weight-medium', typography?.weight?.medium);\n vars.set('--font-weight-semibold', typography?.weight?.semibold);\n vars.set('--font-weight-bold', typography?.weight?.bold);\n\n // Chrome tracking — behind Button/Badge `tracking-chrome`.\n vars.set('--letter-spacing-chrome', typography?.letterSpacing?.chrome);\n\n // Type scale — display/heading/body steps read by `text-display/heading/body`.\n vars.set('--type-display-size', typography?.typeScale?.display?.size);\n vars.set('--type-display-weight', typography?.typeScale?.display?.weight);\n vars.set('--type-display-leading', typography?.typeScale?.display?.leading);\n vars.set('--type-display-tracking', typography?.typeScale?.display?.tracking);\n vars.set('--type-heading-size', typography?.typeScale?.heading?.size);\n vars.set('--type-heading-weight', typography?.typeScale?.heading?.weight);\n vars.set('--type-heading-leading', typography?.typeScale?.heading?.leading);\n vars.set('--type-heading-tracking', typography?.typeScale?.heading?.tracking);\n vars.set('--type-body-size', typography?.typeScale?.body?.size);\n vars.set('--type-body-weight', typography?.typeScale?.body?.weight);\n vars.set('--type-body-leading', typography?.typeScale?.body?.leading);\n vars.set('--type-body-tracking', typography?.typeScale?.body?.tracking);\n\n vars.set('--radius-sm', radii?.sm);\n vars.set('--radius-md', radii?.md);\n vars.set('--radius-lg', radii?.lg);\n\n /**\n * ELEVATION / DENSITY / MOTION / GRADIENT\n */\n vars.set('--shadow-sm', shadows?.sm);\n vars.set('--shadow-md', shadows?.md);\n vars.set('--shadow-lg', shadows?.lg);\n vars.set('--shadow-lift', shadows?.lift);\n\n vars.set('--space-gutter', spacing?.gutter);\n vars.set('--space-inset', spacing?.inset);\n\n vars.set('--motion-duration', motion?.duration);\n vars.set('--motion-easing', motion?.easing);\n\n vars.set('--gradient-brand', gradient?.brand);\n\n return vars.expose();\n};\n\nconst setTokens = (node: HTMLElement, vars: Record<string, string>) => {\n for (const [name, value] of Object.entries(vars)) {\n node.style.setProperty(name, value);\n }\n};\n\nconst removeTokens = (node: HTMLElement, vars: Record<string, string>) => {\n for (const name of Object.keys(vars)) {\n node.style.removeProperty(name);\n }\n};\n\nexport const useThemeTokens = (tokens: ThemeTokens) => {\n // Insertion effect: runs before the DOM mutates and before any (descendant)\n // layout effect measures token-dependent geometry. Write-only, so it fits the\n // hook's constraints. Only the brand's overrides are set; unset slots fall\n // through to the stylesheet's `:root` / `[data-theme='dark']` defaults.\n useInsertionEffect(() => {\n if (typeof document === 'undefined') return;\n const root = document.documentElement;\n const vars = tokensToCssVars(tokens);\n\n setTokens(root, vars);\n\n return () => removeTokens(root, vars);\n }, [tokens]);\n};\n","import { type ReactNode, useMemo } from 'react';\n\nimport type { Brand } from '@keboola/brand-registry';\n\nimport { TooltipProvider } from '../Tooltip';\n\nimport { AIGradientsSvg } from './AIGradientSvg';\nimport { ThemeContext, type ThemeContextValue } from './context';\nimport { DEFAULT_BRANDS, defaultBrand } from './defaults';\nimport { type UseBrandOptions, useBrandState } from './useBrandState';\nimport { type UseColorSchemeOptions, useColorSchemeState } from './useColorSchemeState';\nimport { brandThemeToTokens, useThemeTokens } from './useThemeTokens';\nimport { createTheme } from './utils';\n\ntype Props = UseColorSchemeOptions &\n UseBrandOptions & {\n /** Brands this provider knows about; the active brand id resolves against these. */\n brands?: readonly Brand[];\n children: ReactNode;\n };\n\nexport const ThemeProvider = ({\n defaultScheme,\n scheme,\n onSchemeChange,\n defaultBrandId,\n brandId,\n onBrandIdChange,\n brands = DEFAULT_BRANDS,\n children,\n}: Props) => {\n const colorSchemeState = useColorSchemeState({\n defaultScheme,\n scheme,\n onSchemeChange,\n });\n\n const brandState = useBrandState({\n defaultBrandId,\n brandId,\n onBrandIdChange,\n });\n\n // Resolve the active brand; an unknown id (incl. the default sentinel) falls\n // back to `defaultBrand`, whose empty theme injects nothing so the stylesheet\n // defaults apply.\n const brand = useMemo(\n () => brands.find((item) => item.id === brandState.brandId) ?? defaultBrand,\n [brands, brandState.brandId],\n );\n const themes = useMemo(() => brands.map(createTheme), [brands]);\n const currentTheme = useMemo(() => createTheme(brand), [brand]);\n\n // Only the brand's overrides for the resolved scheme are injected; every slot\n // it omits (including a missing dark palette) falls through to the stylesheet's\n // `:root` / `[data-theme='dark']` defaults — so dark mode works for any brand.\n const themeTokens = useMemo(\n () => brandThemeToTokens(brand.theme, colorSchemeState.resolvedScheme),\n [brand, colorSchemeState.resolvedScheme],\n );\n\n useThemeTokens(themeTokens);\n\n const { scheme: activeScheme, resolvedScheme, setScheme } = colorSchemeState;\n const { brandId: activeBrandId, setBrand } = brandState;\n const context = useMemo<ThemeContextValue>(\n () => ({\n scheme: activeScheme,\n resolvedScheme,\n setScheme,\n brandId: activeBrandId,\n setBrand,\n themes,\n currentTheme,\n }),\n [activeScheme, resolvedScheme, setScheme, activeBrandId, setBrand, themes, currentTheme],\n );\n\n return (\n <ThemeContext value={context}>\n <AIGradientsSvg />\n <TooltipProvider>{children}</TooltipProvider>\n </ThemeContext>\n );\n};\n"],"mappings":";;;;;;;AAAA,MAAa,uBACX,oBAAC,OAAD;CAAK,OAAM;CAAI,QAAO;CAAI,OAAO;EAAE,UAAU;EAAY,YAAY;CAAS;CAC5E,UAAA,qBAAC,QAAD,EAAA,UAAA,CAEE,qBAAC,kBAAD;EAAgB,IAAG;EAAiB,IAAG;EAAK,IAAG;EAAK,IAAG;EAAO,IAAG;EAAjE,UAAA;GACE,oBAAC,QAAD;IAAM,QAAO;IAAK,WAAU;GAAW,CAAA;GACvC,oBAAC,QAAD;IAAM,QAAO;IAAM,WAAU;GAAW,CAAA;GACxC,oBAAC,QAAD;IAAM,QAAO;IAAO,WAAU;GAAW,CAAA;EAC3B;CAGhB,CAAA,GAAA,qBAAC,kBAAD;EAAgB,IAAG;EAAiB,IAAG;EAAK,IAAG;EAAK,IAAG;EAAO,IAAG;EAAjE,UAAA,CACE,oBAAC,QAAD;GAAM,QAAO;GAAK,WAAU;EAAW,CAAA,GACvC,oBAAC,QAAD;GAAM,QAAO;GAAO,WAAU;EAAW,CAAA,CAC3B;CACZ,CAAA,CAAA,EAAA,CAAA;AACH,CAAA;;;ACUP,MAAa,sBACX,OACA,YACiB;CACjB,QAAQ,WAAW,SAAS,MAAM,aAAa,MAAM;CACrD,YAAY,MAAM;CAClB,OAAO,MAAM;CAEb,SAAS,MAAM;CACf,SAAS,MAAM;CACf,QAAQ,MAAM;CACd,UAAU,MAAM;AAClB;AAEA,MAAa,mBAAmB,EAC9B,QACA,YACA,OACA,SACA,SACA,QACA,eACyC;CACzC,MAAM,OAAO,cAAc;CAE3B,KAAK,IAAI,gBAAgB,QAAQ,UAAU;CAC3C,KAAK,IAAI,gBAAgB,QAAQ,UAAU;CAC3C,KAAK,IAAI,WAAW,QAAQ,KAAK;CACjC,KAAK,IAAI,sBAAsB,QAAQ,eAAe;CACtD,KAAK,IAAI,YAAY,QAAQ,MAAM;CACnC,KAAK,IAAI,WAAW,QAAQ,KAAK;CACjC,KAAK,IAAI,sBAAsB,QAAQ,eAAe;CACtD,KAAK,IAAI,UAAU,QAAQ,IAAI;CAC/B,KAAK,IAAI,iBAAiB,QAAQ,UAAU;CAC5C,KAAK,IAAI,aAAa,QAAQ,OAAO;CACrC,KAAK,IAAI,wBAAwB,QAAQ,iBAAiB;CAC1D,KAAK,IAAI,eAAe,QAAQ,SAAS;CACzC,KAAK,IAAI,0BAA0B,QAAQ,mBAAmB;CAC9D,KAAK,IAAI,YAAY,QAAQ,MAAM;CACnC,KAAK,IAAI,uBAAuB,QAAQ,gBAAgB;CACxD,KAAK,IAAI,UAAU,QAAQ,IAAI;CAC/B,KAAK,IAAI,qBAAqB,QAAQ,cAAc;CACpD,KAAK,IAAI,aAAa,QAAQ,OAAO;CACrC,KAAK,IAAI,wBAAwB,QAAQ,iBAAiB;CAC1D,KAAK,IAAI,iBAAiB,QAAQ,WAAW;CAC7C,KAAK,IAAI,4BAA4B,QAAQ,qBAAqB;CAClE,KAAK,IAAI,aAAa,QAAQ,OAAO;CACrC,KAAK,IAAI,wBAAwB,QAAQ,iBAAiB;CAC1D,KAAK,IAAI,aAAa,QAAQ,OAAO;CACrC,KAAK,IAAI,wBAAwB,QAAQ,iBAAiB;CAC1D,KAAK,IAAI,UAAU,QAAQ,IAAI;CAC/B,KAAK,IAAI,qBAAqB,QAAQ,cAAc;CAEpD,KAAK,IAAI,aAAa,QAAQ,OAAO,MAAM;CAC3C,KAAK,IAAI,aAAa,QAAQ,OAAO,MAAM;CAC3C,KAAK,IAAI,aAAa,QAAQ,OAAO,MAAM;CAC3C,KAAK,IAAI,aAAa,QAAQ,OAAO,MAAM;CAC3C,KAAK,IAAI,aAAa,QAAQ,OAAO,MAAM;CAE3C,KAAK,IAAI,aAAa,QAAQ,SAAS,OAAO;CAC9C,KAAK,IAAI,wBAAwB,QAAQ,SAAS,iBAAiB;CACnE,KAAK,IAAI,qBAAqB,QAAQ,SAAS,cAAc;CAC7D,KAAK,IAAI,gCAAgC,QAAQ,SAAS,wBAAwB;CAClF,KAAK,IAAI,oBAAoB,QAAQ,SAAS,aAAa;CAC3D,KAAK,IAAI,+BAA+B,QAAQ,SAAS,uBAAuB;CAChF,KAAK,IAAI,oBAAoB,QAAQ,SAAS,aAAa;CAC3D,KAAK,IAAI,kBAAkB,QAAQ,SAAS,WAAW;;;;CAKvD,KAAK,IAAI,eAAe,YAAY,YAAY,KAAK,KAAK,KAAA,CAAS;CACnE,KAAK,IAAI,kBAAkB,YAAY,aAAa,KAAK,KAAK,KAAA,CAAS;CACvE,KAAK,IAAI,eAAe,YAAY,UAAU,KAAK,KAAK,KAAA,CAAS;CAGjE,KAAK,IAAI,wBAAwB,YAAY,QAAQ,MAAM;CAC3D,KAAK,IAAI,wBAAwB,YAAY,QAAQ,MAAM;CAC3D,KAAK,IAAI,0BAA0B,YAAY,QAAQ,QAAQ;CAC/D,KAAK,IAAI,sBAAsB,YAAY,QAAQ,IAAI;CAGvD,KAAK,IAAI,2BAA2B,YAAY,eAAe,MAAM;CAGrE,KAAK,IAAI,uBAAuB,YAAY,WAAW,SAAS,IAAI;CACpE,KAAK,IAAI,yBAAyB,YAAY,WAAW,SAAS,MAAM;CACxE,KAAK,IAAI,0BAA0B,YAAY,WAAW,SAAS,OAAO;CAC1E,KAAK,IAAI,2BAA2B,YAAY,WAAW,SAAS,QAAQ;CAC5E,KAAK,IAAI,uBAAuB,YAAY,WAAW,SAAS,IAAI;CACpE,KAAK,IAAI,yBAAyB,YAAY,WAAW,SAAS,MAAM;CACxE,KAAK,IAAI,0BAA0B,YAAY,WAAW,SAAS,OAAO;CAC1E,KAAK,IAAI,2BAA2B,YAAY,WAAW,SAAS,QAAQ;CAC5E,KAAK,IAAI,oBAAoB,YAAY,WAAW,MAAM,IAAI;CAC9D,KAAK,IAAI,sBAAsB,YAAY,WAAW,MAAM,MAAM;CAClE,KAAK,IAAI,uBAAuB,YAAY,WAAW,MAAM,OAAO;CACpE,KAAK,IAAI,wBAAwB,YAAY,WAAW,MAAM,QAAQ;CAEtE,KAAK,IAAI,eAAe,OAAO,EAAE;CACjC,KAAK,IAAI,eAAe,OAAO,EAAE;CACjC,KAAK,IAAI,eAAe,OAAO,EAAE;;;;CAKjC,KAAK,IAAI,eAAe,SAAS,EAAE;CACnC,KAAK,IAAI,eAAe,SAAS,EAAE;CACnC,KAAK,IAAI,eAAe,SAAS,EAAE;CACnC,KAAK,IAAI,iBAAiB,SAAS,IAAI;CAEvC,KAAK,IAAI,kBAAkB,SAAS,MAAM;CAC1C,KAAK,IAAI,iBAAiB,SAAS,KAAK;CAExC,KAAK,IAAI,qBAAqB,QAAQ,QAAQ;CAC9C,KAAK,IAAI,mBAAmB,QAAQ,MAAM;CAE1C,KAAK,IAAI,oBAAoB,UAAU,KAAK;CAE5C,OAAO,KAAK,OAAO;AACrB;AAEA,MAAM,aAAa,MAAmB,SAAiC;CACrE,KAAK,MAAM,CAAC,MAAM,UAAU,OAAO,QAAQ,IAAI,GAC7C,KAAK,MAAM,YAAY,MAAM,KAAK;AAEtC;AAEA,MAAM,gBAAgB,MAAmB,SAAiC;CACxE,KAAK,MAAM,QAAQ,OAAO,KAAK,IAAI,GACjC,KAAK,MAAM,eAAe,IAAI;AAElC;AAEA,MAAa,kBAAkB,WAAwB;CAKrD,yBAAyB;EACvB,IAAI,OAAO,aAAa,aAAa;EACrC,MAAM,OAAO,SAAS;EACtB,MAAM,OAAO,gBAAgB,MAAM;EAEnC,UAAU,MAAM,IAAI;EAEpB,aAAa,aAAa,MAAM,IAAI;CACtC,GAAG,CAAC,MAAM,CAAC;AACb;;;ACxJA,MAAa,iBAAiB,EAC5B,eACA,QACA,gBACA,gBACA,SACA,iBACA,SAAS,gBACT,eACW;CACX,MAAM,mBAAmB,oBAAoB;EAC3C;EACA;EACA;CACF,CAAC;CAED,MAAM,aAAa,cAAc;EAC/B;EACA;EACA;CACF,CAAC;CAKD,MAAM,QAAQ,cACN,OAAO,MAAM,SAAS,KAAK,OAAO,WAAW,OAAO,KAAK,cAC/D,CAAC,QAAQ,WAAW,OAAO,CAC7B;CACA,MAAM,SAAS,cAAc,OAAO,IAAI,WAAW,GAAG,CAAC,MAAM,CAAC;CAC9D,MAAM,eAAe,cAAc,YAAY,KAAK,GAAG,CAAC,KAAK,CAAC;CAK9D,MAAM,cAAc,cACZ,mBAAmB,MAAM,OAAO,iBAAiB,cAAc,GACrE,CAAC,OAAO,iBAAiB,cAAc,CACzC;CAEA,eAAe,WAAW;CAE1B,MAAM,EAAE,QAAQ,cAAc,gBAAgB,cAAc;CAC5D,MAAM,EAAE,SAAS,eAAe,aAAa;CAC7C,MAAM,UAAU,eACP;EACL,QAAQ;EACR;EACA;EACA,SAAS;EACT;EACA;EACA;CACF,IACA;EAAC;EAAc;EAAgB;EAAW;EAAe;EAAU;EAAQ;CAAY,CACzF;CAEA,OACE,qBAAC,cAAD;EAAc,OAAO;EAArB,UAAA,CACE,oBAAC,gBAAD,CAAiB,CAAA,GACjB,oBAAC,iBAAD,EAAkB,SAA0B,CAAA,CAChC;;AAElB"}
|