@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/dist/styles.css CHANGED
@@ -88,7 +88,7 @@
88
88
  }
89
89
 
90
90
 
91
- /* AddPill-IJQYCY6C.css */
91
+ /* AddPill-V4TQXJ53.css */
92
92
  /*
93
93
  * The control that adds a child (AddPill.tsx).
94
94
  *
@@ -180,7 +180,6 @@
180
180
  * card's own translucent step, in one declaration, which is exactly what a
181
181
  * node is painted with: the two are the same grey wherever the chart is
182
182
  * scrolled to, and the pair is OPAQUE, which the card's step alone is not.
183
- * The resting hairline and the 150ms it fades over are that chart's as well.
184
183
  *
185
184
  * FULLY OPAQUE, ALWAYS. It used to fade with the rest of the control at rest,
186
185
  * and a mask at a little over half opacity is not a mask: the branch was drawn
@@ -192,11 +191,12 @@
192
191
  height: var(--spacing-4);
193
192
  background-color: var(--color-surface-background);
194
193
  background-image: linear-gradient(var(--color-surface-subtle), var(--color-surface-subtle));
195
- border: 1px solid var(--color-border-default);
194
+ /* NO BOUNDARY OF ITS OWN: the mark drawn over it is the console's
195
+ add-circle, whose ring sits at the disc's edge, and a hairline under it
196
+ was a second ring a pixel outside the first. */
197
+ border: 0;
196
198
  border-radius: var(--radius-circle);
197
- transition:
198
- background-color var(--motion-duration-base) var(--motion-easing-default),
199
- border-color var(--motion-duration-base) var(--motion-easing-default);
199
+ transition: background-color var(--motion-duration-base) var(--motion-easing-default);
200
200
  }
201
201
 
202
202
  /* A row has no branch to mask, so there is no disc and no boundary either:
@@ -209,11 +209,6 @@
209
209
  border-color: transparent;
210
210
  }
211
211
 
212
- .crewlet-add-pill__mark:hover .crewlet-add-pill__disc,
213
- .crewlet-add-pill__mark:focus-visible .crewlet-add-pill__disc {
214
- border-color: var(--color-node-green-line);
215
- }
216
-
217
212
  /*
218
213
  * QUIET IS THE PLUS ITSELF. It is one mark per branch on a chart of a hundred,
219
214
  * and at rest it says a child can go here and nothing more. The step is the
@@ -233,9 +228,11 @@
233
228
  transition: opacity var(--motion-duration-fast) var(--motion-easing-default);
234
229
  }
235
230
 
231
+ /* The console table's own add-circle, 18px across: at the 20px step the plus
232
+ stood heavier than every other control on the row. */
236
233
  .crewlet-add-pill[data-size='md'] .crewlet-add-pill__mark svg {
237
- width: var(--spacing-5);
238
- height: var(--spacing-5);
234
+ width: calc(var(--spacing-4) + var(--spacing-1) / 2);
235
+ height: calc(var(--spacing-4) + var(--spacing-1) / 2);
239
236
  }
240
237
 
241
238
  .crewlet-add-pill__mark:hover svg,
@@ -283,8 +280,10 @@
283
280
  animation: crewlet-add-pill-open var(--motion-duration-moderate) var(--motion-easing-spring);
284
281
  }
285
282
 
283
+ /* The console table's pill is 18px tall, under half the row: drawn at the
284
+ row's whole control step it was a second row of buttons inside the row. */
286
285
  .crewlet-add-pill[data-size='md'] .crewlet-add-pill__sections {
287
- height: var(--size-control-sm);
286
+ height: calc(var(--spacing-4) + var(--spacing-1) / 2);
288
287
  }
289
288
 
290
289
  .crewlet-add-pill[data-layout='split'] .crewlet-add-pill__sections {
@@ -393,12 +392,14 @@
393
392
  background-color var(--motion-duration-fast) var(--motion-easing-default);
394
393
  }
395
394
 
396
- /* A row's step is the target, so there is no overhang and nothing to clip. */
395
+ /* A ROW'S CHOICE IS HIT AT THE ROW'S CONTROL STEP, by the same overhang the
396
+ branch's pill takes: padding past the drawn 18px pill, with the tint clipped
397
+ to its content box, so a hovered choice tints the pill and stops at its
398
+ edges. Its width is the pointer-target floor every choice keeps. */
397
399
  .crewlet-add-pill[data-size='md'] .crewlet-add-pill__section {
398
- width: var(--size-control-sm);
399
400
  height: var(--size-control-sm);
400
- margin: 0;
401
- padding: 0;
401
+ margin: calc((var(--spacing-4) + var(--spacing-1) / 2 - var(--size-control-sm)) / 2) 0;
402
+ padding: calc((var(--size-control-sm) - var(--spacing-4) - var(--spacing-1) / 2) / 2) 0;
402
403
  }
403
404
 
404
405
  /*
@@ -426,7 +427,7 @@
426
427
  }
427
428
 
428
429
  .crewlet-add-pill[data-size='md'] .crewlet-add-pill__divider {
429
- height: var(--spacing-5);
430
+ height: var(--spacing-3);
430
431
  }
431
432
 
432
433
  /*
@@ -481,8 +482,8 @@
481
482
  * of each caller, because the pill is what decides it is drawn in one colour.
482
483
  */
483
484
  .crewlet-add-pill__section svg {
484
- width: var(--spacing-3);
485
- height: var(--spacing-3);
485
+ width: calc(var(--spacing-2) + var(--spacing-1) / 2);
486
+ height: calc(var(--spacing-2) + var(--spacing-1) / 2);
486
487
  }
487
488
 
488
489
  .crewlet-add-pill__section svg,
@@ -506,8 +507,8 @@
506
507
  }
507
508
 
508
509
  .crewlet-add-pill[data-size='md'] .crewlet-add-pill__section svg {
509
- width: var(--spacing-4);
510
- height: var(--spacing-4);
510
+ width: calc(var(--spacing-2) + var(--spacing-1) / 2);
511
+ height: calc(var(--spacing-2) + var(--spacing-1) / 2);
511
512
  }
512
513
 
513
514
  /*
@@ -534,7 +535,7 @@
534
535
  }
535
536
 
536
537
 
537
- /* AppShell-XARELGIH.css */
538
+ /* AppShell-CEVLW4QG.css */
538
539
  /*
539
540
  * The application frame: a rail on the FRAME, and the screen on a SHEET that
540
541
  * floats beside it.
@@ -615,10 +616,12 @@
615
616
  transition: transform var(--motion-duration-fast) var(--motion-easing-default);
616
617
  }
617
618
 
619
+ /* One ring, over the link's own boundary rather than 2px off it, which is two
620
+ edges with a gap between them: the rule every field keeps (see Input.css). */
618
621
  .crewlet-app-shell__skip:focus-visible {
619
622
  transform: translateY(0);
620
623
  outline: 2px solid var(--color-focus);
621
- outline-offset: 2px;
624
+ outline-offset: var(--size-focus-ring-inset-offset);
622
625
  }
623
626
 
624
627
  /*
@@ -1480,7 +1483,7 @@
1480
1483
  }
1481
1484
 
1482
1485
 
1483
- /* Button-EXU36DEH.css */
1486
+ /* Button-UWKBTKYD.css */
1484
1487
  /*
1485
1488
  * The button, and the link drawn as one.
1486
1489
  *
@@ -1556,6 +1559,24 @@
1556
1559
  outline-offset: 2px;
1557
1560
  }
1558
1561
 
1562
+ /*
1563
+ * ONE RING, OVER THE BOUNDARY, on every button that draws one. A secondary,
1564
+ * an outline, a danger and a pressed toggle each carry a visible border, and a
1565
+ * ring standing 2px off it was two edges with a gap between them, which reads
1566
+ * as a second outline rather than as focus. On the inset offset the ring
1567
+ * covers the border instead, the rule every field keeps (see Input.css).
1568
+ *
1569
+ * A FILLED OR BORDERLESS BUTTON KEEPS THE OUTSET RING. There is no edge for it
1570
+ * to double, and an inset ring on the accent fill would be drawn in nearly the
1571
+ * fill's own colour, which is a focus nobody can see.
1572
+ */
1573
+ .crewlet-btn--secondary:focus-visible,
1574
+ .crewlet-btn--outline:focus-visible,
1575
+ .crewlet-btn--danger:focus-visible,
1576
+ .crewlet-btn[aria-pressed='true']:focus-visible {
1577
+ outline-offset: var(--size-focus-ring-inset-offset);
1578
+ }
1579
+
1559
1580
  .crewlet-btn:disabled,
1560
1581
  .crewlet-btn[aria-disabled='true'] {
1561
1582
  opacity: 0.5;
@@ -2061,7 +2082,7 @@
2061
2082
  }
2062
2083
 
2063
2084
 
2064
- /* Canvas-Q6JETCWR.css */
2085
+ /* Canvas-YVXHMWLN.css */
2065
2086
  /*
2066
2087
  * A bounded viewport (Canvas.tsx). It fills the box it is given and clips; the
2067
2088
  * page's own scroller is never involved.
@@ -2084,6 +2105,19 @@
2084
2105
  border-radius: var(--radius-lg);
2085
2106
  }
2086
2107
 
2108
+ /*
2109
+ * A DOTTED FIELD, for content that is moved by dragging the field itself: the
2110
+ * dots say it pans before anybody drags it. They are the strong hairline's ink
2111
+ * in both themes, one spacing step apart so density scales the grid with the
2112
+ * cards on it, and drawn on the frame rather than on the world, so they stay
2113
+ * put while the content moves over them. Longhands, so the ground under them
2114
+ * is the canvas's own.
2115
+ */
2116
+ .crewlet-canvas[data-ground='dotted'] {
2117
+ background-image: radial-gradient(var(--color-border-strong) 1px, transparent 1.2px);
2118
+ background-size: var(--spacing-5) var(--spacing-5);
2119
+ }
2120
+
2087
2121
  .crewlet-canvas__viewport {
2088
2122
  position: absolute;
2089
2123
  inset: 0;
@@ -2379,7 +2413,7 @@
2379
2413
  }
2380
2414
 
2381
2415
 
2382
- /* Card-GLP7SUV6.css */
2416
+ /* Card-KJOYHDTJ.css */
2383
2417
  /*
2384
2418
  * Card, THE surface. Everything on a screen is a card, a row inside one, or a
2385
2419
  * control.
@@ -2580,9 +2614,13 @@
2580
2614
  border-color: var(--color-border-hover);
2581
2615
  }
2582
2616
 
2617
+ /* One ring, over the card's own boundary rather than 2px off it, which is two
2618
+ edges with a gap between them: the rule every field keeps (see Input.css).
2619
+ A chosen card keeps an accent line inside the ring, since the selection
2620
+ ring below is two pixels deep and the focus ring covers one of them. */
2583
2621
  .crewlet-card.is-interactive:focus-visible {
2584
2622
  outline: 2px solid var(--color-focus);
2585
- outline-offset: 2px;
2623
+ outline-offset: var(--size-focus-ring-inset-offset);
2586
2624
  }
2587
2625
 
2588
2626
  /*
@@ -2839,7 +2877,7 @@
2839
2877
  }
2840
2878
 
2841
2879
 
2842
- /* Charts-B3YEF7R4.css */
2880
+ /* Charts-THPA5BWV.css */
2843
2881
  /* The chart kit: a legend, a ranked bar list, a stacked bar, stacked
2844
2882
  columns, an activity strip, a time series and the reading layer they share. Hand-drawn rather than a charting library, for one reason that
2845
2883
  decides it: every mark here reads tokens, in two themes, at the contrast
@@ -3113,6 +3151,46 @@
3113
3151
  white-space: nowrap;
3114
3152
  }
3115
3153
 
3154
+ /*
3155
+ * A SPLIT BAR: one bar divided into its parts, as a stacked bar is. The parts
3156
+ * stand 2px apart for the stacked bar's reason, the ground showing through is
3157
+ * what makes each part a part, and each part GROWS by its value (a style
3158
+ * property on the part) so the gaps come out of the parts and the bar keeps
3159
+ * its length. The bar clips its parts, so the last part takes the bar's
3160
+ * rounded value end and the first its square start.
3161
+ */
3162
+ .crewlet-bar-list__bar--parts {
3163
+ display: flex;
3164
+ gap: 2px;
3165
+ overflow: hidden;
3166
+ background: none;
3167
+ }
3168
+
3169
+ .crewlet-bar-list__part {
3170
+ flex-grow: 0;
3171
+ flex-shrink: 1;
3172
+ flex-basis: 0;
3173
+ min-width: 0;
3174
+ height: 100%;
3175
+ background: var(--crewlet-bar-list-part-color, var(--color-data-other));
3176
+ }
3177
+
3178
+ /*
3179
+ * THE KEY UNDER A SPLIT BAR, at the caption step, starting where the bar
3180
+ * starts: under the plot in the BESIDE register, past the words' column and
3181
+ * the gap after it, so each name stands under the bar it keys rather than
3182
+ * under the row's own name.
3183
+ */
3184
+ .crewlet-bar-list__key {
3185
+ margin-top: var(--spacing-1);
3186
+ font-size: var(--font-size-2xs);
3187
+ }
3188
+
3189
+ .crewlet-bar-list--beside .crewlet-bar-list__key {
3190
+ margin-top: 0;
3191
+ padding-inline-start: calc(var(--crewlet-bar-list-label-width) + var(--spacing-3));
3192
+ }
3193
+
3116
3194
  /* ─── Stacked bar ─────────────────────────────────────────────── */
3117
3195
 
3118
3196
  /*
@@ -3584,7 +3662,7 @@
3584
3662
  }
3585
3663
 
3586
3664
 
3587
- /* Checkbox-BOXQ747I.css */
3665
+ /* Checkbox-UE7TEPAM.css */
3588
3666
  /*
3589
3667
  * Checkbox: a box, its label and its consequence as one target.
3590
3668
  *
@@ -3692,9 +3770,17 @@
3692
3770
  opacity: 0.6;
3693
3771
  }
3694
3772
 
3773
+ /*
3774
+ * OUTSIDE THE BOX, AND AGAINST IT. The box IS the target, and 2px eaten off a
3775
+ * 16px square leaves no middle, so the ring stays outside it. But it stands on
3776
+ * the box's own edge rather than 2px off it: a ring with a gap round a box
3777
+ * that already draws its own boundary is two edges, which reads as a second
3778
+ * outline rather than as focus. Flush, the ring and the box are one edge, and
3779
+ * the ring is still drawn whole on the ground around it.
3780
+ */
3695
3781
  .crewlet-checkbox__control:focus-visible {
3696
3782
  outline: 2px solid var(--color-focus);
3697
- outline-offset: 2px;
3783
+ outline-offset: 0;
3698
3784
  }
3699
3785
 
3700
3786
 
@@ -4440,7 +4526,7 @@
4440
4526
  }
4441
4527
 
4442
4528
 
4443
- /* DataTable-OLHPF7D4.css */
4529
+ /* DataTable-WZK3V62B.css */
4444
4530
  /* ─────────────────────────────────────────────────────────────────
4445
4531
  * Default variant.
4446
4532
  *
@@ -4822,8 +4908,19 @@ body.crewlet-data-table-resizing {
4822
4908
  color: var(--color-text-on-accent);
4823
4909
  }
4824
4910
 
4911
+ /*
4912
+ * One ring, over the chip's own boundary rather than 2px off it, which is two
4913
+ * edges with a gap between them: the rule every field keeps (see Input.css).
4914
+ * The active size is filled with the accent and its border is the fill, so
4915
+ * there is no edge to double there, and an inset ring on that fill would be
4916
+ * drawn in nearly the fill's own colour: it keeps the outset ring.
4917
+ */
4825
4918
  .crewlet-data-table__items-per-page-btn:focus-visible {
4826
4919
  outline: 2px solid var(--color-focus);
4920
+ outline-offset: var(--size-focus-ring-inset-offset);
4921
+ }
4922
+
4923
+ .crewlet-data-table__items-per-page-btn.is-active:focus-visible {
4827
4924
  outline-offset: 2px;
4828
4925
  }
4829
4926
 
@@ -6909,7 +7006,7 @@ body.crewlet-data-table-resizing {
6909
7006
  }
6910
7007
 
6911
7008
 
6912
- /* DateTimePicker-22VNXRWC.css */
7009
+ /* DateTimePicker-4AZBTODT.css */
6913
7010
  /*
6914
7011
  * DateTimePicker: a Select-shaped trigger over a calendar dialog.
6915
7012
  *
@@ -6953,12 +7050,17 @@ body.crewlet-data-table-resizing {
6953
7050
  * Focus and open are drawn alike, and the ring is an OUTLINE: forced-colors
6954
7051
  * mode drops every box-shadow and keeps outlines, so a ring drawn as a shadow
6955
7052
  * disappears for exactly the readers who most need one.
7053
+ *
7054
+ * ONE RING, OVER THE BOUNDARY. It stood 2px off the box with the border
7055
+ * recoloured to the focus colour as well, which is an accent hairline, a gap
7056
+ * and an accent band: two rings from one state. On the inset offset the ring
7057
+ * covers the border, and the border keeps its own colour under it, the rule
7058
+ * every field keeps (see Input.css).
6956
7059
  */
6957
7060
  .crewlet-datetime:focus-visible,
6958
7061
  .crewlet-datetime.is-open {
6959
- outline: 2px solid var(--color-focus);
6960
- outline-offset: 2px;
6961
- border-color: var(--color-focus);
7062
+ outline: 1px solid var(--color-focus);
7063
+ outline-offset: -1px;
6962
7064
  }
6963
7065
 
6964
7066
  .crewlet-datetime.is-disabled,
@@ -7081,10 +7183,10 @@ svg.crewlet-datetime__chevron {
7081
7183
  margin: 0;
7082
7184
  }
7083
7185
 
7186
+ /* The same one ring the trigger draws, over the box's own boundary. */
7084
7187
  .crewlet-datetime__time-input:focus-visible {
7085
- outline: 2px solid var(--color-focus);
7086
- outline-offset: 2px;
7087
- border-color: var(--color-focus);
7188
+ outline: 1px solid var(--color-focus);
7189
+ outline-offset: -1px;
7088
7190
  }
7089
7191
 
7090
7192
  .crewlet-datetime__footer {
@@ -7718,7 +7820,7 @@ svg.crewlet-datetime__chevron {
7718
7820
  }
7719
7821
 
7720
7822
 
7721
- /* FilterChip-GTGLLOXE.css */
7823
+ /* FilterChip-EZ4QMW4E.css */
7722
7824
  /*
7723
7825
  * The filter chip: neutral until it is on, and then the accent.
7724
7826
  *
@@ -7789,9 +7891,12 @@ svg.crewlet-datetime__chevron {
7789
7891
  color: var(--color-text-primary);
7790
7892
  }
7791
7893
 
7894
+ /* One ring, over the chip's own boundary rather than 2px off it, which is two
7895
+ edges with a gap between them: the rule every field keeps (see Input.css).
7896
+ A chip that is on still says so under the ring, in its fill and its ink. */
7792
7897
  .crewlet-filter-chip:focus-visible {
7793
7898
  outline: 2px solid var(--color-focus);
7794
- outline-offset: 2px;
7899
+ outline-offset: var(--size-focus-ring-inset-offset);
7795
7900
  }
7796
7901
 
7797
7902
  .crewlet-filter-chip:disabled {
@@ -7828,7 +7933,7 @@ svg.crewlet-datetime__chevron {
7828
7933
  }
7829
7934
 
7830
7935
 
7831
- /* IconButton-TVEUWK6L.css */
7936
+ /* IconButton-VYWP6SGW.css */
7832
7937
  /*
7833
7938
  * IconButton: a square icon-only control.
7834
7939
  *
@@ -7865,6 +7970,21 @@ svg.crewlet-datetime__chevron {
7865
7970
  outline-offset: 2px;
7866
7971
  }
7867
7972
 
7973
+ /*
7974
+ * ONE RING, OVER THE BOUNDARY, on every square that draws one: the secondary
7975
+ * and the soft-brand at rest, and the ghost-brand, which grows one under the
7976
+ * pointer. A ring standing 2px off a visible border is two edges with a gap
7977
+ * between them, which reads as a second outline rather than as focus; on the
7978
+ * inset offset it covers the border instead, the rule every field keeps (see
7979
+ * Input.css). The other ghosts never draw an edge, so they keep the outset
7980
+ * ring.
7981
+ */
7982
+ .crewlet-icon-btn--secondary:focus-visible,
7983
+ .crewlet-icon-btn--soft-brand:focus-visible,
7984
+ .crewlet-icon-btn--ghost-brand:focus-visible {
7985
+ outline-offset: var(--size-focus-ring-inset-offset);
7986
+ }
7987
+
7868
7988
  .crewlet-icon-btn:disabled,
7869
7989
  .crewlet-icon-btn[aria-disabled='true'] {
7870
7990
  opacity: 0.5;
@@ -7989,7 +8109,7 @@ svg.crewlet-datetime__chevron {
7989
8109
  }
7990
8110
 
7991
8111
 
7992
- /* ImageUpload-YCHJMUGX.css */
8112
+ /* ImageUpload-L2GE4JUM.css */
7993
8113
  /*
7994
8114
  * ImageUpload, the click-to-upload affordance built on Avatar.
7995
8115
  *
@@ -8173,9 +8293,13 @@ svg.crewlet-datetime__chevron {
8173
8293
  cursor: default;
8174
8294
  }
8175
8295
 
8296
+ /* One ring, drawn OVER the badge's knockout ring rather than 2px outside it:
8297
+ over the image the knockout is an edge of its own, and a ring standing off
8298
+ it was two rings round one small disc. On the inset offset the focus ring
8299
+ takes the knockout's place, which still parts the disc from the image. */
8176
8300
  .crewlet-image-upload__remove:focus-visible {
8177
8301
  outline: 2px solid var(--color-focus);
8178
- outline-offset: 2px;
8302
+ outline-offset: var(--size-focus-ring-inset-offset);
8179
8303
  }
8180
8304
 
8181
8305
  .crewlet-image-upload__input {
@@ -8267,7 +8391,7 @@ svg.crewlet-datetime__chevron {
8267
8391
  }
8268
8392
 
8269
8393
 
8270
- /* Input-2PU5CPKK.css */
8394
+ /* Input-DRFNI26F.css */
8271
8395
  /*
8272
8396
  * The form row: Input, Textarea, Label, FormField, FormRow, FormSection and
8273
8397
  * ReadOnlyField.
@@ -8344,11 +8468,14 @@ svg.crewlet-datetime__chevron {
8344
8468
  * forced-colors mode drops every box-shadow and keeps outlines: a ring drawn
8345
8469
  * as a shadow disappears for exactly the readers who most need one.
8346
8470
  *
8347
- * It is drawn INSIDE the box, on the offset every focusable in a clipping
8348
- * scroller takes, so it covers the boundary rather than standing outside it.
8349
- * Two things follow: a scroller cannot clip it, and the field does not grow a
8350
- * four-pixel halo the moment a caret lands in it, which is what a filter box
8351
- * in a toolbar of them did to the row it sits in.
8471
+ * It is ONE PIXEL, LAID EXACTLY ON THE BOUNDARY: the field's own hairline,
8472
+ * drawn in the focus colour, which is how the console's fields say focus. At
8473
+ * two pixels it was a heavy band round every box a caret landed in, and on a
8474
+ * form of them the field being typed in read as the loudest thing on the page.
8475
+ * Drawn on the boundary rather than outside it, a scroller cannot clip it and
8476
+ * the field does not grow a halo the moment a caret lands in it, which is what
8477
+ * a filter box in a toolbar of them did to the row it sits in. Every boxed
8478
+ * field in the package rings this way (`Input.test.tsx` holds them to it).
8352
8479
  *
8353
8480
  * THE BORDER IS LEFT ALONE. Recolouring it under the ring says nothing the
8354
8481
  * ring has not already said, and it is what cost the error state its own
@@ -8364,8 +8491,8 @@ svg.crewlet-datetime__chevron {
8364
8491
  * on a pointer press as well as on a tab.
8365
8492
  */
8366
8493
  .crewlet-input:has(.crewlet-input__control:focus-visible) {
8367
- outline: 2px solid var(--color-focus);
8368
- outline-offset: var(--size-focus-ring-inset-offset);
8494
+ outline: 1px solid var(--color-focus);
8495
+ outline-offset: -1px;
8369
8496
  }
8370
8497
 
8371
8498
  .crewlet-input.is-error {
@@ -8624,8 +8751,8 @@ svg.crewlet-datetime__chevron {
8624
8751
  on the control itself: a textarea is the field, with nothing wrapped round
8625
8752
  it and nothing focusable inside it. */
8626
8753
  .crewlet-textarea:focus-visible {
8627
- outline: 2px solid var(--color-focus);
8628
- outline-offset: var(--size-focus-ring-inset-offset);
8754
+ outline: 1px solid var(--color-focus);
8755
+ outline-offset: -1px;
8629
8756
  }
8630
8757
 
8631
8758
  .crewlet-textarea.is-error {
@@ -8641,10 +8768,37 @@ svg.crewlet-datetime__chevron {
8641
8768
  cursor: not-allowed;
8642
8769
  }
8643
8770
 
8771
+ /*
8772
+ * ONE LINE THAT GROWS STARTS AT THE SINGLE-LINE FIELD'S HEIGHT. A box that
8773
+ * grows to fit what is typed was drawn at the large control step while it held
8774
+ * one line, so the box a list item is written in stood sixteen pixels taller
8775
+ * than the fields above and below it. One line now stands at the medium step,
8776
+ * the height of every single-line field, with the line centred in it as an
8777
+ * input's is: the block padding is what that step leaves once the two border
8778
+ * pixels and one line are paid for. Each line past the first grows it from
8779
+ * there.
8780
+ */
8644
8781
  .crewlet-textarea.is-auto-resize {
8645
8782
  resize: none;
8646
8783
  overflow: hidden;
8647
- min-height: var(--size-control-lg);
8784
+ min-height: var(--size-control-md);
8785
+ padding-block: max(
8786
+ 0px,
8787
+ calc((var(--size-control-md) - 2px - var(--font-line-height-normal) * var(--font-size-compact)) / 2)
8788
+ );
8789
+ }
8790
+
8791
+ /*
8792
+ * AND WHAT TRAILS IT SITS ON ITS FIRST LINE, centred in the band one line
8793
+ * takes, which is exactly where an input's trailing hint sits. Pinned a spacing
8794
+ * step from the top, it sat above the line's middle and level with nothing;
8795
+ * on the first line it stays put as the box grows under it.
8796
+ */
8797
+ .crewlet-textarea-shell:has(> .crewlet-textarea.is-auto-resize) > .crewlet-input__trailing {
8798
+ top: 0;
8799
+ display: flex;
8800
+ align-items: center;
8801
+ height: var(--size-control-md);
8648
8802
  }
8649
8803
 
8650
8804
  .crewlet-textarea::placeholder {
@@ -8886,7 +9040,7 @@ svg.crewlet-datetime__chevron {
8886
9040
  }
8887
9041
 
8888
9042
 
8889
- /* Kbd-JPLDVJIP.css */
9043
+ /* Kbd-MCWJTRTT.css */
8890
9044
  /*
8891
9045
  * A keycap: the key's name on a small raised tile.
8892
9046
  *
@@ -8931,9 +9085,20 @@ svg.crewlet-datetime__chevron {
8931
9085
  * platform prints a chord. It is a `kbd` of its own because that is what a key
8932
9086
  * inside a key combination is, and a user agent's `kbd` rule would otherwise
8933
9087
  * set its own face and size on it.
9088
+ *
9089
+ * AND IT TAKES NO BOX FROM ANYBODY ELSE. An application stylesheet that draws
9090
+ * a bare `kbd` as a cap of its own (a common enough rule) reached each key in
9091
+ * here and framed it, so one chord drew a frame round a run of framed keys.
9092
+ * The key states every part of its box, so whatever a page says about `kbd`,
9093
+ * a chord is one cap.
8934
9094
  */
8935
9095
  .crewlet-kbd__key {
8936
9096
  font: inherit;
9097
+ color: inherit;
9098
+ padding: 0;
9099
+ background: none;
9100
+ border: 0;
9101
+ border-radius: 0;
8937
9102
  }
8938
9103
 
8939
9104
  /*
@@ -10610,7 +10775,7 @@ svg.crewlet-datetime__chevron {
10610
10775
  }
10611
10776
 
10612
10777
 
10613
- /* NewItemsNotice-T4DSSPVV.css */
10778
+ /* NewItemsNotice-Q5ED73BQ.css */
10614
10779
  /*
10615
10780
  * The pill that holds finished rows back.
10616
10781
  *
@@ -10661,9 +10826,11 @@ svg.crewlet-datetime__chevron {
10661
10826
  color: var(--color-brand-accent-ink);
10662
10827
  }
10663
10828
 
10829
+ /* One ring, over the pill's own boundary rather than 2px off it, which is two
10830
+ edges with a gap between them: the rule every field keeps (see Input.css). */
10664
10831
  .crewlet-new-items:focus-visible {
10665
10832
  outline: 2px solid var(--color-focus);
10666
- outline-offset: 2px;
10833
+ outline-offset: var(--size-focus-ring-inset-offset);
10667
10834
  }
10668
10835
 
10669
10836
  @media (prefers-reduced-motion: reduce) {
@@ -10673,7 +10840,7 @@ svg.crewlet-datetime__chevron {
10673
10840
  }
10674
10841
 
10675
10842
 
10676
- /* OrgLabel-CR233G34.css */
10843
+ /* OrgLabel-6WSKJQOT.css */
10677
10844
  /*
10678
10845
  * What a node of an org chart and a row of an org table both say
10679
10846
  * (OrgLabel.tsx).
@@ -10762,6 +10929,44 @@ svg.crewlet-datetime__chevron {
10762
10929
  fill: currentColor;
10763
10930
  }
10764
10931
 
10932
+ /*
10933
+ * A PERSON IS A FIGURE INSIDE A DASHED RING, as the console chart draws one:
10934
+ * the boundary says this seat is held by someone outside the system. The ring
10935
+ * is the 24px target step and the figure inside it a step smaller than a
10936
+ * container's glyph, which leaves the air a boundary needs to read as one: at
10937
+ * the zone's own step the figure touched the ring on every side.
10938
+ *
10939
+ * THE RING IS DECORATION, drawn in the step kept for it, and the figure is the
10940
+ * mark: the ring says how the seat is held, never what it is.
10941
+ */
10942
+ .crewlet-org-label__icon--ring {
10943
+ position: relative;
10944
+ }
10945
+
10946
+ .crewlet-org-label__icon--ring::before {
10947
+ content: '';
10948
+ position: absolute;
10949
+ top: 50%;
10950
+ left: 50%;
10951
+ width: var(--size-target-min);
10952
+ height: var(--size-target-min);
10953
+ border: 1px dashed var(--color-text-muted);
10954
+ border-radius: var(--radius-circle);
10955
+ transform: translate(-50%, -50%);
10956
+ pointer-events: none;
10957
+ }
10958
+
10959
+ .crewlet-org-label__icon--ring > svg {
10960
+ width: var(--font-size-md);
10961
+ height: var(--font-size-md);
10962
+ }
10963
+
10964
+ /* A ROW DRAWS THE FIGURE ALONE, as the console table does: a ring on a line
10965
+ of text is a second boundary inside the row's own. */
10966
+ .crewlet-org-label--row .crewlet-org-label__icon--ring::before {
10967
+ content: none;
10968
+ }
10969
+
10765
10970
  /* ---- The name and its caption -------------------------------------------- */
10766
10971
 
10767
10972
  /*
@@ -10960,7 +11165,7 @@ svg.crewlet-datetime__chevron {
10960
11165
  }
10961
11166
 
10962
11167
 
10963
- /* OrgNode-BT7T2Q2X.css */
11168
+ /* OrgNode-TCHJH5FO.css */
10964
11169
  /*
10965
11170
  * What a node of an org chart carries beyond what it says (OrgNode.tsx).
10966
11171
  *
@@ -10996,6 +11201,15 @@ svg.crewlet-datetime__chevron {
10996
11201
 
10997
11202
  /* ---- A unit's lead ------------------------------------------------------ */
10998
11203
 
11204
+ /*
11205
+ * NO LINE OF ITS OWN. The console chart rules a hairline over this strip and
11206
+ * frames a set lead's pill inside it, 4px in from the node's own edge: inside
11207
+ * a card that is already framed, that is a box drawn twice, with a second line
11208
+ * running beside the card's edge on three sides and a third across the top.
11209
+ * A set lead is a ground instead, and a ground needs no line to divide it from
11210
+ * the name above. Only an EMPTY slot keeps an edge, dashed (below), because
11211
+ * the dash is what says a place is waiting rather than a frame round a value.
11212
+ */
10999
11213
  .crewlet-org-node-lead {
11000
11214
  position: relative;
11001
11215
  display: flex;
@@ -11004,28 +11218,11 @@ svg.crewlet-datetime__chevron {
11004
11218
  padding: 0 var(--spacing-1) var(--spacing-1);
11005
11219
  }
11006
11220
 
11007
- /*
11008
- * THE SEPARATOR IS INSET, like every hairline inside a node of the console
11009
- * chart (it draws this one from 4 to `nw - 4`). Edge to edge it cut the card
11010
- * in two and the node read as two stacked cells rather than as a card with a
11011
- * fact along its bottom edge. Drawn rather than bordered for that reason
11012
- * alone: a border cannot be shorter than the box it is on.
11013
- */
11014
- .crewlet-org-node-lead::before {
11015
- content: '';
11016
- position: absolute;
11017
- top: 0;
11018
- right: var(--spacing-1);
11019
- left: var(--spacing-1);
11020
- height: 1px;
11021
- background: var(--color-border-default);
11022
- }
11023
-
11024
11221
  /*
11025
11222
  * A PILL RATHER THAN A LINE OF TEXT, so the lead reads as one value attached
11026
- * to this unit rather than as a second caption. The empty state is the same
11027
- * pill with a dashed edge and the word alone: a unit with no lead has a place
11028
- * for one, which is what invites the reader to set it.
11223
+ * to this unit rather than as a second caption. RAISED, on the step a chip
11224
+ * with no boundary of its own takes (the palette suite holds it off the card
11225
+ * on both themes), so it is found by its ground rather than by a frame.
11029
11226
  */
11030
11227
  .crewlet-org-node-lead__pill {
11031
11228
  display: flex;
@@ -11040,32 +11237,30 @@ svg.crewlet-datetime__chevron {
11040
11237
  font-weight: var(--font-weight-medium);
11041
11238
  line-height: var(--font-line-height-tight);
11042
11239
  color: var(--color-text-secondary);
11043
- /*
11044
- * THE BOUNDARY IS THE HOVER STEP, not the resting hairline, which is what
11045
- * the console chart draws around this one pill and nowhere else inside a
11046
- * node: every other line in there is the separator step and this is a
11047
- * boundary around a value. At the separator's own alpha the pill was a
11048
- * rectangle a reader had to look for, on the one fact a unit's node states.
11049
- */
11050
- border: 1px solid var(--color-border-hover);
11240
+ background: var(--color-surface-elevated);
11051
11241
  border-radius: var(--radius-sm);
11052
11242
  }
11053
11243
 
11054
11244
  /*
11055
- * AND AN EMPTY ONE IS THE SAME PILL, DASHED. The console chart separates the
11056
- * two by the DASH and by the ink, and its two boundary alphas are 0.15 and
11057
- * 0.12, which is one step of this ramp: written as two tokens the difference
11058
- * would be invisible beside the dash that already carries it.
11245
+ * AND AN EMPTY ONE IS AN EMPTY SLOT: no ground, a dashed edge and the word
11246
+ * alone in the quieter ink, as the console chart draws it. A unit with no lead
11247
+ * has a place for one, and the dash is what says the place is waiting to be
11248
+ * filled, which is what invites the reader to set it. It is the one edge drawn
11249
+ * inside a node, and only while the slot is empty: a set lead is a raised
11250
+ * ground with no edge at all. The edge is the hover step rather than the
11251
+ * resting hairline, because at the hairline's own step the slot was a
11252
+ * rectangle a reader had to look for.
11059
11253
  */
11060
11254
  .crewlet-org-node-lead__pill--empty {
11061
11255
  color: var(--color-text-tertiary);
11062
- border-style: dashed;
11256
+ background: none;
11257
+ border: 1px dashed var(--color-border-hover);
11063
11258
  }
11064
11259
 
11065
11260
  /*
11066
11261
  * A LEAD THAT CAN BE CHANGED IS STILL A LEAD. Where the pill holds a control
11067
11262
  * rather than a word, the control IS the pill: it fills it, carries the pill's
11068
- * own type and ink, and draws no second boundary inside the one already there.
11263
+ * own type and ink, and draws no boundary or ground of its own on the pill's.
11069
11264
  * Left at its own size, a control step inside a half-rank strip is a button
11070
11265
  * that overflows the node it sits in.
11071
11266
  *
@@ -11092,6 +11287,35 @@ svg.crewlet-datetime__chevron {
11092
11287
  color: var(--color-text-primary);
11093
11288
  }
11094
11289
 
11290
+ /*
11291
+ * WHATEVER WRAPS THE CONTROL FILLS THE PILL TOO. A menu's trigger arrives
11292
+ * inside the menu's own anchor, and the anchor was a shrink-wrapped item of
11293
+ * the pill's row: the control was the width of the word "Lead" in a pill as
11294
+ * wide as the node, and a press anywhere else in the pill did nothing.
11295
+ */
11296
+ .crewlet-org-node-lead__pill > :has(> .crewlet-btn) {
11297
+ display: flex;
11298
+ flex: 1;
11299
+ min-width: 0;
11300
+ }
11301
+
11302
+ /*
11303
+ * REACHED, THE WHOLE PILL LIGHTS, because the whole pill is the control. The
11304
+ * ghost control's own hover and press grounds were a patch the size of the
11305
+ * word inside the pill, so it paints neither, and the pill takes the row hover
11306
+ * step over its own ground while the control is pointed at or its menu is
11307
+ * open. Its ink still goes to full, above.
11308
+ */
11309
+ .crewlet-org-node-lead__pill
11310
+ .crewlet-btn:is(:hover, :active):not(:disabled):not([aria-disabled='true']) {
11311
+ background: none;
11312
+ }
11313
+
11314
+ .crewlet-org-node-lead__pill:has(.crewlet-btn:hover:not(:disabled):not([aria-disabled='true'])),
11315
+ .crewlet-org-node-lead__pill:has(.crewlet-btn[aria-expanded='true']) {
11316
+ background-image: linear-gradient(var(--color-surface-hover), var(--color-surface-hover));
11317
+ }
11318
+
11095
11319
  /* The name of the lead, not the chevron beside it, is what truncates. */
11096
11320
  .crewlet-org-node-lead__pill .crewlet-btn > span {
11097
11321
  overflow: hidden;
@@ -11110,25 +11334,42 @@ svg.crewlet-datetime__chevron {
11110
11334
  *
11111
11335
  * DRAWN SMALL, HIT FULL SIZE, the rule the whole node keeps: the strip is half
11112
11336
  * a rank, so the target is grown past the pill's own edge into the node's
11113
- * bottom padding, exactly as the lead's own control is. It takes its room from
11114
- * the pill rather than overlaying the name, so the lead truncates beside it
11115
- * instead of running under it: the console chart shifts its text 5px left for
11116
- * the same reason, which a row of flex items does on its own.
11337
+ * bottom padding, exactly as the lead's own control is.
11338
+ *
11339
+ * AND IT DOES NOT MOVE THE NAME. Taking its room from the row, it pushed the
11340
+ * name half its own width off the pill's middle, so "Lead: Ada" sat left of
11341
+ * centre on every unit that had one. It is drawn over the pill's right end
11342
+ * instead, out of the row, and the lead's control keeps the same room at both
11343
+ * of its ends while it is there: the name is centred on the whole pill and
11344
+ * truncates before it reaches the clear, and the control is still the whole
11345
+ * pill to press.
11117
11346
  */
11118
11347
  .crewlet-org-node-lead__clear {
11119
- position: relative;
11348
+ position: absolute;
11349
+ top: 50%;
11350
+ right: 0;
11351
+ z-index: 1;
11120
11352
  display: inline-flex;
11121
- flex: none;
11122
11353
  align-items: center;
11123
11354
  justify-content: center;
11355
+ transform: translateY(-50%);
11356
+ }
11357
+
11358
+ .crewlet-org-node-lead__pill:has(> .crewlet-org-node-lead__clear) {
11359
+ position: relative;
11360
+ }
11361
+
11362
+ .crewlet-org-node-lead__pill:has(> .crewlet-org-node-lead__clear)
11363
+ .crewlet-btn:not(.crewlet-org-node-lead__clear *) {
11364
+ padding-inline: var(--spacing-4);
11124
11365
  }
11125
11366
 
11126
11367
  /*
11127
- * THE GROUND IS A STEP OFF THE CARD'S, rather than that chart's own alpha. Its
11128
- * 0.08 of white over a dark card is a disc a reader can see; on this package's
11129
- * LIGHT theme the step at that alpha is the card's own value, so the disc
11130
- * would disappear on half the deployments. The step past the card is the same
11131
- * relationship in both themes, which is what the drawing was after.
11368
+ * THE DISC IS ITS RING. Its ground is the raised step the pill itself is
11369
+ * drawn on, rather than that chart's own alpha (0.08 of white is the card's
11370
+ * own value on this package's light theme, so a disc drawn by its ground
11371
+ * would disappear on half the deployments), and so what draws it on the pill
11372
+ * is the hairline round it.
11132
11373
  */
11133
11374
  .crewlet-org-node-lead__disc {
11134
11375
  position: absolute;
@@ -11166,6 +11407,14 @@ svg.crewlet-datetime__chevron {
11166
11407
  color: var(--color-text-primary);
11167
11408
  }
11168
11409
 
11410
+ /* AND NOTHING ELSE FILLS EITHER: a ghost control's own hover and press grounds
11411
+ are painted on its whole 24px target, which drew a circle twice the disc's
11412
+ size round a 12px mark the moment it was pointed at. */
11413
+ .crewlet-org-node-lead__clear
11414
+ :is(.crewlet-btn, .crewlet-icon-btn):is(:hover, :active):not(:disabled):not([aria-disabled='true']) {
11415
+ background: none;
11416
+ }
11417
+
11169
11418
  .crewlet-org-node-lead__clear:hover .crewlet-org-node-lead__disc {
11170
11419
  border-color: var(--color-border-control);
11171
11420
  }
@@ -11177,7 +11426,7 @@ svg.crewlet-datetime__chevron {
11177
11426
  }
11178
11427
 
11179
11428
 
11180
- /* OrgTable-VWMFC3TB.css */
11429
+ /* OrgTable-JZSYTUIK.css */
11181
11430
  /*
11182
11431
  * An organization as an indented table of rows (OrgTable.tsx).
11183
11432
  *
@@ -11204,8 +11453,11 @@ svg.crewlet-datetime__chevron {
11204
11453
  */
11205
11454
  --crewlet-org-table-indent: var(--spacing-8);
11206
11455
  /* The wire arriving at a row, and what it fades to at the row's own end.
11207
- Rebound per hue below. */
11208
- --crewlet-org-table-wire: var(--color-border-control);
11456
+ It leaves the trunk in the TRUNK'S own step, as the console table's does,
11457
+ so the two read as one line; started brighter than the trunk, every
11458
+ branch was a dash floating beside a trunk nobody could see. Rebound per
11459
+ hue below. */
11460
+ --crewlet-org-table-wire: var(--color-border-strong);
11209
11461
  --crewlet-org-table-wire-fade: var(--color-border-default);
11210
11462
  /* What a row's name and its mark are drawn in. Rebound per hue below. */
11211
11463
  --crewlet-org-table-ink: var(--color-text-primary);
@@ -11314,8 +11566,15 @@ svg.crewlet-datetime__chevron {
11314
11566
  * follows, so the trunk is one line down the whole table rather than one per
11315
11567
  * level. The cell's padding is taken back and the wire element carries the
11316
11568
  * level instead.
11569
+ *
11570
+ * AND THE CELL IS THE ROW'S FULL HEIGHT, because the wire in it is. The grid
11571
+ * centres its cells in a row taller than they are, and a trunk drawn down a
11572
+ * centred cell stopped short of both edges of every row, so the line its
11573
+ * segments were meant to stack into read as one dash per row. The cell still
11574
+ * centres what it holds.
11317
11575
  */
11318
11576
  .crewlet-org-table [role='gridcell']:first-child {
11577
+ align-self: stretch;
11319
11578
  padding-inline-start: var(--spacing-2);
11320
11579
  }
11321
11580
 
@@ -11350,12 +11609,19 @@ svg.crewlet-datetime__chevron {
11350
11609
  * segments stack into one line. Neutral, always: it belongs to the table
11351
11610
  * rather than to any row, and a trunk that took each row's hue in turn would
11352
11611
  * be a striped line saying nothing.
11612
+ *
11613
+ * IN THE STRONG STEP, where the console table draws its trunk a notch above
11614
+ * the row's ground. In the plain border step it all but vanished on the
11615
+ * table's own ground, and the branches beside it read as loose dashes.
11616
+ *
11617
+ * It starts one hairline above the cell, over the grid's rule between rows,
11618
+ * so the segments meet rather than being cut by that rule.
11353
11619
  */
11354
11620
  .crewlet-org-table__wire[data-trunk]::before {
11355
- inset-block: 0;
11621
+ inset-block: -1px 0;
11356
11622
  inset-inline-start: 0;
11357
11623
  width: 2px;
11358
- background: var(--color-border-default);
11624
+ background: var(--color-border-strong);
11359
11625
  }
11360
11626
 
11361
11627
  /* A root row's trunk starts at the row's middle: nothing hangs above the
@@ -11364,6 +11630,13 @@ svg.crewlet-datetime__chevron {
11364
11630
  inset-block-start: 50%;
11365
11631
  }
11366
11632
 
11633
+ /* The last row a root shows ends the trunk at its own branch: no row below it
11634
+ hangs off the line, and a trunk run on to the next tree or the table's edge
11635
+ is a line to nowhere. */
11636
+ .crewlet-org-table__wire[data-last][data-trunk]::before {
11637
+ inset-block-end: 50%;
11638
+ }
11639
+
11367
11640
  /*
11368
11641
  * THE BRANCH: from the trunk across the gutter to the row's own mark, fading
11369
11642
  * as it arrives. It reaches one cell gap past the wire's own width, which is
@@ -11631,7 +11904,7 @@ svg.crewlet-datetime__chevron {
11631
11904
  }
11632
11905
 
11633
11906
 
11634
- /* Popover-WJGCF3ZQ.css */
11907
+ /* Popover-QCINR7WG.css */
11635
11908
  /*
11636
11909
  * The anchored panel.
11637
11910
  *
@@ -11674,10 +11947,13 @@ svg.crewlet-datetime__chevron {
11674
11947
  transform-origin: bottom left;
11675
11948
  }
11676
11949
 
11677
- /* A panel that takes focus shows it on the panel, not only on what is inside. */
11950
+ /* A panel that takes focus shows it on the panel, not only on what is inside,
11951
+ and shows it ONCE: over the panel's own boundary rather than 2px off it,
11952
+ which is two edges with a gap between them (the rule every field keeps, see
11953
+ Input.css). */
11678
11954
  .crewlet-popover:focus-visible {
11679
11955
  outline: 2px solid var(--color-focus);
11680
- outline-offset: 2px;
11956
+ outline-offset: var(--size-focus-ring-inset-offset);
11681
11957
  }
11682
11958
 
11683
11959
  /* Up from under its anchor, which is where it is about to be. */
@@ -11819,7 +12095,7 @@ svg.crewlet-datetime__chevron {
11819
12095
  }
11820
12096
 
11821
12097
 
11822
- /* PricingCard-7EFXRSD2.css */
12098
+ /* PricingCard-HTAHG4ST.css */
11823
12099
  /*
11824
12100
  * PricingCard, the plan-tier card surface.
11825
12101
  *
@@ -11886,9 +12162,13 @@ svg.crewlet-datetime__chevron {
11886
12162
  border-color: var(--color-brand-accent-soft-strong);
11887
12163
  }
11888
12164
 
12165
+ /* One ring, over the card's own boundary rather than 2px off it, which is two
12166
+ edges with a gap between them: the rule every field keeps (see Input.css).
12167
+ The chosen plan keeps an accent line inside the ring, since the selection
12168
+ ring below is two pixels deep and the focus ring covers one of them. */
11889
12169
  .crewlet-pricing-card:focus-visible {
11890
12170
  outline: 2px solid var(--color-focus);
11891
- outline-offset: 2px;
12171
+ outline-offset: var(--size-focus-ring-inset-offset);
11892
12172
  }
11893
12173
 
11894
12174
  /* The chosen plan takes the selection ring, which is the same inset rule
@@ -12214,7 +12494,7 @@ svg.crewlet-datetime__chevron {
12214
12494
  }
12215
12495
 
12216
12496
 
12217
- /* SearchTrigger-Z5D4AAY7.css */
12497
+ /* SearchTrigger-KIZLWBEH.css */
12218
12498
  /*
12219
12499
  * A button drawn as the field it stands in for.
12220
12500
  *
@@ -12275,9 +12555,12 @@ svg.crewlet-datetime__chevron {
12275
12555
  color: var(--color-text-primary);
12276
12556
  }
12277
12557
 
12558
+ /* One ring, over the trigger's own boundary rather than 2px off it, which is
12559
+ two edges with a gap between them: the rule every field keeps (see
12560
+ Input.css). */
12278
12561
  .crewlet-search-trigger:focus-visible {
12279
12562
  outline: 2px solid var(--color-focus);
12280
- outline-offset: 2px;
12563
+ outline-offset: var(--size-focus-ring-inset-offset);
12281
12564
  }
12282
12565
 
12283
12566
  .crewlet-search-trigger__icon {
@@ -12459,7 +12742,7 @@ svg.crewlet-datetime__chevron {
12459
12742
  }
12460
12743
 
12461
12744
 
12462
- /* SegmentedControl-X3BI3XU4.css */
12745
+ /* SegmentedControl-76HODRBT.css */
12463
12746
  /*
12464
12747
  * SegmentedControl: the pill row, drawn with the Tabs classes.
12465
12748
  *
@@ -12509,6 +12792,13 @@ svg.crewlet-datetime__chevron {
12509
12792
  font-size: var(--font-size-compact);
12510
12793
  }
12511
12794
 
12795
+ /* One ring, over the card's own boundary rather than 2px off it, which is two
12796
+ edges with a gap between them: the rule every field keeps (see Input.css).
12797
+ The chosen card still says so under the ring, in its tint and its ink. */
12798
+ .crewlet-segmented--cards .crewlet-segmented__option:focus-visible {
12799
+ outline-offset: var(--size-focus-ring-inset-offset);
12800
+ }
12801
+
12512
12802
  /* The one card that is chosen takes the accent, which is what "here, this
12513
12803
  one" means everywhere else in the product. */
12514
12804
  .crewlet-segmented--cards .crewlet-segmented__option.is-active {
@@ -12517,6 +12807,91 @@ svg.crewlet-datetime__chevron {
12517
12807
  color: var(--color-brand-accent-ink);
12518
12808
  }
12519
12809
 
12810
+ /*
12811
+ * A ROW OF SEPARATE CHIPS, for a setting with more choices than a well holds
12812
+ * on one line: the console's own row of unit types. It wraps rather than
12813
+ * running off the panel it sits in, and each chip stands on the raised ground
12814
+ * a chip with no edge of its own takes (held off the card by the palette
12815
+ * suite), so no chip draws a frame inside the panel's. Two classes, for the
12816
+ * reason the card row gives above.
12817
+ */
12818
+ .crewlet-tabs.crewlet-segmented--chips {
12819
+ /* The chip's own drawing (below) is the --crewlet-segmented-chip-height
12820
+ band inside a target-floor box, so it is the same height at every
12821
+ density the console's 11px chip is drawn at. */
12822
+ --crewlet-segmented-chip-height: calc(var(--size-target-min) - var(--spacing-1));
12823
+ display: flex;
12824
+ flex-wrap: wrap;
12825
+ align-items: center;
12826
+ /* No gap between ROWS: each chip's target already overhangs its drawing by
12827
+ half a step above and below, so two rows' drawings stand a whole step
12828
+ apart while their targets meet. */
12829
+ gap: 0 var(--spacing-1);
12830
+ }
12831
+
12832
+ /*
12833
+ * SMALL, AS THE CONSOLE'S ARE, AND DRAWN SMALL BUT HIT FULL SIZE, the rule the
12834
+ * org chart's own controls keep. A chip is a word in the 11px face with a step
12835
+ * of room either side, drawn as a band shorter than the pointer-target floor;
12836
+ * the button around it stays at the floor, so the band can be the console's
12837
+ * size without being a target a finger misses. At the small control step a
12838
+ * row of ten was a second row of buttons under the field's label rather than a
12839
+ * row of answers to it.
12840
+ *
12841
+ * The band is the button's own ::before, behind the label, rather than its
12842
+ * background clipped to the content box: a clip takes the corner's curve in by
12843
+ * the padding it removes, and a chip this small would lose its radius.
12844
+ */
12845
+ .crewlet-segmented--chips .crewlet-segmented__option {
12846
+ position: relative;
12847
+ isolation: isolate;
12848
+ min-height: var(--size-target-min);
12849
+ padding: 0 var(--spacing-2);
12850
+ border-radius: var(--radius-sm);
12851
+ background: none;
12852
+ color: var(--color-text-secondary);
12853
+ font-size: var(--font-size-2xs);
12854
+ }
12855
+
12856
+ .crewlet-segmented--chips .crewlet-segmented__option::before {
12857
+ content: '';
12858
+ position: absolute;
12859
+ inset: calc((var(--size-target-min) - var(--crewlet-segmented-chip-height)) / 2) 0;
12860
+ z-index: -1;
12861
+ border-radius: var(--radius-sm);
12862
+ background: var(--color-surface-elevated);
12863
+ pointer-events: none;
12864
+ }
12865
+
12866
+ /* The chosen chip is FILLED with the accent: on a row of up to ten raised
12867
+ chips, a fill is the one thing that says "this one" at a glance, as the
12868
+ console's row says it. Its ring stands off it, because an edge drawn on an
12869
+ accent fill in the focus colour is nearly the fill's own colour. */
12870
+ .crewlet-segmented--chips .crewlet-segmented__option.is-active {
12871
+ color: var(--color-text-on-accent);
12872
+ }
12873
+
12874
+ .crewlet-segmented--chips .crewlet-segmented__option.is-active::before {
12875
+ background: var(--color-brand-accent);
12876
+ }
12877
+
12878
+ /* What completes the last choice sits in the row, at the chips' own height
12879
+ and in their face: a field at its own control step stood taller than every
12880
+ chip beside it. */
12881
+ .crewlet-segmented__trailing {
12882
+ display: inline-flex;
12883
+ align-items: center;
12884
+ min-width: 0;
12885
+ }
12886
+
12887
+ .crewlet-segmented--chips .crewlet-segmented__trailing .crewlet-input {
12888
+ min-height: var(--crewlet-segmented-chip-height);
12889
+ }
12890
+
12891
+ .crewlet-segmented--chips .crewlet-segmented__trailing .crewlet-input__control {
12892
+ font-size: var(--font-size-2xs);
12893
+ }
12894
+
12520
12895
  .crewlet-segmented__description {
12521
12896
  font-size: var(--font-size-xs);
12522
12897
  font-weight: var(--font-weight-regular);
@@ -12642,7 +13017,7 @@ svg.crewlet-datetime__chevron {
12642
13017
  }
12643
13018
 
12644
13019
 
12645
- /* Select-E24U5LBC.css */
13020
+ /* Select-4ANVLHUY.css */
12646
13021
  /*
12647
13022
  * Select: one chrome over two controls, and the product's only dropdown.
12648
13023
  *
@@ -12713,8 +13088,8 @@ svg.crewlet-datetime__chevron {
12713
13088
  * leave the other bare.
12714
13089
  */
12715
13090
  .crewlet-select:focus-within {
12716
- outline: 2px solid var(--color-focus);
12717
- outline-offset: var(--size-focus-ring-inset-offset);
13091
+ outline: 1px solid var(--color-focus);
13092
+ outline-offset: -1px;
12718
13093
  }
12719
13094
 
12720
13095
  /*
@@ -12992,8 +13367,8 @@ svg.crewlet-select__chevron {
12992
13367
  * outset ring on the input would be cut by the menu's own `overflow: hidden`.
12993
13368
  */
12994
13369
  .crewlet-select__search:focus-within {
12995
- outline: 2px solid var(--color-focus);
12996
- outline-offset: var(--size-focus-ring-inset-offset);
13370
+ outline: 1px solid var(--color-focus);
13371
+ outline-offset: -1px;
12997
13372
  }
12998
13373
 
12999
13374
  .crewlet-select__search {
@@ -14537,7 +14912,7 @@ svg.crewlet-select__chevron {
14537
14912
  }
14538
14913
 
14539
14914
 
14540
- /* Switch-U4OWK4CL.css */
14915
+ /* Switch-66RAQCRE.css */
14541
14916
  /*
14542
14917
  * Switch: a setting that takes effect as it moves.
14543
14918
  *
@@ -14651,14 +15026,17 @@ svg.crewlet-select__chevron {
14651
15026
  * control's own :focus-visible. The track is the same box: the control is
14652
15027
  * `inset: 0` over it.
14653
15028
  *
14654
- * OUTSET, like a Checkbox's and unlike a text field's. A 20px pill has no
14655
- * room to draw a ring inside itself, and there is no boundary to cover out
14656
- * there either: the track's own border goes the accent colour of its fill
14657
- * when the switch is on, so the ring is the only edge in that space.
15029
+ * OUTSIDE THE TRACK, like a Checkbox's and unlike a text field's: a 20px pill
15030
+ * has no room to draw a ring inside itself. But AGAINST it, not 2px off it.
15031
+ * Off, the track draws a real boundary of its own, and a ring standing off
15032
+ * that boundary was two edges with a gap between them, which reads as a
15033
+ * second outline rather than as focus. Flush, the ring and the track are one
15034
+ * edge in both states, and the ring is still drawn whole on the ground around
15035
+ * the pill, where it is measured.
14658
15036
  */
14659
15037
  .crewlet-switch__track:has(.crewlet-switch__control:focus-visible) {
14660
15038
  outline: 2px solid var(--color-focus);
14661
- outline-offset: 2px;
15039
+ outline-offset: 0;
14662
15040
  }
14663
15041
 
14664
15042
  .crewlet-switch__text {
@@ -14881,7 +15259,7 @@ svg.crewlet-select__chevron {
14881
15259
  }
14882
15260
 
14883
15261
 
14884
- /* Tabs-XCNPHA7B.css */
15262
+ /* Tabs-BWFQSWY3.css */
14885
15263
  /*
14886
15264
  * The pill register: Tabs and SegmentedControl.
14887
15265
  *
@@ -15172,6 +15550,18 @@ svg.crewlet-select__chevron {
15172
15550
  outline-offset: 2px;
15173
15551
  }
15174
15552
 
15553
+ /*
15554
+ * A CHIP RINGS ON ITS OWN EDGE, flush rather than 2px off it. The chip that
15555
+ * is on draws a hairline round itself, and a ring standing off that hairline
15556
+ * was two edges with a gap between them, which reads as a second outline
15557
+ * rather than as focus. Flush, the ring covers the hairline, and it stays
15558
+ * inside the well's 2px inset: two pixels wide, it meets the well's own
15559
+ * boundary rather than leaving a sliver of the well between the two.
15560
+ */
15561
+ .crewlet-tabs--pill .crewlet-tabs__tab:focus-visible {
15562
+ outline-offset: 0;
15563
+ }
15564
+
15175
15565
  .crewlet-tabs__tab.is-disabled,
15176
15566
  .crewlet-tabs__tab:disabled {
15177
15567
  opacity: 0.55;
@@ -15211,7 +15601,7 @@ svg.crewlet-select__chevron {
15211
15601
  }
15212
15602
 
15213
15603
 
15214
- /* Tag-4OXGO2DU.css */
15604
+ /* Tag-4BRQS6GN.css */
15215
15605
  /*
15216
15606
  * The tag: a small pill naming a state, a category or a value.
15217
15607
  *
@@ -15478,11 +15868,38 @@ svg.crewlet-select__chevron {
15478
15868
  box-shadow: inset 0 0 0 1px var(--crewlet-tag-ink);
15479
15869
  }
15480
15870
 
15871
+ /*
15872
+ * ONE RING, ON THE PILL'S OWN EDGE, never off it. A pill draws a border
15873
+ * whenever it is neutral, pointed at or pressed, and a ring standing off that
15874
+ * border is two edges with a gap between them, which reads as a second
15875
+ * outline rather than as focus. So every control here rings over the pill's
15876
+ * border, and the offset that puts it there is each control's own, because
15877
+ * the three boxes meet that border in different places:
15878
+ *
15879
+ * - a whole actionable tag IS the pill, so -1px covers the border and one
15880
+ * pixel outside it;
15881
+ * - the press half of a split pill stops at the border's inside edge, so 0
15882
+ * puts its ring on the same two pixels;
15883
+ * - the remove reaches over the border at the top and the bottom (see its
15884
+ * rule below), so -1px puts its ring there as well.
15885
+ *
15886
+ * ONE PIXEL INTO THE PILL AT MOST, not a field's two, because a pressed tag
15887
+ * says so in an ink line just inside its border: a ring two pixels deep would
15888
+ * cover the one change that pressing it makes.
15889
+ */
15481
15890
  .crewlet-tag--actionable:focus-visible,
15482
15891
  .crewlet-tag__press:focus-visible,
15483
15892
  .crewlet-tag__remove:focus-visible {
15484
15893
  outline: 2px solid var(--color-focus);
15485
- outline-offset: 2px;
15894
+ }
15895
+
15896
+ .crewlet-tag--actionable:focus-visible,
15897
+ .crewlet-tag__remove:focus-visible {
15898
+ outline-offset: -1px;
15899
+ }
15900
+
15901
+ .crewlet-tag__press:focus-visible {
15902
+ outline-offset: 0;
15486
15903
  }
15487
15904
 
15488
15905
  /* ── the pill that holds two controls ──────────────────────────────────── */
@@ -15618,7 +16035,7 @@ svg.crewlet-select__chevron {
15618
16035
  }
15619
16036
 
15620
16037
 
15621
- /* TagGroup-APC2EFH4.css */
16038
+ /* TagGroup-BCQZD7ZD.css */
15622
16039
  /*
15623
16040
  * A labelled list of tags with the tail behind a count.
15624
16041
  *
@@ -15684,9 +16101,12 @@ svg.crewlet-select__chevron {
15684
16101
  color: var(--color-text-primary);
15685
16102
  }
15686
16103
 
16104
+ /* One ring, over the dashed boundary rather than 2px off it, which is two
16105
+ edges with a gap between them: the rule every field keeps (see Input.css).
16106
+ The list above has no edge of its own, so its ring stays outset. */
15687
16107
  .crewlet-tag-group__more:focus-visible {
15688
16108
  outline: 2px solid var(--color-focus);
15689
- outline-offset: 2px;
16109
+ outline-offset: var(--size-focus-ring-inset-offset);
15690
16110
  }
15691
16111
 
15692
16112
  @media (prefers-reduced-motion: reduce) {
@@ -15696,7 +16116,7 @@ svg.crewlet-select__chevron {
15696
16116
  }
15697
16117
 
15698
16118
 
15699
- /* TagsInput-W4P36PRJ.css */
16119
+ /* TagsInput-P2HS5QL4.css */
15700
16120
  /*
15701
16121
  * TagsInput: several values in one field.
15702
16122
  *
@@ -15771,8 +16191,8 @@ svg.crewlet-select__chevron {
15771
16191
  * the whole reason they sit above the field instead of inside it.
15772
16192
  */
15773
16193
  .crewlet-tags-input__box:focus-visible {
15774
- outline: 2px solid var(--color-focus);
15775
- outline-offset: var(--size-focus-ring-inset-offset);
16194
+ outline: 1px solid var(--color-focus);
16195
+ outline-offset: -1px;
15776
16196
  }
15777
16197
 
15778
16198
  .crewlet-tags-input.is-disabled {
@@ -16024,7 +16444,7 @@ svg.crewlet-select__chevron {
16024
16444
  }
16025
16445
 
16026
16446
 
16027
- /* TimeWindowPicker-7I7KWCMU.css */
16447
+ /* TimeWindowPicker-GBF4JDFI.css */
16028
16448
  /*
16029
16449
  * TimeWindowPicker: one trigger over one panel.
16030
16450
  *
@@ -16064,11 +16484,17 @@ svg.crewlet-select__chevron {
16064
16484
  border-color: var(--color-border-hover);
16065
16485
  }
16066
16486
 
16487
+ /*
16488
+ * ONE RING, OVER THE BOUNDARY, for focus and for open alike. It stood 2px off
16489
+ * the box with the border recoloured to the focus colour as well, which is an
16490
+ * accent hairline, a gap and an accent band: two rings from one state. On the
16491
+ * inset offset the ring covers the border, and the border keeps its own colour
16492
+ * under it, the rule every field keeps (see Input.css).
16493
+ */
16067
16494
  .crewlet-time-window:focus-visible,
16068
16495
  .crewlet-time-window.is-open {
16069
- outline: 2px solid var(--color-focus);
16070
- outline-offset: 2px;
16071
- border-color: var(--color-focus);
16496
+ outline: 1px solid var(--color-focus);
16497
+ outline-offset: -1px;
16072
16498
  }
16073
16499
 
16074
16500
  .crewlet-time-window.is-disabled,
@@ -16328,11 +16754,18 @@ svg.crewlet-time-window__tick {
16328
16754
  transition: border-color var(--motion-duration-fast) var(--motion-easing-default);
16329
16755
  }
16330
16756
 
16331
- .crewlet-time-window__masked:focus-within {
16332
- outline: 2px solid transparent;
16333
- outline-offset: 2px;
16334
- border-color: var(--color-focus);
16335
- box-shadow: var(--shadow-focus);
16757
+ /*
16758
+ * THE BOX RINGS ONCE, AS A FIELD DOES. It drew the field register's old
16759
+ * indicator: the border recoloured to the focus colour AND --shadow-focus,
16760
+ * which is itself a ring (a background-coloured gap, then a band), so a
16761
+ * focused box showed two accent edges with a gap between them, and the
16762
+ * transparent outline under them was a third that forced-colors mode paints.
16763
+ * What is left is the field's one outline on the inset offset, over the box's
16764
+ * own boundary (see Input.css), keyed on the box's own input.
16765
+ */
16766
+ .crewlet-time-window__masked:has(.crewlet-time-window__masked-input:focus-visible) {
16767
+ outline: 1px solid var(--color-focus);
16768
+ outline-offset: -1px;
16336
16769
  }
16337
16770
 
16338
16771
  .crewlet-time-window__masked-input {
@@ -17013,7 +17446,7 @@ svg.crewlet-time-window__tick {
17013
17446
  }
17014
17447
 
17015
17448
 
17016
- /* TreeCanvas-HVOV4SQN.css */
17449
+ /* TreeCanvas-L2XYONWL.css */
17017
17450
  /*
17018
17451
  * A hierarchy drawn as cards on a canvas (TreeCanvas.tsx).
17019
17452
  *
@@ -17119,32 +17552,21 @@ svg.crewlet-time-window__tick {
17119
17552
  }
17120
17553
 
17121
17554
  /*
17122
- * The halo: a hairline ring OUTSIDE the card's own boundary, at the lightest
17123
- * of the hue's three alphas. It is what says a card is toned at all from the
17124
- * far end of a chart, where the fill is a few pixels of tint; drawn as its own
17125
- * ring rather than a second border so it never competes with the boundary that
17126
- * says where the card ends. Pointer-transparent, because it is drawn over the
17127
- * gap the next card's controls reach into.
17128
- */
17129
- .crewlet-tree-canvas__card[data-tone]::after {
17130
- content: '';
17131
- position: absolute;
17132
- inset: -3px;
17133
- border: 1px solid var(--crewlet-tree-canvas-card-halo);
17134
- border-radius: var(--radius-lg);
17135
- pointer-events: none;
17136
- }
17137
-
17138
- /*
17139
- * The six hues, each as the four steps a toned card draws: the fill it sits
17140
- * on, the boundary around it, the halo outside that, and the ink its name is
17141
- * written in. The ink is published as a variable rather than applied here
17142
- * because WHICH text is the name is the caller's to say.
17555
+ * ONE BOUNDARY, AND NO HALO. A toned card used to carry a second hairline ring
17556
+ * 3px outside its boundary, at the lightest of the hue's alphas, so a toned
17557
+ * card was framed twice: two parallel lines round one node read as a double
17558
+ * border, which is the one thing no box in this package draws. The fill and
17559
+ * the boundary in the hue already say the card is toned from across a chart.
17560
+ *
17561
+ * The six hues, each as the steps a toned card draws: the fill it sits on, the
17562
+ * boundary around it, the ink its name is written in and the accent its mark
17563
+ * takes. The ink and the accent are published as variables rather than applied
17564
+ * here because WHICH text is the name and which drawing the mark is are the
17565
+ * caller's to say.
17143
17566
  */
17144
17567
  .crewlet-tree-canvas__card[data-tone='purple'] {
17145
17568
  --crewlet-tree-canvas-card-fill: var(--color-node-purple-fill);
17146
17569
  --crewlet-tree-canvas-card-line: var(--color-node-purple-line);
17147
- --crewlet-tree-canvas-card-halo: var(--color-node-purple-halo);
17148
17570
  --crewlet-tree-canvas-card-ink: var(--color-node-purple-ink);
17149
17571
  --crewlet-tree-canvas-card-accent: var(--color-node-purple);
17150
17572
  }
@@ -17152,7 +17574,6 @@ svg.crewlet-time-window__tick {
17152
17574
  .crewlet-tree-canvas__card[data-tone='cyan'] {
17153
17575
  --crewlet-tree-canvas-card-fill: var(--color-node-cyan-fill);
17154
17576
  --crewlet-tree-canvas-card-line: var(--color-node-cyan-line);
17155
- --crewlet-tree-canvas-card-halo: var(--color-node-cyan-halo);
17156
17577
  --crewlet-tree-canvas-card-ink: var(--color-node-cyan-ink);
17157
17578
  --crewlet-tree-canvas-card-accent: var(--color-node-cyan);
17158
17579
  }
@@ -17160,7 +17581,6 @@ svg.crewlet-time-window__tick {
17160
17581
  .crewlet-tree-canvas__card[data-tone='green'] {
17161
17582
  --crewlet-tree-canvas-card-fill: var(--color-node-green-fill);
17162
17583
  --crewlet-tree-canvas-card-line: var(--color-node-green-line);
17163
- --crewlet-tree-canvas-card-halo: var(--color-node-green-halo);
17164
17584
  --crewlet-tree-canvas-card-ink: var(--color-node-green-ink);
17165
17585
  --crewlet-tree-canvas-card-accent: var(--color-node-green);
17166
17586
  }
@@ -17168,7 +17588,6 @@ svg.crewlet-time-window__tick {
17168
17588
  .crewlet-tree-canvas__card[data-tone='amber'] {
17169
17589
  --crewlet-tree-canvas-card-fill: var(--color-node-amber-fill);
17170
17590
  --crewlet-tree-canvas-card-line: var(--color-node-amber-line);
17171
- --crewlet-tree-canvas-card-halo: var(--color-node-amber-halo);
17172
17591
  --crewlet-tree-canvas-card-ink: var(--color-node-amber-ink);
17173
17592
  --crewlet-tree-canvas-card-accent: var(--color-node-amber);
17174
17593
  }
@@ -17176,7 +17595,6 @@ svg.crewlet-time-window__tick {
17176
17595
  .crewlet-tree-canvas__card[data-tone='rose'] {
17177
17596
  --crewlet-tree-canvas-card-fill: var(--color-node-rose-fill);
17178
17597
  --crewlet-tree-canvas-card-line: var(--color-node-rose-line);
17179
- --crewlet-tree-canvas-card-halo: var(--color-node-rose-halo);
17180
17598
  --crewlet-tree-canvas-card-ink: var(--color-node-rose-ink);
17181
17599
  --crewlet-tree-canvas-card-accent: var(--color-node-rose);
17182
17600
  }
@@ -17184,7 +17602,6 @@ svg.crewlet-time-window__tick {
17184
17602
  .crewlet-tree-canvas__card[data-tone='blue'] {
17185
17603
  --crewlet-tree-canvas-card-fill: var(--color-node-blue-fill);
17186
17604
  --crewlet-tree-canvas-card-line: var(--color-node-blue-line);
17187
- --crewlet-tree-canvas-card-halo: var(--color-node-blue-halo);
17188
17605
  --crewlet-tree-canvas-card-ink: var(--color-node-blue-ink);
17189
17606
  --crewlet-tree-canvas-card-accent: var(--color-node-blue);
17190
17607
  }
@@ -17220,18 +17637,43 @@ svg.crewlet-time-window__tick {
17220
17637
  * canvas clips, so an outset ring is cut away on the cards nearest the frame.
17221
17638
  * This component hands out the tab stop, so the indicator is its to draw; left
17222
17639
  * to the caller it was drawn on some charts and on others not at all.
17223
- */
17224
- .crewlet-tree-canvas__card [role='treeitem']:focus-visible {
17640
+ *
17641
+ * A CARD'S OWN NODE RINGS THE WHOLE CARD. Where the treeitem is the card's
17642
+ * direct child, the card's edge IS the node's edge, and a ring drawn on the
17643
+ * treeitem did two things wrong: it stopped short of anything the card holds
17644
+ * under the node (a unit's lead), and it stood beside the card's boundary as a
17645
+ * second line. So the ring is drawn on the card, over its boundary, and the
17646
+ * treeitem draws none in any state, the way a field's control leaves its ring
17647
+ * to the field. A row deeper inside a card (`*` between the two, because a row
17648
+ * is always inside something the caller drew) has no boundary of its own, and
17649
+ * keeps its ring.
17650
+ */
17651
+ .crewlet-tree-canvas__card * [role='treeitem']:focus-visible,
17652
+ .crewlet-tree-canvas__card:has(> [role='treeitem']:focus-visible) {
17225
17653
  outline: 2px solid var(--color-focus);
17226
17654
  outline-offset: var(--size-focus-ring-inset-offset);
17227
17655
  }
17228
17656
 
17657
+ .crewlet-tree-canvas__card > [role='treeitem'] {
17658
+ outline: none;
17659
+ }
17660
+
17229
17661
  /* The selection is where the reader is, so it takes the accent. Inset, for the
17230
17662
  same reason the ring is. */
17231
17663
  .crewlet-tree-canvas__card [role='treeitem'][aria-selected='true'] {
17232
17664
  box-shadow: inset 0 0 0 1px var(--color-brand-accent);
17233
17665
  }
17234
17666
 
17667
+ /* On a card's own node the selection IS the card's boundary, in the accent: an
17668
+ inset ring beside the boundary drew two lines where one says it. */
17669
+ .crewlet-tree-canvas__card:has(> [role='treeitem'][aria-selected='true']) {
17670
+ border-color: var(--color-brand-accent);
17671
+ }
17672
+
17673
+ .crewlet-tree-canvas__card > [role='treeitem'][aria-selected='true'] {
17674
+ box-shadow: none;
17675
+ }
17676
+
17235
17677
  /*
17236
17678
  * THE POINTER'S CONTROLS, drawn over the end of the card and quiet until it is
17237
17679
  * reached.
@@ -17376,8 +17818,8 @@ svg.crewlet-time-window__tick {
17376
17818
  * The space around the whole chart, as a token, for the reason the gaps are
17377
17819
  * one. None by default: a chart of panels is read inside its own frame, and
17378
17820
  * the space around it is the page's. The `node` appearance takes the console
17379
- * chart's own margin below, which is what keeps the outermost node's halo and
17380
- * its focus ring off the canvas's clip.
17821
+ * chart's own margin below, which is what keeps the control hanging under the
17822
+ * outermost node off the canvas's clip.
17381
17823
  */
17382
17824
  .crewlet-tree-canvas__margin {
17383
17825
  width: var(--spacing-0);
@@ -17651,8 +18093,8 @@ svg.crewlet-time-window__tick {
17651
18093
  * drawn distance is the same number either way, and the room simply moved
17652
18094
  * from the card's box into the gap with the control that needs it.
17653
18095
  * - AROUND: `--spacing-8`, 40px against 36, and deliberately the step above
17654
- * rather than below: the canvas CLIPS, and the outermost node's halo and
17655
- * focus ring have to clear the frame.
18096
+ * rather than below: the canvas CLIPS, and what hangs under the outermost
18097
+ * node has to clear the frame.
17656
18098
  */
17657
18099
  .crewlet-tree-canvas--node .crewlet-tree-canvas__gap {
17658
18100
  width: var(--spacing-9);
@@ -17996,6 +18438,27 @@ svg.crewlet-time-window__tick {
17996
18438
  border-radius: 0;
17997
18439
  }
17998
18440
 
18441
+ /*
18442
+ * AND THEY ANSWER THE POINTER WITH THEIR INK, NOT A GROUND, as the console
18443
+ * chart's do: the edit mark turns to the accent and the trash to the critical
18444
+ * hue, and nothing is painted under either. A cell is a whole share of the
18445
+ * node's corner, so a ground painted over it was a square standing past the
18446
+ * card's rounded corner, the one place on a node with no room for a square.
18447
+ */
18448
+ .crewlet-tree-canvas--node
18449
+ .crewlet-tree-canvas__actions
18450
+ .crewlet-icon-btn:hover:not(:disabled):not([aria-disabled='true']) {
18451
+ background: none;
18452
+ border-color: transparent;
18453
+ color: var(--color-brand-accent-ink);
18454
+ }
18455
+
18456
+ .crewlet-tree-canvas--node
18457
+ .crewlet-tree-canvas__actions
18458
+ .crewlet-icon-btn--ghost-danger:hover:not(:disabled):not([aria-disabled='true']) {
18459
+ color: var(--color-feedback-danger-ink);
18460
+ }
18461
+
17999
18462
  /*
18000
18463
  * A CONTROL ON AN EDGE IS A DISC: a ground of its own, so the line it sits on,
18001
18464
  * or the card it straddles, stops at its edge rather than running through it.
@@ -18097,38 +18560,29 @@ svg.crewlet-time-window__tick {
18097
18560
  background-image: linear-gradient(var(--color-surface-subtle), var(--color-surface-subtle));
18098
18561
  border: 1px dashed var(--color-brand-accent-soft-strong);
18099
18562
  box-shadow: var(--shadow-md);
18100
- animation: crewlet-tree-canvas-ghost-card var(--motion-duration-slow) var(--motion-easing-emphasized)
18101
- var(--motion-duration-base) both;
18102
- }
18103
-
18104
- /*
18105
- * THE RING THAT BREATHES, outside the boundary, exactly where a toned card's
18106
- * halo is: it is what says the card is waiting for the reader from the far
18107
- * end of a chart, where a dashed hairline is a few pixels. It is decoration
18108
- * over the gap the next card's controls reach into, so it takes no pointer.
18109
- */
18110
- .crewlet-tree-canvas__card--composing::after {
18111
- content: '';
18112
- position: absolute;
18113
- inset: -3px;
18114
- border: 1px solid var(--color-brand-accent-soft-strong);
18115
- border-radius: var(--radius-lg);
18116
- pointer-events: none;
18563
+ /*
18564
+ * THE BOUNDARY BREATHES, which is what says the card is waiting for the
18565
+ * reader from the far end of a chart, where a dashed hairline is a few
18566
+ * pixels. It used to be a second ring 3px outside the boundary that
18567
+ * breathed instead, two lines round one card where every box in this
18568
+ * package draws one, so the dashed boundary itself moves between the soft
18569
+ * accent and the full one.
18570
+ */
18117
18571
  animation:
18118
- crewlet-tree-canvas-ghost-glow var(--motion-duration-slow) var(--motion-easing-default)
18119
- var(--motion-duration-moderate) both,
18572
+ crewlet-tree-canvas-ghost-card var(--motion-duration-slow) var(--motion-easing-emphasized)
18573
+ var(--motion-duration-base) both,
18120
18574
  /* A BREATH RATHER THAN A TRANSITION, so it is a multiple of the scale's
18121
18575
  longest step (1.8s) rather than a number off it: the scale tops out at
18122
18576
  one UI transition, and a pulse held there would strobe. The console
18123
- chart's own is 2s. It starts where the fade in ends. */
18577
+ chart's own is 2s. It starts where the card's arrival ends. */
18124
18578
  crewlet-tree-canvas-ghost-pulse calc(var(--motion-duration-slow) * 6)
18125
- var(--motion-easing-in-out)
18126
- calc(var(--motion-duration-moderate) + var(--motion-duration-slow)) infinite;
18579
+ var(--motion-easing-in-out) calc(var(--motion-duration-base) + var(--motion-duration-slow))
18580
+ infinite;
18127
18581
  }
18128
18582
 
18129
18583
  /*
18130
18584
  * THE FORM ARRIVES LAST, and from slightly above and behind: the wire, then
18131
- * the card, then the glow, then what is inside it, which is the order a reader
18585
+ * the card, then what is inside it, which is the order a reader
18132
18586
  * follows from the node they pressed to the thing they have to fill in. The
18133
18587
  * caller's own element, whatever it drew, because the ghost's contents are
18134
18588
  * entirely the caller's.
@@ -18172,24 +18626,14 @@ svg.crewlet-time-window__tick {
18172
18626
  }
18173
18627
  }
18174
18628
 
18175
- @keyframes crewlet-tree-canvas-ghost-glow {
18176
- from {
18177
- opacity: 0;
18178
- }
18179
-
18180
- to {
18181
- opacity: 1;
18182
- }
18183
- }
18184
-
18185
18629
  @keyframes crewlet-tree-canvas-ghost-pulse {
18186
18630
  0%,
18187
18631
  100% {
18188
- opacity: 0.5;
18632
+ border-color: var(--color-brand-accent-soft-strong);
18189
18633
  }
18190
18634
 
18191
18635
  50% {
18192
- opacity: 1;
18636
+ border-color: var(--color-brand-accent);
18193
18637
  }
18194
18638
  }
18195
18639
 
@@ -18209,8 +18653,8 @@ svg.crewlet-time-window__tick {
18209
18653
  * A READER WHO ASKED FOR LESS gets the ghost DRAWN, in place, at once. Nothing
18210
18654
  * about the add is behind the motion: the chart still makes room, the branch
18211
18655
  * is still dashed, the view still moves onto it and focus still lands in the
18212
- * form. Only the arrival, the breath and the rise are dropped, and the ring
18213
- * stays at the bright end of the pulse rather than wherever it was stopped.
18656
+ * form. Only the arrival, the breath and the rise are dropped, and the
18657
+ * boundary rests at the soft step it breathes from.
18214
18658
  */
18215
18659
  @media (prefers-reduced-motion: reduce) {
18216
18660
  /* NOT `transform` on the card itself: its transform is where the layout
@@ -18230,11 +18674,6 @@ svg.crewlet-time-window__tick {
18230
18674
  transform: none;
18231
18675
  animation: none;
18232
18676
  }
18233
-
18234
- .crewlet-tree-canvas__card--composing::after {
18235
- opacity: 1;
18236
- animation: none;
18237
- }
18238
18677
  }
18239
18678
 
18240
18679