@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.
Files changed (497) hide show
  1. package/README.md +1714 -14
  2. package/dist/Accordion/Accordion.d.ts +54 -0
  3. package/dist/Accordion/index.d.ts +4 -0
  4. package/dist/Accordion/index.js +6 -0
  5. package/dist/Accordion-ZI2WLD5C.css +87 -0
  6. package/dist/AddPill/AddPill.d.ts +114 -0
  7. package/dist/AddPill/index.d.ts +3 -0
  8. package/dist/AddPill/index.js +3 -0
  9. package/dist/AddPill-DFWXYLIQ.css +434 -0
  10. package/dist/Announcer/Announcer.d.ts +15 -0
  11. package/dist/Announcer/index.d.ts +2 -0
  12. package/dist/Announcer/index.js +3 -0
  13. package/dist/AppShell/AppShell.d.ts +193 -0
  14. package/dist/AppShell/index.d.ts +3 -0
  15. package/dist/AppShell/index.js +6 -0
  16. package/dist/AppShell-NVE6LHNI.css +395 -0
  17. package/dist/Avatar/Avatar.d.ts +104 -0
  18. package/dist/Avatar/index.d.ts +3 -0
  19. package/dist/Avatar/index.js +2 -0
  20. package/dist/Avatar-P2KRQM2B.css +156 -0
  21. package/dist/BrandLockup/BrandLockup.d.ts +41 -0
  22. package/dist/BrandLockup/index.d.ts +3 -0
  23. package/dist/BrandLockup/index.js +2 -0
  24. package/dist/BrandLockup-6ISDEHPJ.css +108 -0
  25. package/dist/Button/Button.d.ts +88 -0
  26. package/dist/Button/index.d.ts +3 -0
  27. package/dist/Button/index.js +3 -0
  28. package/dist/Button-D4J6B4MA.css +302 -0
  29. package/dist/CalendarGrid/CalendarGrid.d.ts +87 -0
  30. package/dist/CalendarGrid/index.d.ts +3 -0
  31. package/dist/CalendarGrid/index.js +2 -0
  32. package/dist/CalendarGrid-V6TQ5QKS.css +128 -0
  33. package/dist/Callout/Callout.d.ts +47 -0
  34. package/dist/Callout/index.d.ts +3 -0
  35. package/dist/Callout/index.js +2 -0
  36. package/dist/Callout-S7QDWHDL.css +111 -0
  37. package/dist/Canvas/Canvas.d.ts +234 -0
  38. package/dist/Canvas/geometry.d.ts +249 -0
  39. package/dist/Canvas/index.d.ts +5 -0
  40. package/dist/Canvas/index.js +8 -0
  41. package/dist/Canvas/layerNode.d.ts +20 -0
  42. package/dist/Canvas-Q6JETCWR.css +315 -0
  43. package/dist/Card/Card.d.ts +142 -0
  44. package/dist/Card/headerSlot.d.ts +65 -0
  45. package/dist/Card/index.d.ts +5 -0
  46. package/dist/Card/index.js +6 -0
  47. package/dist/Card-AHX3Q2JD.css +428 -0
  48. package/dist/Charts/ActivityStrip.d.ts +45 -0
  49. package/dist/Charts/BarList.d.ts +51 -0
  50. package/dist/Charts/Legend.d.ts +32 -0
  51. package/dist/Charts/StackedBar.d.ts +38 -0
  52. package/dist/Charts/TimeSeries.d.ts +92 -0
  53. package/dist/Charts/dataColor.d.ts +20 -0
  54. package/dist/Charts/index.d.ts +12 -0
  55. package/dist/Charts/index.js +3 -0
  56. package/dist/Charts-D7G2BSXH.css +277 -0
  57. package/dist/Checkbox/Checkbox.d.ts +45 -0
  58. package/dist/Checkbox/index.d.ts +3 -0
  59. package/dist/Checkbox/index.js +2 -0
  60. package/dist/Checkbox-VGW26YLQ.css +111 -0
  61. package/dist/CodeBlock/CodeBlock.d.ts +60 -0
  62. package/dist/CodeBlock/index.d.ts +3 -0
  63. package/dist/CodeBlock/index.js +7 -0
  64. package/dist/CodeBlock-U2W6NNVC.css +153 -0
  65. package/dist/Combobox/Combobox.d.ts +89 -0
  66. package/dist/Combobox/index.d.ts +3 -0
  67. package/dist/Combobox/index.js +8 -0
  68. package/dist/Combobox-4FUVYIE7.css +80 -0
  69. package/dist/CommandPalette/CommandPalette.d.ts +77 -0
  70. package/dist/CommandPalette/index.d.ts +3 -0
  71. package/dist/CommandPalette/index.js +11 -0
  72. package/dist/CommandPalette-CSJDUCQA.css +115 -0
  73. package/dist/Container/Container.d.ts +17 -0
  74. package/dist/Container/index.d.ts +3 -0
  75. package/dist/Container/index.js +2 -0
  76. package/dist/Container-3TSKMGNI.css +52 -0
  77. package/dist/Copyable/CopyButton.d.ts +54 -0
  78. package/dist/Copyable/Copyable.d.ts +34 -0
  79. package/dist/Copyable/index.d.ts +5 -0
  80. package/dist/Copyable/index.js +6 -0
  81. package/dist/Copyable-5PNRFOLS.css +125 -0
  82. package/dist/Count/Count.d.ts +24 -0
  83. package/dist/Count/index.d.ts +3 -0
  84. package/dist/Count/index.js +3 -0
  85. package/dist/Count-ZVCJ6VPD.css +20 -0
  86. package/dist/DataTable/CopyableCell.d.ts +12 -0
  87. package/dist/DataTable/DataTable.d.ts +615 -0
  88. package/dist/DataTable/RowActionsMenu.d.ts +7 -0
  89. package/dist/DataTable/index.d.ts +7 -0
  90. package/dist/DataTable/index.js +14 -0
  91. package/dist/DataTable-ITNACQ2X.css +2020 -0
  92. package/dist/DataView/DataView.d.ts +109 -0
  93. package/dist/DataView/DataViewToolbar.d.ts +87 -0
  94. package/dist/DataView/FilterAxisBar.d.ts +103 -0
  95. package/dist/DataView/columns.d.ts +35 -0
  96. package/dist/DataView/filters.d.ts +184 -0
  97. package/dist/DataView/index.d.ts +11 -0
  98. package/dist/DataView/index.js +25 -0
  99. package/dist/DataView-256YF32J.css +441 -0
  100. package/dist/DateTimePicker/DateTimePicker.d.ts +91 -0
  101. package/dist/DateTimePicker/index.d.ts +3 -0
  102. package/dist/DateTimePicker/index.js +9 -0
  103. package/dist/DateTimePicker-22VNXRWC.css +199 -0
  104. package/dist/DescriptionList/DescriptionList.d.ts +36 -0
  105. package/dist/DescriptionList/index.d.ts +3 -0
  106. package/dist/DescriptionList/index.js +2 -0
  107. package/dist/DescriptionList-YYY3V3O6.css +59 -0
  108. package/dist/DiffList/DiffList.d.ts +47 -0
  109. package/dist/DiffList/index.d.ts +3 -0
  110. package/dist/DiffList/index.js +3 -0
  111. package/dist/DiffList-3EX64AAE.css +94 -0
  112. package/dist/Disclosure/Disclosure.d.ts +56 -0
  113. package/dist/Disclosure/anatomy.d.ts +43 -0
  114. package/dist/Disclosure/index.d.ts +5 -0
  115. package/dist/Disclosure/index.js +6 -0
  116. package/dist/Disclosure-VKBJJIZ7.css +176 -0
  117. package/dist/EmptyState/EmptyState.d.ts +39 -0
  118. package/dist/EmptyState/index.d.ts +3 -0
  119. package/dist/EmptyState/index.js +3 -0
  120. package/dist/EmptyState-C6HRBGT7.css +73 -0
  121. package/dist/EmptyValue/EmptyValue.d.ts +31 -0
  122. package/dist/EmptyValue/index.d.ts +3 -0
  123. package/dist/EmptyValue/index.js +3 -0
  124. package/dist/EmptyValue-4B6ODXHT.css +12 -0
  125. package/dist/EntityChip/EntityChip.d.ts +40 -0
  126. package/dist/EntityChip/index.d.ts +3 -0
  127. package/dist/EntityChip/index.js +3 -0
  128. package/dist/EntityChip-LUCPZBBG.css +64 -0
  129. package/dist/ErrorBoundary/ErrorBoundary.d.ts +58 -0
  130. package/dist/ErrorBoundary/index.d.ts +3 -0
  131. package/dist/ErrorBoundary/index.js +4 -0
  132. package/dist/ErrorBoundary-ME36CQTA.css +59 -0
  133. package/dist/Eyebrow/Eyebrow.d.ts +18 -0
  134. package/dist/Eyebrow/index.d.ts +3 -0
  135. package/dist/Eyebrow/index.js +2 -0
  136. package/dist/Eyebrow-5NREGHQH.css +46 -0
  137. package/dist/FilterChip/FilterChip.d.ts +68 -0
  138. package/dist/FilterChip/index.d.ts +3 -0
  139. package/dist/FilterChip/index.js +3 -0
  140. package/dist/FilterChip-GTGLLOXE.css +107 -0
  141. package/dist/Fullscreen/index.d.ts +2 -0
  142. package/dist/Fullscreen/index.js +1 -0
  143. package/dist/Fullscreen/useFullscreen.d.ts +32 -0
  144. package/dist/IconButton/IconButton.d.ts +45 -0
  145. package/dist/IconButton/index.d.ts +3 -0
  146. package/dist/IconButton/index.js +3 -0
  147. package/dist/IconButton-VQGNMJDI.css +158 -0
  148. package/dist/ImageUpload/ImageUpload.d.ts +37 -0
  149. package/dist/ImageUpload/index.d.ts +3 -0
  150. package/dist/ImageUpload/index.js +3 -0
  151. package/dist/ImageUpload-HKFIZR6D.css +193 -0
  152. package/dist/InlineCode/InlineCode.d.ts +37 -0
  153. package/dist/InlineCode/index.d.ts +3 -0
  154. package/dist/InlineCode/index.js +2 -0
  155. package/dist/InlineCode-6WSR5COL.css +65 -0
  156. package/dist/Input/FormField.d.ts +61 -0
  157. package/dist/Input/FormRow.d.ts +6 -0
  158. package/dist/Input/FormSection.d.ts +28 -0
  159. package/dist/Input/Input.d.ts +98 -0
  160. package/dist/Input/Label.d.ts +31 -0
  161. package/dist/Input/ReadOnlyField.d.ts +30 -0
  162. package/dist/Input/Textarea.d.ts +16 -0
  163. package/dist/Input/index.d.ts +15 -0
  164. package/dist/Input/index.js +5 -0
  165. package/dist/Input-2PU5CPKK.css +616 -0
  166. package/dist/Kbd/Kbd.d.ts +40 -0
  167. package/dist/Kbd/index.d.ts +3 -0
  168. package/dist/Kbd/index.js +3 -0
  169. package/dist/Kbd-W66MXQI5.css +61 -0
  170. package/dist/Layer/LayerHost.d.ts +23 -0
  171. package/dist/Layer/index.d.ts +7 -0
  172. package/dist/Layer/index.js +3 -0
  173. package/dist/Layer/place.d.ts +63 -0
  174. package/dist/Layer/stack.d.ts +159 -0
  175. package/dist/Layer-NAFSGCFA.css +23 -0
  176. package/dist/Layout/Layout.d.ts +104 -0
  177. package/dist/Layout/index.d.ts +3 -0
  178. package/dist/Layout/index.js +2 -0
  179. package/dist/Layout-2ZCV3IGF.css +171 -0
  180. package/dist/Link/Link.d.ts +45 -0
  181. package/dist/Link/index.d.ts +3 -0
  182. package/dist/Link/index.js +3 -0
  183. package/dist/Link-6BEFNMN2.css +80 -0
  184. package/dist/List/List.d.ts +73 -0
  185. package/dist/List/index.d.ts +3 -0
  186. package/dist/List/index.js +3 -0
  187. package/dist/List-XTHESXLR.css +161 -0
  188. package/dist/ListInput/ListInput.d.ts +68 -0
  189. package/dist/ListInput/index.d.ts +3 -0
  190. package/dist/ListInput/index.js +10 -0
  191. package/dist/ListInput-O7LJKOIG.css +147 -0
  192. package/dist/Listbox/index.d.ts +5 -0
  193. package/dist/Listbox/index.js +2 -0
  194. package/dist/Listbox/useListbox.d.ts +97 -0
  195. package/dist/Listbox/useOptionKeys.d.ts +64 -0
  196. package/dist/Listbox-X2DOTSQA.css +110 -0
  197. package/dist/Menu/Menu.d.ts +118 -0
  198. package/dist/Menu/index.d.ts +3 -0
  199. package/dist/Menu/index.js +7 -0
  200. package/dist/Menu-6DE7I66I.css +222 -0
  201. package/dist/Meter/Meter.d.ts +49 -0
  202. package/dist/Meter/index.d.ts +3 -0
  203. package/dist/Meter/index.js +3 -0
  204. package/dist/Meter-SKOOXQBC.css +87 -0
  205. package/dist/Modal/ConfirmModal.d.ts +74 -0
  206. package/dist/Modal/Modal.d.ts +154 -0
  207. package/dist/Modal/index.d.ts +5 -0
  208. package/dist/Modal/index.js +8 -0
  209. package/dist/Modal-XYQJ4BL6.css +484 -0
  210. package/dist/NewItemsNotice/NewItemsNotice.d.ts +28 -0
  211. package/dist/NewItemsNotice/index.d.ts +3 -0
  212. package/dist/NewItemsNotice/index.js +4 -0
  213. package/dist/NewItemsNotice-T4DSSPVV.css +60 -0
  214. package/dist/OrgLabel/OrgLabel.d.ts +117 -0
  215. package/dist/OrgLabel/index.d.ts +3 -0
  216. package/dist/OrgLabel/index.js +2 -0
  217. package/dist/OrgLabel-D7U6QJZD.css +293 -0
  218. package/dist/OrgNode/OrgNode.d.ts +103 -0
  219. package/dist/OrgNode/index.d.ts +3 -0
  220. package/dist/OrgNode/index.js +3 -0
  221. package/dist/OrgNode-BT7T2Q2X.css +214 -0
  222. package/dist/OrgTable/OrgTable.d.ts +113 -0
  223. package/dist/OrgTable/index.d.ts +3 -0
  224. package/dist/OrgTable/index.js +11 -0
  225. package/dist/OrgTable-VWMFC3TB.css +360 -0
  226. package/dist/PageHeader/PageHeader.d.ts +35 -0
  227. package/dist/PageHeader/index.d.ts +3 -0
  228. package/dist/PageHeader/index.js +3 -0
  229. package/dist/PageHeader-6EYWQXRE.css +88 -0
  230. package/dist/Popover/Popover.d.ts +91 -0
  231. package/dist/Popover/index.d.ts +3 -0
  232. package/dist/Popover/index.js +4 -0
  233. package/dist/Popover-WJGCF3ZQ.css +185 -0
  234. package/dist/PricingCard/PricingCard.d.ts +56 -0
  235. package/dist/PricingCard/index.d.ts +3 -0
  236. package/dist/PricingCard/index.js +4 -0
  237. package/dist/PricingCard-JFI7RYXP.css +278 -0
  238. package/dist/Prose/Prose.d.ts +33 -0
  239. package/dist/Prose/index.d.ts +3 -0
  240. package/dist/Prose/index.js +2 -0
  241. package/dist/Prose-BTXNFT2Q.css +99 -0
  242. package/dist/RelativeTime/RelativeTime.d.ts +31 -0
  243. package/dist/RelativeTime/clock.d.ts +9 -0
  244. package/dist/RelativeTime/format.d.ts +38 -0
  245. package/dist/RelativeTime/index.d.ts +6 -0
  246. package/dist/RelativeTime/index.js +4 -0
  247. package/dist/RelativeTime-EBAQPGO2.css +10 -0
  248. package/dist/SearchTrigger/SearchTrigger.d.ts +29 -0
  249. package/dist/SearchTrigger/index.d.ts +3 -0
  250. package/dist/SearchTrigger/index.js +2 -0
  251. package/dist/SearchTrigger-QXOYAUUY.css +79 -0
  252. package/dist/Section/Section.d.ts +41 -0
  253. package/dist/Section/index.d.ts +3 -0
  254. package/dist/Section/index.js +3 -0
  255. package/dist/Section-QRUPRIQ2.css +127 -0
  256. package/dist/SegmentedControl/SegmentedControl.d.ts +68 -0
  257. package/dist/SegmentedControl/index.d.ts +4 -0
  258. package/dist/SegmentedControl/index.js +5 -0
  259. package/dist/SegmentedControl-X3BI3XU4.css +68 -0
  260. package/dist/Select/Select.d.ts +138 -0
  261. package/dist/Select/index.d.ts +3 -0
  262. package/dist/Select/index.js +5 -0
  263. package/dist/Select-2X77FSWR.css +350 -0
  264. package/dist/Shortcut/index.d.ts +2 -0
  265. package/dist/Shortcut/index.js +4 -0
  266. package/dist/Shortcut/useShortcut.d.ts +68 -0
  267. package/dist/SidebarNav/SidebarNav.d.ts +117 -0
  268. package/dist/SidebarNav/index.d.ts +3 -0
  269. package/dist/SidebarNav/index.js +3 -0
  270. package/dist/SidebarNav-QGSFKZYA.css +319 -0
  271. package/dist/Skeleton/Skeleton.d.ts +50 -0
  272. package/dist/Skeleton/index.d.ts +3 -0
  273. package/dist/Skeleton/index.js +3 -0
  274. package/dist/Skeleton-V735HRGM.css +421 -0
  275. package/dist/StatCard/StatCard.d.ts +56 -0
  276. package/dist/StatCard/index.d.ts +3 -0
  277. package/dist/StatCard/index.js +3 -0
  278. package/dist/StatCard-KYPKZUWX.css +111 -0
  279. package/dist/StatGroup/StatGroup.d.ts +20 -0
  280. package/dist/StatGroup/index.d.ts +3 -0
  281. package/dist/StatGroup/index.js +2 -0
  282. package/dist/StatGroup-TGB6AEKM.css +80 -0
  283. package/dist/StatusDot/StatusDot.d.ts +25 -0
  284. package/dist/StatusDot/index.d.ts +3 -0
  285. package/dist/StatusDot/index.js +2 -0
  286. package/dist/StatusDot-HA2L2FSX.css +84 -0
  287. package/dist/Switch/Switch.d.ts +38 -0
  288. package/dist/Switch/index.d.ts +3 -0
  289. package/dist/Switch/index.js +2 -0
  290. package/dist/Switch-U4OWK4CL.css +169 -0
  291. package/dist/Table/Table.d.ts +51 -0
  292. package/dist/Table/index.d.ts +3 -0
  293. package/dist/Table/index.js +3 -0
  294. package/dist/Table-MDOLVUAW.css +159 -0
  295. package/dist/Tabs/Tabs.d.ts +97 -0
  296. package/dist/Tabs/index.d.ts +3 -0
  297. package/dist/Tabs/index.js +4 -0
  298. package/dist/Tabs/roving.d.ts +36 -0
  299. package/dist/Tabs-VLICJFVB.css +275 -0
  300. package/dist/Tag/Tag.d.ts +107 -0
  301. package/dist/Tag/index.d.ts +3 -0
  302. package/dist/Tag/index.js +3 -0
  303. package/dist/Tag-VNZEYLB6.css +406 -0
  304. package/dist/TagGroup/TagGroup.d.ts +41 -0
  305. package/dist/TagGroup/index.d.ts +3 -0
  306. package/dist/TagGroup/index.js +4 -0
  307. package/dist/TagGroup-APC2EFH4.css +75 -0
  308. package/dist/TagsInput/TagsInput.d.ts +112 -0
  309. package/dist/TagsInput/index.d.ts +3 -0
  310. package/dist/TagsInput/index.js +10 -0
  311. package/dist/TagsInput-W4P36PRJ.css +168 -0
  312. package/dist/Text/Text.d.ts +67 -0
  313. package/dist/Text/index.d.ts +3 -0
  314. package/dist/Text/index.js +2 -0
  315. package/dist/Text-XIPYYZX2.css +154 -0
  316. package/dist/ThemeSwitcher/ThemeSwitcher.d.ts +47 -0
  317. package/dist/ThemeSwitcher/index.d.ts +4 -0
  318. package/dist/ThemeSwitcher/index.js +6 -0
  319. package/dist/ThemeSwitcher/preferences.d.ts +51 -0
  320. package/dist/TimeWindowPicker/TimeWindowPicker.d.ts +231 -0
  321. package/dist/TimeWindowPicker/index.d.ts +3 -0
  322. package/dist/TimeWindowPicker/index.js +13 -0
  323. package/dist/TimeWindowPicker/mask.d.ts +82 -0
  324. package/dist/TimeWindowPicker-7I7KWCMU.css +403 -0
  325. package/dist/Timeline/Timeline.d.ts +51 -0
  326. package/dist/Timeline/index.d.ts +3 -0
  327. package/dist/Timeline/index.js +3 -0
  328. package/dist/Timeline-27SYKOFX.css +144 -0
  329. package/dist/Toaster/Toaster.d.ts +108 -0
  330. package/dist/Toaster/index.d.ts +3 -0
  331. package/dist/Toaster/index.js +5 -0
  332. package/dist/Toaster-NVDCEIP5.css +306 -0
  333. package/dist/Toolbar/Toolbar.d.ts +62 -0
  334. package/dist/Toolbar/index.d.ts +3 -0
  335. package/dist/Toolbar/index.js +4 -0
  336. package/dist/Toolbar-IP6LXN45.css +48 -0
  337. package/dist/Tooltip/Tooltip.d.ts +51 -0
  338. package/dist/Tooltip/index.d.ts +3 -0
  339. package/dist/Tooltip/index.js +4 -0
  340. package/dist/Tooltip-LKQF7CE4.css +71 -0
  341. package/dist/Tree/index.d.ts +8 -0
  342. package/dist/Tree/index.js +1 -0
  343. package/dist/Tree/layout.d.ts +160 -0
  344. package/dist/Tree/model.d.ts +110 -0
  345. package/dist/Tree/useMeasuredSizes.d.ts +61 -0
  346. package/dist/Tree/useTreeState.d.ts +89 -0
  347. package/dist/TreeCanvas/TreeCanvas.d.ts +384 -0
  348. package/dist/TreeCanvas/index.d.ts +3 -0
  349. package/dist/TreeCanvas/index.js +10 -0
  350. package/dist/TreeCanvas/motion.d.ts +59 -0
  351. package/dist/TreeCanvas-WBNQPHC7.css +1098 -0
  352. package/dist/TreeGrid/TreeGrid.d.ts +142 -0
  353. package/dist/TreeGrid/index.d.ts +3 -0
  354. package/dist/TreeGrid/index.js +8 -0
  355. package/dist/TreeGrid-NSW7VMOX.css +132 -0
  356. package/dist/VisuallyHidden/VisuallyHidden.d.ts +23 -0
  357. package/dist/VisuallyHidden/index.d.ts +3 -0
  358. package/dist/VisuallyHidden/index.js +2 -0
  359. package/dist/VisuallyHidden-L552H7OA.css +21 -0
  360. package/dist/chunk-22O7LAW2.js +41 -0
  361. package/dist/chunk-23DHIMJA.js +38 -0
  362. package/dist/chunk-2EOKFKHX.js +263 -0
  363. package/dist/chunk-2PRH365R.js +74 -0
  364. package/dist/chunk-2ZQMA2WB.js +57 -0
  365. package/dist/chunk-3CZ7XAVY.js +139 -0
  366. package/dist/chunk-3EYF6HKB.js +135 -0
  367. package/dist/chunk-3ZP55QZE.js +40 -0
  368. package/dist/chunk-53DVJCVW.js +14 -0
  369. package/dist/chunk-5C5YMZQU.js +51 -0
  370. package/dist/chunk-5EKIWVOR.js +132 -0
  371. package/dist/chunk-5IMACPJS.js +495 -0
  372. package/dist/chunk-5KPQ6D7N.js +54 -0
  373. package/dist/chunk-5SDBMKUO.js +297 -0
  374. package/dist/chunk-5WS6L6FA.js +114 -0
  375. package/dist/chunk-7EM5T4ME.js +39 -0
  376. package/dist/chunk-7FZ53WDJ.js +163 -0
  377. package/dist/chunk-7HPRF5XN.js +525 -0
  378. package/dist/chunk-7RPGY3JE.js +43 -0
  379. package/dist/chunk-A2UXBCLO.js +48 -0
  380. package/dist/chunk-ARMRX2YV.js +96 -0
  381. package/dist/chunk-AV2DXAEL.js +27 -0
  382. package/dist/chunk-BHHIIK3M.js +17 -0
  383. package/dist/chunk-BZFWDIV6.js +9 -0
  384. package/dist/chunk-BZYDZBAN.js +123 -0
  385. package/dist/chunk-CMEE37QJ.js +628 -0
  386. package/dist/chunk-D3OADIM6.js +112 -0
  387. package/dist/chunk-DD5BBGBE.js +162 -0
  388. package/dist/chunk-EHMQQHYR.js +1652 -0
  389. package/dist/chunk-EN6K2IFA.js +256 -0
  390. package/dist/chunk-EPOOQZYA.js +118 -0
  391. package/dist/chunk-ESCO4XYW.js +144 -0
  392. package/dist/chunk-EUCC37WY.js +14 -0
  393. package/dist/chunk-EV6IMYJ6.js +62 -0
  394. package/dist/chunk-F27EPQ7D.js +68 -0
  395. package/dist/chunk-F4PJZ4ED.js +245 -0
  396. package/dist/chunk-F6OE5FH3.js +49 -0
  397. package/dist/chunk-FBZAKNSX.js +263 -0
  398. package/dist/chunk-FEFTGVMF.js +46 -0
  399. package/dist/chunk-G2QFRTJ2.js +823 -0
  400. package/dist/chunk-GHYY2WPF.js +907 -0
  401. package/dist/chunk-GTOUGQQK.js +147 -0
  402. package/dist/chunk-GUIF6Q6N.js +143 -0
  403. package/dist/chunk-GXQ3B46I.js +216 -0
  404. package/dist/chunk-H4FBTAYS.js +130 -0
  405. package/dist/chunk-HOXGBLEY.js +37 -0
  406. package/dist/chunk-HQNHV7D6.js +54 -0
  407. package/dist/chunk-HTDFCRJZ.js +92 -0
  408. package/dist/chunk-HZ5XZNPS.js +98 -0
  409. package/dist/chunk-IAJLHVUA.js +28 -0
  410. package/dist/chunk-IJ7QXNIJ.js +1 -0
  411. package/dist/chunk-ITHXJHBB.js +280 -0
  412. package/dist/chunk-JCSA3XVH.js +32 -0
  413. package/dist/chunk-KLJCCMF3.js +97 -0
  414. package/dist/chunk-LGCPQIOZ.js +49 -0
  415. package/dist/chunk-LWKJQTOM.js +77 -0
  416. package/dist/chunk-MNAXYY3R.js +215 -0
  417. package/dist/chunk-NN62JQLR.js +29 -0
  418. package/dist/chunk-NPZY6YYL.js +251 -0
  419. package/dist/chunk-NTRZGNEX.js +529 -0
  420. package/dist/chunk-O6232G37.js +273 -0
  421. package/dist/chunk-O67VF5MS.js +58 -0
  422. package/dist/chunk-ODEQTPFM.js +6 -0
  423. package/dist/chunk-PNFASD6F.js +98 -0
  424. package/dist/chunk-PQADV6P6.js +19 -0
  425. package/dist/chunk-PZSWF74H.js +15 -0
  426. package/dist/chunk-Q4ZPPART.js +26 -0
  427. package/dist/chunk-QNCVHRZL.js +17 -0
  428. package/dist/chunk-QVE4GJAT.js +15 -0
  429. package/dist/chunk-QYOFACSP.js +36 -0
  430. package/dist/chunk-RA2ULG6H.js +29 -0
  431. package/dist/chunk-RDGD7Z7I.js +350 -0
  432. package/dist/chunk-RK4XPHVG.js +16 -0
  433. package/dist/chunk-RSAQOKH3.js +38 -0
  434. package/dist/chunk-S2XHHEW4.js +84 -0
  435. package/dist/chunk-S4GZWSKR.js +137 -0
  436. package/dist/chunk-SFZOKW2G.js +52 -0
  437. package/dist/chunk-T7FKOJKW.js +221 -0
  438. package/dist/chunk-UG46QBLT.js +325 -0
  439. package/dist/chunk-UOGSZKLT.js +134 -0
  440. package/dist/chunk-V2XMNLMS.js +52 -0
  441. package/dist/chunk-V663QU4R.js +51 -0
  442. package/dist/chunk-W4ENKCXJ.js +40 -0
  443. package/dist/chunk-W5J7R5EB.js +107 -0
  444. package/dist/chunk-WNI2WSJF.js +27 -0
  445. package/dist/chunk-XDTYBF2F.js +36 -0
  446. package/dist/chunk-XN4JBAN3.js +32 -0
  447. package/dist/chunk-XV6WRMBC.js +211 -0
  448. package/dist/chunk-YLYOWZ4V.js +33 -0
  449. package/dist/chunk-YMWONFSI.js +170 -0
  450. package/dist/chunk-ZCR6YGQ4.js +1 -0
  451. package/dist/generated/index.d.ts +83 -0
  452. package/dist/generated/index.js +91 -0
  453. package/dist/index.d.ts +1 -1217
  454. package/dist/index.js +91 -4518
  455. package/dist/styles.css +14841 -4274
  456. package/dist/utils/cx.d.ts +10 -0
  457. package/dist/utils/headingLevel.d.ts +16 -0
  458. package/dist/utils/index.d.ts +6 -0
  459. package/dist/utils/index.js +4 -0
  460. package/dist/utils/tone.d.ts +25 -0
  461. package/dist/utils/useClipboard.d.ts +30 -0
  462. package/package.json +18 -10
  463. package/scripts/bundle-css.mjs +25 -0
  464. package/scripts/check-css-literals.mjs +166 -0
  465. package/scripts/check-css-variables.mjs +184 -0
  466. package/scripts/check-css.mjs +27 -0
  467. package/scripts/css-source.mjs +67 -0
  468. package/scripts/write-barrel.mjs +60 -0
  469. package/dist/Accordion-NIMJQIOI.css +0 -88
  470. package/dist/AppShell-ZW3NSFBP.css +0 -51
  471. package/dist/Avatar-V6NG6Q45.css +0 -67
  472. package/dist/Button-XGCTXXYP.css +0 -174
  473. package/dist/Callout-LEGDIMAM.css +0 -52
  474. package/dist/Card-BOZGBML7.css +0 -86
  475. package/dist/Checkbox-OCUICIIZ.css +0 -58
  476. package/dist/CodeBlock-IEMBNIQC.css +0 -90
  477. package/dist/Container-LTKBA2FW.css +0 -21
  478. package/dist/Copyable-IB57OTHZ.css +0 -123
  479. package/dist/DataTable-3GALZUW2.css +0 -1593
  480. package/dist/DateTimePicker-NMSSGVPK.css +0 -312
  481. package/dist/Eyebrow-AVBORAS2.css +0 -30
  482. package/dist/IconButton-GB4PJDG2.css +0 -82
  483. package/dist/ImageUpload-3HQDF2KC.css +0 -158
  484. package/dist/Input-ZHUTN7CU.css +0 -210
  485. package/dist/Kbd-Q77CDZY7.css +0 -23
  486. package/dist/Modal-FJVG66S4.css +0 -138
  487. package/dist/Popover-FUFULUE2.css +0 -123
  488. package/dist/PricingCard-NKYV3JHA.css +0 -238
  489. package/dist/Section-665ZIPG6.css +0 -20
  490. package/dist/Select-GPRF7PRB.css +0 -294
  491. package/dist/Skeleton-3WEFLRDN.css +0 -378
  492. package/dist/StatCard-RTJIVTRB.css +0 -50
  493. package/dist/Table-AR3TRY2E.css +0 -89
  494. package/dist/Tabs-XZ4JIH3E.css +0 -153
  495. package/dist/Tag-R5QDJLYJ.css +0 -163
  496. package/dist/TimeWindowPicker-L3G5Q7UT.css +0 -629
  497. package/dist/Toaster-2O65VOR4.css +0 -264
@@ -0,0 +1,823 @@
1
+ import { Select } from './chunk-5IMACPJS.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 };