@crewlethq/ui 0.4.4 → 0.5.1

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 (231) hide show
  1. package/README.md +888 -24
  2. package/dist/Accordion/index.js +2 -2
  3. package/dist/AddPill/index.js +1 -1
  4. package/dist/{AddPill-DFWXYLIQ.css → AddPill-IJQYCY6C.css} +9 -0
  5. package/dist/AppShell/AppShell.d.ts +26 -5
  6. package/dist/AppShell/index.js +3 -3
  7. package/dist/{AppShell-NVE6LHNI.css → AppShell-XARELGIH.css} +178 -25
  8. package/dist/Avatar/Avatar.d.ts +85 -40
  9. package/dist/Avatar/AvatarStack.d.ts +76 -0
  10. package/dist/Avatar/index.d.ts +5 -2
  11. package/dist/Avatar/index.js +1 -1
  12. package/dist/Avatar-XID7Z74C.css +200 -0
  13. package/dist/AvatarStack-GEJBNV7E.css +72 -0
  14. package/dist/BrandLockup/index.js +1 -1
  15. package/dist/{BrandLockup-6ISDEHPJ.css → BrandLockup-JKGXFCZF.css} +25 -19
  16. package/dist/Button/Button.d.ts +7 -2
  17. package/dist/Button/index.js +1 -1
  18. package/dist/{Button-D4J6B4MA.css → Button-X4B2TJAQ.css} +50 -19
  19. package/dist/Callout/index.js +1 -1
  20. package/dist/Canvas/index.js +4 -4
  21. package/dist/Card/Card.d.ts +9 -5
  22. package/dist/Card/index.js +1 -1
  23. package/dist/{Card-RLR254LD.css → Card-GLP7SUV6.css} +25 -18
  24. package/dist/Charts/BarList.d.ts +18 -1
  25. package/dist/Charts/ChartTooltip.d.ts +68 -0
  26. package/dist/Charts/StackedBar.d.ts +25 -7
  27. package/dist/Charts/StackedColumns.d.ts +112 -0
  28. package/dist/Charts/TimeSeries.d.ts +33 -2
  29. package/dist/Charts/dataColor.d.ts +22 -14
  30. package/dist/Charts/index.d.ts +6 -0
  31. package/dist/Charts/index.js +1 -1
  32. package/dist/Charts/useChartHover.d.ts +56 -0
  33. package/dist/Charts-B3YEF7R4.css +742 -0
  34. package/dist/Checkbox/index.js +1 -1
  35. package/dist/{Checkbox-VGW26YLQ.css → Checkbox-BOXQ747I.css} +2 -2
  36. package/dist/CodeBlock/index.js +4 -4
  37. package/dist/Combobox/index.js +5 -5
  38. package/dist/CommandPalette/CommandPalette.d.ts +97 -6
  39. package/dist/CommandPalette/index.d.ts +1 -1
  40. package/dist/CommandPalette/index.js +9 -7
  41. package/dist/CommandPalette-C5AMKGN2.css +259 -0
  42. package/dist/Copyable/index.js +3 -3
  43. package/dist/DataTable/index.js +7 -7
  44. package/dist/{DataTable-37UWTRN6.css → DataTable-OLHPF7D4.css} +35 -38
  45. package/dist/DataView/index.js +16 -16
  46. package/dist/{DataView-256YF32J.css → DataView-N6JX464S.css} +5 -4
  47. package/dist/DateTimePicker/index.js +5 -5
  48. package/dist/DiffList/index.js +1 -1
  49. package/dist/Disclosure/index.js +2 -2
  50. package/dist/EntityChip/EntityChip.d.ts +9 -12
  51. package/dist/EntityChip/index.d.ts +1 -1
  52. package/dist/EntityChip/index.js +2 -2
  53. package/dist/ErrorBoundary/index.js +2 -2
  54. package/dist/{ErrorBoundary-ME36CQTA.css → ErrorBoundary-U2PA3LY2.css} +4 -4
  55. package/dist/IconButton/index.js +1 -1
  56. package/dist/{IconButton-VQGNMJDI.css → IconButton-TVEUWK6L.css} +2 -2
  57. package/dist/ImageUpload/ImageUpload.d.ts +10 -7
  58. package/dist/ImageUpload/index.js +2 -2
  59. package/dist/{ImageUpload-HKFIZR6D.css → ImageUpload-YCHJMUGX.css} +24 -10
  60. package/dist/Input/index.js +2 -2
  61. package/dist/Kbd/Kbd.d.ts +14 -4
  62. package/dist/Kbd/index.js +1 -1
  63. package/dist/Kbd-JPLDVJIP.css +71 -0
  64. package/dist/Layer/index.js +1 -1
  65. package/dist/Link/index.js +1 -1
  66. package/dist/List/index.js +1 -1
  67. package/dist/{List-XTHESXLR.css → List-MYJIV6MP.css} +12 -2
  68. package/dist/ListInput/index.js +6 -6
  69. package/dist/Listbox/index.js +2 -2
  70. package/dist/Listbox/useListbox.d.ts +2 -0
  71. package/dist/{Listbox-ZXYYNN6U.css → Listbox-6WJNJQVQ.css} +32 -7
  72. package/dist/Menu/index.js +4 -4
  73. package/dist/Meter/Meter.d.ts +103 -16
  74. package/dist/Meter/index.d.ts +2 -2
  75. package/dist/Meter/index.js +1 -1
  76. package/dist/{Meter-SKOOXQBC.css → Meter-5VCSFMZW.css} +46 -7
  77. package/dist/Modal/index.js +4 -4
  78. package/dist/{Modal-XYQJ4BL6.css → Modal-JAYBS2KS.css} +13 -4
  79. package/dist/OrgLabel/OrgLabel.d.ts +60 -24
  80. package/dist/OrgLabel/index.d.ts +1 -1
  81. package/dist/OrgLabel/index.js +2 -1
  82. package/dist/{OrgLabel-D7U6QJZD.css → OrgLabel-CR233G34.css} +9 -18
  83. package/dist/OrgNode/index.js +3 -2
  84. package/dist/OrgTable/OrgTable.d.ts +2 -2
  85. package/dist/OrgTable/index.js +8 -7
  86. package/dist/Popover/index.js +2 -2
  87. package/dist/PricingCard/index.js +3 -3
  88. package/dist/{PricingCard-JFI7RYXP.css → PricingCard-7EFXRSD2.css} +4 -5
  89. package/dist/SearchTrigger/SearchTrigger.d.ts +23 -4
  90. package/dist/SearchTrigger/index.d.ts +1 -1
  91. package/dist/SearchTrigger/index.js +1 -1
  92. package/dist/SearchTrigger-Z5D4AAY7.css +112 -0
  93. package/dist/SegmentedControl/index.js +2 -2
  94. package/dist/SegmentedMeter/SegmentedMeter.d.ts +107 -0
  95. package/dist/SegmentedMeter/index.d.ts +3 -0
  96. package/dist/SegmentedMeter/index.js +2 -0
  97. package/dist/SegmentedMeter-KQNML2TW.css +109 -0
  98. package/dist/Select/index.js +3 -3
  99. package/dist/Shortcut/index.js +2 -2
  100. package/dist/SidebarNav/SidebarNav.d.ts +85 -25
  101. package/dist/SidebarNav/index.d.ts +1 -1
  102. package/dist/SidebarNav/index.js +1 -1
  103. package/dist/SidebarNav-X5NLZNWA.css +424 -0
  104. package/dist/StatCard/StatCard.d.ts +59 -12
  105. package/dist/StatCard/index.d.ts +1 -1
  106. package/dist/StatCard/index.js +1 -1
  107. package/dist/StatCard-KPAFD4E2.css +204 -0
  108. package/dist/StatGroup/index.js +1 -1
  109. package/dist/{StatGroup-TGB6AEKM.css → StatGroup-HVG6O62W.css} +8 -9
  110. package/dist/StatusDot/StatusDot.d.ts +24 -6
  111. package/dist/StatusDot/index.js +1 -1
  112. package/dist/StatusDot-7OMCQCZF.css +186 -0
  113. package/dist/Stepper/Stepper.d.ts +78 -0
  114. package/dist/Stepper/index.d.ts +3 -0
  115. package/dist/Stepper/index.js +4 -0
  116. package/dist/Stepper-HW4JM3YH.css +176 -0
  117. package/dist/Tabs/index.js +1 -1
  118. package/dist/{Tabs-MJ2E3VPK.css → Tabs-XCNPHA7B.css} +46 -26
  119. package/dist/Tag/Tag.d.ts +29 -22
  120. package/dist/Tag/index.js +2 -2
  121. package/dist/{Tag-VNZEYLB6.css → Tag-GBE7LQJP.css} +82 -83
  122. package/dist/TagsInput/index.js +7 -7
  123. package/dist/ThemeSwitcher/ThemeSwitcher.d.ts +53 -21
  124. package/dist/ThemeSwitcher/index.d.ts +3 -3
  125. package/dist/ThemeSwitcher/index.js +4 -3
  126. package/dist/ThemeSwitcher/preferences.d.ts +19 -5
  127. package/dist/ThemeToggle/ThemeToggle.d.ts +40 -0
  128. package/dist/ThemeToggle/index.d.ts +2 -0
  129. package/dist/ThemeToggle/index.js +5 -0
  130. package/dist/TimeWindowPicker/index.js +8 -8
  131. package/dist/Toaster/index.js +2 -2
  132. package/dist/Toolbar/index.js +2 -2
  133. package/dist/{Toolbar-IP6LXN45.css → Toolbar-HUOSMNTH.css} +3 -1
  134. package/dist/Tooltip/index.js +2 -2
  135. package/dist/Tree/index.d.ts +2 -2
  136. package/dist/Tree/index.js +1 -1
  137. package/dist/Tree/layout.d.ts +103 -28
  138. package/dist/TreeCanvas/TreeCanvas.d.ts +60 -14
  139. package/dist/TreeCanvas/index.d.ts +1 -1
  140. package/dist/TreeCanvas/index.js +6 -6
  141. package/dist/TreeCanvas/motion.d.ts +3 -2
  142. package/dist/{TreeCanvas-WBNQPHC7.css → TreeCanvas-HVOV4SQN.css} +154 -30
  143. package/dist/TreeGrid/index.js +4 -4
  144. package/dist/{chunk-F6OE5FH3.js → chunk-2FPENTCF.js} +1 -1
  145. package/dist/chunk-4AK52VHB.js +88 -0
  146. package/dist/{chunk-7EM5T4ME.js → chunk-4IQD3HUQ.js} +2 -2
  147. package/dist/{chunk-YODNNSZL.js → chunk-4PZ6FJKW.js} +43 -13
  148. package/dist/{chunk-F27EPQ7D.js → chunk-4UQ7SMPK.js} +1 -1
  149. package/dist/chunk-5QWIJSQM.js +73 -0
  150. package/dist/{chunk-KIC7BZYJ.js → chunk-6MU7HNB4.js} +6 -5
  151. package/dist/{chunk-S2XHHEW4.js → chunk-74KMX7YH.js} +4 -4
  152. package/dist/{chunk-WNI2WSJF.js → chunk-7KBNFFM3.js} +1 -1
  153. package/dist/{chunk-EFSG7HNU.js → chunk-AUS5FNQE.js} +1 -1
  154. package/dist/{chunk-CMEE37QJ.js → chunk-BMYPGGPV.js} +4 -4
  155. package/dist/{chunk-H4FBTAYS.js → chunk-BNCCEER3.js} +8 -8
  156. package/dist/chunk-C5WJUZVR.js +56 -0
  157. package/dist/{chunk-5WS6L6FA.js → chunk-CAIHUYXV.js} +9 -9
  158. package/dist/{chunk-5KSRXHOW.js → chunk-CQY5NTRS.js} +1 -1
  159. package/dist/{chunk-MW356IVK.js → chunk-D6EVJUGU.js} +2 -2
  160. package/dist/{chunk-7PEFUMQJ.js → chunk-DHPUMOTX.js} +2 -2
  161. package/dist/{chunk-HZ5XZNPS.js → chunk-DS2C73RJ.js} +3 -3
  162. package/dist/{chunk-GKHAKGOF.js → chunk-DSUY5F4E.js} +3 -3
  163. package/dist/{chunk-Q4ZPPART.js → chunk-EFYPAJT3.js} +3 -3
  164. package/dist/{chunk-PATXSJGR.js → chunk-ERVO6OUF.js} +17 -17
  165. package/dist/{chunk-BZYDZBAN.js → chunk-ETYEBKR4.js} +3 -3
  166. package/dist/{chunk-CC67MUUO.js → chunk-FD5UEN6X.js} +30 -30
  167. package/dist/{chunk-5SDBMKUO.js → chunk-FIFNP6PL.js} +3 -3
  168. package/dist/{chunk-7HPRF5XN.js → chunk-FUF52K7E.js} +98 -16
  169. package/dist/{chunk-5KPQ6D7N.js → chunk-FZVJDJFN.js} +2 -2
  170. package/dist/chunk-IA232OTU.js +156 -0
  171. package/dist/{chunk-2EOKFKHX.js → chunk-IG27QX7Q.js} +7 -7
  172. package/dist/chunk-IKB6HFGK.js +55 -0
  173. package/dist/{chunk-T43A26SD.js → chunk-IPVQKAHO.js} +6 -6
  174. package/dist/{chunk-3EYF6HKB.js → chunk-IVFJD7WY.js} +28 -9
  175. package/dist/{chunk-XJWXPRSK.js → chunk-JGRNTBF2.js} +11 -11
  176. package/dist/chunk-K3OWD7BJ.js +121 -0
  177. package/dist/{chunk-6KCO2D5C.js → chunk-KD4H66L6.js} +7 -20
  178. package/dist/{chunk-SFZOKW2G.js → chunk-KJ34ZBBI.js} +8 -3
  179. package/dist/{chunk-AQTBF4EB.js → chunk-LFHCXZO5.js} +5 -5
  180. package/dist/{chunk-LWKJQTOM.js → chunk-MICH6QSJ.js} +1 -1
  181. package/dist/chunk-N3DPO6HG.js +226 -0
  182. package/dist/{chunk-S4GZWSKR.js → chunk-OM5E3TTK.js} +1 -1
  183. package/dist/{chunk-3QRYCPXQ.js → chunk-OPKIKM35.js} +6 -6
  184. package/dist/{chunk-5EKIWVOR.js → chunk-PGRPNDWM.js} +2 -2
  185. package/dist/{chunk-FSOW3ARP.js → chunk-PQNILU27.js} +9 -9
  186. package/dist/{chunk-QNCVHRZL.js → chunk-QVAFL2LE.js} +1 -1
  187. package/dist/{chunk-Q3B66TJM.js → chunk-QY7UU5ZB.js} +1 -1
  188. package/dist/{chunk-ITHXJHBB.js → chunk-R25RGPUB.js} +1 -0
  189. package/dist/{chunk-KLJCCMF3.js → chunk-R6735B37.js} +2 -2
  190. package/dist/{chunk-3ZP55QZE.js → chunk-R6FBDTP3.js} +4 -4
  191. package/dist/{chunk-7FZ53WDJ.js → chunk-RIAZM6L3.js} +1 -1
  192. package/dist/chunk-RJM4QCGG.js +550 -0
  193. package/dist/{chunk-NTRZGNEX.js → chunk-S3BCVWTU.js} +215 -46
  194. package/dist/chunk-S7KW47IQ.js +121 -0
  195. package/dist/{chunk-KNYYCWMK.js → chunk-SJQ546ID.js} +4 -4
  196. package/dist/{chunk-D35VTV2Z.js → chunk-SV7QAONL.js} +1 -1
  197. package/dist/{chunk-IAJLHVUA.js → chunk-TIWAHZZ6.js} +1 -1
  198. package/dist/{chunk-2PRH365R.js → chunk-UA7O3KKJ.js} +1 -1
  199. package/dist/{chunk-NPZY6YYL.js → chunk-UG5ZMAXW.js} +6 -6
  200. package/dist/{chunk-NDCATSW7.js → chunk-V34H2YCY.js} +1 -1
  201. package/dist/chunk-WIATRXEJ.js +22 -0
  202. package/dist/{chunk-5C5YMZQU.js → chunk-WOFOMTGB.js} +16 -10
  203. package/dist/{chunk-QYOFACSP.js → chunk-WSOFKOLP.js} +3 -3
  204. package/dist/{chunk-MNAXYY3R.js → chunk-WUVZDFHS.js} +31 -11
  205. package/dist/{chunk-DB2VDLVR.js → chunk-YIMOT5OO.js} +10 -10
  206. package/dist/{chunk-2ZQMA2WB.js → chunk-ZPSOF6VL.js} +2 -2
  207. package/dist/generated/index.d.ts +3 -0
  208. package/dist/generated/index.js +70 -66
  209. package/dist/index.js +70 -66
  210. package/dist/styles.css +2538 -741
  211. package/dist/utils/index.d.ts +1 -1
  212. package/dist/utils/tone.d.ts +7 -12
  213. package/package.json +4 -4
  214. package/scripts/check-css-literals.mjs +159 -23
  215. package/scripts/check-css-variables.mjs +5 -3
  216. package/scripts/css-source.mjs +97 -5
  217. package/dist/Avatar-P2KRQM2B.css +0 -156
  218. package/dist/Charts-D7G2BSXH.css +0 -277
  219. package/dist/CommandPalette-CSJDUCQA.css +0 -115
  220. package/dist/Kbd-W66MXQI5.css +0 -61
  221. package/dist/SearchTrigger-QXOYAUUY.css +0 -79
  222. package/dist/SidebarNav-QGSFKZYA.css +0 -319
  223. package/dist/StatCard-KYPKZUWX.css +0 -111
  224. package/dist/StatusDot-HA2L2FSX.css +0 -84
  225. package/dist/chunk-22O7LAW2.js +0 -41
  226. package/dist/chunk-AJNCATWZ.js +0 -144
  227. package/dist/chunk-F4PJZ4ED.js +0 -245
  228. package/dist/chunk-PNFASD6F.js +0 -98
  229. package/dist/chunk-PZSWF74H.js +0 -15
  230. package/dist/chunk-R66KLW7S.js +0 -143
  231. /package/dist/{chunk-ZCR6YGQ4.js → chunk-PKIN4IMB.js} +0 -0
@@ -31,7 +31,10 @@
31
31
  .crewlet-tree-canvas__card,
32
32
  .crewlet-tree-canvas__links,
33
33
  .crewlet-tree-canvas__gap,
34
- .crewlet-tree-canvas__margin {
34
+ .crewlet-tree-canvas__margin,
35
+ .crewlet-tree-canvas__group,
36
+ .crewlet-tree-canvas__group-head,
37
+ .crewlet-tree-canvas__group-pad {
35
38
  position: absolute;
36
39
  top: 0;
37
40
  left: 0;
@@ -170,15 +173,6 @@
170
173
  --crewlet-tree-canvas-card-accent: var(--color-node-blue);
171
174
  }
172
175
 
173
- /*
174
- * A card that stands for somebody outside the system takes the dashed edge
175
- * every such seat wears. The BOUNDARY says it rather than a hue, so it reads
176
- * to somebody who cannot separate the hue at all.
177
- */
178
- .crewlet-tree-canvas__card--outline {
179
- border-style: dashed;
180
- }
181
-
182
176
  /*
183
177
  * THE NODES INSIDE THE CARD. `role="treeitem"` is this component's own
184
178
  * contract, handed to the caller by `ctx.item(id)`, so the inset a node sits
@@ -338,13 +332,13 @@
338
332
  /*
339
333
  * A reveal is a state change rather than an entrance, so under reduced motion
340
334
  * it simply happens. The control is still shown and still reached the same way.
335
+ * The `node` appearance's own quiet controls are stopped in its own section,
336
+ * below the rules that start them: named here, above those rules, the stops
337
+ * tied with them on specificity and lost on source order.
341
338
  */
342
339
  @media (prefers-reduced-motion: reduce) {
343
340
  .crewlet-tree-canvas__actions,
344
- .crewlet-tree-canvas__under,
345
- .crewlet-tree-canvas--node .crewlet-tree-canvas__under > :not(.crewlet-add-pill),
346
- .crewlet-tree-canvas--node .crewlet-org-node__leading,
347
- .crewlet-tree-canvas--node .crewlet-org-node-lead__clear {
341
+ .crewlet-tree-canvas__under {
348
342
  transition: none;
349
343
  }
350
344
  }
@@ -376,6 +370,92 @@
376
370
  pointer-events: none;
377
371
  }
378
372
 
373
+ /* ---------------------------------------------------------------------------
374
+ * A GROUP: a box round a run of sibling cards, with a label along its top.
375
+ *
376
+ * The approved design's unit box: a hairline on the card rung with the unit's
377
+ * name in the tertiary ink at 12px, and the project key chip at the end of
378
+ * that line. The hairline is `--color-border-default` over
379
+ * `--color-surface-subtle` standing on the canvas's own ground, which is the
380
+ * pair the palette suite already holds to a visible step (the card hairline
381
+ * rule); a card inside the box is the same rung and is found by its own
382
+ * hairline, exactly as a card on a sheet is.
383
+ *
384
+ * THE ROOM IS THE LAYOUT'S. The padding round the members is the probe below,
385
+ * and the room above them is the header's own measured height, so the box is
386
+ * never drawn over a card it does not hold and a branch is never run through
387
+ * it: both are reserved by `layoutForest` before anything is placed.
388
+ * ------------------------------------------------------------------------- */
389
+
390
+ /*
391
+ * The room beside and below a group's members, as a token: `--spacing-3`,
392
+ * which is also the label's own inset, so the label starts on the line the
393
+ * first member's edge does.
394
+ */
395
+ .crewlet-tree-canvas__group-pad {
396
+ width: var(--spacing-3);
397
+ height: var(--spacing-3);
398
+ visibility: hidden;
399
+ pointer-events: none;
400
+ }
401
+
402
+ /*
403
+ * THE BOX IS DASHED, as the approved org chart draws a unit: a card's own
404
+ * edge is solid, and a box round several cards drawn the same way read as one
405
+ * more, larger card. A dash says the edge is a grouping rather than a thing.
406
+ * It is the STRONG border step, the artboard's, because a dash spends half its
407
+ * length on gaps: at the plain hairline's step the edge all but disappeared
408
+ * against the box's own fill.
409
+ */
410
+ .crewlet-tree-canvas__group {
411
+ box-sizing: border-box;
412
+ background: var(--color-surface-subtle);
413
+ border: 1px dashed var(--color-border-strong);
414
+ border-radius: var(--radius-xl);
415
+ pointer-events: none;
416
+ }
417
+
418
+ /*
419
+ * THE LABEL'S LINE, and what the room above the members is measured from: one
420
+ * line, at the box's width, truncated rather than wrapped, because a label
421
+ * that wrapped would move every rank below it.
422
+ */
423
+ .crewlet-tree-canvas__group-head {
424
+ box-sizing: border-box;
425
+ display: flex;
426
+ align-items: center;
427
+ gap: var(--spacing-2);
428
+ padding: var(--spacing-2) var(--spacing-3);
429
+ font-size: var(--font-size-xs);
430
+ line-height: var(--font-line-height-snug);
431
+ color: var(--color-text-tertiary);
432
+ white-space: nowrap;
433
+ pointer-events: none;
434
+ }
435
+
436
+ /*
437
+ * ON THE BOX'S OWN FILL, over the branches: a branch dropping into a member
438
+ * passes behind the words rather than striking through them, and the fill is
439
+ * the box's, so nothing about the label reads as a second surface.
440
+ */
441
+ .crewlet-tree-canvas__group-label,
442
+ .crewlet-tree-canvas__group-lead {
443
+ background: var(--color-surface-subtle);
444
+ }
445
+
446
+ .crewlet-tree-canvas__group-label {
447
+ min-width: 0;
448
+ overflow: hidden;
449
+ text-overflow: ellipsis;
450
+ }
451
+
452
+ /* The key AHEAD of the name, a project key chip, never cut: the name after
453
+ it is what gives way when the line is short. */
454
+ .crewlet-tree-canvas__group-lead {
455
+ display: inline-flex;
456
+ flex: none;
457
+ }
458
+
379
459
  /* ---------------------------------------------------------------------------
380
460
  * THE CHART ARRIVING, AND REARRANGING.
381
461
  *
@@ -392,11 +472,16 @@
392
472
  * ------------------------------------------------------------------------- */
393
473
 
394
474
  .crewlet-tree-canvas__card[data-enter='waiting'],
395
- .crewlet-tree-canvas__links path[data-enter='waiting'] {
475
+ .crewlet-tree-canvas__links path[data-enter='waiting'],
476
+ .crewlet-tree-canvas__group[data-enter='waiting'],
477
+ .crewlet-tree-canvas__group-head[data-enter='waiting'] {
396
478
  opacity: 0;
397
479
  }
398
480
 
399
- .crewlet-tree-canvas__card[data-enter='shown'] {
481
+ /* A group arrives with its first member, at the card's pace. */
482
+ .crewlet-tree-canvas__card[data-enter='shown'],
483
+ .crewlet-tree-canvas__group[data-enter='shown'],
484
+ .crewlet-tree-canvas__group-head[data-enter='shown'] {
400
485
  animation: crewlet-tree-canvas-arrive var(--motion-duration-slow) var(--motion-easing-default) both;
401
486
  }
402
487
 
@@ -422,9 +507,20 @@
422
507
  * when the setting changed.
423
508
  */
424
509
  @media (prefers-reduced-motion: reduce) {
510
+ /* Drawn, whatever step of the entrance it had reached: a card still WAITING
511
+ is otherwise held at nothing. */
425
512
  .crewlet-tree-canvas__card[data-enter],
426
- .crewlet-tree-canvas__links path[data-enter] {
513
+ .crewlet-tree-canvas__links path[data-enter],
514
+ .crewlet-tree-canvas__group[data-enter],
515
+ .crewlet-tree-canvas__group-head[data-enter] {
427
516
  opacity: 1;
517
+ }
518
+
519
+ /* And the entrance stopped by the selectors that start it. */
520
+ .crewlet-tree-canvas__card[data-enter='shown'],
521
+ .crewlet-tree-canvas__links path[data-enter='shown'],
522
+ .crewlet-tree-canvas__group[data-enter='shown'],
523
+ .crewlet-tree-canvas__group-head[data-enter='shown'] {
428
524
  animation: none;
429
525
  }
430
526
  }
@@ -436,10 +532,11 @@
436
532
 
437
533
  /*
438
534
  * THE CONNECTORS ARE THE CONTENT, and they take the step that is measured to
439
- * be resolvable. The SHAPE is `layoutConnectors`, which draws a rounded step
440
- * from each parent's bottom into each child's top; what is decided here is only
441
- * how dark it is, and that the joins are round so a corner reads as a turn
442
- * rather than as two lines meeting.
535
+ * be resolvable. The SHAPE is `layoutConnectors`, which draws an orthogonal
536
+ * elbow from each parent's bottom into each child's top, in SVG attributes
537
+ * the layout computes rather than in a style a policy has to allow; what is
538
+ * decided here is only how dark and how heavy it is, and that the joins are
539
+ * round so a corner reads as a turn rather than as two lines meeting.
443
540
  *
444
541
  * A connector is the only thing on the chart that says who reports to whom:
445
542
  * remove it and the picture is a scatter of cards. That makes it a graphical
@@ -450,11 +547,22 @@
450
547
  * boundary step, which the palette suite already holds at 3:1 on every ground,
451
548
  * measures 4.83:1 and 4.78:1. Darker than the chart this is drawn from, and
452
549
  * deliberately: there the hierarchy was a line a reader had to hunt for.
550
+ *
551
+ * THE APPROVED DESIGN DRAWS IT IN `--color-border-strong`, AND THE FLOOR WINS.
552
+ * The artboard's connector is the strong border step at 1.5px, and on the
553
+ * canvas's ground that step measures 1.45:1 in dark and 1.43:1 in light (1.40
554
+ * and 1.50 on a group box's card rung): a line a reader cannot make out, for
555
+ * the one mark that says who reports to whom. The palette suite's data-mark
556
+ * table holds a chart's connector to 3:1 on `--color-border-control`, so the
557
+ * value moves up the border family to the first step that clears it, 4.40:1
558
+ * and 4.04:1 (4.25 and 4.26 on the card rung). The WEIGHT is the design's:
559
+ * 1.5px, heavier than the hairline this used to be, so a branch between two
560
+ * ranks of 90px cards reads as a line of the chart rather than as a seam.
453
561
  */
454
562
  .crewlet-tree-canvas__links path {
455
563
  fill: none;
456
564
  stroke: var(--color-border-control);
457
- stroke-width: 1;
565
+ stroke-width: 1.5;
458
566
  stroke-linecap: round;
459
567
  stroke-linejoin: round;
460
568
  }
@@ -829,6 +937,20 @@
829
937
  pointer-events: auto;
830
938
  }
831
939
 
940
+ /*
941
+ * The node's quiet controls arrive as a state change too, so under reduced
942
+ * motion they simply appear. Stopped HERE, after the rules that start their
943
+ * fades: the three selectors tie with those rules on specificity, so the stop
944
+ * has to come later in the file to win.
945
+ */
946
+ @media (prefers-reduced-motion: reduce) {
947
+ .crewlet-tree-canvas--node .crewlet-tree-canvas__under > :not(.crewlet-add-pill),
948
+ .crewlet-tree-canvas--node .crewlet-org-node__leading,
949
+ .crewlet-tree-canvas--node .crewlet-org-node-lead__clear {
950
+ transition: none;
951
+ }
952
+ }
953
+
832
954
  /*
833
955
  * THE BRANCHES ARE HEAVIER HERE. A node is half the height of a card, so a
834
956
  * hairline between two ranks of them is a thread; this is the console chart's
@@ -929,12 +1051,11 @@
929
1051
  * chart this package is drawn to match does exactly this, and every step below
930
1052
  * is its step.
931
1053
  *
932
- * IT IS THE ONLY DASHED THING ON THE CHART THAT IS NOT A HUMAN SEAT, and the
933
- * two never collide: `cardOutline` marks a node of the data and this marks a
934
- * node that is not one yet, so no card can carry both. What tells them apart
935
- * is the hue and the breath: a human seat's edge is the chart's own boundary
936
- * step and does not move, and this one is the accent, with a ring outside it
937
- * that pulses for as long as the form is open.
1054
+ * IT IS THE ONLY DASHED CARD ON THE CHART, because a dashed edge marks a
1055
+ * place nothing fills yet and this is the one card that is not a node of the
1056
+ * data. Every node's card is solid, a person's seat included: who holds a seat
1057
+ * is its badge's outline, never the card's frame, which is why the chart has
1058
+ * no second dashed card for a person to be confused with this one.
938
1059
  *
939
1060
  * ITS GROUND IS EVERY OTHER CARD'S. The ghost holds a real form with real
940
1061
  * labels, helps and refusals in it, so it is NOT tinted: every contrast
@@ -1078,8 +1199,11 @@
1078
1199
  @media (prefers-reduced-motion: reduce) {
1079
1200
  /* NOT `transform` on the card itself: its transform is where the layout
1080
1201
  put it, written as an inline style, and a rule here saying `none` would
1081
- be a rule that only ever fires when something else drops that style. */
1082
- .crewlet-tree-canvas__card--composing,
1202
+ be a rule that only ever fires when something else drops that style.
1203
+ Named with the chart's class, as the rule that starts its arrival names
1204
+ it: by its own class alone the stop was one class short of that rule,
1205
+ and the arrival played for a reader who had asked for none. */
1206
+ .crewlet-tree-canvas .crewlet-tree-canvas__card--composing,
1083
1207
  .crewlet-tree-canvas__links path[data-composing='true'] {
1084
1208
  opacity: 1;
1085
1209
  animation: none;
@@ -1,8 +1,8 @@
1
- export { TreeGrid } from '../chunk-5SDBMKUO.js';
2
- import '../chunk-NTRZGNEX.js';
1
+ export { TreeGrid } from '../chunk-FIFNP6PL.js';
2
+ import '../chunk-S3BCVWTU.js';
3
3
  import '../chunk-53DVJCVW.js';
4
4
  import '../chunk-7RPGY3JE.js';
5
- import '../chunk-ITHXJHBB.js';
6
- import '../chunk-F27EPQ7D.js';
5
+ import '../chunk-R25RGPUB.js';
6
+ import '../chunk-4UQ7SMPK.js';
7
7
  import '../chunk-BZFWDIV6.js';
8
8
  import '../chunk-ODEQTPFM.js';
@@ -1,4 +1,4 @@
1
- import { isComposing, isModalLayerOpen } from './chunk-ITHXJHBB.js';
1
+ import { isComposing, isModalLayerOpen } from './chunk-R25RGPUB.js';
2
2
  import { useRef, useEffect } from 'react';
3
3
 
4
4
  var TYPING_ROLES = /* @__PURE__ */ new Set(["combobox", "listbox", "textbox", "searchbox", "spinbutton"]);
@@ -0,0 +1,88 @@
1
+ import { cx } from './chunk-ODEQTPFM.js';
2
+ import './SegmentedMeter-KQNML2TW.css';
3
+ import { jsxs, jsx } from 'react/jsx-runtime';
4
+
5
+ function settle(difference, scale) {
6
+ if (Math.abs(difference) <= scale * 1e-12) return 0;
7
+ return Number(difference.toPrecision(12));
8
+ }
9
+ function checked(segments, total) {
10
+ const seen = /* @__PURE__ */ new Set();
11
+ for (const segment of segments) {
12
+ if (seen.has(segment.id)) {
13
+ throw new RangeError(`SegmentedMeter segment ids must be unique; "${segment.id}" is used twice`);
14
+ }
15
+ seen.add(segment.id);
16
+ if (!Number.isFinite(segment.value) || segment.value < 0) {
17
+ throw new RangeError(
18
+ `SegmentedMeter segment "${segment.id}" must be a finite count of at least 0; it was ${segment.value}`
19
+ );
20
+ }
21
+ }
22
+ if (total !== void 0 && (!Number.isFinite(total) || total < 0)) {
23
+ throw new RangeError(`SegmentedMeter total must be a finite count of at least 0; it was ${total}`);
24
+ }
25
+ }
26
+ function measure(segments, total) {
27
+ const sum = segments.reduce((running, segment) => running + segment.value, 0);
28
+ const whole = total ?? sum;
29
+ const scale = Math.max(whole, sum);
30
+ const remainder = Math.max(0, settle(whole - sum, scale));
31
+ return { whole, scale, remainder };
32
+ }
33
+ function segmentedMeterLabel(segments, total, remainderLabel) {
34
+ checked(segments, total);
35
+ const { whole, remainder } = measure(segments, total);
36
+ const words = segments.filter((segment) => segment.value > 0).map((segment) => `${segment.value} ${segment.label}`);
37
+ if (remainder > 0 && remainderLabel !== void 0) words.push(`${remainder} ${remainderLabel}`);
38
+ return `${words.length === 0 ? "0" : words.join(", ")} of ${whole}`;
39
+ }
40
+ function SegmentedMeter({
41
+ segments,
42
+ total,
43
+ remainderLabel,
44
+ size = "default",
45
+ label,
46
+ decorative = false,
47
+ className,
48
+ style,
49
+ ...rest
50
+ }) {
51
+ checked(segments, total);
52
+ const { scale, remainder } = measure(segments, total);
53
+ const parts = segments.filter((segment) => segment.value > 0);
54
+ const share = (value) => `${value / scale * 100}%`;
55
+ const leftover = scale === 0 ? "100%" : remainder > 0 ? share(remainder) : null;
56
+ const drawn = parts.length + (leftover === null ? 0 : 1);
57
+ return /* @__PURE__ */ jsxs(
58
+ "div",
59
+ {
60
+ ...rest,
61
+ className: cx("crewlet-segmented-meter", `crewlet-segmented-meter--${size}`, className),
62
+ style: { "--crewlet-segmented-meter-count": drawn, ...style },
63
+ role: decorative ? void 0 : "img",
64
+ "aria-label": decorative ? void 0 : label ?? segmentedMeterLabel(segments, total, remainderLabel),
65
+ "aria-hidden": decorative ? true : void 0,
66
+ children: [
67
+ parts.map((segment) => /* @__PURE__ */ jsx(
68
+ "span",
69
+ {
70
+ className: "crewlet-segmented-meter__segment",
71
+ "data-tone": segment.tone,
72
+ style: { flexBasis: share(segment.value) }
73
+ },
74
+ segment.id
75
+ )),
76
+ leftover === null ? null : /* @__PURE__ */ jsx(
77
+ "span",
78
+ {
79
+ className: "crewlet-segmented-meter__segment crewlet-segmented-meter__remainder",
80
+ style: { flexBasis: leftover }
81
+ }
82
+ )
83
+ ]
84
+ }
85
+ );
86
+ }
87
+
88
+ export { SegmentedMeter, segmentedMeterLabel };
@@ -1,5 +1,5 @@
1
- import { Button } from './chunk-BZYDZBAN.js';
2
- import './ErrorBoundary-ME36CQTA.css';
1
+ import { Button } from './chunk-ETYEBKR4.js';
2
+ import './ErrorBoundary-U2PA3LY2.css';
3
3
  import { Component } from 'react';
4
4
  import { jsxs, jsx } from 'react/jsx-runtime';
5
5
 
@@ -1,29 +1,58 @@
1
1
  import { VisuallyHidden } from './chunk-BZFWDIV6.js';
2
2
  import { cx } from './chunk-ODEQTPFM.js';
3
- import './Meter-SKOOXQBC.css';
3
+ import './Meter-5VCSFMZW.css';
4
4
  import { useId } from 'react';
5
5
  import { jsxs, jsx } from 'react/jsx-runtime';
6
6
 
7
+ var METER_STATES = Object.freeze(["ok", "near", "refusing"]);
8
+ var DEFAULT_METER_THRESHOLDS = Object.freeze({ near: 0.75 });
9
+ var STATE_TONES = {
10
+ ok: "quantity",
11
+ near: "warning",
12
+ refusing: "danger"
13
+ };
14
+ function meterStateTone(state) {
15
+ if (!Object.hasOwn(STATE_TONES, state)) {
16
+ throw new RangeError(`Meter state must be one of ${METER_STATES.join(", ")}; it was ${String(state)}`);
17
+ }
18
+ return STATE_TONES[state];
19
+ }
20
+ function meterState(fraction, thresholds = DEFAULT_METER_THRESHOLDS) {
21
+ const { near } = thresholds;
22
+ if (!Number.isFinite(near) || near <= 0 || near > 1) {
23
+ throw new RangeError(`Meter thresholds.near must be a fraction of the limit above 0 and at most 1; it was ${near}`);
24
+ }
25
+ if (fraction >= 1) return "refusing";
26
+ if (fraction >= near) return "near";
27
+ return "ok";
28
+ }
7
29
  function meterTone(percent) {
8
- if (percent >= 100) return "danger";
9
- if (percent >= 75) return "warning";
10
- return "brand";
30
+ return meterStateTone(meterState(percent / 100));
11
31
  }
12
32
  function progressTone(percent) {
13
- return percent >= 100 ? "success" : "brand";
33
+ return percent >= 100 ? "success" : "quantity";
34
+ }
35
+ function drawnTone({
36
+ state,
37
+ tone,
38
+ polarity = "spent",
39
+ thresholds
40
+ }, fraction, percent) {
41
+ if (state !== void 0) return meterStateTone(state);
42
+ if (tone !== void 0) return tone;
43
+ if (polarity === "progress") return progressTone(percent);
44
+ return meterStateTone(meterState(fraction, thresholds));
14
45
  }
15
- var RAMPS = {
16
- spent: meterTone,
17
- progress: progressTone
18
- };
19
46
  function Meter({
20
47
  value,
21
48
  max,
22
49
  label,
23
50
  valueText,
24
51
  hint,
52
+ state,
25
53
  tone,
26
- polarity = "spent",
54
+ polarity,
55
+ thresholds,
27
56
  size = "default",
28
57
  hideLabel = false,
29
58
  className,
@@ -31,8 +60,9 @@ function Meter({
31
60
  }) {
32
61
  const labelId = useId();
33
62
  const bounded = max > 0;
34
- const percent = bounded ? Math.min(100, Math.max(0, value / max * 100)) : 0;
35
- const drawn = tone ?? RAMPS[polarity](percent);
63
+ const fraction = bounded ? value / max : 0;
64
+ const percent = bounded ? Math.min(100, Math.max(0, fraction * 100)) : 0;
65
+ const drawn = drawnTone({ state, tone, polarity, thresholds }, fraction, percent);
36
66
  const trailing = hint ?? valueText;
37
67
  const reported = bounded ? Math.min(max, Math.max(0, value)) : value;
38
68
  const spoken = bounded ? valueText ?? (reported === value ? void 0 : `${value} of ${max}`) : void 0;
@@ -60,4 +90,4 @@ function Meter({
60
90
  ] });
61
91
  }
62
92
 
63
- export { Meter, meterTone, progressTone };
93
+ export { DEFAULT_METER_THRESHOLDS, METER_STATES, Meter, meterState, meterStateTone, meterTone, progressTone };
@@ -1,6 +1,6 @@
1
1
  import { VisuallyHidden } from './chunk-BZFWDIV6.js';
2
2
  import { cx } from './chunk-ODEQTPFM.js';
3
- import './IconButton-VQGNMJDI.css';
3
+ import './IconButton-TVEUWK6L.css';
4
4
  import { forwardRef, useId, Children, isValidElement, cloneElement } from 'react';
5
5
  import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
6
6
 
@@ -0,0 +1,73 @@
1
+ import { StatusDot } from './chunk-WIATRXEJ.js';
2
+ import { VisuallyHidden } from './chunk-BZFWDIV6.js';
3
+ import { cx } from './chunk-ODEQTPFM.js';
4
+ import './Stepper-HW4JM3YH.css';
5
+ import { CheckGlyph } from '@crewlethq/icons/glyphs';
6
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
7
+
8
+ function Stepper({
9
+ steps,
10
+ current,
11
+ label,
12
+ tone = "info",
13
+ pulse = false,
14
+ doneLabel = "Done",
15
+ className,
16
+ ...rest
17
+ }) {
18
+ const seen = /* @__PURE__ */ new Set();
19
+ for (const step of steps) {
20
+ if (seen.has(step.id)) throw new RangeError(`Stepper step ids must be unique; "${step.id}" is used twice`);
21
+ seen.add(step.id);
22
+ }
23
+ const at = current === null ? steps.length : steps.findIndex((step) => step.id === current);
24
+ if (at < 0) {
25
+ throw new RangeError(
26
+ `Stepper current must be the id of one of its steps, or null once every step is done; "${current}" is not one of ${steps.map((step) => `"${step.id}"`).join(", ")}`
27
+ );
28
+ }
29
+ if (steps.length === 0) return null;
30
+ const stateOf = (index) => index < at ? "done" : index === at ? "current" : "later";
31
+ return (
32
+ /*
33
+ * `role="list"` although an `ol` already has one, which is why the lint
34
+ * rule that calls it redundant is silenced here rather than obeyed, as
35
+ * `Legend` and `DiffList` silence it: the stylesheet takes the markers off,
36
+ * and WebKit answers a marker-less list as a group of paragraphs, so a
37
+ * reader would no longer be told how many steps there are before hearing
38
+ * them. The role puts that back.
39
+ */
40
+ // eslint-disable-next-line jsx-a11y/no-redundant-roles
41
+ /* @__PURE__ */ jsx(
42
+ "ol",
43
+ {
44
+ ...rest,
45
+ role: "list",
46
+ className: cx("crewlet-stepper", `crewlet-stepper--${tone}`, className),
47
+ "aria-label": label,
48
+ children: steps.map((step, index) => {
49
+ const state = stateOf(index);
50
+ return /* @__PURE__ */ jsx(
51
+ "li",
52
+ {
53
+ className: cx("crewlet-stepper__step", `crewlet-stepper__step--${state}`),
54
+ "aria-current": state === "current" ? "step" : void 0,
55
+ children: /* @__PURE__ */ jsxs("span", { className: "crewlet-stepper__chip", children: [
56
+ state === "done" ? /* @__PURE__ */ jsxs(Fragment, { children: [
57
+ /* @__PURE__ */ jsx(CheckGlyph, { size: "xs", className: "crewlet-stepper__check" }),
58
+ /* @__PURE__ */ jsx(VisuallyHidden, { children: doneLabel }),
59
+ " "
60
+ ] }) : null,
61
+ state === "current" ? /* @__PURE__ */ jsx(StatusDot, { tone, pulse, className: "crewlet-stepper__dot" }) : null,
62
+ /* @__PURE__ */ jsx("span", { className: "crewlet-stepper__label", children: step.label })
63
+ ] })
64
+ },
65
+ step.id
66
+ );
67
+ })
68
+ }
69
+ )
70
+ );
71
+ }
72
+
73
+ export { Stepper };
@@ -1,5 +1,5 @@
1
- import { usePopupLayer, isComposing } from './chunk-ITHXJHBB.js';
2
- import './Listbox-ZXYYNN6U.css';
1
+ import { usePopupLayer, isComposing } from './chunk-R25RGPUB.js';
2
+ import './Listbox-6WJNJQVQ.css';
3
3
  import { useState, useRef, useCallback, useEffect } from 'react';
4
4
 
5
5
  function useListbox({
@@ -25,13 +25,13 @@ function useListbox({
25
25
  );
26
26
  useEffect(() => {
27
27
  const box = list.current;
28
- const row = box?.querySelector('[aria-selected="true"]');
29
- if (!box || !row) return;
28
+ const row = active >= 0 ? document.getElementById(`${listId}-${active}`) : null;
29
+ if (!box || !row || !box.contains(row)) return;
30
30
  const bounds = box.getBoundingClientRect();
31
31
  const spot = row.getBoundingClientRect();
32
32
  if (spot.top < bounds.top) box.scrollTop -= bounds.top - spot.top;
33
33
  else if (spot.bottom > bounds.bottom) box.scrollTop += spot.bottom - bounds.bottom;
34
- }, [active, count, open]);
34
+ }, [active, count, open, listId]);
35
35
  function onKeyDown(event) {
36
36
  if (!open || isComposing(event)) return false;
37
37
  if (event.key === "Escape") {
@@ -52,6 +52,7 @@ function useListbox({
52
52
  setAt((active - 1 + count) % count);
53
53
  return true;
54
54
  case "Enter":
55
+ if (event.metaKey || event.ctrlKey || event.altKey) return false;
55
56
  event.preventDefault();
56
57
  onCommit(active);
57
58
  return true;
@@ -1,7 +1,7 @@
1
- import { StatusDot } from './chunk-PZSWF74H.js';
1
+ import { StatusDot } from './chunk-WIATRXEJ.js';
2
2
  import { cx } from './chunk-ODEQTPFM.js';
3
- import './Tag-VNZEYLB6.css';
4
- import { CloseGlyph } from '@crewlethq/icons/glyphs';
3
+ import './Tag-GBE7LQJP.css';
4
+ import { XGlyph } from '@crewlethq/icons/glyphs';
5
5
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
6
6
 
7
7
  function Tag(props) {
@@ -63,7 +63,7 @@ function Tag(props) {
63
63
  onRemove();
64
64
  },
65
65
  "aria-label": removeAriaLabel,
66
- children: /* @__PURE__ */ jsx(CloseGlyph, { size: "xs" })
66
+ children: /* @__PURE__ */ jsx(XGlyph, { size: "xs" })
67
67
  }
68
68
  );
69
69
  if (split) {
@@ -1,5 +1,5 @@
1
1
  import { cx } from './chunk-ODEQTPFM.js';
2
- import './BrandLockup-6ISDEHPJ.css';
2
+ import './BrandLockup-JKGXFCZF.css';
3
3
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
4
4
 
5
5
  function BrandLockup({ name, mark, context, href, renderLink, className }) {
@@ -1,5 +1,5 @@
1
1
  import { useLayerContainer, viewportBounds, LAYER_GAP, outsideBounds, placePopup, LAYER_REPOSITION_EVENT } from './chunk-7RPGY3JE.js';
2
- import { usePopupLayer, focusables } from './chunk-ITHXJHBB.js';
2
+ import { usePopupLayer, focusables } from './chunk-R25RGPUB.js';
3
3
  import { cx } from './chunk-ODEQTPFM.js';
4
4
  import './Popover-WJGCF3ZQ.css';
5
5
  import { useId, useState, useRef, useCallback, useLayoutEffect, useEffect, cloneElement } from 'react';
@@ -1,12 +1,12 @@
1
1
  import { LayerNodeBridge } from './chunk-53DVJCVW.js';
2
2
  import { LAYER_REPOSITION_EVENT, LayerHost } from './chunk-7RPGY3JE.js';
3
- import { IconButton } from './chunk-F27EPQ7D.js';
4
- import { Button } from './chunk-BZYDZBAN.js';
3
+ import { IconButton } from './chunk-4UQ7SMPK.js';
4
+ import { Button } from './chunk-ETYEBKR4.js';
5
5
  import { VisuallyHidden } from './chunk-BZFWDIV6.js';
6
6
  import { cx } from './chunk-ODEQTPFM.js';
7
7
  import './Canvas-Q6JETCWR.css';
8
8
  import { useId, useRef, useState, useCallback, useLayoutEffect, useImperativeHandle, useEffect } from 'react';
9
- import { ZoomOutGlyph, ZoomInGlyph, FitScreenGlyph } from '@crewlethq/icons/glyphs';
9
+ import { ZoomOutGlyph, ZoomInGlyph, FullscreenGlyph } from '@crewlethq/icons/glyphs';
10
10
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
11
11
 
12
12
  // src/Canvas/geometry.ts
@@ -528,7 +528,7 @@ function Canvas({
528
528
  {
529
529
  size: "sm",
530
530
  label: text.fit,
531
- icon: /* @__PURE__ */ jsx(FitScreenGlyph, {}),
531
+ icon: /* @__PURE__ */ jsx(FullscreenGlyph, {}),
532
532
  onClick: () => content && apply(fitView(content, sizeNow.current), "near"),
533
533
  disabled: !ready
534
534
  }