@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,80 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* A row of stat tiles.
|
|
3
|
+
*
|
|
4
|
+
* ITS COLUMN COUNT NEVER MOVES with its contents. A grid that reflowed as
|
|
5
|
+
* tiles appeared and vanished moved every number on the page for a reason that
|
|
6
|
+
* had nothing to do with the numbers, which is exactly what a reader watching
|
|
7
|
+
* a live board is trying not to have happen.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
.crewlet-stat-group {
|
|
11
|
+
display: grid;
|
|
12
|
+
grid-template-columns: repeat(var(--crewlet-stat-group-cols, 4), minmax(0, 1fr));
|
|
13
|
+
/* The flush-panel recipe: the surface, the hairline, the 12px corner and
|
|
14
|
+
`overflow: hidden`, which is what lets the tiles inside sit against the
|
|
15
|
+
corners without their own hairlines escaping past them. The engine puts
|
|
16
|
+
its stat row inside exactly this. */
|
|
17
|
+
background: var(--color-surface-subtle);
|
|
18
|
+
border: 1px solid var(--color-border-default);
|
|
19
|
+
border-radius: var(--radius-lg);
|
|
20
|
+
box-shadow: var(--shadow-xs), var(--shadow-hairline);
|
|
21
|
+
overflow: hidden;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/*
|
|
25
|
+
* A tile inside the row brings no surface of its own, whether or not its
|
|
26
|
+
* caller remembered `flush`. The group draws one card and the hairlines
|
|
27
|
+
* inside it, so a tile that kept its own border and radius is a card inside
|
|
28
|
+
* a card: a box inside a box, which is what the reader sees.
|
|
29
|
+
*
|
|
30
|
+
* TWO CLASSES, NOT :where(). Written as `> :where(.crewlet-statcard)` this
|
|
31
|
+
* weighed exactly what the tile's own `.crewlet-statcard` rule weighs, so
|
|
32
|
+
* which one painted was settled by whichever stylesheet the bundler put
|
|
33
|
+
* last. It put the tile's last, and every tile in every group drew its own
|
|
34
|
+
* border, its own 12px corner and its own surface inside the group's.
|
|
35
|
+
* Naming both classes settles it by weight, which no import order can undo.
|
|
36
|
+
*/
|
|
37
|
+
.crewlet-stat-group > .crewlet-statcard {
|
|
38
|
+
background: transparent;
|
|
39
|
+
border: 0;
|
|
40
|
+
border-radius: var(--radius-none);
|
|
41
|
+
box-shadow: none;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/*
|
|
45
|
+
* A hairline between columns, drawn on the tile that follows one.
|
|
46
|
+
*
|
|
47
|
+
* NAMED TWICE, ON PURPOSE. The rule above clears the tile's own border and
|
|
48
|
+
* weighs two classes, so a one-class selector here loses to it and the row
|
|
49
|
+
* of numbers runs together with nothing between the columns. The first
|
|
50
|
+
* selector matches whatever a caller puts in the row; the second weighs the
|
|
51
|
+
* same as the rule it has to beat, and sits after it.
|
|
52
|
+
*/
|
|
53
|
+
.crewlet-stat-group > * + *,
|
|
54
|
+
.crewlet-stat-group > .crewlet-statcard + .crewlet-statcard {
|
|
55
|
+
border-left: 1px solid var(--color-border-default);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/*
|
|
59
|
+
* Two columns under the shell breakpoint, which is where the engine drops its
|
|
60
|
+
* own stat row: 900px is a 280px rail plus a 620px content column, so it is
|
|
61
|
+
* the width at which a four-up row of numbers stops having a column each. The
|
|
62
|
+
* rules are written for the general case rather than per column count: the
|
|
63
|
+
* first tile of each pair loses its left hairline, and everything on the
|
|
64
|
+
* second row and below gains a top one.
|
|
65
|
+
*/
|
|
66
|
+
@media (max-width: 900px) {
|
|
67
|
+
.crewlet-stat-group {
|
|
68
|
+
grid-template-columns: repeat(2, minmax(0, 1fr));
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
.crewlet-stat-group > *:nth-child(odd),
|
|
72
|
+
.crewlet-stat-group > .crewlet-statcard:nth-child(odd) {
|
|
73
|
+
border-left: 0;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
.crewlet-stat-group > *:nth-child(n + 3),
|
|
77
|
+
.crewlet-stat-group > .crewlet-statcard:nth-child(n + 3) {
|
|
78
|
+
border-top: 1px solid var(--color-border-default);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { PhaseTone, Tone } from '../utils/tone.js';
|
|
2
|
+
export interface StatusDotProps {
|
|
3
|
+
/** Which state, or which phase. Neutral says "nothing in particular". */
|
|
4
|
+
tone?: Tone | PhaseTone | undefined;
|
|
5
|
+
/**
|
|
6
|
+
* A slow pulse, for a state that is still happening. Held still under a
|
|
7
|
+
* reduced-motion preference, where the mark still reads as its tone.
|
|
8
|
+
*/
|
|
9
|
+
pulse?: boolean | undefined;
|
|
10
|
+
className?: string | undefined;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* The shape half of a status.
|
|
14
|
+
*
|
|
15
|
+
* COLOUR IS NEVER THE ONLY CARRIER. Every dot sits beside its own word, and
|
|
16
|
+
* the dot is `aria-hidden` for exactly that reason: a screen reader that read
|
|
17
|
+
* both would say the state twice, and one that read only the dot would say
|
|
18
|
+
* nothing at all. If a dot has no word beside it, the dot is the wrong
|
|
19
|
+
* component and a Tag is the right one.
|
|
20
|
+
*
|
|
21
|
+
* Its fill is the tone's own fill step, which clears 3:1 against every surface
|
|
22
|
+
* it can sit on, because a mark is read the way a glyph is rather than the way
|
|
23
|
+
* text is.
|
|
24
|
+
*/
|
|
25
|
+
export declare function StatusDot({ tone, pulse, className }: StatusDotProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* The status dot: a 6px mark in its tone's fill, beside the word it belongs
|
|
3
|
+
* to. See the component doc for why it is hidden from assistive technology.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
.crewlet-status-dot {
|
|
7
|
+
display: inline-block;
|
|
8
|
+
width: 6px;
|
|
9
|
+
height: 6px;
|
|
10
|
+
border-radius: var(--radius-circle);
|
|
11
|
+
/*
|
|
12
|
+
* The quiet state is still a mark, so it takes the tertiary step rather than
|
|
13
|
+
* the decoration one the engine spends here: a 6px dot has to clear 3:1 to
|
|
14
|
+
* be seen at all, and --color-text-muted measures 2.33:1 on a light page and
|
|
15
|
+
* 2.25:1 on a dark one at their worst grounds. The tertiary step measures
|
|
16
|
+
* 4.87:1 and 4.65:1 on the same pair, and is the nearest step that holds.
|
|
17
|
+
*/
|
|
18
|
+
background: var(--color-text-tertiary);
|
|
19
|
+
flex: none;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
.crewlet-status-dot--info {
|
|
23
|
+
background: var(--color-feedback-info);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
.crewlet-status-dot--success {
|
|
27
|
+
background: var(--color-feedback-success);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
.crewlet-status-dot--warning {
|
|
31
|
+
background: var(--color-feedback-warning);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
.crewlet-status-dot--danger {
|
|
35
|
+
background: var(--color-feedback-danger);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
.crewlet-status-dot--brand {
|
|
39
|
+
background: var(--color-brand-accent);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
.crewlet-status-dot--phase-onboarding {
|
|
43
|
+
background: var(--color-phase-onboarding);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
.crewlet-status-dot--phase-execute {
|
|
47
|
+
background: var(--color-phase-execute);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
.crewlet-status-dot--phase-review {
|
|
51
|
+
background: var(--color-phase-review);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/*
|
|
55
|
+
* Still happening. Three things are deliberate: the pulse never goes to
|
|
56
|
+
* nothing, because a mark that disappears reads as a fault rather than as work
|
|
57
|
+
* in progress; it alternates rather than sawtooths, so the mark comes back the
|
|
58
|
+
* way it went; and the round trip is 1.8s, which is the engine's own breath
|
|
59
|
+
* and is 0.55 flashes a second, well clear of the three that are a seizure
|
|
60
|
+
* risk. Three of the slow step each way makes that round trip.
|
|
61
|
+
*/
|
|
62
|
+
.crewlet-status-dot.is-pulsing {
|
|
63
|
+
animation: crewlet-status-dot-pulse calc(var(--motion-duration-slow) * 3) var(--motion-easing-default) infinite
|
|
64
|
+
alternate;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
@keyframes crewlet-status-dot-pulse {
|
|
68
|
+
from {
|
|
69
|
+
opacity: 1;
|
|
70
|
+
}
|
|
71
|
+
to {
|
|
72
|
+
opacity: 0.35;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/*
|
|
77
|
+
* A mark that cannot move should not pretend to. The dot still reads as its
|
|
78
|
+
* tone, and the word beside it still says what is happening.
|
|
79
|
+
*/
|
|
80
|
+
@media (prefers-reduced-motion: reduce) {
|
|
81
|
+
.crewlet-status-dot.is-pulsing {
|
|
82
|
+
animation: none;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { type InputHTMLAttributes, type ReactNode } from 'react';
|
|
2
|
+
export interface SwitchProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'type' | 'size'> {
|
|
3
|
+
/** What the setting is, and the switch's NAME. */
|
|
4
|
+
label: ReactNode;
|
|
5
|
+
/** What turning it on does, when the label alone does not say. */
|
|
6
|
+
description?: ReactNode;
|
|
7
|
+
/** The bordered row a settings list uses for a decision that stands on its own. */
|
|
8
|
+
framed?: boolean;
|
|
9
|
+
/** The new state, for a caller that does not want to read it off an event. */
|
|
10
|
+
onCheckedChange?: (checked: boolean) => void;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* A setting that is on or off, and takes effect as it is switched.
|
|
14
|
+
*
|
|
15
|
+
* NOT A CHECKBOX, and the difference is not decoration. A checkbox is an
|
|
16
|
+
* answer to a question the form asks and is read when the form is saved; a
|
|
17
|
+
* switch IS the change, applied the moment it moves. A screen reader says
|
|
18
|
+
* "on" and "off" for one and "ticked" and "unticked" for the other, and a
|
|
19
|
+
* reader told a webhook is "unticked" has to work out what that means for a
|
|
20
|
+
* delivery. This is what the two vendor screens were drawing as an On and Off
|
|
21
|
+
* select, which is a third spelling of the same thing.
|
|
22
|
+
*
|
|
23
|
+
* IT IS A REAL CHECKBOX INPUT wearing `role="switch"`, so Space toggles it,
|
|
24
|
+
* a form submits it and a label points at it without any of that being
|
|
25
|
+
* rebuilt. What the role changes is what it is called out loud.
|
|
26
|
+
*
|
|
27
|
+
* AND ITS STATE IS THE INPUT'S OWN, with no `aria-checked` attribute beside
|
|
28
|
+
* it. The role maps the element's checkedness to `aria-checked` already, and
|
|
29
|
+
* a second copy written as an attribute is one a browser does not update:
|
|
30
|
+
* left uncontrolled, or toggled by a reader before the caller's state lands,
|
|
31
|
+
* the attribute says one thing while the control shows another, and a screen
|
|
32
|
+
* reader reads the attribute.
|
|
33
|
+
*
|
|
34
|
+
* THE TRACK CARRIES A 3:1 BOUNDARY IN BOTH STATES. Drawn as two fills alone,
|
|
35
|
+
* off is a grey pill on a grey panel: the control most likely to be missed
|
|
36
|
+
* entirely is the one that says whether a thing is running.
|
|
37
|
+
*/
|
|
38
|
+
export declare const Switch: import("react").ForwardRefExoticComponent<SwitchProps & import("react").RefAttributes<HTMLInputElement>>;
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Switch: a setting that takes effect as it moves.
|
|
3
|
+
*
|
|
4
|
+
* The native checkbox is still the control. It is drawn over the track at
|
|
5
|
+
* full size and zero opacity rather than hidden, so the pointer hits the real
|
|
6
|
+
* input and nothing here has to rebuild Space, the label association or form
|
|
7
|
+
* submission.
|
|
8
|
+
*
|
|
9
|
+
* What zero opacity costs is the one thing the control cannot do: be seen. Its
|
|
10
|
+
* ring is drawn on the TRACK, keyed on the control's own focus, because an
|
|
11
|
+
* outline on an element at zero alpha is an outline nobody is shown. See the
|
|
12
|
+
* rule at the bottom of this file.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
.crewlet-switch {
|
|
16
|
+
--crewlet-switch-width: 36px;
|
|
17
|
+
--crewlet-switch-height: 20px;
|
|
18
|
+
--crewlet-switch-thumb: 14px;
|
|
19
|
+
--crewlet-switch-inset: 3px;
|
|
20
|
+
|
|
21
|
+
display: flex;
|
|
22
|
+
align-items: flex-start;
|
|
23
|
+
gap: var(--spacing-2);
|
|
24
|
+
min-height: var(--size-row-sm);
|
|
25
|
+
/*
|
|
26
|
+
* The label's size, on the row, because the track below is placed against
|
|
27
|
+
* the label's first LINE in `em` and `em` on the track is the size it
|
|
28
|
+
* inherits. Left off, the sum was computed against whatever body size an
|
|
29
|
+
* application happened to set.
|
|
30
|
+
*/
|
|
31
|
+
font-size: var(--font-size-sm);
|
|
32
|
+
cursor: pointer;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
.crewlet-switch__track {
|
|
36
|
+
position: relative;
|
|
37
|
+
display: inline-flex;
|
|
38
|
+
flex: 0 0 auto;
|
|
39
|
+
width: var(--crewlet-switch-width);
|
|
40
|
+
height: var(--crewlet-switch-height);
|
|
41
|
+
/*
|
|
42
|
+
* Centred on the label's first LINE, the same sum a Checkbox's box takes,
|
|
43
|
+
* so a form holding both does not draw two rows whose controls sit at two
|
|
44
|
+
* heights. The literal it replaces put a 20px track 2px below a 19.6px
|
|
45
|
+
* line, which is a track hanging under its own sentence.
|
|
46
|
+
*/
|
|
47
|
+
margin-top: calc((var(--font-line-height-snug) * 1em - var(--crewlet-switch-height)) / 2);
|
|
48
|
+
border-radius: var(--radius-pill);
|
|
49
|
+
background: var(--color-surface-inset);
|
|
50
|
+
/*
|
|
51
|
+
* A REAL BOUNDARY IN BOTH STATES. Two fills alone leave "off" as a grey
|
|
52
|
+
* pill on a grey panel, and the control most likely to be missed is the one
|
|
53
|
+
* saying whether something is running.
|
|
54
|
+
*/
|
|
55
|
+
border: 1px solid var(--color-border-control);
|
|
56
|
+
transition: background-color var(--motion-duration-fast) var(--motion-easing-default),
|
|
57
|
+
border-color var(--motion-duration-fast) var(--motion-easing-default);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
.crewlet-switch__control {
|
|
61
|
+
position: absolute;
|
|
62
|
+
inset: 0;
|
|
63
|
+
width: 100%;
|
|
64
|
+
height: 100%;
|
|
65
|
+
margin: 0;
|
|
66
|
+
opacity: 0;
|
|
67
|
+
cursor: pointer;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
.crewlet-switch__thumb {
|
|
71
|
+
position: absolute;
|
|
72
|
+
top: var(--crewlet-switch-inset);
|
|
73
|
+
left: var(--crewlet-switch-inset);
|
|
74
|
+
width: var(--crewlet-switch-thumb);
|
|
75
|
+
height: var(--crewlet-switch-thumb);
|
|
76
|
+
border-radius: var(--radius-circle);
|
|
77
|
+
background: var(--color-text-on-accent);
|
|
78
|
+
box-shadow: var(--shadow-xs);
|
|
79
|
+
transition: transform var(--motion-duration-fast) var(--motion-easing-default);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/* Off, the thumb rides the neutral track and needs its own contrast. */
|
|
83
|
+
.crewlet-switch__control:not(:checked) ~ .crewlet-switch__thumb {
|
|
84
|
+
background: var(--color-text-secondary);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
.crewlet-switch__control:checked ~ .crewlet-switch__thumb {
|
|
88
|
+
transform: translateX(
|
|
89
|
+
calc(var(--crewlet-switch-width) - var(--crewlet-switch-thumb) - var(--crewlet-switch-inset) * 2 - 2px)
|
|
90
|
+
);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
.crewlet-switch__track:has(.crewlet-switch__control:checked) {
|
|
94
|
+
background: var(--color-brand-accent);
|
|
95
|
+
border-color: var(--color-brand-accent);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/*
|
|
99
|
+
* THE RING IS DRAWN ON THE TRACK, NOT ON THE CONTROL.
|
|
100
|
+
*
|
|
101
|
+
* The control is still what takes focus, and the rule this replaces put the
|
|
102
|
+
* ring on it for exactly that reason. It painted nothing: the control carries
|
|
103
|
+
* `opacity: 0`, and opacity applies to the WHOLE of an element's rendering,
|
|
104
|
+
* its outline included. A keyboard reader tabbing onto a switch was shown no
|
|
105
|
+
* indicator at all, measured on a screenshot of the focused control. It is the
|
|
106
|
+
* one failure a focus rule can have that reading the computed style does not
|
|
107
|
+
* reveal: `outline: solid 2px rgb(84, 105, 212)` was there the whole time, at
|
|
108
|
+
* zero alpha.
|
|
109
|
+
*
|
|
110
|
+
* So it moves to the track, which is what a reader sees, keyed on the
|
|
111
|
+
* control's own :focus-visible. The track is the same box: the control is
|
|
112
|
+
* `inset: 0` over it.
|
|
113
|
+
*
|
|
114
|
+
* OUTSET, like a Checkbox's and unlike a text field's. A 20px pill has no
|
|
115
|
+
* room to draw a ring inside itself, and there is no boundary to cover out
|
|
116
|
+
* there either: the track's own border goes the accent colour of its fill
|
|
117
|
+
* when the switch is on, so the ring is the only edge in that space.
|
|
118
|
+
*/
|
|
119
|
+
.crewlet-switch__track:has(.crewlet-switch__control:focus-visible) {
|
|
120
|
+
outline: 2px solid var(--color-focus);
|
|
121
|
+
outline-offset: 2px;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
.crewlet-switch__text {
|
|
125
|
+
display: flex;
|
|
126
|
+
flex-direction: column;
|
|
127
|
+
gap: var(--spacing-1);
|
|
128
|
+
user-select: none;
|
|
129
|
+
min-width: 0;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
.crewlet-switch__label {
|
|
133
|
+
font-size: var(--font-size-sm);
|
|
134
|
+
line-height: var(--font-line-height-snug);
|
|
135
|
+
color: var(--color-text-primary);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
.crewlet-switch__description {
|
|
139
|
+
font-size: var(--font-size-xs);
|
|
140
|
+
line-height: var(--font-line-height-normal);
|
|
141
|
+
color: var(--color-text-tertiary);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/* The same frame a Checkbox's row draws, because it is the same row: a
|
|
145
|
+
boundary on the dialog's own body, and no surface of its own. */
|
|
146
|
+
.crewlet-switch--framed {
|
|
147
|
+
gap: var(--spacing-3);
|
|
148
|
+
padding: var(--spacing-3);
|
|
149
|
+
border: 1px solid var(--color-border-default);
|
|
150
|
+
border-radius: var(--radius-lg);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
.crewlet-switch.is-disabled,
|
|
154
|
+
.crewlet-switch.is-disabled .crewlet-switch__control {
|
|
155
|
+
cursor: not-allowed;
|
|
156
|
+
opacity: 0.6;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/*
|
|
160
|
+
* The thumb ARRIVES rather than slides. The state still changes and the track
|
|
161
|
+
* still recolours; what stops is the travel, which is the part that makes a
|
|
162
|
+
* reader with a vestibular disorder look away from the control they are using.
|
|
163
|
+
*/
|
|
164
|
+
@media (prefers-reduced-motion: reduce) {
|
|
165
|
+
.crewlet-switch__track,
|
|
166
|
+
.crewlet-switch__thumb {
|
|
167
|
+
transition: none;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* A small table of rows and columns, given as arrays.
|
|
4
|
+
*
|
|
5
|
+
* IT IS A REAL TABLE NOW. It used to be a grid of divs and spans, which reads
|
|
6
|
+
* to a screen reader as a pile of text: no columns, no header association, and
|
|
7
|
+
* no way to ask what column a cell is in. A reader arriving at "3" in the
|
|
8
|
+
* fourth row learned nothing about which of four figures it was. The look is
|
|
9
|
+
* unchanged, because the look was never the problem.
|
|
10
|
+
*
|
|
11
|
+
* WHEN TO USE IT, and when not to. This is the table you build from arrays you
|
|
12
|
+
* already have: a comparison, a summary, a handful of rows inside a dialog.
|
|
13
|
+
* Anything with sorting, pagination, column choices, row actions or live rows
|
|
14
|
+
* is a DataTable, which has all of those and a column type to describe them
|
|
15
|
+
* with.
|
|
16
|
+
*
|
|
17
|
+
* Cells are nodes, so a cell may hold a Tag, a link or a glyph. A caption
|
|
18
|
+
* names the table for anybody who cannot see the heading above it; keep it if
|
|
19
|
+
* the surrounding text does not already say what the rows are.
|
|
20
|
+
*/
|
|
21
|
+
export interface TableActionButton {
|
|
22
|
+
label: ReactNode;
|
|
23
|
+
onClick: () => void;
|
|
24
|
+
}
|
|
25
|
+
export interface TableProps {
|
|
26
|
+
headers: ReactNode[];
|
|
27
|
+
/** One array per row, in the header's own order. Cells may be any node. */
|
|
28
|
+
data: ReactNode[][];
|
|
29
|
+
/**
|
|
30
|
+
* What the table is about, rendered as its `<caption>`.
|
|
31
|
+
*
|
|
32
|
+
* `captionHidden` keeps it in the accessibility tree and takes it off the
|
|
33
|
+
* screen, for a table whose heading is already visible right above it: a
|
|
34
|
+
* name a screen reader can use, without saying the same words twice.
|
|
35
|
+
*/
|
|
36
|
+
caption?: ReactNode;
|
|
37
|
+
captionHidden?: boolean;
|
|
38
|
+
emptyMessage?: ReactNode;
|
|
39
|
+
actionButton?: TableActionButton;
|
|
40
|
+
/**
|
|
41
|
+
* How tall the rows may get before they scroll, as a CSS length.
|
|
42
|
+
*
|
|
43
|
+
* A table given one becomes its own vertical scroller and its header sticks,
|
|
44
|
+
* so the column names stay on screen while the rows move under them. Without
|
|
45
|
+
* it the table is as tall as its rows and the page is what scrolls, which is
|
|
46
|
+
* the right answer for the handful of rows this component is for.
|
|
47
|
+
*/
|
|
48
|
+
maxHeight?: string;
|
|
49
|
+
className?: string;
|
|
50
|
+
}
|
|
51
|
+
export declare const Table: ({ headers, data, caption, captionHidden, emptyMessage, actionButton, maxHeight, className, }: TableProps) => import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Table: the operator's table, on the elements a table is made of.
|
|
3
|
+
*
|
|
4
|
+
* ONE TABLE REGISTER FOR THE WHOLE PRODUCT, and this is it: a micro-label
|
|
5
|
+
* header on the panel's own ground, hairline rows, cells at the compact step,
|
|
6
|
+
* and a row as tall as the row token every other list in the system uses. The
|
|
7
|
+
* DataTable below carries the same values; the two differ in what they DO
|
|
8
|
+
* (sorting, columns, pagination), never in what a row looks like.
|
|
9
|
+
*/
|
|
10
|
+
.crewlet-table {
|
|
11
|
+
display: flex;
|
|
12
|
+
flex-direction: column;
|
|
13
|
+
flex: 1;
|
|
14
|
+
min-width: 0;
|
|
15
|
+
/*
|
|
16
|
+
* THE FRAME IS THE TABLE'S, NOT THE SCROLLER'S. The boundary and the radius
|
|
17
|
+
* used to sit on the scroller inside, which put the action row underneath
|
|
18
|
+
* the frame as a loose word on the page, and let a sideways scroll carry the
|
|
19
|
+
* table's own edge out of view. Here the frame clips a header band that runs
|
|
20
|
+
* to the edge and a foot that is fenced from the rows above it, which is the
|
|
21
|
+
* flush panel every table on the dashboard sits in.
|
|
22
|
+
*/
|
|
23
|
+
background: var(--color-surface-subtle);
|
|
24
|
+
border: 1px solid var(--color-border-default);
|
|
25
|
+
border-radius: var(--radius-lg);
|
|
26
|
+
overflow: hidden;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
.crewlet-table__container {
|
|
30
|
+
/* The overflow is a safety net for a cell that cannot wrap (a long token, a
|
|
31
|
+
hash); the fixed layout below is what keeps a table inside the width it is
|
|
32
|
+
given. A `maxHeight` turns this into the vertical scroller the sticky
|
|
33
|
+
header needs, which is the only way a long table keeps its column names. */
|
|
34
|
+
overflow-x: auto;
|
|
35
|
+
overflow-y: var(--crewlet-table-overflow-y, visible);
|
|
36
|
+
max-height: var(--crewlet-table-max-height, none);
|
|
37
|
+
overscroll-behavior-x: contain;
|
|
38
|
+
flex: 1;
|
|
39
|
+
min-width: 0;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
.crewlet-table__table {
|
|
43
|
+
width: 100%;
|
|
44
|
+
border-collapse: collapse;
|
|
45
|
+
/* The compact step is the table's own: a cell is scanned down a column
|
|
46
|
+
rather than read as a sentence, and 13px is where a row of them still
|
|
47
|
+
lines up against the 36px row token. */
|
|
48
|
+
font-size: var(--font-size-compact);
|
|
49
|
+
/* Fixed layout is the equal-width columns the grid drew, and it also stops
|
|
50
|
+
one long cell dragging the whole table sideways. */
|
|
51
|
+
table-layout: fixed;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
.crewlet-table__caption {
|
|
55
|
+
padding: var(--spacing-3) var(--spacing-3) 0;
|
|
56
|
+
text-align: left;
|
|
57
|
+
font-size: var(--font-size-compact);
|
|
58
|
+
color: var(--color-text-tertiary);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/*
|
|
62
|
+
* THE HEADER IS A MICRO-LABEL, NOT A ROW OF WORDS. A column name is read once,
|
|
63
|
+
* at a glance, to find the column; drawn at the body step in the row's own ink
|
|
64
|
+
* it competed with the values under it for the same attention. The uppercase
|
|
65
|
+
* step at the tertiary ink is the register every other label of its kind in
|
|
66
|
+
* the system takes, and it is measured on the panel ground it is painted on.
|
|
67
|
+
*
|
|
68
|
+
* Sticky, so a table given a height keeps its column names while its rows
|
|
69
|
+
* scroll past. It costs nothing when there is no vertical scroller, and it is
|
|
70
|
+
* the difference between a long table that can be read and one that cannot.
|
|
71
|
+
*/
|
|
72
|
+
.crewlet-table__table th {
|
|
73
|
+
position: sticky;
|
|
74
|
+
top: 0;
|
|
75
|
+
z-index: var(--z-index-sticky);
|
|
76
|
+
padding: var(--spacing-2) var(--spacing-3);
|
|
77
|
+
text-align: left;
|
|
78
|
+
font-size: var(--font-size-2xs);
|
|
79
|
+
font-weight: var(--font-weight-medium);
|
|
80
|
+
letter-spacing: var(--font-letter-spacing-wide);
|
|
81
|
+
text-transform: uppercase;
|
|
82
|
+
color: var(--color-text-tertiary);
|
|
83
|
+
white-space: nowrap;
|
|
84
|
+
background: var(--color-surface-subtle);
|
|
85
|
+
border-bottom: 1px solid var(--color-border-default);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
.crewlet-table__table td {
|
|
89
|
+
padding: var(--spacing-2) var(--spacing-3);
|
|
90
|
+
color: var(--color-text-primary);
|
|
91
|
+
border-bottom: 1px solid var(--color-border-default);
|
|
92
|
+
vertical-align: middle;
|
|
93
|
+
/* The row token, so a table lines up with every other list in a product and
|
|
94
|
+
a cell holding one word is as tall as a cell holding an avatar. */
|
|
95
|
+
height: var(--size-row-md);
|
|
96
|
+
overflow-wrap: anywhere;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
.crewlet-table__table tbody tr:last-child td {
|
|
100
|
+
border-bottom: none;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/*
|
|
104
|
+
* NO HOVER ON A ROW THAT DOES NOTHING. Every row used to light up under the
|
|
105
|
+
* pointer, which is an affordance: it says the row can be pressed, and in this
|
|
106
|
+
* table no row can. A tint that promises a press nothing answers is worse than
|
|
107
|
+
* no tint at all. DataTable carries the hover, because there a row really is
|
|
108
|
+
* a control.
|
|
109
|
+
*/
|
|
110
|
+
|
|
111
|
+
.crewlet-table__empty {
|
|
112
|
+
padding: var(--spacing-7) var(--spacing-3);
|
|
113
|
+
text-align: center;
|
|
114
|
+
color: var(--color-text-tertiary);
|
|
115
|
+
font-size: var(--font-size-compact);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/*
|
|
119
|
+
* THE FOOT IS INSIDE THE FRAME, fenced by its own rule: it is a row of the
|
|
120
|
+
* panel rather than a word floating under it. It sits outside the scroller, so
|
|
121
|
+
* a table scrolled sideways does not carry its own footer off the screen.
|
|
122
|
+
*/
|
|
123
|
+
.crewlet-table__action-btn {
|
|
124
|
+
width: 100%;
|
|
125
|
+
padding: var(--spacing-2) var(--spacing-3);
|
|
126
|
+
background: none;
|
|
127
|
+
border: none;
|
|
128
|
+
border-top: 1px solid var(--color-border-default);
|
|
129
|
+
color: var(--color-brand-accent-ink);
|
|
130
|
+
font-family: inherit;
|
|
131
|
+
font-size: var(--font-size-xs);
|
|
132
|
+
font-weight: var(--font-weight-medium);
|
|
133
|
+
cursor: pointer;
|
|
134
|
+
text-align: center;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
.crewlet-table__action-text {
|
|
138
|
+
display: inline-block;
|
|
139
|
+
padding: var(--spacing-1) var(--spacing-3);
|
|
140
|
+
border-radius: var(--radius-sm);
|
|
141
|
+
transition: background var(--motion-duration-fast) var(--motion-easing-default);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
.crewlet-table__action-btn:hover .crewlet-table__action-text {
|
|
145
|
+
background: var(--color-surface-hover);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/* Inset, because the foot sits on the frame's own clipped bottom edge and an
|
|
149
|
+
outset ring is cut away by it. */
|
|
150
|
+
.crewlet-table__action-btn:focus-visible {
|
|
151
|
+
outline: 2px solid var(--color-focus);
|
|
152
|
+
outline-offset: var(--size-focus-ring-inset-offset);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
@media (prefers-reduced-motion: reduce) {
|
|
156
|
+
.crewlet-table__action-text {
|
|
157
|
+
transition: none;
|
|
158
|
+
}
|
|
159
|
+
}
|