@crewlethq/ui 0.2.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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 +164 -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-RLR254LD.css +450 -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 +119 -0
  62. package/dist/CodeBlock/index.d.ts +3 -0
  63. package/dist/CodeBlock/index.js +7 -0
  64. package/dist/CodeBlock-GYNJ2HI6.css +188 -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 +64 -0
  78. package/dist/Copyable/Copyable.d.ts +42 -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 +100 -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 +126 -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 +101 -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 +153 -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 +67 -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-2HQR4U4D.js +143 -0
  364. package/dist/chunk-2PRH365R.js +74 -0
  365. package/dist/chunk-2ZQMA2WB.js +57 -0
  366. package/dist/chunk-34VGEDVV.js +907 -0
  367. package/dist/chunk-3CZ7XAVY.js +139 -0
  368. package/dist/chunk-3EYF6HKB.js +135 -0
  369. package/dist/chunk-3QRYCPXQ.js +116 -0
  370. package/dist/chunk-3ZP55QZE.js +40 -0
  371. package/dist/chunk-53DVJCVW.js +14 -0
  372. package/dist/chunk-5C5YMZQU.js +51 -0
  373. package/dist/chunk-5EKIWVOR.js +132 -0
  374. package/dist/chunk-5KPQ6D7N.js +54 -0
  375. package/dist/chunk-5SDBMKUO.js +297 -0
  376. package/dist/chunk-5VNUYO76.js +62 -0
  377. package/dist/chunk-5WS6L6FA.js +114 -0
  378. package/dist/chunk-6ZFVFA56.js +108 -0
  379. package/dist/chunk-7EM5T4ME.js +39 -0
  380. package/dist/chunk-7FZ53WDJ.js +163 -0
  381. package/dist/chunk-7HPRF5XN.js +525 -0
  382. package/dist/chunk-7RPGY3JE.js +43 -0
  383. package/dist/chunk-A2UXBCLO.js +48 -0
  384. package/dist/chunk-AV2DXAEL.js +27 -0
  385. package/dist/chunk-BHHIIK3M.js +17 -0
  386. package/dist/chunk-BZFWDIV6.js +9 -0
  387. package/dist/chunk-BZYDZBAN.js +123 -0
  388. package/dist/chunk-CMEE37QJ.js +628 -0
  389. package/dist/chunk-D35VTV2Z.js +106 -0
  390. package/dist/chunk-DD5BBGBE.js +162 -0
  391. package/dist/chunk-EN6K2IFA.js +256 -0
  392. package/dist/chunk-ESCO4XYW.js +144 -0
  393. package/dist/chunk-EUCC37WY.js +14 -0
  394. package/dist/chunk-EV6IMYJ6.js +62 -0
  395. package/dist/chunk-F27EPQ7D.js +68 -0
  396. package/dist/chunk-F4PJZ4ED.js +245 -0
  397. package/dist/chunk-F6OE5FH3.js +49 -0
  398. package/dist/chunk-FBZAKNSX.js +263 -0
  399. package/dist/chunk-FEFTGVMF.js +46 -0
  400. package/dist/chunk-GTOUGQQK.js +147 -0
  401. package/dist/chunk-GXQ3B46I.js +216 -0
  402. package/dist/chunk-H4FBTAYS.js +130 -0
  403. package/dist/chunk-HOXGBLEY.js +37 -0
  404. package/dist/chunk-HQNHV7D6.js +54 -0
  405. package/dist/chunk-HZ5XZNPS.js +98 -0
  406. package/dist/chunk-IAJLHVUA.js +28 -0
  407. package/dist/chunk-IJ7QXNIJ.js +1 -0
  408. package/dist/chunk-ITHXJHBB.js +280 -0
  409. package/dist/chunk-JCSA3XVH.js +32 -0
  410. package/dist/chunk-KLJCCMF3.js +97 -0
  411. package/dist/chunk-LWKJQTOM.js +77 -0
  412. package/dist/chunk-MNAXYY3R.js +215 -0
  413. package/dist/chunk-NDCATSW7.js +229 -0
  414. package/dist/chunk-NN62JQLR.js +29 -0
  415. package/dist/chunk-NPZY6YYL.js +251 -0
  416. package/dist/chunk-NTRZGNEX.js +529 -0
  417. package/dist/chunk-O6232G37.js +273 -0
  418. package/dist/chunk-O67VF5MS.js +58 -0
  419. package/dist/chunk-ODEQTPFM.js +6 -0
  420. package/dist/chunk-OFHBK7RI.js +498 -0
  421. package/dist/chunk-PNFASD6F.js +98 -0
  422. package/dist/chunk-PQADV6P6.js +19 -0
  423. package/dist/chunk-PZSWF74H.js +15 -0
  424. package/dist/chunk-Q4ZPPART.js +26 -0
  425. package/dist/chunk-QEUY3A5P.js +186 -0
  426. package/dist/chunk-QNCVHRZL.js +17 -0
  427. package/dist/chunk-QVE4GJAT.js +15 -0
  428. package/dist/chunk-QYOFACSP.js +36 -0
  429. package/dist/chunk-RA2ULG6H.js +29 -0
  430. package/dist/chunk-RDGD7Z7I.js +350 -0
  431. package/dist/chunk-RK4XPHVG.js +16 -0
  432. package/dist/chunk-RSAQOKH3.js +38 -0
  433. package/dist/chunk-S2XHHEW4.js +84 -0
  434. package/dist/chunk-S4GZWSKR.js +137 -0
  435. package/dist/chunk-SFZOKW2G.js +52 -0
  436. package/dist/chunk-UG46QBLT.js +325 -0
  437. package/dist/chunk-UOGSZKLT.js +134 -0
  438. package/dist/chunk-V2XMNLMS.js +52 -0
  439. package/dist/chunk-W4ENKCXJ.js +40 -0
  440. package/dist/chunk-W5J7R5EB.js +107 -0
  441. package/dist/chunk-WNI2WSJF.js +27 -0
  442. package/dist/chunk-WOYYD2YR.js +823 -0
  443. package/dist/chunk-WQX73TWF.js +1652 -0
  444. package/dist/chunk-XDTYBF2F.js +36 -0
  445. package/dist/chunk-XN4JBAN3.js +32 -0
  446. package/dist/chunk-XV6WRMBC.js +211 -0
  447. package/dist/chunk-YLYOWZ4V.js +33 -0
  448. package/dist/chunk-YODNNSZL.js +63 -0
  449. package/dist/chunk-ZCR6YGQ4.js +1 -0
  450. package/dist/chunk-ZFATEERP.js +144 -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 +14898 -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 +82 -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,64 @@
1
+ /**
2
+ * What a listbox has to do that the platform's own dropdown did for free.
3
+ *
4
+ * WHY IT IS ITS OWN FILE. `useListbox` is the keyboard of a list that follows a
5
+ * TEXT FIELD: the arrows, Enter, Escape and the layer it sits on. It knows
6
+ * nothing about the options themselves, so it cannot step over a disabled row,
7
+ * cannot answer Home or End, and has no type-ahead. Those three are exactly
8
+ * what a reader loses the moment a product stops drawing a native `<select>`,
9
+ * and the house style is now the listbox everywhere (a native control is drawn
10
+ * only where a caller asks for one). Written twice, one list would skip
11
+ * disabled rows while the one beside it parked the highlight on them, and only
12
+ * one of the two would answer End.
13
+ *
14
+ * THE RULES IT KEEPS.
15
+ *
16
+ * - THE ARROWS, HOME AND END STEP OVER A DISABLED ROW. A highlight parked on
17
+ * one is a list where Enter does nothing and nobody is told why.
18
+ * - TYPE-AHEAD IS THE NATIVE CONTROL'S ONE IRREPLACEABLE TRICK. Letters typed
19
+ * within half a second are one run, so "sa" reaches Saturday rather than
20
+ * stopping at the first S; a single letter repeated walks the rows starting
21
+ * with it, which is what a `<select>` does. A list with a search box has no
22
+ * type-ahead at all, because there the letters belong to the box.
23
+ * - A RUN IS MATCHED FROM THE ROW AFTER THE HIGHLIGHT, so pressing one letter
24
+ * twice moves on rather than re-finding the row already under it.
25
+ * - IT REPORTS WHAT IT HANDLED, so the component around it can take the keys
26
+ * it owns itself (a Select takes Tab) and leave the rest alone.
27
+ *
28
+ * It owns no markup and no state beyond the type-ahead run: the highlight
29
+ * lives in `useListbox`, and this moves it.
30
+ */
31
+ import { type KeyboardEvent } from 'react';
32
+ import type { Listbox } from './useListbox.js';
33
+ /** How long a type-ahead run stays open, in milliseconds. */
34
+ export declare const TYPE_AHEAD_WINDOW = 500;
35
+ export interface OptionKeysOptions {
36
+ /** The highlight this moves. */
37
+ listbox: Listbox;
38
+ /** How many options are offered right now. */
39
+ count: number;
40
+ /** Whether the option at `index` refuses to be taken. */
41
+ disabled?: ((index: number) => boolean) | undefined;
42
+ /**
43
+ * The words type-ahead matches at `index`. Leave it out for a list whose
44
+ * letters belong to a search box: that list has no type-ahead, on purpose.
45
+ */
46
+ textOf?: ((index: number) => string) | undefined;
47
+ }
48
+ export interface OptionKeys {
49
+ /**
50
+ * Handles the keys the options themselves decide, and says whether it did.
51
+ * Anything it does not take belongs to `listbox.onKeyDown` and then to the
52
+ * component.
53
+ */
54
+ onKeyDown: (event: KeyboardEvent<HTMLElement>) => boolean;
55
+ /** The next index at or after `from`, walking `by`, that Enter would accept, or -1. */
56
+ step: (from: number, by: 1 | -1) => number;
57
+ /**
58
+ * Which row a freshly opened list highlights: the chosen one when it can be
59
+ * taken, else the first that can. A list that opens on a disabled row is one
60
+ * where the first Enter does nothing.
61
+ */
62
+ opening: (chosen: number) => number;
63
+ }
64
+ export declare function useOptionKeys({ listbox, count, disabled, textOf }: OptionKeysOptions): OptionKeys;
@@ -0,0 +1,110 @@
1
+ /*
2
+ * The listbox register: one look for every list a field offers.
3
+ *
4
+ * A combobox's completions, a multi-select's options and a command palette's
5
+ * results are the same shape read the same way, so they are drawn by one
6
+ * family rather than three. The component owns the markup and the filtering;
7
+ * this owns the rows.
8
+ *
9
+ * A MENU'S ROWS ARE NOT IN THIS FAMILY, and that is a decision rather than an
10
+ * oversight. A menu is a short list of verbs run past at a glance and is drawn
11
+ * tight (`Menu.css`); this is a list of candidates read one at a time for the
12
+ * one that matches, and the row it is read at is the command palette's.
13
+ *
14
+ * THE HIGHLIGHT IS NOT FOCUS. Focus stays in the text field and the list is
15
+ * pointed at with `aria-activedescendant`, so the active row is drawn from
16
+ * `[aria-selected]` rather than from `:focus-visible`, and a hover paints the
17
+ * same row the arrows would.
18
+ */
19
+
20
+ .crewlet-listbox {
21
+ list-style: none;
22
+ margin: 0;
23
+ padding: var(--spacing-1);
24
+ display: flex;
25
+ flex-direction: column;
26
+ max-height: min(360px, 60vh);
27
+ overflow-y: auto;
28
+ overscroll-behavior: contain;
29
+ }
30
+
31
+ .crewlet-listbox__option {
32
+ display: flex;
33
+ align-items: center;
34
+ gap: var(--spacing-2);
35
+ min-height: var(--size-row-sm);
36
+ padding: var(--spacing-2) var(--spacing-3);
37
+ border-radius: var(--radius-md);
38
+ /*
39
+ * The SECONDARY step, not the primary one. A list of candidates is read by
40
+ * running the eye down it for the one that matches, and rows drawn at full
41
+ * strength all shout at once; the row the reader is actually on is the one
42
+ * that takes the accent and its ink. The step is held at 4.5:1 on every
43
+ * ground a row can sit on, so quieter is not fainter.
44
+ */
45
+ color: var(--color-text-secondary);
46
+ font-size: var(--font-size-compact);
47
+ line-height: var(--font-line-height-normal);
48
+ text-align: left;
49
+ cursor: pointer;
50
+ /* A row is chosen by the arrows as often as by the pointer, so the highlight
51
+ lands with no transition: a fade would lag a held arrow key. */
52
+ }
53
+
54
+ /*
55
+ * The active row, whether the arrows put it there or a hover did. The accent
56
+ * is what means "here", and it is a tint plus its ink step rather than a fill
57
+ * with a label on it.
58
+ */
59
+ .crewlet-listbox__option[aria-selected='true'],
60
+ .crewlet-listbox__option:hover {
61
+ background: var(--color-brand-accent-soft);
62
+ color: var(--color-brand-accent-ink);
63
+ }
64
+
65
+ .crewlet-listbox__option[aria-disabled='true'] {
66
+ color: var(--color-text-tertiary);
67
+ cursor: not-allowed;
68
+ }
69
+
70
+ /*
71
+ * The words a row carries beyond its label: a path, a kind, a shortcut. Held
72
+ * off the label by the row's own gap and never wrapped: a hint that broke
73
+ * across two lines turned every row in the list a different height.
74
+ */
75
+ .crewlet-listbox__hint {
76
+ margin-left: auto;
77
+ color: var(--color-text-tertiary);
78
+ font-size: var(--font-size-xs);
79
+ white-space: nowrap;
80
+ }
81
+
82
+ /*
83
+ * A group heading, on the tertiary step. It is a heading for the eye; the
84
+ * grouping a screen reader hears comes from the `group` the component wraps
85
+ * its rows in, which is why nothing here makes it focusable.
86
+ */
87
+ .crewlet-listbox__heading {
88
+ padding: var(--spacing-2) var(--spacing-3) var(--spacing-1);
89
+ color: var(--color-text-tertiary);
90
+ font-size: var(--font-size-2xs);
91
+ font-weight: var(--font-weight-medium);
92
+ letter-spacing: var(--font-letter-spacing-wide);
93
+ text-transform: uppercase;
94
+ }
95
+
96
+ /*
97
+ * The empty line. An honest empty state says which kind of nothing this is,
98
+ * so the component supplies the sentence and this only draws it.
99
+ */
100
+ .crewlet-listbox__empty {
101
+ padding: var(--spacing-3) var(--spacing-3);
102
+ color: var(--color-text-tertiary);
103
+ font-size: var(--font-size-compact);
104
+ }
105
+
106
+ .crewlet-listbox__separator {
107
+ height: 1px;
108
+ margin: var(--spacing-1) 0;
109
+ background: var(--color-border-default);
110
+ }
@@ -0,0 +1,118 @@
1
+ /**
2
+ * A menu button: a trigger that opens a short list of actions.
3
+ *
4
+ * WHY IT EXISTS. A row in a table, a card on a chart or a node in a tree has
5
+ * more actions than it has room for buttons, and a row of icons nobody can
6
+ * name is not an interface. The WAI-ARIA menu button pattern is the one a
7
+ * screen reader and a keyboard already know, and it has enough rules that a
8
+ * second hand-written copy misses some of them: the one this replaces put
9
+ * `role="menu"` on two nested elements, moved focus nowhere on open, had no
10
+ * arrows, used native `disabled` items a keyboard reader never met, ran an
11
+ * action before returning focus, did not close on Tab, and let its keys reach
12
+ * the row beneath it.
13
+ *
14
+ * THE RULES IT KEEPS.
15
+ *
16
+ * - OPENING PUTS FOCUS ON THE FIRST ITEM (ArrowUp on the trigger: the last).
17
+ * Arrows move and wrap, Home and End jump, a letter moves to the next item
18
+ * starting with it, Enter or Space activates.
19
+ * - IT IS A POPUP ON THE SHARED LAYER STACK: Escape closes the menu before
20
+ * anything beneath it, and a press outside closes it without also counting
21
+ * as a press on a veil.
22
+ * - FOCUS GOES BACK TO WHAT OPENED IT on Escape, on Tab (which then carries on
23
+ * to the next control, as the pattern says) and BEFORE AN ACTION RUNS. The
24
+ * last is what lets an action open a dialog that returns focus to the right
25
+ * place: the dialog captures its opener when it first renders, and by then
26
+ * focus is back on the trigger rather than on an item about to unmount. What
27
+ * opened it is whatever held focus when it opened, so a menu opened from a
28
+ * tree item with the Menu key returns to the tree item, not to the
29
+ * pointer-only button that anchors it.
30
+ * - A DISABLED ITEM STAYS FOCUSABLE and says so (`aria-disabled`), so a
31
+ * keyboard user learns the action exists and is unavailable rather than
32
+ * meeting a list that silently skips it.
33
+ * - IT IS PLACED BY ARITHMETIC inside the layer it renders into, follows its
34
+ * trigger through a pan or a scroll, and closes when the trigger leaves the
35
+ * bounds. Focus moves in only once it has been placed: until then it is
36
+ * drawn hidden, so it never flashes at a corner, and a browser refuses focus
37
+ * to a hidden element anyway.
38
+ * - WHAT HAPPENS IN THE MENU STAYS IN THE MENU. A key, a press or a click
39
+ * inside it does not reach the element it was opened from. A portal carries
40
+ * React events up the component tree, not the document, so without this the
41
+ * Enter that activates "Delete" would also reach the card's own Enter, and
42
+ * ArrowDown would move the tree's focus as well as the menu's. Escape and
43
+ * Tab still travel, because the layer stack acts on them at the document,
44
+ * and so does a chord with Control, Command or Alt.
45
+ * - A CHOICE IS A RADIO ITEM. An item given `checked` is a `menuitemradio`
46
+ * that says whether it is the current value and draws a check where the
47
+ * others draw nothing, so a menu that picks one value reads as a choice with
48
+ * an answer rather than a list of actions that all look alike. Every answer
49
+ * of such a choice should say `checked`, true or false, so the check column
50
+ * lines up. The answers that stand together are nested in one `group`, as
51
+ * the pattern asks of radio items sharing a menu with actions, so a screen
52
+ * reader counts "2 of 3" among the answers rather than among every item.
53
+ * - IT CAN BE OPENED FROM OUTSIDE (`open`, `onOpenChange`), because a tree item
54
+ * that holds focus opens its card's menu from the keyboard while the trigger
55
+ * itself is out of the tab order (`triggerTabIndex={-1}`).
56
+ *
57
+ * Ported from the engine dashboard's `ui/Menu.tsx`, with its suite.
58
+ */
59
+ import { type ReactNode } from 'react';
60
+ import { type ButtonVariant } from '../Button/index.js';
61
+ export interface MenuItem {
62
+ kind?: 'item';
63
+ key: string;
64
+ label: string;
65
+ /** A glyph component, drawn before the label. */
66
+ icon?: ReactNode;
67
+ onSelect: () => void;
68
+ disabled?: boolean | undefined;
69
+ /** A destructive action: drawn in the critical ink. */
70
+ danger?: boolean | undefined;
71
+ /** A shortcut or a short note, shown at the end of the row. */
72
+ hint?: ReactNode;
73
+ /** A second line under the label, for an action whose name is not enough. */
74
+ description?: ReactNode;
75
+ /**
76
+ * Makes the item one answer of a single choice: a `menuitemradio` that is
77
+ * the current value when true. Left out, the item is an action.
78
+ */
79
+ checked?: boolean | undefined;
80
+ }
81
+ export interface MenuSeparator {
82
+ kind: 'separator';
83
+ key: string;
84
+ }
85
+ export type MenuEntry = MenuItem | MenuSeparator;
86
+ /** A menu's entries as it draws them: an action, a separator, or a run of answers. */
87
+ type Run = {
88
+ kind: 'action';
89
+ item: MenuItem;
90
+ } | {
91
+ kind: 'separator';
92
+ key: string;
93
+ } | {
94
+ kind: 'answers';
95
+ key: string;
96
+ items: MenuItem[];
97
+ };
98
+ /** Gathers each run of consecutive answers (items given `checked`) into one group. */
99
+ export declare function runs(entries: readonly MenuEntry[]): Run[];
100
+ export interface MenuProps {
101
+ /** The trigger's accessible name, such as "Actions for Software Engineer". */
102
+ label: string;
103
+ items: readonly MenuEntry[];
104
+ /** The trigger's glyph, when it has no visible text. */
105
+ icon?: ReactNode;
106
+ /** Visible trigger text; without it the trigger is an icon button named by `label`. */
107
+ trigger?: ReactNode;
108
+ triggerVariant?: ButtonVariant | undefined;
109
+ /** -1 for a pointer-only trigger whose actions the keyboard reaches another way. */
110
+ triggerTabIndex?: number | undefined;
111
+ open?: boolean | undefined;
112
+ onOpenChange?: ((open: boolean) => void) | undefined;
113
+ /** Which edge of the trigger the menu lines up with. */
114
+ align?: 'start' | 'end' | undefined;
115
+ className?: string | undefined;
116
+ }
117
+ export declare function Menu({ label, items, icon, trigger, triggerVariant, triggerTabIndex, open: controlled, onOpenChange, align, className, }: MenuProps): import("react/jsx-runtime").JSX.Element;
118
+ export {};
@@ -0,0 +1,3 @@
1
+ import './Menu.css';
2
+ export { Menu } from './Menu.js';
3
+ export type { MenuEntry, MenuItem, MenuProps, MenuSeparator } from './Menu.js';
@@ -0,0 +1,7 @@
1
+ export { Menu } from '../chunk-FBZAKNSX.js';
2
+ import '../chunk-7RPGY3JE.js';
3
+ import '../chunk-ITHXJHBB.js';
4
+ import '../chunk-F27EPQ7D.js';
5
+ import '../chunk-BZYDZBAN.js';
6
+ import '../chunk-BZFWDIV6.js';
7
+ import '../chunk-ODEQTPFM.js';
@@ -0,0 +1,222 @@
1
+ /*
2
+ * The menu button's panel.
3
+ *
4
+ * It shares the popover's surface deliberately: a menu and a popover are the
5
+ * same object to a reader, and two surfaces that differ by a shadow step are
6
+ * how a design system starts to look assembled rather than designed. What is
7
+ * its own is the row: a check column, a danger ink, and a hover that is
8
+ * neutral because focus, not the pointer, is what moves through a menu.
9
+ *
10
+ * THE PANEL IS SIZED BY ITS LONGEST ROW, not by a minimum of its own. A menu
11
+ * is a short list of verbs, and a floor wide enough for the longest one in the
12
+ * product leaves every other menu padded out with air. The ceiling stays, so a
13
+ * label nobody expected truncates instead of running off the screen.
14
+ *
15
+ * THE ROW IS ONE LINE HIGH AND TIGHT. A menu is read by running the eye down
16
+ * the verbs, and a row with a dialog's padding turns six of them into a
17
+ * scroller. The rows that carry a second line say so (`--described`) rather
18
+ * than every row paying for the two that need it.
19
+ */
20
+
21
+ .crewlet-menu-anchor {
22
+ display: inline-flex;
23
+ }
24
+
25
+ .crewlet-menu {
26
+ position: fixed;
27
+ display: flex;
28
+ flex-direction: column;
29
+ padding: var(--spacing-1);
30
+ /*
31
+ * WIDTH, not min-width. Both spell "as wide as the longest row", and only
32
+ * this one leaves the ceiling below able to hold it: a min-width larger than
33
+ * a max-width replaces it, so the pair sized the panel to its longest label
34
+ * however long that label was and the 320px was a number nothing read. A
35
+ * width is clamped by the ceiling, and the label that no longer fits is the
36
+ * one that truncates.
37
+ */
38
+ width: max-content;
39
+ max-width: 320px;
40
+ max-height: min(360px, 60vh);
41
+ overflow-y: auto;
42
+ overscroll-behavior: contain;
43
+ background: var(--color-surface-subtle);
44
+ border: 1px solid var(--color-border-default);
45
+ border-radius: var(--radius-md);
46
+ box-shadow: var(--shadow-xl);
47
+ animation: crewlet-menu-in var(--motion-duration-base) var(--motion-easing-emphasized);
48
+ }
49
+
50
+ /* Inside a LayerHost the coordinates are the host's own, so the panel is
51
+ absolute within it rather than fixed against the window. */
52
+ .crewlet-menu--in-host {
53
+ position: absolute;
54
+ }
55
+
56
+ /* Up from under its trigger, which is where it is about to be. */
57
+ @keyframes crewlet-menu-in {
58
+ from {
59
+ opacity: 0;
60
+ transform: translateY(var(--spacing-2));
61
+ }
62
+ }
63
+
64
+ .crewlet-menu__group {
65
+ display: contents;
66
+ }
67
+
68
+ .crewlet-menu__item {
69
+ display: flex;
70
+ align-items: center;
71
+ gap: var(--spacing-2);
72
+ width: 100%;
73
+ min-height: var(--size-row-sm);
74
+ padding: 0 var(--spacing-2);
75
+ border: none;
76
+ border-radius: var(--radius-xs);
77
+ background: transparent;
78
+ color: var(--color-text-primary);
79
+ font-family: inherit;
80
+ font-size: var(--font-size-compact);
81
+ text-align: left;
82
+ white-space: nowrap;
83
+ cursor: pointer;
84
+ }
85
+
86
+ /*
87
+ * The rows that carry a second line, and only those. The row height alone
88
+ * would hold a label and a description in the space meant for one line.
89
+ */
90
+ .crewlet-menu__item--described {
91
+ padding-block: var(--spacing-2);
92
+ }
93
+
94
+ /* Neutral, because the accent means "where the reader is" and in a menu that
95
+ is what focus already says. */
96
+ .crewlet-menu__item:hover:not(.is-disabled) {
97
+ background: var(--color-surface-hover);
98
+ }
99
+
100
+ /*
101
+ * THE TINT IS ON `:focus`, NOT ON `:focus-visible`. A menu puts focus on a row
102
+ * as it opens, and a row a script focused after a POINTER opened the panel
103
+ * does not match `:focus-visible` in any browser: the panel came up with no
104
+ * row lit at all until the reader moved the pointer or pressed an arrow, which
105
+ * is the one thing a menu has to say before it says anything else. A disabled
106
+ * row is not excluded here as it is from the hover above, and the asymmetry is
107
+ * the point: hover is an invitation and a disabled row declines it, while
108
+ * focus is a fact about where the keys will land.
109
+ */
110
+ .crewlet-menu__item:focus {
111
+ background: var(--color-surface-hover);
112
+ }
113
+
114
+ /*
115
+ * Focus is the only cursor a menu has, so the ring is the important mark here,
116
+ * and it is inset: the panel scrolls its own rows, and an outset ring is
117
+ * clipped by the scroller and painted over by the row below. The ring alone,
118
+ * because the rule above has already drawn the tint under it.
119
+ */
120
+ .crewlet-menu__item:focus-visible {
121
+ outline: 2px solid var(--color-focus);
122
+ outline-offset: var(--size-focus-ring-inset-offset);
123
+ }
124
+
125
+ /* The whole row, its glyph included: a destructive action is one thing. */
126
+ .crewlet-menu__item.is-danger,
127
+ .crewlet-menu__item.is-danger .crewlet-menu__icon {
128
+ color: var(--color-feedback-danger-ink);
129
+ }
130
+
131
+ /*
132
+ * A disabled item is still reachable and still says what it is. It is drawn
133
+ * quieter rather than removed, so a keyboard reader learns the action exists.
134
+ *
135
+ * The quiet step is the tertiary one and NOT an opacity. Half-strength ink is
136
+ * a composite nothing measured, and on this panel it lands at 2.4:1; the
137
+ * tertiary step is the one the palette suite holds at 4.5:1 on every ground a
138
+ * row can sit on, which is what makes "unavailable" readable rather than
139
+ * merely faint.
140
+ *
141
+ * IT IS DECLARED AFTER THE DESTRUCTIVE ROW ON PURPOSE. The two weigh the same,
142
+ * so the later one wins, and the one a reader has to be told is the one that
143
+ * says the row cannot be pressed: a Delete nobody is allowed to press was
144
+ * drawn in full danger ink, which is the strongest "press me" in the palette.
145
+ * The opacity this replaced faded both at once and so never had to choose.
146
+ */
147
+ .crewlet-menu__item.is-disabled,
148
+ .crewlet-menu__item.is-disabled .crewlet-menu__icon {
149
+ color: var(--color-text-tertiary);
150
+ }
151
+
152
+ .crewlet-menu__item.is-disabled {
153
+ cursor: not-allowed;
154
+ }
155
+
156
+ /*
157
+ * The check column. It is drawn for every answer of a choice, filled or not,
158
+ * so the labels line up and the answered one is the only row with a mark. It
159
+ * is the width of a glyph step rather than of a font size, so the column is
160
+ * the same width in a menu of any register.
161
+ */
162
+ .crewlet-menu__check {
163
+ display: inline-flex;
164
+ align-items: center;
165
+ justify-content: center;
166
+ width: var(--spacing-4);
167
+ flex: none;
168
+ color: var(--color-text-tertiary);
169
+ }
170
+
171
+ .crewlet-menu__icon {
172
+ display: inline-flex;
173
+ align-items: center;
174
+ flex: none;
175
+ color: var(--color-text-tertiary);
176
+ }
177
+
178
+ .crewlet-menu__text {
179
+ display: flex;
180
+ flex-direction: column;
181
+ min-width: 0;
182
+ }
183
+
184
+ .crewlet-menu__label {
185
+ overflow: hidden;
186
+ text-overflow: ellipsis;
187
+ white-space: nowrap;
188
+ }
189
+
190
+ .crewlet-menu__description {
191
+ color: var(--color-text-tertiary);
192
+ font-size: var(--font-size-2xs);
193
+ white-space: normal;
194
+ }
195
+
196
+ /*
197
+ * A shortcut or a short note at the end of the row, held off the label by a
198
+ * full glyph step so the two never read as one phrase.
199
+ */
200
+ .crewlet-menu__hint {
201
+ margin-left: auto;
202
+ padding-left: var(--spacing-4);
203
+ color: var(--color-text-tertiary);
204
+ font-size: var(--font-size-xs);
205
+ }
206
+
207
+ .crewlet-menu__separator {
208
+ height: 1px;
209
+ margin: var(--spacing-1) 0;
210
+ background: var(--color-border-default);
211
+ }
212
+
213
+ /*
214
+ * The rows themselves carry no transition, and that is the rule rather than an
215
+ * omission: the arrows move the highlight, and a fade lags a held arrow key so
216
+ * the row the reader is on stops being the row that is lit.
217
+ */
218
+ @media (prefers-reduced-motion: reduce) {
219
+ .crewlet-menu {
220
+ animation: none;
221
+ }
222
+ }
@@ -0,0 +1,126 @@
1
+ import { type HTMLAttributes, type ReactNode } from 'react';
2
+ /**
3
+ * What the bar is saying.
4
+ *
5
+ * `brand` is the ordinary reading, because a budget that is being spent is not
6
+ * in a state; it is just a number. The three that ARE states are derived from
7
+ * the fill unless a caller overrides them, so a bar that is nearly full says
8
+ * so without every call site remembering to.
9
+ */
10
+ export type MeterTone = 'brand' | 'success' | 'warning' | 'danger' | 'neutral';
11
+ /**
12
+ * WHICH DIRECTION A FULL BAR POINTS, which is the one thing the fill itself
13
+ * cannot say. A budget at 100 percent is a fault; a goal at 100 percent is the
14
+ * whole point of the goal. The same arithmetic, the opposite conclusion — so
15
+ * the polarity is a property of what is being measured and belongs to the call
16
+ * site, not to the ramp.
17
+ *
18
+ * `spent` is the default and is what every existing caller already gets.
19
+ *
20
+ * IT MOVES THE TONE RAMP AND NOTHING ELSE — in particular it does not reach
21
+ * for `role="progressbar"`. That role is for an operation the application is
22
+ * running while the user waits on it, which is why the meter role says authors
23
+ * "SHOULD NOT use the meter role to indicate progress". A goal that is eight
24
+ * tenths achieved is not an operation anybody is waiting on; it is a scalar
25
+ * measurement within a known range, which is a meter. A file upload is the
26
+ * other thing, and it is not this component.
27
+ */
28
+ export type MeterPolarity = 'spent' | 'progress';
29
+ export interface MeterProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {
30
+ value: number;
31
+ /**
32
+ * The ceiling. NON-POSITIVE MEANS THERE IS NO CEILING, and the bar is then
33
+ * drawn as decoration rather than as a reading — see the note on the
34
+ * component.
35
+ */
36
+ max: number;
37
+ /**
38
+ * What is being measured. REQUIRED, and LINKED to the bar: the meter this
39
+ * replaces drew its legend as a sibling and named nothing, so a screen
40
+ * reader announced "meter, 62 percent" with no idea of what.
41
+ */
42
+ label: ReactNode;
43
+ /**
44
+ * The value in words, for a reader who is told the number rather than shown
45
+ * the bar: "12.4K of 20K tokens". Without one, the platform reads the raw
46
+ * value against the maximum, which is right for a plain count and wrong for
47
+ * anything with a unit.
48
+ */
49
+ valueText?: string | undefined;
50
+ /** Drawn at the trailing edge of the legend. Falls back to `valueText`. */
51
+ hint?: ReactNode;
52
+ /** Overrides the tone derived from the fill. */
53
+ tone?: MeterTone | undefined;
54
+ /**
55
+ * Which ramp the derived tone comes from. `spent` (the default) reads a full
56
+ * bar as a fault; `progress` reads it as an achievement. Ignored when `tone`
57
+ * is given, which overrides the ramp entirely.
58
+ */
59
+ polarity?: MeterPolarity | undefined;
60
+ /**
61
+ * `compact` is the bar inside a table cell. Its legend drops a type step;
62
+ * the track does not, because the track is already the engine's 4px and
63
+ * there is nothing below four a fill still reads as a proportion in.
64
+ */
65
+ size?: 'default' | 'compact' | undefined;
66
+ /** Keep the label out of the picture. It stays in the accessibility tree. */
67
+ hideLabel?: boolean | undefined;
68
+ }
69
+ /**
70
+ * The `spent` ramp: at the top it is a fault, near the top it wants a person,
71
+ * below that it is just a number.
72
+ *
73
+ * Keeps its plain name because renaming an export is breaking, and it is still
74
+ * the ramp a `Meter` uses when nobody says otherwise.
75
+ */
76
+ export declare function meterTone(percent: number): MeterTone;
77
+ /**
78
+ * The `progress` ramp: finished is finished, and everything short of it is
79
+ * just a number.
80
+ *
81
+ * TWO STEPS RATHER THAN THREE, deliberately. The spent ramp has a middle step
82
+ * because a budget carries two escalating facts a reader has to act on — near
83
+ * the limit somebody should look, past it something is already wrong. A goal
84
+ * carries one: it is done or it is not. "Nearly done" is not a warning and
85
+ * "barely started" is only a fault against a DEADLINE, which is not one of
86
+ * this component's inputs — so a middle step here would be an alarm invented
87
+ * out of a number the meter cannot interpret.
88
+ */
89
+ export declare function progressTone(percent: number): MeterTone;
90
+ /**
91
+ * A budget, a share, a fill.
92
+ *
93
+ * THE TRACK IS ALWAYS DRAWN. A bar with no track is a bar whose maximum the
94
+ * reader has to guess, and at 8 percent it is indistinguishable from a bar
95
+ * that is simply short.
96
+ *
97
+ * A NON-POSITIVE MAXIMUM IS NOT A METER, because ARIA gives the meter role no
98
+ * way at all to say "there is no ceiling" and both attempts are a false claim.
99
+ * `max={0}` renders `aria-valuemax="0"` against an `aria-valuemin` of 0: a
100
+ * range of zero width, in which the fraction a reader is offered is 0/0 and
101
+ * every value but 0 breaks the role's own "the value of aria-valuenow MUST NOT
102
+ * fall below or exceed the computed values of aria-valuemin and aria-valuemax"
103
+ * — and a negative maximum additionally breaks "authors MUST ensure the value
104
+ * of aria-valuemax is greater than or equal to the value of aria-valuemin".
105
+ * Leaving the attribute off instead is WORSE rather than better, because
106
+ * missing is precisely when the role's implicit value takes over — "if
107
+ * aria-valuemax is missing or not a number, it defaults to 100" — so the bar
108
+ * stops saying nothing and starts announcing a confident fraction of a ceiling
109
+ * that nobody set.
110
+ *
111
+ * So the only honest move is to stop being a meter. The bar drops the role and
112
+ * every value attribute and is hidden from the accessibility tree as the
113
+ * decoration it is; the legend still names it and still carries the figure.
114
+ * (`DataTable`'s column resizer reaches the same conclusion from the same
115
+ * place: a maximum invented to fill the attribute is a number a reader is told
116
+ * they cannot pass.)
117
+ *
118
+ * THE REPORTED VALUE IS CLAMPED INTO THE SCALE. A budget lowered under a
119
+ * counter that has already passed it is an ordinary event, and it used to
120
+ * publish `aria-valuenow` outside `[min,max]` — the same normative MUST NOT as
121
+ * above, which assistive technology is therefore free to resolve however it
122
+ * likes. The clamp makes the pair valid and `aria-valuetext` keeps the true
123
+ * figures, so nothing is lost: what a reader hears is "140 of 100", not a bar
124
+ * that quietly rounds itself down to exactly the limit it has overrun.
125
+ */
126
+ export declare function Meter({ value, max, label, valueText, hint, tone, polarity, size, hideLabel, className, ...rest }: MeterProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,3 @@
1
+ import './Meter.css';
2
+ export { Meter, meterTone, progressTone } from './Meter.js';
3
+ export type { MeterPolarity, MeterProps, MeterTone } from './Meter.js';
@@ -0,0 +1,3 @@
1
+ export { Meter, meterTone, progressTone } from '../chunk-YODNNSZL.js';
2
+ import '../chunk-BZFWDIV6.js';
3
+ import '../chunk-ODEQTPFM.js';