@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,395 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* The application frame.
|
|
3
|
+
*
|
|
4
|
+
* The rail's width and the bar's height are read from the token layer through
|
|
5
|
+
* two component variables, so an application with a narrower rail sets ONE
|
|
6
|
+
* value rather than repeating a number in its own stylesheet, which is what
|
|
7
|
+
* every consumer of the passive shell had to do.
|
|
8
|
+
*
|
|
9
|
+
* The breakpoint is written out because a media query cannot read a custom
|
|
10
|
+
* property. It is the shell step from @crewlethq/tokens, and the CSS check
|
|
11
|
+
* compares the literal against the token.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
.crewlet-app-shell {
|
|
15
|
+
--crewlet-app-shell-rail: var(--size-shell-rail);
|
|
16
|
+
--crewlet-app-shell-topbar: var(--size-shell-topbar);
|
|
17
|
+
/* Where the drawer's veil sits while it is open. The shell replaces it with
|
|
18
|
+
the surface's own place in the layer band; this default only has to clear
|
|
19
|
+
the page chrome for the moment before that lands. */
|
|
20
|
+
--crewlet-app-shell-drawer-z: var(--z-index-overlay);
|
|
21
|
+
display: grid;
|
|
22
|
+
grid-template-columns: var(--crewlet-app-shell-rail) minmax(0, 1fr);
|
|
23
|
+
/* THE DOCUMENT DOES NOT SCROLL: exactly the viewport, and nothing may grow
|
|
24
|
+
past it. A page that can also scroll as a whole carries the rail off the
|
|
25
|
+
top of the window. */
|
|
26
|
+
height: 100dvh;
|
|
27
|
+
overflow: hidden;
|
|
28
|
+
background: var(--color-surface-background);
|
|
29
|
+
color: var(--color-text-primary);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/* The skip link, drawn only while it holds focus, over everything. */
|
|
33
|
+
.crewlet-app-shell__skip {
|
|
34
|
+
position: fixed;
|
|
35
|
+
top: var(--spacing-2);
|
|
36
|
+
left: var(--spacing-2);
|
|
37
|
+
z-index: var(--z-index-toast);
|
|
38
|
+
padding: var(--spacing-2) var(--spacing-3);
|
|
39
|
+
border: 1px solid var(--color-border-default);
|
|
40
|
+
border-radius: var(--radius-md);
|
|
41
|
+
background: var(--color-surface-elevated);
|
|
42
|
+
color: var(--color-text-primary);
|
|
43
|
+
font-family: var(--font-family-sans);
|
|
44
|
+
font-size: var(--font-size-sm);
|
|
45
|
+
text-decoration: none;
|
|
46
|
+
transform: translateY(calc(-100% - var(--spacing-4)));
|
|
47
|
+
transition: transform var(--motion-duration-fast) var(--motion-easing-default);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
.crewlet-app-shell__skip:focus-visible {
|
|
51
|
+
transform: translateY(0);
|
|
52
|
+
outline: 2px solid var(--color-focus);
|
|
53
|
+
outline-offset: 2px;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
.crewlet-app-shell__rail {
|
|
57
|
+
display: flex;
|
|
58
|
+
flex-direction: column;
|
|
59
|
+
min-height: 0;
|
|
60
|
+
min-width: 0;
|
|
61
|
+
background: var(--color-surface-topbar);
|
|
62
|
+
border-right: 1px solid var(--color-border-default);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
.crewlet-app-shell__rail-inner {
|
|
66
|
+
display: flex;
|
|
67
|
+
flex-direction: column;
|
|
68
|
+
min-height: 0;
|
|
69
|
+
height: 100%;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/*
|
|
73
|
+
* The head sits at the top bar's own height, so the first nav row starts level
|
|
74
|
+
* with the top of the screen beside it.
|
|
75
|
+
*
|
|
76
|
+
* AND IT DRAWS NO LINE OF ITS OWN. It carried a bottom border, which put a
|
|
77
|
+
* divider across the rail at the same height as the bar's, and the two read as
|
|
78
|
+
* one rule running the width of the window with the brand and the screen title
|
|
79
|
+
* sitting above it like a second bar. The rail is one column: the bar's line
|
|
80
|
+
* belongs to the bar, the rail's right edge is what separates the two, and the
|
|
81
|
+
* only rule inside the rail is the one over its foot.
|
|
82
|
+
*/
|
|
83
|
+
.crewlet-app-shell__rail-head {
|
|
84
|
+
display: flex;
|
|
85
|
+
align-items: center;
|
|
86
|
+
flex: none;
|
|
87
|
+
min-height: var(--crewlet-app-shell-topbar);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
.crewlet-app-shell__rail-body {
|
|
91
|
+
flex: 1 1 auto;
|
|
92
|
+
min-height: 0;
|
|
93
|
+
overflow-y: auto;
|
|
94
|
+
scrollbar-color: var(--color-scrollbar) transparent;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/* The same gutter the nav takes, so what the foot says lines up with the rows
|
|
98
|
+
above it rather than sitting further out. */
|
|
99
|
+
.crewlet-app-shell__rail-foot {
|
|
100
|
+
flex: none;
|
|
101
|
+
display: flex;
|
|
102
|
+
flex-direction: column;
|
|
103
|
+
gap: var(--spacing-1);
|
|
104
|
+
padding: var(--spacing-2) var(--size-nav-gutter);
|
|
105
|
+
border-top: 1px solid var(--color-border-default);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/*
|
|
109
|
+
* A ROW IN THE RAIL LIKE ANY OTHER, for the foot.
|
|
110
|
+
*
|
|
111
|
+
* The rail's geometry is in two parts on purpose: the gutter insets the rail,
|
|
112
|
+
* which is where a row's background begins, and the row pad insets the content
|
|
113
|
+
* inside the row. A control dropped into the foot brings its own inset and
|
|
114
|
+
* lands its mark four or five pixels off the line every nav glyph above it
|
|
115
|
+
* sits on, which is the one thing a reader notices about a rail without being
|
|
116
|
+
* able to say what it is. This takes both halves, so it cannot.
|
|
117
|
+
*
|
|
118
|
+
* AND SO DOES WHATEVER ELSE LANDS THERE. `AppShell.RailRow` is the row this
|
|
119
|
+
* package draws, but the slot takes a control from anywhere and an application
|
|
120
|
+
* that already has a status button reaches for that one: the engine drops a
|
|
121
|
+
* tertiary Button into the foot, which arrived centred in a 263px rail on a
|
|
122
|
+
* toolbar's inset. The foot claims a direct child instead, which is the same
|
|
123
|
+
* move the nav's badge slot makes on whatever a caller puts in it, and there
|
|
124
|
+
* is no second idea of what a row in this rail is.
|
|
125
|
+
*
|
|
126
|
+
* THE BLOCK INSET IS A STEP, NOT A HEIGHT. A status line is a word with room
|
|
127
|
+
* around it rather than a control on the control ladder, so it takes one
|
|
128
|
+
* spacing step above and below its own line: 8 + 18 + 8 is 34px at the normal
|
|
129
|
+
* density and follows the density from there. --size-row-sm stays under it as
|
|
130
|
+
* the floor, because that is the step carrying the 24px a finger can hit, so
|
|
131
|
+
* compact density cannot take the target under it.
|
|
132
|
+
*
|
|
133
|
+
* And the boundary is TRANSPARENT rather than absent, spending one pixel of
|
|
134
|
+
* that step rather than adding one on top of it. A button carries one at every
|
|
135
|
+
* variant so that a bordered variant and a borderless one stand the same
|
|
136
|
+
* height, and the row this package draws carries the same one for the same
|
|
137
|
+
* reason: without it the two rows in one foot are 34px and 36px, and the
|
|
138
|
+
* difference is a border nobody can see.
|
|
139
|
+
*/
|
|
140
|
+
.crewlet-app-shell__rail-row,
|
|
141
|
+
.crewlet-app-shell__rail-foot > .crewlet-btn {
|
|
142
|
+
display: flex;
|
|
143
|
+
align-items: center;
|
|
144
|
+
justify-content: flex-start;
|
|
145
|
+
gap: var(--spacing-2);
|
|
146
|
+
width: 100%;
|
|
147
|
+
min-width: 0;
|
|
148
|
+
min-height: var(--size-row-sm);
|
|
149
|
+
padding: calc(var(--spacing-2) - 1px) var(--size-nav-row-pad);
|
|
150
|
+
border: 1px solid transparent;
|
|
151
|
+
border-radius: var(--radius-md);
|
|
152
|
+
background: transparent;
|
|
153
|
+
color: var(--color-text-tertiary);
|
|
154
|
+
font-family: var(--font-family-sans);
|
|
155
|
+
font-size: var(--font-size-xs);
|
|
156
|
+
font-weight: var(--font-weight-regular);
|
|
157
|
+
line-height: var(--font-line-height-normal);
|
|
158
|
+
text-align: left;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
.crewlet-app-shell__rail-row--action,
|
|
162
|
+
.crewlet-app-shell__rail-foot > .crewlet-btn {
|
|
163
|
+
cursor: pointer;
|
|
164
|
+
transition:
|
|
165
|
+
background var(--motion-duration-fast) var(--motion-easing-default),
|
|
166
|
+
color var(--motion-duration-fast) var(--motion-easing-default);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
.crewlet-app-shell__rail-row--action:hover {
|
|
170
|
+
background: var(--color-surface-hover);
|
|
171
|
+
color: var(--color-text-primary);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/* A row in the foot fills the rail, so its label takes whatever the glyph and
|
|
175
|
+
the trailing slot leave it and truncates rather than pushing them off the
|
|
176
|
+
end: a status line says what a node is doing, and what it says is as long as
|
|
177
|
+
the sentence the application wrote. */
|
|
178
|
+
.crewlet-app-shell__rail-foot > .crewlet-btn > .crewlet-btn__label {
|
|
179
|
+
display: block;
|
|
180
|
+
flex: 1 1 auto;
|
|
181
|
+
min-width: 0;
|
|
182
|
+
overflow: hidden;
|
|
183
|
+
text-overflow: ellipsis;
|
|
184
|
+
white-space: nowrap;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/*
|
|
188
|
+
* Inside the row's own box, like every row in the rail above it. The shell's
|
|
189
|
+
* root is `overflow: hidden` at exactly the viewport's height, so an outset
|
|
190
|
+
* ring on the last row in the foot is cut off at the bottom of the window.
|
|
191
|
+
*/
|
|
192
|
+
.crewlet-app-shell__rail-row--action:focus-visible,
|
|
193
|
+
.crewlet-app-shell__rail-foot > .crewlet-btn:focus-visible {
|
|
194
|
+
outline: 2px solid var(--color-focus);
|
|
195
|
+
outline-offset: var(--size-focus-ring-inset-offset);
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
.crewlet-app-shell__rail-row-icon {
|
|
199
|
+
display: inline-flex;
|
|
200
|
+
align-items: center;
|
|
201
|
+
justify-content: center;
|
|
202
|
+
flex: none;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
.crewlet-app-shell__rail-row-label {
|
|
206
|
+
flex: 1 1 auto;
|
|
207
|
+
min-width: 0;
|
|
208
|
+
overflow: hidden;
|
|
209
|
+
text-overflow: ellipsis;
|
|
210
|
+
white-space: nowrap;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
/* Pushed to the end of the row whatever the label's length. */
|
|
214
|
+
.crewlet-app-shell__rail-row-trailing {
|
|
215
|
+
display: inline-flex;
|
|
216
|
+
align-items: center;
|
|
217
|
+
flex: none;
|
|
218
|
+
margin-left: auto;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
.crewlet-app-shell__column {
|
|
222
|
+
display: flex;
|
|
223
|
+
flex-direction: column;
|
|
224
|
+
min-width: 0;
|
|
225
|
+
min-height: 0;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
.crewlet-app-shell__topbar {
|
|
229
|
+
display: flex;
|
|
230
|
+
align-items: center;
|
|
231
|
+
gap: var(--spacing-3);
|
|
232
|
+
flex: none;
|
|
233
|
+
height: var(--crewlet-app-shell-topbar);
|
|
234
|
+
padding: 0 var(--spacing-4);
|
|
235
|
+
border-bottom: 1px solid var(--color-border-default);
|
|
236
|
+
background: var(--color-surface-topbar);
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
.crewlet-app-shell__title {
|
|
240
|
+
margin: 0;
|
|
241
|
+
font-family: var(--font-family-sans);
|
|
242
|
+
font-size: var(--font-size-sm);
|
|
243
|
+
font-weight: var(--font-weight-semibold);
|
|
244
|
+
letter-spacing: var(--font-letter-spacing-tight);
|
|
245
|
+
color: var(--color-text-primary);
|
|
246
|
+
overflow: hidden;
|
|
247
|
+
text-overflow: ellipsis;
|
|
248
|
+
white-space: nowrap;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
.crewlet-app-shell__actions {
|
|
252
|
+
display: flex;
|
|
253
|
+
align-items: center;
|
|
254
|
+
gap: var(--spacing-2);
|
|
255
|
+
margin-left: auto;
|
|
256
|
+
min-width: 0;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
.crewlet-app-shell__banner {
|
|
260
|
+
flex: none;
|
|
261
|
+
border-bottom: 1px solid var(--color-border-default);
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
/*
|
|
265
|
+
* THE one scroll container. Every screen scrolls here, which is what lets a
|
|
266
|
+
* router restore a position per history entry.
|
|
267
|
+
*
|
|
268
|
+
* The gutter is reserved at every height, so navigating between a tall screen
|
|
269
|
+
* and a short one does not shift every element sideways by the scrollbar's
|
|
270
|
+
* width, which reads as the page jumping on each move.
|
|
271
|
+
*/
|
|
272
|
+
.crewlet-app-shell__main {
|
|
273
|
+
flex: 1 1 auto;
|
|
274
|
+
min-height: 0;
|
|
275
|
+
overflow-y: auto;
|
|
276
|
+
overflow-x: hidden;
|
|
277
|
+
scrollbar-gutter: stable;
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
/* No focus rule of its own: `main` takes focus only from the skip link, and a
|
|
281
|
+
programmatic focus does not match :focus-visible, so neither the browser nor
|
|
282
|
+
the document baseline draws a ring around the whole screen. */
|
|
283
|
+
|
|
284
|
+
.crewlet-app-shell__content {
|
|
285
|
+
display: flex;
|
|
286
|
+
flex-direction: column;
|
|
287
|
+
gap: var(--spacing-5);
|
|
288
|
+
max-width: var(--size-content-max);
|
|
289
|
+
margin: 0 auto;
|
|
290
|
+
padding: var(--spacing-5) var(--spacing-5) var(--spacing-10);
|
|
291
|
+
min-width: 0;
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
/* A screen that draws to the bottom of the window: the scroller stops
|
|
295
|
+
scrolling and the content column takes the height that is left. */
|
|
296
|
+
.crewlet-app-shell--fill .crewlet-app-shell__main {
|
|
297
|
+
overflow: hidden;
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
.crewlet-app-shell--fill .crewlet-app-shell__content {
|
|
301
|
+
height: 100%;
|
|
302
|
+
padding-bottom: var(--spacing-5);
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
/* Hidden by default, revealed by the breakpoint below: the wide layout has the
|
|
306
|
+
rail on screen already, so the control that opens it has nothing to do. */
|
|
307
|
+
.crewlet-app-shell__toggle {
|
|
308
|
+
display: none;
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
/*
|
|
312
|
+
* An open rail paints ONE step above its own veil, at every width: the drawer
|
|
313
|
+
* is JavaScript state and its shape is a stylesheet's, so a shell that opens
|
|
314
|
+
* it above the breakpoint (a demonstration, a test) must not draw a scrim over
|
|
315
|
+
* the rail it just opened.
|
|
316
|
+
*
|
|
317
|
+
* Z-INDEX ALONE, AND NO POSITION. The rail is a grid item wide and a fixed
|
|
318
|
+
* box narrow, and z-index applies to both, so a `position` here would buy
|
|
319
|
+
* nothing and cost the narrow layout everything: an attribute selector
|
|
320
|
+
* outranks the plain class the media query below re-declares, so a
|
|
321
|
+
* `position: relative` written here wins INSIDE that query too, and the open
|
|
322
|
+
* drawer leaves the fixed layer to become a grid item that takes the whole
|
|
323
|
+
* column and pushes the application into the next row. The suite holds this
|
|
324
|
+
* rule over the file rather than over a browser it cannot drive.
|
|
325
|
+
*/
|
|
326
|
+
.crewlet-app-shell__rail[data-open='true'] {
|
|
327
|
+
z-index: calc(var(--crewlet-app-shell-drawer-z) + 1);
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
/*
|
|
331
|
+
* The veil, declared OUTSIDE the breakpoint: a position it takes at one width
|
|
332
|
+
* only is a layout participant at every other, and as a plain element in the
|
|
333
|
+
* shell's grid it took the rail's column and pushed the application into the
|
|
334
|
+
* next row.
|
|
335
|
+
*/
|
|
336
|
+
.crewlet-app-shell__veil {
|
|
337
|
+
position: fixed;
|
|
338
|
+
inset: 0;
|
|
339
|
+
background: var(--color-surface-scrim);
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
@media (max-width: 900px) {
|
|
343
|
+
.crewlet-app-shell {
|
|
344
|
+
grid-template-columns: minmax(0, 1fr);
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
.crewlet-app-shell__rail {
|
|
348
|
+
position: fixed;
|
|
349
|
+
inset: 0 auto 0 0;
|
|
350
|
+
width: var(--crewlet-app-shell-rail);
|
|
351
|
+
max-width: 100%;
|
|
352
|
+
transform: translateX(-100%);
|
|
353
|
+
box-shadow: var(--shadow-xl);
|
|
354
|
+
/*
|
|
355
|
+
* HIDDEN, not only moved. A rail translated off screen keeps every link
|
|
356
|
+
* and control in the tab order and in the accessibility tree, so a
|
|
357
|
+
* keyboard reader walks through a dozen stops nobody can see.
|
|
358
|
+
*
|
|
359
|
+
* Visibility is transitioned rather than switched, which is how the
|
|
360
|
+
* hiding waits for the slide out: an in-between value of visibility is
|
|
361
|
+
* `visible` whenever either end of the transition is, so the rail stays
|
|
362
|
+
* drawn for the whole duration and hides at the end. Going the other way
|
|
363
|
+
* the same rule shows it at once, which is what lets the drawer take
|
|
364
|
+
* focus the moment it opens.
|
|
365
|
+
*/
|
|
366
|
+
visibility: hidden;
|
|
367
|
+
transition:
|
|
368
|
+
transform var(--motion-duration-slow) var(--motion-easing-emphasized),
|
|
369
|
+
visibility var(--motion-duration-slow) linear;
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
.crewlet-app-shell__rail[data-open='true'] {
|
|
373
|
+
transform: none;
|
|
374
|
+
visibility: visible;
|
|
375
|
+
transition: transform var(--motion-duration-slow) var(--motion-easing-emphasized);
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
.crewlet-app-shell__toggle {
|
|
379
|
+
display: inline-flex;
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
.crewlet-app-shell__content {
|
|
383
|
+
padding: var(--spacing-4) var(--spacing-3) var(--spacing-9);
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
@media (prefers-reduced-motion: reduce) {
|
|
388
|
+
.crewlet-app-shell__skip,
|
|
389
|
+
.crewlet-app-shell__rail,
|
|
390
|
+
.crewlet-app-shell__rail[data-open='true'],
|
|
391
|
+
.crewlet-app-shell__rail-row--action,
|
|
392
|
+
.crewlet-app-shell__rail-foot > .crewlet-btn {
|
|
393
|
+
transition: none;
|
|
394
|
+
}
|
|
395
|
+
}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import type { HTMLAttributes } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* Round, or a rounded square.
|
|
4
|
+
*
|
|
5
|
+
* `square` IS THE DEFAULT. The engine's identity mark is a rounded square, and
|
|
6
|
+
* it is what a reader sees in every seat chip, every list row and every header
|
|
7
|
+
* on that product; a design system with two identity marks has two looks.
|
|
8
|
+
* `circle` stays for a PERSON in a member list, where the round badge is the
|
|
9
|
+
* platform convention that surface already speaks.
|
|
10
|
+
*/
|
|
11
|
+
export type AvatarShape = 'circle' | 'square';
|
|
12
|
+
/**
|
|
13
|
+
* How much colour a badge spends on WHO something is.
|
|
14
|
+
*
|
|
15
|
+
* `neutral` is the default, and the change from 0.2.0. A hash of a name
|
|
16
|
+
* carries no information: rename the seat and its colour changes, which is the
|
|
17
|
+
* proof it never meant anything. Worse, the eight families a hash spreads over
|
|
18
|
+
* are the same eight the product spends on states and phases, so one amber
|
|
19
|
+
* meant "the execute phase", "needs a person" and "the Analyst" at once.
|
|
20
|
+
* Identity is the monogram and the name beside it.
|
|
21
|
+
*
|
|
22
|
+
* `brand` is for the one badge that is the reader themselves, and `seeded` for
|
|
23
|
+
* a roster where a stable per-identity tint genuinely helps a reader scan, a
|
|
24
|
+
* member list being the case it was built for. Each seeded ground is a token
|
|
25
|
+
* measured at 4.5:1 under white initials.
|
|
26
|
+
*/
|
|
27
|
+
export type AvatarTone = 'neutral' | 'brand' | 'seeded';
|
|
28
|
+
/**
|
|
29
|
+
* Filled, or drawn.
|
|
30
|
+
*
|
|
31
|
+
* `dashed` is a HUMAN seat: the engine does not run it. That is a structural
|
|
32
|
+
* fact rather than a status, so it is carried by the edge rather than by a
|
|
33
|
+
* hue, which is what leaves the status hues meaning only what they mean.
|
|
34
|
+
*/
|
|
35
|
+
export type AvatarVariant = 'solid' | 'dashed';
|
|
36
|
+
/** The four steps, in px. A number is accepted for anything outside them. */
|
|
37
|
+
export declare const AVATAR_SIZES: {
|
|
38
|
+
readonly xs: 20;
|
|
39
|
+
readonly sm: 26;
|
|
40
|
+
readonly md: 32;
|
|
41
|
+
readonly lg: 40;
|
|
42
|
+
};
|
|
43
|
+
export type AvatarSizeStep = keyof typeof AVATAR_SIZES;
|
|
44
|
+
export type AvatarSize = AvatarSizeStep | number;
|
|
45
|
+
export interface AvatarProps extends HTMLAttributes<HTMLElement> {
|
|
46
|
+
/** Image source. With one set the badge renders the image; otherwise the initials. */
|
|
47
|
+
src?: string | undefined;
|
|
48
|
+
/** The name behind the initials, and the image's alt text. */
|
|
49
|
+
name?: string | undefined;
|
|
50
|
+
/** A step, or a number of px. */
|
|
51
|
+
size?: AvatarSize | undefined;
|
|
52
|
+
shape?: AvatarShape | undefined;
|
|
53
|
+
tone?: AvatarTone | undefined;
|
|
54
|
+
variant?: AvatarVariant | undefined;
|
|
55
|
+
/**
|
|
56
|
+
* The name is already printed beside this badge, so the badge itself says
|
|
57
|
+
* nothing. Without it a row reads "Carlos Diaz avatar, Carlos Diaz".
|
|
58
|
+
*/
|
|
59
|
+
decorative?: boolean | undefined;
|
|
60
|
+
/**
|
|
61
|
+
* What the seeded tint is hashed from, where it is not the name: a stable id
|
|
62
|
+
* outlives a rename, so the colour does too. Only read with `tone="seeded"`.
|
|
63
|
+
*/
|
|
64
|
+
colorSeed?: string | undefined;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Up to two uppercase initials.
|
|
68
|
+
*
|
|
69
|
+
* SPLIT ON WHITESPACE, HYPHEN, UNDERSCORE AND DOT, because half the names this
|
|
70
|
+
* draws are handles rather than names: `backend-engineer` gives BE,
|
|
71
|
+
* `sre_lead` gives SL and `carlos.diaz` gives CD, where splitting on spaces
|
|
72
|
+
* alone gives B, S and C and a roster of identical badges.
|
|
73
|
+
*/
|
|
74
|
+
export declare const getInitials: (name?: string) => string;
|
|
75
|
+
/**
|
|
76
|
+
* Map a seed to one of the fixed tints. A small deterministic hash, so the
|
|
77
|
+
* same seed always resolves to the same colour and different seeds spread.
|
|
78
|
+
*/
|
|
79
|
+
export declare const avatarTint: (seed: string) => number;
|
|
80
|
+
/** The px a size prop means. */
|
|
81
|
+
export declare function avatarPixels(size: AvatarSize): number;
|
|
82
|
+
/**
|
|
83
|
+
* The corner a square badge of this many pixels takes.
|
|
84
|
+
*
|
|
85
|
+
* THE CORNER MOVES WITH THE BOX, which is the rule the steps are drawn to:
|
|
86
|
+
* 4px at 20, 8px at 26 and 32, 12px at 40. A numeric size has to obey the same
|
|
87
|
+
* rule or it contradicts it, and it did: every arbitrary box took the middle
|
|
88
|
+
* step, so `size={80}` rendered an 8px corner where `size="lg"` at half the
|
|
89
|
+
* width renders 12px, a bigger badge drawn squarer than a smaller one. The
|
|
90
|
+
* bands are the steps' own midpoints, so a number lands on the corner of the
|
|
91
|
+
* step nearest it and the ladder is one ladder rather than two.
|
|
92
|
+
*
|
|
93
|
+
* The values are spelled in full rather than composed from the step name: the
|
|
94
|
+
* package's variable check reads `var(--radius-${name})` as a reference to a
|
|
95
|
+
* token called `--radius-`, which nothing emits.
|
|
96
|
+
*/
|
|
97
|
+
export declare function avatarSquareCorner(pixels: number): string;
|
|
98
|
+
/**
|
|
99
|
+
* An identity badge: an image, or the initials behind it.
|
|
100
|
+
*
|
|
101
|
+
* If the image fails to load (a stale CDN URL, an expired signature) it
|
|
102
|
+
* degrades to the initials rather than to a broken-image glyph.
|
|
103
|
+
*/
|
|
104
|
+
export declare const Avatar: ({ src, name, size, shape, tone, variant, decorative, colorSeed, className, style, ...rest }: AvatarProps) => import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* The identity badge.
|
|
3
|
+
*
|
|
4
|
+
* IT IS NEUTRAL, and that is the whole rule. The system this replaces coloured
|
|
5
|
+
* a seat by `PALETTE[hash(name) % 8]`, over the same eight families it also
|
|
6
|
+
* spent on phases and event categories, so one amber meant "the execute
|
|
7
|
+
* phase", "the decision category" and "the Analyst" at once. A hash of a name
|
|
8
|
+
* carries no information: rename the seat and its colour changes, which is the
|
|
9
|
+
* proof it never meant anything. Identity is the monogram and the name.
|
|
10
|
+
*
|
|
11
|
+
* The seeded tints stay for the one case that earns them, a roster somebody
|
|
12
|
+
* scans, and their grounds are TOKENS: measured under white initials and held
|
|
13
|
+
* at 4.5:1 by the palette suite. Spelled as literals, five of the ten sat
|
|
14
|
+
* under that floor while the suite measured ten values nothing painted with.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
.crewlet-avatar {
|
|
18
|
+
--crewlet-avatar-size: 32px;
|
|
19
|
+
display: inline-flex;
|
|
20
|
+
align-items: center;
|
|
21
|
+
justify-content: center;
|
|
22
|
+
flex: none;
|
|
23
|
+
width: var(--crewlet-avatar-size);
|
|
24
|
+
height: var(--crewlet-avatar-size);
|
|
25
|
+
overflow: hidden;
|
|
26
|
+
object-fit: cover;
|
|
27
|
+
font-family: var(--font-family-sans);
|
|
28
|
+
font-size: var(--font-size-xs);
|
|
29
|
+
font-weight: var(--font-weight-semibold);
|
|
30
|
+
letter-spacing: var(--font-letter-spacing-wide);
|
|
31
|
+
/* The document's own leading rather than a tight step of the badge's own.
|
|
32
|
+
The box is a fixed square that centres whatever line it holds, so the ink
|
|
33
|
+
lands in the same place either way; what the tight step bought was one
|
|
34
|
+
more number in a component that already sets four. */
|
|
35
|
+
line-height: var(--font-line-height-normal);
|
|
36
|
+
text-transform: uppercase;
|
|
37
|
+
user-select: none;
|
|
38
|
+
box-sizing: border-box;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/*
|
|
42
|
+
* The four steps. Each pairs its box with a type step, so two initials sit
|
|
43
|
+
* inside the circle at every one of them; a numeric size computes its own,
|
|
44
|
+
* because nothing in the scale can answer for an arbitrary box.
|
|
45
|
+
*/
|
|
46
|
+
.crewlet-avatar--xs {
|
|
47
|
+
--crewlet-avatar-size: 20px;
|
|
48
|
+
font-size: var(--font-size-2xs);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
.crewlet-avatar--sm {
|
|
52
|
+
--crewlet-avatar-size: 26px;
|
|
53
|
+
font-size: var(--font-size-2xs);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
.crewlet-avatar--md {
|
|
57
|
+
--crewlet-avatar-size: 32px;
|
|
58
|
+
font-size: var(--font-size-xs);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
.crewlet-avatar--lg {
|
|
62
|
+
--crewlet-avatar-size: 40px;
|
|
63
|
+
font-size: var(--font-size-sm);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/*
|
|
67
|
+
* Shapes. THE SQUARE IS THE DEFAULT, which is the change: the engine's
|
|
68
|
+
* identity mark is a rounded square and it is what a reader sees in every seat
|
|
69
|
+
* chip, every list row and every header on that product. A circle stays for a
|
|
70
|
+
* PERSON, where the round badge is the platform convention a member list
|
|
71
|
+
* already speaks.
|
|
72
|
+
*
|
|
73
|
+
* The square's radius moves with the box rather than sitting at one step. The
|
|
74
|
+
* engine draws 4px at 20, 8px at 26 and 12px at 40, which is a roughly
|
|
75
|
+
* constant proportion; one radius across the four steps reads as a pill at the
|
|
76
|
+
* smallest and as a plain box at the largest. A NUMERIC SIZE OBEYS THE SAME
|
|
77
|
+
* LADDER, from `avatarSquareCorner` in the component, which picks the corner
|
|
78
|
+
* of the step nearest the box it was given: taking one fixed step there is how
|
|
79
|
+
* `size={80}` ended up drawn squarer than `size="lg"` at half its width.
|
|
80
|
+
*/
|
|
81
|
+
.crewlet-avatar--circle {
|
|
82
|
+
border-radius: var(--radius-circle);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
.crewlet-avatar--square {
|
|
86
|
+
border-radius: var(--radius-md);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
.crewlet-avatar--square.crewlet-avatar--xs {
|
|
90
|
+
border-radius: var(--radius-xs);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
.crewlet-avatar--square.crewlet-avatar--lg {
|
|
94
|
+
border-radius: var(--radius-lg);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
.crewlet-avatar--image {
|
|
98
|
+
display: block;
|
|
99
|
+
object-fit: cover;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/* ── tones ─────────────────────────────────────────────────────────────── */
|
|
103
|
+
|
|
104
|
+
.crewlet-avatar--fallback {
|
|
105
|
+
border: 1px solid transparent;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
.crewlet-avatar--neutral {
|
|
109
|
+
background: var(--color-surface-elevated);
|
|
110
|
+
border-color: var(--color-border-default);
|
|
111
|
+
color: var(--color-text-secondary);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/*
|
|
115
|
+
* The label on the accent fill is the on-accent step, not the on-brand one.
|
|
116
|
+
* The themes repaint the brand fill monochrome and leave the accent where it
|
|
117
|
+
* is, so on-brand is black in the dark palette and black on the accent
|
|
118
|
+
* measures 4.35:1. On-accent is white in every palette and measures 4.83:1.
|
|
119
|
+
*/
|
|
120
|
+
.crewlet-avatar--brand {
|
|
121
|
+
background: var(--color-brand-accent);
|
|
122
|
+
color: var(--color-text-on-accent);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
.crewlet-avatar--seeded {
|
|
126
|
+
color: var(--color-text-on-accent);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
.crewlet-avatar--tint-0 { background: var(--color-avatar-tint-0); }
|
|
130
|
+
.crewlet-avatar--tint-1 { background: var(--color-avatar-tint-1); }
|
|
131
|
+
.crewlet-avatar--tint-2 { background: var(--color-avatar-tint-2); }
|
|
132
|
+
.crewlet-avatar--tint-3 { background: var(--color-avatar-tint-3); }
|
|
133
|
+
.crewlet-avatar--tint-4 { background: var(--color-avatar-tint-4); }
|
|
134
|
+
.crewlet-avatar--tint-5 { background: var(--color-avatar-tint-5); }
|
|
135
|
+
.crewlet-avatar--tint-6 { background: var(--color-avatar-tint-6); }
|
|
136
|
+
.crewlet-avatar--tint-7 { background: var(--color-avatar-tint-7); }
|
|
137
|
+
.crewlet-avatar--tint-8 { background: var(--color-avatar-tint-8); }
|
|
138
|
+
.crewlet-avatar--tint-9 { background: var(--color-avatar-tint-9); }
|
|
139
|
+
|
|
140
|
+
/*
|
|
141
|
+
* A HUMAN SEAT IS DRAWN, NOT TINTED. The engine does not run it, which is a
|
|
142
|
+
* structural fact rather than a status, so it takes the edge and no fill at
|
|
143
|
+
* all. Last, so it wins over whichever tone it is paired with.
|
|
144
|
+
*
|
|
145
|
+
* The whole border rather than its style alone: the badge is the same person
|
|
146
|
+
* whether or not they have uploaded a photo, and an image draws no border of
|
|
147
|
+
* its own for a style to change.
|
|
148
|
+
*/
|
|
149
|
+
.crewlet-avatar--dashed {
|
|
150
|
+
background: transparent;
|
|
151
|
+
/* The same hairline the solid neutral badge draws, so the human seat differs
|
|
152
|
+
by its LINE STYLE and its missing fill rather than by a second grey a
|
|
153
|
+
reader would have to hold two of in mind. */
|
|
154
|
+
border: 1px dashed var(--color-border-default);
|
|
155
|
+
color: var(--color-text-secondary);
|
|
156
|
+
}
|