@crewlethq/ui 0.6.3 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (130) hide show
  1. package/README.md +109 -0
  2. package/dist/AddPill/index.js +1 -1
  3. package/dist/{AddPill-IJQYCY6C.css → AddPill-V4TQXJ53.css} +23 -22
  4. package/dist/AppShell/index.js +2 -2
  5. package/dist/{AppShell-XARELGIH.css → AppShell-CEVLW4QG.css} +3 -1
  6. package/dist/Button/index.js +1 -1
  7. package/dist/{Button-EXU36DEH.css → Button-UWKBTKYD.css} +18 -0
  8. package/dist/Canvas/Canvas.d.ts +16 -1
  9. package/dist/Canvas/index.d.ts +1 -1
  10. package/dist/Canvas/index.js +3 -3
  11. package/dist/{Canvas-Q6JETCWR.css → Canvas-YVXHMWLN.css} +13 -0
  12. package/dist/Card/index.js +1 -1
  13. package/dist/{Card-GLP7SUV6.css → Card-KJOYHDTJ.css} +5 -1
  14. package/dist/Charts/BarList.d.ts +23 -0
  15. package/dist/Charts/index.d.ts +1 -1
  16. package/dist/Charts/index.js +1 -1
  17. package/dist/{Charts-B3YEF7R4.css → Charts-THPA5BWV.css} +40 -0
  18. package/dist/Checkbox/index.js +1 -1
  19. package/dist/{Checkbox-BOXQ747I.css → Checkbox-UE7TEPAM.css} +9 -1
  20. package/dist/CodeBlock/index.js +4 -4
  21. package/dist/Combobox/index.js +3 -3
  22. package/dist/CommandPalette/index.js +6 -6
  23. package/dist/Copyable/index.js +3 -3
  24. package/dist/DataTable/index.js +6 -6
  25. package/dist/{DataTable-OLHPF7D4.css → DataTable-WZK3V62B.css} +11 -0
  26. package/dist/DataView/index.js +11 -11
  27. package/dist/DateTimePicker/index.js +4 -4
  28. package/dist/{DateTimePicker-22VNXRWC.css → DateTimePicker-4AZBTODT.css} +11 -6
  29. package/dist/ErrorBoundary/index.js +2 -2
  30. package/dist/FilterChip/index.js +1 -1
  31. package/dist/{FilterChip-GTGLLOXE.css → FilterChip-EZ4QMW4E.css} +4 -1
  32. package/dist/IconButton/index.js +1 -1
  33. package/dist/{IconButton-TVEUWK6L.css → IconButton-VYWP6SGW.css} +15 -0
  34. package/dist/ImageUpload/index.js +1 -1
  35. package/dist/{ImageUpload-YCHJMUGX.css → ImageUpload-L2GE4JUM.css} +5 -1
  36. package/dist/Input/index.js +2 -2
  37. package/dist/{Input-2PU5CPKK.css → Input-DRFNI26F.css} +40 -10
  38. package/dist/Kbd/index.js +1 -1
  39. package/dist/{Kbd-JPLDVJIP.css → Kbd-MCWJTRTT.css} +11 -0
  40. package/dist/ListInput/index.js +4 -4
  41. package/dist/Menu/index.js +3 -3
  42. package/dist/Modal/index.js +3 -3
  43. package/dist/NewItemsNotice/index.js +1 -1
  44. package/dist/{NewItemsNotice-T4DSSPVV.css → NewItemsNotice-Q5ED73BQ.css} +3 -1
  45. package/dist/OrgLabel/OrgLabel.d.ts +12 -3
  46. package/dist/OrgLabel/index.js +1 -1
  47. package/dist/{OrgLabel-CR233G34.css → OrgLabel-6WSKJQOT.css} +38 -0
  48. package/dist/OrgNode/OrgNode.d.ts +7 -4
  49. package/dist/OrgNode/index.js +2 -2
  50. package/dist/{OrgNode-BT7T2Q2X.css → OrgNode-TCHJH5FO.css} +89 -45
  51. package/dist/OrgTable/index.js +5 -5
  52. package/dist/{OrgTable-VWMFC3TB.css → OrgTable-JZSYTUIK.css} +28 -4
  53. package/dist/Popover/index.js +1 -1
  54. package/dist/{Popover-WJGCF3ZQ.css → Popover-QCINR7WG.css} +5 -2
  55. package/dist/PricingCard/index.js +2 -2
  56. package/dist/{PricingCard-7EFXRSD2.css → PricingCard-HTAHG4ST.css} +5 -1
  57. package/dist/SearchTrigger/index.js +1 -1
  58. package/dist/{SearchTrigger-Z5D4AAY7.css → SearchTrigger-KIZLWBEH.css} +4 -1
  59. package/dist/SegmentedControl/SegmentedControl.d.ts +19 -1
  60. package/dist/SegmentedControl/index.d.ts +1 -1
  61. package/dist/SegmentedControl/index.js +2 -2
  62. package/dist/SegmentedControl-76HODRBT.css +160 -0
  63. package/dist/Select/index.js +1 -1
  64. package/dist/{Select-E24U5LBC.css → Select-4ANVLHUY.css} +4 -4
  65. package/dist/Switch/index.js +1 -1
  66. package/dist/{Switch-U4OWK4CL.css → Switch-66RAQCRE.css} +8 -5
  67. package/dist/Tabs/index.js +1 -1
  68. package/dist/{Tabs-XCNPHA7B.css → Tabs-BWFQSWY3.css} +12 -0
  69. package/dist/Tag/index.js +1 -1
  70. package/dist/{Tag-4OXGO2DU.css → Tag-4BRQS6GN.css} +28 -1
  71. package/dist/TagGroup/index.js +1 -1
  72. package/dist/{TagGroup-APC2EFH4.css → TagGroup-BCQZD7ZD.css} +4 -1
  73. package/dist/TagsInput/index.js +3 -3
  74. package/dist/{TagsInput-W4P36PRJ.css → TagsInput-P2HS5QL4.css} +2 -2
  75. package/dist/ThemeSwitcher/index.js +3 -3
  76. package/dist/ThemeToggle/index.js +2 -2
  77. package/dist/TimeWindowPicker/index.js +6 -6
  78. package/dist/{TimeWindowPicker-7I7KWCMU.css → TimeWindowPicker-GBF4JDFI.css} +21 -8
  79. package/dist/Tree/layout.d.ts +3 -3
  80. package/dist/TreeCanvas/TreeCanvas.d.ts +7 -5
  81. package/dist/TreeCanvas/index.js +4 -4
  82. package/dist/{TreeCanvas-HVOV4SQN.css → TreeCanvas-L2XYONWL.css} +80 -74
  83. package/dist/TreeGrid/index.js +2 -2
  84. package/dist/{chunk-SVNXOK25.js → chunk-26SCUACK.js} +2 -2
  85. package/dist/{chunk-4UQ7SMPK.js → chunk-4FQT6ZAY.js} +1 -1
  86. package/dist/{chunk-IBYO2IJN.js → chunk-5I56UXBJ.js} +4 -4
  87. package/dist/{chunk-ZFATEERP.js → chunk-5YLON2PW.js} +1 -1
  88. package/dist/{chunk-EFYPAJT3.js → chunk-6DRDCT22.js} +1 -1
  89. package/dist/{chunk-PQNILU27.js → chunk-6HXH57BL.js} +3 -3
  90. package/dist/{chunk-BNCCEER3.js → chunk-6SIG5I72.js} +22 -11
  91. package/dist/{chunk-RJM4QCGG.js → chunk-6VL4LGWC.js} +36 -13
  92. package/dist/{chunk-OM5E3TTK.js → chunk-74WGARJE.js} +5 -2
  93. package/dist/{chunk-EV6IMYJ6.js → chunk-A722MUNR.js} +1 -1
  94. package/dist/{chunk-WOFOMTGB.js → chunk-B47YUQGM.js} +6 -2
  95. package/dist/{chunk-MV2E3QZM.js → chunk-BTHX2FS3.js} +2 -2
  96. package/dist/{chunk-2QLOH454.js → chunk-BXPLX7YU.js} +3 -3
  97. package/dist/{chunk-V34H2YCY.js → chunk-CEOXFO3E.js} +1 -1
  98. package/dist/{chunk-KKLITCMF.js → chunk-CHG7VT2M.js} +8 -8
  99. package/dist/{chunk-QY7UU5ZB.js → chunk-DRHXRGB6.js} +1 -1
  100. package/dist/{chunk-V2XMNLMS.js → chunk-E6UWRXNM.js} +1 -1
  101. package/dist/{chunk-NQ2HQ6P5.js → chunk-HVPC2GHY.js} +6 -6
  102. package/dist/{chunk-FFKYL7Z3.js → chunk-L7THQMFB.js} +4 -2
  103. package/dist/{chunk-PAWGBSHU.js → chunk-LOECRMHA.js} +1 -1
  104. package/dist/{chunk-LSJZUA5V.js → chunk-LSB3EHBW.js} +2 -2
  105. package/dist/{chunk-ERHSECG2.js → chunk-MORLKUGM.js} +1 -1
  106. package/dist/{chunk-UWQWTGQH.js → chunk-MPXI6FM6.js} +3 -3
  107. package/dist/{chunk-DHPUMOTX.js → chunk-N5KCGFWI.js} +8 -4
  108. package/dist/{chunk-ZAO4HHXI.js → chunk-OG6CL3EB.js} +1 -1
  109. package/dist/{chunk-C5WJUZVR.js → chunk-ORNOOMVY.js} +1 -1
  110. package/dist/{chunk-WUVZDFHS.js → chunk-OVLJEVQS.js} +2 -2
  111. package/dist/{chunk-AUS5FNQE.js → chunk-PDUZO35I.js} +1 -1
  112. package/dist/{chunk-YLYOWZ4V.js → chunk-PXU6HOZB.js} +1 -1
  113. package/dist/{chunk-AGQ3YLA5.js → chunk-QJZ3Y6WW.js} +6 -6
  114. package/dist/{chunk-S7KW47IQ.js → chunk-RHHGLTXJ.js} +1 -1
  115. package/dist/{chunk-SJQ546ID.js → chunk-SEFMO2EV.js} +1 -1
  116. package/dist/{chunk-KJ34ZBBI.js → chunk-SMBKXWML.js} +1 -1
  117. package/dist/{chunk-FIFNP6PL.js → chunk-SX2DFTQV.js} +1 -1
  118. package/dist/{chunk-L6XZOCP4.js → chunk-UCYIRDND.js} +2 -2
  119. package/dist/{chunk-D6EVJUGU.js → chunk-UYK72NOS.js} +1 -1
  120. package/dist/{chunk-TIWAHZZ6.js → chunk-VCOELPCT.js} +2 -2
  121. package/dist/{chunk-2HY7I3NT.js → chunk-VE6LD3KM.js} +5 -3
  122. package/dist/{chunk-CAIHUYXV.js → chunk-W4GQWFRX.js} +1 -1
  123. package/dist/{chunk-BWIPKSWA.js → chunk-XX2VQE55.js} +1 -1
  124. package/dist/{chunk-UA7O3KKJ.js → chunk-YCTMKKRA.js} +1 -1
  125. package/dist/{chunk-DSUY5F4E.js → chunk-ZGX2DP7F.js} +2 -2
  126. package/dist/generated/index.js +44 -44
  127. package/dist/index.js +44 -44
  128. package/dist/styles.css +662 -223
  129. package/package.json +3 -3
  130. package/dist/SegmentedControl-X3BI3XU4.css +0 -68
@@ -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. */
@@ -1,4 +1,4 @@
1
- export { PricingCard } from '../chunk-L6XZOCP4.js';
2
- import '../chunk-PAWGBSHU.js';
1
+ export { PricingCard } from '../chunk-UCYIRDND.js';
2
+ import '../chunk-LOECRMHA.js';
3
3
  import '../chunk-WIATRXEJ.js';
4
4
  import '../chunk-ODEQTPFM.js';
@@ -64,9 +64,13 @@
64
64
  border-color: var(--color-brand-accent-soft-strong);
65
65
  }
66
66
 
67
+ /* One ring, over the card's own boundary rather than 2px off it, which is two
68
+ edges with a gap between them: the rule every field keeps (see Input.css).
69
+ The chosen plan keeps an accent line inside the ring, since the selection
70
+ ring below is two pixels deep and the focus ring covers one of them. */
67
71
  .crewlet-pricing-card:focus-visible {
68
72
  outline: 2px solid var(--color-focus);
69
- outline-offset: 2px;
73
+ outline-offset: var(--size-focus-ring-inset-offset);
70
74
  }
71
75
 
72
76
  /* The chosen plan takes the selection ring, which is the same inset rule
@@ -1,2 +1,2 @@
1
- export { SearchTrigger } from '../chunk-EFYPAJT3.js';
1
+ export { SearchTrigger } from '../chunk-6DRDCT22.js';
2
2
  import '../chunk-ODEQTPFM.js';
@@ -58,9 +58,12 @@
58
58
  color: var(--color-text-primary);
59
59
  }
60
60
 
61
+ /* One ring, over the trigger's own boundary rather than 2px off it, which is
62
+ two edges with a gap between them: the rule every field keeps (see
63
+ Input.css). */
61
64
  .crewlet-search-trigger:focus-visible {
62
65
  outline: 2px solid var(--color-focus);
63
- outline-offset: 2px;
66
+ outline-offset: var(--size-focus-ring-inset-offset);
64
67
  }
65
68
 
66
69
  .crewlet-search-trigger__icon {
@@ -1,5 +1,7 @@
1
1
  import { type ReactNode } from 'react';
2
2
  export type SegmentedSize = 'sm' | 'md';
3
+ /** How the options are drawn: see [SegmentedControlProps.layout]. */
4
+ export type SegmentedLayout = 'pill' | 'chips';
3
5
  export interface SegmentedOption<T extends string = string> {
4
6
  value: T;
5
7
  /** What is drawn. An empty label makes the option icon-only. */
@@ -27,6 +29,22 @@ interface SegmentedShared<T extends string> {
27
29
  value: T;
28
30
  onValueChange: (value: T) => void;
29
31
  size?: SegmentedSize | undefined;
32
+ /**
33
+ * How the options are drawn. `pill`, the default, is a row of chips in one
34
+ * tinted well, for a lens, a setting or a compact switch. `chips` is a row of
35
+ * SEPARATE chips that wraps, for a setting with more choices than a well
36
+ * holds on one line (a unit's type): each chip a raised ground of its own,
37
+ * the chosen one filled with the accent. A row whose options carry a
38
+ * description is drawn as cards whatever this says.
39
+ */
40
+ layout?: SegmentedLayout | undefined;
41
+ /**
42
+ * Drawn at the end of the row, after the last option and outside the
43
+ * choices themselves: the field that completes the last choice, such as the
44
+ * box a "Custom" chip asks for. It takes no part in the arrow keys, so a
45
+ * caret moves inside it as it does in any field.
46
+ */
47
+ trailing?: ReactNode | undefined;
30
48
  className?: string | undefined;
31
49
  }
32
50
  /**
@@ -97,5 +115,5 @@ export type SegmentedControlProps<T extends string = string> = SegmentedShared<T
97
115
  * look like two different controls depending on which component a screen
98
116
  * reached for.
99
117
  */
100
- export declare function SegmentedControl<T extends string = string>({ label, options, value, onValueChange, size, className, semantics, panelId, activate, activateHint, }: SegmentedControlProps<T>): import("react").JSX.Element;
118
+ export declare function SegmentedControl<T extends string = string>({ label, options, value, onValueChange, size, layout, trailing, className, semantics, panelId, activate, activateHint, }: SegmentedControlProps<T>): import("react").JSX.Element;
101
119
  export {};
@@ -1,4 +1,4 @@
1
1
  import '../Tabs/Tabs.css';
2
2
  import './SegmentedControl.css';
3
3
  export { SegmentedControl } from './SegmentedControl.js';
4
- export type { SegmentedActivation, SegmentedControlProps, SegmentedOption, SegmentedSize, } from './SegmentedControl.js';
4
+ export type { SegmentedActivation, SegmentedControlProps, SegmentedLayout, SegmentedOption, SegmentedSize, } from './SegmentedControl.js';
@@ -1,5 +1,5 @@
1
- export { SegmentedControl } from '../chunk-DHPUMOTX.js';
2
- import '../chunk-QY7UU5ZB.js';
1
+ export { SegmentedControl } from '../chunk-N5KCGFWI.js';
2
+ import '../chunk-DRHXRGB6.js';
3
3
  import '../chunk-BHHIIK3M.js';
4
4
  import '../chunk-BZFWDIV6.js';
5
5
  import '../chunk-ODEQTPFM.js';
@@ -0,0 +1,160 @@
1
+ /*
2
+ * SegmentedControl: the pill row, drawn with the Tabs classes.
3
+ *
4
+ * Only what is its own lives here. The chrome, the sizes and the active chip
5
+ * come from Tabs.css, so a lens row and a setting row look the same whichever
6
+ * component a screen reached for.
7
+ */
8
+
9
+ .crewlet-segmented__text {
10
+ display: inline-flex;
11
+ flex-direction: column;
12
+ align-items: flex-start;
13
+ gap: 1px;
14
+ min-width: 0;
15
+ }
16
+
17
+ /*
18
+ * A choice a reader has to READ before making it is a card row, not a chip:
19
+ * a template with a sentence under its name does not fit in a pill, and
20
+ * squeezing it there is how the sentence ends up truncated to nothing.
21
+ */
22
+ /*
23
+ * TWO CLASSES, so this wins whatever order the stylesheets are bundled in.
24
+ * `.crewlet-tabs` sets the row's own display and alignment, and a rule of
25
+ * equal weight in a file that happens to come later takes them back.
26
+ */
27
+ .crewlet-tabs.crewlet-segmented--cards {
28
+ display: grid;
29
+ gap: var(--spacing-2);
30
+ width: 100%;
31
+ align-items: stretch;
32
+ }
33
+
34
+ /*
35
+ * The same frame a framed Checkbox draws, because it is the same row: a
36
+ * boundary on the body it sits in, and no surface of its own. A choice with a
37
+ * surface inside a panel of the same surface reads as a second panel.
38
+ */
39
+ .crewlet-segmented--cards .crewlet-segmented__option {
40
+ justify-content: flex-start;
41
+ text-align: left;
42
+ /* A sentence under a name is a sentence: it wraps rather than being cut. */
43
+ white-space: normal;
44
+ padding: var(--spacing-3);
45
+ border: 1px solid var(--color-border-default);
46
+ border-radius: var(--radius-lg);
47
+ font-size: var(--font-size-compact);
48
+ }
49
+
50
+ /* One ring, over the card's own boundary rather than 2px off it, which is two
51
+ edges with a gap between them: the rule every field keeps (see Input.css).
52
+ The chosen card still says so under the ring, in its tint and its ink. */
53
+ .crewlet-segmented--cards .crewlet-segmented__option:focus-visible {
54
+ outline-offset: var(--size-focus-ring-inset-offset);
55
+ }
56
+
57
+ /* The one card that is chosen takes the accent, which is what "here, this
58
+ one" means everywhere else in the product. */
59
+ .crewlet-segmented--cards .crewlet-segmented__option.is-active {
60
+ border-color: var(--color-brand-accent);
61
+ background: var(--color-brand-accent-soft);
62
+ color: var(--color-brand-accent-ink);
63
+ }
64
+
65
+ /*
66
+ * A ROW OF SEPARATE CHIPS, for a setting with more choices than a well holds
67
+ * on one line: the console's own row of unit types. It wraps rather than
68
+ * running off the panel it sits in, and each chip stands on the raised ground
69
+ * a chip with no edge of its own takes (held off the card by the palette
70
+ * suite), so no chip draws a frame inside the panel's. Two classes, for the
71
+ * reason the card row gives above.
72
+ */
73
+ .crewlet-tabs.crewlet-segmented--chips {
74
+ /* The chip's own drawing (below) is the --crewlet-segmented-chip-height
75
+ band inside a target-floor box, so it is the same height at every
76
+ density the console's 11px chip is drawn at. */
77
+ --crewlet-segmented-chip-height: calc(var(--size-target-min) - var(--spacing-1));
78
+ display: flex;
79
+ flex-wrap: wrap;
80
+ align-items: center;
81
+ /* No gap between ROWS: each chip's target already overhangs its drawing by
82
+ half a step above and below, so two rows' drawings stand a whole step
83
+ apart while their targets meet. */
84
+ gap: 0 var(--spacing-1);
85
+ }
86
+
87
+ /*
88
+ * SMALL, AS THE CONSOLE'S ARE, AND DRAWN SMALL BUT HIT FULL SIZE, the rule the
89
+ * org chart's own controls keep. A chip is a word in the 11px face with a step
90
+ * of room either side, drawn as a band shorter than the pointer-target floor;
91
+ * the button around it stays at the floor, so the band can be the console's
92
+ * size without being a target a finger misses. At the small control step a
93
+ * row of ten was a second row of buttons under the field's label rather than a
94
+ * row of answers to it.
95
+ *
96
+ * The band is the button's own ::before, behind the label, rather than its
97
+ * background clipped to the content box: a clip takes the corner's curve in by
98
+ * the padding it removes, and a chip this small would lose its radius.
99
+ */
100
+ .crewlet-segmented--chips .crewlet-segmented__option {
101
+ position: relative;
102
+ isolation: isolate;
103
+ min-height: var(--size-target-min);
104
+ padding: 0 var(--spacing-2);
105
+ border-radius: var(--radius-sm);
106
+ background: none;
107
+ color: var(--color-text-secondary);
108
+ font-size: var(--font-size-2xs);
109
+ }
110
+
111
+ .crewlet-segmented--chips .crewlet-segmented__option::before {
112
+ content: '';
113
+ position: absolute;
114
+ inset: calc((var(--size-target-min) - var(--crewlet-segmented-chip-height)) / 2) 0;
115
+ z-index: -1;
116
+ border-radius: var(--radius-sm);
117
+ background: var(--color-surface-elevated);
118
+ pointer-events: none;
119
+ }
120
+
121
+ /* The chosen chip is FILLED with the accent: on a row of up to ten raised
122
+ chips, a fill is the one thing that says "this one" at a glance, as the
123
+ console's row says it. Its ring stands off it, because an edge drawn on an
124
+ accent fill in the focus colour is nearly the fill's own colour. */
125
+ .crewlet-segmented--chips .crewlet-segmented__option.is-active {
126
+ color: var(--color-text-on-accent);
127
+ }
128
+
129
+ .crewlet-segmented--chips .crewlet-segmented__option.is-active::before {
130
+ background: var(--color-brand-accent);
131
+ }
132
+
133
+ /* What completes the last choice sits in the row, at the chips' own height
134
+ and in their face: a field at its own control step stood taller than every
135
+ chip beside it. */
136
+ .crewlet-segmented__trailing {
137
+ display: inline-flex;
138
+ align-items: center;
139
+ min-width: 0;
140
+ }
141
+
142
+ .crewlet-segmented--chips .crewlet-segmented__trailing .crewlet-input {
143
+ min-height: var(--crewlet-segmented-chip-height);
144
+ }
145
+
146
+ .crewlet-segmented--chips .crewlet-segmented__trailing .crewlet-input__control {
147
+ font-size: var(--font-size-2xs);
148
+ }
149
+
150
+ .crewlet-segmented__description {
151
+ font-size: var(--font-size-xs);
152
+ font-weight: var(--font-weight-regular);
153
+ line-height: var(--font-line-height-normal);
154
+ color: var(--color-text-tertiary);
155
+ white-space: normal;
156
+ }
157
+
158
+ .crewlet-segmented--cards .crewlet-segmented__option.is-active .crewlet-segmented__description {
159
+ color: var(--color-brand-accent-ink);
160
+ }
@@ -1,4 +1,4 @@
1
- export { Select } from '../chunk-SJQ546ID.js';
1
+ export { Select } from '../chunk-SEFMO2EV.js';
2
2
  import '../chunk-6MU7HNB4.js';
3
3
  import '../chunk-7RPGY3JE.js';
4
4
  import '../chunk-R25RGPUB.js';
@@ -68,8 +68,8 @@
68
68
  * leave the other bare.
69
69
  */
70
70
  .crewlet-select:focus-within {
71
- outline: 2px solid var(--color-focus);
72
- outline-offset: var(--size-focus-ring-inset-offset);
71
+ outline: 1px solid var(--color-focus);
72
+ outline-offset: -1px;
73
73
  }
74
74
 
75
75
  /*
@@ -347,8 +347,8 @@ svg.crewlet-select__chevron {
347
347
  * outset ring on the input would be cut by the menu's own `overflow: hidden`.
348
348
  */
349
349
  .crewlet-select__search:focus-within {
350
- outline: 2px solid var(--color-focus);
351
- outline-offset: var(--size-focus-ring-inset-offset);
350
+ outline: 1px solid var(--color-focus);
351
+ outline-offset: -1px;
352
352
  }
353
353
 
354
354
  .crewlet-select__search {
@@ -1,2 +1,2 @@
1
- export { Switch } from '../chunk-EV6IMYJ6.js';
1
+ export { Switch } from '../chunk-A722MUNR.js';
2
2
  import '../chunk-ODEQTPFM.js';
@@ -111,14 +111,17 @@
111
111
  * control's own :focus-visible. The track is the same box: the control is
112
112
  * `inset: 0` over it.
113
113
  *
114
- * OUTSET, like a Checkbox's and unlike a text field's. A 20px pill has no
115
- * room to draw a ring inside itself, and there is no boundary to cover out
116
- * there either: the track's own border goes the accent colour of its fill
117
- * when the switch is on, so the ring is the only edge in that space.
114
+ * OUTSIDE THE TRACK, like a Checkbox's and unlike a text field's: a 20px pill
115
+ * has no room to draw a ring inside itself. But AGAINST it, not 2px off it.
116
+ * Off, the track draws a real boundary of its own, and a ring standing off
117
+ * that boundary was two edges with a gap between them, which reads as a
118
+ * second outline rather than as focus. Flush, the ring and the track are one
119
+ * edge in both states, and the ring is still drawn whole on the ground around
120
+ * the pill, where it is measured.
118
121
  */
119
122
  .crewlet-switch__track:has(.crewlet-switch__control:focus-visible) {
120
123
  outline: 2px solid var(--color-focus);
121
- outline-offset: 2px;
124
+ outline-offset: 0;
122
125
  }
123
126
 
124
127
  .crewlet-switch__text {
@@ -1,4 +1,4 @@
1
- export { TabPanel, Tabs, tabId } from '../chunk-QY7UU5ZB.js';
1
+ export { TabPanel, Tabs, tabId } from '../chunk-DRHXRGB6.js';
2
2
  import '../chunk-BHHIIK3M.js';
3
3
  import '../chunk-BZFWDIV6.js';
4
4
  import '../chunk-ODEQTPFM.js';
@@ -288,6 +288,18 @@
288
288
  outline-offset: 2px;
289
289
  }
290
290
 
291
+ /*
292
+ * A CHIP RINGS ON ITS OWN EDGE, flush rather than 2px off it. The chip that
293
+ * is on draws a hairline round itself, and a ring standing off that hairline
294
+ * was two edges with a gap between them, which reads as a second outline
295
+ * rather than as focus. Flush, the ring covers the hairline, and it stays
296
+ * inside the well's 2px inset: two pixels wide, it meets the well's own
297
+ * boundary rather than leaving a sliver of the well between the two.
298
+ */
299
+ .crewlet-tabs--pill .crewlet-tabs__tab:focus-visible {
300
+ outline-offset: 0;
301
+ }
302
+
291
303
  .crewlet-tabs__tab.is-disabled,
292
304
  .crewlet-tabs__tab:disabled {
293
305
  opacity: 0.55;
package/dist/Tag/index.js CHANGED
@@ -1,3 +1,3 @@
1
- export { Tag } from '../chunk-PAWGBSHU.js';
1
+ export { Tag } from '../chunk-LOECRMHA.js';
2
2
  import '../chunk-WIATRXEJ.js';
3
3
  import '../chunk-ODEQTPFM.js';