@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,41 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
/** What a caller is handed when it draws the link element itself. */
|
|
3
|
+
export interface BrandLinkProps {
|
|
4
|
+
className: string;
|
|
5
|
+
children: ReactNode;
|
|
6
|
+
/** Present only when `href` was given; a router link takes its own target. */
|
|
7
|
+
href?: string | undefined;
|
|
8
|
+
'aria-label': string;
|
|
9
|
+
}
|
|
10
|
+
export interface BrandLockupProps {
|
|
11
|
+
/** The product's name, and the name of the link. Required, for that reason. */
|
|
12
|
+
name: string;
|
|
13
|
+
/** The mark. DECORATION: the name beside it is what a reader is told. */
|
|
14
|
+
mark?: ReactNode;
|
|
15
|
+
/**
|
|
16
|
+
* Where the reader is: the company, the workspace, "Superadmin". It sits
|
|
17
|
+
* under the product name, because on this screen the company is the subject
|
|
18
|
+
* and the product is the tool.
|
|
19
|
+
*/
|
|
20
|
+
context?: ReactNode;
|
|
21
|
+
/** Home. Without it, and without `renderLink`, the lockup is not a link. */
|
|
22
|
+
href?: string | undefined;
|
|
23
|
+
/** Draws the link element, for a router that owns navigation (conlet's NavLink). */
|
|
24
|
+
renderLink?: ((props: BrandLinkProps) => ReactNode) | undefined;
|
|
25
|
+
className?: string | undefined;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* The mark, the product name and what the reader is inside, as one block at
|
|
29
|
+
* the head of the rail.
|
|
30
|
+
*
|
|
31
|
+
* THE LINK IS NAMED BY THE PRODUCT, and the context line is outside it. Inside
|
|
32
|
+
* it, the link's accessible name would be "Crewlet Acme Holdings" and would
|
|
33
|
+
* change whenever the company was renamed, so the one landmark that always
|
|
34
|
+
* means "go home" would be announced differently on every deployment. It stays
|
|
35
|
+
* readable, drawn on the line below and indented to the name above it by the
|
|
36
|
+
* mark's own box, which is a component variable rather than a guess.
|
|
37
|
+
*
|
|
38
|
+
* The mark is hidden from assistive technology: a logo beside its own name is
|
|
39
|
+
* the definition of decoration.
|
|
40
|
+
*/
|
|
41
|
+
export declare function BrandLockup({ name, mark, context, href, renderLink, className }: BrandLockupProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* The brand lockup at the head of the rail.
|
|
3
|
+
*
|
|
4
|
+
* ONE INSET FOR THE WHOLE RAIL, so the mark, the group labels and the row
|
|
5
|
+
* text all start on the same vertical line. The lockup has no row of its own,
|
|
6
|
+
* so it adds the rail's gutter to a row's pad rather than spending a literal
|
|
7
|
+
* somebody has to remember to move when either changes.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
/*
|
|
11
|
+
* IT FITS THE BAR IT IS DRAWN BESIDE. The rail's head is the top bar's own
|
|
12
|
+
* height (64px, a fixed token at every density), so the lockup has to come in
|
|
13
|
+
* under that height with its context line on: mark 24 plus one 11px line at
|
|
14
|
+
* the document's own leading plus twice the block padding is 56.5px at the
|
|
15
|
+
* normal density and 58.7px at comfortable. It was 66.5px, which grew the head
|
|
16
|
+
* past the bar and put a visible kink across the window on every deployment
|
|
17
|
+
* that names a company.
|
|
18
|
+
*
|
|
19
|
+
* NO GAP BETWEEN THE TWO LINES. They are one lockup rather than two stacked
|
|
20
|
+
* labels, and the leading is the space between them: a gap on top of it reads
|
|
21
|
+
* as a product name with a caption under it, which is the wrong relation. Both
|
|
22
|
+
* lines take the DOCUMENT'S leading rather than a tight step of their own,
|
|
23
|
+
* because the eight pixels it spends here are eight the rail's head already
|
|
24
|
+
* has and the two lines otherwise sit closer together than any other pair of
|
|
25
|
+
* lines in the product.
|
|
26
|
+
*/
|
|
27
|
+
.crewlet-brand {
|
|
28
|
+
display: flex;
|
|
29
|
+
flex-direction: column;
|
|
30
|
+
justify-content: center;
|
|
31
|
+
min-width: 0;
|
|
32
|
+
/* The mark's box, and what the context line is indented by. It is also the
|
|
33
|
+
link's target height, so it sits on the 24px floor rather than under it.
|
|
34
|
+
A consumer with a wider mark sets this rather than editing two rules. */
|
|
35
|
+
--crewlet-brand-mark: 24px;
|
|
36
|
+
padding: var(--spacing-2) calc(var(--size-nav-gutter) + var(--size-nav-row-pad));
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
.crewlet-brand__home {
|
|
40
|
+
display: inline-flex;
|
|
41
|
+
align-items: center;
|
|
42
|
+
align-self: flex-start;
|
|
43
|
+
gap: var(--spacing-2);
|
|
44
|
+
min-width: 0;
|
|
45
|
+
max-width: 100%;
|
|
46
|
+
border-radius: var(--radius-sm);
|
|
47
|
+
color: var(--color-text-primary);
|
|
48
|
+
text-decoration: none;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
.crewlet-brand__home:focus-visible {
|
|
52
|
+
outline: 2px solid var(--color-focus);
|
|
53
|
+
outline-offset: 2px;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
.crewlet-brand__mark {
|
|
57
|
+
display: inline-flex;
|
|
58
|
+
align-items: center;
|
|
59
|
+
justify-content: center;
|
|
60
|
+
flex: none;
|
|
61
|
+
width: var(--crewlet-brand-mark);
|
|
62
|
+
height: var(--crewlet-brand-mark);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
.crewlet-brand__mark > * {
|
|
66
|
+
width: 100%;
|
|
67
|
+
height: 100%;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
.crewlet-brand__name {
|
|
71
|
+
font-family: var(--font-family-sans);
|
|
72
|
+
font-size: var(--font-size-sm);
|
|
73
|
+
font-weight: var(--font-weight-semibold);
|
|
74
|
+
letter-spacing: var(--font-letter-spacing-tight);
|
|
75
|
+
line-height: var(--font-line-height-normal);
|
|
76
|
+
color: var(--color-text-primary);
|
|
77
|
+
overflow: hidden;
|
|
78
|
+
text-overflow: ellipsis;
|
|
79
|
+
white-space: nowrap;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/* Indented to the name above it by the mark's own box, and truncated: a
|
|
83
|
+
company name is as long as somebody registered it.
|
|
84
|
+
|
|
85
|
+
THE RAIL'S OWN MICRO-LABEL REGISTER, which is the wide step rather than the
|
|
86
|
+
wider one an Eyebrow takes: this line and the nav's group labels are the two
|
|
87
|
+
uppercase runs in the rail, they sit twenty pixels apart, and at the wider
|
|
88
|
+
step the company's name was visibly broader than the sections under it
|
|
89
|
+
rather than quieter than them. The suite holds the two together. */
|
|
90
|
+
.crewlet-brand__context {
|
|
91
|
+
padding-left: calc(var(--crewlet-brand-mark) + var(--spacing-2));
|
|
92
|
+
font-family: var(--font-family-sans);
|
|
93
|
+
font-size: var(--font-size-2xs);
|
|
94
|
+
/* THE REGULAR WEIGHT, which is the one thing that separates this line from
|
|
95
|
+
the nav's group labels below it. The two are the only uppercase runs in
|
|
96
|
+
the rail and they sit twenty pixels apart; drawn at the same size, the
|
|
97
|
+
same tracking and the same weight they read as two headings of one list
|
|
98
|
+
rather than as the company's name above the sections in it. A group name
|
|
99
|
+
is what a reader scans, so the weight stays there and goes from here. */
|
|
100
|
+
font-weight: var(--font-weight-regular);
|
|
101
|
+
letter-spacing: var(--font-letter-spacing-wide);
|
|
102
|
+
line-height: var(--font-line-height-normal);
|
|
103
|
+
text-transform: uppercase;
|
|
104
|
+
color: var(--color-text-tertiary);
|
|
105
|
+
overflow: hidden;
|
|
106
|
+
text-overflow: ellipsis;
|
|
107
|
+
white-space: nowrap;
|
|
108
|
+
}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { type AnchorHTMLAttributes, type ButtonHTMLAttributes, type ReactNode } from 'react';
|
|
2
|
+
export type ButtonVariant = 'primary' | 'secondary' | 'outline' | 'tertiary' | 'accent' | 'danger';
|
|
3
|
+
export type ButtonSize = 'small' | 'medium' | 'large';
|
|
4
|
+
export type ButtonShape = 'square' | 'pill';
|
|
5
|
+
interface ButtonLook {
|
|
6
|
+
/** The hierarchy, not a palette: primary is the one action on the screen. */
|
|
7
|
+
variant?: ButtonVariant | undefined;
|
|
8
|
+
size?: ButtonSize | undefined;
|
|
9
|
+
shape?: ButtonShape | undefined;
|
|
10
|
+
/** Drawn before the label. A glyph component, not a name. */
|
|
11
|
+
leadingIcon?: ReactNode;
|
|
12
|
+
/** Drawn after the label: a chevron, an external mark, a count. */
|
|
13
|
+
trailingIcon?: ReactNode;
|
|
14
|
+
/** Fills the line it is on. */
|
|
15
|
+
block?: boolean | undefined;
|
|
16
|
+
className?: string | undefined;
|
|
17
|
+
children?: ReactNode;
|
|
18
|
+
}
|
|
19
|
+
export interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement>, ButtonLook {
|
|
20
|
+
/** Sets `aria-pressed`: a toggle that is on, such as a filter. */
|
|
21
|
+
pressed?: boolean | undefined;
|
|
22
|
+
/**
|
|
23
|
+
* Mid-action. The spinner takes the leading icon's place, the label stays
|
|
24
|
+
* put, and the press does nothing.
|
|
25
|
+
*
|
|
26
|
+
* NOT the native `disabled`, which takes focus away from the control the
|
|
27
|
+
* reader just used and drops it on the page body, then refuses to give it
|
|
28
|
+
* back when the action finishes. `aria-disabled` with `aria-busy` says the
|
|
29
|
+
* same thing to a screen reader and leaves focus where it was.
|
|
30
|
+
*/
|
|
31
|
+
loading?: boolean | undefined;
|
|
32
|
+
/**
|
|
33
|
+
* Unavailable, and why. It reads the same as `disabled` to a screen reader
|
|
34
|
+
* and keeps its focus and its pointer events, which is the whole point: a
|
|
35
|
+
* natively disabled button takes no hover and no focus, so the tooltip
|
|
36
|
+
* explaining why "Review and save" cannot be pressed is unreachable by
|
|
37
|
+
* exactly the reader who needs it. The reason is linked with
|
|
38
|
+
* `aria-describedby`, so it is read after the name rather than instead of it.
|
|
39
|
+
*/
|
|
40
|
+
disabledReason?: string | undefined;
|
|
41
|
+
/**
|
|
42
|
+
* Render the single child element with the Button's styling merged onto it
|
|
43
|
+
* instead of a native button, to put this look on a router's own Link while
|
|
44
|
+
* keeping its navigation. Mirrors the Radix `asChild` API.
|
|
45
|
+
*
|
|
46
|
+
* Ignored by `loading`: a link has no pending state to show.
|
|
47
|
+
*/
|
|
48
|
+
asChild?: boolean | undefined;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* The button recipe, spelled once for every element drawn as a button.
|
|
52
|
+
*
|
|
53
|
+
* IT FORWARDS EVERYTHING. A menu trigger needs `aria-haspopup`,
|
|
54
|
+
* `aria-expanded`, `aria-controls`, a ref to hand focus back to and a
|
|
55
|
+
* `tabIndex` of -1 when the keyboard reaches its actions another way; a list's
|
|
56
|
+
* Move buttons need a ref and a name longer than their tooltip; a canvas node
|
|
57
|
+
* needs a data attribute a stylesheet reads. Without those, each of them
|
|
58
|
+
* hand-wrote the class list beside the primitive, and a recipe spelled in two
|
|
59
|
+
* places is how the two drift apart.
|
|
60
|
+
*
|
|
61
|
+
* An icon-only button is named by its `title` unless `aria-label` names it
|
|
62
|
+
* more precisely: "Move goal 2 of 3 up" where the tooltip says "Move up".
|
|
63
|
+
*/
|
|
64
|
+
export declare const Button: import("react").ForwardRefExoticComponent<ButtonProps & import("react").RefAttributes<HTMLButtonElement>>;
|
|
65
|
+
export interface ButtonLinkProps extends AnchorHTMLAttributes<HTMLAnchorElement>, ButtonLook {
|
|
66
|
+
href: string;
|
|
67
|
+
/**
|
|
68
|
+
* Leaves the application. Opens a tab and withholds the referrer and the
|
|
69
|
+
* opener, which a link to somebody else's site must never be without, and
|
|
70
|
+
* draws the mark that says so unless the caller supplies its own trailing
|
|
71
|
+
* icon or turns it off.
|
|
72
|
+
*/
|
|
73
|
+
external?: boolean | undefined;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* A link drawn as a button: it goes somewhere rather than doing something.
|
|
77
|
+
*
|
|
78
|
+
* An action that navigates has to be a real anchor, so it can be opened in a
|
|
79
|
+
* tab, copied, and read as a link. It wears exactly the class list the
|
|
80
|
+
* matching Button wears, because it used to be a hand-written anchor carrying
|
|
81
|
+
* the recipe at each call site.
|
|
82
|
+
*
|
|
83
|
+
* There is deliberately no `asChild` here and no `loading`: `asChild` would
|
|
84
|
+
* push `target` and `rel` back out to every call site, and a link has no
|
|
85
|
+
* pending state.
|
|
86
|
+
*/
|
|
87
|
+
export declare const ButtonLink: import("react").ForwardRefExoticComponent<ButtonLinkProps & import("react").RefAttributes<HTMLAnchorElement>>;
|
|
88
|
+
export {};
|
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* The button, and the link drawn as one.
|
|
3
|
+
*
|
|
4
|
+
* SIX VARIANTS, AND THEY ARE A HIERARCHY RATHER THAN A PALETTE. primary is the
|
|
5
|
+
* one action on the screen and takes the accent fill; secondary is everything
|
|
6
|
+
* else; outline is the branded yes on a page that already has a primary;
|
|
7
|
+
* tertiary is for a dense toolbar; danger is destructive, and the only one
|
|
8
|
+
* that spends the critical hue. accent is primary's own recipe under the name
|
|
9
|
+
* a caller may already have written.
|
|
10
|
+
*
|
|
11
|
+
* THE ONE ACTION IS THE ACCENT FILL. It reads as the answer a screen is
|
|
12
|
+
* asking for, which is what a filled monochrome button could not do beside a
|
|
13
|
+
* secondary of the same neutral family: on the dark palette a white primary
|
|
14
|
+
* and a light-grey secondary were one pair of greys, and the reader had to
|
|
15
|
+
* compare them to find the action.
|
|
16
|
+
*
|
|
17
|
+
* Every size is a --size-control-* step, so a button, a select and an input in
|
|
18
|
+
* one row are the same height at every density, and none of them can fall
|
|
19
|
+
* under the 24px a finger can hit. The padding ramp is one spacing step per
|
|
20
|
+
* size, so a small button in a toolbar is tight and a large one on a landing
|
|
21
|
+
* page is not.
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
.crewlet-btn {
|
|
25
|
+
display: inline-flex;
|
|
26
|
+
align-items: center;
|
|
27
|
+
justify-content: center;
|
|
28
|
+
gap: var(--spacing-2);
|
|
29
|
+
border: 1px solid transparent;
|
|
30
|
+
border-radius: var(--radius-md);
|
|
31
|
+
font-family: var(--font-family-sans);
|
|
32
|
+
/*
|
|
33
|
+
* MEDIUM, and the tracking left alone. A control's label is read at a
|
|
34
|
+
* glance rather than for sense, and the semibold it carried made a row of
|
|
35
|
+
* three buttons read as three headings; the negative tracking it carried
|
|
36
|
+
* with it is a display-size correction that closes up 12px text.
|
|
37
|
+
*/
|
|
38
|
+
font-weight: var(--font-weight-medium);
|
|
39
|
+
letter-spacing: var(--font-letter-spacing-normal);
|
|
40
|
+
text-decoration: none;
|
|
41
|
+
white-space: nowrap;
|
|
42
|
+
cursor: pointer;
|
|
43
|
+
transition:
|
|
44
|
+
background var(--motion-duration-fast) var(--motion-easing-default),
|
|
45
|
+
color var(--motion-duration-fast) var(--motion-easing-default),
|
|
46
|
+
border-color var(--motion-duration-fast) var(--motion-easing-default);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/*
|
|
50
|
+
* A BUTTON IS NOT A LINK, WHATEVER ELEMENT IT IS. Several of these controls
|
|
51
|
+
* are anchors, because a step that leaves for somebody else's site has to be a
|
|
52
|
+
* real href, and a document baseline underlines a hovered link. That is right
|
|
53
|
+
* for a link inside a sentence and wrong for something drawn as a filled
|
|
54
|
+
* button: "Install on GitHub" grew an underline the Create button beside it
|
|
55
|
+
* never had, so two controls that are the same act looked like two kinds of
|
|
56
|
+
* thing.
|
|
57
|
+
*/
|
|
58
|
+
.crewlet-btn,
|
|
59
|
+
.crewlet-btn:hover {
|
|
60
|
+
text-decoration: none;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/*
|
|
64
|
+
* THE FOCUS RING IS AN OUTLINE. Forced-colors mode drops every box-shadow and
|
|
65
|
+
* keeps outlines, so a ring drawn as a shadow disappears for exactly the
|
|
66
|
+
* readers who most need one.
|
|
67
|
+
*/
|
|
68
|
+
.crewlet-btn:focus-visible {
|
|
69
|
+
outline: 2px solid var(--color-focus);
|
|
70
|
+
outline-offset: 2px;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
.crewlet-btn:disabled,
|
|
74
|
+
.crewlet-btn[aria-disabled='true'] {
|
|
75
|
+
opacity: 0.5;
|
|
76
|
+
cursor: not-allowed;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/*
|
|
80
|
+
* Only the natively disabled one stops taking the pointer. A soft-disabled
|
|
81
|
+
* button keeps its hover and its focus on purpose: the tooltip that explains
|
|
82
|
+
* why it cannot be pressed is unreachable otherwise.
|
|
83
|
+
*/
|
|
84
|
+
.crewlet-btn:disabled {
|
|
85
|
+
pointer-events: none;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/* Sizes: the height is the control step, and the padding is one scale step
|
|
89
|
+
per size. min-height rather than height, so a label that wraps is read
|
|
90
|
+
rather than clipped. */
|
|
91
|
+
.crewlet-btn--small {
|
|
92
|
+
min-height: var(--size-control-sm);
|
|
93
|
+
padding: 0 var(--spacing-2);
|
|
94
|
+
font-size: var(--font-size-xs);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
.crewlet-btn--medium {
|
|
98
|
+
min-height: var(--size-control-md);
|
|
99
|
+
padding: 0 var(--spacing-3);
|
|
100
|
+
font-size: var(--font-size-compact);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
.crewlet-btn--large {
|
|
104
|
+
min-height: var(--size-control-lg);
|
|
105
|
+
padding: 0 var(--spacing-4);
|
|
106
|
+
font-size: var(--font-size-sm);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
.crewlet-btn--square {
|
|
110
|
+
border-radius: var(--radius-md);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
.crewlet-btn--pill {
|
|
114
|
+
border-radius: var(--radius-pill);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/* A pill spends one step more than its square, because a rounded end eats the
|
|
118
|
+
room a straight one gives the first letter. */
|
|
119
|
+
.crewlet-btn--pill.crewlet-btn--small {
|
|
120
|
+
padding: 0 var(--spacing-3);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
.crewlet-btn--pill.crewlet-btn--medium {
|
|
124
|
+
padding: 0 var(--spacing-4);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
.crewlet-btn--pill.crewlet-btn--large {
|
|
128
|
+
padding: 0 var(--spacing-5);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
.crewlet-btn--block {
|
|
132
|
+
width: 100%;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/*
|
|
136
|
+
* Primary: the accent fill, and the one action on the screen.
|
|
137
|
+
*
|
|
138
|
+
* `accent` is the same recipe under the other name it is written as. They are
|
|
139
|
+
* one rule rather than two, so the pair cannot drift into two blues, and the
|
|
140
|
+
* name stays because call sites already spell it.
|
|
141
|
+
*
|
|
142
|
+
* THE BORDER IS TRANSPARENT rather than the fill: a filled control needs no
|
|
143
|
+
* boundary, and one drawn in the fill's own colour makes the button a step
|
|
144
|
+
* wider than the secondary beside it in every forced-colors stylesheet that
|
|
145
|
+
* repaints backgrounds and keeps borders.
|
|
146
|
+
*/
|
|
147
|
+
.crewlet-btn--primary,
|
|
148
|
+
.crewlet-btn--accent {
|
|
149
|
+
background: var(--color-brand-accent);
|
|
150
|
+
color: var(--color-text-on-accent);
|
|
151
|
+
border-color: transparent;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
.crewlet-btn--primary:hover:not(:disabled):not([aria-disabled='true']),
|
|
155
|
+
.crewlet-btn--accent:hover:not(:disabled):not([aria-disabled='true']) {
|
|
156
|
+
background: var(--color-brand-accent-hover);
|
|
157
|
+
border-color: transparent;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
.crewlet-btn--primary:active:not(:disabled):not([aria-disabled='true']),
|
|
161
|
+
.crewlet-btn--accent:active:not(:disabled):not([aria-disabled='true']) {
|
|
162
|
+
background: var(--color-brand-accent-active);
|
|
163
|
+
border-color: transparent;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/* Secondary: a surface with a visible boundary. Everything else. */
|
|
167
|
+
.crewlet-btn--secondary {
|
|
168
|
+
background: var(--color-surface-subtle);
|
|
169
|
+
color: var(--color-text-primary);
|
|
170
|
+
border-color: var(--color-border-default);
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
.crewlet-btn--secondary:hover:not(:disabled):not([aria-disabled='true']) {
|
|
174
|
+
background: var(--color-surface-elevated);
|
|
175
|
+
border-color: var(--color-border-hover);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
.crewlet-btn--secondary:active:not(:disabled):not([aria-disabled='true']) {
|
|
179
|
+
background: var(--color-surface-pressed);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/* Outline: the branded secondary. Its ink is the accent's text step, never
|
|
183
|
+
the fill, which is not a text colour on any surface. */
|
|
184
|
+
.crewlet-btn--outline {
|
|
185
|
+
background: transparent;
|
|
186
|
+
color: var(--color-brand-accent-ink);
|
|
187
|
+
border-color: var(--color-brand-accent);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
.crewlet-btn--outline:hover:not(:disabled):not([aria-disabled='true']) {
|
|
191
|
+
background: var(--color-brand-accent-soft);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/* Tertiary: borderless, for a dense toolbar. */
|
|
195
|
+
.crewlet-btn--tertiary {
|
|
196
|
+
background: transparent;
|
|
197
|
+
color: var(--color-text-secondary);
|
|
198
|
+
border-color: transparent;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
.crewlet-btn--tertiary:hover:not(:disabled):not([aria-disabled='true']) {
|
|
202
|
+
background: var(--color-surface-hover);
|
|
203
|
+
color: var(--color-text-primary);
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
.crewlet-btn--tertiary:active:not(:disabled):not([aria-disabled='true']) {
|
|
207
|
+
background: var(--color-surface-pressed);
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
/*
|
|
211
|
+
* Danger: destructive, and the only button that spends the critical hue.
|
|
212
|
+
*
|
|
213
|
+
* A SECONDARY THAT HAS GONE RED, not a red slab. It sits in the same row as
|
|
214
|
+
* Cancel and it is the button a reader must not press by reflex, so it holds
|
|
215
|
+
* the secondary's own weight until it is pointed at and states itself in its
|
|
216
|
+
* INK, which is the step measured as text; the red fill it used to carry
|
|
217
|
+
* pulled the eye to the destructive answer first on every dialog that had one.
|
|
218
|
+
* The hue arrives on hover, as the tint plus the full fill on the boundary.
|
|
219
|
+
*/
|
|
220
|
+
.crewlet-btn--danger {
|
|
221
|
+
background: var(--color-surface-subtle);
|
|
222
|
+
color: var(--color-feedback-danger-ink);
|
|
223
|
+
border-color: var(--color-border-default);
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
.crewlet-btn--danger:hover:not(:disabled):not([aria-disabled='true']) {
|
|
227
|
+
background: var(--color-feedback-danger-soft);
|
|
228
|
+
border-color: var(--color-feedback-danger);
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
.crewlet-btn--danger:active:not(:disabled):not([aria-disabled='true']) {
|
|
232
|
+
background: var(--color-feedback-danger-soft);
|
|
233
|
+
border-color: var(--color-feedback-danger-hover);
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
/* A toggle that is on. Drawn from the state a screen reader is already told
|
|
237
|
+
about, so the two cannot disagree. */
|
|
238
|
+
.crewlet-btn[aria-pressed='true'] {
|
|
239
|
+
background: var(--color-brand-accent-soft);
|
|
240
|
+
color: var(--color-brand-accent-ink);
|
|
241
|
+
border-color: var(--color-brand-accent-soft-strong);
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
.crewlet-btn__icon,
|
|
245
|
+
.crewlet-btn__label {
|
|
246
|
+
display: inline-flex;
|
|
247
|
+
align-items: center;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
/*
|
|
251
|
+
* A glyph inside a button follows the label's own size, which is what lets one
|
|
252
|
+
* rule serve every step. The SVG sits on the baseline as an inline box, where
|
|
253
|
+
* the font ligature this replaced was inline-block and centred itself.
|
|
254
|
+
*/
|
|
255
|
+
.crewlet-btn__icon .crewlet-glyph {
|
|
256
|
+
width: 1em;
|
|
257
|
+
height: 1em;
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
/*
|
|
261
|
+
* Pending. The spinner takes the leading icon's place, so a button that has
|
|
262
|
+
* one neither moves nor changes width mid-action, and the label stays exactly
|
|
263
|
+
* as it was: a button whose text becomes "Saving" has stopped saying what it
|
|
264
|
+
* does.
|
|
265
|
+
*/
|
|
266
|
+
.crewlet-btn__spinner {
|
|
267
|
+
display: inline-block;
|
|
268
|
+
width: 1em;
|
|
269
|
+
height: 1em;
|
|
270
|
+
border: 2px solid currentColor;
|
|
271
|
+
border-right-color: transparent;
|
|
272
|
+
border-radius: var(--radius-circle);
|
|
273
|
+
opacity: 0.7;
|
|
274
|
+
animation: crewlet-btn-spin var(--motion-duration-slow) linear infinite;
|
|
275
|
+
flex: none;
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
@keyframes crewlet-btn-spin {
|
|
279
|
+
to {
|
|
280
|
+
transform: rotate(360deg);
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
/* A disabled button already reads as unavailable; a loading one should still
|
|
285
|
+
read as this button, mid-action. */
|
|
286
|
+
.crewlet-btn--loading {
|
|
287
|
+
cursor: progress;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
/*
|
|
291
|
+
* A spinner that cannot spin should not pretend to, and a colour change that
|
|
292
|
+
* cannot fade is still a colour change. The ring reads as pending either way.
|
|
293
|
+
*/
|
|
294
|
+
@media (prefers-reduced-motion: reduce) {
|
|
295
|
+
.crewlet-btn {
|
|
296
|
+
transition: none;
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
.crewlet-btn__spinner {
|
|
300
|
+
animation: none;
|
|
301
|
+
}
|
|
302
|
+
}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/** A day, with the month 0-based as `Date` has it. */
|
|
2
|
+
export interface CalendarDate {
|
|
3
|
+
year: number;
|
|
4
|
+
month: number;
|
|
5
|
+
day: number;
|
|
6
|
+
}
|
|
7
|
+
export declare const sameDay: (a: CalendarDate, b: CalendarDate) => boolean;
|
|
8
|
+
/** Negative when `a` is earlier, positive when later, zero on the same day. */
|
|
9
|
+
export declare function compareDays(a: CalendarDate, b: CalendarDate): number;
|
|
10
|
+
export declare const daysInMonth: (year: number, month: number) => number;
|
|
11
|
+
/** The same day shifted by `days`, rolling over months and years. */
|
|
12
|
+
export declare function shiftDay(date: CalendarDate, days: number): CalendarDate;
|
|
13
|
+
/** The same day in another month, clamped to that month's length. */
|
|
14
|
+
export declare function shiftMonth(date: CalendarDate, months: number): CalendarDate;
|
|
15
|
+
export declare const today: () => CalendarDate;
|
|
16
|
+
export interface CalendarGridProps {
|
|
17
|
+
/** Names the grid. A month grid with no name is announced as "grid". */
|
|
18
|
+
label: string;
|
|
19
|
+
/** The month on screen. */
|
|
20
|
+
year: number;
|
|
21
|
+
month: number;
|
|
22
|
+
/** Where the roving focus is. It is a DAY, and it may be outside the month on screen. */
|
|
23
|
+
focused: CalendarDate;
|
|
24
|
+
onFocusedChange: (next: CalendarDate) => void;
|
|
25
|
+
/** Asked for when the focus walks out of the month on screen. */
|
|
26
|
+
onMonthChange?: ((year: number, month: number) => void) | undefined;
|
|
27
|
+
/** Taking a day. A disabled day never reaches this. */
|
|
28
|
+
onSelect: (date: CalendarDate) => void;
|
|
29
|
+
/** The chosen days: one, or the two ends of a range. */
|
|
30
|
+
selected?: readonly CalendarDate[] | undefined;
|
|
31
|
+
/** Whether a day lies strictly inside the chosen range. */
|
|
32
|
+
inRange?: ((date: CalendarDate) => boolean) | undefined;
|
|
33
|
+
/** Whether a day may be taken. A disabled day stays focusable, and says so. */
|
|
34
|
+
isDisabled?: ((date: CalendarDate) => boolean) | undefined;
|
|
35
|
+
onHover?: ((date: CalendarDate | null) => void) | undefined;
|
|
36
|
+
/** 0 is Sunday (the United States), 1 is Monday (ISO 8601). */
|
|
37
|
+
firstDayOfWeek?: 0 | 1;
|
|
38
|
+
/** Whether the days either side of the month are drawn. */
|
|
39
|
+
showOutsideDays?: boolean;
|
|
40
|
+
/** What a day is CALLED. The full date, because "3" names nothing on its own. */
|
|
41
|
+
dayLabel?: ((date: CalendarDate) => string) | undefined;
|
|
42
|
+
monthNames?: readonly string[];
|
|
43
|
+
weekdayNames?: readonly string[];
|
|
44
|
+
weekdayMarks?: readonly string[];
|
|
45
|
+
className?: string;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* A month of days, as a real grid.
|
|
49
|
+
*
|
|
50
|
+
* WHAT IT REPLACES. Two pickers drew 42 buttons in a row and called the
|
|
51
|
+
* container a grid. The role was a claim the markup did not keep: a grid
|
|
52
|
+
* holds rows and a gridcell sits in one, so a screen reader told it was
|
|
53
|
+
* reading a grid found no rows to move between, and axe refused the role
|
|
54
|
+
* outright. Every one of those buttons was also its own tab stop, so a
|
|
55
|
+
* keyboard user reached the day after next by pressing Tab forty times, and
|
|
56
|
+
* no arrow key did anything at all.
|
|
57
|
+
*
|
|
58
|
+
* THE RULES IT KEEPS.
|
|
59
|
+
*
|
|
60
|
+
* - ONE TAB STOP for the whole month, with the arrows moving inside it: Left
|
|
61
|
+
* and Right a day, Up and Down a week, Home and End the ends of the week,
|
|
62
|
+
* Page a month and Shift+Page a year. Walking out of the month on screen
|
|
63
|
+
* turns the page rather than stopping at the edge.
|
|
64
|
+
* - A DAY IS CALLED BY ITS DATE. "3" names nothing: a reader arrowing across
|
|
65
|
+
* a month heard a run of numbers with no month, no weekday and no year in
|
|
66
|
+
* any of them.
|
|
67
|
+
* - THE STATE IS EXPOSED, not just drawn: `aria-selected` on the chosen days
|
|
68
|
+
* and `aria-current="date"` on today, which is the difference between a
|
|
69
|
+
* ring somebody can see and a fact somebody can hear.
|
|
70
|
+
* - A DISABLED DAY STAYS FOCUSABLE and says it is disabled. Skipped instead,
|
|
71
|
+
* a month whose first half is out of bounds swallows every arrow press
|
|
72
|
+
* until the keyboard happens to land somewhere allowed.
|
|
73
|
+
* - A RANGE IS ONE BAND, not two chips and some tinted squares. The grid asks
|
|
74
|
+
* `inRange` about each chosen day's NEIGHBOURS to learn which end it is, so
|
|
75
|
+
* the band's ends are drawn closed and its middle is drawn open. Nothing new
|
|
76
|
+
* is passed in for it: two more props naming the ends would be a second
|
|
77
|
+
* statement of the range that could disagree with `inRange` about where it
|
|
78
|
+
* stops.
|
|
79
|
+
* - A PADDING CELL IS AN EMPTY CELL, not a hidden one. Where the days either
|
|
80
|
+
* side of the month are not drawn (`showOutsideDays: false`, which is what
|
|
81
|
+
* a two-month range view uses), the cell still has to be a `gridcell`: a
|
|
82
|
+
* `row` whose cells are all `aria-hidden` owns nothing, which is a grid
|
|
83
|
+
* with rows a screen reader cannot read and an axe violation
|
|
84
|
+
* (`aria-required-children`) with it. It carries no name, no state and no
|
|
85
|
+
* tab stop, because there is no day there to name, tint or move to.
|
|
86
|
+
*/
|
|
87
|
+
export declare function CalendarGrid({ label, year, month, focused, onFocusedChange, onMonthChange, onSelect, selected, inRange, isDisabled, onHover, firstDayOfWeek, showOutsideDays, dayLabel, monthNames, weekdayNames, weekdayMarks, className, }: CalendarGridProps): import("react/jsx-runtime").JSX.Element;
|