@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,65 @@
|
|
|
1
|
+
import { cn } from "../../classNames-BzrkDnOD.js";
|
|
2
|
+
import { keyCodes } from "../../utils-D0c5VAyF.js";
|
|
3
|
+
import { ChevronDown, ChevronUp, Search } from "../../icons-Cek151jC.js";
|
|
4
|
+
import { Button } from "../../Button-nzmDNS2q.js";
|
|
5
|
+
import { ButtonGroup } from "../components/ButtonGroup.js";
|
|
6
|
+
import { Separator } from "../components/Separator.js";
|
|
7
|
+
import { TextInput } from "../../TextInput-BGed-V13.js";
|
|
8
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
9
|
+
//#region src/blocks/SearchInputWithNavigation/SearchInputWithNavigation.tsx
|
|
10
|
+
const SearchInputWithNavigation = ({ ref, value, onValueChange, placeholder = "Search...", variant = "secondary", onClear, focusVariant, currentIndex, totalResults, onNavigateNext, onNavigatePrevious, className }) => {
|
|
11
|
+
const withControls = totalResults > 0;
|
|
12
|
+
const handleKeyDown = (e) => {
|
|
13
|
+
if (e.key === keyCodes.ENTER) {
|
|
14
|
+
e.preventDefault();
|
|
15
|
+
e.shiftKey ? onNavigatePrevious() : onNavigateNext();
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
return /* @__PURE__ */ jsx(TextInput, {
|
|
19
|
+
ref,
|
|
20
|
+
allowClear: true,
|
|
21
|
+
value,
|
|
22
|
+
placeholder,
|
|
23
|
+
onValueChange,
|
|
24
|
+
onClear,
|
|
25
|
+
prefix: /* @__PURE__ */ jsx(Search, { className: "tw:size-4 tw:shrink-0 tw:text-neutral-400" }),
|
|
26
|
+
focusVariant,
|
|
27
|
+
onKeyDown: handleKeyDown,
|
|
28
|
+
variant,
|
|
29
|
+
className,
|
|
30
|
+
leftSuffix: /* @__PURE__ */ jsxs("div", {
|
|
31
|
+
className: cn("tw:flex tw:items-center tw:gap-3", { "tw:hidden": !withControls }),
|
|
32
|
+
children: [
|
|
33
|
+
/* @__PURE__ */ jsxs("span", {
|
|
34
|
+
className: "tw:text-xs tw:text-neutral-400",
|
|
35
|
+
children: [
|
|
36
|
+
totalResults > 0 ? currentIndex ?? 0 : 0,
|
|
37
|
+
"/",
|
|
38
|
+
totalResults
|
|
39
|
+
]
|
|
40
|
+
}),
|
|
41
|
+
/* @__PURE__ */ jsx(Separator, {
|
|
42
|
+
orientation: "vertical",
|
|
43
|
+
size: "3/4"
|
|
44
|
+
}),
|
|
45
|
+
/* @__PURE__ */ jsxs(ButtonGroup, { children: [/* @__PURE__ */ jsx(Button, {
|
|
46
|
+
variant: "inline",
|
|
47
|
+
size: "icon-3xs",
|
|
48
|
+
onClick: onNavigatePrevious,
|
|
49
|
+
disabled: !totalResults,
|
|
50
|
+
children: /* @__PURE__ */ jsx(ChevronUp, { className: "tw:size-4" })
|
|
51
|
+
}), /* @__PURE__ */ jsx(Button, {
|
|
52
|
+
variant: "inline",
|
|
53
|
+
size: "icon-3xs",
|
|
54
|
+
onClick: onNavigateNext,
|
|
55
|
+
disabled: !totalResults,
|
|
56
|
+
children: /* @__PURE__ */ jsx(ChevronDown, { className: "tw:size-4" })
|
|
57
|
+
})] })
|
|
58
|
+
]
|
|
59
|
+
})
|
|
60
|
+
});
|
|
61
|
+
};
|
|
62
|
+
//#endregion
|
|
63
|
+
export { SearchInputWithNavigation };
|
|
64
|
+
|
|
65
|
+
//# sourceMappingURL=SearchInputWithNavigation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SearchInputWithNavigation.js","names":[],"sources":["../../../src/blocks/SearchInputWithNavigation/SearchInputWithNavigation.tsx"],"sourcesContent":["import type { ComponentProps, KeyboardEvent, Ref } from 'react';\n\nimport { Button } from '../../components/Button';\nimport { ButtonGroup } from '../../components/ButtonGroup';\nimport { Separator } from '../../components/Separator';\nimport { keyCodes } from '../../constants/keyCodes';\nimport { ChevronDown, ChevronUp, Search } from '../../icons';\nimport { cn } from '../../utils';\nimport { TextInput } from '../TextInput';\n\ntype SearchInputWithNavigationProps = {\n currentIndex: number | null;\n totalResults: number;\n onValueChange: (value: string) => void;\n onNavigateNext: () => void;\n onNavigatePrevious: () => void;\n\n value?: string;\n placeholder?: string;\n variant?: 'primary' | 'secondary';\n onClear?: () => void;\n focusVariant?: ComponentProps<typeof TextInput>['focusVariant'];\n className?: string;\n};\n\nexport const SearchInputWithNavigation = ({\n ref,\n value,\n onValueChange,\n placeholder = 'Search...',\n variant = 'secondary',\n onClear,\n focusVariant,\n currentIndex,\n totalResults,\n onNavigateNext,\n onNavigatePrevious,\n className,\n}: SearchInputWithNavigationProps & { ref?: Ref<HTMLInputElement> }) => {\n const withControls = totalResults > 0;\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === keyCodes.ENTER) {\n e.preventDefault();\n\n e.shiftKey ? onNavigatePrevious() : onNavigateNext();\n }\n };\n\n return (\n <TextInput\n ref={ref}\n allowClear\n value={value}\n placeholder={placeholder}\n onValueChange={onValueChange}\n onClear={onClear}\n prefix={<Search className=\"tw:size-4 tw:shrink-0 tw:text-neutral-400\" />}\n focusVariant={focusVariant}\n onKeyDown={handleKeyDown}\n variant={variant}\n className={className}\n leftSuffix={\n <div\n className={cn('tw:flex tw:items-center tw:gap-3', {\n 'tw:hidden': !withControls,\n })}\n >\n <span className=\"tw:text-xs tw:text-neutral-400\">\n {totalResults > 0 ? (currentIndex ?? 0) : 0}/{totalResults}\n </span>\n <Separator orientation=\"vertical\" size=\"3/4\" />\n <ButtonGroup>\n <Button\n variant=\"inline\"\n size=\"icon-3xs\"\n onClick={onNavigatePrevious}\n disabled={!totalResults}\n >\n <ChevronUp className=\"tw:size-4\" />\n </Button>\n <Button\n variant=\"inline\"\n size=\"icon-3xs\"\n onClick={onNavigateNext}\n disabled={!totalResults}\n >\n <ChevronDown className=\"tw:size-4\" />\n </Button>\n </ButtonGroup>\n </div>\n }\n />\n );\n};\n"],"mappings":";;;;;;;;;AAyBA,MAAa,6BAA6B,EACxC,KACA,OACA,eACA,cAAc,aACd,UAAU,aACV,SACA,cACA,cACA,cACA,gBACA,oBACA,gBACsE;CACtE,MAAM,eAAe,eAAe;CAEpC,MAAM,iBAAiB,MAAqB;EAC1C,IAAI,EAAE,QAAQ,SAAS,OAAO;GAC5B,EAAE,eAAe;GAEjB,EAAE,WAAW,mBAAmB,IAAI,eAAe;EACrD;CACF;CAEA,OACE,oBAAC,WAAD;EACO;EACL,YAAA;EACO;EACM;EACE;EACN;EACT,QAAQ,oBAAC,QAAD,EAAQ,WAAU,4CAA6C,CAAA;EACzD;EACd,WAAW;EACF;EACE;EACX,YACE,qBAAC,OAAD;GACE,WAAW,GAAG,oCAAoC,EAChD,aAAa,CAAC,aAChB,CAAC;GAHH,UAAA;IAKE,qBAAC,QAAD;KAAM,WAAU;KAAhB,UAAA;MACG,eAAe,IAAK,gBAAgB,IAAK;MAAE;MAAE;KAC1C;;IACN,oBAAC,WAAD;KAAW,aAAY;KAAW,MAAK;IAAO,CAAA;IAC9C,qBAAC,aAAD,EAAA,UAAA,CACE,oBAAC,QAAD;KACE,SAAQ;KACR,MAAK;KACL,SAAS;KACT,UAAU,CAAC;KAEX,UAAA,oBAAC,WAAD,EAAW,WAAU,YAAa,CAAA;IAC5B,CAAA,GACR,oBAAC,QAAD;KACE,SAAQ;KACR,MAAK;KACL,SAAS;KACT,UAAU,CAAC;KAEX,UAAA,oBAAC,aAAD,EAAa,WAAU,YAAa,CAAA;IAC9B,CAAA,CACG,EAAA,CAAA;GACV;;CAER,CAAA;AAEL"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { ChevronDown } from "../../icons-Cek151jC.js";
|
|
2
|
+
import { Button } from "../../Button-nzmDNS2q.js";
|
|
3
|
+
import { ButtonGroup } from "../components/ButtonGroup.js";
|
|
4
|
+
import { DropdownMenu } from "../../DropdownMenu-B6ZbYvaM.js";
|
|
5
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
6
|
+
//#region src/blocks/SplitButton/SplitButton.tsx
|
|
7
|
+
const iconSizeMap = {
|
|
8
|
+
medium: "icon",
|
|
9
|
+
large: "icon-lg",
|
|
10
|
+
small: "icon-sm"
|
|
11
|
+
};
|
|
12
|
+
const SplitButtonBase = ({ ref, disabled, actions, variant, size = "medium", isActionsOpen, onActionsOpenChange, icon, children, ...rest }) => /* @__PURE__ */ jsxs(ButtonGroup, {
|
|
13
|
+
space: "compact",
|
|
14
|
+
children: [/* @__PURE__ */ jsxs(Button, {
|
|
15
|
+
...rest,
|
|
16
|
+
ref,
|
|
17
|
+
disabled,
|
|
18
|
+
variant,
|
|
19
|
+
size,
|
|
20
|
+
children: [!rest.isLoading && icon, children]
|
|
21
|
+
}), actions && /* @__PURE__ */ jsxs(DropdownMenu, {
|
|
22
|
+
open: isActionsOpen,
|
|
23
|
+
onOpenChange: onActionsOpenChange,
|
|
24
|
+
children: [/* @__PURE__ */ jsx(DropdownMenu.Trigger, {
|
|
25
|
+
asChild: true,
|
|
26
|
+
disabled,
|
|
27
|
+
children: /* @__PURE__ */ jsx(Button, {
|
|
28
|
+
size: iconSizeMap[size],
|
|
29
|
+
variant,
|
|
30
|
+
"aria-label": "Additional actions",
|
|
31
|
+
children: /* @__PURE__ */ jsx(ChevronDown, { className: "tw:size-5" })
|
|
32
|
+
})
|
|
33
|
+
}), /* @__PURE__ */ jsx(DropdownMenu.Content, {
|
|
34
|
+
align: "end",
|
|
35
|
+
children: actions
|
|
36
|
+
})]
|
|
37
|
+
})]
|
|
38
|
+
});
|
|
39
|
+
const SplitButton = Object.assign(SplitButtonBase, {
|
|
40
|
+
Action: DropdownMenu.Item,
|
|
41
|
+
Actions: DropdownMenu.Group
|
|
42
|
+
});
|
|
43
|
+
//#endregion
|
|
44
|
+
export { SplitButton };
|
|
45
|
+
|
|
46
|
+
//# sourceMappingURL=SplitButton.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SplitButton.js","names":[],"sources":["../../../src/blocks/SplitButton/SplitButton.tsx"],"sourcesContent":["import type { ComponentProps, ReactNode } from 'react';\n\nimport { Button } from '../../components/Button';\nimport { ButtonGroup } from '../../components/ButtonGroup';\nimport { DropdownMenu } from '../../components/DropdownMenu';\nimport { ChevronDown } from '../../icons';\n\ntype Variant = ComponentProps<typeof Button>['variant'];\ntype Size = NonNullable<ComponentProps<typeof Button>['size']>;\ntype SpitButtonSize = Exclude<\n Size,\n 'icon' | 'icon-lg' | 'icon-sm' | 'icon-xs' | 'icon-2xs' | 'icon-3xs'\n>;\n\ntype Props = {\n actions?: ReactNode;\n isActionsOpen?: boolean;\n onActionsOpenChange?: (open: boolean) => void;\n /** Optional leading-icon slot — pass a Lucide icon node. */\n icon?: ReactNode;\n // inline and invisible aren't supported in SplitButton\n variant?: Exclude<Variant, 'inline' | 'invisible'>;\n size?: SpitButtonSize;\n} & Omit<ComponentProps<typeof Button>, 'variant' | 'size' | 'icon'>;\n\nconst iconSizeMap: Record<SpitButtonSize, Size> = {\n medium: 'icon',\n large: 'icon-lg',\n small: 'icon-sm',\n};\n\nconst SplitButtonBase = ({\n ref,\n disabled,\n actions,\n variant,\n size = 'medium',\n isActionsOpen,\n onActionsOpenChange,\n icon,\n children,\n ...rest\n}: Props) => (\n <ButtonGroup space=\"compact\">\n <Button {...rest} ref={ref} disabled={disabled} variant={variant} size={size}>\n {/* Suppress the leading icon while Button renders its spinner so the two\n glyphs don't double-stack. */}\n {!rest.isLoading && icon}\n {children}\n </Button>\n\n {actions && (\n <DropdownMenu open={isActionsOpen} onOpenChange={onActionsOpenChange}>\n {/* The trigger button is disabled if the main button is disabled, disabled has to be on trigger to prevent dropdown opening*/}\n <DropdownMenu.Trigger asChild disabled={disabled}>\n <Button size={iconSizeMap[size]} variant={variant} aria-label=\"Additional actions\">\n <ChevronDown className=\"tw:size-5\" />\n </Button>\n </DropdownMenu.Trigger>\n <DropdownMenu.Content align=\"end\">{actions}</DropdownMenu.Content>\n </DropdownMenu>\n )}\n </ButtonGroup>\n);\n\nexport const SplitButton = Object.assign(SplitButtonBase, {\n Action: DropdownMenu.Item,\n Actions: DropdownMenu.Group,\n});\n"],"mappings":";;;;;;AAyBA,MAAM,cAA4C;CAChD,QAAQ;CACR,OAAO;CACP,OAAO;AACT;AAEA,MAAM,mBAAmB,EACvB,KACA,UACA,SACA,SACA,OAAO,UACP,eACA,qBACA,MACA,UACA,GAAG,WAEH,qBAAC,aAAD;CAAa,OAAM;CAAnB,UAAA,CACE,qBAAC,QAAD;EAAQ,GAAI;EAAW;EAAe;EAAmB;EAAe;EAAxE,UAAA,CAGG,CAAC,KAAK,aAAa,MACnB,QACK;CAEP,CAAA,GAAA,WACC,qBAAC,cAAD;EAAc,MAAM;EAAe,cAAc;EAAjD,UAAA,CAEE,oBAAC,aAAa,SAAd;GAAsB,SAAA;GAAkB;GACtC,UAAA,oBAAC,QAAD;IAAQ,MAAM,YAAY;IAAgB;IAAS,cAAW;IAC5D,UAAA,oBAAC,aAAD,EAAa,WAAU,YAAa,CAAA;GAC9B,CAAA;EACY,CAAA,GACtB,oBAAC,aAAa,SAAd;GAAsB,OAAM;GAAO,UAAA;EAA8B,CAAA,CACrD;CAEL,CAAA,CAAA;;AAGf,MAAa,cAAc,OAAO,OAAO,iBAAiB;CACxD,QAAQ,aAAa;CACrB,SAAS,aAAa;AACxB,CAAC"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { cn } from "../../classNames-BzrkDnOD.js";
|
|
2
|
+
import { Card } from "../../Card-BAoZ35CV.js";
|
|
3
|
+
import { cva } from "class-variance-authority";
|
|
4
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
5
|
+
//#region src/blocks/StatCard/StatCard.tsx
|
|
6
|
+
const trendClassnames = cva([
|
|
7
|
+
"tw:inline-flex",
|
|
8
|
+
"tw:items-center",
|
|
9
|
+
"tw:gap-1",
|
|
10
|
+
"tw:text-sm",
|
|
11
|
+
"tw:font-medium"
|
|
12
|
+
], {
|
|
13
|
+
variants: { direction: {
|
|
14
|
+
up: "tw:text-success",
|
|
15
|
+
down: "tw:text-destructive",
|
|
16
|
+
flat: "tw:text-muted-foreground"
|
|
17
|
+
} },
|
|
18
|
+
defaultVariants: { direction: "flat" }
|
|
19
|
+
});
|
|
20
|
+
/**
|
|
21
|
+
* A single KPI / metric tile — a signature composition over `Card` with a label,
|
|
22
|
+
* a large value, an optional trend delta, and an optional leading icon + footnote.
|
|
23
|
+
*
|
|
24
|
+
* **When to use:** the headline numbers of a dashboard (revenue, active users, uptime),
|
|
25
|
+
* usually in a `StatCardGrid` strip at the top of a page.
|
|
26
|
+
* **When NOT to use:** for a chart use `ChartPanel`; for a generic content surface use `Card`.
|
|
27
|
+
* **Composition:** `StatCard.Icon`, `StatCard.Label`, `StatCard.Value`, `StatCard.Trend`,
|
|
28
|
+
* `StatCard.Footnote`. All colours read semantic tokens, so the tile re-skins with the brand.
|
|
29
|
+
*/
|
|
30
|
+
const StatCardRoot = ({ className, children, bordered = true, ...rest }) => /* @__PURE__ */ jsx(Card, {
|
|
31
|
+
bordered,
|
|
32
|
+
className: cn("tw:gap-2", className),
|
|
33
|
+
role: "group",
|
|
34
|
+
...rest,
|
|
35
|
+
children
|
|
36
|
+
});
|
|
37
|
+
const StatCardIcon = ({ className, children, ...rest }) => /* @__PURE__ */ jsx("div", {
|
|
38
|
+
className: cn("tw:flex tw:size-9 tw:items-center tw:justify-center tw:rounded-md tw:bg-accent tw:text-accent-foreground", "tw:[&_svg:not([class*=\"tw:size-\"])]:size-5", className),
|
|
39
|
+
...rest,
|
|
40
|
+
children
|
|
41
|
+
});
|
|
42
|
+
const StatCardLabel = ({ className, children, ...rest }) => /* @__PURE__ */ jsx("p", {
|
|
43
|
+
className: cn("tw:m-0 tw:text-sm tw:font-medium tw:text-muted-foreground", className),
|
|
44
|
+
...rest,
|
|
45
|
+
children
|
|
46
|
+
});
|
|
47
|
+
const StatCardValue = ({ className, children, ...rest }) => /* @__PURE__ */ jsx("p", {
|
|
48
|
+
className: cn("tw:m-0 tw:text-3xl tw:font-semibold tw:leading-tight tw:tracking-tight tw:text-foreground", className),
|
|
49
|
+
...rest,
|
|
50
|
+
children
|
|
51
|
+
});
|
|
52
|
+
const StatCardTrend = ({ className, direction = "flat", icon, children, ...rest }) => /* @__PURE__ */ jsxs("span", {
|
|
53
|
+
className: trendClassnames({
|
|
54
|
+
direction,
|
|
55
|
+
className
|
|
56
|
+
}),
|
|
57
|
+
...rest,
|
|
58
|
+
children: [icon, children]
|
|
59
|
+
});
|
|
60
|
+
const StatCardFootnote = ({ className, children, ...rest }) => /* @__PURE__ */ jsx("p", {
|
|
61
|
+
className: cn("tw:m-0 tw:text-xs tw:text-muted-foreground", className),
|
|
62
|
+
...rest,
|
|
63
|
+
children
|
|
64
|
+
});
|
|
65
|
+
const StatCard = StatCardRoot;
|
|
66
|
+
StatCard.Icon = StatCardIcon;
|
|
67
|
+
StatCard.Label = StatCardLabel;
|
|
68
|
+
StatCard.Value = StatCardValue;
|
|
69
|
+
StatCard.Trend = StatCardTrend;
|
|
70
|
+
StatCard.Footnote = StatCardFootnote;
|
|
71
|
+
//#endregion
|
|
72
|
+
//#region src/blocks/StatCard/StatCardGrid.tsx
|
|
73
|
+
const gridClassnames = cva(["tw:grid", "tw:gap-4"], {
|
|
74
|
+
variants: { columns: {
|
|
75
|
+
2: "tw:grid-cols-1 tw:sm:grid-cols-2",
|
|
76
|
+
3: "tw:grid-cols-1 tw:sm:grid-cols-2 tw:lg:grid-cols-3",
|
|
77
|
+
4: "tw:grid-cols-1 tw:sm:grid-cols-2 tw:lg:grid-cols-4"
|
|
78
|
+
} },
|
|
79
|
+
defaultVariants: { columns: 4 }
|
|
80
|
+
});
|
|
81
|
+
/**
|
|
82
|
+
* Responsive strip of KPI tiles. Lay `StatCard`s inside it at the top of a dashboard.
|
|
83
|
+
* `columns` caps the tiles per row on large screens; the grid collapses to one column on
|
|
84
|
+
* mobile and two on small screens.
|
|
85
|
+
*/
|
|
86
|
+
const StatCardGrid = ({ className, columns = 4, children, ...rest }) => /* @__PURE__ */ jsx("div", {
|
|
87
|
+
className: gridClassnames({
|
|
88
|
+
columns,
|
|
89
|
+
className
|
|
90
|
+
}),
|
|
91
|
+
...rest,
|
|
92
|
+
children
|
|
93
|
+
});
|
|
94
|
+
//#endregion
|
|
95
|
+
export { StatCard, StatCardGrid };
|
|
96
|
+
|
|
97
|
+
//# sourceMappingURL=StatCard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StatCard.js","names":[],"sources":["../../../src/blocks/StatCard/StatCard.tsx","../../../src/blocks/StatCard/StatCardGrid.tsx"],"sourcesContent":["import type { ComponentProps, ReactNode } from 'react';\nimport type { VariantProps } from 'class-variance-authority';\nimport { cva } from 'class-variance-authority';\n\nimport { Card } from '../../components/Card';\nimport { cn } from '../../utils';\n\nconst trendClassnames = cva(\n ['tw:inline-flex', 'tw:items-center', 'tw:gap-1', 'tw:text-sm', 'tw:font-medium'],\n {\n variants: {\n direction: {\n up: 'tw:text-success',\n down: 'tw:text-destructive',\n flat: 'tw:text-muted-foreground',\n },\n },\n defaultVariants: {\n direction: 'flat',\n },\n },\n);\n\ntype TrendDirection = NonNullable<VariantProps<typeof trendClassnames>['direction']>;\n\ntype RootProps = ComponentProps<typeof Card>;\n\n/**\n * A single KPI / metric tile — a signature composition over `Card` with a label,\n * a large value, an optional trend delta, and an optional leading icon + footnote.\n *\n * **When to use:** the headline numbers of a dashboard (revenue, active users, uptime),\n * usually in a `StatCardGrid` strip at the top of a page.\n * **When NOT to use:** for a chart use `ChartPanel`; for a generic content surface use `Card`.\n * **Composition:** `StatCard.Icon`, `StatCard.Label`, `StatCard.Value`, `StatCard.Trend`,\n * `StatCard.Footnote`. All colours read semantic tokens, so the tile re-skins with the brand.\n */\nconst StatCardRoot = ({ className, children, bordered = true, ...rest }: RootProps) => (\n <Card bordered={bordered} className={cn('tw:gap-2', className)} role=\"group\" {...rest}>\n {children}\n </Card>\n);\n\ntype IconProps = ComponentProps<'div'>;\n\nconst StatCardIcon = ({ className, children, ...rest }: IconProps) => (\n <div\n className={cn(\n 'tw:flex tw:size-9 tw:items-center tw:justify-center tw:rounded-md tw:bg-accent tw:text-accent-foreground',\n 'tw:[&_svg:not([class*=\"tw:size-\"])]:size-5',\n className,\n )}\n {...rest}\n >\n {children}\n </div>\n);\n\ntype LabelProps = ComponentProps<'p'>;\n\nconst StatCardLabel = ({ className, children, ...rest }: LabelProps) => (\n <p\n className={cn('tw:m-0 tw:text-sm tw:font-medium tw:text-muted-foreground', className)}\n {...rest}\n >\n {children}\n </p>\n);\n\ntype ValueProps = ComponentProps<'p'>;\n\nconst StatCardValue = ({ className, children, ...rest }: ValueProps) => (\n <p\n className={cn(\n 'tw:m-0 tw:text-3xl tw:font-semibold tw:leading-tight tw:tracking-tight tw:text-foreground',\n className,\n )}\n {...rest}\n >\n {children}\n </p>\n);\n\ntype TrendProps = ComponentProps<'span'> & {\n /** Which way the metric moved — sets the semantic colour (`success` / `destructive` / muted). */\n direction?: TrendDirection;\n /** Optional leading icon (e.g. an arrow). */\n icon?: ReactNode;\n};\n\nconst StatCardTrend = ({ className, direction = 'flat', icon, children, ...rest }: TrendProps) => (\n <span className={trendClassnames({ direction, className })} {...rest}>\n {icon}\n {children}\n </span>\n);\n\ntype FootnoteProps = ComponentProps<'p'>;\n\nconst StatCardFootnote = ({ className, children, ...rest }: FootnoteProps) => (\n <p className={cn('tw:m-0 tw:text-xs tw:text-muted-foreground', className)} {...rest}>\n {children}\n </p>\n);\n\nexport const StatCard = StatCardRoot as typeof StatCardRoot & {\n Icon: typeof StatCardIcon;\n Label: typeof StatCardLabel;\n Value: typeof StatCardValue;\n Trend: typeof StatCardTrend;\n Footnote: typeof StatCardFootnote;\n};\n\nStatCard.Icon = StatCardIcon;\nStatCard.Label = StatCardLabel;\nStatCard.Value = StatCardValue;\nStatCard.Trend = StatCardTrend;\nStatCard.Footnote = StatCardFootnote;\n\nexport type {\n RootProps as StatCardProps,\n TrendProps as StatCardTrendProps,\n TrendDirection as StatCardTrendDirection,\n};\n","import type { ComponentProps } from 'react';\nimport type { VariantProps } from 'class-variance-authority';\nimport { cva } from 'class-variance-authority';\n\nconst gridClassnames = cva(['tw:grid', 'tw:gap-4'], {\n variants: {\n columns: {\n 2: 'tw:grid-cols-1 tw:sm:grid-cols-2',\n 3: 'tw:grid-cols-1 tw:sm:grid-cols-2 tw:lg:grid-cols-3',\n 4: 'tw:grid-cols-1 tw:sm:grid-cols-2 tw:lg:grid-cols-4',\n },\n },\n defaultVariants: {\n columns: 4,\n },\n});\n\ntype Props = ComponentProps<'div'> & VariantProps<typeof gridClassnames>;\n\n/**\n * Responsive strip of KPI tiles. Lay `StatCard`s inside it at the top of a dashboard.\n * `columns` caps the tiles per row on large screens; the grid collapses to one column on\n * mobile and two on small screens.\n */\nexport const StatCardGrid = ({ className, columns = 4, children, ...rest }: Props) => (\n <div className={gridClassnames({ columns, className })} {...rest}>\n {children}\n </div>\n);\n\nexport type { Props as StatCardGridProps };\n"],"mappings":";;;;;AAOA,MAAM,kBAAkB,IACtB;CAAC;CAAkB;CAAmB;CAAY;CAAc;AAAgB,GAChF;CACE,UAAU,EACR,WAAW;EACT,IAAI;EACJ,MAAM;EACN,MAAM;CACR,EACF;CACA,iBAAiB,EACf,WAAW,OACb;AACF,CACF;;;;;;;;;;;AAgBA,MAAM,gBAAgB,EAAE,WAAW,UAAU,WAAW,MAAM,GAAG,WAC/D,oBAAC,MAAD;CAAgB;CAAU,WAAW,GAAG,YAAY,SAAS;CAAG,MAAK;CAAQ,GAAI;CAC9E;AACG,CAAA;AAKR,MAAM,gBAAgB,EAAE,WAAW,UAAU,GAAG,WAC9C,oBAAC,OAAD;CACE,WAAW,GACT,4GACA,gDACA,SACF;CACA,GAAI;CAEH;AACE,CAAA;AAKP,MAAM,iBAAiB,EAAE,WAAW,UAAU,GAAG,WAC/C,oBAAC,KAAD;CACE,WAAW,GAAG,6DAA6D,SAAS;CACpF,GAAI;CAEH;AACA,CAAA;AAKL,MAAM,iBAAiB,EAAE,WAAW,UAAU,GAAG,WAC/C,oBAAC,KAAD;CACE,WAAW,GACT,6FACA,SACF;CACA,GAAI;CAEH;AACA,CAAA;AAUL,MAAM,iBAAiB,EAAE,WAAW,YAAY,QAAQ,MAAM,UAAU,GAAG,WACzE,qBAAC,QAAD;CAAM,WAAW,gBAAgB;EAAE;EAAW;CAAU,CAAC;CAAG,GAAI;CAAhE,UAAA,CACG,MACA,QACG;;AAKR,MAAM,oBAAoB,EAAE,WAAW,UAAU,GAAG,WAClD,oBAAC,KAAD;CAAG,WAAW,GAAG,8CAA8C,SAAS;CAAG,GAAI;CAC5E;AACA,CAAA;AAGL,MAAa,WAAW;AAQxB,SAAS,OAAO;AAChB,SAAS,QAAQ;AACjB,SAAS,QAAQ;AACjB,SAAS,QAAQ;AACjB,SAAS,WAAW;;;ACjHpB,MAAM,iBAAiB,IAAI,CAAC,WAAW,UAAU,GAAG;CAClD,UAAU,EACR,SAAS;EACP,GAAG;EACH,GAAG;EACH,GAAG;CACL,EACF;CACA,iBAAiB,EACf,SAAS,EACX;AACF,CAAC;;;;;;AASD,MAAa,gBAAgB,EAAE,WAAW,UAAU,GAAG,UAAU,GAAG,WAClE,oBAAC,OAAD;CAAK,WAAW,eAAe;EAAE;EAAS;CAAU,CAAC;CAAG,GAAI;CACzD;AACE,CAAA"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { InputGroup } from "../../InputGroup-BJWsI35s.js";
|
|
2
|
+
import { useControllableState } from "../../useControllableState-M6494mCT.js";
|
|
3
|
+
import { jsx } from "react/jsx-runtime";
|
|
4
|
+
//#region src/blocks/Textarea/Textarea.tsx
|
|
5
|
+
/**
|
|
6
|
+
* Multi-line text input. Chrome resolves from the active brand automatically: a modern brand always
|
|
7
|
+
* renders argo (any `variant` is ignored), while `variant` only tunes the legacy-brand chrome.
|
|
8
|
+
*/
|
|
9
|
+
const Textarea = ({ ref, containerClassName, state = "default", variant, sizing, focusVariant, value: valueProp, defaultValue, onValueChange, ...rest }) => {
|
|
10
|
+
const [value, setValue] = useControllableState({
|
|
11
|
+
prop: valueProp === void 0 ? void 0 : valueProp ?? "",
|
|
12
|
+
defaultProp: defaultValue ?? "",
|
|
13
|
+
onChange: onValueChange
|
|
14
|
+
});
|
|
15
|
+
return /* @__PURE__ */ jsx(InputGroup, {
|
|
16
|
+
state,
|
|
17
|
+
sizing,
|
|
18
|
+
focusVariant,
|
|
19
|
+
variant,
|
|
20
|
+
className: containerClassName,
|
|
21
|
+
children: /* @__PURE__ */ jsx(InputGroup.TextArea, {
|
|
22
|
+
...rest,
|
|
23
|
+
ref,
|
|
24
|
+
value,
|
|
25
|
+
onValueChange: setValue
|
|
26
|
+
})
|
|
27
|
+
});
|
|
28
|
+
};
|
|
29
|
+
//#endregion
|
|
30
|
+
export { Textarea };
|
|
31
|
+
|
|
32
|
+
//# sourceMappingURL=Textarea.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Textarea.js","names":[],"sources":["../../../src/blocks/Textarea/Textarea.tsx"],"sourcesContent":["import type { ComponentProps } from 'react';\n\nimport { InputGroup } from '../../components/InputGroup';\nimport { useControllableState } from '../../hooks/useControllableState';\n\ntype InputGroupProps = Pick<\n ComponentProps<typeof InputGroup>,\n 'variant' | 'sizing' | 'focusVariant' | 'state'\n>;\n\ntype TextareaNativeProps = Omit<\n ComponentProps<typeof InputGroup.TextArea>,\n 'value' | 'defaultValue' | 'rows' | 'maxRows'\n>;\n\ntype TextareaOwnProps = {\n value?: string | null;\n defaultValue?: string | null;\n onValueChange?: (value: string) => void;\n onValueBlur?: (value: string) => void;\n maxRows?: number | 'unlimited';\n disableResize?: boolean;\n containerClassName?: string;\n};\n\ntype Props = InputGroupProps & TextareaNativeProps & TextareaOwnProps;\n\n/**\n * Multi-line text input. Chrome resolves from the active brand automatically: a modern brand always\n * renders argo (any `variant` is ignored), while `variant` only tunes the legacy-brand chrome.\n */\nexport const Textarea = ({\n ref,\n containerClassName,\n\n // group props\n state = 'default',\n variant,\n sizing,\n focusVariant,\n\n // value handling\n value: valueProp,\n defaultValue,\n onValueChange,\n\n ...rest\n}: Props) => {\n const [value, setValue] = useControllableState<string>({\n // `undefined` stays uncontrolled; any provided value (incl. `null`) is controlled, coerced to ''.\n prop: valueProp === undefined ? undefined : (valueProp ?? ''),\n defaultProp: defaultValue ?? '',\n onChange: onValueChange,\n });\n\n return (\n <InputGroup\n state={state}\n sizing={sizing}\n focusVariant={focusVariant}\n variant={variant}\n className={containerClassName}\n >\n <InputGroup.TextArea {...rest} ref={ref} value={value} onValueChange={setValue} />\n </InputGroup>\n );\n};\n"],"mappings":";;;;;;;;AA+BA,MAAa,YAAY,EACvB,KACA,oBAGA,QAAQ,WACR,SACA,QACA,cAGA,OAAO,WACP,cACA,eAEA,GAAG,WACQ;CACX,MAAM,CAAC,OAAO,YAAY,qBAA6B;EAErD,MAAM,cAAc,KAAA,IAAY,KAAA,IAAa,aAAa;EAC1D,aAAa,gBAAgB;EAC7B,UAAU;CACZ,CAAC;CAED,OACE,oBAAC,YAAD;EACS;EACC;EACM;EACL;EACT,WAAW;EAEX,UAAA,oBAAC,WAAW,UAAZ;GAAqB,GAAI;GAAW;GAAY;GAAO,eAAe;EAAW,CAAA;CACvE,CAAA;AAEhB"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { createChangeInputEvent } from "../../utils-D0c5VAyF.js";
|
|
2
|
+
import { mergeRefs } from "../utils/mergeRefs.js";
|
|
3
|
+
import { Clock, X } from "../../icons-Cek151jC.js";
|
|
4
|
+
import { InputGroup } from "../../InputGroup-BJWsI35s.js";
|
|
5
|
+
import { useControllableState } from "../../useControllableState-M6494mCT.js";
|
|
6
|
+
import { TimePicker } from "../../TimePicker-B_NegL-7.js";
|
|
7
|
+
import { useRef, useState } from "react";
|
|
8
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
9
|
+
//#region src/blocks/TimeInput/TimeInput.tsx
|
|
10
|
+
const TimeInput = ({ ref, state, variant, focusVariant, sizing, className, value: valueProp, defaultValue, onValueChange, onValueBlur, onChange, onBlur, allowClear = false, disabled, readOnly, placeholder = "Select time", ...restInputProps }) => {
|
|
11
|
+
const inputRef = useRef(null);
|
|
12
|
+
const [isOpen, setIsOpen] = useState(false);
|
|
13
|
+
const [value, setValue] = useControllableState({
|
|
14
|
+
prop: valueProp,
|
|
15
|
+
defaultProp: defaultValue ?? null,
|
|
16
|
+
onChange: onValueChange
|
|
17
|
+
});
|
|
18
|
+
const canClear = allowClear && !!value && !disabled && !readOnly;
|
|
19
|
+
const showPicker = !disabled && !readOnly;
|
|
20
|
+
const handleChange = (event) => {
|
|
21
|
+
setValue(event.target.value || null);
|
|
22
|
+
onChange?.(event);
|
|
23
|
+
};
|
|
24
|
+
const handleBlur = (event) => {
|
|
25
|
+
onValueBlur?.(event.target.value || null);
|
|
26
|
+
onBlur?.(event);
|
|
27
|
+
};
|
|
28
|
+
const handleTimePickerSelect = (time) => {
|
|
29
|
+
setValue(time);
|
|
30
|
+
};
|
|
31
|
+
const handleClear = () => {
|
|
32
|
+
if (!inputRef.current) return;
|
|
33
|
+
inputRef.current.value = "";
|
|
34
|
+
setValue(null);
|
|
35
|
+
onChange?.(createChangeInputEvent(inputRef.current));
|
|
36
|
+
};
|
|
37
|
+
return /* @__PURE__ */ jsxs(InputGroup, {
|
|
38
|
+
state,
|
|
39
|
+
variant,
|
|
40
|
+
sizing,
|
|
41
|
+
focusVariant,
|
|
42
|
+
className,
|
|
43
|
+
children: [/* @__PURE__ */ jsx(InputGroup.Input, {
|
|
44
|
+
...restInputProps,
|
|
45
|
+
ref: mergeRefs(ref ?? null, inputRef),
|
|
46
|
+
type: "time",
|
|
47
|
+
className: "tw:[&::-webkit-calendar-picker-indicator]:hidden tw:[&::-webkit-datetime-edit-fields-wrapper]:py-0",
|
|
48
|
+
value: value ?? "",
|
|
49
|
+
placeholder,
|
|
50
|
+
onChange: handleChange,
|
|
51
|
+
onBlur: handleBlur,
|
|
52
|
+
disabled,
|
|
53
|
+
readOnly
|
|
54
|
+
}), (canClear || showPicker) && /* @__PURE__ */ jsxs(InputGroup.Addon, {
|
|
55
|
+
align: "inline-end",
|
|
56
|
+
children: [canClear && /* @__PURE__ */ jsx(InputGroup.Button, {
|
|
57
|
+
"aria-label": "Clear time",
|
|
58
|
+
onMouseDown: (event) => event.preventDefault(),
|
|
59
|
+
onClick: handleClear,
|
|
60
|
+
children: /* @__PURE__ */ jsx(X, { className: "tw:size-4" })
|
|
61
|
+
}), showPicker && /* @__PURE__ */ jsx(TimePicker, {
|
|
62
|
+
open: isOpen,
|
|
63
|
+
onOpenChange: setIsOpen,
|
|
64
|
+
onSelect: handleTimePickerSelect,
|
|
65
|
+
selected: value,
|
|
66
|
+
children: /* @__PURE__ */ jsx(InputGroup.Button, {
|
|
67
|
+
"aria-label": "Select time",
|
|
68
|
+
children: /* @__PURE__ */ jsx(Clock, { className: "tw:size-4" })
|
|
69
|
+
})
|
|
70
|
+
})]
|
|
71
|
+
})]
|
|
72
|
+
});
|
|
73
|
+
};
|
|
74
|
+
//#endregion
|
|
75
|
+
export { TimeInput };
|
|
76
|
+
|
|
77
|
+
//# sourceMappingURL=TimeInput.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TimeInput.js","names":[],"sources":["../../../src/blocks/TimeInput/TimeInput.tsx"],"sourcesContent":["import { useRef, useState } from 'react';\nimport type {\n ChangeEventHandler,\n ComponentProps,\n ComponentRef,\n FocusEventHandler,\n MouseEventHandler,\n} from 'react';\n\nimport { InputGroup } from '../../components/InputGroup';\nimport { TimePicker } from '../../components/TimePicker';\nimport { useControllableState } from '../../hooks/useControllableState';\nimport { Clock, X } from '../../icons';\nimport { createChangeInputEvent, mergeRefs } from '../../utils';\n\ntype InputGroupProps = Pick<\n ComponentProps<typeof InputGroup>,\n 'variant' | 'focusVariant' | 'state' | 'sizing'\n>;\n\ntype InputGroupInputProps = Omit<\n ComponentProps<typeof InputGroup.Input>,\n 'value' | 'defaultValue' | 'type'\n>;\n\ntype Props = InputGroupProps &\n InputGroupInputProps & {\n value?: string | null;\n defaultValue?: string | null;\n onValueChange?: (value: string | null) => void;\n onValueBlur?: (value: string | null) => void;\n allowClear?: boolean;\n };\n\nexport const TimeInput = ({\n ref,\n\n // group props\n state,\n variant,\n focusVariant,\n sizing,\n className,\n\n // own props\n value: valueProp,\n defaultValue,\n onValueChange,\n onValueBlur,\n onChange,\n onBlur,\n allowClear = false,\n\n // input props\n disabled,\n readOnly,\n placeholder = 'Select time',\n ...restInputProps\n}: Props) => {\n const inputRef = useRef<ComponentRef<'input'>>(null);\n\n const [isOpen, setIsOpen] = useState(false);\n\n const [value, setValue] = useControllableState<string | null>({\n prop: valueProp,\n defaultProp: defaultValue ?? null,\n onChange: onValueChange,\n });\n\n const canClear = allowClear && !!value && !disabled && !readOnly;\n const showPicker = !disabled && !readOnly;\n\n const handleChange: ChangeEventHandler<HTMLInputElement> = (event) => {\n setValue(event.target.value || null);\n onChange?.(event);\n };\n\n const handleBlur: FocusEventHandler<HTMLInputElement> = (event) => {\n // The value is already committed on change via `setValue`, so blur only needs to notify.\n onValueBlur?.(event.target.value || null);\n onBlur?.(event);\n };\n\n const handleTimePickerSelect = (time: string) => {\n setValue(time);\n };\n\n const handleClear: MouseEventHandler<HTMLButtonElement> = () => {\n if (!inputRef.current) return;\n inputRef.current.value = '';\n setValue(null);\n onChange?.(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 >\n <InputGroup.Input\n {...restInputProps}\n ref={mergeRefs(ref ?? null, inputRef)}\n type=\"time\"\n // hide native time picker indicator to avoid confusion with custom picker;\n // zero the UA `::-webkit-datetime-edit-fields-wrapper` padding (1px top/bottom) so\n // the field matches the InputGroup input height instead of rendering 2px taller\n className=\"tw:[&::-webkit-calendar-picker-indicator]:hidden tw:[&::-webkit-datetime-edit-fields-wrapper]:py-0\"\n value={value ?? ''}\n placeholder={placeholder}\n onChange={handleChange}\n onBlur={handleBlur}\n disabled={disabled}\n readOnly={readOnly}\n />\n\n {(canClear || showPicker) && (\n <InputGroup.Addon align=\"inline-end\">\n {canClear && (\n <InputGroup.Button\n aria-label=\"Clear time\"\n onMouseDown={(event) => event.preventDefault()}\n onClick={handleClear}\n >\n <X className=\"tw:size-4\" />\n </InputGroup.Button>\n )}\n {showPicker && (\n <TimePicker\n open={isOpen}\n onOpenChange={setIsOpen}\n onSelect={handleTimePickerSelect}\n selected={value}\n >\n <InputGroup.Button aria-label=\"Select time\">\n <Clock className=\"tw:size-4\" />\n </InputGroup.Button>\n </TimePicker>\n )}\n </InputGroup.Addon>\n )}\n </InputGroup>\n );\n};\n"],"mappings":";;;;;;;;;AAkCA,MAAa,aAAa,EACxB,KAGA,OACA,SACA,cACA,QACA,WAGA,OAAO,WACP,cACA,eACA,aACA,UACA,QACA,aAAa,OAGb,UACA,UACA,cAAc,eACd,GAAG,qBACQ;CACX,MAAM,WAAW,OAA8B,IAAI;CAEnD,MAAM,CAAC,QAAQ,aAAa,SAAS,KAAK;CAE1C,MAAM,CAAC,OAAO,YAAY,qBAAoC;EAC5D,MAAM;EACN,aAAa,gBAAgB;EAC7B,UAAU;CACZ,CAAC;CAED,MAAM,WAAW,cAAc,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC;CACxD,MAAM,aAAa,CAAC,YAAY,CAAC;CAEjC,MAAM,gBAAsD,UAAU;EACpE,SAAS,MAAM,OAAO,SAAS,IAAI;EACnC,WAAW,KAAK;CAClB;CAEA,MAAM,cAAmD,UAAU;EAEjE,cAAc,MAAM,OAAO,SAAS,IAAI;EACxC,SAAS,KAAK;CAChB;CAEA,MAAM,0BAA0B,SAAiB;EAC/C,SAAS,IAAI;CACf;CAEA,MAAM,oBAA0D;EAC9D,IAAI,CAAC,SAAS,SAAS;EACvB,SAAS,QAAQ,QAAQ;EACzB,SAAS,IAAI;EACb,WAAW,uBAAuB,SAAS,OAAO,CAAC;CACrD;CAEA,OACE,qBAAC,YAAD;EACS;EACE;EACD;EACM;EACH;EALb,UAAA,CAOE,oBAAC,WAAW,OAAZ;GACE,GAAI;GACJ,KAAK,UAAU,OAAO,MAAM,QAAQ;GACpC,MAAK;GAIL,WAAU;GACV,OAAO,SAAS;GACH;GACb,UAAU;GACV,QAAQ;GACE;GACA;EACX,CAAA,IAEC,YAAY,eACZ,qBAAC,WAAW,OAAZ;GAAkB,OAAM;GAAxB,UAAA,CACG,YACC,oBAAC,WAAW,QAAZ;IACE,cAAW;IACX,cAAc,UAAU,MAAM,eAAe;IAC7C,SAAS;IAET,UAAA,oBAAC,GAAD,EAAG,WAAU,YAAa,CAAA;GACT,CAAA,GAEpB,cACC,oBAAC,YAAD;IACE,MAAM;IACN,cAAc;IACd,UAAU;IACV,UAAU;IAEV,UAAA,oBAAC,WAAW,QAAZ;KAAmB,cAAW;KAC5B,UAAA,oBAAC,OAAD,EAAO,WAAU,YAAa,CAAA;IACb,CAAA;GACT,CAAA,CAEE;EAEV,CAAA,CAAA;;AAEhB"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { cn } from "../../classNames-BzrkDnOD.js";
|
|
2
|
+
import { useSHA256 } from "../../utils-D0c5VAyF.js";
|
|
3
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
4
|
+
import BoringAvatar from "boring-avatars";
|
|
5
|
+
//#region src/components/Avatar.tsx
|
|
6
|
+
const RANDOM_UUID = crypto.randomUUID();
|
|
7
|
+
const styles = {
|
|
8
|
+
wrapper: {
|
|
9
|
+
position: "relative",
|
|
10
|
+
display: "inline-flex",
|
|
11
|
+
verticalAlign: "middle"
|
|
12
|
+
},
|
|
13
|
+
gravatar: {
|
|
14
|
+
position: "absolute",
|
|
15
|
+
left: 0
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
const Avatar = ({ ref, user, fallback, size = 36, className, variant = "circle", ...props }) => {
|
|
19
|
+
const userName = user?.name || user?.email;
|
|
20
|
+
const email = user?.email;
|
|
21
|
+
const hash = useSHA256(email ? email.trim().toLowerCase() : fallback || "");
|
|
22
|
+
return /* @__PURE__ */ jsxs("span", {
|
|
23
|
+
...props,
|
|
24
|
+
ref,
|
|
25
|
+
style: styles.wrapper,
|
|
26
|
+
className: cn(variant === "circle" ? "tw:rounded-full" : "tw:rounded-md", "tw:overflow-hidden", "tw:focus-visible:outline-hidden", "tw:h-fit", "tw:shrink-0", "tw:border-solid", "tw:border", "tw:border-transparent", "tw:focus-visible:ring-4", "tw:focus-visible:ring-ring/30", "tw:focus-visible:border-ring", className),
|
|
27
|
+
children: [/* @__PURE__ */ jsx(BoringAvatar, {
|
|
28
|
+
name: userName || fallback || RANDOM_UUID,
|
|
29
|
+
variant: "beam",
|
|
30
|
+
colors: [
|
|
31
|
+
"#1F8FFF",
|
|
32
|
+
"#004787",
|
|
33
|
+
"#28D8FF",
|
|
34
|
+
"#925cff",
|
|
35
|
+
"#A8C2E6"
|
|
36
|
+
],
|
|
37
|
+
size,
|
|
38
|
+
square: variant === "rounded"
|
|
39
|
+
}), hash && /* @__PURE__ */ jsx("img", {
|
|
40
|
+
src: `https://secure.gravatar.com/avatar/${hash}?s=${size * 3}&d=blank`,
|
|
41
|
+
width: size,
|
|
42
|
+
height: size,
|
|
43
|
+
alt: userName || fallback || "User avatar",
|
|
44
|
+
referrerPolicy: "no-referrer",
|
|
45
|
+
loading: "lazy",
|
|
46
|
+
style: styles.gravatar
|
|
47
|
+
})]
|
|
48
|
+
});
|
|
49
|
+
};
|
|
50
|
+
//#endregion
|
|
51
|
+
export { Avatar };
|
|
52
|
+
|
|
53
|
+
//# sourceMappingURL=Avatar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Avatar.js","names":[],"sources":["../../../src/components/Avatar.tsx"],"sourcesContent":["import type { ComponentProps } from 'react';\nimport BoringAvatar from 'boring-avatars';\n\nimport { cn } from '../utils';\nimport { useSHA256 } from '../utils/useSHA256';\n\nconst RANDOM_UUID = crypto.randomUUID();\n\nconst styles = {\n wrapper: {\n position: 'relative',\n display: 'inline-flex',\n verticalAlign: 'middle',\n },\n gravatar: {\n position: 'absolute',\n left: 0,\n },\n} as const;\n\ntype Props = {\n user?: {\n name: string | undefined;\n email: string | undefined;\n };\n fallback?: string;\n className?: string;\n size?: number;\n variant?: 'circle' | 'rounded';\n} & ComponentProps<'span'>;\n\nexport const Avatar = ({\n ref,\n user,\n fallback,\n size = 36,\n className,\n variant = 'circle',\n ...props\n}: Props) => {\n const userName = user?.name || user?.email;\n const email = user?.email;\n const hash = useSHA256(email ? email.trim().toLowerCase() : fallback || '');\n\n return (\n <span\n {...props}\n ref={ref}\n style={styles.wrapper}\n className={cn(\n variant === 'circle' ? 'tw:rounded-full' : 'tw:rounded-md',\n 'tw:overflow-hidden',\n 'tw:focus-visible:outline-hidden',\n 'tw:h-fit',\n 'tw:shrink-0',\n\n 'tw:border-solid',\n 'tw:border',\n 'tw:border-transparent',\n\n 'tw:focus-visible:ring-4',\n 'tw:focus-visible:ring-ring/30',\n 'tw:focus-visible:border-ring',\n className,\n )}\n >\n <BoringAvatar\n name={userName || fallback || RANDOM_UUID}\n variant=\"beam\"\n colors={['#1F8FFF', '#004787', '#28D8FF', '#925cff', '#A8C2E6']}\n size={size}\n square={variant === 'rounded'}\n />\n {hash && (\n <img\n src={`https://secure.gravatar.com/avatar/${hash}?s=${size * 3}&d=blank`}\n width={size}\n height={size}\n alt={userName || fallback || 'User avatar'}\n referrerPolicy=\"no-referrer\"\n loading=\"lazy\"\n style={styles.gravatar}\n />\n )}\n </span>\n );\n};\n"],"mappings":";;;;;AAMA,MAAM,cAAc,OAAO,WAAW;AAEtC,MAAM,SAAS;CACb,SAAS;EACP,UAAU;EACV,SAAS;EACT,eAAe;CACjB;CACA,UAAU;EACR,UAAU;EACV,MAAM;CACR;AACF;AAaA,MAAa,UAAU,EACrB,KACA,MACA,UACA,OAAO,IACP,WACA,UAAU,UACV,GAAG,YACQ;CACX,MAAM,WAAW,MAAM,QAAQ,MAAM;CACrC,MAAM,QAAQ,MAAM;CACpB,MAAM,OAAO,UAAU,QAAQ,MAAM,KAAK,CAAC,CAAC,YAAY,IAAI,YAAY,EAAE;CAE1E,OACE,qBAAC,QAAD;EACE,GAAI;EACC;EACL,OAAO,OAAO;EACd,WAAW,GACT,YAAY,WAAW,oBAAoB,iBAC3C,sBACA,mCACA,YACA,eAEA,mBACA,aACA,yBAEA,2BACA,iCACA,gCACA,SACF;EAnBF,UAAA,CAqBE,oBAAC,cAAD;GACE,MAAM,YAAY,YAAY;GAC9B,SAAQ;GACR,QAAQ;IAAC;IAAW;IAAW;IAAW;IAAW;GAAS;GACxD;GACN,QAAQ,YAAY;EACrB,CAAA,GACA,QACC,oBAAC,OAAD;GACE,KAAK,sCAAsC,KAAK,KAAK,OAAO,EAAE;GAC9D,OAAO;GACP,QAAQ;GACR,KAAK,YAAY,YAAY;GAC7B,gBAAe;GACf,SAAQ;GACR,OAAO,OAAO;EACf,CAAA,CAEC;;AAEV"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { cn } from "../../classNames-BzrkDnOD.js";
|
|
2
|
+
import { cva } from "class-variance-authority";
|
|
3
|
+
import { jsx } from "react/jsx-runtime";
|
|
4
|
+
//#region src/components/ButtonGroup/ButtonGroup.tsx
|
|
5
|
+
const buttonGroupVariant = cva([
|
|
6
|
+
"tailwindcss-preflight",
|
|
7
|
+
"tw:inline-flex",
|
|
8
|
+
"tw:items-center",
|
|
9
|
+
"tw:group/button-group"
|
|
10
|
+
], {
|
|
11
|
+
defaultVariants: {
|
|
12
|
+
variant: "inline",
|
|
13
|
+
space: "small"
|
|
14
|
+
},
|
|
15
|
+
variants: {
|
|
16
|
+
variant: {
|
|
17
|
+
inline: [],
|
|
18
|
+
block: [
|
|
19
|
+
"tw:w-full",
|
|
20
|
+
"tw:flex-col",
|
|
21
|
+
"tw:sm:flex-row",
|
|
22
|
+
"tw:[&_a]:flex-1",
|
|
23
|
+
"tw:[&>button:not([data-icon-only=true])]:flex-1"
|
|
24
|
+
]
|
|
25
|
+
},
|
|
26
|
+
space: {
|
|
27
|
+
"extra-small": "tw:gap-1",
|
|
28
|
+
"little-small": "tw:gap-2",
|
|
29
|
+
small: "tw:gap-3",
|
|
30
|
+
medium: "tw:gap-4",
|
|
31
|
+
large: "tw:gap-6",
|
|
32
|
+
compact: [
|
|
33
|
+
"tw:border-collapse",
|
|
34
|
+
"tw:!gap-0",
|
|
35
|
+
"tw:[&>*:focus-visible]:!z-10",
|
|
36
|
+
"tw:[&>*:not(:first-child)]:rounded-l-none",
|
|
37
|
+
"tw:[&>*:not(:last-child)]:rounded-r-none",
|
|
38
|
+
"tw:[&>*:not(:last-child)]:border-r-0",
|
|
39
|
+
"tw:[&>*:not(:first-child)]:border-l-0",
|
|
40
|
+
"tw:[&>*:not(:first-child)]:before:content",
|
|
41
|
+
"tw:[&>*:not(:first-child)]:before:absolute",
|
|
42
|
+
"tw:[&>*:not(:first-child)]:before:left-0",
|
|
43
|
+
"tw:[&>*:not(:first-child)]:before:h-full",
|
|
44
|
+
"tw:[&>*:not(:first-child)]:before:w-px",
|
|
45
|
+
"tw:[&>*:not(:first-child)]:before:bg-black/10"
|
|
46
|
+
]
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
const ButtonGroup = ({ ref, children, space = "small", className, variant, ...rest }) => {
|
|
51
|
+
return /* @__PURE__ */ jsx("div", {
|
|
52
|
+
ref,
|
|
53
|
+
...rest,
|
|
54
|
+
role: "group",
|
|
55
|
+
"data-variant": variant,
|
|
56
|
+
className: cn(buttonGroupVariant({
|
|
57
|
+
variant,
|
|
58
|
+
space
|
|
59
|
+
}), className),
|
|
60
|
+
children
|
|
61
|
+
});
|
|
62
|
+
};
|
|
63
|
+
//#endregion
|
|
64
|
+
export { ButtonGroup };
|
|
65
|
+
|
|
66
|
+
//# sourceMappingURL=ButtonGroup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ButtonGroup.js","names":[],"sources":["../../../src/components/ButtonGroup/ButtonGroup.tsx"],"sourcesContent":["import type { ComponentProps, ReactNode } from 'react';\nimport type { VariantProps } from 'class-variance-authority';\nimport { cva } from 'class-variance-authority';\n\nimport { cn } from '../../utils';\n\nconst buttonGroupVariant = cva(\n ['tailwindcss-preflight', 'tw:inline-flex', 'tw:items-center', 'tw:group/button-group'],\n {\n defaultVariants: {\n variant: 'inline',\n space: 'small',\n },\n variants: {\n variant: {\n inline: [],\n block: [\n 'tw:w-full',\n 'tw:flex-col',\n 'tw:sm:flex-row',\n 'tw:[&_a]:flex-1',\n 'tw:[&>button:not([data-icon-only=true])]:flex-1',\n ],\n },\n space: {\n 'extra-small': 'tw:gap-1',\n 'little-small': 'tw:gap-2',\n small: 'tw:gap-3',\n medium: 'tw:gap-4',\n large: 'tw:gap-6',\n compact: [\n 'tw:border-collapse',\n 'tw:!gap-0',\n\n // ensure that focus visible outline is at the top\n 'tw:[&>*:focus-visible]:!z-10',\n\n 'tw:[&>*:not(:first-child)]:rounded-l-none',\n 'tw:[&>*:not(:last-child)]:rounded-r-none',\n 'tw:[&>*:not(:last-child)]:border-r-0',\n 'tw:[&>*:not(:first-child)]:border-l-0',\n\n // separator\n 'tw:[&>*:not(:first-child)]:before:content',\n 'tw:[&>*:not(:first-child)]:before:absolute',\n 'tw:[&>*:not(:first-child)]:before:left-0',\n 'tw:[&>*:not(:first-child)]:before:h-full',\n 'tw:[&>*:not(:first-child)]:before:w-px',\n 'tw:[&>*:not(:first-child)]:before:bg-black/10',\n ],\n },\n },\n },\n);\n\ntype Props = {\n children: ReactNode;\n className?: string;\n} & VariantProps<typeof buttonGroupVariant> &\n ComponentProps<'div'>;\n\nexport const ButtonGroup = ({\n ref,\n children,\n space = 'small',\n className,\n variant,\n ...rest\n}: Props) => {\n return (\n <div\n ref={ref}\n {...rest}\n role=\"group\"\n data-variant={variant}\n // cn (tailwind-merge), not cva's raw className append: a caller passing e.g.\n // `tw:hidden` must override the base `tw:inline-flex`. cva only concatenates, so both\n // land on the element and the winner is decided by CSS source order — which flipped in\n // v4 (`inline-flex` now sorts after `hidden`), leaving hover-reveal groups always visible.\n className={cn(buttonGroupVariant({ variant, space }), className)}\n >\n {children}\n </div>\n );\n};\n"],"mappings":";;;;AAMA,MAAM,qBAAqB,IACzB;CAAC;CAAyB;CAAkB;CAAmB;AAAuB,GACtF;CACE,iBAAiB;EACf,SAAS;EACT,OAAO;CACT;CACA,UAAU;EACR,SAAS;GACP,QAAQ,CAAC;GACT,OAAO;IACL;IACA;IACA;IACA;IACA;GACF;EACF;EACA,OAAO;GACL,eAAe;GACf,gBAAgB;GAChB,OAAO;GACP,QAAQ;GACR,OAAO;GACP,SAAS;IACP;IACA;IAGA;IAEA;IACA;IACA;IACA;IAGA;IACA;IACA;IACA;IACA;IACA;GACF;EACF;CACF;AACF,CACF;AAQA,MAAa,eAAe,EAC1B,KACA,UACA,QAAQ,SACR,WACA,SACA,GAAG,WACQ;CACX,OACE,oBAAC,OAAD;EACO;EACL,GAAI;EACJ,MAAK;EACL,gBAAc;EAKd,WAAW,GAAG,mBAAmB;GAAE;GAAS;EAAM,CAAC,GAAG,SAAS;EAE9D;CACE,CAAA;AAET"}
|