@crewlethq/ui 0.6.3 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (125) hide show
  1. package/README.md +109 -0
  2. package/dist/AddPill/index.js +1 -1
  3. package/dist/{AddPill-IJQYCY6C.css → AddPill-V4TQXJ53.css} +23 -22
  4. package/dist/AppShell/index.js +2 -2
  5. package/dist/{AppShell-XARELGIH.css → AppShell-CEVLW4QG.css} +3 -1
  6. package/dist/Button/index.js +1 -1
  7. package/dist/{Button-EXU36DEH.css → Button-UWKBTKYD.css} +18 -0
  8. package/dist/Canvas/Canvas.d.ts +16 -1
  9. package/dist/Canvas/index.d.ts +1 -1
  10. package/dist/Canvas/index.js +3 -3
  11. package/dist/{Canvas-Q6JETCWR.css → Canvas-YVXHMWLN.css} +13 -0
  12. package/dist/Card/index.js +1 -1
  13. package/dist/{Card-GLP7SUV6.css → Card-KJOYHDTJ.css} +5 -1
  14. package/dist/Checkbox/index.js +1 -1
  15. package/dist/{Checkbox-BOXQ747I.css → Checkbox-UE7TEPAM.css} +9 -1
  16. package/dist/CodeBlock/index.js +4 -4
  17. package/dist/Combobox/index.js +3 -3
  18. package/dist/CommandPalette/index.js +6 -6
  19. package/dist/Copyable/index.js +3 -3
  20. package/dist/DataTable/index.js +6 -6
  21. package/dist/{DataTable-OLHPF7D4.css → DataTable-WZK3V62B.css} +11 -0
  22. package/dist/DataView/index.js +11 -11
  23. package/dist/DateTimePicker/index.js +4 -4
  24. package/dist/{DateTimePicker-22VNXRWC.css → DateTimePicker-4AZBTODT.css} +11 -6
  25. package/dist/ErrorBoundary/index.js +2 -2
  26. package/dist/FilterChip/index.js +1 -1
  27. package/dist/{FilterChip-GTGLLOXE.css → FilterChip-EZ4QMW4E.css} +4 -1
  28. package/dist/IconButton/index.js +1 -1
  29. package/dist/{IconButton-TVEUWK6L.css → IconButton-VYWP6SGW.css} +15 -0
  30. package/dist/ImageUpload/index.js +1 -1
  31. package/dist/{ImageUpload-YCHJMUGX.css → ImageUpload-L2GE4JUM.css} +5 -1
  32. package/dist/Input/index.js +2 -2
  33. package/dist/{Input-2PU5CPKK.css → Input-DRFNI26F.css} +40 -10
  34. package/dist/Kbd/index.js +1 -1
  35. package/dist/{Kbd-JPLDVJIP.css → Kbd-MCWJTRTT.css} +11 -0
  36. package/dist/ListInput/index.js +4 -4
  37. package/dist/Menu/index.js +3 -3
  38. package/dist/Modal/index.js +3 -3
  39. package/dist/NewItemsNotice/index.js +1 -1
  40. package/dist/{NewItemsNotice-T4DSSPVV.css → NewItemsNotice-Q5ED73BQ.css} +3 -1
  41. package/dist/OrgLabel/OrgLabel.d.ts +12 -3
  42. package/dist/OrgLabel/index.js +1 -1
  43. package/dist/{OrgLabel-CR233G34.css → OrgLabel-6WSKJQOT.css} +38 -0
  44. package/dist/OrgNode/OrgNode.d.ts +7 -4
  45. package/dist/OrgNode/index.js +2 -2
  46. package/dist/{OrgNode-BT7T2Q2X.css → OrgNode-TCHJH5FO.css} +89 -45
  47. package/dist/OrgTable/index.js +5 -5
  48. package/dist/{OrgTable-VWMFC3TB.css → OrgTable-JZSYTUIK.css} +28 -4
  49. package/dist/Popover/index.js +1 -1
  50. package/dist/{Popover-WJGCF3ZQ.css → Popover-QCINR7WG.css} +5 -2
  51. package/dist/PricingCard/index.js +2 -2
  52. package/dist/{PricingCard-7EFXRSD2.css → PricingCard-HTAHG4ST.css} +5 -1
  53. package/dist/SearchTrigger/index.js +1 -1
  54. package/dist/{SearchTrigger-Z5D4AAY7.css → SearchTrigger-KIZLWBEH.css} +4 -1
  55. package/dist/SegmentedControl/SegmentedControl.d.ts +19 -1
  56. package/dist/SegmentedControl/index.d.ts +1 -1
  57. package/dist/SegmentedControl/index.js +2 -2
  58. package/dist/SegmentedControl-76HODRBT.css +160 -0
  59. package/dist/Select/index.js +1 -1
  60. package/dist/{Select-E24U5LBC.css → Select-4ANVLHUY.css} +4 -4
  61. package/dist/Switch/index.js +1 -1
  62. package/dist/{Switch-U4OWK4CL.css → Switch-66RAQCRE.css} +8 -5
  63. package/dist/Tabs/index.js +1 -1
  64. package/dist/{Tabs-XCNPHA7B.css → Tabs-BWFQSWY3.css} +12 -0
  65. package/dist/Tag/index.js +1 -1
  66. package/dist/{Tag-4OXGO2DU.css → Tag-4BRQS6GN.css} +28 -1
  67. package/dist/TagGroup/index.js +1 -1
  68. package/dist/{TagGroup-APC2EFH4.css → TagGroup-BCQZD7ZD.css} +4 -1
  69. package/dist/TagsInput/index.js +3 -3
  70. package/dist/{TagsInput-W4P36PRJ.css → TagsInput-P2HS5QL4.css} +2 -2
  71. package/dist/ThemeSwitcher/index.js +3 -3
  72. package/dist/ThemeToggle/index.js +2 -2
  73. package/dist/TimeWindowPicker/index.js +6 -6
  74. package/dist/{TimeWindowPicker-7I7KWCMU.css → TimeWindowPicker-GBF4JDFI.css} +21 -8
  75. package/dist/Tree/layout.d.ts +3 -3
  76. package/dist/TreeCanvas/TreeCanvas.d.ts +7 -5
  77. package/dist/TreeCanvas/index.js +4 -4
  78. package/dist/{TreeCanvas-HVOV4SQN.css → TreeCanvas-L2XYONWL.css} +80 -74
  79. package/dist/TreeGrid/index.js +2 -2
  80. package/dist/{chunk-SVNXOK25.js → chunk-26SCUACK.js} +2 -2
  81. package/dist/{chunk-4UQ7SMPK.js → chunk-4FQT6ZAY.js} +1 -1
  82. package/dist/{chunk-IBYO2IJN.js → chunk-5I56UXBJ.js} +4 -4
  83. package/dist/{chunk-ZFATEERP.js → chunk-5YLON2PW.js} +1 -1
  84. package/dist/{chunk-EFYPAJT3.js → chunk-6DRDCT22.js} +1 -1
  85. package/dist/{chunk-PQNILU27.js → chunk-6HXH57BL.js} +3 -3
  86. package/dist/{chunk-BNCCEER3.js → chunk-6SIG5I72.js} +22 -11
  87. package/dist/{chunk-OM5E3TTK.js → chunk-74WGARJE.js} +5 -2
  88. package/dist/{chunk-EV6IMYJ6.js → chunk-A722MUNR.js} +1 -1
  89. package/dist/{chunk-WOFOMTGB.js → chunk-B47YUQGM.js} +6 -2
  90. package/dist/{chunk-MV2E3QZM.js → chunk-BTHX2FS3.js} +2 -2
  91. package/dist/{chunk-2QLOH454.js → chunk-BXPLX7YU.js} +3 -3
  92. package/dist/{chunk-V34H2YCY.js → chunk-CEOXFO3E.js} +1 -1
  93. package/dist/{chunk-KKLITCMF.js → chunk-CLPDVL46.js} +8 -8
  94. package/dist/{chunk-AGQ3YLA5.js → chunk-CVB7O3SZ.js} +6 -6
  95. package/dist/{chunk-QY7UU5ZB.js → chunk-DRHXRGB6.js} +1 -1
  96. package/dist/{chunk-V2XMNLMS.js → chunk-E6UWRXNM.js} +1 -1
  97. package/dist/{chunk-NQ2HQ6P5.js → chunk-HVPC2GHY.js} +6 -6
  98. package/dist/{chunk-FFKYL7Z3.js → chunk-L7THQMFB.js} +4 -2
  99. package/dist/{chunk-PAWGBSHU.js → chunk-LOECRMHA.js} +1 -1
  100. package/dist/{chunk-LSJZUA5V.js → chunk-LSB3EHBW.js} +2 -2
  101. package/dist/{chunk-ERHSECG2.js → chunk-MORLKUGM.js} +1 -1
  102. package/dist/{chunk-UWQWTGQH.js → chunk-MPXI6FM6.js} +3 -3
  103. package/dist/{chunk-DHPUMOTX.js → chunk-N5KCGFWI.js} +8 -4
  104. package/dist/{chunk-ZAO4HHXI.js → chunk-OG6CL3EB.js} +1 -1
  105. package/dist/{chunk-C5WJUZVR.js → chunk-ORNOOMVY.js} +1 -1
  106. package/dist/{chunk-WUVZDFHS.js → chunk-OVLJEVQS.js} +2 -2
  107. package/dist/{chunk-AUS5FNQE.js → chunk-PDUZO35I.js} +1 -1
  108. package/dist/{chunk-YLYOWZ4V.js → chunk-PXU6HOZB.js} +1 -1
  109. package/dist/{chunk-S7KW47IQ.js → chunk-RHHGLTXJ.js} +1 -1
  110. package/dist/{chunk-SJQ546ID.js → chunk-SEFMO2EV.js} +1 -1
  111. package/dist/{chunk-KJ34ZBBI.js → chunk-SMBKXWML.js} +1 -1
  112. package/dist/{chunk-FIFNP6PL.js → chunk-SX2DFTQV.js} +1 -1
  113. package/dist/{chunk-L6XZOCP4.js → chunk-UCYIRDND.js} +2 -2
  114. package/dist/{chunk-D6EVJUGU.js → chunk-UYK72NOS.js} +1 -1
  115. package/dist/{chunk-TIWAHZZ6.js → chunk-VCOELPCT.js} +2 -2
  116. package/dist/{chunk-2HY7I3NT.js → chunk-VE6LD3KM.js} +5 -3
  117. package/dist/{chunk-CAIHUYXV.js → chunk-W4GQWFRX.js} +1 -1
  118. package/dist/{chunk-BWIPKSWA.js → chunk-XX2VQE55.js} +1 -1
  119. package/dist/{chunk-UA7O3KKJ.js → chunk-YCTMKKRA.js} +1 -1
  120. package/dist/{chunk-DSUY5F4E.js → chunk-ZGX2DP7F.js} +2 -2
  121. package/dist/generated/index.js +41 -41
  122. package/dist/index.js +41 -41
  123. package/dist/styles.css +621 -222
  124. package/package.json +3 -3
  125. package/dist/SegmentedControl-X3BI3XU4.css +0 -68
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
  /*
@@ -3584,7 +3622,7 @@
3584
3622
  }
3585
3623
 
3586
3624
 
3587
- /* Checkbox-BOXQ747I.css */
3625
+ /* Checkbox-UE7TEPAM.css */
3588
3626
  /*
3589
3627
  * Checkbox: a box, its label and its consequence as one target.
3590
3628
  *
@@ -3692,9 +3730,17 @@
3692
3730
  opacity: 0.6;
3693
3731
  }
3694
3732
 
3733
+ /*
3734
+ * OUTSIDE THE BOX, AND AGAINST IT. The box IS the target, and 2px eaten off a
3735
+ * 16px square leaves no middle, so the ring stays outside it. But it stands on
3736
+ * the box's own edge rather than 2px off it: a ring with a gap round a box
3737
+ * that already draws its own boundary is two edges, which reads as a second
3738
+ * outline rather than as focus. Flush, the ring and the box are one edge, and
3739
+ * the ring is still drawn whole on the ground around it.
3740
+ */
3695
3741
  .crewlet-checkbox__control:focus-visible {
3696
3742
  outline: 2px solid var(--color-focus);
3697
- outline-offset: 2px;
3743
+ outline-offset: 0;
3698
3744
  }
3699
3745
 
3700
3746
 
@@ -4440,7 +4486,7 @@
4440
4486
  }
4441
4487
 
4442
4488
 
4443
- /* DataTable-OLHPF7D4.css */
4489
+ /* DataTable-WZK3V62B.css */
4444
4490
  /* ─────────────────────────────────────────────────────────────────
4445
4491
  * Default variant.
4446
4492
  *
@@ -4822,8 +4868,19 @@ body.crewlet-data-table-resizing {
4822
4868
  color: var(--color-text-on-accent);
4823
4869
  }
4824
4870
 
4871
+ /*
4872
+ * One ring, over the chip's own boundary rather than 2px off it, which is two
4873
+ * edges with a gap between them: the rule every field keeps (see Input.css).
4874
+ * The active size is filled with the accent and its border is the fill, so
4875
+ * there is no edge to double there, and an inset ring on that fill would be
4876
+ * drawn in nearly the fill's own colour: it keeps the outset ring.
4877
+ */
4825
4878
  .crewlet-data-table__items-per-page-btn:focus-visible {
4826
4879
  outline: 2px solid var(--color-focus);
4880
+ outline-offset: var(--size-focus-ring-inset-offset);
4881
+ }
4882
+
4883
+ .crewlet-data-table__items-per-page-btn.is-active:focus-visible {
4827
4884
  outline-offset: 2px;
4828
4885
  }
4829
4886
 
@@ -6909,7 +6966,7 @@ body.crewlet-data-table-resizing {
6909
6966
  }
6910
6967
 
6911
6968
 
6912
- /* DateTimePicker-22VNXRWC.css */
6969
+ /* DateTimePicker-4AZBTODT.css */
6913
6970
  /*
6914
6971
  * DateTimePicker: a Select-shaped trigger over a calendar dialog.
6915
6972
  *
@@ -6953,12 +7010,17 @@ body.crewlet-data-table-resizing {
6953
7010
  * Focus and open are drawn alike, and the ring is an OUTLINE: forced-colors
6954
7011
  * mode drops every box-shadow and keeps outlines, so a ring drawn as a shadow
6955
7012
  * disappears for exactly the readers who most need one.
7013
+ *
7014
+ * ONE RING, OVER THE BOUNDARY. It stood 2px off the box with the border
7015
+ * recoloured to the focus colour as well, which is an accent hairline, a gap
7016
+ * and an accent band: two rings from one state. On the inset offset the ring
7017
+ * covers the border, and the border keeps its own colour under it, the rule
7018
+ * every field keeps (see Input.css).
6956
7019
  */
6957
7020
  .crewlet-datetime:focus-visible,
6958
7021
  .crewlet-datetime.is-open {
6959
- outline: 2px solid var(--color-focus);
6960
- outline-offset: 2px;
6961
- border-color: var(--color-focus);
7022
+ outline: 1px solid var(--color-focus);
7023
+ outline-offset: -1px;
6962
7024
  }
6963
7025
 
6964
7026
  .crewlet-datetime.is-disabled,
@@ -7081,10 +7143,10 @@ svg.crewlet-datetime__chevron {
7081
7143
  margin: 0;
7082
7144
  }
7083
7145
 
7146
+ /* The same one ring the trigger draws, over the box's own boundary. */
7084
7147
  .crewlet-datetime__time-input:focus-visible {
7085
- outline: 2px solid var(--color-focus);
7086
- outline-offset: 2px;
7087
- border-color: var(--color-focus);
7148
+ outline: 1px solid var(--color-focus);
7149
+ outline-offset: -1px;
7088
7150
  }
7089
7151
 
7090
7152
  .crewlet-datetime__footer {
@@ -7718,7 +7780,7 @@ svg.crewlet-datetime__chevron {
7718
7780
  }
7719
7781
 
7720
7782
 
7721
- /* FilterChip-GTGLLOXE.css */
7783
+ /* FilterChip-EZ4QMW4E.css */
7722
7784
  /*
7723
7785
  * The filter chip: neutral until it is on, and then the accent.
7724
7786
  *
@@ -7789,9 +7851,12 @@ svg.crewlet-datetime__chevron {
7789
7851
  color: var(--color-text-primary);
7790
7852
  }
7791
7853
 
7854
+ /* One ring, over the chip's own boundary rather than 2px off it, which is two
7855
+ edges with a gap between them: the rule every field keeps (see Input.css).
7856
+ A chip that is on still says so under the ring, in its fill and its ink. */
7792
7857
  .crewlet-filter-chip:focus-visible {
7793
7858
  outline: 2px solid var(--color-focus);
7794
- outline-offset: 2px;
7859
+ outline-offset: var(--size-focus-ring-inset-offset);
7795
7860
  }
7796
7861
 
7797
7862
  .crewlet-filter-chip:disabled {
@@ -7828,7 +7893,7 @@ svg.crewlet-datetime__chevron {
7828
7893
  }
7829
7894
 
7830
7895
 
7831
- /* IconButton-TVEUWK6L.css */
7896
+ /* IconButton-VYWP6SGW.css */
7832
7897
  /*
7833
7898
  * IconButton: a square icon-only control.
7834
7899
  *
@@ -7865,6 +7930,21 @@ svg.crewlet-datetime__chevron {
7865
7930
  outline-offset: 2px;
7866
7931
  }
7867
7932
 
7933
+ /*
7934
+ * ONE RING, OVER THE BOUNDARY, on every square that draws one: the secondary
7935
+ * and the soft-brand at rest, and the ghost-brand, which grows one under the
7936
+ * pointer. A ring standing 2px off a visible border is two edges with a gap
7937
+ * between them, which reads as a second outline rather than as focus; on the
7938
+ * inset offset it covers the border instead, the rule every field keeps (see
7939
+ * Input.css). The other ghosts never draw an edge, so they keep the outset
7940
+ * ring.
7941
+ */
7942
+ .crewlet-icon-btn--secondary:focus-visible,
7943
+ .crewlet-icon-btn--soft-brand:focus-visible,
7944
+ .crewlet-icon-btn--ghost-brand:focus-visible {
7945
+ outline-offset: var(--size-focus-ring-inset-offset);
7946
+ }
7947
+
7868
7948
  .crewlet-icon-btn:disabled,
7869
7949
  .crewlet-icon-btn[aria-disabled='true'] {
7870
7950
  opacity: 0.5;
@@ -7989,7 +8069,7 @@ svg.crewlet-datetime__chevron {
7989
8069
  }
7990
8070
 
7991
8071
 
7992
- /* ImageUpload-YCHJMUGX.css */
8072
+ /* ImageUpload-L2GE4JUM.css */
7993
8073
  /*
7994
8074
  * ImageUpload, the click-to-upload affordance built on Avatar.
7995
8075
  *
@@ -8173,9 +8253,13 @@ svg.crewlet-datetime__chevron {
8173
8253
  cursor: default;
8174
8254
  }
8175
8255
 
8256
+ /* One ring, drawn OVER the badge's knockout ring rather than 2px outside it:
8257
+ over the image the knockout is an edge of its own, and a ring standing off
8258
+ it was two rings round one small disc. On the inset offset the focus ring
8259
+ takes the knockout's place, which still parts the disc from the image. */
8176
8260
  .crewlet-image-upload__remove:focus-visible {
8177
8261
  outline: 2px solid var(--color-focus);
8178
- outline-offset: 2px;
8262
+ outline-offset: var(--size-focus-ring-inset-offset);
8179
8263
  }
8180
8264
 
8181
8265
  .crewlet-image-upload__input {
@@ -8267,7 +8351,7 @@ svg.crewlet-datetime__chevron {
8267
8351
  }
8268
8352
 
8269
8353
 
8270
- /* Input-2PU5CPKK.css */
8354
+ /* Input-DRFNI26F.css */
8271
8355
  /*
8272
8356
  * The form row: Input, Textarea, Label, FormField, FormRow, FormSection and
8273
8357
  * ReadOnlyField.
@@ -8344,11 +8428,14 @@ svg.crewlet-datetime__chevron {
8344
8428
  * forced-colors mode drops every box-shadow and keeps outlines: a ring drawn
8345
8429
  * as a shadow disappears for exactly the readers who most need one.
8346
8430
  *
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.
8431
+ * It is ONE PIXEL, LAID EXACTLY ON THE BOUNDARY: the field's own hairline,
8432
+ * drawn in the focus colour, which is how the console's fields say focus. At
8433
+ * two pixels it was a heavy band round every box a caret landed in, and on a
8434
+ * form of them the field being typed in read as the loudest thing on the page.
8435
+ * Drawn on the boundary rather than outside it, a scroller cannot clip it and
8436
+ * the field does not grow a halo the moment a caret lands in it, which is what
8437
+ * a filter box in a toolbar of them did to the row it sits in. Every boxed
8438
+ * field in the package rings this way (`Input.test.tsx` holds them to it).
8352
8439
  *
8353
8440
  * THE BORDER IS LEFT ALONE. Recolouring it under the ring says nothing the
8354
8441
  * ring has not already said, and it is what cost the error state its own
@@ -8364,8 +8451,8 @@ svg.crewlet-datetime__chevron {
8364
8451
  * on a pointer press as well as on a tab.
8365
8452
  */
8366
8453
  .crewlet-input:has(.crewlet-input__control:focus-visible) {
8367
- outline: 2px solid var(--color-focus);
8368
- outline-offset: var(--size-focus-ring-inset-offset);
8454
+ outline: 1px solid var(--color-focus);
8455
+ outline-offset: -1px;
8369
8456
  }
8370
8457
 
8371
8458
  .crewlet-input.is-error {
@@ -8624,8 +8711,8 @@ svg.crewlet-datetime__chevron {
8624
8711
  on the control itself: a textarea is the field, with nothing wrapped round
8625
8712
  it and nothing focusable inside it. */
8626
8713
  .crewlet-textarea:focus-visible {
8627
- outline: 2px solid var(--color-focus);
8628
- outline-offset: var(--size-focus-ring-inset-offset);
8714
+ outline: 1px solid var(--color-focus);
8715
+ outline-offset: -1px;
8629
8716
  }
8630
8717
 
8631
8718
  .crewlet-textarea.is-error {
@@ -8641,10 +8728,37 @@ svg.crewlet-datetime__chevron {
8641
8728
  cursor: not-allowed;
8642
8729
  }
8643
8730
 
8731
+ /*
8732
+ * ONE LINE THAT GROWS STARTS AT THE SINGLE-LINE FIELD'S HEIGHT. A box that
8733
+ * grows to fit what is typed was drawn at the large control step while it held
8734
+ * one line, so the box a list item is written in stood sixteen pixels taller
8735
+ * than the fields above and below it. One line now stands at the medium step,
8736
+ * the height of every single-line field, with the line centred in it as an
8737
+ * input's is: the block padding is what that step leaves once the two border
8738
+ * pixels and one line are paid for. Each line past the first grows it from
8739
+ * there.
8740
+ */
8644
8741
  .crewlet-textarea.is-auto-resize {
8645
8742
  resize: none;
8646
8743
  overflow: hidden;
8647
- min-height: var(--size-control-lg);
8744
+ min-height: var(--size-control-md);
8745
+ padding-block: max(
8746
+ 0px,
8747
+ calc((var(--size-control-md) - 2px - var(--font-line-height-normal) * var(--font-size-compact)) / 2)
8748
+ );
8749
+ }
8750
+
8751
+ /*
8752
+ * AND WHAT TRAILS IT SITS ON ITS FIRST LINE, centred in the band one line
8753
+ * takes, which is exactly where an input's trailing hint sits. Pinned a spacing
8754
+ * step from the top, it sat above the line's middle and level with nothing;
8755
+ * on the first line it stays put as the box grows under it.
8756
+ */
8757
+ .crewlet-textarea-shell:has(> .crewlet-textarea.is-auto-resize) > .crewlet-input__trailing {
8758
+ top: 0;
8759
+ display: flex;
8760
+ align-items: center;
8761
+ height: var(--size-control-md);
8648
8762
  }
8649
8763
 
8650
8764
  .crewlet-textarea::placeholder {
@@ -8886,7 +9000,7 @@ svg.crewlet-datetime__chevron {
8886
9000
  }
8887
9001
 
8888
9002
 
8889
- /* Kbd-JPLDVJIP.css */
9003
+ /* Kbd-MCWJTRTT.css */
8890
9004
  /*
8891
9005
  * A keycap: the key's name on a small raised tile.
8892
9006
  *
@@ -8931,9 +9045,20 @@ svg.crewlet-datetime__chevron {
8931
9045
  * platform prints a chord. It is a `kbd` of its own because that is what a key
8932
9046
  * inside a key combination is, and a user agent's `kbd` rule would otherwise
8933
9047
  * set its own face and size on it.
9048
+ *
9049
+ * AND IT TAKES NO BOX FROM ANYBODY ELSE. An application stylesheet that draws
9050
+ * a bare `kbd` as a cap of its own (a common enough rule) reached each key in
9051
+ * here and framed it, so one chord drew a frame round a run of framed keys.
9052
+ * The key states every part of its box, so whatever a page says about `kbd`,
9053
+ * a chord is one cap.
8934
9054
  */
8935
9055
  .crewlet-kbd__key {
8936
9056
  font: inherit;
9057
+ color: inherit;
9058
+ padding: 0;
9059
+ background: none;
9060
+ border: 0;
9061
+ border-radius: 0;
8937
9062
  }
8938
9063
 
8939
9064
  /*
@@ -10610,7 +10735,7 @@ svg.crewlet-datetime__chevron {
10610
10735
  }
10611
10736
 
10612
10737
 
10613
- /* NewItemsNotice-T4DSSPVV.css */
10738
+ /* NewItemsNotice-Q5ED73BQ.css */
10614
10739
  /*
10615
10740
  * The pill that holds finished rows back.
10616
10741
  *
@@ -10661,9 +10786,11 @@ svg.crewlet-datetime__chevron {
10661
10786
  color: var(--color-brand-accent-ink);
10662
10787
  }
10663
10788
 
10789
+ /* One ring, over the pill's own boundary rather than 2px off it, which is two
10790
+ edges with a gap between them: the rule every field keeps (see Input.css). */
10664
10791
  .crewlet-new-items:focus-visible {
10665
10792
  outline: 2px solid var(--color-focus);
10666
- outline-offset: 2px;
10793
+ outline-offset: var(--size-focus-ring-inset-offset);
10667
10794
  }
10668
10795
 
10669
10796
  @media (prefers-reduced-motion: reduce) {
@@ -10673,7 +10800,7 @@ svg.crewlet-datetime__chevron {
10673
10800
  }
10674
10801
 
10675
10802
 
10676
- /* OrgLabel-CR233G34.css */
10803
+ /* OrgLabel-6WSKJQOT.css */
10677
10804
  /*
10678
10805
  * What a node of an org chart and a row of an org table both say
10679
10806
  * (OrgLabel.tsx).
@@ -10762,6 +10889,44 @@ svg.crewlet-datetime__chevron {
10762
10889
  fill: currentColor;
10763
10890
  }
10764
10891
 
10892
+ /*
10893
+ * A PERSON IS A FIGURE INSIDE A DASHED RING, as the console chart draws one:
10894
+ * the boundary says this seat is held by someone outside the system. The ring
10895
+ * is the 24px target step and the figure inside it a step smaller than a
10896
+ * container's glyph, which leaves the air a boundary needs to read as one: at
10897
+ * the zone's own step the figure touched the ring on every side.
10898
+ *
10899
+ * THE RING IS DECORATION, drawn in the step kept for it, and the figure is the
10900
+ * mark: the ring says how the seat is held, never what it is.
10901
+ */
10902
+ .crewlet-org-label__icon--ring {
10903
+ position: relative;
10904
+ }
10905
+
10906
+ .crewlet-org-label__icon--ring::before {
10907
+ content: '';
10908
+ position: absolute;
10909
+ top: 50%;
10910
+ left: 50%;
10911
+ width: var(--size-target-min);
10912
+ height: var(--size-target-min);
10913
+ border: 1px dashed var(--color-text-muted);
10914
+ border-radius: var(--radius-circle);
10915
+ transform: translate(-50%, -50%);
10916
+ pointer-events: none;
10917
+ }
10918
+
10919
+ .crewlet-org-label__icon--ring > svg {
10920
+ width: var(--font-size-md);
10921
+ height: var(--font-size-md);
10922
+ }
10923
+
10924
+ /* A ROW DRAWS THE FIGURE ALONE, as the console table does: a ring on a line
10925
+ of text is a second boundary inside the row's own. */
10926
+ .crewlet-org-label--row .crewlet-org-label__icon--ring::before {
10927
+ content: none;
10928
+ }
10929
+
10765
10930
  /* ---- The name and its caption -------------------------------------------- */
10766
10931
 
10767
10932
  /*
@@ -10960,7 +11125,7 @@ svg.crewlet-datetime__chevron {
10960
11125
  }
10961
11126
 
10962
11127
 
10963
- /* OrgNode-BT7T2Q2X.css */
11128
+ /* OrgNode-TCHJH5FO.css */
10964
11129
  /*
10965
11130
  * What a node of an org chart carries beyond what it says (OrgNode.tsx).
10966
11131
  *
@@ -10996,6 +11161,15 @@ svg.crewlet-datetime__chevron {
10996
11161
 
10997
11162
  /* ---- A unit's lead ------------------------------------------------------ */
10998
11163
 
11164
+ /*
11165
+ * NO LINE OF ITS OWN. The console chart rules a hairline over this strip and
11166
+ * frames a set lead's pill inside it, 4px in from the node's own edge: inside
11167
+ * a card that is already framed, that is a box drawn twice, with a second line
11168
+ * running beside the card's edge on three sides and a third across the top.
11169
+ * A set lead is a ground instead, and a ground needs no line to divide it from
11170
+ * the name above. Only an EMPTY slot keeps an edge, dashed (below), because
11171
+ * the dash is what says a place is waiting rather than a frame round a value.
11172
+ */
10999
11173
  .crewlet-org-node-lead {
11000
11174
  position: relative;
11001
11175
  display: flex;
@@ -11004,28 +11178,11 @@ svg.crewlet-datetime__chevron {
11004
11178
  padding: 0 var(--spacing-1) var(--spacing-1);
11005
11179
  }
11006
11180
 
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
11181
  /*
11025
11182
  * 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.
11183
+ * to this unit rather than as a second caption. RAISED, on the step a chip
11184
+ * with no boundary of its own takes (the palette suite holds it off the card
11185
+ * on both themes), so it is found by its ground rather than by a frame.
11029
11186
  */
11030
11187
  .crewlet-org-node-lead__pill {
11031
11188
  display: flex;
@@ -11040,32 +11197,30 @@ svg.crewlet-datetime__chevron {
11040
11197
  font-weight: var(--font-weight-medium);
11041
11198
  line-height: var(--font-line-height-tight);
11042
11199
  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);
11200
+ background: var(--color-surface-elevated);
11051
11201
  border-radius: var(--radius-sm);
11052
11202
  }
11053
11203
 
11054
11204
  /*
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.
11205
+ * AND AN EMPTY ONE IS AN EMPTY SLOT: no ground, a dashed edge and the word
11206
+ * alone in the quieter ink, as the console chart draws it. A unit with no lead
11207
+ * has a place for one, and the dash is what says the place is waiting to be
11208
+ * filled, which is what invites the reader to set it. It is the one edge drawn
11209
+ * inside a node, and only while the slot is empty: a set lead is a raised
11210
+ * ground with no edge at all. The edge is the hover step rather than the
11211
+ * resting hairline, because at the hairline's own step the slot was a
11212
+ * rectangle a reader had to look for.
11059
11213
  */
11060
11214
  .crewlet-org-node-lead__pill--empty {
11061
11215
  color: var(--color-text-tertiary);
11062
- border-style: dashed;
11216
+ background: none;
11217
+ border: 1px dashed var(--color-border-hover);
11063
11218
  }
11064
11219
 
11065
11220
  /*
11066
11221
  * A LEAD THAT CAN BE CHANGED IS STILL A LEAD. Where the pill holds a control
11067
11222
  * 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.
11223
+ * own type and ink, and draws no boundary or ground of its own on the pill's.
11069
11224
  * Left at its own size, a control step inside a half-rank strip is a button
11070
11225
  * that overflows the node it sits in.
11071
11226
  *
@@ -11092,6 +11247,35 @@ svg.crewlet-datetime__chevron {
11092
11247
  color: var(--color-text-primary);
11093
11248
  }
11094
11249
 
11250
+ /*
11251
+ * WHATEVER WRAPS THE CONTROL FILLS THE PILL TOO. A menu's trigger arrives
11252
+ * inside the menu's own anchor, and the anchor was a shrink-wrapped item of
11253
+ * the pill's row: the control was the width of the word "Lead" in a pill as
11254
+ * wide as the node, and a press anywhere else in the pill did nothing.
11255
+ */
11256
+ .crewlet-org-node-lead__pill > :has(> .crewlet-btn) {
11257
+ display: flex;
11258
+ flex: 1;
11259
+ min-width: 0;
11260
+ }
11261
+
11262
+ /*
11263
+ * REACHED, THE WHOLE PILL LIGHTS, because the whole pill is the control. The
11264
+ * ghost control's own hover and press grounds were a patch the size of the
11265
+ * word inside the pill, so it paints neither, and the pill takes the row hover
11266
+ * step over its own ground while the control is pointed at or its menu is
11267
+ * open. Its ink still goes to full, above.
11268
+ */
11269
+ .crewlet-org-node-lead__pill
11270
+ .crewlet-btn:is(:hover, :active):not(:disabled):not([aria-disabled='true']) {
11271
+ background: none;
11272
+ }
11273
+
11274
+ .crewlet-org-node-lead__pill:has(.crewlet-btn:hover:not(:disabled):not([aria-disabled='true'])),
11275
+ .crewlet-org-node-lead__pill:has(.crewlet-btn[aria-expanded='true']) {
11276
+ background-image: linear-gradient(var(--color-surface-hover), var(--color-surface-hover));
11277
+ }
11278
+
11095
11279
  /* The name of the lead, not the chevron beside it, is what truncates. */
11096
11280
  .crewlet-org-node-lead__pill .crewlet-btn > span {
11097
11281
  overflow: hidden;
@@ -11110,25 +11294,42 @@ svg.crewlet-datetime__chevron {
11110
11294
  *
11111
11295
  * DRAWN SMALL, HIT FULL SIZE, the rule the whole node keeps: the strip is half
11112
11296
  * 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.
11297
+ * bottom padding, exactly as the lead's own control is.
11298
+ *
11299
+ * AND IT DOES NOT MOVE THE NAME. Taking its room from the row, it pushed the
11300
+ * name half its own width off the pill's middle, so "Lead: Ada" sat left of
11301
+ * centre on every unit that had one. It is drawn over the pill's right end
11302
+ * instead, out of the row, and the lead's control keeps the same room at both
11303
+ * of its ends while it is there: the name is centred on the whole pill and
11304
+ * truncates before it reaches the clear, and the control is still the whole
11305
+ * pill to press.
11117
11306
  */
11118
11307
  .crewlet-org-node-lead__clear {
11119
- position: relative;
11308
+ position: absolute;
11309
+ top: 50%;
11310
+ right: 0;
11311
+ z-index: 1;
11120
11312
  display: inline-flex;
11121
- flex: none;
11122
11313
  align-items: center;
11123
11314
  justify-content: center;
11315
+ transform: translateY(-50%);
11316
+ }
11317
+
11318
+ .crewlet-org-node-lead__pill:has(> .crewlet-org-node-lead__clear) {
11319
+ position: relative;
11320
+ }
11321
+
11322
+ .crewlet-org-node-lead__pill:has(> .crewlet-org-node-lead__clear)
11323
+ .crewlet-btn:not(.crewlet-org-node-lead__clear *) {
11324
+ padding-inline: var(--spacing-4);
11124
11325
  }
11125
11326
 
11126
11327
  /*
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.
11328
+ * THE DISC IS ITS RING. Its ground is the raised step the pill itself is
11329
+ * drawn on, rather than that chart's own alpha (0.08 of white is the card's
11330
+ * own value on this package's light theme, so a disc drawn by its ground
11331
+ * would disappear on half the deployments), and so what draws it on the pill
11332
+ * is the hairline round it.
11132
11333
  */
11133
11334
  .crewlet-org-node-lead__disc {
11134
11335
  position: absolute;
@@ -11166,6 +11367,14 @@ svg.crewlet-datetime__chevron {
11166
11367
  color: var(--color-text-primary);
11167
11368
  }
11168
11369
 
11370
+ /* AND NOTHING ELSE FILLS EITHER: a ghost control's own hover and press grounds
11371
+ are painted on its whole 24px target, which drew a circle twice the disc's
11372
+ size round a 12px mark the moment it was pointed at. */
11373
+ .crewlet-org-node-lead__clear
11374
+ :is(.crewlet-btn, .crewlet-icon-btn):is(:hover, :active):not(:disabled):not([aria-disabled='true']) {
11375
+ background: none;
11376
+ }
11377
+
11169
11378
  .crewlet-org-node-lead__clear:hover .crewlet-org-node-lead__disc {
11170
11379
  border-color: var(--color-border-control);
11171
11380
  }
@@ -11177,7 +11386,7 @@ svg.crewlet-datetime__chevron {
11177
11386
  }
11178
11387
 
11179
11388
 
11180
- /* OrgTable-VWMFC3TB.css */
11389
+ /* OrgTable-JZSYTUIK.css */
11181
11390
  /*
11182
11391
  * An organization as an indented table of rows (OrgTable.tsx).
11183
11392
  *
@@ -11204,8 +11413,11 @@ svg.crewlet-datetime__chevron {
11204
11413
  */
11205
11414
  --crewlet-org-table-indent: var(--spacing-8);
11206
11415
  /* 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);
11416
+ It leaves the trunk in the TRUNK'S own step, as the console table's does,
11417
+ so the two read as one line; started brighter than the trunk, every
11418
+ branch was a dash floating beside a trunk nobody could see. Rebound per
11419
+ hue below. */
11420
+ --crewlet-org-table-wire: var(--color-border-strong);
11209
11421
  --crewlet-org-table-wire-fade: var(--color-border-default);
11210
11422
  /* What a row's name and its mark are drawn in. Rebound per hue below. */
11211
11423
  --crewlet-org-table-ink: var(--color-text-primary);
@@ -11314,8 +11526,15 @@ svg.crewlet-datetime__chevron {
11314
11526
  * follows, so the trunk is one line down the whole table rather than one per
11315
11527
  * level. The cell's padding is taken back and the wire element carries the
11316
11528
  * level instead.
11529
+ *
11530
+ * AND THE CELL IS THE ROW'S FULL HEIGHT, because the wire in it is. The grid
11531
+ * centres its cells in a row taller than they are, and a trunk drawn down a
11532
+ * centred cell stopped short of both edges of every row, so the line its
11533
+ * segments were meant to stack into read as one dash per row. The cell still
11534
+ * centres what it holds.
11317
11535
  */
11318
11536
  .crewlet-org-table [role='gridcell']:first-child {
11537
+ align-self: stretch;
11319
11538
  padding-inline-start: var(--spacing-2);
11320
11539
  }
11321
11540
 
@@ -11350,12 +11569,19 @@ svg.crewlet-datetime__chevron {
11350
11569
  * segments stack into one line. Neutral, always: it belongs to the table
11351
11570
  * rather than to any row, and a trunk that took each row's hue in turn would
11352
11571
  * be a striped line saying nothing.
11572
+ *
11573
+ * IN THE STRONG STEP, where the console table draws its trunk a notch above
11574
+ * the row's ground. In the plain border step it all but vanished on the
11575
+ * table's own ground, and the branches beside it read as loose dashes.
11576
+ *
11577
+ * It starts one hairline above the cell, over the grid's rule between rows,
11578
+ * so the segments meet rather than being cut by that rule.
11353
11579
  */
11354
11580
  .crewlet-org-table__wire[data-trunk]::before {
11355
- inset-block: 0;
11581
+ inset-block: -1px 0;
11356
11582
  inset-inline-start: 0;
11357
11583
  width: 2px;
11358
- background: var(--color-border-default);
11584
+ background: var(--color-border-strong);
11359
11585
  }
11360
11586
 
11361
11587
  /* A root row's trunk starts at the row's middle: nothing hangs above the
@@ -11364,6 +11590,13 @@ svg.crewlet-datetime__chevron {
11364
11590
  inset-block-start: 50%;
11365
11591
  }
11366
11592
 
11593
+ /* The last row a root shows ends the trunk at its own branch: no row below it
11594
+ hangs off the line, and a trunk run on to the next tree or the table's edge
11595
+ is a line to nowhere. */
11596
+ .crewlet-org-table__wire[data-last][data-trunk]::before {
11597
+ inset-block-end: 50%;
11598
+ }
11599
+
11367
11600
  /*
11368
11601
  * THE BRANCH: from the trunk across the gutter to the row's own mark, fading
11369
11602
  * as it arrives. It reaches one cell gap past the wire's own width, which is
@@ -11631,7 +11864,7 @@ svg.crewlet-datetime__chevron {
11631
11864
  }
11632
11865
 
11633
11866
 
11634
- /* Popover-WJGCF3ZQ.css */
11867
+ /* Popover-QCINR7WG.css */
11635
11868
  /*
11636
11869
  * The anchored panel.
11637
11870
  *
@@ -11674,10 +11907,13 @@ svg.crewlet-datetime__chevron {
11674
11907
  transform-origin: bottom left;
11675
11908
  }
11676
11909
 
11677
- /* A panel that takes focus shows it on the panel, not only on what is inside. */
11910
+ /* A panel that takes focus shows it on the panel, not only on what is inside,
11911
+ and shows it ONCE: over the panel's own boundary rather than 2px off it,
11912
+ which is two edges with a gap between them (the rule every field keeps, see
11913
+ Input.css). */
11678
11914
  .crewlet-popover:focus-visible {
11679
11915
  outline: 2px solid var(--color-focus);
11680
- outline-offset: 2px;
11916
+ outline-offset: var(--size-focus-ring-inset-offset);
11681
11917
  }
11682
11918
 
11683
11919
  /* Up from under its anchor, which is where it is about to be. */
@@ -11819,7 +12055,7 @@ svg.crewlet-datetime__chevron {
11819
12055
  }
11820
12056
 
11821
12057
 
11822
- /* PricingCard-7EFXRSD2.css */
12058
+ /* PricingCard-HTAHG4ST.css */
11823
12059
  /*
11824
12060
  * PricingCard, the plan-tier card surface.
11825
12061
  *
@@ -11886,9 +12122,13 @@ svg.crewlet-datetime__chevron {
11886
12122
  border-color: var(--color-brand-accent-soft-strong);
11887
12123
  }
11888
12124
 
12125
+ /* One ring, over the card's own boundary rather than 2px off it, which is two
12126
+ edges with a gap between them: the rule every field keeps (see Input.css).
12127
+ The chosen plan keeps an accent line inside the ring, since the selection
12128
+ ring below is two pixels deep and the focus ring covers one of them. */
11889
12129
  .crewlet-pricing-card:focus-visible {
11890
12130
  outline: 2px solid var(--color-focus);
11891
- outline-offset: 2px;
12131
+ outline-offset: var(--size-focus-ring-inset-offset);
11892
12132
  }
11893
12133
 
11894
12134
  /* The chosen plan takes the selection ring, which is the same inset rule
@@ -12214,7 +12454,7 @@ svg.crewlet-datetime__chevron {
12214
12454
  }
12215
12455
 
12216
12456
 
12217
- /* SearchTrigger-Z5D4AAY7.css */
12457
+ /* SearchTrigger-KIZLWBEH.css */
12218
12458
  /*
12219
12459
  * A button drawn as the field it stands in for.
12220
12460
  *
@@ -12275,9 +12515,12 @@ svg.crewlet-datetime__chevron {
12275
12515
  color: var(--color-text-primary);
12276
12516
  }
12277
12517
 
12518
+ /* One ring, over the trigger's own boundary rather than 2px off it, which is
12519
+ two edges with a gap between them: the rule every field keeps (see
12520
+ Input.css). */
12278
12521
  .crewlet-search-trigger:focus-visible {
12279
12522
  outline: 2px solid var(--color-focus);
12280
- outline-offset: 2px;
12523
+ outline-offset: var(--size-focus-ring-inset-offset);
12281
12524
  }
12282
12525
 
12283
12526
  .crewlet-search-trigger__icon {
@@ -12459,7 +12702,7 @@ svg.crewlet-datetime__chevron {
12459
12702
  }
12460
12703
 
12461
12704
 
12462
- /* SegmentedControl-X3BI3XU4.css */
12705
+ /* SegmentedControl-76HODRBT.css */
12463
12706
  /*
12464
12707
  * SegmentedControl: the pill row, drawn with the Tabs classes.
12465
12708
  *
@@ -12509,6 +12752,13 @@ svg.crewlet-datetime__chevron {
12509
12752
  font-size: var(--font-size-compact);
12510
12753
  }
12511
12754
 
12755
+ /* One ring, over the card's own boundary rather than 2px off it, which is two
12756
+ edges with a gap between them: the rule every field keeps (see Input.css).
12757
+ The chosen card still says so under the ring, in its tint and its ink. */
12758
+ .crewlet-segmented--cards .crewlet-segmented__option:focus-visible {
12759
+ outline-offset: var(--size-focus-ring-inset-offset);
12760
+ }
12761
+
12512
12762
  /* The one card that is chosen takes the accent, which is what "here, this
12513
12763
  one" means everywhere else in the product. */
12514
12764
  .crewlet-segmented--cards .crewlet-segmented__option.is-active {
@@ -12517,6 +12767,91 @@ svg.crewlet-datetime__chevron {
12517
12767
  color: var(--color-brand-accent-ink);
12518
12768
  }
12519
12769
 
12770
+ /*
12771
+ * A ROW OF SEPARATE CHIPS, for a setting with more choices than a well holds
12772
+ * on one line: the console's own row of unit types. It wraps rather than
12773
+ * running off the panel it sits in, and each chip stands on the raised ground
12774
+ * a chip with no edge of its own takes (held off the card by the palette
12775
+ * suite), so no chip draws a frame inside the panel's. Two classes, for the
12776
+ * reason the card row gives above.
12777
+ */
12778
+ .crewlet-tabs.crewlet-segmented--chips {
12779
+ /* The chip's own drawing (below) is the --crewlet-segmented-chip-height
12780
+ band inside a target-floor box, so it is the same height at every
12781
+ density the console's 11px chip is drawn at. */
12782
+ --crewlet-segmented-chip-height: calc(var(--size-target-min) - var(--spacing-1));
12783
+ display: flex;
12784
+ flex-wrap: wrap;
12785
+ align-items: center;
12786
+ /* No gap between ROWS: each chip's target already overhangs its drawing by
12787
+ half a step above and below, so two rows' drawings stand a whole step
12788
+ apart while their targets meet. */
12789
+ gap: 0 var(--spacing-1);
12790
+ }
12791
+
12792
+ /*
12793
+ * SMALL, AS THE CONSOLE'S ARE, AND DRAWN SMALL BUT HIT FULL SIZE, the rule the
12794
+ * org chart's own controls keep. A chip is a word in the 11px face with a step
12795
+ * of room either side, drawn as a band shorter than the pointer-target floor;
12796
+ * the button around it stays at the floor, so the band can be the console's
12797
+ * size without being a target a finger misses. At the small control step a
12798
+ * row of ten was a second row of buttons under the field's label rather than a
12799
+ * row of answers to it.
12800
+ *
12801
+ * The band is the button's own ::before, behind the label, rather than its
12802
+ * background clipped to the content box: a clip takes the corner's curve in by
12803
+ * the padding it removes, and a chip this small would lose its radius.
12804
+ */
12805
+ .crewlet-segmented--chips .crewlet-segmented__option {
12806
+ position: relative;
12807
+ isolation: isolate;
12808
+ min-height: var(--size-target-min);
12809
+ padding: 0 var(--spacing-2);
12810
+ border-radius: var(--radius-sm);
12811
+ background: none;
12812
+ color: var(--color-text-secondary);
12813
+ font-size: var(--font-size-2xs);
12814
+ }
12815
+
12816
+ .crewlet-segmented--chips .crewlet-segmented__option::before {
12817
+ content: '';
12818
+ position: absolute;
12819
+ inset: calc((var(--size-target-min) - var(--crewlet-segmented-chip-height)) / 2) 0;
12820
+ z-index: -1;
12821
+ border-radius: var(--radius-sm);
12822
+ background: var(--color-surface-elevated);
12823
+ pointer-events: none;
12824
+ }
12825
+
12826
+ /* The chosen chip is FILLED with the accent: on a row of up to ten raised
12827
+ chips, a fill is the one thing that says "this one" at a glance, as the
12828
+ console's row says it. Its ring stands off it, because an edge drawn on an
12829
+ accent fill in the focus colour is nearly the fill's own colour. */
12830
+ .crewlet-segmented--chips .crewlet-segmented__option.is-active {
12831
+ color: var(--color-text-on-accent);
12832
+ }
12833
+
12834
+ .crewlet-segmented--chips .crewlet-segmented__option.is-active::before {
12835
+ background: var(--color-brand-accent);
12836
+ }
12837
+
12838
+ /* What completes the last choice sits in the row, at the chips' own height
12839
+ and in their face: a field at its own control step stood taller than every
12840
+ chip beside it. */
12841
+ .crewlet-segmented__trailing {
12842
+ display: inline-flex;
12843
+ align-items: center;
12844
+ min-width: 0;
12845
+ }
12846
+
12847
+ .crewlet-segmented--chips .crewlet-segmented__trailing .crewlet-input {
12848
+ min-height: var(--crewlet-segmented-chip-height);
12849
+ }
12850
+
12851
+ .crewlet-segmented--chips .crewlet-segmented__trailing .crewlet-input__control {
12852
+ font-size: var(--font-size-2xs);
12853
+ }
12854
+
12520
12855
  .crewlet-segmented__description {
12521
12856
  font-size: var(--font-size-xs);
12522
12857
  font-weight: var(--font-weight-regular);
@@ -12642,7 +12977,7 @@ svg.crewlet-datetime__chevron {
12642
12977
  }
12643
12978
 
12644
12979
 
12645
- /* Select-E24U5LBC.css */
12980
+ /* Select-4ANVLHUY.css */
12646
12981
  /*
12647
12982
  * Select: one chrome over two controls, and the product's only dropdown.
12648
12983
  *
@@ -12713,8 +13048,8 @@ svg.crewlet-datetime__chevron {
12713
13048
  * leave the other bare.
12714
13049
  */
12715
13050
  .crewlet-select:focus-within {
12716
- outline: 2px solid var(--color-focus);
12717
- outline-offset: var(--size-focus-ring-inset-offset);
13051
+ outline: 1px solid var(--color-focus);
13052
+ outline-offset: -1px;
12718
13053
  }
12719
13054
 
12720
13055
  /*
@@ -12992,8 +13327,8 @@ svg.crewlet-select__chevron {
12992
13327
  * outset ring on the input would be cut by the menu's own `overflow: hidden`.
12993
13328
  */
12994
13329
  .crewlet-select__search:focus-within {
12995
- outline: 2px solid var(--color-focus);
12996
- outline-offset: var(--size-focus-ring-inset-offset);
13330
+ outline: 1px solid var(--color-focus);
13331
+ outline-offset: -1px;
12997
13332
  }
12998
13333
 
12999
13334
  .crewlet-select__search {
@@ -14537,7 +14872,7 @@ svg.crewlet-select__chevron {
14537
14872
  }
14538
14873
 
14539
14874
 
14540
- /* Switch-U4OWK4CL.css */
14875
+ /* Switch-66RAQCRE.css */
14541
14876
  /*
14542
14877
  * Switch: a setting that takes effect as it moves.
14543
14878
  *
@@ -14651,14 +14986,17 @@ svg.crewlet-select__chevron {
14651
14986
  * control's own :focus-visible. The track is the same box: the control is
14652
14987
  * `inset: 0` over it.
14653
14988
  *
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.
14989
+ * OUTSIDE THE TRACK, like a Checkbox's and unlike a text field's: a 20px pill
14990
+ * has no room to draw a ring inside itself. But AGAINST it, not 2px off it.
14991
+ * Off, the track draws a real boundary of its own, and a ring standing off
14992
+ * that boundary was two edges with a gap between them, which reads as a
14993
+ * second outline rather than as focus. Flush, the ring and the track are one
14994
+ * edge in both states, and the ring is still drawn whole on the ground around
14995
+ * the pill, where it is measured.
14658
14996
  */
14659
14997
  .crewlet-switch__track:has(.crewlet-switch__control:focus-visible) {
14660
14998
  outline: 2px solid var(--color-focus);
14661
- outline-offset: 2px;
14999
+ outline-offset: 0;
14662
15000
  }
14663
15001
 
14664
15002
  .crewlet-switch__text {
@@ -14881,7 +15219,7 @@ svg.crewlet-select__chevron {
14881
15219
  }
14882
15220
 
14883
15221
 
14884
- /* Tabs-XCNPHA7B.css */
15222
+ /* Tabs-BWFQSWY3.css */
14885
15223
  /*
14886
15224
  * The pill register: Tabs and SegmentedControl.
14887
15225
  *
@@ -15172,6 +15510,18 @@ svg.crewlet-select__chevron {
15172
15510
  outline-offset: 2px;
15173
15511
  }
15174
15512
 
15513
+ /*
15514
+ * A CHIP RINGS ON ITS OWN EDGE, flush rather than 2px off it. The chip that
15515
+ * is on draws a hairline round itself, and a ring standing off that hairline
15516
+ * was two edges with a gap between them, which reads as a second outline
15517
+ * rather than as focus. Flush, the ring covers the hairline, and it stays
15518
+ * inside the well's 2px inset: two pixels wide, it meets the well's own
15519
+ * boundary rather than leaving a sliver of the well between the two.
15520
+ */
15521
+ .crewlet-tabs--pill .crewlet-tabs__tab:focus-visible {
15522
+ outline-offset: 0;
15523
+ }
15524
+
15175
15525
  .crewlet-tabs__tab.is-disabled,
15176
15526
  .crewlet-tabs__tab:disabled {
15177
15527
  opacity: 0.55;
@@ -15211,7 +15561,7 @@ svg.crewlet-select__chevron {
15211
15561
  }
15212
15562
 
15213
15563
 
15214
- /* Tag-4OXGO2DU.css */
15564
+ /* Tag-4BRQS6GN.css */
15215
15565
  /*
15216
15566
  * The tag: a small pill naming a state, a category or a value.
15217
15567
  *
@@ -15478,11 +15828,38 @@ svg.crewlet-select__chevron {
15478
15828
  box-shadow: inset 0 0 0 1px var(--crewlet-tag-ink);
15479
15829
  }
15480
15830
 
15831
+ /*
15832
+ * ONE RING, ON THE PILL'S OWN EDGE, never off it. A pill draws a border
15833
+ * whenever it is neutral, pointed at or pressed, and a ring standing off that
15834
+ * border is two edges with a gap between them, which reads as a second
15835
+ * outline rather than as focus. So every control here rings over the pill's
15836
+ * border, and the offset that puts it there is each control's own, because
15837
+ * the three boxes meet that border in different places:
15838
+ *
15839
+ * - a whole actionable tag IS the pill, so -1px covers the border and one
15840
+ * pixel outside it;
15841
+ * - the press half of a split pill stops at the border's inside edge, so 0
15842
+ * puts its ring on the same two pixels;
15843
+ * - the remove reaches over the border at the top and the bottom (see its
15844
+ * rule below), so -1px puts its ring there as well.
15845
+ *
15846
+ * ONE PIXEL INTO THE PILL AT MOST, not a field's two, because a pressed tag
15847
+ * says so in an ink line just inside its border: a ring two pixels deep would
15848
+ * cover the one change that pressing it makes.
15849
+ */
15481
15850
  .crewlet-tag--actionable:focus-visible,
15482
15851
  .crewlet-tag__press:focus-visible,
15483
15852
  .crewlet-tag__remove:focus-visible {
15484
15853
  outline: 2px solid var(--color-focus);
15485
- outline-offset: 2px;
15854
+ }
15855
+
15856
+ .crewlet-tag--actionable:focus-visible,
15857
+ .crewlet-tag__remove:focus-visible {
15858
+ outline-offset: -1px;
15859
+ }
15860
+
15861
+ .crewlet-tag__press:focus-visible {
15862
+ outline-offset: 0;
15486
15863
  }
15487
15864
 
15488
15865
  /* ── the pill that holds two controls ──────────────────────────────────── */
@@ -15618,7 +15995,7 @@ svg.crewlet-select__chevron {
15618
15995
  }
15619
15996
 
15620
15997
 
15621
- /* TagGroup-APC2EFH4.css */
15998
+ /* TagGroup-BCQZD7ZD.css */
15622
15999
  /*
15623
16000
  * A labelled list of tags with the tail behind a count.
15624
16001
  *
@@ -15684,9 +16061,12 @@ svg.crewlet-select__chevron {
15684
16061
  color: var(--color-text-primary);
15685
16062
  }
15686
16063
 
16064
+ /* One ring, over the dashed boundary rather than 2px off it, which is two
16065
+ edges with a gap between them: the rule every field keeps (see Input.css).
16066
+ The list above has no edge of its own, so its ring stays outset. */
15687
16067
  .crewlet-tag-group__more:focus-visible {
15688
16068
  outline: 2px solid var(--color-focus);
15689
- outline-offset: 2px;
16069
+ outline-offset: var(--size-focus-ring-inset-offset);
15690
16070
  }
15691
16071
 
15692
16072
  @media (prefers-reduced-motion: reduce) {
@@ -15696,7 +16076,7 @@ svg.crewlet-select__chevron {
15696
16076
  }
15697
16077
 
15698
16078
 
15699
- /* TagsInput-W4P36PRJ.css */
16079
+ /* TagsInput-P2HS5QL4.css */
15700
16080
  /*
15701
16081
  * TagsInput: several values in one field.
15702
16082
  *
@@ -15771,8 +16151,8 @@ svg.crewlet-select__chevron {
15771
16151
  * the whole reason they sit above the field instead of inside it.
15772
16152
  */
15773
16153
  .crewlet-tags-input__box:focus-visible {
15774
- outline: 2px solid var(--color-focus);
15775
- outline-offset: var(--size-focus-ring-inset-offset);
16154
+ outline: 1px solid var(--color-focus);
16155
+ outline-offset: -1px;
15776
16156
  }
15777
16157
 
15778
16158
  .crewlet-tags-input.is-disabled {
@@ -16024,7 +16404,7 @@ svg.crewlet-select__chevron {
16024
16404
  }
16025
16405
 
16026
16406
 
16027
- /* TimeWindowPicker-7I7KWCMU.css */
16407
+ /* TimeWindowPicker-GBF4JDFI.css */
16028
16408
  /*
16029
16409
  * TimeWindowPicker: one trigger over one panel.
16030
16410
  *
@@ -16064,11 +16444,17 @@ svg.crewlet-select__chevron {
16064
16444
  border-color: var(--color-border-hover);
16065
16445
  }
16066
16446
 
16447
+ /*
16448
+ * ONE RING, OVER THE BOUNDARY, for focus and for open alike. It stood 2px off
16449
+ * the box with the border recoloured to the focus colour as well, which is an
16450
+ * accent hairline, a gap and an accent band: two rings from one state. On the
16451
+ * inset offset the ring covers the border, and the border keeps its own colour
16452
+ * under it, the rule every field keeps (see Input.css).
16453
+ */
16067
16454
  .crewlet-time-window:focus-visible,
16068
16455
  .crewlet-time-window.is-open {
16069
- outline: 2px solid var(--color-focus);
16070
- outline-offset: 2px;
16071
- border-color: var(--color-focus);
16456
+ outline: 1px solid var(--color-focus);
16457
+ outline-offset: -1px;
16072
16458
  }
16073
16459
 
16074
16460
  .crewlet-time-window.is-disabled,
@@ -16328,11 +16714,18 @@ svg.crewlet-time-window__tick {
16328
16714
  transition: border-color var(--motion-duration-fast) var(--motion-easing-default);
16329
16715
  }
16330
16716
 
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);
16717
+ /*
16718
+ * THE BOX RINGS ONCE, AS A FIELD DOES. It drew the field register's old
16719
+ * indicator: the border recoloured to the focus colour AND --shadow-focus,
16720
+ * which is itself a ring (a background-coloured gap, then a band), so a
16721
+ * focused box showed two accent edges with a gap between them, and the
16722
+ * transparent outline under them was a third that forced-colors mode paints.
16723
+ * What is left is the field's one outline on the inset offset, over the box's
16724
+ * own boundary (see Input.css), keyed on the box's own input.
16725
+ */
16726
+ .crewlet-time-window__masked:has(.crewlet-time-window__masked-input:focus-visible) {
16727
+ outline: 1px solid var(--color-focus);
16728
+ outline-offset: -1px;
16336
16729
  }
16337
16730
 
16338
16731
  .crewlet-time-window__masked-input {
@@ -17013,7 +17406,7 @@ svg.crewlet-time-window__tick {
17013
17406
  }
17014
17407
 
17015
17408
 
17016
- /* TreeCanvas-HVOV4SQN.css */
17409
+ /* TreeCanvas-L2XYONWL.css */
17017
17410
  /*
17018
17411
  * A hierarchy drawn as cards on a canvas (TreeCanvas.tsx).
17019
17412
  *
@@ -17119,32 +17512,21 @@ svg.crewlet-time-window__tick {
17119
17512
  }
17120
17513
 
17121
17514
  /*
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.
17515
+ * ONE BOUNDARY, AND NO HALO. A toned card used to carry a second hairline ring
17516
+ * 3px outside its boundary, at the lightest of the hue's alphas, so a toned
17517
+ * card was framed twice: two parallel lines round one node read as a double
17518
+ * border, which is the one thing no box in this package draws. The fill and
17519
+ * the boundary in the hue already say the card is toned from across a chart.
17520
+ *
17521
+ * The six hues, each as the steps a toned card draws: the fill it sits on, the
17522
+ * boundary around it, the ink its name is written in and the accent its mark
17523
+ * takes. The ink and the accent are published as variables rather than applied
17524
+ * here because WHICH text is the name and which drawing the mark is are the
17525
+ * caller's to say.
17143
17526
  */
17144
17527
  .crewlet-tree-canvas__card[data-tone='purple'] {
17145
17528
  --crewlet-tree-canvas-card-fill: var(--color-node-purple-fill);
17146
17529
  --crewlet-tree-canvas-card-line: var(--color-node-purple-line);
17147
- --crewlet-tree-canvas-card-halo: var(--color-node-purple-halo);
17148
17530
  --crewlet-tree-canvas-card-ink: var(--color-node-purple-ink);
17149
17531
  --crewlet-tree-canvas-card-accent: var(--color-node-purple);
17150
17532
  }
@@ -17152,7 +17534,6 @@ svg.crewlet-time-window__tick {
17152
17534
  .crewlet-tree-canvas__card[data-tone='cyan'] {
17153
17535
  --crewlet-tree-canvas-card-fill: var(--color-node-cyan-fill);
17154
17536
  --crewlet-tree-canvas-card-line: var(--color-node-cyan-line);
17155
- --crewlet-tree-canvas-card-halo: var(--color-node-cyan-halo);
17156
17537
  --crewlet-tree-canvas-card-ink: var(--color-node-cyan-ink);
17157
17538
  --crewlet-tree-canvas-card-accent: var(--color-node-cyan);
17158
17539
  }
@@ -17160,7 +17541,6 @@ svg.crewlet-time-window__tick {
17160
17541
  .crewlet-tree-canvas__card[data-tone='green'] {
17161
17542
  --crewlet-tree-canvas-card-fill: var(--color-node-green-fill);
17162
17543
  --crewlet-tree-canvas-card-line: var(--color-node-green-line);
17163
- --crewlet-tree-canvas-card-halo: var(--color-node-green-halo);
17164
17544
  --crewlet-tree-canvas-card-ink: var(--color-node-green-ink);
17165
17545
  --crewlet-tree-canvas-card-accent: var(--color-node-green);
17166
17546
  }
@@ -17168,7 +17548,6 @@ svg.crewlet-time-window__tick {
17168
17548
  .crewlet-tree-canvas__card[data-tone='amber'] {
17169
17549
  --crewlet-tree-canvas-card-fill: var(--color-node-amber-fill);
17170
17550
  --crewlet-tree-canvas-card-line: var(--color-node-amber-line);
17171
- --crewlet-tree-canvas-card-halo: var(--color-node-amber-halo);
17172
17551
  --crewlet-tree-canvas-card-ink: var(--color-node-amber-ink);
17173
17552
  --crewlet-tree-canvas-card-accent: var(--color-node-amber);
17174
17553
  }
@@ -17176,7 +17555,6 @@ svg.crewlet-time-window__tick {
17176
17555
  .crewlet-tree-canvas__card[data-tone='rose'] {
17177
17556
  --crewlet-tree-canvas-card-fill: var(--color-node-rose-fill);
17178
17557
  --crewlet-tree-canvas-card-line: var(--color-node-rose-line);
17179
- --crewlet-tree-canvas-card-halo: var(--color-node-rose-halo);
17180
17558
  --crewlet-tree-canvas-card-ink: var(--color-node-rose-ink);
17181
17559
  --crewlet-tree-canvas-card-accent: var(--color-node-rose);
17182
17560
  }
@@ -17184,7 +17562,6 @@ svg.crewlet-time-window__tick {
17184
17562
  .crewlet-tree-canvas__card[data-tone='blue'] {
17185
17563
  --crewlet-tree-canvas-card-fill: var(--color-node-blue-fill);
17186
17564
  --crewlet-tree-canvas-card-line: var(--color-node-blue-line);
17187
- --crewlet-tree-canvas-card-halo: var(--color-node-blue-halo);
17188
17565
  --crewlet-tree-canvas-card-ink: var(--color-node-blue-ink);
17189
17566
  --crewlet-tree-canvas-card-accent: var(--color-node-blue);
17190
17567
  }
@@ -17220,18 +17597,43 @@ svg.crewlet-time-window__tick {
17220
17597
  * canvas clips, so an outset ring is cut away on the cards nearest the frame.
17221
17598
  * This component hands out the tab stop, so the indicator is its to draw; left
17222
17599
  * 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 {
17600
+ *
17601
+ * A CARD'S OWN NODE RINGS THE WHOLE CARD. Where the treeitem is the card's
17602
+ * direct child, the card's edge IS the node's edge, and a ring drawn on the
17603
+ * treeitem did two things wrong: it stopped short of anything the card holds
17604
+ * under the node (a unit's lead), and it stood beside the card's boundary as a
17605
+ * second line. So the ring is drawn on the card, over its boundary, and the
17606
+ * treeitem draws none in any state, the way a field's control leaves its ring
17607
+ * to the field. A row deeper inside a card (`*` between the two, because a row
17608
+ * is always inside something the caller drew) has no boundary of its own, and
17609
+ * keeps its ring.
17610
+ */
17611
+ .crewlet-tree-canvas__card * [role='treeitem']:focus-visible,
17612
+ .crewlet-tree-canvas__card:has(> [role='treeitem']:focus-visible) {
17225
17613
  outline: 2px solid var(--color-focus);
17226
17614
  outline-offset: var(--size-focus-ring-inset-offset);
17227
17615
  }
17228
17616
 
17617
+ .crewlet-tree-canvas__card > [role='treeitem'] {
17618
+ outline: none;
17619
+ }
17620
+
17229
17621
  /* The selection is where the reader is, so it takes the accent. Inset, for the
17230
17622
  same reason the ring is. */
17231
17623
  .crewlet-tree-canvas__card [role='treeitem'][aria-selected='true'] {
17232
17624
  box-shadow: inset 0 0 0 1px var(--color-brand-accent);
17233
17625
  }
17234
17626
 
17627
+ /* On a card's own node the selection IS the card's boundary, in the accent: an
17628
+ inset ring beside the boundary drew two lines where one says it. */
17629
+ .crewlet-tree-canvas__card:has(> [role='treeitem'][aria-selected='true']) {
17630
+ border-color: var(--color-brand-accent);
17631
+ }
17632
+
17633
+ .crewlet-tree-canvas__card > [role='treeitem'][aria-selected='true'] {
17634
+ box-shadow: none;
17635
+ }
17636
+
17235
17637
  /*
17236
17638
  * THE POINTER'S CONTROLS, drawn over the end of the card and quiet until it is
17237
17639
  * reached.
@@ -17376,8 +17778,8 @@ svg.crewlet-time-window__tick {
17376
17778
  * The space around the whole chart, as a token, for the reason the gaps are
17377
17779
  * one. None by default: a chart of panels is read inside its own frame, and
17378
17780
  * 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.
17781
+ * chart's own margin below, which is what keeps the control hanging under the
17782
+ * outermost node off the canvas's clip.
17381
17783
  */
17382
17784
  .crewlet-tree-canvas__margin {
17383
17785
  width: var(--spacing-0);
@@ -17651,8 +18053,8 @@ svg.crewlet-time-window__tick {
17651
18053
  * drawn distance is the same number either way, and the room simply moved
17652
18054
  * from the card's box into the gap with the control that needs it.
17653
18055
  * - 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.
18056
+ * rather than below: the canvas CLIPS, and what hangs under the outermost
18057
+ * node has to clear the frame.
17656
18058
  */
17657
18059
  .crewlet-tree-canvas--node .crewlet-tree-canvas__gap {
17658
18060
  width: var(--spacing-9);
@@ -17996,6 +18398,27 @@ svg.crewlet-time-window__tick {
17996
18398
  border-radius: 0;
17997
18399
  }
17998
18400
 
18401
+ /*
18402
+ * AND THEY ANSWER THE POINTER WITH THEIR INK, NOT A GROUND, as the console
18403
+ * chart's do: the edit mark turns to the accent and the trash to the critical
18404
+ * hue, and nothing is painted under either. A cell is a whole share of the
18405
+ * node's corner, so a ground painted over it was a square standing past the
18406
+ * card's rounded corner, the one place on a node with no room for a square.
18407
+ */
18408
+ .crewlet-tree-canvas--node
18409
+ .crewlet-tree-canvas__actions
18410
+ .crewlet-icon-btn:hover:not(:disabled):not([aria-disabled='true']) {
18411
+ background: none;
18412
+ border-color: transparent;
18413
+ color: var(--color-brand-accent-ink);
18414
+ }
18415
+
18416
+ .crewlet-tree-canvas--node
18417
+ .crewlet-tree-canvas__actions
18418
+ .crewlet-icon-btn--ghost-danger:hover:not(:disabled):not([aria-disabled='true']) {
18419
+ color: var(--color-feedback-danger-ink);
18420
+ }
18421
+
17999
18422
  /*
18000
18423
  * A CONTROL ON AN EDGE IS A DISC: a ground of its own, so the line it sits on,
18001
18424
  * or the card it straddles, stops at its edge rather than running through it.
@@ -18097,38 +18520,29 @@ svg.crewlet-time-window__tick {
18097
18520
  background-image: linear-gradient(var(--color-surface-subtle), var(--color-surface-subtle));
18098
18521
  border: 1px dashed var(--color-brand-accent-soft-strong);
18099
18522
  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;
18523
+ /*
18524
+ * THE BOUNDARY BREATHES, which is what says the card is waiting for the
18525
+ * reader from the far end of a chart, where a dashed hairline is a few
18526
+ * pixels. It used to be a second ring 3px outside the boundary that
18527
+ * breathed instead, two lines round one card where every box in this
18528
+ * package draws one, so the dashed boundary itself moves between the soft
18529
+ * accent and the full one.
18530
+ */
18117
18531
  animation:
18118
- crewlet-tree-canvas-ghost-glow var(--motion-duration-slow) var(--motion-easing-default)
18119
- var(--motion-duration-moderate) both,
18532
+ crewlet-tree-canvas-ghost-card var(--motion-duration-slow) var(--motion-easing-emphasized)
18533
+ var(--motion-duration-base) both,
18120
18534
  /* A BREATH RATHER THAN A TRANSITION, so it is a multiple of the scale's
18121
18535
  longest step (1.8s) rather than a number off it: the scale tops out at
18122
18536
  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. */
18537
+ chart's own is 2s. It starts where the card's arrival ends. */
18124
18538
  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;
18539
+ var(--motion-easing-in-out) calc(var(--motion-duration-base) + var(--motion-duration-slow))
18540
+ infinite;
18127
18541
  }
18128
18542
 
18129
18543
  /*
18130
18544
  * 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
18545
+ * the card, then what is inside it, which is the order a reader
18132
18546
  * follows from the node they pressed to the thing they have to fill in. The
18133
18547
  * caller's own element, whatever it drew, because the ghost's contents are
18134
18548
  * entirely the caller's.
@@ -18172,24 +18586,14 @@ svg.crewlet-time-window__tick {
18172
18586
  }
18173
18587
  }
18174
18588
 
18175
- @keyframes crewlet-tree-canvas-ghost-glow {
18176
- from {
18177
- opacity: 0;
18178
- }
18179
-
18180
- to {
18181
- opacity: 1;
18182
- }
18183
- }
18184
-
18185
18589
  @keyframes crewlet-tree-canvas-ghost-pulse {
18186
18590
  0%,
18187
18591
  100% {
18188
- opacity: 0.5;
18592
+ border-color: var(--color-brand-accent-soft-strong);
18189
18593
  }
18190
18594
 
18191
18595
  50% {
18192
- opacity: 1;
18596
+ border-color: var(--color-brand-accent);
18193
18597
  }
18194
18598
  }
18195
18599
 
@@ -18209,8 +18613,8 @@ svg.crewlet-time-window__tick {
18209
18613
  * A READER WHO ASKED FOR LESS gets the ghost DRAWN, in place, at once. Nothing
18210
18614
  * about the add is behind the motion: the chart still makes room, the branch
18211
18615
  * 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.
18616
+ * form. Only the arrival, the breath and the rise are dropped, and the
18617
+ * boundary rests at the soft step it breathes from.
18214
18618
  */
18215
18619
  @media (prefers-reduced-motion: reduce) {
18216
18620
  /* NOT `transform` on the card itself: its transform is where the layout
@@ -18230,11 +18634,6 @@ svg.crewlet-time-window__tick {
18230
18634
  transform: none;
18231
18635
  animation: none;
18232
18636
  }
18233
-
18234
- .crewlet-tree-canvas__card--composing::after {
18235
- opacity: 1;
18236
- animation: none;
18237
- }
18238
18637
  }
18239
18638
 
18240
18639