@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
@@ -1,10 +1,10 @@
1
- import { useTreeState, useMeasuredSizes, layoutForest, treeAncestors, useLayoutAnchor, treeExpandable, layoutConnectors, treeItemAction, treeStep, treePosInSet, treeSetSize, treeLevel } from './chunk-NTRZGNEX.js';
2
- import { CANVAS_COMPOSE_CONTEXT, CANVAS_FIT_MAX_ZOOM, Canvas } from './chunk-CMEE37QJ.js';
3
- import { focusables } from './chunk-ITHXJHBB.js';
1
+ import { useTreeState, useMeasuredSizes, layoutForest, treeAncestors, useLayoutAnchor, treeExpandable, layoutConnectors, treeItemAction, treeStep, treePosInSet, treeSetSize, treeLevel, placeGroups } from './chunk-S3BCVWTU.js';
2
+ import { CANVAS_COMPOSE_CONTEXT, CANVAS_FIT_MAX_ZOOM, Canvas } from './chunk-BMYPGGPV.js';
3
+ import { focusables } from './chunk-R25RGPUB.js';
4
4
  import { cx } from './chunk-ODEQTPFM.js';
5
- import './TreeCanvas-WBNQPHC7.css';
6
- import { useState, useRef, useMemo, useLayoutEffect, useCallback, useImperativeHandle, useSyncExternalStore } from 'react';
7
- import { jsx, jsxs } from 'react/jsx-runtime';
5
+ import './TreeCanvas-HVOV4SQN.css';
6
+ import { useState, useRef, useMemo, useLayoutEffect, useCallback, useImperativeHandle, useId, useSyncExternalStore } from 'react';
7
+ import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
8
8
 
9
9
  var ENTRANCE_STEP_MS = 60;
10
10
  var REFLOW_MS = 350;
@@ -90,7 +90,14 @@ function useReflow(layout, still) {
90
90
  return { ...one, x: was.x + (one.x - was.x) * through, y: was.y + (one.y - was.y) * through };
91
91
  });
92
92
  record(nodes);
93
- setDrawn({ nodes, byId: new Map(nodes.map((one) => [one.id, one])), bounds: layout.bounds });
93
+ const byId = new Map(nodes.map((one) => [one.id, one]));
94
+ setDrawn({
95
+ nodes,
96
+ byId,
97
+ groups: placeGroups(byId, layout.groups ?? []),
98
+ ...layout.ranks ? { ranks: layout.ranks } : {},
99
+ bounds: layout.bounds
100
+ });
94
101
  frame.current = through < 1 ? requestAnimationFrame(tick) : null;
95
102
  };
96
103
  frame.current = requestAnimationFrame(tick);
@@ -100,6 +107,8 @@ function useReflow(layout, still) {
100
107
  }
101
108
  var GAP_PROBE = "crewlet:tree-canvas-gap";
102
109
  var MARGIN_PROBE = "crewlet:tree-canvas-margin";
110
+ var GROUP_PAD_PROBE = "crewlet:tree-canvas-group-pad";
111
+ var groupHeadKey = (id) => `crewlet:tree-canvas-group:${id}`;
103
112
  function TreeCanvas({
104
113
  label,
105
114
  nodes,
@@ -107,11 +116,11 @@ function TreeCanvas({
107
116
  cardOf,
108
117
  renderCard,
109
118
  renderUnder,
110
- cardOutline,
111
119
  cardTone,
112
120
  appearance = "card",
113
121
  ranks,
114
- connector = "step",
122
+ connector = "elbow",
123
+ groups,
115
124
  onNodeKey,
116
125
  onNodeKeyDown,
117
126
  hasNodeMenu,
@@ -154,12 +163,27 @@ function TreeCanvas({
154
163
  cardForest.forEach(walk);
155
164
  return out;
156
165
  }, [cardForest]);
166
+ const shownGroups = useMemo(() => {
167
+ if (!groups || groups.length === 0) return [];
168
+ const drawnCards = new Set(cardIds);
169
+ return groups.map((group) => ({ group, members: group.memberIds.filter((id) => drawnCards.has(id)) })).filter((one) => one.members.length > 0);
170
+ }, [groups, cardIds]);
157
171
  const spacing = ranks ?? (appearance === "node" ? "shared" : "per-parent");
158
172
  const previousLayout = useRef(null);
159
173
  const layout = useMemo(() => {
160
- if (!measured([...cardIds, GAP_PROBE, MARGIN_PROBE])) return previousLayout.current;
174
+ const probes = [GAP_PROBE, MARGIN_PROBE];
175
+ if (shownGroups.length > 0) {
176
+ probes.push(GROUP_PAD_PROBE, ...shownGroups.map(({ group }) => groupHeadKey(group.id)));
177
+ }
178
+ if (!measured([...cardIds, ...probes])) return previousLayout.current;
161
179
  const size = (id) => sizes.get(id);
162
180
  const gap = size(GAP_PROBE);
181
+ const pad = shownGroups.length > 0 ? size(GROUP_PAD_PROBE) : null;
182
+ const boxes = shownGroups.map(({ group, members }) => ({
183
+ id: group.id,
184
+ members,
185
+ inset: { x: pad.width, top: size(groupHeadKey(group.id)).height, bottom: pad.height }
186
+ }));
163
187
  const toLayout = (card2) => ({
164
188
  id: card2.id,
165
189
  width: size(card2.id).width,
@@ -170,9 +194,10 @@ function TreeCanvas({
170
194
  gapX: gap.width,
171
195
  gapY: gap.height,
172
196
  ranks: spacing,
173
- margin: size(MARGIN_PROBE).width
197
+ margin: size(MARGIN_PROBE).width,
198
+ groups: boxes
174
199
  });
175
- }, [cardForest, cardIds, measured, sizes, spacing]);
200
+ }, [cardForest, cardIds, measured, sizes, spacing, shownGroups]);
176
201
  previousLayout.current = layout;
177
202
  const still = useStillness();
178
203
  const drawn = useReflow(layout, still) ?? layout;
@@ -362,6 +387,16 @@ function TreeCanvas({
362
387
  items.current.get(id)?.focus({ preventScroll: true });
363
388
  }
364
389
  });
390
+ const uid = useId();
391
+ const headIds = useMemo(
392
+ () => new Map(shownGroups.map(({ group }, i) => [group.id, `${uid}-group-${i}`])),
393
+ [shownGroups, uid]
394
+ );
395
+ const describedBy = useMemo(() => {
396
+ const out = /* @__PURE__ */ new Map();
397
+ for (const { group, members } of shownGroups) for (const id of members) out.set(id, headIds.get(group.id));
398
+ return out;
399
+ }, [shownGroups, headIds]);
365
400
  const card = {
366
401
  item: (id) => ({
367
402
  role: "treeitem",
@@ -371,6 +406,7 @@ function TreeCanvas({
371
406
  "aria-posinset": treePosInSet(model, id),
372
407
  "aria-expanded": treeExpandable(model, id) ? expanded.has(id) : void 0,
373
408
  "aria-selected": id === selectedId,
409
+ "aria-describedby": describedBy.get(id),
374
410
  "data-tree-id": id,
375
411
  ref: refFor(id),
376
412
  onClick: (event) => {
@@ -430,6 +466,21 @@ function TreeCanvas({
430
466
  children: [
431
467
  /* @__PURE__ */ jsx("div", { className: "crewlet-tree-canvas__gap", ref: measure(GAP_PROBE), "aria-hidden": "true" }),
432
468
  /* @__PURE__ */ jsx("div", { className: "crewlet-tree-canvas__margin", ref: measure(MARGIN_PROBE), "aria-hidden": "true" }),
469
+ shownGroups.length > 0 && /* @__PURE__ */ jsx("div", { className: "crewlet-tree-canvas__group-pad", ref: measure(GROUP_PAD_PROBE), "aria-hidden": "true" }),
470
+ shownGroups.map(({ group, members }) => {
471
+ const placed = drawn?.groups?.find((one) => one.id === group.id);
472
+ return /* @__PURE__ */ jsx(
473
+ "div",
474
+ {
475
+ className: "crewlet-tree-canvas__group",
476
+ "aria-hidden": "true",
477
+ "data-group-id": group.id,
478
+ "data-enter": enterOf(members, arrived),
479
+ style: placedStyle(placed, true)
480
+ },
481
+ group.id
482
+ );
483
+ }),
433
484
  drawn && /* @__PURE__ */ jsx(
434
485
  "svg",
435
486
  {
@@ -449,6 +500,28 @@ function TreeCanvas({
449
500
  ))
450
501
  }
451
502
  ),
503
+ shownGroups.map(({ group, members }) => {
504
+ const placed = drawn?.groups?.find((one) => one.id === group.id);
505
+ return /* @__PURE__ */ jsxs(
506
+ "div",
507
+ {
508
+ id: headIds.get(group.id),
509
+ ref: measure(groupHeadKey(group.id)),
510
+ className: "crewlet-tree-canvas__group-head",
511
+ "aria-hidden": "true",
512
+ "data-enter": enterOf(members, arrived),
513
+ style: placedStyle(placed, false),
514
+ children: [
515
+ group.lead === void 0 || group.lead === null ? null : /* @__PURE__ */ jsxs(Fragment, { children: [
516
+ /* @__PURE__ */ jsx("span", { className: "crewlet-tree-canvas__group-lead", children: group.lead }),
517
+ " "
518
+ ] }),
519
+ /* @__PURE__ */ jsx("span", { className: "crewlet-tree-canvas__group-label", children: group.label })
520
+ ]
521
+ },
522
+ group.id
523
+ );
524
+ }),
452
525
  /* @__PURE__ */ jsx("div", { role: "tree", "aria-label": label, className: "crewlet-tree-canvas__tree", onKeyDown, children: cardIds.filter((id) => id !== composeId).map((id) => {
453
526
  const placed = drawn?.byId.get(id);
454
527
  return /* @__PURE__ */ jsxs(
@@ -456,10 +529,7 @@ function TreeCanvas({
456
529
  {
457
530
  role: "none",
458
531
  ref: measure(id),
459
- className: cx(
460
- "crewlet-tree-canvas__card",
461
- cardOutline?.(id) && "crewlet-tree-canvas__card--outline"
462
- ),
532
+ className: "crewlet-tree-canvas__card",
463
533
  "data-tone": cardTone?.(id),
464
534
  "data-enter": arrived === null ? void 0 : arrived.has(id) ? "shown" : "waiting",
465
535
  style: placed ? { transform: `translate(${placed.x}px, ${placed.y}px)` } : { visibility: "hidden" },
@@ -514,6 +584,18 @@ function UnderSlot({
514
584
  if (content === null || content === void 0 || content === false) return null;
515
585
  return /* @__PURE__ */ jsx("div", { className: "crewlet-tree-canvas__under", "aria-hidden": "true", ...card.press(id), children: content });
516
586
  }
587
+ function enterOf(members, arrived) {
588
+ if (arrived === null) return void 0;
589
+ return members.some((id) => arrived.has(id)) ? "shown" : "waiting";
590
+ }
591
+ function placedStyle(placed, box) {
592
+ if (!placed) return { visibility: "hidden" };
593
+ return {
594
+ transform: `translate(${placed.x}px, ${placed.y}px)`,
595
+ width: `${placed.width}px`,
596
+ ...box ? { height: `${placed.height}px` } : {}
597
+ };
598
+ }
517
599
  function offsetWithin(el, container) {
518
600
  let top = 0;
519
601
  for (let at = el; at && at !== container; at = at.offsetParent) {
@@ -1,7 +1,7 @@
1
1
  import { Count } from './chunk-BHHIIK3M.js';
2
2
  import { headingTag } from './chunk-PQADV6P6.js';
3
3
  import { cx } from './chunk-ODEQTPFM.js';
4
- import { KeyboardArrowDownGlyph } from '@crewlethq/icons/glyphs';
4
+ import { ChevronDownGlyph } from '@crewlethq/icons/glyphs';
5
5
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
6
6
 
7
7
  function DisclosureAnatomy({
@@ -31,7 +31,7 @@ function DisclosureAnatomy({
31
31
  onClick: onToggle,
32
32
  onKeyDown,
33
33
  children: [
34
- /* @__PURE__ */ jsx(KeyboardArrowDownGlyph, { className: "crewlet-disclosure__chevron", size: "sm" }),
34
+ /* @__PURE__ */ jsx(ChevronDownGlyph, { className: "crewlet-disclosure__chevron", size: "sm" }),
35
35
  /* @__PURE__ */ jsx("span", { className: cx("crewlet-disclosure__title", mono && "crewlet-disclosure__title--mono"), children: title }),
36
36
  meta === void 0 ? null : /* @__PURE__ */ jsxs(Fragment, { children: [
37
37
  " ",
@@ -0,0 +1,156 @@
1
+ import { cx } from './chunk-ODEQTPFM.js';
2
+ import './Avatar-XID7Z74C.css';
3
+ import './AvatarStack-GEJBNV7E.css';
4
+ import { useState, useEffect } from 'react';
5
+ import { jsx, jsxs } from 'react/jsx-runtime';
6
+
7
+ var AVATAR_SIZES = { xs: 20, sm: 26, md: 32, lg: 40 };
8
+ var AVATAR_CORNER_RATIO = 0.29;
9
+ var getInitials = (name) => {
10
+ if (!name) return "?";
11
+ const words = name.trim().split(/[\s\-_.]+/).filter(Boolean);
12
+ if (words.length === 0) return "?";
13
+ const first = (word2) => (Array.from(word2)[0] ?? "").toUpperCase();
14
+ if (words.length >= 2) return words.slice(0, 2).map(first).join("") || "?";
15
+ const word = words[0];
16
+ const humps = word.split(/(?<=\p{Ll})(?=\p{Lu})/u);
17
+ if (humps.length >= 2) return humps.slice(0, 2).map(first).join("");
18
+ return Array.from(word).slice(0, 2).map((character) => character.toUpperCase()).join("") || "?";
19
+ };
20
+ var TINT_COUNT = 10;
21
+ var avatarTint = (seed) => {
22
+ let hash = 0;
23
+ for (let i = 0; i < seed.length; i += 1) {
24
+ hash = hash * 31 + seed.charCodeAt(i) >>> 0;
25
+ }
26
+ return hash % TINT_COUNT;
27
+ };
28
+ function avatarPixels(size) {
29
+ return typeof size === "number" ? size : AVATAR_SIZES[size];
30
+ }
31
+ function avatarCorner(pixels) {
32
+ return pixels * AVATAR_CORNER_RATIO;
33
+ }
34
+ var Avatar = ({
35
+ src,
36
+ name,
37
+ size = "md",
38
+ kind = "agent",
39
+ tone = "neutral",
40
+ ring,
41
+ decorative = false,
42
+ colorSeed,
43
+ className,
44
+ style,
45
+ ...rest
46
+ }) => {
47
+ const [imageFailed, setImageFailed] = useState(false);
48
+ useEffect(() => {
49
+ setImageFailed(false);
50
+ }, [src]);
51
+ const step = typeof size === "number" ? null : size;
52
+ const pixels = avatarPixels(size);
53
+ const measured = step === null ? {
54
+ "--crewlet-avatar-size": `${pixels}px`,
55
+ fontSize: Math.max(9, Math.round(pixels * 0.36))
56
+ } : {};
57
+ const seeded = tone === "seeded" ? avatarTint(colorSeed ?? name ?? "") : null;
58
+ const classes = cx(
59
+ "crewlet-avatar",
60
+ `crewlet-avatar--${kind}`,
61
+ step === null ? null : `crewlet-avatar--${step}`,
62
+ ring === void 0 ? null : `crewlet-avatar--ring-${ring}`,
63
+ className
64
+ );
65
+ if (src && !imageFailed) {
66
+ return /* @__PURE__ */ jsx(
67
+ "img",
68
+ {
69
+ ...rest,
70
+ className: cx(classes, "crewlet-avatar--image"),
71
+ style: { ...measured, ...style },
72
+ src,
73
+ alt: decorative ? "" : name ?? "",
74
+ "aria-hidden": decorative ? true : void 0,
75
+ onError: () => setImageFailed(true)
76
+ }
77
+ );
78
+ }
79
+ return /* @__PURE__ */ jsx(
80
+ "span",
81
+ {
82
+ ...rest,
83
+ className: cx(
84
+ classes,
85
+ "crewlet-avatar--fallback",
86
+ `crewlet-avatar--${tone}`,
87
+ seeded === null ? null : `crewlet-avatar--tint-${seeded}`
88
+ ),
89
+ style: { ...measured, ...style },
90
+ role: decorative ? void 0 : "img",
91
+ "aria-hidden": decorative ? true : void 0,
92
+ "aria-label": decorative ? void 0 : name ? `${name} avatar` : "Avatar",
93
+ children: getInitials(name)
94
+ }
95
+ );
96
+ };
97
+ function counted(count, one, many) {
98
+ return `${count} ${count === 1 ? one : many}`;
99
+ }
100
+ function avatarStackLabel(members) {
101
+ const humans = members.filter((member) => member.kind === "human").length;
102
+ const agents = members.length - humans;
103
+ const agentWords = counted(agents, "agent", "agents");
104
+ const humanWords = counted(humans, "person", "people");
105
+ const who = humans === 0 ? agentWords : agents === 0 ? humanWords : `${agentWords} and ${humanWords}`;
106
+ return `${who}: ${members.map((member) => member.name).join(", ")}`;
107
+ }
108
+ function AvatarStack({
109
+ members,
110
+ max = 4,
111
+ size = "sm",
112
+ label,
113
+ decorative = false,
114
+ className,
115
+ style,
116
+ ...rest
117
+ }) {
118
+ if (!Number.isInteger(max) || max < 1) {
119
+ throw new RangeError(`AvatarStack max must be a whole number of at least 1; it was ${max}`);
120
+ }
121
+ if (members.length === 0) return null;
122
+ const shown = members.slice(0, max);
123
+ const overflow = members.length - shown.length;
124
+ return /* @__PURE__ */ jsxs(
125
+ "span",
126
+ {
127
+ ...rest,
128
+ className: cx("crewlet-avatar-stack", className),
129
+ style: { "--crewlet-avatar-stack-size": `${AVATAR_SIZES[size]}px`, ...style },
130
+ role: decorative ? void 0 : "img",
131
+ "aria-label": decorative ? void 0 : label ?? avatarStackLabel(members),
132
+ "aria-hidden": decorative ? true : void 0,
133
+ children: [
134
+ shown.map((member) => /* @__PURE__ */ jsx(
135
+ Avatar,
136
+ {
137
+ className: "crewlet-avatar-stack__member",
138
+ name: member.name,
139
+ kind: member.kind,
140
+ src: member.src,
141
+ ring: member.ring,
142
+ size,
143
+ decorative: true
144
+ },
145
+ member.id ?? member.name
146
+ )),
147
+ overflow > 0 ? /* @__PURE__ */ jsxs("span", { className: "crewlet-avatar-stack__member crewlet-avatar-stack__more", "aria-hidden": "true", children: [
148
+ "+",
149
+ overflow
150
+ ] }) : null
151
+ ]
152
+ }
153
+ );
154
+ }
155
+
156
+ export { AVATAR_CORNER_RATIO, AVATAR_SIZES, Avatar, AvatarStack, avatarCorner, avatarPixels, avatarStackLabel, avatarTint, getInitials };
@@ -1,13 +1,13 @@
1
1
  import { HeadingLevelProvider } from './chunk-PQADV6P6.js';
2
2
  import { useLayerContainer } from './chunk-7RPGY3JE.js';
3
- import { focusables, useModalLayer, useBodyScrollLock } from './chunk-ITHXJHBB.js';
4
- import { IconButton } from './chunk-F27EPQ7D.js';
5
- import { Button } from './chunk-BZYDZBAN.js';
3
+ import { focusables, useModalLayer, useBodyScrollLock } from './chunk-R25RGPUB.js';
4
+ import { IconButton } from './chunk-4UQ7SMPK.js';
5
+ import { Button } from './chunk-ETYEBKR4.js';
6
6
  import { cx } from './chunk-ODEQTPFM.js';
7
- import './Modal-XYQJ4BL6.css';
7
+ import './Modal-JAYBS2KS.css';
8
8
  import { useId, useRef, useCallback } from 'react';
9
9
  import { createPortal } from 'react-dom';
10
- import { CloseGlyph } from '@crewlethq/icons/glyphs';
10
+ import { XGlyph } from '@crewlethq/icons/glyphs';
11
11
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
12
12
 
13
13
  function Modal({ open, ...rest }) {
@@ -120,7 +120,7 @@ function ModalFrame({
120
120
  {
121
121
  className: "crewlet-modal__close",
122
122
  label: closeLabel,
123
- icon: /* @__PURE__ */ jsx(CloseGlyph, { size: "md" }),
123
+ icon: /* @__PURE__ */ jsx(XGlyph, { size: "md" }),
124
124
  onClick: onClose,
125
125
  disabledReason: dismissable ? void 0 : closeDisabledReason
126
126
  }
@@ -197,7 +197,7 @@ function ConfirmModal({
197
197
  cancelLabel = "Cancel",
198
198
  destructive = false,
199
199
  confirmVariant,
200
- cancelVariant = "tertiary",
200
+ cancelVariant = "ghost",
201
201
  confirmDisabled = false,
202
202
  confirmDisabledReason = "Complete the confirmation above to continue.",
203
203
  submitting = false,
@@ -0,0 +1,55 @@
1
+ import { VisuallyHidden } from './chunk-BZFWDIV6.js';
2
+ import { cx } from './chunk-ODEQTPFM.js';
3
+ import './StatCard-KPAFD4E2.css';
4
+ import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
5
+
6
+ var StatCard = ({
7
+ label,
8
+ value,
9
+ unit,
10
+ sub,
11
+ subTone = "neutral",
12
+ delta,
13
+ trend,
14
+ icon,
15
+ tone = "neutral",
16
+ loading = false,
17
+ loadingLabel = "Loading",
18
+ flush = false,
19
+ className,
20
+ ...rest
21
+ }) => {
22
+ const change = loading ? void 0 : delta;
23
+ const said = sub !== void 0 && sub !== null && sub !== false && sub !== "";
24
+ return /* @__PURE__ */ jsxs(
25
+ "div",
26
+ {
27
+ ...rest,
28
+ className: cx("crewlet-statcard", `crewlet-statcard--${tone}`, flush && "crewlet-statcard--flush", className),
29
+ "aria-busy": loading || void 0,
30
+ children: [
31
+ /* @__PURE__ */ jsxs("div", { className: "crewlet-statcard__label", children: [
32
+ icon ? /* @__PURE__ */ jsx("span", { className: "crewlet-statcard__icon", "aria-hidden": true, children: icon }) : null,
33
+ label
34
+ ] }),
35
+ /* @__PURE__ */ jsxs("div", { className: "crewlet-statcard__reading", children: [
36
+ /* @__PURE__ */ jsx("div", { className: "crewlet-statcard__value", children: loading ? /* @__PURE__ */ jsxs(Fragment, { children: [
37
+ /* @__PURE__ */ jsx("span", { className: "crewlet-statcard__placeholder", "aria-hidden": true }),
38
+ /* @__PURE__ */ jsx(VisuallyHidden, { children: loadingLabel })
39
+ ] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
40
+ value,
41
+ unit ? /* @__PURE__ */ jsx("span", { className: "crewlet-statcard__unit", children: unit }) : null
42
+ ] }) }),
43
+ trend && !loading ? /* @__PURE__ */ jsx("div", { className: "crewlet-statcard__trend", children: trend }) : null
44
+ ] }),
45
+ /* @__PURE__ */ jsxs("div", { className: cx("crewlet-statcard__sub", subTone !== "neutral" && `crewlet-statcard__sub--${subTone}`), children: [
46
+ change ? /* @__PURE__ */ jsx("span", { className: cx("crewlet-statcard__delta", `crewlet-statcard__delta--${change.polarity}`), children: change.value }) : null,
47
+ change && said ? " " : null,
48
+ sub
49
+ ] })
50
+ ]
51
+ }
52
+ );
53
+ };
54
+
55
+ export { StatCard };
@@ -1,12 +1,12 @@
1
1
  import { useLayerContainer, viewportBounds, LAYER_GAP, outsideBounds, placePopup, LAYER_REPOSITION_EVENT } from './chunk-7RPGY3JE.js';
2
- import { usePopupLayer } from './chunk-ITHXJHBB.js';
3
- import { IconButton } from './chunk-F27EPQ7D.js';
4
- import { Button } from './chunk-BZYDZBAN.js';
2
+ import { usePopupLayer } from './chunk-R25RGPUB.js';
3
+ import { IconButton } from './chunk-4UQ7SMPK.js';
4
+ import { Button } from './chunk-ETYEBKR4.js';
5
5
  import { cx } from './chunk-ODEQTPFM.js';
6
6
  import './Menu-BT5PMFJI.css';
7
7
  import { useId, useState, useRef, useCallback, useLayoutEffect, useEffect } from 'react';
8
8
  import { createPortal } from 'react-dom';
9
- import { MoreVertGlyph, CheckGlyph } from '@crewlethq/icons/glyphs';
9
+ import { EllipsisVerticalGlyph, CheckGlyph } from '@crewlethq/icons/glyphs';
10
10
  import { jsx, jsxs } from 'react/jsx-runtime';
11
11
 
12
12
  var ITEM_SELECTOR = "[role='menuitem'],[role='menuitemradio']";
@@ -29,7 +29,7 @@ function Menu({
29
29
  items,
30
30
  icon,
31
31
  trigger,
32
- triggerVariant = "tertiary",
32
+ triggerVariant = "ghost",
33
33
  triggerTabIndex,
34
34
  open: controlled,
35
35
  onOpenChange,
@@ -258,7 +258,7 @@ function Menu({
258
258
  onKeyDown: onTriggerKeyDown
259
259
  };
260
260
  return /* @__PURE__ */ jsxs("span", { className: "crewlet-menu-anchor", children: [
261
- trigger === void 0 ? /* @__PURE__ */ jsx(IconButton, { ...shared, label, icon: icon ?? /* @__PURE__ */ jsx(MoreVertGlyph, {}), size: "sm" }) : /* @__PURE__ */ jsx(Button, { ...shared, variant: triggerVariant, size: "small", leadingIcon: icon, children: trigger }),
261
+ trigger === void 0 ? /* @__PURE__ */ jsx(IconButton, { ...shared, label, icon: icon ?? /* @__PURE__ */ jsx(EllipsisVerticalGlyph, {}), size: "sm" }) : /* @__PURE__ */ jsx(Button, { ...shared, variant: triggerVariant, size: "small", leadingIcon: icon, children: trigger }),
262
262
  list && container ? createPortal(list, container) : null
263
263
  ] });
264
264
  }
@@ -1,14 +1,14 @@
1
1
  import { VisuallyHidden } from './chunk-BZFWDIV6.js';
2
2
  import { cx } from './chunk-ODEQTPFM.js';
3
- import './SidebarNav-QGSFKZYA.css';
3
+ import './SidebarNav-X5NLZNWA.css';
4
4
  import { useId, useState } from 'react';
5
- import { KeyboardArrowDownGlyph } from '@crewlethq/icons/glyphs';
5
+ import { ChevronDownGlyph } from '@crewlethq/icons/glyphs';
6
6
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
7
7
 
8
8
  function SidebarNav({ label, className, children }) {
9
9
  return /* @__PURE__ */ jsx("nav", { className: cx("crewlet-sidebar-nav", className), "aria-label": label, children });
10
10
  }
11
- function NavGroup({ label, className, children }) {
11
+ function NavGroup({ label, action, className, children }) {
12
12
  const id = useId();
13
13
  const named = label !== void 0 && label !== null && label !== false && label !== "";
14
14
  return /* @__PURE__ */ jsxs(
@@ -18,17 +18,30 @@ function NavGroup({ label, className, children }) {
18
18
  role: named ? "group" : void 0,
19
19
  "aria-labelledby": named ? id : void 0,
20
20
  children: [
21
- named ? /* @__PURE__ */ jsx("div", { className: "crewlet-nav-group__label", id, children: label }) : null,
21
+ named || action ? /* @__PURE__ */ jsxs("div", { className: "crewlet-nav-group__head", children: [
22
+ named ? /* @__PURE__ */ jsx("span", { className: "crewlet-nav-group__label", id, children: label }) : null,
23
+ action ? /* @__PURE__ */ jsx("button", { type: "button", className: "crewlet-nav-group__action", "aria-label": action.label, onClick: action.onClick, children: /* @__PURE__ */ jsx("span", { className: "crewlet-nav-group__action-icon", "aria-hidden": true, children: action.icon }) }) : null
24
+ ] }) : null,
22
25
  children
23
26
  ]
24
27
  }
25
28
  );
26
29
  }
30
+ function Figure({ figure, className, mark }) {
31
+ return /* @__PURE__ */ jsx("span", { className, "aria-hidden": true, children: /* @__PURE__ */ jsxs("span", { className: "crewlet-nav-item__figure", children: [
32
+ mark ? /* @__PURE__ */ jsx("span", { className: "crewlet-nav-item__mark", children: mark }) : null,
33
+ figure.value
34
+ ] }) });
35
+ }
36
+ function spoken(figures) {
37
+ return figures.filter((figure) => figure !== void 0).map((figure) => `, ${String(figure.value)} ${figure.label}`).join("");
38
+ }
27
39
  function NavItem({
28
40
  label,
29
41
  icon,
42
+ lead,
43
+ count,
30
44
  badge,
31
- badgeTone = "neutral",
32
45
  href,
33
46
  current = false,
34
47
  disabledReason,
@@ -53,8 +66,14 @@ function NavItem({
53
66
  }
54
67
  const inside = /* @__PURE__ */ jsxs(Fragment, { children: [
55
68
  icon ? /* @__PURE__ */ jsx("span", { className: "crewlet-nav-item__icon", "aria-hidden": true, children: icon }) : null,
56
- /* @__PURE__ */ jsx("span", { className: "crewlet-nav-item__label", children: label }),
57
- badge ? /* @__PURE__ */ jsx("span", { className: cx("crewlet-nav-item__badge", badgeTone === "attention" && "crewlet-nav-item__badge--attention"), children: badge }) : null
69
+ lead ? /* @__PURE__ */ jsx("span", { className: "crewlet-nav-item__lead", children: lead }) : null,
70
+ lead ? " " : null,
71
+ /* @__PURE__ */ jsxs("span", { className: "crewlet-nav-item__label", children: [
72
+ label,
73
+ count || badge ? /* @__PURE__ */ jsx(VisuallyHidden, { children: spoken([count, badge]) }) : null
74
+ ] }),
75
+ count ? /* @__PURE__ */ jsx(Figure, { figure: count, mark: count.mark, className: "crewlet-nav-item__count" }) : null,
76
+ badge ? /* @__PURE__ */ jsx(Figure, { figure: badge, className: "crewlet-nav-item__badge" }) : null
58
77
  ] });
59
78
  const rowClass = "crewlet-nav-item__row";
60
79
  let row;
@@ -96,7 +115,7 @@ function NavItem({
96
115
  },
97
116
  children: [
98
117
  inside,
99
- nested ? /* @__PURE__ */ jsx("span", { className: cx("crewlet-nav-item__chevron", open && "crewlet-nav-item__chevron--open"), "aria-hidden": true, children: /* @__PURE__ */ jsx(KeyboardArrowDownGlyph, { size: "sm" }) }) : null
118
+ nested ? /* @__PURE__ */ jsx("span", { className: cx("crewlet-nav-item__chevron", open && "crewlet-nav-item__chevron--open"), "aria-hidden": true, children: /* @__PURE__ */ jsx(ChevronDownGlyph, { size: "sm" }) }) : null
100
119
  ]
101
120
  }
102
121
  );
@@ -120,7 +139,7 @@ function NavItem({
120
139
  "aria-controls": `${id}-children`,
121
140
  "aria-label": expandLabel ?? (typeof label === "string" ? `${label} sections` : "Sections"),
122
141
  onClick: toggle,
123
- children: /* @__PURE__ */ jsx("span", { className: cx("crewlet-nav-item__chevron", open && "crewlet-nav-item__chevron--open"), "aria-hidden": true, children: /* @__PURE__ */ jsx(KeyboardArrowDownGlyph, { size: "sm" }) })
142
+ children: /* @__PURE__ */ jsx("span", { className: cx("crewlet-nav-item__chevron", open && "crewlet-nav-item__chevron--open"), "aria-hidden": true, children: /* @__PURE__ */ jsx(ChevronDownGlyph, { size: "sm" }) })
124
143
  }
125
144
  ) : null
126
145
  ] }),
@@ -1,14 +1,14 @@
1
- import { Select } from './chunk-KNYYCWMK.js';
2
- import { Popover } from './chunk-EFSG7HNU.js';
1
+ import { Select } from './chunk-SJQ546ID.js';
2
+ import { Popover } from './chunk-AUS5FNQE.js';
3
3
  import { today, shiftMonth, CalendarGrid, compareDays } from './chunk-GXQ3B46I.js';
4
- import { Input } from './chunk-GKHAKGOF.js';
5
- import { isComposing } from './chunk-ITHXJHBB.js';
6
- import { IconButton } from './chunk-F27EPQ7D.js';
7
- import { Button } from './chunk-BZYDZBAN.js';
4
+ import { Input } from './chunk-DSUY5F4E.js';
5
+ import { isComposing } from './chunk-R25RGPUB.js';
6
+ import { IconButton } from './chunk-4UQ7SMPK.js';
7
+ import { Button } from './chunk-ETYEBKR4.js';
8
8
  import { cx } from './chunk-ODEQTPFM.js';
9
9
  import './TimeWindowPicker-7I7KWCMU.css';
10
10
  import { useMemo, useState, useRef, useId, useEffect } from 'react';
11
- import { ScheduleGlyph, KeyboardArrowDownGlyph, CheckGlyph, ChevronLeftGlyph, ChevronRightGlyph } from '@crewlethq/icons/glyphs';
11
+ import { ClockGlyph, ChevronDownGlyph, CheckGlyph, ChevronLeftGlyph, ChevronRightGlyph } from '@crewlethq/icons/glyphs';
12
12
  import { jsx, jsxs } from 'react/jsx-runtime';
13
13
 
14
14
  // src/TimeWindowPicker/mask.ts
@@ -354,9 +354,9 @@ function TimeWindowPicker({
354
354
  "aria-expanded": open,
355
355
  "aria-label": labels.triggerName(ariaLabel, shown),
356
356
  children: [
357
- /* @__PURE__ */ jsx(ScheduleGlyph, { className: "crewlet-time-window__icon", size: "sm" }),
357
+ /* @__PURE__ */ jsx(ClockGlyph, { className: "crewlet-time-window__icon", size: "sm" }),
358
358
  /* @__PURE__ */ jsx("span", { className: cx("crewlet-time-window__label", !isSet && "is-placeholder"), children: shown }),
359
- /* @__PURE__ */ jsx(KeyboardArrowDownGlyph, { className: "crewlet-time-window__chevron", size: "sm" })
359
+ /* @__PURE__ */ jsx(ChevronDownGlyph, { className: "crewlet-time-window__chevron", size: "sm" })
360
360
  ]
361
361
  }
362
362
  ),
@@ -438,12 +438,12 @@ function Panel({
438
438
  Button,
439
439
  {
440
440
  size: "small",
441
- variant: "tertiary",
441
+ variant: "ghost",
442
442
  onClick: () => setDraft(normalise(defaultValue)),
443
443
  children: labels.resetLabel
444
444
  }
445
445
  ) : null,
446
- /* @__PURE__ */ jsx(Button, { size: "small", variant: "tertiary", onClick: close, children: labels.cancelLabel }),
446
+ /* @__PURE__ */ jsx(Button, { size: "small", variant: "ghost", onClick: close, children: labels.cancelLabel }),
447
447
  /* @__PURE__ */ jsx(
448
448
  Button,
449
449
  {