@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
@@ -0,0 +1,160 @@
1
+ /*
2
+ * SettingsTable: a read-only table of settings, one row each, on one grid.
3
+ *
4
+ * THE TRACKS ARE FRACTIONS OF THE TABLE, so every table of one width shares
5
+ * them: a page that stacks a table per group puts each column on one line
6
+ * down the page with nothing to coordinate. `--crewlet-settings-table-columns`
7
+ * is inherited, so a page that wants other proportions sets it once.
8
+ *
9
+ * Each row is its own grid on those tracks rather than a subgrid of the
10
+ * table's, because the tracks are fractions: one row's long label can never
11
+ * move another row's value, which is what a content-sized track would do.
12
+ */
13
+
14
+ .crewlet-settings-table {
15
+ container: crewlet-settings-table / inline-size;
16
+ display: flex;
17
+ flex-direction: column;
18
+ min-width: 0;
19
+ font-size: var(--font-size-compact);
20
+ /* The flush-panel recipe, standing on its own: the card's surface, its
21
+ hairline and its corner. Inside a card it gives them up (below). */
22
+ background: var(--color-surface-subtle);
23
+ border: 1px solid var(--color-border-default);
24
+ border-radius: var(--radius-lg);
25
+ overflow: hidden;
26
+ }
27
+
28
+ /*
29
+ * A TABLE THAT IS A CARD'S CONTENT IS THAT CARD'S TABLE. It draws no edge or
30
+ * corner of its own inside one, so a card never holds a box inside a box; its
31
+ * rows' hairlines run to the card's edges under the card's own head rule.
32
+ */
33
+ .crewlet-card > .crewlet-settings-table,
34
+ .crewlet-card__body > .crewlet-settings-table {
35
+ background: transparent;
36
+ border: 0;
37
+ border-radius: var(--radius-none);
38
+ }
39
+
40
+ .crewlet-settings-table__row {
41
+ display: grid;
42
+ grid-template-columns: var(
43
+ --crewlet-settings-table-columns,
44
+ minmax(0, 5fr) minmax(0, 3fr) minmax(0, 2fr)
45
+ );
46
+ column-gap: var(--spacing-6);
47
+ /* ONE BASELINE PER ROW: the name, the value and the source sit on the
48
+ first line's baseline, whatever the name's key adds under it. */
49
+ align-items: baseline;
50
+ min-height: var(--size-row-md);
51
+ padding: var(--spacing-3) var(--spacing-4);
52
+ }
53
+
54
+ .crewlet-settings-table__body > .crewlet-settings-table__row + .crewlet-settings-table__row {
55
+ border-top: 1px solid var(--color-border-default);
56
+ }
57
+
58
+ /*
59
+ * The column names, in the micro-label register a table's header takes
60
+ * across the system, on the panel's own ground. Hidden by default (see the
61
+ * component): still the table's column headers for assistive technology.
62
+ */
63
+ .crewlet-settings-table__head .crewlet-settings-table__row {
64
+ min-height: 0;
65
+ padding-block: var(--spacing-2);
66
+ border-bottom: 1px solid var(--color-border-default);
67
+ }
68
+
69
+ .crewlet-settings-table__name {
70
+ font-size: var(--font-size-2xs);
71
+ font-weight: var(--font-weight-medium);
72
+ letter-spacing: var(--font-letter-spacing-wide);
73
+ text-transform: uppercase;
74
+ color: var(--color-text-tertiary);
75
+ white-space: nowrap;
76
+ }
77
+
78
+ .crewlet-settings-table__head--hidden {
79
+ position: absolute;
80
+ width: 1px;
81
+ height: 1px;
82
+ margin: -1px;
83
+ padding: 0;
84
+ border: 0;
85
+ overflow: hidden;
86
+ clip-path: inset(50%);
87
+ white-space: nowrap;
88
+ }
89
+
90
+ .crewlet-settings-table__setting {
91
+ display: flex;
92
+ flex-direction: column;
93
+ gap: var(--spacing-1);
94
+ min-width: 0;
95
+ }
96
+
97
+ .crewlet-settings-table__label {
98
+ color: var(--color-text-primary);
99
+ line-height: var(--font-line-height-snug);
100
+ }
101
+
102
+ /*
103
+ * THE KEY IS FOR THE READER WHO WILL GO AND CHANGE IT, so it is there and
104
+ * quiet: the monospace face at the smallest step, in the tertiary ink, and
105
+ * free to break anywhere, since a dotted path is one word to a line breaker.
106
+ */
107
+ .crewlet-settings-table__key {
108
+ font-family: var(--font-family-mono);
109
+ font-size: var(--font-size-2xs);
110
+ line-height: var(--font-line-height-snug);
111
+ color: var(--color-text-tertiary);
112
+ overflow-wrap: anywhere;
113
+ }
114
+
115
+ /* Tabular figures, so a column of numbers reads down its digits. */
116
+ .crewlet-settings-table__value {
117
+ min-width: 0;
118
+ color: var(--color-text-primary);
119
+ font-weight: var(--font-weight-medium);
120
+ font-variant-numeric: tabular-nums;
121
+ overflow-wrap: anywhere;
122
+ }
123
+
124
+ .crewlet-settings-table__source {
125
+ display: inline-flex;
126
+ align-items: baseline;
127
+ gap: var(--spacing-2);
128
+ min-width: 0;
129
+ font-size: var(--font-size-xs);
130
+ color: var(--color-text-tertiary);
131
+ }
132
+
133
+ /* A value that differs from its default is the row a reader came to find. */
134
+ .crewlet-settings-table__source--changed {
135
+ color: var(--color-text-secondary);
136
+ }
137
+
138
+ .crewlet-settings-table__source--changed .crewlet-status-dot {
139
+ align-self: center;
140
+ }
141
+
142
+ /*
143
+ * NARROW: the name takes the row's first line, and the value and its source
144
+ * share the second. Three columns at this width leave a name column a word
145
+ * wide, which wraps every name into a stack of single words.
146
+ */
147
+ @container crewlet-settings-table (width < 32rem) {
148
+ .crewlet-settings-table__row {
149
+ grid-template-columns: minmax(0, 1fr) auto;
150
+ row-gap: var(--spacing-1);
151
+ }
152
+
153
+ .crewlet-settings-table__setting {
154
+ grid-column: 1 / -1;
155
+ }
156
+
157
+ .crewlet-settings-table__source {
158
+ justify-self: end;
159
+ }
160
+ }
@@ -1,9 +1,9 @@
1
- export { ARTIFACT_ROLES, SHAREABLE_ROLES, ShareDialog, roleAtLeast } from '../chunk-UWRBD2YO.js';
1
+ export { ARTIFACT_ROLES, SHAREABLE_ROLES, ShareDialog, roleAtLeast } from '../chunk-KNHUBHFX.js';
2
2
  import '../chunk-XQZ6EWOE.js';
3
3
  import '../chunk-W46LPU4R.js';
4
4
  import '../chunk-STJ7QBC3.js';
5
5
  import '../chunk-DTIW4CHZ.js';
6
- import '../chunk-SVGARBDY.js';
6
+ import '../chunk-IAGYPTEJ.js';
7
7
  import '../chunk-7KHM2FZH.js';
8
8
  import '../chunk-SZZRIHGT.js';
9
9
  import '../chunk-CI3VPIJN.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';
@@ -1,3 +1,3 @@
1
- export { StatCard } from '../chunk-XO7PUL4F.js';
1
+ export { StatCard } from '../chunk-YPTTSJPM.js';
2
2
  import '../chunk-BZFWDIV6.js';
3
3
  import '../chunk-ODEQTPFM.js';
@@ -186,6 +186,12 @@
186
186
  * tiles where only some carry one still stands at one height: its leading is
187
187
  * set here and the reserve is exactly one line of it, where a reserve in `em`
188
188
  * was a line shorter than the one a sub actually draws.
189
+ *
190
+ * IT WRAPS, balanced, rather than ending in an ellipsis. The line qualifies
191
+ * the number, so its end is the half that says what the number means, and
192
+ * `nowrap` cut it: "6 seats idle and waiting for ..." on a phone, a caption
193
+ * mid-clause at 1440. A grid of tiles (a StatGroup, or a caller's own) gives
194
+ * every tile in a row one height, so a second line costs no alignment.
189
195
  */
190
196
  .crewlet-statcard__sub {
191
197
  min-height: calc(1em * var(--font-line-height-body));
@@ -194,9 +200,8 @@
194
200
  /* The quiet step, with the label. The line qualifies the number rather than
195
201
  being a second one. */
196
202
  color: var(--color-text-tertiary);
197
- overflow: hidden;
198
- text-overflow: ellipsis;
199
- white-space: nowrap;
203
+ overflow-wrap: anywhere;
204
+ text-wrap: balance;
200
205
  }
201
206
 
202
207
  /*
@@ -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-OUD75UB2.js';
2
2
  import '../chunk-ODEQTPFM.js';
@@ -0,0 +1,195 @@
1
+ /*
2
+ * A row of stat tiles.
3
+ *
4
+ * ITS COLUMN COUNT NEVER MOVES with its contents. A grid that reflowed as
5
+ * tiles appeared and vanished moved every number on the page for a reason that
6
+ * had nothing to do with the numbers, which is exactly what a reader watching
7
+ * a live board is trying not to have happen.
8
+ *
9
+ * IT FOLDS BY ITS OWN WIDTH, never the window's. The row used to drop to two
10
+ * columns under a 1024px viewport, but a row's width is whatever its column
11
+ * leaves it: beside the rail and a settings column at exactly 1024 a
12
+ * four-column row was 489px wide, its tiles about 120px each, and its figures
13
+ * were cut ("Not s…", "1.6 …"), while on a phone a three-column row folded to
14
+ * two and left its third tile alone on a row of its own. So the row is a size
15
+ * container, and the tiles take their place from the row's own width.
16
+ *
17
+ * TWELVE TRACKS, AND EACH TILE SPANS ITS SHARE. A container query styles what
18
+ * is inside the container, never the container itself, so the row cannot
19
+ * change its own column count by its own width. Its tiles can change how many
20
+ * of its twelve tracks they span, which is the same layout: twelve divides by
21
+ * every count a row takes (one, two, three and four a row).
22
+ *
23
+ * The row's width comes from where it stands, as a block's does: inline-size
24
+ * containment means its contents never widen it.
25
+ */
26
+
27
+ .crewlet-stat-group {
28
+ container: crewlet-stat-group / inline-size;
29
+ display: grid;
30
+ grid-template-columns: repeat(12, minmax(0, 1fr));
31
+ /* The flush-panel recipe: the card's surface, its hairline and its 12px
32
+ corner, flat as every card is, and `overflow: hidden`, which is what lets
33
+ the tiles inside sit against the corners without their own hairlines
34
+ escaping past them. */
35
+ background: var(--color-surface-subtle);
36
+ border: 1px solid var(--color-border-default);
37
+ border-radius: var(--radius-lg);
38
+ overflow: hidden;
39
+ }
40
+
41
+ /*
42
+ * Inside another card: the card's surface and edge are the row's.
43
+ *
44
+ * A ROW STANDING IN A CARD IS FLUSH WHETHER OR NOT ITS CALLER SAID SO. Six
45
+ * settings pages wrapped a row in a card without `flush`, and each drew the
46
+ * row's own edge and 12px corner one pixel inside the card's: a box inside a
47
+ * box, and inside a padded body a third frame. A row that is a card's content,
48
+ * or its body's, is that card's row; `flush` is for a host that is not a
49
+ * Card (a widget's frame, a panel of an application's own).
50
+ */
51
+ .crewlet-stat-group--flush,
52
+ .crewlet-card > .crewlet-stat-group,
53
+ .crewlet-card__body > .crewlet-stat-group {
54
+ background: transparent;
55
+ border: 0;
56
+ border-radius: var(--radius-none);
57
+ }
58
+
59
+ /*
60
+ * A tile inside the row brings no surface of its own, whether or not its
61
+ * caller remembered `flush`. The group draws one card and the hairlines
62
+ * inside it, so a tile that kept its own border and radius is a card inside
63
+ * a card: a box inside a box, which is what the reader sees.
64
+ *
65
+ * TWO CLASSES, NOT :where(). Written as `> :where(.crewlet-statcard)` this
66
+ * weighed exactly what the tile's own `.crewlet-statcard` rule weighs, so
67
+ * which one painted was settled by whichever stylesheet the bundler put
68
+ * last. It put the tile's last, and every tile in every group drew its own
69
+ * border, its own 12px corner and its own surface inside the group's.
70
+ * Naming both classes settles it by weight, which no import order can undo.
71
+ */
72
+ .crewlet-stat-group > .crewlet-statcard {
73
+ background: transparent;
74
+ border: 0;
75
+ border-radius: var(--radius-none);
76
+ }
77
+
78
+ /*
79
+ * A ROW OF TILES SHARES ITS LINES. A tile stacks its label, its number and its
80
+ * sub in a column of its own, so a label that wrapped pushed its own number
81
+ * down and no other: beside a node's peek at 1440, "Behind on config" broke
82
+ * over two lines and its figure sat 18px below the other three. Inside a row
83
+ * each tile is a SUBGRID over the row's lines, one per line the tile renders
84
+ * (StatCard always renders three, an absent sub included), so a line is as
85
+ * tall as the tallest of it across the row and every figure starts together.
86
+ *
87
+ * A LABEL SITS ON ITS NUMBER: where one label in the row takes two lines, the
88
+ * others end at the foot of the label row, one gap above their figure, rather
89
+ * than floating at its top a line away from what they name.
90
+ *
91
+ * These were the engine dashboard's own rules over this component, held there
92
+ * with a note that the kit should carry them; they are the kit's now, with the
93
+ * sub's wrap (see StatCard), which the engine applied to every tile.
94
+ */
95
+ .crewlet-stat-group > .crewlet-statcard {
96
+ display: grid;
97
+ grid-template-rows: subgrid;
98
+ grid-row: span 3;
99
+ }
100
+
101
+ .crewlet-stat-group > .crewlet-statcard > .crewlet-statcard__label {
102
+ align-self: end;
103
+ }
104
+
105
+ /*
106
+ * Each tile spans its share of the twelve tracks: the row's `columns`, set on
107
+ * it as `--crewlet-stat-group-cols`, a row.
108
+ */
109
+ .crewlet-stat-group > * {
110
+ grid-column: span calc(12 / var(--crewlet-stat-group-cols, 4));
111
+ }
112
+
113
+ /*
114
+ * The hairlines between tiles: one before every tile that does not start a
115
+ * row, and one above every tile that is not on the first.
116
+ *
117
+ * NAMED TWICE, ON PURPOSE. The rule above clears the tile's own border and
118
+ * weighs two classes, so a one-class selector here loses to it and the row
119
+ * of numbers runs together with nothing between the columns. The first
120
+ * selector of each pair matches whatever a caller puts in the row; the second
121
+ * weighs at least as much as the rule it has to beat, and sits after it.
122
+ */
123
+ .crewlet-stat-group > * + *,
124
+ .crewlet-stat-group > .crewlet-statcard + .crewlet-statcard {
125
+ border-left: 1px solid var(--color-border-default);
126
+ }
127
+
128
+ .crewlet-stat-group[data-columns='2'] > :nth-child(2n + 1),
129
+ .crewlet-stat-group[data-columns='2'] > .crewlet-statcard:nth-child(2n + 1),
130
+ .crewlet-stat-group[data-columns='3'] > :nth-child(3n + 1),
131
+ .crewlet-stat-group[data-columns='3'] > .crewlet-statcard:nth-child(3n + 1),
132
+ .crewlet-stat-group[data-columns='4'] > :nth-child(4n + 1),
133
+ .crewlet-stat-group[data-columns='4'] > .crewlet-statcard:nth-child(4n + 1) {
134
+ border-left: 0;
135
+ }
136
+
137
+ .crewlet-stat-group[data-columns='2'] > :nth-child(n + 3),
138
+ .crewlet-stat-group[data-columns='2'] > .crewlet-statcard:nth-child(n + 3),
139
+ .crewlet-stat-group[data-columns='3'] > :nth-child(n + 4),
140
+ .crewlet-stat-group[data-columns='3'] > .crewlet-statcard:nth-child(n + 4),
141
+ .crewlet-stat-group[data-columns='4'] > :nth-child(n + 5),
142
+ .crewlet-stat-group[data-columns='4'] > .crewlet-statcard:nth-child(n + 5) {
143
+ border-top: 1px solid var(--color-border-default);
144
+ }
145
+
146
+ /*
147
+ * FOUR A ROW FOLD TO TWO under 640px of row (the phone breakpoint's number):
148
+ * four tiles of 160px is the narrowest at which a six-character figure and a
149
+ * two-word label still stand on one line each. Two by two keeps every row
150
+ * full.
151
+ */
152
+ @container crewlet-stat-group (width < 640px) {
153
+ .crewlet-stat-group[data-columns='4'] > *,
154
+ .crewlet-stat-group[data-columns='4'] > .crewlet-statcard {
155
+ grid-column: span 6;
156
+ }
157
+
158
+ .crewlet-stat-group[data-columns='4'] > :nth-child(odd),
159
+ .crewlet-stat-group[data-columns='4'] > .crewlet-statcard:nth-child(odd) {
160
+ border-left: 0;
161
+ }
162
+
163
+ .crewlet-stat-group[data-columns='4'] > :nth-child(even),
164
+ .crewlet-stat-group[data-columns='4'] > .crewlet-statcard:nth-child(even) {
165
+ border-left: 1px solid var(--color-border-default);
166
+ }
167
+
168
+ .crewlet-stat-group[data-columns='4'] > :nth-child(n + 3),
169
+ .crewlet-stat-group[data-columns='4'] > .crewlet-statcard:nth-child(n + 3) {
170
+ border-top: 1px solid var(--color-border-default);
171
+ }
172
+ }
173
+
174
+ /*
175
+ * THREE A ROW STACK under 480px of row (the small breakpoint's number), at the
176
+ * same 160px a tile. Folded to two, three tiles stood two and one, the last
177
+ * alone at double width and a different height, which read as a tile that had
178
+ * failed to load; one a row leaves no row short.
179
+ */
180
+ @container crewlet-stat-group (width < 480px) {
181
+ .crewlet-stat-group[data-columns='3'] > *,
182
+ .crewlet-stat-group[data-columns='3'] > .crewlet-statcard {
183
+ grid-column: span 12;
184
+ }
185
+
186
+ .crewlet-stat-group[data-columns='3'] > *,
187
+ .crewlet-stat-group[data-columns='3'] > .crewlet-statcard + .crewlet-statcard {
188
+ border-left: 0;
189
+ }
190
+
191
+ .crewlet-stat-group[data-columns='3'] > :nth-child(n + 2),
192
+ .crewlet-stat-group[data-columns='3'] > .crewlet-statcard:nth-child(n + 2) {
193
+ border-top: 1px solid var(--color-border-default);
194
+ }
195
+ }
@@ -1,5 +1,5 @@
1
- export { Switcher } from '../chunk-6NNY5WBF.js';
2
- import '../chunk-SVGARBDY.js';
1
+ export { Switcher } from '../chunk-JKAGN4V4.js';
2
+ import '../chunk-IAGYPTEJ.js';
3
3
  import '../chunk-7KHM2FZH.js';
4
4
  import '../chunk-KHJIEPZV.js';
5
5
  import '../chunk-FYTIJM2T.js';
@@ -1,6 +1,6 @@
1
- export { TABLE_TAGS_CELL_LABELS, TableDateCell, TableEntityCell, TableKeyCell, TableNumberCell, TableStatusCell, TableTagsCell, TableTextCell } from '../chunk-K4VP6ZKE.js';
1
+ export { TABLE_TAGS_CELL_LABELS, TableDateCell, TableEntityCell, TableKeyCell, TableNumberCell, TableStatusCell, TableTagsCell, TableTextCell } from '../chunk-4BJK7FE5.js';
2
2
  import '../chunk-FBSEJO2C.js';
3
- import '../chunk-GFV4LJHH.js';
3
+ import '../chunk-KYIAFNU7.js';
4
4
  import '../chunk-WIATRXEJ.js';
5
5
  import '../chunk-3CZ7XAVY.js';
6
6
  import '../chunk-EUCC37WY.js';
package/dist/Tag/index.js CHANGED
@@ -1,3 +1,3 @@
1
- export { Tag } from '../chunk-GFV4LJHH.js';
1
+ export { Tag } from '../chunk-KYIAFNU7.js';
2
2
  import '../chunk-WIATRXEJ.js';
3
3
  import '../chunk-ODEQTPFM.js';
@@ -277,12 +277,22 @@
277
277
  --crewlet-tag-line: var(--color-border-strong-hover);
278
278
  }
279
279
 
280
- /* The neutral outline is the engine's `.badge.outline`: the hairline step as
281
- the boundary, and the tertiary ink, which is a quieter register than the
282
- tinted outlines keep. It is the appearance for a value that is not a state
283
- at all, so it says less than its neighbours on purpose. */
280
+ /*
281
+ * The neutral outline: the neutral pill's own boundary with no fill, and the
282
+ * tertiary ink, which is a quieter register than the tinted outlines keep. It
283
+ * is the appearance for a value that is not a state at all, so it says less
284
+ * than its neighbours on purpose, by its ink and its empty ground.
285
+ *
286
+ * NOT BY A FAINTER EDGE. It used to take the plain hairline, the line that
287
+ * finds a card, and on the card it so often stands on that line measured
288
+ * 1.07:1 in dark: Limits' "Off" beside a filled "Default", an audit row's
289
+ * machine and open, a tool's "builtin", all read as loose words rather than
290
+ * as pills. The strong step is the edge the neutral soft pill already draws
291
+ * (1.49:1 dark, 1.52:1 light on the card), so the two neutral pills differ by
292
+ * their fill alone and both read as pills.
293
+ */
284
294
  .crewlet-tag--neutral.crewlet-tag--outline {
285
- border-color: var(--color-border-default);
295
+ border-color: var(--color-border-strong);
286
296
  --crewlet-tag-ink: var(--color-text-tertiary);
287
297
  }
288
298
 
@@ -1,5 +1,5 @@
1
- export { TagsInput } from '../chunk-3SBM4DGI.js';
2
- import '../chunk-GFV4LJHH.js';
1
+ export { TagsInput } from '../chunk-BH52LIY6.js';
2
+ import '../chunk-KYIAFNU7.js';
3
3
  import '../chunk-WIATRXEJ.js';
4
4
  import '../chunk-7KHM2FZH.js';
5
5
  import '../chunk-RSAQOKH3.js';
@@ -0,0 +1,33 @@
1
+ import type { HTMLAttributes, ReactNode } from 'react';
2
+ /** The most tracks a grid draws; it folds to fewer by its own width. */
3
+ export type TileGridColumns = 2 | 3 | 4;
4
+ export interface TileGridProps extends HTMLAttributes<HTMLElement> {
5
+ /**
6
+ * The tracks at full width. `3` (the default) folds straight to one, never
7
+ * to two, so a set of three or six tiles never leaves a lone tile on a row
8
+ * of its own; `4` folds to two and then one; `2` folds to one.
9
+ */
10
+ columns?: TileGridColumns | undefined;
11
+ /** The element the tiles stand in: a `ul` for tiles that are `li`s. */
12
+ as?: 'div' | 'ul' | 'ol' | undefined;
13
+ children?: ReactNode;
14
+ }
15
+ /**
16
+ * Tiles on a fixed number of tracks that folds by the grid's own width.
17
+ *
18
+ * GRIDS ON ONE PAGE LINE UP. Two sections of tiles (a catalogue's built-in
19
+ * services over its third-party apps) each laid out on a track count of its
20
+ * own put their tile edges in different places, and an `auto-fill` grid left
21
+ * a hole at the end of a short section. A tile grid's tracks are a count, the
22
+ * same in every grid given the same count and the same width, so every tile
23
+ * edge on the page lines up.
24
+ *
25
+ * IT FOLDS BY ITS OWN WIDTH, never the window's: a grid beside a rail and a
26
+ * settings column is as narrow as a phone's at a wide window. The outer
27
+ * element is the size container, and the track list inside it is the grid,
28
+ * because a container query styles what is inside the container and never
29
+ * the container itself. `className` goes on that outer box, where a page
30
+ * places the grid; every other attribute (an `id`, an `aria-label`) goes on
31
+ * the track, which is the list a `ul` grid is.
32
+ */
33
+ export declare function TileGrid({ columns, as: Track, className, children, ...rest }: TileGridProps): import("react").JSX.Element;
@@ -0,0 +1,3 @@
1
+ import './TileGrid.css';
2
+ export { TileGrid } from './TileGrid.js';
3
+ export type { TileGridColumns, TileGridProps } from './TileGrid.js';
@@ -0,0 +1,2 @@
1
+ export { TileGrid } from '../chunk-NNTO3TNC.js';
2
+ import '../chunk-ODEQTPFM.js';
@@ -0,0 +1,52 @@
1
+ /*
2
+ * TileGrid: tiles on a fixed track count that folds by the grid's own width.
3
+ *
4
+ * Equal tracks, so two grids of one count and one width put every tile edge
5
+ * on the same line; the tiles in a row stretch to the tallest of them. The
6
+ * folds are steps of the grid's own width (see the component): three tracks
7
+ * go straight to one, so a set of three never strands a tile.
8
+ */
9
+
10
+ .crewlet-tile-grid {
11
+ container: crewlet-tile-grid / inline-size;
12
+ min-width: 0;
13
+ }
14
+
15
+ .crewlet-tile-grid__track {
16
+ --crewlet-tile-grid-tracks: 3;
17
+
18
+ display: grid;
19
+ grid-template-columns: repeat(var(--crewlet-tile-grid-tracks), minmax(0, 1fr));
20
+ gap: var(--spacing-3);
21
+ margin: 0;
22
+ padding: 0;
23
+ list-style: none;
24
+ }
25
+
26
+ .crewlet-tile-grid[data-columns='2'] > .crewlet-tile-grid__track {
27
+ --crewlet-tile-grid-tracks: 2;
28
+ }
29
+
30
+ .crewlet-tile-grid[data-columns='4'] > .crewlet-tile-grid__track {
31
+ --crewlet-tile-grid-tracks: 4;
32
+ }
33
+
34
+ /* Four tracks fold to two where a tile would be narrower than its content. */
35
+ @container crewlet-tile-grid (width < 56rem) {
36
+ .crewlet-tile-grid[data-columns='4'] > .crewlet-tile-grid__track {
37
+ --crewlet-tile-grid-tracks: 2;
38
+ }
39
+ }
40
+
41
+ /* Three fold to one: two up would leave the third tile alone on a row. */
42
+ @container crewlet-tile-grid (width < 40rem) {
43
+ .crewlet-tile-grid[data-columns='3'] > .crewlet-tile-grid__track {
44
+ --crewlet-tile-grid-tracks: 1;
45
+ }
46
+ }
47
+
48
+ @container crewlet-tile-grid (width < 28rem) {
49
+ .crewlet-tile-grid > .crewlet-tile-grid__track {
50
+ --crewlet-tile-grid-tracks: 1;
51
+ }
52
+ }
@@ -1,6 +1,6 @@
1
1
  import { Timeline } from './chunk-AUQPBL4O.js';
2
2
  import { Section } from './chunk-3TFDQLW3.js';
3
- import { Disclosure } from './chunk-MICH6QSJ.js';
3
+ import { Disclosure } from './chunk-OGXHZHRX.js';
4
4
  import { Composer } from './chunk-ISA2O2BK.js';
5
5
  import { ArtifactPanel } from './chunk-Y5BD4MTE.js';
6
6
  import { Button } from './chunk-OG6CL3EB.js';
@@ -1,5 +1,5 @@
1
1
  import { Link } from './chunk-FBSEJO2C.js';
2
- import { Tag } from './chunk-GFV4LJHH.js';
2
+ import { Tag } from './chunk-KYIAFNU7.js';
3
3
  import { RelativeTime } from './chunk-3CZ7XAVY.js';
4
4
  import { EmptyValue } from './chunk-EUCC37WY.js';
5
5
  import { Avatar } from './chunk-PZKHBB7D.js';