@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,138 @@
|
|
|
1
|
+
import { type FocusEventHandler, type ReactNode, type SelectHTMLAttributes } from 'react';
|
|
2
|
+
export type SelectValue = string | number;
|
|
3
|
+
export type SelectSize = 'sm' | 'md';
|
|
4
|
+
export type SelectAlign = 'left' | 'right';
|
|
5
|
+
/**
|
|
6
|
+
* How wide the control is.
|
|
7
|
+
*
|
|
8
|
+
* `full` is a field on a form, which takes the line it is given. `auto` is a
|
|
9
|
+
* picker in a toolbar: it sizes to the answer it is showing, between a floor
|
|
10
|
+
* that keeps a row of them even and a cap that stops one long value pushing
|
|
11
|
+
* the rest of the bar off the screen. A filter row of full-width selects is
|
|
12
|
+
* one question per line, which is not what a filter bar is.
|
|
13
|
+
*/
|
|
14
|
+
export type SelectWidth = 'full' | 'auto';
|
|
15
|
+
/**
|
|
16
|
+
* Which control this is.
|
|
17
|
+
*
|
|
18
|
+
* `listbox` IS THE HOUSE STYLE, and it is the default. Every dropdown in the
|
|
19
|
+
* product is this one: it takes the theme, the density, the tokens and the
|
|
20
|
+
* layer stack, so a list opened in a dark dialog is drawn by the design system
|
|
21
|
+
* rather than by the operating system, and the two do not sit beside each
|
|
22
|
+
* other looking like two products. It is also the only one that can do what
|
|
23
|
+
* several surfaces need at all: more than one choice, a search over dozens, a
|
|
24
|
+
* group heading, a second line of identity under an option.
|
|
25
|
+
*
|
|
26
|
+
* What it had to earn back, and now does, is everything a reader got free from
|
|
27
|
+
* the platform: type-ahead, Home and End, disabled rows stepped over, the
|
|
28
|
+
* highlight announced through `aria-activedescendant`, Tab closing the list
|
|
29
|
+
* and carrying on, and a stored value the options no longer offer kept rather
|
|
30
|
+
* than silently swapped. Those live in `useOptionKeys` and `useListbox`, so
|
|
31
|
+
* there is one keyboard for every list in the package.
|
|
32
|
+
*
|
|
33
|
+
* `native` is a real `<select>` in uilet's chrome, and it is drawn ONLY where
|
|
34
|
+
* a caller asks for it by name. The one thing it still has that this cannot
|
|
35
|
+
* is the phone's own full-screen picker and the platform's assistive
|
|
36
|
+
* behaviour in a web view, so a surface that is mostly used on a handset can
|
|
37
|
+
* opt into it deliberately. It takes one choice only.
|
|
38
|
+
*/
|
|
39
|
+
export type SelectMode = 'listbox' | 'native';
|
|
40
|
+
export interface SelectOption {
|
|
41
|
+
value: SelectValue;
|
|
42
|
+
label: ReactNode;
|
|
43
|
+
/** A second line under the label: a handle, a path, what the choice means. */
|
|
44
|
+
description?: ReactNode;
|
|
45
|
+
disabled?: boolean;
|
|
46
|
+
/** Options sharing a group are listed under its name, in first-seen order. */
|
|
47
|
+
group?: string;
|
|
48
|
+
/**
|
|
49
|
+
* What type-ahead and the search match against, where the label is not a
|
|
50
|
+
* string. Without it a node label is matched by its value, which is a
|
|
51
|
+
* worse answer than no match at all when the two differ.
|
|
52
|
+
*/
|
|
53
|
+
text?: string;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* The form-control properties that reach whichever element this draws.
|
|
57
|
+
*
|
|
58
|
+
* The focus handlers are typed on `HTMLElement` rather than on
|
|
59
|
+
* `HTMLSelectElement`, because the element a caller's handler lands on depends
|
|
60
|
+
* on the mode: the listbox's trigger is a button and the native mode's is a
|
|
61
|
+
* `select`. A handler written for the wider type works in both.
|
|
62
|
+
*/
|
|
63
|
+
type NativePassthrough = Pick<SelectHTMLAttributes<HTMLSelectElement>, 'autoFocus' | 'name' | 'required' | 'aria-describedby'> & {
|
|
64
|
+
onBlur?: FocusEventHandler<HTMLElement> | undefined;
|
|
65
|
+
onFocus?: FocusEventHandler<HTMLElement> | undefined;
|
|
66
|
+
};
|
|
67
|
+
export interface SelectProps extends NativePassthrough {
|
|
68
|
+
id?: string;
|
|
69
|
+
/**
|
|
70
|
+
* Which control to draw. `listbox` by default, which is the house style; ask
|
|
71
|
+
* for `native` only with a reason, and say it at the call site. See
|
|
72
|
+
* [SelectMode].
|
|
73
|
+
*/
|
|
74
|
+
mode?: SelectMode | undefined;
|
|
75
|
+
/**
|
|
76
|
+
* The chosen value. In `multiple` mode an array; a value the options do not
|
|
77
|
+
* offer is kept rather than dropped, because a reference to something since
|
|
78
|
+
* renamed has to stay visible until somebody removes it on purpose.
|
|
79
|
+
*/
|
|
80
|
+
value: SelectValue | SelectValue[] | undefined;
|
|
81
|
+
onChange?: (value: SelectValue | SelectValue[], option: SelectOption) => void;
|
|
82
|
+
options: SelectOption[];
|
|
83
|
+
placeholder?: string;
|
|
84
|
+
disabled?: boolean;
|
|
85
|
+
className?: string;
|
|
86
|
+
menuClassName?: string;
|
|
87
|
+
size?: SelectSize;
|
|
88
|
+
/** How wide the control is. See [SelectWidth]. */
|
|
89
|
+
width?: SelectWidth;
|
|
90
|
+
align?: SelectAlign;
|
|
91
|
+
/**
|
|
92
|
+
* A filter that is ON. It takes the accent border and the accent INK, which
|
|
93
|
+
* is what "here, this is narrowing the list" means everywhere else; the fill
|
|
94
|
+
* it used to take put a value on a coloured ground at 3.58:1.
|
|
95
|
+
*/
|
|
96
|
+
active?: boolean;
|
|
97
|
+
/** Marks the value as refused. Sets `aria-invalid`. */
|
|
98
|
+
error?: boolean;
|
|
99
|
+
ariaLabel?: string;
|
|
100
|
+
searchable?: boolean;
|
|
101
|
+
searchPlaceholder?: string;
|
|
102
|
+
/** Listbox mode only. A native select cannot hold several choices usefully. */
|
|
103
|
+
multiple?: boolean;
|
|
104
|
+
renderTrigger?: (option: SelectOption | null, ctx: {
|
|
105
|
+
open: boolean;
|
|
106
|
+
}) => ReactNode;
|
|
107
|
+
renderOption?: (option: SelectOption, ctx: {
|
|
108
|
+
active: boolean;
|
|
109
|
+
selected: boolean;
|
|
110
|
+
}) => ReactNode;
|
|
111
|
+
renderMultiLabel?: (selected: SelectOption[]) => ReactNode;
|
|
112
|
+
/** The line shown when a search matches nothing. */
|
|
113
|
+
emptyMessage?: string;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* A picker over a known set of values.
|
|
117
|
+
*
|
|
118
|
+
* WHAT CHANGED. The listbox mode used to add its own `mousedown` listener to
|
|
119
|
+
* the document and swallow every press inside its panel so the popover around
|
|
120
|
+
* it would not close, which is the shape a component takes when it is not on
|
|
121
|
+
* a shared stack. It is a popup on the layer stack now, so a press on a
|
|
122
|
+
* dialog's veil closes the list and leaves the dialog, and Escape reaches the
|
|
123
|
+
* list first and stops there.
|
|
124
|
+
*
|
|
125
|
+
* The keyboard is the shared listbox model, so the arrows wrap, the highlight
|
|
126
|
+
* is clamped rather than reset as a search narrows, and nothing is taken
|
|
127
|
+
* while an input method is composing a word. What this adds on top is what
|
|
128
|
+
* the model cannot know: which options are DISABLED, so the arrows, Home and
|
|
129
|
+
* End step over them rather than parking the highlight on a row Enter will
|
|
130
|
+
* refuse.
|
|
131
|
+
*
|
|
132
|
+
* THE HIGHLIGHT IS ANNOUNCED. The list points at its active row with
|
|
133
|
+
* `aria-activedescendant` and every row carries an id, which is what a screen
|
|
134
|
+
* reader reads as the arrows move. Without it the reader heard the list open
|
|
135
|
+
* and then silence.
|
|
136
|
+
*/
|
|
137
|
+
export declare const Select: import("react").ForwardRefExoticComponent<SelectProps & import("react").RefAttributes<HTMLElement>>;
|
|
138
|
+
export {};
|
|
@@ -0,0 +1,350 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Select: one chrome over two controls, and the product's only dropdown.
|
|
3
|
+
*
|
|
4
|
+
* The native mode is a real `<select>` drawn transparent over this frame, so
|
|
5
|
+
* the platform keeps its own overlay, its own type-ahead and, on a phone, its
|
|
6
|
+
* own full-screen picker. The listbox mode is the hand-built panel, portalled
|
|
7
|
+
* into the nearest layer host and drawn with the shared listbox register, so
|
|
8
|
+
* a list of options looks the same wherever it is offered from.
|
|
9
|
+
*
|
|
10
|
+
* The boundary is --color-border-control, like every other control: the
|
|
11
|
+
* hairline measured 1.27:1 in light, which is a box a reader has to know is
|
|
12
|
+
* there already.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
.crewlet-select {
|
|
16
|
+
/*
|
|
17
|
+
* The toolbar picker's bounds. The floor keeps a row of filters even when
|
|
18
|
+
* one of them is showing "Any"; the cap stops a long value pushing the rest
|
|
19
|
+
* of the bar off the screen, and the label truncates instead.
|
|
20
|
+
*/
|
|
21
|
+
--crewlet-select-auto-min-width: 132px;
|
|
22
|
+
--crewlet-select-auto-max-width: 220px;
|
|
23
|
+
|
|
24
|
+
position: relative;
|
|
25
|
+
display: inline-flex;
|
|
26
|
+
align-items: center;
|
|
27
|
+
width: 100%;
|
|
28
|
+
min-height: var(--size-control-md);
|
|
29
|
+
background-color: var(--color-surface-subtle);
|
|
30
|
+
border: 1px solid var(--color-border-control);
|
|
31
|
+
border-radius: var(--radius-md);
|
|
32
|
+
color: var(--color-text-primary);
|
|
33
|
+
/* The boundary is the only thing that moves. The ring is an outline, which
|
|
34
|
+
takes no transition, and nothing else here paints a shadow. */
|
|
35
|
+
transition: border-color var(--motion-duration-fast) var(--motion-easing-default);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
.crewlet-select--sm {
|
|
39
|
+
min-height: var(--size-control-sm);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/* A picker in a toolbar sizes to its answer. See [SelectWidth]. */
|
|
43
|
+
.crewlet-select--auto {
|
|
44
|
+
width: auto;
|
|
45
|
+
min-width: var(--crewlet-select-auto-min-width);
|
|
46
|
+
max-width: var(--crewlet-select-auto-max-width);
|
|
47
|
+
flex: 0 1 auto;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
.crewlet-select:hover {
|
|
51
|
+
border-color: var(--color-border-hover);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/*
|
|
55
|
+
* ONE RING, and the same one every field in this package draws: an outline
|
|
56
|
+
* over the boundary, inset so a scroller cannot clip it. See Input.css for
|
|
57
|
+
* why it is not the border plus --shadow-focus it used to be, and why an
|
|
58
|
+
* outline is the half that survives forced-colors mode.
|
|
59
|
+
*
|
|
60
|
+
* :focus-within is enough HERE, where the Input's own rule has to name its
|
|
61
|
+
* control: this frame holds the trigger and a chevron, and the chevron takes
|
|
62
|
+
* no focus. Anything focusable added beside the trigger would have to narrow
|
|
63
|
+
* this selector, or its ring would be drawn inside the field's.
|
|
64
|
+
*
|
|
65
|
+
* It is also why the trigger is asked nothing about :focus-visible. A native
|
|
66
|
+
* <select> matches that on a pointer press and a <button> does not, so
|
|
67
|
+
* keying the frame on it would ring one of Select's two modes on a click and
|
|
68
|
+
* leave the other bare.
|
|
69
|
+
*/
|
|
70
|
+
.crewlet-select:focus-within {
|
|
71
|
+
outline: 2px solid var(--color-focus);
|
|
72
|
+
outline-offset: var(--size-focus-ring-inset-offset);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/*
|
|
76
|
+
* A FILTER THAT IS ON. The accent border says where the reader is and the
|
|
77
|
+
* accent INK says what it is set to. It used to be the accent FILL with the
|
|
78
|
+
* value written on it, which measured 3.58:1 in dark: the one control on the
|
|
79
|
+
* page whose whole job is to say "this list is narrowed" was the hardest to
|
|
80
|
+
* read on it.
|
|
81
|
+
*/
|
|
82
|
+
.crewlet-select.is-active {
|
|
83
|
+
border-color: var(--color-brand-accent);
|
|
84
|
+
color: var(--color-brand-accent-ink);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
.crewlet-select.is-active .crewlet-select__label,
|
|
88
|
+
.crewlet-select.is-active .crewlet-select__native,
|
|
89
|
+
.crewlet-select.is-active .crewlet-select__chevron {
|
|
90
|
+
color: var(--color-brand-accent-ink);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
.crewlet-select.is-error {
|
|
94
|
+
border-color: var(--color-feedback-danger);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/* A refused picker keeps its colour while the reader is in it: the ring
|
|
98
|
+
covers the boundary, so a focus-coloured one would paint out the refusal.
|
|
99
|
+
See Input.css. */
|
|
100
|
+
.crewlet-select.is-error:focus-within {
|
|
101
|
+
outline-color: var(--color-feedback-danger);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
.crewlet-select.is-disabled {
|
|
105
|
+
opacity: 0.6;
|
|
106
|
+
cursor: not-allowed;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/* ── The trigger, native and built ───────────────────────────────────── */
|
|
110
|
+
|
|
111
|
+
/*
|
|
112
|
+
* The trigger IS the field: the value sits on one line inset by the same step
|
|
113
|
+
* a text box insets its own, and the box's height is what makes the row. It
|
|
114
|
+
* stretches to the frame so a press anywhere in the control opens the list.
|
|
115
|
+
*/
|
|
116
|
+
.crewlet-select__native,
|
|
117
|
+
.crewlet-select__trigger {
|
|
118
|
+
appearance: none;
|
|
119
|
+
-webkit-appearance: none;
|
|
120
|
+
flex: 1;
|
|
121
|
+
min-width: 0;
|
|
122
|
+
display: inline-flex;
|
|
123
|
+
align-items: center;
|
|
124
|
+
align-self: stretch;
|
|
125
|
+
gap: var(--spacing-2);
|
|
126
|
+
background: transparent;
|
|
127
|
+
border: none;
|
|
128
|
+
outline: none;
|
|
129
|
+
cursor: pointer;
|
|
130
|
+
font: inherit;
|
|
131
|
+
font-size: var(--font-size-compact);
|
|
132
|
+
color: inherit;
|
|
133
|
+
text-align: left;
|
|
134
|
+
padding: 0 var(--spacing-3);
|
|
135
|
+
/* Room for the chevron, which sits over the control rather than beside it:
|
|
136
|
+
its own inset twice over, plus the glyph. */
|
|
137
|
+
padding-right: var(--spacing-6);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
.crewlet-select--sm .crewlet-select__native,
|
|
141
|
+
.crewlet-select--sm .crewlet-select__trigger {
|
|
142
|
+
font-size: var(--font-size-xs);
|
|
143
|
+
padding: 0 var(--spacing-2);
|
|
144
|
+
padding-right: var(--spacing-6);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
.crewlet-select__native:disabled,
|
|
148
|
+
.crewlet-select__trigger:disabled {
|
|
149
|
+
cursor: not-allowed;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/*
|
|
153
|
+
* THE TRIGGER DRAWS NO RING OF ITS OWN. The frame around it is the field a
|
|
154
|
+
* reader sees, and it is already ringed by the rule above. The transparent
|
|
155
|
+
* outline that used to sit here was the frame's forced-colors stand-in put on
|
|
156
|
+
* the wrong element: with the frame drawing a real outline now, that one was
|
|
157
|
+
* a second system-coloured ring inside the first for the readers that mode
|
|
158
|
+
* exists for, and it sat two pixels further out than the frame's own.
|
|
159
|
+
*/
|
|
160
|
+
.crewlet-select__label {
|
|
161
|
+
flex: 1;
|
|
162
|
+
min-width: 0;
|
|
163
|
+
overflow: hidden;
|
|
164
|
+
text-overflow: ellipsis;
|
|
165
|
+
white-space: nowrap;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/* Nothing chosen: the tertiary step, which is measured, because it is the
|
|
169
|
+
example of what belongs here rather than decoration. */
|
|
170
|
+
.crewlet-select__label.is-placeholder {
|
|
171
|
+
color: var(--color-text-tertiary);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/*
|
|
175
|
+
* The chevron is DECORATION and takes the decoration step. It says a second
|
|
176
|
+
* time what the control's own role, name and boundary already say, and a mark
|
|
177
|
+
* that repeats is a mark that must not compete with the value beside it.
|
|
178
|
+
*
|
|
179
|
+
* The selector names the ELEMENT as well as the class, which is what says
|
|
180
|
+
* this is the one exemption the decoration step has: an svg, never a word.
|
|
181
|
+
*/
|
|
182
|
+
svg.crewlet-select__chevron {
|
|
183
|
+
position: absolute;
|
|
184
|
+
right: var(--spacing-2);
|
|
185
|
+
pointer-events: none;
|
|
186
|
+
color: var(--color-text-muted);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/* ── The panel ───────────────────────────────────────────────────────── */
|
|
190
|
+
|
|
191
|
+
.crewlet-select__menu {
|
|
192
|
+
/* Six rows and a scroll. A list that draws past the bottom of the dialog
|
|
193
|
+
it was opened in is a list whose last answers nobody finds. */
|
|
194
|
+
--crewlet-select-menu-max-height: 12rem;
|
|
195
|
+
|
|
196
|
+
position: fixed;
|
|
197
|
+
display: flex;
|
|
198
|
+
flex-direction: column;
|
|
199
|
+
min-width: 0;
|
|
200
|
+
max-height: var(--crewlet-select-menu-max-height);
|
|
201
|
+
/*
|
|
202
|
+
* THE PANEL IS THE PRODUCT'S SURFACE, on the panel hairline, at the panel
|
|
203
|
+
* corner. A list offered from a field is another panel over the one the
|
|
204
|
+
* field is in, not a heavier kind of thing: the elevated surface and the
|
|
205
|
+
* large shadow it used to lift with read as a dialog, over a form the
|
|
206
|
+
* reader has not left.
|
|
207
|
+
*/
|
|
208
|
+
background: var(--color-surface-subtle);
|
|
209
|
+
border: 1px solid var(--color-border-default);
|
|
210
|
+
border-radius: var(--radius-md);
|
|
211
|
+
box-shadow: var(--shadow-md);
|
|
212
|
+
overflow: hidden;
|
|
213
|
+
/*
|
|
214
|
+
* The popover band. A list portalled out of its form has to paint over the
|
|
215
|
+
* dialog it was opened inside, and the shared listbox model does not hand
|
|
216
|
+
* back the layer's own depth, so this is the token for the band rather than
|
|
217
|
+
* a number.
|
|
218
|
+
*/
|
|
219
|
+
z-index: var(--z-index-popover);
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
/* Inside a layer host the panel is placed against the host's own box. */
|
|
223
|
+
.crewlet-select__menu--in-host {
|
|
224
|
+
position: absolute;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
.crewlet-select__list {
|
|
228
|
+
flex: 1;
|
|
229
|
+
min-height: 0;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
.crewlet-select__group {
|
|
233
|
+
display: flex;
|
|
234
|
+
flex-direction: column;
|
|
235
|
+
gap: 1px;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
.crewlet-select__option {
|
|
239
|
+
align-items: flex-start;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
/*
|
|
243
|
+
* WHAT IS CHOSEN AND WHERE THE READER IS ARE TWO DIFFERENT FACTS, and this
|
|
244
|
+
* list draws them with two different marks: the chosen row carries the tick,
|
|
245
|
+
* in the accent ink, and the row the arrows or the pointer are on carries the
|
|
246
|
+
* hover tint. Drawn as one tint they collided on the commonest list there is,
|
|
247
|
+
* a filter whose current answer is also the row it opens on.
|
|
248
|
+
*
|
|
249
|
+
* The rules are scoped to the panel rather than written on the option class,
|
|
250
|
+
* because the shared listbox register paints [aria-selected] itself and the
|
|
251
|
+
* stylesheets are bundled in hash order: a rule of equal weight would win or
|
|
252
|
+
* lose by the name of a build artefact.
|
|
253
|
+
*/
|
|
254
|
+
.crewlet-select__menu .crewlet-listbox__option,
|
|
255
|
+
.crewlet-select__menu .crewlet-listbox__option[aria-selected='true'] {
|
|
256
|
+
border-radius: var(--radius-xs);
|
|
257
|
+
background: transparent;
|
|
258
|
+
color: var(--color-text-primary);
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
.crewlet-select__menu .crewlet-listbox__option.is-highlight,
|
|
262
|
+
.crewlet-select__menu .crewlet-listbox__option:hover {
|
|
263
|
+
background: var(--color-surface-hover);
|
|
264
|
+
color: var(--color-text-primary);
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
/*
|
|
268
|
+
* A row a caller draws itself (`renderOption`) has no tick column, so the
|
|
269
|
+
* choice is said in the weight as well. It is the one mark that costs the row
|
|
270
|
+
* nothing: a custom row with no tick and no tint said nothing at all.
|
|
271
|
+
*/
|
|
272
|
+
.crewlet-select__menu .crewlet-listbox__option.is-selected {
|
|
273
|
+
font-weight: var(--font-weight-medium);
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
.crewlet-select__menu .crewlet-listbox__option.is-disabled {
|
|
277
|
+
background: transparent;
|
|
278
|
+
color: var(--color-text-tertiary);
|
|
279
|
+
cursor: not-allowed;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
.crewlet-select__option-tick {
|
|
283
|
+
display: inline-flex;
|
|
284
|
+
align-items: center;
|
|
285
|
+
justify-content: center;
|
|
286
|
+
flex: none;
|
|
287
|
+
width: 16px;
|
|
288
|
+
height: 16px;
|
|
289
|
+
margin-top: 1px;
|
|
290
|
+
color: var(--color-brand-accent-ink);
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
.crewlet-select__option-body {
|
|
294
|
+
display: flex;
|
|
295
|
+
flex-direction: column;
|
|
296
|
+
gap: 1px;
|
|
297
|
+
min-width: 0;
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
.crewlet-select__option-label {
|
|
301
|
+
overflow: hidden;
|
|
302
|
+
text-overflow: ellipsis;
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
.crewlet-select__option-desc {
|
|
306
|
+
font-size: var(--font-size-2xs);
|
|
307
|
+
line-height: var(--font-line-height-normal);
|
|
308
|
+
color: var(--color-text-tertiary);
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
/* The second line stays the second line on the row the reader is on: it is
|
|
312
|
+
the same fact, and a description that changes colour with the highlight
|
|
313
|
+
reads as a different kind of thing under the pointer. */
|
|
314
|
+
.crewlet-select__menu .crewlet-listbox__option.is-highlight .crewlet-select__option-desc {
|
|
315
|
+
color: var(--color-text-tertiary);
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
/* ── The search box ──────────────────────────────────────────────────── */
|
|
319
|
+
|
|
320
|
+
.crewlet-select__search {
|
|
321
|
+
display: flex;
|
|
322
|
+
align-items: center;
|
|
323
|
+
gap: var(--spacing-2);
|
|
324
|
+
padding: var(--spacing-2) var(--spacing-3);
|
|
325
|
+
border-bottom: 1px solid var(--color-border-default);
|
|
326
|
+
color: var(--color-text-tertiary);
|
|
327
|
+
flex: none;
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
.crewlet-select__search-input {
|
|
331
|
+
flex: 1;
|
|
332
|
+
min-width: 0;
|
|
333
|
+
background: transparent;
|
|
334
|
+
border: none;
|
|
335
|
+
outline: none;
|
|
336
|
+
font: inherit;
|
|
337
|
+
font-size: var(--font-size-compact);
|
|
338
|
+
color: var(--color-text-primary);
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
.crewlet-select__search-input::placeholder {
|
|
342
|
+
color: var(--color-text-tertiary);
|
|
343
|
+
opacity: 1;
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
@media (prefers-reduced-motion: reduce) {
|
|
347
|
+
.crewlet-select {
|
|
348
|
+
transition: none;
|
|
349
|
+
}
|
|
350
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A keyboard shortcut that belongs to the PAGE.
|
|
3
|
+
*
|
|
4
|
+
* WHY IT IS NOT A `keydown` LISTENER. Four rules separate a shortcut that
|
|
5
|
+
* works from one that fires in the wrong place, and every one of them was a
|
|
6
|
+
* defect somewhere before it was a rule here:
|
|
7
|
+
*
|
|
8
|
+
* - NOT A PRESS SOMETHING ELSE HAS ALREADY HANDLED. A surface that closes on
|
|
9
|
+
* its own chord calls `preventDefault`, and a second handler acting on the
|
|
10
|
+
* same press undoes what the first one did.
|
|
11
|
+
* - NOT A PRESS AN INPUT METHOD IS COMPOSING. Somebody typing Japanese,
|
|
12
|
+
* Chinese or Korean builds each word in a composition, whose Enter, Escape
|
|
13
|
+
* and arrows still reach the page as key presses. See `isComposing`.
|
|
14
|
+
* - NOT WHILE A MODAL HOLDS THE KEYBOARD. `aria-modal` says the page behind a
|
|
15
|
+
* dialog cannot be reached, and a page shortcut that fires through it breaks
|
|
16
|
+
* that in the most expensive way available: search opened over a dialog can
|
|
17
|
+
* navigate, the navigation unmounts the dialog, and a write whose outcome
|
|
18
|
+
* nobody has seen goes with it.
|
|
19
|
+
* - NOT A BARE KEY WHILE SOMEBODY IS TYPING. A slash is a search shortcut on
|
|
20
|
+
* an empty page and a character in a filter box. The set of what counts as
|
|
21
|
+
* typing includes `select`, which the dashboard this is ported from left
|
|
22
|
+
* out: a slash pressed on a focused native select opened search instead of
|
|
23
|
+
* jumping to the option the reader was spelling.
|
|
24
|
+
*/
|
|
25
|
+
/**
|
|
26
|
+
* A press with modifiers. `mod` is the platform's command key: Command on an
|
|
27
|
+
* Apple keyboard, Control everywhere else, so one binding is right on both.
|
|
28
|
+
*/
|
|
29
|
+
export interface ShortcutChord {
|
|
30
|
+
/** The key as the browser reports it, compared without case for a letter. */
|
|
31
|
+
key: string;
|
|
32
|
+
mod?: boolean | undefined;
|
|
33
|
+
shift?: boolean | undefined;
|
|
34
|
+
alt?: boolean | undefined;
|
|
35
|
+
}
|
|
36
|
+
/** A bare key (`'/'`, `'?'`) or a chord. */
|
|
37
|
+
export type ShortcutKey = string | ShortcutChord;
|
|
38
|
+
/**
|
|
39
|
+
* Whether this press is one of these shortcuts.
|
|
40
|
+
*
|
|
41
|
+
* Exported because a surface sometimes has to answer the same question about
|
|
42
|
+
* a press it is handed rather than about one it subscribed to: a command
|
|
43
|
+
* palette closes on the chord that opened it, and two spellings of "is this
|
|
44
|
+
* that chord" is how the two come to disagree.
|
|
45
|
+
*/
|
|
46
|
+
export declare function matchesShortcut(event: KeyboardEvent, keys: readonly ShortcutKey[]): boolean;
|
|
47
|
+
export interface ShortcutOptions {
|
|
48
|
+
/** The presses that fire it. */
|
|
49
|
+
keys: readonly ShortcutKey[];
|
|
50
|
+
/** What to do. The press is already claimed with `preventDefault` by then. */
|
|
51
|
+
onKey: (event: KeyboardEvent) => void;
|
|
52
|
+
/**
|
|
53
|
+
* `page` is a shortcut the page owns, silent while a modal is open.
|
|
54
|
+
*
|
|
55
|
+
* `any` is for a shortcut owned by a surface that is itself up, because a
|
|
56
|
+
* surface cannot use `page`: it IS the modal that would silence it. It is
|
|
57
|
+
* NOT a way out of the modal rule, and the caller owes the other half of
|
|
58
|
+
* it: pass `enabled: isTopmost` from that surface's own `useModalLayer`, so
|
|
59
|
+
* the chord belongs to whichever surface holds the keyboard. Bound without
|
|
60
|
+
* it, a palette's own chord closes the palette from beneath a dialog raised
|
|
61
|
+
* over it, and focus lands behind that dialog's veil.
|
|
62
|
+
*/
|
|
63
|
+
scope?: 'page' | 'any' | undefined;
|
|
64
|
+
/** False to unbind it, for a shortcut that belongs to a state. */
|
|
65
|
+
enabled?: boolean | undefined;
|
|
66
|
+
}
|
|
67
|
+
/** Binds `keys` for as long as the component is mounted and `enabled`. */
|
|
68
|
+
export declare function useShortcut({ keys, onKey, scope, enabled }: ShortcutOptions): void;
|