@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,823 @@
|
|
|
1
|
+
import { Select } from './chunk-OFHBK7RI.js';
|
|
2
|
+
import { Popover } from './chunk-DD5BBGBE.js';
|
|
3
|
+
import { today, shiftMonth, CalendarGrid, compareDays } from './chunk-GXQ3B46I.js';
|
|
4
|
+
import { Input } from './chunk-O6232G37.js';
|
|
5
|
+
import { isComposing } from './chunk-ITHXJHBB.js';
|
|
6
|
+
import { IconButton } from './chunk-F27EPQ7D.js';
|
|
7
|
+
import { Button } from './chunk-BZYDZBAN.js';
|
|
8
|
+
import { cx } from './chunk-ODEQTPFM.js';
|
|
9
|
+
import './TimeWindowPicker-7I7KWCMU.css';
|
|
10
|
+
import { useMemo, useState, useRef, useId, useEffect } from 'react';
|
|
11
|
+
import { ScheduleGlyph, KeyboardArrowDownGlyph, CheckGlyph, ChevronLeftGlyph, ChevronRightGlyph } from '@crewlethq/icons/glyphs';
|
|
12
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
13
|
+
|
|
14
|
+
// src/TimeWindowPicker/mask.ts
|
|
15
|
+
var DATE_MASK = "YYYY/MM/DD";
|
|
16
|
+
var TIME_MASK = "HH:MM:SS";
|
|
17
|
+
var DATE_SEGMENTS = [
|
|
18
|
+
{ start: 0, end: 3, min: 1, max: 9999 },
|
|
19
|
+
{ start: 5, end: 6, min: 1, max: 12 },
|
|
20
|
+
{ start: 8, end: 9, min: 1, max: 31 }
|
|
21
|
+
];
|
|
22
|
+
var TIME_SEGMENTS = [
|
|
23
|
+
{ start: 0, end: 1, min: 0, max: 23 },
|
|
24
|
+
{ start: 3, end: 4, min: 0, max: 59 },
|
|
25
|
+
{ start: 6, end: 7, min: 0, max: 59 }
|
|
26
|
+
];
|
|
27
|
+
var isSeparator = (mask, position) => {
|
|
28
|
+
const char = mask[position];
|
|
29
|
+
return char !== void 0 && !/[A-Za-z]/.test(char);
|
|
30
|
+
};
|
|
31
|
+
var slotCount = (mask) => [...mask].filter((_, at) => !isSeparator(mask, at)).length;
|
|
32
|
+
function project(mask, text) {
|
|
33
|
+
const digits = text.replace(/\D/g, "").slice(0, slotCount(mask));
|
|
34
|
+
let out = "";
|
|
35
|
+
let at = 0;
|
|
36
|
+
for (const digit of digits) {
|
|
37
|
+
while (at < mask.length && isSeparator(mask, at)) {
|
|
38
|
+
out += mask[at];
|
|
39
|
+
at += 1;
|
|
40
|
+
}
|
|
41
|
+
out += digit;
|
|
42
|
+
at += 1;
|
|
43
|
+
}
|
|
44
|
+
return out;
|
|
45
|
+
}
|
|
46
|
+
function remainder(mask, text) {
|
|
47
|
+
return mask.slice(project(mask, text).length);
|
|
48
|
+
}
|
|
49
|
+
var isComplete = (mask, text) => text.replace(/\D/g, "").length === slotCount(mask);
|
|
50
|
+
function isRealDate(text) {
|
|
51
|
+
const match = /^(\d{4})\/(\d{2})\/(\d{2})$/.exec(text);
|
|
52
|
+
if (!match) return false;
|
|
53
|
+
const year = Number(match[1]);
|
|
54
|
+
const month = Number(match[2]);
|
|
55
|
+
const day = Number(match[3]);
|
|
56
|
+
if (year < 1 || month < 1 || month > 12 || day < 1) return false;
|
|
57
|
+
const when = new Date(year, month - 1, day);
|
|
58
|
+
return when.getFullYear() === year && when.getMonth() === month - 1 && when.getDate() === day;
|
|
59
|
+
}
|
|
60
|
+
function isRealTime(text) {
|
|
61
|
+
const match = /^(\d{2}):(\d{2}):(\d{2})$/.exec(text);
|
|
62
|
+
if (!match) return false;
|
|
63
|
+
const [hour, minute, second] = [Number(match[1]), Number(match[2]), Number(match[3])];
|
|
64
|
+
return hour <= 23 && minute <= 59 && second <= 59;
|
|
65
|
+
}
|
|
66
|
+
function segmentAt(segments, position) {
|
|
67
|
+
return segments.find((segment) => position >= segment.start && position <= segment.end + 1) ?? segments[segments.length - 1];
|
|
68
|
+
}
|
|
69
|
+
function stepSegment(mask, text, segment, by) {
|
|
70
|
+
const filled = project(mask, text).padEnd(mask.length, " ");
|
|
71
|
+
const width = segment.end - segment.start + 1;
|
|
72
|
+
const run = filled.slice(segment.start, segment.end + 1);
|
|
73
|
+
const digits = run.replace(/[^0-9]/g, "");
|
|
74
|
+
const next = digits.length === 0 ? segment.min : Math.min(segment.max, Math.max(segment.min, Number(digits) + by));
|
|
75
|
+
const before = filled.slice(0, segment.start).replace(/ /g, "");
|
|
76
|
+
if (before.replace(/\D/g, "").length < slotCount(mask.slice(0, segment.start))) return text;
|
|
77
|
+
const after = filled.slice(segment.end + 1).replace(/ /g, "");
|
|
78
|
+
return project(mask, before + String(next).padStart(width, "0") + after);
|
|
79
|
+
}
|
|
80
|
+
var TIME_WINDOW_SPANS = ["today", "yesterday"];
|
|
81
|
+
var DURATION = /^\s*(\d+)\s*(m|h|d|w)\s*$/i;
|
|
82
|
+
var MILLISECONDS = {
|
|
83
|
+
m: 6e4,
|
|
84
|
+
h: 36e5,
|
|
85
|
+
d: 864e5,
|
|
86
|
+
w: 6048e5
|
|
87
|
+
};
|
|
88
|
+
var DAY = MILLISECONDS.d;
|
|
89
|
+
function parseTimeWindowDuration(text) {
|
|
90
|
+
const match = DURATION.exec(text);
|
|
91
|
+
if (!match) return 0;
|
|
92
|
+
const amount = Number.parseInt(match[1], 10);
|
|
93
|
+
if (!Number.isFinite(amount)) return 0;
|
|
94
|
+
return amount * MILLISECONDS[match[2].toLowerCase()];
|
|
95
|
+
}
|
|
96
|
+
function splitDuration(text) {
|
|
97
|
+
if (!text) return null;
|
|
98
|
+
const match = DURATION.exec(text);
|
|
99
|
+
if (!match) return null;
|
|
100
|
+
const amount = Number.parseInt(match[1], 10);
|
|
101
|
+
if (!Number.isFinite(amount) || amount <= 0) return null;
|
|
102
|
+
return { amount, unit: match[2].toLowerCase() };
|
|
103
|
+
}
|
|
104
|
+
function spanBounds(span, zone, now) {
|
|
105
|
+
if (zone === "utc") {
|
|
106
|
+
const midnight2 = Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate());
|
|
107
|
+
if (span === "today") return { from: new Date(midnight2) };
|
|
108
|
+
return { from: new Date(midnight2 - DAY), to: new Date(midnight2) };
|
|
109
|
+
}
|
|
110
|
+
const midnight = new Date(now.getFullYear(), now.getMonth(), now.getDate());
|
|
111
|
+
if (span === "today") return { from: midnight };
|
|
112
|
+
return { from: new Date(now.getFullYear(), now.getMonth(), now.getDate() - 1), to: midnight };
|
|
113
|
+
}
|
|
114
|
+
function resolveTimeWindow(value, now = /* @__PURE__ */ new Date()) {
|
|
115
|
+
const nothing = { from: void 0, to: void 0 };
|
|
116
|
+
if (!value) return nothing;
|
|
117
|
+
if (value.kind === "relative") {
|
|
118
|
+
if (value.span) {
|
|
119
|
+
const bounds = spanBounds(value.span, value.timezone ?? "local", now);
|
|
120
|
+
return { from: bounds.from.toISOString(), to: bounds.to?.toISOString() };
|
|
121
|
+
}
|
|
122
|
+
const span = parseTimeWindowDuration(value.duration ?? "");
|
|
123
|
+
if (span <= 0) return nothing;
|
|
124
|
+
return { from: new Date(now.getTime() - span).toISOString(), to: void 0 };
|
|
125
|
+
}
|
|
126
|
+
if (value.kind === "absolute") {
|
|
127
|
+
const suffix = value.timezone === "utc" ? "Z" : "";
|
|
128
|
+
return {
|
|
129
|
+
from: value.from ? new Date(value.from + suffix).toISOString() : void 0,
|
|
130
|
+
to: value.to ? new Date(value.to + suffix).toISOString() : void 0
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
return nothing;
|
|
134
|
+
}
|
|
135
|
+
var DEFAULT_PRESETS = [
|
|
136
|
+
{ label: "Last 15 minutes", duration: "15m" },
|
|
137
|
+
{ label: "Last hour", duration: "1h" },
|
|
138
|
+
{ label: "Last 4 hours", duration: "4h" },
|
|
139
|
+
{ label: "Today", span: "today" },
|
|
140
|
+
{ label: "Yesterday", span: "yesterday" },
|
|
141
|
+
{ label: "Last 24 hours", duration: "24h" },
|
|
142
|
+
{ label: "Last 7 days", duration: "7d" },
|
|
143
|
+
{ label: "Last 30 days", duration: "30d" }
|
|
144
|
+
];
|
|
145
|
+
var SINGULAR = {
|
|
146
|
+
m: "minute",
|
|
147
|
+
h: "hour",
|
|
148
|
+
d: "day",
|
|
149
|
+
w: "week"
|
|
150
|
+
};
|
|
151
|
+
var PLURAL = {
|
|
152
|
+
m: "minutes",
|
|
153
|
+
h: "hours",
|
|
154
|
+
d: "days",
|
|
155
|
+
w: "weeks"
|
|
156
|
+
};
|
|
157
|
+
var DEFAULT_TIME_WINDOW_LABELS = {
|
|
158
|
+
placeholder: "Pick a time window",
|
|
159
|
+
triggerName: (name, window) => `${name}: ${window}`,
|
|
160
|
+
presetsLabel: "Relative windows",
|
|
161
|
+
absoluteLabel: "Absolute range",
|
|
162
|
+
timezoneLabel: "Time zone",
|
|
163
|
+
localLabel: "Local time zone",
|
|
164
|
+
utcLabel: "UTC",
|
|
165
|
+
startLabel: "Start",
|
|
166
|
+
endLabel: "End",
|
|
167
|
+
startDateLabel: "Start date",
|
|
168
|
+
startTimeLabel: "Start time",
|
|
169
|
+
endDateLabel: "End date",
|
|
170
|
+
endTimeLabel: "End time",
|
|
171
|
+
previousMonthLabel: "Previous month",
|
|
172
|
+
nextMonthLabel: "Next month",
|
|
173
|
+
customLabel: "Or the last",
|
|
174
|
+
customAmountLabel: "Custom amount",
|
|
175
|
+
customUnitLabel: "Custom unit",
|
|
176
|
+
unitNames: { m: "Minutes", h: "Hours", d: "Days", w: "Weeks" },
|
|
177
|
+
spanNames: { today: "Today", yesterday: "Yesterday" },
|
|
178
|
+
durationWindow: (amount, unit) => `Last ${amount} ${amount === 1 ? SINGULAR[unit] : PLURAL[unit]}`,
|
|
179
|
+
range: (from, to) => `${from} to ${to}`,
|
|
180
|
+
nowLabel: "now",
|
|
181
|
+
earliestLabel: "the earliest record",
|
|
182
|
+
unsetLabel: "Any time",
|
|
183
|
+
summary: (window, range) => `${window}: ${range}`,
|
|
184
|
+
resetLabel: "Reset to default",
|
|
185
|
+
cancelLabel: "Cancel",
|
|
186
|
+
applyLabel: "Apply"
|
|
187
|
+
};
|
|
188
|
+
var withLabels = (labels) => labels ? { ...DEFAULT_TIME_WINDOW_LABELS, ...labels } : DEFAULT_TIME_WINDOW_LABELS;
|
|
189
|
+
var MOMENT_FORMAT = {
|
|
190
|
+
year: "numeric",
|
|
191
|
+
month: "short",
|
|
192
|
+
day: "numeric",
|
|
193
|
+
hour: "2-digit",
|
|
194
|
+
minute: "2-digit",
|
|
195
|
+
// h23 rather than `hour12: false`, which renders midnight as 24 in several
|
|
196
|
+
// locales: a window said to start at 24:00 on the 8th starts on the 9th.
|
|
197
|
+
hourCycle: "h23"
|
|
198
|
+
};
|
|
199
|
+
var momentText = (at, zone) => new Intl.DateTimeFormat(void 0, zone === "utc" ? { ...MOMENT_FORMAT, timeZone: "UTC" } : MOMENT_FORMAT).format(at);
|
|
200
|
+
function timeWindowMatchesPreset(value, preset) {
|
|
201
|
+
if (!value || value.kind !== "relative") return false;
|
|
202
|
+
if (preset.span) return value.span === preset.span;
|
|
203
|
+
if (!preset.duration || value.span) return false;
|
|
204
|
+
return parseTimeWindowDuration(value.duration ?? "") === parseTimeWindowDuration(preset.duration);
|
|
205
|
+
}
|
|
206
|
+
function isTimeWindowSet(value) {
|
|
207
|
+
if (!value) return false;
|
|
208
|
+
if (value.kind === "relative") return Boolean(value.span) || parseTimeWindowDuration(value.duration ?? "") > 0;
|
|
209
|
+
return Boolean(value.from || value.to);
|
|
210
|
+
}
|
|
211
|
+
function describeTimeWindow(value, options = {}) {
|
|
212
|
+
const labels = withLabels(options.labels);
|
|
213
|
+
const presets = options.presets ?? DEFAULT_PRESETS;
|
|
214
|
+
const now = options.now ?? /* @__PURE__ */ new Date();
|
|
215
|
+
const zone = value?.timezone ?? "local";
|
|
216
|
+
const resolved = resolveTimeWindow(value, now);
|
|
217
|
+
const range = (() => {
|
|
218
|
+
if (!resolved.from && !resolved.to) return labels.unsetLabel;
|
|
219
|
+
const from = resolved.from ? momentText(new Date(resolved.from), zone) : labels.earliestLabel;
|
|
220
|
+
const to = resolved.to ? momentText(new Date(resolved.to), zone) : labels.nowLabel;
|
|
221
|
+
return labels.range(from, to);
|
|
222
|
+
})();
|
|
223
|
+
const window = (() => {
|
|
224
|
+
if (!isTimeWindowSet(value)) return labels.unsetLabel;
|
|
225
|
+
if (value.kind === "absolute") return range;
|
|
226
|
+
const named = presets.find((preset) => timeWindowMatchesPreset(value, preset));
|
|
227
|
+
if (named) return named.label;
|
|
228
|
+
if (value.span) return labels.spanNames[value.span];
|
|
229
|
+
const parts = splitDuration(value.duration);
|
|
230
|
+
return parts ? labels.durationWindow(parts.amount, parts.unit) : labels.unsetLabel;
|
|
231
|
+
})();
|
|
232
|
+
return { window, range, spoken: window === range ? window : labels.summary(window, range) };
|
|
233
|
+
}
|
|
234
|
+
var pad = (n) => String(n).padStart(2, "0");
|
|
235
|
+
function parseMoment(text) {
|
|
236
|
+
if (!text) return null;
|
|
237
|
+
const at = text.indexOf("T");
|
|
238
|
+
const date = at >= 0 ? text.slice(0, at) : text;
|
|
239
|
+
const time = at >= 0 ? text.slice(at + 1) : "00:00:00";
|
|
240
|
+
const parts = date.split("-");
|
|
241
|
+
if (parts.length < 3) return null;
|
|
242
|
+
const [year, month, day] = parts.map((part) => Number.parseInt(part, 10));
|
|
243
|
+
if (![year, month, day].every((n) => Number.isFinite(n))) return null;
|
|
244
|
+
const clock = time.split(":");
|
|
245
|
+
const hour = Number.parseInt(clock[0] || "0", 10);
|
|
246
|
+
const minute = Number.parseInt(clock[1] || "0", 10);
|
|
247
|
+
const second = Number.parseInt(clock[2] || "0", 10);
|
|
248
|
+
return {
|
|
249
|
+
year,
|
|
250
|
+
month: month - 1,
|
|
251
|
+
day,
|
|
252
|
+
hour: Number.isFinite(hour) ? hour : 0,
|
|
253
|
+
minute: Number.isFinite(minute) ? minute : 0,
|
|
254
|
+
second: Number.isFinite(second) ? second : 0
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
var momentIn = (at, zone) => zone === "utc" ? {
|
|
258
|
+
year: at.getUTCFullYear(),
|
|
259
|
+
month: at.getUTCMonth(),
|
|
260
|
+
day: at.getUTCDate(),
|
|
261
|
+
hour: at.getUTCHours(),
|
|
262
|
+
minute: at.getUTCMinutes(),
|
|
263
|
+
second: at.getUTCSeconds()
|
|
264
|
+
} : {
|
|
265
|
+
year: at.getFullYear(),
|
|
266
|
+
month: at.getMonth(),
|
|
267
|
+
day: at.getDate(),
|
|
268
|
+
hour: at.getHours(),
|
|
269
|
+
minute: at.getMinutes(),
|
|
270
|
+
second: at.getSeconds()
|
|
271
|
+
};
|
|
272
|
+
var formatMoment = (moment) => `${moment.year}-${pad(moment.month + 1)}-${pad(moment.day)}T${pad(moment.hour)}:${pad(moment.minute)}:${pad(moment.second)}`;
|
|
273
|
+
var dateText = (moment) => `${moment.year}/${pad(moment.month + 1)}/${pad(moment.day)}`;
|
|
274
|
+
var timeText = (moment) => `${pad(moment.hour)}:${pad(moment.minute)}:${pad(moment.second)}`;
|
|
275
|
+
var readDate = (text) => {
|
|
276
|
+
const match = /^(\d{4})\/(\d{2})\/(\d{2})$/.exec(text);
|
|
277
|
+
if (!match || !isRealDate(text)) return null;
|
|
278
|
+
return { year: Number(match[1]), month: Number(match[2]) - 1, day: Number(match[3]) };
|
|
279
|
+
};
|
|
280
|
+
var readTime = (text) => {
|
|
281
|
+
const match = /^(\d{2}):(\d{2}):(\d{2})$/.exec(text);
|
|
282
|
+
if (!match || !isRealTime(text)) return null;
|
|
283
|
+
return { hour: Number(match[1]), minute: Number(match[2]), second: Number(match[3]) };
|
|
284
|
+
};
|
|
285
|
+
var MONTH_NAMES = [
|
|
286
|
+
"January",
|
|
287
|
+
"February",
|
|
288
|
+
"March",
|
|
289
|
+
"April",
|
|
290
|
+
"May",
|
|
291
|
+
"June",
|
|
292
|
+
"July",
|
|
293
|
+
"August",
|
|
294
|
+
"September",
|
|
295
|
+
"October",
|
|
296
|
+
"November",
|
|
297
|
+
"December"
|
|
298
|
+
];
|
|
299
|
+
var DAY_START = { hour: 0, minute: 0, second: 0 };
|
|
300
|
+
var DAY_END = { hour: 23, minute: 59, second: 59 };
|
|
301
|
+
function normalise(value) {
|
|
302
|
+
if (!value) return { kind: "relative" };
|
|
303
|
+
if (value.kind !== "relative") return value;
|
|
304
|
+
const zone = value.timezone ? { timezone: value.timezone } : {};
|
|
305
|
+
if (value.span) return { kind: "relative", span: value.span, ...zone };
|
|
306
|
+
return { kind: "relative", duration: value.duration ?? "", ...zone };
|
|
307
|
+
}
|
|
308
|
+
var fromPreset = (preset, zone) => preset.span ? { kind: "relative", span: preset.span, timezone: zone } : { kind: "relative", duration: preset.duration ?? "", timezone: zone };
|
|
309
|
+
function TimeWindowPicker({
|
|
310
|
+
value,
|
|
311
|
+
onChange,
|
|
312
|
+
defaultValue,
|
|
313
|
+
presets = DEFAULT_PRESETS,
|
|
314
|
+
allowRelative = true,
|
|
315
|
+
allowAbsolute = true,
|
|
316
|
+
allowCustom = true,
|
|
317
|
+
bounds,
|
|
318
|
+
firstDayOfWeek = 0,
|
|
319
|
+
ariaLabel = "Time window",
|
|
320
|
+
className = "",
|
|
321
|
+
disabled = false,
|
|
322
|
+
size = "md",
|
|
323
|
+
labels: labelOverrides
|
|
324
|
+
}) {
|
|
325
|
+
const labels = useMemo(() => withLabels(labelOverrides), [labelOverrides]);
|
|
326
|
+
const isSet = isTimeWindowSet(value);
|
|
327
|
+
const described = describeTimeWindow(value, { presets, labels });
|
|
328
|
+
const shown = isSet ? described.window : labels.placeholder;
|
|
329
|
+
return /* @__PURE__ */ jsx(
|
|
330
|
+
Popover,
|
|
331
|
+
{
|
|
332
|
+
align: "start",
|
|
333
|
+
side: "bottom",
|
|
334
|
+
width: "auto",
|
|
335
|
+
label: ariaLabel,
|
|
336
|
+
className: "crewlet-time-window__popover",
|
|
337
|
+
trigger: (open, toggle) => /* @__PURE__ */ jsxs(
|
|
338
|
+
"button",
|
|
339
|
+
{
|
|
340
|
+
type: "button",
|
|
341
|
+
className: cx(
|
|
342
|
+
"crewlet-time-window",
|
|
343
|
+
`crewlet-time-window--${size}`,
|
|
344
|
+
isSet && "is-set",
|
|
345
|
+
open && "is-open",
|
|
346
|
+
disabled && "is-disabled",
|
|
347
|
+
className
|
|
348
|
+
),
|
|
349
|
+
onClick: () => {
|
|
350
|
+
if (!disabled) toggle();
|
|
351
|
+
},
|
|
352
|
+
disabled,
|
|
353
|
+
"aria-haspopup": "dialog",
|
|
354
|
+
"aria-expanded": open,
|
|
355
|
+
"aria-label": labels.triggerName(ariaLabel, shown),
|
|
356
|
+
children: [
|
|
357
|
+
/* @__PURE__ */ jsx(ScheduleGlyph, { className: "crewlet-time-window__icon", size: "sm" }),
|
|
358
|
+
/* @__PURE__ */ jsx("span", { className: cx("crewlet-time-window__label", !isSet && "is-placeholder"), children: shown }),
|
|
359
|
+
/* @__PURE__ */ jsx(KeyboardArrowDownGlyph, { className: "crewlet-time-window__chevron", size: "sm" })
|
|
360
|
+
]
|
|
361
|
+
}
|
|
362
|
+
),
|
|
363
|
+
children: (close) => /* @__PURE__ */ jsx(
|
|
364
|
+
Panel,
|
|
365
|
+
{
|
|
366
|
+
value,
|
|
367
|
+
onChange,
|
|
368
|
+
close,
|
|
369
|
+
defaultValue,
|
|
370
|
+
presets,
|
|
371
|
+
allowRelative,
|
|
372
|
+
allowAbsolute,
|
|
373
|
+
allowCustom,
|
|
374
|
+
bounds,
|
|
375
|
+
firstDayOfWeek,
|
|
376
|
+
labels
|
|
377
|
+
}
|
|
378
|
+
)
|
|
379
|
+
}
|
|
380
|
+
);
|
|
381
|
+
}
|
|
382
|
+
function Panel({
|
|
383
|
+
value,
|
|
384
|
+
onChange,
|
|
385
|
+
close,
|
|
386
|
+
defaultValue,
|
|
387
|
+
presets,
|
|
388
|
+
allowRelative,
|
|
389
|
+
allowAbsolute,
|
|
390
|
+
allowCustom,
|
|
391
|
+
bounds,
|
|
392
|
+
firstDayOfWeek,
|
|
393
|
+
labels
|
|
394
|
+
}) {
|
|
395
|
+
const now = useMemo(() => /* @__PURE__ */ new Date(), []);
|
|
396
|
+
const [draft, setDraft] = useState(() => normalise(value));
|
|
397
|
+
const zone = draft.timezone ?? "local";
|
|
398
|
+
const described = describeTimeWindow(draft, { presets, labels, now });
|
|
399
|
+
const resolved = useMemo(() => resolveTimeWindow(draft, now), [draft, now]);
|
|
400
|
+
const from = resolved.from ? momentIn(new Date(resolved.from), zone) : null;
|
|
401
|
+
const to = resolved.to ? momentIn(new Date(resolved.to), zone) : draft.kind === "relative" && isTimeWindowSet(draft) ? momentIn(now, zone) : null;
|
|
402
|
+
return /* @__PURE__ */ jsxs(
|
|
403
|
+
"div",
|
|
404
|
+
{
|
|
405
|
+
className: cx(
|
|
406
|
+
"crewlet-time-window__panel",
|
|
407
|
+
allowRelative && allowAbsolute && "crewlet-time-window__panel--both"
|
|
408
|
+
),
|
|
409
|
+
children: [
|
|
410
|
+
allowRelative ? /* @__PURE__ */ jsx(
|
|
411
|
+
RelativeRail,
|
|
412
|
+
{
|
|
413
|
+
draft,
|
|
414
|
+
setDraft,
|
|
415
|
+
presets,
|
|
416
|
+
allowCustom,
|
|
417
|
+
zone,
|
|
418
|
+
labels
|
|
419
|
+
}
|
|
420
|
+
) : null,
|
|
421
|
+
allowAbsolute ? /* @__PURE__ */ jsx(
|
|
422
|
+
AbsolutePane,
|
|
423
|
+
{
|
|
424
|
+
draft,
|
|
425
|
+
setDraft,
|
|
426
|
+
from,
|
|
427
|
+
to,
|
|
428
|
+
zone,
|
|
429
|
+
bounds,
|
|
430
|
+
firstDayOfWeek,
|
|
431
|
+
labels
|
|
432
|
+
}
|
|
433
|
+
) : null,
|
|
434
|
+
/* @__PURE__ */ jsxs("div", { className: "crewlet-time-window__footer", children: [
|
|
435
|
+
/* @__PURE__ */ jsx("p", { className: "crewlet-time-window__summary", "aria-live": "polite", children: described.spoken }),
|
|
436
|
+
/* @__PURE__ */ jsxs("div", { className: "crewlet-time-window__actions", children: [
|
|
437
|
+
defaultValue ? /* @__PURE__ */ jsx(
|
|
438
|
+
Button,
|
|
439
|
+
{
|
|
440
|
+
size: "small",
|
|
441
|
+
variant: "tertiary",
|
|
442
|
+
onClick: () => setDraft(normalise(defaultValue)),
|
|
443
|
+
children: labels.resetLabel
|
|
444
|
+
}
|
|
445
|
+
) : null,
|
|
446
|
+
/* @__PURE__ */ jsx(Button, { size: "small", variant: "tertiary", onClick: close, children: labels.cancelLabel }),
|
|
447
|
+
/* @__PURE__ */ jsx(
|
|
448
|
+
Button,
|
|
449
|
+
{
|
|
450
|
+
size: "small",
|
|
451
|
+
variant: "secondary",
|
|
452
|
+
onClick: () => {
|
|
453
|
+
onChange(draft);
|
|
454
|
+
close();
|
|
455
|
+
},
|
|
456
|
+
children: labels.applyLabel
|
|
457
|
+
}
|
|
458
|
+
)
|
|
459
|
+
] })
|
|
460
|
+
] })
|
|
461
|
+
]
|
|
462
|
+
}
|
|
463
|
+
);
|
|
464
|
+
}
|
|
465
|
+
function RelativeRail({ draft, setDraft, presets, allowCustom, zone, labels }) {
|
|
466
|
+
const rail = useRef(null);
|
|
467
|
+
const custom = useId();
|
|
468
|
+
const chosen = presets.findIndex((preset) => timeWindowMatchesPreset(draft, preset));
|
|
469
|
+
const stop = chosen >= 0 ? chosen : 0;
|
|
470
|
+
const held = splitDuration(draft.kind === "relative" && !draft.span ? draft.duration : void 0);
|
|
471
|
+
const [amount, setAmount] = useState(() => String(held?.amount ?? 1));
|
|
472
|
+
const [unit, setUnit] = useState(() => held?.unit ?? "h");
|
|
473
|
+
const heldAmount = held?.amount;
|
|
474
|
+
const heldUnit = held?.unit;
|
|
475
|
+
useEffect(() => {
|
|
476
|
+
if (heldAmount === void 0 || heldUnit === void 0) return;
|
|
477
|
+
setAmount(String(heldAmount));
|
|
478
|
+
setUnit(heldUnit);
|
|
479
|
+
}, [heldAmount, heldUnit]);
|
|
480
|
+
const take = (at) => {
|
|
481
|
+
const preset = presets[at];
|
|
482
|
+
if (preset) setDraft(fromPreset(preset, zone));
|
|
483
|
+
};
|
|
484
|
+
function onKeyDown(event, at) {
|
|
485
|
+
const last = presets.length - 1;
|
|
486
|
+
let to;
|
|
487
|
+
switch (event.key) {
|
|
488
|
+
case "ArrowDown":
|
|
489
|
+
case "ArrowRight":
|
|
490
|
+
to = at === last ? 0 : at + 1;
|
|
491
|
+
break;
|
|
492
|
+
case "ArrowUp":
|
|
493
|
+
case "ArrowLeft":
|
|
494
|
+
to = at === 0 ? last : at - 1;
|
|
495
|
+
break;
|
|
496
|
+
case "Home":
|
|
497
|
+
to = 0;
|
|
498
|
+
break;
|
|
499
|
+
case "End":
|
|
500
|
+
to = last;
|
|
501
|
+
break;
|
|
502
|
+
default:
|
|
503
|
+
return;
|
|
504
|
+
}
|
|
505
|
+
event.preventDefault();
|
|
506
|
+
take(to);
|
|
507
|
+
rail.current?.querySelectorAll('[role="radio"]')[to]?.focus();
|
|
508
|
+
}
|
|
509
|
+
const commit = (nextAmount, nextUnit) => {
|
|
510
|
+
const parsed = Number.parseInt(nextAmount, 10);
|
|
511
|
+
if (!Number.isFinite(parsed) || parsed <= 0) return;
|
|
512
|
+
setDraft({ kind: "relative", duration: `${parsed}${nextUnit}`, timezone: zone });
|
|
513
|
+
};
|
|
514
|
+
return /* @__PURE__ */ jsxs("div", { className: "crewlet-time-window__relative", children: [
|
|
515
|
+
/* @__PURE__ */ jsx("div", { className: "crewlet-time-window__rail", role: "radiogroup", "aria-label": labels.presetsLabel, ref: rail, children: presets.map((preset, at) => {
|
|
516
|
+
const on = at === chosen;
|
|
517
|
+
return /* @__PURE__ */ jsxs(
|
|
518
|
+
"button",
|
|
519
|
+
{
|
|
520
|
+
type: "button",
|
|
521
|
+
role: "radio",
|
|
522
|
+
"aria-checked": on,
|
|
523
|
+
tabIndex: at === stop ? 0 : -1,
|
|
524
|
+
className: cx("crewlet-time-window__preset", on && "is-active"),
|
|
525
|
+
onClick: () => take(at),
|
|
526
|
+
onKeyDown: (event) => onKeyDown(event, at),
|
|
527
|
+
children: [
|
|
528
|
+
/* @__PURE__ */ jsx(CheckGlyph, { className: "crewlet-time-window__tick", size: "xs", "aria-hidden": "true" }),
|
|
529
|
+
/* @__PURE__ */ jsx("span", { className: "crewlet-time-window__preset-label", children: preset.label })
|
|
530
|
+
]
|
|
531
|
+
},
|
|
532
|
+
preset.span ?? preset.duration ?? preset.label
|
|
533
|
+
);
|
|
534
|
+
}) }),
|
|
535
|
+
allowCustom ? /* @__PURE__ */ jsxs("div", { className: "crewlet-time-window__custom", children: [
|
|
536
|
+
/* @__PURE__ */ jsx("span", { className: "crewlet-time-window__custom-label", id: custom, children: labels.customLabel }),
|
|
537
|
+
/* @__PURE__ */ jsxs("div", { className: "crewlet-time-window__custom-row", role: "group", "aria-labelledby": custom, children: [
|
|
538
|
+
/* @__PURE__ */ jsx(
|
|
539
|
+
Input,
|
|
540
|
+
{
|
|
541
|
+
inputSize: "sm",
|
|
542
|
+
width: "xs",
|
|
543
|
+
inputMode: "numeric",
|
|
544
|
+
"aria-label": labels.customAmountLabel,
|
|
545
|
+
value: amount,
|
|
546
|
+
onChange: (event) => {
|
|
547
|
+
const next = event.target.value.replace(/[^0-9]/g, "");
|
|
548
|
+
setAmount(next);
|
|
549
|
+
commit(next, unit);
|
|
550
|
+
}
|
|
551
|
+
}
|
|
552
|
+
),
|
|
553
|
+
/* @__PURE__ */ jsx(
|
|
554
|
+
Select,
|
|
555
|
+
{
|
|
556
|
+
size: "sm",
|
|
557
|
+
width: "auto",
|
|
558
|
+
ariaLabel: labels.customUnitLabel,
|
|
559
|
+
value: unit,
|
|
560
|
+
onChange: (next) => {
|
|
561
|
+
setUnit(String(next));
|
|
562
|
+
commit(amount, String(next));
|
|
563
|
+
},
|
|
564
|
+
options: ["m", "h", "d", "w"].map((key) => ({
|
|
565
|
+
value: key,
|
|
566
|
+
label: labels.unitNames[key]
|
|
567
|
+
}))
|
|
568
|
+
}
|
|
569
|
+
)
|
|
570
|
+
] })
|
|
571
|
+
] }) : null
|
|
572
|
+
] });
|
|
573
|
+
}
|
|
574
|
+
function AbsolutePane({ draft, setDraft, from, to, zone, bounds, firstDayOfWeek, labels }) {
|
|
575
|
+
const heading = useId();
|
|
576
|
+
const nowDay = useMemo(today, []);
|
|
577
|
+
const min = useMemo(() => bounds?.min ? parseMoment(bounds.min) : null, [bounds?.min]);
|
|
578
|
+
const max = useMemo(() => bounds?.max ? parseMoment(bounds.max) : nowDay, [bounds?.max, nowDay]);
|
|
579
|
+
const [view, setView] = useState(() => from ?? nowDay);
|
|
580
|
+
const [focused, setFocused] = useState(() => from ?? nowDay);
|
|
581
|
+
const [hover, setHover] = useState(null);
|
|
582
|
+
const [phase, setPhase] = useState("start");
|
|
583
|
+
const startYear = from?.year;
|
|
584
|
+
const startMonth = from?.month;
|
|
585
|
+
useEffect(() => {
|
|
586
|
+
if (startYear === void 0 || startMonth === void 0) return;
|
|
587
|
+
setView((held) => {
|
|
588
|
+
const right2 = shiftMonth(held, 1);
|
|
589
|
+
const seen = held.year === startYear && held.month === startMonth || right2.year === startYear && right2.month === startMonth;
|
|
590
|
+
return seen ? held : { year: startYear, month: startMonth, day: 1 };
|
|
591
|
+
});
|
|
592
|
+
}, [startYear, startMonth]);
|
|
593
|
+
const right = shiftMonth(view, 1);
|
|
594
|
+
const refused = (date) => min !== null && compareDays(date, min) < 0 || max !== null && compareDays(date, max) > 0;
|
|
595
|
+
const step = (months) => setView(shiftMonth(view, months));
|
|
596
|
+
const absolute = (next) => ({
|
|
597
|
+
kind: "absolute",
|
|
598
|
+
from: next.from ?? (from ? formatMoment(from) : ""),
|
|
599
|
+
to: next.to ?? (to ? formatMoment(to) : ""),
|
|
600
|
+
timezone: zone
|
|
601
|
+
});
|
|
602
|
+
function pick(date) {
|
|
603
|
+
if (phase === "start") {
|
|
604
|
+
setDraft({ kind: "absolute", from: formatMoment({ ...date, ...DAY_START }), to: "", timezone: zone });
|
|
605
|
+
setPhase("end");
|
|
606
|
+
return;
|
|
607
|
+
}
|
|
608
|
+
const start2 = parseMoment(draft.from);
|
|
609
|
+
if (start2 && compareDays(date, start2) < 0) {
|
|
610
|
+
setDraft({
|
|
611
|
+
kind: "absolute",
|
|
612
|
+
from: formatMoment({ ...date, ...DAY_START }),
|
|
613
|
+
to: formatMoment({ year: start2.year, month: start2.month, day: start2.day, ...DAY_END }),
|
|
614
|
+
timezone: zone
|
|
615
|
+
});
|
|
616
|
+
} else {
|
|
617
|
+
setDraft(
|
|
618
|
+
absolute({ to: formatMoment({ ...date, hour: to?.hour ?? 23, minute: to?.minute ?? 59, second: to?.second ?? 59 }) })
|
|
619
|
+
);
|
|
620
|
+
}
|
|
621
|
+
setPhase("start");
|
|
622
|
+
setHover(null);
|
|
623
|
+
}
|
|
624
|
+
const start = from ? { year: from.year, month: from.month, day: from.day } : null;
|
|
625
|
+
const end = to ? { year: to.year, month: to.month, day: to.day } : phase === "end" ? hover : null;
|
|
626
|
+
const selected = [start, end].filter((day) => day !== null);
|
|
627
|
+
const inRange = (date) => {
|
|
628
|
+
if (!start || !end) return false;
|
|
629
|
+
const low = compareDays(start, end) <= 0 ? start : end;
|
|
630
|
+
const high = compareDays(start, end) <= 0 ? end : start;
|
|
631
|
+
return compareDays(date, low) > 0 && compareDays(date, high) < 0;
|
|
632
|
+
};
|
|
633
|
+
const commitDate = (which, text) => {
|
|
634
|
+
const date = readDate(text);
|
|
635
|
+
if (!date) return;
|
|
636
|
+
const held = which === "from" ? from : to;
|
|
637
|
+
const clock = held ?? (which === "from" ? DAY_START : DAY_END);
|
|
638
|
+
const moment = formatMoment({
|
|
639
|
+
...date,
|
|
640
|
+
hour: clock.hour,
|
|
641
|
+
minute: clock.minute,
|
|
642
|
+
second: clock.second
|
|
643
|
+
});
|
|
644
|
+
setDraft(absolute(which === "from" ? { from: moment } : { to: moment }));
|
|
645
|
+
setPhase("start");
|
|
646
|
+
};
|
|
647
|
+
const commitTime = (which, text) => {
|
|
648
|
+
const clock = readTime(text);
|
|
649
|
+
const held = which === "from" ? from : to;
|
|
650
|
+
if (!clock || !held) return;
|
|
651
|
+
const moment = formatMoment({ year: held.year, month: held.month, day: held.day, ...clock });
|
|
652
|
+
setDraft(absolute(which === "from" ? { from: moment } : { to: moment }));
|
|
653
|
+
setPhase("start");
|
|
654
|
+
};
|
|
655
|
+
return /* @__PURE__ */ jsxs("div", { className: "crewlet-time-window__absolute", role: "group", "aria-labelledby": heading, children: [
|
|
656
|
+
/* @__PURE__ */ jsxs("div", { className: "crewlet-time-window__absolute-head", children: [
|
|
657
|
+
/* @__PURE__ */ jsx("span", { className: "crewlet-time-window__absolute-title", id: heading, children: labels.absoluteLabel }),
|
|
658
|
+
/* @__PURE__ */ jsx(
|
|
659
|
+
Select,
|
|
660
|
+
{
|
|
661
|
+
size: "sm",
|
|
662
|
+
width: "auto",
|
|
663
|
+
ariaLabel: labels.timezoneLabel,
|
|
664
|
+
className: "crewlet-time-window__tz",
|
|
665
|
+
value: zone,
|
|
666
|
+
onChange: (next) => setDraft({ ...draft, timezone: next }),
|
|
667
|
+
options: [
|
|
668
|
+
{ value: "local", label: labels.localLabel },
|
|
669
|
+
{ value: "utc", label: labels.utcLabel }
|
|
670
|
+
]
|
|
671
|
+
}
|
|
672
|
+
)
|
|
673
|
+
] }),
|
|
674
|
+
/* @__PURE__ */ jsx("div", { className: "crewlet-time-window__calendars", children: [view, right].map((month, at) => /* @__PURE__ */ jsxs("div", { className: "crewlet-time-window__calendar", children: [
|
|
675
|
+
/* @__PURE__ */ jsxs("div", { className: "crewlet-time-window__calendar-head", children: [
|
|
676
|
+
at === 0 ? /* @__PURE__ */ jsx(
|
|
677
|
+
IconButton,
|
|
678
|
+
{
|
|
679
|
+
size: "sm",
|
|
680
|
+
variant: "secondary",
|
|
681
|
+
label: labels.previousMonthLabel,
|
|
682
|
+
icon: /* @__PURE__ */ jsx(ChevronLeftGlyph, {}),
|
|
683
|
+
onClick: () => step(-1)
|
|
684
|
+
}
|
|
685
|
+
) : /* @__PURE__ */ jsx("span", {}),
|
|
686
|
+
/* @__PURE__ */ jsxs("span", { className: "crewlet-time-window__calendar-title", "aria-live": "polite", children: [
|
|
687
|
+
MONTH_NAMES[month.month],
|
|
688
|
+
" ",
|
|
689
|
+
month.year
|
|
690
|
+
] }),
|
|
691
|
+
at === 1 ? /* @__PURE__ */ jsx(
|
|
692
|
+
IconButton,
|
|
693
|
+
{
|
|
694
|
+
size: "sm",
|
|
695
|
+
variant: "secondary",
|
|
696
|
+
label: labels.nextMonthLabel,
|
|
697
|
+
icon: /* @__PURE__ */ jsx(ChevronRightGlyph, {}),
|
|
698
|
+
onClick: () => step(1)
|
|
699
|
+
}
|
|
700
|
+
) : /* @__PURE__ */ jsx("span", {})
|
|
701
|
+
] }),
|
|
702
|
+
/* @__PURE__ */ jsx(
|
|
703
|
+
CalendarGrid,
|
|
704
|
+
{
|
|
705
|
+
label: `${MONTH_NAMES[month.month]} ${month.year}`,
|
|
706
|
+
year: month.year,
|
|
707
|
+
month: month.month,
|
|
708
|
+
focused,
|
|
709
|
+
onFocusedChange: setFocused,
|
|
710
|
+
onMonthChange: (year, monthIndex) => setView({ year, month: monthIndex, day: 1 }),
|
|
711
|
+
onSelect: pick,
|
|
712
|
+
onHover: setHover,
|
|
713
|
+
selected,
|
|
714
|
+
inRange,
|
|
715
|
+
isDisabled: refused,
|
|
716
|
+
firstDayOfWeek,
|
|
717
|
+
showOutsideDays: false
|
|
718
|
+
}
|
|
719
|
+
)
|
|
720
|
+
] }, `${month.year}-${month.month}`)) }),
|
|
721
|
+
/* @__PURE__ */ jsxs("div", { className: "crewlet-time-window__fields", children: [
|
|
722
|
+
/* @__PURE__ */ jsxs("div", { className: "crewlet-time-window__field", children: [
|
|
723
|
+
/* @__PURE__ */ jsx("span", { className: "crewlet-time-window__field-label", children: labels.startLabel }),
|
|
724
|
+
/* @__PURE__ */ jsxs("div", { className: "crewlet-time-window__field-row", children: [
|
|
725
|
+
/* @__PURE__ */ jsx(
|
|
726
|
+
MaskedInput,
|
|
727
|
+
{
|
|
728
|
+
mask: DATE_MASK,
|
|
729
|
+
segments: DATE_SEGMENTS,
|
|
730
|
+
value: from ? dateText(from) : "",
|
|
731
|
+
onCommit: (text) => commitDate("from", text),
|
|
732
|
+
isValid: isRealDate,
|
|
733
|
+
label: labels.startDateLabel
|
|
734
|
+
}
|
|
735
|
+
),
|
|
736
|
+
/* @__PURE__ */ jsx(
|
|
737
|
+
MaskedInput,
|
|
738
|
+
{
|
|
739
|
+
mask: TIME_MASK,
|
|
740
|
+
segments: TIME_SEGMENTS,
|
|
741
|
+
value: from ? timeText(from) : "",
|
|
742
|
+
onCommit: (text) => commitTime("from", text),
|
|
743
|
+
isValid: isRealTime,
|
|
744
|
+
label: labels.startTimeLabel
|
|
745
|
+
}
|
|
746
|
+
)
|
|
747
|
+
] })
|
|
748
|
+
] }),
|
|
749
|
+
/* @__PURE__ */ jsxs("div", { className: "crewlet-time-window__field", children: [
|
|
750
|
+
/* @__PURE__ */ jsx("span", { className: "crewlet-time-window__field-label", children: labels.endLabel }),
|
|
751
|
+
/* @__PURE__ */ jsxs("div", { className: "crewlet-time-window__field-row", children: [
|
|
752
|
+
/* @__PURE__ */ jsx(
|
|
753
|
+
MaskedInput,
|
|
754
|
+
{
|
|
755
|
+
mask: DATE_MASK,
|
|
756
|
+
segments: DATE_SEGMENTS,
|
|
757
|
+
value: to ? dateText(to) : "",
|
|
758
|
+
onCommit: (text) => commitDate("to", text),
|
|
759
|
+
isValid: isRealDate,
|
|
760
|
+
label: labels.endDateLabel
|
|
761
|
+
}
|
|
762
|
+
),
|
|
763
|
+
/* @__PURE__ */ jsx(
|
|
764
|
+
MaskedInput,
|
|
765
|
+
{
|
|
766
|
+
mask: TIME_MASK,
|
|
767
|
+
segments: TIME_SEGMENTS,
|
|
768
|
+
value: to ? timeText(to) : "",
|
|
769
|
+
onCommit: (text) => commitTime("to", text),
|
|
770
|
+
isValid: isRealTime,
|
|
771
|
+
label: labels.endTimeLabel
|
|
772
|
+
}
|
|
773
|
+
)
|
|
774
|
+
] })
|
|
775
|
+
] })
|
|
776
|
+
] })
|
|
777
|
+
] });
|
|
778
|
+
}
|
|
779
|
+
function MaskedInput({ mask, segments, value, onCommit, isValid, label }) {
|
|
780
|
+
const [text, setText] = useState(() => project(mask, value));
|
|
781
|
+
useEffect(() => {
|
|
782
|
+
setText(project(mask, value));
|
|
783
|
+
}, [mask, value]);
|
|
784
|
+
function onKeyDown(event) {
|
|
785
|
+
if (isComposing(event)) return;
|
|
786
|
+
if (event.key === "ArrowUp" || event.key === "ArrowDown") {
|
|
787
|
+
const caret = event.currentTarget.selectionStart ?? text.length;
|
|
788
|
+
const segment = segmentAt(segments, caret);
|
|
789
|
+
if (!segment) return;
|
|
790
|
+
event.preventDefault();
|
|
791
|
+
setText(stepSegment(mask, text, segment, event.key === "ArrowUp" ? 1 : -1));
|
|
792
|
+
return;
|
|
793
|
+
}
|
|
794
|
+
if (event.ctrlKey || event.metaKey || event.altKey || event.key.length !== 1) return;
|
|
795
|
+
if (!/\d/.test(event.key)) event.preventDefault();
|
|
796
|
+
}
|
|
797
|
+
return /* @__PURE__ */ jsxs("span", { className: cx("crewlet-time-window__masked", text === "" && "is-empty"), children: [
|
|
798
|
+
/* @__PURE__ */ jsx(
|
|
799
|
+
"input",
|
|
800
|
+
{
|
|
801
|
+
type: "text",
|
|
802
|
+
inputMode: "numeric",
|
|
803
|
+
className: "crewlet-time-window__masked-input",
|
|
804
|
+
size: Math.max(text.length, 1),
|
|
805
|
+
value: text,
|
|
806
|
+
"aria-label": label,
|
|
807
|
+
"aria-invalid": text !== "" && isComplete(mask, text) && !isValid(text) ? true : void 0,
|
|
808
|
+
onChange: (event) => setText(project(mask, event.target.value)),
|
|
809
|
+
onKeyDown,
|
|
810
|
+
onBlur: () => {
|
|
811
|
+
if (!isComplete(mask, text) || !isValid(text)) {
|
|
812
|
+
setText(project(mask, value));
|
|
813
|
+
return;
|
|
814
|
+
}
|
|
815
|
+
onCommit(text);
|
|
816
|
+
}
|
|
817
|
+
}
|
|
818
|
+
),
|
|
819
|
+
/* @__PURE__ */ jsx("span", { className: "crewlet-time-window__masked-rest", "aria-hidden": "true", children: remainder(mask, text) })
|
|
820
|
+
] });
|
|
821
|
+
}
|
|
822
|
+
|
|
823
|
+
export { DEFAULT_TIME_WINDOW_LABELS, TIME_WINDOW_SPANS, TimeWindowPicker, describeTimeWindow, isTimeWindowSet, parseTimeWindowDuration, resolveTimeWindow, timeWindowMatchesPreset };
|