@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,61 @@
|
|
|
1
|
+
/* A keycap: the key's name on a small raised tile. */
|
|
2
|
+
.crewlet-kbd {
|
|
3
|
+
display: inline-flex;
|
|
4
|
+
align-items: center;
|
|
5
|
+
gap: var(--spacing-1);
|
|
6
|
+
min-width: 18px;
|
|
7
|
+
padding: 1px var(--spacing-1);
|
|
8
|
+
border-radius: var(--radius-xs);
|
|
9
|
+
border: 1px solid var(--color-border-default);
|
|
10
|
+
/* The thicker bottom edge is the whole of the "cap": one border, drawn
|
|
11
|
+
heavier on one side, reads as a key without a shadow that forced-colors
|
|
12
|
+
mode would drop. */
|
|
13
|
+
border-bottom-width: 2px;
|
|
14
|
+
background: var(--color-surface-inset);
|
|
15
|
+
/*
|
|
16
|
+
* The MONO face, not the surrounding one. A keycap is a literal: the reader
|
|
17
|
+
* is being told which character is printed on a key, and a proportional face
|
|
18
|
+
* draws `l`, `I` and `1` as three widths of the same mark.
|
|
19
|
+
*/
|
|
20
|
+
font-family: var(--font-family-mono);
|
|
21
|
+
font-variant-ligatures: none;
|
|
22
|
+
font-size: var(--font-size-2xs);
|
|
23
|
+
/* THE DOCUMENT'S OWN LEADING, because a cap is drawn INSIDE a line of text
|
|
24
|
+
and not beside it: a hint at the end of a search field, a key named in a
|
|
25
|
+
sentence, a shortcut in a menu row. Tightened it stood a pixel under the
|
|
26
|
+
line it sits in and the row it was in wobbled by that pixel wherever a
|
|
27
|
+
cap appeared and wherever one did not. */
|
|
28
|
+
line-height: var(--font-line-height-normal);
|
|
29
|
+
color: var(--color-text-tertiary);
|
|
30
|
+
white-space: nowrap;
|
|
31
|
+
vertical-align: middle;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/*
|
|
35
|
+
* A quieter cap: FLATTER, not fainter. The opacity this replaces multiplied
|
|
36
|
+
* the ink as well as the frame, and 0.7 of a text step measures 3.43:1 on the
|
|
37
|
+
* panel, so a hint printing the key a reader is told to press was the one
|
|
38
|
+
* thing on the row they could not read. The cap gives up its raised edge and
|
|
39
|
+
* its fill instead, and keeps the tertiary ink, which is measured at 4.5:1 on
|
|
40
|
+
* every surface the package paints on.
|
|
41
|
+
*/
|
|
42
|
+
.crewlet-kbd--subtle {
|
|
43
|
+
border-bottom-width: 1px;
|
|
44
|
+
background: none;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/*
|
|
48
|
+
* A whole shortcut: the caps drawn together, and one sentence read instead of
|
|
49
|
+
* them. The caps are hidden from assistive technology by the component; this
|
|
50
|
+
* only lays them out.
|
|
51
|
+
*/
|
|
52
|
+
.crewlet-kbd-combo {
|
|
53
|
+
display: inline-flex;
|
|
54
|
+
align-items: center;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
.crewlet-kbd-keys {
|
|
58
|
+
display: inline-flex;
|
|
59
|
+
align-items: center;
|
|
60
|
+
gap: var(--spacing-1);
|
|
61
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
export interface LayerHostProps {
|
|
3
|
+
children?: ReactNode;
|
|
4
|
+
className?: string | undefined;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Provides a portal target for every overlay rendered inside it.
|
|
8
|
+
*
|
|
9
|
+
* The target is a sibling AFTER the children, covering the host's own box, so
|
|
10
|
+
* a surface placed against `getBoundingClientRect()` is placed against the
|
|
11
|
+
* container rather than the window. It takes no pointer events itself, so the
|
|
12
|
+
* content beneath stays live while nothing is open; each overlay inside takes
|
|
13
|
+
* them back for its own panel.
|
|
14
|
+
*/
|
|
15
|
+
export declare function LayerHost({ children, className }: LayerHostProps): import("react/jsx-runtime").JSX.Element;
|
|
16
|
+
/**
|
|
17
|
+
* The element an overlay rendered here should portal into.
|
|
18
|
+
*
|
|
19
|
+
* `null` before the host's own element is measured and on the server, which is
|
|
20
|
+
* what a caller renders nothing for; everywhere else it is the nearest host,
|
|
21
|
+
* or the document body.
|
|
22
|
+
*/
|
|
23
|
+
export declare function useLayerContainer(): HTMLElement | null;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import './Layer.css';
|
|
2
|
+
export { focusables, isComposing, isModalLayerOpen, layerCount, useBodyScrollLock, useModalLayer, usePopupLayer, } from './stack.js';
|
|
3
|
+
export type { DismissReason, LayerKind, ModalLayer, ModalLayerOptions, PopupLayer, PopupLayerOptions, } from './stack.js';
|
|
4
|
+
export { LAYER_GAP, LAYER_REPOSITION_EVENT, outsideBounds, placePopup, viewportBounds } from './place.js';
|
|
5
|
+
export type { Placement, PlacementRect, PlacementSize } from './place.js';
|
|
6
|
+
export { LayerHost, useLayerContainer } from './LayerHost.js';
|
|
7
|
+
export type { LayerHostProps } from './LayerHost.js';
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { LAYER_GAP, LAYER_REPOSITION_EVENT, LayerHost, outsideBounds, placePopup, useLayerContainer, viewportBounds } from '../chunk-7RPGY3JE.js';
|
|
2
|
+
export { focusables, isComposing, isModalLayerOpen, layerCount, useBodyScrollLock, useModalLayer, usePopupLayer } from '../chunk-ITHXJHBB.js';
|
|
3
|
+
import '../chunk-ODEQTPFM.js';
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Where a floating surface goes beside the thing it belongs to.
|
|
3
|
+
*
|
|
4
|
+
* KEPT PURE, and separate from every component that calls it, because none of
|
|
5
|
+
* it can be observed in jsdom: there is no layout, so a menu that placed
|
|
6
|
+
* itself off the bottom of a canvas or lost its last item past an edge nobody
|
|
7
|
+
* can scroll would pass any component suite. As arithmetic over numbers it has
|
|
8
|
+
* a suite of its own, and each component is left with the wiring.
|
|
9
|
+
*
|
|
10
|
+
* All four values are in the SAME coordinate space, whichever one the caller
|
|
11
|
+
* picks: viewport coordinates for a surface positioned against the window,
|
|
12
|
+
* container coordinates for one inside a `LayerHost`. The function does no
|
|
13
|
+
* conversion, so a caller that mixes the two gets an answer in neither.
|
|
14
|
+
*/
|
|
15
|
+
/** The slice of a DOMRect these functions read, so a plain object works too. */
|
|
16
|
+
export interface PlacementRect {
|
|
17
|
+
x: number;
|
|
18
|
+
y: number;
|
|
19
|
+
width: number;
|
|
20
|
+
height: number;
|
|
21
|
+
}
|
|
22
|
+
export interface PlacementSize {
|
|
23
|
+
width: number;
|
|
24
|
+
height: number;
|
|
25
|
+
}
|
|
26
|
+
export interface Placement {
|
|
27
|
+
left: number;
|
|
28
|
+
top: number;
|
|
29
|
+
/** Which side of the anchor the surface ended up on. */
|
|
30
|
+
side: 'below' | 'above';
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* The event a layer receives when the content beneath it moves.
|
|
34
|
+
*
|
|
35
|
+
* A surface positioned from an anchor's rectangle has to follow that anchor
|
|
36
|
+
* through a pan, a zoom or a scroll, and listening on the layer it was
|
|
37
|
+
* rendered into is the whole contract: it never needs to know what kind of
|
|
38
|
+
* surface drew the layer.
|
|
39
|
+
*/
|
|
40
|
+
export declare const LAYER_REPOSITION_EVENT = "crewlet:viewchange";
|
|
41
|
+
/** Space between a surface and its anchor, and between a surface and an edge. */
|
|
42
|
+
export declare const LAYER_GAP = 4;
|
|
43
|
+
/**
|
|
44
|
+
* Where a surface of `size` goes beside `anchor`, inside `bounds`.
|
|
45
|
+
*
|
|
46
|
+
* On the preferred side of the anchor and aligned to its start; on the other
|
|
47
|
+
* side when the preferred one has not room and the other has more; and slid
|
|
48
|
+
* back inside the bounds on both axes, so a menu opened from a card at the
|
|
49
|
+
* edge of a canvas is never cut off by the edge it opened near. Where neither
|
|
50
|
+
* side has room for the whole surface it overlaps its anchor rather than
|
|
51
|
+
* losing its last items past an edge nobody can scroll; one larger than the
|
|
52
|
+
* bounds keeps its START in view, which is where its first item is.
|
|
53
|
+
*
|
|
54
|
+
* `prefer` exists because the caller sometimes knows better than the geometry:
|
|
55
|
+
* a picker at the foot of a form opens upward by design, and a panel that
|
|
56
|
+
* flipped only when it ran out of room would jump between sides as the page
|
|
57
|
+
* scrolled.
|
|
58
|
+
*/
|
|
59
|
+
export declare function placePopup(anchor: PlacementRect, size: PlacementSize, bounds: PlacementRect, gap?: number, prefer?: 'below' | 'above'): Placement;
|
|
60
|
+
/** The rectangle of the window itself, for a surface with no layer host. */
|
|
61
|
+
export declare function viewportBounds(): PlacementRect;
|
|
62
|
+
/** Whether an anchor has been carried entirely outside its bounds. */
|
|
63
|
+
export declare function outsideBounds(anchor: PlacementRect, bounds: PlacementRect): boolean;
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The layer stack: which open surface a key press or a press outside belongs to.
|
|
3
|
+
*
|
|
4
|
+
* WHY IT EXISTS. Every overlay in this package used to put its own Escape
|
|
5
|
+
* listener on the document, so one press closed a Select, the Modal around it
|
|
6
|
+
* and the page's own dialog together; a backdrop press closed two layers at
|
|
7
|
+
* once; and nothing trapped Tab, so a keyboard reader walked straight out of a
|
|
8
|
+
* dialog into the page behind its veil. Two shells getting those rules right
|
|
9
|
+
* separately is how the two come to disagree.
|
|
10
|
+
*
|
|
11
|
+
* THE RULES IT KEEPS.
|
|
12
|
+
*
|
|
13
|
+
* - ONE STACK holding modals (a dialog, a sheet) and popups (a menu, a
|
|
14
|
+
* listbox). Only the TOPMOST entry handles Escape and a press outside, so an
|
|
15
|
+
* open menu inside a dialog closes first, then the dialog.
|
|
16
|
+
* - ORDER IS OPENING ORDER, taken when the surface renders open rather than
|
|
17
|
+
* when its effect runs: React runs a child's effects before its parent's, so
|
|
18
|
+
* a dialog mounted inside a sheet in the same commit would otherwise
|
|
19
|
+
* register first and end up beneath the sheet it sits on.
|
|
20
|
+
* - A MODAL TRAPS TAB. Focus cycles inside the topmost modal, and Tab from
|
|
21
|
+
* anywhere outside it comes back in. There is no exception for a modal the
|
|
22
|
+
* stack does not know: a hand-rolled one raised over a sheet would have its
|
|
23
|
+
* Tab pulled back into the sheet and its Escape taken by the sheet beneath
|
|
24
|
+
* it, which is why every overlay in this package is on the stack.
|
|
25
|
+
* - FOCUS GOES IN ON OPEN, unless something inside already took it (a field
|
|
26
|
+
* with `autoFocus`), and GOES BACK ON CLOSE to whatever held it when the
|
|
27
|
+
* modal first rendered. That is captured during RENDER on purpose: by the
|
|
28
|
+
* time an effect runs, `autoFocus` has already moved focus into the modal,
|
|
29
|
+
* and a capture taken then would restore focus to an element that no longer
|
|
30
|
+
* exists. When that element has gone because it sat in a modal that closed
|
|
31
|
+
* as this one opened, focus goes where that modal would have sent it; when
|
|
32
|
+
* it has gone from a modal that is still open, to that modal's panel, never
|
|
33
|
+
* behind its veil (`returnChain`). A modal that closes BENEATH another
|
|
34
|
+
* surface still open above it returns nothing: focus is in that surface.
|
|
35
|
+
* - A VEIL CLOSES ONLY ITS OWN MODAL, and only when the press lands on the
|
|
36
|
+
* veil itself. The decision is taken on `pointerdown`, before any surface
|
|
37
|
+
* closes, so the press that dismisses a menu is never also read as a press
|
|
38
|
+
* on the veil beneath it. The CLOSE waits for that press's `click`: a veil
|
|
39
|
+
* removed on `pointerdown` is gone before a tap's compatibility mouse events
|
|
40
|
+
* are hit-tested, so the click a finger ends with would land on whatever the
|
|
41
|
+
* veil was covering, such as a Delete button behind a dialog.
|
|
42
|
+
* - A CONTROL THAT CONSUMES ESCAPE KEEPS IT. A completion list that closes on
|
|
43
|
+
* Escape calls `preventDefault` or stops propagation, and the stack leaves
|
|
44
|
+
* that press alone. So does an input method mid-composition (`isComposing`):
|
|
45
|
+
* its Escape abandons a word, and its Tab is its own.
|
|
46
|
+
* - A SURFACE'S Z-INDEX IS ITS DEPTH IN THE STACK, inside a band of its own
|
|
47
|
+
* (`--z-index-layer-base` to `--z-index-layer-max`), never a counter that
|
|
48
|
+
* only grows. The token scale leaves two free steps above a modal (popover,
|
|
49
|
+
* then toast), so a counter would put the second dialog of a session at the
|
|
50
|
+
* popover level, the third at the toast level, and everything after that
|
|
51
|
+
* permanently above the toast. A toast reports what a write inside a dialog
|
|
52
|
+
* did; it has to paint above it.
|
|
53
|
+
*
|
|
54
|
+
* WHAT IT DOES NOT OWN: markup, copy, and whether closing is allowed right
|
|
55
|
+
* now. A modal mid-write passes `dismissable: false`.
|
|
56
|
+
*
|
|
57
|
+
* ONE STACK PER DOCUMENT, EVEN WITH TWO COPIES OF THE PACKAGE. It lives under
|
|
58
|
+
* `Symbol.for('crewlet.layer-stack')` on `globalThis`, because a consumer that
|
|
59
|
+
* ends up with two versions of @crewlethq/ui installed would otherwise get two
|
|
60
|
+
* module-level arrays, and a dialog on one of them would not know about a menu
|
|
61
|
+
* on the other: Escape would close both, and Tab would leave.
|
|
62
|
+
*/
|
|
63
|
+
export type LayerKind = 'modal' | 'popup';
|
|
64
|
+
/** Why a surface is being dismissed. */
|
|
65
|
+
export type DismissReason = 'escape' | 'outside' | 'tab';
|
|
66
|
+
/**
|
|
67
|
+
* Whether this press belongs to an input method's composition rather than to
|
|
68
|
+
* the page.
|
|
69
|
+
*
|
|
70
|
+
* Somebody typing Japanese, Chinese or Korean builds each word in a
|
|
71
|
+
* composition: the arrows walk the candidates, Enter accepts one and Escape
|
|
72
|
+
* abandons it. Those presses still reach the page as `keydown`, so a list that
|
|
73
|
+
* read that Enter as "take the highlighted option", or a modal that read that
|
|
74
|
+
* Escape as "close", acted on a key the reader pressed for the input method.
|
|
75
|
+
*
|
|
76
|
+
* Browsers flag such a press with `isComposing`. Safari delivers the Enter
|
|
77
|
+
* that ENDS a composition after it has already cleared that flag, marked only
|
|
78
|
+
* by the legacy key code 229, so both are read. One definition, because a
|
|
79
|
+
* primitive checking only the flag would act on that Enter in Safari while the
|
|
80
|
+
* others did not.
|
|
81
|
+
*/
|
|
82
|
+
export declare function isComposing(event: {
|
|
83
|
+
isComposing?: boolean;
|
|
84
|
+
keyCode?: number;
|
|
85
|
+
nativeEvent?: unknown;
|
|
86
|
+
}): boolean;
|
|
87
|
+
/**
|
|
88
|
+
* What a keyboard user can Tab to inside `root`, in document order.
|
|
89
|
+
*
|
|
90
|
+
* Exported because a surface choosing where focus starts needs the same answer
|
|
91
|
+
* the trap uses; two selectors would disagree about a disabled button.
|
|
92
|
+
*/
|
|
93
|
+
export declare function focusables(root: Element): HTMLElement[];
|
|
94
|
+
/**
|
|
95
|
+
* Whether a modal is open, which makes everything behind it inert.
|
|
96
|
+
*
|
|
97
|
+
* For a shortcut that belongs to the page rather than to any surface, such as
|
|
98
|
+
* a shell's search. `aria-modal` tells a screen reader that nothing behind the
|
|
99
|
+
* dialog can be reached, and a page shortcut that fires through it breaks that
|
|
100
|
+
* in the most expensive way: search opened over a dialog navigates, and the
|
|
101
|
+
* navigation unmounts the dialog, a write still in flight included. A popup
|
|
102
|
+
* does not count: it is not modal, and the page's keys still reach past a
|
|
103
|
+
* menu.
|
|
104
|
+
*/
|
|
105
|
+
export declare function isModalLayerOpen(): boolean;
|
|
106
|
+
export interface ModalLayerOptions {
|
|
107
|
+
onClose: () => void;
|
|
108
|
+
/** False while a request is in flight: Escape and the veil stop closing. */
|
|
109
|
+
dismissable?: boolean | undefined;
|
|
110
|
+
/**
|
|
111
|
+
* Where focus starts when nothing inside has taken it, if not the first
|
|
112
|
+
* control. A sheet's first control is its Close button, and an editor that
|
|
113
|
+
* opens with focus on Close has made closing the first thing it asks.
|
|
114
|
+
*/
|
|
115
|
+
initialFocus?: (() => HTMLElement | null) | undefined;
|
|
116
|
+
}
|
|
117
|
+
export interface ModalLayer {
|
|
118
|
+
/** The dialog element: focus goes into it and Tab stays in it. */
|
|
119
|
+
panelRef: (el: HTMLElement | null) => void;
|
|
120
|
+
/** The veil behind it: a press on the veil itself closes the modal. */
|
|
121
|
+
veilRef: (el: HTMLElement | null) => void;
|
|
122
|
+
/** This surface's place in the band, to put on the veil. */
|
|
123
|
+
zIndex: number;
|
|
124
|
+
/** Whether this surface is the one a key press would reach now. */
|
|
125
|
+
isTopmost: boolean;
|
|
126
|
+
}
|
|
127
|
+
/** A modal surface: a dialog or a sheet. Mount it only while it is open. */
|
|
128
|
+
export declare function useModalLayer({ onClose, dismissable, initialFocus }: ModalLayerOptions): ModalLayer;
|
|
129
|
+
export interface PopupLayerOptions {
|
|
130
|
+
open: boolean;
|
|
131
|
+
/** Called on Escape and on a press outside the popup and its `inside` elements. */
|
|
132
|
+
onDismiss: (reason: DismissReason) => void;
|
|
133
|
+
}
|
|
134
|
+
export interface PopupLayer {
|
|
135
|
+
/** The popup surface. */
|
|
136
|
+
panelRef: (el: HTMLElement | null) => void;
|
|
137
|
+
/** An element a press on does not dismiss, such as the button that toggles it. */
|
|
138
|
+
insideRef: (el: HTMLElement | null) => void;
|
|
139
|
+
zIndex: number;
|
|
140
|
+
isTopmost: boolean;
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* A non-modal popup on the same stack: a menu, a listbox. It traps nothing,
|
|
144
|
+
* and it closes before anything beneath it.
|
|
145
|
+
*/
|
|
146
|
+
export declare function usePopupLayer({ open, onDismiss }: PopupLayerOptions): PopupLayer;
|
|
147
|
+
/**
|
|
148
|
+
* Holding the document's scroll while a surface is up, counted.
|
|
149
|
+
*
|
|
150
|
+
* REF COUNTED, because two modals can be open at once and each writes
|
|
151
|
+
* `document.body.style.overflow` on the way in and gives it back on the way
|
|
152
|
+
* out. Written as two independent effects, the inner one's cleanup restores
|
|
153
|
+
* the scroll while the outer modal is still up, and the page behind a dialog
|
|
154
|
+
* starts scrolling under it. The FIRST lock records what to give back, so a
|
|
155
|
+
* host page that had its own overflow keeps it.
|
|
156
|
+
*/
|
|
157
|
+
export declare function useBodyScrollLock(active: boolean): void;
|
|
158
|
+
/** How many surfaces are on the stack. Exported for the package's own suites. */
|
|
159
|
+
export declare function layerCount(): number;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* The portal target a LayerHost provides.
|
|
3
|
+
*
|
|
4
|
+
* It covers its container so a surface placed against its rectangle is placed
|
|
5
|
+
* against the container, and it is inert until something is drawn in it: an
|
|
6
|
+
* empty host over a canvas must not swallow the drag that pans the canvas.
|
|
7
|
+
* Each overlay inside takes pointer events back for its own panel.
|
|
8
|
+
*
|
|
9
|
+
* Its container establishes the positioning context. A host whose parent is
|
|
10
|
+
* static covers the nearest positioned ancestor instead, which is the
|
|
11
|
+
* viewport in the common case and is still a usable bound.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
.crewlet-layer-host {
|
|
15
|
+
position: absolute;
|
|
16
|
+
inset: 0;
|
|
17
|
+
pointer-events: none;
|
|
18
|
+
z-index: var(--z-index-layer-base);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
.crewlet-layer-host > * {
|
|
22
|
+
pointer-events: auto;
|
|
23
|
+
}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The four layout primitives every screen is assembled from.
|
|
3
|
+
*
|
|
4
|
+
* WHY THEY EXIST. A product that has no Stack writes `display: flex` in a
|
|
5
|
+
* hundred places, and each one spends its own gap: the dashboard this set
|
|
6
|
+
* comes from carried 87 inline `style` props, 56 of them holding a literal (a
|
|
7
|
+
* gap of 2, a max width of 380, a left pad of depth times 12). Every one of
|
|
8
|
+
* those is a value nobody can find again and nothing can hold to a scale.
|
|
9
|
+
*
|
|
10
|
+
* So a gap is a STEP on the spacing scale rather than a number, which is what
|
|
11
|
+
* makes a density setting reach it: every step is `calc(Npx * var(--density))`
|
|
12
|
+
* in the token layer, so a compact reader gets a compact page without a single
|
|
13
|
+
* component knowing that density exists.
|
|
14
|
+
*
|
|
15
|
+
* WHAT THEY ARE NOT. They are not a style prop, and they are not a grid
|
|
16
|
+
* system. There is no `padding`, no `margin` and no colour here, because a
|
|
17
|
+
* component that takes those stops being a layout and starts being a second
|
|
18
|
+
* way to write CSS, with none of the review a stylesheet gets.
|
|
19
|
+
*/
|
|
20
|
+
import type { ElementType, HTMLAttributes, ReactNode } from 'react';
|
|
21
|
+
/**
|
|
22
|
+
* A step on the spacing scale, never a number of pixels.
|
|
23
|
+
*
|
|
24
|
+
* The union is what stops `gap={7.5}` and `gap={300}`: a value off the scale
|
|
25
|
+
* is the whole defect these primitives exist to remove.
|
|
26
|
+
*/
|
|
27
|
+
export type SpacingStep = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11;
|
|
28
|
+
/** Cross-axis placement, in the words a reader of the markup can check. */
|
|
29
|
+
export type LayoutAlign = 'start' | 'center' | 'end' | 'baseline' | 'stretch';
|
|
30
|
+
/** Main-axis placement. */
|
|
31
|
+
export type LayoutJustify = 'start' | 'center' | 'end' | 'between' | 'around';
|
|
32
|
+
/**
|
|
33
|
+
* What both flex primitives take.
|
|
34
|
+
*
|
|
35
|
+
* Exported under both names, as every other component in the package exports
|
|
36
|
+
* the props it takes: a screen that wraps a Stack in a component of its own
|
|
37
|
+
* has to be able to name what it is passing on.
|
|
38
|
+
*/
|
|
39
|
+
export interface StackProps extends HTMLAttributes<HTMLElement> {
|
|
40
|
+
/** The gap between children, as a spacing step. */
|
|
41
|
+
gap?: SpacingStep | undefined;
|
|
42
|
+
align?: LayoutAlign | undefined;
|
|
43
|
+
justify?: LayoutJustify | undefined;
|
|
44
|
+
/** Lets the children wrap onto another line. */
|
|
45
|
+
wrap?: boolean | undefined;
|
|
46
|
+
/** The element to draw. A div by default; a `ul`, a `header`, a `form`. */
|
|
47
|
+
as?: ElementType | undefined;
|
|
48
|
+
children?: ReactNode;
|
|
49
|
+
}
|
|
50
|
+
/** An Inline takes the same props; only the axis and the default align differ. */
|
|
51
|
+
export type InlineProps = StackProps;
|
|
52
|
+
/**
|
|
53
|
+
* A vertical run of children with one gap between them.
|
|
54
|
+
*
|
|
55
|
+
* `min-width: 0` is part of the primitive rather than something each caller
|
|
56
|
+
* remembers: a flex child's minimum size is its content, so one long token in
|
|
57
|
+
* one row pushes the whole column wider than its parent and the page grows a
|
|
58
|
+
* horizontal scrollbar nobody asked for.
|
|
59
|
+
*/
|
|
60
|
+
export declare function Stack({ gap, align, justify, wrap, as: Tag, className, children, ...rest }: StackProps): import("react/jsx-runtime").JSX.Element;
|
|
61
|
+
/**
|
|
62
|
+
* A horizontal run of children, centred on the cross axis.
|
|
63
|
+
*
|
|
64
|
+
* Centred by default because that is what a row of controls, chips and labels
|
|
65
|
+
* wants; a row whose items are different heights and must line up at the top
|
|
66
|
+
* passes `align="start"`.
|
|
67
|
+
*/
|
|
68
|
+
export declare function Inline({ gap, align, justify, wrap, as: Tag, className, children, ...rest }: StackProps): import("react/jsx-runtime").JSX.Element;
|
|
69
|
+
export type SpacerProps = HTMLAttributes<HTMLSpanElement>;
|
|
70
|
+
/**
|
|
71
|
+
* The flexible space that pushes what follows it to the far end of a row.
|
|
72
|
+
*
|
|
73
|
+
* DECORATION, so it is hidden from assistive technology: it holds no content,
|
|
74
|
+
* and an empty element in the accessibility tree is one more thing to walk
|
|
75
|
+
* past. A row that wants its trailing group pushed over uses this rather than
|
|
76
|
+
* `margin-left: auto` on a child, because the child then carries a rule about
|
|
77
|
+
* where it happens to sit in one particular row.
|
|
78
|
+
*/
|
|
79
|
+
export declare function Spacer({ className, ...rest }: SpacerProps): import("react/jsx-runtime").JSX.Element;
|
|
80
|
+
/**
|
|
81
|
+
* The smallest column a card may be drawn at, as a named step.
|
|
82
|
+
*
|
|
83
|
+
* Three steps, taken from the three the dashboard measured its own cards at:
|
|
84
|
+
* `sm` for a stat tile, `md` for a card with a sentence in it, `lg` for one
|
|
85
|
+
* holding a table or a chart.
|
|
86
|
+
*/
|
|
87
|
+
export type AutoGridMin = 'sm' | 'md' | 'lg';
|
|
88
|
+
export interface AutoGridProps extends HTMLAttributes<HTMLDivElement> {
|
|
89
|
+
/** The narrowest a track may be before the row drops a column. */
|
|
90
|
+
min?: AutoGridMin | undefined;
|
|
91
|
+
gap?: SpacingStep | undefined;
|
|
92
|
+
children?: ReactNode;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Cards laid out at a minimum readable width, wrapping without a breakpoint.
|
|
96
|
+
*
|
|
97
|
+
* `auto-fill` with `minmax(min(step, 100%), 1fr)` is the whole of it. The
|
|
98
|
+
* inner `min()` is what stops the track being wider than the grid itself on a
|
|
99
|
+
* narrow screen, which is how a card grid gives a phone a horizontal
|
|
100
|
+
* scrollbar; `auto-fill` rather than `auto-fit` is what keeps a row that is
|
|
101
|
+
* short of a full set of cards drawing cards at the width the full row would
|
|
102
|
+
* give them, instead of stretching them over the collapsed tracks.
|
|
103
|
+
*/
|
|
104
|
+
export declare function AutoGrid({ min, gap, className, children, ...rest }: AutoGridProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Stack, Inline, Spacer and AutoGrid.
|
|
3
|
+
*
|
|
4
|
+
* The gap is one custom property with a token default, so a caller that passes
|
|
5
|
+
* no step still gets a value off the scale rather than the browser's zero, and
|
|
6
|
+
* the alignment classes are shared by both flex primitives: an align is an
|
|
7
|
+
* align whichever axis it is read on.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
.crewlet-stack,
|
|
11
|
+
.crewlet-inline {
|
|
12
|
+
display: flex;
|
|
13
|
+
--crewlet-layout-gap: var(--spacing-2);
|
|
14
|
+
gap: var(--crewlet-layout-gap);
|
|
15
|
+
/* A flex child's minimum size is its content. Without this one long
|
|
16
|
+
identifier in one row widens the whole column past its parent. */
|
|
17
|
+
min-width: 0;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
.crewlet-stack {
|
|
21
|
+
flex-direction: column;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
.crewlet-inline {
|
|
25
|
+
flex-direction: row;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/*
|
|
29
|
+
* A GRID OF CARDS KEEPS ITS TRACKS. `auto-fill` lays down every track the row
|
|
30
|
+
* has room for and leaves the empty ones empty; `auto-fit`, which this was,
|
|
31
|
+
* COLLAPSES them, so the last row of a list, and every list that is short of a
|
|
32
|
+
* full row, stretches its cards across the whole width. One seat in a company
|
|
33
|
+
* drew a single card 1109px wide where its neighbours in a full row are 365.
|
|
34
|
+
* The inner min() is what keeps a track from being wider than the grid on a
|
|
35
|
+
* narrow screen, which is how a card row gives a phone a sideways scroll.
|
|
36
|
+
*
|
|
37
|
+
* The three track minimums are component variables rather than tokens: the
|
|
38
|
+
* token layer has no grid-track family, and a card's narrowest readable column
|
|
39
|
+
* is a property of the card rather than of the scale. An application that
|
|
40
|
+
* needs a fourth step sets --crewlet-auto-grid-min on its own wrapper.
|
|
41
|
+
*
|
|
42
|
+
* DECLARED BEFORE THE GAP CLASSES, and that order is load-bearing: a container
|
|
43
|
+
* and a --gap-N modifier are both one class, so the later rule in this file
|
|
44
|
+
* wins. Below them, `<AutoGrid gap={3}>` drew its own 16px default and the
|
|
45
|
+
* caller's step did nothing at all.
|
|
46
|
+
*/
|
|
47
|
+
.crewlet-auto-grid {
|
|
48
|
+
display: grid;
|
|
49
|
+
--crewlet-layout-gap: var(--spacing-4);
|
|
50
|
+
--crewlet-auto-grid-min: 260px;
|
|
51
|
+
gap: var(--crewlet-layout-gap);
|
|
52
|
+
grid-template-columns: repeat(auto-fill, minmax(min(var(--crewlet-auto-grid-min), 100%), 1fr));
|
|
53
|
+
min-width: 0;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
.crewlet-auto-grid--sm {
|
|
57
|
+
--crewlet-auto-grid-min: 180px;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
.crewlet-auto-grid--md {
|
|
61
|
+
--crewlet-auto-grid-min: 260px;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
.crewlet-auto-grid--lg {
|
|
65
|
+
--crewlet-auto-grid-min: 360px;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/*
|
|
69
|
+
* One gap class per step on the scale, shared by all three containers: a gap
|
|
70
|
+
* is the same distance whichever direction the children run in. Written out
|
|
71
|
+
* rather than composed in JavaScript so every token name a component can read
|
|
72
|
+
* appears literally in a stylesheet, which is what the custom property check
|
|
73
|
+
* verifies against the tokens the build emits.
|
|
74
|
+
*/
|
|
75
|
+
.crewlet-layout--gap-0 {
|
|
76
|
+
--crewlet-layout-gap: var(--spacing-0);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
.crewlet-layout--gap-1 {
|
|
80
|
+
--crewlet-layout-gap: var(--spacing-1);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
.crewlet-layout--gap-2 {
|
|
84
|
+
--crewlet-layout-gap: var(--spacing-2);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
.crewlet-layout--gap-3 {
|
|
88
|
+
--crewlet-layout-gap: var(--spacing-3);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
.crewlet-layout--gap-4 {
|
|
92
|
+
--crewlet-layout-gap: var(--spacing-4);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
.crewlet-layout--gap-5 {
|
|
96
|
+
--crewlet-layout-gap: var(--spacing-5);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
.crewlet-layout--gap-6 {
|
|
100
|
+
--crewlet-layout-gap: var(--spacing-6);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
.crewlet-layout--gap-7 {
|
|
104
|
+
--crewlet-layout-gap: var(--spacing-7);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
.crewlet-layout--gap-8 {
|
|
108
|
+
--crewlet-layout-gap: var(--spacing-8);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
.crewlet-layout--gap-9 {
|
|
112
|
+
--crewlet-layout-gap: var(--spacing-9);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
.crewlet-layout--gap-10 {
|
|
116
|
+
--crewlet-layout-gap: var(--spacing-10);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
.crewlet-layout--gap-11 {
|
|
120
|
+
--crewlet-layout-gap: var(--spacing-11);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
.crewlet-layout--align-start {
|
|
124
|
+
align-items: flex-start;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
.crewlet-layout--align-center {
|
|
128
|
+
align-items: center;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
.crewlet-layout--align-end {
|
|
132
|
+
align-items: flex-end;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
.crewlet-layout--align-baseline {
|
|
136
|
+
align-items: baseline;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
.crewlet-layout--align-stretch {
|
|
140
|
+
align-items: stretch;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
.crewlet-layout--justify-start {
|
|
144
|
+
justify-content: flex-start;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
.crewlet-layout--justify-center {
|
|
148
|
+
justify-content: center;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
.crewlet-layout--justify-end {
|
|
152
|
+
justify-content: flex-end;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
.crewlet-layout--justify-between {
|
|
156
|
+
justify-content: space-between;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
.crewlet-layout--justify-around {
|
|
160
|
+
justify-content: space-around;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
.crewlet-layout--wrap {
|
|
164
|
+
flex-wrap: wrap;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
.crewlet-spacer {
|
|
168
|
+
flex: 1 1 auto;
|
|
169
|
+
min-width: 0;
|
|
170
|
+
}
|
|
171
|
+
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { type AnchorHTMLAttributes, type ReactNode } from 'react';
|
|
2
|
+
export type LinkVariant =
|
|
3
|
+
/** A navigation: the accent ink, underlined on hover. */
|
|
4
|
+
'default'
|
|
5
|
+
/** An identity a reader clicks through to: neutral ink, underlined on hover. */
|
|
6
|
+
| 'subtle';
|
|
7
|
+
export type LinkSize = 'body' | 'caption';
|
|
8
|
+
export interface LinkProps extends AnchorHTMLAttributes<HTMLAnchorElement> {
|
|
9
|
+
variant?: LinkVariant | undefined;
|
|
10
|
+
size?: LinkSize | undefined;
|
|
11
|
+
/**
|
|
12
|
+
* Leaves the application. Opens a tab, withholds the referrer and the
|
|
13
|
+
* opener, draws the mark that says so, and reads the sentence below.
|
|
14
|
+
*/
|
|
15
|
+
external?: boolean | undefined;
|
|
16
|
+
/** Read after the link's own words when `external`. */
|
|
17
|
+
newTabLabel?: string | undefined;
|
|
18
|
+
/**
|
|
19
|
+
* A whole row is the target. It fills its line, draws no underline, and the
|
|
20
|
+
* focus ring is drawn inside the row rather than around the words.
|
|
21
|
+
*/
|
|
22
|
+
block?: boolean | undefined;
|
|
23
|
+
/**
|
|
24
|
+
* Render the single child element with these classes instead of an anchor,
|
|
25
|
+
* to put this look on a router's own Link while keeping its navigation.
|
|
26
|
+
*/
|
|
27
|
+
asChild?: boolean | undefined;
|
|
28
|
+
children?: ReactNode;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* A link that reads as one.
|
|
32
|
+
*
|
|
33
|
+
* WHY IT IS NOT A `Text` WITH A COLOUR. The registers used to be utility
|
|
34
|
+
* classes, and a caption-sized link spelled with the caption class took the
|
|
35
|
+
* caption's quiet ink, which won over the anchor rule: four real navigations
|
|
36
|
+
* rendered as dim static micro-text that a reader could only find by hovering.
|
|
37
|
+
* A link is a different thing from a piece of text, so it is a different
|
|
38
|
+
* component, and `size="caption"` sets the caption's SIZE without its ink.
|
|
39
|
+
*
|
|
40
|
+
* `subtle` is for a link whose words are an identity rather than an
|
|
41
|
+
* instruction, a seat's name in a row, say. It is still underlined on hover
|
|
42
|
+
* and still takes the focus ring, because a link a reader cannot find is not
|
|
43
|
+
* quieter, it is hidden.
|
|
44
|
+
*/
|
|
45
|
+
export declare const Link: import("react").ForwardRefExoticComponent<LinkProps & import("react").RefAttributes<HTMLAnchorElement>>;
|