@crewlethq/ui 0.37.1 → 0.39.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 (101) hide show
  1. package/README.md +70 -2
  2. package/dist/Accordion/index.js +1 -1
  3. package/dist/AgentHandoffPanel/index.js +2 -2
  4. package/dist/AppShell/index.js +1 -1
  5. package/dist/{AppShell-JBCZSSX3.css → AppShell-NDU4XMGF.css} +39 -6
  6. package/dist/ArtifactBar/index.js +1 -1
  7. package/dist/{ArtifactBar-FWPBBKQ5.css → ArtifactBar-6PGWGKN2.css} +13 -1
  8. package/dist/ArtifactCard/index.js +2 -2
  9. package/dist/ArtifactMakeRow/ArtifactMakeRow.d.ts +3 -1
  10. package/dist/ArtifactMakeRow/index.js +1 -1
  11. package/dist/{ArtifactMakeRow-W3RD5YWZ.css → ArtifactMakeRow-6UX2LTF7.css} +43 -5
  12. package/dist/AuthLayout/index.js +2 -2
  13. package/dist/Card/Card.d.ts +14 -2
  14. package/dist/Card/index.js +1 -1
  15. package/dist/{Card-QOVASQNU.css → Card-JR2UPQH7.css} +63 -0
  16. package/dist/CatalogTile/CatalogTile.d.ts +47 -0
  17. package/dist/CatalogTile/index.d.ts +3 -0
  18. package/dist/CatalogTile/index.js +3 -0
  19. package/dist/CatalogTile-TGR2ZZVQ.css +131 -0
  20. package/dist/CodeBlock/index.js +1 -1
  21. package/dist/{CodeBlock-GYNJ2HI6.css → CodeBlock-N5ETJF24.css} +13 -0
  22. package/dist/CommandPalette/index.js +2 -2
  23. package/dist/DataTable/index.js +2 -2
  24. package/dist/DataView/index.js +3 -3
  25. package/dist/DatasetSource/DatasetSource.d.ts +7 -1
  26. package/dist/DatasetSource/index.js +2 -2
  27. package/dist/DescriptionList/DescriptionList.d.ts +12 -1
  28. package/dist/DescriptionList/index.js +1 -1
  29. package/dist/{DescriptionList-IXMRCSMK.css → DescriptionList-DEZISDLQ.css} +8 -1
  30. package/dist/Disclosure/index.js +1 -1
  31. package/dist/{Disclosure-VKBJJIZ7.css → Disclosure-P4FH3C35.css} +28 -2
  32. package/dist/LinkInterstitial/index.js +2 -2
  33. package/dist/List/List.d.ts +8 -0
  34. package/dist/List/index.js +1 -1
  35. package/dist/{List-MYJIV6MP.css → List-YHLIZFK4.css} +46 -0
  36. package/dist/ListInput/ListInput.d.ts +9 -1
  37. package/dist/ListInput/index.js +1 -1
  38. package/dist/Modal/index.js +1 -1
  39. package/dist/{Modal-7MWRCWAI.css → Modal-TOEWHDCQ.css} +5 -0
  40. package/dist/ObjectHeader/index.js +1 -1
  41. package/dist/{ObjectHeader-D7GU7QNI.css → ObjectHeader-ZOS22FKX.css} +7 -8
  42. package/dist/PricingCard/index.js +2 -2
  43. package/dist/SettingsTable/SettingsTable.d.ts +66 -0
  44. package/dist/SettingsTable/index.d.ts +3 -0
  45. package/dist/SettingsTable/index.js +3 -0
  46. package/dist/SettingsTable-6DUFAFXG.css +160 -0
  47. package/dist/ShareDialog/index.js +2 -2
  48. package/dist/SheetGrid/index.js +2 -2
  49. package/dist/StatCard/index.js +1 -1
  50. package/dist/{StatCard-4T7TMWMN.css → StatCard-HAA3F5GX.css} +8 -3
  51. package/dist/StatGroup/StatGroup.d.ts +11 -7
  52. package/dist/StatGroup/index.js +1 -1
  53. package/dist/StatGroup-ZMW7VQWP.css +195 -0
  54. package/dist/Switcher/index.js +2 -2
  55. package/dist/TableCells/index.js +2 -2
  56. package/dist/Tag/index.js +1 -1
  57. package/dist/{Tag-SRGTK5KI.css → Tag-2DQOVE6W.css} +15 -5
  58. package/dist/TagsInput/index.js +2 -2
  59. package/dist/TileGrid/TileGrid.d.ts +33 -0
  60. package/dist/TileGrid/index.d.ts +3 -0
  61. package/dist/TileGrid/index.js +2 -0
  62. package/dist/TileGrid-I6LNYD2H.css +52 -0
  63. package/dist/{chunk-YSG3DW7W.js → chunk-3TXY3PJZ.js} +1 -1
  64. package/dist/{chunk-K4VP6ZKE.js → chunk-4BJK7FE5.js} +1 -1
  65. package/dist/chunk-4RKTZSEW.js +64 -0
  66. package/dist/{chunk-3SBM4DGI.js → chunk-BH52LIY6.js} +1 -1
  67. package/dist/{chunk-HDHZWIFL.js → chunk-DYB66CNM.js} +16 -2
  68. package/dist/{chunk-A23KDROH.js → chunk-FXBGEANQ.js} +1 -1
  69. package/dist/{chunk-HMLAWVG6.js → chunk-HQJ24WPM.js} +5 -3
  70. package/dist/{chunk-SVGARBDY.js → chunk-IAGYPTEJ.js} +2 -2
  71. package/dist/{chunk-5QXRI35B.js → chunk-INHXF2CL.js} +24 -11
  72. package/dist/{chunk-6NNY5WBF.js → chunk-JKAGN4V4.js} +1 -1
  73. package/dist/{chunk-DZSBFITC.js → chunk-JZPK4IXR.js} +1 -1
  74. package/dist/{chunk-UWRBD2YO.js → chunk-KNHUBHFX.js} +1 -1
  75. package/dist/{chunk-GFV4LJHH.js → chunk-KYIAFNU7.js} +1 -1
  76. package/dist/{chunk-F2XSYBKH.js → chunk-MFS6F2P7.js} +4 -1
  77. package/dist/{chunk-NRBAXRWE.js → chunk-N3TFYBN3.js} +1 -1
  78. package/dist/chunk-NNTO3TNC.js +9 -0
  79. package/dist/{chunk-DS2C73RJ.js → chunk-NZWX27J7.js} +2 -2
  80. package/dist/{chunk-VGE3G3T4.js → chunk-ODOJJGXH.js} +1 -1
  81. package/dist/{chunk-MICH6QSJ.js → chunk-OGXHZHRX.js} +1 -1
  82. package/dist/{chunk-JXRI5YD2.js → chunk-OUD75UB2.js} +2 -1
  83. package/dist/{chunk-MG3HTY6F.js → chunk-QRKT4XTT.js} +1 -1
  84. package/dist/{chunk-NS4NSHVX.js → chunk-R2IBCEU6.js} +12 -2
  85. package/dist/{chunk-WX2NIG4G.js → chunk-S4DREXGM.js} +1 -1
  86. package/dist/{chunk-GDDE4UM7.js → chunk-SEC2GR2V.js} +1 -1
  87. package/dist/{chunk-S27UBCVX.js → chunk-TZYFTC4M.js} +1 -1
  88. package/dist/{chunk-OHA6WSAG.js → chunk-U2XAJONO.js} +1 -1
  89. package/dist/{chunk-DQSXWQMJ.js → chunk-U3ILLCR2.js} +1 -1
  90. package/dist/{chunk-DOLATMGF.js → chunk-WYYCPV46.js} +5 -0
  91. package/dist/{chunk-A72JPXIV.js → chunk-XGBUUQDU.js} +1 -1
  92. package/dist/chunk-XNXK5MA4.js +48 -0
  93. package/dist/{chunk-XO7PUL4F.js → chunk-YPTTSJPM.js} +1 -1
  94. package/dist/{chunk-RIAZM6L3.js → chunk-ZNOXQACX.js} +1 -1
  95. package/dist/generated/index.d.ts +3 -0
  96. package/dist/generated/index.js +56 -53
  97. package/dist/index.js +56 -53
  98. package/dist/styles.css +782 -64
  99. package/package.json +3 -3
  100. package/dist/StatGroup-PADTJCUQ.css +0 -86
  101. /package/dist/{chunk-4QQ3MND5.js → chunk-QRLIWCLX.js} +0 -0
package/dist/styles.css CHANGED
@@ -702,7 +702,7 @@
702
702
  }
703
703
 
704
704
 
705
- /* AppShell-JBCZSSX3.css */
705
+ /* AppShell-NDU4XMGF.css */
706
706
  /*
707
707
  * The application frame: a rail on the FRAME, and the screen on a SHEET that
708
708
  * floats beside it.
@@ -886,7 +886,9 @@
886
886
  * compact density cannot take the target under it.
887
887
  *
888
888
  * And the boundary is TRANSPARENT rather than absent, spending one pixel of
889
- * that step rather than adding one on top of it. A button carries one at every
889
+ * that step rather than adding one on top of it. It spends a pixel of the row
890
+ * pad too: added to it, the boundary stood the row's mark and words a pixel
891
+ * right of every nav glyph and word above them. A button carries one at every
890
892
  * variant so that a bordered variant and a borderless one stand the same
891
893
  * height, and the row this package draws carries the same one for the same
892
894
  * reason: without it the two rows in one foot are 34px and 36px, and the
@@ -901,7 +903,7 @@
901
903
  width: 100%;
902
904
  min-width: 0;
903
905
  min-height: var(--size-row-sm);
904
- padding: calc(var(--spacing-2) - 1px) var(--size-nav-row-pad);
906
+ padding: calc(var(--spacing-2) - 1px) calc(var(--size-nav-row-pad) - 1px);
905
907
  border: 1px solid transparent;
906
908
  border-radius: var(--radius-md);
907
909
  background: transparent;
@@ -1132,13 +1134,22 @@
1132
1134
  overflow: hidden;
1133
1135
  }
1134
1136
 
1137
+ /*
1138
+ * THE BAR'S INSET IS THE CONTENT'S, so a page's first line starts under the
1139
+ * bar's title and its cards end under the bar's last control. It stood 16px
1140
+ * from each edge over a content column inset 20px, and at its end the
1141
+ * content also gives up the scroller's gutter, which the bar, not scrolling,
1142
+ * did not: with scrollbars drawn in the layout every page's actions ended
1143
+ * 15px past the cards under them. The gutter is measured by the shell
1144
+ * (`--crewlet-app-shell-gutter`, 0 where scrollbars overlay the content).
1145
+ */
1135
1146
  .crewlet-app-shell__topbar {
1136
1147
  display: flex;
1137
1148
  align-items: center;
1138
1149
  gap: var(--spacing-3);
1139
1150
  flex: none;
1140
1151
  height: var(--crewlet-app-shell-topbar);
1141
- padding: 0 var(--spacing-4);
1152
+ padding: 0 calc(var(--spacing-5) + var(--crewlet-app-shell-gutter, 0px)) 0 var(--spacing-5);
1142
1153
  border-bottom: 1px solid var(--color-border-default);
1143
1154
  background: var(--color-surface-background);
1144
1155
  }
@@ -1321,7 +1332,12 @@
1321
1332
  }
1322
1333
 
1323
1334
  /* THE TOP BAR'S GUTTER, 16px: the content's 12px stood every page's first
1324
- line 4px left of the title and the controls over it. */
1335
+ line 4px left of the title and the controls over it. The bar and the
1336
+ content take it together. */
1337
+ .crewlet-app-shell__topbar {
1338
+ padding: 0 calc(var(--spacing-4) + var(--crewlet-app-shell-gutter, 0px)) 0 var(--spacing-4);
1339
+ }
1340
+
1325
1341
  .crewlet-app-shell__content {
1326
1342
  padding: var(--spacing-4) var(--spacing-4) var(--spacing-9);
1327
1343
  }
@@ -1367,10 +1383,27 @@
1367
1383
  transition: background var(--motion-duration-fast) var(--motion-easing-default);
1368
1384
  }
1369
1385
 
1370
- /* In the rail's foot, the account row reaches up across its own padding to
1371
- half the foot's gap, to meet the row above (HitArea.css). */
1386
+ /*
1387
+ * In the rail's foot, the account row reaches up across its own padding to
1388
+ * half the foot's gap, to meet the row above (HitArea.css).
1389
+ *
1390
+ * AND IT STANDS ON THE NAV'S COLUMNS: the avatar centred on the column every
1391
+ * nav glyph is centred on, and the name starting on the line every nav word
1392
+ * starts on. On a 4px inset with an 8px gap a 26px avatar stood 2px left of
1393
+ * the glyphs above it and the name 2px right of their words. The avatar's box
1394
+ * takes a nav glyph's width (`sm`, 14px) and the badge is centred over it, so
1395
+ * whatever size of badge a caller hands the row, it is centred where a glyph
1396
+ * is, and the row takes the nav row's pad and its glyph-to-word gap.
1397
+ */
1372
1398
  .crewlet-app-shell__rail-foot .crewlet-account-row__who {
1373
1399
  --crewlet-hit-area-block-start: calc(var(--crewlet-rail-foot-gap) / 2 + var(--crewlet-account-row-pad));
1400
+ gap: calc(var(--spacing-2) + var(--spacing-1) / 2);
1401
+ padding-inline-start: var(--size-nav-row-pad);
1402
+ }
1403
+
1404
+ .crewlet-app-shell__rail-foot .crewlet-account-row__avatar {
1405
+ justify-content: center;
1406
+ width: 14px;
1374
1407
  }
1375
1408
 
1376
1409
  /* The row as the reader's menu button: a button drawn as the link is. */
@@ -2258,7 +2291,7 @@ button.crewlet-account-row__who:focus-visible {
2258
2291
  }
2259
2292
 
2260
2293
 
2261
- /* ArtifactBar-FWPBBKQ5.css */
2294
+ /* ArtifactBar-6PGWGKN2.css */
2262
2295
  /*
2263
2296
  * One row, one hairline under it, the height of a large row. The lead (the
2264
2297
  * way back, the glyph, the title, the version) takes what the end leaves it
@@ -2290,7 +2323,12 @@ button.crewlet-account-row__who:focus-visible {
2290
2323
  its place, and at a row's height of its own the line under it jumped by
2291
2324
  three pixels between the gallery and the artifact opened from it. */
2292
2325
  height: calc(var(--size-shell-topbar) - 1px);
2293
- padding: 0 var(--spacing-3);
2326
+ /* THE SHELL TOP BAR'S INSET, the scroller's gutter at its end included: the
2327
+ bar stands in that bar's place, and at a 12px inset of its own a create
2328
+ page's controls ended 19px past the content under them, where every other
2329
+ page's end over it. The same two steps as the top bar, 20px wide and 16px
2330
+ under the shell's breakpoint (below). */
2331
+ padding: 0 calc(var(--spacing-5) + var(--crewlet-app-shell-gutter, 0px)) 0 var(--spacing-5);
2294
2332
  min-width: 0;
2295
2333
  }
2296
2334
 
@@ -2675,6 +2713,13 @@ button.crewlet-account-row__who:focus-visible {
2675
2713
  }
2676
2714
  }
2677
2715
 
2716
+ /* The shell's breakpoint, where its top bar and content take 16px. */
2717
+ @media (width < 1024px) {
2718
+ .crewlet-artifact-bar__row {
2719
+ padding: 0 calc(var(--spacing-4) + var(--crewlet-app-shell-gutter, 0px)) 0 var(--spacing-4);
2720
+ }
2721
+ }
2722
+
2678
2723
 
2679
2724
  /* ArtifactCard-OGTMO2KI.css */
2680
2725
  /*
@@ -3311,7 +3356,7 @@ a.crewlet-kind-tile:hover .crewlet-kind-tile__frame,
3311
3356
  .crewlet-kind--sheet { --crewlet-kind-hue: var(--color-artifact-kind-sheet); --crewlet-kind-fill: var(--color-artifact-kind-sheet-fill); --crewlet-kind-line: var(--color-artifact-kind-sheet-line); --crewlet-kind-ink: var(--color-artifact-kind-sheet-ink); }
3312
3357
 
3313
3358
 
3314
- /* ArtifactMakeRow-W3RD5YWZ.css */
3359
+ /* ArtifactMakeRow-6UX2LTF7.css */
3315
3360
  /*
3316
3361
  * The "Start a new artifact" tray.
3317
3362
  *
@@ -3322,9 +3367,16 @@ a.crewlet-kind-tile:hover .crewlet-kind-tile__frame,
3322
3367
  *
3323
3368
  * THE TRAY SIZES ITSELF BY ITS OWN WIDTH, never the window's: it sits in a
3324
3369
  * page column a sidebar narrows, so three steps are container queries on the
3325
- * tray. Under 560px three across in two lines; from 560px the six in one
3326
- * line, each its mark over its name, so a long name is never cut; from 920px
3327
- * the mark beside the name and what the kind is for under it.
3370
+ * tray. Under 560px three across, each its mark over its name; from 560px
3371
+ * every kind in one line, still mark over name, so a long name is never cut;
3372
+ * from 920px the mark beside the name and what the kind is for under it.
3373
+ *
3374
+ * AND BY ITS OWN COUNT. A reader is offered the kinds their company runs, so
3375
+ * a tray holds five as often as six, and a grid fixed at six columns left an
3376
+ * empty sixth of dotted field at the end of the line, and three across left a
3377
+ * hole after the fifth. The line takes one column per kind
3378
+ * (`--crewlet-make-row-count`, set from the items), and the narrow tray fills
3379
+ * its rows by the count (`data-count`): see the narrow step below.
3328
3380
  */
3329
3381
 
3330
3382
  .crewlet-make-row {
@@ -3342,7 +3394,7 @@ a.crewlet-kind-tile:hover .crewlet-kind-tile__frame,
3342
3394
  .crewlet-make-row__list {
3343
3395
  --crewlet-make-row-gap: var(--spacing-1);
3344
3396
  display: grid;
3345
- grid-template-columns: repeat(3, minmax(0, 1fr));
3397
+ grid-template-columns: repeat(6, minmax(0, 1fr));
3346
3398
  gap: var(--crewlet-make-row-gap);
3347
3399
  margin: 0;
3348
3400
  padding: var(--spacing-1);
@@ -3423,9 +3475,40 @@ a.crewlet-kind-tile:hover .crewlet-kind-tile__frame,
3423
3475
  line-height: 1.35;
3424
3476
  }
3425
3477
 
3478
+ /*
3479
+ * THE NARROW TRAY, on six tracks, each kind two of them: three a row. A last
3480
+ * row that is short is centred under the full one rather than left with a
3481
+ * hole after it, so five kinds stand three and two, the two in the middle.
3482
+ * Two and four kinds stand two a row, which fills every row, and one kind
3483
+ * takes the tray.
3484
+ */
3485
+ @container (width < 560px) {
3486
+ .crewlet-make-row__cell {
3487
+ grid-column: span 2;
3488
+ }
3489
+
3490
+ /* One kind short of a full last row: the first of the two moves in a track. */
3491
+ .crewlet-make-row__cell:nth-child(3n + 1):nth-last-child(2) {
3492
+ grid-column: 2 / span 2;
3493
+ }
3494
+
3495
+ /* A last row of one stands in the middle. */
3496
+ .crewlet-make-row__cell:nth-child(3n + 1):last-child {
3497
+ grid-column: 3 / span 2;
3498
+ }
3499
+
3500
+ .crewlet-make-row__list:is([data-count='2'], [data-count='4']) > .crewlet-make-row__cell {
3501
+ grid-column: span 3;
3502
+ }
3503
+
3504
+ .crewlet-make-row__list[data-count='1'] > .crewlet-make-row__cell {
3505
+ grid-column: span 6;
3506
+ }
3507
+ }
3508
+
3426
3509
  @container (width >= 560px) {
3427
3510
  .crewlet-make-row__list {
3428
- grid-template-columns: repeat(6, minmax(0, 1fr));
3511
+ grid-template-columns: repeat(var(--crewlet-make-row-count, 6), minmax(0, 1fr));
3429
3512
  }
3430
3513
 
3431
3514
  .crewlet-make-row__item {
@@ -6195,7 +6278,7 @@ a.crewlet-breadcrumb__crumb:focus-visible {
6195
6278
  }
6196
6279
 
6197
6280
 
6198
- /* Card-QOVASQNU.css */
6281
+ /* Card-JR2UPQH7.css */
6199
6282
  /*
6200
6283
  * Card, THE surface. Everything on a screen is a card, a row inside one, or a
6201
6284
  * control.
@@ -6650,6 +6733,69 @@ a.crewlet-breadcrumb__crumb:focus-visible {
6650
6733
  min-width: 0;
6651
6734
  }
6652
6735
 
6736
+ /*
6737
+ * ON A NARROW CARD THE SUBTITLE TAKES A LINE OF ITS OWN, under the title and
6738
+ * the card's controls, and wraps there rather than ending.
6739
+ *
6740
+ * One line is right while the subtitle has room to say something beside the
6741
+ * title. In a card under 480px wide it had none: on a phone an Agent seats
6742
+ * card drew "Resets today at midnight, the week…" in 202px of a 361px
6743
+ * sentence, and the half it cut was the half that said when. On its own line
6744
+ * the subtitle has the head's whole width, and the title and the controls
6745
+ * keep the first.
6746
+ *
6747
+ * THE CARD IS THE CONTAINER, and only a card whose head has a subtitle, since
6748
+ * that is the one card this changes. Inline-size containment takes a card's
6749
+ * width from where it stands, never from its contents, which is how a panel
6750
+ * is laid out anyway; a card that sized itself to its contents (a tile in a
6751
+ * row that does not stretch it) and carried no subtitle is untouched.
6752
+ *
6753
+ * THE NAME BLOCK TAKES THE FIRST LINE'S ROOM rather than its own width. With
6754
+ * the row free to wrap, a title wider than what the controls leave would
6755
+ * otherwise push the controls onto a second line; from a zero basis it grows
6756
+ * into the room they leave and clips there, exactly as the one-line head does.
6757
+ */
6758
+ .crewlet-card:has(> .crewlet-card__header > .crewlet-card__subtitle) {
6759
+ container: crewlet-card / inline-size;
6760
+ }
6761
+
6762
+ @container crewlet-card (width < 480px) {
6763
+ .crewlet-card__header:has(> .crewlet-card__subtitle) {
6764
+ flex-wrap: wrap;
6765
+ row-gap: var(--spacing-1);
6766
+ }
6767
+
6768
+ .crewlet-card__header:has(> .crewlet-card__subtitle) > .crewlet-card__header-main {
6769
+ flex: 1 1 0;
6770
+ }
6771
+
6772
+ .crewlet-card__header > .crewlet-card__subtitle {
6773
+ order: 1;
6774
+ flex: 1 1 100%;
6775
+ white-space: normal;
6776
+ }
6777
+ }
6778
+
6779
+ /*
6780
+ * STACKED, ASKED FOR: the subtitle under the title at every width, the shape
6781
+ * the narrow step above draws, for a row of cards of different widths whose
6782
+ * heads have to stand at one height rather than one inline and one stacked.
6783
+ */
6784
+ .crewlet-card__header--stacked {
6785
+ flex-wrap: wrap;
6786
+ row-gap: var(--spacing-1);
6787
+ }
6788
+
6789
+ .crewlet-card__header--stacked > .crewlet-card__header-main {
6790
+ flex: 1 1 0;
6791
+ }
6792
+
6793
+ .crewlet-card__header--stacked > .crewlet-card__subtitle {
6794
+ order: 1;
6795
+ flex: 1 1 100%;
6796
+ white-space: normal;
6797
+ }
6798
+
6653
6799
  .crewlet-card__description {
6654
6800
  margin: 0;
6655
6801
  font-size: var(--font-size-compact);
@@ -6664,6 +6810,140 @@ a.crewlet-breadcrumb__crumb:focus-visible {
6664
6810
  }
6665
6811
 
6666
6812
 
6813
+ /* CatalogTile-TGR2ZZVQ.css */
6814
+ /*
6815
+ * CatalogTile: mark, name and state, one sentence, and a foot with a quiet
6816
+ * fact and one action.
6817
+ *
6818
+ * ONE WELL FOR EVERY MARK. A vendor's mark is drawn in the vendor's colours,
6819
+ * so the box it stands in is the one thing a catalogue can hold constant: the
6820
+ * same size, the same raised ground and the same hairline for every tile,
6821
+ * set up or not. A drained mark on a grey box read as a placeholder image
6822
+ * (a white plate on grey is not a logo), so a tile not yet set up says so by
6823
+ * its ground, never by its mark.
6824
+ */
6825
+
6826
+ .crewlet-catalog-tile {
6827
+ display: flex;
6828
+ flex-direction: column;
6829
+ gap: var(--spacing-3);
6830
+ min-width: 0;
6831
+ padding: var(--spacing-4);
6832
+ background: var(--color-surface-subtle);
6833
+ border: 1px solid var(--color-border-default);
6834
+ border-radius: var(--radius-lg);
6835
+ color: var(--color-text-primary);
6836
+ }
6837
+
6838
+ .crewlet-catalog-tile--quiet {
6839
+ background: var(--color-surface-background);
6840
+ }
6841
+
6842
+ .crewlet-catalog-tile__head {
6843
+ display: flex;
6844
+ align-items: center;
6845
+ gap: var(--spacing-3);
6846
+ min-width: 0;
6847
+ }
6848
+
6849
+ .crewlet-catalog-tile__mark {
6850
+ display: inline-flex;
6851
+ flex: none;
6852
+ align-items: center;
6853
+ justify-content: center;
6854
+ width: var(--size-row-lg);
6855
+ height: var(--size-row-lg);
6856
+ border-radius: var(--radius-md);
6857
+ background: var(--color-surface-elevated);
6858
+ border: 1px solid var(--color-border-default);
6859
+ color: var(--color-text-primary);
6860
+ }
6861
+
6862
+ /* The name, and under it the state when there is one; centred on the mark
6863
+ either way, so a tile with no state is not a tile with a hole in it. */
6864
+ .crewlet-catalog-tile__title {
6865
+ display: flex;
6866
+ flex-direction: column;
6867
+ align-items: flex-start;
6868
+ justify-content: center;
6869
+ gap: var(--spacing-1);
6870
+ min-width: 0;
6871
+ }
6872
+
6873
+ .crewlet-catalog-tile__name {
6874
+ margin: 0;
6875
+ font-family: var(--font-family-sans);
6876
+ font-size: var(--font-size-sm);
6877
+ font-weight: var(--font-weight-semibold);
6878
+ line-height: var(--font-line-height-snug);
6879
+ color: var(--color-text-primary);
6880
+ overflow-wrap: anywhere;
6881
+ }
6882
+
6883
+ .crewlet-catalog-tile__status {
6884
+ display: inline-flex;
6885
+ }
6886
+
6887
+ .crewlet-catalog-tile__description {
6888
+ flex: 1;
6889
+ margin: 0;
6890
+ /* Two lines reserved, so a tile saying what it is for and one saying what
6891
+ is owed keep their feet on one line in a row. */
6892
+ min-height: calc(2em * var(--font-line-height-body));
6893
+ font-size: var(--font-size-compact);
6894
+ line-height: var(--font-line-height-body);
6895
+ color: var(--color-text-secondary);
6896
+ }
6897
+
6898
+ .crewlet-catalog-tile__foot {
6899
+ display: flex;
6900
+ align-items: center;
6901
+ gap: var(--spacing-2);
6902
+ /* A SMALL CONTROL'S HEIGHT OF CONTENT, under the rule and the padding: a
6903
+ foot holding only a fact stands as tall as one holding a button, so the
6904
+ rules of every foot in a row sit on one line. Measured on the content
6905
+ box, since under border-box sizing the padding spent the floor and a
6906
+ fact-only foot stood 8px shorter. */
6907
+ box-sizing: content-box;
6908
+ min-height: var(--size-control-sm);
6909
+ padding-top: var(--spacing-3);
6910
+ border-top: 1px solid var(--color-border-default);
6911
+ }
6912
+
6913
+ .crewlet-catalog-tile__meta {
6914
+ flex: 1;
6915
+ min-width: 0;
6916
+ overflow: hidden;
6917
+ text-overflow: ellipsis;
6918
+ white-space: nowrap;
6919
+ font-size: var(--font-size-xs);
6920
+ color: var(--color-text-tertiary);
6921
+ }
6922
+
6923
+ .crewlet-catalog-tile__action {
6924
+ display: inline-flex;
6925
+ flex: none;
6926
+ }
6927
+
6928
+ /*
6929
+ * ONE TILE A ROW RESERVES NOTHING. The two reserved lines exist to keep the
6930
+ * feet of tiles side by side on one line; a grid folded to one track has no
6931
+ * neighbours to line up with, and on a phone the reserve was a blank line in
6932
+ * every short tile.
6933
+ */
6934
+ @container crewlet-tile-grid (width < 40rem) {
6935
+ .crewlet-tile-grid[data-columns='3'] .crewlet-catalog-tile__description {
6936
+ min-height: 0;
6937
+ }
6938
+ }
6939
+
6940
+ @container crewlet-tile-grid (width < 28rem) {
6941
+ .crewlet-tile-grid .crewlet-catalog-tile__description {
6942
+ min-height: 0;
6943
+ }
6944
+ }
6945
+
6946
+
6667
6947
  /* ChangeMark-3VMTW7MT.css */
6668
6948
  /*
6669
6949
  * A change mark (ChangeMark.tsx): a notch in the top end corner of whatever
@@ -8226,7 +8506,7 @@ a.crewlet-breadcrumb__crumb:focus-visible {
8226
8506
  }
8227
8507
 
8228
8508
 
8229
- /* CodeBlock-GYNJ2HI6.css */
8509
+ /* CodeBlock-N5ETJF24.css */
8230
8510
  /*
8231
8511
  * CodeBlock, a monospace command, config or record surface. One step off the
8232
8512
  * page, with an optional header carrying a filename and the copy control.
@@ -8245,6 +8525,19 @@ a.crewlet-breadcrumb__crumb:focus-visible {
8245
8525
  min-width: 0;
8246
8526
  }
8247
8527
 
8528
+ /*
8529
+ * A BLOCK THAT IS A CARD'S CONTENT IS THAT CARD'S SURFACE. Placed straight in
8530
+ * a card (with `padding="none"`), it gives up its own edge, corner and ground,
8531
+ * so the card's head rule is the only line over the code and there is no box
8532
+ * inside a box. In a padded body it stays a well, which is what tells code
8533
+ * from the prose beside it.
8534
+ */
8535
+ .crewlet-card > .crewlet-codeblock {
8536
+ border: 0;
8537
+ border-radius: var(--radius-none);
8538
+ background: transparent;
8539
+ }
8540
+
8248
8541
  .crewlet-codeblock__header {
8249
8542
  display: flex;
8250
8543
  align-items: center;
@@ -12393,18 +12686,25 @@ svg.crewlet-datetime__chevron {
12393
12686
  }
12394
12687
 
12395
12688
 
12396
- /* DescriptionList-IXMRCSMK.css */
12689
+ /* DescriptionList-DEZISDLQ.css */
12397
12690
  /*
12398
12691
  * Metadata pairs on one grid.
12399
12692
  *
12400
12693
  * The term track is `minmax(120px, max-content)`: wide enough that short terms
12401
12694
  * line up with each other, and free to grow for a long one rather than
12402
12695
  * wrapping it into two lines beside a one-word value.
12696
+ *
12697
+ * ONE LIST'S TRACK IS ITS OWN, which is wrong for a page of them. Four cards
12698
+ * of limits stacked on one page each sized the column to their own longest
12699
+ * term, so their values started at four different places and the cards did
12700
+ * not read as one table. `--crewlet-description-list-term` names the track
12701
+ * instead, and it is inherited: set once on the page (or passed to each list
12702
+ * as `termWidth`), every list under it shares one column.
12403
12703
  */
12404
12704
 
12405
12705
  .crewlet-description-list {
12406
12706
  display: grid;
12407
- grid-template-columns: minmax(120px, max-content) 1fr;
12707
+ grid-template-columns: var(--crewlet-description-list-term, minmax(120px, max-content)) 1fr;
12408
12708
  gap: var(--spacing-2) var(--spacing-4);
12409
12709
  margin: 0;
12410
12710
  font-size: var(--font-size-compact);
@@ -12670,7 +12970,7 @@ svg.crewlet-datetime__chevron {
12670
12970
  }
12671
12971
 
12672
12972
 
12673
- /* Disclosure-VKBJJIZ7.css */
12973
+ /* Disclosure-P4FH3C35.css */
12674
12974
  /*
12675
12975
  * The disclosure anatomy, declared once for every expander in the package.
12676
12976
  *
@@ -12788,9 +13088,35 @@ svg.crewlet-datetime__chevron {
12788
13088
  font-variant-ligatures: none;
12789
13089
  }
12790
13090
 
12791
- /* A fact inside the button: quieter than the title it belongs to. */
13091
+ /*
13092
+ * A fact inside the button: quieter than the title it belongs to, and the
13093
+ * first thing to give up room when the row runs short.
13094
+ *
13095
+ * IT USED TO TAKE NONE. `flex: none` held a fact at its full width while the
13096
+ * title, which may shrink, was the only thing that could, so a long fact (a
13097
+ * log's replay mode, generation, range and size, beside a status badge in the
13098
+ * actions) took the whole trigger: the title shrank to nothing, so a row no
13099
+ * longer said which log it was, and the fact ran out of the button and under
13100
+ * the badge beside it.
13101
+ *
13102
+ * A HUNDRED TO THE TITLE'S ONE, as a card's subtitle gives way to its title:
13103
+ * two items that may shrink give up space in proportion to their widths, so
13104
+ * at that ratio the fact absorbs effectively all of it, and ends in an
13105
+ * ellipsis, before the title gives up a pixel. The fact is still the button's
13106
+ * name in full; only its drawing is cut.
13107
+ *
13108
+ * NEVER TO NOTHING. The floor is one glyph wide, because a fact is often a
13109
+ * mark (a failed call's glyph beside a tool's name), and a mark that shrank
13110
+ * to nothing would say nothing at all. A long fact keeps an ellipsis there,
13111
+ * which says a fact was cut. Once the fact is at its floor the title shrinks
13112
+ * and ends in its own ellipsis.
13113
+ */
12792
13114
  .crewlet-disclosure__meta {
12793
- flex: none;
13115
+ flex: 0 100 auto;
13116
+ min-width: 1.5em;
13117
+ overflow: hidden;
13118
+ text-overflow: ellipsis;
13119
+ white-space: nowrap;
12794
13120
  color: var(--color-text-tertiary);
12795
13121
  font-size: var(--font-size-xs);
12796
13122
  }
@@ -16410,7 +16736,7 @@ button.crewlet-finding-list__row:focus-visible {
16410
16736
  }
16411
16737
 
16412
16738
 
16413
- /* List-MYJIV6MP.css */
16739
+ /* List-YHLIZFK4.css */
16414
16740
  /*
16415
16741
  * The non-tabular list. One row recipe, four framings.
16416
16742
  *
@@ -16533,6 +16859,52 @@ button.crewlet-finding-list__row:focus-visible {
16533
16859
  padding-inline: 0;
16534
16860
  }
16535
16861
 
16862
+ /*
16863
+ * NUMBERED AND DIVIDED: the divided list's hairlines, with the number in a
16864
+ * column of its own rather than in the margin, so a statement that runs to a
16865
+ * second line wraps under its own first word and not under its number. The
16866
+ * row grows with its text (no row height), at the body's leading, and the
16867
+ * number stands on the first line's baseline.
16868
+ *
16869
+ * The number is the list's counter, drawn by the row. The `ol` already
16870
+ * announces each item's position, so the drawn figure is given empty
16871
+ * alternative text and is not read a second time.
16872
+ */
16873
+ .crewlet-list--numbered-divided {
16874
+ counter-reset: crewlet-list-item;
16875
+ }
16876
+
16877
+ .crewlet-list--numbered-divided .crewlet-list__item {
16878
+ counter-increment: crewlet-list-item;
16879
+ border-bottom: 1px solid var(--color-border-default);
16880
+ }
16881
+
16882
+ .crewlet-list--numbered-divided .crewlet-list__item:last-child {
16883
+ border-bottom: none;
16884
+ }
16885
+
16886
+ .crewlet-list--numbered-divided .crewlet-list__row {
16887
+ align-items: baseline;
16888
+ min-height: 0;
16889
+ /* At a card's own inset, since a card is where these stand: the numbers
16890
+ line up under the card head's glyph rather than 4px left of it. */
16891
+ padding: var(--spacing-3) var(--spacing-4);
16892
+ border-radius: 0;
16893
+ line-height: var(--font-line-height-body);
16894
+ }
16895
+
16896
+ .crewlet-list--numbered-divided .crewlet-list__row::before {
16897
+ content: counter(crewlet-list-item);
16898
+ content: counter(crewlet-list-item) / '';
16899
+ flex: none;
16900
+ min-width: 2ch;
16901
+ text-align: end;
16902
+ font-size: var(--font-size-xs);
16903
+ font-weight: var(--font-weight-medium);
16904
+ font-variant-numeric: tabular-nums;
16905
+ color: var(--color-text-tertiary);
16906
+ }
16907
+
16536
16908
  /* ---- States ------------------------------------------------------------ */
16537
16909
 
16538
16910
  /*
@@ -17729,7 +18101,7 @@ button.crewlet-finding-list__row:focus-visible {
17729
18101
  }
17730
18102
 
17731
18103
 
17732
- /* Modal-7MWRCWAI.css */
18104
+ /* Modal-TOEWHDCQ.css */
17733
18105
  /*
17734
18106
  * The modal surface: the veil, the frame, and the three bands inside it.
17735
18107
  *
@@ -18111,6 +18483,11 @@ button.crewlet-finding-list__row:focus-visible {
18111
18483
  */
18112
18484
  .crewlet-modal__title {
18113
18485
  margin: 0;
18486
+ /* The text face at its own tracking, never the display face every heading
18487
+ element takes from the baseline: the title is an h1 for the outline, at
18488
+ the dialog's own register. */
18489
+ font-family: var(--font-family-sans);
18490
+ letter-spacing: var(--font-letter-spacing-normal);
18114
18491
  font-size: var(--font-size-sm);
18115
18492
  font-weight: var(--font-weight-semibold);
18116
18493
  line-height: var(--font-line-height-tight);
@@ -18463,9 +18840,14 @@ button.crewlet-finding-list__row:focus-visible {
18463
18840
  }
18464
18841
 
18465
18842
 
18466
- /* ObjectHeader-D7GU7QNI.css */
18843
+ /* ObjectHeader-ZOS22FKX.css */
18467
18844
  /*
18468
18845
  * The header of an object: its eyebrow, its head row and its fact line.
18846
+ *
18847
+ * SENTENCE CASE, both the eyebrow and the fact labels, as `StatCard`'s label
18848
+ * is: the uppercase, tracked-open micro-caps are a table's column head, and
18849
+ * over an object's name ("UNIT", then TYPE, LEAD and SEATS under it) they put
18850
+ * a heading on every fact and read as a form rather than a record.
18469
18851
  */
18470
18852
  .crewlet-object-header {
18471
18853
  display: flex;
@@ -18484,9 +18866,7 @@ button.crewlet-finding-list__row:focus-visible {
18484
18866
  align-items: center;
18485
18867
  gap: var(--spacing-2);
18486
18868
  min-width: 0;
18487
- font-size: var(--font-size-2xs);
18488
- letter-spacing: var(--font-letter-spacing-wide);
18489
- text-transform: uppercase;
18869
+ font-size: var(--font-size-xs);
18490
18870
  color: var(--color-text-tertiary);
18491
18871
  }
18492
18872
 
@@ -18501,8 +18881,6 @@ button.crewlet-finding-list__row:focus-visible {
18501
18881
  overflow: hidden;
18502
18882
  text-overflow: ellipsis;
18503
18883
  white-space: nowrap;
18504
- letter-spacing: normal;
18505
- text-transform: none;
18506
18884
  }
18507
18885
 
18508
18886
  .crewlet-object-header__id--mono {
@@ -18604,9 +18982,7 @@ button.crewlet-finding-list__row:focus-visible {
18604
18982
  }
18605
18983
 
18606
18984
  .crewlet-fact-line__label {
18607
- font-size: var(--font-size-2xs);
18608
- letter-spacing: var(--font-letter-spacing-wide);
18609
- text-transform: uppercase;
18985
+ font-size: var(--font-size-xs);
18610
18986
  color: var(--color-text-tertiary);
18611
18987
  }
18612
18988
 
@@ -22746,6 +23122,169 @@ svg.crewlet-select__chevron {
22746
23122
  }
22747
23123
 
22748
23124
 
23125
+ /* SettingsTable-6DUFAFXG.css */
23126
+ /*
23127
+ * SettingsTable: a read-only table of settings, one row each, on one grid.
23128
+ *
23129
+ * THE TRACKS ARE FRACTIONS OF THE TABLE, so every table of one width shares
23130
+ * them: a page that stacks a table per group puts each column on one line
23131
+ * down the page with nothing to coordinate. `--crewlet-settings-table-columns`
23132
+ * is inherited, so a page that wants other proportions sets it once.
23133
+ *
23134
+ * Each row is its own grid on those tracks rather than a subgrid of the
23135
+ * table's, because the tracks are fractions: one row's long label can never
23136
+ * move another row's value, which is what a content-sized track would do.
23137
+ */
23138
+
23139
+ .crewlet-settings-table {
23140
+ container: crewlet-settings-table / inline-size;
23141
+ display: flex;
23142
+ flex-direction: column;
23143
+ min-width: 0;
23144
+ font-size: var(--font-size-compact);
23145
+ /* The flush-panel recipe, standing on its own: the card's surface, its
23146
+ hairline and its corner. Inside a card it gives them up (below). */
23147
+ background: var(--color-surface-subtle);
23148
+ border: 1px solid var(--color-border-default);
23149
+ border-radius: var(--radius-lg);
23150
+ overflow: hidden;
23151
+ }
23152
+
23153
+ /*
23154
+ * A TABLE THAT IS A CARD'S CONTENT IS THAT CARD'S TABLE. It draws no edge or
23155
+ * corner of its own inside one, so a card never holds a box inside a box; its
23156
+ * rows' hairlines run to the card's edges under the card's own head rule.
23157
+ */
23158
+ .crewlet-card > .crewlet-settings-table,
23159
+ .crewlet-card__body > .crewlet-settings-table {
23160
+ background: transparent;
23161
+ border: 0;
23162
+ border-radius: var(--radius-none);
23163
+ }
23164
+
23165
+ .crewlet-settings-table__row {
23166
+ display: grid;
23167
+ grid-template-columns: var(
23168
+ --crewlet-settings-table-columns,
23169
+ minmax(0, 5fr) minmax(0, 3fr) minmax(0, 2fr)
23170
+ );
23171
+ column-gap: var(--spacing-6);
23172
+ /* ONE BASELINE PER ROW: the name, the value and the source sit on the
23173
+ first line's baseline, whatever the name's key adds under it. */
23174
+ align-items: baseline;
23175
+ min-height: var(--size-row-md);
23176
+ padding: var(--spacing-3) var(--spacing-4);
23177
+ }
23178
+
23179
+ .crewlet-settings-table__body > .crewlet-settings-table__row + .crewlet-settings-table__row {
23180
+ border-top: 1px solid var(--color-border-default);
23181
+ }
23182
+
23183
+ /*
23184
+ * The column names, in the micro-label register a table's header takes
23185
+ * across the system, on the panel's own ground. Hidden by default (see the
23186
+ * component): still the table's column headers for assistive technology.
23187
+ */
23188
+ .crewlet-settings-table__head .crewlet-settings-table__row {
23189
+ min-height: 0;
23190
+ padding-block: var(--spacing-2);
23191
+ border-bottom: 1px solid var(--color-border-default);
23192
+ }
23193
+
23194
+ .crewlet-settings-table__name {
23195
+ font-size: var(--font-size-2xs);
23196
+ font-weight: var(--font-weight-medium);
23197
+ letter-spacing: var(--font-letter-spacing-wide);
23198
+ text-transform: uppercase;
23199
+ color: var(--color-text-tertiary);
23200
+ white-space: nowrap;
23201
+ }
23202
+
23203
+ .crewlet-settings-table__head--hidden {
23204
+ position: absolute;
23205
+ width: 1px;
23206
+ height: 1px;
23207
+ margin: -1px;
23208
+ padding: 0;
23209
+ border: 0;
23210
+ overflow: hidden;
23211
+ clip-path: inset(50%);
23212
+ white-space: nowrap;
23213
+ }
23214
+
23215
+ .crewlet-settings-table__setting {
23216
+ display: flex;
23217
+ flex-direction: column;
23218
+ gap: var(--spacing-1);
23219
+ min-width: 0;
23220
+ }
23221
+
23222
+ .crewlet-settings-table__label {
23223
+ color: var(--color-text-primary);
23224
+ line-height: var(--font-line-height-snug);
23225
+ }
23226
+
23227
+ /*
23228
+ * THE KEY IS FOR THE READER WHO WILL GO AND CHANGE IT, so it is there and
23229
+ * quiet: the monospace face at the smallest step, in the tertiary ink, and
23230
+ * free to break anywhere, since a dotted path is one word to a line breaker.
23231
+ */
23232
+ .crewlet-settings-table__key {
23233
+ font-family: var(--font-family-mono);
23234
+ font-size: var(--font-size-2xs);
23235
+ line-height: var(--font-line-height-snug);
23236
+ color: var(--color-text-tertiary);
23237
+ overflow-wrap: anywhere;
23238
+ }
23239
+
23240
+ /* Tabular figures, so a column of numbers reads down its digits. */
23241
+ .crewlet-settings-table__value {
23242
+ min-width: 0;
23243
+ color: var(--color-text-primary);
23244
+ font-weight: var(--font-weight-medium);
23245
+ font-variant-numeric: tabular-nums;
23246
+ overflow-wrap: anywhere;
23247
+ }
23248
+
23249
+ .crewlet-settings-table__source {
23250
+ display: inline-flex;
23251
+ align-items: baseline;
23252
+ gap: var(--spacing-2);
23253
+ min-width: 0;
23254
+ font-size: var(--font-size-xs);
23255
+ color: var(--color-text-tertiary);
23256
+ }
23257
+
23258
+ /* A value that differs from its default is the row a reader came to find. */
23259
+ .crewlet-settings-table__source--changed {
23260
+ color: var(--color-text-secondary);
23261
+ }
23262
+
23263
+ .crewlet-settings-table__source--changed .crewlet-status-dot {
23264
+ align-self: center;
23265
+ }
23266
+
23267
+ /*
23268
+ * NARROW: the name takes the row's first line, and the value and its source
23269
+ * share the second. Three columns at this width leave a name column a word
23270
+ * wide, which wraps every name into a stack of single words.
23271
+ */
23272
+ @container crewlet-settings-table (width < 32rem) {
23273
+ .crewlet-settings-table__row {
23274
+ grid-template-columns: minmax(0, 1fr) auto;
23275
+ row-gap: var(--spacing-1);
23276
+ }
23277
+
23278
+ .crewlet-settings-table__setting {
23279
+ grid-column: 1 / -1;
23280
+ }
23281
+
23282
+ .crewlet-settings-table__source {
23283
+ justify-self: end;
23284
+ }
23285
+ }
23286
+
23287
+
22749
23288
  /* ShareDialog-4QDCBWMH.css */
22750
23289
  /*
22751
23290
  * Three blocks under the title: who to add and at what role, who has access,
@@ -25456,7 +25995,7 @@ svg.crewlet-select__chevron {
25456
25995
  }
25457
25996
 
25458
25997
 
25459
- /* StatCard-4T7TMWMN.css */
25998
+ /* StatCard-HAA3F5GX.css */
25460
25999
  /*
25461
26000
  * The stat tile.
25462
26001
  *
@@ -25645,6 +26184,12 @@ svg.crewlet-select__chevron {
25645
26184
  * tiles where only some carry one still stands at one height: its leading is
25646
26185
  * set here and the reserve is exactly one line of it, where a reserve in `em`
25647
26186
  * was a line shorter than the one a sub actually draws.
26187
+ *
26188
+ * IT WRAPS, balanced, rather than ending in an ellipsis. The line qualifies
26189
+ * the number, so its end is the half that says what the number means, and
26190
+ * `nowrap` cut it: "6 seats idle and waiting for ..." on a phone, a caption
26191
+ * mid-clause at 1440. A grid of tiles (a StatGroup, or a caller's own) gives
26192
+ * every tile in a row one height, so a second line costs no alignment.
25648
26193
  */
25649
26194
  .crewlet-statcard__sub {
25650
26195
  min-height: calc(1em * var(--font-line-height-body));
@@ -25653,9 +26198,8 @@ svg.crewlet-select__chevron {
25653
26198
  /* The quiet step, with the label. The line qualifies the number rather than
25654
26199
  being a second one. */
25655
26200
  color: var(--color-text-tertiary);
25656
- overflow: hidden;
25657
- text-overflow: ellipsis;
25658
- white-space: nowrap;
26201
+ overflow-wrap: anywhere;
26202
+ text-wrap: balance;
25659
26203
  }
25660
26204
 
25661
26205
  /*
@@ -25690,7 +26234,7 @@ svg.crewlet-select__chevron {
25690
26234
  .crewlet-statcard--info .crewlet-statcard__value { color: var(--color-feedback-info-ink); }
25691
26235
 
25692
26236
 
25693
- /* StatGroup-PADTJCUQ.css */
26237
+ /* StatGroup-ZMW7VQWP.css */
25694
26238
  /*
25695
26239
  * A row of stat tiles.
25696
26240
  *
@@ -25698,11 +26242,29 @@ svg.crewlet-select__chevron {
25698
26242
  * tiles appeared and vanished moved every number on the page for a reason that
25699
26243
  * had nothing to do with the numbers, which is exactly what a reader watching
25700
26244
  * a live board is trying not to have happen.
26245
+ *
26246
+ * IT FOLDS BY ITS OWN WIDTH, never the window's. The row used to drop to two
26247
+ * columns under a 1024px viewport, but a row's width is whatever its column
26248
+ * leaves it: beside the rail and a settings column at exactly 1024 a
26249
+ * four-column row was 489px wide, its tiles about 120px each, and its figures
26250
+ * were cut ("Not s…", "1.6 …"), while on a phone a three-column row folded to
26251
+ * two and left its third tile alone on a row of its own. So the row is a size
26252
+ * container, and the tiles take their place from the row's own width.
26253
+ *
26254
+ * TWELVE TRACKS, AND EACH TILE SPANS ITS SHARE. A container query styles what
26255
+ * is inside the container, never the container itself, so the row cannot
26256
+ * change its own column count by its own width. Its tiles can change how many
26257
+ * of its twelve tracks they span, which is the same layout: twelve divides by
26258
+ * every count a row takes (one, two, three and four a row).
26259
+ *
26260
+ * The row's width comes from where it stands, as a block's does: inline-size
26261
+ * containment means its contents never widen it.
25701
26262
  */
25702
26263
 
25703
26264
  .crewlet-stat-group {
26265
+ container: crewlet-stat-group / inline-size;
25704
26266
  display: grid;
25705
- grid-template-columns: repeat(var(--crewlet-stat-group-cols, 4), minmax(0, 1fr));
26267
+ grid-template-columns: repeat(12, minmax(0, 1fr));
25706
26268
  /* The flush-panel recipe: the card's surface, its hairline and its 12px
25707
26269
  corner, flat as every card is, and `overflow: hidden`, which is what lets
25708
26270
  the tiles inside sit against the corners without their own hairlines
@@ -25713,8 +26275,19 @@ svg.crewlet-select__chevron {
25713
26275
  overflow: hidden;
25714
26276
  }
25715
26277
 
25716
- /* Inside another card: the card's surface and edge are the row's. */
25717
- .crewlet-stat-group--flush {
26278
+ /*
26279
+ * Inside another card: the card's surface and edge are the row's.
26280
+ *
26281
+ * A ROW STANDING IN A CARD IS FLUSH WHETHER OR NOT ITS CALLER SAID SO. Six
26282
+ * settings pages wrapped a row in a card without `flush`, and each drew the
26283
+ * row's own edge and 12px corner one pixel inside the card's: a box inside a
26284
+ * box, and inside a padded body a third frame. A row that is a card's content,
26285
+ * or its body's, is that card's row; `flush` is for a host that is not a
26286
+ * Card (a widget's frame, a panel of an application's own).
26287
+ */
26288
+ .crewlet-stat-group--flush,
26289
+ .crewlet-card > .crewlet-stat-group,
26290
+ .crewlet-card__body > .crewlet-stat-group {
25718
26291
  background: transparent;
25719
26292
  border: 0;
25720
26293
  border-radius: var(--radius-none);
@@ -25740,40 +26313,120 @@ svg.crewlet-select__chevron {
25740
26313
  }
25741
26314
 
25742
26315
  /*
25743
- * A hairline between columns, drawn on the tile that follows one.
26316
+ * A ROW OF TILES SHARES ITS LINES. A tile stacks its label, its number and its
26317
+ * sub in a column of its own, so a label that wrapped pushed its own number
26318
+ * down and no other: beside a node's peek at 1440, "Behind on config" broke
26319
+ * over two lines and its figure sat 18px below the other three. Inside a row
26320
+ * each tile is a SUBGRID over the row's lines, one per line the tile renders
26321
+ * (StatCard always renders three, an absent sub included), so a line is as
26322
+ * tall as the tallest of it across the row and every figure starts together.
26323
+ *
26324
+ * A LABEL SITS ON ITS NUMBER: where one label in the row takes two lines, the
26325
+ * others end at the foot of the label row, one gap above their figure, rather
26326
+ * than floating at its top a line away from what they name.
26327
+ *
26328
+ * These were the engine dashboard's own rules over this component, held there
26329
+ * with a note that the kit should carry them; they are the kit's now, with the
26330
+ * sub's wrap (see StatCard), which the engine applied to every tile.
26331
+ */
26332
+ .crewlet-stat-group > .crewlet-statcard {
26333
+ display: grid;
26334
+ grid-template-rows: subgrid;
26335
+ grid-row: span 3;
26336
+ }
26337
+
26338
+ .crewlet-stat-group > .crewlet-statcard > .crewlet-statcard__label {
26339
+ align-self: end;
26340
+ }
26341
+
26342
+ /*
26343
+ * Each tile spans its share of the twelve tracks: the row's `columns`, set on
26344
+ * it as `--crewlet-stat-group-cols`, a row.
26345
+ */
26346
+ .crewlet-stat-group > * {
26347
+ grid-column: span calc(12 / var(--crewlet-stat-group-cols, 4));
26348
+ }
26349
+
26350
+ /*
26351
+ * The hairlines between tiles: one before every tile that does not start a
26352
+ * row, and one above every tile that is not on the first.
25744
26353
  *
25745
26354
  * NAMED TWICE, ON PURPOSE. The rule above clears the tile's own border and
25746
26355
  * weighs two classes, so a one-class selector here loses to it and the row
25747
26356
  * of numbers runs together with nothing between the columns. The first
25748
- * selector matches whatever a caller puts in the row; the second weighs the
25749
- * same as the rule it has to beat, and sits after it.
26357
+ * selector of each pair matches whatever a caller puts in the row; the second
26358
+ * weighs at least as much as the rule it has to beat, and sits after it.
25750
26359
  */
25751
26360
  .crewlet-stat-group > * + *,
25752
26361
  .crewlet-stat-group > .crewlet-statcard + .crewlet-statcard {
25753
26362
  border-left: 1px solid var(--color-border-default);
25754
26363
  }
25755
26364
 
26365
+ .crewlet-stat-group[data-columns='2'] > :nth-child(2n + 1),
26366
+ .crewlet-stat-group[data-columns='2'] > .crewlet-statcard:nth-child(2n + 1),
26367
+ .crewlet-stat-group[data-columns='3'] > :nth-child(3n + 1),
26368
+ .crewlet-stat-group[data-columns='3'] > .crewlet-statcard:nth-child(3n + 1),
26369
+ .crewlet-stat-group[data-columns='4'] > :nth-child(4n + 1),
26370
+ .crewlet-stat-group[data-columns='4'] > .crewlet-statcard:nth-child(4n + 1) {
26371
+ border-left: 0;
26372
+ }
26373
+
26374
+ .crewlet-stat-group[data-columns='2'] > :nth-child(n + 3),
26375
+ .crewlet-stat-group[data-columns='2'] > .crewlet-statcard:nth-child(n + 3),
26376
+ .crewlet-stat-group[data-columns='3'] > :nth-child(n + 4),
26377
+ .crewlet-stat-group[data-columns='3'] > .crewlet-statcard:nth-child(n + 4),
26378
+ .crewlet-stat-group[data-columns='4'] > :nth-child(n + 5),
26379
+ .crewlet-stat-group[data-columns='4'] > .crewlet-statcard:nth-child(n + 5) {
26380
+ border-top: 1px solid var(--color-border-default);
26381
+ }
26382
+
25756
26383
  /*
25757
- * Two columns under the shell breakpoint, which is where the engine drops its
25758
- * own stat row, and strictly under it, as the shell switches. The step is
25759
- * 1024px, a 236px rail, the 8px inset and a 780px floor for the sheet, and it
25760
- * is the width at which the shell stops holding the page beside the rail. The
25761
- * rules are written for the general case rather than per column count: the
25762
- * first tile of each pair loses its left hairline, and everything on the
25763
- * second row and below gains a top one.
26384
+ * FOUR A ROW FOLD TO TWO under 640px of row (the phone breakpoint's number):
26385
+ * four tiles of 160px is the narrowest at which a six-character figure and a
26386
+ * two-word label still stand on one line each. Two by two keeps every row
26387
+ * full.
25764
26388
  */
25765
- @media (width < 1024px) {
25766
- .crewlet-stat-group {
25767
- grid-template-columns: repeat(2, minmax(0, 1fr));
26389
+ @container crewlet-stat-group (width < 640px) {
26390
+ .crewlet-stat-group[data-columns='4'] > *,
26391
+ .crewlet-stat-group[data-columns='4'] > .crewlet-statcard {
26392
+ grid-column: span 6;
25768
26393
  }
25769
26394
 
25770
- .crewlet-stat-group > *:nth-child(odd),
25771
- .crewlet-stat-group > .crewlet-statcard:nth-child(odd) {
26395
+ .crewlet-stat-group[data-columns='4'] > :nth-child(odd),
26396
+ .crewlet-stat-group[data-columns='4'] > .crewlet-statcard:nth-child(odd) {
25772
26397
  border-left: 0;
25773
26398
  }
25774
26399
 
25775
- .crewlet-stat-group > *:nth-child(n + 3),
25776
- .crewlet-stat-group > .crewlet-statcard:nth-child(n + 3) {
26400
+ .crewlet-stat-group[data-columns='4'] > :nth-child(even),
26401
+ .crewlet-stat-group[data-columns='4'] > .crewlet-statcard:nth-child(even) {
26402
+ border-left: 1px solid var(--color-border-default);
26403
+ }
26404
+
26405
+ .crewlet-stat-group[data-columns='4'] > :nth-child(n + 3),
26406
+ .crewlet-stat-group[data-columns='4'] > .crewlet-statcard:nth-child(n + 3) {
26407
+ border-top: 1px solid var(--color-border-default);
26408
+ }
26409
+ }
26410
+
26411
+ /*
26412
+ * THREE A ROW STACK under 480px of row (the small breakpoint's number), at the
26413
+ * same 160px a tile. Folded to two, three tiles stood two and one, the last
26414
+ * alone at double width and a different height, which read as a tile that had
26415
+ * failed to load; one a row leaves no row short.
26416
+ */
26417
+ @container crewlet-stat-group (width < 480px) {
26418
+ .crewlet-stat-group[data-columns='3'] > *,
26419
+ .crewlet-stat-group[data-columns='3'] > .crewlet-statcard {
26420
+ grid-column: span 12;
26421
+ }
26422
+
26423
+ .crewlet-stat-group[data-columns='3'] > *,
26424
+ .crewlet-stat-group[data-columns='3'] > .crewlet-statcard + .crewlet-statcard {
26425
+ border-left: 0;
26426
+ }
26427
+
26428
+ .crewlet-stat-group[data-columns='3'] > :nth-child(n + 2),
26429
+ .crewlet-stat-group[data-columns='3'] > .crewlet-statcard:nth-child(n + 2) {
25777
26430
  border-top: 1px solid var(--color-border-default);
25778
26431
  }
25779
26432
  }
@@ -27405,7 +28058,7 @@ b.crewlet-switcher__match {
27405
28058
  }
27406
28059
 
27407
28060
 
27408
- /* Tag-SRGTK5KI.css */
28061
+ /* Tag-2DQOVE6W.css */
27409
28062
  /*
27410
28063
  * The tag: a small pill naming a state, a category or a value.
27411
28064
  *
@@ -27685,12 +28338,22 @@ b.crewlet-switcher__match {
27685
28338
  --crewlet-tag-line: var(--color-border-strong-hover);
27686
28339
  }
27687
28340
 
27688
- /* The neutral outline is the engine's `.badge.outline`: the hairline step as
27689
- the boundary, and the tertiary ink, which is a quieter register than the
27690
- tinted outlines keep. It is the appearance for a value that is not a state
27691
- at all, so it says less than its neighbours on purpose. */
28341
+ /*
28342
+ * The neutral outline: the neutral pill's own boundary with no fill, and the
28343
+ * tertiary ink, which is a quieter register than the tinted outlines keep. It
28344
+ * is the appearance for a value that is not a state at all, so it says less
28345
+ * than its neighbours on purpose, by its ink and its empty ground.
28346
+ *
28347
+ * NOT BY A FAINTER EDGE. It used to take the plain hairline, the line that
28348
+ * finds a card, and on the card it so often stands on that line measured
28349
+ * 1.07:1 in dark: Limits' "Off" beside a filled "Default", an audit row's
28350
+ * machine and open, a tool's "builtin", all read as loose words rather than
28351
+ * as pills. The strong step is the edge the neutral soft pill already draws
28352
+ * (1.49:1 dark, 1.52:1 light on the card), so the two neutral pills differ by
28353
+ * their fill alone and both read as pills.
28354
+ */
27692
28355
  .crewlet-tag--neutral.crewlet-tag--outline {
27693
- border-color: var(--color-border-default);
28356
+ border-color: var(--color-border-strong);
27694
28357
  --crewlet-tag-ink: var(--color-text-tertiary);
27695
28358
  }
27696
28359
 
@@ -28714,6 +29377,61 @@ b.crewlet-switcher__match {
28714
29377
  }
28715
29378
 
28716
29379
 
29380
+ /* TileGrid-I6LNYD2H.css */
29381
+ /*
29382
+ * TileGrid: tiles on a fixed track count that folds by the grid's own width.
29383
+ *
29384
+ * Equal tracks, so two grids of one count and one width put every tile edge
29385
+ * on the same line; the tiles in a row stretch to the tallest of them. The
29386
+ * folds are steps of the grid's own width (see the component): three tracks
29387
+ * go straight to one, so a set of three never strands a tile.
29388
+ */
29389
+
29390
+ .crewlet-tile-grid {
29391
+ container: crewlet-tile-grid / inline-size;
29392
+ min-width: 0;
29393
+ }
29394
+
29395
+ .crewlet-tile-grid__track {
29396
+ --crewlet-tile-grid-tracks: 3;
29397
+
29398
+ display: grid;
29399
+ grid-template-columns: repeat(var(--crewlet-tile-grid-tracks), minmax(0, 1fr));
29400
+ gap: var(--spacing-3);
29401
+ margin: 0;
29402
+ padding: 0;
29403
+ list-style: none;
29404
+ }
29405
+
29406
+ .crewlet-tile-grid[data-columns='2'] > .crewlet-tile-grid__track {
29407
+ --crewlet-tile-grid-tracks: 2;
29408
+ }
29409
+
29410
+ .crewlet-tile-grid[data-columns='4'] > .crewlet-tile-grid__track {
29411
+ --crewlet-tile-grid-tracks: 4;
29412
+ }
29413
+
29414
+ /* Four tracks fold to two where a tile would be narrower than its content. */
29415
+ @container crewlet-tile-grid (width < 56rem) {
29416
+ .crewlet-tile-grid[data-columns='4'] > .crewlet-tile-grid__track {
29417
+ --crewlet-tile-grid-tracks: 2;
29418
+ }
29419
+ }
29420
+
29421
+ /* Three fold to one: two up would leave the third tile alone on a row. */
29422
+ @container crewlet-tile-grid (width < 40rem) {
29423
+ .crewlet-tile-grid[data-columns='3'] > .crewlet-tile-grid__track {
29424
+ --crewlet-tile-grid-tracks: 1;
29425
+ }
29426
+ }
29427
+
29428
+ @container crewlet-tile-grid (width < 28rem) {
29429
+ .crewlet-tile-grid > .crewlet-tile-grid__track {
29430
+ --crewlet-tile-grid-tracks: 1;
29431
+ }
29432
+ }
29433
+
29434
+
28717
29435
  /* TimeWindowPicker-I3HXC74I.css */
28718
29436
  /*
28719
29437
  * TimeWindowPicker: one trigger over one panel.