@crewlethq/ui 0.40.0 → 0.41.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.
package/README.md CHANGED
@@ -204,6 +204,14 @@ 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.41.0
208
+
209
+ **The rail's head carries a status** (`AppShell.Rail` `status`, drawn with `AppShell.RailStatus`). An application's own state, such as its engine's, stands compact at the end of the head's line, beside the name: a status dot and, when something stands against it, a count in the foot row's inks (the warning ink with its mark for alarms). The state's words are the status's name and title rather than a line of the rail ("Engine serving, 1 alarm"), so the count is read once, in words. A status that opens a panel is the panel's trigger, as a foot row is (`aria-haspopup`, `aria-expanded` and `aria-controls` reach its button, and a `Popover` anchors to it), and `label` names it where a press does something the state does not say ("Engine signed out. Sign in"). A status nothing presses is a statement with no place in the tab order. It reserves the width of a dot and a two-figure count, and a `BrandLockup` beside it gives up its end inset to the head's gap, so the name truncates at one place whatever the count says, it is a 24px target each way with its focus ring inside its box, and it ends on the nav's gutter, where every row's background ends. It stands in the drawer's head the same way. The foot's doc now names it the place for what a reader reaches for rarely.
210
+
211
+ ## Changes in 0.40.1
212
+
213
+ **The rail's foot stands on the compact step.** What a reader reaches for rarely (a settings link, a status row, who they are) takes less of the rail's height: the foot's rows are 26px (`--size-control-sm`, through `--crewlet-rail-foot-row`) where they were the nav's 30px, the foot's gap is 2px and its inset 4px where they were 4px and 8px, and the account row spends 2px around its name and detail where it spent 8px. A foot of Settings, an engine row and the account row is 101px tall where it was 133px. Only heights change: every row keeps its order, its columns, its glyphs and its words, the rows above the foot keep their 30px step, and every target still clears 24px, with the targets of neighbouring rows meeting across the gap.
214
+
207
215
  ## Changes in 0.40.0
208
216
 
209
217
  The engine dashboard's own lists, page parts and navigation pieces, moved into the kit so every application draws them from one place.
@@ -103,6 +103,7 @@ export declare function AppShell({ sidebar, topbar, banner, footer, mainId, main
103
103
  export declare namespace AppShell {
104
104
  var Rail: typeof AppShellRail;
105
105
  var RailRow: import("react").ForwardRefExoticComponent<AppShellRailRowProps & import("react").RefAttributes<HTMLElement>>;
106
+ var RailStatus: import("react").ForwardRefExoticComponent<AppShellRailStatusProps & import("react").RefAttributes<HTMLElement>>;
106
107
  var Topbar: typeof AppShellTopbar;
107
108
  var Toggle: typeof AppShellToggle;
108
109
  var AccountRow: typeof import("./AccountRow.js").AccountRow;
@@ -122,16 +123,24 @@ export interface AppShellRailProps {
122
123
  */
123
124
  search?: ReactNode;
124
125
  /**
125
- * The foot: what the engine is doing, the theme and density controls. An
126
- * `<AppShell.RailRow>` puts a line there on the rail's own insets, so its
127
- * mark lands on the line every nav glyph above it sits on.
126
+ * A compact status at the end of the head's line, beside the name the head
127
+ * carries: an `<AppShell.RailStatus>`, the application's own state in a
128
+ * dot and a count. It takes its own width, so the name keeps the rest and
129
+ * truncates there, and it stands in the drawer's head the same way.
130
+ */
131
+ status?: ReactNode;
132
+ /**
133
+ * The foot: what a reader reaches for rarely, such as a settings link and
134
+ * their own account row. An `<AppShell.RailRow>` puts a line there on the
135
+ * rail's own insets, so its mark lands on the line every nav glyph above it
136
+ * sits on. A state the application reports belongs in `status`, compact.
128
137
  */
129
138
  footer?: ReactNode;
130
139
  className?: string | undefined;
131
140
  children?: ReactNode;
132
141
  }
133
142
  /** The rail's three regions: a head, a scrolling middle, and a foot. */
134
- export declare function AppShellRail({ header, search, footer, className, children }: AppShellRailProps): import("react").JSX.Element;
143
+ export declare function AppShellRail({ header, search, status, footer, className, children }: AppShellRailProps): import("react").JSX.Element;
135
144
  /**
136
145
  * A figure at the end of a row in the foot, and what it counts.
137
146
  *
@@ -262,6 +271,65 @@ export type AppShellRailRowProps = StaticRailRowProps | ActionRailRowProps;
262
271
  * says whether it is open.
263
272
  */
264
273
  export declare const AppShellRailRow: import("react").ForwardRefExoticComponent<AppShellRailRowProps & import("react").RefAttributes<HTMLElement>>;
274
+ /** What the head's status says, whether or not it is a control. */
275
+ interface RailStatusContent {
276
+ /** The state's mark: a status dot. The status draws no words, so the mark and the count are what is seen. */
277
+ icon: ReactNode;
278
+ /**
279
+ * The state in words, "Engine serving". Not drawn: it is the status's name,
280
+ * read by assistive technology and shown as its title, with the count's
281
+ * words after it ("Engine serving, 1 alarm").
282
+ */
283
+ children: string;
284
+ /** How many of something stands against the state, drawn as a row's count is. */
285
+ count?: RailRowCount | undefined;
286
+ /** A mark after the count, for a state a press resolves: the key beside "sign in". */
287
+ trailing?: ReactNode;
288
+ className?: string | undefined;
289
+ }
290
+ /** A status the head states and nothing presses. */
291
+ export interface StaticRailStatusProps extends RailStatusContent {
292
+ onClick?: undefined;
293
+ label?: undefined;
294
+ 'aria-expanded'?: undefined;
295
+ 'aria-haspopup'?: undefined;
296
+ 'aria-controls'?: undefined;
297
+ }
298
+ /** A status that opens something: the engine's panel. */
299
+ export interface ActionRailStatusProps extends RailStatusContent {
300
+ onClick: MouseEventHandler<HTMLButtonElement>;
301
+ /**
302
+ * Names the control where the state and its count are not what pressing it
303
+ * does ("Engine signed out. Sign in"). It replaces that name, and the title.
304
+ */
305
+ label?: string | undefined;
306
+ /** Whether the panel it opens is open, as a `Popover` or a `Menu` trigger passes it. */
307
+ 'aria-expanded'?: boolean | undefined;
308
+ /** What it opens. */
309
+ 'aria-haspopup'?: AriaAttributes['aria-haspopup'];
310
+ /** The panel it opens, while it is open. */
311
+ 'aria-controls'?: string | undefined;
312
+ }
313
+ export type AppShellRailStatusProps = StaticRailStatusProps | ActionRailStatusProps;
314
+ /**
315
+ * The application's state, compact, at the end of the rail head's line.
316
+ *
317
+ * A FOOT ROW'S MEANING IN A DOT AND A COUNT. The state's words are its name
318
+ * and its title rather than a line of the rail ("Engine serving, 1 alarm"),
319
+ * so a sighted reader reads the dot and the count, and hovers for the words,
320
+ * and a screen reader is told what a foot row would have told it. The count
321
+ * is the row's own (`RailRowCount`), in the same inks.
322
+ *
323
+ * IT TAKES A FIXED FLOOR OF WIDTH, a dot and a two-figure count, so the
324
+ * name beside it truncates at one place whatever the count says: the name
325
+ * does not lose a character when an alarm is raised. A count wider than the
326
+ * floor still grows the status rather than being cut.
327
+ *
328
+ * A STATUS THAT OPENS A PANEL IS ITS TRIGGER, as the foot's row is: the
329
+ * element goes to `ref` and the popup attributes reach the button, so a
330
+ * `Popover` anchors to it and it says whether the panel is open.
331
+ */
332
+ export declare const AppShellRailStatus: import("react").ForwardRefExoticComponent<AppShellRailStatusProps & import("react").RefAttributes<HTMLElement>>;
265
333
  export interface AppShellToggleProps {
266
334
  className?: string | undefined;
267
335
  }
@@ -1,6 +1,6 @@
1
1
  import '../HitArea/HitArea.css';
2
2
  import './AppShell.css';
3
- export { AppShell, AppShellRail, AppShellRailRow, AppShellToggle, AppShellTopbar, useAppShell } from './AppShell.js';
3
+ export { AppShell, AppShellRail, AppShellRailRow, AppShellRailStatus, AppShellToggle, AppShellTopbar, useAppShell } from './AppShell.js';
4
4
  export { AccountRow } from './AccountRow.js';
5
5
  export type { AccountRowMenu, AccountRowProps } from './AccountRow.js';
6
- export type { ActionRailRowProps, AppShellContextValue, AppShellProps, AppShellRailProps, AppShellRailRowProps, AppShellToggleProps, AppShellTopbarProps, RailRowCount, StaticRailRowProps, } from './AppShell.js';
6
+ export type { ActionRailRowProps, ActionRailStatusProps, AppShellContextValue, AppShellProps, AppShellRailProps, AppShellRailRowProps, AppShellRailStatusProps, AppShellToggleProps, AppShellTopbarProps, RailRowCount, StaticRailRowProps, StaticRailStatusProps, } from './AppShell.js';
@@ -1,4 +1,4 @@
1
- export { AccountRow, AppShell, AppShellRail, AppShellRailRow, AppShellToggle, AppShellTopbar, useAppShell } from '../chunk-KKNHMXTE.js';
1
+ export { AccountRow, AppShell, AppShellRail, AppShellRailRow, AppShellRailStatus, AppShellToggle, AppShellTopbar, useAppShell } from '../chunk-SCPEMLLY.js';
2
2
  import '../chunk-RTPQDNW3.js';
3
3
  import '../chunk-D6FEHY5G.js';
4
4
  import '../chunk-OMV5W53A.js';
@@ -155,6 +155,68 @@
155
155
  min-width: 0;
156
156
  }
157
157
 
158
+ /*
159
+ * THE HEAD'S STATUS, at the end of the name's line (`AppShell.RailStatus`):
160
+ * the application's state as a dot and a count, its words in its name and
161
+ * title. It ends on the nav's gutter, where every row's background ends, and
162
+ * it reserves the width of a dot and a two-figure count, so the name beside
163
+ * it truncates at one place whether the engine is healthy or has alarms.
164
+ */
165
+ .crewlet-app-shell__rail-status {
166
+ display: flex;
167
+ flex: none;
168
+ align-items: center;
169
+ justify-content: flex-end;
170
+ min-width: calc(var(--size-target-min) * 2 + var(--spacing-1));
171
+ margin-inline-end: var(--size-nav-gutter);
172
+ }
173
+
174
+ /* A lockup beside a status gives up its end inset: the head's gap parts the
175
+ two, and the inset is what kept a lockup alone on its line off the edge. */
176
+ .crewlet-app-shell__rail-head:has(> .crewlet-app-shell__rail-status) > .crewlet-brand {
177
+ padding-inline-end: 0;
178
+ }
179
+
180
+ /* The dot and the count on one compact target: the 24px floor each way. */
181
+ .crewlet-app-shell__rail-status-mark {
182
+ display: inline-flex;
183
+ align-items: center;
184
+ justify-content: center;
185
+ gap: calc(var(--spacing-1) + var(--spacing-1) / 2);
186
+ min-width: var(--size-target-min);
187
+ min-height: var(--size-target-min);
188
+ margin: 0;
189
+ padding: 0 var(--spacing-1);
190
+ border: 0;
191
+ border-radius: var(--radius-md);
192
+ background: transparent;
193
+ color: var(--color-text-secondary);
194
+ font: inherit;
195
+ }
196
+
197
+ .crewlet-app-shell__rail-status-icon,
198
+ .crewlet-app-shell__rail-status-trailing {
199
+ display: inline-flex;
200
+ align-items: center;
201
+ }
202
+
203
+ .crewlet-app-shell__rail-status-mark--action {
204
+ cursor: pointer;
205
+ transition: background var(--motion-duration-fast) var(--motion-easing-default);
206
+ }
207
+
208
+ /* Open is pointed at, as the foot's row draws it: the lift stays while the panel is open. */
209
+ .crewlet-app-shell__rail-status-mark--action:hover,
210
+ .crewlet-app-shell__rail-status-mark--action[aria-expanded='true'] {
211
+ background: var(--color-surface-hover);
212
+ }
213
+
214
+ /* Inside its own box, so the ring is never cut by the head or the drawer's edge. */
215
+ .crewlet-app-shell__rail-status-mark--action:focus-visible {
216
+ outline: 2px solid var(--color-focus);
217
+ outline-offset: var(--size-focus-ring-inset-offset);
218
+ }
219
+
158
220
  /*
159
221
  * THE RAIL'S FIELD ON THE NAV'S COLUMNS. It stands on the nav's gutter, so
160
222
  * its right edge is where every row's background ends; and its glyph stands
@@ -171,14 +233,22 @@
171
233
  }
172
234
 
173
235
  /* The same gutter the nav takes, so what the foot says lines up with the rows
174
- above it rather than sitting further out. */
236
+ above it rather than sitting further out.
237
+
238
+ THE FOOT IS THE COMPACT STEP. It holds what a reader reaches for rarely (a
239
+ settings link, the engine's state, who they are), so its rows stand on the
240
+ small control step (`--crewlet-rail-foot-row`, 26px, never under the 24px
241
+ target) on a half-step gap and a one-step inset, where the nav above keeps
242
+ its 30px rows. Only heights change: every row keeps its order, columns,
243
+ glyphs and words. */
175
244
  .crewlet-app-shell__rail-foot {
176
- --crewlet-rail-foot-gap: var(--spacing-1);
245
+ --crewlet-rail-foot-gap: calc(var(--spacing-1) / 2);
246
+ --crewlet-rail-foot-row: var(--size-control-sm);
177
247
  flex: none;
178
248
  display: flex;
179
249
  flex-direction: column;
180
250
  gap: var(--crewlet-rail-foot-gap);
181
- padding: var(--spacing-2) var(--size-nav-gutter);
251
+ padding: var(--spacing-1) var(--size-nav-gutter);
182
252
  border-top: 1px solid var(--color-border-default);
183
253
  }
184
254
 
@@ -279,6 +349,14 @@
279
349
  min-width: 14px;
280
350
  }
281
351
 
352
+ /* The foot's own step (see `.crewlet-app-shell__rail-foot`), for its rows and
353
+ for a navigation dropped into it, whose rows keep the rail's columns. */
354
+ .crewlet-app-shell__rail-foot > .crewlet-app-shell__rail-row--action:not(.crewlet-app-shell__rail-row--block),
355
+ .crewlet-app-shell__rail-foot > .crewlet-btn,
356
+ .crewlet-app-shell__rail-foot .crewlet-nav-item__row {
357
+ min-height: var(--crewlet-rail-foot-row);
358
+ }
359
+
282
360
  /*
283
361
  * OPEN IS POINTED AT. The row a panel is open from keeps the hover's lift for
284
362
  * as long as the panel is open, drawn from `aria-expanded` so the picture and
@@ -684,7 +762,8 @@
684
762
  .crewlet-app-shell__rail,
685
763
  .crewlet-app-shell__rail[data-open='true'],
686
764
  .crewlet-app-shell__rail-row--action,
687
- .crewlet-app-shell__rail-foot > .crewlet-btn {
765
+ .crewlet-app-shell__rail-foot > .crewlet-btn,
766
+ .crewlet-app-shell__rail-status-mark--action {
688
767
  transition: none;
689
768
  }
690
769
  }
@@ -731,9 +810,16 @@
731
810
  * whatever size of badge a caller hands the row, it is centred where a glyph
732
811
  * is, and the row takes the nav row's pad and its glyph-to-word gap.
733
812
  */
813
+ .crewlet-app-shell__rail-foot .crewlet-account-row {
814
+ --crewlet-account-row-pad: var(--spacing-0);
815
+ }
816
+
734
817
  .crewlet-app-shell__rail-foot .crewlet-account-row__who {
735
818
  --crewlet-hit-area-block-start: calc(var(--crewlet-rail-foot-gap) / 2 + var(--crewlet-account-row-pad));
736
819
  gap: calc(var(--spacing-2) + var(--spacing-1) / 2);
820
+ /* On the foot's compact step: the two lines of name and detail with half a
821
+ step above and below them, which still clears the avatar. */
822
+ padding-block: calc(var(--spacing-1) / 2);
737
823
  padding-inline-start: var(--size-nav-row-pad);
738
824
  }
739
825
 
@@ -1,4 +1,4 @@
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-QRKT4XTT.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-6QNN3WIT.js';
2
2
  import '../chunk-HOXGBLEY.js';
3
3
  import '../chunk-UB6MLXUL.js';
4
4
  import '../chunk-FXBGEANQ.js';
@@ -6,9 +6,9 @@ import '../chunk-STJ7QBC3.js';
6
6
  import '../chunk-DTIW4CHZ.js';
7
7
  import '../chunk-IAGYPTEJ.js';
8
8
  import '../chunk-7KHM2FZH.js';
9
+ import '../chunk-NR4CPM4T.js';
9
10
  import '../chunk-KHJIEPZV.js';
10
11
  import '../chunk-GXQ3B46I.js';
11
- import '../chunk-NR4CPM4T.js';
12
12
  import '../chunk-AXS6MBNH.js';
13
13
  import '../chunk-3CZ7XAVY.js';
14
14
  import '../chunk-EUCC37WY.js';
@@ -6,7 +6,7 @@ import { IconButton } from './chunk-4FQT6ZAY.js';
6
6
  import { VisuallyHidden } from './chunk-BZFWDIV6.js';
7
7
  import { cx } from './chunk-ODEQTPFM.js';
8
8
  import './HitArea-QUOS6ZDJ.css';
9
- import './AppShell-NPSWZ3XW.css';
9
+ import './AppShell-V3TAAYL3.css';
10
10
  import { createContext, forwardRef, useContext, useId, useState, useRef, useCallback, useEffect, useLayoutEffect } from 'react';
11
11
  import { breakpoint } from '@crewlethq/tokens';
12
12
  import { ChevronUpGlyph, ChevronsUpDownGlyph, ChevronRightGlyph, MenuGlyph } from '@crewlethq/icons/glyphs';
@@ -231,9 +231,12 @@ function ShellDrawer({
231
231
  }
232
232
  );
233
233
  }
234
- function AppShellRail({ header, search, footer, className, children }) {
234
+ function AppShellRail({ header, search, status, footer, className, children }) {
235
235
  return /* @__PURE__ */ jsxs("div", { className: cx("crewlet-app-shell__rail-inner", className), children: [
236
- header ? /* @__PURE__ */ jsx("div", { className: "crewlet-app-shell__rail-head", children: header }) : null,
236
+ header || status ? /* @__PURE__ */ jsxs("div", { className: "crewlet-app-shell__rail-head", children: [
237
+ header,
238
+ status ? /* @__PURE__ */ jsx("div", { className: "crewlet-app-shell__rail-status", children: status }) : null
239
+ ] }) : null,
237
240
  /* @__PURE__ */ jsxs("div", { className: "crewlet-app-shell__rail-body", children: [
238
241
  search ? /* @__PURE__ */ jsx("div", { className: "crewlet-app-shell__rail-search", children: search }) : null,
239
242
  children
@@ -241,6 +244,25 @@ function AppShellRail({ header, search, footer, className, children }) {
241
244
  footer ? /* @__PURE__ */ jsx("div", { className: "crewlet-app-shell__rail-foot", children: footer }) : null
242
245
  ] });
243
246
  }
247
+ function countWords(count) {
248
+ return `, ${String(count.value)} ${count.label}`;
249
+ }
250
+ function RailCountFigure({ count }) {
251
+ return /* @__PURE__ */ jsxs(
252
+ "span",
253
+ {
254
+ className: cx(
255
+ "crewlet-app-shell__rail-row-count",
256
+ count.tone === "warning" && "crewlet-app-shell__rail-row-count--warning"
257
+ ),
258
+ "aria-hidden": true,
259
+ children: [
260
+ count.mark ? /* @__PURE__ */ jsx("span", { className: "crewlet-app-shell__rail-row-count-mark", children: count.mark }) : null,
261
+ count.value
262
+ ]
263
+ }
264
+ );
265
+ }
244
266
  function opensSomething(haspopup) {
245
267
  return haspopup !== void 0 && haspopup !== false && haspopup !== "false";
246
268
  }
@@ -265,7 +287,7 @@ var AppShellRailRow = forwardRef(function AppShellRailRow2({
265
287
  /* @__PURE__ */ jsxs("span", { className: "crewlet-app-shell__rail-row-text", children: [
266
288
  /* @__PURE__ */ jsxs("span", { className: "crewlet-app-shell__rail-row-label", children: [
267
289
  children,
268
- count ? /* @__PURE__ */ jsx(VisuallyHidden, { children: `, ${String(count.value)} ${count.label}` }) : null
290
+ count ? /* @__PURE__ */ jsx(VisuallyHidden, { children: countWords(count) }) : null
269
291
  ] }),
270
292
  block ? /* @__PURE__ */ jsxs(Fragment, { children: [
271
293
  " ",
@@ -274,20 +296,7 @@ var AppShellRailRow = forwardRef(function AppShellRailRow2({
274
296
  ] }),
275
297
  count ? /* @__PURE__ */ jsxs(Fragment, { children: [
276
298
  " ",
277
- /* @__PURE__ */ jsxs(
278
- "span",
279
- {
280
- className: cx(
281
- "crewlet-app-shell__rail-row-count",
282
- count.tone === "warning" && "crewlet-app-shell__rail-row-count--warning"
283
- ),
284
- "aria-hidden": true,
285
- children: [
286
- count.mark ? /* @__PURE__ */ jsx("span", { className: "crewlet-app-shell__rail-row-count-mark", children: count.mark }) : null,
287
- count.value
288
- ]
289
- }
290
- )
299
+ /* @__PURE__ */ jsx(RailCountFigure, { count })
291
300
  ] }) : null,
292
301
  trailing ? /* @__PURE__ */ jsxs(Fragment, { children: [
293
302
  " ",
@@ -315,6 +324,47 @@ var AppShellRailRow = forwardRef(function AppShellRailRow2({
315
324
  }
316
325
  );
317
326
  });
327
+ var AppShellRailStatus = forwardRef(function AppShellRailStatus2({
328
+ icon,
329
+ children,
330
+ count,
331
+ trailing,
332
+ onClick,
333
+ label,
334
+ className,
335
+ "aria-expanded": expanded,
336
+ "aria-haspopup": haspopup,
337
+ "aria-controls": controls
338
+ }, ref) {
339
+ const name = label ?? `${children}${count ? countWords(count) : ""}`;
340
+ const marks = /* @__PURE__ */ jsxs(Fragment, { children: [
341
+ /* @__PURE__ */ jsx("span", { className: "crewlet-app-shell__rail-status-icon", "aria-hidden": true, children: icon }),
342
+ count ? /* @__PURE__ */ jsx(RailCountFigure, { count }) : null,
343
+ trailing ? /* @__PURE__ */ jsx("span", { className: "crewlet-app-shell__rail-status-trailing", "aria-hidden": true, children: trailing }) : null
344
+ ] });
345
+ const shape = cx("crewlet-app-shell__rail-status-mark", className);
346
+ if (onClick === void 0) {
347
+ return /* @__PURE__ */ jsxs("span", { ref, className: shape, title: name, children: [
348
+ marks,
349
+ /* @__PURE__ */ jsx(VisuallyHidden, { children: name })
350
+ ] });
351
+ }
352
+ return /* @__PURE__ */ jsx(
353
+ "button",
354
+ {
355
+ ref,
356
+ type: "button",
357
+ className: cx(shape, "crewlet-app-shell__rail-status-mark--action", HIT_AREA_CLASS),
358
+ "aria-label": name,
359
+ title: name,
360
+ "aria-expanded": expanded,
361
+ "aria-haspopup": haspopup,
362
+ "aria-controls": controls,
363
+ onClick,
364
+ children: marks
365
+ }
366
+ );
367
+ });
318
368
  function AppShellToggle({ className }) {
319
369
  const { drawerOpen, toggleDrawer, railId, toggleLabel, hasRail } = useAppShell();
320
370
  if (!hasRail) return null;
@@ -341,8 +391,9 @@ function AppShellTopbar({ title, titleId, actions, className, children, ...rest
341
391
  }
342
392
  AppShell.Rail = AppShellRail;
343
393
  AppShell.RailRow = AppShellRailRow;
394
+ AppShell.RailStatus = AppShellRailStatus;
344
395
  AppShell.Topbar = AppShellTopbar;
345
396
  AppShell.Toggle = AppShellToggle;
346
397
  AppShell.AccountRow = AccountRow;
347
398
 
348
- export { AccountRow, AppShell, AppShellRail, AppShellRailRow, AppShellToggle, AppShellTopbar, useAppShell };
399
+ export { AccountRow, AppShell, AppShellRail, AppShellRailRow, AppShellRailStatus, AppShellToggle, AppShellTopbar, useAppShell };
@@ -1,11 +1,11 @@
1
1
  import '../chunk-S3QTFUJX.js';
2
2
  export { VersionTimeline } from '../chunk-NQCY44B3.js';
3
- export { matchesShortcut, useShortcut } from '../chunk-AYHIF6DH.js';
4
3
  export { WidgetFrame } from '../chunk-DFK5EQTU.js';
5
4
  export { ElementToPngError, elementToPng, parseCsv, serializeElement, toCsv } from '../chunk-FEJANUZK.js';
6
5
  export { ToastProvider, Toaster, useToast } from '../chunk-AC22RZKC.js';
7
6
  export { TreeCanvas } from '../chunk-5BUOMF6N.js';
8
7
  export { VERSION_COMPARE_LABELS, VERSION_COMPARE_LENSES, VersionCompare } from '../chunk-JSWOXRRE.js';
8
+ export { TagsInput } from '../chunk-BH52LIY6.js';
9
9
  export { ThemeGallery } from '../chunk-E4BOVKNJ.js';
10
10
  export { ThemeSwatch } from '../chunk-MNFU2RNT.js';
11
11
  export { DensitySwitcher, ThemeSwitcher } from '../chunk-KWWP3D7M.js';
@@ -13,21 +13,21 @@ export { ThemeToggle } from '../chunk-NP2C4Y4E.js';
13
13
  export { applyStoredPreferences, resolveTheme, useDensityPreference, useSystemTheme, useThemePreference } from '../chunk-Z24ZUSTX.js';
14
14
  export { TileGrid } from '../chunk-NNTO3TNC.js';
15
15
  export { DEFAULT_TIME_WINDOW_LABELS, TIME_WINDOW_SPANS, TimeWindowPicker, describeTimeWindow, isTimeWindowSet, parseTimeWindowDuration, resolveTimeWindow, timeWindowMatchesPreset } from '../chunk-YPMGP2X4.js';
16
+ export { Stepper } from '../chunk-5QWIJSQM.js';
16
17
  export { Switcher } from '../chunk-JKAGN4V4.js';
17
18
  export { Table } from '../chunk-V2N3BMOT.js';
18
19
  export { TABLE_TAGS_CELL_LABELS, TableDateCell, TableEntityCell, TableKeyCell, TableNumberCell, TableStatusCell, TableTagsCell, TableTextCell } from '../chunk-4BJK7FE5.js';
19
- export { TagsInput } from '../chunk-BH52LIY6.js';
20
+ export { SlideFilmstrip } from '../chunk-FBW3Q2OY.js';
20
21
  export { SlideGrid } from '../chunk-3V5T5K5H.js';
21
22
  export { SOURCE_EDITOR_KEYS, SourceEditor, lineStart } from '../chunk-D3EJSLCL.js';
22
- export { StatGroup } from '../chunk-OUD75UB2.js';
23
23
  export { StatCard } from '../chunk-YPTTSJPM.js';
24
- export { Stepper } from '../chunk-5QWIJSQM.js';
24
+ export { StatGroup } from '../chunk-OUD75UB2.js';
25
25
  export { ARTIFACT_ROLES, SHAREABLE_ROLES, ShareDialog, roleAtLeast } from '../chunk-KNHUBHFX.js';
26
26
  export { SHEET_COLUMN_EDITOR_LABELS, SheetColumnEditor, SheetColumnTypeGlyph } from '../chunk-GFYQKMQZ.js';
27
27
  export { CellDisplay, CellEditor, CheckboxCell, DateCell, LongTextCell, MultiSelectCell, NumberCell, PersonCell, RatingCell, SelectCell, SheetCell, SheetGrid, StatusCell, TextCell, UrlCell } from '../chunk-3PR65I3H.js';
28
28
  export { TagGroup } from '../chunk-O2EGEONV.js';
29
+ export { matchesShortcut, useShortcut } from '../chunk-AYHIF6DH.js';
29
30
  export { SLIDE_COMPARE_LABELS, SlideCompare } from '../chunk-7CGPPAYR.js';
30
- export { SlideFilmstrip } from '../chunk-FBW3Q2OY.js';
31
31
  export { FRAME_HELLO_TIMEOUT_MS, FRAME_LOAD_GRACE_MS, SandboxedFrame, SandboxedFrameNotice, SandboxedFramePlaceholder } from '../chunk-356JNSER.js';
32
32
  export { SearchTrigger } from '../chunk-6DRDCT22.js';
33
33
  export { SectionFrame, SectionFrameBody, SectionFrameNav } from '../chunk-INVSUFJK.js';
@@ -58,8 +58,8 @@ export { SIZE_EPSILON, TYPE_AHEAD_RESET_MS, createTreeModel, isTypeAheadKey, lay
58
58
  export { Outline, scrollToHeading, useActiveHeading } from '../chunk-A5YKNRG6.js';
59
59
  export { PageNote } from '../chunk-CV4NES3P.js';
60
60
  export { PEOPLE_RAIL_LABELS, PeopleRail, peopleRailKey } from '../chunk-GPWJCP3U.js';
61
- import '../chunk-CENOOTAV.js';
62
61
  export { PinTile } from '../chunk-6MIXD6IW.js';
62
+ import '../chunk-CENOOTAV.js';
63
63
  export { MERGE_CONFLICTS_LABELS, MergeConflicts } from '../chunk-2PEXZ7L4.js';
64
64
  export { DEFAULT_METER_THRESHOLDS, METER_STATES, Meter, meterState, meterStateTone, meterTone, progressTone } from '../chunk-UGNUUVRI.js';
65
65
  export { NewItemsNotice } from '../chunk-PXU6HOZB.js';
@@ -76,21 +76,20 @@ export { AutoGrid, Inline, Spacer, Stack } from '../chunk-ZAC7SKUN.js';
76
76
  export { Link } from '../chunk-FBSEJO2C.js';
77
77
  export { LinkInterstitial, openExternal } from '../chunk-N3TFYBN3.js';
78
78
  export { List, ListItem } from '../chunk-NZWX27J7.js';
79
- import '../chunk-MICRGE3J.js';
79
+ export { Highlight, highlightRanges, highlightTerms } from '../chunk-H6VKCIWV.js';
80
80
  import '../chunk-FFMCMSJB.js';
81
81
  export { IconTile } from '../chunk-IXJHTFXG.js';
82
82
  export { ImageUpload } from '../chunk-FWYHRU7M.js';
83
83
  export { InboxGroup, InboxList, InboxMore, InboxRow, InboxToggle } from '../chunk-XYCADWZN.js';
84
84
  export { FactList } from '../chunk-RLJXVFEH.js';
85
- export { FileDrop, FilePickButton, droppedFiles, pickedFiles } from '../chunk-THDGBD6Y.js';
86
85
  export { FILTER_CHIP_ATTRIBUTE, FilterChip, FilterChipGroup } from '../chunk-UYZZV4DZ.js';
86
+ export { FileDrop, FilePickButton, droppedFiles, pickedFiles } from '../chunk-THDGBD6Y.js';
87
87
  export { FindingList } from '../chunk-NTB5LRRD.js';
88
88
  export { FollowBanner } from '../chunk-OED6LUWE.js';
89
89
  export { DEFAULT_FRAME_THEME, EXTERNAL_URL_MAX, FRAME_BRIDGE, FRAME_MESSAGE, FRAME_ORIGIN_MODES, FRAME_SANDBOX_TOKENS, applyFrameTheme, checkFrameSandbox, externalUrl, frameFragment, frameOriginMatches, frameThemeMessage, httpOrigin, isFocusExit, isFrameNonce, negotiateBridge, parseFrameFragment, portTargetOrigin, readFrameHello, readFramePortMessage, readFrameTheme, readOpenLink } from '../chunk-F6V2PTN6.js';
90
90
  export { DENSITY_PREFERENCES, PALETTE_ID, THEME_PREFERENCES, applyDensity, applyPalette, applyTheme, isDensityPreference, isPaletteId, isThemePreference } from '../chunk-ZXXDZJQN.js';
91
91
  export { IDLE_AFTER_MS, useFullscreen, useIdle } from '../chunk-W5XCNEZC.js';
92
- export { Highlight, highlightRanges, highlightTerms } from '../chunk-H6VKCIWV.js';
93
- export { DOC_TABS_EDITOR_LABELS, DocTabsEditor } from '../chunk-SYBYFQTY.js';
92
+ import '../chunk-MICRGE3J.js';
94
93
  export { DownloadButton } from '../chunk-BEHFTRMZ.js';
95
94
  export { downloadBlob, downloadText, safeFilename, useDownload } from '../chunk-IW55G7XG.js';
96
95
  export { EditingStatus } from '../chunk-TC7DJTXI.js';
@@ -103,12 +102,13 @@ export { DescriptionList, DescriptionListItem } from '../chunk-MFS6F2P7.js';
103
102
  export { DIFF_LIST_LABELS, DiffList } from '../chunk-LFHCXZO5.js';
104
103
  export { DIFF_SUMMARY_LABELS, DIFF_VIEW_LABELS, DiffSummary, DiffView, MAX_DIFF_LINES, collapseDiff, diffLines, diffStat, firstChangedLines, splitLines } from '../chunk-BVWSLXTY.js';
105
104
  export { Divider } from '../chunk-6KWNXIDE.js';
105
+ export { DOC_TABS_EDITOR_LABELS, DocTabsEditor } from '../chunk-SYBYFQTY.js';
106
106
  export { CONFLICT_NOTE_LABELS, ConflictNote } from '../chunk-UO7JZVCO.js';
107
107
  export { Container } from '../chunk-HJO4WCH6.js';
108
108
  export { CursorFlag } from '../chunk-3BYIWOTV.js';
109
109
  export { PresenceRing, presenceHueClass } from '../chunk-I6POAB4V.js';
110
110
  export { ChooserList, ColumnChooser, DataGrid, columnChoicesOf, fitGridColumns, parseGridSort } from '../chunk-XIDD7PJO.js';
111
- export { DATA_VIEW_TOOLBAR_LABELS, DataView, DataViewToolbar, FILTER_AXIS_LABELS, FilterAxisBar, FilterAxisChip, applyColumnFilters, applyFilters, blankFilterValue, defaultOperator, filterDefsFromColumns, filterHasValue, filterPredicate, formatFilterValue, operatorOf, tableColumns } from '../chunk-QRKT4XTT.js';
111
+ export { DATA_VIEW_TOOLBAR_LABELS, DataView, DataViewToolbar, FILTER_AXIS_LABELS, FilterAxisBar, FilterAxisChip, applyColumnFilters, applyFilters, blankFilterValue, defaultOperator, filterDefsFromColumns, filterHasValue, filterPredicate, formatFilterValue, operatorOf, tableColumns } from '../chunk-6QNN3WIT.js';
112
112
  export { PageHeader } from '../chunk-HOXGBLEY.js';
113
113
  export { DEFAULT_DATE_TIME_PICKER_LABELS, DateTimePicker } from '../chunk-UB6MLXUL.js';
114
114
  export { ALL_ITEMS, CopyableCell, DATA_TABLE_LABELS, DataTable, RowActionsMenu } from '../chunk-FXBGEANQ.js';
@@ -125,7 +125,10 @@ export { HIGHLIGHT_REST_MS, TYPE_AHEAD_WINDOW, useHighlightRest, useListbox, use
125
125
  export { COMMENT_THREAD_LABELS, CommentThread } from '../chunk-MMPKN7WV.js';
126
126
  export { ConfirmField, confirmMatches } from '../chunk-PEUGPAKH.js';
127
127
  export { InlineCode } from '../chunk-5CLW2CXT.js';
128
- export { CanvasSchematic } from '../chunk-NBWNLYWZ.js';
128
+ export { BOARD_NAME_MIN_CHARS, CANVAS_BOARD_MAX_LIVE, CANVAS_BOARD_MIN_LIVE_WIDTH, CANVAS_BOARD_MIN_ZOOM, CANVAS_NOTE_COLORS, CanvasBoard, TITLE_GLYPH_EM, boardName, boardRoom, liveBoards, titleSize } from '../chunk-C7OKDYBH.js';
129
+ export { Note } from '../chunk-5SZGKSGL.js';
130
+ export { CanvasToolbar, toolForKey } from '../chunk-B5UHX5UC.js';
131
+ export { Toolbar, ToolbarOverflow, ToolbarWide } from '../chunk-NR4CPM4T.js';
129
132
  export { CatalogTile } from '../chunk-PCT47E7O.js';
130
133
  export { ChangeMark } from '../chunk-66X5WDKE.js';
131
134
  export { LONGTEXT_MAX_DEFAULT, RATING_MAX_CEILING, RATING_MAX_DEFAULT, SHEET_COLUMN_BOUNDS, SHEET_COLUMN_TYPES, SHEET_COLUMN_WIDTHS, SHEET_FIT_SAMPLES, SHEET_LABELS, SHEET_ROW_HEIGHT, SHEET_ROW_NUMBER_WIDTH, SheetPendingEdits, TEXT_MAX_DEFAULT, URL_MAX, cellDescription, cellKey, cellSpeech, changeText, changeTime, checkValue, columnOffsets, columnWidth, compareValues, displayText, drawnColumns, editText, editorSide, findOption, findPerson, fitSamples, fittedWidth, flagText, hasPrevious, inRange, isEmptyValue, isMod, isMultiCell, isSheetColumnType, isTypingKey, liveOptions, moveFrom, nextSort, normalizeValue, optionHue, parseOptionList, parseTSV, parseText, planClear, planPaste, presenceByCell, presenceByColumn, presenceByRow, rangeOf, ratingMax, refusalText, retypeColumn, rowName, sameValue, scrollToRow, sheetLabels, sortRows, spokenText, statusTone, textMax, toTSV, visibleRows } from '../chunk-LFSIKGRQ.js';
@@ -141,12 +144,9 @@ export { Breadcrumb } from '../chunk-VWNC2L6W.js';
141
144
  export { KeyChip } from '../chunk-FYTIJM2T.js';
142
145
  export { CalendarGrid, compareDays, daysInMonth, sameDay, shiftDay, shiftMonth, today } from '../chunk-GXQ3B46I.js';
143
146
  export { Callout } from '../chunk-SZZRIHGT.js';
144
- export { BOARD_NAME_MIN_CHARS, CANVAS_BOARD_MAX_LIVE, CANVAS_BOARD_MIN_LIVE_WIDTH, CANVAS_BOARD_MIN_ZOOM, CANVAS_NOTE_COLORS, CanvasBoard, TITLE_GLYPH_EM, boardName, boardRoom, liveBoards, titleSize } from '../chunk-C7OKDYBH.js';
145
- export { Note } from '../chunk-5SZGKSGL.js';
146
- export { CanvasToolbar, toolForKey } from '../chunk-B5UHX5UC.js';
147
- export { Toolbar, ToolbarOverflow, ToolbarWide } from '../chunk-NR4CPM4T.js';
148
147
  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, ShortcutTip, anchorView, beyondSlop, clampPan, clampZoom, fitView, gridOf, panBy, pinchView, regionView, revealView, screenRect, toScreen, toWorld, wheelPixels, wheelZoomFactor, zoomAt, zoomLimits } from '../chunk-DAERKOOG.js';
149
148
  import '../chunk-LM3ISVJA.js';
149
+ export { CanvasSchematic } from '../chunk-NBWNLYWZ.js';
150
150
  export { ArtifactMakeRow } from '../chunk-R2IBCEU6.js';
151
151
  export { ArtifactNameCell } from '../chunk-P5VGSVWG.js';
152
152
  export { AuthLayout } from '../chunk-S4DREXGM.js';
@@ -183,7 +183,6 @@ export { ARTIFACT_KINDS, ArtifactKindGlyph } from '../chunk-CE2THTQR.js';
183
183
  export { ACCESS_DENIED_REASONS, AccessDeniedCard } from '../chunk-KV3ODJXH.js';
184
184
  export { EmptyState } from '../chunk-RA2ULG6H.js';
185
185
  export { Accordion, AccordionItem } from '../chunk-ZNOXQACX.js';
186
- export { ADD_PILL_MS, AddPill } from '../chunk-TROLVEZY.js';
187
186
  export { AGENT_HANDOFF_LABELS, AgentHandoffPanel } from '../chunk-3TXY3PJZ.js';
188
187
  export { Timeline, TimelineItem } from '../chunk-AUQPBL4O.js';
189
188
  export { Section } from '../chunk-3TFDQLW3.js';
@@ -195,8 +194,9 @@ export { Kbd, isApplePlatform, keyGlyph } from '../chunk-SMBKXWML.js';
195
194
  export { DisclosureAnatomy } from '../chunk-FZVJDJFN.js';
196
195
  export { Count } from '../chunk-BHHIIK3M.js';
197
196
  export { HeadingLevelProvider, headingTag, nextHeadingLevel, useHeadingLevel } from '../chunk-PQADV6P6.js';
197
+ export { ADD_PILL_MS, AddPill } from '../chunk-TROLVEZY.js';
198
198
  export { Announcer, announce, useAnnouncer } from '../chunk-RSAQOKH3.js';
199
- export { AccountRow, AppShell, AppShellRail, AppShellRailRow, AppShellToggle, AppShellTopbar, useAppShell } from '../chunk-KKNHMXTE.js';
199
+ export { AccountRow, AppShell, AppShellRail, AppShellRailRow, AppShellRailStatus, AppShellToggle, AppShellTopbar, useAppShell } from '../chunk-SCPEMLLY.js';
200
200
  export { useMediaMatch } from '../chunk-RTPQDNW3.js';
201
201
  export { Menu } from '../chunk-D6FEHY5G.js';
202
202
  export { LAYER_GAP, LAYER_REPOSITION_EVENT, LayerHost, anchorGone, outsideBounds, placePopup, useLayerContainer, viewportBounds } from '../chunk-OMV5W53A.js';
package/dist/index.js CHANGED
@@ -1,11 +1,11 @@
1
1
  import './chunk-S3QTFUJX.js';
2
2
  export { VersionTimeline } from './chunk-NQCY44B3.js';
3
- export { matchesShortcut, useShortcut } from './chunk-AYHIF6DH.js';
4
3
  export { WidgetFrame } from './chunk-DFK5EQTU.js';
5
4
  export { ElementToPngError, elementToPng, parseCsv, serializeElement, toCsv } from './chunk-FEJANUZK.js';
6
5
  export { ToastProvider, Toaster, useToast } from './chunk-AC22RZKC.js';
7
6
  export { TreeCanvas } from './chunk-5BUOMF6N.js';
8
7
  export { VERSION_COMPARE_LABELS, VERSION_COMPARE_LENSES, VersionCompare } from './chunk-JSWOXRRE.js';
8
+ export { TagsInput } from './chunk-BH52LIY6.js';
9
9
  export { ThemeGallery } from './chunk-E4BOVKNJ.js';
10
10
  export { ThemeSwatch } from './chunk-MNFU2RNT.js';
11
11
  export { DensitySwitcher, ThemeSwitcher } from './chunk-KWWP3D7M.js';
@@ -13,21 +13,21 @@ export { ThemeToggle } from './chunk-NP2C4Y4E.js';
13
13
  export { applyStoredPreferences, resolveTheme, useDensityPreference, useSystemTheme, useThemePreference } from './chunk-Z24ZUSTX.js';
14
14
  export { TileGrid } from './chunk-NNTO3TNC.js';
15
15
  export { DEFAULT_TIME_WINDOW_LABELS, TIME_WINDOW_SPANS, TimeWindowPicker, describeTimeWindow, isTimeWindowSet, parseTimeWindowDuration, resolveTimeWindow, timeWindowMatchesPreset } from './chunk-YPMGP2X4.js';
16
+ export { Stepper } from './chunk-5QWIJSQM.js';
16
17
  export { Switcher } from './chunk-JKAGN4V4.js';
17
18
  export { Table } from './chunk-V2N3BMOT.js';
18
19
  export { TABLE_TAGS_CELL_LABELS, TableDateCell, TableEntityCell, TableKeyCell, TableNumberCell, TableStatusCell, TableTagsCell, TableTextCell } from './chunk-4BJK7FE5.js';
19
- export { TagsInput } from './chunk-BH52LIY6.js';
20
+ export { SlideFilmstrip } from './chunk-FBW3Q2OY.js';
20
21
  export { SlideGrid } from './chunk-3V5T5K5H.js';
21
22
  export { SOURCE_EDITOR_KEYS, SourceEditor, lineStart } from './chunk-D3EJSLCL.js';
22
- export { StatGroup } from './chunk-OUD75UB2.js';
23
23
  export { StatCard } from './chunk-YPTTSJPM.js';
24
- export { Stepper } from './chunk-5QWIJSQM.js';
24
+ export { StatGroup } from './chunk-OUD75UB2.js';
25
25
  export { ARTIFACT_ROLES, SHAREABLE_ROLES, ShareDialog, roleAtLeast } from './chunk-KNHUBHFX.js';
26
26
  export { SHEET_COLUMN_EDITOR_LABELS, SheetColumnEditor, SheetColumnTypeGlyph } from './chunk-GFYQKMQZ.js';
27
27
  export { CellDisplay, CellEditor, CheckboxCell, DateCell, LongTextCell, MultiSelectCell, NumberCell, PersonCell, RatingCell, SelectCell, SheetCell, SheetGrid, StatusCell, TextCell, UrlCell } from './chunk-3PR65I3H.js';
28
28
  export { TagGroup } from './chunk-O2EGEONV.js';
29
+ export { matchesShortcut, useShortcut } from './chunk-AYHIF6DH.js';
29
30
  export { SLIDE_COMPARE_LABELS, SlideCompare } from './chunk-7CGPPAYR.js';
30
- export { SlideFilmstrip } from './chunk-FBW3Q2OY.js';
31
31
  export { FRAME_HELLO_TIMEOUT_MS, FRAME_LOAD_GRACE_MS, SandboxedFrame, SandboxedFrameNotice, SandboxedFramePlaceholder } from './chunk-356JNSER.js';
32
32
  export { SearchTrigger } from './chunk-6DRDCT22.js';
33
33
  export { SectionFrame, SectionFrameBody, SectionFrameNav } from './chunk-INVSUFJK.js';
@@ -58,8 +58,8 @@ export { SIZE_EPSILON, TYPE_AHEAD_RESET_MS, createTreeModel, isTypeAheadKey, lay
58
58
  export { Outline, scrollToHeading, useActiveHeading } from './chunk-A5YKNRG6.js';
59
59
  export { PageNote } from './chunk-CV4NES3P.js';
60
60
  export { PEOPLE_RAIL_LABELS, PeopleRail, peopleRailKey } from './chunk-GPWJCP3U.js';
61
- import './chunk-CENOOTAV.js';
62
61
  export { PinTile } from './chunk-6MIXD6IW.js';
62
+ import './chunk-CENOOTAV.js';
63
63
  export { MERGE_CONFLICTS_LABELS, MergeConflicts } from './chunk-2PEXZ7L4.js';
64
64
  export { DEFAULT_METER_THRESHOLDS, METER_STATES, Meter, meterState, meterStateTone, meterTone, progressTone } from './chunk-UGNUUVRI.js';
65
65
  export { NewItemsNotice } from './chunk-PXU6HOZB.js';
@@ -76,21 +76,20 @@ export { AutoGrid, Inline, Spacer, Stack } from './chunk-ZAC7SKUN.js';
76
76
  export { Link } from './chunk-FBSEJO2C.js';
77
77
  export { LinkInterstitial, openExternal } from './chunk-N3TFYBN3.js';
78
78
  export { List, ListItem } from './chunk-NZWX27J7.js';
79
- import './chunk-MICRGE3J.js';
79
+ export { Highlight, highlightRanges, highlightTerms } from './chunk-H6VKCIWV.js';
80
80
  import './chunk-FFMCMSJB.js';
81
81
  export { IconTile } from './chunk-IXJHTFXG.js';
82
82
  export { ImageUpload } from './chunk-FWYHRU7M.js';
83
83
  export { InboxGroup, InboxList, InboxMore, InboxRow, InboxToggle } from './chunk-XYCADWZN.js';
84
84
  export { FactList } from './chunk-RLJXVFEH.js';
85
- export { FileDrop, FilePickButton, droppedFiles, pickedFiles } from './chunk-THDGBD6Y.js';
86
85
  export { FILTER_CHIP_ATTRIBUTE, FilterChip, FilterChipGroup } from './chunk-UYZZV4DZ.js';
86
+ export { FileDrop, FilePickButton, droppedFiles, pickedFiles } from './chunk-THDGBD6Y.js';
87
87
  export { FindingList } from './chunk-NTB5LRRD.js';
88
88
  export { FollowBanner } from './chunk-OED6LUWE.js';
89
89
  export { DEFAULT_FRAME_THEME, EXTERNAL_URL_MAX, FRAME_BRIDGE, FRAME_MESSAGE, FRAME_ORIGIN_MODES, FRAME_SANDBOX_TOKENS, applyFrameTheme, checkFrameSandbox, externalUrl, frameFragment, frameOriginMatches, frameThemeMessage, httpOrigin, isFocusExit, isFrameNonce, negotiateBridge, parseFrameFragment, portTargetOrigin, readFrameHello, readFramePortMessage, readFrameTheme, readOpenLink } from './chunk-F6V2PTN6.js';
90
90
  export { DENSITY_PREFERENCES, PALETTE_ID, THEME_PREFERENCES, applyDensity, applyPalette, applyTheme, isDensityPreference, isPaletteId, isThemePreference } from './chunk-ZXXDZJQN.js';
91
91
  export { IDLE_AFTER_MS, useFullscreen, useIdle } from './chunk-W5XCNEZC.js';
92
- export { Highlight, highlightRanges, highlightTerms } from './chunk-H6VKCIWV.js';
93
- export { DOC_TABS_EDITOR_LABELS, DocTabsEditor } from './chunk-SYBYFQTY.js';
92
+ import './chunk-MICRGE3J.js';
94
93
  export { DownloadButton } from './chunk-BEHFTRMZ.js';
95
94
  export { downloadBlob, downloadText, safeFilename, useDownload } from './chunk-IW55G7XG.js';
96
95
  export { EditingStatus } from './chunk-TC7DJTXI.js';
@@ -103,12 +102,13 @@ export { DescriptionList, DescriptionListItem } from './chunk-MFS6F2P7.js';
103
102
  export { DIFF_LIST_LABELS, DiffList } from './chunk-LFHCXZO5.js';
104
103
  export { DIFF_SUMMARY_LABELS, DIFF_VIEW_LABELS, DiffSummary, DiffView, MAX_DIFF_LINES, collapseDiff, diffLines, diffStat, firstChangedLines, splitLines } from './chunk-BVWSLXTY.js';
105
104
  export { Divider } from './chunk-6KWNXIDE.js';
105
+ export { DOC_TABS_EDITOR_LABELS, DocTabsEditor } from './chunk-SYBYFQTY.js';
106
106
  export { CONFLICT_NOTE_LABELS, ConflictNote } from './chunk-UO7JZVCO.js';
107
107
  export { Container } from './chunk-HJO4WCH6.js';
108
108
  export { CursorFlag } from './chunk-3BYIWOTV.js';
109
109
  export { PresenceRing, presenceHueClass } from './chunk-I6POAB4V.js';
110
110
  export { ChooserList, ColumnChooser, DataGrid, columnChoicesOf, fitGridColumns, parseGridSort } from './chunk-XIDD7PJO.js';
111
- export { DATA_VIEW_TOOLBAR_LABELS, DataView, DataViewToolbar, FILTER_AXIS_LABELS, FilterAxisBar, FilterAxisChip, applyColumnFilters, applyFilters, blankFilterValue, defaultOperator, filterDefsFromColumns, filterHasValue, filterPredicate, formatFilterValue, operatorOf, tableColumns } from './chunk-QRKT4XTT.js';
111
+ export { DATA_VIEW_TOOLBAR_LABELS, DataView, DataViewToolbar, FILTER_AXIS_LABELS, FilterAxisBar, FilterAxisChip, applyColumnFilters, applyFilters, blankFilterValue, defaultOperator, filterDefsFromColumns, filterHasValue, filterPredicate, formatFilterValue, operatorOf, tableColumns } from './chunk-6QNN3WIT.js';
112
112
  export { PageHeader } from './chunk-HOXGBLEY.js';
113
113
  export { DEFAULT_DATE_TIME_PICKER_LABELS, DateTimePicker } from './chunk-UB6MLXUL.js';
114
114
  export { ALL_ITEMS, CopyableCell, DATA_TABLE_LABELS, DataTable, RowActionsMenu } from './chunk-FXBGEANQ.js';
@@ -125,7 +125,10 @@ export { HIGHLIGHT_REST_MS, TYPE_AHEAD_WINDOW, useHighlightRest, useListbox, use
125
125
  export { COMMENT_THREAD_LABELS, CommentThread } from './chunk-MMPKN7WV.js';
126
126
  export { ConfirmField, confirmMatches } from './chunk-PEUGPAKH.js';
127
127
  export { InlineCode } from './chunk-5CLW2CXT.js';
128
- export { CanvasSchematic } from './chunk-NBWNLYWZ.js';
128
+ export { BOARD_NAME_MIN_CHARS, CANVAS_BOARD_MAX_LIVE, CANVAS_BOARD_MIN_LIVE_WIDTH, CANVAS_BOARD_MIN_ZOOM, CANVAS_NOTE_COLORS, CanvasBoard, TITLE_GLYPH_EM, boardName, boardRoom, liveBoards, titleSize } from './chunk-C7OKDYBH.js';
129
+ export { Note } from './chunk-5SZGKSGL.js';
130
+ export { CanvasToolbar, toolForKey } from './chunk-B5UHX5UC.js';
131
+ export { Toolbar, ToolbarOverflow, ToolbarWide } from './chunk-NR4CPM4T.js';
129
132
  export { CatalogTile } from './chunk-PCT47E7O.js';
130
133
  export { ChangeMark } from './chunk-66X5WDKE.js';
131
134
  export { LONGTEXT_MAX_DEFAULT, RATING_MAX_CEILING, RATING_MAX_DEFAULT, SHEET_COLUMN_BOUNDS, SHEET_COLUMN_TYPES, SHEET_COLUMN_WIDTHS, SHEET_FIT_SAMPLES, SHEET_LABELS, SHEET_ROW_HEIGHT, SHEET_ROW_NUMBER_WIDTH, SheetPendingEdits, TEXT_MAX_DEFAULT, URL_MAX, cellDescription, cellKey, cellSpeech, changeText, changeTime, checkValue, columnOffsets, columnWidth, compareValues, displayText, drawnColumns, editText, editorSide, findOption, findPerson, fitSamples, fittedWidth, flagText, hasPrevious, inRange, isEmptyValue, isMod, isMultiCell, isSheetColumnType, isTypingKey, liveOptions, moveFrom, nextSort, normalizeValue, optionHue, parseOptionList, parseTSV, parseText, planClear, planPaste, presenceByCell, presenceByColumn, presenceByRow, rangeOf, ratingMax, refusalText, retypeColumn, rowName, sameValue, scrollToRow, sheetLabels, sortRows, spokenText, statusTone, textMax, toTSV, visibleRows } from './chunk-LFSIKGRQ.js';
@@ -141,12 +144,9 @@ export { Breadcrumb } from './chunk-VWNC2L6W.js';
141
144
  export { KeyChip } from './chunk-FYTIJM2T.js';
142
145
  export { CalendarGrid, compareDays, daysInMonth, sameDay, shiftDay, shiftMonth, today } from './chunk-GXQ3B46I.js';
143
146
  export { Callout } from './chunk-SZZRIHGT.js';
144
- export { BOARD_NAME_MIN_CHARS, CANVAS_BOARD_MAX_LIVE, CANVAS_BOARD_MIN_LIVE_WIDTH, CANVAS_BOARD_MIN_ZOOM, CANVAS_NOTE_COLORS, CanvasBoard, TITLE_GLYPH_EM, boardName, boardRoom, liveBoards, titleSize } from './chunk-C7OKDYBH.js';
145
- export { Note } from './chunk-5SZGKSGL.js';
146
- export { CanvasToolbar, toolForKey } from './chunk-B5UHX5UC.js';
147
- export { Toolbar, ToolbarOverflow, ToolbarWide } from './chunk-NR4CPM4T.js';
148
147
  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, ShortcutTip, anchorView, beyondSlop, clampPan, clampZoom, fitView, gridOf, panBy, pinchView, regionView, revealView, screenRect, toScreen, toWorld, wheelPixels, wheelZoomFactor, zoomAt, zoomLimits } from './chunk-DAERKOOG.js';
149
148
  import './chunk-LM3ISVJA.js';
149
+ export { CanvasSchematic } from './chunk-NBWNLYWZ.js';
150
150
  export { ArtifactMakeRow } from './chunk-R2IBCEU6.js';
151
151
  export { ArtifactNameCell } from './chunk-P5VGSVWG.js';
152
152
  export { AuthLayout } from './chunk-S4DREXGM.js';
@@ -183,7 +183,6 @@ export { ARTIFACT_KINDS, ArtifactKindGlyph } from './chunk-CE2THTQR.js';
183
183
  export { ACCESS_DENIED_REASONS, AccessDeniedCard } from './chunk-KV3ODJXH.js';
184
184
  export { EmptyState } from './chunk-RA2ULG6H.js';
185
185
  export { Accordion, AccordionItem } from './chunk-ZNOXQACX.js';
186
- export { ADD_PILL_MS, AddPill } from './chunk-TROLVEZY.js';
187
186
  export { AGENT_HANDOFF_LABELS, AgentHandoffPanel } from './chunk-3TXY3PJZ.js';
188
187
  export { Timeline, TimelineItem } from './chunk-AUQPBL4O.js';
189
188
  export { Section } from './chunk-3TFDQLW3.js';
@@ -195,8 +194,9 @@ export { Kbd, isApplePlatform, keyGlyph } from './chunk-SMBKXWML.js';
195
194
  export { DisclosureAnatomy } from './chunk-FZVJDJFN.js';
196
195
  export { Count } from './chunk-BHHIIK3M.js';
197
196
  export { HeadingLevelProvider, headingTag, nextHeadingLevel, useHeadingLevel } from './chunk-PQADV6P6.js';
197
+ export { ADD_PILL_MS, AddPill } from './chunk-TROLVEZY.js';
198
198
  export { Announcer, announce, useAnnouncer } from './chunk-RSAQOKH3.js';
199
- export { AccountRow, AppShell, AppShellRail, AppShellRailRow, AppShellToggle, AppShellTopbar, useAppShell } from './chunk-KKNHMXTE.js';
199
+ export { AccountRow, AppShell, AppShellRail, AppShellRailRow, AppShellRailStatus, AppShellToggle, AppShellTopbar, useAppShell } from './chunk-SCPEMLLY.js';
200
200
  export { useMediaMatch } from './chunk-RTPQDNW3.js';
201
201
  export { Menu } from './chunk-D6FEHY5G.js';
202
202
  export { LAYER_GAP, LAYER_REPOSITION_EVENT, LayerHost, anchorGone, outsideBounds, placePopup, useLayerContainer, viewportBounds } from './chunk-OMV5W53A.js';
package/dist/styles.css CHANGED
@@ -702,7 +702,7 @@
702
702
  }
703
703
 
704
704
 
705
- /* AppShell-NPSWZ3XW.css */
705
+ /* AppShell-V3TAAYL3.css */
706
706
  /*
707
707
  * The application frame: a rail on the FRAME, and the screen on a SHEET that
708
708
  * floats beside it.
@@ -860,6 +860,68 @@
860
860
  min-width: 0;
861
861
  }
862
862
 
863
+ /*
864
+ * THE HEAD'S STATUS, at the end of the name's line (`AppShell.RailStatus`):
865
+ * the application's state as a dot and a count, its words in its name and
866
+ * title. It ends on the nav's gutter, where every row's background ends, and
867
+ * it reserves the width of a dot and a two-figure count, so the name beside
868
+ * it truncates at one place whether the engine is healthy or has alarms.
869
+ */
870
+ .crewlet-app-shell__rail-status {
871
+ display: flex;
872
+ flex: none;
873
+ align-items: center;
874
+ justify-content: flex-end;
875
+ min-width: calc(var(--size-target-min) * 2 + var(--spacing-1));
876
+ margin-inline-end: var(--size-nav-gutter);
877
+ }
878
+
879
+ /* A lockup beside a status gives up its end inset: the head's gap parts the
880
+ two, and the inset is what kept a lockup alone on its line off the edge. */
881
+ .crewlet-app-shell__rail-head:has(> .crewlet-app-shell__rail-status) > .crewlet-brand {
882
+ padding-inline-end: 0;
883
+ }
884
+
885
+ /* The dot and the count on one compact target: the 24px floor each way. */
886
+ .crewlet-app-shell__rail-status-mark {
887
+ display: inline-flex;
888
+ align-items: center;
889
+ justify-content: center;
890
+ gap: calc(var(--spacing-1) + var(--spacing-1) / 2);
891
+ min-width: var(--size-target-min);
892
+ min-height: var(--size-target-min);
893
+ margin: 0;
894
+ padding: 0 var(--spacing-1);
895
+ border: 0;
896
+ border-radius: var(--radius-md);
897
+ background: transparent;
898
+ color: var(--color-text-secondary);
899
+ font: inherit;
900
+ }
901
+
902
+ .crewlet-app-shell__rail-status-icon,
903
+ .crewlet-app-shell__rail-status-trailing {
904
+ display: inline-flex;
905
+ align-items: center;
906
+ }
907
+
908
+ .crewlet-app-shell__rail-status-mark--action {
909
+ cursor: pointer;
910
+ transition: background var(--motion-duration-fast) var(--motion-easing-default);
911
+ }
912
+
913
+ /* Open is pointed at, as the foot's row draws it: the lift stays while the panel is open. */
914
+ .crewlet-app-shell__rail-status-mark--action:hover,
915
+ .crewlet-app-shell__rail-status-mark--action[aria-expanded='true'] {
916
+ background: var(--color-surface-hover);
917
+ }
918
+
919
+ /* Inside its own box, so the ring is never cut by the head or the drawer's edge. */
920
+ .crewlet-app-shell__rail-status-mark--action:focus-visible {
921
+ outline: 2px solid var(--color-focus);
922
+ outline-offset: var(--size-focus-ring-inset-offset);
923
+ }
924
+
863
925
  /*
864
926
  * THE RAIL'S FIELD ON THE NAV'S COLUMNS. It stands on the nav's gutter, so
865
927
  * its right edge is where every row's background ends; and its glyph stands
@@ -876,14 +938,22 @@
876
938
  }
877
939
 
878
940
  /* The same gutter the nav takes, so what the foot says lines up with the rows
879
- above it rather than sitting further out. */
941
+ above it rather than sitting further out.
942
+
943
+ THE FOOT IS THE COMPACT STEP. It holds what a reader reaches for rarely (a
944
+ settings link, the engine's state, who they are), so its rows stand on the
945
+ small control step (`--crewlet-rail-foot-row`, 26px, never under the 24px
946
+ target) on a half-step gap and a one-step inset, where the nav above keeps
947
+ its 30px rows. Only heights change: every row keeps its order, columns,
948
+ glyphs and words. */
880
949
  .crewlet-app-shell__rail-foot {
881
- --crewlet-rail-foot-gap: var(--spacing-1);
950
+ --crewlet-rail-foot-gap: calc(var(--spacing-1) / 2);
951
+ --crewlet-rail-foot-row: var(--size-control-sm);
882
952
  flex: none;
883
953
  display: flex;
884
954
  flex-direction: column;
885
955
  gap: var(--crewlet-rail-foot-gap);
886
- padding: var(--spacing-2) var(--size-nav-gutter);
956
+ padding: var(--spacing-1) var(--size-nav-gutter);
887
957
  border-top: 1px solid var(--color-border-default);
888
958
  }
889
959
 
@@ -984,6 +1054,14 @@
984
1054
  min-width: 14px;
985
1055
  }
986
1056
 
1057
+ /* The foot's own step (see `.crewlet-app-shell__rail-foot`), for its rows and
1058
+ for a navigation dropped into it, whose rows keep the rail's columns. */
1059
+ .crewlet-app-shell__rail-foot > .crewlet-app-shell__rail-row--action:not(.crewlet-app-shell__rail-row--block),
1060
+ .crewlet-app-shell__rail-foot > .crewlet-btn,
1061
+ .crewlet-app-shell__rail-foot .crewlet-nav-item__row {
1062
+ min-height: var(--crewlet-rail-foot-row);
1063
+ }
1064
+
987
1065
  /*
988
1066
  * OPEN IS POINTED AT. The row a panel is open from keeps the hover's lift for
989
1067
  * as long as the panel is open, drawn from `aria-expanded` so the picture and
@@ -1389,7 +1467,8 @@
1389
1467
  .crewlet-app-shell__rail,
1390
1468
  .crewlet-app-shell__rail[data-open='true'],
1391
1469
  .crewlet-app-shell__rail-row--action,
1392
- .crewlet-app-shell__rail-foot > .crewlet-btn {
1470
+ .crewlet-app-shell__rail-foot > .crewlet-btn,
1471
+ .crewlet-app-shell__rail-status-mark--action {
1393
1472
  transition: none;
1394
1473
  }
1395
1474
  }
@@ -1436,9 +1515,16 @@
1436
1515
  * whatever size of badge a caller hands the row, it is centred where a glyph
1437
1516
  * is, and the row takes the nav row's pad and its glyph-to-word gap.
1438
1517
  */
1518
+ .crewlet-app-shell__rail-foot .crewlet-account-row {
1519
+ --crewlet-account-row-pad: var(--spacing-0);
1520
+ }
1521
+
1439
1522
  .crewlet-app-shell__rail-foot .crewlet-account-row__who {
1440
1523
  --crewlet-hit-area-block-start: calc(var(--crewlet-rail-foot-gap) / 2 + var(--crewlet-account-row-pad));
1441
1524
  gap: calc(var(--spacing-2) + var(--spacing-1) / 2);
1525
+ /* On the foot's compact step: the two lines of name and detail with half a
1526
+ step above and below them, which still clears the avatar. */
1527
+ padding-block: calc(var(--spacing-1) / 2);
1442
1528
  padding-inline-start: var(--size-nav-row-pad);
1443
1529
  }
1444
1530
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@crewlethq/ui",
3
- "version": "0.40.0",
3
+ "version": "0.41.0",
4
4
  "description": "Crewlet shared React components built on @crewlethq/tokens and @crewlethq/icons.",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -42,8 +42,8 @@
42
42
  "clean": "rm -rf dist src/generated"
43
43
  },
44
44
  "dependencies": {
45
- "@crewlethq/icons": "0.40.0",
46
- "@crewlethq/tokens": "0.40.0",
45
+ "@crewlethq/icons": "0.41.0",
46
+ "@crewlethq/tokens": "0.41.0",
47
47
  "prosemirror-commands": "1.7.2",
48
48
  "prosemirror-gapcursor": "1.4.1",
49
49
  "prosemirror-history": "1.5.1",
@@ -2,8 +2,8 @@ import { PageHeader } from './chunk-HOXGBLEY.js';
2
2
  import { DateTimePicker } from './chunk-UB6MLXUL.js';
3
3
  import { DataTable } from './chunk-FXBGEANQ.js';
4
4
  import { useListbox, useOptionKeys } from './chunk-7KHM2FZH.js';
5
- import { Popover } from './chunk-KHJIEPZV.js';
6
5
  import { Toolbar } from './chunk-NR4CPM4T.js';
6
+ import { Popover } from './chunk-KHJIEPZV.js';
7
7
  import { RelativeTime } from './chunk-3CZ7XAVY.js';
8
8
  import { Input } from './chunk-TYONQSOK.js';
9
9
  import { Kbd } from './chunk-SMBKXWML.js';