@crewlethq/ui 0.6.3 → 0.8.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 (130) 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/Charts/BarList.d.ts +23 -0
  15. package/dist/Charts/index.d.ts +1 -1
  16. package/dist/Charts/index.js +1 -1
  17. package/dist/{Charts-B3YEF7R4.css → Charts-THPA5BWV.css} +40 -0
  18. package/dist/Checkbox/index.js +1 -1
  19. package/dist/{Checkbox-BOXQ747I.css → Checkbox-UE7TEPAM.css} +9 -1
  20. package/dist/CodeBlock/index.js +4 -4
  21. package/dist/Combobox/index.js +3 -3
  22. package/dist/CommandPalette/index.js +6 -6
  23. package/dist/Copyable/index.js +3 -3
  24. package/dist/DataTable/index.js +6 -6
  25. package/dist/{DataTable-OLHPF7D4.css → DataTable-WZK3V62B.css} +11 -0
  26. package/dist/DataView/index.js +11 -11
  27. package/dist/DateTimePicker/index.js +4 -4
  28. package/dist/{DateTimePicker-22VNXRWC.css → DateTimePicker-4AZBTODT.css} +11 -6
  29. package/dist/ErrorBoundary/index.js +2 -2
  30. package/dist/FilterChip/index.js +1 -1
  31. package/dist/{FilterChip-GTGLLOXE.css → FilterChip-EZ4QMW4E.css} +4 -1
  32. package/dist/IconButton/index.js +1 -1
  33. package/dist/{IconButton-TVEUWK6L.css → IconButton-VYWP6SGW.css} +15 -0
  34. package/dist/ImageUpload/index.js +1 -1
  35. package/dist/{ImageUpload-YCHJMUGX.css → ImageUpload-L2GE4JUM.css} +5 -1
  36. package/dist/Input/index.js +2 -2
  37. package/dist/{Input-2PU5CPKK.css → Input-DRFNI26F.css} +40 -10
  38. package/dist/Kbd/index.js +1 -1
  39. package/dist/{Kbd-JPLDVJIP.css → Kbd-MCWJTRTT.css} +11 -0
  40. package/dist/ListInput/index.js +4 -4
  41. package/dist/Menu/index.js +3 -3
  42. package/dist/Modal/index.js +3 -3
  43. package/dist/NewItemsNotice/index.js +1 -1
  44. package/dist/{NewItemsNotice-T4DSSPVV.css → NewItemsNotice-Q5ED73BQ.css} +3 -1
  45. package/dist/OrgLabel/OrgLabel.d.ts +12 -3
  46. package/dist/OrgLabel/index.js +1 -1
  47. package/dist/{OrgLabel-CR233G34.css → OrgLabel-6WSKJQOT.css} +38 -0
  48. package/dist/OrgNode/OrgNode.d.ts +7 -4
  49. package/dist/OrgNode/index.js +2 -2
  50. package/dist/{OrgNode-BT7T2Q2X.css → OrgNode-TCHJH5FO.css} +89 -45
  51. package/dist/OrgTable/index.js +5 -5
  52. package/dist/{OrgTable-VWMFC3TB.css → OrgTable-JZSYTUIK.css} +28 -4
  53. package/dist/Popover/index.js +1 -1
  54. package/dist/{Popover-WJGCF3ZQ.css → Popover-QCINR7WG.css} +5 -2
  55. package/dist/PricingCard/index.js +2 -2
  56. package/dist/{PricingCard-7EFXRSD2.css → PricingCard-HTAHG4ST.css} +5 -1
  57. package/dist/SearchTrigger/index.js +1 -1
  58. package/dist/{SearchTrigger-Z5D4AAY7.css → SearchTrigger-KIZLWBEH.css} +4 -1
  59. package/dist/SegmentedControl/SegmentedControl.d.ts +19 -1
  60. package/dist/SegmentedControl/index.d.ts +1 -1
  61. package/dist/SegmentedControl/index.js +2 -2
  62. package/dist/SegmentedControl-76HODRBT.css +160 -0
  63. package/dist/Select/index.js +1 -1
  64. package/dist/{Select-E24U5LBC.css → Select-4ANVLHUY.css} +4 -4
  65. package/dist/Switch/index.js +1 -1
  66. package/dist/{Switch-U4OWK4CL.css → Switch-66RAQCRE.css} +8 -5
  67. package/dist/Tabs/index.js +1 -1
  68. package/dist/{Tabs-XCNPHA7B.css → Tabs-BWFQSWY3.css} +12 -0
  69. package/dist/Tag/index.js +1 -1
  70. package/dist/{Tag-4OXGO2DU.css → Tag-4BRQS6GN.css} +28 -1
  71. package/dist/TagGroup/index.js +1 -1
  72. package/dist/{TagGroup-APC2EFH4.css → TagGroup-BCQZD7ZD.css} +4 -1
  73. package/dist/TagsInput/index.js +3 -3
  74. package/dist/{TagsInput-W4P36PRJ.css → TagsInput-P2HS5QL4.css} +2 -2
  75. package/dist/ThemeSwitcher/index.js +3 -3
  76. package/dist/ThemeToggle/index.js +2 -2
  77. package/dist/TimeWindowPicker/index.js +6 -6
  78. package/dist/{TimeWindowPicker-7I7KWCMU.css → TimeWindowPicker-GBF4JDFI.css} +21 -8
  79. package/dist/Tree/layout.d.ts +3 -3
  80. package/dist/TreeCanvas/TreeCanvas.d.ts +7 -5
  81. package/dist/TreeCanvas/index.js +4 -4
  82. package/dist/{TreeCanvas-HVOV4SQN.css → TreeCanvas-L2XYONWL.css} +80 -74
  83. package/dist/TreeGrid/index.js +2 -2
  84. package/dist/{chunk-SVNXOK25.js → chunk-26SCUACK.js} +2 -2
  85. package/dist/{chunk-4UQ7SMPK.js → chunk-4FQT6ZAY.js} +1 -1
  86. package/dist/{chunk-IBYO2IJN.js → chunk-5I56UXBJ.js} +4 -4
  87. package/dist/{chunk-ZFATEERP.js → chunk-5YLON2PW.js} +1 -1
  88. package/dist/{chunk-EFYPAJT3.js → chunk-6DRDCT22.js} +1 -1
  89. package/dist/{chunk-PQNILU27.js → chunk-6HXH57BL.js} +3 -3
  90. package/dist/{chunk-BNCCEER3.js → chunk-6SIG5I72.js} +22 -11
  91. package/dist/{chunk-RJM4QCGG.js → chunk-6VL4LGWC.js} +36 -13
  92. package/dist/{chunk-OM5E3TTK.js → chunk-74WGARJE.js} +5 -2
  93. package/dist/{chunk-EV6IMYJ6.js → chunk-A722MUNR.js} +1 -1
  94. package/dist/{chunk-WOFOMTGB.js → chunk-B47YUQGM.js} +6 -2
  95. package/dist/{chunk-MV2E3QZM.js → chunk-BTHX2FS3.js} +2 -2
  96. package/dist/{chunk-2QLOH454.js → chunk-BXPLX7YU.js} +3 -3
  97. package/dist/{chunk-V34H2YCY.js → chunk-CEOXFO3E.js} +1 -1
  98. package/dist/{chunk-KKLITCMF.js → chunk-CHG7VT2M.js} +8 -8
  99. package/dist/{chunk-QY7UU5ZB.js → chunk-DRHXRGB6.js} +1 -1
  100. package/dist/{chunk-V2XMNLMS.js → chunk-E6UWRXNM.js} +1 -1
  101. package/dist/{chunk-NQ2HQ6P5.js → chunk-HVPC2GHY.js} +6 -6
  102. package/dist/{chunk-FFKYL7Z3.js → chunk-L7THQMFB.js} +4 -2
  103. package/dist/{chunk-PAWGBSHU.js → chunk-LOECRMHA.js} +1 -1
  104. package/dist/{chunk-LSJZUA5V.js → chunk-LSB3EHBW.js} +2 -2
  105. package/dist/{chunk-ERHSECG2.js → chunk-MORLKUGM.js} +1 -1
  106. package/dist/{chunk-UWQWTGQH.js → chunk-MPXI6FM6.js} +3 -3
  107. package/dist/{chunk-DHPUMOTX.js → chunk-N5KCGFWI.js} +8 -4
  108. package/dist/{chunk-ZAO4HHXI.js → chunk-OG6CL3EB.js} +1 -1
  109. package/dist/{chunk-C5WJUZVR.js → chunk-ORNOOMVY.js} +1 -1
  110. package/dist/{chunk-WUVZDFHS.js → chunk-OVLJEVQS.js} +2 -2
  111. package/dist/{chunk-AUS5FNQE.js → chunk-PDUZO35I.js} +1 -1
  112. package/dist/{chunk-YLYOWZ4V.js → chunk-PXU6HOZB.js} +1 -1
  113. package/dist/{chunk-AGQ3YLA5.js → chunk-QJZ3Y6WW.js} +6 -6
  114. package/dist/{chunk-S7KW47IQ.js → chunk-RHHGLTXJ.js} +1 -1
  115. package/dist/{chunk-SJQ546ID.js → chunk-SEFMO2EV.js} +1 -1
  116. package/dist/{chunk-KJ34ZBBI.js → chunk-SMBKXWML.js} +1 -1
  117. package/dist/{chunk-FIFNP6PL.js → chunk-SX2DFTQV.js} +1 -1
  118. package/dist/{chunk-L6XZOCP4.js → chunk-UCYIRDND.js} +2 -2
  119. package/dist/{chunk-D6EVJUGU.js → chunk-UYK72NOS.js} +1 -1
  120. package/dist/{chunk-TIWAHZZ6.js → chunk-VCOELPCT.js} +2 -2
  121. package/dist/{chunk-2HY7I3NT.js → chunk-VE6LD3KM.js} +5 -3
  122. package/dist/{chunk-CAIHUYXV.js → chunk-W4GQWFRX.js} +1 -1
  123. package/dist/{chunk-BWIPKSWA.js → chunk-XX2VQE55.js} +1 -1
  124. package/dist/{chunk-UA7O3KKJ.js → chunk-YCTMKKRA.js} +1 -1
  125. package/dist/{chunk-DSUY5F4E.js → chunk-ZGX2DP7F.js} +2 -2
  126. package/dist/generated/index.js +44 -44
  127. package/dist/index.js +44 -44
  128. package/dist/styles.css +662 -223
  129. package/package.json +3 -3
  130. package/dist/SegmentedControl-X3BI3XU4.css +0 -68
package/README.md CHANGED
@@ -191,6 +191,115 @@ places:
191
191
  - A surface that pans or zooms dispatches `LAYER_REPOSITION_EVENT` on its host
192
192
  when the content beneath it moves, and every panel anchored inside follows.
193
193
 
194
+ ## Changes in 0.7.0
195
+
196
+ 0.7.0 draws the org surfaces (`TreeCanvas`'s `node` appearance, `OrgTable`,
197
+ `OrgLabel`, `OrgNode` and `AddPill`) at the console org chart's own
198
+ proportions, and holds every box in the kit to ONE line: no card, field, chip
199
+ or control draws a second border or a second ring beside its own. A paragraph
200
+ whose change needs an edit ends in a **What to change** table, `Was` on the
201
+ left and `Is` on the right.
202
+
203
+ **A focused control shows ONE ring, and it lies on the control's own edge.**
204
+ Every bordered control drew its focus ring 2px outside its border, which is
205
+ two edges with a gap between them. That was the secondary, danger and outline
206
+ buttons and a pressed toggle; the secondary, soft brand and ghost brand icon
207
+ buttons; a filter chip, a search trigger, an interactive or pricing card, a
208
+ focused popover, the new items pill and a page size chip; the skip link, an
209
+ image's remove badge, a tag, a pill chip and a card option; and the date and
210
+ time window triggers, which recoloured their border as well, with the time
211
+ window's typed boxes drawing `--shadow-focus` on top of that. Each now rings
212
+ OVER its boundary, the rule the field register already kept. A box takes
213
+ `--size-focus-ring-inset-offset`, which covers a 1px border and one pixel
214
+ inside it. A boxed FIELD (`Input`, `Textarea`, `Select` and its search box,
215
+ `TagsInput`, and the date and time window boxes) goes further and rings at
216
+ one pixel, laid exactly on its own hairline with `outline-offset: -1px`: the
217
+ boundary drawn in the focus colour, which is how the console's fields say
218
+ focus, where two pixels was a heavy band round every box a caret landed in. A tag and its remove control take `-1px`, so a pressed tag's ink
219
+ line stays visible inside the ring. A checkbox, a switch, a pill chip and a
220
+ split tag's press half ring flush at `0`, because each is too small to ring
221
+ inside itself or stops where the edge it rings on begins. A control that draws
222
+ no edge (a filled or ghost button, a ghost icon button, a link, a borderless
223
+ tab, a filled toast action) keeps the outset ring, because there the ring is
224
+ the only line and an inset one on the accent fill would be drawn in nearly the
225
+ fill's own colour. No stylesheet in the package draws `--shadow-focus` any
226
+ more, and `apps/ui-tests` lists every ring that still stands off its element,
227
+ with the reason it may. What to change: nothing in a call site. A stylesheet of
228
+ your own that set one of these rings' `outline-offset`, or recoloured the
229
+ border under it, now competes with the new rule; set the offset on the same
230
+ selector, or leave the ring to the component.
231
+
232
+ **No card draws two lines.** A toned `TreeCanvas` card drew a halo ring 3px
233
+ outside its boundary, the ghost of a node being composed breathed a second ring
234
+ in the same place, and a selected node drew an accent ring inside its card's
235
+ boundary: each was two parallel lines round one box. A toned card is now its
236
+ fill and its boundary in the hue, and the ghost's own dashed boundary is what
237
+ breathes. Where a card's own node (its direct child treeitem) is selected, the
238
+ card's boundary takes the accent; where it has focus, the ring is drawn on the
239
+ card, over that boundary, so it also holds whatever the card carries under the
240
+ node (a unit's lead), which a ring on the treeitem stopped short of. A row
241
+ deeper inside a card keeps its ring inside it.
242
+
243
+ | Was | Is |
244
+ |---|---|
245
+ | `--crewlet-tree-canvas-card-halo` in a stylesheet of your own | removed: nothing draws a halo |
246
+ | a rule on `.crewlet-tree-canvas__card [role='treeitem'][aria-selected='true']` for a card's own node | the same rule on `.crewlet-tree-canvas__card:has(> [role='treeitem'][aria-selected='true'])` |
247
+
248
+ **A unit's lead is a ground, not a frame.** `OrgNodeLead` drew its pill with a
249
+ hairline 4px inside the node's own frame and ruled a line across the top of
250
+ its strip, so a unit's node was a box drawn twice. A set lead is raised on
251
+ `--color-surface-elevated` with no boundary, and the strip draws no rule. An
252
+ empty one stays an empty slot, with no ground, a dashed edge in the hover step
253
+ and the word in the tertiary ink, because the dash is what says a place is
254
+ waiting rather than a frame round a value. The control inside the pill now
255
+ fills it through whatever wraps it (a `Menu`'s anchor), and the whole pill
256
+ takes the hover step while it is pointed at or its menu is open, where the
257
+ control's own hover was a patch the size of its word.
258
+
259
+ **A chart can lay its field with dots.** `Canvas` and `TreeCanvas` take
260
+ `ground="dotted"`: a grid of dots in the strong hairline's ink, one spacing
261
+ step apart, drawn on the frame so they stay put while the content moves over
262
+ them. It says the field pans before anybody drags it. `plain`, the default, is
263
+ unchanged.
264
+
265
+ | Was | Is |
266
+ |---|---|
267
+ | a stylesheet of your own laying a `radial-gradient` on `.crewlet-canvas` | `ground="dotted"` |
268
+
269
+ **A row of choices can be separate chips.** `SegmentedControl` takes
270
+ `layout="chips"`: a row of separate chips that wraps, each on the raised
271
+ ground a chip with no edge of its own takes, the chosen one filled with the
272
+ accent, for a setting with more choices than a well holds on one line (the
273
+ console's row of unit types). `trailing` draws what completes the last choice
274
+ in the row after the options and outside the arrow keys, such as the box a
275
+ Custom chip asks for. `pill`, the default, is unchanged.
276
+
277
+ **A person's seat can be drawn the way the console chart draws it.**
278
+ `OrgLabel` (and `OrgNodeLabel`) take `iconRing` beside `icon`: a dashed ring
279
+ the size of the large zone round the glyph, on a chart node. A table row draws
280
+ the glyph alone. The `avatar` form is unchanged and never takes the ring, so a
281
+ badge keeps its outline as its one cue.
282
+
283
+ **The add control is the console's size.** `AddPill`'s mark is the console's
284
+ add-circle, with no second ring round the disc under it. A row's pill is 18px
285
+ tall (it was the row's whole control step, a second row of buttons inside the
286
+ row), its mark 18px and its choices' glyphs 10px, and each choice is hit at
287
+ the control step by an overhang whose tint is clipped to the pill, as the
288
+ branch's choices already were.
289
+
290
+ **An org table's trunk is one line.** `OrgTable` stretches each row's first
291
+ cell to the row's full height, so the trunk's segments meet across rows (they
292
+ stopped short of both edges of every row and read as one dash per row), covers
293
+ the rule between rows, and ends at the last row's branch instead of running on
294
+ to the table's edge. The trunk and the wire arriving at a neutral row are both
295
+ the strong hairline step.
296
+
297
+ **A key inside a chord takes no box of its own.** `Kbd` with `keys` draws a
298
+ chord as one cap, and each key inside it now states its whole box (no padding,
299
+ ground, border or radius). An application rule drawing every bare `kbd` as a
300
+ cap used to reach each key inside the chord and frame it inside the chord's
301
+ own frame.
302
+
194
303
  ## Breaking changes in 0.5.0
195
304
 
196
305
  0.5.0 draws the kit in the approved visual system: Geist, a violet accent that
@@ -1,3 +1,3 @@
1
- export { ADD_PILL_MS, AddPill } from '../chunk-OM5E3TTK.js';
1
+ export { ADD_PILL_MS, AddPill } from '../chunk-74WGARJE.js';
2
2
  import '../chunk-BZFWDIV6.js';
3
3
  import '../chunk-ODEQTPFM.js';
@@ -89,7 +89,6 @@
89
89
  * card's own translucent step, in one declaration, which is exactly what a
90
90
  * node is painted with: the two are the same grey wherever the chart is
91
91
  * scrolled to, and the pair is OPAQUE, which the card's step alone is not.
92
- * The resting hairline and the 150ms it fades over are that chart's as well.
93
92
  *
94
93
  * FULLY OPAQUE, ALWAYS. It used to fade with the rest of the control at rest,
95
94
  * and a mask at a little over half opacity is not a mask: the branch was drawn
@@ -101,11 +100,12 @@
101
100
  height: var(--spacing-4);
102
101
  background-color: var(--color-surface-background);
103
102
  background-image: linear-gradient(var(--color-surface-subtle), var(--color-surface-subtle));
104
- border: 1px solid var(--color-border-default);
103
+ /* NO BOUNDARY OF ITS OWN: the mark drawn over it is the console's
104
+ add-circle, whose ring sits at the disc's edge, and a hairline under it
105
+ was a second ring a pixel outside the first. */
106
+ border: 0;
105
107
  border-radius: var(--radius-circle);
106
- transition:
107
- background-color var(--motion-duration-base) var(--motion-easing-default),
108
- border-color var(--motion-duration-base) var(--motion-easing-default);
108
+ transition: background-color var(--motion-duration-base) var(--motion-easing-default);
109
109
  }
110
110
 
111
111
  /* A row has no branch to mask, so there is no disc and no boundary either:
@@ -118,11 +118,6 @@
118
118
  border-color: transparent;
119
119
  }
120
120
 
121
- .crewlet-add-pill__mark:hover .crewlet-add-pill__disc,
122
- .crewlet-add-pill__mark:focus-visible .crewlet-add-pill__disc {
123
- border-color: var(--color-node-green-line);
124
- }
125
-
126
121
  /*
127
122
  * QUIET IS THE PLUS ITSELF. It is one mark per branch on a chart of a hundred,
128
123
  * and at rest it says a child can go here and nothing more. The step is the
@@ -142,9 +137,11 @@
142
137
  transition: opacity var(--motion-duration-fast) var(--motion-easing-default);
143
138
  }
144
139
 
140
+ /* The console table's own add-circle, 18px across: at the 20px step the plus
141
+ stood heavier than every other control on the row. */
145
142
  .crewlet-add-pill[data-size='md'] .crewlet-add-pill__mark svg {
146
- width: var(--spacing-5);
147
- height: var(--spacing-5);
143
+ width: calc(var(--spacing-4) + var(--spacing-1) / 2);
144
+ height: calc(var(--spacing-4) + var(--spacing-1) / 2);
148
145
  }
149
146
 
150
147
  .crewlet-add-pill__mark:hover svg,
@@ -192,8 +189,10 @@
192
189
  animation: crewlet-add-pill-open var(--motion-duration-moderate) var(--motion-easing-spring);
193
190
  }
194
191
 
192
+ /* The console table's pill is 18px tall, under half the row: drawn at the
193
+ row's whole control step it was a second row of buttons inside the row. */
195
194
  .crewlet-add-pill[data-size='md'] .crewlet-add-pill__sections {
196
- height: var(--size-control-sm);
195
+ height: calc(var(--spacing-4) + var(--spacing-1) / 2);
197
196
  }
198
197
 
199
198
  .crewlet-add-pill[data-layout='split'] .crewlet-add-pill__sections {
@@ -302,12 +301,14 @@
302
301
  background-color var(--motion-duration-fast) var(--motion-easing-default);
303
302
  }
304
303
 
305
- /* A row's step is the target, so there is no overhang and nothing to clip. */
304
+ /* A ROW'S CHOICE IS HIT AT THE ROW'S CONTROL STEP, by the same overhang the
305
+ branch's pill takes: padding past the drawn 18px pill, with the tint clipped
306
+ to its content box, so a hovered choice tints the pill and stops at its
307
+ edges. Its width is the pointer-target floor every choice keeps. */
306
308
  .crewlet-add-pill[data-size='md'] .crewlet-add-pill__section {
307
- width: var(--size-control-sm);
308
309
  height: var(--size-control-sm);
309
- margin: 0;
310
- padding: 0;
310
+ margin: calc((var(--spacing-4) + var(--spacing-1) / 2 - var(--size-control-sm)) / 2) 0;
311
+ padding: calc((var(--size-control-sm) - var(--spacing-4) - var(--spacing-1) / 2) / 2) 0;
311
312
  }
312
313
 
313
314
  /*
@@ -335,7 +336,7 @@
335
336
  }
336
337
 
337
338
  .crewlet-add-pill[data-size='md'] .crewlet-add-pill__divider {
338
- height: var(--spacing-5);
339
+ height: var(--spacing-3);
339
340
  }
340
341
 
341
342
  /*
@@ -390,8 +391,8 @@
390
391
  * of each caller, because the pill is what decides it is drawn in one colour.
391
392
  */
392
393
  .crewlet-add-pill__section svg {
393
- width: var(--spacing-3);
394
- height: var(--spacing-3);
394
+ width: calc(var(--spacing-2) + var(--spacing-1) / 2);
395
+ height: calc(var(--spacing-2) + var(--spacing-1) / 2);
395
396
  }
396
397
 
397
398
  .crewlet-add-pill__section svg,
@@ -415,8 +416,8 @@
415
416
  }
416
417
 
417
418
  .crewlet-add-pill[data-size='md'] .crewlet-add-pill__section svg {
418
- width: var(--spacing-4);
419
- height: var(--spacing-4);
419
+ width: calc(var(--spacing-2) + var(--spacing-1) / 2);
420
+ height: calc(var(--spacing-2) + var(--spacing-1) / 2);
420
421
  }
421
422
 
422
423
  /*
@@ -1,6 +1,6 @@
1
- export { AppShell, AppShellRail, AppShellRailRow, AppShellToggle, AppShellTopbar, useAppShell } from '../chunk-WUVZDFHS.js';
1
+ export { AppShell, AppShellRail, AppShellRailRow, AppShellToggle, AppShellTopbar, useAppShell } from '../chunk-OVLJEVQS.js';
2
2
  import '../chunk-7RPGY3JE.js';
3
3
  import '../chunk-R25RGPUB.js';
4
- import '../chunk-4UQ7SMPK.js';
4
+ import '../chunk-4FQT6ZAY.js';
5
5
  import '../chunk-BZFWDIV6.js';
6
6
  import '../chunk-ODEQTPFM.js';
@@ -78,10 +78,12 @@
78
78
  transition: transform var(--motion-duration-fast) var(--motion-easing-default);
79
79
  }
80
80
 
81
+ /* One ring, over the link's own boundary rather than 2px off it, which is two
82
+ edges with a gap between them: the rule every field keeps (see Input.css). */
81
83
  .crewlet-app-shell__skip:focus-visible {
82
84
  transform: translateY(0);
83
85
  outline: 2px solid var(--color-focus);
84
- outline-offset: 2px;
86
+ outline-offset: var(--size-focus-ring-inset-offset);
85
87
  }
86
88
 
87
89
  /*
@@ -1,3 +1,3 @@
1
- export { Button, ButtonLink } from '../chunk-ZAO4HHXI.js';
1
+ export { Button, ButtonLink } from '../chunk-OG6CL3EB.js';
2
2
  import '../chunk-BZFWDIV6.js';
3
3
  import '../chunk-ODEQTPFM.js';
@@ -73,6 +73,24 @@
73
73
  outline-offset: 2px;
74
74
  }
75
75
 
76
+ /*
77
+ * ONE RING, OVER THE BOUNDARY, on every button that draws one. A secondary,
78
+ * an outline, a danger and a pressed toggle each carry a visible border, and a
79
+ * ring standing 2px off it was two edges with a gap between them, which reads
80
+ * as a second outline rather than as focus. On the inset offset the ring
81
+ * covers the border instead, the rule every field keeps (see Input.css).
82
+ *
83
+ * A FILLED OR BORDERLESS BUTTON KEEPS THE OUTSET RING. There is no edge for it
84
+ * to double, and an inset ring on the accent fill would be drawn in nearly the
85
+ * fill's own colour, which is a focus nobody can see.
86
+ */
87
+ .crewlet-btn--secondary:focus-visible,
88
+ .crewlet-btn--outline:focus-visible,
89
+ .crewlet-btn--danger:focus-visible,
90
+ .crewlet-btn[aria-pressed='true']:focus-visible {
91
+ outline-offset: var(--size-focus-ring-inset-offset);
92
+ }
93
+
76
94
  .crewlet-btn:disabled,
77
95
  .crewlet-btn[aria-disabled='true'] {
78
96
  opacity: 0.5;
@@ -143,6 +143,11 @@ export interface CanvasLabels {
143
143
  /** Read after the canvas's name, so a keyboard reader learns its keys. */
144
144
  keys: string;
145
145
  }
146
+ /**
147
+ * What the field under the content is drawn as. `plain` is the page's own
148
+ * ground; `dotted` lays a grid of dots on it. See [CanvasProps.ground].
149
+ */
150
+ export type CanvasGround = 'plain' | 'dotted';
146
151
  export interface CanvasProps {
147
152
  /** The accessible name of the viewport, such as "Organization chart". */
148
153
  label: string;
@@ -216,6 +221,16 @@ export interface CanvasProps {
216
221
  * an entrance, so a reader who asked for less motion simply gets it.
217
222
  */
218
223
  dimmed?: boolean | undefined;
224
+ /**
225
+ * What the field under the content is drawn as.
226
+ *
227
+ * `dotted` is for a surface whose content is moved by dragging the field
228
+ * itself, such as an organization chart: the dots say the field pans before
229
+ * anybody drags it. They are drawn on the frame rather than on the content,
230
+ * so they stay put while the content moves over them. `plain`, the default,
231
+ * is the page's own ground and nothing else.
232
+ */
233
+ ground?: CanvasGround | undefined;
219
234
  /**
220
235
  * Whether one finger can pan the canvas at all.
221
236
  *
@@ -231,4 +246,4 @@ export interface CanvasProps {
231
246
  ref?: Ref<CanvasHandle> | undefined;
232
247
  className?: string | undefined;
233
248
  }
234
- export declare function Canvas({ label, content, children, overlay, controls, controlsPlacement, controlsExtra, controlsBelow, hint, largestItemWidth, dimmed, touch, labels, onReady, ref, className, }: CanvasProps): import("react").JSX.Element;
249
+ export declare function Canvas({ label, content, children, overlay, controls, controlsPlacement, controlsExtra, controlsBelow, hint, largestItemWidth, dimmed, ground, touch, labels, onReady, ref, className, }: CanvasProps): import("react").JSX.Element;
@@ -1,5 +1,5 @@
1
1
  import './Canvas.css';
2
2
  export { Canvas } from './Canvas.js';
3
- export type { CanvasHandle, CanvasLabels, CanvasProps } from './Canvas.js';
3
+ export type { CanvasGround, CanvasHandle, CanvasLabels, CanvasProps } from './Canvas.js';
4
4
  export { CANVAS_COMPOSE_CONTEXT, CANVAS_FIT_MAX_ZOOM, CANVAS_FIT_PADDING, CANVAS_FOCUS_CONTEXT, CANVAS_MAX_ZOOM, CANVAS_MIN_ZOOM, CANVAS_PAN_MARGIN, CANVAS_PAN_STEP, CANVAS_REVEAL_PADDING, CANVAS_TAP_SLOP, CANVAS_WHEEL_LINE_PX, CANVAS_WHEEL_ZOOM_PER_PIXEL, CANVAS_ZOOM_CEILING, CANVAS_ZOOM_LIMITS, CANVAS_ZOOM_STEP, IDENTITY_VIEW, anchorView, beyondSlop, clampPan, clampZoom, fitView, panBy, pinchView, regionView, revealView, screenRect, toScreen, toWorld, wheelPixels, wheelZoomFactor, zoomAt, zoomLimits, } from './geometry.js';
5
5
  export type { CanvasPoint, CanvasRect, CanvasSize, CanvasView, CanvasZoomLimits, PinchStart, WheelLike, } from './geometry.js';
@@ -1,8 +1,8 @@
1
- export { CANVAS_COMPOSE_CONTEXT, CANVAS_FIT_MAX_ZOOM, CANVAS_FIT_PADDING, CANVAS_FOCUS_CONTEXT, CANVAS_MAX_ZOOM, CANVAS_MIN_ZOOM, CANVAS_PAN_MARGIN, CANVAS_PAN_STEP, CANVAS_REVEAL_PADDING, CANVAS_TAP_SLOP, CANVAS_WHEEL_LINE_PX, CANVAS_WHEEL_ZOOM_PER_PIXEL, CANVAS_ZOOM_CEILING, CANVAS_ZOOM_LIMITS, CANVAS_ZOOM_STEP, Canvas, IDENTITY_VIEW, anchorView, beyondSlop, clampPan, clampZoom, fitView, panBy, pinchView, regionView, revealView, screenRect, toScreen, toWorld, wheelPixels, wheelZoomFactor, zoomAt, zoomLimits } from '../chunk-2HY7I3NT.js';
1
+ export { CANVAS_COMPOSE_CONTEXT, CANVAS_FIT_MAX_ZOOM, CANVAS_FIT_PADDING, CANVAS_FOCUS_CONTEXT, CANVAS_MAX_ZOOM, CANVAS_MIN_ZOOM, CANVAS_PAN_MARGIN, CANVAS_PAN_STEP, CANVAS_REVEAL_PADDING, CANVAS_TAP_SLOP, CANVAS_WHEEL_LINE_PX, CANVAS_WHEEL_ZOOM_PER_PIXEL, CANVAS_ZOOM_CEILING, CANVAS_ZOOM_LIMITS, CANVAS_ZOOM_STEP, Canvas, IDENTITY_VIEW, anchorView, beyondSlop, clampPan, clampZoom, fitView, panBy, pinchView, regionView, revealView, screenRect, toScreen, toWorld, wheelPixels, wheelZoomFactor, zoomAt, zoomLimits } from '../chunk-VE6LD3KM.js';
2
2
  import '../chunk-53DVJCVW.js';
3
3
  import '../chunk-7RPGY3JE.js';
4
4
  import '../chunk-R25RGPUB.js';
5
- import '../chunk-4UQ7SMPK.js';
6
- import '../chunk-ZAO4HHXI.js';
5
+ import '../chunk-4FQT6ZAY.js';
6
+ import '../chunk-OG6CL3EB.js';
7
7
  import '../chunk-BZFWDIV6.js';
8
8
  import '../chunk-ODEQTPFM.js';
@@ -20,6 +20,19 @@
20
20
  border-radius: var(--radius-lg);
21
21
  }
22
22
 
23
+ /*
24
+ * A DOTTED FIELD, for content that is moved by dragging the field itself: the
25
+ * dots say it pans before anybody drags it. They are the strong hairline's ink
26
+ * in both themes, one spacing step apart so density scales the grid with the
27
+ * cards on it, and drawn on the frame rather than on the world, so they stay
28
+ * put while the content moves over them. Longhands, so the ground under them
29
+ * is the canvas's own.
30
+ */
31
+ .crewlet-canvas[data-ground='dotted'] {
32
+ background-image: radial-gradient(var(--color-border-strong) 1px, transparent 1.2px);
33
+ background-size: var(--spacing-5) var(--spacing-5);
34
+ }
35
+
23
36
  .crewlet-canvas__viewport {
24
37
  position: absolute;
25
38
  inset: 0;
@@ -1,4 +1,4 @@
1
- export { Card } from '../chunk-V34H2YCY.js';
1
+ export { Card } from '../chunk-CEOXFO3E.js';
2
2
  export { useCardHeaderSlot } from '../chunk-AV2DXAEL.js';
3
3
  import '../chunk-BHHIIK3M.js';
4
4
  import '../chunk-PQADV6P6.js';
@@ -198,9 +198,13 @@
198
198
  border-color: var(--color-border-hover);
199
199
  }
200
200
 
201
+ /* One ring, over the card's own boundary rather than 2px off it, which is two
202
+ edges with a gap between them: the rule every field keeps (see Input.css).
203
+ A chosen card keeps an accent line inside the ring, since the selection
204
+ ring below is two pixels deep and the focus ring covers one of them. */
201
205
  .crewlet-card.is-interactive:focus-visible {
202
206
  outline: 2px solid var(--color-focus);
203
- outline-offset: 2px;
207
+ outline-offset: var(--size-focus-ring-inset-offset);
204
208
  }
205
209
 
206
210
  /*
@@ -1,4 +1,15 @@
1
1
  import type { ReactNode } from 'react';
2
+ /** One part of a row's value: see [BarDatum.parts]. */
3
+ export interface BarPart {
4
+ /** Keyed by id, so a push that re-ranks the parts moves no other part. */
5
+ id: string;
6
+ label: ReactNode;
7
+ value: number;
8
+ /** What the part's number reads as in the row's key. Defaults to the value. */
9
+ display?: ReactNode;
10
+ /** Defaults to the part's place in the row's `parts`, in the data ramp. */
11
+ color?: string;
12
+ }
2
13
  export interface BarDatum {
3
14
  /**
4
15
  * What this row is, as a stable identity. REQUIRED: a ranked list is
@@ -20,6 +31,18 @@ export interface BarDatum {
20
31
  href?: string;
21
32
  /** What pressing the row does, where it is not a destination. */
22
33
  onSelect?: () => void;
34
+ /**
35
+ * What the row's value is made of, such as a team's tokens by seat. The
36
+ * row's bar is split into these, in proportion to each part's value and
37
+ * 2px apart, and the row is keyed under its bar with each part's name and
38
+ * number: a split bar with no key is a picture of some numbers. A part's
39
+ * hue is its place in this list unless it names one, so every row is keyed
40
+ * under itself and two rows may use one hue for different parts. A part
41
+ * with nothing in it is neither drawn nor keyed, and keeps its hue's place.
42
+ * The parts are the caller's to sum to `value`: the bar's length is the
43
+ * row's value, and the parts only divide it.
44
+ */
45
+ parts?: BarPart[];
23
46
  }
24
47
  /**
25
48
  * Where a row's bar stands against its words.
@@ -3,7 +3,7 @@ export { DATA_COLORS, DATA_COLOR_OTHER, dataColor } from './dataColor.js';
3
3
  export { Legend } from './Legend.js';
4
4
  export type { LegendItem, LegendProps } from './Legend.js';
5
5
  export { BarList } from './BarList.js';
6
- export type { BarDatum, BarListProps } from './BarList.js';
6
+ export type { BarDatum, BarListLayout, BarListProps, BarPart } from './BarList.js';
7
7
  export { StackedBar } from './StackedBar.js';
8
8
  export type { StackedBarProps, StackedSegment } from './StackedBar.js';
9
9
  export { ActivityStrip } from './ActivityStrip.js';
@@ -1,3 +1,3 @@
1
- export { ActivityStrip, BarList, ChartTooltip, DATA_COLORS, DATA_COLOR_OTHER, Legend, Sparkline, StackedBar, StackedColumns, TimeSeries, dataColor, niceScale, useChartHover } from '../chunk-RJM4QCGG.js';
1
+ export { ActivityStrip, BarList, ChartTooltip, DATA_COLORS, DATA_COLOR_OTHER, Legend, Sparkline, StackedBar, StackedColumns, TimeSeries, dataColor, niceScale, useChartHover } from '../chunk-6VL4LGWC.js';
2
2
  import '../chunk-BZFWDIV6.js';
3
3
  import '../chunk-ODEQTPFM.js';
@@ -271,6 +271,46 @@
271
271
  white-space: nowrap;
272
272
  }
273
273
 
274
+ /*
275
+ * A SPLIT BAR: one bar divided into its parts, as a stacked bar is. The parts
276
+ * stand 2px apart for the stacked bar's reason, the ground showing through is
277
+ * what makes each part a part, and each part GROWS by its value (a style
278
+ * property on the part) so the gaps come out of the parts and the bar keeps
279
+ * its length. The bar clips its parts, so the last part takes the bar's
280
+ * rounded value end and the first its square start.
281
+ */
282
+ .crewlet-bar-list__bar--parts {
283
+ display: flex;
284
+ gap: 2px;
285
+ overflow: hidden;
286
+ background: none;
287
+ }
288
+
289
+ .crewlet-bar-list__part {
290
+ flex-grow: 0;
291
+ flex-shrink: 1;
292
+ flex-basis: 0;
293
+ min-width: 0;
294
+ height: 100%;
295
+ background: var(--crewlet-bar-list-part-color, var(--color-data-other));
296
+ }
297
+
298
+ /*
299
+ * THE KEY UNDER A SPLIT BAR, at the caption step, starting where the bar
300
+ * starts: under the plot in the BESIDE register, past the words' column and
301
+ * the gap after it, so each name stands under the bar it keys rather than
302
+ * under the row's own name.
303
+ */
304
+ .crewlet-bar-list__key {
305
+ margin-top: var(--spacing-1);
306
+ font-size: var(--font-size-2xs);
307
+ }
308
+
309
+ .crewlet-bar-list--beside .crewlet-bar-list__key {
310
+ margin-top: 0;
311
+ padding-inline-start: calc(var(--crewlet-bar-list-label-width) + var(--spacing-3));
312
+ }
313
+
274
314
  /* ─── Stacked bar ─────────────────────────────────────────────── */
275
315
 
276
316
  /*
@@ -1,2 +1,2 @@
1
- export { Checkbox } from '../chunk-UA7O3KKJ.js';
1
+ export { Checkbox } from '../chunk-YCTMKKRA.js';
2
2
  import '../chunk-ODEQTPFM.js';
@@ -105,7 +105,15 @@
105
105
  opacity: 0.6;
106
106
  }
107
107
 
108
+ /*
109
+ * OUTSIDE THE BOX, AND AGAINST IT. The box IS the target, and 2px eaten off a
110
+ * 16px square leaves no middle, so the ring stays outside it. But it stands on
111
+ * the box's own edge rather than 2px off it: a ring with a gap round a box
112
+ * that already draws its own boundary is two edges, which reads as a second
113
+ * outline rather than as focus. Flush, the ring and the box are one edge, and
114
+ * the ring is still drawn whole on the ground around it.
115
+ */
108
116
  .crewlet-checkbox__control:focus-visible {
109
117
  outline: 2px solid var(--color-focus);
110
- outline-offset: 2px;
118
+ outline-offset: 0;
111
119
  }
@@ -1,7 +1,7 @@
1
- export { CodeBlock } from '../chunk-ERHSECG2.js';
2
- import '../chunk-SVNXOK25.js';
1
+ export { CodeBlock } from '../chunk-MORLKUGM.js';
2
+ import '../chunk-26SCUACK.js';
3
3
  import '../chunk-5VNUYO76.js';
4
- import '../chunk-4UQ7SMPK.js';
5
- import '../chunk-ZAO4HHXI.js';
4
+ import '../chunk-4FQT6ZAY.js';
5
+ import '../chunk-OG6CL3EB.js';
6
6
  import '../chunk-BZFWDIV6.js';
7
7
  import '../chunk-ODEQTPFM.js';
@@ -1,8 +1,8 @@
1
- export { Combobox } from '../chunk-D6EVJUGU.js';
1
+ export { Combobox } from '../chunk-UYK72NOS.js';
2
2
  import '../chunk-6MU7HNB4.js';
3
- import '../chunk-DSUY5F4E.js';
3
+ import '../chunk-ZGX2DP7F.js';
4
4
  import '../chunk-PQADV6P6.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,13 +1,13 @@
1
- export { CommandPalette } from '../chunk-2QLOH454.js';
2
- import '../chunk-KJ34ZBBI.js';
3
- import '../chunk-MV2E3QZM.js';
1
+ export { CommandPalette } from '../chunk-BXPLX7YU.js';
2
+ import '../chunk-SMBKXWML.js';
3
+ import '../chunk-BTHX2FS3.js';
4
4
  import '../chunk-6MU7HNB4.js';
5
- import '../chunk-DSUY5F4E.js';
5
+ import '../chunk-ZGX2DP7F.js';
6
6
  import '../chunk-BHHIIK3M.js';
7
7
  import '../chunk-PQADV6P6.js';
8
8
  import '../chunk-7RPGY3JE.js';
9
9
  import '../chunk-R25RGPUB.js';
10
- import '../chunk-4UQ7SMPK.js';
11
- import '../chunk-ZAO4HHXI.js';
10
+ import '../chunk-4FQT6ZAY.js';
11
+ import '../chunk-OG6CL3EB.js';
12
12
  import '../chunk-BZFWDIV6.js';
13
13
  import '../chunk-ODEQTPFM.js';
@@ -1,6 +1,6 @@
1
- export { CopyButton, Copyable } from '../chunk-SVNXOK25.js';
1
+ export { CopyButton, Copyable } from '../chunk-26SCUACK.js';
2
2
  import '../chunk-5VNUYO76.js';
3
- import '../chunk-4UQ7SMPK.js';
4
- import '../chunk-ZAO4HHXI.js';
3
+ import '../chunk-4FQT6ZAY.js';
4
+ import '../chunk-OG6CL3EB.js';
5
5
  import '../chunk-BZFWDIV6.js';
6
6
  import '../chunk-ODEQTPFM.js';
@@ -1,14 +1,14 @@
1
- export { ALL_ITEMS, CopyableCell, DATA_TABLE_LABELS, DataTable, RowActionsMenu } from '../chunk-AGQ3YLA5.js';
2
- import '../chunk-LSJZUA5V.js';
1
+ export { ALL_ITEMS, CopyableCell, DATA_TABLE_LABELS, DataTable, RowActionsMenu } from '../chunk-QJZ3Y6WW.js';
2
+ import '../chunk-LSB3EHBW.js';
3
3
  import '../chunk-EUCC37WY.js';
4
- import '../chunk-MV2E3QZM.js';
4
+ import '../chunk-YCTMKKRA.js';
5
5
  import '../chunk-AV2DXAEL.js';
6
- import '../chunk-UA7O3KKJ.js';
7
6
  import '../chunk-5VNUYO76.js';
7
+ import '../chunk-BTHX2FS3.js';
8
8
  import '../chunk-PQADV6P6.js';
9
9
  import '../chunk-7RPGY3JE.js';
10
10
  import '../chunk-R25RGPUB.js';
11
- import '../chunk-4UQ7SMPK.js';
12
- import '../chunk-ZAO4HHXI.js';
11
+ import '../chunk-4FQT6ZAY.js';
12
+ import '../chunk-OG6CL3EB.js';
13
13
  import '../chunk-BZFWDIV6.js';
14
14
  import '../chunk-ODEQTPFM.js';
@@ -379,8 +379,19 @@ body.crewlet-data-table-resizing {
379
379
  color: var(--color-text-on-accent);
380
380
  }
381
381
 
382
+ /*
383
+ * One ring, over the chip's own boundary rather than 2px off it, which is two
384
+ * edges with a gap between them: the rule every field keeps (see Input.css).
385
+ * The active size is filled with the accent and its border is the fill, so
386
+ * there is no edge to double there, and an inset ring on that fill would be
387
+ * drawn in nearly the fill's own colour: it keeps the outset ring.
388
+ */
382
389
  .crewlet-data-table__items-per-page-btn:focus-visible {
383
390
  outline: 2px solid var(--color-focus);
391
+ outline-offset: var(--size-focus-ring-inset-offset);
392
+ }
393
+
394
+ .crewlet-data-table__items-per-page-btn.is-active:focus-visible {
384
395
  outline-offset: 2px;
385
396
  }
386
397