@crewlethq/ui 0.64.1 → 0.65.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 (44) hide show
  1. package/dist/AppShell/index.d.ts +1 -0
  2. package/dist/AppShell/index.js +1 -1
  3. package/dist/AppShell/screenWidth.d.ts +66 -0
  4. package/dist/ArtifactCard/index.js +3 -3
  5. package/dist/AuthLayout/index.js +2 -2
  6. package/dist/Card/index.js +1 -1
  7. package/dist/DataGrid/DataGrid.d.ts +35 -3
  8. package/dist/DataGrid/index.js +1 -1
  9. package/dist/{DataGrid-QYORTTHI.css → DataGrid-NHIN2I42.css} +96 -93
  10. package/dist/DeepWorkCard/index.js +3 -3
  11. package/dist/EntityList/index.js +3 -3
  12. package/dist/FolderTile/index.js +2 -2
  13. package/dist/ListDetail/ListDetail.d.ts +10 -5
  14. package/dist/ListDetail/index.js +1 -1
  15. package/dist/{ListDetail-5NXERLRJ.css → ListDetail-N3L7PB46.css} +38 -9
  16. package/dist/OpenInAppCard/index.js +3 -3
  17. package/dist/ProposalCard/index.js +3 -3
  18. package/dist/RefusalCard/index.js +3 -3
  19. package/dist/RelatedRow/index.js +2 -2
  20. package/dist/ResultTableCard/index.js +3 -3
  21. package/dist/RichEditor/index.js +1 -1
  22. package/dist/StatusCard/index.js +2 -2
  23. package/dist/{StatusCard-FCJN7SXJ.css → StatusCard-72STCSWY.css} +6 -6
  24. package/dist/{chunk-7XKDPTZ5.js → chunk-4AUTALJA.js} +5 -6
  25. package/dist/{chunk-ZFN4IBVC.js → chunk-5K7GGQNX.js} +1 -1
  26. package/dist/{chunk-ISBKJOLI.js → chunk-7IW3P6FH.js} +1 -1
  27. package/dist/{chunk-RPX3WICJ.js → chunk-7QTJO3PV.js} +1 -1
  28. package/dist/{chunk-OGRMOWMO.js → chunk-CNEHFH2A.js} +1 -1
  29. package/dist/{chunk-BVNFNFA6.js → chunk-DS5NBENV.js} +1 -1
  30. package/dist/{chunk-AJLMINJU.js → chunk-E55DKVY7.js} +61 -3
  31. package/dist/{chunk-4W7F3JEK.js → chunk-ELLRZ5XR.js} +20 -9
  32. package/dist/{chunk-4WKOLL7C.js → chunk-FZUDUNCK.js} +1 -1
  33. package/dist/{chunk-G4234OIG.js → chunk-NTQPJJAN.js} +4 -4
  34. package/dist/{chunk-YBKZJBKM.js → chunk-RQHN4J5P.js} +1 -1
  35. package/dist/{chunk-N7PXGOZP.js → chunk-UBIPDEFV.js} +2 -2
  36. package/dist/{chunk-RHL4OMQ3.js → chunk-UWOYDHVW.js} +1 -1
  37. package/dist/{chunk-JAFWGVX2.js → chunk-WKKWF277.js} +1 -1
  38. package/dist/{chunk-6MTJWQ3V.js → chunk-WTXCK46H.js} +1 -1
  39. package/dist/{chunk-RXG543EB.js → chunk-YBC2CYPD.js} +4 -4
  40. package/dist/generated/index.js +28 -28
  41. package/dist/index.js +28 -28
  42. package/dist/styles.css +142 -110
  43. package/package.json +3 -3
  44. package/dist/{Editor-URGZOK2S.js → Editor-NZRUKWB4.js} +1 -1
@@ -5,6 +5,7 @@ export { APP_SHELL_ASIDE_WIDTH, AppShell, AppShellRail, AppShellRailRow, AppShel
5
5
  export { RESIZE_HANDLE_LARGE_STEP, RESIZE_HANDLE_STEP, ResizeHandle, clampSize } from './ResizeHandle.js';
6
6
  export type { ResizeHandleProps } from './ResizeHandle.js';
7
7
  export { readStoredWidth, useStoredWidth } from './storedWidth.js';
8
+ export { useScreenBelow, useScreenWidth } from './screenWidth.js';
8
9
  export type { StoredWidth, StoredWidthOptions, WidthStorage } from './storedWidth.js';
9
10
  export { AccountRow } from './AccountRow.js';
10
11
  export type { AccountRowMenu, AccountRowProps } from './AccountRow.js';
@@ -1,4 +1,4 @@
1
- export { APP_SHELL_ASIDE_WIDTH, AccountRow, AppShell, AppShellRail, AppShellRailRow, AppShellRailStatus, AppShellToggle, AppShellTopbar, readStoredWidth, useAppShell, useStoredWidth } from '../chunk-AJLMINJU.js';
1
+ export { APP_SHELL_ASIDE_WIDTH, AccountRow, AppShell, AppShellRail, AppShellRailRow, AppShellRailStatus, AppShellToggle, AppShellTopbar, readStoredWidth, useAppShell, useScreenBelow, useScreenWidth, useStoredWidth } from '../chunk-E55DKVY7.js';
2
2
  import '../chunk-RTPQDNW3.js';
3
3
  import '../chunk-T73DMDU4.js';
4
4
  export { RESIZE_HANDLE_LARGE_STEP, RESIZE_HANDLE_STEP, ResizeHandle, clampSize, useAppShellAside, useAppShellPeek } from '../chunk-PIYJNCN7.js';
@@ -0,0 +1,66 @@
1
+ /**
2
+ * The SCREEN'S width: the content column the shell draws a screen in, which is
3
+ * what a screen's layout has to fit, rather than the window's.
4
+ *
5
+ * WHY NOT THE WINDOW. The window reports what the frame takes from it only
6
+ * while that never changes. The rail is a fixed share, but an aside the reader
7
+ * opens (the assistant) and drags wider takes width the window never reports:
8
+ * at a 1375px window with a 640px aside the screen is 443px wide while a
9
+ * media query still answers "desktop". A split screen that asks the window
10
+ * keeps its two columns and draws its reading pane 130px wide. Stylesheets
11
+ * already answer this with a container query on the content column; this is
12
+ * the same answer for the decisions a stylesheet cannot make, such as which
13
+ * pane a screen renders or whether it fills the window.
14
+ *
15
+ * ONE MEASUREMENT FOR EVERY CONSUMER. The shell measures its content column
16
+ * once and publishes the width through a store, so twenty screens asking do
17
+ * not attach twenty observers, and every one of them reads the same number in
18
+ * the same frame.
19
+ *
20
+ * RE-RENDERS ON A CROSSING, NOT ON A PIXEL. [useScreenBelow] subscribes to the
21
+ * answer to its own question, so dragging the aside re-renders a screen only
22
+ * when the screen crosses that screen's threshold.
23
+ *
24
+ * OUTSIDE A SHELL IT IS THE WINDOW. A primitive drawn in a story, a test or an
25
+ * application without the shell still gets an answer: the window's, through
26
+ * the same media query it would have asked before. The first render inside a
27
+ * shell answers the same way, and the shell's measurement replaces it in a
28
+ * layout effect, before anything is painted.
29
+ */
30
+ /** Where the shell keeps the content column's width, and who listens. */
31
+ export interface ScreenWidthStore {
32
+ /** The content column's inner width in px, or null before it is measured. */
33
+ get(): number | null;
34
+ /** Record a new width, telling every listener when it changed. */
35
+ set(width: number | null): void;
36
+ subscribe(listener: () => void): () => void;
37
+ }
38
+ /** A store for one shell's content column. */
39
+ export declare function createScreenWidthStore(): ScreenWidthStore;
40
+ export declare const ScreenWidthContext: import("react").Context<ScreenWidthStore | null>;
41
+ /**
42
+ * The width of an element's content box: its client width less its inline
43
+ * padding, which is what a container query on it measures.
44
+ *
45
+ * NULL FOR AN ELEMENT WITH NO BOX (hidden, detached, or a document without
46
+ * layout such as a test's): a width of zero there is not a measurement, and
47
+ * answering "narrower than everything" would fold every screen. The window's
48
+ * answer stands instead.
49
+ */
50
+ export declare function contentInlineSize(element: HTMLElement): number | null;
51
+ /**
52
+ * The width of the screen's content column in px, re-read whenever it
53
+ * changes; null outside a shell, or before the shell has measured it.
54
+ */
55
+ export declare function useScreenWidth(): number | null;
56
+ /**
57
+ * Whether the screen's content column is narrower than `width` px: the
58
+ * question a screen asks before it chooses its narrow shape. Inside a shell it
59
+ * is answered from the shell's measured content column, so an aside the
60
+ * reader opens or drags counts; outside one, by the window, exactly as
61
+ * `useMediaMatch(`(width < ${width}px)`)` would.
62
+ *
63
+ * STRICTLY UNDER, like the stylesheets' `(width < 640px)`: at exactly the
64
+ * threshold the wide shape fits.
65
+ */
66
+ export declare function useScreenBelow(width: number): boolean;
@@ -1,15 +1,15 @@
1
- export { ArtifactCard, ArtifactCardSkeleton, ArtifactPreviewGlyph } from '../chunk-N7PXGOZP.js';
1
+ export { ArtifactCard, ArtifactCardSkeleton, ArtifactPreviewGlyph } from '../chunk-UBIPDEFV.js';
2
2
  import '../chunk-BRLZXYPA.js';
3
3
  import '../chunk-CI3VPIJN.js';
4
4
  import '../chunk-L6NG7CUA.js';
5
5
  import '../chunk-RE3FBGQQ.js';
6
- import '../chunk-7XKDPTZ5.js';
6
+ import '../chunk-4AUTALJA.js';
7
7
  import '../chunk-AV2DXAEL.js';
8
8
  import '../chunk-BKP6XCAJ.js';
9
9
  import '../chunk-PZKHBB7D.js';
10
10
  import '../chunk-NHLNHH4J.js';
11
- import '../chunk-PBCNINMB.js';
12
11
  import '../chunk-DOY3KC6I.js';
12
+ import '../chunk-PBCNINMB.js';
13
13
  export { ARTIFACT_KINDS, ArtifactKindGlyph } from '../chunk-RSKW25Y5.js';
14
14
  import '../chunk-ETSF7SU6.js';
15
15
  import '../chunk-PGCLHYVP.js';
@@ -1,6 +1,6 @@
1
- export { AuthLayout } from '../chunk-JAFWGVX2.js';
1
+ export { AuthLayout } from '../chunk-WKKWF277.js';
2
2
  import '../chunk-7KBNFFM3.js';
3
- import '../chunk-7XKDPTZ5.js';
3
+ import '../chunk-4AUTALJA.js';
4
4
  import '../chunk-AV2DXAEL.js';
5
5
  import '../chunk-MLDTLZAO.js';
6
6
  import '../chunk-PQADV6P6.js';
@@ -1,4 +1,4 @@
1
- export { Card } from '../chunk-7XKDPTZ5.js';
1
+ export { Card } from '../chunk-4AUTALJA.js';
2
2
  export { useCardHeaderSlot } from '../chunk-AV2DXAEL.js';
3
3
  import '../chunk-MLDTLZAO.js';
4
4
  import '../chunk-PQADV6P6.js';
@@ -243,26 +243,58 @@ export interface GridFit {
243
243
  readonly width: number;
244
244
  /** The keys it dropped, in the order it dropped them. */
245
245
  readonly dropped: readonly string[];
246
+ /**
247
+ * Whether the grid has STACKED into card rows: it still did not fit with
248
+ * every give-way column gone, so its rows are cards, as on a phone.
249
+ */
250
+ readonly stacked?: boolean | undefined;
246
251
  }
247
252
  /**
248
253
  * The next fit, or null when this one stands. PURE, so the rules are held
249
254
  * without a layout engine:
250
255
  *
251
- * - the grid GREW past the width columns were dropped at: start again from all
252
- * of them (the next pass drops again only what still does not fit);
256
+ * - the grid GREW past the width columns were dropped or it stacked at: start
257
+ * again from all of them as columns (the next pass drops, and stacks, again
258
+ * only what still does not fit);
259
+ * - a stacked grid that did not grow stays stacked: its rows are cards and
260
+ * there is no column left to measure;
253
261
  * - the tracks OVERRUN the grid: drop the visible column with the lowest
254
262
  * `drop`, if there is one;
263
+ * - nothing is left to drop and the grid still cannot draw its values
264
+ * (`stack`: the tracks overrun, or a value is cut short): STACK into card
265
+ * rows, the shape a phone draws, rather than clip;
255
266
  * - otherwise remember a narrower width, so growing back past it re-tries.
256
267
  */
257
- export declare function fitGridColumns({ fit, width, overflows, visible, }: {
268
+ export declare function fitGridColumns({ fit, width, overflows, stack, visible, }: {
258
269
  fit: GridFit;
259
270
  width: number;
271
+ /** The columns do not fit: overrun, or a value or a head cut short. */
260
272
  overflows: boolean;
273
+ /**
274
+ * The grid cannot draw its VALUES: the tracks overrun, or a value is cut
275
+ * short. A head alone cut short drops a give-way column but never stacks.
276
+ */
277
+ stack?: boolean;
261
278
  visible: readonly {
262
279
  key: string;
263
280
  drop?: number | undefined;
264
281
  }[];
265
282
  }): GridFit | null;
283
+ /**
284
+ * Whether a content-sized column has been SQUEEZED: drawn narrower than its
285
+ * cap AND cutting a value short, or its HEAD. The quieter way a grid fails to
286
+ * fit: rather than overrun, it shrinks a status pill to a letter, or every
287
+ * head of a row of counts to its first letter over values that still fit,
288
+ * while the columns that could have gone stay. Read over the head and the
289
+ * first screen of rows. `leading` is how many of the grid's own columns (the
290
+ * selection column) are drawn before the caller's.
291
+ *
292
+ * `'values'` where a value is cut short (the grid cannot be read: drop, then
293
+ * stack), `'heads'` where only a head is (drop a column if one may go, but a
294
+ * grid whose every value reads is not turned into cards for a head), and
295
+ * null where nothing is.
296
+ */
297
+ export declare function squeezed<T>(wrap: HTMLElement, visible: readonly DataGridColumn<T>[], leading?: number): 'values' | 'heads' | null;
266
298
  /**
267
299
  * A list as columns: sortable heads, optional and give-way columns, bands for
268
300
  * a grouped answer, a row link stretched over each row, and a card per row on
@@ -1,4 +1,4 @@
1
- export { ChooserList, ColumnChooser, DataGrid, columnChoicesOf, countDataGridRows, fitGridColumns, parseGridSort, useAnyDataGridDriving, useDataGridDriving } from '../chunk-4W7F3JEK.js';
1
+ export { ChooserList, ColumnChooser, DataGrid, columnChoicesOf, countDataGridRows, fitGridColumns, parseGridSort, useAnyDataGridDriving, useDataGridDriving } from '../chunk-ELLRZ5XR.js';
2
2
  import '../chunk-PBCNINMB.js';
3
3
  import '../chunk-PPUR46MK.js';
4
4
  import '../chunk-ETSF7SU6.js';
@@ -467,7 +467,7 @@ button.crewlet-data-grid__row-link {
467
467
  }
468
468
  }
469
469
 
470
- /* ---- A ROW IS A CARD ON A PHONE -----------------------------------------
470
+ /* ---- A ROW IS A CARD ON A PHONE, OR WHERE COLUMNS DO NOT FIT -----------------------------------------
471
471
  A GRID IS COLUMNS, AND A PHONE DOES NOT HAVE THEM: the grid clips (for its
472
472
  sticky head), so the columns past the edge were cut off with nothing to
473
473
  scroll to, and a sideways scroller resolves every flexible track to zero. So
@@ -477,111 +477,114 @@ button.crewlet-data-grid__row-link {
477
477
  (`:empty`), and a cell that draws a marked absence has content and stays.
478
478
  The sort is in the application's state, so a sorted list still arrives
479
479
  sorted. */
480
- @media (width < 640px) {
481
- .crewlet-data-grid {
482
- /* No ghost control is pulled out here (see above): every line of a card
483
- starts at the grid's edge, and a compact row's marks run on one line,
484
- where the hover ground swallowed the gap before it. */
485
- --crewlet-data-grid-control-outdent: 0px;
486
-
487
- display: block;
488
- }
480
+ /* Card rows are the grid's own decision (`data-stacked`, DataGrid.tsx): set
481
+ on a phone, and wherever the grid's own width cannot hold its columns once
482
+ every give-way column has gone. `:where()` keeps each rule's weight what it
483
+ was when this block was a media query, so a rule written against the card
484
+ shape still wins where it did. */
485
+ .crewlet-data-grid:where([data-stacked]) {
486
+ /* No ghost control is pulled out here (see above): every line of a card
487
+ starts at the grid's edge, and a compact row's marks run on one line,
488
+ where the hover ground swallowed the gap before it. */
489
+ --crewlet-data-grid-control-outdent: 0px;
489
490
 
490
- .crewlet-data-grid__head {
491
- display: none;
492
- }
491
+ display: block;
492
+ }
493
493
 
494
- .crewlet-data-grid__body,
495
- .crewlet-data-grid__band {
496
- display: block;
497
- }
494
+ :where(.crewlet-data-grid[data-stacked]) .crewlet-data-grid__head {
495
+ display: none;
496
+ }
498
497
 
499
- .crewlet-data-grid__row {
500
- display: block;
501
- padding: var(--spacing-2) var(--crewlet-data-grid-edge);
502
- min-height: 0;
503
- }
498
+ :where(.crewlet-data-grid[data-stacked]) .crewlet-data-grid__body,
499
+ :where(.crewlet-data-grid[data-stacked]) .crewlet-data-grid__band {
500
+ display: block;
501
+ }
504
502
 
505
- /* A FIXED BASIS lines the names up without a track, and the name wraps
506
- inside it rather than pushing its value past every other card line. */
507
- .crewlet-data-grid__cell {
508
- display: flex;
509
- align-items: baseline;
510
- gap: var(--spacing-3);
511
- padding: 1px 0;
512
- min-width: 0;
513
- }
503
+ :where(.crewlet-data-grid[data-stacked]) .crewlet-data-grid__row {
504
+ display: block;
505
+ padding: var(--spacing-2) var(--crewlet-data-grid-edge);
506
+ min-height: 0;
507
+ }
514
508
 
515
- .crewlet-data-grid__cell:empty {
516
- display: none;
517
- }
509
+ /* A FIXED BASIS lines the names up without a track, and the name wraps
510
+ inside it rather than pushing its value past every other card line. */
511
+ :where(.crewlet-data-grid[data-stacked]) .crewlet-data-grid__cell {
512
+ display: flex;
513
+ align-items: baseline;
514
+ gap: var(--spacing-3);
515
+ padding: 1px 0;
516
+ min-width: 0;
517
+ }
518
518
 
519
- .crewlet-data-grid__cell[data-label]::before {
520
- content: attr(data-label);
521
- flex: 0 0 7rem;
522
- overflow-wrap: anywhere;
523
- font-size: var(--font-size-2xs);
524
- text-transform: uppercase;
525
- letter-spacing: var(--font-letter-spacing-wide);
526
- color: var(--color-text-tertiary);
527
- }
519
+ :where(.crewlet-data-grid[data-stacked]) .crewlet-data-grid__cell:empty {
520
+ display: none;
521
+ }
528
522
 
529
- /* `shrink` and `right` are column shapes, and there are no columns here. */
530
- .crewlet-data-grid__cell--shrink,
531
- .crewlet-data-grid__cell--right {
532
- white-space: normal;
533
- justify-content: flex-start;
534
- }
523
+ :where(.crewlet-data-grid[data-stacked]) .crewlet-data-grid__cell[data-label]::before {
524
+ content: attr(data-label);
525
+ flex: 0 0 7rem;
526
+ overflow-wrap: anywhere;
527
+ font-size: var(--font-size-2xs);
528
+ text-transform: uppercase;
529
+ letter-spacing: var(--font-letter-spacing-wide);
530
+ color: var(--color-text-tertiary);
531
+ }
535
532
 
536
- .crewlet-data-grid__cell .crewlet-data-grid__truncate {
537
- white-space: normal;
538
- overflow: visible;
539
- text-overflow: clip;
540
- overflow-wrap: anywhere;
541
- }
533
+ /* `shrink` and `right` are column shapes, and there are no columns here. */
534
+ :where(.crewlet-data-grid[data-stacked]) .crewlet-data-grid__cell--shrink,
535
+ :where(.crewlet-data-grid[data-stacked]) .crewlet-data-grid__cell--right {
536
+ white-space: normal;
537
+ justify-content: flex-start;
538
+ }
542
539
 
543
- /* ---- THE COMPACT ROW (`phoneRows="compact"`) ---------------------------
544
- TWO LINES, NO LABELS: what the row is, then its marks. One flex run that
545
- breaks once: the lead cells first, a zero-height full-width `::after`
546
- between them and the rest, then every other cell in column order. */
547
- .crewlet-data-grid[data-phone-rows='compact'] .crewlet-data-grid__row {
548
- display: flex;
549
- flex-wrap: wrap;
550
- align-items: center;
551
- gap: var(--spacing-1) var(--spacing-2);
552
- }
540
+ :where(.crewlet-data-grid[data-stacked]) .crewlet-data-grid__cell .crewlet-data-grid__truncate {
541
+ white-space: normal;
542
+ overflow: visible;
543
+ text-overflow: clip;
544
+ overflow-wrap: anywhere;
545
+ }
553
546
 
554
- .crewlet-data-grid[data-phone-rows='compact'] .crewlet-data-grid__row::after {
555
- content: '';
556
- order: 1;
557
- flex-basis: 100%;
558
- height: 0;
559
- }
547
+ /* ---- THE COMPACT ROW (`phoneRows="compact"`) ---------------------------
548
+ TWO LINES, NO LABELS: what the row is, then its marks. One flex run that
549
+ breaks once: the lead cells first, a zero-height full-width `::after`
550
+ between them and the rest, then every other cell in column order. */
551
+ .crewlet-data-grid[data-phone-rows='compact']:where([data-stacked]) .crewlet-data-grid__row {
552
+ display: flex;
553
+ flex-wrap: wrap;
554
+ align-items: center;
555
+ gap: var(--spacing-1) var(--spacing-2);
556
+ }
560
557
 
561
- .crewlet-data-grid[data-phone-rows='compact'] .crewlet-data-grid__cell {
562
- order: 2;
563
- padding: 0;
564
- align-items: center;
565
- gap: var(--spacing-1);
566
- }
558
+ .crewlet-data-grid[data-phone-rows='compact']:where([data-stacked]) .crewlet-data-grid__row::after {
559
+ content: '';
560
+ order: 1;
561
+ flex-basis: 100%;
562
+ height: 0;
563
+ }
567
564
 
568
- .crewlet-data-grid[data-phone-rows='compact'] .crewlet-data-grid__cell[data-lead] {
569
- order: 0;
570
- }
565
+ .crewlet-data-grid[data-phone-rows='compact']:where([data-stacked]) .crewlet-data-grid__cell {
566
+ order: 2;
567
+ padding: 0;
568
+ align-items: center;
569
+ gap: var(--spacing-1);
570
+ }
571
571
 
572
- /* The title takes the rest of the first line, beside the key. */
573
- .crewlet-data-grid[data-phone-rows='compact']
574
- .crewlet-data-grid__cell[data-lead]:not(.crewlet-data-grid__cell--shrink) {
575
- flex: 1 1 0;
576
- min-width: 0;
577
- font-weight: var(--font-weight-medium);
578
- }
572
+ .crewlet-data-grid[data-phone-rows='compact']:where([data-stacked]) .crewlet-data-grid__cell[data-lead] {
573
+ order: 0;
574
+ }
579
575
 
580
- .crewlet-data-grid[data-phone-rows='compact'] .crewlet-data-grid__cell[data-label]::before {
581
- content: none;
582
- }
576
+ /* The title takes the rest of the first line, beside the key. */
577
+ .crewlet-data-grid[data-phone-rows='compact']
578
+ .crewlet-data-grid__cell[data-lead]:not(.crewlet-data-grid__cell--shrink) {
579
+ flex: 1 1 0;
580
+ min-width: 0;
581
+ font-weight: var(--font-weight-medium);
582
+ }
583
583
 
584
- .crewlet-data-grid[data-phone-rows='compact'] .crewlet-data-grid__cell[data-phone-omit] {
585
- display: none;
586
- }
584
+ .crewlet-data-grid[data-phone-rows='compact']:where([data-stacked]) .crewlet-data-grid__cell[data-label]::before {
585
+ content: none;
586
+ }
587
+
588
+ .crewlet-data-grid[data-phone-rows='compact']:where([data-stacked]) .crewlet-data-grid__cell[data-phone-omit] {
589
+ display: none;
587
590
  }
@@ -1,11 +1,11 @@
1
- export { DEEP_WORK_CARD_LABELS, DEEP_WORK_STATES, DEEP_WORK_STATE_LABELS, DeepWorkCard } from '../chunk-RHL4OMQ3.js';
1
+ export { DEEP_WORK_CARD_LABELS, DEEP_WORK_STATES, DEEP_WORK_STATE_LABELS, DeepWorkCard } from '../chunk-UWOYDHVW.js';
2
2
  import '../chunk-HJBHP66O.js';
3
3
  import '../chunk-RQFRRPV6.js';
4
4
  import '../chunk-M25IV5MH.js';
5
- import '../chunk-G4234OIG.js';
5
+ import '../chunk-NTQPJJAN.js';
6
6
  import '../chunk-I5OIKDX2.js';
7
7
  import '../chunk-WIATRXEJ.js';
8
- import '../chunk-7XKDPTZ5.js';
8
+ import '../chunk-4AUTALJA.js';
9
9
  import '../chunk-AV2DXAEL.js';
10
10
  import '../chunk-222VILSP.js';
11
11
  import '../chunk-IVTQWOXV.js';
@@ -1,8 +1,8 @@
1
- export { EntityList } from '../chunk-ISBKJOLI.js';
2
- import '../chunk-G4234OIG.js';
1
+ export { EntityList } from '../chunk-7IW3P6FH.js';
2
+ import '../chunk-NTQPJJAN.js';
3
3
  import '../chunk-I5OIKDX2.js';
4
4
  import '../chunk-WIATRXEJ.js';
5
- import '../chunk-7XKDPTZ5.js';
5
+ import '../chunk-4AUTALJA.js';
6
6
  import '../chunk-AV2DXAEL.js';
7
7
  import '../chunk-MLDTLZAO.js';
8
8
  import '../chunk-PQADV6P6.js';
@@ -1,5 +1,5 @@
1
- export { FolderTile, describeFolderContents, folderContentsParts } from '../chunk-6MTJWQ3V.js';
2
- import '../chunk-7XKDPTZ5.js';
1
+ export { FolderTile, describeFolderContents, folderContentsParts } from '../chunk-WTXCK46H.js';
2
+ import '../chunk-4AUTALJA.js';
3
3
  import '../chunk-AV2DXAEL.js';
4
4
  import '../chunk-MLDTLZAO.js';
5
5
  import '../chunk-PQADV6P6.js';
@@ -6,8 +6,9 @@ export interface ListDetailProps extends Omit<HTMLAttributes<HTMLDivElement>, 'c
6
6
  /** The chosen item's detail. */
7
7
  children: ReactNode;
8
8
  /**
9
- * Which pane a phone shows, where the two are one column: the list until
10
- * something is chosen, then the detail. Wider, both are always shown.
9
+ * Which pane shows where the two are one column (under 640px of the
10
+ * component's own width): the list until something is chosen, then the
11
+ * detail. Wider, both are always shown.
11
12
  */
12
13
  showing?: ListDetailPane | undefined;
13
14
  }
@@ -20,8 +21,12 @@ export interface ListDetailProps extends Omit<HTMLAttributes<HTMLDivElement>, 'c
20
21
  * column. The list column is `--crewlet-list-detail-list` wide (17rem by
21
22
  * default), with a hairline between the two.
22
23
  *
23
- * BELOW 640px IT IS ONE PANE, the one `showing` names, as tall as its content
24
- * on a page that scrolls as any other: a phone has no room for two columns,
25
- * and the application gives its detail a way back to the list.
24
+ * BELOW 640px OF ITS OWN WIDTH IT IS ONE PANE, the one `showing` names: the
25
+ * list and a reading detail do not both fit, whether the window is a phone or
26
+ * an aside beside the screen has taken the room. The application gives its
27
+ * detail a way back to the list, and asks the same question to decide when to
28
+ * draw it (`useScreenBelow(640)` for a ListDetail that spans the screen, or a
29
+ * container query on it). On a phone the page scrolls as any other, each pane
30
+ * as tall as its content.
26
31
  */
27
32
  export declare function ListDetail({ list, children, showing, className, ...rest }: ListDetailProps): import("react").JSX.Element;
@@ -1,2 +1,2 @@
1
- export { ListDetail } from '../chunk-RXG543EB.js';
1
+ export { ListDetail } from '../chunk-YBC2CYPD.js';
2
2
  import '../chunk-ODEQTPFM.js';
@@ -1,6 +1,15 @@
1
1
  /*
2
2
  * ListDetail: a list beside the detail of what is chosen in it, each scrolling
3
- * on its own in the height it is given, one pane on a phone (ListDetail.tsx).
3
+ * on its own in the height it is given, one pane where it is narrow
4
+ * (ListDetail.tsx).
5
+ *
6
+ * IT FOLDS BY ITS OWN WIDTH, NOT THE WINDOW'S. The root is an inline-size
7
+ * container and the panes are its child, so the fold answers how wide THIS
8
+ * list and detail are: beside an aside the reader opened (the assistant) a
9
+ * 1375px window can leave the screen 443px, and a fold that asked the window
10
+ * drew the detail 130px wide beside a 17rem list. The phone rule below is the
11
+ * one decision that stays the window's: on a phone the page scrolls as a
12
+ * whole rather than each pane on its own.
4
13
  */
5
14
 
6
15
  /* THE HAIRLINE STANDS MIDWAY between the two panes: the list's inset before it
@@ -9,11 +18,20 @@
9
18
  .crewlet-list-detail {
10
19
  --crewlet-list-detail-gutter: var(--spacing-7);
11
20
 
21
+ container: crewlet-list-detail / inline-size;
22
+ display: flex;
23
+ flex: 1 1 auto;
24
+ flex-direction: column;
25
+ height: 100%;
26
+ min-width: 0;
27
+ min-height: 0;
28
+ }
29
+
30
+ .crewlet-list-detail__panes {
12
31
  display: grid;
13
32
  flex: 1 1 auto;
14
33
  grid-template-columns: var(--crewlet-list-detail-list, 17rem) minmax(0, 1fr);
15
34
  gap: var(--crewlet-list-detail-gutter);
16
- height: 100%;
17
35
  min-width: 0;
18
36
  min-height: 0;
19
37
  }
@@ -36,19 +54,18 @@
36
54
  overflow-y: auto;
37
55
  }
38
56
 
39
- @media (width < 640px) {
40
- .crewlet-list-detail {
57
+ /* ONE PANE UNDER 640px OF ITS OWN WIDTH: the list and a reading detail do not
58
+ both fit, so the pane `showing` names takes the whole width and keeps its
59
+ own scroller, which is what lets it sit in a screen that fills the window. */
60
+ @container crewlet-list-detail (width < 640px) {
61
+ .crewlet-list-detail__panes {
41
62
  grid-template-columns: minmax(0, 1fr);
42
- height: auto;
43
63
  }
44
64
 
45
65
  .crewlet-list-detail__list {
46
66
  padding-right: 0;
47
67
  border-right: 0;
48
- }
49
-
50
- .crewlet-list-detail__detail {
51
- overflow: visible;
68
+ overflow-y: auto;
52
69
  }
53
70
 
54
71
  .crewlet-list-detail--showing-list .crewlet-list-detail__detail,
@@ -56,3 +73,15 @@
56
73
  display: none;
57
74
  }
58
75
  }
76
+
77
+ /* ON A PHONE THE PAGE SCROLLS AS A WHOLE, as tall as its content. */
78
+ @media (width < 640px) {
79
+ .crewlet-list-detail {
80
+ height: auto;
81
+ }
82
+
83
+ .crewlet-list-detail__list,
84
+ .crewlet-list-detail__detail {
85
+ overflow: visible;
86
+ }
87
+ }
@@ -1,11 +1,11 @@
1
- export { OPEN_IN_APP_CARD_LABELS, OpenInAppCard } from '../chunk-ZFN4IBVC.js';
1
+ export { OPEN_IN_APP_CARD_LABELS, OpenInAppCard } from '../chunk-5K7GGQNX.js';
2
2
  import '../chunk-BAKPMH3S.js';
3
3
  import '../chunk-3LI4TRUR.js';
4
4
  import '../chunk-M25IV5MH.js';
5
- import '../chunk-G4234OIG.js';
5
+ import '../chunk-NTQPJJAN.js';
6
6
  import '../chunk-I5OIKDX2.js';
7
7
  import '../chunk-WIATRXEJ.js';
8
- import '../chunk-7XKDPTZ5.js';
8
+ import '../chunk-4AUTALJA.js';
9
9
  import '../chunk-AV2DXAEL.js';
10
10
  import '../chunk-MLDTLZAO.js';
11
11
  import '../chunk-PQADV6P6.js';
@@ -1,11 +1,11 @@
1
- export { PROPOSAL_CARD_LABELS, PROPOSAL_FAILURE_OUTCOMES, PROPOSAL_STATES, ProposalCard } from '../chunk-4WKOLL7C.js';
1
+ export { PROPOSAL_CARD_LABELS, PROPOSAL_FAILURE_OUTCOMES, PROPOSAL_STATES, ProposalCard } from '../chunk-FZUDUNCK.js';
2
2
  import '../chunk-M25IV5MH.js';
3
- import '../chunk-G4234OIG.js';
3
+ import '../chunk-NTQPJJAN.js';
4
4
  import '../chunk-WQRSZMN4.js';
5
5
  import '../chunk-LR4IWUWQ.js';
6
6
  import '../chunk-I5OIKDX2.js';
7
7
  import '../chunk-WIATRXEJ.js';
8
- import '../chunk-7XKDPTZ5.js';
8
+ import '../chunk-4AUTALJA.js';
9
9
  import '../chunk-AV2DXAEL.js';
10
10
  import '../chunk-222VILSP.js';
11
11
  import '../chunk-IVTQWOXV.js';
@@ -1,8 +1,8 @@
1
- export { REFUSAL_CARD_LABELS, RefusalCard } from '../chunk-YBKZJBKM.js';
2
- import '../chunk-G4234OIG.js';
1
+ export { REFUSAL_CARD_LABELS, RefusalCard } from '../chunk-RQHN4J5P.js';
2
+ import '../chunk-NTQPJJAN.js';
3
3
  import '../chunk-I5OIKDX2.js';
4
4
  import '../chunk-WIATRXEJ.js';
5
- import '../chunk-7XKDPTZ5.js';
5
+ import '../chunk-4AUTALJA.js';
6
6
  import '../chunk-AV2DXAEL.js';
7
7
  import '../chunk-MLDTLZAO.js';
8
8
  import '../chunk-PQADV6P6.js';
@@ -1,7 +1,7 @@
1
- export { RelatedRow } from '../chunk-OGRMOWMO.js';
1
+ export { RelatedRow } from '../chunk-CNEHFH2A.js';
2
2
  import '../chunk-QP2P6GDQ.js';
3
3
  import '../chunk-ZAC7SKUN.js';
4
- import '../chunk-7XKDPTZ5.js';
4
+ import '../chunk-4AUTALJA.js';
5
5
  import '../chunk-AV2DXAEL.js';
6
6
  import '../chunk-MLDTLZAO.js';
7
7
  import '../chunk-PQADV6P6.js';
@@ -1,12 +1,12 @@
1
- export { RESULT_TABLE_CARD_LABELS, RESULT_TABLE_COLLAPSED_ROWS, RESULT_TABLE_MAX_ROWS, ResultTableCard } from '../chunk-RPX3WICJ.js';
1
+ export { RESULT_TABLE_CARD_LABELS, RESULT_TABLE_COLLAPSED_ROWS, RESULT_TABLE_MAX_ROWS, ResultTableCard } from '../chunk-7QTJO3PV.js';
2
2
  import '../chunk-5DJMFRSZ.js';
3
3
  import '../chunk-NSCYGUDG.js';
4
4
  import '../chunk-YNRKVY7X.js';
5
- import '../chunk-G4234OIG.js';
5
+ import '../chunk-NTQPJJAN.js';
6
6
  import '../chunk-DTIW4CHZ.js';
7
7
  import '../chunk-I5OIKDX2.js';
8
8
  import '../chunk-WIATRXEJ.js';
9
- import '../chunk-7XKDPTZ5.js';
9
+ import '../chunk-4AUTALJA.js';
10
10
  import '../chunk-AV2DXAEL.js';
11
11
  import '../chunk-MLDTLZAO.js';
12
12
  import '../chunk-PQADV6P6.js';
@@ -1,4 +1,4 @@
1
- export { RichEditor, preloadRichEditor } from '../chunk-BVNFNFA6.js';
1
+ export { RichEditor, preloadRichEditor } from '../chunk-DS5NBENV.js';
2
2
  export { RICH_EDITOR_LABELS, richEditorLabels } from '../chunk-CSQTDGTS.js';
3
3
  import '../chunk-BAKPMH3S.js';
4
4
  import '../chunk-BPCY7ZID.js';