@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
@@ -1,4 +1,4 @@
1
- export { ConfirmModal, Modal } from '../chunk-SVGARBDY.js';
1
+ export { ConfirmModal, Modal } from '../chunk-IAGYPTEJ.js';
2
2
  import '../chunk-PQADV6P6.js';
3
3
  import '../chunk-OMV5W53A.js';
4
4
  import '../chunk-H5XTJ7GJ.js';
@@ -379,6 +379,11 @@
379
379
  */
380
380
  .crewlet-modal__title {
381
381
  margin: 0;
382
+ /* The text face at its own tracking, never the display face every heading
383
+ element takes from the baseline: the title is an h1 for the outline, at
384
+ the dialog's own register. */
385
+ font-family: var(--font-family-sans);
386
+ letter-spacing: var(--font-letter-spacing-normal);
382
387
  font-size: var(--font-size-sm);
383
388
  font-weight: var(--font-weight-semibold);
384
389
  line-height: var(--font-line-height-tight);
@@ -1,4 +1,4 @@
1
- export { FactLine, ObjectHeader, SetByLine } from '../chunk-VGE3G3T4.js';
1
+ export { FactLine, ObjectHeader, SetByLine } from '../chunk-ODOJJGXH.js';
2
2
  import '../chunk-FBSEJO2C.js';
3
3
  import '../chunk-BZFWDIV6.js';
4
4
  import '../chunk-ODEQTPFM.js';
@@ -1,5 +1,10 @@
1
1
  /*
2
2
  * The header of an object: its eyebrow, its head row and its fact line.
3
+ *
4
+ * SENTENCE CASE, both the eyebrow and the fact labels, as `StatCard`'s label
5
+ * is: the uppercase, tracked-open micro-caps are a table's column head, and
6
+ * over an object's name ("UNIT", then TYPE, LEAD and SEATS under it) they put
7
+ * a heading on every fact and read as a form rather than a record.
3
8
  */
4
9
  .crewlet-object-header {
5
10
  display: flex;
@@ -18,9 +23,7 @@
18
23
  align-items: center;
19
24
  gap: var(--spacing-2);
20
25
  min-width: 0;
21
- font-size: var(--font-size-2xs);
22
- letter-spacing: var(--font-letter-spacing-wide);
23
- text-transform: uppercase;
26
+ font-size: var(--font-size-xs);
24
27
  color: var(--color-text-tertiary);
25
28
  }
26
29
 
@@ -35,8 +38,6 @@
35
38
  overflow: hidden;
36
39
  text-overflow: ellipsis;
37
40
  white-space: nowrap;
38
- letter-spacing: normal;
39
- text-transform: none;
40
41
  }
41
42
 
42
43
  .crewlet-object-header__id--mono {
@@ -138,9 +139,7 @@
138
139
  }
139
140
 
140
141
  .crewlet-fact-line__label {
141
- font-size: var(--font-size-2xs);
142
- letter-spacing: var(--font-letter-spacing-wide);
143
- text-transform: uppercase;
142
+ font-size: var(--font-size-xs);
144
143
  color: var(--color-text-tertiary);
145
144
  }
146
145
 
@@ -0,0 +1,66 @@
1
+ import type { HTMLAttributes, ReactNode } from 'react';
2
+ /** The words the three columns are named by, for assistive technology and the optional header row. */
3
+ export interface SettingsTableColumns {
4
+ setting?: string | undefined;
5
+ value?: string | undefined;
6
+ source?: string | undefined;
7
+ }
8
+ export interface SettingsTableProps extends HTMLAttributes<HTMLDivElement> {
9
+ /**
10
+ * Draws the column names as a header row. Off by default: a page that
11
+ * stacks one table per group (a card each) would repeat the same three
12
+ * words over every card. The names are always exposed to assistive
13
+ * technology, drawn or not.
14
+ */
15
+ header?: boolean | undefined;
16
+ /** The column names. Defaults to Setting, Value and Source. */
17
+ columns?: SettingsTableColumns | undefined;
18
+ children?: ReactNode;
19
+ }
20
+ /**
21
+ * A read-only table of settings: what each is called, the value in force and
22
+ * where that value comes from.
23
+ *
24
+ * ONE COLUMN GRID FOR EVERY TABLE ON A PAGE. The tracks are fractions of the
25
+ * table's own width (`--crewlet-settings-table-columns`), never the width of
26
+ * the longest label, so a page that stacks a table per group in cards of one
27
+ * width puts every value and every source on one vertical line down the page.
28
+ * A term column sized to its own longest term started the values at a
29
+ * different place in every card, and a fixed one left them floating a third
30
+ * of the way across a wide card with the rest of the row empty.
31
+ *
32
+ * THE SOURCE IS QUIET UNLESS IT IS NEWS. A value that is the default says so
33
+ * in the tertiary ink, as a word rather than a tag: a tag on every row is
34
+ * noise that teaches a reader to skip the column. A value that differs from
35
+ * its default (`changed`) carries a mark before its source, which is the one
36
+ * row in the table a reader scanning it came to find.
37
+ *
38
+ * A TABLE, BECAUSE IT IS ONE. Every row carries the same three fields, so it
39
+ * is announced as a table with its column names, and each setting's name is
40
+ * the row's header. The roles are written out rather than taken from table
41
+ * elements because the row folds into two lines on a narrow table, and a
42
+ * table element that changes its display loses its semantics in some
43
+ * browsers.
44
+ */
45
+ export declare function SettingsTable({ header, columns, className, children, ...rest }: SettingsTableProps): import("react").JSX.Element;
46
+ export declare namespace SettingsTable {
47
+ var Row: typeof SettingsTableRow;
48
+ }
49
+ export interface SettingsTableRowProps extends HTMLAttributes<HTMLDivElement> {
50
+ /** What the setting is called, in a reader's words. */
51
+ label: ReactNode;
52
+ /**
53
+ * The setting's address in the document it is written in
54
+ * (`turn_engine.max_iterations`), drawn quietly under its name in the
55
+ * monospace face. For the reader who will go and change it there.
56
+ */
57
+ settingKey?: string | undefined;
58
+ /** The value in force, in its own unit. Drawn in tabular figures. */
59
+ children?: ReactNode;
60
+ /** Where the value comes from: "Default", "Set in the company document". */
61
+ source?: ReactNode;
62
+ /** The value differs from its default: the source carries a mark. */
63
+ changed?: boolean | undefined;
64
+ }
65
+ /** One setting: its name (and key), its value and its source. */
66
+ export declare function SettingsTableRow({ label, settingKey, source, changed, className, children, ...rest }: SettingsTableRowProps): import("react").JSX.Element;
@@ -0,0 +1,3 @@
1
+ import './SettingsTable.css';
2
+ export { SettingsTable, SettingsTableRow } from './SettingsTable.js';
3
+ export type { SettingsTableColumns, SettingsTableProps, SettingsTableRowProps } from './SettingsTable.js';
@@ -0,0 +1,3 @@
1
+ export { SettingsTable, SettingsTableRow } from '../chunk-4RKTZSEW.js';
2
+ import '../chunk-WIATRXEJ.js';
3
+ import '../chunk-ODEQTPFM.js';
@@ -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,4 +1,4 @@
1
- export { SHEET_COLUMN_EDITOR_LABELS, SheetColumnEditor, SheetColumnTypeGlyph } from '../chunk-4L2BWSHR.js';
1
+ export { SHEET_COLUMN_EDITOR_LABELS, SheetColumnEditor, SheetColumnTypeGlyph } from '../chunk-F3WZ5AKM.js';
2
2
  import '../chunk-XQZ6EWOE.js';
3
3
  import '../chunk-FFMCMSJB.js';
4
4
  import '../chunk-7KHM2FZH.js';
@@ -6,12 +6,12 @@ import '../chunk-LFSIKGRQ.js';
6
6
  import '../chunk-Z7JYG5TF.js';
7
7
  import '../chunk-F4LPQA4E.js';
8
8
  import '../chunk-AYKXMIOR.js';
9
+ import '../chunk-AXS6MBNH.js';
9
10
  import '../chunk-2QZ2VPHR.js';
10
11
  import '../chunk-7SDUKCNW.js';
11
12
  import '../chunk-RKKO7QHH.js';
12
- import '../chunk-AXS6MBNH.js';
13
- import '../chunk-SMBKXWML.js';
14
13
  import '../chunk-TYONQSOK.js';
14
+ import '../chunk-SMBKXWML.js';
15
15
  import '../chunk-BHHIIK3M.js';
16
16
  import '../chunk-PQADV6P6.js';
17
17
  import '../chunk-D6FEHY5G.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
  /*
@@ -1,2 +1,2 @@
1
- export { StatGroup } from '../chunk-BT5H2THK.js';
1
+ export { StatGroup } from '../chunk-OUD75UB2.js';
2
2
  import '../chunk-ODEQTPFM.js';
@@ -75,6 +75,33 @@
75
75
  border-radius: var(--radius-none);
76
76
  }
77
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
+
78
105
  /*
79
106
  * Each tile spans its share of the twelve tracks: the row's `columns`, set on
80
107
  * it as `--crewlet-stat-group-cols`, a row.
@@ -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';
@@ -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,7 +1,7 @@
1
1
  import { Timeline } from './chunk-AUQPBL4O.js';
2
2
  import { Section } from './chunk-3TFDQLW3.js';
3
3
  import { Disclosure } from './chunk-OGXHZHRX.js';
4
- import { Composer } from './chunk-ETVEGR2Y.js';
4
+ import { Composer } from './chunk-ISA2O2BK.js';
5
5
  import { ArtifactPanel } from './chunk-Y5BD4MTE.js';
6
6
  import { Button } from './chunk-OG6CL3EB.js';
7
7
  import { cx } from './chunk-ODEQTPFM.js';
@@ -0,0 +1,64 @@
1
+ import { StatusDot } from './chunk-WIATRXEJ.js';
2
+ import { cx } from './chunk-ODEQTPFM.js';
3
+ import './SettingsTable-6DUFAFXG.css';
4
+ import { jsxs, jsx } from 'react/jsx-runtime';
5
+
6
+ var COLUMNS = { setting: "Setting", value: "Value", source: "Source" };
7
+ function SettingsTable({ header = false, columns, className, children, ...rest }) {
8
+ const names = { ...COLUMNS, ...columns };
9
+ return /* @__PURE__ */ jsxs("div", { ...rest, role: "table", className: cx("crewlet-settings-table", className), children: [
10
+ /* @__PURE__ */ jsx(
11
+ "div",
12
+ {
13
+ role: "rowgroup",
14
+ className: cx("crewlet-settings-table__head", !header && "crewlet-settings-table__head--hidden"),
15
+ children: /* @__PURE__ */ jsxs("div", { role: "row", className: "crewlet-settings-table__row", children: [
16
+ /* @__PURE__ */ jsx("span", { role: "columnheader", className: "crewlet-settings-table__name", children: names.setting }),
17
+ /* @__PURE__ */ jsx("span", { role: "columnheader", className: "crewlet-settings-table__name", children: names.value }),
18
+ /* @__PURE__ */ jsx("span", { role: "columnheader", className: "crewlet-settings-table__name", children: names.source })
19
+ ] })
20
+ }
21
+ ),
22
+ /* @__PURE__ */ jsx("div", { role: "rowgroup", className: "crewlet-settings-table__body", children })
23
+ ] });
24
+ }
25
+ function SettingsTableRow({
26
+ label,
27
+ settingKey,
28
+ source,
29
+ changed = false,
30
+ className,
31
+ children,
32
+ ...rest
33
+ }) {
34
+ return /* @__PURE__ */ jsxs(
35
+ "div",
36
+ {
37
+ ...rest,
38
+ role: "row",
39
+ "data-changed": changed ? "" : void 0,
40
+ className: cx("crewlet-settings-table__row", className),
41
+ children: [
42
+ /* @__PURE__ */ jsxs("span", { role: "rowheader", className: "crewlet-settings-table__setting", children: [
43
+ /* @__PURE__ */ jsx("span", { className: "crewlet-settings-table__label", children: label }),
44
+ settingKey === void 0 ? null : /* @__PURE__ */ jsx("code", { className: "crewlet-settings-table__key", children: settingKey })
45
+ ] }),
46
+ /* @__PURE__ */ jsx("span", { role: "cell", className: "crewlet-settings-table__value", children }),
47
+ /* @__PURE__ */ jsxs(
48
+ "span",
49
+ {
50
+ role: "cell",
51
+ className: cx("crewlet-settings-table__source", changed && "crewlet-settings-table__source--changed"),
52
+ children: [
53
+ changed ? /* @__PURE__ */ jsx(StatusDot, { tone: "brand" }) : null,
54
+ source
55
+ ]
56
+ }
57
+ )
58
+ ]
59
+ }
60
+ );
61
+ }
62
+ SettingsTable.Row = SettingsTableRow;
63
+
64
+ export { SettingsTable, SettingsTableRow };
@@ -1,5 +1,5 @@
1
1
  import { useClipboard } from './chunk-STJ7QBC3.js';
2
- import { Modal } from './chunk-SVGARBDY.js';
2
+ import { Modal } from './chunk-IAGYPTEJ.js';
3
3
  import { Checkbox } from './chunk-AXS6MBNH.js';
4
4
  import { EmptyValue } from './chunk-EUCC37WY.js';
5
5
  import { useCardHeaderSlot } from './chunk-AV2DXAEL.js';
@@ -58,8 +58,10 @@ function DatasetSource({
58
58
  const summary = /* @__PURE__ */ jsxs(Fragment, { children: [
59
59
  /* @__PURE__ */ jsxs("span", { className: "crewlet-dataset-source__head", children: [
60
60
  /* @__PURE__ */ jsx("span", { id: titleId, className: "crewlet-dataset-source__title", children: title }),
61
- " ",
62
- /* @__PURE__ */ jsx(Tag, { size: "xs", appearance: "outline", className: "crewlet-dataset-source__kind", children: text.kinds[kind] })
61
+ kind === void 0 ? null : /* @__PURE__ */ jsxs(Fragment, { children: [
62
+ " ",
63
+ /* @__PURE__ */ jsx(Tag, { size: "xs", appearance: "outline", className: "crewlet-dataset-source__kind", children: text.kinds[kind] })
64
+ ] })
63
65
  ] }),
64
66
  " ",
65
67
  /* @__PURE__ */ jsx("span", { className: "crewlet-dataset-source__definition", children: definition }),
@@ -4,7 +4,7 @@ import { focusables, useModalLayer, useBodyScrollLock } from './chunk-H5XTJ7GJ.j
4
4
  import { Button } from './chunk-OG6CL3EB.js';
5
5
  import { IconButton } from './chunk-4FQT6ZAY.js';
6
6
  import { cx } from './chunk-ODEQTPFM.js';
7
- import './Modal-7MWRCWAI.css';
7
+ import './Modal-TOEWHDCQ.css';
8
8
  import { useId, useRef, useCallback } from 'react';
9
9
  import { createPortal } from 'react-dom';
10
10
  import { ChevronLeftGlyph, XGlyph } from '@crewlethq/icons/glyphs';
@@ -124,7 +124,7 @@ function ModalFrame({
124
124
  given(icon) ? /* @__PURE__ */ jsx("span", { className: "crewlet-modal__icon", "aria-hidden": "true", children: icon }) : null,
125
125
  /* @__PURE__ */ jsxs("div", { className: "crewlet-modal__heading", children: [
126
126
  given(title) ? /* @__PURE__ */ jsx(
127
- "p",
127
+ "h1",
128
128
  {
129
129
  className: cx("crewlet-modal__title", sheet ? "crewlet-modal__title--sheet" : void 0),
130
130
  id: titleId,