@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,108 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
/** The four the component knows. Any other string is a variant of the caller's own. */
|
|
3
|
+
export type ToastVariant = 'info' | 'success' | 'warning' | 'danger';
|
|
4
|
+
export interface ToastAction {
|
|
5
|
+
label: ReactNode;
|
|
6
|
+
onClick?: () => void;
|
|
7
|
+
href?: string;
|
|
8
|
+
/** Open an external href in a new tab. */
|
|
9
|
+
external?: boolean;
|
|
10
|
+
}
|
|
11
|
+
export interface Toast<TVariant extends string = string> {
|
|
12
|
+
/** Stable id, which the consumer maps a dismissal back to. */
|
|
13
|
+
id: string | number;
|
|
14
|
+
/**
|
|
15
|
+
* What happened, and how loudly. `info`, `success`, `warning` and `danger`
|
|
16
|
+
* come with a glyph and a default title; any other string, `'quota'`
|
|
17
|
+
* included, has neither, so pass `icon` and `title`, or `renderBody`.
|
|
18
|
+
*/
|
|
19
|
+
variant?: TVariant;
|
|
20
|
+
title?: ReactNode;
|
|
21
|
+
message?: ReactNode;
|
|
22
|
+
/**
|
|
23
|
+
* Milliseconds before it goes. 0 is sticky. Left unset, it is the variant's
|
|
24
|
+
* own default: 4s for a success or an item of information, and sticky for a
|
|
25
|
+
* warning or a failure.
|
|
26
|
+
*/
|
|
27
|
+
duration?: number;
|
|
28
|
+
/** Bump on a dedup-replace to start the countdown again. */
|
|
29
|
+
version?: number;
|
|
30
|
+
/** An inline action. A full ReactNode is accepted for anything the shape does not cover. */
|
|
31
|
+
action?: ToastAction | ReactNode;
|
|
32
|
+
/** A glyph replacing the variant's own. A component, not a name. */
|
|
33
|
+
icon?: ReactNode;
|
|
34
|
+
/** Replace the body, for a shape the standard layout does not cover. */
|
|
35
|
+
renderBody?: (ctx: {
|
|
36
|
+
onDismiss: () => void;
|
|
37
|
+
toast: Toast<TVariant>;
|
|
38
|
+
}) => ReactNode;
|
|
39
|
+
}
|
|
40
|
+
export interface ToasterProps<TVariant extends string = string> {
|
|
41
|
+
toasts: Toast<TVariant>[];
|
|
42
|
+
onDismiss: (id: string | number) => void;
|
|
43
|
+
/** Render an action with an `href` through a router-aware link. */
|
|
44
|
+
renderAction?: ((action: ToastAction, ctx: {
|
|
45
|
+
onDismiss: () => void;
|
|
46
|
+
}) => ReactNode) | undefined;
|
|
47
|
+
position?: 'bottom-right' | 'top-right' | 'bottom-left' | 'top-left' | undefined;
|
|
48
|
+
/** Names the polite region for a reader browsing landmarks. */
|
|
49
|
+
politeLabel?: string | undefined;
|
|
50
|
+
/** Names the assertive region. */
|
|
51
|
+
assertiveLabel?: string | undefined;
|
|
52
|
+
dismissLabel?: string | undefined;
|
|
53
|
+
/** Replaces the lead-in a variant falls back to. See [ToastTitles]. */
|
|
54
|
+
titles?: ToastTitles | undefined;
|
|
55
|
+
className?: string | undefined;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* The lead-in each known variant falls back to when a toast brings no title
|
|
59
|
+
* and no message.
|
|
60
|
+
*
|
|
61
|
+
* `info` has none on purpose: "Information" above a sentence says nothing the
|
|
62
|
+
* sentence does not. They are replaceable per Toaster, because every string a
|
|
63
|
+
* component renders on its own is a prop in this package, and these three are
|
|
64
|
+
* the only English it writes into a screen by itself.
|
|
65
|
+
*/
|
|
66
|
+
export type ToastTitles = Partial<Record<ToastVariant, string | null>>;
|
|
67
|
+
export declare function Toaster<TVariant extends string = string>({ toasts, onDismiss, renderAction, position, politeLabel, assertiveLabel, dismissLabel, titles, className, }: ToasterProps<TVariant>): import("react").ReactPortal | null;
|
|
68
|
+
export interface ToastOptions {
|
|
69
|
+
title?: ReactNode;
|
|
70
|
+
/** Milliseconds, or 0 for sticky. Unset takes the variant's own default. */
|
|
71
|
+
duration?: number;
|
|
72
|
+
action?: ToastAction | ReactNode;
|
|
73
|
+
icon?: ReactNode;
|
|
74
|
+
id?: string | number;
|
|
75
|
+
}
|
|
76
|
+
/** What a toast is asked for with, before the provider gives it an id. */
|
|
77
|
+
export type ToastRequest = Omit<Toast, 'id'> & {
|
|
78
|
+
id?: string | number;
|
|
79
|
+
};
|
|
80
|
+
export interface ToastApi {
|
|
81
|
+
/** A write landed. Goes by itself. */
|
|
82
|
+
ok: (message: ReactNode, options?: ToastOptions) => string | number;
|
|
83
|
+
/** A write was refused. Stays until it is dismissed. */
|
|
84
|
+
failed: (message: ReactNode, options?: ToastOptions) => string | number;
|
|
85
|
+
/** Anything else: another variant, a custom body, an action. */
|
|
86
|
+
show: (toast: ToastRequest) => string | number;
|
|
87
|
+
/** Take one back, for a condition the application itself has cleared. */
|
|
88
|
+
dismiss: (id: string | number) => void;
|
|
89
|
+
}
|
|
90
|
+
/** The hook every writing screen uses. Safe with no provider mounted. */
|
|
91
|
+
export declare function useToast(): ToastApi;
|
|
92
|
+
export interface ToastProviderProps {
|
|
93
|
+
children?: ReactNode;
|
|
94
|
+
position?: ToasterProps['position'];
|
|
95
|
+
renderAction?: ToasterProps['renderAction'];
|
|
96
|
+
/** How many to keep on screen. The oldest goes when the next arrives. */
|
|
97
|
+
max?: number | undefined;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Holds the stack, and draws it.
|
|
101
|
+
*
|
|
102
|
+
* PROVIDERS NEST. A surface that goes fullscreen renders only its own subtree,
|
|
103
|
+
* so a toast portalled to the document body while a builder canvas is
|
|
104
|
+
* fullscreen is simply invisible: the reader presses Save and nothing happens.
|
|
105
|
+
* That surface mounts a provider of its own inside its `LayerHost`, and
|
|
106
|
+
* `useToast` inside it finds the nearest one.
|
|
107
|
+
*/
|
|
108
|
+
export declare function ToastProvider({ children, position, renderAction, max }: ToastProviderProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,306 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* The toast stack.
|
|
3
|
+
*
|
|
4
|
+
* ITS SURFACE IS A THEME TOKEN. 0.2.0 mixed the subtle surface 60 percent with
|
|
5
|
+
* black, which is a dark strip whatever palette is painting: on a light page
|
|
6
|
+
* the toast's own text measured 1.56:1 against it.
|
|
7
|
+
*
|
|
8
|
+
* THE DRAIN IS A RULE ALONG THE FOOT, not a wash behind the words. A tinted
|
|
9
|
+
* layer under the message is a composite nothing measured, and it moves while
|
|
10
|
+
* the message is being read; a 2px bar at the edge says the same thing and
|
|
11
|
+
* touches no text at all. It is decoration either way: the dismissal is a
|
|
12
|
+
* timer now, so a reader who asks for reduced motion still gets the toast
|
|
13
|
+
* taken away.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
.crewlet-toaster {
|
|
17
|
+
position: fixed;
|
|
18
|
+
z-index: var(--z-index-toast);
|
|
19
|
+
display: flex;
|
|
20
|
+
flex-direction: column;
|
|
21
|
+
gap: var(--spacing-2);
|
|
22
|
+
/* The engine's 420px, held under the viewport at the width a phone has.
|
|
23
|
+
The strip is one or two lines of 13px text and an action; at 380 the
|
|
24
|
+
commonest failure message wrapped onto a third. */
|
|
25
|
+
width: min(420px, calc(100vw - var(--spacing-9)));
|
|
26
|
+
/* The stack itself takes no presses, so the screen under it stays live
|
|
27
|
+
while nothing is up; each toast takes them back for its own strip. */
|
|
28
|
+
pointer-events: none;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
.crewlet-toaster--bottom-right {
|
|
32
|
+
bottom: var(--spacing-4);
|
|
33
|
+
right: var(--spacing-4);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
.crewlet-toaster--top-right {
|
|
37
|
+
top: var(--spacing-4);
|
|
38
|
+
right: var(--spacing-4);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
.crewlet-toaster--bottom-left {
|
|
42
|
+
bottom: var(--spacing-4);
|
|
43
|
+
left: var(--spacing-4);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
.crewlet-toaster--top-left {
|
|
47
|
+
top: var(--spacing-4);
|
|
48
|
+
left: var(--spacing-4);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
.crewlet-toast {
|
|
52
|
+
--crewlet-toast-mark: var(--color-text-secondary);
|
|
53
|
+
/*
|
|
54
|
+
* The boundary and the two inks are variables so a tone can spend them. Only
|
|
55
|
+
* one does: a failure, which is the engine's one toned strip.
|
|
56
|
+
*/
|
|
57
|
+
--crewlet-toast-line: var(--color-border-default);
|
|
58
|
+
--crewlet-toast-ink: var(--color-text-primary);
|
|
59
|
+
--crewlet-toast-ink-quiet: var(--color-text-secondary);
|
|
60
|
+
|
|
61
|
+
pointer-events: auto;
|
|
62
|
+
position: relative;
|
|
63
|
+
display: flex;
|
|
64
|
+
align-items: flex-start;
|
|
65
|
+
/* The panel's own gap and padding, and the panel's own surface: the engine
|
|
66
|
+
draws a toast as a small panel that happens to float, so it sits on the
|
|
67
|
+
same ground, the same hairline and the same corner as everything the
|
|
68
|
+
screen behind it is made of. */
|
|
69
|
+
gap: var(--spacing-2);
|
|
70
|
+
padding: var(--spacing-2) var(--spacing-8) var(--spacing-2) var(--spacing-3);
|
|
71
|
+
background: var(--color-surface-subtle);
|
|
72
|
+
border: 1px solid var(--crewlet-toast-line);
|
|
73
|
+
border-radius: var(--radius-md);
|
|
74
|
+
box-shadow: var(--shadow-md);
|
|
75
|
+
color: var(--crewlet-toast-ink);
|
|
76
|
+
font-family: var(--font-family-sans);
|
|
77
|
+
font-size: var(--font-size-compact);
|
|
78
|
+
line-height: var(--font-line-height-normal);
|
|
79
|
+
letter-spacing: var(--font-letter-spacing-snug);
|
|
80
|
+
overflow: hidden;
|
|
81
|
+
animation: crewlet-toast-in var(--motion-duration-base) var(--motion-easing-emphasized);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
@keyframes crewlet-toast-in {
|
|
85
|
+
from {
|
|
86
|
+
opacity: 0;
|
|
87
|
+
transform: translateY(6px);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
to {
|
|
91
|
+
opacity: 1;
|
|
92
|
+
transform: translateY(0);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
.crewlet-toast__icon {
|
|
97
|
+
display: inline-flex;
|
|
98
|
+
flex: none;
|
|
99
|
+
margin-top: 1px;
|
|
100
|
+
color: var(--crewlet-toast-mark);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/* The mark is the tone's FILL step, which is measured at 3:1 as a mark. The
|
|
104
|
+
words beside it stay in the primary ink: a coloured sentence on a coloured
|
|
105
|
+
strip is the pair that has to be measured, and this one does not exist. */
|
|
106
|
+
.crewlet-toast--success {
|
|
107
|
+
--crewlet-toast-mark: var(--color-feedback-success);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
.crewlet-toast--warning {
|
|
111
|
+
--crewlet-toast-mark: var(--color-feedback-warning);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/*
|
|
115
|
+
* A FAILURE IS THE ONE TONED STRIP. It is the outcome that is news rather than
|
|
116
|
+
* confirmation and the one that does not take itself away, so the engine gives
|
|
117
|
+
* it the hue twice: the fill step on the edge, where 3:1 is the floor a
|
|
118
|
+
* boundary has to clear, and the INK step on every word, which is the measured
|
|
119
|
+
* text pair on this surface. Never the fill behind a word: that is the swap
|
|
120
|
+
* the whole soft-and-ink split exists to stop.
|
|
121
|
+
*/
|
|
122
|
+
.crewlet-toast--danger {
|
|
123
|
+
--crewlet-toast-mark: var(--color-feedback-danger);
|
|
124
|
+
--crewlet-toast-line: var(--color-feedback-danger);
|
|
125
|
+
--crewlet-toast-ink: var(--color-feedback-danger-ink);
|
|
126
|
+
--crewlet-toast-ink-quiet: var(--color-feedback-danger-ink);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
.crewlet-toast--info {
|
|
130
|
+
--crewlet-toast-mark: var(--color-feedback-info);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/* A usage limit notice is the application's own variant: it paints the glyph
|
|
134
|
+
the caller passes with the accent and brings its own title. */
|
|
135
|
+
.crewlet-toast--quota {
|
|
136
|
+
--crewlet-toast-mark: var(--color-brand-accent);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
.crewlet-toast__body {
|
|
140
|
+
flex: 1;
|
|
141
|
+
min-width: 0;
|
|
142
|
+
display: flex;
|
|
143
|
+
flex-direction: column;
|
|
144
|
+
gap: 2px;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
.crewlet-toast__title {
|
|
148
|
+
font-weight: var(--font-weight-semibold);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
.crewlet-toast__message {
|
|
152
|
+
color: var(--crewlet-toast-ink-quiet);
|
|
153
|
+
overflow-wrap: anywhere;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
.crewlet-toast__actions {
|
|
157
|
+
margin-top: var(--spacing-2);
|
|
158
|
+
display: flex;
|
|
159
|
+
gap: var(--spacing-2);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
.crewlet-toast__action-btn,
|
|
163
|
+
.crewlet-toast__action-link {
|
|
164
|
+
display: inline-flex;
|
|
165
|
+
align-items: center;
|
|
166
|
+
justify-content: center;
|
|
167
|
+
height: var(--size-control-sm);
|
|
168
|
+
padding: 0 var(--spacing-3);
|
|
169
|
+
border: 1px solid var(--color-brand-accent);
|
|
170
|
+
border-radius: var(--radius-md);
|
|
171
|
+
background: var(--color-brand-accent);
|
|
172
|
+
color: var(--color-text-on-accent);
|
|
173
|
+
font-family: inherit;
|
|
174
|
+
font-size: var(--font-size-xs);
|
|
175
|
+
font-weight: var(--font-weight-semibold);
|
|
176
|
+
text-decoration: none;
|
|
177
|
+
cursor: pointer;
|
|
178
|
+
transition:
|
|
179
|
+
background var(--motion-duration-fast) var(--motion-easing-default),
|
|
180
|
+
border-color var(--motion-duration-fast) var(--motion-easing-default);
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
.crewlet-toast__action-btn:hover,
|
|
184
|
+
.crewlet-toast__action-link:hover {
|
|
185
|
+
background: var(--color-brand-accent-hover);
|
|
186
|
+
border-color: var(--color-brand-accent-hover);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
.crewlet-toast--danger .crewlet-toast__action-btn,
|
|
190
|
+
.crewlet-toast--danger .crewlet-toast__action-link {
|
|
191
|
+
background: var(--color-feedback-danger);
|
|
192
|
+
border-color: var(--color-feedback-danger);
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
.crewlet-toast--danger .crewlet-toast__action-btn:hover,
|
|
196
|
+
.crewlet-toast--danger .crewlet-toast__action-link:hover {
|
|
197
|
+
background: var(--color-feedback-danger-hover);
|
|
198
|
+
border-color: var(--color-feedback-danger-hover);
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
.crewlet-toast__action-btn:focus-visible,
|
|
202
|
+
.crewlet-toast__action-link:focus-visible,
|
|
203
|
+
.crewlet-toast__dismiss:focus-visible {
|
|
204
|
+
outline: 2px solid var(--color-focus);
|
|
205
|
+
outline-offset: 2px;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
/* The dismiss sits absolute in the corner so a multi-line message flows
|
|
209
|
+
under it rather than around it. 24px square: the smallest target
|
|
210
|
+
WCAG 2.2 accepts. */
|
|
211
|
+
.crewlet-toast__dismiss {
|
|
212
|
+
position: absolute;
|
|
213
|
+
top: var(--spacing-2);
|
|
214
|
+
right: var(--spacing-2);
|
|
215
|
+
width: 24px;
|
|
216
|
+
height: 24px;
|
|
217
|
+
display: inline-flex;
|
|
218
|
+
align-items: center;
|
|
219
|
+
justify-content: center;
|
|
220
|
+
padding: 0;
|
|
221
|
+
border: 0;
|
|
222
|
+
border-radius: var(--radius-sm);
|
|
223
|
+
background: transparent;
|
|
224
|
+
/* The strip's own quiet ink rather than the neutral tertiary step, so the
|
|
225
|
+
close on a failure is part of the failure rather than the one grey thing
|
|
226
|
+
inside it. */
|
|
227
|
+
color: var(--crewlet-toast-ink-quiet);
|
|
228
|
+
cursor: pointer;
|
|
229
|
+
transition:
|
|
230
|
+
background var(--motion-duration-fast) var(--motion-easing-default),
|
|
231
|
+
color var(--motion-duration-fast) var(--motion-easing-default);
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
.crewlet-toast__dismiss:hover {
|
|
235
|
+
background: var(--color-surface-hover);
|
|
236
|
+
color: var(--crewlet-toast-ink);
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
.crewlet-toast__progress {
|
|
240
|
+
position: absolute;
|
|
241
|
+
left: 0;
|
|
242
|
+
right: 0;
|
|
243
|
+
bottom: 0;
|
|
244
|
+
height: 2px;
|
|
245
|
+
transform-origin: left center;
|
|
246
|
+
background: var(--crewlet-toast-mark);
|
|
247
|
+
pointer-events: none;
|
|
248
|
+
animation-name: crewlet-toast-drain;
|
|
249
|
+
animation-timing-function: linear;
|
|
250
|
+
animation-fill-mode: forwards;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
/* Paused by the class rather than by :hover, so the bar and the timer that
|
|
254
|
+
actually dismisses are stopped by the same event. */
|
|
255
|
+
.crewlet-toast__progress.is-paused {
|
|
256
|
+
animation-play-state: paused;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
@keyframes crewlet-toast-drain {
|
|
260
|
+
from {
|
|
261
|
+
transform: scaleX(1);
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
to {
|
|
265
|
+
transform: scaleX(0);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
@media (max-width: 480px) {
|
|
270
|
+
.crewlet-toaster {
|
|
271
|
+
left: var(--spacing-3);
|
|
272
|
+
right: var(--spacing-3);
|
|
273
|
+
width: auto;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
.crewlet-toaster--bottom-right,
|
|
277
|
+
.crewlet-toaster--bottom-left {
|
|
278
|
+
bottom: var(--spacing-3);
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
.crewlet-toaster--top-right,
|
|
282
|
+
.crewlet-toaster--top-left {
|
|
283
|
+
top: var(--spacing-3);
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
/*
|
|
288
|
+
* The strip still arrives and still goes; it just does not slide, and the
|
|
289
|
+
* countdown bar holds still. The timer is untouched: a reader who asked for
|
|
290
|
+
* less motion did not ask to be left with a toast that never leaves.
|
|
291
|
+
*/
|
|
292
|
+
@media (prefers-reduced-motion: reduce) {
|
|
293
|
+
.crewlet-toast {
|
|
294
|
+
animation: none;
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
.crewlet-toast__progress {
|
|
298
|
+
display: none;
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
.crewlet-toast__action-btn,
|
|
302
|
+
.crewlet-toast__action-link,
|
|
303
|
+
.crewlet-toast__dismiss {
|
|
304
|
+
transition: none;
|
|
305
|
+
}
|
|
306
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A row of controls that is ONE stop in the page's tab order.
|
|
3
|
+
*
|
|
4
|
+
* WHY. `role="toolbar"` is a promise about the keyboard: a reader Tabs to the
|
|
5
|
+
* toolbar once, walks it with the arrows, and Tabs out of it to the next thing
|
|
6
|
+
* on the page. The organization builder declared the role and kept every
|
|
7
|
+
* control a separate tab stop, so reaching the content under a twelve-control
|
|
8
|
+
* toolbar cost twelve presses, and the promise the role makes was false.
|
|
9
|
+
*
|
|
10
|
+
* WHAT A COMPOSITE CHILD KEEPS. A segmented group, a tab list or a listbox
|
|
11
|
+
* inside the toolbar is ONE stop, and the arrows walk its own options first:
|
|
12
|
+
* only at its last option does ArrowRight carry on to the next control, and
|
|
13
|
+
* only at its first does ArrowLeft go back. That is what lets a reader walk
|
|
14
|
+
* the whole row without ever being stranded inside a group, and it is why the
|
|
15
|
+
* stops are computed from the DOM rather than from the children React was
|
|
16
|
+
* handed: the group manages its own `tabindex`, and the two would disagree.
|
|
17
|
+
*
|
|
18
|
+
* WHAT A FIELD KEEPS. A text field takes the arrows, Home and End for its own
|
|
19
|
+
* caret, always, and there is no boundary at which it gives them back. A
|
|
20
|
+
* toolbar holding one is usually a filter bar rather than a toolbar, which is
|
|
21
|
+
* what `mode="group"` is for: every control keeps its own tab stop and nothing
|
|
22
|
+
* takes the arrows.
|
|
23
|
+
*/
|
|
24
|
+
import { type HTMLAttributes, type ReactNode } from 'react';
|
|
25
|
+
export type ToolbarMode = 'toolbar' | 'group';
|
|
26
|
+
export interface ToolbarProps extends Omit<HTMLAttributes<HTMLDivElement>, 'role'> {
|
|
27
|
+
/**
|
|
28
|
+
* Names the row. REQUIRED: a toolbar is announced by its name, and a page
|
|
29
|
+
* with a filter bar and a builder toolbar needs to say which is which.
|
|
30
|
+
*/
|
|
31
|
+
label: string;
|
|
32
|
+
/**
|
|
33
|
+
* `toolbar` is one tab stop with arrow keys. `group` is a labelled row where
|
|
34
|
+
* every control keeps its own tab stop, which is what a filter bar holding a
|
|
35
|
+
* text field wants.
|
|
36
|
+
*/
|
|
37
|
+
mode?: ToolbarMode | undefined;
|
|
38
|
+
/** Sticks under the top of the scroller, so filters stay reachable in a long list. */
|
|
39
|
+
sticky?: boolean | undefined;
|
|
40
|
+
children?: ReactNode;
|
|
41
|
+
}
|
|
42
|
+
export declare function Toolbar({ label, mode, sticky, className, children, ...rest }: ToolbarProps): import("react/jsx-runtime").JSX.Element;
|
|
43
|
+
export declare namespace Toolbar {
|
|
44
|
+
var Wide: typeof ToolbarWide;
|
|
45
|
+
var Overflow: typeof ToolbarOverflow;
|
|
46
|
+
}
|
|
47
|
+
export interface ToolbarSlotProps extends HTMLAttributes<HTMLDivElement> {
|
|
48
|
+
children?: ReactNode;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* The controls that fold away on a narrow screen. They are drawn above the
|
|
52
|
+
* shell breakpoint and gone below it, where `Toolbar.Overflow` takes over.
|
|
53
|
+
*/
|
|
54
|
+
export declare function ToolbarWide({ className, children, ...rest }: ToolbarSlotProps): import("react/jsx-runtime").JSX.Element;
|
|
55
|
+
/**
|
|
56
|
+
* What stands in for them: a Menu holding the same actions, drawn only below
|
|
57
|
+
* the breakpoint. Two elements rather than one that measures itself, because a
|
|
58
|
+
* row whose contents change as it is measured is a row that can oscillate, and
|
|
59
|
+
* the only width that decides anything here is the one the stylesheet already
|
|
60
|
+
* switches the shell at.
|
|
61
|
+
*/
|
|
62
|
+
export declare function ToolbarOverflow({ className, children, ...rest }: ToolbarSlotProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* The toolbar row.
|
|
3
|
+
*
|
|
4
|
+
* It WRAPS rather than scrolling sideways: the controls in it are named, and a
|
|
5
|
+
* row that scrolls hides half of them behind a gesture nobody discovers. What
|
|
6
|
+
* it does not do is reflow from the data, which is why the wide and overflow
|
|
7
|
+
* slots switch at the shell breakpoint and nowhere else.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
.crewlet-toolbar {
|
|
11
|
+
display: flex;
|
|
12
|
+
align-items: center;
|
|
13
|
+
gap: var(--spacing-2);
|
|
14
|
+
flex-wrap: wrap;
|
|
15
|
+
min-width: 0;
|
|
16
|
+
padding: var(--spacing-2) 0;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/* Under the top of the scroller, on the sticky step, over the page's own
|
|
20
|
+
ground so rows do not show through it. */
|
|
21
|
+
.crewlet-toolbar--sticky {
|
|
22
|
+
position: sticky;
|
|
23
|
+
top: 0;
|
|
24
|
+
z-index: var(--z-index-sticky);
|
|
25
|
+
background: var(--color-surface-background);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
.crewlet-toolbar__wide,
|
|
29
|
+
.crewlet-toolbar__overflow {
|
|
30
|
+
display: flex;
|
|
31
|
+
align-items: center;
|
|
32
|
+
gap: var(--spacing-2);
|
|
33
|
+
min-width: 0;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
.crewlet-toolbar__overflow {
|
|
37
|
+
display: none;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
@media (max-width: 900px) {
|
|
41
|
+
.crewlet-toolbar__wide {
|
|
42
|
+
display: none;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
.crewlet-toolbar__overflow {
|
|
46
|
+
display: flex;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { type ReactElement, type ReactNode } from 'react';
|
|
2
|
+
export type TooltipPlacement = 'top' | 'bottom';
|
|
3
|
+
export interface TooltipProps {
|
|
4
|
+
/** One short line. A tooltip is not a place to put a list or a paragraph. */
|
|
5
|
+
content: ReactNode;
|
|
6
|
+
/** The preferred side. It flips when there is not room and there is more room the other way. */
|
|
7
|
+
placement?: TooltipPlacement | undefined;
|
|
8
|
+
/** Nothing opens: for a trigger whose tip is only worth showing sometimes. */
|
|
9
|
+
disabled?: boolean | undefined;
|
|
10
|
+
/** Milliseconds a pointer rests on the trigger before the panel appears. Focus never waits. */
|
|
11
|
+
openDelay?: number | undefined;
|
|
12
|
+
/**
|
|
13
|
+
* Milliseconds the panel survives the pointer leaving, which is what makes it
|
|
14
|
+
* HOVERABLE: the pointer has to cross the gap between the trigger and the
|
|
15
|
+
* panel, and a panel that closed the instant the pointer left the trigger
|
|
16
|
+
* could never be reached.
|
|
17
|
+
*/
|
|
18
|
+
closeDelay?: number | undefined;
|
|
19
|
+
className?: string | undefined;
|
|
20
|
+
/** Exactly one element: the control the tip belongs to. */
|
|
21
|
+
children: ReactElement;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Tooltip: one short line about the control under the pointer.
|
|
25
|
+
*
|
|
26
|
+
* IT IS NEVER THE ONLY CARRIER OF ANYTHING A READER NEEDS. A tooltip is not
|
|
27
|
+
* reachable by touch, it is not read by a screen reader until the control it
|
|
28
|
+
* belongs to is focused, and it is gone the moment the pointer moves. Anything
|
|
29
|
+
* a reader must have is on the page. This is a hint about a control that
|
|
30
|
+
* already has a name.
|
|
31
|
+
*
|
|
32
|
+
* IT IS ONE LINE. A list of paths, a table of values or a paragraph belongs in
|
|
33
|
+
* a `Popover` with `role="dialog"` or in a `Disclosure`, both of which a reader
|
|
34
|
+
* can keep open and scroll.
|
|
35
|
+
*
|
|
36
|
+
* THE THREE RULES OF WCAG 2.2's 1.4.13, and this component exists because all
|
|
37
|
+
* three are easy to miss:
|
|
38
|
+
*
|
|
39
|
+
* - DISMISSABLE. Escape closes it without moving focus, through the layer
|
|
40
|
+
* stack, so it closes before the dialog it sits in.
|
|
41
|
+
* - HOVERABLE. The pointer may travel from the trigger onto the panel without
|
|
42
|
+
* the panel closing, which is what `closeDelay` buys.
|
|
43
|
+
* - PERSISTENT. It stays until the pointer and focus have both left or Escape
|
|
44
|
+
* is pressed. NOTHING HIDES IT ON A TIMER: a reader who needs longer than
|
|
45
|
+
* somebody else's idea of long enough is exactly the reader this is for.
|
|
46
|
+
*
|
|
47
|
+
* It is linked by `aria-describedby` rather than `aria-labelledby`: the
|
|
48
|
+
* control has a name already, and replacing it with the hint is how a Close
|
|
49
|
+
* button came to be announced as "Closing is unavailable until this finishes".
|
|
50
|
+
*/
|
|
51
|
+
export declare function Tooltip({ content, placement, disabled, openDelay, closeDelay, className, children, }: TooltipProps): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* The tooltip panel.
|
|
3
|
+
*
|
|
4
|
+
* It is placed by arithmetic (see Tooltip.tsx), so this owns what the panel
|
|
5
|
+
* looks like and how it arrives.
|
|
6
|
+
*
|
|
7
|
+
* TWO THINGS ARE DELIBERATE AND LOOK LIKE OVERSIGHTS.
|
|
8
|
+
*
|
|
9
|
+
* It TAKES THE POINTER (`pointer-events: auto`, which the layer host's own
|
|
10
|
+
* children already have). A panel a pointer cannot land on cannot be hovered,
|
|
11
|
+
* and WCAG 2.2's 1.4.13 asks that it can be, so the reader can travel onto it
|
|
12
|
+
* and read the line at their own pace.
|
|
13
|
+
*
|
|
14
|
+
* It is OPAQUE and it is SMALL, but it is not quiet: the ink is the primary
|
|
15
|
+
* step on the panel surface, not a muted one. A hint drawn in a decoration
|
|
16
|
+
* ink is a hint nobody with low vision can read, and the whole point of it is
|
|
17
|
+
* to be read.
|
|
18
|
+
*
|
|
19
|
+
* IT IS DRAWN AS THE SMALLEST MEMBER OF THE OVERLAY FAMILY, on the same panel
|
|
20
|
+
* step as a menu, a popover and a dialog, with the same corner the other small
|
|
21
|
+
* floating objects take. A tooltip is the one surface a reader meets by
|
|
22
|
+
* accident, and a surface that arrives looking like nothing else in the
|
|
23
|
+
* product is one they have to work out before they can read it.
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
.crewlet-tooltip {
|
|
27
|
+
position: fixed;
|
|
28
|
+
max-width: 260px;
|
|
29
|
+
padding: var(--spacing-1) var(--spacing-2);
|
|
30
|
+
background: var(--color-surface-subtle);
|
|
31
|
+
color: var(--color-text-primary);
|
|
32
|
+
border: 1px solid var(--color-border-default);
|
|
33
|
+
border-radius: var(--radius-md);
|
|
34
|
+
box-shadow: var(--shadow-md);
|
|
35
|
+
font-size: var(--font-size-xs);
|
|
36
|
+
line-height: var(--font-line-height-snug);
|
|
37
|
+
/* One short line, wrapped rather than cut: a hint that ends in an ellipsis
|
|
38
|
+
is a hint that failed. */
|
|
39
|
+
overflow-wrap: break-word;
|
|
40
|
+
animation: crewlet-tooltip-in var(--motion-duration-base) var(--motion-easing-emphasized);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/* Inside a LayerHost the panel is absolute in that host's own box. */
|
|
44
|
+
.crewlet-tooltip--in-host {
|
|
45
|
+
position: absolute;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/*
|
|
49
|
+
* The side the tip was placed on is left on the element for anything that has
|
|
50
|
+
* to know which way it went, and it draws nothing: the entrance is a rise
|
|
51
|
+
* rather than a scale now, and a transform-origin under a translate is a
|
|
52
|
+
* declaration that reads as a decision and is not one.
|
|
53
|
+
*/
|
|
54
|
+
|
|
55
|
+
/*
|
|
56
|
+
* The same entrance every floating surface here has, at the smallest step: a
|
|
57
|
+
* short rise. A scale was its own gesture for no reason, and next to a menu
|
|
58
|
+
* opening beside it the two read as two different products.
|
|
59
|
+
*/
|
|
60
|
+
@keyframes crewlet-tooltip-in {
|
|
61
|
+
from {
|
|
62
|
+
opacity: 0;
|
|
63
|
+
transform: translateY(var(--spacing-1));
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
@media (prefers-reduced-motion: reduce) {
|
|
68
|
+
.crewlet-tooltip {
|
|
69
|
+
animation: none;
|
|
70
|
+
}
|
|
71
|
+
}
|