@crewlethq/ui 0.27.0 → 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 (77) hide show
  1. package/README.md +27 -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 +3 -3
  30. package/dist/ShareDialog/index.js +4 -4
  31. package/dist/SheetGrid/index.js +4 -4
  32. package/dist/SlideCompare/index.js +3 -3
  33. package/dist/SlideFilmstrip/index.js +2 -2
  34. package/dist/SlideGrid/index.js +2 -2
  35. package/dist/SlideStage/index.js +1 -1
  36. package/dist/SlideStage/useSlideKeys.d.ts +9 -0
  37. package/dist/Switcher/index.js +4 -4
  38. package/dist/TimeWindowPicker/index.js +3 -3
  39. package/dist/TreeCanvas/index.js +3 -3
  40. package/dist/WidgetFrame/WidgetFrame.d.ts +14 -1
  41. package/dist/WidgetFrame/index.js +1 -1
  42. package/dist/WidgetFrame-LRZIL62O.css +206 -0
  43. package/dist/{chunk-TD2MIINY.js → chunk-3C3BRIMY.js} +1 -1
  44. package/dist/{chunk-MLT2HBPN.js → chunk-77DRMDXR.js} +7 -2
  45. package/dist/{chunk-BQYQWJPK.js → chunk-AAOH2P6Y.js} +8 -2
  46. package/dist/{chunk-33Z2SEDQ.js → chunk-ALMSY7RL.js} +1 -1
  47. package/dist/{chunk-35XVR5JQ.js → chunk-B4EBHPK3.js} +2 -2
  48. package/dist/chunk-CJKMURZO.js +31 -0
  49. package/dist/{chunk-INTEH4F3.js → chunk-CT4EZF62.js} +2 -2
  50. package/dist/{chunk-SVW3VG72.js → chunk-EBJREOKS.js} +5 -4
  51. package/dist/{chunk-GTLJXJ3U.js → chunk-HCKJGBQH.js} +1 -1
  52. package/dist/{chunk-5OY4LJFH.js → chunk-HVNTQ36V.js} +2 -2
  53. package/dist/{chunk-3D7PSL2L.js → chunk-JODJS7MR.js} +2 -2
  54. package/dist/{chunk-URUGEAFB.js → chunk-JQLTG4KH.js} +1 -1
  55. package/dist/{chunk-UOPHR5CE.js → chunk-LR5QTFOE.js} +1 -1
  56. package/dist/{chunk-VCRFFIYI.js → chunk-O63MWA4G.js} +18 -13
  57. package/dist/{chunk-CTHM6YSJ.js → chunk-OGAAHVF6.js} +1 -1
  58. package/dist/chunk-QBA5B2Z5.js +17 -0
  59. package/dist/{chunk-RSC7UJCR.js → chunk-S6VG5ZFZ.js} +1 -1
  60. package/dist/{chunk-OJRDEVHV.js → chunk-VOMYRJV5.js} +4 -4
  61. package/dist/{chunk-BFQK7CYJ.js → chunk-WENCSQ47.js} +1 -1
  62. package/dist/{chunk-ZZDY4XL7.js → chunk-ZB5O3ELS.js} +12 -12
  63. package/dist/{chunk-L2OQRPXJ.js → chunk-ZR5VN5IV.js} +1 -1
  64. package/dist/generated/index.d.ts +1 -0
  65. package/dist/generated/index.js +62 -61
  66. package/dist/index.js +62 -61
  67. package/dist/styles.css +148 -20
  68. package/package.json +3 -3
  69. package/dist/WidgetFrame-4EFJOJMW.css +0 -127
  70. package/dist/chunk-63WJLRB2.js +0 -24
  71. package/dist/{chunk-UFKUWVMV.js → chunk-2HIOJ4YZ.js} +1 -1
  72. package/dist/{chunk-F4DPAJCN.js → chunk-I3KKZ2O3.js} +1 -1
  73. package/dist/{chunk-FW7HN6AP.js → chunk-LDJ3J4TQ.js} +1 -1
  74. package/dist/{chunk-SLRKS5PF.js → chunk-NWW4IQJU.js} +0 -0
  75. package/dist/{chunk-KZOGQXSP.js → chunk-OJ45PPCV.js} +1 -1
  76. package/dist/{chunk-LREN6TUG.js → chunk-UZ6MA2V6.js} +2 -2
  77. 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,32 @@ 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
+
227
+ ## Changes in 0.27.1
228
+
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.
230
+
231
+ Nothing to change: handlers that close over the current slide are right as they are.
232
+
207
233
  ## Changes in 0.27.0
208
234
 
209
235
  **`SlideStage` presents in the page with `fit="view"`.** A slide presented inside a page sits below a title, a description and tabs, so a stage as tall as its column ran past the foot of the window and hid the bottom of the slide and the controls under it. A `view` stage letterboxes its slide as `contain` does, in a box whose height is measured: the room from the top of the stage's parent (the show: the stage and its controls) to the foot of its scrollport, less what else the parent holds and its `scroll-margin-bottom`, or the slide's height at the stage's width if that is less. The room is measured with the scrollport at its top, so it does not change as the reader scrolls, and again whenever the view, the show or the stage is resized. A show too low on the page to get half of what it asks takes the scrollport's whole height and is scrolled into view, clear of its `scroll-margin-top`. In full screen the stage fills its box, sharing a flex column with the show's controls.
@@ -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
- export { PresenterView, formatStopwatch } from '../chunk-CTHM6YSJ.js';
2
- import '../chunk-VCRFFIYI.js';
3
- import '../chunk-OG6CL3EB.js';
1
+ export { PresenterView, formatStopwatch } from '../chunk-OGAAHVF6.js';
2
+ import '../chunk-O63MWA4G.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
- export { SLIDE_COMPARE_LABELS, SlideCompare } from '../chunk-33Z2SEDQ.js';
2
- import '../chunk-VCRFFIYI.js';
3
- import '../chunk-OG6CL3EB.js';
1
+ export { SLIDE_COMPARE_LABELS, SlideCompare } from '../chunk-ALMSY7RL.js';
2
+ import '../chunk-O63MWA4G.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,5 +1,5 @@
1
- export { SlideFilmstrip } from '../chunk-UOPHR5CE.js';
2
- import '../chunk-VCRFFIYI.js';
1
+ export { SlideFilmstrip } from '../chunk-LR5QTFOE.js';
2
+ import '../chunk-O63MWA4G.js';
3
3
  import '../chunk-XJ2QEBMM.js';
4
4
  import '../chunk-HMPFGIWM.js';
5
5
  import '../chunk-R25RGPUB.js';
@@ -1,5 +1,5 @@
1
- export { SlideGrid } from '../chunk-TD2MIINY.js';
2
- import '../chunk-VCRFFIYI.js';
1
+ export { SlideGrid } from '../chunk-3C3BRIMY.js';
2
+ import '../chunk-O63MWA4G.js';
3
3
  import '../chunk-HMPFGIWM.js';
4
4
  import '../chunk-R25RGPUB.js';
5
5
  import '../chunk-ODEQTPFM.js';
@@ -1,4 +1,4 @@
1
- export { SLIDE_HEIGHT, SLIDE_WIDTH, SlideStage, useSlideKeys } from '../chunk-VCRFFIYI.js';
1
+ export { SLIDE_HEIGHT, SLIDE_WIDTH, SlideStage, useSlideKeys } from '../chunk-O63MWA4G.js';
2
2
  import '../chunk-HMPFGIWM.js';
3
3
  import '../chunk-R25RGPUB.js';
4
4
  import '../chunk-ODEQTPFM.js';
@@ -17,5 +17,14 @@ export interface SlideKeys {
17
17
  * its key wherever focus is. A key a field is typing, a composition is using,
18
18
  * or a nearer surface (a menu, a dialog) already handled is left alone, and
19
19
  * modified keys are the browser's.
20
+ *
21
+ * THE NEWEST HANDLERS ANSWER EVERY KEY. A show's handlers close over the slide
22
+ * it is on, so a key must never reach the handlers of a slide already left.
23
+ * They are read from a ref the hook brings up to date as each render commits,
24
+ * before the browser can dispatch another event, and the listener itself
25
+ * stays put. Re-adding the listener after each render instead left a gap
26
+ * after every step, between the new slide's commit and the effect that
27
+ * re-added it, where a quick second press (a clicker held down, or two taps)
28
+ * went to the old slide's handlers and moved to the slide already shown.
20
29
  */
21
30
  export declare function useSlideKeys({ onNext, onPrevious, onFirst, onLast, onExit, enabled }: SlideKeys): void;
@@ -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';