@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,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,49 @@
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
+ export interface MeterProps extends Omit<HTMLAttributes<HTMLDivElement>, 'title'> {
12
+ value: number;
13
+ max: number;
14
+ /**
15
+ * What is being measured. REQUIRED, and LINKED to the bar: the meter this
16
+ * replaces drew its legend as a sibling and named nothing, so a screen
17
+ * reader announced "meter, 62 percent" with no idea of what.
18
+ */
19
+ label: ReactNode;
20
+ /**
21
+ * The value in words, for a reader who is told the number rather than shown
22
+ * the bar: "12.4K of 20K tokens". Without one, the platform reads the raw
23
+ * value against the maximum, which is right for a plain count and wrong for
24
+ * anything with a unit.
25
+ */
26
+ valueText?: string | undefined;
27
+ /** Drawn at the trailing edge of the legend. Falls back to `valueText`. */
28
+ hint?: ReactNode;
29
+ /** Overrides the tone derived from the fill. */
30
+ tone?: MeterTone | undefined;
31
+ /**
32
+ * `compact` is the bar inside a table cell. Its legend drops a type step;
33
+ * the track does not, because the track is already the engine's 4px and
34
+ * there is nothing below four a fill still reads as a proportion in.
35
+ */
36
+ size?: 'default' | 'compact' | undefined;
37
+ /** Keep the label out of the picture. It stays in the accessibility tree. */
38
+ hideLabel?: boolean | undefined;
39
+ }
40
+ /** At the top it is a fault, near the top it wants a person, below that it is just a number. */
41
+ export declare function meterTone(percent: number): MeterTone;
42
+ /**
43
+ * A budget, a share, a fill.
44
+ *
45
+ * THE TRACK IS ALWAYS DRAWN. A bar with no track is a bar whose maximum the
46
+ * reader has to guess, and at 8 percent it is indistinguishable from a bar
47
+ * that is simply short.
48
+ */
49
+ export declare function Meter({ value, max, label, valueText, hint, tone, size, hideLabel, className, ...rest }: MeterProps): import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,3 @@
1
+ import './Meter.css';
2
+ export { Meter, meterTone } from './Meter.js';
3
+ export type { MeterProps, MeterTone } from './Meter.js';
@@ -0,0 +1,3 @@
1
+ export { Meter, meterTone } from '../chunk-LGCPQIOZ.js';
2
+ import '../chunk-BZFWDIV6.js';
3
+ import '../chunk-ODEQTPFM.js';
@@ -0,0 +1,87 @@
1
+ /*
2
+ * The meter.
3
+ *
4
+ * ITS FILL IS A MARK, so it takes the tone's FILL step, which is measured at
5
+ * 3:1 against every surface it can sit on. Nothing is written on it, which is
6
+ * what lets it be a fill rather than an ink: a percentage printed inside the
7
+ * bar would need a fourth measured pair for every tone.
8
+ */
9
+
10
+ .crewlet-meter {
11
+ display: flex;
12
+ flex-direction: column;
13
+ gap: var(--spacing-1);
14
+ min-width: 0;
15
+ }
16
+
17
+ /*
18
+ * The legend is the QUIET half. What a reader takes from a meter is the bar;
19
+ * the words under it name what is being measured and are read once. The engine
20
+ * sets the whole legend at the tertiary step, which still clears 4.5:1 on
21
+ * every ground.
22
+ */
23
+ .crewlet-meter__legend {
24
+ display: flex;
25
+ align-items: baseline;
26
+ justify-content: space-between;
27
+ gap: var(--spacing-2);
28
+ font-size: var(--font-size-xs);
29
+ color: var(--color-text-tertiary);
30
+ min-width: 0;
31
+ }
32
+
33
+ .crewlet-meter__label {
34
+ overflow: hidden;
35
+ text-overflow: ellipsis;
36
+ white-space: nowrap;
37
+ }
38
+
39
+ .crewlet-meter__hint {
40
+ font-variant-numeric: tabular-nums;
41
+ flex: none;
42
+ }
43
+
44
+ /*
45
+ * A 4px track, which is the engine's. A meter sits under a line of 12px text
46
+ * inside a card, and the 6px bar read as a divider rather than as a reading of
47
+ * something; four is the height at which the fill is still unmistakably a
48
+ * proportion and the bar is unmistakably chrome.
49
+ */
50
+ .crewlet-meter__track {
51
+ height: 4px;
52
+ border-radius: var(--radius-pill);
53
+ background: var(--color-surface-inset);
54
+ overflow: hidden;
55
+ }
56
+
57
+ .crewlet-meter__fill {
58
+ height: 100%;
59
+ border-radius: var(--radius-pill);
60
+ background: var(--color-brand-accent);
61
+ transition: width var(--motion-duration-slow) var(--motion-easing-emphasized);
62
+ }
63
+
64
+ .crewlet-meter__fill[data-tone='success'] { background: var(--color-feedback-success); }
65
+ .crewlet-meter__fill[data-tone='warning'] { background: var(--color-feedback-warning); }
66
+ .crewlet-meter__fill[data-tone='danger'] { background: var(--color-feedback-danger); }
67
+ /* The quiet reading is still a mark, so it takes the tertiary step rather than
68
+ the decoration one the engine spends here: a 4px bar has to clear 3:1 to be
69
+ seen at all, and --color-text-muted measures 2.33:1 on a light page and
70
+ 2.25:1 on a dark one at their worst grounds. The tertiary step measures
71
+ 4.87:1 and 4.65:1 on the same pair. */
72
+ .crewlet-meter__fill[data-tone='neutral'] { background: var(--color-text-tertiary); }
73
+
74
+ .crewlet-meter--compact .crewlet-meter__legend {
75
+ font-size: var(--font-size-2xs);
76
+ }
77
+
78
+ /*
79
+ * The bar arrives at its width rather than growing into it. A value that is
80
+ * pushed every second would otherwise be permanently in motion, which is the
81
+ * one thing a reader watching a budget does not need.
82
+ */
83
+ @media (prefers-reduced-motion: reduce) {
84
+ .crewlet-meter__fill {
85
+ transition: none;
86
+ }
87
+ }