@crewlethq/ui 0.39.0 → 0.40.1

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 (90) hide show
  1. package/README.md +47 -1
  2. package/dist/AppShell/AppShell.d.ts +13 -2
  3. package/dist/AppShell/index.js +1 -1
  4. package/dist/{AppShell-NDU4XMGF.css → AppShell-VE2MAV42.css} +71 -7
  5. package/dist/ArtifactBar/index.js +6 -5
  6. package/dist/AvatarPicker/index.js +10 -6
  7. package/dist/CatalogTile/index.js +1 -1
  8. package/dist/{CatalogTile-TGR2ZZVQ.css → CatalogTile-XL4XLFUH.css} +8 -4
  9. package/dist/CharacterPicker/index.js +2 -2
  10. package/dist/Charts/Histogram.d.ts +71 -0
  11. package/dist/Charts/index.d.ts +2 -0
  12. package/dist/Charts/index.js +1 -1
  13. package/dist/{Charts-MBJG72BS.css → Charts-TZ744HT6.css} +118 -0
  14. package/dist/DataGrid/DataGrid.d.ts +267 -0
  15. package/dist/DataGrid/index.d.ts +3 -0
  16. package/dist/DataGrid/index.js +7 -0
  17. package/dist/DataGrid-AQKPJD7W.css +482 -0
  18. package/dist/HuePicker/index.js +11 -4
  19. package/dist/LayersList/index.js +2 -2
  20. package/dist/LockedLabel/LockedLabel.d.ts +34 -0
  21. package/dist/LockedLabel/index.d.ts +3 -0
  22. package/dist/LockedLabel/index.js +3 -0
  23. package/dist/LockedLabel-VQEGEB7G.css +16 -0
  24. package/dist/MarkdownEditor/index.js +8 -5
  25. package/dist/MergeConflicts/index.js +11 -5
  26. package/dist/PageNote/PageNote.d.ts +14 -0
  27. package/dist/PageNote/index.d.ts +3 -0
  28. package/dist/PageNote/index.js +2 -0
  29. package/dist/PageNote-RHLXH3ML.css +12 -0
  30. package/dist/PropertyList/PropertyList.d.ts +88 -0
  31. package/dist/PropertyList/index.d.ts +3 -0
  32. package/dist/PropertyList/index.js +7 -0
  33. package/dist/PropertyList-SCYM66LL.css +96 -0
  34. package/dist/RelatedRow/RelatedRow.d.ts +27 -0
  35. package/dist/RelatedRow/index.d.ts +3 -0
  36. package/dist/RelatedRow/index.js +9 -0
  37. package/dist/RelatedRow-2FVS6QQA.css +6 -0
  38. package/dist/SectionFrame/SectionFrame.d.ts +76 -0
  39. package/dist/SectionFrame/index.d.ts +3 -0
  40. package/dist/SectionFrame/index.js +7 -0
  41. package/dist/SectionFrame-M62UUVFQ.css +164 -0
  42. package/dist/SegmentedControl/index.js +11 -4
  43. package/dist/SheetColumnEditor/index.js +6 -5
  44. package/dist/SheetGrid/index.js +2 -2
  45. package/dist/SidebarNav/SidebarNav.d.ts +35 -2
  46. package/dist/SidebarNav/index.js +2 -1
  47. package/dist/{SidebarNav-7SGUZYKK.css → SidebarNav-YI74SPDC.css} +10 -0
  48. package/dist/Tabs/Tabs.d.ts +55 -1
  49. package/dist/Tabs/fold.d.ts +54 -0
  50. package/dist/Tabs/index.d.ts +1 -1
  51. package/dist/Tabs/index.js +9 -2
  52. package/dist/Tabs/roving.d.ts +3 -3
  53. package/dist/{Tabs-WIF7457H.css → Tabs-S7F4RWAN.css} +77 -0
  54. package/dist/TagsInput/index.js +1 -1
  55. package/dist/ThemeGallery/index.js +2 -2
  56. package/dist/ThemeSwitcher/index.js +12 -5
  57. package/dist/VersionCompare/index.js +12 -5
  58. package/dist/{chunk-B5J23C73.js → chunk-2PEXZ7L4.js} +1 -1
  59. package/dist/{chunk-TZYFTC4M.js → chunk-2VOHUGUA.js} +1 -1
  60. package/dist/{chunk-2QZ2VPHR.js → chunk-4OK4DX3V.js} +2 -2
  61. package/dist/{chunk-ECGGQX2H.js → chunk-A44YHLCQ.js} +2 -2
  62. package/dist/{chunk-F4LPQA4E.js → chunk-BA32AVKS.js} +1 -1
  63. package/dist/chunk-CV4NES3P.js +9 -0
  64. package/dist/{chunk-PPHTIKZO.js → chunk-E4BOVKNJ.js} +1 -1
  65. package/dist/{chunk-W7PAIVAP.js → chunk-E7QLG3PG.js} +30 -9
  66. package/dist/{chunk-RKKO7QHH.js → chunk-EGMQURBR.js} +5 -4
  67. package/dist/{chunk-GMW4ZHST.js → chunk-EX22Q5SH.js} +2 -2
  68. package/dist/{chunk-F3WZ5AKM.js → chunk-GFYQKMQZ.js} +1 -1
  69. package/dist/{chunk-DYB66CNM.js → chunk-GR4YM7HT.js} +6 -3
  70. package/dist/{chunk-HG5VF3TZ.js → chunk-HMVQQEHW.js} +91 -2
  71. package/dist/chunk-INVSUFJK.js +71 -0
  72. package/dist/{chunk-4LRAJXHL.js → chunk-JSWOXRRE.js} +1 -1
  73. package/dist/{chunk-ZMDYQ2HH.js → chunk-KWWP3D7M.js} +1 -1
  74. package/dist/{chunk-46RL3E54.js → chunk-M6NQ4XGK.js} +1 -1
  75. package/dist/chunk-OHGH7O6T.js +19 -0
  76. package/dist/{chunk-4ISUIS6F.js → chunk-OOC7Q67K.js} +1 -1
  77. package/dist/{chunk-XNXK5MA4.js → chunk-PCT47E7O.js} +1 -1
  78. package/dist/{chunk-YEVG2X5R.js → chunk-SNQRGH4A.js} +1 -1
  79. package/dist/chunk-T6MXORP5.js +116 -0
  80. package/dist/chunk-X4IXXLWM.js +306 -0
  81. package/dist/chunk-XIDD7PJO.js +416 -0
  82. package/dist/chunk-ZUTUI27P.js +21 -0
  83. package/dist/generated/index.d.ts +6 -0
  84. package/dist/generated/index.js +62 -56
  85. package/dist/index.js +62 -56
  86. package/dist/styles.css +1087 -20
  87. package/package.json +3 -3
  88. package/dist/chunk-7SDUKCNW.js +0 -141
  89. package/dist/{chunk-JZPK4IXR.js → chunk-DKNBGL26.js} +1 -1
  90. /package/dist/{chunk-QRLIWCLX.js → chunk-S3QTFUJX.js} +0 -0
@@ -0,0 +1,482 @@
1
+ /*
2
+ * DataGrid: a list as columns, one track list on the grid.
3
+ *
4
+ * THE GRID MAKES NO SCROLLPORT OF ITS OWN. `overflow: clip` rounds the rows off
5
+ * at the corner exactly as `hidden` would, and it is the difference between a
6
+ * sticky head that works and one that cannot: `hidden` makes a scroll
7
+ * container, a sticky box is confined to its nearest scrollport, and this one
8
+ * grows to its rows, so its offset is always 0. The head sticks against the
9
+ * page's own scroller; an application whose scroller carries a sticky bar of
10
+ * its own sets `--crewlet-data-grid-sticky-top` to that bar's height.
11
+ *
12
+ * THE COLUMNS BELONG TO THE GRID, NOT TO A ROW. The tracks are declared once,
13
+ * on the grid (its inline `grid-template-columns`), and the head, the body,
14
+ * the bands and the rows are `subgrid` passthroughs, so a head cell and a cell
15
+ * twenty rows down size the same track. Everything that is not a row of cells
16
+ * spans the whole width.
17
+ */
18
+
19
+ .crewlet-data-grid {
20
+ display: grid;
21
+ min-width: 0;
22
+ border: 1px solid var(--color-border-hover);
23
+ border-radius: var(--radius-md);
24
+ overflow: clip;
25
+ background: var(--color-surface-subtle);
26
+ }
27
+
28
+ /*
29
+ * A CARD'S BODY (`flush`, and every grid straight in a Card or its body, told
30
+ * or not): the card is the frame, so the grid draws none of its own and one
31
+ * rule parts it from the card's head. Under the card's header, the header's
32
+ * own rule is that one.
33
+ */
34
+ .crewlet-data-grid[data-flush],
35
+ .crewlet-card > .crewlet-data-grid,
36
+ .crewlet-card__body > .crewlet-data-grid {
37
+ border: 0;
38
+ border-top: 1px solid var(--color-border-default);
39
+ border-radius: var(--radius-none);
40
+ background: transparent;
41
+ }
42
+
43
+ .crewlet-card__header + .crewlet-data-grid {
44
+ border-top: 0;
45
+ }
46
+
47
+ /* A full-width band by default: the head, the body, the foot, the reset and
48
+ the empty state, which is the one child when the grid carries no tracks. */
49
+ .crewlet-data-grid > * {
50
+ grid-column: 1 / -1;
51
+ }
52
+
53
+ .crewlet-data-grid__head,
54
+ .crewlet-data-grid__body,
55
+ .crewlet-data-grid__band,
56
+ .crewlet-data-grid__row {
57
+ display: grid;
58
+ grid-template-columns: subgrid;
59
+ grid-column: 1 / -1;
60
+ }
61
+
62
+ .crewlet-data-grid__band-head,
63
+ .crewlet-data-grid__band-foot {
64
+ grid-column: 1 / -1;
65
+ }
66
+
67
+ /*
68
+ * The head: a floor at the row height (density shrinks the padding, not the
69
+ * label), on the raised ground, sticky at the application's offset.
70
+ */
71
+ .crewlet-data-grid__head {
72
+ align-items: center;
73
+ min-height: var(--size-row-md);
74
+ border-bottom: 1px solid var(--color-border-hover);
75
+ background: var(--color-surface-elevated);
76
+ position: sticky;
77
+ top: var(--crewlet-data-grid-sticky-top, var(--spacing-0));
78
+ z-index: var(--z-index-sticky);
79
+ }
80
+
81
+ /*
82
+ * THE LIST TABLE'S HEAD: the micro-label register every table takes, 11/500
83
+ * uppercase. A sortable head is a button with its chrome reset; the reset
84
+ * takes the focus ring with it, so the ring is restated below.
85
+ */
86
+ .crewlet-data-grid__th {
87
+ display: flex;
88
+ align-items: center;
89
+ gap: var(--spacing-1);
90
+ padding: var(--spacing-2) var(--spacing-3);
91
+ font-size: var(--font-size-2xs);
92
+ font-weight: var(--font-weight-medium);
93
+ text-transform: uppercase;
94
+ letter-spacing: var(--font-letter-spacing-wide);
95
+ color: var(--color-text-tertiary);
96
+ cursor: pointer;
97
+ min-width: 0;
98
+ transition: color var(--motion-duration-fast) var(--motion-easing-default);
99
+ }
100
+
101
+ .crewlet-data-grid__th--plain {
102
+ cursor: default;
103
+ }
104
+
105
+ /* A sortable head's control fills the head: the whole cell is the target. */
106
+ .crewlet-data-grid__sort {
107
+ all: unset;
108
+ display: flex;
109
+ align-items: center;
110
+ gap: var(--spacing-1);
111
+ flex: 1 1 auto;
112
+ min-width: 0;
113
+ margin: calc(-1 * var(--spacing-2)) calc(-1 * var(--spacing-3));
114
+ padding: var(--spacing-2) var(--spacing-3);
115
+ cursor: pointer;
116
+ }
117
+
118
+ .crewlet-data-grid__th--right .crewlet-data-grid__sort {
119
+ justify-content: flex-end;
120
+ }
121
+
122
+ .crewlet-data-grid__th:not(.crewlet-data-grid__th--plain):hover,
123
+ .crewlet-data-grid__th--sorted {
124
+ color: var(--color-text-primary);
125
+ }
126
+
127
+ .crewlet-data-grid__th--right {
128
+ justify-content: flex-end;
129
+ }
130
+
131
+ .crewlet-data-grid__sort:focus-visible,
132
+ .crewlet-data-grid__cols-reset:focus-visible {
133
+ outline: 2px solid var(--color-focus);
134
+ outline-offset: var(--size-focus-ring-inset-offset);
135
+ }
136
+
137
+ .crewlet-data-grid__body {
138
+ min-width: 0;
139
+ }
140
+
141
+ .crewlet-data-grid__row {
142
+ align-items: center;
143
+ min-height: var(--size-row-md);
144
+ border-bottom: 1px solid var(--color-border-default);
145
+ color: inherit;
146
+ cursor: pointer;
147
+ /* The containing block for the row's link. */
148
+ position: relative;
149
+ transition: background var(--motion-duration-fast) var(--motion-easing-default);
150
+ }
151
+
152
+ /* THE ROW'S OWN LINK, STRETCHED OVER IT, out of flow so it takes no track. */
153
+ .crewlet-data-grid__row-link {
154
+ position: absolute;
155
+ inset: 0;
156
+ }
157
+
158
+ /* A button overlay (a row that acts and has no address) gives up the chrome a
159
+ button brings, and draws the focus ring inside the row. */
160
+ button.crewlet-data-grid__row-link {
161
+ all: unset;
162
+ position: absolute;
163
+ inset: 0;
164
+ cursor: pointer;
165
+ }
166
+
167
+ .crewlet-data-grid__row-link:focus-visible {
168
+ outline: 2px solid var(--color-focus);
169
+ outline-offset: var(--size-focus-ring-inset-offset);
170
+ }
171
+
172
+ /*
173
+ * AND THE CELLS' OWN CONTROLS SIT ABOVE IT: positioned and later in the
174
+ * document than the overlay, they win the hit test in the same stacking
175
+ * context, with no z-index to reason about against the sticky head. A cell's
176
+ * element that is not a link or a button but must take its own clicks (a
177
+ * refusal sentence a reader selects) carries `data-above-row`.
178
+ */
179
+ .crewlet-data-grid__row a:not(.crewlet-data-grid__row-link),
180
+ .crewlet-data-grid__row button:not(.crewlet-data-grid__row-link),
181
+ .crewlet-data-grid__row [data-above-row] {
182
+ position: relative;
183
+ }
184
+
185
+ .crewlet-data-grid__row:last-child {
186
+ border-bottom: none;
187
+ }
188
+
189
+ .crewlet-data-grid__row:hover {
190
+ background: var(--color-surface-hover);
191
+ }
192
+
193
+ .crewlet-data-grid__row--selected,
194
+ .crewlet-data-grid__row--selected:hover {
195
+ background: var(--color-brand-accent-soft);
196
+ }
197
+
198
+ .crewlet-data-grid__row--cursor {
199
+ box-shadow: inset 2px 0 0 var(--color-brand-accent);
200
+ }
201
+
202
+ /* A FAILED ROW IS MARKED ON ITS EDGE, not tinted: the status column already
203
+ says so, and two signals for one fact teach a reader to trust neither. */
204
+ .crewlet-data-grid__row--failed {
205
+ box-shadow: inset 2px 0 0 var(--color-feedback-danger-ink);
206
+ }
207
+
208
+ .crewlet-data-grid__cell {
209
+ padding: var(--spacing-1) var(--spacing-3);
210
+ font-size: var(--font-size-compact);
211
+ min-width: 0;
212
+ display: flex;
213
+ align-items: center;
214
+ gap: var(--spacing-2);
215
+ }
216
+
217
+ /*
218
+ * A SHRINK COLUMN does not wrap inside its capped track, and does not paint
219
+ * outside it: a nowrap cell narrower than its content would spill over the
220
+ * column beside it. `clip`, since a scrollport here would cut the sticky head.
221
+ */
222
+ .crewlet-data-grid__th--shrink,
223
+ .crewlet-data-grid__cell--shrink {
224
+ white-space: nowrap;
225
+ overflow: clip;
226
+ }
227
+
228
+ .crewlet-data-grid__cell--right {
229
+ justify-content: flex-end;
230
+ }
231
+
232
+ .crewlet-data-grid__truncate {
233
+ min-width: 0;
234
+ overflow: hidden;
235
+ text-overflow: ellipsis;
236
+ white-space: nowrap;
237
+ }
238
+
239
+ .crewlet-data-grid__band + .crewlet-data-grid__band {
240
+ border-top: 1px solid var(--color-border-hover);
241
+ }
242
+
243
+ .crewlet-data-grid__band-head,
244
+ .crewlet-data-grid__band-foot {
245
+ display: flex;
246
+ }
247
+
248
+ /* The band row's one cell lays its parts out on the row's own flex line. */
249
+ .crewlet-data-grid__band-cell {
250
+ display: contents;
251
+ }
252
+
253
+ .crewlet-data-grid__band-head {
254
+ display: flex;
255
+ align-items: center;
256
+ gap: var(--spacing-2);
257
+ padding: var(--spacing-2) var(--spacing-3);
258
+ background: var(--color-surface-elevated);
259
+ font-size: var(--font-size-xs);
260
+ font-weight: var(--font-weight-semibold);
261
+ position: sticky;
262
+ /* Under the column heads, which are a row tall and parked at the offset;
263
+ confined to its own band, so it leaves with the band. Above the rows
264
+ (positioned for the row link) and below the heads. */
265
+ top: calc(var(--crewlet-data-grid-sticky-top, var(--spacing-0)) + var(--size-row-md));
266
+ z-index: var(--z-index-raised);
267
+ }
268
+
269
+ /* A SECOND AXIS IS A BAND INSIDE A BAND, inset and quieter, so it does not
270
+ read as its parent's sibling; and it draws no rule above itself. */
271
+ .crewlet-data-grid__band .crewlet-data-grid__band > .crewlet-data-grid__band-head {
272
+ padding-left: calc(var(--spacing-3) + var(--spacing-4));
273
+ background: var(--color-surface-subtle);
274
+ font-weight: var(--font-weight-medium);
275
+ color: var(--color-text-tertiary);
276
+ }
277
+
278
+ .crewlet-data-grid__band .crewlet-data-grid__band + .crewlet-data-grid__band {
279
+ border-top: none;
280
+ }
281
+
282
+ .crewlet-data-grid__band-count {
283
+ margin-left: auto;
284
+ color: var(--color-text-tertiary);
285
+ font-weight: var(--font-weight-regular);
286
+ font-variant-numeric: tabular-nums;
287
+ }
288
+
289
+ .crewlet-data-grid__band-foot {
290
+ padding: var(--spacing-1) var(--spacing-3);
291
+ font-size: var(--font-size-2xs);
292
+ color: var(--color-text-tertiary);
293
+ background: var(--color-surface-elevated);
294
+ }
295
+
296
+ .crewlet-data-grid__band-foot a {
297
+ color: var(--color-brand-accent-ink);
298
+ }
299
+
300
+ .crewlet-data-grid__band-foot a:hover {
301
+ color: var(--color-text-primary);
302
+ }
303
+
304
+ .crewlet-data-grid__foot {
305
+ display: flex;
306
+ align-items: center;
307
+ gap: var(--spacing-2);
308
+ padding: var(--spacing-2) var(--spacing-3);
309
+ border-top: 1px solid var(--color-border-hover);
310
+ background: var(--color-surface-elevated);
311
+ font-size: var(--font-size-xs);
312
+ }
313
+
314
+ .crewlet-data-grid__foot-spacer {
315
+ flex: 1 1 auto;
316
+ }
317
+
318
+ .crewlet-data-grid__note {
319
+ font-size: var(--font-size-xs);
320
+ color: var(--color-text-tertiary);
321
+ }
322
+
323
+ .crewlet-data-grid__cols-reset {
324
+ all: unset;
325
+ /* After the reset, which takes `grid-column` too. */
326
+ grid-column: 1 / -1;
327
+ padding: var(--spacing-1) var(--spacing-3);
328
+ font-size: var(--font-size-2xs);
329
+ color: var(--color-brand-accent-ink);
330
+ cursor: pointer;
331
+ text-align: left;
332
+ }
333
+
334
+ /* ---- The column chooser ------------------------------------------------ */
335
+
336
+ .crewlet-column-chooser__label {
337
+ font-size: var(--font-size-2xs);
338
+ font-weight: var(--font-weight-medium);
339
+ letter-spacing: var(--font-letter-spacing-wide);
340
+ text-transform: uppercase;
341
+ color: var(--color-text-tertiary);
342
+ }
343
+
344
+ /* TWO COLUMNS: a single file of short words makes a menu as tall as the grid
345
+ has columns. */
346
+ .crewlet-column-chooser__choices {
347
+ display: grid;
348
+ grid-template-columns: repeat(2, minmax(0, 1fr));
349
+ gap: var(--spacing-1) var(--spacing-3);
350
+ }
351
+
352
+ /* The pointer target is the row, not the 13px box. */
353
+ .crewlet-column-chooser__choice {
354
+ display: flex;
355
+ align-items: center;
356
+ gap: var(--spacing-2);
357
+ min-height: var(--size-target-min);
358
+ font-size: var(--font-size-compact);
359
+ color: var(--color-text-secondary);
360
+ cursor: pointer;
361
+ }
362
+
363
+ @media (prefers-reduced-motion: reduce) {
364
+ .crewlet-data-grid__th,
365
+ .crewlet-data-grid__row {
366
+ transition: none;
367
+ }
368
+ }
369
+
370
+ /* ---- A ROW IS A CARD ON A PHONE -----------------------------------------
371
+ A GRID IS COLUMNS, AND A PHONE DOES NOT HAVE THEM: the grid clips (for its
372
+ sticky head), so the columns past the edge were cut off with nothing to
373
+ scroll to, and a sideways scroller resolves every flexible track to zero. So
374
+ the head goes and each cell draws its own name beside its value
375
+ (`data-label`); the subgrid chain is unwound to blocks and each cell is a
376
+ flex line, label then value. A cell with nothing in it is no line
377
+ (`:empty`), and a cell that draws a marked absence has content and stays.
378
+ The sort is in the application's state, so a sorted list still arrives
379
+ sorted. */
380
+ @media (width < 640px) {
381
+ .crewlet-data-grid {
382
+ display: block;
383
+ }
384
+
385
+ .crewlet-data-grid__head {
386
+ display: none;
387
+ }
388
+
389
+ .crewlet-data-grid__body,
390
+ .crewlet-data-grid__band {
391
+ display: block;
392
+ }
393
+
394
+ .crewlet-data-grid__row {
395
+ display: block;
396
+ padding: var(--spacing-2) var(--spacing-3);
397
+ min-height: 0;
398
+ }
399
+
400
+ /* A FIXED BASIS lines the names up without a track, and the name wraps
401
+ inside it rather than pushing its value past every other card line. */
402
+ .crewlet-data-grid__cell {
403
+ display: flex;
404
+ align-items: baseline;
405
+ gap: var(--spacing-3);
406
+ padding: 1px 0;
407
+ min-width: 0;
408
+ }
409
+
410
+ .crewlet-data-grid__cell:empty {
411
+ display: none;
412
+ }
413
+
414
+ .crewlet-data-grid__cell[data-label]::before {
415
+ content: attr(data-label);
416
+ flex: 0 0 7rem;
417
+ overflow-wrap: anywhere;
418
+ font-size: var(--font-size-2xs);
419
+ text-transform: uppercase;
420
+ letter-spacing: var(--font-letter-spacing-wide);
421
+ color: var(--color-text-tertiary);
422
+ }
423
+
424
+ /* `shrink` and `right` are column shapes, and there are no columns here. */
425
+ .crewlet-data-grid__cell--shrink,
426
+ .crewlet-data-grid__cell--right {
427
+ white-space: normal;
428
+ justify-content: flex-start;
429
+ }
430
+
431
+ .crewlet-data-grid__cell .crewlet-data-grid__truncate {
432
+ white-space: normal;
433
+ overflow: visible;
434
+ text-overflow: clip;
435
+ overflow-wrap: anywhere;
436
+ }
437
+
438
+ /* ---- THE COMPACT ROW (`phoneRows="compact"`) ---------------------------
439
+ TWO LINES, NO LABELS: what the row is, then its marks. One flex run that
440
+ breaks once: the lead cells first, a zero-height full-width `::after`
441
+ between them and the rest, then every other cell in column order. */
442
+ .crewlet-data-grid[data-phone-rows='compact'] .crewlet-data-grid__row {
443
+ display: flex;
444
+ flex-wrap: wrap;
445
+ align-items: center;
446
+ gap: var(--spacing-1) var(--spacing-2);
447
+ }
448
+
449
+ .crewlet-data-grid[data-phone-rows='compact'] .crewlet-data-grid__row::after {
450
+ content: '';
451
+ order: 1;
452
+ flex-basis: 100%;
453
+ height: 0;
454
+ }
455
+
456
+ .crewlet-data-grid[data-phone-rows='compact'] .crewlet-data-grid__cell {
457
+ order: 2;
458
+ padding: 0;
459
+ align-items: center;
460
+ gap: var(--spacing-1);
461
+ }
462
+
463
+ .crewlet-data-grid[data-phone-rows='compact'] .crewlet-data-grid__cell[data-lead] {
464
+ order: 0;
465
+ }
466
+
467
+ /* The title takes the rest of the first line, beside the key. */
468
+ .crewlet-data-grid[data-phone-rows='compact']
469
+ .crewlet-data-grid__cell[data-lead]:not(.crewlet-data-grid__cell--shrink) {
470
+ flex: 1 1 0;
471
+ min-width: 0;
472
+ font-weight: var(--font-weight-medium);
473
+ }
474
+
475
+ .crewlet-data-grid[data-phone-rows='compact'] .crewlet-data-grid__cell[data-label]::before {
476
+ content: none;
477
+ }
478
+
479
+ .crewlet-data-grid[data-phone-rows='compact'] .crewlet-data-grid__cell[data-phone-omit] {
480
+ display: none;
481
+ }
482
+ }
@@ -1,10 +1,17 @@
1
1
  import '../chunk-FFMCMSJB.js';
2
- export { HuePicker, HueSwatch } from '../chunk-F4LPQA4E.js';
2
+ export { HuePicker, HueSwatch } from '../chunk-BA32AVKS.js';
3
3
  import '../chunk-AYKXMIOR.js';
4
- import '../chunk-2QZ2VPHR.js';
5
- import '../chunk-7SDUKCNW.js';
6
- import '../chunk-RKKO7QHH.js';
4
+ import '../chunk-4OK4DX3V.js';
5
+ import '../chunk-X4IXXLWM.js';
6
+ import '../chunk-WIATRXEJ.js';
7
+ import '../chunk-EGMQURBR.js';
7
8
  import '../chunk-BHHIIK3M.js';
9
+ import '../chunk-D6FEHY5G.js';
10
+ import '../chunk-OMV5W53A.js';
11
+ import '../chunk-H5XTJ7GJ.js';
8
12
  import '../chunk-2YTOOH3A.js';
13
+ import '../chunk-OG6CL3EB.js';
14
+ import '../chunk-4FQT6ZAY.js';
15
+ import '../chunk-NUZHC6MM.js';
9
16
  import '../chunk-BZFWDIV6.js';
10
17
  import '../chunk-ODEQTPFM.js';
@@ -1,3 +1,3 @@
1
- export { LAYERS_LIST_LABELS, LayersList } from '../chunk-46RL3E54.js';
2
- import '../chunk-RKKO7QHH.js';
1
+ export { LAYERS_LIST_LABELS, LayersList } from '../chunk-M6NQ4XGK.js';
2
+ import '../chunk-EGMQURBR.js';
3
3
  import '../chunk-ODEQTPFM.js';
@@ -0,0 +1,34 @@
1
+ import type { ReactNode } from 'react';
2
+ export interface LockedLabelProps {
3
+ /** What the place is called: a nav row's words, a tab's. */
4
+ children: ReactNode;
5
+ /**
6
+ * Why the reader cannot open it, as a sentence: "Needs Admin access". Left
7
+ * out, nothing is locked and the label is drawn as it is, with no mark.
8
+ */
9
+ reason?: string | undefined;
10
+ /**
11
+ * Draws the key. Off where the place stands under a heading that already
12
+ * carries it (a nav group whose every row is locked): the reason is still
13
+ * the title and still read after the name, and the key is drawn once, on
14
+ * the heading, rather than down every row.
15
+ */
16
+ mark?: boolean | undefined;
17
+ className?: string | undefined;
18
+ }
19
+ /**
20
+ * A place's name with the key after it, where the reader lacks the access it
21
+ * takes: the sidebar's rows, a section column's, a section tab's.
22
+ *
23
+ * LOCKED, NEVER HIDDEN. A place that vanished for a reader without its access
24
+ * is one they cannot know exists, and cannot ask an admin for; so the name
25
+ * stays, the key says it is closed, the pointer's title says why, and a
26
+ * screen reader hears the reason after the name (", Needs Admin access").
27
+ *
28
+ * ONE MARK WHEREVER A PLACE IS OFFERED, so a locked place reads the same in
29
+ * the rail, in a column of sections and in a row of tabs: a tab that drew no
30
+ * key looked open and then refused.
31
+ *
32
+ * Nothing but the label where nothing is missing.
33
+ */
34
+ export declare function LockedLabel({ children, reason, mark, className }: LockedLabelProps): import("react").JSX.Element;
@@ -0,0 +1,3 @@
1
+ import './LockedLabel.css';
2
+ export { LockedLabel } from './LockedLabel.js';
3
+ export type { LockedLabelProps } from './LockedLabel.js';
@@ -0,0 +1,3 @@
1
+ export { LockedLabel } from '../chunk-OHGH7O6T.js';
2
+ import '../chunk-BZFWDIV6.js';
3
+ import '../chunk-ODEQTPFM.js';
@@ -0,0 +1,16 @@
1
+ /*
2
+ * LockedLabel: a place's words with the key after them. The words keep their
3
+ * own ink and size; the key takes the quiet step, a step closer to the words
4
+ * than the words are to anything else.
5
+ */
6
+ .crewlet-locked-label {
7
+ display: inline-flex;
8
+ align-items: center;
9
+ gap: var(--spacing-1);
10
+ min-width: 0;
11
+ }
12
+
13
+ .crewlet-locked-label__key {
14
+ flex: none;
15
+ color: var(--color-text-tertiary);
16
+ }
@@ -1,13 +1,16 @@
1
- export { MARKDOWN_FORMATS, MarkdownEditor, formatMarkdown, insertMarkdown, markdownWords } from '../chunk-GMW4ZHST.js';
1
+ export { MARKDOWN_FORMATS, MarkdownEditor, formatMarkdown, insertMarkdown, markdownWords } from '../chunk-EX22Q5SH.js';
2
2
  import '../chunk-NR4CPM4T.js';
3
- import '../chunk-4ISUIS6F.js';
4
- import '../chunk-2QZ2VPHR.js';
5
- import '../chunk-7SDUKCNW.js';
6
- import '../chunk-RKKO7QHH.js';
3
+ import '../chunk-OOC7Q67K.js';
4
+ import '../chunk-4OK4DX3V.js';
5
+ import '../chunk-X4IXXLWM.js';
6
+ import '../chunk-WIATRXEJ.js';
7
+ import '../chunk-EGMQURBR.js';
7
8
  import '../chunk-BHHIIK3M.js';
9
+ import '../chunk-D6FEHY5G.js';
8
10
  import '../chunk-OMV5W53A.js';
9
11
  import '../chunk-H5XTJ7GJ.js';
10
12
  import '../chunk-2YTOOH3A.js';
13
+ import '../chunk-OG6CL3EB.js';
11
14
  import '../chunk-4FQT6ZAY.js';
12
15
  import '../chunk-NUZHC6MM.js';
13
16
  import '../chunk-BZFWDIV6.js';
@@ -1,10 +1,16 @@
1
- export { MERGE_CONFLICTS_LABELS, MergeConflicts } from '../chunk-B5J23C73.js';
2
- import '../chunk-4ISUIS6F.js';
3
- import '../chunk-2QZ2VPHR.js';
4
- import '../chunk-7SDUKCNW.js';
5
- import '../chunk-RKKO7QHH.js';
1
+ export { MERGE_CONFLICTS_LABELS, MergeConflicts } from '../chunk-2PEXZ7L4.js';
2
+ import '../chunk-OOC7Q67K.js';
3
+ import '../chunk-4OK4DX3V.js';
4
+ import '../chunk-X4IXXLWM.js';
5
+ import '../chunk-WIATRXEJ.js';
6
+ import '../chunk-EGMQURBR.js';
6
7
  import '../chunk-BHHIIK3M.js';
8
+ import '../chunk-D6FEHY5G.js';
9
+ import '../chunk-OMV5W53A.js';
10
+ import '../chunk-H5XTJ7GJ.js';
7
11
  import '../chunk-2YTOOH3A.js';
8
12
  import '../chunk-OG6CL3EB.js';
13
+ import '../chunk-4FQT6ZAY.js';
14
+ import '../chunk-NUZHC6MM.js';
9
15
  import '../chunk-BZFWDIV6.js';
10
16
  import '../chunk-ODEQTPFM.js';
@@ -0,0 +1,14 @@
1
+ import type { HTMLAttributes, ReactNode } from 'react';
2
+ export interface PageNoteProps extends HTMLAttributes<HTMLParagraphElement> {
3
+ children?: ReactNode;
4
+ }
5
+ /**
6
+ * One sentence saying what a screen answers, under the page's own title.
7
+ *
8
+ * NOT A HEADER. A page bar's breadcrumb is the title; what is left is the
9
+ * sentence that explains the screen, worth keeping where the screen answers a
10
+ * question whose shape is not obvious from its name. A quiet line rather than
11
+ * a panel, at the reading measure: a reader who has read it once scans past it
12
+ * for ever after. It keeps no margin: the page's column sets the rhythm.
13
+ */
14
+ export declare function PageNote({ className, children, ...rest }: PageNoteProps): import("react").JSX.Element;
@@ -0,0 +1,3 @@
1
+ import './PageNote.css';
2
+ export { PageNote } from './PageNote.js';
3
+ export type { PageNoteProps } from './PageNote.js';
@@ -0,0 +1,2 @@
1
+ export { PageNote } from '../chunk-CV4NES3P.js';
2
+ import '../chunk-ODEQTPFM.js';
@@ -0,0 +1,12 @@
1
+ /*
2
+ * PageNote: the screen's one quiet sentence. No word alone on its last line
3
+ * (`pretty`), which reads as a sentence that stopped rather than one that
4
+ * ended. No margin of its own: the column it stands in sets the gap.
5
+ */
6
+ .crewlet-page-note {
7
+ margin: 0;
8
+ max-width: var(--size-measure);
9
+ font-size: var(--font-size-compact);
10
+ color: var(--color-text-tertiary);
11
+ text-wrap: pretty;
12
+ }