@crewlethq/ui 0.38.0 → 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 (78) hide show
  1. package/README.md +36 -2
  2. package/dist/AgentHandoffPanel/index.js +3 -3
  3. package/dist/ArtifactBar/index.js +1 -1
  4. package/dist/{ArtifactBar-FWPBBKQ5.css → ArtifactBar-6PGWGKN2.css} +13 -1
  5. package/dist/ArtifactCard/index.js +2 -2
  6. package/dist/AuthLayout/index.js +2 -2
  7. package/dist/Card/Card.d.ts +14 -2
  8. package/dist/Card/index.js +1 -1
  9. package/dist/{Card-G2ZGT5Z6.css → Card-JR2UPQH7.css} +20 -0
  10. package/dist/CatalogTile/CatalogTile.d.ts +47 -0
  11. package/dist/CatalogTile/index.d.ts +3 -0
  12. package/dist/CatalogTile/index.js +3 -0
  13. package/dist/CatalogTile-TGR2ZZVQ.css +131 -0
  14. package/dist/CodeBlock/index.js +1 -1
  15. package/dist/{CodeBlock-GYNJ2HI6.css → CodeBlock-N5ETJF24.css} +13 -0
  16. package/dist/CommandPalette/index.js +3 -3
  17. package/dist/CommentThread/index.js +3 -3
  18. package/dist/Composer/index.js +2 -2
  19. package/dist/DataTable/index.js +2 -2
  20. package/dist/DataView/index.js +4 -4
  21. package/dist/DatasetSource/DatasetSource.d.ts +7 -1
  22. package/dist/DatasetSource/index.js +1 -1
  23. package/dist/LinkInterstitial/index.js +2 -2
  24. package/dist/List/List.d.ts +8 -0
  25. package/dist/List/index.js +1 -1
  26. package/dist/{List-MYJIV6MP.css → List-YHLIZFK4.css} +46 -0
  27. package/dist/ListInput/ListInput.d.ts +9 -1
  28. package/dist/ListInput/index.js +2 -2
  29. package/dist/Modal/index.js +1 -1
  30. package/dist/{Modal-7MWRCWAI.css → Modal-TOEWHDCQ.css} +5 -0
  31. package/dist/ObjectHeader/index.js +1 -1
  32. package/dist/{ObjectHeader-D7GU7QNI.css → ObjectHeader-ZOS22FKX.css} +7 -8
  33. package/dist/SettingsTable/SettingsTable.d.ts +66 -0
  34. package/dist/SettingsTable/index.d.ts +3 -0
  35. package/dist/SettingsTable/index.js +3 -0
  36. package/dist/SettingsTable-6DUFAFXG.css +160 -0
  37. package/dist/ShareDialog/index.js +2 -2
  38. package/dist/SheetColumnEditor/index.js +3 -3
  39. package/dist/StatCard/index.js +1 -1
  40. package/dist/{StatCard-4T7TMWMN.css → StatCard-HAA3F5GX.css} +8 -3
  41. package/dist/StatGroup/index.js +1 -1
  42. package/dist/{StatGroup-DOFHX5QJ.css → StatGroup-ZMW7VQWP.css} +27 -0
  43. package/dist/Switcher/index.js +2 -2
  44. package/dist/TileGrid/TileGrid.d.ts +33 -0
  45. package/dist/TileGrid/index.d.ts +3 -0
  46. package/dist/TileGrid/index.js +2 -0
  47. package/dist/TileGrid-I6LNYD2H.css +52 -0
  48. package/dist/{chunk-XBURIXHO.js → chunk-3TXY3PJZ.js} +1 -1
  49. package/dist/chunk-4RKTZSEW.js +64 -0
  50. package/dist/{chunk-A23KDROH.js → chunk-FXBGEANQ.js} +1 -1
  51. package/dist/{chunk-IPWU6ERC.js → chunk-HQJ24WPM.js} +4 -2
  52. package/dist/{chunk-SVGARBDY.js → chunk-IAGYPTEJ.js} +2 -2
  53. package/dist/{chunk-ZK3VYY7L.js → chunk-INHXF2CL.js} +24 -11
  54. package/dist/{chunk-6NNY5WBF.js → chunk-JKAGN4V4.js} +1 -1
  55. package/dist/{chunk-UWRBD2YO.js → chunk-KNHUBHFX.js} +1 -1
  56. package/dist/{chunk-PT6WKXKW.js → chunk-MMPKN7WV.js} +1 -1
  57. package/dist/{chunk-NRBAXRWE.js → chunk-N3TFYBN3.js} +1 -1
  58. package/dist/chunk-NNTO3TNC.js +9 -0
  59. package/dist/{chunk-DS2C73RJ.js → chunk-NZWX27J7.js} +2 -2
  60. package/dist/{chunk-VGE3G3T4.js → chunk-ODOJJGXH.js} +1 -1
  61. package/dist/{chunk-BT5H2THK.js → chunk-OUD75UB2.js} +1 -1
  62. package/dist/{chunk-YQG4PZGC.js → chunk-QRKT4XTT.js} +2 -2
  63. package/dist/{chunk-BJI3RFXG.js → chunk-S4DREXGM.js} +1 -1
  64. package/dist/{chunk-GDDE4UM7.js → chunk-SEC2GR2V.js} +1 -1
  65. package/dist/{chunk-S27UBCVX.js → chunk-TZYFTC4M.js} +1 -1
  66. package/dist/{chunk-OTCXRJ7D.js → chunk-U2XAJONO.js} +1 -1
  67. package/dist/{chunk-3ZUINC7C.js → chunk-WYYCPV46.js} +6 -1
  68. package/dist/{chunk-PAQXOP2M.js → chunk-XGBUUQDU.js} +2 -2
  69. package/dist/chunk-XNXK5MA4.js +48 -0
  70. package/dist/{chunk-XO7PUL4F.js → chunk-YPTTSJPM.js} +1 -1
  71. package/dist/generated/index.d.ts +3 -0
  72. package/dist/generated/index.js +60 -57
  73. package/dist/index.js +60 -57
  74. package/dist/styles.css +499 -20
  75. package/package.json +3 -3
  76. package/dist/{chunk-4L2BWSHR.js → chunk-F3WZ5AKM.js} +1 -1
  77. package/dist/{chunk-ETVEGR2Y.js → chunk-ISA2O2BK.js} +1 -1
  78. /package/dist/{chunk-4QQ3MND5.js → chunk-QRLIWCLX.js} +0 -0
package/dist/styles.css CHANGED
@@ -2291,7 +2291,7 @@ button.crewlet-account-row__who:focus-visible {
2291
2291
  }
2292
2292
 
2293
2293
 
2294
- /* ArtifactBar-FWPBBKQ5.css */
2294
+ /* ArtifactBar-6PGWGKN2.css */
2295
2295
  /*
2296
2296
  * One row, one hairline under it, the height of a large row. The lead (the
2297
2297
  * way back, the glyph, the title, the version) takes what the end leaves it
@@ -2323,7 +2323,12 @@ button.crewlet-account-row__who:focus-visible {
2323
2323
  its place, and at a row's height of its own the line under it jumped by
2324
2324
  three pixels between the gallery and the artifact opened from it. */
2325
2325
  height: calc(var(--size-shell-topbar) - 1px);
2326
- 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);
2327
2332
  min-width: 0;
2328
2333
  }
2329
2334
 
@@ -2708,6 +2713,13 @@ button.crewlet-account-row__who:focus-visible {
2708
2713
  }
2709
2714
  }
2710
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
+
2711
2723
 
2712
2724
  /* ArtifactCard-OGTMO2KI.css */
2713
2725
  /*
@@ -6266,7 +6278,7 @@ a.crewlet-breadcrumb__crumb:focus-visible {
6266
6278
  }
6267
6279
 
6268
6280
 
6269
- /* Card-G2ZGT5Z6.css */
6281
+ /* Card-JR2UPQH7.css */
6270
6282
  /*
6271
6283
  * Card, THE surface. Everything on a screen is a card, a row inside one, or a
6272
6284
  * control.
@@ -6764,6 +6776,26 @@ a.crewlet-breadcrumb__crumb:focus-visible {
6764
6776
  }
6765
6777
  }
6766
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
+
6767
6799
  .crewlet-card__description {
6768
6800
  margin: 0;
6769
6801
  font-size: var(--font-size-compact);
@@ -6778,6 +6810,140 @@ a.crewlet-breadcrumb__crumb:focus-visible {
6778
6810
  }
6779
6811
 
6780
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
+
6781
6947
  /* ChangeMark-3VMTW7MT.css */
6782
6948
  /*
6783
6949
  * A change mark (ChangeMark.tsx): a notch in the top end corner of whatever
@@ -8340,7 +8506,7 @@ a.crewlet-breadcrumb__crumb:focus-visible {
8340
8506
  }
8341
8507
 
8342
8508
 
8343
- /* CodeBlock-GYNJ2HI6.css */
8509
+ /* CodeBlock-N5ETJF24.css */
8344
8510
  /*
8345
8511
  * CodeBlock, a monospace command, config or record surface. One step off the
8346
8512
  * page, with an optional header carrying a filename and the copy control.
@@ -8359,6 +8525,19 @@ a.crewlet-breadcrumb__crumb:focus-visible {
8359
8525
  min-width: 0;
8360
8526
  }
8361
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
+
8362
8541
  .crewlet-codeblock__header {
8363
8542
  display: flex;
8364
8543
  align-items: center;
@@ -16557,7 +16736,7 @@ button.crewlet-finding-list__row:focus-visible {
16557
16736
  }
16558
16737
 
16559
16738
 
16560
- /* List-MYJIV6MP.css */
16739
+ /* List-YHLIZFK4.css */
16561
16740
  /*
16562
16741
  * The non-tabular list. One row recipe, four framings.
16563
16742
  *
@@ -16680,6 +16859,52 @@ button.crewlet-finding-list__row:focus-visible {
16680
16859
  padding-inline: 0;
16681
16860
  }
16682
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
+
16683
16908
  /* ---- States ------------------------------------------------------------ */
16684
16909
 
16685
16910
  /*
@@ -17876,7 +18101,7 @@ button.crewlet-finding-list__row:focus-visible {
17876
18101
  }
17877
18102
 
17878
18103
 
17879
- /* Modal-7MWRCWAI.css */
18104
+ /* Modal-TOEWHDCQ.css */
17880
18105
  /*
17881
18106
  * The modal surface: the veil, the frame, and the three bands inside it.
17882
18107
  *
@@ -18258,6 +18483,11 @@ button.crewlet-finding-list__row:focus-visible {
18258
18483
  */
18259
18484
  .crewlet-modal__title {
18260
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);
18261
18491
  font-size: var(--font-size-sm);
18262
18492
  font-weight: var(--font-weight-semibold);
18263
18493
  line-height: var(--font-line-height-tight);
@@ -18610,9 +18840,14 @@ button.crewlet-finding-list__row:focus-visible {
18610
18840
  }
18611
18841
 
18612
18842
 
18613
- /* ObjectHeader-D7GU7QNI.css */
18843
+ /* ObjectHeader-ZOS22FKX.css */
18614
18844
  /*
18615
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.
18616
18851
  */
18617
18852
  .crewlet-object-header {
18618
18853
  display: flex;
@@ -18631,9 +18866,7 @@ button.crewlet-finding-list__row:focus-visible {
18631
18866
  align-items: center;
18632
18867
  gap: var(--spacing-2);
18633
18868
  min-width: 0;
18634
- font-size: var(--font-size-2xs);
18635
- letter-spacing: var(--font-letter-spacing-wide);
18636
- text-transform: uppercase;
18869
+ font-size: var(--font-size-xs);
18637
18870
  color: var(--color-text-tertiary);
18638
18871
  }
18639
18872
 
@@ -18648,8 +18881,6 @@ button.crewlet-finding-list__row:focus-visible {
18648
18881
  overflow: hidden;
18649
18882
  text-overflow: ellipsis;
18650
18883
  white-space: nowrap;
18651
- letter-spacing: normal;
18652
- text-transform: none;
18653
18884
  }
18654
18885
 
18655
18886
  .crewlet-object-header__id--mono {
@@ -18751,9 +18982,7 @@ button.crewlet-finding-list__row:focus-visible {
18751
18982
  }
18752
18983
 
18753
18984
  .crewlet-fact-line__label {
18754
- font-size: var(--font-size-2xs);
18755
- letter-spacing: var(--font-letter-spacing-wide);
18756
- text-transform: uppercase;
18985
+ font-size: var(--font-size-xs);
18757
18986
  color: var(--color-text-tertiary);
18758
18987
  }
18759
18988
 
@@ -22893,6 +23122,169 @@ svg.crewlet-select__chevron {
22893
23122
  }
22894
23123
 
22895
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
+
22896
23288
  /* ShareDialog-4QDCBWMH.css */
22897
23289
  /*
22898
23290
  * Three blocks under the title: who to add and at what role, who has access,
@@ -25603,7 +25995,7 @@ svg.crewlet-select__chevron {
25603
25995
  }
25604
25996
 
25605
25997
 
25606
- /* StatCard-4T7TMWMN.css */
25998
+ /* StatCard-HAA3F5GX.css */
25607
25999
  /*
25608
26000
  * The stat tile.
25609
26001
  *
@@ -25792,6 +26184,12 @@ svg.crewlet-select__chevron {
25792
26184
  * tiles where only some carry one still stands at one height: its leading is
25793
26185
  * set here and the reserve is exactly one line of it, where a reserve in `em`
25794
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.
25795
26193
  */
25796
26194
  .crewlet-statcard__sub {
25797
26195
  min-height: calc(1em * var(--font-line-height-body));
@@ -25800,9 +26198,8 @@ svg.crewlet-select__chevron {
25800
26198
  /* The quiet step, with the label. The line qualifies the number rather than
25801
26199
  being a second one. */
25802
26200
  color: var(--color-text-tertiary);
25803
- overflow: hidden;
25804
- text-overflow: ellipsis;
25805
- white-space: nowrap;
26201
+ overflow-wrap: anywhere;
26202
+ text-wrap: balance;
25806
26203
  }
25807
26204
 
25808
26205
  /*
@@ -25837,7 +26234,7 @@ svg.crewlet-select__chevron {
25837
26234
  .crewlet-statcard--info .crewlet-statcard__value { color: var(--color-feedback-info-ink); }
25838
26235
 
25839
26236
 
25840
- /* StatGroup-DOFHX5QJ.css */
26237
+ /* StatGroup-ZMW7VQWP.css */
25841
26238
  /*
25842
26239
  * A row of stat tiles.
25843
26240
  *
@@ -25915,6 +26312,33 @@ svg.crewlet-select__chevron {
25915
26312
  border-radius: var(--radius-none);
25916
26313
  }
25917
26314
 
26315
+ /*
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
+
25918
26342
  /*
25919
26343
  * Each tile spans its share of the twelve tracks: the row's `columns`, set on
25920
26344
  * it as `--crewlet-stat-group-cols`, a row.
@@ -28953,6 +29377,61 @@ b.crewlet-switcher__match {
28953
29377
  }
28954
29378
 
28955
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
+
28956
29435
  /* TimeWindowPicker-I3HXC74I.css */
28957
29436
  /*
28958
29437
  * TimeWindowPicker: one trigger over one panel.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@crewlethq/ui",
3
- "version": "0.38.0",
3
+ "version": "0.39.0",
4
4
  "description": "Crewlet shared React components built on @crewlethq/tokens and @crewlethq/icons.",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -42,8 +42,8 @@
42
42
  "clean": "rm -rf dist src/generated"
43
43
  },
44
44
  "dependencies": {
45
- "@crewlethq/icons": "0.38.0",
46
- "@crewlethq/tokens": "0.38.0",
45
+ "@crewlethq/icons": "0.39.0",
46
+ "@crewlethq/tokens": "0.39.0",
47
47
  "prosemirror-commands": "1.7.2",
48
48
  "prosemirror-gapcursor": "1.4.1",
49
49
  "prosemirror-history": "1.5.1",
@@ -3,8 +3,8 @@ import { SHEET_LABELS, SHEET_COLUMN_TYPES, optionHue, retypeColumn } from './chu
3
3
  import { HueSwatch } from './chunk-F4LPQA4E.js';
4
4
  import { NODE_HUES, NODE_HUE_NAMES } from './chunk-AYKXMIOR.js';
5
5
  import { Checkbox } from './chunk-AXS6MBNH.js';
6
- import { Kbd } from './chunk-SMBKXWML.js';
7
6
  import { FormField, Input } from './chunk-TYONQSOK.js';
7
+ import { Kbd } from './chunk-SMBKXWML.js';
8
8
  import { Menu } from './chunk-D6FEHY5G.js';
9
9
  import { Button } from './chunk-OG6CL3EB.js';
10
10
  import { IconButton } from './chunk-4FQT6ZAY.js';
@@ -1,5 +1,5 @@
1
- import { Kbd } from './chunk-SMBKXWML.js';
2
1
  import { Textarea } from './chunk-TYONQSOK.js';
2
+ import { Kbd } from './chunk-SMBKXWML.js';
3
3
  import { cx } from './chunk-ODEQTPFM.js';
4
4
  import './Composer-TXULCPPV.css';
5
5
  import { forwardRef } from 'react';