@crewlethq/ui 0.2.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1714 -14
- package/dist/Accordion/Accordion.d.ts +54 -0
- package/dist/Accordion/index.d.ts +4 -0
- package/dist/Accordion/index.js +6 -0
- package/dist/Accordion-ZI2WLD5C.css +87 -0
- package/dist/AddPill/AddPill.d.ts +114 -0
- package/dist/AddPill/index.d.ts +3 -0
- package/dist/AddPill/index.js +3 -0
- package/dist/AddPill-DFWXYLIQ.css +434 -0
- package/dist/Announcer/Announcer.d.ts +15 -0
- package/dist/Announcer/index.d.ts +2 -0
- package/dist/Announcer/index.js +3 -0
- package/dist/AppShell/AppShell.d.ts +193 -0
- package/dist/AppShell/index.d.ts +3 -0
- package/dist/AppShell/index.js +6 -0
- package/dist/AppShell-NVE6LHNI.css +395 -0
- package/dist/Avatar/Avatar.d.ts +104 -0
- package/dist/Avatar/index.d.ts +3 -0
- package/dist/Avatar/index.js +2 -0
- package/dist/Avatar-P2KRQM2B.css +156 -0
- package/dist/BrandLockup/BrandLockup.d.ts +41 -0
- package/dist/BrandLockup/index.d.ts +3 -0
- package/dist/BrandLockup/index.js +2 -0
- package/dist/BrandLockup-6ISDEHPJ.css +108 -0
- package/dist/Button/Button.d.ts +88 -0
- package/dist/Button/index.d.ts +3 -0
- package/dist/Button/index.js +3 -0
- package/dist/Button-D4J6B4MA.css +302 -0
- package/dist/CalendarGrid/CalendarGrid.d.ts +87 -0
- package/dist/CalendarGrid/index.d.ts +3 -0
- package/dist/CalendarGrid/index.js +2 -0
- package/dist/CalendarGrid-V6TQ5QKS.css +128 -0
- package/dist/Callout/Callout.d.ts +47 -0
- package/dist/Callout/index.d.ts +3 -0
- package/dist/Callout/index.js +2 -0
- package/dist/Callout-S7QDWHDL.css +111 -0
- package/dist/Canvas/Canvas.d.ts +234 -0
- package/dist/Canvas/geometry.d.ts +249 -0
- package/dist/Canvas/index.d.ts +5 -0
- package/dist/Canvas/index.js +8 -0
- package/dist/Canvas/layerNode.d.ts +20 -0
- package/dist/Canvas-Q6JETCWR.css +315 -0
- package/dist/Card/Card.d.ts +164 -0
- package/dist/Card/headerSlot.d.ts +65 -0
- package/dist/Card/index.d.ts +5 -0
- package/dist/Card/index.js +6 -0
- package/dist/Card-RLR254LD.css +450 -0
- package/dist/Charts/ActivityStrip.d.ts +45 -0
- package/dist/Charts/BarList.d.ts +51 -0
- package/dist/Charts/Legend.d.ts +32 -0
- package/dist/Charts/StackedBar.d.ts +38 -0
- package/dist/Charts/TimeSeries.d.ts +92 -0
- package/dist/Charts/dataColor.d.ts +20 -0
- package/dist/Charts/index.d.ts +12 -0
- package/dist/Charts/index.js +3 -0
- package/dist/Charts-D7G2BSXH.css +277 -0
- package/dist/Checkbox/Checkbox.d.ts +45 -0
- package/dist/Checkbox/index.d.ts +3 -0
- package/dist/Checkbox/index.js +2 -0
- package/dist/Checkbox-VGW26YLQ.css +111 -0
- package/dist/CodeBlock/CodeBlock.d.ts +119 -0
- package/dist/CodeBlock/index.d.ts +3 -0
- package/dist/CodeBlock/index.js +7 -0
- package/dist/CodeBlock-GYNJ2HI6.css +188 -0
- package/dist/Combobox/Combobox.d.ts +89 -0
- package/dist/Combobox/index.d.ts +3 -0
- package/dist/Combobox/index.js +8 -0
- package/dist/Combobox-4FUVYIE7.css +80 -0
- package/dist/CommandPalette/CommandPalette.d.ts +77 -0
- package/dist/CommandPalette/index.d.ts +3 -0
- package/dist/CommandPalette/index.js +11 -0
- package/dist/CommandPalette-CSJDUCQA.css +115 -0
- package/dist/Container/Container.d.ts +17 -0
- package/dist/Container/index.d.ts +3 -0
- package/dist/Container/index.js +2 -0
- package/dist/Container-3TSKMGNI.css +52 -0
- package/dist/Copyable/CopyButton.d.ts +64 -0
- package/dist/Copyable/Copyable.d.ts +42 -0
- package/dist/Copyable/index.d.ts +5 -0
- package/dist/Copyable/index.js +6 -0
- package/dist/Copyable-5PNRFOLS.css +125 -0
- package/dist/Count/Count.d.ts +24 -0
- package/dist/Count/index.d.ts +3 -0
- package/dist/Count/index.js +3 -0
- package/dist/Count-ZVCJ6VPD.css +20 -0
- package/dist/DataTable/CopyableCell.d.ts +12 -0
- package/dist/DataTable/DataTable.d.ts +615 -0
- package/dist/DataTable/RowActionsMenu.d.ts +7 -0
- package/dist/DataTable/index.d.ts +7 -0
- package/dist/DataTable/index.js +14 -0
- package/dist/DataTable-ITNACQ2X.css +2020 -0
- package/dist/DataView/DataView.d.ts +109 -0
- package/dist/DataView/DataViewToolbar.d.ts +87 -0
- package/dist/DataView/FilterAxisBar.d.ts +103 -0
- package/dist/DataView/columns.d.ts +35 -0
- package/dist/DataView/filters.d.ts +184 -0
- package/dist/DataView/index.d.ts +11 -0
- package/dist/DataView/index.js +25 -0
- package/dist/DataView-256YF32J.css +441 -0
- package/dist/DateTimePicker/DateTimePicker.d.ts +91 -0
- package/dist/DateTimePicker/index.d.ts +3 -0
- package/dist/DateTimePicker/index.js +9 -0
- package/dist/DateTimePicker-22VNXRWC.css +199 -0
- package/dist/DescriptionList/DescriptionList.d.ts +36 -0
- package/dist/DescriptionList/index.d.ts +3 -0
- package/dist/DescriptionList/index.js +2 -0
- package/dist/DescriptionList-YYY3V3O6.css +59 -0
- package/dist/DiffList/DiffList.d.ts +47 -0
- package/dist/DiffList/index.d.ts +3 -0
- package/dist/DiffList/index.js +3 -0
- package/dist/DiffList-3EX64AAE.css +94 -0
- package/dist/Disclosure/Disclosure.d.ts +56 -0
- package/dist/Disclosure/anatomy.d.ts +43 -0
- package/dist/Disclosure/index.d.ts +5 -0
- package/dist/Disclosure/index.js +6 -0
- package/dist/Disclosure-VKBJJIZ7.css +176 -0
- package/dist/EmptyState/EmptyState.d.ts +39 -0
- package/dist/EmptyState/index.d.ts +3 -0
- package/dist/EmptyState/index.js +3 -0
- package/dist/EmptyState-C6HRBGT7.css +73 -0
- package/dist/EmptyValue/EmptyValue.d.ts +31 -0
- package/dist/EmptyValue/index.d.ts +3 -0
- package/dist/EmptyValue/index.js +3 -0
- package/dist/EmptyValue-4B6ODXHT.css +12 -0
- package/dist/EntityChip/EntityChip.d.ts +40 -0
- package/dist/EntityChip/index.d.ts +3 -0
- package/dist/EntityChip/index.js +3 -0
- package/dist/EntityChip-LUCPZBBG.css +64 -0
- package/dist/ErrorBoundary/ErrorBoundary.d.ts +58 -0
- package/dist/ErrorBoundary/index.d.ts +3 -0
- package/dist/ErrorBoundary/index.js +4 -0
- package/dist/ErrorBoundary-ME36CQTA.css +59 -0
- package/dist/Eyebrow/Eyebrow.d.ts +18 -0
- package/dist/Eyebrow/index.d.ts +3 -0
- package/dist/Eyebrow/index.js +2 -0
- package/dist/Eyebrow-5NREGHQH.css +46 -0
- package/dist/FilterChip/FilterChip.d.ts +100 -0
- package/dist/FilterChip/index.d.ts +3 -0
- package/dist/FilterChip/index.js +3 -0
- package/dist/FilterChip-GTGLLOXE.css +107 -0
- package/dist/Fullscreen/index.d.ts +2 -0
- package/dist/Fullscreen/index.js +1 -0
- package/dist/Fullscreen/useFullscreen.d.ts +32 -0
- package/dist/IconButton/IconButton.d.ts +45 -0
- package/dist/IconButton/index.d.ts +3 -0
- package/dist/IconButton/index.js +3 -0
- package/dist/IconButton-VQGNMJDI.css +158 -0
- package/dist/ImageUpload/ImageUpload.d.ts +37 -0
- package/dist/ImageUpload/index.d.ts +3 -0
- package/dist/ImageUpload/index.js +3 -0
- package/dist/ImageUpload-HKFIZR6D.css +193 -0
- package/dist/InlineCode/InlineCode.d.ts +37 -0
- package/dist/InlineCode/index.d.ts +3 -0
- package/dist/InlineCode/index.js +2 -0
- package/dist/InlineCode-6WSR5COL.css +65 -0
- package/dist/Input/FormField.d.ts +61 -0
- package/dist/Input/FormRow.d.ts +6 -0
- package/dist/Input/FormSection.d.ts +28 -0
- package/dist/Input/Input.d.ts +98 -0
- package/dist/Input/Label.d.ts +31 -0
- package/dist/Input/ReadOnlyField.d.ts +30 -0
- package/dist/Input/Textarea.d.ts +16 -0
- package/dist/Input/index.d.ts +15 -0
- package/dist/Input/index.js +5 -0
- package/dist/Input-2PU5CPKK.css +616 -0
- package/dist/Kbd/Kbd.d.ts +40 -0
- package/dist/Kbd/index.d.ts +3 -0
- package/dist/Kbd/index.js +3 -0
- package/dist/Kbd-W66MXQI5.css +61 -0
- package/dist/Layer/LayerHost.d.ts +23 -0
- package/dist/Layer/index.d.ts +7 -0
- package/dist/Layer/index.js +3 -0
- package/dist/Layer/place.d.ts +63 -0
- package/dist/Layer/stack.d.ts +159 -0
- package/dist/Layer-NAFSGCFA.css +23 -0
- package/dist/Layout/Layout.d.ts +104 -0
- package/dist/Layout/index.d.ts +3 -0
- package/dist/Layout/index.js +2 -0
- package/dist/Layout-2ZCV3IGF.css +171 -0
- package/dist/Link/Link.d.ts +45 -0
- package/dist/Link/index.d.ts +3 -0
- package/dist/Link/index.js +3 -0
- package/dist/Link-6BEFNMN2.css +80 -0
- package/dist/List/List.d.ts +73 -0
- package/dist/List/index.d.ts +3 -0
- package/dist/List/index.js +3 -0
- package/dist/List-XTHESXLR.css +161 -0
- package/dist/ListInput/ListInput.d.ts +68 -0
- package/dist/ListInput/index.d.ts +3 -0
- package/dist/ListInput/index.js +10 -0
- package/dist/ListInput-O7LJKOIG.css +147 -0
- package/dist/Listbox/index.d.ts +5 -0
- package/dist/Listbox/index.js +2 -0
- package/dist/Listbox/useListbox.d.ts +97 -0
- package/dist/Listbox/useOptionKeys.d.ts +64 -0
- package/dist/Listbox-X2DOTSQA.css +110 -0
- package/dist/Menu/Menu.d.ts +118 -0
- package/dist/Menu/index.d.ts +3 -0
- package/dist/Menu/index.js +7 -0
- package/dist/Menu-6DE7I66I.css +222 -0
- package/dist/Meter/Meter.d.ts +126 -0
- package/dist/Meter/index.d.ts +3 -0
- package/dist/Meter/index.js +3 -0
- package/dist/Meter-SKOOXQBC.css +87 -0
- package/dist/Modal/ConfirmModal.d.ts +74 -0
- package/dist/Modal/Modal.d.ts +154 -0
- package/dist/Modal/index.d.ts +5 -0
- package/dist/Modal/index.js +8 -0
- package/dist/Modal-XYQJ4BL6.css +484 -0
- package/dist/NewItemsNotice/NewItemsNotice.d.ts +28 -0
- package/dist/NewItemsNotice/index.d.ts +3 -0
- package/dist/NewItemsNotice/index.js +4 -0
- package/dist/NewItemsNotice-T4DSSPVV.css +60 -0
- package/dist/OrgLabel/OrgLabel.d.ts +117 -0
- package/dist/OrgLabel/index.d.ts +3 -0
- package/dist/OrgLabel/index.js +2 -0
- package/dist/OrgLabel-D7U6QJZD.css +293 -0
- package/dist/OrgNode/OrgNode.d.ts +103 -0
- package/dist/OrgNode/index.d.ts +3 -0
- package/dist/OrgNode/index.js +3 -0
- package/dist/OrgNode-BT7T2Q2X.css +214 -0
- package/dist/OrgTable/OrgTable.d.ts +113 -0
- package/dist/OrgTable/index.d.ts +3 -0
- package/dist/OrgTable/index.js +11 -0
- package/dist/OrgTable-VWMFC3TB.css +360 -0
- package/dist/PageHeader/PageHeader.d.ts +35 -0
- package/dist/PageHeader/index.d.ts +3 -0
- package/dist/PageHeader/index.js +3 -0
- package/dist/PageHeader-6EYWQXRE.css +88 -0
- package/dist/Popover/Popover.d.ts +91 -0
- package/dist/Popover/index.d.ts +3 -0
- package/dist/Popover/index.js +4 -0
- package/dist/Popover-WJGCF3ZQ.css +185 -0
- package/dist/PricingCard/PricingCard.d.ts +56 -0
- package/dist/PricingCard/index.d.ts +3 -0
- package/dist/PricingCard/index.js +4 -0
- package/dist/PricingCard-JFI7RYXP.css +278 -0
- package/dist/Prose/Prose.d.ts +33 -0
- package/dist/Prose/index.d.ts +3 -0
- package/dist/Prose/index.js +2 -0
- package/dist/Prose-BTXNFT2Q.css +99 -0
- package/dist/RelativeTime/RelativeTime.d.ts +31 -0
- package/dist/RelativeTime/clock.d.ts +9 -0
- package/dist/RelativeTime/format.d.ts +38 -0
- package/dist/RelativeTime/index.d.ts +6 -0
- package/dist/RelativeTime/index.js +4 -0
- package/dist/RelativeTime-EBAQPGO2.css +10 -0
- package/dist/SearchTrigger/SearchTrigger.d.ts +29 -0
- package/dist/SearchTrigger/index.d.ts +3 -0
- package/dist/SearchTrigger/index.js +2 -0
- package/dist/SearchTrigger-QXOYAUUY.css +79 -0
- package/dist/Section/Section.d.ts +41 -0
- package/dist/Section/index.d.ts +3 -0
- package/dist/Section/index.js +3 -0
- package/dist/Section-QRUPRIQ2.css +127 -0
- package/dist/SegmentedControl/SegmentedControl.d.ts +101 -0
- package/dist/SegmentedControl/index.d.ts +4 -0
- package/dist/SegmentedControl/index.js +5 -0
- package/dist/SegmentedControl-X3BI3XU4.css +68 -0
- package/dist/Select/Select.d.ts +153 -0
- package/dist/Select/index.d.ts +3 -0
- package/dist/Select/index.js +5 -0
- package/dist/Select-2X77FSWR.css +350 -0
- package/dist/Shortcut/index.d.ts +2 -0
- package/dist/Shortcut/index.js +4 -0
- package/dist/Shortcut/useShortcut.d.ts +68 -0
- package/dist/SidebarNav/SidebarNav.d.ts +117 -0
- package/dist/SidebarNav/index.d.ts +3 -0
- package/dist/SidebarNav/index.js +3 -0
- package/dist/SidebarNav-QGSFKZYA.css +319 -0
- package/dist/Skeleton/Skeleton.d.ts +50 -0
- package/dist/Skeleton/index.d.ts +3 -0
- package/dist/Skeleton/index.js +3 -0
- package/dist/Skeleton-V735HRGM.css +421 -0
- package/dist/StatCard/StatCard.d.ts +56 -0
- package/dist/StatCard/index.d.ts +3 -0
- package/dist/StatCard/index.js +3 -0
- package/dist/StatCard-KYPKZUWX.css +111 -0
- package/dist/StatGroup/StatGroup.d.ts +20 -0
- package/dist/StatGroup/index.d.ts +3 -0
- package/dist/StatGroup/index.js +2 -0
- package/dist/StatGroup-TGB6AEKM.css +80 -0
- package/dist/StatusDot/StatusDot.d.ts +25 -0
- package/dist/StatusDot/index.d.ts +3 -0
- package/dist/StatusDot/index.js +2 -0
- package/dist/StatusDot-HA2L2FSX.css +84 -0
- package/dist/Switch/Switch.d.ts +38 -0
- package/dist/Switch/index.d.ts +3 -0
- package/dist/Switch/index.js +2 -0
- package/dist/Switch-U4OWK4CL.css +169 -0
- package/dist/Table/Table.d.ts +51 -0
- package/dist/Table/index.d.ts +3 -0
- package/dist/Table/index.js +3 -0
- package/dist/Table-MDOLVUAW.css +159 -0
- package/dist/Tabs/Tabs.d.ts +97 -0
- package/dist/Tabs/index.d.ts +3 -0
- package/dist/Tabs/index.js +4 -0
- package/dist/Tabs/roving.d.ts +67 -0
- package/dist/Tabs-VLICJFVB.css +275 -0
- package/dist/Tag/Tag.d.ts +107 -0
- package/dist/Tag/index.d.ts +3 -0
- package/dist/Tag/index.js +3 -0
- package/dist/Tag-VNZEYLB6.css +406 -0
- package/dist/TagGroup/TagGroup.d.ts +41 -0
- package/dist/TagGroup/index.d.ts +3 -0
- package/dist/TagGroup/index.js +4 -0
- package/dist/TagGroup-APC2EFH4.css +75 -0
- package/dist/TagsInput/TagsInput.d.ts +112 -0
- package/dist/TagsInput/index.d.ts +3 -0
- package/dist/TagsInput/index.js +10 -0
- package/dist/TagsInput-W4P36PRJ.css +168 -0
- package/dist/Text/Text.d.ts +67 -0
- package/dist/Text/index.d.ts +3 -0
- package/dist/Text/index.js +2 -0
- package/dist/Text-XIPYYZX2.css +154 -0
- package/dist/ThemeSwitcher/ThemeSwitcher.d.ts +47 -0
- package/dist/ThemeSwitcher/index.d.ts +4 -0
- package/dist/ThemeSwitcher/index.js +6 -0
- package/dist/ThemeSwitcher/preferences.d.ts +51 -0
- package/dist/TimeWindowPicker/TimeWindowPicker.d.ts +231 -0
- package/dist/TimeWindowPicker/index.d.ts +3 -0
- package/dist/TimeWindowPicker/index.js +13 -0
- package/dist/TimeWindowPicker/mask.d.ts +82 -0
- package/dist/TimeWindowPicker-7I7KWCMU.css +403 -0
- package/dist/Timeline/Timeline.d.ts +51 -0
- package/dist/Timeline/index.d.ts +3 -0
- package/dist/Timeline/index.js +3 -0
- package/dist/Timeline-27SYKOFX.css +144 -0
- package/dist/Toaster/Toaster.d.ts +108 -0
- package/dist/Toaster/index.d.ts +3 -0
- package/dist/Toaster/index.js +5 -0
- package/dist/Toaster-NVDCEIP5.css +306 -0
- package/dist/Toolbar/Toolbar.d.ts +62 -0
- package/dist/Toolbar/index.d.ts +3 -0
- package/dist/Toolbar/index.js +4 -0
- package/dist/Toolbar-IP6LXN45.css +48 -0
- package/dist/Tooltip/Tooltip.d.ts +51 -0
- package/dist/Tooltip/index.d.ts +3 -0
- package/dist/Tooltip/index.js +4 -0
- package/dist/Tooltip-LKQF7CE4.css +71 -0
- package/dist/Tree/index.d.ts +8 -0
- package/dist/Tree/index.js +1 -0
- package/dist/Tree/layout.d.ts +160 -0
- package/dist/Tree/model.d.ts +110 -0
- package/dist/Tree/useMeasuredSizes.d.ts +61 -0
- package/dist/Tree/useTreeState.d.ts +89 -0
- package/dist/TreeCanvas/TreeCanvas.d.ts +384 -0
- package/dist/TreeCanvas/index.d.ts +3 -0
- package/dist/TreeCanvas/index.js +10 -0
- package/dist/TreeCanvas/motion.d.ts +59 -0
- package/dist/TreeCanvas-WBNQPHC7.css +1098 -0
- package/dist/TreeGrid/TreeGrid.d.ts +142 -0
- package/dist/TreeGrid/index.d.ts +3 -0
- package/dist/TreeGrid/index.js +8 -0
- package/dist/TreeGrid-NSW7VMOX.css +132 -0
- package/dist/VisuallyHidden/VisuallyHidden.d.ts +23 -0
- package/dist/VisuallyHidden/index.d.ts +3 -0
- package/dist/VisuallyHidden/index.js +2 -0
- package/dist/VisuallyHidden-L552H7OA.css +21 -0
- package/dist/chunk-22O7LAW2.js +41 -0
- package/dist/chunk-23DHIMJA.js +38 -0
- package/dist/chunk-2EOKFKHX.js +263 -0
- package/dist/chunk-2HQR4U4D.js +143 -0
- package/dist/chunk-2PRH365R.js +74 -0
- package/dist/chunk-2ZQMA2WB.js +57 -0
- package/dist/chunk-34VGEDVV.js +907 -0
- package/dist/chunk-3CZ7XAVY.js +139 -0
- package/dist/chunk-3EYF6HKB.js +135 -0
- package/dist/chunk-3QRYCPXQ.js +116 -0
- package/dist/chunk-3ZP55QZE.js +40 -0
- package/dist/chunk-53DVJCVW.js +14 -0
- package/dist/chunk-5C5YMZQU.js +51 -0
- package/dist/chunk-5EKIWVOR.js +132 -0
- package/dist/chunk-5KPQ6D7N.js +54 -0
- package/dist/chunk-5SDBMKUO.js +297 -0
- package/dist/chunk-5VNUYO76.js +62 -0
- package/dist/chunk-5WS6L6FA.js +114 -0
- package/dist/chunk-6ZFVFA56.js +108 -0
- package/dist/chunk-7EM5T4ME.js +39 -0
- package/dist/chunk-7FZ53WDJ.js +163 -0
- package/dist/chunk-7HPRF5XN.js +525 -0
- package/dist/chunk-7RPGY3JE.js +43 -0
- package/dist/chunk-A2UXBCLO.js +48 -0
- package/dist/chunk-AV2DXAEL.js +27 -0
- package/dist/chunk-BHHIIK3M.js +17 -0
- package/dist/chunk-BZFWDIV6.js +9 -0
- package/dist/chunk-BZYDZBAN.js +123 -0
- package/dist/chunk-CMEE37QJ.js +628 -0
- package/dist/chunk-D35VTV2Z.js +106 -0
- package/dist/chunk-DD5BBGBE.js +162 -0
- package/dist/chunk-EN6K2IFA.js +256 -0
- package/dist/chunk-ESCO4XYW.js +144 -0
- package/dist/chunk-EUCC37WY.js +14 -0
- package/dist/chunk-EV6IMYJ6.js +62 -0
- package/dist/chunk-F27EPQ7D.js +68 -0
- package/dist/chunk-F4PJZ4ED.js +245 -0
- package/dist/chunk-F6OE5FH3.js +49 -0
- package/dist/chunk-FBZAKNSX.js +263 -0
- package/dist/chunk-FEFTGVMF.js +46 -0
- package/dist/chunk-GTOUGQQK.js +147 -0
- package/dist/chunk-GXQ3B46I.js +216 -0
- package/dist/chunk-H4FBTAYS.js +130 -0
- package/dist/chunk-HOXGBLEY.js +37 -0
- package/dist/chunk-HQNHV7D6.js +54 -0
- package/dist/chunk-HZ5XZNPS.js +98 -0
- package/dist/chunk-IAJLHVUA.js +28 -0
- package/dist/chunk-IJ7QXNIJ.js +1 -0
- package/dist/chunk-ITHXJHBB.js +280 -0
- package/dist/chunk-JCSA3XVH.js +32 -0
- package/dist/chunk-KLJCCMF3.js +97 -0
- package/dist/chunk-LWKJQTOM.js +77 -0
- package/dist/chunk-MNAXYY3R.js +215 -0
- package/dist/chunk-NDCATSW7.js +229 -0
- package/dist/chunk-NN62JQLR.js +29 -0
- package/dist/chunk-NPZY6YYL.js +251 -0
- package/dist/chunk-NTRZGNEX.js +529 -0
- package/dist/chunk-O6232G37.js +273 -0
- package/dist/chunk-O67VF5MS.js +58 -0
- package/dist/chunk-ODEQTPFM.js +6 -0
- package/dist/chunk-OFHBK7RI.js +498 -0
- package/dist/chunk-PNFASD6F.js +98 -0
- package/dist/chunk-PQADV6P6.js +19 -0
- package/dist/chunk-PZSWF74H.js +15 -0
- package/dist/chunk-Q4ZPPART.js +26 -0
- package/dist/chunk-QEUY3A5P.js +186 -0
- package/dist/chunk-QNCVHRZL.js +17 -0
- package/dist/chunk-QVE4GJAT.js +15 -0
- package/dist/chunk-QYOFACSP.js +36 -0
- package/dist/chunk-RA2ULG6H.js +29 -0
- package/dist/chunk-RDGD7Z7I.js +350 -0
- package/dist/chunk-RK4XPHVG.js +16 -0
- package/dist/chunk-RSAQOKH3.js +38 -0
- package/dist/chunk-S2XHHEW4.js +84 -0
- package/dist/chunk-S4GZWSKR.js +137 -0
- package/dist/chunk-SFZOKW2G.js +52 -0
- package/dist/chunk-UG46QBLT.js +325 -0
- package/dist/chunk-UOGSZKLT.js +134 -0
- package/dist/chunk-V2XMNLMS.js +52 -0
- package/dist/chunk-W4ENKCXJ.js +40 -0
- package/dist/chunk-W5J7R5EB.js +107 -0
- package/dist/chunk-WNI2WSJF.js +27 -0
- package/dist/chunk-WOYYD2YR.js +823 -0
- package/dist/chunk-WQX73TWF.js +1652 -0
- package/dist/chunk-XDTYBF2F.js +36 -0
- package/dist/chunk-XN4JBAN3.js +32 -0
- package/dist/chunk-XV6WRMBC.js +211 -0
- package/dist/chunk-YLYOWZ4V.js +33 -0
- package/dist/chunk-YODNNSZL.js +63 -0
- package/dist/chunk-ZCR6YGQ4.js +1 -0
- package/dist/chunk-ZFATEERP.js +144 -0
- package/dist/generated/index.d.ts +83 -0
- package/dist/generated/index.js +91 -0
- package/dist/index.d.ts +1 -1217
- package/dist/index.js +91 -4518
- package/dist/styles.css +14898 -4274
- package/dist/utils/cx.d.ts +10 -0
- package/dist/utils/headingLevel.d.ts +16 -0
- package/dist/utils/index.d.ts +6 -0
- package/dist/utils/index.js +4 -0
- package/dist/utils/tone.d.ts +25 -0
- package/dist/utils/useClipboard.d.ts +82 -0
- package/package.json +18 -10
- package/scripts/bundle-css.mjs +25 -0
- package/scripts/check-css-literals.mjs +166 -0
- package/scripts/check-css-variables.mjs +184 -0
- package/scripts/check-css.mjs +27 -0
- package/scripts/css-source.mjs +67 -0
- package/scripts/write-barrel.mjs +60 -0
- package/dist/Accordion-NIMJQIOI.css +0 -88
- package/dist/AppShell-ZW3NSFBP.css +0 -51
- package/dist/Avatar-V6NG6Q45.css +0 -67
- package/dist/Button-XGCTXXYP.css +0 -174
- package/dist/Callout-LEGDIMAM.css +0 -52
- package/dist/Card-BOZGBML7.css +0 -86
- package/dist/Checkbox-OCUICIIZ.css +0 -58
- package/dist/CodeBlock-IEMBNIQC.css +0 -90
- package/dist/Container-LTKBA2FW.css +0 -21
- package/dist/Copyable-IB57OTHZ.css +0 -123
- package/dist/DataTable-3GALZUW2.css +0 -1593
- package/dist/DateTimePicker-NMSSGVPK.css +0 -312
- package/dist/Eyebrow-AVBORAS2.css +0 -30
- package/dist/IconButton-GB4PJDG2.css +0 -82
- package/dist/ImageUpload-3HQDF2KC.css +0 -158
- package/dist/Input-ZHUTN7CU.css +0 -210
- package/dist/Kbd-Q77CDZY7.css +0 -23
- package/dist/Modal-FJVG66S4.css +0 -138
- package/dist/Popover-FUFULUE2.css +0 -123
- package/dist/PricingCard-NKYV3JHA.css +0 -238
- package/dist/Section-665ZIPG6.css +0 -20
- package/dist/Select-GPRF7PRB.css +0 -294
- package/dist/Skeleton-3WEFLRDN.css +0 -378
- package/dist/StatCard-RTJIVTRB.css +0 -50
- package/dist/Table-AR3TRY2E.css +0 -89
- package/dist/Tabs-XZ4JIH3E.css +0 -153
- package/dist/Tag-R5QDJLYJ.css +0 -163
- package/dist/TimeWindowPicker-L3G5Q7UT.css +0 -629
- package/dist/Toaster-2O65VOR4.css +0 -264
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import { type HTMLAttributes, type ReactNode } from 'react';
|
|
2
|
+
import { type HeadingLevel } from '../utils/headingLevel.js';
|
|
3
|
+
export type CardVariant =
|
|
4
|
+
/** One step above the page. */
|
|
5
|
+
'default'
|
|
6
|
+
/**
|
|
7
|
+
* The TILE: the panel's ground with none of its lift, at the tighter inset,
|
|
8
|
+
* for one of many records in a grid. Its default padding is `tight`.
|
|
9
|
+
*/
|
|
10
|
+
| 'subtle'
|
|
11
|
+
/** Transparent, with a strong border. */
|
|
12
|
+
| 'outlined'
|
|
13
|
+
/**
|
|
14
|
+
* A well INSIDE a card: the inset ground, the tighter radius, no border of
|
|
15
|
+
* its own. What a record's own sub-block takes.
|
|
16
|
+
*/
|
|
17
|
+
| 'inset'
|
|
18
|
+
/**
|
|
19
|
+
* The same ground at the tighter radius, with no elevation. What a nested
|
|
20
|
+
* card takes so two borders at one radius do not read as a box drawn twice.
|
|
21
|
+
*/
|
|
22
|
+
| 'quiet'
|
|
23
|
+
/** Lifted off the page. */
|
|
24
|
+
| 'elevated'
|
|
25
|
+
/**
|
|
26
|
+
* A dashed boundary: something that is not quite a record yet. A seat held
|
|
27
|
+
* by a person rather than an agent, a slot waiting to be filled.
|
|
28
|
+
*/
|
|
29
|
+
| 'dashed';
|
|
30
|
+
/**
|
|
31
|
+
* `tight` is 12px on every edge, the inset a tile in a grid takes. `sm` is
|
|
32
|
+
* VERTICAL ONLY, because a card has one left edge and its header sets it:
|
|
33
|
+
* reducing the horizontal inset too puts content on a different vertical line
|
|
34
|
+
* from the title above it, and pushes a code block against the card's right
|
|
35
|
+
* edge with nowhere for its scrollbar to sit. What it is for is content whose
|
|
36
|
+
* rows carry their own vertical rhythm, which is a claim about height rather
|
|
37
|
+
* than about the edge.
|
|
38
|
+
*/
|
|
39
|
+
export type CardPadding = 'none' | 'tight' | 'sm' | 'md' | 'lg';
|
|
40
|
+
/**
|
|
41
|
+
* A section's own padding, on the SAME five steps as the card's own, so one
|
|
42
|
+
* word names one inset wherever it is said. They were two scales sharing two
|
|
43
|
+
* words: `tight` meant 12px on every edge on the card and a vertical-only step
|
|
44
|
+
* on a section, and `md` meant 16px on a card and on a body but 8px over 16px
|
|
45
|
+
* on a footer. A caller who read the card's steps and wrote one on a body got
|
|
46
|
+
* a different inset than the one documented, with nothing to say so.
|
|
47
|
+
*/
|
|
48
|
+
export type CardSectionPadding = CardPadding;
|
|
49
|
+
/**
|
|
50
|
+
* A rail down the card's leading edge, carrying a STATE. The three states a
|
|
51
|
+
* record can be in that a reader scans a grid for, and nothing else: identity
|
|
52
|
+
* (whose seat, which unit, which vendor) is carried by name, glyph and
|
|
53
|
+
* position, never by colour.
|
|
54
|
+
*/
|
|
55
|
+
export type CardRail = 'info' | 'warning' | 'danger';
|
|
56
|
+
export type CardElement = 'div' | 'section' | 'article' | 'li';
|
|
57
|
+
interface CardLook {
|
|
58
|
+
variant?: CardVariant | undefined;
|
|
59
|
+
/**
|
|
60
|
+
* The inset the card's own content takes. `none` lets a table sit flush.
|
|
61
|
+
*
|
|
62
|
+
* WHERE IT IS APPLIED depends on the recipe. A card given raw children takes
|
|
63
|
+
* it on its own surface. A card built from `Card.Header`, `Card.Body` or
|
|
64
|
+
* `Card.Footer` is FLUSH and never carries padding itself, because its slots
|
|
65
|
+
* carry theirs and have to reach its edges: there it is the inset of
|
|
66
|
+
* whatever the card holds BESIDE those slots, which the card draws in a body
|
|
67
|
+
* of its own. Left unset it is `md`, or `tight` for a `subtle` tile.
|
|
68
|
+
*/
|
|
69
|
+
padding?: CardPadding | undefined;
|
|
70
|
+
/** Hover, pointer and focus states. Implied by `href` and `asChild`. */
|
|
71
|
+
interactive?: boolean | undefined;
|
|
72
|
+
rail?: CardRail | undefined;
|
|
73
|
+
/** This card is the one the reader has chosen. */
|
|
74
|
+
selected?: boolean | undefined;
|
|
75
|
+
className?: string | undefined;
|
|
76
|
+
children?: ReactNode;
|
|
77
|
+
}
|
|
78
|
+
export interface CardProps extends HTMLAttributes<HTMLElement>, CardLook {
|
|
79
|
+
/**
|
|
80
|
+
* The element to draw. `section` and `article` are named by `Card.Title`
|
|
81
|
+
* when there is one, so a screen reader listing a page's regions finds the
|
|
82
|
+
* card by its own heading.
|
|
83
|
+
*/
|
|
84
|
+
as?: CardElement | undefined;
|
|
85
|
+
/**
|
|
86
|
+
* The whole card goes somewhere. It draws a REAL anchor: a card that
|
|
87
|
+
* navigates from a click handler cannot be opened in a tab, copied, or
|
|
88
|
+
* announced as a link.
|
|
89
|
+
*/
|
|
90
|
+
href?: string | undefined;
|
|
91
|
+
/** Render the single child element as the card, for a router's own Link. */
|
|
92
|
+
asChild?: boolean | undefined;
|
|
93
|
+
}
|
|
94
|
+
export interface CardHeaderProps extends HTMLAttributes<HTMLDivElement> {
|
|
95
|
+
/**
|
|
96
|
+
* The hairline under the header. ON by default: the header is a bar with a
|
|
97
|
+
* rule under it, which is the shape a reader meets on every screen. Turn it
|
|
98
|
+
* off for a card whose body is one paragraph, where a rule separates a title
|
|
99
|
+
* from the sentence that finishes it.
|
|
100
|
+
*/
|
|
101
|
+
divided?: boolean | undefined;
|
|
102
|
+
/** A glyph before the title. Decoration: the title carries the meaning. */
|
|
103
|
+
icon?: ReactNode;
|
|
104
|
+
/** How many of something the card is about. */
|
|
105
|
+
count?: number | string | undefined;
|
|
106
|
+
/** A second line under the title. It truncates; a title does not. */
|
|
107
|
+
subtitle?: ReactNode;
|
|
108
|
+
/** The card's own controls, at the end of the header row. */
|
|
109
|
+
actions?: ReactNode;
|
|
110
|
+
}
|
|
111
|
+
export interface CardSectionProps extends HTMLAttributes<HTMLDivElement> {
|
|
112
|
+
/**
|
|
113
|
+
* This section's own padding. It is APPLIED, rather than declared and passed
|
|
114
|
+
* to the DOM: the prop used to fall through into the rest spread and render
|
|
115
|
+
* as a `padding="md"` attribute on a div, where it did nothing at all.
|
|
116
|
+
*/
|
|
117
|
+
padding?: CardSectionPadding | undefined;
|
|
118
|
+
}
|
|
119
|
+
export type CardFooterVariant =
|
|
120
|
+
/** Buttons, at the end of the row. */
|
|
121
|
+
'actions'
|
|
122
|
+
/** A quiet strip of facts: a count, a timestamp, a source. */
|
|
123
|
+
| 'meta';
|
|
124
|
+
export interface CardFooterProps extends CardSectionProps {
|
|
125
|
+
variant?: CardFooterVariant | undefined;
|
|
126
|
+
}
|
|
127
|
+
export interface CardTitleProps extends HTMLAttributes<HTMLHeadingElement> {
|
|
128
|
+
/**
|
|
129
|
+
* Overrides the heading element. By default the title takes the level the
|
|
130
|
+
* surrounding surface declares, so the same card is an `h3` under a section
|
|
131
|
+
* heading and an `h2` at the top of a page.
|
|
132
|
+
*/
|
|
133
|
+
as?: `h${HeadingLevel}` | undefined;
|
|
134
|
+
/**
|
|
135
|
+
* A title with nowhere left to go ENDS in an ellipsis rather than being cut.
|
|
136
|
+
*
|
|
137
|
+
* The head is one line and the name block clips, so a title longer than the
|
|
138
|
+
* row is stopped at the header's edge — mid-word, with nothing to say a word
|
|
139
|
+
* was lost. `text-overflow` is the answer to that and it applies to a BLOCK
|
|
140
|
+
* container only, never to a flex one, and the title is flex: the text
|
|
141
|
+
* inside it is an anonymous flex item that no rule in this stylesheet can
|
|
142
|
+
* reach. So the ellipsis is a change of the title's own display, which is a
|
|
143
|
+
* change to what a caller's own children do inside it, which is why it is
|
|
144
|
+
* asked for rather than assumed.
|
|
145
|
+
*
|
|
146
|
+
* OFF BY DEFAULT, because it is not free: a truncating title lays its
|
|
147
|
+
* children out as one line of inline content instead of as centred,
|
|
148
|
+
* gap-separated flex items, so a caller who put a glyph or a tag inside the
|
|
149
|
+
* title gets it on the text baseline with no gap. `Card.Header`'s own `icon`
|
|
150
|
+
* slot is where a glyph belongs, and it is outside the title and unaffected.
|
|
151
|
+
* A title of plain text — which is every title in this package and every one
|
|
152
|
+
* in the engine dashboard — reads identically either way, and is exactly the
|
|
153
|
+
* case that was being cut.
|
|
154
|
+
*/
|
|
155
|
+
truncate?: boolean | undefined;
|
|
156
|
+
}
|
|
157
|
+
export declare const Card: (({ variant, padding, interactive, rail, selected, as, href, asChild, className, children, ...rest }: CardProps) => import("react/jsx-runtime").JSX.Element) & {
|
|
158
|
+
Header: ({ divided, icon, count, subtitle, actions, className, children, ...rest }: CardHeaderProps) => import("react/jsx-runtime").JSX.Element;
|
|
159
|
+
Body: ({ padding, className, children, ...rest }: CardSectionProps) => import("react/jsx-runtime").JSX.Element;
|
|
160
|
+
Footer: ({ variant, padding, className, children, ...rest }: CardFooterProps) => import("react/jsx-runtime").JSX.Element;
|
|
161
|
+
Title: ({ as, truncate, className, children, ...rest }: CardTitleProps) => import("react/jsx-runtime").JSX.Element;
|
|
162
|
+
Description: ({ className, children, ...rest }: HTMLAttributes<HTMLParagraphElement>) => import("react/jsx-runtime").JSX.Element;
|
|
163
|
+
};
|
|
164
|
+
export {};
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The seam a card's header offers the panel inside it: a place on the header
|
|
3
|
+
* row for that panel's OWN controls.
|
|
4
|
+
*
|
|
5
|
+
* WHY A SEAM RATHER THAN A PROP THE CALLER WIRES. A table's pager and its
|
|
6
|
+
* settings cog are the table's: their state is inside it, they move with its
|
|
7
|
+
* pages and they open its frame. A card's header is the card's. Drawing the
|
|
8
|
+
* first inside the second is therefore something neither component can do
|
|
9
|
+
* alone, and every way of faking it puts the join in the CALLER: the screen
|
|
10
|
+
* lifts the table's page into its own state so it can hand a pager to
|
|
11
|
+
* `Card.Header`'s `actions`, or it leaves the table's own bar where it is and
|
|
12
|
+
* pulls it up with a stylesheet of its own. The first makes every panel
|
|
13
|
+
* restate what the table already knows; the second is a rule about class names
|
|
14
|
+
* that no test holds and no reader of the card can see.
|
|
15
|
+
*
|
|
16
|
+
* So the card publishes a slot and the panel draws into it, through the React
|
|
17
|
+
* tree the two already share. The caller composes what it always composed:
|
|
18
|
+
* a card, a header, a table.
|
|
19
|
+
*
|
|
20
|
+
* THE SLOT IS TAKEN BY ONE PANEL. A card holding two tables would otherwise
|
|
21
|
+
* put two pagers and two cogs on one header row, each belonging to rows the
|
|
22
|
+
* reader cannot tell apart. The first to ask holds it; anybody else is told no
|
|
23
|
+
* and keeps its own bar, which is the shape it has outside a card anyway.
|
|
24
|
+
*/
|
|
25
|
+
/** What the card offers, as its header sees it. Internal to [Card]. */
|
|
26
|
+
export interface CardHeaderSlot {
|
|
27
|
+
/**
|
|
28
|
+
* This card draws a header, so there IS a row to sit in. Read from the
|
|
29
|
+
* card's own children at render time rather than reported by the header
|
|
30
|
+
* from an effect: a panel has to know where its controls go on the first
|
|
31
|
+
* frame, and a header that announced itself one commit later would have
|
|
32
|
+
* every table draw a bar and then take it away again.
|
|
33
|
+
*/
|
|
34
|
+
hasHeader: boolean;
|
|
35
|
+
/** The node to draw into. Null until the header has rendered one. */
|
|
36
|
+
node: HTMLElement | null;
|
|
37
|
+
/** Takes the row. True to the one holder; false to everybody after it. */
|
|
38
|
+
claim: (claimant: object) => boolean;
|
|
39
|
+
/** Gives it back, so a panel that unmounts does not hold an empty header. */
|
|
40
|
+
release: (claimant: object) => void;
|
|
41
|
+
}
|
|
42
|
+
export declare const CardHeaderSlotContext: import("react").Context<CardHeaderSlot | null>;
|
|
43
|
+
/** Where a panel's own controls are drawn, once it has asked for a header. */
|
|
44
|
+
export interface CardHeaderChrome {
|
|
45
|
+
/**
|
|
46
|
+
* A card's header is drawing them, so the panel draws no bar of its own.
|
|
47
|
+
* True from the FIRST render inside a card that has a header, before
|
|
48
|
+
* [CardHeaderChrome.node] exists, so nothing is ever drawn in two places.
|
|
49
|
+
*/
|
|
50
|
+
hosted: boolean;
|
|
51
|
+
/** The node to render into, or null while there is nowhere yet. */
|
|
52
|
+
node: HTMLElement | null;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Asks the card above for its header row.
|
|
56
|
+
*
|
|
57
|
+
* `wanted` is whether this panel has controls to put there at all: a table
|
|
58
|
+
* with no pager and no cog asks for nothing, so the card's header stays free
|
|
59
|
+
* for a second table that does have them.
|
|
60
|
+
*
|
|
61
|
+
* The answer is a value rather than a rendered node, so the caller keeps its
|
|
62
|
+
* own controls and decides where to put them; what it gets back is the two
|
|
63
|
+
* facts it cannot work out for itself.
|
|
64
|
+
*/
|
|
65
|
+
export declare function useCardHeaderSlot(wanted: boolean): CardHeaderChrome;
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import './Card.css';
|
|
2
|
+
export { Card } from './Card.js';
|
|
3
|
+
export { useCardHeaderSlot } from './headerSlot.js';
|
|
4
|
+
export type { CardHeaderChrome } from './headerSlot.js';
|
|
5
|
+
export type { CardProps, CardHeaderProps, CardSectionProps, CardFooterProps, CardFooterVariant, CardTitleProps, CardVariant, CardPadding, CardSectionPadding, CardRail, CardElement, } from './Card.js';
|
|
@@ -0,0 +1,450 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Card, THE surface. Everything on a screen is a card, a row inside one, or a
|
|
3
|
+
* control.
|
|
4
|
+
*
|
|
5
|
+
* TWO RECIPES, and the engine dashboard's panel is the second. A card given
|
|
6
|
+
* raw children is a padded block that lifts off the page. A card built from
|
|
7
|
+
* Header, Body and Footer is FLUSH: it carries no padding of its own, its
|
|
8
|
+
* slots carry theirs, and it clips them to its own radius, so the header's
|
|
9
|
+
* hairline and a table's first row reach the card's edges instead of stopping
|
|
10
|
+
* short of them. The component picks the recipe from what it was given.
|
|
11
|
+
*
|
|
12
|
+
* A flush card's own content, where it holds any beside its slots, is drawn in
|
|
13
|
+
* a body: see Card.tsx. Without that the header sits at the card's inset and
|
|
14
|
+
* the sentence under it against the border, which is the shape this file's
|
|
15
|
+
* `p-none` used to leave behind.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
.crewlet-card {
|
|
19
|
+
position: relative;
|
|
20
|
+
display: flex;
|
|
21
|
+
flex-direction: column;
|
|
22
|
+
min-width: 0;
|
|
23
|
+
background-color: var(--color-surface-subtle);
|
|
24
|
+
border: 1px solid var(--color-border-default);
|
|
25
|
+
border-radius: var(--radius-lg);
|
|
26
|
+
color: var(--color-text-primary);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/*
|
|
30
|
+
* TWO GROUNDS, TWO DEVICES. On light the shadow is the elevation; on dark a
|
|
31
|
+
* shadow over a dark page is nearly invisible, so the hairline along the top
|
|
32
|
+
* edge does the job instead.
|
|
33
|
+
*
|
|
34
|
+
* THE HAIRLINE IS ON ITS OWN ELEMENT, and that is the whole reason the rule is
|
|
35
|
+
* two rules. `--shadow-hairline` is `none` in the light theme, and `none` is a
|
|
36
|
+
* value a shadow list may not carry: `box-shadow: <shadow>, none` is invalid at
|
|
37
|
+
* computed-value time, so the declaration is dropped and the light card loses
|
|
38
|
+
* the elevation the list was built around. Alone on a pseudo element the same
|
|
39
|
+
* token is valid in both themes, and it composes with the selection ring
|
|
40
|
+
* rather than replacing whichever was declared last, exactly as the rail does.
|
|
41
|
+
*/
|
|
42
|
+
.crewlet-card--default:not(.crewlet-card--flush) {
|
|
43
|
+
box-shadow: var(--shadow-xs);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
.crewlet-card--default:not(.crewlet-card--flush)::after,
|
|
47
|
+
.crewlet-card--elevated::after {
|
|
48
|
+
content: '';
|
|
49
|
+
position: absolute;
|
|
50
|
+
inset: 0;
|
|
51
|
+
border-radius: inherit;
|
|
52
|
+
pointer-events: none;
|
|
53
|
+
box-shadow: var(--shadow-hairline);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
.crewlet-card--default {
|
|
57
|
+
background-color: var(--color-surface-subtle);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/*
|
|
61
|
+
* THE TILE: the panel's ground with none of its lift. One of many in a grid,
|
|
62
|
+
* where a shadow under every card turns a list of records into a relief map.
|
|
63
|
+
*
|
|
64
|
+
* It used to take the PAGE's ground, which is a card drawn in the colour of
|
|
65
|
+
* the thing behind it: on the light palette a white tile on a white page, held
|
|
66
|
+
* together by its hairline alone, and on dark the same trick one step darker
|
|
67
|
+
* than the panel beside it. The ground here is the one every other card
|
|
68
|
+
* already stands on, so every ink measured against a card is measured against
|
|
69
|
+
* this too.
|
|
70
|
+
*/
|
|
71
|
+
.crewlet-card--subtle {
|
|
72
|
+
background-color: var(--color-surface-subtle);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
.crewlet-card--outlined {
|
|
76
|
+
background-color: transparent;
|
|
77
|
+
border-color: var(--color-border-strong);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/*
|
|
81
|
+
* A well rather than a panel: the inset ground, and the tighter radius that
|
|
82
|
+
* says it is a block INSIDE a card rather than a card of its own.
|
|
83
|
+
*/
|
|
84
|
+
.crewlet-card--inset {
|
|
85
|
+
background-color: var(--color-surface-inset);
|
|
86
|
+
border-color: transparent;
|
|
87
|
+
border-radius: var(--radius-md);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/*
|
|
91
|
+
* A card that is not the page's main surface: the same ground, the tighter
|
|
92
|
+
* radius, and no elevation at all. It is what a nested block takes so two
|
|
93
|
+
* borders at the same radius do not read as one box drawn twice.
|
|
94
|
+
*/
|
|
95
|
+
.crewlet-card--quiet {
|
|
96
|
+
background-color: var(--color-surface-subtle);
|
|
97
|
+
border-radius: var(--radius-md);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
.crewlet-card--elevated {
|
|
101
|
+
background-color: var(--color-surface-elevated);
|
|
102
|
+
box-shadow: var(--shadow-md);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/*
|
|
106
|
+
* Not a record yet. A dashed boundary says "this slot is defined and empty"
|
|
107
|
+
* where a solid one would claim there is something in it.
|
|
108
|
+
*/
|
|
109
|
+
.crewlet-card--dashed {
|
|
110
|
+
background-color: transparent;
|
|
111
|
+
border-style: dashed;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/*
|
|
115
|
+
* THE FLUSH RECIPE. The slots reach the card's edges, and the clip is what
|
|
116
|
+
* makes the header's hairline and a table's own corners follow the radius
|
|
117
|
+
* instead of crossing it. The selection ring survives the clip because it is
|
|
118
|
+
* an INSET shadow; an outset one would be cut off here.
|
|
119
|
+
*/
|
|
120
|
+
.crewlet-card--flush {
|
|
121
|
+
overflow: hidden;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/* ---- The inset scale ---------------------------------------------------- */
|
|
125
|
+
|
|
126
|
+
/*
|
|
127
|
+
* ONE WORD, ONE INSET, wherever it is said. A card's own padding, a body's and
|
|
128
|
+
* a footer's are the same five steps, because they are one decision asked at
|
|
129
|
+
* three levels. They used to be two scales that shared two words: `tight` was
|
|
130
|
+
* 12px on every edge on the card and a vertical-only step in a section, and
|
|
131
|
+
* `md` was 16px on every edge on the card and on a body and 8px over 16px on a
|
|
132
|
+
* footer. A caller who read the card's steps and wrote one on a body got a
|
|
133
|
+
* different inset, with nothing to say so.
|
|
134
|
+
*
|
|
135
|
+
* TIGHT IS THE TILE'S INSET, on every edge: one of many records in a grid,
|
|
136
|
+
* where at the panel's own step each tile spends a third of its height on air
|
|
137
|
+
* and the grid reads as a page of panels rather than as a list.
|
|
138
|
+
*
|
|
139
|
+
* SM IS VERTICAL ONLY, because a card has ONE left edge and its header sets
|
|
140
|
+
* it. Reducing the horizontal inset too puts content on a different vertical
|
|
141
|
+
* line from the title above it, and pushes a code block against the card's
|
|
142
|
+
* right edge with nowhere for its scrollbar to sit. What it is for is content
|
|
143
|
+
* whose rows carry their own vertical rhythm, which is a claim about height
|
|
144
|
+
* rather than about the edge.
|
|
145
|
+
*
|
|
146
|
+
* The step is the ONLY place any of these three declares a padding, so no base
|
|
147
|
+
* rule ties with a step on specificity and wins on source order instead.
|
|
148
|
+
*/
|
|
149
|
+
.crewlet-card--p-none,
|
|
150
|
+
.crewlet-card__body--p-none,
|
|
151
|
+
.crewlet-card__footer--p-none {
|
|
152
|
+
padding: 0;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
.crewlet-card--p-tight,
|
|
156
|
+
.crewlet-card__body--p-tight,
|
|
157
|
+
.crewlet-card__footer--p-tight {
|
|
158
|
+
padding: var(--spacing-3);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
.crewlet-card--p-sm,
|
|
162
|
+
.crewlet-card__body--p-sm,
|
|
163
|
+
.crewlet-card__footer--p-sm {
|
|
164
|
+
padding: var(--spacing-2) var(--spacing-4);
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
.crewlet-card--p-md,
|
|
168
|
+
.crewlet-card__body--p-md,
|
|
169
|
+
.crewlet-card__footer--p-md {
|
|
170
|
+
padding: var(--spacing-4);
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
.crewlet-card--p-lg,
|
|
174
|
+
.crewlet-card__body--p-lg,
|
|
175
|
+
.crewlet-card__footer--p-lg {
|
|
176
|
+
padding: var(--spacing-5) var(--spacing-6);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/* ---- Interaction ------------------------------------------------------- */
|
|
180
|
+
|
|
181
|
+
.crewlet-card.is-interactive {
|
|
182
|
+
cursor: pointer;
|
|
183
|
+
text-decoration: none;
|
|
184
|
+
transition:
|
|
185
|
+
border-color var(--motion-duration-base) var(--motion-easing-default),
|
|
186
|
+
box-shadow var(--motion-duration-base) var(--motion-easing-default);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
.crewlet-card.is-interactive:hover {
|
|
190
|
+
border-color: var(--color-border-hover);
|
|
191
|
+
box-shadow: var(--shadow-md);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
.crewlet-card.is-interactive:focus-visible {
|
|
195
|
+
outline: 2px solid var(--color-focus);
|
|
196
|
+
outline-offset: 2px;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/*
|
|
200
|
+
* Chosen. A ring rather than a tint, because a card carries its own surface
|
|
201
|
+
* and a tint under it would change the ground every value on it was measured
|
|
202
|
+
* against.
|
|
203
|
+
*/
|
|
204
|
+
.crewlet-card.is-selected {
|
|
205
|
+
box-shadow: var(--shadow-selection);
|
|
206
|
+
border-color: var(--color-brand-accent);
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/* ---- Rails ------------------------------------------------------------- */
|
|
210
|
+
|
|
211
|
+
/*
|
|
212
|
+
* A state down the leading edge. Drawn as a pseudo element rather than a
|
|
213
|
+
* border or an inset shadow, so it composes with the elevated shadow and the
|
|
214
|
+
* selection ring instead of replacing whichever one was declared last.
|
|
215
|
+
*/
|
|
216
|
+
.crewlet-card--rail-info::before,
|
|
217
|
+
.crewlet-card--rail-warning::before,
|
|
218
|
+
.crewlet-card--rail-danger::before {
|
|
219
|
+
content: '';
|
|
220
|
+
position: absolute;
|
|
221
|
+
inset-block: 0;
|
|
222
|
+
inset-inline-start: 0;
|
|
223
|
+
width: 3px;
|
|
224
|
+
border-start-start-radius: var(--radius-lg);
|
|
225
|
+
border-end-start-radius: var(--radius-lg);
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
.crewlet-card--rail-info::before {
|
|
229
|
+
background: var(--color-feedback-info);
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
.crewlet-card--rail-warning::before {
|
|
233
|
+
background: var(--color-feedback-warning);
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
.crewlet-card--rail-danger::before {
|
|
237
|
+
background: var(--color-feedback-danger);
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
/* ---- Slots ------------------------------------------------------------- */
|
|
241
|
+
|
|
242
|
+
/*
|
|
243
|
+
* The panel head: ONE LINE, at the card's own inset, with the rule under it
|
|
244
|
+
* reaching both edges. `--size-row-lg` is the floor, so a row of nothing but a
|
|
245
|
+
* title stands as tall as the rows on every other card; a control taller than
|
|
246
|
+
* what is left of it after the inset raises the row, which is what a head with
|
|
247
|
+
* a button in it draws.
|
|
248
|
+
*/
|
|
249
|
+
.crewlet-card__header {
|
|
250
|
+
display: flex;
|
|
251
|
+
align-items: center;
|
|
252
|
+
gap: var(--spacing-3);
|
|
253
|
+
min-height: var(--size-row-lg);
|
|
254
|
+
padding: var(--spacing-3) var(--spacing-4);
|
|
255
|
+
border-bottom: 1px solid var(--color-border-default);
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
/*
|
|
259
|
+
* A head with nothing under it to separate from: a card whose body is prose
|
|
260
|
+
* rather than rows. It keeps the inset and gives up the rule.
|
|
261
|
+
*/
|
|
262
|
+
.crewlet-card__header--plain {
|
|
263
|
+
border-bottom: none;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
/*
|
|
267
|
+
* The name block. It CLIPS, because the head is one line: a title with nowhere
|
|
268
|
+
* left to go is cut at the row's end rather than allowed to spill across the
|
|
269
|
+
* controls beside it.
|
|
270
|
+
*/
|
|
271
|
+
.crewlet-card__header-main {
|
|
272
|
+
display: flex;
|
|
273
|
+
align-items: center;
|
|
274
|
+
gap: var(--spacing-2);
|
|
275
|
+
min-width: 0;
|
|
276
|
+
overflow: hidden;
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
.crewlet-card__header-icon {
|
|
280
|
+
display: inline-flex;
|
|
281
|
+
flex: none;
|
|
282
|
+
color: var(--color-text-tertiary);
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
/*
|
|
286
|
+
* The actions take the end of the row, and the auto margin is the spacer
|
|
287
|
+
* between them and the title block. Not `justify-content: space-between`: the
|
|
288
|
+
* subtitle is a third child, and space-between would push it into the middle
|
|
289
|
+
* of the line rather than leaving it beside the name it belongs to.
|
|
290
|
+
*/
|
|
291
|
+
.crewlet-card__header-actions {
|
|
292
|
+
display: flex;
|
|
293
|
+
align-items: center;
|
|
294
|
+
gap: var(--spacing-2);
|
|
295
|
+
flex: none;
|
|
296
|
+
margin-inline-start: auto;
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
/*
|
|
300
|
+
* The panel's own controls: a table's pager and its settings cog, drawn on
|
|
301
|
+
* this row rather than in a bar of their own under it. See Card/headerSlot.ts
|
|
302
|
+
* for how they get here.
|
|
303
|
+
*
|
|
304
|
+
* NO BOX WHEN THERE IS NOTHING IN IT. Every header inside a card renders this
|
|
305
|
+
* node, because the panel that might fill it is below the header in the tree.
|
|
306
|
+
* An empty one that still laid out would open the row's gap on every card in
|
|
307
|
+
* the product for a control nobody drew.
|
|
308
|
+
*/
|
|
309
|
+
.crewlet-card__header-chrome {
|
|
310
|
+
display: flex;
|
|
311
|
+
align-items: center;
|
|
312
|
+
flex: none;
|
|
313
|
+
margin-inline-start: auto;
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
.crewlet-card__header-chrome:empty {
|
|
317
|
+
display: none;
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
/*
|
|
321
|
+
* The card's own actions take the end of the row and the panel's controls
|
|
322
|
+
* close onto them, so the cog stays the last thing on the line. Without this
|
|
323
|
+
* both carry the auto margin, and two auto margins SPLIT the free space: the
|
|
324
|
+
* card's actions would drift into the middle of its own header.
|
|
325
|
+
*/
|
|
326
|
+
.crewlet-card__header-actions ~ .crewlet-card__header-chrome {
|
|
327
|
+
margin-inline-start: 0;
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
/*
|
|
331
|
+
* The panel body. Its inset is a step of the scale above, and a card's own
|
|
332
|
+
* children are drawn in one of these whenever its slots have made it flush:
|
|
333
|
+
* see Card.tsx.
|
|
334
|
+
*/
|
|
335
|
+
.crewlet-card__body {
|
|
336
|
+
display: flex;
|
|
337
|
+
flex-direction: column;
|
|
338
|
+
gap: var(--spacing-3);
|
|
339
|
+
min-width: 0;
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
/*
|
|
343
|
+
* The panel foot: a quiet strip at the card's inset, in the caption register.
|
|
344
|
+
* A row of buttons carries its own ink, so the tertiary step here is what the
|
|
345
|
+
* facts beside them take.
|
|
346
|
+
*/
|
|
347
|
+
.crewlet-card__footer {
|
|
348
|
+
display: flex;
|
|
349
|
+
align-items: center;
|
|
350
|
+
gap: var(--spacing-2);
|
|
351
|
+
border-top: 1px solid var(--color-border-default);
|
|
352
|
+
font-size: var(--font-size-xs);
|
|
353
|
+
color: var(--color-text-tertiary);
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
.crewlet-card__footer--actions {
|
|
357
|
+
justify-content: flex-end;
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
.crewlet-card__footer--meta {
|
|
361
|
+
justify-content: flex-start;
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
/* A footer with no inset has no rule either: there is no strip left to draw. */
|
|
365
|
+
.crewlet-card__footer--p-none {
|
|
366
|
+
border-top: none;
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
/*
|
|
370
|
+
* The page's leading rather than the baseline's heading leading. The title is
|
|
371
|
+
* a heading element, and it shares one row with a subtitle, a count and the
|
|
372
|
+
* card's own controls: at the tight step it is the one thing in the header on
|
|
373
|
+
* a different rhythm from everything beside it, which is what made a head with
|
|
374
|
+
* a button in it a pixel taller than one without.
|
|
375
|
+
*/
|
|
376
|
+
.crewlet-card__title {
|
|
377
|
+
margin: 0;
|
|
378
|
+
display: flex;
|
|
379
|
+
align-items: center;
|
|
380
|
+
gap: var(--spacing-2);
|
|
381
|
+
min-width: 0;
|
|
382
|
+
/*
|
|
383
|
+
* ONE LINE, which is the head's own rule. Left to wrap, a title one pixel
|
|
384
|
+
* wider than the space the subtitle beside it had left broke over two lines
|
|
385
|
+
* and took the whole head from 48px to 67px: at 1100px wide, "By model" was
|
|
386
|
+
* drawn as "By" over "model" while the subtitle beside it still had a tail
|
|
387
|
+
* to give up. Which is what the subtitle does first; see below.
|
|
388
|
+
*/
|
|
389
|
+
white-space: nowrap;
|
|
390
|
+
font-size: var(--font-size-sm);
|
|
391
|
+
font-weight: var(--font-weight-semibold);
|
|
392
|
+
line-height: var(--font-line-height-normal);
|
|
393
|
+
letter-spacing: var(--font-letter-spacing-tight);
|
|
394
|
+
color: var(--color-text-primary);
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
/*
|
|
398
|
+
* A TITLE THAT ENDS RATHER THAN STOPS, where a caller has asked for it.
|
|
399
|
+
*
|
|
400
|
+
* The name block clips, which is what keeps the head one line, so a title
|
|
401
|
+
* wider than the row is cut at the header's edge — mid-word, with nothing to
|
|
402
|
+
* say a word was lost. `text-overflow` is the rule that says it, and it
|
|
403
|
+
* applies to a BLOCK container only: on the flex title above it does nothing
|
|
404
|
+
* at all, and the text it would act on is an anonymous flex item that no
|
|
405
|
+
* selector here can reach. So the modifier makes the title a block. Its
|
|
406
|
+
* children are then one line of inline content rather than centred flex items
|
|
407
|
+
* with a gap between them, which is the whole of what a caller opts into, and
|
|
408
|
+
* why this is a modifier rather than the base rule.
|
|
409
|
+
*
|
|
410
|
+
* `white-space: nowrap` is already the title's own, and `min-width: 0` is what
|
|
411
|
+
* lets the block shrink below its content inside the name block; both stand.
|
|
412
|
+
*/
|
|
413
|
+
.crewlet-card__title--truncate {
|
|
414
|
+
display: block;
|
|
415
|
+
overflow: hidden;
|
|
416
|
+
text-overflow: ellipsis;
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
/*
|
|
420
|
+
* The subtitle gives up its tail and the title does not: a title is the
|
|
421
|
+
* record's identity and has to be read in full, while a subtitle is context.
|
|
422
|
+
*
|
|
423
|
+
* WHICH IS WHAT THE SHRINK FACTOR SAYS. Two flex items that both may shrink
|
|
424
|
+
* give up space in proportion to their widths, so a head one pixel too narrow
|
|
425
|
+
* took that pixel off the title as well, and the title has nowhere to put it
|
|
426
|
+
* but a second line. At a hundred to the title's one the subtitle absorbs
|
|
427
|
+
* effectively all of it, down to nothing, before the title gives up a pixel.
|
|
428
|
+
*/
|
|
429
|
+
.crewlet-card__subtitle {
|
|
430
|
+
flex-shrink: 100;
|
|
431
|
+
font-size: var(--font-size-xs);
|
|
432
|
+
color: var(--color-text-tertiary);
|
|
433
|
+
overflow: hidden;
|
|
434
|
+
text-overflow: ellipsis;
|
|
435
|
+
white-space: nowrap;
|
|
436
|
+
min-width: 0;
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
.crewlet-card__description {
|
|
440
|
+
margin: 0;
|
|
441
|
+
font-size: var(--font-size-compact);
|
|
442
|
+
line-height: var(--font-line-height-normal);
|
|
443
|
+
color: var(--color-text-secondary);
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
@media (prefers-reduced-motion: reduce) {
|
|
447
|
+
.crewlet-card.is-interactive {
|
|
448
|
+
transition: none;
|
|
449
|
+
}
|
|
450
|
+
}
|