@crewlethq/ui 0.6.3 → 0.7.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 (125) hide show
  1. package/README.md +109 -0
  2. package/dist/AddPill/index.js +1 -1
  3. package/dist/{AddPill-IJQYCY6C.css → AddPill-V4TQXJ53.css} +23 -22
  4. package/dist/AppShell/index.js +2 -2
  5. package/dist/{AppShell-XARELGIH.css → AppShell-CEVLW4QG.css} +3 -1
  6. package/dist/Button/index.js +1 -1
  7. package/dist/{Button-EXU36DEH.css → Button-UWKBTKYD.css} +18 -0
  8. package/dist/Canvas/Canvas.d.ts +16 -1
  9. package/dist/Canvas/index.d.ts +1 -1
  10. package/dist/Canvas/index.js +3 -3
  11. package/dist/{Canvas-Q6JETCWR.css → Canvas-YVXHMWLN.css} +13 -0
  12. package/dist/Card/index.js +1 -1
  13. package/dist/{Card-GLP7SUV6.css → Card-KJOYHDTJ.css} +5 -1
  14. package/dist/Checkbox/index.js +1 -1
  15. package/dist/{Checkbox-BOXQ747I.css → Checkbox-UE7TEPAM.css} +9 -1
  16. package/dist/CodeBlock/index.js +4 -4
  17. package/dist/Combobox/index.js +3 -3
  18. package/dist/CommandPalette/index.js +6 -6
  19. package/dist/Copyable/index.js +3 -3
  20. package/dist/DataTable/index.js +6 -6
  21. package/dist/{DataTable-OLHPF7D4.css → DataTable-WZK3V62B.css} +11 -0
  22. package/dist/DataView/index.js +11 -11
  23. package/dist/DateTimePicker/index.js +4 -4
  24. package/dist/{DateTimePicker-22VNXRWC.css → DateTimePicker-4AZBTODT.css} +11 -6
  25. package/dist/ErrorBoundary/index.js +2 -2
  26. package/dist/FilterChip/index.js +1 -1
  27. package/dist/{FilterChip-GTGLLOXE.css → FilterChip-EZ4QMW4E.css} +4 -1
  28. package/dist/IconButton/index.js +1 -1
  29. package/dist/{IconButton-TVEUWK6L.css → IconButton-VYWP6SGW.css} +15 -0
  30. package/dist/ImageUpload/index.js +1 -1
  31. package/dist/{ImageUpload-YCHJMUGX.css → ImageUpload-L2GE4JUM.css} +5 -1
  32. package/dist/Input/index.js +2 -2
  33. package/dist/{Input-2PU5CPKK.css → Input-DRFNI26F.css} +40 -10
  34. package/dist/Kbd/index.js +1 -1
  35. package/dist/{Kbd-JPLDVJIP.css → Kbd-MCWJTRTT.css} +11 -0
  36. package/dist/ListInput/index.js +4 -4
  37. package/dist/Menu/index.js +3 -3
  38. package/dist/Modal/index.js +3 -3
  39. package/dist/NewItemsNotice/index.js +1 -1
  40. package/dist/{NewItemsNotice-T4DSSPVV.css → NewItemsNotice-Q5ED73BQ.css} +3 -1
  41. package/dist/OrgLabel/OrgLabel.d.ts +12 -3
  42. package/dist/OrgLabel/index.js +1 -1
  43. package/dist/{OrgLabel-CR233G34.css → OrgLabel-6WSKJQOT.css} +38 -0
  44. package/dist/OrgNode/OrgNode.d.ts +7 -4
  45. package/dist/OrgNode/index.js +2 -2
  46. package/dist/{OrgNode-BT7T2Q2X.css → OrgNode-TCHJH5FO.css} +89 -45
  47. package/dist/OrgTable/index.js +5 -5
  48. package/dist/{OrgTable-VWMFC3TB.css → OrgTable-JZSYTUIK.css} +28 -4
  49. package/dist/Popover/index.js +1 -1
  50. package/dist/{Popover-WJGCF3ZQ.css → Popover-QCINR7WG.css} +5 -2
  51. package/dist/PricingCard/index.js +2 -2
  52. package/dist/{PricingCard-7EFXRSD2.css → PricingCard-HTAHG4ST.css} +5 -1
  53. package/dist/SearchTrigger/index.js +1 -1
  54. package/dist/{SearchTrigger-Z5D4AAY7.css → SearchTrigger-KIZLWBEH.css} +4 -1
  55. package/dist/SegmentedControl/SegmentedControl.d.ts +19 -1
  56. package/dist/SegmentedControl/index.d.ts +1 -1
  57. package/dist/SegmentedControl/index.js +2 -2
  58. package/dist/SegmentedControl-76HODRBT.css +160 -0
  59. package/dist/Select/index.js +1 -1
  60. package/dist/{Select-E24U5LBC.css → Select-4ANVLHUY.css} +4 -4
  61. package/dist/Switch/index.js +1 -1
  62. package/dist/{Switch-U4OWK4CL.css → Switch-66RAQCRE.css} +8 -5
  63. package/dist/Tabs/index.js +1 -1
  64. package/dist/{Tabs-XCNPHA7B.css → Tabs-BWFQSWY3.css} +12 -0
  65. package/dist/Tag/index.js +1 -1
  66. package/dist/{Tag-4OXGO2DU.css → Tag-4BRQS6GN.css} +28 -1
  67. package/dist/TagGroup/index.js +1 -1
  68. package/dist/{TagGroup-APC2EFH4.css → TagGroup-BCQZD7ZD.css} +4 -1
  69. package/dist/TagsInput/index.js +3 -3
  70. package/dist/{TagsInput-W4P36PRJ.css → TagsInput-P2HS5QL4.css} +2 -2
  71. package/dist/ThemeSwitcher/index.js +3 -3
  72. package/dist/ThemeToggle/index.js +2 -2
  73. package/dist/TimeWindowPicker/index.js +6 -6
  74. package/dist/{TimeWindowPicker-7I7KWCMU.css → TimeWindowPicker-GBF4JDFI.css} +21 -8
  75. package/dist/Tree/layout.d.ts +3 -3
  76. package/dist/TreeCanvas/TreeCanvas.d.ts +7 -5
  77. package/dist/TreeCanvas/index.js +4 -4
  78. package/dist/{TreeCanvas-HVOV4SQN.css → TreeCanvas-L2XYONWL.css} +80 -74
  79. package/dist/TreeGrid/index.js +2 -2
  80. package/dist/{chunk-SVNXOK25.js → chunk-26SCUACK.js} +2 -2
  81. package/dist/{chunk-4UQ7SMPK.js → chunk-4FQT6ZAY.js} +1 -1
  82. package/dist/{chunk-IBYO2IJN.js → chunk-5I56UXBJ.js} +4 -4
  83. package/dist/{chunk-ZFATEERP.js → chunk-5YLON2PW.js} +1 -1
  84. package/dist/{chunk-EFYPAJT3.js → chunk-6DRDCT22.js} +1 -1
  85. package/dist/{chunk-PQNILU27.js → chunk-6HXH57BL.js} +3 -3
  86. package/dist/{chunk-BNCCEER3.js → chunk-6SIG5I72.js} +22 -11
  87. package/dist/{chunk-OM5E3TTK.js → chunk-74WGARJE.js} +5 -2
  88. package/dist/{chunk-EV6IMYJ6.js → chunk-A722MUNR.js} +1 -1
  89. package/dist/{chunk-WOFOMTGB.js → chunk-B47YUQGM.js} +6 -2
  90. package/dist/{chunk-MV2E3QZM.js → chunk-BTHX2FS3.js} +2 -2
  91. package/dist/{chunk-2QLOH454.js → chunk-BXPLX7YU.js} +3 -3
  92. package/dist/{chunk-V34H2YCY.js → chunk-CEOXFO3E.js} +1 -1
  93. package/dist/{chunk-KKLITCMF.js → chunk-CLPDVL46.js} +8 -8
  94. package/dist/{chunk-AGQ3YLA5.js → chunk-CVB7O3SZ.js} +6 -6
  95. package/dist/{chunk-QY7UU5ZB.js → chunk-DRHXRGB6.js} +1 -1
  96. package/dist/{chunk-V2XMNLMS.js → chunk-E6UWRXNM.js} +1 -1
  97. package/dist/{chunk-NQ2HQ6P5.js → chunk-HVPC2GHY.js} +6 -6
  98. package/dist/{chunk-FFKYL7Z3.js → chunk-L7THQMFB.js} +4 -2
  99. package/dist/{chunk-PAWGBSHU.js → chunk-LOECRMHA.js} +1 -1
  100. package/dist/{chunk-LSJZUA5V.js → chunk-LSB3EHBW.js} +2 -2
  101. package/dist/{chunk-ERHSECG2.js → chunk-MORLKUGM.js} +1 -1
  102. package/dist/{chunk-UWQWTGQH.js → chunk-MPXI6FM6.js} +3 -3
  103. package/dist/{chunk-DHPUMOTX.js → chunk-N5KCGFWI.js} +8 -4
  104. package/dist/{chunk-ZAO4HHXI.js → chunk-OG6CL3EB.js} +1 -1
  105. package/dist/{chunk-C5WJUZVR.js → chunk-ORNOOMVY.js} +1 -1
  106. package/dist/{chunk-WUVZDFHS.js → chunk-OVLJEVQS.js} +2 -2
  107. package/dist/{chunk-AUS5FNQE.js → chunk-PDUZO35I.js} +1 -1
  108. package/dist/{chunk-YLYOWZ4V.js → chunk-PXU6HOZB.js} +1 -1
  109. package/dist/{chunk-S7KW47IQ.js → chunk-RHHGLTXJ.js} +1 -1
  110. package/dist/{chunk-SJQ546ID.js → chunk-SEFMO2EV.js} +1 -1
  111. package/dist/{chunk-KJ34ZBBI.js → chunk-SMBKXWML.js} +1 -1
  112. package/dist/{chunk-FIFNP6PL.js → chunk-SX2DFTQV.js} +1 -1
  113. package/dist/{chunk-L6XZOCP4.js → chunk-UCYIRDND.js} +2 -2
  114. package/dist/{chunk-D6EVJUGU.js → chunk-UYK72NOS.js} +1 -1
  115. package/dist/{chunk-TIWAHZZ6.js → chunk-VCOELPCT.js} +2 -2
  116. package/dist/{chunk-2HY7I3NT.js → chunk-VE6LD3KM.js} +5 -3
  117. package/dist/{chunk-CAIHUYXV.js → chunk-W4GQWFRX.js} +1 -1
  118. package/dist/{chunk-BWIPKSWA.js → chunk-XX2VQE55.js} +1 -1
  119. package/dist/{chunk-UA7O3KKJ.js → chunk-YCTMKKRA.js} +1 -1
  120. package/dist/{chunk-DSUY5F4E.js → chunk-ZGX2DP7F.js} +2 -2
  121. package/dist/generated/index.js +41 -41
  122. package/dist/index.js +41 -41
  123. package/dist/styles.css +621 -222
  124. package/package.json +3 -3
  125. package/dist/SegmentedControl-X3BI3XU4.css +0 -68
@@ -103,32 +103,21 @@
103
103
  }
104
104
 
105
105
  /*
106
- * The halo: a hairline ring OUTSIDE the card's own boundary, at the lightest
107
- * of the hue's three alphas. It is what says a card is toned at all from the
108
- * far end of a chart, where the fill is a few pixels of tint; drawn as its own
109
- * ring rather than a second border so it never competes with the boundary that
110
- * says where the card ends. Pointer-transparent, because it is drawn over the
111
- * gap the next card's controls reach into.
112
- */
113
- .crewlet-tree-canvas__card[data-tone]::after {
114
- content: '';
115
- position: absolute;
116
- inset: -3px;
117
- border: 1px solid var(--crewlet-tree-canvas-card-halo);
118
- border-radius: var(--radius-lg);
119
- pointer-events: none;
120
- }
121
-
122
- /*
123
- * The six hues, each as the four steps a toned card draws: the fill it sits
124
- * on, the boundary around it, the halo outside that, and the ink its name is
125
- * written in. The ink is published as a variable rather than applied here
126
- * because WHICH text is the name is the caller's to say.
106
+ * ONE BOUNDARY, AND NO HALO. A toned card used to carry a second hairline ring
107
+ * 3px outside its boundary, at the lightest of the hue's alphas, so a toned
108
+ * card was framed twice: two parallel lines round one node read as a double
109
+ * border, which is the one thing no box in this package draws. The fill and
110
+ * the boundary in the hue already say the card is toned from across a chart.
111
+ *
112
+ * The six hues, each as the steps a toned card draws: the fill it sits on, the
113
+ * boundary around it, the ink its name is written in and the accent its mark
114
+ * takes. The ink and the accent are published as variables rather than applied
115
+ * here because WHICH text is the name and which drawing the mark is are the
116
+ * caller's to say.
127
117
  */
128
118
  .crewlet-tree-canvas__card[data-tone='purple'] {
129
119
  --crewlet-tree-canvas-card-fill: var(--color-node-purple-fill);
130
120
  --crewlet-tree-canvas-card-line: var(--color-node-purple-line);
131
- --crewlet-tree-canvas-card-halo: var(--color-node-purple-halo);
132
121
  --crewlet-tree-canvas-card-ink: var(--color-node-purple-ink);
133
122
  --crewlet-tree-canvas-card-accent: var(--color-node-purple);
134
123
  }
@@ -136,7 +125,6 @@
136
125
  .crewlet-tree-canvas__card[data-tone='cyan'] {
137
126
  --crewlet-tree-canvas-card-fill: var(--color-node-cyan-fill);
138
127
  --crewlet-tree-canvas-card-line: var(--color-node-cyan-line);
139
- --crewlet-tree-canvas-card-halo: var(--color-node-cyan-halo);
140
128
  --crewlet-tree-canvas-card-ink: var(--color-node-cyan-ink);
141
129
  --crewlet-tree-canvas-card-accent: var(--color-node-cyan);
142
130
  }
@@ -144,7 +132,6 @@
144
132
  .crewlet-tree-canvas__card[data-tone='green'] {
145
133
  --crewlet-tree-canvas-card-fill: var(--color-node-green-fill);
146
134
  --crewlet-tree-canvas-card-line: var(--color-node-green-line);
147
- --crewlet-tree-canvas-card-halo: var(--color-node-green-halo);
148
135
  --crewlet-tree-canvas-card-ink: var(--color-node-green-ink);
149
136
  --crewlet-tree-canvas-card-accent: var(--color-node-green);
150
137
  }
@@ -152,7 +139,6 @@
152
139
  .crewlet-tree-canvas__card[data-tone='amber'] {
153
140
  --crewlet-tree-canvas-card-fill: var(--color-node-amber-fill);
154
141
  --crewlet-tree-canvas-card-line: var(--color-node-amber-line);
155
- --crewlet-tree-canvas-card-halo: var(--color-node-amber-halo);
156
142
  --crewlet-tree-canvas-card-ink: var(--color-node-amber-ink);
157
143
  --crewlet-tree-canvas-card-accent: var(--color-node-amber);
158
144
  }
@@ -160,7 +146,6 @@
160
146
  .crewlet-tree-canvas__card[data-tone='rose'] {
161
147
  --crewlet-tree-canvas-card-fill: var(--color-node-rose-fill);
162
148
  --crewlet-tree-canvas-card-line: var(--color-node-rose-line);
163
- --crewlet-tree-canvas-card-halo: var(--color-node-rose-halo);
164
149
  --crewlet-tree-canvas-card-ink: var(--color-node-rose-ink);
165
150
  --crewlet-tree-canvas-card-accent: var(--color-node-rose);
166
151
  }
@@ -168,7 +153,6 @@
168
153
  .crewlet-tree-canvas__card[data-tone='blue'] {
169
154
  --crewlet-tree-canvas-card-fill: var(--color-node-blue-fill);
170
155
  --crewlet-tree-canvas-card-line: var(--color-node-blue-line);
171
- --crewlet-tree-canvas-card-halo: var(--color-node-blue-halo);
172
156
  --crewlet-tree-canvas-card-ink: var(--color-node-blue-ink);
173
157
  --crewlet-tree-canvas-card-accent: var(--color-node-blue);
174
158
  }
@@ -204,18 +188,43 @@
204
188
  * canvas clips, so an outset ring is cut away on the cards nearest the frame.
205
189
  * This component hands out the tab stop, so the indicator is its to draw; left
206
190
  * to the caller it was drawn on some charts and on others not at all.
191
+ *
192
+ * A CARD'S OWN NODE RINGS THE WHOLE CARD. Where the treeitem is the card's
193
+ * direct child, the card's edge IS the node's edge, and a ring drawn on the
194
+ * treeitem did two things wrong: it stopped short of anything the card holds
195
+ * under the node (a unit's lead), and it stood beside the card's boundary as a
196
+ * second line. So the ring is drawn on the card, over its boundary, and the
197
+ * treeitem draws none in any state, the way a field's control leaves its ring
198
+ * to the field. A row deeper inside a card (`*` between the two, because a row
199
+ * is always inside something the caller drew) has no boundary of its own, and
200
+ * keeps its ring.
207
201
  */
208
- .crewlet-tree-canvas__card [role='treeitem']:focus-visible {
202
+ .crewlet-tree-canvas__card * [role='treeitem']:focus-visible,
203
+ .crewlet-tree-canvas__card:has(> [role='treeitem']:focus-visible) {
209
204
  outline: 2px solid var(--color-focus);
210
205
  outline-offset: var(--size-focus-ring-inset-offset);
211
206
  }
212
207
 
208
+ .crewlet-tree-canvas__card > [role='treeitem'] {
209
+ outline: none;
210
+ }
211
+
213
212
  /* The selection is where the reader is, so it takes the accent. Inset, for the
214
213
  same reason the ring is. */
215
214
  .crewlet-tree-canvas__card [role='treeitem'][aria-selected='true'] {
216
215
  box-shadow: inset 0 0 0 1px var(--color-brand-accent);
217
216
  }
218
217
 
218
+ /* On a card's own node the selection IS the card's boundary, in the accent: an
219
+ inset ring beside the boundary drew two lines where one says it. */
220
+ .crewlet-tree-canvas__card:has(> [role='treeitem'][aria-selected='true']) {
221
+ border-color: var(--color-brand-accent);
222
+ }
223
+
224
+ .crewlet-tree-canvas__card > [role='treeitem'][aria-selected='true'] {
225
+ box-shadow: none;
226
+ }
227
+
219
228
  /*
220
229
  * THE POINTER'S CONTROLS, drawn over the end of the card and quiet until it is
221
230
  * reached.
@@ -360,8 +369,8 @@
360
369
  * The space around the whole chart, as a token, for the reason the gaps are
361
370
  * one. None by default: a chart of panels is read inside its own frame, and
362
371
  * the space around it is the page's. The `node` appearance takes the console
363
- * chart's own margin below, which is what keeps the outermost node's halo and
364
- * its focus ring off the canvas's clip.
372
+ * chart's own margin below, which is what keeps the control hanging under the
373
+ * outermost node off the canvas's clip.
365
374
  */
366
375
  .crewlet-tree-canvas__margin {
367
376
  width: var(--spacing-0);
@@ -635,8 +644,8 @@
635
644
  * drawn distance is the same number either way, and the room simply moved
636
645
  * from the card's box into the gap with the control that needs it.
637
646
  * - AROUND: `--spacing-8`, 40px against 36, and deliberately the step above
638
- * rather than below: the canvas CLIPS, and the outermost node's halo and
639
- * focus ring have to clear the frame.
647
+ * rather than below: the canvas CLIPS, and what hangs under the outermost
648
+ * node has to clear the frame.
640
649
  */
641
650
  .crewlet-tree-canvas--node .crewlet-tree-canvas__gap {
642
651
  width: var(--spacing-9);
@@ -980,6 +989,27 @@
980
989
  border-radius: 0;
981
990
  }
982
991
 
992
+ /*
993
+ * AND THEY ANSWER THE POINTER WITH THEIR INK, NOT A GROUND, as the console
994
+ * chart's do: the edit mark turns to the accent and the trash to the critical
995
+ * hue, and nothing is painted under either. A cell is a whole share of the
996
+ * node's corner, so a ground painted over it was a square standing past the
997
+ * card's rounded corner, the one place on a node with no room for a square.
998
+ */
999
+ .crewlet-tree-canvas--node
1000
+ .crewlet-tree-canvas__actions
1001
+ .crewlet-icon-btn:hover:not(:disabled):not([aria-disabled='true']) {
1002
+ background: none;
1003
+ border-color: transparent;
1004
+ color: var(--color-brand-accent-ink);
1005
+ }
1006
+
1007
+ .crewlet-tree-canvas--node
1008
+ .crewlet-tree-canvas__actions
1009
+ .crewlet-icon-btn--ghost-danger:hover:not(:disabled):not([aria-disabled='true']) {
1010
+ color: var(--color-feedback-danger-ink);
1011
+ }
1012
+
983
1013
  /*
984
1014
  * A CONTROL ON AN EDGE IS A DISC: a ground of its own, so the line it sits on,
985
1015
  * or the card it straddles, stops at its edge rather than running through it.
@@ -1081,38 +1111,29 @@
1081
1111
  background-image: linear-gradient(var(--color-surface-subtle), var(--color-surface-subtle));
1082
1112
  border: 1px dashed var(--color-brand-accent-soft-strong);
1083
1113
  box-shadow: var(--shadow-md);
1084
- animation: crewlet-tree-canvas-ghost-card var(--motion-duration-slow) var(--motion-easing-emphasized)
1085
- var(--motion-duration-base) both;
1086
- }
1087
-
1088
- /*
1089
- * THE RING THAT BREATHES, outside the boundary, exactly where a toned card's
1090
- * halo is: it is what says the card is waiting for the reader from the far
1091
- * end of a chart, where a dashed hairline is a few pixels. It is decoration
1092
- * over the gap the next card's controls reach into, so it takes no pointer.
1093
- */
1094
- .crewlet-tree-canvas__card--composing::after {
1095
- content: '';
1096
- position: absolute;
1097
- inset: -3px;
1098
- border: 1px solid var(--color-brand-accent-soft-strong);
1099
- border-radius: var(--radius-lg);
1100
- pointer-events: none;
1114
+ /*
1115
+ * THE BOUNDARY BREATHES, which is what says the card is waiting for the
1116
+ * reader from the far end of a chart, where a dashed hairline is a few
1117
+ * pixels. It used to be a second ring 3px outside the boundary that
1118
+ * breathed instead, two lines round one card where every box in this
1119
+ * package draws one, so the dashed boundary itself moves between the soft
1120
+ * accent and the full one.
1121
+ */
1101
1122
  animation:
1102
- crewlet-tree-canvas-ghost-glow var(--motion-duration-slow) var(--motion-easing-default)
1103
- var(--motion-duration-moderate) both,
1123
+ crewlet-tree-canvas-ghost-card var(--motion-duration-slow) var(--motion-easing-emphasized)
1124
+ var(--motion-duration-base) both,
1104
1125
  /* A BREATH RATHER THAN A TRANSITION, so it is a multiple of the scale's
1105
1126
  longest step (1.8s) rather than a number off it: the scale tops out at
1106
1127
  one UI transition, and a pulse held there would strobe. The console
1107
- chart's own is 2s. It starts where the fade in ends. */
1128
+ chart's own is 2s. It starts where the card's arrival ends. */
1108
1129
  crewlet-tree-canvas-ghost-pulse calc(var(--motion-duration-slow) * 6)
1109
- var(--motion-easing-in-out)
1110
- calc(var(--motion-duration-moderate) + var(--motion-duration-slow)) infinite;
1130
+ var(--motion-easing-in-out) calc(var(--motion-duration-base) + var(--motion-duration-slow))
1131
+ infinite;
1111
1132
  }
1112
1133
 
1113
1134
  /*
1114
1135
  * THE FORM ARRIVES LAST, and from slightly above and behind: the wire, then
1115
- * the card, then the glow, then what is inside it, which is the order a reader
1136
+ * the card, then what is inside it, which is the order a reader
1116
1137
  * follows from the node they pressed to the thing they have to fill in. The
1117
1138
  * caller's own element, whatever it drew, because the ghost's contents are
1118
1139
  * entirely the caller's.
@@ -1156,24 +1177,14 @@
1156
1177
  }
1157
1178
  }
1158
1179
 
1159
- @keyframes crewlet-tree-canvas-ghost-glow {
1160
- from {
1161
- opacity: 0;
1162
- }
1163
-
1164
- to {
1165
- opacity: 1;
1166
- }
1167
- }
1168
-
1169
1180
  @keyframes crewlet-tree-canvas-ghost-pulse {
1170
1181
  0%,
1171
1182
  100% {
1172
- opacity: 0.5;
1183
+ border-color: var(--color-brand-accent-soft-strong);
1173
1184
  }
1174
1185
 
1175
1186
  50% {
1176
- opacity: 1;
1187
+ border-color: var(--color-brand-accent);
1177
1188
  }
1178
1189
  }
1179
1190
 
@@ -1193,8 +1204,8 @@
1193
1204
  * A READER WHO ASKED FOR LESS gets the ghost DRAWN, in place, at once. Nothing
1194
1205
  * about the add is behind the motion: the chart still makes room, the branch
1195
1206
  * is still dashed, the view still moves onto it and focus still lands in the
1196
- * form. Only the arrival, the breath and the rise are dropped, and the ring
1197
- * stays at the bright end of the pulse rather than wherever it was stopped.
1207
+ * form. Only the arrival, the breath and the rise are dropped, and the
1208
+ * boundary rests at the soft step it breathes from.
1198
1209
  */
1199
1210
  @media (prefers-reduced-motion: reduce) {
1200
1211
  /* NOT `transform` on the card itself: its transform is where the layout
@@ -1214,9 +1225,4 @@
1214
1225
  transform: none;
1215
1226
  animation: none;
1216
1227
  }
1217
-
1218
- .crewlet-tree-canvas__card--composing::after {
1219
- opacity: 1;
1220
- animation: none;
1221
- }
1222
1228
  }
@@ -1,8 +1,8 @@
1
- export { TreeGrid } from '../chunk-FIFNP6PL.js';
1
+ export { TreeGrid } from '../chunk-SX2DFTQV.js';
2
2
  import '../chunk-S3BCVWTU.js';
3
3
  import '../chunk-53DVJCVW.js';
4
4
  import '../chunk-7RPGY3JE.js';
5
5
  import '../chunk-R25RGPUB.js';
6
- import '../chunk-4UQ7SMPK.js';
6
+ import '../chunk-4FQT6ZAY.js';
7
7
  import '../chunk-BZFWDIV6.js';
8
8
  import '../chunk-ODEQTPFM.js';
@@ -1,6 +1,6 @@
1
1
  import { useClipboard } from './chunk-5VNUYO76.js';
2
- import { IconButton } from './chunk-4UQ7SMPK.js';
3
- import { Button } from './chunk-ZAO4HHXI.js';
2
+ import { IconButton } from './chunk-4FQT6ZAY.js';
3
+ import { Button } from './chunk-OG6CL3EB.js';
4
4
  import { VisuallyHidden } from './chunk-BZFWDIV6.js';
5
5
  import { cx } from './chunk-ODEQTPFM.js';
6
6
  import './Copyable-5PNRFOLS.css';
@@ -1,6 +1,6 @@
1
1
  import { VisuallyHidden } from './chunk-BZFWDIV6.js';
2
2
  import { cx } from './chunk-ODEQTPFM.js';
3
- import './IconButton-TVEUWK6L.css';
3
+ import './IconButton-VYWP6SGW.css';
4
4
  import { forwardRef, useId, Children, isValidElement, cloneElement } from 'react';
5
5
  import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
6
6
 
@@ -1,9 +1,9 @@
1
- import { Popover } from './chunk-AUS5FNQE.js';
1
+ import { Popover } from './chunk-PDUZO35I.js';
2
2
  import { today, CalendarGrid, shiftMonth, compareDays } from './chunk-GXQ3B46I.js';
3
- import { IconButton } from './chunk-4UQ7SMPK.js';
4
- import { Button } from './chunk-ZAO4HHXI.js';
3
+ import { IconButton } from './chunk-4FQT6ZAY.js';
4
+ import { Button } from './chunk-OG6CL3EB.js';
5
5
  import { cx } from './chunk-ODEQTPFM.js';
6
- import './DateTimePicker-22VNXRWC.css';
6
+ import './DateTimePicker-4AZBTODT.css';
7
7
  import { useMemo, useState, useEffect } from 'react';
8
8
  import { CalendarGlyph, ChevronDownGlyph, ChevronsLeftGlyph, ChevronLeftGlyph, ChevronRightGlyph, ChevronsRightGlyph } from '@crewlethq/icons/glyphs';
9
9
  import { jsx, jsxs } from 'react/jsx-runtime';
@@ -1,6 +1,6 @@
1
1
  import { VisuallyHidden } from './chunk-BZFWDIV6.js';
2
2
  import { cx } from './chunk-ODEQTPFM.js';
3
- import './FilterChip-GTGLLOXE.css';
3
+ import './FilterChip-EZ4QMW4E.css';
4
4
  import { createContext, useContext, useRef, useId, useCallback, useLayoutEffect } from 'react';
5
5
  import { jsxs, jsx } from 'react/jsx-runtime';
6
6
 
@@ -1,5 +1,5 @@
1
1
  import { cx } from './chunk-ODEQTPFM.js';
2
- import './SearchTrigger-Z5D4AAY7.css';
2
+ import './SearchTrigger-KIZLWBEH.css';
3
3
  import { forwardRef } from 'react';
4
4
  import { SearchGlyph } from '@crewlethq/icons/glyphs';
5
5
  import { jsxs, jsx } from 'react/jsx-runtime';
@@ -1,8 +1,8 @@
1
- import { Kbd } from './chunk-KJ34ZBBI.js';
2
- import { FormField, Textarea, Input } from './chunk-DSUY5F4E.js';
1
+ import { Kbd } from './chunk-SMBKXWML.js';
2
+ import { FormField, Textarea, Input } from './chunk-ZGX2DP7F.js';
3
3
  import { announce } from './chunk-RSAQOKH3.js';
4
4
  import { isComposing } from './chunk-R25RGPUB.js';
5
- import { IconButton } from './chunk-4UQ7SMPK.js';
5
+ import { IconButton } from './chunk-4FQT6ZAY.js';
6
6
  import './ListInput-O7LJKOIG.css';
7
7
  import { useState, useRef, useLayoutEffect } from 'react';
8
8
  import { ArrowUpGlyph, ArrowDownGlyph, XGlyph, PlusGlyph } from '@crewlethq/icons/glyphs';
@@ -1,10 +1,10 @@
1
- import { TreeGrid } from './chunk-FIFNP6PL.js';
2
- import { createTreeModel } from './chunk-S3BCVWTU.js';
3
- import { OrgLabel } from './chunk-WOFOMTGB.js';
4
- import { AddPill } from './chunk-OM5E3TTK.js';
5
- import { IconButton } from './chunk-4UQ7SMPK.js';
1
+ import { TreeGrid } from './chunk-SX2DFTQV.js';
2
+ import { createTreeModel, treeParent } from './chunk-S3BCVWTU.js';
3
+ import { OrgLabel } from './chunk-B47YUQGM.js';
4
+ import { AddPill } from './chunk-74WGARJE.js';
5
+ import { IconButton } from './chunk-4FQT6ZAY.js';
6
6
  import { cx } from './chunk-ODEQTPFM.js';
7
- import './OrgTable-VWMFC3TB.css';
7
+ import './OrgTable-JZSYTUIK.css';
8
8
  import { useMemo, useRef, useImperativeHandle, useCallback } from 'react';
9
9
  import { ChevronDownGlyph, ChevronUpGlyph } from '@crewlethq/icons/glyphs';
10
10
  import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
@@ -24,7 +24,7 @@ function OrgTable({
24
24
  ...rest
25
25
  }) {
26
26
  const text = { ...LABELS, ...labels };
27
- const depths = useMemo(() => createTreeModel(rows).depth, [rows]);
27
+ const tree = useMemo(() => createTreeModel(rows), [rows]);
28
28
  const grid = useRef(null);
29
29
  useImperativeHandle(
30
30
  ref,
@@ -38,20 +38,22 @@ function OrgTable({
38
38
  const cell = useCallback(
39
39
  (id, column, context) => {
40
40
  if (column !== 1) return renderCell(id, column, context);
41
- const depth = depths.get(id) ?? 0;
41
+ const depth = tree.depth.get(id) ?? 0;
42
+ const open = context.expandable(id) && context.expanded(id);
42
43
  return /* @__PURE__ */ jsxs(Fragment, { children: [
43
44
  /* @__PURE__ */ jsx(
44
45
  OrgTableWire,
45
46
  {
46
47
  depth,
47
48
  tone: tone?.(id),
48
- trunk: depth > 0 || context.expandable(id) && context.expanded(id)
49
+ trunk: depth > 0 || open,
50
+ last: !open && lastUnderRoot(tree, id)
49
51
  }
50
52
  ),
51
53
  renderCell(id, column, context)
52
54
  ] });
53
55
  },
54
- [depths, renderCell, tone]
56
+ [tree, renderCell, tone]
55
57
  );
56
58
  return /* @__PURE__ */ jsxs("div", { className: cx("crewlet-org-table", className), children: [
57
59
  controls && /*
@@ -97,10 +99,18 @@ function OrgTable({
97
99
  )
98
100
  ] });
99
101
  }
102
+ function lastUnderRoot(tree, id) {
103
+ for (let at = id, up = treeParent(tree, id); up !== null; at = up, up = treeParent(tree, up)) {
104
+ const siblings = tree.children.get(up) ?? [];
105
+ if (siblings[siblings.length - 1] !== at) return false;
106
+ }
107
+ return true;
108
+ }
100
109
  function OrgTableWire({
101
110
  depth,
102
111
  tone,
103
- trunk
112
+ trunk,
113
+ last
104
114
  }) {
105
115
  return /* @__PURE__ */ jsx(
106
116
  "span",
@@ -108,6 +118,7 @@ function OrgTableWire({
108
118
  className: "crewlet-org-table__wire",
109
119
  "aria-hidden": "true",
110
120
  "data-trunk": trunk ? "" : void 0,
121
+ "data-last": last ? "" : void 0,
111
122
  "data-root": depth === 0 ? "" : void 0,
112
123
  "data-tone": tone,
113
124
  style: { "--crewlet-org-table-depth": depth }
@@ -1,6 +1,6 @@
1
1
  import { VisuallyHidden } from './chunk-BZFWDIV6.js';
2
2
  import { cx } from './chunk-ODEQTPFM.js';
3
- import './AddPill-IJQYCY6C.css';
3
+ import './AddPill-V4TQXJ53.css';
4
4
  import { useState, useId, useRef, useCallback, useEffect, Fragment } from 'react';
5
5
  import { jsxs, jsx } from 'react/jsx-runtime';
6
6
 
@@ -93,7 +93,10 @@ function AddPill({
93
93
  onClick: press,
94
94
  children: [
95
95
  /* @__PURE__ */ jsx("span", { className: "crewlet-add-pill__disc", "aria-hidden": "true" }),
96
- /* @__PURE__ */ jsx("svg", { viewBox: "0 0 16 16", "aria-hidden": "true", focusable: "false", children: /* @__PURE__ */ jsx("path", { d: "M8 3.5v9M3.5 8h9" }) })
96
+ /* @__PURE__ */ jsxs("svg", { viewBox: "0 0 16 16", "aria-hidden": "true", focusable: "false", children: [
97
+ /* @__PURE__ */ jsx("circle", { cx: "8", cy: "8", r: "7" }),
98
+ /* @__PURE__ */ jsx("path", { d: "M8 4.5v7M4.5 8h7" })
99
+ ] })
97
100
  ]
98
101
  }
99
102
  ),
@@ -1,5 +1,5 @@
1
1
  import { cx } from './chunk-ODEQTPFM.js';
2
- import './Switch-U4OWK4CL.css';
2
+ import './Switch-66RAQCRE.css';
3
3
  import { forwardRef, useId } from 'react';
4
4
  import { jsxs, jsx } from 'react/jsx-runtime';
5
5
 
@@ -1,6 +1,6 @@
1
1
  import { Avatar } from './chunk-IA232OTU.js';
2
2
  import { cx } from './chunk-ODEQTPFM.js';
3
- import './OrgLabel-CR233G34.css';
3
+ import './OrgLabel-6WSKJQOT.css';
4
4
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
5
5
 
6
6
  function OrgLabel(props) {
@@ -8,7 +8,11 @@ function OrgLabel(props) {
8
8
  const zone = props.avatar === void 0 ? /* @__PURE__ */ jsx(
9
9
  "span",
10
10
  {
11
- className: cx("crewlet-org-label__icon", props.iconSize === "lg" && "crewlet-org-label__icon--lg"),
11
+ className: cx(
12
+ "crewlet-org-label__icon",
13
+ props.iconSize === "lg" && "crewlet-org-label__icon--lg",
14
+ props.iconRing === true && "crewlet-org-label__icon--ring"
15
+ ),
12
16
  "aria-hidden": "true",
13
17
  children: props.icon
14
18
  }
@@ -1,8 +1,8 @@
1
1
  import { HeadingLevelProvider } from './chunk-PQADV6P6.js';
2
2
  import { useLayerContainer } from './chunk-7RPGY3JE.js';
3
3
  import { focusables, useModalLayer, useBodyScrollLock } from './chunk-R25RGPUB.js';
4
- import { IconButton } from './chunk-4UQ7SMPK.js';
5
- import { Button } from './chunk-ZAO4HHXI.js';
4
+ import { IconButton } from './chunk-4FQT6ZAY.js';
5
+ import { Button } from './chunk-OG6CL3EB.js';
6
6
  import { cx } from './chunk-ODEQTPFM.js';
7
7
  import './Modal-BNT3TDV2.css';
8
8
  import { useId, useRef, useCallback } from 'react';
@@ -1,7 +1,7 @@
1
- import { Kbd } from './chunk-KJ34ZBBI.js';
2
- import { Modal } from './chunk-MV2E3QZM.js';
1
+ import { Kbd } from './chunk-SMBKXWML.js';
2
+ import { Modal } from './chunk-BTHX2FS3.js';
3
3
  import { useListbox } from './chunk-6MU7HNB4.js';
4
- import { Input } from './chunk-DSUY5F4E.js';
4
+ import { Input } from './chunk-ZGX2DP7F.js';
5
5
  import { Count } from './chunk-BHHIIK3M.js';
6
6
  import { isComposing } from './chunk-R25RGPUB.js';
7
7
  import { VisuallyHidden } from './chunk-BZFWDIV6.js';
@@ -2,7 +2,7 @@ import { CardHeaderSlotContext } from './chunk-AV2DXAEL.js';
2
2
  import { Count } from './chunk-BHHIIK3M.js';
3
3
  import { useHeadingLevel, HeadingLevelProvider, nextHeadingLevel, headingTag } from './chunk-PQADV6P6.js';
4
4
  import { cx } from './chunk-ODEQTPFM.js';
5
- import './Card-GLP7SUV6.css';
5
+ import './Card-KJOYHDTJ.css';
6
6
  import { createContext, useId, useState, isValidElement, useRef, useCallback, useMemo, Children, cloneElement, useContext, useEffect, Fragment } from 'react';
7
7
  import { jsx, jsxs } from 'react/jsx-runtime';
8
8
 
@@ -1,16 +1,16 @@
1
1
  import { Toolbar } from './chunk-PGRPNDWM.js';
2
2
  import { PageHeader } from './chunk-HOXGBLEY.js';
3
3
  import { RelativeTime } from './chunk-3CZ7XAVY.js';
4
- import { Kbd } from './chunk-KJ34ZBBI.js';
5
- import { DataTable } from './chunk-AGQ3YLA5.js';
6
- import { Menu } from './chunk-LSJZUA5V.js';
7
- import { DateTimePicker } from './chunk-IBYO2IJN.js';
8
- import { Popover } from './chunk-AUS5FNQE.js';
4
+ import { Kbd } from './chunk-SMBKXWML.js';
5
+ import { DataTable } from './chunk-CVB7O3SZ.js';
6
+ import { Menu } from './chunk-LSB3EHBW.js';
7
+ import { DateTimePicker } from './chunk-5I56UXBJ.js';
8
+ import { Popover } from './chunk-PDUZO35I.js';
9
9
  import { useListbox, useOptionKeys } from './chunk-6MU7HNB4.js';
10
- import { Input } from './chunk-DSUY5F4E.js';
10
+ import { Input } from './chunk-ZGX2DP7F.js';
11
11
  import { Count } from './chunk-BHHIIK3M.js';
12
- import { IconButton } from './chunk-4UQ7SMPK.js';
13
- import { Button } from './chunk-ZAO4HHXI.js';
12
+ import { IconButton } from './chunk-4FQT6ZAY.js';
13
+ import { Button } from './chunk-OG6CL3EB.js';
14
14
  import { VisuallyHidden } from './chunk-BZFWDIV6.js';
15
15
  import { cx } from './chunk-ODEQTPFM.js';
16
16
  import './DataView-N6JX464S.css';
@@ -1,14 +1,14 @@
1
- import { Menu } from './chunk-LSJZUA5V.js';
1
+ import { Menu } from './chunk-LSB3EHBW.js';
2
2
  import { EmptyValue } from './chunk-EUCC37WY.js';
3
- import { Modal } from './chunk-MV2E3QZM.js';
3
+ import { Modal } from './chunk-BTHX2FS3.js';
4
4
  import { useCardHeaderSlot } from './chunk-AV2DXAEL.js';
5
- import { Checkbox } from './chunk-UA7O3KKJ.js';
5
+ import { Checkbox } from './chunk-YCTMKKRA.js';
6
6
  import { useClipboard } from './chunk-5VNUYO76.js';
7
- import { IconButton } from './chunk-4UQ7SMPK.js';
8
- import { Button } from './chunk-ZAO4HHXI.js';
7
+ import { IconButton } from './chunk-4FQT6ZAY.js';
8
+ import { Button } from './chunk-OG6CL3EB.js';
9
9
  import { VisuallyHidden } from './chunk-BZFWDIV6.js';
10
10
  import { cx } from './chunk-ODEQTPFM.js';
11
- import './DataTable-OLHPF7D4.css';
11
+ import './DataTable-WZK3V62B.css';
12
12
  import React, { useState, useCallback, useMemo, useRef, useLayoutEffect, useEffect, useId } from 'react';
13
13
  import { createPortal } from 'react-dom';
14
14
  import { CheckGlyph, CircleAlertGlyph, CopyGlyph, ChevronsLeftGlyph, ChevronLeftGlyph, ChevronRightGlyph, ChevronsRightGlyph, SettingsGlyph, GripVerticalGlyph, ChevronUpGlyph, ChevronDownGlyph, TrashGlyph, ArrowUpGlyph, ArrowDownGlyph, ChevronsUpDownGlyph, RotateCcwGlyph } from '@crewlethq/icons/glyphs';
@@ -1,6 +1,6 @@
1
1
  import { Count } from './chunk-BHHIIK3M.js';
2
2
  import { cx } from './chunk-ODEQTPFM.js';
3
- import './Tabs-XCNPHA7B.css';
3
+ import './Tabs-BWFQSWY3.css';
4
4
  import React, { useRef, useState, useLayoutEffect } from 'react';
5
5
  import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
6
6
 
@@ -1,6 +1,6 @@
1
1
  import { useAnnouncer } from './chunk-RSAQOKH3.js';
2
2
  import { cx } from './chunk-ODEQTPFM.js';
3
- import './TagGroup-APC2EFH4.css';
3
+ import './TagGroup-BCQZD7ZD.css';
4
4
  import { useState, useRef, Children } from 'react';
5
5
  import { jsxs, jsx } from 'react/jsx-runtime';
6
6
 
@@ -1,12 +1,12 @@
1
- import { Select } from './chunk-SJQ546ID.js';
2
- import { Popover } from './chunk-AUS5FNQE.js';
1
+ import { Select } from './chunk-SEFMO2EV.js';
2
+ import { Popover } from './chunk-PDUZO35I.js';
3
3
  import { today, shiftMonth, CalendarGrid, compareDays } from './chunk-GXQ3B46I.js';
4
- import { Input } from './chunk-DSUY5F4E.js';
4
+ import { Input } from './chunk-ZGX2DP7F.js';
5
5
  import { isComposing } from './chunk-R25RGPUB.js';
6
- import { IconButton } from './chunk-4UQ7SMPK.js';
7
- import { Button } from './chunk-ZAO4HHXI.js';
6
+ import { IconButton } from './chunk-4FQT6ZAY.js';
7
+ import { Button } from './chunk-OG6CL3EB.js';
8
8
  import { cx } from './chunk-ODEQTPFM.js';
9
- import './TimeWindowPicker-7I7KWCMU.css';
9
+ import './TimeWindowPicker-GBF4JDFI.css';
10
10
  import { useMemo, useState, useRef, useId, useEffect } from 'react';
11
11
  import { ClockGlyph, ChevronDownGlyph, CheckGlyph, ChevronLeftGlyph, ChevronRightGlyph } from '@crewlethq/icons/glyphs';
12
12
  import { jsx, jsxs } from 'react/jsx-runtime';
@@ -1,8 +1,8 @@
1
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-2HY7I3NT.js';
2
+ import { CANVAS_COMPOSE_CONTEXT, CANVAS_FIT_MAX_ZOOM, Canvas } from './chunk-VE6LD3KM.js';
3
3
  import { focusables } from './chunk-R25RGPUB.js';
4
4
  import { cx } from './chunk-ODEQTPFM.js';
5
- import './TreeCanvas-HVOV4SQN.css';
5
+ import './TreeCanvas-L2XYONWL.css';
6
6
  import { useState, useRef, useMemo, useLayoutEffect, useCallback, useImperativeHandle, useId, useSyncExternalStore } from 'react';
7
7
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
8
8
 
@@ -133,6 +133,7 @@ function TreeCanvas({
133
133
  controlsBelow,
134
134
  hint,
135
135
  dimmed = false,
136
+ ground,
136
137
  composing = null,
137
138
  labels,
138
139
  ref,
@@ -461,6 +462,7 @@ function TreeCanvas({
461
462
  controlsBelow,
462
463
  hint,
463
464
  dimmed,
465
+ ground,
464
466
  largestItemWidth: widestCard,
465
467
  labels,
466
468
  children: [
@@ -1,6 +1,6 @@
1
1
  import { StatusDot } from './chunk-WIATRXEJ.js';
2
2
  import { cx } from './chunk-ODEQTPFM.js';
3
- import './Tag-4OXGO2DU.css';
3
+ import './Tag-4BRQS6GN.css';
4
4
  import { XGlyph } from '@crewlethq/icons/glyphs';
5
5
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
6
6