@crewlethq/ui 0.2.0 → 0.3.0
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/README.md +1714 -14
- package/dist/Accordion/Accordion.d.ts +54 -0
- package/dist/Accordion/index.d.ts +4 -0
- package/dist/Accordion/index.js +6 -0
- package/dist/Accordion-ZI2WLD5C.css +87 -0
- package/dist/AddPill/AddPill.d.ts +114 -0
- package/dist/AddPill/index.d.ts +3 -0
- package/dist/AddPill/index.js +3 -0
- package/dist/AddPill-DFWXYLIQ.css +434 -0
- package/dist/Announcer/Announcer.d.ts +15 -0
- package/dist/Announcer/index.d.ts +2 -0
- package/dist/Announcer/index.js +3 -0
- package/dist/AppShell/AppShell.d.ts +193 -0
- package/dist/AppShell/index.d.ts +3 -0
- package/dist/AppShell/index.js +6 -0
- package/dist/AppShell-NVE6LHNI.css +395 -0
- package/dist/Avatar/Avatar.d.ts +104 -0
- package/dist/Avatar/index.d.ts +3 -0
- package/dist/Avatar/index.js +2 -0
- package/dist/Avatar-P2KRQM2B.css +156 -0
- package/dist/BrandLockup/BrandLockup.d.ts +41 -0
- package/dist/BrandLockup/index.d.ts +3 -0
- package/dist/BrandLockup/index.js +2 -0
- package/dist/BrandLockup-6ISDEHPJ.css +108 -0
- package/dist/Button/Button.d.ts +88 -0
- package/dist/Button/index.d.ts +3 -0
- package/dist/Button/index.js +3 -0
- package/dist/Button-D4J6B4MA.css +302 -0
- package/dist/CalendarGrid/CalendarGrid.d.ts +87 -0
- package/dist/CalendarGrid/index.d.ts +3 -0
- package/dist/CalendarGrid/index.js +2 -0
- package/dist/CalendarGrid-V6TQ5QKS.css +128 -0
- package/dist/Callout/Callout.d.ts +47 -0
- package/dist/Callout/index.d.ts +3 -0
- package/dist/Callout/index.js +2 -0
- package/dist/Callout-S7QDWHDL.css +111 -0
- package/dist/Canvas/Canvas.d.ts +234 -0
- package/dist/Canvas/geometry.d.ts +249 -0
- package/dist/Canvas/index.d.ts +5 -0
- package/dist/Canvas/index.js +8 -0
- package/dist/Canvas/layerNode.d.ts +20 -0
- package/dist/Canvas-Q6JETCWR.css +315 -0
- package/dist/Card/Card.d.ts +142 -0
- package/dist/Card/headerSlot.d.ts +65 -0
- package/dist/Card/index.d.ts +5 -0
- package/dist/Card/index.js +6 -0
- package/dist/Card-AHX3Q2JD.css +428 -0
- package/dist/Charts/ActivityStrip.d.ts +45 -0
- package/dist/Charts/BarList.d.ts +51 -0
- package/dist/Charts/Legend.d.ts +32 -0
- package/dist/Charts/StackedBar.d.ts +38 -0
- package/dist/Charts/TimeSeries.d.ts +92 -0
- package/dist/Charts/dataColor.d.ts +20 -0
- package/dist/Charts/index.d.ts +12 -0
- package/dist/Charts/index.js +3 -0
- package/dist/Charts-D7G2BSXH.css +277 -0
- package/dist/Checkbox/Checkbox.d.ts +45 -0
- package/dist/Checkbox/index.d.ts +3 -0
- package/dist/Checkbox/index.js +2 -0
- package/dist/Checkbox-VGW26YLQ.css +111 -0
- package/dist/CodeBlock/CodeBlock.d.ts +60 -0
- package/dist/CodeBlock/index.d.ts +3 -0
- package/dist/CodeBlock/index.js +7 -0
- package/dist/CodeBlock-U2W6NNVC.css +153 -0
- package/dist/Combobox/Combobox.d.ts +89 -0
- package/dist/Combobox/index.d.ts +3 -0
- package/dist/Combobox/index.js +8 -0
- package/dist/Combobox-4FUVYIE7.css +80 -0
- package/dist/CommandPalette/CommandPalette.d.ts +77 -0
- package/dist/CommandPalette/index.d.ts +3 -0
- package/dist/CommandPalette/index.js +11 -0
- package/dist/CommandPalette-CSJDUCQA.css +115 -0
- package/dist/Container/Container.d.ts +17 -0
- package/dist/Container/index.d.ts +3 -0
- package/dist/Container/index.js +2 -0
- package/dist/Container-3TSKMGNI.css +52 -0
- package/dist/Copyable/CopyButton.d.ts +54 -0
- package/dist/Copyable/Copyable.d.ts +34 -0
- package/dist/Copyable/index.d.ts +5 -0
- package/dist/Copyable/index.js +6 -0
- package/dist/Copyable-5PNRFOLS.css +125 -0
- package/dist/Count/Count.d.ts +24 -0
- package/dist/Count/index.d.ts +3 -0
- package/dist/Count/index.js +3 -0
- package/dist/Count-ZVCJ6VPD.css +20 -0
- package/dist/DataTable/CopyableCell.d.ts +12 -0
- package/dist/DataTable/DataTable.d.ts +615 -0
- package/dist/DataTable/RowActionsMenu.d.ts +7 -0
- package/dist/DataTable/index.d.ts +7 -0
- package/dist/DataTable/index.js +14 -0
- package/dist/DataTable-ITNACQ2X.css +2020 -0
- package/dist/DataView/DataView.d.ts +109 -0
- package/dist/DataView/DataViewToolbar.d.ts +87 -0
- package/dist/DataView/FilterAxisBar.d.ts +103 -0
- package/dist/DataView/columns.d.ts +35 -0
- package/dist/DataView/filters.d.ts +184 -0
- package/dist/DataView/index.d.ts +11 -0
- package/dist/DataView/index.js +25 -0
- package/dist/DataView-256YF32J.css +441 -0
- package/dist/DateTimePicker/DateTimePicker.d.ts +91 -0
- package/dist/DateTimePicker/index.d.ts +3 -0
- package/dist/DateTimePicker/index.js +9 -0
- package/dist/DateTimePicker-22VNXRWC.css +199 -0
- package/dist/DescriptionList/DescriptionList.d.ts +36 -0
- package/dist/DescriptionList/index.d.ts +3 -0
- package/dist/DescriptionList/index.js +2 -0
- package/dist/DescriptionList-YYY3V3O6.css +59 -0
- package/dist/DiffList/DiffList.d.ts +47 -0
- package/dist/DiffList/index.d.ts +3 -0
- package/dist/DiffList/index.js +3 -0
- package/dist/DiffList-3EX64AAE.css +94 -0
- package/dist/Disclosure/Disclosure.d.ts +56 -0
- package/dist/Disclosure/anatomy.d.ts +43 -0
- package/dist/Disclosure/index.d.ts +5 -0
- package/dist/Disclosure/index.js +6 -0
- package/dist/Disclosure-VKBJJIZ7.css +176 -0
- package/dist/EmptyState/EmptyState.d.ts +39 -0
- package/dist/EmptyState/index.d.ts +3 -0
- package/dist/EmptyState/index.js +3 -0
- package/dist/EmptyState-C6HRBGT7.css +73 -0
- package/dist/EmptyValue/EmptyValue.d.ts +31 -0
- package/dist/EmptyValue/index.d.ts +3 -0
- package/dist/EmptyValue/index.js +3 -0
- package/dist/EmptyValue-4B6ODXHT.css +12 -0
- package/dist/EntityChip/EntityChip.d.ts +40 -0
- package/dist/EntityChip/index.d.ts +3 -0
- package/dist/EntityChip/index.js +3 -0
- package/dist/EntityChip-LUCPZBBG.css +64 -0
- package/dist/ErrorBoundary/ErrorBoundary.d.ts +58 -0
- package/dist/ErrorBoundary/index.d.ts +3 -0
- package/dist/ErrorBoundary/index.js +4 -0
- package/dist/ErrorBoundary-ME36CQTA.css +59 -0
- package/dist/Eyebrow/Eyebrow.d.ts +18 -0
- package/dist/Eyebrow/index.d.ts +3 -0
- package/dist/Eyebrow/index.js +2 -0
- package/dist/Eyebrow-5NREGHQH.css +46 -0
- package/dist/FilterChip/FilterChip.d.ts +68 -0
- package/dist/FilterChip/index.d.ts +3 -0
- package/dist/FilterChip/index.js +3 -0
- package/dist/FilterChip-GTGLLOXE.css +107 -0
- package/dist/Fullscreen/index.d.ts +2 -0
- package/dist/Fullscreen/index.js +1 -0
- package/dist/Fullscreen/useFullscreen.d.ts +32 -0
- package/dist/IconButton/IconButton.d.ts +45 -0
- package/dist/IconButton/index.d.ts +3 -0
- package/dist/IconButton/index.js +3 -0
- package/dist/IconButton-VQGNMJDI.css +158 -0
- package/dist/ImageUpload/ImageUpload.d.ts +37 -0
- package/dist/ImageUpload/index.d.ts +3 -0
- package/dist/ImageUpload/index.js +3 -0
- package/dist/ImageUpload-HKFIZR6D.css +193 -0
- package/dist/InlineCode/InlineCode.d.ts +37 -0
- package/dist/InlineCode/index.d.ts +3 -0
- package/dist/InlineCode/index.js +2 -0
- package/dist/InlineCode-6WSR5COL.css +65 -0
- package/dist/Input/FormField.d.ts +61 -0
- package/dist/Input/FormRow.d.ts +6 -0
- package/dist/Input/FormSection.d.ts +28 -0
- package/dist/Input/Input.d.ts +98 -0
- package/dist/Input/Label.d.ts +31 -0
- package/dist/Input/ReadOnlyField.d.ts +30 -0
- package/dist/Input/Textarea.d.ts +16 -0
- package/dist/Input/index.d.ts +15 -0
- package/dist/Input/index.js +5 -0
- package/dist/Input-2PU5CPKK.css +616 -0
- package/dist/Kbd/Kbd.d.ts +40 -0
- package/dist/Kbd/index.d.ts +3 -0
- package/dist/Kbd/index.js +3 -0
- package/dist/Kbd-W66MXQI5.css +61 -0
- package/dist/Layer/LayerHost.d.ts +23 -0
- package/dist/Layer/index.d.ts +7 -0
- package/dist/Layer/index.js +3 -0
- package/dist/Layer/place.d.ts +63 -0
- package/dist/Layer/stack.d.ts +159 -0
- package/dist/Layer-NAFSGCFA.css +23 -0
- package/dist/Layout/Layout.d.ts +104 -0
- package/dist/Layout/index.d.ts +3 -0
- package/dist/Layout/index.js +2 -0
- package/dist/Layout-2ZCV3IGF.css +171 -0
- package/dist/Link/Link.d.ts +45 -0
- package/dist/Link/index.d.ts +3 -0
- package/dist/Link/index.js +3 -0
- package/dist/Link-6BEFNMN2.css +80 -0
- package/dist/List/List.d.ts +73 -0
- package/dist/List/index.d.ts +3 -0
- package/dist/List/index.js +3 -0
- package/dist/List-XTHESXLR.css +161 -0
- package/dist/ListInput/ListInput.d.ts +68 -0
- package/dist/ListInput/index.d.ts +3 -0
- package/dist/ListInput/index.js +10 -0
- package/dist/ListInput-O7LJKOIG.css +147 -0
- package/dist/Listbox/index.d.ts +5 -0
- package/dist/Listbox/index.js +2 -0
- package/dist/Listbox/useListbox.d.ts +97 -0
- package/dist/Listbox/useOptionKeys.d.ts +64 -0
- package/dist/Listbox-X2DOTSQA.css +110 -0
- package/dist/Menu/Menu.d.ts +118 -0
- package/dist/Menu/index.d.ts +3 -0
- package/dist/Menu/index.js +7 -0
- package/dist/Menu-6DE7I66I.css +222 -0
- package/dist/Meter/Meter.d.ts +49 -0
- package/dist/Meter/index.d.ts +3 -0
- package/dist/Meter/index.js +3 -0
- package/dist/Meter-SKOOXQBC.css +87 -0
- package/dist/Modal/ConfirmModal.d.ts +74 -0
- package/dist/Modal/Modal.d.ts +154 -0
- package/dist/Modal/index.d.ts +5 -0
- package/dist/Modal/index.js +8 -0
- package/dist/Modal-XYQJ4BL6.css +484 -0
- package/dist/NewItemsNotice/NewItemsNotice.d.ts +28 -0
- package/dist/NewItemsNotice/index.d.ts +3 -0
- package/dist/NewItemsNotice/index.js +4 -0
- package/dist/NewItemsNotice-T4DSSPVV.css +60 -0
- package/dist/OrgLabel/OrgLabel.d.ts +117 -0
- package/dist/OrgLabel/index.d.ts +3 -0
- package/dist/OrgLabel/index.js +2 -0
- package/dist/OrgLabel-D7U6QJZD.css +293 -0
- package/dist/OrgNode/OrgNode.d.ts +103 -0
- package/dist/OrgNode/index.d.ts +3 -0
- package/dist/OrgNode/index.js +3 -0
- package/dist/OrgNode-BT7T2Q2X.css +214 -0
- package/dist/OrgTable/OrgTable.d.ts +113 -0
- package/dist/OrgTable/index.d.ts +3 -0
- package/dist/OrgTable/index.js +11 -0
- package/dist/OrgTable-VWMFC3TB.css +360 -0
- package/dist/PageHeader/PageHeader.d.ts +35 -0
- package/dist/PageHeader/index.d.ts +3 -0
- package/dist/PageHeader/index.js +3 -0
- package/dist/PageHeader-6EYWQXRE.css +88 -0
- package/dist/Popover/Popover.d.ts +91 -0
- package/dist/Popover/index.d.ts +3 -0
- package/dist/Popover/index.js +4 -0
- package/dist/Popover-WJGCF3ZQ.css +185 -0
- package/dist/PricingCard/PricingCard.d.ts +56 -0
- package/dist/PricingCard/index.d.ts +3 -0
- package/dist/PricingCard/index.js +4 -0
- package/dist/PricingCard-JFI7RYXP.css +278 -0
- package/dist/Prose/Prose.d.ts +33 -0
- package/dist/Prose/index.d.ts +3 -0
- package/dist/Prose/index.js +2 -0
- package/dist/Prose-BTXNFT2Q.css +99 -0
- package/dist/RelativeTime/RelativeTime.d.ts +31 -0
- package/dist/RelativeTime/clock.d.ts +9 -0
- package/dist/RelativeTime/format.d.ts +38 -0
- package/dist/RelativeTime/index.d.ts +6 -0
- package/dist/RelativeTime/index.js +4 -0
- package/dist/RelativeTime-EBAQPGO2.css +10 -0
- package/dist/SearchTrigger/SearchTrigger.d.ts +29 -0
- package/dist/SearchTrigger/index.d.ts +3 -0
- package/dist/SearchTrigger/index.js +2 -0
- package/dist/SearchTrigger-QXOYAUUY.css +79 -0
- package/dist/Section/Section.d.ts +41 -0
- package/dist/Section/index.d.ts +3 -0
- package/dist/Section/index.js +3 -0
- package/dist/Section-QRUPRIQ2.css +127 -0
- package/dist/SegmentedControl/SegmentedControl.d.ts +68 -0
- package/dist/SegmentedControl/index.d.ts +4 -0
- package/dist/SegmentedControl/index.js +5 -0
- package/dist/SegmentedControl-X3BI3XU4.css +68 -0
- package/dist/Select/Select.d.ts +138 -0
- package/dist/Select/index.d.ts +3 -0
- package/dist/Select/index.js +5 -0
- package/dist/Select-2X77FSWR.css +350 -0
- package/dist/Shortcut/index.d.ts +2 -0
- package/dist/Shortcut/index.js +4 -0
- package/dist/Shortcut/useShortcut.d.ts +68 -0
- package/dist/SidebarNav/SidebarNav.d.ts +117 -0
- package/dist/SidebarNav/index.d.ts +3 -0
- package/dist/SidebarNav/index.js +3 -0
- package/dist/SidebarNav-QGSFKZYA.css +319 -0
- package/dist/Skeleton/Skeleton.d.ts +50 -0
- package/dist/Skeleton/index.d.ts +3 -0
- package/dist/Skeleton/index.js +3 -0
- package/dist/Skeleton-V735HRGM.css +421 -0
- package/dist/StatCard/StatCard.d.ts +56 -0
- package/dist/StatCard/index.d.ts +3 -0
- package/dist/StatCard/index.js +3 -0
- package/dist/StatCard-KYPKZUWX.css +111 -0
- package/dist/StatGroup/StatGroup.d.ts +20 -0
- package/dist/StatGroup/index.d.ts +3 -0
- package/dist/StatGroup/index.js +2 -0
- package/dist/StatGroup-TGB6AEKM.css +80 -0
- package/dist/StatusDot/StatusDot.d.ts +25 -0
- package/dist/StatusDot/index.d.ts +3 -0
- package/dist/StatusDot/index.js +2 -0
- package/dist/StatusDot-HA2L2FSX.css +84 -0
- package/dist/Switch/Switch.d.ts +38 -0
- package/dist/Switch/index.d.ts +3 -0
- package/dist/Switch/index.js +2 -0
- package/dist/Switch-U4OWK4CL.css +169 -0
- package/dist/Table/Table.d.ts +51 -0
- package/dist/Table/index.d.ts +3 -0
- package/dist/Table/index.js +3 -0
- package/dist/Table-MDOLVUAW.css +159 -0
- package/dist/Tabs/Tabs.d.ts +97 -0
- package/dist/Tabs/index.d.ts +3 -0
- package/dist/Tabs/index.js +4 -0
- package/dist/Tabs/roving.d.ts +36 -0
- package/dist/Tabs-VLICJFVB.css +275 -0
- package/dist/Tag/Tag.d.ts +107 -0
- package/dist/Tag/index.d.ts +3 -0
- package/dist/Tag/index.js +3 -0
- package/dist/Tag-VNZEYLB6.css +406 -0
- package/dist/TagGroup/TagGroup.d.ts +41 -0
- package/dist/TagGroup/index.d.ts +3 -0
- package/dist/TagGroup/index.js +4 -0
- package/dist/TagGroup-APC2EFH4.css +75 -0
- package/dist/TagsInput/TagsInput.d.ts +112 -0
- package/dist/TagsInput/index.d.ts +3 -0
- package/dist/TagsInput/index.js +10 -0
- package/dist/TagsInput-W4P36PRJ.css +168 -0
- package/dist/Text/Text.d.ts +67 -0
- package/dist/Text/index.d.ts +3 -0
- package/dist/Text/index.js +2 -0
- package/dist/Text-XIPYYZX2.css +154 -0
- package/dist/ThemeSwitcher/ThemeSwitcher.d.ts +47 -0
- package/dist/ThemeSwitcher/index.d.ts +4 -0
- package/dist/ThemeSwitcher/index.js +6 -0
- package/dist/ThemeSwitcher/preferences.d.ts +51 -0
- package/dist/TimeWindowPicker/TimeWindowPicker.d.ts +231 -0
- package/dist/TimeWindowPicker/index.d.ts +3 -0
- package/dist/TimeWindowPicker/index.js +13 -0
- package/dist/TimeWindowPicker/mask.d.ts +82 -0
- package/dist/TimeWindowPicker-7I7KWCMU.css +403 -0
- package/dist/Timeline/Timeline.d.ts +51 -0
- package/dist/Timeline/index.d.ts +3 -0
- package/dist/Timeline/index.js +3 -0
- package/dist/Timeline-27SYKOFX.css +144 -0
- package/dist/Toaster/Toaster.d.ts +108 -0
- package/dist/Toaster/index.d.ts +3 -0
- package/dist/Toaster/index.js +5 -0
- package/dist/Toaster-NVDCEIP5.css +306 -0
- package/dist/Toolbar/Toolbar.d.ts +62 -0
- package/dist/Toolbar/index.d.ts +3 -0
- package/dist/Toolbar/index.js +4 -0
- package/dist/Toolbar-IP6LXN45.css +48 -0
- package/dist/Tooltip/Tooltip.d.ts +51 -0
- package/dist/Tooltip/index.d.ts +3 -0
- package/dist/Tooltip/index.js +4 -0
- package/dist/Tooltip-LKQF7CE4.css +71 -0
- package/dist/Tree/index.d.ts +8 -0
- package/dist/Tree/index.js +1 -0
- package/dist/Tree/layout.d.ts +160 -0
- package/dist/Tree/model.d.ts +110 -0
- package/dist/Tree/useMeasuredSizes.d.ts +61 -0
- package/dist/Tree/useTreeState.d.ts +89 -0
- package/dist/TreeCanvas/TreeCanvas.d.ts +384 -0
- package/dist/TreeCanvas/index.d.ts +3 -0
- package/dist/TreeCanvas/index.js +10 -0
- package/dist/TreeCanvas/motion.d.ts +59 -0
- package/dist/TreeCanvas-WBNQPHC7.css +1098 -0
- package/dist/TreeGrid/TreeGrid.d.ts +142 -0
- package/dist/TreeGrid/index.d.ts +3 -0
- package/dist/TreeGrid/index.js +8 -0
- package/dist/TreeGrid-NSW7VMOX.css +132 -0
- package/dist/VisuallyHidden/VisuallyHidden.d.ts +23 -0
- package/dist/VisuallyHidden/index.d.ts +3 -0
- package/dist/VisuallyHidden/index.js +2 -0
- package/dist/VisuallyHidden-L552H7OA.css +21 -0
- package/dist/chunk-22O7LAW2.js +41 -0
- package/dist/chunk-23DHIMJA.js +38 -0
- package/dist/chunk-2EOKFKHX.js +263 -0
- package/dist/chunk-2PRH365R.js +74 -0
- package/dist/chunk-2ZQMA2WB.js +57 -0
- package/dist/chunk-3CZ7XAVY.js +139 -0
- package/dist/chunk-3EYF6HKB.js +135 -0
- package/dist/chunk-3ZP55QZE.js +40 -0
- package/dist/chunk-53DVJCVW.js +14 -0
- package/dist/chunk-5C5YMZQU.js +51 -0
- package/dist/chunk-5EKIWVOR.js +132 -0
- package/dist/chunk-5IMACPJS.js +495 -0
- package/dist/chunk-5KPQ6D7N.js +54 -0
- package/dist/chunk-5SDBMKUO.js +297 -0
- package/dist/chunk-5WS6L6FA.js +114 -0
- package/dist/chunk-7EM5T4ME.js +39 -0
- package/dist/chunk-7FZ53WDJ.js +163 -0
- package/dist/chunk-7HPRF5XN.js +525 -0
- package/dist/chunk-7RPGY3JE.js +43 -0
- package/dist/chunk-A2UXBCLO.js +48 -0
- package/dist/chunk-ARMRX2YV.js +96 -0
- package/dist/chunk-AV2DXAEL.js +27 -0
- package/dist/chunk-BHHIIK3M.js +17 -0
- package/dist/chunk-BZFWDIV6.js +9 -0
- package/dist/chunk-BZYDZBAN.js +123 -0
- package/dist/chunk-CMEE37QJ.js +628 -0
- package/dist/chunk-D3OADIM6.js +112 -0
- package/dist/chunk-DD5BBGBE.js +162 -0
- package/dist/chunk-EHMQQHYR.js +1652 -0
- package/dist/chunk-EN6K2IFA.js +256 -0
- package/dist/chunk-EPOOQZYA.js +118 -0
- package/dist/chunk-ESCO4XYW.js +144 -0
- package/dist/chunk-EUCC37WY.js +14 -0
- package/dist/chunk-EV6IMYJ6.js +62 -0
- package/dist/chunk-F27EPQ7D.js +68 -0
- package/dist/chunk-F4PJZ4ED.js +245 -0
- package/dist/chunk-F6OE5FH3.js +49 -0
- package/dist/chunk-FBZAKNSX.js +263 -0
- package/dist/chunk-FEFTGVMF.js +46 -0
- package/dist/chunk-G2QFRTJ2.js +823 -0
- package/dist/chunk-GHYY2WPF.js +907 -0
- package/dist/chunk-GTOUGQQK.js +147 -0
- package/dist/chunk-GUIF6Q6N.js +143 -0
- package/dist/chunk-GXQ3B46I.js +216 -0
- package/dist/chunk-H4FBTAYS.js +130 -0
- package/dist/chunk-HOXGBLEY.js +37 -0
- package/dist/chunk-HQNHV7D6.js +54 -0
- package/dist/chunk-HTDFCRJZ.js +92 -0
- package/dist/chunk-HZ5XZNPS.js +98 -0
- package/dist/chunk-IAJLHVUA.js +28 -0
- package/dist/chunk-IJ7QXNIJ.js +1 -0
- package/dist/chunk-ITHXJHBB.js +280 -0
- package/dist/chunk-JCSA3XVH.js +32 -0
- package/dist/chunk-KLJCCMF3.js +97 -0
- package/dist/chunk-LGCPQIOZ.js +49 -0
- package/dist/chunk-LWKJQTOM.js +77 -0
- package/dist/chunk-MNAXYY3R.js +215 -0
- package/dist/chunk-NN62JQLR.js +29 -0
- package/dist/chunk-NPZY6YYL.js +251 -0
- package/dist/chunk-NTRZGNEX.js +529 -0
- package/dist/chunk-O6232G37.js +273 -0
- package/dist/chunk-O67VF5MS.js +58 -0
- package/dist/chunk-ODEQTPFM.js +6 -0
- package/dist/chunk-PNFASD6F.js +98 -0
- package/dist/chunk-PQADV6P6.js +19 -0
- package/dist/chunk-PZSWF74H.js +15 -0
- package/dist/chunk-Q4ZPPART.js +26 -0
- package/dist/chunk-QNCVHRZL.js +17 -0
- package/dist/chunk-QVE4GJAT.js +15 -0
- package/dist/chunk-QYOFACSP.js +36 -0
- package/dist/chunk-RA2ULG6H.js +29 -0
- package/dist/chunk-RDGD7Z7I.js +350 -0
- package/dist/chunk-RK4XPHVG.js +16 -0
- package/dist/chunk-RSAQOKH3.js +38 -0
- package/dist/chunk-S2XHHEW4.js +84 -0
- package/dist/chunk-S4GZWSKR.js +137 -0
- package/dist/chunk-SFZOKW2G.js +52 -0
- package/dist/chunk-T7FKOJKW.js +221 -0
- package/dist/chunk-UG46QBLT.js +325 -0
- package/dist/chunk-UOGSZKLT.js +134 -0
- package/dist/chunk-V2XMNLMS.js +52 -0
- package/dist/chunk-V663QU4R.js +51 -0
- package/dist/chunk-W4ENKCXJ.js +40 -0
- package/dist/chunk-W5J7R5EB.js +107 -0
- package/dist/chunk-WNI2WSJF.js +27 -0
- package/dist/chunk-XDTYBF2F.js +36 -0
- package/dist/chunk-XN4JBAN3.js +32 -0
- package/dist/chunk-XV6WRMBC.js +211 -0
- package/dist/chunk-YLYOWZ4V.js +33 -0
- package/dist/chunk-YMWONFSI.js +170 -0
- package/dist/chunk-ZCR6YGQ4.js +1 -0
- package/dist/generated/index.d.ts +83 -0
- package/dist/generated/index.js +91 -0
- package/dist/index.d.ts +1 -1217
- package/dist/index.js +91 -4518
- package/dist/styles.css +14841 -4274
- package/dist/utils/cx.d.ts +10 -0
- package/dist/utils/headingLevel.d.ts +16 -0
- package/dist/utils/index.d.ts +6 -0
- package/dist/utils/index.js +4 -0
- package/dist/utils/tone.d.ts +25 -0
- package/dist/utils/useClipboard.d.ts +30 -0
- package/package.json +18 -10
- package/scripts/bundle-css.mjs +25 -0
- package/scripts/check-css-literals.mjs +166 -0
- package/scripts/check-css-variables.mjs +184 -0
- package/scripts/check-css.mjs +27 -0
- package/scripts/css-source.mjs +67 -0
- package/scripts/write-barrel.mjs +60 -0
- package/dist/Accordion-NIMJQIOI.css +0 -88
- package/dist/AppShell-ZW3NSFBP.css +0 -51
- package/dist/Avatar-V6NG6Q45.css +0 -67
- package/dist/Button-XGCTXXYP.css +0 -174
- package/dist/Callout-LEGDIMAM.css +0 -52
- package/dist/Card-BOZGBML7.css +0 -86
- package/dist/Checkbox-OCUICIIZ.css +0 -58
- package/dist/CodeBlock-IEMBNIQC.css +0 -90
- package/dist/Container-LTKBA2FW.css +0 -21
- package/dist/Copyable-IB57OTHZ.css +0 -123
- package/dist/DataTable-3GALZUW2.css +0 -1593
- package/dist/DateTimePicker-NMSSGVPK.css +0 -312
- package/dist/Eyebrow-AVBORAS2.css +0 -30
- package/dist/IconButton-GB4PJDG2.css +0 -82
- package/dist/ImageUpload-3HQDF2KC.css +0 -158
- package/dist/Input-ZHUTN7CU.css +0 -210
- package/dist/Kbd-Q77CDZY7.css +0 -23
- package/dist/Modal-FJVG66S4.css +0 -138
- package/dist/Popover-FUFULUE2.css +0 -123
- package/dist/PricingCard-NKYV3JHA.css +0 -238
- package/dist/Section-665ZIPG6.css +0 -20
- package/dist/Select-GPRF7PRB.css +0 -294
- package/dist/Skeleton-3WEFLRDN.css +0 -378
- package/dist/StatCard-RTJIVTRB.css +0 -50
- package/dist/Table-AR3TRY2E.css +0 -89
- package/dist/Tabs-XZ4JIH3E.css +0 -153
- package/dist/Tag-R5QDJLYJ.css +0 -163
- package/dist/TimeWindowPicker-L3G5Q7UT.css +0 -629
- package/dist/Toaster-2O65VOR4.css +0 -264
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { TimeHTMLAttributes } from 'react';
|
|
2
|
+
import { type TimeValue } from './format.js';
|
|
3
|
+
export type RelativeTimeMode =
|
|
4
|
+
/** "4m ago", "in 30m", "just now", "due". When something happened. */
|
|
5
|
+
'relative'
|
|
6
|
+
/** "4m 20s". How long something has been going. */
|
|
7
|
+
| 'elapsed';
|
|
8
|
+
export interface RelativeTimeProps extends Omit<TimeHTMLAttributes<HTMLTimeElement>, 'dateTime'> {
|
|
9
|
+
value: TimeValue;
|
|
10
|
+
mode?: RelativeTimeMode | undefined;
|
|
11
|
+
/**
|
|
12
|
+
* Overrides the shared clock, for a story or a suite. Left alone, every
|
|
13
|
+
* relative time in the document advances together on one ticker.
|
|
14
|
+
*/
|
|
15
|
+
now?: number | undefined;
|
|
16
|
+
/** What an unparseable or absent value means. */
|
|
17
|
+
emptyLabel?: string | undefined;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* When something happened, kept current.
|
|
21
|
+
*
|
|
22
|
+
* A REAL `time` ELEMENT, carrying the exact instant in `dateTime` and in its
|
|
23
|
+
* title. The words a reader sees are approximate on purpose, and the moment
|
|
24
|
+
* they need the real one, hovering gives it to them and a machine reading the
|
|
25
|
+
* page has had it all along.
|
|
26
|
+
*
|
|
27
|
+
* It subscribes to the shared clock, so the words advance on their own rather
|
|
28
|
+
* than freezing at whatever they were when an unrelated push last happened to
|
|
29
|
+
* re-render the row.
|
|
30
|
+
*/
|
|
31
|
+
export declare function RelativeTime({ value, mode, now, emptyLabel, className, ...rest }: RelativeTimeProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The shared instant, in epoch ms, re-rendering the caller once a second.
|
|
3
|
+
*
|
|
4
|
+
* Pass the value DOWN rather than calling this again deeper: two components
|
|
5
|
+
* reading their own clock is the disagreement it exists to prevent.
|
|
6
|
+
*/
|
|
7
|
+
export declare function useNow(): number;
|
|
8
|
+
/** The current instant without subscribing, for an event handler or an effect. */
|
|
9
|
+
export declare function currentNow(): number;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/** Anything a caller has a time in. */
|
|
2
|
+
export type TimeValue = Date | number | string | null | undefined;
|
|
3
|
+
/**
|
|
4
|
+
* The instant a value names, or null when it names none.
|
|
5
|
+
*
|
|
6
|
+
* A NAIVE STAMP IS READ AS UTC. Servers emit both the aware form
|
|
7
|
+
* (`2026-01-01T00:00:00Z`) and the naive one, often for the same instant, and
|
|
8
|
+
* `new Date()` reads the naive one as LOCAL time: a reader in Berlin would see
|
|
9
|
+
* every naive stamp an hour out, and the two encodings of one instant would
|
|
10
|
+
* render as two different times on the same screen.
|
|
11
|
+
*/
|
|
12
|
+
export declare function toInstant(value: TimeValue): number | null;
|
|
13
|
+
/**
|
|
14
|
+
* "4m ago", "2h ago", "just now", "in 30m", "due".
|
|
15
|
+
*
|
|
16
|
+
* `now` is a REQUIRED argument rather than a call to a clock inside. Every
|
|
17
|
+
* relative time on a screen has to agree with every other, and a function that
|
|
18
|
+
* read the clock itself would answer differently for two rows rendered in the
|
|
19
|
+
* same frame. `useNow` is the one ticker that supplies it.
|
|
20
|
+
*
|
|
21
|
+
* Null for a value that names no instant, so a caller decides what an absence
|
|
22
|
+
* looks like. A dash chosen here would be the one absence in a product that
|
|
23
|
+
* says nothing about what is missing.
|
|
24
|
+
*/
|
|
25
|
+
export declare function formatRelative(value: TimeValue, now: number): string | null;
|
|
26
|
+
/** The same rules, forward: "in 4m", and "due" once it has arrived. */
|
|
27
|
+
export declare function formatUntil(value: TimeValue, now: number): string | null;
|
|
28
|
+
/**
|
|
29
|
+
* How long, as a running duration: "12s", "4m 20s", "1h 5m".
|
|
30
|
+
*
|
|
31
|
+
* Different from the relative form on purpose. Beside something that is still
|
|
32
|
+
* happening, "4m ago" claims it is over; this says how long it has been going.
|
|
33
|
+
*/
|
|
34
|
+
export declare function formatElapsed(value: TimeValue, now: number): string | null;
|
|
35
|
+
/** The full instant, for the title a reader hovers to see exactly when. */
|
|
36
|
+
export declare function formatExact(value: TimeValue): string | null;
|
|
37
|
+
/** The machine-readable form a `time` element carries. */
|
|
38
|
+
export declare function toISO(value: TimeValue): string | null;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import './RelativeTime.css';
|
|
2
|
+
export { RelativeTime } from './RelativeTime.js';
|
|
3
|
+
export type { RelativeTimeProps, RelativeTimeMode } from './RelativeTime.js';
|
|
4
|
+
export { useNow, currentNow } from './clock.js';
|
|
5
|
+
export { formatElapsed, formatExact, formatRelative, formatUntil, toISO, toInstant, } from './format.js';
|
|
6
|
+
export type { TimeValue } from './format.js';
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* A relative time is text, so it takes the register around it. Its one rule is
|
|
3
|
+
* tabular figures: the words change once a second, and proportional digits
|
|
4
|
+
* would move whatever sits beside them on every tick.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
.crewlet-relative-time {
|
|
8
|
+
font-variant-numeric: tabular-nums;
|
|
9
|
+
white-space: nowrap;
|
|
10
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { type ButtonHTMLAttributes, type ReactNode } from 'react';
|
|
2
|
+
export interface SearchTriggerProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'children' | 'aria-label'> {
|
|
3
|
+
/** What it is called, drawn inside the box and used as its name. */
|
|
4
|
+
label?: string | undefined;
|
|
5
|
+
/** The shortcut hint, as a Kbd with `keys`. */
|
|
6
|
+
shortcut?: ReactNode;
|
|
7
|
+
/**
|
|
8
|
+
* The shortcut in the syntax `aria-keyshortcuts` takes, such as
|
|
9
|
+
* `"Control+K Meta+K /"`. A screen reader reads it with the control, which
|
|
10
|
+
* is the only place a reader who cannot see the keycaps learns the shortcut
|
|
11
|
+
* exists.
|
|
12
|
+
*/
|
|
13
|
+
keyshortcuts?: string | undefined;
|
|
14
|
+
/** The leading glyph. A magnifier by default. */
|
|
15
|
+
icon?: ReactNode;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* The control that opens search, drawn as the field it is standing in for.
|
|
19
|
+
*
|
|
20
|
+
* IT IS A BUTTON, not an input. What it opens is a palette with its own field,
|
|
21
|
+
* and a box that takes focus and then throws the first keystroke away is worse
|
|
22
|
+
* than one that never looked like a field at all.
|
|
23
|
+
*
|
|
24
|
+
* ITS NAME IS ON THE BUTTON, not in its text. The narrow layout hides the
|
|
25
|
+
* label and the hint and leaves the glyph, and content under `display: none`
|
|
26
|
+
* names nothing: the dashboard this comes from had a search button that a
|
|
27
|
+
* screen reader announced as "button" at every width under the breakpoint.
|
|
28
|
+
*/
|
|
29
|
+
export declare const SearchTrigger: import("react").ForwardRefExoticComponent<SearchTriggerProps & import("react").RefAttributes<HTMLButtonElement>>;
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* A button drawn as the field it stands in for.
|
|
3
|
+
*
|
|
4
|
+
* Below the shell breakpoint it keeps the glyph and drops the label and the
|
|
5
|
+
* hint, which is why the name lives on the button rather than in its text.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
.crewlet-search-trigger {
|
|
9
|
+
display: inline-flex;
|
|
10
|
+
align-items: center;
|
|
11
|
+
gap: var(--spacing-2);
|
|
12
|
+
/* The resting width of the box. A topbar with less room sets it. */
|
|
13
|
+
--crewlet-search-trigger-width: 220px;
|
|
14
|
+
min-width: var(--crewlet-search-trigger-width);
|
|
15
|
+
height: var(--size-control-md);
|
|
16
|
+
padding: 0 var(--spacing-2) 0 var(--spacing-3);
|
|
17
|
+
border: 1px solid var(--color-border-default);
|
|
18
|
+
border-radius: var(--radius-md);
|
|
19
|
+
background: var(--color-surface-subtle);
|
|
20
|
+
color: var(--color-text-tertiary);
|
|
21
|
+
font-family: var(--font-family-sans);
|
|
22
|
+
font-size: var(--font-size-compact);
|
|
23
|
+
cursor: pointer;
|
|
24
|
+
transition:
|
|
25
|
+
border-color var(--motion-duration-fast) var(--motion-easing-default),
|
|
26
|
+
color var(--motion-duration-fast) var(--motion-easing-default);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
.crewlet-search-trigger:hover {
|
|
30
|
+
border-color: var(--color-border-hover);
|
|
31
|
+
color: var(--color-text-primary);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
.crewlet-search-trigger:focus-visible {
|
|
35
|
+
outline: 2px solid var(--color-focus);
|
|
36
|
+
outline-offset: 2px;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
.crewlet-search-trigger__icon {
|
|
40
|
+
display: inline-flex;
|
|
41
|
+
flex: none;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/* The glyph is quieter than the word beside it, on the decoration step, which
|
|
45
|
+
is the one thing that step is for. */
|
|
46
|
+
.crewlet-search-trigger__icon svg {
|
|
47
|
+
color: var(--color-text-muted);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
.crewlet-search-trigger__label {
|
|
51
|
+
overflow: hidden;
|
|
52
|
+
text-overflow: ellipsis;
|
|
53
|
+
white-space: nowrap;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/* The hint as a whole, so its keys stay together at the end of the box. */
|
|
57
|
+
.crewlet-search-trigger__shortcut {
|
|
58
|
+
display: inline-flex;
|
|
59
|
+
align-items: center;
|
|
60
|
+
margin-left: auto;
|
|
61
|
+
flex: none;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
@media (max-width: 900px) {
|
|
65
|
+
.crewlet-search-trigger {
|
|
66
|
+
min-width: 0;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
.crewlet-search-trigger__label,
|
|
70
|
+
.crewlet-search-trigger__shortcut {
|
|
71
|
+
display: none;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
@media (prefers-reduced-motion: reduce) {
|
|
76
|
+
.crewlet-search-trigger {
|
|
77
|
+
transition: none;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { type HTMLAttributes, type ReactNode } from 'react';
|
|
2
|
+
import { type HeadingLevel } from '../utils/headingLevel.js';
|
|
3
|
+
export type SectionSpacing =
|
|
4
|
+
/** No band padding at all, and no gap under the header either. */
|
|
5
|
+
'none'
|
|
6
|
+
/**
|
|
7
|
+
* THE DEFAULT: a console band, no vertical padding and one gap between the
|
|
8
|
+
* header and what it introduces. A screen is a stack of these, and a
|
|
9
|
+
* marketing band between each pair of panels puts one panel per viewport.
|
|
10
|
+
*/
|
|
11
|
+
| 'compact'
|
|
12
|
+
/** A marketing band. State one: a page of them is a deliberate page. */
|
|
13
|
+
| 'sm' | 'md' | 'lg';
|
|
14
|
+
export type SectionElement = 'section' | 'div' | 'header' | 'footer' | 'article';
|
|
15
|
+
export interface SectionProps extends Omit<HTMLAttributes<HTMLElement>, 'title'> {
|
|
16
|
+
as?: SectionElement | undefined;
|
|
17
|
+
/** Vertical rhythm. Defaults to `compact`, the console band. */
|
|
18
|
+
spacing?: SectionSpacing | undefined;
|
|
19
|
+
/**
|
|
20
|
+
* The section's heading. With one, the element is named by it and everything
|
|
21
|
+
* inside is a heading level deeper.
|
|
22
|
+
*/
|
|
23
|
+
title?: ReactNode;
|
|
24
|
+
/** Overrides the level the heading is rendered at. */
|
|
25
|
+
headingLevel?: HeadingLevel | undefined;
|
|
26
|
+
/** A sentence beside the title saying what the section is for. */
|
|
27
|
+
description?: ReactNode;
|
|
28
|
+
/** The section's own controls, at the end of the heading row. */
|
|
29
|
+
actions?: ReactNode;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* A band with its own rhythm, and optionally its own heading.
|
|
33
|
+
*
|
|
34
|
+
* WHY THE HEADER BELONGS HERE. A screen is a stack of named sections, and each
|
|
35
|
+
* one used to be hand-built out of a row, a type utility and a spacer. Built
|
|
36
|
+
* by hand, the heading level was whatever the author typed, so a document
|
|
37
|
+
* outline had levels missing; here the level comes from where the section
|
|
38
|
+
* actually sits, and its contents are one level deeper without anybody
|
|
39
|
+
* counting.
|
|
40
|
+
*/
|
|
41
|
+
export declare const Section: ({ as: As, spacing, title, headingLevel, description, actions, className, children, ...rest }: SectionProps) => import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Section, the vertical rhythm band. One spacing scale keeps the cadence
|
|
3
|
+
* between page sections consistent, and collapses on small viewports.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
.crewlet-section {
|
|
7
|
+
position: relative;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
.crewlet-section--none {
|
|
11
|
+
padding-block: 0;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/*
|
|
15
|
+
* The console preset: no band padding, one gap between the heading and what it
|
|
16
|
+
* introduces. A screen is a stack of these, and a marketing band between each
|
|
17
|
+
* pair would put one panel per viewport.
|
|
18
|
+
*/
|
|
19
|
+
.crewlet-section--compact {
|
|
20
|
+
display: flex;
|
|
21
|
+
flex-direction: column;
|
|
22
|
+
gap: var(--spacing-3);
|
|
23
|
+
padding-block: 0;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
.crewlet-section--sm {
|
|
27
|
+
padding-block: var(--spacing-9);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
.crewlet-section--md {
|
|
31
|
+
padding-block: var(--spacing-11);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/*
|
|
35
|
+
* The largest band is a multiple of the largest spacing step rather than a
|
|
36
|
+
* number of its own: the scale stops at 80px, this band has always been 120,
|
|
37
|
+
* and written as a literal it would be the one measure on the page a density
|
|
38
|
+
* setting could not reach.
|
|
39
|
+
*/
|
|
40
|
+
.crewlet-section--lg {
|
|
41
|
+
padding-block: calc(var(--spacing-11) * 1.5);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
.crewlet-section__header {
|
|
45
|
+
display: flex;
|
|
46
|
+
align-items: baseline;
|
|
47
|
+
gap: var(--spacing-3);
|
|
48
|
+
min-width: 0;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/*
|
|
52
|
+
* The page's leading, not the baseline's heading leading. A band title sits on
|
|
53
|
+
* one line beside its own sentence, and the tight step every heading element
|
|
54
|
+
* inherits puts the two on different rhythms within one row.
|
|
55
|
+
*/
|
|
56
|
+
.crewlet-section__title {
|
|
57
|
+
margin: 0;
|
|
58
|
+
font-family: var(--font-family-display);
|
|
59
|
+
font-size: var(--font-size-lg);
|
|
60
|
+
font-weight: var(--font-weight-semibold);
|
|
61
|
+
line-height: var(--font-line-height-normal);
|
|
62
|
+
letter-spacing: var(--font-letter-spacing-tight);
|
|
63
|
+
color: var(--color-text-primary);
|
|
64
|
+
min-width: 0;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/*
|
|
68
|
+
* Beside the title, not under it, and it gives up its tail first: the heading
|
|
69
|
+
* is what a reader scans for and the sentence is what they read once they have
|
|
70
|
+
* found it.
|
|
71
|
+
*/
|
|
72
|
+
.crewlet-section__description {
|
|
73
|
+
margin: 0;
|
|
74
|
+
min-width: 0;
|
|
75
|
+
overflow: hidden;
|
|
76
|
+
text-overflow: ellipsis;
|
|
77
|
+
white-space: nowrap;
|
|
78
|
+
/* THE CAPTION REGISTER. It is one line beside a heading, truncated before
|
|
79
|
+
the heading gives up a character, so it is glanced at rather than read:
|
|
80
|
+
the compact step it used to take made it the same weight of text as a
|
|
81
|
+
table cell and it competed with the title it qualifies. */
|
|
82
|
+
font-size: var(--font-size-xs);
|
|
83
|
+
color: var(--color-text-tertiary);
|
|
84
|
+
max-width: var(--size-measure);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
.crewlet-section__actions {
|
|
88
|
+
display: flex;
|
|
89
|
+
align-items: center;
|
|
90
|
+
gap: var(--spacing-2);
|
|
91
|
+
flex: none;
|
|
92
|
+
margin-inline-start: auto;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/* A titled band lays its header and its content out as a column. */
|
|
96
|
+
.crewlet-section--titled {
|
|
97
|
+
display: flex;
|
|
98
|
+
flex-direction: column;
|
|
99
|
+
gap: var(--spacing-3);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
@media (max-width: 768px) {
|
|
103
|
+
.crewlet-section--sm {
|
|
104
|
+
padding-block: var(--spacing-7);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
.crewlet-section--md {
|
|
108
|
+
padding-block: var(--spacing-9);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
.crewlet-section--lg {
|
|
112
|
+
padding-block: var(--spacing-10);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/*
|
|
116
|
+
* Narrow: the sentence moves under the heading rather than competing with it
|
|
117
|
+
* for a line that has room for neither.
|
|
118
|
+
*/
|
|
119
|
+
.crewlet-section__header {
|
|
120
|
+
flex-wrap: wrap;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
.crewlet-section__description {
|
|
124
|
+
white-space: normal;
|
|
125
|
+
flex-basis: 100%;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
export type SegmentedSize = 'sm' | 'md';
|
|
3
|
+
export interface SegmentedOption<T extends string = string> {
|
|
4
|
+
value: T;
|
|
5
|
+
/** What is drawn. An empty label makes the option icon-only. */
|
|
6
|
+
label?: ReactNode;
|
|
7
|
+
/**
|
|
8
|
+
* What an icon-only option is CALLED. A `title` is a tooltip and a screen
|
|
9
|
+
* reader is not shown one, so an option drawn as a glyph alone takes its
|
|
10
|
+
* name from here, or from `title` where the two say the same thing.
|
|
11
|
+
*/
|
|
12
|
+
srLabel?: string;
|
|
13
|
+
icon?: ReactNode;
|
|
14
|
+
title?: string;
|
|
15
|
+
count?: number | null;
|
|
16
|
+
disabled?: boolean;
|
|
17
|
+
/**
|
|
18
|
+
* A second line under the label. With one, the options are drawn as card
|
|
19
|
+
* rows rather than chips, for a choice a reader has to read before making.
|
|
20
|
+
*/
|
|
21
|
+
description?: ReactNode;
|
|
22
|
+
}
|
|
23
|
+
interface SegmentedShared<T extends string> {
|
|
24
|
+
/** Names the group. A row of choices with no name is announced as a row of buttons. */
|
|
25
|
+
label: string;
|
|
26
|
+
options: readonly SegmentedOption<T>[];
|
|
27
|
+
value: T;
|
|
28
|
+
onValueChange: (value: T) => void;
|
|
29
|
+
size?: SegmentedSize | undefined;
|
|
30
|
+
className?: string | undefined;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* What the row IS, which decides both its roles and when it reports a change.
|
|
34
|
+
*
|
|
35
|
+
* `radio` is a SETTING or a filter (the theme, the density, a lens with no
|
|
36
|
+
* panel): announced as a radio group, and the arrows select as they move,
|
|
37
|
+
* because a choice that is not in the URL costs nothing to change on every
|
|
38
|
+
* keypress.
|
|
39
|
+
*
|
|
40
|
+
* `tabs` is a row of SECTIONS, and in this product a section pushes a history
|
|
41
|
+
* entry: the arrows move focus and Enter or Space selects, so walking the row
|
|
42
|
+
* with the keyboard does not leave an entry per keypress for Back to walk
|
|
43
|
+
* back through. `panelId` names the [TabPanel] it controls.
|
|
44
|
+
*/
|
|
45
|
+
type SegmentedSemantics = {
|
|
46
|
+
semantics: 'tabs';
|
|
47
|
+
panelId: string;
|
|
48
|
+
} | {
|
|
49
|
+
semantics: 'radio';
|
|
50
|
+
panelId?: undefined;
|
|
51
|
+
};
|
|
52
|
+
export type SegmentedControlProps<T extends string = string> = SegmentedShared<T> & SegmentedSemantics;
|
|
53
|
+
/**
|
|
54
|
+
* A row of mutually exclusive choices.
|
|
55
|
+
*
|
|
56
|
+
* WHY IT IS NOT JUST TABS. The two rows look alike and are not alike: one is
|
|
57
|
+
* a setting and one is a place. The engine drew its theme and density
|
|
58
|
+
* controls as tabs, so a screen reader announced them as tabs, went looking
|
|
59
|
+
* for the panels each one opened, and found none; and it drew its lens rows
|
|
60
|
+
* as radios that selected on every arrow press, so walking a row with the
|
|
61
|
+
* keyboard pushed a history entry per keystroke.
|
|
62
|
+
*
|
|
63
|
+
* It draws with the Tabs pill classes, because a row of choices should not
|
|
64
|
+
* look like two different controls depending on which component a screen
|
|
65
|
+
* reached for.
|
|
66
|
+
*/
|
|
67
|
+
export declare function SegmentedControl<T extends string = string>({ label, options, value, onValueChange, size, className, semantics, panelId, }: SegmentedControlProps<T>): import("react/jsx-runtime").JSX.Element;
|
|
68
|
+
export {};
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* SegmentedControl: the pill row, drawn with the Tabs classes.
|
|
3
|
+
*
|
|
4
|
+
* Only what is its own lives here. The chrome, the sizes and the active chip
|
|
5
|
+
* come from Tabs.css, so a lens row and a setting row look the same whichever
|
|
6
|
+
* component a screen reached for.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
.crewlet-segmented__text {
|
|
10
|
+
display: inline-flex;
|
|
11
|
+
flex-direction: column;
|
|
12
|
+
align-items: flex-start;
|
|
13
|
+
gap: 1px;
|
|
14
|
+
min-width: 0;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/*
|
|
18
|
+
* A choice a reader has to READ before making it is a card row, not a chip:
|
|
19
|
+
* a template with a sentence under its name does not fit in a pill, and
|
|
20
|
+
* squeezing it there is how the sentence ends up truncated to nothing.
|
|
21
|
+
*/
|
|
22
|
+
/*
|
|
23
|
+
* TWO CLASSES, so this wins whatever order the stylesheets are bundled in.
|
|
24
|
+
* `.crewlet-tabs` sets the row's own display and alignment, and a rule of
|
|
25
|
+
* equal weight in a file that happens to come later takes them back.
|
|
26
|
+
*/
|
|
27
|
+
.crewlet-tabs.crewlet-segmented--cards {
|
|
28
|
+
display: grid;
|
|
29
|
+
gap: var(--spacing-2);
|
|
30
|
+
width: 100%;
|
|
31
|
+
align-items: stretch;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/*
|
|
35
|
+
* The same frame a framed Checkbox draws, because it is the same row: a
|
|
36
|
+
* boundary on the body it sits in, and no surface of its own. A choice with a
|
|
37
|
+
* surface inside a panel of the same surface reads as a second panel.
|
|
38
|
+
*/
|
|
39
|
+
.crewlet-segmented--cards .crewlet-segmented__option {
|
|
40
|
+
justify-content: flex-start;
|
|
41
|
+
text-align: left;
|
|
42
|
+
/* A sentence under a name is a sentence: it wraps rather than being cut. */
|
|
43
|
+
white-space: normal;
|
|
44
|
+
padding: var(--spacing-3);
|
|
45
|
+
border: 1px solid var(--color-border-default);
|
|
46
|
+
border-radius: var(--radius-lg);
|
|
47
|
+
font-size: var(--font-size-compact);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/* The one card that is chosen takes the accent, which is what "here, this
|
|
51
|
+
one" means everywhere else in the product. */
|
|
52
|
+
.crewlet-segmented--cards .crewlet-segmented__option.is-active {
|
|
53
|
+
border-color: var(--color-brand-accent);
|
|
54
|
+
background: var(--color-brand-accent-soft);
|
|
55
|
+
color: var(--color-brand-accent-ink);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
.crewlet-segmented__description {
|
|
59
|
+
font-size: var(--font-size-xs);
|
|
60
|
+
font-weight: var(--font-weight-regular);
|
|
61
|
+
line-height: var(--font-line-height-normal);
|
|
62
|
+
color: var(--color-text-tertiary);
|
|
63
|
+
white-space: normal;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
.crewlet-segmented--cards .crewlet-segmented__option.is-active .crewlet-segmented__description {
|
|
67
|
+
color: var(--color-brand-accent-ink);
|
|
68
|
+
}
|