@crewlethq/ui 0.2.0 → 0.4.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 +164 -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-RLR254LD.css +450 -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 +119 -0
- package/dist/CodeBlock/index.d.ts +3 -0
- package/dist/CodeBlock/index.js +7 -0
- package/dist/CodeBlock-GYNJ2HI6.css +188 -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 +64 -0
- package/dist/Copyable/Copyable.d.ts +42 -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 +100 -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 +126 -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 +101 -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 +153 -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 +67 -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-2HQR4U4D.js +143 -0
- package/dist/chunk-2PRH365R.js +74 -0
- package/dist/chunk-2ZQMA2WB.js +57 -0
- package/dist/chunk-34VGEDVV.js +907 -0
- package/dist/chunk-3CZ7XAVY.js +139 -0
- package/dist/chunk-3EYF6HKB.js +135 -0
- package/dist/chunk-3QRYCPXQ.js +116 -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-5KPQ6D7N.js +54 -0
- package/dist/chunk-5SDBMKUO.js +297 -0
- package/dist/chunk-5VNUYO76.js +62 -0
- package/dist/chunk-5WS6L6FA.js +114 -0
- package/dist/chunk-6ZFVFA56.js +108 -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-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-D35VTV2Z.js +106 -0
- package/dist/chunk-DD5BBGBE.js +162 -0
- package/dist/chunk-EN6K2IFA.js +256 -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-GTOUGQQK.js +147 -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-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-LWKJQTOM.js +77 -0
- package/dist/chunk-MNAXYY3R.js +215 -0
- package/dist/chunk-NDCATSW7.js +229 -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-OFHBK7RI.js +498 -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-QEUY3A5P.js +186 -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-UG46QBLT.js +325 -0
- package/dist/chunk-UOGSZKLT.js +134 -0
- package/dist/chunk-V2XMNLMS.js +52 -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-WOYYD2YR.js +823 -0
- package/dist/chunk-WQX73TWF.js +1652 -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-YODNNSZL.js +63 -0
- package/dist/chunk-ZCR6YGQ4.js +1 -0
- package/dist/chunk-ZFATEERP.js +144 -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 +14898 -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 +82 -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,97 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
export type TabsVariant = 'pill' | 'underline';
|
|
3
|
+
export type TabsSize = 'sm' | 'md';
|
|
4
|
+
export interface TabsItem {
|
|
5
|
+
/** Stable identity: the value reported, and half of the tab's id. */
|
|
6
|
+
value: string;
|
|
7
|
+
/** Visible label text or node. */
|
|
8
|
+
label: ReactNode;
|
|
9
|
+
/** A glyph drawn before the label. A component, not a name. */
|
|
10
|
+
icon?: ReactNode;
|
|
11
|
+
/** How many things are behind this tab. Drawn as a Count beside the label. */
|
|
12
|
+
count?: number | null;
|
|
13
|
+
disabled?: boolean;
|
|
14
|
+
/** Any extra props the consumer's renderItem needs to read. */
|
|
15
|
+
[key: string]: unknown;
|
|
16
|
+
}
|
|
17
|
+
export interface TabsRenderItemProps {
|
|
18
|
+
item: TabsItem;
|
|
19
|
+
/**
|
|
20
|
+
* Base and state-modifier class for the tab. Apply it to the element you
|
|
21
|
+
* render so the variant chrome stays consistent. In router mode the
|
|
22
|
+
* consumer appends its own active modifier, because the URL is the source
|
|
23
|
+
* of truth and the slider is measured from whichever child carries it.
|
|
24
|
+
*/
|
|
25
|
+
className: string;
|
|
26
|
+
/** True when `value === item.value`. */
|
|
27
|
+
isActive: boolean;
|
|
28
|
+
/** Calls onValueChange?.(item.value) when invoked. */
|
|
29
|
+
onSelect: () => void;
|
|
30
|
+
/** Pre-rendered icon, label and count nodes for the tab body. */
|
|
31
|
+
children: ReactNode;
|
|
32
|
+
}
|
|
33
|
+
export interface TabsProps {
|
|
34
|
+
items: TabsItem[];
|
|
35
|
+
variant?: TabsVariant;
|
|
36
|
+
size?: TabsSize;
|
|
37
|
+
/** Names the row. A tab row with no name is announced as "tab list" alone. */
|
|
38
|
+
ariaLabel?: string;
|
|
39
|
+
className?: string;
|
|
40
|
+
/** Currently active item value. */
|
|
41
|
+
value?: string;
|
|
42
|
+
/** Fires when a tab is chosen. */
|
|
43
|
+
onValueChange?: (value: string) => void;
|
|
44
|
+
/**
|
|
45
|
+
* The id of the [TabPanel] this row controls. With it every tab carries a
|
|
46
|
+
* stable id and `aria-controls`, which is what lets a screen reader move
|
|
47
|
+
* from a tab to the section it opens.
|
|
48
|
+
*/
|
|
49
|
+
panelId?: string;
|
|
50
|
+
/**
|
|
51
|
+
* Render each item yourself, for a row of ROUTER LINKS. The root becomes a
|
|
52
|
+
* `nav` and nothing carries a tab role: a link that navigates is not a tab,
|
|
53
|
+
* and a screen reader told otherwise looks for a panel that never arrives.
|
|
54
|
+
*/
|
|
55
|
+
renderItem?: (props: TabsRenderItemProps) => ReactNode;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* The id of the tab that labels a tab panel, so a panel and the row that
|
|
59
|
+
* controls it agree on it without passing ids between them.
|
|
60
|
+
*/
|
|
61
|
+
export declare function tabId(panelId: string, value: string): string;
|
|
62
|
+
/**
|
|
63
|
+
* The in-page sections a screen owns, as the ARIA tabs pattern with MANUAL
|
|
64
|
+
* activation.
|
|
65
|
+
*
|
|
66
|
+
* WHAT CHANGED. Every tab was a tab stop and no arrow key did anything, so a
|
|
67
|
+
* keyboard user walked an eight-tab row with eight presses of Tab and a
|
|
68
|
+
* screen reader was told a list of eight independent buttons. It is one stop
|
|
69
|
+
* now: the arrows, Home and End move focus along the row and Enter or Space
|
|
70
|
+
* selects, which a real button already turns into its own click.
|
|
71
|
+
*
|
|
72
|
+
* SELECTION DOES NOT FOLLOW FOCUS. A tab is a section, and in this product a
|
|
73
|
+
* section pushes a history entry: a row that selected on every arrow press
|
|
74
|
+
* left one entry per keystroke for Back to walk through.
|
|
75
|
+
*
|
|
76
|
+
* AND NO `aria-current`. A tab says which one is chosen with
|
|
77
|
+
* `aria-selected`; `aria-current="page"` on top of it told a screen reader
|
|
78
|
+
* the tab was the page the reader was on, which is what a navigation link
|
|
79
|
+
* says. In router mode that IS what the items are, so the root becomes a
|
|
80
|
+
* `nav`, the tab roles go, and the consumer's own link carries the state.
|
|
81
|
+
*/
|
|
82
|
+
export declare function Tabs({ items, variant, size, ariaLabel, className, value, onValueChange, panelId, renderItem, }: TabsProps): import("react/jsx-runtime").JSX.Element;
|
|
83
|
+
export interface TabPanelProps {
|
|
84
|
+
/** The same id the row was given as `panelId`. */
|
|
85
|
+
id: string;
|
|
86
|
+
/** The selected tab's value, which is what labels the panel. */
|
|
87
|
+
value: string;
|
|
88
|
+
children?: ReactNode;
|
|
89
|
+
className?: string;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* The region a tab row controls, labelled by whichever tab is selected.
|
|
93
|
+
*
|
|
94
|
+
* It keeps the layout it sits in, so wrapping a screen's sections in one
|
|
95
|
+
* changes nothing a reader can see and everything a screen reader hears.
|
|
96
|
+
*/
|
|
97
|
+
export declare function TabPanel({ id, value, children, className }: TabPanelProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { type KeyboardEvent } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* Which item in a row holds its ONE TAB STOP.
|
|
4
|
+
*
|
|
5
|
+
* The selected one, unless it is disabled: a browser refuses a disabled
|
|
6
|
+
* button focus, so a row whose chosen option is disabled (a tab for a section
|
|
7
|
+
* a plan does not include, a lens with nothing to draw) had its only stop on
|
|
8
|
+
* an element Tab skips, and the keyboard could not enter the row at all. It
|
|
9
|
+
* falls back to the first option that can take focus, and to none where every
|
|
10
|
+
* option is disabled, which is a row with nothing to reach.
|
|
11
|
+
*
|
|
12
|
+
* `selected` is where the stop BELONGS rather than what is chosen: under
|
|
13
|
+
* manual activation that is where focus last was, which is not the chosen
|
|
14
|
+
* option (see [RovingOptions.followFocus]).
|
|
15
|
+
*/
|
|
16
|
+
export declare function tabStop(items: readonly {
|
|
17
|
+
disabled?: boolean | undefined;
|
|
18
|
+
}[], selected: number): number;
|
|
19
|
+
/**
|
|
20
|
+
* How a row places its ONE TAB STOP while focus moves inside it.
|
|
21
|
+
*/
|
|
22
|
+
export interface RovingOptions {
|
|
23
|
+
/**
|
|
24
|
+
* Whether the stop FOLLOWS FOCUS rather than staying on the selection.
|
|
25
|
+
*
|
|
26
|
+
* Off by default, which is the only honest answer for a row that SELECTS AS
|
|
27
|
+
* FOCUS MOVES: there the two are the same element, so the stop needs no
|
|
28
|
+
* state of its own and an arrow key costs the render it was going to cost
|
|
29
|
+
* anyway.
|
|
30
|
+
*
|
|
31
|
+
* On is what a row whose arrows do NOT select has to have. With the stop
|
|
32
|
+
* left on the selection, a reader who arrows three options along without
|
|
33
|
+
* committing, Tabs out of the row and Tabs back is dropped on the option
|
|
34
|
+
* they started from rather than the one they left, and every move they made
|
|
35
|
+
* is gone with nothing said about it. It is half of manual activation, not
|
|
36
|
+
* a refinement of it.
|
|
37
|
+
*/
|
|
38
|
+
followFocus?: boolean | undefined;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Roving focus over a row of buttons: ONE TAB STOP for the row, the arrows to
|
|
42
|
+
* move inside it.
|
|
43
|
+
*
|
|
44
|
+
* WHY ONE STOP. A row of eight lenses is one control, not eight: Tab should
|
|
45
|
+
* pass it, not walk it. That is the ARIA pattern for a tablist, a radio group
|
|
46
|
+
* and a toolbar alike, and it is what makes the arrows mean anything.
|
|
47
|
+
*
|
|
48
|
+
* `select` is called on a move only where the row SELECTS AS FOCUS MOVES (a
|
|
49
|
+
* radio group, whose choice is a setting). A tab row leaves selection to
|
|
50
|
+
* Enter and Space, which a real button already turns into its own click: a
|
|
51
|
+
* tab is a section that pushes a history entry, and a row that selected on
|
|
52
|
+
* every arrow press left one entry per keystroke for Back to walk through.
|
|
53
|
+
*
|
|
54
|
+
* THE TWO ARGUMENTS GO TOGETHER. A caller that passes no `select` is a row
|
|
55
|
+
* under manual activation and wants `followFocus`, because the stop and the
|
|
56
|
+
* selection have come apart; a caller that passes one wants neither.
|
|
57
|
+
*
|
|
58
|
+
* A DISABLED BUTTON IS STEPPED OVER rather than focused: a browser refuses it
|
|
59
|
+
* focus, so a move that lands on one drops focus on the page body and the
|
|
60
|
+
* next arrow press does nothing at all.
|
|
61
|
+
*/
|
|
62
|
+
export declare function useRoving(count: number, select: ((index: number) => void) | null, { followFocus }?: RovingOptions): {
|
|
63
|
+
buttons: import("react").RefObject<(HTMLButtonElement | null)[]>;
|
|
64
|
+
onKeyDown: (event: KeyboardEvent<HTMLElement>, vertical: boolean) => void;
|
|
65
|
+
onFocusAt: (index: number) => void;
|
|
66
|
+
focused: number | null;
|
|
67
|
+
};
|
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* The pill register: Tabs and SegmentedControl.
|
|
3
|
+
*
|
|
4
|
+
* One item layout under two chromes. `underline` is a flat strip on a
|
|
5
|
+
* baseline with a sliding accent bar, for the sections of a screen;
|
|
6
|
+
* `pill` is a segmented chip row inside a tinted container, for a lens,
|
|
7
|
+
* a setting or a compact switch. SegmentedControl draws with the same
|
|
8
|
+
* classes, because a row of choices should not look like two different
|
|
9
|
+
* controls depending on which component a screen reached for.
|
|
10
|
+
*
|
|
11
|
+
* Every step comes from a token, the active chip included: the shadow it used
|
|
12
|
+
* to lift with was a black literal, invisible on a dark panel and a smudge on
|
|
13
|
+
* a light one.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
.crewlet-tabs {
|
|
17
|
+
display: inline-flex;
|
|
18
|
+
align-items: center;
|
|
19
|
+
font-family: inherit;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/* ─── Underline (sliding accent bar) ──────────────────────────── */
|
|
23
|
+
/*
|
|
24
|
+
* THE ROW SCROLLS RATHER THAN OVERFLOWING THE PAGE. A section can own more
|
|
25
|
+
* tabs than a narrow window has room for, and a row that does not scroll
|
|
26
|
+
* pushes the whole screen sideways instead. The scrollbar itself is hidden:
|
|
27
|
+
* it would sit on the baseline the tabs and their bar are drawn on, and the
|
|
28
|
+
* row is reachable by the arrow keys either way.
|
|
29
|
+
*/
|
|
30
|
+
.crewlet-tabs--underline {
|
|
31
|
+
display: flex;
|
|
32
|
+
gap: var(--spacing-2);
|
|
33
|
+
border-bottom: 1px solid var(--color-border-default);
|
|
34
|
+
position: relative;
|
|
35
|
+
width: 100%;
|
|
36
|
+
overflow-x: auto;
|
|
37
|
+
scrollbar-width: none;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
.crewlet-tabs--underline::-webkit-scrollbar {
|
|
41
|
+
display: none;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
.crewlet-tabs--underline::after {
|
|
45
|
+
/*
|
|
46
|
+
* The sliding bar, positioned against the row from two custom properties
|
|
47
|
+
* the component writes after measuring the active tab. A width of 0 keeps
|
|
48
|
+
* it invisible until the first measurement lands, so nothing needs an
|
|
49
|
+
* opacity flag.
|
|
50
|
+
*/
|
|
51
|
+
content: '';
|
|
52
|
+
position: absolute;
|
|
53
|
+
bottom: -1px;
|
|
54
|
+
/*
|
|
55
|
+
* Under the LABEL, not under the tab's box: the measurement is the button,
|
|
56
|
+
* which carries the small side pad an inset focus ring needs, and a bar
|
|
57
|
+
* that ran the width of that pad read as a wider word than the one above
|
|
58
|
+
* it.
|
|
59
|
+
*/
|
|
60
|
+
left: calc(var(--crewlet-tabs-slider-left, 0px) + var(--spacing-1));
|
|
61
|
+
width: max(0px, calc(var(--crewlet-tabs-slider-width, 0px) - var(--spacing-1) * 2));
|
|
62
|
+
height: 2px;
|
|
63
|
+
background: var(--color-brand-accent);
|
|
64
|
+
border-radius: var(--radius-pill) var(--radius-pill) 0 0;
|
|
65
|
+
transition:
|
|
66
|
+
left var(--motion-duration-base) var(--motion-easing-default),
|
|
67
|
+
width var(--motion-duration-base) var(--motion-easing-default);
|
|
68
|
+
pointer-events: none;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/* ─── Pill (segmented control) ────────────────────────────────── */
|
|
72
|
+
/*
|
|
73
|
+
* A WELL WITH CHIPS IN IT, not a panel with buttons in it. The container is
|
|
74
|
+
* the inset surface and carries no boundary of its own: the chip that is on
|
|
75
|
+
* is what the reader looks for, and it is found by being the one thing lifted
|
|
76
|
+
* off the well rather than by a border around the whole set.
|
|
77
|
+
*
|
|
78
|
+
* The inset is 2px, which is smaller than the scale's first step on purpose:
|
|
79
|
+
* it is the gap a chip needs to read as sitting IN the well, and a 4px one
|
|
80
|
+
* makes the row a control step taller than the button beside it.
|
|
81
|
+
*/
|
|
82
|
+
.crewlet-tabs--pill {
|
|
83
|
+
--crewlet-tabs-pill-inset: 2px;
|
|
84
|
+
|
|
85
|
+
gap: var(--crewlet-tabs-pill-inset);
|
|
86
|
+
padding: var(--crewlet-tabs-pill-inset);
|
|
87
|
+
background: var(--color-surface-inset);
|
|
88
|
+
border-radius: var(--radius-md);
|
|
89
|
+
width: fit-content;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/* ─── Tab item (shared) ───────────────────────────────────────── */
|
|
93
|
+
/*
|
|
94
|
+
* A TARGET IS TWO DIMENSIONS. The height has been floored since this row was
|
|
95
|
+
* first drawn and the width was floored by nothing at all: a tab is side
|
|
96
|
+
* padding around whatever it holds, so a one-character mark or a bare glyph
|
|
97
|
+
* made a target as narrow as its own content. Measured on the engine's rail,
|
|
98
|
+
* the density row's chips stood 23.1px, 26px and 22.2px wide at the reader's
|
|
99
|
+
* default density and 20.2px, 23.1px and 19.3px at the compact one, where the
|
|
100
|
+
* floor a finger needs is 24px in BOTH directions.
|
|
101
|
+
*
|
|
102
|
+
* It is on the shared item rather than on the segmented option, because the
|
|
103
|
+
* underline chrome is the same padding around the same content and has the
|
|
104
|
+
* same hole. A tab whose label is wider than the floor is untouched.
|
|
105
|
+
*/
|
|
106
|
+
.crewlet-tabs__tab {
|
|
107
|
+
display: inline-flex;
|
|
108
|
+
align-items: center;
|
|
109
|
+
justify-content: center;
|
|
110
|
+
gap: var(--spacing-1);
|
|
111
|
+
/* Never under the 24px target floor, at any density. */
|
|
112
|
+
min-height: var(--size-control-sm);
|
|
113
|
+
min-width: var(--size-target-min);
|
|
114
|
+
background: transparent;
|
|
115
|
+
border: 0;
|
|
116
|
+
color: var(--color-text-tertiary);
|
|
117
|
+
font: inherit;
|
|
118
|
+
font-size: var(--font-size-compact);
|
|
119
|
+
font-weight: var(--font-weight-medium);
|
|
120
|
+
text-decoration: none;
|
|
121
|
+
cursor: pointer;
|
|
122
|
+
white-space: nowrap;
|
|
123
|
+
transition:
|
|
124
|
+
background-color var(--motion-duration-fast) var(--motion-easing-default),
|
|
125
|
+
color var(--motion-duration-fast) var(--motion-easing-default),
|
|
126
|
+
box-shadow var(--motion-duration-fast) var(--motion-easing-default);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/*
|
|
130
|
+
* Underline tabs sit flush on the baseline and the slider is the indicator,
|
|
131
|
+
* so the label carries no chrome of its own: its only side pad is the room
|
|
132
|
+
* the focus ring is drawn in, and the labels stand one scale step apart.
|
|
133
|
+
*/
|
|
134
|
+
.crewlet-tabs--underline .crewlet-tabs__tab {
|
|
135
|
+
gap: var(--spacing-2);
|
|
136
|
+
padding: var(--spacing-2) var(--spacing-1);
|
|
137
|
+
font-size: var(--font-size-compact);
|
|
138
|
+
position: relative;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
.crewlet-tabs--underline.crewlet-tabs--sm .crewlet-tabs__tab {
|
|
142
|
+
font-size: var(--font-size-xs);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/*
|
|
146
|
+
* THE RING IS DRAWN INSIDE THE TAB. The row is a scroller, so an outset ring
|
|
147
|
+
* on any tab in it is clipped by the row's own box, top and bottom, and on
|
|
148
|
+
* the first and last tabs at the ends as well. This is what
|
|
149
|
+
* --size-focus-ring-inset-offset exists for.
|
|
150
|
+
*/
|
|
151
|
+
.crewlet-tabs--underline .crewlet-tabs__tab:focus-visible {
|
|
152
|
+
outline-offset: var(--size-focus-ring-inset-offset);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/*
|
|
156
|
+
* A CHIP STANDS SHORTER THAN THE CONTROL IT SITS BESIDE, and it is the row
|
|
157
|
+
* that has to match: the well adds its inset above and below every chip, so a
|
|
158
|
+
* chip at a full control step makes the whole segmented row taller than the
|
|
159
|
+
* button next to it. Six pixels off the md step and four off the sm one is
|
|
160
|
+
* what the engine's own segmented row has always drawn.
|
|
161
|
+
*
|
|
162
|
+
* AND THE FLOOR IS TAKEN AGAIN AFTER THE SUBTRACTION. --size-control-sm
|
|
163
|
+
* carries a 24px floor of its own, but subtracting from a step subtracts from
|
|
164
|
+
* its floor too: at compact density `calc(var(--size-control-sm) - 4px)` is
|
|
165
|
+
* 20px, under the target a finger can hit. max() against --size-target-min
|
|
166
|
+
* leaves the value exactly 24px at density 1 and reachable at every other.
|
|
167
|
+
*
|
|
168
|
+
* The corner is one hairline tighter than the well around it rather than a
|
|
169
|
+
* step of its own, which is what reads as a chip sitting IN the well.
|
|
170
|
+
*
|
|
171
|
+
* AND THE CONTENT IS CENTRED IN THE CHIP. It was aligned to the start, for a
|
|
172
|
+
* chip stretched on a grid track, which is a case the pill chrome's own
|
|
173
|
+
* `width: fit-content` container cannot produce: the row is sized to its
|
|
174
|
+
* chips, so no chip is ever wider than its content except by the target floor
|
|
175
|
+
* above. Under that floor start alignment is a visible defect rather than an
|
|
176
|
+
* invisible preference: a 12px glyph in a 24px chip sat 4px from one edge and
|
|
177
|
+
* 8px from the other, and a one-letter mark sat further off still. The
|
|
178
|
+
* stretched row that wanted a common inner edge is the segmented CARD row,
|
|
179
|
+
* and that mode aligns its own options to the start.
|
|
180
|
+
*/
|
|
181
|
+
.crewlet-tabs--pill .crewlet-tabs__tab {
|
|
182
|
+
min-height: max(var(--size-target-min), calc(var(--size-control-md) - 6px));
|
|
183
|
+
padding: 0 var(--spacing-3);
|
|
184
|
+
border-radius: var(--radius-chip);
|
|
185
|
+
font-size: var(--font-size-xs);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/*
|
|
189
|
+
* THE SMALL CHIP IS THE QUIET ONE. It is the register the rail's foot wears,
|
|
190
|
+
* where a theme row and a density row sit beside a status pill and are read
|
|
191
|
+
* past rather than read, so its side pad is the scale's first step rather
|
|
192
|
+
* than its second and its glyph is the step under the label register's.
|
|
193
|
+
*
|
|
194
|
+
* The height does not follow: at the reader's default density this chip is
|
|
195
|
+
* already exactly --size-target-min, so a shorter one would be a target a
|
|
196
|
+
* finger misses. The whole reduction comes out of the width, where the pad is
|
|
197
|
+
* spent, and the floor above catches what is left.
|
|
198
|
+
*/
|
|
199
|
+
.crewlet-tabs--pill.crewlet-tabs--sm .crewlet-tabs__tab {
|
|
200
|
+
min-height: max(var(--size-target-min), calc(var(--size-control-sm) - 4px));
|
|
201
|
+
padding: 0 var(--spacing-1);
|
|
202
|
+
font-size: var(--font-size-2xs);
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
.crewlet-tabs--pill.crewlet-tabs--sm .crewlet-tabs__icon {
|
|
206
|
+
font-size: var(--font-size-xs);
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/*
|
|
210
|
+
* A HOVER IS A BRIGHTENING, NOT A FILL, in both chromes. The fill is what the
|
|
211
|
+
* chip that is on wears, and a hovered neighbour wearing a lighter version of
|
|
212
|
+
* it is a second answer that looks half-chosen; on the underline row the
|
|
213
|
+
* whole indicator is the bar, so a tinted box under a hovered label is a
|
|
214
|
+
* second indicator saying something else.
|
|
215
|
+
*/
|
|
216
|
+
.crewlet-tabs__tab:hover:not(.is-disabled):not(.is-active) {
|
|
217
|
+
color: var(--color-text-primary);
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
.crewlet-tabs__tab.is-active {
|
|
221
|
+
color: var(--color-text-primary);
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
.crewlet-tabs--pill .crewlet-tabs__tab.is-active {
|
|
225
|
+
background: var(--color-surface-subtle);
|
|
226
|
+
box-shadow: var(--shadow-xs);
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
/*
|
|
230
|
+
* THE RING IS AN OUTLINE. Forced-colors mode drops every box-shadow and keeps
|
|
231
|
+
* outlines, so a ring drawn as a shadow disappears for exactly the readers who
|
|
232
|
+
* need one most.
|
|
233
|
+
*/
|
|
234
|
+
.crewlet-tabs__tab:focus-visible {
|
|
235
|
+
outline: 2px solid var(--color-focus);
|
|
236
|
+
outline-offset: 2px;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
.crewlet-tabs__tab.is-disabled,
|
|
240
|
+
.crewlet-tabs__tab:disabled {
|
|
241
|
+
opacity: 0.55;
|
|
242
|
+
cursor: not-allowed;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
/* A glyph beside a label is the label's own size, so the two sit on one line
|
|
246
|
+
rather than the mark outweighing the word. */
|
|
247
|
+
.crewlet-tabs__icon {
|
|
248
|
+
display: inline-flex;
|
|
249
|
+
font-size: var(--font-size-sm);
|
|
250
|
+
line-height: 1;
|
|
251
|
+
flex-shrink: 0;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
.crewlet-tabs__label {
|
|
255
|
+
display: inline-flex;
|
|
256
|
+
align-items: center;
|
|
257
|
+
min-width: 0;
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
/* The panel a row controls keeps the layout it sits in. */
|
|
261
|
+
.crewlet-tab-panel {
|
|
262
|
+
display: contents;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
/*
|
|
266
|
+
* The slider ARRIVES rather than travels, and a chip changes without a fade.
|
|
267
|
+
* The indicator still moves; what stops is the animation between the two
|
|
268
|
+
* places it can be.
|
|
269
|
+
*/
|
|
270
|
+
@media (prefers-reduced-motion: reduce) {
|
|
271
|
+
.crewlet-tabs--underline::after,
|
|
272
|
+
.crewlet-tabs__tab {
|
|
273
|
+
transition: none;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import type { HTMLAttributes, MouseEvent, ReactNode } from 'react';
|
|
2
|
+
import type { PhaseTone, Tone } from '../utils/tone.js';
|
|
3
|
+
/**
|
|
4
|
+
* Which vocabulary a tag speaks: a state, or a phase. Both, because the same
|
|
5
|
+
* pill draws "failed" on the Model screen and "execute" on the turn beside it,
|
|
6
|
+
* and a second component for the second vocabulary would be one recipe spelled
|
|
7
|
+
* twice.
|
|
8
|
+
*/
|
|
9
|
+
export type TagVariant = Tone | PhaseTone;
|
|
10
|
+
/**
|
|
11
|
+
* How much room the pill takes. The engine draws ONE badge and spends its
|
|
12
|
+
* variation on tone, so these are three heights of that badge rather than
|
|
13
|
+
* three different marks: `sm` is the engine's own geometry and the default,
|
|
14
|
+
* `xs` a denser mark for a packed row, `md` a small control's height for a
|
|
15
|
+
* toolbar.
|
|
16
|
+
*/
|
|
17
|
+
export type TagSize = 'xs' | 'sm' | 'md';
|
|
18
|
+
/**
|
|
19
|
+
* The sizes a tag that ACTS may take.
|
|
20
|
+
*
|
|
21
|
+
* `xs` is an 18px pill, and a pointer target under 24px fails WCAG 2.2, so the
|
|
22
|
+
* interactive form starts at `sm`. It is refused by the type rather than
|
|
23
|
+
* documented, because a filter toggle that is 6px too short is a defect
|
|
24
|
+
* nothing else in the build would ever report.
|
|
25
|
+
*/
|
|
26
|
+
export type InteractiveTagSize = Exclude<TagSize, 'xs'>;
|
|
27
|
+
export type TagAppearance = 'soft' | 'outline';
|
|
28
|
+
interface TagLook {
|
|
29
|
+
/** The state or the phase this tag names. Neutral by default. */
|
|
30
|
+
variant?: TagVariant | undefined;
|
|
31
|
+
/** A tinted fill, or a boundary over the surface beneath. */
|
|
32
|
+
appearance?: TagAppearance | undefined;
|
|
33
|
+
/** Drawn before the label. A glyph component, not a name. */
|
|
34
|
+
leadingIcon?: ReactNode;
|
|
35
|
+
/**
|
|
36
|
+
* Draws the variant's mark before the label. For a list where several tags
|
|
37
|
+
* of different states sit in one column and the mark is what a reader scans.
|
|
38
|
+
*/
|
|
39
|
+
dot?: boolean | undefined;
|
|
40
|
+
/** A number after the label, in the tag's own ink. */
|
|
41
|
+
count?: number | string | undefined;
|
|
42
|
+
/** A machine value: an id, a CIDR range, a revision. */
|
|
43
|
+
monospace?: boolean | undefined;
|
|
44
|
+
/**
|
|
45
|
+
* Fade the tag in on mount.
|
|
46
|
+
*
|
|
47
|
+
* OFF BY DEFAULT, which is the change from 0.2.0. Tags mount in their
|
|
48
|
+
* hundreds on a data push, and a list that animates every arrival is a list
|
|
49
|
+
* nobody can read while it is arriving. Guarded by reduced motion either way.
|
|
50
|
+
*/
|
|
51
|
+
animateIn?: boolean | undefined;
|
|
52
|
+
}
|
|
53
|
+
/** A tag that only labels: it takes no press and nothing removes it. */
|
|
54
|
+
export interface StaticTagProps extends TagLook, Omit<HTMLAttributes<HTMLSpanElement>, 'onClick'> {
|
|
55
|
+
size?: TagSize | undefined;
|
|
56
|
+
onClick?: undefined;
|
|
57
|
+
onRemove?: undefined;
|
|
58
|
+
pressed?: undefined;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* A tag that acts: a filter that toggles, a chip somebody can take off, or
|
|
62
|
+
* both.
|
|
63
|
+
*
|
|
64
|
+
* WITH BOTH, IT IS TWO CONTROLS. The press and the remove are siblings inside
|
|
65
|
+
* the pill rather than one nested in the other: a `<button>` inside a
|
|
66
|
+
* `<button>` is invalid markup, and what a browser and a screen reader make of
|
|
67
|
+
* it is one control the inner half is unreachable from.
|
|
68
|
+
*/
|
|
69
|
+
export interface InteractiveTagProps extends TagLook, Omit<HTMLAttributes<HTMLElement>, 'onClick'> {
|
|
70
|
+
size?: InteractiveTagSize | undefined;
|
|
71
|
+
/** Makes the tag a real button, announced with its pressed state. */
|
|
72
|
+
onClick?: ((event: MouseEvent<HTMLButtonElement>) => void) | undefined;
|
|
73
|
+
/** For a tag that toggles a filter, whether that filter is on. */
|
|
74
|
+
pressed?: boolean | undefined;
|
|
75
|
+
/** Renders a remove control that fires this. */
|
|
76
|
+
onRemove?: (() => void) | undefined;
|
|
77
|
+
/** Names the remove control. */
|
|
78
|
+
removeAriaLabel?: string | undefined;
|
|
79
|
+
}
|
|
80
|
+
export type TagProps = StaticTagProps | InteractiveTagProps;
|
|
81
|
+
/**
|
|
82
|
+
* A small pill that names a state, a phase or a value.
|
|
83
|
+
*
|
|
84
|
+
* COLOUR IS NEVER THE ONLY CARRIER. Every tag renders its label, in every
|
|
85
|
+
* variant, so a reader who cannot separate the warning hue from the danger one
|
|
86
|
+
* still reads two different words. `dot` adds the shape half for a column
|
|
87
|
+
* where the mark is what gets scanned; the word stays either way.
|
|
88
|
+
*
|
|
89
|
+
* THE FILL AND THE INK ARE DIFFERENT STEPS. A tag is the tone's `soft` tint
|
|
90
|
+
* under the tone's `ink`, never the solid fill with a label on it: the fill
|
|
91
|
+
* step is measured as a MARK, at 3:1, and putting text on it would put that
|
|
92
|
+
* text under the 4.5:1 it has to clear. 0.2.0 spelled five dark-theme literals
|
|
93
|
+
* here instead, which measured between 1.14:1 and 1.58:1 on a light page.
|
|
94
|
+
*
|
|
95
|
+
* ITS LINE BOX IS FIXED. The height comes from the size step rather than from
|
|
96
|
+
* the content, so a cell that holds a tag on one row and nothing on the next
|
|
97
|
+
* is the same height on both and a table does not ripple as states arrive.
|
|
98
|
+
*
|
|
99
|
+
* A TAG THAT ACTS IS FOUR PIXELS TALLER THAN ONE THAT LABELS, and that is the
|
|
100
|
+
* one place this pill departs from the engine's badge. The engine draws its
|
|
101
|
+
* actionable badge at the inert one's 20px, which is a pointer target under
|
|
102
|
+
* the 24px WCAG 2.2 accepts; everything else about the two, the tint, the ink,
|
|
103
|
+
* the radius, the type and the padding, is identical, so a row still reads as
|
|
104
|
+
* one set.
|
|
105
|
+
*/
|
|
106
|
+
export declare function Tag(props: TagProps): import("react/jsx-runtime").JSX.Element;
|
|
107
|
+
export {};
|