@crewlethq/ui 0.27.1 → 0.28.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 (68) hide show
  1. package/README.md +21 -1
  2. package/dist/AppShell/index.js +3 -3
  3. package/dist/ArrangeGrid/ArrangeGrid.d.ts +22 -0
  4. package/dist/ArrangeGrid/index.d.ts +3 -0
  5. package/dist/ArrangeGrid/index.js +2 -0
  6. package/dist/ArrangeGrid-XM4ZFTED.css +17 -0
  7. package/dist/ArrangeGroup/index.js +1 -1
  8. package/dist/{ArrangeGroup-SHFHA7BE.css → ArrangeGroup-GY5YMP6E.css} +3 -4
  9. package/dist/Canvas/index.js +2 -2
  10. package/dist/CanvasBoard/index.js +4 -4
  11. package/dist/Charts/index.js +1 -1
  12. package/dist/{Charts-JYW4X5ZL.css → Charts-RY4JN5FC.css} +12 -0
  13. package/dist/CommandPalette/index.js +3 -3
  14. package/dist/DataTable/DataTable.d.ts +9 -0
  15. package/dist/DataTable/index.js +4 -4
  16. package/dist/DataView/index.js +9 -9
  17. package/dist/DatasetSource/index.js +1 -1
  18. package/dist/{DatasetSource-47LBDMPR.css → DatasetSource-XFPZBRXL.css} +12 -4
  19. package/dist/DateTimePicker/index.js +3 -3
  20. package/dist/FollowBanner/index.js +2 -2
  21. package/dist/LinkInterstitial/index.js +3 -3
  22. package/dist/Menu/index.js +2 -2
  23. package/dist/Modal/index.js +2 -2
  24. package/dist/Note/Note.d.ts +10 -0
  25. package/dist/Note/index.js +1 -1
  26. package/dist/{Note-RT4L6VUT.css → Note-ONSKKTOA.css} +10 -0
  27. package/dist/PeopleRail/index.js +1 -1
  28. package/dist/PresenceStack/index.js +1 -1
  29. package/dist/PresenterView/index.js +1 -1
  30. package/dist/ShareDialog/index.js +4 -4
  31. package/dist/SheetGrid/index.js +4 -4
  32. package/dist/SlideCompare/index.js +1 -1
  33. package/dist/Switcher/index.js +4 -4
  34. package/dist/TimeWindowPicker/index.js +3 -3
  35. package/dist/TreeCanvas/index.js +3 -3
  36. package/dist/WidgetFrame/WidgetFrame.d.ts +14 -1
  37. package/dist/WidgetFrame/index.js +1 -1
  38. package/dist/WidgetFrame-LRZIL62O.css +206 -0
  39. package/dist/{chunk-MLT2HBPN.js → chunk-77DRMDXR.js} +7 -2
  40. package/dist/{chunk-BQYQWJPK.js → chunk-AAOH2P6Y.js} +8 -2
  41. package/dist/{chunk-35XVR5JQ.js → chunk-B4EBHPK3.js} +2 -2
  42. package/dist/chunk-CJKMURZO.js +31 -0
  43. package/dist/{chunk-INTEH4F3.js → chunk-CT4EZF62.js} +2 -2
  44. package/dist/{chunk-SVW3VG72.js → chunk-EBJREOKS.js} +5 -4
  45. package/dist/{chunk-GTLJXJ3U.js → chunk-HCKJGBQH.js} +1 -1
  46. package/dist/{chunk-5OY4LJFH.js → chunk-HVNTQ36V.js} +2 -2
  47. package/dist/{chunk-3D7PSL2L.js → chunk-JODJS7MR.js} +2 -2
  48. package/dist/{chunk-URUGEAFB.js → chunk-JQLTG4KH.js} +1 -1
  49. package/dist/chunk-QBA5B2Z5.js +17 -0
  50. package/dist/{chunk-RSC7UJCR.js → chunk-S6VG5ZFZ.js} +1 -1
  51. package/dist/{chunk-OJRDEVHV.js → chunk-VOMYRJV5.js} +4 -4
  52. package/dist/{chunk-BFQK7CYJ.js → chunk-WENCSQ47.js} +1 -1
  53. package/dist/{chunk-ZZDY4XL7.js → chunk-ZB5O3ELS.js} +12 -12
  54. package/dist/{chunk-L2OQRPXJ.js → chunk-ZR5VN5IV.js} +1 -1
  55. package/dist/generated/index.d.ts +1 -0
  56. package/dist/generated/index.js +53 -52
  57. package/dist/index.js +53 -52
  58. package/dist/styles.css +148 -20
  59. package/package.json +3 -3
  60. package/dist/WidgetFrame-4EFJOJMW.css +0 -127
  61. package/dist/chunk-63WJLRB2.js +0 -24
  62. package/dist/{chunk-UFKUWVMV.js → chunk-2HIOJ4YZ.js} +1 -1
  63. package/dist/{chunk-F4DPAJCN.js → chunk-I3KKZ2O3.js} +1 -1
  64. package/dist/{chunk-FW7HN6AP.js → chunk-LDJ3J4TQ.js} +1 -1
  65. package/dist/{chunk-SLRKS5PF.js → chunk-NWW4IQJU.js} +0 -0
  66. package/dist/{chunk-KZOGQXSP.js → chunk-OJ45PPCV.js} +1 -1
  67. package/dist/{chunk-LREN6TUG.js → chunk-UZ6MA2V6.js} +2 -2
  68. package/dist/{chunk-WG5WUFBX.js → chunk-Y5NQ2LMS.js} +1 -1
package/README.md CHANGED
@@ -51,7 +51,7 @@ import { Button } from '@crewlethq/ui/Button'; // 8 KB of CSS, not 182 KB
51
51
  | Marks | `Count`, `StatusDot`, `EmptyValue`, `VisuallyHidden` |
52
52
  | Hooks and seams | `useModalLayer`, `usePopupLayer`, `LayerHost`, `useListbox`, `useOptionKeys`, `useHighlightRest` and `HIGHLIGHT_REST_MS`, `useClipboard`, `useDownload`, `downloadText`, `downloadBlob`, `safeFilename`, `toCsv`, `elementToPng` and `ElementToPngError`, `useOutcome`, `useAnnouncer`, `useNow`, `formatRelative`, `HeadingLevelProvider`, `cx`, the node hues (`NODE_HUES`, `NODE_HUE_NAMES`, `isNodeHue`) |
53
53
  | Layout | `Container`, `Section`, `Card`, `Tabs`, `Accordion`, `Disclosure`, `Outline` (with `useActiveHeading` and `scrollToHeading`), `TreeGrid` |
54
- | Arranging a page | `ArrangeBoard`, `ArrangeFrame` (with `useGridResize`), `ArrangeGroup`, `ArrangeList`, and the reorder hooks under them (`useReorder`, `useReorderLists`, `moveKey`) |
54
+ | Arranging a page | `ArrangeBoard`, `ArrangeGrid`, `ArrangeFrame` (with `useGridResize`), `ArrangeGroup`, `ArrangeList`, and the reorder hooks under them (`useReorder`, `useReorderLists`, `moveKey`) |
55
55
  | Application shell | `AppShell` with `AppShell.Rail`, `AppShell.Topbar`, `AppShell.AccountRow` and `useAppShell`, `AuthLayout`, `SidebarNav` and `NavItem`, `BrandLockup`, `SearchTrigger`, `PageHeader`, `Toolbar`, `Stack`, `Inline`, `Spacer`, `AutoGrid`, `ErrorBoundary`, `useShortcut`, `useFullscreen` |
56
56
  | Preferences | `ThemeToggle`, `ThemeSwitcher`, `DensitySwitcher`, `ThemeGallery`, `ThemeSwatch`, `useThemePreference`, `useDensityPreference`, `useSystemTheme`, `resolveTheme`, `applyStoredPreferences`, and the framework-free `applyTheme`, `applyPalette`, `applyDensity` with `THEME_PREFERENCES`, `DENSITY_PREFERENCES` and their guards |
57
57
  | Artifacts | `SandboxedFrame`, `LinkInterstitial` and `openExternal`, `VersionTimeline`, `ShareDialog` with the role ladder (`ARTIFACT_ROLES`, `SHAREABLE_ROLES`, `roleAtLeast`), `PrincipalPicker`, `Principal` and `PrincipalAvatar`, `ArtifactCard` and `ArtifactKindGlyph`, `CanvasBoard` (a design's artboards and notes on a `Canvas`, with the visibility budget `liveBoards`), `CanvasSchematic` (a design's cover, drawn from its boards' frames), `AccessDeniedCard`, `ArtifactIcon` (with `artifactIconGlyph` and `ARTIFACT_ICON_WORDS`), the native gallery covers (`DocCover`, `SheetCover`, `DashboardCover`), `MergeConflicts`, the dashboard pieces (`WidgetFrame`, `DatasetSource` and `DatasetSourceList`), and `FrameProtocol` (the wire between a host page and an embedded artifact, with no React in it) |
@@ -204,6 +204,26 @@ places:
204
204
  - A surface that pans or zooms dispatches `LAYER_REPOSITION_EVENT` on its host
205
205
  when the content beneath it moves, and every panel anchored inside follows.
206
206
 
207
+ ## Changes in 0.28.0
208
+
209
+ **`ArrangeGrid`** is the page grid a board's blocks stand on: equal columns (twelve unless `columns` says otherwise), the board's own gap, each `ArrangeFrame` spanning the columns it names. A frame writes `grid-column: span N`, which only a grid parent reads, so frames placed straight in an `ArrangeBoard` stacked at full width; every board now lays its blocks on this one grid rather than on a grid of its own. `ArrangeGroup`'s body is the same grid inside the group, so a block is one width on the page and in a group, and while the page is arranged the grid opens its rows a step for each block's toolbar.
210
+
211
+ **`StackedColumns` keeps its top value inside the figure.** The axis's top tick is centred on the plot's top edge, so half of it stood above the plot; with no head row it fell outside the figure, and a container that clips its content cut the highest value in half. A chart with no head now keeps that half line above its plot, and the tick's line height is the tight step it is measured at.
212
+
213
+ **`WidgetFrame` stands on the card recipe.** It drew the elevated ground at a 12px inset, so a dashboard's figures were a different object from every card beside them. It now takes the card's ground (`--color-surface-subtle`), its hairline and corner, and the card's 16px inset on every part. The title takes a second line before it gives up a word (cut at one line, a frame three columns wide named "Tokens, last 14 days" as "Tokens, last 14 da"), and the controls stand on its first line. The citation is one line, the dataset's title ending before the time leaves it; in a frame narrower than 18rem it stacks, the title over the time. A stat tile drawn `flush` as the figure takes the frame's inset rather than doubling it. New `flush` lets a table reach the frame's sides: its row rules meet the border, and its cells take the frame's inset, so the first column starts under the title.
214
+
215
+ **`Note` takes a `heading`**, set at a card title's step in the note's ink, which names the note as a region. A note on a board then reads as one of its cards rather than as a label over loose prose.
216
+
217
+ **`DataTableColumn.minWidth`** is the narrowest the fit pass shrinks a `defaultWidth` column to. For the one column that gives up room to its box but has to stay readable while it does, a title beside short held columns: the fit took every pixel the box was short down to the table's floor, and a title read "READ…". Past it the table scrolls sideways.
218
+
219
+ **`DatasetSource` says how its rows are kept current on a line of its own**, under the facts, and sets its title at the medium weight. On the line of facts the refresh wrapped under them and began with the separator, and a rail of semibold titles outweighed the figures it cites.
220
+
221
+ What to change:
222
+
223
+ - Wrap a board's page of frames in `ArrangeGrid` (inside `ArrangeBoard`) in place of a grid of your own.
224
+ - Pass `flush` to a `WidgetFrame` whose figure is a table.
225
+ - A host that relied on the frame's elevated ground or its one-line title restyles nothing: both changed for every figure.
226
+
207
227
  ## Changes in 0.27.1
208
228
 
209
229
  **`useSlideKeys` answers every key with the newest handlers.** It re-added its document listener after each render, so after every step there was a gap, between the new slide's commit and the effect that re-added the listener, in which a quick second press (a clicker held down, two taps) reached the previous slide's handlers and moved to the slide already shown: the press was lost. The hook now keeps one listener for as long as it is `enabled` and reads the handlers from a ref it brings up to date as each render commits, before the browser can dispatch another event. A show whose stage stays mounted across slides, as `SlideStage fit="view"` does, met the gap on almost every quick press.
@@ -1,9 +1,9 @@
1
- export { AccountRow, AppShell, AppShellRail, AppShellRailRow, AppShellToggle, AppShellTopbar, useAppShell } from '../chunk-BFQK7CYJ.js';
1
+ export { AccountRow, AppShell, AppShellRail, AppShellRailRow, AppShellToggle, AppShellTopbar, useAppShell } from '../chunk-WENCSQ47.js';
2
2
  import '../chunk-IG75YMUN.js';
3
- import '../chunk-UFKUWVMV.js';
4
- import '../chunk-OG6CL3EB.js';
3
+ import '../chunk-2HIOJ4YZ.js';
5
4
  import '../chunk-HMPFGIWM.js';
6
5
  import '../chunk-R25RGPUB.js';
6
+ import '../chunk-OG6CL3EB.js';
7
7
  import '../chunk-4FQT6ZAY.js';
8
8
  import '../chunk-BZFWDIV6.js';
9
9
  import '../chunk-ODEQTPFM.js';
@@ -0,0 +1,22 @@
1
+ import type { HTMLAttributes, ReactNode } from 'react';
2
+ export interface ArrangeGridProps extends HTMLAttributes<HTMLDivElement> {
3
+ /** Columns of the grid, which each block spans a number of. Twelve by default. */
4
+ columns?: number | undefined;
5
+ children?: ReactNode;
6
+ }
7
+ /**
8
+ * The page grid a board's blocks stand on: equal columns, each block
9
+ * (an `ArrangeFrame`) spanning the number of them it says.
10
+ *
11
+ * A FRAME'S WIDTH IS READ ONLY BY A GRID. `ArrangeFrame` writes
12
+ * `grid-column: span N`, which means nothing to a block parent, so frames
13
+ * placed straight in an `ArrangeBoard` stack at the page's full width. This is
14
+ * that grid, once, for every board: the page's blocks stand on it, and an
15
+ * `ArrangeGroup`'s body is the same grid inside the group, so a block is the
16
+ * same width on the page and in a group.
17
+ *
18
+ * ITS GAP IS THE BOARD'S. The board's column lanes are drawn from
19
+ * `--crewlet-arrange-board-gap`, and so is this, so a lane is exactly the
20
+ * column a block snaps to.
21
+ */
22
+ export declare function ArrangeGrid({ columns, className, style, children, ...rest }: ArrangeGridProps): import("react").JSX.Element;
@@ -0,0 +1,3 @@
1
+ import './ArrangeGrid.css';
2
+ export { ArrangeGrid } from './ArrangeGrid.js';
3
+ export type { ArrangeGridProps } from './ArrangeGrid.js';
@@ -0,0 +1,2 @@
1
+ export { ArrangeGrid } from '../chunk-QBA5B2Z5.js';
2
+ import '../chunk-ODEQTPFM.js';
@@ -0,0 +1,17 @@
1
+ /*
2
+ * ArrangeGrid: the page grid a board's blocks stand on. Equal columns, the
3
+ * board's gap between them, and each block stretched to its row's height, so
4
+ * the cards in one row share their bottom edge.
5
+ */
6
+ .crewlet-arrange-grid {
7
+ display: grid;
8
+ grid-template-columns: repeat(var(--crewlet-arrange-columns, 12), minmax(0, 1fr));
9
+ gap: var(--crewlet-arrange-board-gap, var(--spacing-4));
10
+ align-items: stretch;
11
+ }
12
+
13
+ /* More room between rows while the page is arranged: each block's toolbar
14
+ sits on its top edge, half in the gap above it. */
15
+ .crewlet-arrange-board.is-editing .crewlet-arrange-grid {
16
+ row-gap: var(--spacing-5);
17
+ }
@@ -1,4 +1,4 @@
1
- export { ArrangeGroup } from '../chunk-35XVR5JQ.js';
1
+ export { ArrangeGroup } from '../chunk-B4EBHPK3.js';
2
2
  import '../chunk-BHHIIK3M.js';
3
3
  import '../chunk-BZFWDIV6.js';
4
4
  import '../chunk-ODEQTPFM.js';
@@ -132,11 +132,10 @@
132
132
  margin-inline-start: auto;
133
133
  }
134
134
 
135
+ /* The body is the page's grid (ArrangeGrid's `.crewlet-arrange-grid`), inside
136
+ the group: the same columns and gap, so a block is one width on the page
137
+ and in a group. */
135
138
  .crewlet-arrange-group__body {
136
- display: grid;
137
- grid-template-columns: repeat(var(--crewlet-arrange-columns, 12), minmax(0, 1fr));
138
- gap: var(--spacing-4);
139
- align-items: stretch;
140
139
  padding: var(--spacing-4);
141
140
  min-height: 5rem;
142
141
  }
@@ -1,8 +1,8 @@
1
- export { CANVAS_COMPOSE_CONTEXT, CANVAS_FIT_MAX_ZOOM, CANVAS_FIT_PADDING, CANVAS_FOCUS_CONTEXT, CANVAS_MAX_ZOOM, CANVAS_MIN_ZOOM, CANVAS_PAN_MARGIN, CANVAS_PAN_STEP, CANVAS_REVEAL_PADDING, CANVAS_TAP_SLOP, CANVAS_WHEEL_LINE_PX, CANVAS_WHEEL_ZOOM_PER_PIXEL, CANVAS_ZOOM_CEILING, CANVAS_ZOOM_LIMITS, CANVAS_ZOOM_STEP, Canvas, IDENTITY_VIEW, anchorView, beyondSlop, clampPan, clampZoom, fitView, panBy, pinchView, regionView, revealView, screenRect, toScreen, toWorld, wheelPixels, wheelZoomFactor, zoomAt, zoomLimits } from '../chunk-KZOGQXSP.js';
1
+ export { CANVAS_COMPOSE_CONTEXT, CANVAS_FIT_MAX_ZOOM, CANVAS_FIT_PADDING, CANVAS_FOCUS_CONTEXT, CANVAS_MAX_ZOOM, CANVAS_MIN_ZOOM, CANVAS_PAN_MARGIN, CANVAS_PAN_STEP, CANVAS_REVEAL_PADDING, CANVAS_TAP_SLOP, CANVAS_WHEEL_LINE_PX, CANVAS_WHEEL_ZOOM_PER_PIXEL, CANVAS_ZOOM_CEILING, CANVAS_ZOOM_LIMITS, CANVAS_ZOOM_STEP, Canvas, IDENTITY_VIEW, anchorView, beyondSlop, clampPan, clampZoom, fitView, panBy, pinchView, regionView, revealView, screenRect, toScreen, toWorld, wheelPixels, wheelZoomFactor, zoomAt, zoomLimits } from '../chunk-OJ45PPCV.js';
2
2
  import '../chunk-VYOKRN2I.js';
3
- import '../chunk-OG6CL3EB.js';
4
3
  import '../chunk-HMPFGIWM.js';
5
4
  import '../chunk-R25RGPUB.js';
5
+ import '../chunk-OG6CL3EB.js';
6
6
  import '../chunk-4FQT6ZAY.js';
7
7
  import '../chunk-BZFWDIV6.js';
8
8
  import '../chunk-ODEQTPFM.js';
@@ -1,10 +1,10 @@
1
- export { CANVAS_BOARD_MAX_LIVE, CANVAS_BOARD_MIN_LIVE_WIDTH, CANVAS_NOTE_COLORS, CanvasBoard, liveBoards } from '../chunk-3D7PSL2L.js';
2
- import '../chunk-63WJLRB2.js';
3
- import '../chunk-KZOGQXSP.js';
1
+ export { CANVAS_BOARD_MAX_LIVE, CANVAS_BOARD_MIN_LIVE_WIDTH, CANVAS_NOTE_COLORS, CanvasBoard, liveBoards } from '../chunk-JODJS7MR.js';
2
+ import '../chunk-CJKMURZO.js';
3
+ import '../chunk-OJ45PPCV.js';
4
4
  import '../chunk-VYOKRN2I.js';
5
- import '../chunk-OG6CL3EB.js';
6
5
  import '../chunk-HMPFGIWM.js';
7
6
  import '../chunk-R25RGPUB.js';
7
+ import '../chunk-OG6CL3EB.js';
8
8
  import '../chunk-4FQT6ZAY.js';
9
9
  import '../chunk-BZFWDIV6.js';
10
10
  import '../chunk-ODEQTPFM.js';
@@ -1,3 +1,3 @@
1
- export { ActivityStrip, BarList, ChartTooltip, DATA_COLORS, DATA_COLOR_OTHER, Legend, Sparkline, StackedBar, StackedColumns, TimeSeries, dataColor, niceScale, useChartHover } from '../chunk-MLT2HBPN.js';
1
+ export { ActivityStrip, BarList, ChartTooltip, DATA_COLORS, DATA_COLOR_OTHER, Legend, Sparkline, StackedBar, StackedColumns, TimeSeries, dataColor, niceScale, useChartHover } from '../chunk-77DRMDXR.js';
2
2
  import '../chunk-BZFWDIV6.js';
3
3
  import '../chunk-ODEQTPFM.js';
@@ -433,11 +433,23 @@
433
433
  height: 0;
434
434
  font-family: var(--font-family-mono);
435
435
  font-size: var(--font-size-2xs);
436
+ line-height: var(--font-line-height-tight);
436
437
  color: var(--color-text-tertiary);
437
438
  font-variant-numeric: tabular-nums;
438
439
  white-space: nowrap;
439
440
  }
440
441
 
442
+ /*
443
+ * THE TOP TICK STANDS ON THE PLOT'S TOP EDGE, centred on it, so half its line
444
+ * sits above the plot. Under a head row that half falls in the row; with no
445
+ * head it fell outside the figure, and a container that clips its content
446
+ * (a dashboard widget's body) cut the axis's top value in half. The figure
447
+ * keeps that half line above the plot itself.
448
+ */
449
+ .crewlet-stacked-columns--headless {
450
+ padding-block-start: calc(var(--font-size-2xs) * var(--font-line-height-tight) / 2);
451
+ }
452
+
441
453
  .crewlet-stacked-columns__plot {
442
454
  position: relative;
443
455
  display: flex;
@@ -1,13 +1,13 @@
1
- export { CommandPalette } from '../chunk-GTLJXJ3U.js';
2
- import '../chunk-F4DPAJCN.js';
1
+ export { CommandPalette } from '../chunk-HCKJGBQH.js';
2
+ import '../chunk-I3KKZ2O3.js';
3
3
  import '../chunk-F73MC7EZ.js';
4
4
  import '../chunk-SMBKXWML.js';
5
5
  import '../chunk-6QFAK2WV.js';
6
6
  import '../chunk-PQADV6P6.js';
7
7
  import '../chunk-BHHIIK3M.js';
8
- import '../chunk-OG6CL3EB.js';
9
8
  import '../chunk-HMPFGIWM.js';
10
9
  import '../chunk-R25RGPUB.js';
10
+ import '../chunk-OG6CL3EB.js';
11
11
  import '../chunk-4FQT6ZAY.js';
12
12
  import '../chunk-BZFWDIV6.js';
13
13
  import '../chunk-ODEQTPFM.js';
@@ -83,6 +83,15 @@ export interface DataTableColumn<TRow = DataTableRow> {
83
83
  */
84
84
  hideable?: boolean;
85
85
  defaultWidth?: number;
86
+ /**
87
+ * The narrowest the fit pass shrinks a `defaultWidth` column to, where it
88
+ * is wider than the table's `minColumnWidth`. For the one column that
89
+ * gives up room to its box but has to stay readable while it does, a
90
+ * title beside short held columns: without it the fit took every pixel
91
+ * the box was short down to the table's floor, and a title read "READ…".
92
+ * Past it the table scrolls sideways. A reader's own drag is not held to it.
93
+ */
94
+ minWidth?: number;
86
95
  /** Override the value used when sorting this column (defaults to row[key]). */
87
96
  sortValue?: (row: TRow) => string | number | Date | null | undefined;
88
97
  /**
@@ -1,16 +1,16 @@
1
- export { ALL_ITEMS, CopyableCell, DATA_TABLE_LABELS, DataTable, RowActionsMenu } from '../chunk-SVW3VG72.js';
2
- import '../chunk-F4DPAJCN.js';
1
+ export { ALL_ITEMS, CopyableCell, DATA_TABLE_LABELS, DataTable, RowActionsMenu } from '../chunk-EBJREOKS.js';
3
2
  import '../chunk-STJ7QBC3.js';
4
3
  import '../chunk-DTIW4CHZ.js';
4
+ import '../chunk-I3KKZ2O3.js';
5
5
  import '../chunk-7T42VQQT.js';
6
6
  import '../chunk-6QFAK2WV.js';
7
7
  import '../chunk-EUCC37WY.js';
8
8
  import '../chunk-AV2DXAEL.js';
9
9
  import '../chunk-PQADV6P6.js';
10
- import '../chunk-UFKUWVMV.js';
11
- import '../chunk-OG6CL3EB.js';
10
+ import '../chunk-2HIOJ4YZ.js';
12
11
  import '../chunk-HMPFGIWM.js';
13
12
  import '../chunk-R25RGPUB.js';
13
+ import '../chunk-OG6CL3EB.js';
14
14
  import '../chunk-4FQT6ZAY.js';
15
15
  import '../chunk-BZFWDIV6.js';
16
16
  import '../chunk-ODEQTPFM.js';
@@ -1,26 +1,26 @@
1
- export { DATA_VIEW_TOOLBAR_LABELS, DataView, DataViewToolbar, FILTER_AXIS_LABELS, FilterAxisBar, FilterAxisChip, applyColumnFilters, applyFilters, blankFilterValue, defaultOperator, filterDefsFromColumns, filterHasValue, filterPredicate, formatFilterValue, operatorOf, tableColumns } from '../chunk-OJRDEVHV.js';
1
+ export { DATA_VIEW_TOOLBAR_LABELS, DataView, DataViewToolbar, FILTER_AXIS_LABELS, FilterAxisBar, FilterAxisChip, applyColumnFilters, applyFilters, blankFilterValue, defaultOperator, filterDefsFromColumns, filterHasValue, filterPredicate, formatFilterValue, operatorOf, tableColumns } from '../chunk-VOMYRJV5.js';
2
2
  import '../chunk-HOXGBLEY.js';
3
3
  import '../chunk-PGRPNDWM.js';
4
- import '../chunk-SVW3VG72.js';
5
- import '../chunk-WG5WUFBX.js';
6
- import '../chunk-F4DPAJCN.js';
7
- import '../chunk-F73MC7EZ.js';
8
- import '../chunk-SMBKXWML.js';
4
+ import '../chunk-EBJREOKS.js';
5
+ import '../chunk-Y5NQ2LMS.js';
9
6
  import '../chunk-STJ7QBC3.js';
10
7
  import '../chunk-DTIW4CHZ.js';
8
+ import '../chunk-I3KKZ2O3.js';
9
+ import '../chunk-F73MC7EZ.js';
10
+ import '../chunk-SMBKXWML.js';
11
+ import '../chunk-BWRGFKJP.js';
11
12
  import '../chunk-GXQ3B46I.js';
12
13
  import '../chunk-7T42VQQT.js';
13
14
  import '../chunk-6QFAK2WV.js';
14
15
  import '../chunk-3CZ7XAVY.js';
15
16
  import '../chunk-EUCC37WY.js';
16
- import '../chunk-BWRGFKJP.js';
17
17
  import '../chunk-AV2DXAEL.js';
18
18
  import '../chunk-PQADV6P6.js';
19
19
  import '../chunk-BHHIIK3M.js';
20
- import '../chunk-UFKUWVMV.js';
21
- import '../chunk-OG6CL3EB.js';
20
+ import '../chunk-2HIOJ4YZ.js';
22
21
  import '../chunk-HMPFGIWM.js';
23
22
  import '../chunk-R25RGPUB.js';
23
+ import '../chunk-OG6CL3EB.js';
24
24
  import '../chunk-4FQT6ZAY.js';
25
25
  import '../chunk-BZFWDIV6.js';
26
26
  import '../chunk-ODEQTPFM.js';
@@ -1,4 +1,4 @@
1
- export { DATASET_SOURCE_KINDS, DatasetSource, DatasetSourceList } from '../chunk-ZZDY4XL7.js';
1
+ export { DATASET_SOURCE_KINDS, DatasetSource, DatasetSourceList } from '../chunk-ZB5O3ELS.js';
2
2
  import '../chunk-GFV4LJHH.js';
3
3
  import '../chunk-WIATRXEJ.js';
4
4
  import '../chunk-3CZ7XAVY.js';
@@ -61,7 +61,9 @@ button.crewlet-dataset-source__summary:focus-visible {
61
61
  overflow: hidden;
62
62
  color: var(--color-text-primary);
63
63
  font-size: var(--font-size-sm);
64
- font-weight: var(--font-weight-semibold);
64
+ /* Medium, not semibold: the rail is the board's footnotes, and a column of
65
+ semibold titles beside it outweighed the figures' own. */
66
+ font-weight: var(--font-weight-medium);
65
67
  line-height: var(--font-line-height-snug);
66
68
  text-overflow: ellipsis;
67
69
  white-space: nowrap;
@@ -93,9 +95,15 @@ button.crewlet-dataset-source__summary:focus-visible {
93
95
  color: var(--color-text-secondary);
94
96
  }
95
97
 
96
- /* The separators are drawn, not typed, so a screen reader hears the facts alone. */
97
- .crewlet-dataset-source__rows::before,
98
- .crewlet-dataset-source__refresh::before {
98
+ /* How the rows are kept current, on the quiet step under the facts. */
99
+ .crewlet-dataset-source__refresh {
100
+ color: var(--color-text-tertiary);
101
+ font-size: var(--font-size-xs);
102
+ line-height: var(--font-line-height-snug);
103
+ }
104
+
105
+ /* The separator is drawn, not typed, so a screen reader hears the facts alone. */
106
+ .crewlet-dataset-source__rows::before {
99
107
  content: '\00b7' / '';
100
108
  margin-inline-end: var(--spacing-2);
101
109
  }
@@ -1,9 +1,9 @@
1
- export { DEFAULT_DATE_TIME_PICKER_LABELS, DateTimePicker } from '../chunk-WG5WUFBX.js';
2
- import '../chunk-GXQ3B46I.js';
1
+ export { DEFAULT_DATE_TIME_PICKER_LABELS, DateTimePicker } from '../chunk-Y5NQ2LMS.js';
3
2
  import '../chunk-BWRGFKJP.js';
4
- import '../chunk-OG6CL3EB.js';
3
+ import '../chunk-GXQ3B46I.js';
5
4
  import '../chunk-HMPFGIWM.js';
6
5
  import '../chunk-R25RGPUB.js';
6
+ import '../chunk-OG6CL3EB.js';
7
7
  import '../chunk-4FQT6ZAY.js';
8
8
  import '../chunk-BZFWDIV6.js';
9
9
  import '../chunk-ODEQTPFM.js';
@@ -1,7 +1,7 @@
1
- export { FollowBanner } from '../chunk-FW7HN6AP.js';
1
+ export { FollowBanner } from '../chunk-LDJ3J4TQ.js';
2
2
  import '../chunk-SVSCLHHI.js';
3
- import '../chunk-OG6CL3EB.js';
4
3
  import '../chunk-HMPFGIWM.js';
5
4
  import '../chunk-R25RGPUB.js';
5
+ import '../chunk-OG6CL3EB.js';
6
6
  import '../chunk-BZFWDIV6.js';
7
7
  import '../chunk-ODEQTPFM.js';
@@ -1,11 +1,11 @@
1
- export { LinkInterstitial, openExternal } from '../chunk-L2OQRPXJ.js';
2
- import '../chunk-F4DPAJCN.js';
1
+ export { LinkInterstitial, openExternal } from '../chunk-ZR5VN5IV.js';
2
+ import '../chunk-I3KKZ2O3.js';
3
3
  import '../chunk-5CLW2CXT.js';
4
4
  import '../chunk-SVSCLHHI.js';
5
5
  import '../chunk-PQADV6P6.js';
6
- import '../chunk-OG6CL3EB.js';
7
6
  import '../chunk-HMPFGIWM.js';
8
7
  import '../chunk-R25RGPUB.js';
8
+ import '../chunk-OG6CL3EB.js';
9
9
  import '../chunk-4FQT6ZAY.js';
10
10
  import '../chunk-BZFWDIV6.js';
11
11
  import '../chunk-ODEQTPFM.js';
@@ -1,7 +1,7 @@
1
- export { Menu } from '../chunk-UFKUWVMV.js';
2
- import '../chunk-OG6CL3EB.js';
1
+ export { Menu } from '../chunk-2HIOJ4YZ.js';
3
2
  import '../chunk-HMPFGIWM.js';
4
3
  import '../chunk-R25RGPUB.js';
4
+ import '../chunk-OG6CL3EB.js';
5
5
  import '../chunk-4FQT6ZAY.js';
6
6
  import '../chunk-BZFWDIV6.js';
7
7
  import '../chunk-ODEQTPFM.js';
@@ -1,8 +1,8 @@
1
- export { ConfirmModal, Modal } from '../chunk-F4DPAJCN.js';
1
+ export { ConfirmModal, Modal } from '../chunk-I3KKZ2O3.js';
2
2
  import '../chunk-PQADV6P6.js';
3
- import '../chunk-OG6CL3EB.js';
4
3
  import '../chunk-HMPFGIWM.js';
5
4
  import '../chunk-R25RGPUB.js';
5
+ import '../chunk-OG6CL3EB.js';
6
6
  import '../chunk-4FQT6ZAY.js';
7
7
  import '../chunk-BZFWDIV6.js';
8
8
  import '../chunk-ODEQTPFM.js';
@@ -6,6 +6,13 @@ export interface NoteProps extends HTMLAttributes<HTMLDivElement> {
6
6
  align?: 'start' | 'center' | undefined;
7
7
  /** `lg` for a line meant to be read across the room: a goal, a rule. */
8
8
  size?: 'md' | 'lg' | undefined;
9
+ /**
10
+ * The note's name, set over its words at a card title's step: "How to read
11
+ * this board". The note is then a region named by it.
12
+ */
13
+ heading?: ReactNode;
14
+ /** The heading's level. Default 3, under a board's own heading. */
15
+ headingLevel?: 2 | 3 | 4 | undefined;
9
16
  children: ReactNode;
10
17
  }
11
18
  /**
@@ -17,6 +24,9 @@ export interface NoteProps extends HTMLAttributes<HTMLDivElement> {
17
24
  * A note is never coloured to mean a state; the hues here are the reader's
18
25
  * labels, the same six a group's band takes.
19
26
  *
27
+ * A HEADING NAMES IT, at the step a card's title is set on, so a note on a
28
+ * board reads as one of its cards rather than as a label over loose prose.
29
+ *
20
30
  * IT SCROLLS rather than clipping when the reader makes it shorter than its
21
31
  * words.
22
32
  */
@@ -1,2 +1,2 @@
1
- export { Note } from '../chunk-63WJLRB2.js';
1
+ export { Note } from '../chunk-CJKMURZO.js';
2
2
  import '../chunk-ODEQTPFM.js';
@@ -41,6 +41,16 @@
41
41
  letter-spacing: var(--font-letter-spacing-tight);
42
42
  }
43
43
 
44
+ /* The note's name, at a card title's step, in the note's own ink. */
45
+ .crewlet-note__heading {
46
+ margin: 0 0 var(--spacing-2);
47
+ font-size: var(--font-size-sm);
48
+ font-weight: var(--font-weight-semibold);
49
+ letter-spacing: var(--font-letter-spacing-tight);
50
+ line-height: var(--font-line-height-snug);
51
+ text-wrap: balance;
52
+ }
53
+
44
54
  /* Prose inside takes the note's ink, links included. */
45
55
  .crewlet-note :is(p, li, h2, h3, h4, strong, em) {
46
56
  color: inherit;
@@ -1,8 +1,8 @@
1
1
  export { PEOPLE_RAIL_LABELS, PeopleRail, peopleRailKey } from '../chunk-FVLCTCMV.js';
2
2
  import '../chunk-CENOOTAV.js';
3
3
  import '../chunk-Z7JYG5TF.js';
4
- import '../chunk-UAN5NE7M.js';
5
4
  import '../chunk-AYKXMIOR.js';
5
+ import '../chunk-UAN5NE7M.js';
6
6
  import '../chunk-5OM447RW.js';
7
7
  import '../chunk-PQADV6P6.js';
8
8
  import '../chunk-OG6CL3EB.js';
@@ -2,8 +2,8 @@ export { PresenceStack } from '../chunk-ODT5H4MN.js';
2
2
  import '../chunk-CENOOTAV.js';
3
3
  import '../chunk-I6POAB4V.js';
4
4
  import '../chunk-Z7JYG5TF.js';
5
- import '../chunk-UAN5NE7M.js';
6
5
  import '../chunk-AYKXMIOR.js';
6
+ import '../chunk-UAN5NE7M.js';
7
7
  import '../chunk-5OM447RW.js';
8
8
  import '../chunk-BZFWDIV6.js';
9
9
  import '../chunk-ODEQTPFM.js';
@@ -1,8 +1,8 @@
1
1
  export { PresenterView, formatStopwatch } from '../chunk-OGAAHVF6.js';
2
2
  import '../chunk-O63MWA4G.js';
3
- import '../chunk-OG6CL3EB.js';
4
3
  import '../chunk-HMPFGIWM.js';
5
4
  import '../chunk-R25RGPUB.js';
5
+ import '../chunk-OG6CL3EB.js';
6
6
  import '../chunk-4FQT6ZAY.js';
7
7
  import '../chunk-BZFWDIV6.js';
8
8
  import '../chunk-ODEQTPFM.js';
@@ -1,19 +1,19 @@
1
- export { ARTIFACT_ROLES, SHAREABLE_ROLES, ShareDialog, roleAtLeast } from '../chunk-URUGEAFB.js';
1
+ export { ARTIFACT_ROLES, SHAREABLE_ROLES, ShareDialog, roleAtLeast } from '../chunk-JQLTG4KH.js';
2
2
  import '../chunk-FC4YTTFJ.js';
3
- import '../chunk-F4DPAJCN.js';
4
- import '../chunk-F73MC7EZ.js';
5
3
  import '../chunk-W46LPU4R.js';
6
4
  import '../chunk-STJ7QBC3.js';
7
5
  import '../chunk-DTIW4CHZ.js';
6
+ import '../chunk-I3KKZ2O3.js';
7
+ import '../chunk-F73MC7EZ.js';
8
8
  import '../chunk-SVSCLHHI.js';
9
9
  import '../chunk-4KP4RC3O.js';
10
10
  import '../chunk-UAN5NE7M.js';
11
11
  import '../chunk-5OM447RW.js';
12
12
  import '../chunk-PQADV6P6.js';
13
13
  import '../chunk-IG75YMUN.js';
14
- import '../chunk-OG6CL3EB.js';
15
14
  import '../chunk-HMPFGIWM.js';
16
15
  import '../chunk-R25RGPUB.js';
16
+ import '../chunk-OG6CL3EB.js';
17
17
  import '../chunk-4FQT6ZAY.js';
18
18
  import '../chunk-BZFWDIV6.js';
19
19
  import '../chunk-ODEQTPFM.js';
@@ -1,4 +1,4 @@
1
- export { CellDisplay, CellEditor, CheckboxCell, DateCell, LongTextCell, MultiSelectCell, NumberCell, PersonCell, RatingCell, SelectCell, SheetCell, SheetGrid, StatusCell, TextCell, UrlCell } from '../chunk-INTEH4F3.js';
1
+ export { CellDisplay, CellEditor, CheckboxCell, DateCell, LongTextCell, MultiSelectCell, NumberCell, PersonCell, RatingCell, SelectCell, SheetCell, SheetGrid, StatusCell, TextCell, UrlCell } from '../chunk-CT4EZF62.js';
2
2
  import '../chunk-O2EGEONV.js';
3
3
  import '../chunk-CENOOTAV.js';
4
4
  import '../chunk-3BYIWOTV.js';
@@ -9,13 +9,13 @@ import '../chunk-YEKYVJQR.js';
9
9
  import '../chunk-NHBP2XS5.js';
10
10
  import '../chunk-Z7JYG5TF.js';
11
11
  import '../chunk-QWOPX2MN.js';
12
- import '../chunk-UAN5NE7M.js';
13
12
  import '../chunk-AYKXMIOR.js';
13
+ import '../chunk-UAN5NE7M.js';
14
14
  import '../chunk-5OM447RW.js';
15
- import '../chunk-UFKUWVMV.js';
16
- import '../chunk-OG6CL3EB.js';
15
+ import '../chunk-2HIOJ4YZ.js';
17
16
  import '../chunk-HMPFGIWM.js';
18
17
  import '../chunk-R25RGPUB.js';
18
+ import '../chunk-OG6CL3EB.js';
19
19
  import '../chunk-RSAQOKH3.js';
20
20
  import '../chunk-4FQT6ZAY.js';
21
21
  import '../chunk-BZFWDIV6.js';
@@ -1,7 +1,7 @@
1
1
  export { SLIDE_COMPARE_LABELS, SlideCompare } from '../chunk-ALMSY7RL.js';
2
2
  import '../chunk-O63MWA4G.js';
3
- import '../chunk-OG6CL3EB.js';
4
3
  import '../chunk-HMPFGIWM.js';
5
4
  import '../chunk-R25RGPUB.js';
5
+ import '../chunk-OG6CL3EB.js';
6
6
  import '../chunk-BZFWDIV6.js';
7
7
  import '../chunk-ODEQTPFM.js';
@@ -1,15 +1,15 @@
1
- export { Switcher } from '../chunk-5OY4LJFH.js';
1
+ export { Switcher } from '../chunk-HVNTQ36V.js';
2
2
  import '../chunk-W5J7R5EB.js';
3
- import '../chunk-F4DPAJCN.js';
3
+ import '../chunk-I3KKZ2O3.js';
4
4
  import '../chunk-F73MC7EZ.js';
5
+ import '../chunk-BWRGFKJP.js';
5
6
  import '../chunk-FYTIJM2T.js';
6
7
  import '../chunk-6QFAK2WV.js';
7
- import '../chunk-BWRGFKJP.js';
8
8
  import '../chunk-PQADV6P6.js';
9
9
  import '../chunk-IG75YMUN.js';
10
- import '../chunk-OG6CL3EB.js';
11
10
  import '../chunk-HMPFGIWM.js';
12
11
  import '../chunk-R25RGPUB.js';
12
+ import '../chunk-OG6CL3EB.js';
13
13
  import '../chunk-RSAQOKH3.js';
14
14
  import '../chunk-4FQT6ZAY.js';
15
15
  import '../chunk-BZFWDIV6.js';
@@ -1,13 +1,13 @@
1
- export { DEFAULT_TIME_WINDOW_LABELS, TIME_WINDOW_SPANS, TimeWindowPicker, describeTimeWindow, isTimeWindowSet, parseTimeWindowDuration, resolveTimeWindow, timeWindowMatchesPreset } from '../chunk-LREN6TUG.js';
1
+ export { DEFAULT_TIME_WINDOW_LABELS, TIME_WINDOW_SPANS, TimeWindowPicker, describeTimeWindow, isTimeWindowSet, parseTimeWindowDuration, resolveTimeWindow, timeWindowMatchesPreset } from '../chunk-UZ6MA2V6.js';
2
2
  import '../chunk-FC4YTTFJ.js';
3
3
  import '../chunk-F73MC7EZ.js';
4
+ import '../chunk-BWRGFKJP.js';
4
5
  import '../chunk-GXQ3B46I.js';
5
6
  import '../chunk-6QFAK2WV.js';
6
- import '../chunk-BWRGFKJP.js';
7
7
  import '../chunk-PQADV6P6.js';
8
- import '../chunk-OG6CL3EB.js';
9
8
  import '../chunk-HMPFGIWM.js';
10
9
  import '../chunk-R25RGPUB.js';
10
+ import '../chunk-OG6CL3EB.js';
11
11
  import '../chunk-4FQT6ZAY.js';
12
12
  import '../chunk-BZFWDIV6.js';
13
13
  import '../chunk-ODEQTPFM.js';
@@ -1,10 +1,10 @@
1
- export { TreeCanvas } from '../chunk-RSC7UJCR.js';
1
+ export { TreeCanvas } from '../chunk-S6VG5ZFZ.js';
2
2
  import '../chunk-MY374UUD.js';
3
- import '../chunk-KZOGQXSP.js';
3
+ import '../chunk-OJ45PPCV.js';
4
4
  import '../chunk-VYOKRN2I.js';
5
- import '../chunk-OG6CL3EB.js';
6
5
  import '../chunk-HMPFGIWM.js';
7
6
  import '../chunk-R25RGPUB.js';
7
+ import '../chunk-OG6CL3EB.js';
8
8
  import '../chunk-4FQT6ZAY.js';
9
9
  import '../chunk-BZFWDIV6.js';
10
10
  import '../chunk-ODEQTPFM.js';
@@ -44,6 +44,12 @@ export interface WidgetFrameProps extends Omit<HTMLAttributes<HTMLElement>, 'tit
44
44
  onCite?: (() => void) | undefined;
45
45
  /** The host's controls for this figure, such as a menu offering CSV and PNG. */
46
46
  actions?: ReactNode;
47
+ /**
48
+ * The figure reaches the frame's sides: a table, whose row rules meet the
49
+ * frame's border and whose first column starts where the title does. Any
50
+ * other figure keeps the frame's inset.
51
+ */
52
+ flush?: boolean | undefined;
47
53
  /** The heading level of the title. Default 3, under a board's own heading. */
48
54
  headingLevel?: 2 | 3 | 4 | undefined;
49
55
  /** Overrides the shared clock, for a story or a suite. */
@@ -67,7 +73,14 @@ export interface WidgetFrameProps extends Omit<HTMLAttributes<HTMLElement>, 'tit
67
73
  * of the figure itself: a host that passed rows by mistake still shows none.
68
74
  * `failed` reads the same way with its own sentence.
69
75
  *
76
+ * ONE INSET FOR EVERY PART. The title, the figure and the citation stand on
77
+ * the card's own 16px from each side, so a frame lines up with every other
78
+ * card on a board. A table passes `flush` and reaches the sides instead, its
79
+ * cells taking the same inset so its first column starts under the title. A
80
+ * stat tile drawn `flush` as the figure takes the frame's inset, not one of
81
+ * its own on top of it.
82
+ *
70
83
  * Sits inside the host's `ArrangeFrame`, which owns the grid, the drag and
71
84
  * the resize; this owns what is inside the card.
72
85
  */
73
- export declare function WidgetFrame({ title, source, onCite, actions, headingLevel, now, labels, className, children, ...rest }: WidgetFrameProps): import("react").JSX.Element;
86
+ export declare function WidgetFrame({ title, source, onCite, actions, flush, headingLevel, now, labels, className, children, ...rest }: WidgetFrameProps): import("react").JSX.Element;
@@ -1,4 +1,4 @@
1
- export { WidgetFrame } from '../chunk-BQYQWJPK.js';
1
+ export { WidgetFrame } from '../chunk-AAOH2P6Y.js';
2
2
  import '../chunk-W5J7R5EB.js';
3
3
  import '../chunk-3CZ7XAVY.js';
4
4
  import '../chunk-EUCC37WY.js';