@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
@@ -34,6 +34,21 @@
34
34
  outline-offset: 2px;
35
35
  }
36
36
 
37
+ /*
38
+ * ONE RING, OVER THE BOUNDARY, on every square that draws one: the secondary
39
+ * and the soft-brand at rest, and the ghost-brand, which grows one under the
40
+ * pointer. A ring standing 2px off a visible border is two edges with a gap
41
+ * between them, which reads as a second outline rather than as focus; on the
42
+ * inset offset it covers the border instead, the rule every field keeps (see
43
+ * Input.css). The other ghosts never draw an edge, so they keep the outset
44
+ * ring.
45
+ */
46
+ .crewlet-icon-btn--secondary:focus-visible,
47
+ .crewlet-icon-btn--soft-brand:focus-visible,
48
+ .crewlet-icon-btn--ghost-brand:focus-visible {
49
+ outline-offset: var(--size-focus-ring-inset-offset);
50
+ }
51
+
37
52
  .crewlet-icon-btn:disabled,
38
53
  .crewlet-icon-btn[aria-disabled='true'] {
39
54
  opacity: 0.5;
@@ -1,3 +1,3 @@
1
- export { ImageUpload } from '../chunk-CAIHUYXV.js';
1
+ export { ImageUpload } from '../chunk-W4GQWFRX.js';
2
2
  import '../chunk-IA232OTU.js';
3
3
  import '../chunk-ODEQTPFM.js';
@@ -181,9 +181,13 @@
181
181
  cursor: default;
182
182
  }
183
183
 
184
+ /* One ring, drawn OVER the badge's knockout ring rather than 2px outside it:
185
+ over the image the knockout is an edge of its own, and a ring standing off
186
+ it was two rings round one small disc. On the inset offset the focus ring
187
+ takes the knockout's place, which still parts the disc from the image. */
184
188
  .crewlet-image-upload__remove:focus-visible {
185
189
  outline: 2px solid var(--color-focus);
186
- outline-offset: 2px;
190
+ outline-offset: var(--size-focus-ring-inset-offset);
187
191
  }
188
192
 
189
193
  .crewlet-image-upload__input {
@@ -1,5 +1,5 @@
1
- export { FormField, FormRow, FormSection, Input, InputAffix, Label, ReadOnlyField, Textarea } from '../chunk-DSUY5F4E.js';
1
+ export { FormField, FormRow, FormSection, Input, InputAffix, Label, ReadOnlyField, Textarea } from '../chunk-ZGX2DP7F.js';
2
2
  import '../chunk-PQADV6P6.js';
3
- import '../chunk-4UQ7SMPK.js';
3
+ import '../chunk-4FQT6ZAY.js';
4
4
  import '../chunk-BZFWDIV6.js';
5
5
  import '../chunk-ODEQTPFM.js';
@@ -74,11 +74,14 @@
74
74
  * forced-colors mode drops every box-shadow and keeps outlines: a ring drawn
75
75
  * as a shadow disappears for exactly the readers who most need one.
76
76
  *
77
- * It is drawn INSIDE the box, on the offset every focusable in a clipping
78
- * scroller takes, so it covers the boundary rather than standing outside it.
79
- * Two things follow: a scroller cannot clip it, and the field does not grow a
80
- * four-pixel halo the moment a caret lands in it, which is what a filter box
81
- * in a toolbar of them did to the row it sits in.
77
+ * It is ONE PIXEL, LAID EXACTLY ON THE BOUNDARY: the field's own hairline,
78
+ * drawn in the focus colour, which is how the console's fields say focus. At
79
+ * two pixels it was a heavy band round every box a caret landed in, and on a
80
+ * form of them the field being typed in read as the loudest thing on the page.
81
+ * Drawn on the boundary rather than outside it, a scroller cannot clip it and
82
+ * the field does not grow a halo the moment a caret lands in it, which is what
83
+ * a filter box in a toolbar of them did to the row it sits in. Every boxed
84
+ * field in the package rings this way (`Input.test.tsx` holds them to it).
82
85
  *
83
86
  * THE BORDER IS LEFT ALONE. Recolouring it under the ring says nothing the
84
87
  * ring has not already said, and it is what cost the error state its own
@@ -94,8 +97,8 @@
94
97
  * on a pointer press as well as on a tab.
95
98
  */
96
99
  .crewlet-input:has(.crewlet-input__control:focus-visible) {
97
- outline: 2px solid var(--color-focus);
98
- outline-offset: var(--size-focus-ring-inset-offset);
100
+ outline: 1px solid var(--color-focus);
101
+ outline-offset: -1px;
99
102
  }
100
103
 
101
104
  .crewlet-input.is-error {
@@ -354,8 +357,8 @@
354
357
  on the control itself: a textarea is the field, with nothing wrapped round
355
358
  it and nothing focusable inside it. */
356
359
  .crewlet-textarea:focus-visible {
357
- outline: 2px solid var(--color-focus);
358
- outline-offset: var(--size-focus-ring-inset-offset);
360
+ outline: 1px solid var(--color-focus);
361
+ outline-offset: -1px;
359
362
  }
360
363
 
361
364
  .crewlet-textarea.is-error {
@@ -371,10 +374,37 @@
371
374
  cursor: not-allowed;
372
375
  }
373
376
 
377
+ /*
378
+ * ONE LINE THAT GROWS STARTS AT THE SINGLE-LINE FIELD'S HEIGHT. A box that
379
+ * grows to fit what is typed was drawn at the large control step while it held
380
+ * one line, so the box a list item is written in stood sixteen pixels taller
381
+ * than the fields above and below it. One line now stands at the medium step,
382
+ * the height of every single-line field, with the line centred in it as an
383
+ * input's is: the block padding is what that step leaves once the two border
384
+ * pixels and one line are paid for. Each line past the first grows it from
385
+ * there.
386
+ */
374
387
  .crewlet-textarea.is-auto-resize {
375
388
  resize: none;
376
389
  overflow: hidden;
377
- min-height: var(--size-control-lg);
390
+ min-height: var(--size-control-md);
391
+ padding-block: max(
392
+ 0px,
393
+ calc((var(--size-control-md) - 2px - var(--font-line-height-normal) * var(--font-size-compact)) / 2)
394
+ );
395
+ }
396
+
397
+ /*
398
+ * AND WHAT TRAILS IT SITS ON ITS FIRST LINE, centred in the band one line
399
+ * takes, which is exactly where an input's trailing hint sits. Pinned a spacing
400
+ * step from the top, it sat above the line's middle and level with nothing;
401
+ * on the first line it stays put as the box grows under it.
402
+ */
403
+ .crewlet-textarea-shell:has(> .crewlet-textarea.is-auto-resize) > .crewlet-input__trailing {
404
+ top: 0;
405
+ display: flex;
406
+ align-items: center;
407
+ height: var(--size-control-md);
378
408
  }
379
409
 
380
410
  .crewlet-textarea::placeholder {
package/dist/Kbd/index.js CHANGED
@@ -1,3 +1,3 @@
1
- export { Kbd, isApplePlatform, keyGlyph } from '../chunk-KJ34ZBBI.js';
1
+ export { Kbd, isApplePlatform, keyGlyph } from '../chunk-SMBKXWML.js';
2
2
  import '../chunk-BZFWDIV6.js';
3
3
  import '../chunk-ODEQTPFM.js';
@@ -42,9 +42,20 @@
42
42
  * platform prints a chord. It is a `kbd` of its own because that is what a key
43
43
  * inside a key combination is, and a user agent's `kbd` rule would otherwise
44
44
  * set its own face and size on it.
45
+ *
46
+ * AND IT TAKES NO BOX FROM ANYBODY ELSE. An application stylesheet that draws
47
+ * a bare `kbd` as a cap of its own (a common enough rule) reached each key in
48
+ * here and framed it, so one chord drew a frame round a run of framed keys.
49
+ * The key states every part of its box, so whatever a page says about `kbd`,
50
+ * a chord is one cap.
45
51
  */
46
52
  .crewlet-kbd__key {
47
53
  font: inherit;
54
+ color: inherit;
55
+ padding: 0;
56
+ background: none;
57
+ border: 0;
58
+ border-radius: 0;
48
59
  }
49
60
 
50
61
  /*
@@ -1,10 +1,10 @@
1
- export { ListInput } from '../chunk-PQNILU27.js';
2
- import '../chunk-KJ34ZBBI.js';
3
- import '../chunk-DSUY5F4E.js';
1
+ export { ListInput } from '../chunk-6HXH57BL.js';
2
+ import '../chunk-SMBKXWML.js';
3
+ import '../chunk-ZGX2DP7F.js';
4
4
  import '../chunk-PQADV6P6.js';
5
5
  import '../chunk-RSAQOKH3.js';
6
6
  import '../chunk-7RPGY3JE.js';
7
7
  import '../chunk-R25RGPUB.js';
8
- import '../chunk-4UQ7SMPK.js';
8
+ import '../chunk-4FQT6ZAY.js';
9
9
  import '../chunk-BZFWDIV6.js';
10
10
  import '../chunk-ODEQTPFM.js';
@@ -1,7 +1,7 @@
1
- export { Menu } from '../chunk-LSJZUA5V.js';
1
+ export { Menu } from '../chunk-LSB3EHBW.js';
2
2
  import '../chunk-7RPGY3JE.js';
3
3
  import '../chunk-R25RGPUB.js';
4
- import '../chunk-4UQ7SMPK.js';
5
- import '../chunk-ZAO4HHXI.js';
4
+ import '../chunk-4FQT6ZAY.js';
5
+ import '../chunk-OG6CL3EB.js';
6
6
  import '../chunk-BZFWDIV6.js';
7
7
  import '../chunk-ODEQTPFM.js';
@@ -1,8 +1,8 @@
1
- export { ConfirmModal, Modal } from '../chunk-MV2E3QZM.js';
1
+ export { ConfirmModal, Modal } from '../chunk-BTHX2FS3.js';
2
2
  import '../chunk-PQADV6P6.js';
3
3
  import '../chunk-7RPGY3JE.js';
4
4
  import '../chunk-R25RGPUB.js';
5
- import '../chunk-4UQ7SMPK.js';
6
- import '../chunk-ZAO4HHXI.js';
5
+ import '../chunk-4FQT6ZAY.js';
6
+ import '../chunk-OG6CL3EB.js';
7
7
  import '../chunk-BZFWDIV6.js';
8
8
  import '../chunk-ODEQTPFM.js';
@@ -1,4 +1,4 @@
1
- export { NewItemsNotice } from '../chunk-YLYOWZ4V.js';
1
+ export { NewItemsNotice } from '../chunk-PXU6HOZB.js';
2
2
  import '../chunk-RSAQOKH3.js';
3
3
  import '../chunk-BZFWDIV6.js';
4
4
  import '../chunk-ODEQTPFM.js';
@@ -48,9 +48,11 @@
48
48
  color: var(--color-brand-accent-ink);
49
49
  }
50
50
 
51
+ /* One ring, over the pill's own boundary rather than 2px off it, which is two
52
+ edges with a gap between them: the rule every field keeps (see Input.css). */
51
53
  .crewlet-new-items:focus-visible {
52
54
  outline: 2px solid var(--color-focus);
53
- outline-offset: 2px;
55
+ outline-offset: var(--size-focus-ring-inset-offset);
54
56
  }
55
57
 
56
58
  @media (prefers-reduced-motion: reduce) {
@@ -84,13 +84,21 @@ export type OrgLabelMark = {
84
84
  * so this moves nothing: only what is drawn inside it.
85
85
  */
86
86
  iconSize?: 'md' | 'lg' | undefined;
87
+ /**
88
+ * A DASHED RING ROUND THE GLYPH, which is how the console chart draws a
89
+ * person's seat: a figure inside a boundary, because a person is the
90
+ * one seat the engine does not run. Drawn in a node only; a row draws
91
+ * the glyph alone, as the console table does.
92
+ */
93
+ iconRing?: boolean | undefined;
87
94
  avatar?: undefined;
88
95
  } | {
89
96
  /**
90
97
  * A SEAT'S BADGE, with its kind as its outline: a squircle for an agent,
91
- * a circle for a person, which is the one cue that tells them apart.
92
- * There used to be a second, a dashed ring round a glyph for a human
93
- * seat, and two cues for one fact are two things to keep agreeing.
98
+ * a circle for a person, for a surface that names seats by their
99
+ * initials. A surface drawn as the console chart draws one marks a seat
100
+ * with a glyph instead (the Crewlet figure for an agent, a person inside
101
+ * a dashed ring for a human) and takes the other branch.
94
102
  *
95
103
  * The layout sizes it and nothing here does: the approved org chart's
96
104
  * 26px badge in a node and the smallest step, 20px, in a row.
@@ -101,6 +109,7 @@ export type OrgLabelMark = {
101
109
  avatar?: OrgLabelAvatar | undefined;
102
110
  icon?: undefined;
103
111
  iconSize?: undefined;
112
+ iconRing?: undefined;
104
113
  };
105
114
  /** What both layouts say besides the mark, in the order they say it. */
106
115
  interface OrgLabelWords {
@@ -1,3 +1,3 @@
1
- export { OrgLabel } from '../chunk-WOFOMTGB.js';
1
+ export { OrgLabel } from '../chunk-B47YUQGM.js';
2
2
  import '../chunk-IA232OTU.js';
3
3
  import '../chunk-ODEQTPFM.js';
@@ -86,6 +86,44 @@
86
86
  fill: currentColor;
87
87
  }
88
88
 
89
+ /*
90
+ * A PERSON IS A FIGURE INSIDE A DASHED RING, as the console chart draws one:
91
+ * the boundary says this seat is held by someone outside the system. The ring
92
+ * is the 24px target step and the figure inside it a step smaller than a
93
+ * container's glyph, which leaves the air a boundary needs to read as one: at
94
+ * the zone's own step the figure touched the ring on every side.
95
+ *
96
+ * THE RING IS DECORATION, drawn in the step kept for it, and the figure is the
97
+ * mark: the ring says how the seat is held, never what it is.
98
+ */
99
+ .crewlet-org-label__icon--ring {
100
+ position: relative;
101
+ }
102
+
103
+ .crewlet-org-label__icon--ring::before {
104
+ content: '';
105
+ position: absolute;
106
+ top: 50%;
107
+ left: 50%;
108
+ width: var(--size-target-min);
109
+ height: var(--size-target-min);
110
+ border: 1px dashed var(--color-text-muted);
111
+ border-radius: var(--radius-circle);
112
+ transform: translate(-50%, -50%);
113
+ pointer-events: none;
114
+ }
115
+
116
+ .crewlet-org-label__icon--ring > svg {
117
+ width: var(--font-size-md);
118
+ height: var(--font-size-md);
119
+ }
120
+
121
+ /* A ROW DRAWS THE FIGURE ALONE, as the console table does: a ring on a line
122
+ of text is a second boundary inside the row's own. */
123
+ .crewlet-org-label--row .crewlet-org-label__icon--ring::before {
124
+ content: none;
125
+ }
126
+
89
127
  /* ---- The name and its caption -------------------------------------------- */
90
128
 
91
129
  /*
@@ -73,8 +73,9 @@ export interface OrgNodeDisclosureProps extends HTMLAttributes<HTMLDivElement> {
73
73
  export declare function OrgNodeDisclosure({ children, className, ...rest }: OrgNodeDisclosureProps): import("react").JSX.Element;
74
74
  export interface OrgNodeLeadProps {
75
75
  /**
76
- * Nothing is set, so the pill is drawn as the outline of one: a unit with no
77
- * lead is a fact about the organization and a blank strip says nothing.
76
+ * Nothing is set, so the pill is drawn as an empty slot: no ground, a dashed
77
+ * edge and the word in the quieter ink. A unit with no lead is a fact about
78
+ * the organization and a blank strip says nothing.
78
79
  */
79
80
  empty?: boolean | undefined;
80
81
  /**
@@ -97,7 +98,9 @@ export interface OrgNodeLeadProps {
97
98
  * IT STAYS DRAWN, where the controls that edit the node do not: who leads a
98
99
  * unit is a FACT ABOUT THE ORGANIZATION rather than a tool for changing it,
99
100
  * and a chart that hid it until the pointer arrived would be a chart you could
100
- * not read the leads off. Separated from the name above by a hairline, so the
101
- * node reads as a thing with a lead rather than as two lines of text.
101
+ * not read the leads off. A pill on a ground of its own rather than a line of
102
+ * text, so the node reads as a thing with a lead rather than as two lines of
103
+ * text; never framed while a lead is set, because the node it sits in already
104
+ * is, and dashed while none is, because an empty place is what it then says.
102
105
  */
103
106
  export declare function OrgNodeLead({ empty, clear, children, className }: OrgNodeLeadProps): import("react").JSX.Element;
@@ -1,4 +1,4 @@
1
- export { OrgNodeDisclosure, OrgNodeLabel, OrgNodeLead } from '../chunk-TIWAHZZ6.js';
2
- import '../chunk-WOFOMTGB.js';
1
+ export { OrgNodeDisclosure, OrgNodeLabel, OrgNodeLead } from '../chunk-VCOELPCT.js';
2
+ import '../chunk-B47YUQGM.js';
3
3
  import '../chunk-IA232OTU.js';
4
4
  import '../chunk-ODEQTPFM.js';
@@ -33,6 +33,15 @@
33
33
 
34
34
  /* ---- A unit's lead ------------------------------------------------------ */
35
35
 
36
+ /*
37
+ * NO LINE OF ITS OWN. The console chart rules a hairline over this strip and
38
+ * frames a set lead's pill inside it, 4px in from the node's own edge: inside
39
+ * a card that is already framed, that is a box drawn twice, with a second line
40
+ * running beside the card's edge on three sides and a third across the top.
41
+ * A set lead is a ground instead, and a ground needs no line to divide it from
42
+ * the name above. Only an EMPTY slot keeps an edge, dashed (below), because
43
+ * the dash is what says a place is waiting rather than a frame round a value.
44
+ */
36
45
  .crewlet-org-node-lead {
37
46
  position: relative;
38
47
  display: flex;
@@ -41,28 +50,11 @@
41
50
  padding: 0 var(--spacing-1) var(--spacing-1);
42
51
  }
43
52
 
44
- /*
45
- * THE SEPARATOR IS INSET, like every hairline inside a node of the console
46
- * chart (it draws this one from 4 to `nw - 4`). Edge to edge it cut the card
47
- * in two and the node read as two stacked cells rather than as a card with a
48
- * fact along its bottom edge. Drawn rather than bordered for that reason
49
- * alone: a border cannot be shorter than the box it is on.
50
- */
51
- .crewlet-org-node-lead::before {
52
- content: '';
53
- position: absolute;
54
- top: 0;
55
- right: var(--spacing-1);
56
- left: var(--spacing-1);
57
- height: 1px;
58
- background: var(--color-border-default);
59
- }
60
-
61
53
  /*
62
54
  * A PILL RATHER THAN A LINE OF TEXT, so the lead reads as one value attached
63
- * to this unit rather than as a second caption. The empty state is the same
64
- * pill with a dashed edge and the word alone: a unit with no lead has a place
65
- * for one, which is what invites the reader to set it.
55
+ * to this unit rather than as a second caption. RAISED, on the step a chip
56
+ * with no boundary of its own takes (the palette suite holds it off the card
57
+ * on both themes), so it is found by its ground rather than by a frame.
66
58
  */
67
59
  .crewlet-org-node-lead__pill {
68
60
  display: flex;
@@ -77,32 +69,30 @@
77
69
  font-weight: var(--font-weight-medium);
78
70
  line-height: var(--font-line-height-tight);
79
71
  color: var(--color-text-secondary);
80
- /*
81
- * THE BOUNDARY IS THE HOVER STEP, not the resting hairline, which is what
82
- * the console chart draws around this one pill and nowhere else inside a
83
- * node: every other line in there is the separator step and this is a
84
- * boundary around a value. At the separator's own alpha the pill was a
85
- * rectangle a reader had to look for, on the one fact a unit's node states.
86
- */
87
- border: 1px solid var(--color-border-hover);
72
+ background: var(--color-surface-elevated);
88
73
  border-radius: var(--radius-sm);
89
74
  }
90
75
 
91
76
  /*
92
- * AND AN EMPTY ONE IS THE SAME PILL, DASHED. The console chart separates the
93
- * two by the DASH and by the ink, and its two boundary alphas are 0.15 and
94
- * 0.12, which is one step of this ramp: written as two tokens the difference
95
- * would be invisible beside the dash that already carries it.
77
+ * AND AN EMPTY ONE IS AN EMPTY SLOT: no ground, a dashed edge and the word
78
+ * alone in the quieter ink, as the console chart draws it. A unit with no lead
79
+ * has a place for one, and the dash is what says the place is waiting to be
80
+ * filled, which is what invites the reader to set it. It is the one edge drawn
81
+ * inside a node, and only while the slot is empty: a set lead is a raised
82
+ * ground with no edge at all. The edge is the hover step rather than the
83
+ * resting hairline, because at the hairline's own step the slot was a
84
+ * rectangle a reader had to look for.
96
85
  */
97
86
  .crewlet-org-node-lead__pill--empty {
98
87
  color: var(--color-text-tertiary);
99
- border-style: dashed;
88
+ background: none;
89
+ border: 1px dashed var(--color-border-hover);
100
90
  }
101
91
 
102
92
  /*
103
93
  * A LEAD THAT CAN BE CHANGED IS STILL A LEAD. Where the pill holds a control
104
94
  * rather than a word, the control IS the pill: it fills it, carries the pill's
105
- * own type and ink, and draws no second boundary inside the one already there.
95
+ * own type and ink, and draws no boundary or ground of its own on the pill's.
106
96
  * Left at its own size, a control step inside a half-rank strip is a button
107
97
  * that overflows the node it sits in.
108
98
  *
@@ -129,6 +119,35 @@
129
119
  color: var(--color-text-primary);
130
120
  }
131
121
 
122
+ /*
123
+ * WHATEVER WRAPS THE CONTROL FILLS THE PILL TOO. A menu's trigger arrives
124
+ * inside the menu's own anchor, and the anchor was a shrink-wrapped item of
125
+ * the pill's row: the control was the width of the word "Lead" in a pill as
126
+ * wide as the node, and a press anywhere else in the pill did nothing.
127
+ */
128
+ .crewlet-org-node-lead__pill > :has(> .crewlet-btn) {
129
+ display: flex;
130
+ flex: 1;
131
+ min-width: 0;
132
+ }
133
+
134
+ /*
135
+ * REACHED, THE WHOLE PILL LIGHTS, because the whole pill is the control. The
136
+ * ghost control's own hover and press grounds were a patch the size of the
137
+ * word inside the pill, so it paints neither, and the pill takes the row hover
138
+ * step over its own ground while the control is pointed at or its menu is
139
+ * open. Its ink still goes to full, above.
140
+ */
141
+ .crewlet-org-node-lead__pill
142
+ .crewlet-btn:is(:hover, :active):not(:disabled):not([aria-disabled='true']) {
143
+ background: none;
144
+ }
145
+
146
+ .crewlet-org-node-lead__pill:has(.crewlet-btn:hover:not(:disabled):not([aria-disabled='true'])),
147
+ .crewlet-org-node-lead__pill:has(.crewlet-btn[aria-expanded='true']) {
148
+ background-image: linear-gradient(var(--color-surface-hover), var(--color-surface-hover));
149
+ }
150
+
132
151
  /* The name of the lead, not the chevron beside it, is what truncates. */
133
152
  .crewlet-org-node-lead__pill .crewlet-btn > span {
134
153
  overflow: hidden;
@@ -147,25 +166,42 @@
147
166
  *
148
167
  * DRAWN SMALL, HIT FULL SIZE, the rule the whole node keeps: the strip is half
149
168
  * a rank, so the target is grown past the pill's own edge into the node's
150
- * bottom padding, exactly as the lead's own control is. It takes its room from
151
- * the pill rather than overlaying the name, so the lead truncates beside it
152
- * instead of running under it: the console chart shifts its text 5px left for
153
- * the same reason, which a row of flex items does on its own.
169
+ * bottom padding, exactly as the lead's own control is.
170
+ *
171
+ * AND IT DOES NOT MOVE THE NAME. Taking its room from the row, it pushed the
172
+ * name half its own width off the pill's middle, so "Lead: Ada" sat left of
173
+ * centre on every unit that had one. It is drawn over the pill's right end
174
+ * instead, out of the row, and the lead's control keeps the same room at both
175
+ * of its ends while it is there: the name is centred on the whole pill and
176
+ * truncates before it reaches the clear, and the control is still the whole
177
+ * pill to press.
154
178
  */
155
179
  .crewlet-org-node-lead__clear {
156
- position: relative;
180
+ position: absolute;
181
+ top: 50%;
182
+ right: 0;
183
+ z-index: 1;
157
184
  display: inline-flex;
158
- flex: none;
159
185
  align-items: center;
160
186
  justify-content: center;
187
+ transform: translateY(-50%);
188
+ }
189
+
190
+ .crewlet-org-node-lead__pill:has(> .crewlet-org-node-lead__clear) {
191
+ position: relative;
192
+ }
193
+
194
+ .crewlet-org-node-lead__pill:has(> .crewlet-org-node-lead__clear)
195
+ .crewlet-btn:not(.crewlet-org-node-lead__clear *) {
196
+ padding-inline: var(--spacing-4);
161
197
  }
162
198
 
163
199
  /*
164
- * THE GROUND IS A STEP OFF THE CARD'S, rather than that chart's own alpha. Its
165
- * 0.08 of white over a dark card is a disc a reader can see; on this package's
166
- * LIGHT theme the step at that alpha is the card's own value, so the disc
167
- * would disappear on half the deployments. The step past the card is the same
168
- * relationship in both themes, which is what the drawing was after.
200
+ * THE DISC IS ITS RING. Its ground is the raised step the pill itself is
201
+ * drawn on, rather than that chart's own alpha (0.08 of white is the card's
202
+ * own value on this package's light theme, so a disc drawn by its ground
203
+ * would disappear on half the deployments), and so what draws it on the pill
204
+ * is the hairline round it.
169
205
  */
170
206
  .crewlet-org-node-lead__disc {
171
207
  position: absolute;
@@ -203,6 +239,14 @@
203
239
  color: var(--color-text-primary);
204
240
  }
205
241
 
242
+ /* AND NOTHING ELSE FILLS EITHER: a ghost control's own hover and press grounds
243
+ are painted on its whole 24px target, which drew a circle twice the disc's
244
+ size round a 12px mark the moment it was pointed at. */
245
+ .crewlet-org-node-lead__clear
246
+ :is(.crewlet-btn, .crewlet-icon-btn):is(:hover, :active):not(:disabled):not([aria-disabled='true']) {
247
+ background: none;
248
+ }
249
+
206
250
  .crewlet-org-node-lead__clear:hover .crewlet-org-node-lead__disc {
207
251
  border-color: var(--color-border-control);
208
252
  }
@@ -1,12 +1,12 @@
1
- export { OrgTable, OrgTableActions, OrgTableAdd, OrgTableName } from '../chunk-BNCCEER3.js';
2
- import '../chunk-FIFNP6PL.js';
1
+ export { OrgTable, OrgTableActions, OrgTableAdd, OrgTableName } from '../chunk-6SIG5I72.js';
2
+ import '../chunk-SX2DFTQV.js';
3
3
  import '../chunk-S3BCVWTU.js';
4
- import '../chunk-WOFOMTGB.js';
4
+ import '../chunk-B47YUQGM.js';
5
5
  import '../chunk-53DVJCVW.js';
6
- import '../chunk-OM5E3TTK.js';
6
+ import '../chunk-74WGARJE.js';
7
7
  import '../chunk-7RPGY3JE.js';
8
8
  import '../chunk-R25RGPUB.js';
9
- import '../chunk-4UQ7SMPK.js';
9
+ import '../chunk-4FQT6ZAY.js';
10
10
  import '../chunk-IA232OTU.js';
11
11
  import '../chunk-BZFWDIV6.js';
12
12
  import '../chunk-ODEQTPFM.js';
@@ -24,8 +24,11 @@
24
24
  */
25
25
  --crewlet-org-table-indent: var(--spacing-8);
26
26
  /* The wire arriving at a row, and what it fades to at the row's own end.
27
- Rebound per hue below. */
28
- --crewlet-org-table-wire: var(--color-border-control);
27
+ It leaves the trunk in the TRUNK'S own step, as the console table's does,
28
+ so the two read as one line; started brighter than the trunk, every
29
+ branch was a dash floating beside a trunk nobody could see. Rebound per
30
+ hue below. */
31
+ --crewlet-org-table-wire: var(--color-border-strong);
29
32
  --crewlet-org-table-wire-fade: var(--color-border-default);
30
33
  /* What a row's name and its mark are drawn in. Rebound per hue below. */
31
34
  --crewlet-org-table-ink: var(--color-text-primary);
@@ -134,8 +137,15 @@
134
137
  * follows, so the trunk is one line down the whole table rather than one per
135
138
  * level. The cell's padding is taken back and the wire element carries the
136
139
  * level instead.
140
+ *
141
+ * AND THE CELL IS THE ROW'S FULL HEIGHT, because the wire in it is. The grid
142
+ * centres its cells in a row taller than they are, and a trunk drawn down a
143
+ * centred cell stopped short of both edges of every row, so the line its
144
+ * segments were meant to stack into read as one dash per row. The cell still
145
+ * centres what it holds.
137
146
  */
138
147
  .crewlet-org-table [role='gridcell']:first-child {
148
+ align-self: stretch;
139
149
  padding-inline-start: var(--spacing-2);
140
150
  }
141
151
 
@@ -170,12 +180,19 @@
170
180
  * segments stack into one line. Neutral, always: it belongs to the table
171
181
  * rather than to any row, and a trunk that took each row's hue in turn would
172
182
  * be a striped line saying nothing.
183
+ *
184
+ * IN THE STRONG STEP, where the console table draws its trunk a notch above
185
+ * the row's ground. In the plain border step it all but vanished on the
186
+ * table's own ground, and the branches beside it read as loose dashes.
187
+ *
188
+ * It starts one hairline above the cell, over the grid's rule between rows,
189
+ * so the segments meet rather than being cut by that rule.
173
190
  */
174
191
  .crewlet-org-table__wire[data-trunk]::before {
175
- inset-block: 0;
192
+ inset-block: -1px 0;
176
193
  inset-inline-start: 0;
177
194
  width: 2px;
178
- background: var(--color-border-default);
195
+ background: var(--color-border-strong);
179
196
  }
180
197
 
181
198
  /* A root row's trunk starts at the row's middle: nothing hangs above the
@@ -184,6 +201,13 @@
184
201
  inset-block-start: 50%;
185
202
  }
186
203
 
204
+ /* The last row a root shows ends the trunk at its own branch: no row below it
205
+ hangs off the line, and a trunk run on to the next tree or the table's edge
206
+ is a line to nowhere. */
207
+ .crewlet-org-table__wire[data-last][data-trunk]::before {
208
+ inset-block-end: 50%;
209
+ }
210
+
187
211
  /*
188
212
  * THE BRANCH: from the trunk across the gutter to the row's own mark, fading
189
213
  * as it arrives. It reaches one cell gap past the wire's own width, which is
@@ -1,4 +1,4 @@
1
- export { Popover } from '../chunk-AUS5FNQE.js';
1
+ export { Popover } from '../chunk-PDUZO35I.js';
2
2
  import '../chunk-7RPGY3JE.js';
3
3
  import '../chunk-R25RGPUB.js';
4
4
  import '../chunk-ODEQTPFM.js';
@@ -40,10 +40,13 @@
40
40
  transform-origin: bottom left;
41
41
  }
42
42
 
43
- /* A panel that takes focus shows it on the panel, not only on what is inside. */
43
+ /* A panel that takes focus shows it on the panel, not only on what is inside,
44
+ and shows it ONCE: over the panel's own boundary rather than 2px off it,
45
+ which is two edges with a gap between them (the rule every field keeps, see
46
+ Input.css). */
44
47
  .crewlet-popover:focus-visible {
45
48
  outline: 2px solid var(--color-focus);
46
- outline-offset: 2px;
49
+ outline-offset: var(--size-focus-ring-inset-offset);
47
50
  }
48
51
 
49
52
  /* Up from under its anchor, which is where it is about to be. */