@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,907 @@
1
+ import { Toolbar } from './chunk-5EKIWVOR.js';
2
+ import { PageHeader } from './chunk-HOXGBLEY.js';
3
+ import { RelativeTime } from './chunk-3CZ7XAVY.js';
4
+ import { Kbd } from './chunk-SFZOKW2G.js';
5
+ import { DataTable } from './chunk-EHMQQHYR.js';
6
+ import { Menu } from './chunk-FBZAKNSX.js';
7
+ import { DateTimePicker } from './chunk-UG46QBLT.js';
8
+ import { Popover } from './chunk-DD5BBGBE.js';
9
+ import { useListbox, useOptionKeys } from './chunk-GTOUGQQK.js';
10
+ import { Input } from './chunk-O6232G37.js';
11
+ import { Count } from './chunk-BHHIIK3M.js';
12
+ import { IconButton } from './chunk-F27EPQ7D.js';
13
+ import { Button } from './chunk-BZYDZBAN.js';
14
+ import { VisuallyHidden } from './chunk-BZFWDIV6.js';
15
+ import { cx } from './chunk-ODEQTPFM.js';
16
+ import './DataView-256YF32J.css';
17
+ import { useMemo, useState, useEffect, useCallback, useRef, useId } from 'react';
18
+ import { SearchGlyph, KeyboardArrowDownGlyph, TuneGlyph, ArrowUpwardGlyph, ArrowDownwardGlyph, CloseGlyph, SwapVertGlyph, VisibilityGlyph, VisibilityOffGlyph, TagGlyph, ScheduleGlyph, ListGlyph, CheckGlyph } from '@crewlethq/icons/glyphs';
19
+ import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
20
+
21
+ var DATA_VIEW_TOOLBAR_LABELS = {
22
+ toolbar: "Filters",
23
+ search: "Search",
24
+ searchPlaceholder: "Search",
25
+ clearSearch: "Clear search",
26
+ filter: "Filter",
27
+ addFilter: "Add filter",
28
+ sort: "Sort",
29
+ sortedBy: (column) => `Sort: ${column}`,
30
+ sortPanel: "Sort",
31
+ ascending: (column) => `Sort ${column} ascending`,
32
+ descending: (column) => `Sort ${column} descending`,
33
+ ascendingWord: "ascending",
34
+ descendingWord: "descending",
35
+ clearSort: "Clear sort",
36
+ showArchived: (archivedLabel) => `Show ${archivedLabel}`,
37
+ archivedCount: (archivedLabel) => `${archivedLabel} rows`
38
+ };
39
+ function glyphForKind(def) {
40
+ switch (def.kind) {
41
+ case "select":
42
+ return /* @__PURE__ */ jsx(ListGlyph, { size: "sm" });
43
+ case "datetime":
44
+ return /* @__PURE__ */ jsx(ScheduleGlyph, { size: "sm" });
45
+ case "number":
46
+ return /* @__PURE__ */ jsx(TagGlyph, { size: "sm" });
47
+ default:
48
+ return /* @__PURE__ */ jsx(SearchGlyph, { size: "sm" });
49
+ }
50
+ }
51
+ function DataViewToolbar({
52
+ filters,
53
+ values,
54
+ onValuesChange,
55
+ displayed = [],
56
+ onAddFilter,
57
+ onSubmit,
58
+ columns = [],
59
+ sort = null,
60
+ onSortChange,
61
+ onShowArchivedChange,
62
+ showArchived = false,
63
+ archivedLabel = "archived",
64
+ archivedCount = 0,
65
+ actions,
66
+ sticky = false,
67
+ labels: overrides,
68
+ className
69
+ }) {
70
+ const labels = overrides ? { ...DATA_VIEW_TOOLBAR_LABELS, ...overrides } : DATA_VIEW_TOOLBAR_LABELS;
71
+ const searchDef = useMemo(
72
+ () => filters.find((def) => def.role === "search") ?? filters.find((def) => (def.kind ?? "text") === "text"),
73
+ [filters]
74
+ );
75
+ const addable = useMemo(
76
+ () => filters.filter((def) => def !== searchDef && !displayed.includes(def.name)),
77
+ [filters, searchDef, displayed]
78
+ );
79
+ const sortable = useMemo(() => columns.filter((column) => column.sortable), [columns]);
80
+ const sortedColumn = sort ? sortable.find((column) => column.key === sort.key) : void 0;
81
+ const sortedName = sortedColumn ? headerText(sortedColumn) : sort?.key;
82
+ const setSearch = (next) => {
83
+ if (!searchDef) return;
84
+ onValuesChange({ ...values, [searchDef.name]: next });
85
+ };
86
+ const onSearchKeyDown = (event) => {
87
+ if (event.key !== "Enter" || !searchDef || searchDef.submitOnEnter === false) return;
88
+ event.preventDefault();
89
+ onSubmit?.();
90
+ };
91
+ const filterItems = addable.map((def) => ({
92
+ key: def.name,
93
+ label: def.label,
94
+ icon: glyphForKind(def),
95
+ onSelect: () => onAddFilter?.(def.name)
96
+ }));
97
+ return /* @__PURE__ */ jsxs(Toolbar, { label: labels.toolbar, mode: "group", sticky, className: cx("crewlet-data-view-toolbar", className), children: [
98
+ searchDef ? /* @__PURE__ */ jsx(
99
+ Input,
100
+ {
101
+ type: "search",
102
+ inputSize: "sm",
103
+ containerClassName: "crewlet-data-view-toolbar__search",
104
+ leading: /* @__PURE__ */ jsx(SearchGlyph, { size: "sm" }),
105
+ "aria-label": searchDef.label || labels.search,
106
+ placeholder: searchDef.placeholder ?? labels.searchPlaceholder,
107
+ value: values[searchDef.name] === void 0 || values[searchDef.name] === null ? "" : String(values[searchDef.name]),
108
+ onChange: (event) => setSearch(event.target.value),
109
+ onKeyDown: onSearchKeyDown,
110
+ clearLabel: labels.clearSearch,
111
+ onClear: () => {
112
+ setSearch("");
113
+ onSubmit?.();
114
+ }
115
+ }
116
+ ) : null,
117
+ filterItems.length > 0 && onAddFilter ? /* @__PURE__ */ jsx(
118
+ Menu,
119
+ {
120
+ label: labels.addFilter,
121
+ items: filterItems,
122
+ icon: /* @__PURE__ */ jsx(TuneGlyph, { size: "sm" }),
123
+ triggerVariant: "secondary",
124
+ trigger: /* @__PURE__ */ jsxs("span", { className: "crewlet-data-view-toolbar__menu-label", children: [
125
+ labels.filter,
126
+ /* @__PURE__ */ jsx(KeyboardArrowDownGlyph, { size: "xs" })
127
+ ] })
128
+ }
129
+ ) : null,
130
+ sortable.length > 0 && onSortChange ? /* @__PURE__ */ jsx(
131
+ Popover,
132
+ {
133
+ align: "start",
134
+ role: "dialog",
135
+ label: labels.sortPanel,
136
+ className: "crewlet-data-view-toolbar__sort-panel",
137
+ trigger: (_open, toggle) => /* @__PURE__ */ jsx(
138
+ Button,
139
+ {
140
+ variant: "secondary",
141
+ size: "small",
142
+ pressed: sort !== null,
143
+ leadingIcon: /* @__PURE__ */ jsx(SwapVertGlyph, { size: "sm" }),
144
+ onClick: toggle,
145
+ children: /* @__PURE__ */ jsx("span", { className: "crewlet-data-view-toolbar__menu-label", children: sort && sortedName ? /* @__PURE__ */ jsxs(Fragment, { children: [
146
+ labels.sortedBy(String(sortedName)),
147
+ sort.direction === "asc" ? /* @__PURE__ */ jsx(ArrowUpwardGlyph, { size: "xs" }) : /* @__PURE__ */ jsx(ArrowDownwardGlyph, { size: "xs" }),
148
+ /* @__PURE__ */ jsx(VisuallyHidden, { children: sort.direction === "asc" ? labels.ascendingWord : labels.descendingWord })
149
+ ] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
150
+ labels.sort,
151
+ /* @__PURE__ */ jsx(KeyboardArrowDownGlyph, { size: "xs" })
152
+ ] }) })
153
+ }
154
+ ),
155
+ children: (close) => /* @__PURE__ */ jsxs("div", { className: "crewlet-data-view-toolbar__sort", children: [
156
+ /* @__PURE__ */ jsx("ul", { className: "crewlet-data-view-toolbar__sort-list", children: sortable.map((column) => {
157
+ const name = headerText(column);
158
+ const isAscending = sort?.key === column.key && sort.direction === "asc";
159
+ const isDescending = sort?.key === column.key && sort.direction === "desc";
160
+ return /* @__PURE__ */ jsxs("li", { className: "crewlet-data-view-toolbar__sort-row", children: [
161
+ /* @__PURE__ */ jsx("span", { className: "crewlet-data-view-toolbar__sort-label", children: column.header }),
162
+ /* @__PURE__ */ jsxs("span", { className: "crewlet-data-view-toolbar__sort-buttons", children: [
163
+ /* @__PURE__ */ jsx(
164
+ IconButton,
165
+ {
166
+ size: "sm",
167
+ variant: "ghost",
168
+ pressed: isAscending,
169
+ label: labels.ascending(name),
170
+ icon: /* @__PURE__ */ jsx(ArrowUpwardGlyph, { size: "xs" }),
171
+ onClick: () => {
172
+ onSortChange({ key: column.key, direction: "asc" });
173
+ close();
174
+ }
175
+ }
176
+ ),
177
+ /* @__PURE__ */ jsx(
178
+ IconButton,
179
+ {
180
+ size: "sm",
181
+ variant: "ghost",
182
+ pressed: isDescending,
183
+ label: labels.descending(name),
184
+ icon: /* @__PURE__ */ jsx(ArrowDownwardGlyph, { size: "xs" }),
185
+ onClick: () => {
186
+ onSortChange({ key: column.key, direction: "desc" });
187
+ close();
188
+ }
189
+ }
190
+ )
191
+ ] })
192
+ ] }, column.key);
193
+ }) }),
194
+ sort ? /* @__PURE__ */ jsx("div", { className: "crewlet-data-view-toolbar__sort-footer", children: /* @__PURE__ */ jsx(
195
+ Button,
196
+ {
197
+ variant: "tertiary",
198
+ size: "small",
199
+ leadingIcon: /* @__PURE__ */ jsx(CloseGlyph, { size: "xs" }),
200
+ onClick: () => {
201
+ onSortChange(null);
202
+ close();
203
+ },
204
+ children: labels.clearSort
205
+ }
206
+ ) }) : null
207
+ ] })
208
+ }
209
+ ) : null,
210
+ onShowArchivedChange ? /* @__PURE__ */ jsx(
211
+ Button,
212
+ {
213
+ variant: "secondary",
214
+ size: "small",
215
+ pressed: showArchived,
216
+ leadingIcon: showArchived ? /* @__PURE__ */ jsx(VisibilityGlyph, { size: "sm" }) : /* @__PURE__ */ jsx(VisibilityOffGlyph, { size: "sm" }),
217
+ onClick: () => onShowArchivedChange(!showArchived),
218
+ children: /* @__PURE__ */ jsxs("span", { className: "crewlet-data-view-toolbar__menu-label", children: [
219
+ labels.showArchived(archivedLabel),
220
+ archivedCount > 0 ? /* @__PURE__ */ jsx(Count, { value: archivedCount, label: labels.archivedCount(archivedLabel) }) : null
221
+ ] })
222
+ }
223
+ ) : null,
224
+ actions ? /* @__PURE__ */ jsx("div", { className: "crewlet-data-view-toolbar__spacer" }) : null,
225
+ actions ? /* @__PURE__ */ jsx("div", { className: "crewlet-data-view-toolbar__actions", children: actions }) : null
226
+ ] });
227
+ }
228
+ function headerText(column) {
229
+ return typeof column.header === "string" ? column.header : column.key;
230
+ }
231
+
232
+ // src/DataView/filters.ts
233
+ function defaultOperator(def) {
234
+ switch (def.kind ?? "text") {
235
+ case "select":
236
+ return def.multiple === true ? "is-any-of" : "is";
237
+ case "number":
238
+ return "equals";
239
+ case "datetime":
240
+ return "on-or-after";
241
+ default:
242
+ return "contains";
243
+ }
244
+ }
245
+ function operatorOf(def) {
246
+ return def.operator ?? defaultOperator(def);
247
+ }
248
+ function blankFilterValue(def) {
249
+ if (def.kind === "select" && def.multiple === true) return [];
250
+ if (def.kind === "select" && def.options && def.options.length > 0) return def.options[0]?.value ?? "";
251
+ return "";
252
+ }
253
+ function filterHasValue(def, value) {
254
+ if (def.kind === "select" && def.multiple === true) return Array.isArray(value) && value.length > 0;
255
+ if (value === void 0 || value === null || value === "") return false;
256
+ if (def.kind === "select" && def.options && def.options.length > 0) {
257
+ return String(value) !== String(def.options[0]?.value);
258
+ }
259
+ return true;
260
+ }
261
+ function asText(value) {
262
+ return value === void 0 || value === null ? "" : String(value);
263
+ }
264
+ function asTime(value) {
265
+ if (value === void 0 || value === null || value === "") return Number.NaN;
266
+ if (value instanceof Date) return value.getTime();
267
+ return new Date(String(value)).getTime();
268
+ }
269
+ function filterPredicate(def, value) {
270
+ if (!filterHasValue(def, value)) return null;
271
+ const read = def.value ?? ((row) => row?.[def.name]);
272
+ const operator = operatorOf(def);
273
+ if (operator === "is-any-of") {
274
+ const wanted = Array.isArray(value) ? value : [];
275
+ if (wanted.length === 0) return null;
276
+ const set = new Set(wanted.map((entry) => String(entry)));
277
+ return (row) => set.has(asText(read(row)));
278
+ }
279
+ if (operator === "is") {
280
+ return (row) => asText(read(row)) === String(value);
281
+ }
282
+ if (operator === "equals") {
283
+ const wanted = Number(value);
284
+ if (Number.isNaN(wanted)) return null;
285
+ return (row) => {
286
+ const raw = read(row);
287
+ if (raw === void 0 || raw === null || raw === "") return false;
288
+ return Number(raw) === wanted;
289
+ };
290
+ }
291
+ if (operator === "on-or-after" || operator === "on-or-before") {
292
+ const edge = asTime(value);
293
+ if (Number.isNaN(edge)) return null;
294
+ const after = operator === "on-or-after";
295
+ return (row) => {
296
+ const at = asTime(read(row));
297
+ if (Number.isNaN(at)) return false;
298
+ return after ? at >= edge : at <= edge;
299
+ };
300
+ }
301
+ const needle = String(value).trim().toLowerCase();
302
+ if (needle === "") return null;
303
+ return (row) => {
304
+ const raw = read(row);
305
+ if (raw === void 0 || raw === null) return false;
306
+ return String(raw).toLowerCase().includes(needle);
307
+ };
308
+ }
309
+ function applyFilters(rows, defs, values) {
310
+ if (!values || rows.length === 0 || defs.length === 0) return rows;
311
+ const predicates = [];
312
+ for (const def of defs) {
313
+ const predicate = filterPredicate(def, values[def.name]);
314
+ if (predicate) predicates.push(predicate);
315
+ }
316
+ if (predicates.length === 0) return rows;
317
+ return rows.filter((row) => predicates.every((predicate) => predicate(row)));
318
+ }
319
+ function filterDefsFromColumns(columns) {
320
+ const out = [];
321
+ for (const column of columns) {
322
+ if (!column.filterable) continue;
323
+ const def = {
324
+ name: column.key,
325
+ label: column.filterLabel ?? (typeof column.header === "string" ? column.header : column.key),
326
+ kind: column.filterKind ?? "text"
327
+ };
328
+ if (column.filterOperator) def.operator = column.filterOperator;
329
+ if (column.filterPlaceholder) def.placeholder = column.filterPlaceholder;
330
+ if (column.filterValue) def.value = column.filterValue;
331
+ if ((column.filterKind ?? "text") === "select") {
332
+ def.options = column.filterOptions ?? [];
333
+ def.multiple = column.filterMultiple === true;
334
+ }
335
+ out.push(def);
336
+ }
337
+ return out;
338
+ }
339
+ function applyColumnFilters(rows, columns, values) {
340
+ return applyFilters(rows, filterDefsFromColumns(columns), values);
341
+ }
342
+ var FILTER_AXIS_LABELS = {
343
+ clearAll: "Clear filters",
344
+ remove: (label) => `Remove the ${label} filter`,
345
+ editor: (label) => `${label} filter`,
346
+ options: (label) => `${label} options`,
347
+ any: "any",
348
+ selected: (howMany) => `${howMany} selected`,
349
+ clear: "Clear",
350
+ done: "Done",
351
+ enter: "Enter",
352
+ operator: {
353
+ contains: "contains",
354
+ is: "is",
355
+ "is-any-of": "is any of",
356
+ equals: "equals",
357
+ "on-or-after": "on or after",
358
+ "on-or-before": "on or before"
359
+ }
360
+ };
361
+ var isMultiple = (def) => def.kind === "select" && def.multiple === true;
362
+ var chosenValues = (value) => Array.isArray(value) ? [...value] : [];
363
+ var sameValue = (a, b) => String(a) === String(b);
364
+ function formatFilterValue(def, value, labels) {
365
+ const operator = operatorOf(def);
366
+ const unusual = def.operator !== void 0 && def.operator !== defaultOperator(def);
367
+ const prefix = unusual ? `${labels.operator[operator]} ` : "";
368
+ if (isMultiple(def)) {
369
+ const held = chosenValues(value);
370
+ if (held.length === 0) return labels.any;
371
+ if (held.length === 1) {
372
+ const option = def.options?.find((candidate) => sameValue(candidate.value, held[0]));
373
+ return `${prefix}${option ? option.label : String(held[0])}`;
374
+ }
375
+ return labels.selected(held.length);
376
+ }
377
+ if (value === void 0 || value === null || value === "") {
378
+ const option = def.options?.find((candidate) => String(candidate.value) === "");
379
+ return option ? option.label : labels.any;
380
+ }
381
+ if (def.kind === "select") {
382
+ const option = def.options?.find((candidate) => sameValue(candidate.value, value));
383
+ return `${prefix}${option ? option.label : String(value)}`;
384
+ }
385
+ if (def.kind === "datetime") {
386
+ const at = new Date(String(value));
387
+ if (!Number.isNaN(at.getTime())) return `${prefix}${at.toLocaleString()}`;
388
+ }
389
+ return `${prefix}${String(value)}`;
390
+ }
391
+ function OptionListEditor({ def, value, labels, onCommit }) {
392
+ const id = useId();
393
+ const multiple = isMultiple(def);
394
+ const options = useMemo(() => def.options ?? [], [def.options]);
395
+ const held = useMemo(
396
+ () => multiple ? chosenValues(value) : value === void 0 || value === null ? [] : [value],
397
+ [multiple, value]
398
+ );
399
+ const list = useRef(null);
400
+ const isHeld = useCallback((candidate) => held.some((entry) => sameValue(entry, candidate)), [held]);
401
+ const commit = useCallback(
402
+ (index) => {
403
+ const option = options[index];
404
+ if (!option || option.disabled) return;
405
+ if (!multiple) {
406
+ onCommit(option.value, { close: true });
407
+ return;
408
+ }
409
+ const next = isHeld(option.value) ? held.filter((entry) => !sameValue(entry, option.value)) : [...held, option.value];
410
+ onCommit(next);
411
+ },
412
+ [held, isHeld, multiple, onCommit, options]
413
+ );
414
+ const listbox = useListbox({
415
+ id,
416
+ open: true,
417
+ count: options.length,
418
+ onCommit: commit,
419
+ // The popover around this owns Escape and the press outside, so the list
420
+ // must not register as a second popup: both would dismiss on one Escape.
421
+ popup: false,
422
+ onClose: () => {
423
+ }
424
+ });
425
+ const keys = useOptionKeys({
426
+ listbox,
427
+ count: options.length,
428
+ disabled: (index) => options[index]?.disabled === true,
429
+ textOf: (index) => options[index]?.label ?? ""
430
+ });
431
+ useEffect(() => {
432
+ listbox.setActive(keys.opening(options.findIndex((option) => isHeld(option.value))));
433
+ }, []);
434
+ useEffect(() => {
435
+ const box = list.current;
436
+ const row = box?.querySelector('[data-active="true"]');
437
+ if (!box || !row) return;
438
+ const bounds = box.getBoundingClientRect();
439
+ const spot = row.getBoundingClientRect();
440
+ if (spot.top < bounds.top) box.scrollTop -= bounds.top - spot.top;
441
+ else if (spot.bottom > bounds.bottom) box.scrollTop += spot.bottom - bounds.bottom;
442
+ }, [listbox.active]);
443
+ function onKeyDown(event) {
444
+ if (keys.onKeyDown(event)) return;
445
+ listbox.onKeyDown(event);
446
+ }
447
+ return /* @__PURE__ */ jsxs("div", { className: "crewlet-filter-axis__editor", children: [
448
+ /* @__PURE__ */ jsx(
449
+ "div",
450
+ {
451
+ ref: (el) => {
452
+ list.current = el;
453
+ listbox.listRef(el);
454
+ },
455
+ id: listbox.listId,
456
+ role: "listbox",
457
+ "aria-label": labels.options(def.label),
458
+ "aria-multiselectable": multiple || void 0,
459
+ "aria-activedescendant": options.length > 0 ? listbox.optionId(listbox.active) : void 0,
460
+ tabIndex: 0,
461
+ className: "crewlet-filter-axis__options",
462
+ onKeyDown,
463
+ children: options.map((option, index) => {
464
+ const selected = isHeld(option.value);
465
+ const highlighted = index === listbox.active;
466
+ return /* @__PURE__ */ jsxs(
467
+ "div",
468
+ {
469
+ id: listbox.optionId(index),
470
+ role: "option",
471
+ "aria-selected": selected,
472
+ "aria-disabled": option.disabled || void 0,
473
+ "data-active": highlighted || void 0,
474
+ className: cx(
475
+ "crewlet-filter-axis__option",
476
+ selected && "is-selected",
477
+ highlighted && "is-highlight",
478
+ option.disabled && "is-disabled"
479
+ ),
480
+ ...option.disabled ? {} : listbox.optionHandlers(index),
481
+ children: [
482
+ /* @__PURE__ */ jsx("span", { className: cx("crewlet-filter-axis__tick", selected && "is-checked"), "aria-hidden": "true", children: selected ? /* @__PURE__ */ jsx(CheckGlyph, { size: "xs" }) : null }),
483
+ /* @__PURE__ */ jsx("span", { className: "crewlet-filter-axis__option-label", children: option.label })
484
+ ]
485
+ },
486
+ String(option.value)
487
+ );
488
+ })
489
+ }
490
+ ),
491
+ multiple && held.length > 0 ? /* @__PURE__ */ jsxs("div", { className: "crewlet-filter-axis__editor-footer", children: [
492
+ /* @__PURE__ */ jsx(Button, { variant: "tertiary", size: "small", onClick: () => onCommit([]), children: labels.clear }),
493
+ /* @__PURE__ */ jsx(Button, { variant: "primary", size: "small", onClick: () => onCommit(held, { close: true }), children: labels.done })
494
+ ] }) : null
495
+ ] });
496
+ }
497
+ function MomentEditor({ def, value, labels, onCommit }) {
498
+ return /* @__PURE__ */ jsx("div", { className: "crewlet-filter-axis__editor crewlet-filter-axis__editor--moment", children: /* @__PURE__ */ jsx(
499
+ DateTimePicker,
500
+ {
501
+ inline: true,
502
+ value: typeof value === "string" ? value : "",
503
+ onChange: (next) => onCommit(next),
504
+ onDone: () => onCommit(value, { close: true }),
505
+ showTime: true,
506
+ ariaLabel: labels.editor(def.label),
507
+ ...def.placeholder === void 0 ? {} : { placeholder: def.placeholder }
508
+ }
509
+ ) });
510
+ }
511
+ function TextEditor({ def, value, labels, onCommit }) {
512
+ const box = useRef(null);
513
+ useEffect(() => {
514
+ const node = box.current;
515
+ if (!node) return;
516
+ node.focus();
517
+ node.setSelectionRange(node.value.length, node.value.length);
518
+ }, []);
519
+ return /* @__PURE__ */ jsx("div", { className: "crewlet-filter-axis__editor crewlet-filter-axis__editor--text", children: /* @__PURE__ */ jsx(
520
+ Input,
521
+ {
522
+ ref: box,
523
+ type: def.kind === "number" ? "number" : "text",
524
+ inputSize: "sm",
525
+ "aria-label": labels.editor(def.label),
526
+ trailing: /* @__PURE__ */ jsx(Kbd, { children: labels.enter }),
527
+ placeholder: def.placeholder ?? "",
528
+ defaultValue: value === void 0 || value === null ? "" : String(value),
529
+ onBlur: (event) => onCommit(event.target.value, { close: true }),
530
+ onKeyDown: (event) => {
531
+ if (event.key === "Enter") {
532
+ event.preventDefault();
533
+ onCommit(event.target.value, { close: true });
534
+ }
535
+ }
536
+ }
537
+ ) });
538
+ }
539
+ function FilterAxisChip({
540
+ def,
541
+ value,
542
+ onValueChange,
543
+ onRemove,
544
+ autoOpen = false,
545
+ onAutoOpenConsumed,
546
+ labels = FILTER_AXIS_LABELS,
547
+ className
548
+ }) {
549
+ const [consumed, setConsumed] = useState(false);
550
+ useEffect(() => {
551
+ if (autoOpen && !consumed) {
552
+ setConsumed(true);
553
+ onAutoOpenConsumed?.();
554
+ }
555
+ }, [autoOpen, consumed, onAutoOpenConsumed]);
556
+ const editor = (close) => {
557
+ const onCommit = (next, options) => {
558
+ onValueChange(next);
559
+ if (options?.close) close();
560
+ };
561
+ const props = { def, value, labels, onCommit };
562
+ if (def.kind === "select") return /* @__PURE__ */ jsx(OptionListEditor, { ...props });
563
+ if (def.kind === "datetime") return /* @__PURE__ */ jsx(MomentEditor, { ...props });
564
+ return /* @__PURE__ */ jsx(TextEditor, { ...props });
565
+ };
566
+ return /* @__PURE__ */ jsxs("div", { className: cx("crewlet-filter-axis-chip", className), children: [
567
+ /* @__PURE__ */ jsx(
568
+ Popover,
569
+ {
570
+ align: "start",
571
+ role: "dialog",
572
+ label: labels.editor(def.label),
573
+ defaultOpen: autoOpen,
574
+ className: "crewlet-filter-axis__popover",
575
+ trigger: (open, toggle) => /* @__PURE__ */ jsxs("button", { type: "button", className: cx("crewlet-filter-axis-chip__trigger", open && "is-open"), onClick: toggle, children: [
576
+ /* @__PURE__ */ jsxs("span", { className: "crewlet-filter-axis-chip__label", children: [
577
+ def.label,
578
+ ":"
579
+ ] }),
580
+ /* @__PURE__ */ jsx("span", { className: "crewlet-filter-axis-chip__value", children: formatFilterValue(def, value, labels) }),
581
+ /* @__PURE__ */ jsx(KeyboardArrowDownGlyph, { className: "crewlet-filter-axis-chip__chevron", size: "xs" })
582
+ ] }),
583
+ children: editor
584
+ }
585
+ ),
586
+ onRemove ? /* @__PURE__ */ jsx(
587
+ IconButton,
588
+ {
589
+ className: "crewlet-filter-axis-chip__remove",
590
+ size: "sm",
591
+ variant: "ghost",
592
+ label: labels.remove(def.label),
593
+ icon: /* @__PURE__ */ jsx(CloseGlyph, { size: "xs" }),
594
+ onClick: onRemove
595
+ }
596
+ ) : null
597
+ ] });
598
+ }
599
+ function FilterAxisBar({
600
+ filters,
601
+ values,
602
+ names,
603
+ onValuesChange,
604
+ onSubmit,
605
+ onRemove,
606
+ onClearAll,
607
+ autoOpenName,
608
+ onAutoOpenConsumed,
609
+ labels: overrides,
610
+ className,
611
+ children
612
+ }) {
613
+ const labels = overrides ? { ...FILTER_AXIS_LABELS, ...overrides, operator: { ...FILTER_AXIS_LABELS.operator, ...overrides.operator } } : FILTER_AXIS_LABELS;
614
+ if (names.length === 0) return null;
615
+ const set = (def, next) => {
616
+ onValuesChange({ ...values, [def.name]: next });
617
+ onSubmit?.();
618
+ };
619
+ return /* @__PURE__ */ jsxs("div", { className: cx("crewlet-filter-axis-bar", className), children: [
620
+ names.map((name) => {
621
+ const def = filters.find((candidate) => candidate.name === name);
622
+ if (!def) return null;
623
+ return /* @__PURE__ */ jsx(
624
+ FilterAxisChip,
625
+ {
626
+ def,
627
+ value: values[name],
628
+ onValueChange: (next) => set(def, next),
629
+ ...onRemove ? { onRemove: () => onRemove(def) } : {},
630
+ autoOpen: autoOpenName === name,
631
+ ...onAutoOpenConsumed ? { onAutoOpenConsumed } : {},
632
+ labels
633
+ },
634
+ name
635
+ );
636
+ }),
637
+ children,
638
+ onClearAll ? /* @__PURE__ */ jsx(
639
+ Button,
640
+ {
641
+ className: "crewlet-filter-axis-bar__clear",
642
+ variant: "tertiary",
643
+ size: "small",
644
+ leadingIcon: /* @__PURE__ */ jsx(CloseGlyph, { size: "xs" }),
645
+ onClick: onClearAll,
646
+ children: labels.clearAll
647
+ }
648
+ ) : null
649
+ ] });
650
+ }
651
+
652
+ // src/DataView/columns.ts
653
+ function tableColumns(columns) {
654
+ const record = {};
655
+ const order = [];
656
+ for (const column of columns) {
657
+ if (!column.key) continue;
658
+ const {
659
+ key,
660
+ header,
661
+ filterable: _filterable,
662
+ filterKind: _filterKind,
663
+ filterOperator: _filterOperator,
664
+ filterOptions: _filterOptions,
665
+ filterMultiple: _filterMultiple,
666
+ filterLabel: _filterLabel,
667
+ filterValue: _filterValue,
668
+ filterPlaceholder: _filterPlaceholder,
669
+ ...rest
670
+ } = column;
671
+ order.push(key);
672
+ record[key] = { ...rest, label: header };
673
+ }
674
+ return { columns: record, order };
675
+ }
676
+ function readStored(key) {
677
+ if (!key) return false;
678
+ try {
679
+ return globalThis.localStorage?.getItem(key) === "1";
680
+ } catch {
681
+ return false;
682
+ }
683
+ }
684
+ function writeStored(key, on) {
685
+ if (!key) return;
686
+ try {
687
+ if (on) globalThis.localStorage?.setItem(key, "1");
688
+ else globalThis.localStorage?.removeItem(key);
689
+ } catch {
690
+ }
691
+ }
692
+ function DataView({
693
+ title,
694
+ description,
695
+ badges,
696
+ headerActions,
697
+ headingLevel,
698
+ filters = [],
699
+ filterValues,
700
+ onFilterValuesChange,
701
+ onApplyFilters,
702
+ columns,
703
+ rows,
704
+ defaultSort = null,
705
+ sort: sortProp,
706
+ onSortChange,
707
+ archivedPredicate,
708
+ archivedTimestamp,
709
+ showArchived: showArchivedProp,
710
+ onShowArchivedChange,
711
+ archivedStorageKey,
712
+ archivedLabel = "archived",
713
+ framed = false,
714
+ toolbarActions,
715
+ stickyToolbar = false,
716
+ labels: labelOverrides,
717
+ className,
718
+ ...table
719
+ }) {
720
+ const labels = {
721
+ toolbar: labelOverrides?.toolbar,
722
+ chips: labelOverrides?.chips,
723
+ archivedAt: labelOverrides?.archivedAt ?? "Archived at",
724
+ archivedAtAbsent: labelOverrides?.archivedAtAbsent ?? "Not archived"
725
+ };
726
+ const [ownSort, setOwnSort] = useState(defaultSort);
727
+ const sort = sortProp !== void 0 ? sortProp : ownSort;
728
+ const setSort = onSortChange ?? setOwnSort;
729
+ const columnDefs = useMemo(() => filterDefsFromColumns(columns), [columns]);
730
+ const allFilters = useMemo(() => {
731
+ const seen = new Set(filters.map((def) => def.name));
732
+ return [...filters, ...columnDefs.filter((def) => !seen.has(def.name))];
733
+ }, [filters, columnDefs]);
734
+ const withValue = useCallback(
735
+ (values2) => {
736
+ const set = /* @__PURE__ */ new Set();
737
+ if (!values2) return set;
738
+ for (const def of allFilters) {
739
+ if (def.role === "search") continue;
740
+ if (filterHasValue(def, values2[def.name])) set.add(def.name);
741
+ }
742
+ return set;
743
+ },
744
+ [allFilters]
745
+ );
746
+ const [displayed, setDisplayed] = useState(() => withValue(filterValues));
747
+ const [justAdded, setJustAdded] = useState(null);
748
+ const lastValues = useRef(void 0);
749
+ useEffect(() => {
750
+ if (lastValues.current === filterValues) return;
751
+ lastValues.current = filterValues;
752
+ setDisplayed((was) => {
753
+ let next = null;
754
+ for (const name of withValue(filterValues)) {
755
+ if (was.has(name)) continue;
756
+ next ??= new Set(was);
757
+ next.add(name);
758
+ }
759
+ return next ?? was;
760
+ });
761
+ }, [filterValues, withValue]);
762
+ const names = useMemo(
763
+ () => allFilters.filter((def) => displayed.has(def.name)).map((def) => def.name),
764
+ [allFilters, displayed]
765
+ );
766
+ const values = filterValues ?? {};
767
+ const addFilter = (name) => {
768
+ setDisplayed((was) => new Set(was).add(name));
769
+ setJustAdded(name);
770
+ };
771
+ const removeFilter = (def) => {
772
+ setDisplayed((was) => {
773
+ const next = new Set(was);
774
+ next.delete(def.name);
775
+ return next;
776
+ });
777
+ onFilterValuesChange?.({ ...values, [def.name]: blankFilterValue(def) });
778
+ onApplyFilters?.();
779
+ };
780
+ const clearAll = () => {
781
+ const blank = { ...values };
782
+ for (const def of allFilters) {
783
+ if (def.role === "search") continue;
784
+ blank[def.name] = blankFilterValue(def);
785
+ }
786
+ setDisplayed(/* @__PURE__ */ new Set());
787
+ onFilterValuesChange?.(blank);
788
+ onApplyFilters?.();
789
+ };
790
+ const [ownShowArchived, setOwnShowArchived] = useState(() => readStored(archivedStorageKey));
791
+ const showArchived = showArchivedProp !== void 0 ? showArchivedProp : ownShowArchived;
792
+ const setShowArchived = (next) => {
793
+ if (onShowArchivedChange) {
794
+ onShowArchivedChange(next);
795
+ return;
796
+ }
797
+ setOwnShowArchived(next);
798
+ writeStored(archivedStorageKey, next);
799
+ };
800
+ const archivedCount = useMemo(
801
+ () => archivedPredicate ? rows.reduce((count, row) => archivedPredicate(row) ? count + 1 : count, 0) : 0,
802
+ [rows, archivedPredicate]
803
+ );
804
+ const visibleRows = useMemo(() => {
805
+ const filtered = applyFilters(rows, columnDefs, filterValues);
806
+ if (!archivedPredicate || showArchived) return filtered;
807
+ return filtered.filter((row) => !archivedPredicate(row));
808
+ }, [rows, columnDefs, filterValues, archivedPredicate, showArchived]);
809
+ const shownColumns = useMemo(() => {
810
+ if (!showArchived || !archivedTimestamp) return columns;
811
+ const archivedColumn = {
812
+ key: "__archived_at",
813
+ header: labels.archivedAt,
814
+ sortable: true,
815
+ shrink: true,
816
+ sortValue: (row) => {
817
+ const at = archivedTimestamp(row);
818
+ if (at === null || at === void 0 || at === "") return null;
819
+ const time = at instanceof Date ? at.getTime() : new Date(String(at)).getTime();
820
+ return Number.isNaN(time) ? null : time;
821
+ },
822
+ render: (row) => /* @__PURE__ */ jsx(RelativeTime, { value: archivedTimestamp(row) ?? null, emptyLabel: labels.archivedAtAbsent })
823
+ };
824
+ return [...columns, archivedColumn];
825
+ }, [columns, showArchived, archivedTimestamp, labels.archivedAt, labels.archivedAtAbsent]);
826
+ const { columns: tableCols, order } = useMemo(() => tableColumns(shownColumns), [shownColumns]);
827
+ const showToolbar = allFilters.length > 0 || !!toolbarActions || (!!onShowArchivedChange || !!archivedPredicate);
828
+ const toolbar = showToolbar ? /* @__PURE__ */ jsx(
829
+ DataViewToolbar,
830
+ {
831
+ filters: allFilters,
832
+ values,
833
+ onValuesChange: (next) => onFilterValuesChange?.(next),
834
+ displayed: names,
835
+ onAddFilter: addFilter,
836
+ ...onApplyFilters ? { onSubmit: onApplyFilters } : {},
837
+ columns: shownColumns,
838
+ sort,
839
+ onSortChange: setSort,
840
+ ...archivedPredicate ? { onShowArchivedChange: setShowArchived } : {},
841
+ showArchived,
842
+ archivedLabel,
843
+ archivedCount,
844
+ actions: toolbarActions,
845
+ ...labels.toolbar ? { labels: labels.toolbar } : {}
846
+ }
847
+ ) : null;
848
+ const chips = names.length > 0 ? /* @__PURE__ */ jsx(
849
+ FilterAxisBar,
850
+ {
851
+ filters: allFilters,
852
+ values,
853
+ names,
854
+ onValuesChange: (next) => onFilterValuesChange?.(next),
855
+ ...onApplyFilters ? { onSubmit: onApplyFilters } : {},
856
+ onRemove: removeFilter,
857
+ onClearAll: clearAll,
858
+ autoOpenName: justAdded,
859
+ onAutoOpenConsumed: () => setJustAdded(null),
860
+ ...labels.chips ? { labels: labels.chips } : {}
861
+ }
862
+ ) : null;
863
+ return /* @__PURE__ */ jsxs(
864
+ "div",
865
+ {
866
+ className: cx(
867
+ "crewlet-data-view",
868
+ framed && "crewlet-data-view--framed",
869
+ stickyToolbar && "crewlet-data-view--sticky-toolbar",
870
+ className
871
+ ),
872
+ children: [
873
+ title !== void 0 ? /* @__PURE__ */ jsx(
874
+ PageHeader,
875
+ {
876
+ title,
877
+ ...headingLevel === void 0 ? {} : { headingLevel },
878
+ ...description === void 0 ? {} : { description },
879
+ ...badges === void 0 ? {} : { badges },
880
+ ...headerActions === void 0 ? {} : { actions: headerActions }
881
+ }
882
+ ) : null,
883
+ /* @__PURE__ */ jsx("div", { className: "crewlet-data-view__table", children: /* @__PURE__ */ jsx(
884
+ DataTable,
885
+ {
886
+ ...table,
887
+ variant: "compact",
888
+ paginated: table.paginated ?? false,
889
+ showSettings: table.showSettings ?? true,
890
+ columns: tableCols,
891
+ defaultColumnOrder: order,
892
+ data: [...visibleRows],
893
+ sort,
894
+ onSortChange: setSort,
895
+ defaultSort,
896
+ ...toolbar ? { renderToolbar: toolbar } : {},
897
+ ...chips ? { renderFilterBar: chips } : {},
898
+ ...archivedPredicate ? { archivedPredicate } : {},
899
+ archivedLabel
900
+ }
901
+ ) })
902
+ ]
903
+ }
904
+ );
905
+ }
906
+
907
+ export { DATA_VIEW_TOOLBAR_LABELS, DataView, DataViewToolbar, FILTER_AXIS_LABELS, FilterAxisBar, FilterAxisChip, applyColumnFilters, applyFilters, blankFilterValue, defaultOperator, filterDefsFromColumns, filterHasValue, filterPredicate, formatFilterValue, operatorOf, tableColumns };