@crewlethq/ui 0.37.1 → 0.38.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 (60) hide show
  1. package/README.md +34 -0
  2. package/dist/Accordion/index.js +1 -1
  3. package/dist/AgentHandoffPanel/index.js +4 -4
  4. package/dist/AppShell/index.js +1 -1
  5. package/dist/{AppShell-JBCZSSX3.css → AppShell-NDU4XMGF.css} +39 -6
  6. package/dist/ArtifactCard/index.js +2 -2
  7. package/dist/ArtifactMakeRow/ArtifactMakeRow.d.ts +3 -1
  8. package/dist/ArtifactMakeRow/index.js +1 -1
  9. package/dist/{ArtifactMakeRow-W3RD5YWZ.css → ArtifactMakeRow-6UX2LTF7.css} +43 -5
  10. package/dist/AuthLayout/index.js +2 -2
  11. package/dist/Card/index.js +1 -1
  12. package/dist/{Card-QOVASQNU.css → Card-G2ZGT5Z6.css} +43 -0
  13. package/dist/CommandPalette/index.js +2 -2
  14. package/dist/CommentThread/index.js +3 -3
  15. package/dist/Composer/index.js +2 -2
  16. package/dist/DataView/index.js +2 -2
  17. package/dist/DatasetSource/index.js +2 -2
  18. package/dist/DescriptionList/DescriptionList.d.ts +12 -1
  19. package/dist/DescriptionList/index.js +1 -1
  20. package/dist/{DescriptionList-IXMRCSMK.css → DescriptionList-DEZISDLQ.css} +8 -1
  21. package/dist/Disclosure/index.js +1 -1
  22. package/dist/{Disclosure-VKBJJIZ7.css → Disclosure-P4FH3C35.css} +28 -2
  23. package/dist/ListInput/index.js +2 -2
  24. package/dist/PricingCard/index.js +2 -2
  25. package/dist/SheetColumnEditor/index.js +3 -3
  26. package/dist/SheetGrid/index.js +2 -2
  27. package/dist/StatGroup/StatGroup.d.ts +11 -7
  28. package/dist/StatGroup/index.js +1 -1
  29. package/dist/StatGroup-DOFHX5QJ.css +168 -0
  30. package/dist/TableCells/index.js +2 -2
  31. package/dist/Tag/index.js +1 -1
  32. package/dist/{Tag-SRGTK5KI.css → Tag-2DQOVE6W.css} +15 -5
  33. package/dist/TagsInput/index.js +2 -2
  34. package/dist/{chunk-K4VP6ZKE.js → chunk-4BJK7FE5.js} +1 -1
  35. package/dist/{chunk-3SBM4DGI.js → chunk-BH52LIY6.js} +1 -1
  36. package/dist/{chunk-WX2NIG4G.js → chunk-BJI3RFXG.js} +1 -1
  37. package/dist/{chunk-JXRI5YD2.js → chunk-BT5H2THK.js} +2 -1
  38. package/dist/{chunk-HDHZWIFL.js → chunk-DYB66CNM.js} +16 -2
  39. package/dist/{chunk-HMLAWVG6.js → chunk-IPWU6ERC.js} +1 -1
  40. package/dist/{chunk-DZSBFITC.js → chunk-JZPK4IXR.js} +1 -1
  41. package/dist/{chunk-GFV4LJHH.js → chunk-KYIAFNU7.js} +1 -1
  42. package/dist/{chunk-F2XSYBKH.js → chunk-MFS6F2P7.js} +4 -1
  43. package/dist/{chunk-MICH6QSJ.js → chunk-OGXHZHRX.js} +1 -1
  44. package/dist/{chunk-OHA6WSAG.js → chunk-OTCXRJ7D.js} +1 -1
  45. package/dist/{chunk-MMPKN7WV.js → chunk-PT6WKXKW.js} +1 -1
  46. package/dist/{chunk-NS4NSHVX.js → chunk-R2IBCEU6.js} +12 -2
  47. package/dist/{chunk-DQSXWQMJ.js → chunk-U3ILLCR2.js} +1 -1
  48. package/dist/{chunk-YSG3DW7W.js → chunk-XBURIXHO.js} +2 -2
  49. package/dist/{chunk-5QXRI35B.js → chunk-ZK3VYY7L.js} +1 -1
  50. package/dist/{chunk-RIAZM6L3.js → chunk-ZNOXQACX.js} +1 -1
  51. package/dist/generated/index.js +42 -42
  52. package/dist/index.js +42 -42
  53. package/dist/styles.css +285 -46
  54. package/package.json +3 -3
  55. package/dist/StatGroup-PADTJCUQ.css +0 -86
  56. package/dist/{chunk-DOLATMGF.js → chunk-3ZUINC7C.js} +1 -1
  57. package/dist/{chunk-F3WZ5AKM.js → chunk-4L2BWSHR.js} +1 -1
  58. package/dist/{chunk-ISA2O2BK.js → chunk-ETVEGR2Y.js} +1 -1
  59. package/dist/{chunk-A72JPXIV.js → chunk-PAQXOP2M.js} +1 -1
  60. package/dist/{chunk-MG3HTY6F.js → chunk-YQG4PZGC.js} +1 -1
package/README.md CHANGED
@@ -204,6 +204,40 @@ places:
204
204
  - A surface that pans or zooms dispatches `LAYER_REPOSITION_EVENT` on its host
205
205
  when the content beneath it moves, and every panel anchored inside follows.
206
206
 
207
+ ## Changes in 0.38.0
208
+
209
+ ### Icons
210
+
211
+ **`VendorMark` draws Crewlet's own mark** (`vendor="crewlet"`), for the services built into Crewlet (its tracker, its knowledge base) where a catalogue of integrations lists them beside the third-party apps they stand in for. It is drawn from the brand mark `@crewlethq/icons` already carries (`CrewletIcon`), not a second copy, and takes the same `size` and `muted` as every other vendor. `VENDORS` lists it, so the VendorMark story shows it with the others.
212
+
213
+ **Every vendor mark draws at one weight in its square.** GitLab's press-kit drawing framed its logo in twice its own width, so at 20px it drew 10px beside marks of 20; it is cropped to its logo. Crewlet's mark is framed in the square its own extent fits rather than in the wide brand file's artwork margins, so at 20px it draws 20 by 10 where it drew 17 by 9. The VendorMark story's One weight draws every mark at 20px in a 48px box.
214
+
215
+ ### Layout
216
+
217
+ These come from a layout audit of the engine dashboard at 1440, 1024 and 390 in both themes; each names what was measured.
218
+
219
+ **A stat row folds by its own width** (`StatGroup`). It dropped to two columns under a 1024px window, but a row is as wide as its column leaves it: beside the rail and a settings column at 1024 a four-column row was 489px and cut its figures ("Not s…"), and on a phone three tiles stood two and a lone third at double width. The row is a size container on twelve tracks: four a row fold to two under 640px of row, three stack one a row under 480px, and the hairlines follow. The row carries `data-columns` beside `--crewlet-stat-group-cols`. An application that restated the old `width < 1024px` step for a stat row drops it.
220
+
221
+ **A stat row in a card is flush without being told.** A `StatGroup` that is a `Card`'s content, or a `Card.Body`'s, gives up its own surface, edge and corner, so a card no longer draws a box inside a box (or a third frame inside a padded body). `flush` stays for any other host.
222
+
223
+ **A disclosure's fact gives way before its title** (`Disclosure`, `Accordion`). The fact (`meta`) held its full width and the title shrank to nothing beside a long one: a log row stopped saying which log it was, and its fact ran under the status badge beside it. The fact now shrinks first, at a hundred to the title's one, ends in an ellipsis, and keeps a floor of one glyph. It is still the toggle's name in full.
224
+
225
+ **A narrow card's subtitle takes a line of its own** (`Card.Header`). Under 480px of card the head wraps: the title and the card's controls keep the first line, and the subtitle takes the whole of the next and wraps there rather than ending ("Resets today at midnight, the week…"). Only a card whose head has a subtitle becomes a size container. An application that wrapped a subtitle under the title for itself at narrow widths can drop that rule.
226
+
227
+ **Description lists on one page share a term column** (`DescriptionList`). The term track is `--crewlet-description-list-term`, inherited, so a page sets it once and every list under it starts its values on one line; `termWidth` sets it on one list. The default track, `fit` and the narrow step are unchanged.
228
+
229
+ **The make row lays out the kinds it is given** (`ArtifactMakeRow`). Five kinds stood in six fixed columns with an empty sixth at the end of the line, and three across on a phone left a hole after the fifth. The line takes a column per kind (`--crewlet-make-row-count`, with `data-count`, both set from `items`), and on a narrow tray a short last row is centred and two or four kinds stand two a row.
230
+
231
+ **The rail foot stands on the nav's columns** (`AppShell`). A foot row's transparent boundary spends a pixel of its row pad, as it spent one of its block inset, so its mark and words start where the nav's do rather than a pixel right. In the foot, `AccountRow` takes the nav row's pad and glyph-to-word gap and centres its badge over a glyph's width, so the avatar is centred on the glyph column and the name starts on the word line.
232
+
233
+ **The top bar lines up with the content** (`AppShell`). It stood 16px from each edge over content inset 20px, and the scroller's reserved gutter moved the content's end in further, so with classic scrollbars every page's actions ended 15px past the cards under them. The bar now takes the content's inset on both sides and, at its end, the scroller's gutter, which the shell measures and sets as `--crewlet-app-shell-gutter` on its root (0 with overlay scrollbars).
234
+
235
+ ### Colour
236
+
237
+ **The neutral outline tag is drawn in the neutral pill's edge** (`Tag`). It took the plain hairline, which on a dark card measured 1.07:1, so "Off" beside a filled "Default" read as a loose word. It takes the strong step the neutral soft pill draws (1.49:1 dark, 1.52:1 light on the card) and keeps its tertiary ink and empty ground, so the two neutral pills differ by their fill alone.
238
+
239
+ **Every hairline inside a card is easier to see.** `@crewlethq/tokens` holds the plain hairline to dE 5 on the card and the sheet (it held dE 3), and the default dark hairline moves from 1.07:1 to 1.13:1 on the card. A stat row's dividers, a card head's rule, a tile's footer rule and a code block's edge all draw it. See the tokens README.
240
+
207
241
  ## Changes in 0.37.1
208
242
 
209
243
  ### Sheets
@@ -1,4 +1,4 @@
1
- export { Accordion, AccordionItem } from '../chunk-RIAZM6L3.js';
1
+ export { Accordion, AccordionItem } from '../chunk-ZNOXQACX.js';
2
2
  import '../chunk-FZVJDJFN.js';
3
3
  import '../chunk-BHHIIK3M.js';
4
4
  import '../chunk-PQADV6P6.js';
@@ -1,11 +1,11 @@
1
- export { AGENT_HANDOFF_LABELS, AgentHandoffPanel } from '../chunk-YSG3DW7W.js';
1
+ export { AGENT_HANDOFF_LABELS, AgentHandoffPanel } from '../chunk-XBURIXHO.js';
2
2
  import '../chunk-AUQPBL4O.js';
3
3
  import '../chunk-3TFDQLW3.js';
4
- import '../chunk-MICH6QSJ.js';
5
- import '../chunk-ISA2O2BK.js';
4
+ import '../chunk-OGXHZHRX.js';
5
+ import '../chunk-ETVEGR2Y.js';
6
6
  import '../chunk-Y5BD4MTE.js';
7
- import '../chunk-TYONQSOK.js';
8
7
  import '../chunk-SMBKXWML.js';
8
+ import '../chunk-TYONQSOK.js';
9
9
  import '../chunk-FZVJDJFN.js';
10
10
  import '../chunk-BHHIIK3M.js';
11
11
  import '../chunk-PQADV6P6.js';
@@ -1,4 +1,4 @@
1
- export { AccountRow, AppShell, AppShellRail, AppShellRailRow, AppShellToggle, AppShellTopbar, useAppShell } from '../chunk-HDHZWIFL.js';
1
+ export { AccountRow, AppShell, AppShellRail, AppShellRailRow, AppShellToggle, AppShellTopbar, useAppShell } from '../chunk-DYB66CNM.js';
2
2
  import '../chunk-RTPQDNW3.js';
3
3
  import '../chunk-D6FEHY5G.js';
4
4
  import '../chunk-OMV5W53A.js';
@@ -181,7 +181,9 @@
181
181
  * compact density cannot take the target under it.
182
182
  *
183
183
  * And the boundary is TRANSPARENT rather than absent, spending one pixel of
184
- * that step rather than adding one on top of it. A button carries one at every
184
+ * that step rather than adding one on top of it. It spends a pixel of the row
185
+ * pad too: added to it, the boundary stood the row's mark and words a pixel
186
+ * right of every nav glyph and word above them. A button carries one at every
185
187
  * variant so that a bordered variant and a borderless one stand the same
186
188
  * height, and the row this package draws carries the same one for the same
187
189
  * reason: without it the two rows in one foot are 34px and 36px, and the
@@ -196,7 +198,7 @@
196
198
  width: 100%;
197
199
  min-width: 0;
198
200
  min-height: var(--size-row-sm);
199
- padding: calc(var(--spacing-2) - 1px) var(--size-nav-row-pad);
201
+ padding: calc(var(--spacing-2) - 1px) calc(var(--size-nav-row-pad) - 1px);
200
202
  border: 1px solid transparent;
201
203
  border-radius: var(--radius-md);
202
204
  background: transparent;
@@ -427,13 +429,22 @@
427
429
  overflow: hidden;
428
430
  }
429
431
 
432
+ /*
433
+ * THE BAR'S INSET IS THE CONTENT'S, so a page's first line starts under the
434
+ * bar's title and its cards end under the bar's last control. It stood 16px
435
+ * from each edge over a content column inset 20px, and at its end the
436
+ * content also gives up the scroller's gutter, which the bar, not scrolling,
437
+ * did not: with scrollbars drawn in the layout every page's actions ended
438
+ * 15px past the cards under them. The gutter is measured by the shell
439
+ * (`--crewlet-app-shell-gutter`, 0 where scrollbars overlay the content).
440
+ */
430
441
  .crewlet-app-shell__topbar {
431
442
  display: flex;
432
443
  align-items: center;
433
444
  gap: var(--spacing-3);
434
445
  flex: none;
435
446
  height: var(--crewlet-app-shell-topbar);
436
- padding: 0 var(--spacing-4);
447
+ padding: 0 calc(var(--spacing-5) + var(--crewlet-app-shell-gutter, 0px)) 0 var(--spacing-5);
437
448
  border-bottom: 1px solid var(--color-border-default);
438
449
  background: var(--color-surface-background);
439
450
  }
@@ -616,7 +627,12 @@
616
627
  }
617
628
 
618
629
  /* THE TOP BAR'S GUTTER, 16px: the content's 12px stood every page's first
619
- line 4px left of the title and the controls over it. */
630
+ line 4px left of the title and the controls over it. The bar and the
631
+ content take it together. */
632
+ .crewlet-app-shell__topbar {
633
+ padding: 0 calc(var(--spacing-4) + var(--crewlet-app-shell-gutter, 0px)) 0 var(--spacing-4);
634
+ }
635
+
620
636
  .crewlet-app-shell__content {
621
637
  padding: var(--spacing-4) var(--spacing-4) var(--spacing-9);
622
638
  }
@@ -662,10 +678,27 @@
662
678
  transition: background var(--motion-duration-fast) var(--motion-easing-default);
663
679
  }
664
680
 
665
- /* In the rail's foot, the account row reaches up across its own padding to
666
- half the foot's gap, to meet the row above (HitArea.css). */
681
+ /*
682
+ * In the rail's foot, the account row reaches up across its own padding to
683
+ * half the foot's gap, to meet the row above (HitArea.css).
684
+ *
685
+ * AND IT STANDS ON THE NAV'S COLUMNS: the avatar centred on the column every
686
+ * nav glyph is centred on, and the name starting on the line every nav word
687
+ * starts on. On a 4px inset with an 8px gap a 26px avatar stood 2px left of
688
+ * the glyphs above it and the name 2px right of their words. The avatar's box
689
+ * takes a nav glyph's width (`sm`, 14px) and the badge is centred over it, so
690
+ * whatever size of badge a caller hands the row, it is centred where a glyph
691
+ * is, and the row takes the nav row's pad and its glyph-to-word gap.
692
+ */
667
693
  .crewlet-app-shell__rail-foot .crewlet-account-row__who {
668
694
  --crewlet-hit-area-block-start: calc(var(--crewlet-rail-foot-gap) / 2 + var(--crewlet-account-row-pad));
695
+ gap: calc(var(--spacing-2) + var(--spacing-1) / 2);
696
+ padding-inline-start: var(--size-nav-row-pad);
697
+ }
698
+
699
+ .crewlet-app-shell__rail-foot .crewlet-account-row__avatar {
700
+ justify-content: center;
701
+ width: 14px;
669
702
  }
670
703
 
671
704
  /* The row as the reader's menu button: a button drawn as the link is. */
@@ -1,10 +1,10 @@
1
- export { ArtifactCard, ArtifactCardSkeleton, ArtifactPreviewGlyph } from '../chunk-OHA6WSAG.js';
1
+ export { ArtifactCard, ArtifactCardSkeleton, ArtifactPreviewGlyph } from '../chunk-OTCXRJ7D.js';
2
2
  import '../chunk-TEUQWOWZ.js';
3
3
  import '../chunk-CI3VPIJN.js';
4
4
  import '../chunk-3CZ7XAVY.js';
5
5
  import '../chunk-EUCC37WY.js';
6
6
  import '../chunk-UBZDYOCA.js';
7
- import '../chunk-5QXRI35B.js';
7
+ import '../chunk-ZK3VYY7L.js';
8
8
  import '../chunk-AV2DXAEL.js';
9
9
  import '../chunk-5AQBPHZD.js';
10
10
  import '../chunk-PZKHBB7D.js';
@@ -25,7 +25,9 @@ export interface ArtifactMakeRowProps {
25
25
  * kind's glyph on its own tint, its name and what it is for, the whole item
26
26
  * one link. A toolbar for making things rather than a hero: one line high on
27
27
  * a wide page, the details dropped before a name is cut, and three across on
28
- * a phone.
28
+ * a phone. However many kinds a reader is offered, the tray holds no empty
29
+ * cell: the line has a column per kind, and on a phone a short last row is
30
+ * centred, or four kinds stand two by two.
29
31
  *
30
32
  * THE TRAY IS A WORKBENCH, Crewlet's dotted field under the kinds the way the
31
33
  * org chart's canvas sits under its seats, and an item lifts off it as a card
@@ -1,4 +1,4 @@
1
- export { ArtifactMakeRow } from '../chunk-NS4NSHVX.js';
1
+ export { ArtifactMakeRow } from '../chunk-R2IBCEU6.js';
2
2
  import '../chunk-CE2THTQR.js';
3
3
  import '../chunk-2YTOOH3A.js';
4
4
  import '../chunk-BZFWDIV6.js';
@@ -8,9 +8,16 @@
8
8
  *
9
9
  * THE TRAY SIZES ITSELF BY ITS OWN WIDTH, never the window's: it sits in a
10
10
  * page column a sidebar narrows, so three steps are container queries on the
11
- * tray. Under 560px three across in two lines; from 560px the six in one
12
- * line, each its mark over its name, so a long name is never cut; from 920px
13
- * the mark beside the name and what the kind is for under it.
11
+ * tray. Under 560px three across, each its mark over its name; from 560px
12
+ * every kind in one line, still mark over name, so a long name is never cut;
13
+ * from 920px the mark beside the name and what the kind is for under it.
14
+ *
15
+ * AND BY ITS OWN COUNT. A reader is offered the kinds their company runs, so
16
+ * a tray holds five as often as six, and a grid fixed at six columns left an
17
+ * empty sixth of dotted field at the end of the line, and three across left a
18
+ * hole after the fifth. The line takes one column per kind
19
+ * (`--crewlet-make-row-count`, set from the items), and the narrow tray fills
20
+ * its rows by the count (`data-count`): see the narrow step below.
14
21
  */
15
22
 
16
23
  .crewlet-make-row {
@@ -28,7 +35,7 @@
28
35
  .crewlet-make-row__list {
29
36
  --crewlet-make-row-gap: var(--spacing-1);
30
37
  display: grid;
31
- grid-template-columns: repeat(3, minmax(0, 1fr));
38
+ grid-template-columns: repeat(6, minmax(0, 1fr));
32
39
  gap: var(--crewlet-make-row-gap);
33
40
  margin: 0;
34
41
  padding: var(--spacing-1);
@@ -109,9 +116,40 @@
109
116
  line-height: 1.35;
110
117
  }
111
118
 
119
+ /*
120
+ * THE NARROW TRAY, on six tracks, each kind two of them: three a row. A last
121
+ * row that is short is centred under the full one rather than left with a
122
+ * hole after it, so five kinds stand three and two, the two in the middle.
123
+ * Two and four kinds stand two a row, which fills every row, and one kind
124
+ * takes the tray.
125
+ */
126
+ @container (width < 560px) {
127
+ .crewlet-make-row__cell {
128
+ grid-column: span 2;
129
+ }
130
+
131
+ /* One kind short of a full last row: the first of the two moves in a track. */
132
+ .crewlet-make-row__cell:nth-child(3n + 1):nth-last-child(2) {
133
+ grid-column: 2 / span 2;
134
+ }
135
+
136
+ /* A last row of one stands in the middle. */
137
+ .crewlet-make-row__cell:nth-child(3n + 1):last-child {
138
+ grid-column: 3 / span 2;
139
+ }
140
+
141
+ .crewlet-make-row__list:is([data-count='2'], [data-count='4']) > .crewlet-make-row__cell {
142
+ grid-column: span 3;
143
+ }
144
+
145
+ .crewlet-make-row__list[data-count='1'] > .crewlet-make-row__cell {
146
+ grid-column: span 6;
147
+ }
148
+ }
149
+
112
150
  @container (width >= 560px) {
113
151
  .crewlet-make-row__list {
114
- grid-template-columns: repeat(6, minmax(0, 1fr));
152
+ grid-template-columns: repeat(var(--crewlet-make-row-count, 6), minmax(0, 1fr));
115
153
  }
116
154
 
117
155
  .crewlet-make-row__item {
@@ -1,6 +1,6 @@
1
- export { AuthLayout } from '../chunk-WX2NIG4G.js';
1
+ export { AuthLayout } from '../chunk-BJI3RFXG.js';
2
2
  import '../chunk-7KBNFFM3.js';
3
- import '../chunk-5QXRI35B.js';
3
+ import '../chunk-ZK3VYY7L.js';
4
4
  import '../chunk-AV2DXAEL.js';
5
5
  import '../chunk-BHHIIK3M.js';
6
6
  import '../chunk-PQADV6P6.js';
@@ -1,4 +1,4 @@
1
- export { Card } from '../chunk-5QXRI35B.js';
1
+ export { Card } from '../chunk-ZK3VYY7L.js';
2
2
  export { useCardHeaderSlot } from '../chunk-AV2DXAEL.js';
3
3
  import '../chunk-BHHIIK3M.js';
4
4
  import '../chunk-PQADV6P6.js';
@@ -452,6 +452,49 @@
452
452
  min-width: 0;
453
453
  }
454
454
 
455
+ /*
456
+ * ON A NARROW CARD THE SUBTITLE TAKES A LINE OF ITS OWN, under the title and
457
+ * the card's controls, and wraps there rather than ending.
458
+ *
459
+ * One line is right while the subtitle has room to say something beside the
460
+ * title. In a card under 480px wide it had none: on a phone an Agent seats
461
+ * card drew "Resets today at midnight, the week…" in 202px of a 361px
462
+ * sentence, and the half it cut was the half that said when. On its own line
463
+ * the subtitle has the head's whole width, and the title and the controls
464
+ * keep the first.
465
+ *
466
+ * THE CARD IS THE CONTAINER, and only a card whose head has a subtitle, since
467
+ * that is the one card this changes. Inline-size containment takes a card's
468
+ * width from where it stands, never from its contents, which is how a panel
469
+ * is laid out anyway; a card that sized itself to its contents (a tile in a
470
+ * row that does not stretch it) and carried no subtitle is untouched.
471
+ *
472
+ * THE NAME BLOCK TAKES THE FIRST LINE'S ROOM rather than its own width. With
473
+ * the row free to wrap, a title wider than what the controls leave would
474
+ * otherwise push the controls onto a second line; from a zero basis it grows
475
+ * into the room they leave and clips there, exactly as the one-line head does.
476
+ */
477
+ .crewlet-card:has(> .crewlet-card__header > .crewlet-card__subtitle) {
478
+ container: crewlet-card / inline-size;
479
+ }
480
+
481
+ @container crewlet-card (width < 480px) {
482
+ .crewlet-card__header:has(> .crewlet-card__subtitle) {
483
+ flex-wrap: wrap;
484
+ row-gap: var(--spacing-1);
485
+ }
486
+
487
+ .crewlet-card__header:has(> .crewlet-card__subtitle) > .crewlet-card__header-main {
488
+ flex: 1 1 0;
489
+ }
490
+
491
+ .crewlet-card__header > .crewlet-card__subtitle {
492
+ order: 1;
493
+ flex: 1 1 100%;
494
+ white-space: normal;
495
+ }
496
+ }
497
+
455
498
  .crewlet-card__description {
456
499
  margin: 0;
457
500
  font-size: var(--font-size-compact);
@@ -1,8 +1,8 @@
1
- export { CommandPalette } from '../chunk-A72JPXIV.js';
1
+ export { CommandPalette } from '../chunk-PAQXOP2M.js';
2
2
  import '../chunk-SVGARBDY.js';
3
3
  import '../chunk-7KHM2FZH.js';
4
- import '../chunk-TYONQSOK.js';
5
4
  import '../chunk-SMBKXWML.js';
5
+ import '../chunk-TYONQSOK.js';
6
6
  import '../chunk-BHHIIK3M.js';
7
7
  import '../chunk-PQADV6P6.js';
8
8
  import '../chunk-OMV5W53A.js';
@@ -1,13 +1,13 @@
1
- export { COMMENT_THREAD_LABELS, CommentThread } from '../chunk-MMPKN7WV.js';
1
+ export { COMMENT_THREAD_LABELS, CommentThread } from '../chunk-PT6WKXKW.js';
2
2
  import '../chunk-CI3VPIJN.js';
3
3
  import '../chunk-3CZ7XAVY.js';
4
4
  import '../chunk-EUCC37WY.js';
5
5
  import '../chunk-5AQBPHZD.js';
6
6
  import '../chunk-PZKHBB7D.js';
7
7
  import '../chunk-PWG3VHRQ.js';
8
- import '../chunk-ISA2O2BK.js';
9
- import '../chunk-TYONQSOK.js';
8
+ import '../chunk-ETVEGR2Y.js';
10
9
  import '../chunk-SMBKXWML.js';
10
+ import '../chunk-TYONQSOK.js';
11
11
  import '../chunk-BHHIIK3M.js';
12
12
  import '../chunk-PQADV6P6.js';
13
13
  import '../chunk-OG6CL3EB.js';
@@ -1,6 +1,6 @@
1
- export { COMPOSER_COUNTER_AT, Composer } from '../chunk-ISA2O2BK.js';
2
- import '../chunk-TYONQSOK.js';
1
+ export { COMPOSER_COUNTER_AT, Composer } from '../chunk-ETVEGR2Y.js';
3
2
  import '../chunk-SMBKXWML.js';
3
+ import '../chunk-TYONQSOK.js';
4
4
  import '../chunk-PQADV6P6.js';
5
5
  import '../chunk-4FQT6ZAY.js';
6
6
  import '../chunk-NUZHC6MM.js';
@@ -1,4 +1,4 @@
1
- export { DATA_VIEW_TOOLBAR_LABELS, DataView, DataViewToolbar, FILTER_AXIS_LABELS, FilterAxisBar, FilterAxisChip, applyColumnFilters, applyFilters, blankFilterValue, defaultOperator, filterDefsFromColumns, filterHasValue, filterPredicate, formatFilterValue, operatorOf, tableColumns } from '../chunk-MG3HTY6F.js';
1
+ export { DATA_VIEW_TOOLBAR_LABELS, DataView, DataViewToolbar, FILTER_AXIS_LABELS, FilterAxisBar, FilterAxisChip, applyColumnFilters, applyFilters, blankFilterValue, defaultOperator, filterDefsFromColumns, filterHasValue, filterPredicate, formatFilterValue, operatorOf, tableColumns } from '../chunk-YQG4PZGC.js';
2
2
  import '../chunk-HOXGBLEY.js';
3
3
  import '../chunk-A23KDROH.js';
4
4
  import '../chunk-UB6MLXUL.js';
@@ -13,8 +13,8 @@ import '../chunk-AXS6MBNH.js';
13
13
  import '../chunk-3CZ7XAVY.js';
14
14
  import '../chunk-EUCC37WY.js';
15
15
  import '../chunk-AV2DXAEL.js';
16
- import '../chunk-TYONQSOK.js';
17
16
  import '../chunk-SMBKXWML.js';
17
+ import '../chunk-TYONQSOK.js';
18
18
  import '../chunk-BHHIIK3M.js';
19
19
  import '../chunk-PQADV6P6.js';
20
20
  import '../chunk-D6FEHY5G.js';
@@ -1,5 +1,5 @@
1
- export { DATASET_SOURCE_KINDS, DatasetSource, DatasetSourceList } from '../chunk-HMLAWVG6.js';
2
- import '../chunk-GFV4LJHH.js';
1
+ export { DATASET_SOURCE_KINDS, DatasetSource, DatasetSourceList } from '../chunk-IPWU6ERC.js';
2
+ import '../chunk-KYIAFNU7.js';
3
3
  import '../chunk-WIATRXEJ.js';
4
4
  import '../chunk-3CZ7XAVY.js';
5
5
  import '../chunk-EUCC37WY.js';
@@ -12,6 +12,17 @@ export interface DescriptionListProps extends HTMLAttributes<HTMLDListElement> {
12
12
  * space after "Up" and stacks a list the panel had room to lay side by side.
13
13
  */
14
14
  fit?: boolean | undefined;
15
+ /**
16
+ * The term column's width, as a CSS track: `12rem`, or
17
+ * `minmax(120px, 14rem)`. For lists that have to line up with each other,
18
+ * stacked cards of settings on one page, where each list sizing the column
19
+ * to its own longest term starts its values somewhere else. The same track
20
+ * can be set once for a whole page as `--crewlet-description-list-term`,
21
+ * which every list under it inherits. Ignored with `fit`, whose column is
22
+ * its own longest term by definition, and under the narrow step, where a
23
+ * term stands over its detail.
24
+ */
25
+ termWidth?: string | undefined;
15
26
  /**
16
27
  * The pairs. Given as tuples so a caller can build them from a record
17
28
  * without inventing a key for each one; `DescriptionList.Item` children are
@@ -32,7 +43,7 @@ export interface DescriptionListProps extends HTMLAttributes<HTMLDListElement> {
32
43
  * Each pair is wrapped in a `div`, which HTML allows inside a `dl` and which
33
44
  * is what lets one pair be one grid row.
34
45
  */
35
- export declare function DescriptionList({ dense, fit, items, className, children, ...rest }: DescriptionListProps): import("react").JSX.Element;
46
+ export declare function DescriptionList({ dense, fit, termWidth, items, className, style, children, ...rest }: DescriptionListProps): import("react").JSX.Element;
36
47
  export declare namespace DescriptionList {
37
48
  var Item: typeof DescriptionListItem;
38
49
  }
@@ -1,2 +1,2 @@
1
- export { DescriptionList, DescriptionListItem } from '../chunk-F2XSYBKH.js';
1
+ export { DescriptionList, DescriptionListItem } from '../chunk-MFS6F2P7.js';
2
2
  import '../chunk-ODEQTPFM.js';
@@ -4,11 +4,18 @@
4
4
  * The term track is `minmax(120px, max-content)`: wide enough that short terms
5
5
  * line up with each other, and free to grow for a long one rather than
6
6
  * wrapping it into two lines beside a one-word value.
7
+ *
8
+ * ONE LIST'S TRACK IS ITS OWN, which is wrong for a page of them. Four cards
9
+ * of limits stacked on one page each sized the column to their own longest
10
+ * term, so their values started at four different places and the cards did
11
+ * not read as one table. `--crewlet-description-list-term` names the track
12
+ * instead, and it is inherited: set once on the page (or passed to each list
13
+ * as `termWidth`), every list under it shares one column.
7
14
  */
8
15
 
9
16
  .crewlet-description-list {
10
17
  display: grid;
11
- grid-template-columns: minmax(120px, max-content) 1fr;
18
+ grid-template-columns: var(--crewlet-description-list-term, minmax(120px, max-content)) 1fr;
12
19
  gap: var(--spacing-2) var(--spacing-4);
13
20
  margin: 0;
14
21
  font-size: var(--font-size-compact);
@@ -1,4 +1,4 @@
1
- export { Disclosure } from '../chunk-MICH6QSJ.js';
1
+ export { Disclosure } from '../chunk-OGXHZHRX.js';
2
2
  export { DisclosureAnatomy } from '../chunk-FZVJDJFN.js';
3
3
  import '../chunk-BHHIIK3M.js';
4
4
  import '../chunk-PQADV6P6.js';
@@ -115,9 +115,35 @@
115
115
  font-variant-ligatures: none;
116
116
  }
117
117
 
118
- /* A fact inside the button: quieter than the title it belongs to. */
118
+ /*
119
+ * A fact inside the button: quieter than the title it belongs to, and the
120
+ * first thing to give up room when the row runs short.
121
+ *
122
+ * IT USED TO TAKE NONE. `flex: none` held a fact at its full width while the
123
+ * title, which may shrink, was the only thing that could, so a long fact (a
124
+ * log's replay mode, generation, range and size, beside a status badge in the
125
+ * actions) took the whole trigger: the title shrank to nothing, so a row no
126
+ * longer said which log it was, and the fact ran out of the button and under
127
+ * the badge beside it.
128
+ *
129
+ * A HUNDRED TO THE TITLE'S ONE, as a card's subtitle gives way to its title:
130
+ * two items that may shrink give up space in proportion to their widths, so
131
+ * at that ratio the fact absorbs effectively all of it, and ends in an
132
+ * ellipsis, before the title gives up a pixel. The fact is still the button's
133
+ * name in full; only its drawing is cut.
134
+ *
135
+ * NEVER TO NOTHING. The floor is one glyph wide, because a fact is often a
136
+ * mark (a failed call's glyph beside a tool's name), and a mark that shrank
137
+ * to nothing would say nothing at all. A long fact keeps an ellipsis there,
138
+ * which says a fact was cut. Once the fact is at its floor the title shrinks
139
+ * and ends in its own ellipsis.
140
+ */
119
141
  .crewlet-disclosure__meta {
120
- flex: none;
142
+ flex: 0 100 auto;
143
+ min-width: 1.5em;
144
+ overflow: hidden;
145
+ text-overflow: ellipsis;
146
+ white-space: nowrap;
121
147
  color: var(--color-text-tertiary);
122
148
  font-size: var(--font-size-xs);
123
149
  }
@@ -1,6 +1,6 @@
1
- export { ListInput } from '../chunk-DOLATMGF.js';
2
- import '../chunk-TYONQSOK.js';
1
+ export { ListInput } from '../chunk-3ZUINC7C.js';
3
2
  import '../chunk-SMBKXWML.js';
3
+ import '../chunk-TYONQSOK.js';
4
4
  import '../chunk-PQADV6P6.js';
5
5
  import '../chunk-RSAQOKH3.js';
6
6
  import '../chunk-OMV5W53A.js';
@@ -1,4 +1,4 @@
1
- export { PricingCard } from '../chunk-DQSXWQMJ.js';
2
- import '../chunk-GFV4LJHH.js';
1
+ export { PricingCard } from '../chunk-U3ILLCR2.js';
2
+ import '../chunk-KYIAFNU7.js';
3
3
  import '../chunk-WIATRXEJ.js';
4
4
  import '../chunk-ODEQTPFM.js';
@@ -1,4 +1,4 @@
1
- export { SHEET_COLUMN_EDITOR_LABELS, SheetColumnEditor, SheetColumnTypeGlyph } from '../chunk-F3WZ5AKM.js';
1
+ export { SHEET_COLUMN_EDITOR_LABELS, SheetColumnEditor, SheetColumnTypeGlyph } from '../chunk-4L2BWSHR.js';
2
2
  import '../chunk-XQZ6EWOE.js';
3
3
  import '../chunk-FFMCMSJB.js';
4
4
  import '../chunk-7KHM2FZH.js';
@@ -6,12 +6,12 @@ import '../chunk-LFSIKGRQ.js';
6
6
  import '../chunk-Z7JYG5TF.js';
7
7
  import '../chunk-F4LPQA4E.js';
8
8
  import '../chunk-AYKXMIOR.js';
9
- import '../chunk-AXS6MBNH.js';
10
9
  import '../chunk-2QZ2VPHR.js';
11
10
  import '../chunk-7SDUKCNW.js';
12
11
  import '../chunk-RKKO7QHH.js';
13
- import '../chunk-TYONQSOK.js';
12
+ import '../chunk-AXS6MBNH.js';
14
13
  import '../chunk-SMBKXWML.js';
14
+ import '../chunk-TYONQSOK.js';
15
15
  import '../chunk-BHHIIK3M.js';
16
16
  import '../chunk-PQADV6P6.js';
17
17
  import '../chunk-D6FEHY5G.js';
@@ -1,9 +1,9 @@
1
- export { CellDisplay, CellEditor, CheckboxCell, DateCell, LongTextCell, MultiSelectCell, NumberCell, PersonCell, RatingCell, SelectCell, SheetCell, SheetGrid, StatusCell, TextCell, UrlCell } from '../chunk-DZSBFITC.js';
1
+ export { CellDisplay, CellEditor, CheckboxCell, DateCell, LongTextCell, MultiSelectCell, NumberCell, PersonCell, RatingCell, SelectCell, SheetCell, SheetGrid, StatusCell, TextCell, UrlCell } from '../chunk-JZPK4IXR.js';
2
2
  import '../chunk-O2EGEONV.js';
3
3
  import '../chunk-CENOOTAV.js';
4
4
  import '../chunk-3BYIWOTV.js';
5
5
  import '../chunk-I6POAB4V.js';
6
- import '../chunk-GFV4LJHH.js';
6
+ import '../chunk-KYIAFNU7.js';
7
7
  import '../chunk-WIATRXEJ.js';
8
8
  import '../chunk-66X5WDKE.js';
9
9
  import '../chunk-LFSIKGRQ.js';
@@ -4,13 +4,17 @@ export interface StatGroupProps extends HTMLAttributes<HTMLDivElement> {
4
4
  * How many tiles a row holds. FIXED, and that is the whole point: the board
5
5
  * this replaces reflowed from one column to three as tiles appeared and
6
6
  * vanished, which moved every number on the page for a reason that had
7
- * nothing to do with the numbers.
7
+ * nothing to do with the numbers. What changes it is the row's own width:
8
+ * four fold to two under 640px of row, and three stack one a row under
9
+ * 480px, so no row is left with a lone tile.
8
10
  */
9
11
  columns?: 2 | 3 | 4;
10
12
  /**
11
- * Inside another card: the row gives up its own surface, hairline and
12
- * corner and keeps only the hairlines between its tiles, so a card holding
13
- * it does not draw a box inside a box.
13
+ * The row gives up its own surface, hairline and corner and keeps only the
14
+ * hairlines between its tiles, so the host holding it does not draw a box
15
+ * inside a box. A row that is a `Card`'s content, or its body's, is flush
16
+ * without being told; this is for any other host (a widget's frame, a panel
17
+ * of an application's own).
14
18
  */
15
19
  flush?: boolean | undefined;
16
20
  children?: ReactNode;
@@ -19,8 +23,8 @@ export interface StatGroupProps extends HTMLAttributes<HTMLDivElement> {
19
23
  * A row of stat tiles, as one card.
20
24
  *
21
25
  * The tiles inside it are `flush`, so the group draws the surface and the
22
- * hairlines between them rather than four separate cards with gaps. Under the
23
- * md breakpoint it drops to two columns, which is the last count at which a
24
- * six-character number still fits on one line of a phone.
26
+ * hairlines between them rather than four separate cards with gaps. It folds
27
+ * by its OWN width rather than the window's (see StatGroup.css), so a row in
28
+ * a narrow column beside a rail folds where a row across a page does not.
25
29
  */
26
30
  export declare function StatGroup({ columns, flush, className, children, ...rest }: StatGroupProps): import("react").JSX.Element;
@@ -1,2 +1,2 @@
1
- export { StatGroup } from '../chunk-JXRI5YD2.js';
1
+ export { StatGroup } from '../chunk-BT5H2THK.js';
2
2
  import '../chunk-ODEQTPFM.js';