@fasl-work/caos-app-shell 0.19.12 → 0.20.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/CHANGELOG.md CHANGED
@@ -1,3 +1,20 @@
1
+ ## [0.20.000] - 2026-11-05
2
+
3
+ ### Added
4
+
5
+ - Add ADR-0082 showcase primitives: direct-link `StoryFrame`, sourced and unit-bearing scene callouts, reciprocal linked scene/panel selection and shared cursor hooks, eased story transitions with an instant reduced-motion path, 3D camera/bounds/rate/explosion/LOD/environment helpers, semantic state and story-accent tokens.
6
+ - Add the renderer-agnostic `Scene3DFrame` for full-size product-owned scenes with separate controls, legend and availability; prevent callout cards from covering their authored subject anchors and make G21 fail on planted occlusion.
7
+ - Raise the measured App drawing floor to 60% and Focus floor to 80%; extend G21 to check direct routes, 3–6 steps, numeric headlines of at most 12 words, stage/panel geometry, callout value/unit/state/provenance/anchor, reciprocal selection and cursor scrubbing, keyboard navigation, pause-on-interaction, reduced motion, mobile stacking, LCP, FPS, interaction latency and compressed 3D asset size.
8
+
9
+ ### Fixed
10
+
11
+ - Tighten the contained workbench's vertical chrome so the App stage can meet the 60% visualization floor without removing product navigation or controls.
12
+
13
+ ### Evidence boundary
14
+
15
+ - G21 checks that the story exposes traceable values, units, semantic states and provenance, and that its linked controls update reciprocally. The product gate still has to establish that each value and source describes its actual scientific artifact; the shell cannot infer product-domain truth.
16
+ - The product SDD and visual review remain responsible for verifying that the six views answer their declared domain questions and that uncertainty and before/after comparisons use valid shared scales and data.
17
+
1
18
  ## [0.19.012] - 2026-11-01
2
19
 
3
20
  ### Fixed
package/VERSION CHANGED
@@ -1 +1 @@
1
- 0.19.012
1
+ 0.20.000
@@ -16,16 +16,18 @@
16
16
  // --sizes 390x844,...,2560x1440 --themes light,dark --langs en,es
17
17
  // --case-sample id1,id2 cases walked outside the primary mode; default the first and the last
18
18
  // --single-case the workbench has one case and no case control
19
- // --idle-ms 3000 --settle-ms 15000 --text-floor 400 --instrument-min 0.5 --stage-fill-min 0.3 --stage-floor 140
19
+ // --idle-ms 3000 --settle-ms 15000 --text-floor 400 --instrument-min 0.6 --stage-fill-min 0.3 --stage-floor 140
20
20
  // --wide-font-sizes 390x844,1280x800 the sizes of the wide-font pass (G10); --no-wide-font skips it
21
21
  // --require-focus fail an App without a Focus control (G18; ADR-0070 requires one in a product with simulations); on a surface
22
22
  // App, one with no view that offers it
23
+ // --require-showcase fail when no /story/<step> routes exist or the story misses ADR-0082's direct-link,
24
+ // stage, panel, finding, callout, keyboard and pause checks (also pass story routes in --routes)
23
25
  // --out gate-output report (gate-report.json), screenshots (shots/) and the capture index (index.html)
24
26
  // Needs `playwright` in the consuming project (optional peer dependency). Exit 1 on any failure, 2 on misuse.
25
27
 
26
28
  import { runGate } from '../gate/run.mjs';
27
29
 
28
- const FLAGS = new Set(['single-case', 'no-wide-font', 'require-focus', 'spa-fallback']);
30
+ const FLAGS = new Set(['single-case', 'no-wide-font', 'require-focus', 'require-showcase', 'spa-fallback']);
29
31
  const args = {};
30
32
  const argv = process.argv.slice(2);
31
33
  for (let i = 0; i < argv.length; i += 1) {
@@ -51,6 +53,7 @@ const options = {
51
53
  caseSample: args['case-sample'],
52
54
  singleCase: args['single-case'] === true,
53
55
  requireFocus: args['require-focus'] === true,
56
+ requireShowcase: args['require-showcase'] === true,
54
57
  spaFallback: args['spa-fallback'] === true,
55
58
  idleMs: num('idle-ms'),
56
59
  settleMs: num('settle-ms'),
package/dist/chart.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import * as react from 'react';
2
2
  import uPlot from 'uplot';
3
- import { F as FormatOptions, S as ShellColorToken } from './tokens-BvU9bFPw.js';
4
- export { r as referenceLineName, a as repeatedLabels } from './tokens-BvU9bFPw.js';
3
+ import { F as FormatOptions, S as ShellColorToken } from './tokens-CIdhVv-t.js';
4
+ export { r as referenceLineName, a as repeatedLabels } from './tokens-CIdhVv-t.js';
5
5
  import { B as BiText, L as Lang } from './text-BlY47nIt.js';
6
6
  import 'zustand';
7
7
 
package/dist/chart.js CHANGED
@@ -1,5 +1,5 @@
1
- import { pick, placeXLabel, placeYLabel, useShellLang, useThemeStore, useStageSize, defaultChartName, axisTitleFits, resolveToken, dateNames, DRAG_THRESHOLD, sameData, NBSP, formatNumber, thinRows, chartSummary, referenceLineName, ZOOM_HINT, CHART_ROLE, ChartSummary, ChartDataTable, ResetZoomButton, formatTicks, countOverlaps, isZoomed, formatTime, keyAction, KEY_PAN, KEY_ZOOM, firstVisible, stepIndex, wheelFactor, pinchState, repeatedLabels, panRange, zoomRange, revealValue, brushRange, leastLabelSpan, MIN_SPAN_SHARE } from './chunk-FXPSZD6X.js';
2
- export { referenceLineName, repeatedLabels } from './chunk-FXPSZD6X.js';
1
+ import { pick, placeXLabel, placeYLabel, useShellLang, useThemeStore, useStageSize, defaultChartName, axisTitleFits, resolveToken, dateNames, DRAG_THRESHOLD, sameData, NBSP, formatNumber, thinRows, chartSummary, referenceLineName, ZOOM_HINT, CHART_ROLE, ChartSummary, ChartDataTable, ResetZoomButton, formatTicks, countOverlaps, isZoomed, formatTime, keyAction, KEY_PAN, KEY_ZOOM, firstVisible, stepIndex, wheelFactor, pinchState, repeatedLabels, panRange, zoomRange, revealValue, brushRange, leastLabelSpan, MIN_SPAN_SHARE } from './chunk-FPPJQC2J.js';
2
+ export { referenceLineName, repeatedLabels } from './chunk-FPPJQC2J.js';
3
3
  import './chunk-33WTUQ7Q.js';
4
4
  import { useRef, useCallback, useState, useId, useEffect, useMemo } from 'react';
5
5
  import uPlot from 'uplot';
@@ -90,6 +90,11 @@ var SHELL_TOKENS = [
90
90
  "--color-good",
91
91
  "--color-warn",
92
92
  "--color-bad",
93
+ "--color-step-1",
94
+ "--color-step-2",
95
+ "--color-step-3",
96
+ "--color-step-4",
97
+ "--color-step-5",
93
98
  "--color-shadow",
94
99
  "--font-sans",
95
100
  "--font-mono",
package/dist/index.d.ts CHANGED
@@ -1,11 +1,12 @@
1
1
  export { A as APP_ROUTE, a as AppShell, b as ArchTab, c as ArchitectureConfig, d as ArchitectureModal, L as LANDING_ROUTE, e as LANG_STORAGE_KEY, S as STANDARD_ROUTES, f as ShellConfig, g as ShellRoute, T as THEME_BOOT_SCRIPT, h as THEME_STORAGE_KEY, v as validateArchitectureConfig } from './keys-DDQGijwQ.js';
2
2
  import * as react from 'react';
3
- import { ReactNode, Component, ErrorInfo } from 'react';
3
+ import { ReactNode, Component, ErrorInfo, ChangeEvent } from 'react';
4
4
  import * as zustand from 'zustand';
5
- import { F as FormatOptions } from './tokens-BvU9bFPw.js';
6
- export { b as FittedLabel, N as NBSP, c as NOT_AVAILABLE, d as SCIENTIFIC_BELOW, e as SHELL_TOKENS, S as ShellColorToken, f as ShellToken, g as fitLabel, h as fontFamily, i as formatNumber, j as formatTicks, n as niceStep, k as niceTicks, l as resolveToken, t as textWidth, u as useFormat, m as useThemeTokens, w as widestLabel } from './tokens-BvU9bFPw.js';
5
+ import { F as FormatOptions } from './tokens-CIdhVv-t.js';
6
+ export { b as FittedLabel, N as NBSP, c as NOT_AVAILABLE, d as SCIENTIFIC_BELOW, e as SHELL_TOKENS, S as ShellColorToken, f as ShellToken, g as fitLabel, h as fontFamily, i as formatNumber, j as formatTicks, n as niceStep, k as niceTicks, l as resolveToken, t as textWidth, u as useFormat, m as useThemeTokens, w as widestLabel } from './tokens-CIdhVv-t.js';
7
7
  import { L as Lang, B as BiText } from './text-BlY47nIt.js';
8
8
  export { p as pick, u as useLangStore, a as useShellLang } from './text-BlY47nIt.js';
9
+ import { StoreApi } from 'zustand/vanilla';
9
10
 
10
11
  /**
11
12
  * The landing route of a product (shell 0.13.0, Felipe 2026-10-13: "the shell and the apps must land at the Introduction,
@@ -1175,7 +1176,7 @@ interface WorkbenchLayoutProps {
1175
1176
  * Renders `.page-body.wide.caos-wb`: no reading-width cap (a workbench is not prose, ADR-0071 rule 2),
1176
1177
  * `min-width: 0` down the tree so no row pushes the page wider than the screen (rule 3), a rail with an
1177
1178
  * explicit width that never scrolls (rule 6), and an instrument marked `data-instrument` so the measured gate
1178
- * can check that it covers at least half of the viewport (rule 8). Pair with `ShellConfig.contain`.
1179
+ * can check that it covers at least 60% of the viewport, and Focus at least 80% (ADR-0082). Pair with `ShellConfig.contain`.
1179
1180
  */
1180
1181
  declare function WorkbenchLayout({ rail, railHead, children, railLabel, className }: WorkbenchLayoutProps): react.JSX.Element;
1181
1182
 
@@ -1268,7 +1269,7 @@ declare const MAX_WORKBENCH_GROUPS = 6;
1268
1269
  * parameters and live values; the instrument holds ONE row of at most six question groups in a fixed order (the
1269
1270
  * instrument groups, the variant comparison, the context write-up) and the open group's views, which take the
1270
1271
  * height that row leaves. Pickers, parameters and numbers sit in the rail so the drawing keeps the instrument
1271
- * (rule 8: at least half the viewport is drawn).
1272
+ * (rule 8: at least 60% of the viewport is drawn on the App route).
1272
1273
  *
1273
1274
  * It provides the selection's state key to every `PlotCard` and `Readout` in the rail and the instrument, so a view
1274
1275
  * still showing data for an earlier selection says so, and it writes `data-case`, `data-variant`, `data-source` and
@@ -1382,4 +1383,199 @@ interface ViewsRowProps {
1382
1383
  */
1383
1384
  declare function ViewsRow({ children, shares }: ViewsRowProps): react.JSX.Element;
1384
1385
 
1385
- export { BREAKPOINTS, BarChart, type BarChartProps, type BarDatum, BiText, Callout, CardDeck, type CardDeckProps, type CaseDef, type CaseFocusConfig, type CaseGroup, type CaseKind, CaseSelector, type CaseSelectorProps, type CaseSelectorText, CaseWorkbench, type CaseWorkbenchProps, ChipGroup, type ChipGroupProps, type ChipOption, type Citation, CitationsProvider, Cite, DECK_TEXT, DOC_AREAS, type DeckCard, DocPage, type DocPageProps, DocReferences, DocRefsScope, DocSection, type DocSectionProps, EXECUTIVE_SCHEMA_VERSION, Equation, type ExecutiveData, type ExecutiveProblem, ExecutiveView, type ExecutiveViewProps, FLIP_LIMITS, FLIP_TEXT, FOCUS_PARAM, FOCUS_TEXT, FOUR_CS, Figure, FlipCard, type FlipCardProps, type FocusMode, type FocusModeConfig, type FocusModeOptions, FocusShell, type FocusShellProps, FormatOptions, Gauge, type GaugeProps, type GaugeZone, Glossary, type GlossaryEntry, InlineMath, Knob, type KnobProps, Landing, type Lane, LaneBadge, Lang, LanguageToggle, MAX_PEER_TABS, MAX_WORKBENCH_GROUPS, PanelBoundary, type PausedVizController, PlotCard, type PlotCardProps, type Provenance, Question, type QuestionProps, type RailSection, Readout, type ReadoutItem, type ReadoutProps, ReferenceList, Refs, Stage, type StageSize, Stat, type StatProps, type SubTabDef, SubTabs, type SubTabsProps, type SurfaceFocusConfig, SurfacePage, type SurfacePageProps, type TabDef, type TabGroupDef, TabGroups, type TabGroupsProps, Tabs, type TabsProps, type Theme, ThemeToggle, type Tone, type UsePausedVizOptions, VariantBar, type VariantBarProps, type VariantDef, Verdict, type VerdictProps, type ViewFocusConfig, ViewsRow, type ViewsRowProps, type VizFrame, type VizLoop, type VizLoopDeps, type VizLoopOptions, type WorkbenchGroup, WorkbenchLayout, type WorkbenchLayoutProps, type WorkbenchRoute, WorkbenchShell, type WorkbenchShellProps, type WorkbenchState, WorkbenchStateContext, applyTheme, caseKind, caseTooltip, casesInSource, createVizLoop, deckPosition, deckWindow, firstAppearance, groupByCategory, isStale, makeStateKey, perPageFor, readCaseParam, readTheme, removeQueryParam, replaceQueryParam, sourcesPresent, useFocusMode, usePausedViz, useStageSize, useThemeStore, useUrlView, useWorkbenchState, validateExecutive, viewParamOf, withCaseParam };
1386
+ type StoryAccent = 1 | 2 | 3 | 4 | 5;
1387
+ interface StoryStep {
1388
+ id: string;
1389
+ number: number;
1390
+ verb: BiText;
1391
+ headline: BiText;
1392
+ summary: BiText;
1393
+ href: string;
1394
+ accent: StoryAccent;
1395
+ stage: ReactNode;
1396
+ panel: ReactNode;
1397
+ }
1398
+ interface StoryFrameProps {
1399
+ steps: StoryStep[];
1400
+ activeId: string;
1401
+ onStepChange: (id: string) => void;
1402
+ onExit?: () => void;
1403
+ labels?: Partial<{
1404
+ steps: BiText;
1405
+ previous: BiText;
1406
+ next: BiText;
1407
+ play: BiText;
1408
+ pause: BiText;
1409
+ exit: BiText;
1410
+ }>;
1411
+ autoAdvanceMs?: number;
1412
+ className?: string;
1413
+ }
1414
+ /**
1415
+ * A guided 3 to 6 step story over the same state as a product App. The product owns each step's real view and panel;
1416
+ * the shell owns the stepper, deep links, keyboard behavior, pause-on-interaction, and semantic structure (ADR-0082).
1417
+ */
1418
+ declare function StoryFrame({ steps, activeId, onStepChange, onExit, labels, autoAdvanceMs, className }: StoryFrameProps): react.JSX.Element | null;
1419
+
1420
+ type CalloutState = 'alarm' | 'warning' | 'normal' | 'selected' | 'inactive';
1421
+ interface SceneCalloutDef {
1422
+ id: string;
1423
+ eyebrow: BiText;
1424
+ value: string;
1425
+ /** Every displayed quantity carries its physical unit (or a domain ratio name). */
1426
+ unit: BiText;
1427
+ state: CalloutState;
1428
+ anchor: {
1429
+ x: number;
1430
+ y: number;
1431
+ };
1432
+ /** Provenance or derivation for the displayed value, in the reader's language. */
1433
+ source: BiText;
1434
+ trend?: 'up' | 'down' | 'flat';
1435
+ }
1436
+ interface CalloutBox {
1437
+ id: string;
1438
+ left: number;
1439
+ top: number;
1440
+ width: number;
1441
+ height: number;
1442
+ anchorX: number;
1443
+ anchorY: number;
1444
+ }
1445
+ /** Deterministic callout placement, exported so a product can test its scene geometry before rendering. */
1446
+ declare function layoutSceneCallouts(items: SceneCalloutDef[], width: number, height: number, compact?: boolean): CalloutBox[];
1447
+ /** Overlay anchored value labels on a stage; normalized anchors are reprojected by the product as the camera moves. */
1448
+ declare function SceneCallouts({ items, className, placement }: {
1449
+ items: SceneCalloutDef[];
1450
+ className?: string;
1451
+ placement?: 'anchored' | 'header';
1452
+ }): react.JSX.Element;
1453
+
1454
+ interface Scene3DFrameProps {
1455
+ /** A concise accessible name for the authored 3D scene. */
1456
+ label: string;
1457
+ legendLabel?: string;
1458
+ /** The product-owned WebGL/canvas/SVG renderer and controls. The shared shell never invents geometry. */
1459
+ children: ReactNode;
1460
+ controls?: ReactNode;
1461
+ legend?: ReactNode;
1462
+ status?: ReactNode;
1463
+ className?: string;
1464
+ }
1465
+ /** Renderer-agnostic 3D composition frame: one full-size scene with separate controls, legend and availability. */
1466
+ declare function Scene3DFrame({ label, legendLabel, children, controls, legend, status, className }: Scene3DFrameProps): react.JSX.Element;
1467
+
1468
+ type SelectionOrigin = 'scene' | 'panel' | 'series' | 'external';
1469
+ type LinkedViewSide = 'scene' | 'panel';
1470
+ interface LinkedViewState {
1471
+ selectedId: string | null;
1472
+ cursor: number | null;
1473
+ seriesId: string | null;
1474
+ origin: SelectionOrigin;
1475
+ select: (id: string | null, origin: SelectionOrigin) => void;
1476
+ scrub: (cursor: number | null) => void;
1477
+ showSeries: (id: string | null) => void;
1478
+ }
1479
+ type LinkedViewStore = StoreApi<LinkedViewState>;
1480
+ declare function createLinkedViewStore(initial?: Partial<Pick<LinkedViewState, 'selectedId' | 'cursor' | 'seriesId'>>): LinkedViewStore;
1481
+ declare function LinkedViewProvider({ children, initial }: {
1482
+ children: ReactNode;
1483
+ initial?: Partial<Pick<LinkedViewState, 'selectedId' | 'cursor' | 'seriesId'>>;
1484
+ }): react.JSX.Element;
1485
+ /** Scene selection, panel selection and time scrubbing share one store rather than shadowing one another. */
1486
+ declare function useLinkedView<T>(selector: (state: LinkedViewState) => T): T;
1487
+ /** Attributes and action for one selectable object in either linked view; spread onto a native button or SVG group. */
1488
+ declare function useLinkedItem(id: string, side: LinkedViewSide): {
1489
+ readonly 'data-linked-id': string;
1490
+ readonly 'data-linked-view': LinkedViewSide;
1491
+ readonly 'data-linked-selected': "true" | "false";
1492
+ readonly 'aria-pressed': boolean;
1493
+ readonly onClick: () => void;
1494
+ };
1495
+ /** Shared scrub value and marker metadata for a chart/profile input and its matching scene marker. */
1496
+ declare function useLinkedCursor(): {
1497
+ readonly cursor: number | null;
1498
+ readonly scrub: (cursor: number | null) => void;
1499
+ readonly inputProps: {
1500
+ readonly 'data-linked-cursor': "";
1501
+ readonly value: number;
1502
+ readonly onChange: (event: ChangeEvent<HTMLInputElement>) => void;
1503
+ };
1504
+ readonly markerProps: {
1505
+ readonly 'data-linked-cursor-marker': "";
1506
+ readonly 'data-linked-cursor-position': number | "";
1507
+ };
1508
+ };
1509
+
1510
+ interface MotionStage {
1511
+ run: () => void;
1512
+ durationMs?: number;
1513
+ }
1514
+ interface MotionOptions {
1515
+ reducedMotion?: boolean;
1516
+ signal?: AbortSignal;
1517
+ onStage?: (index: number) => void;
1518
+ }
1519
+ declare function prefersReducedMotion(): boolean;
1520
+ /** Apply a sequence in reading order; reduced motion applies each state immediately. */
1521
+ declare function runStagedTransition(stages: MotionStage[], options?: MotionOptions): Promise<void>;
1522
+ interface CameraPose {
1523
+ position: readonly [number, number, number];
1524
+ target: readonly [number, number, number];
1525
+ }
1526
+ interface CameraFrame {
1527
+ setPosition: (x: number, y: number, z: number) => void;
1528
+ lookAt: (x: number, y: number, z: number) => void;
1529
+ }
1530
+ interface CameraFlyOptions extends MotionOptions {
1531
+ durationMs?: number;
1532
+ onFrame?: (progress: number) => void;
1533
+ }
1534
+ /** Eased, interruptible camera flight without binding the shell to a particular WebGL renderer. */
1535
+ declare function flyCamera(frame: CameraFrame, from: CameraPose, to: CameraPose, options?: CameraFlyOptions): Promise<void>;
1536
+
1537
+ interface Vec3 {
1538
+ x: number;
1539
+ y: number;
1540
+ z: number;
1541
+ }
1542
+ interface SceneBounds {
1543
+ min: Vec3;
1544
+ max: Vec3;
1545
+ }
1546
+ type DetailTier = 'high' | 'medium' | 'low';
1547
+ interface ExplodedPart {
1548
+ id: string;
1549
+ center: Vec3;
1550
+ }
1551
+ interface SceneEnvironment {
1552
+ background: string;
1553
+ ground: string;
1554
+ key: {
1555
+ color: string;
1556
+ intensity: number;
1557
+ castShadow: boolean;
1558
+ };
1559
+ fill: {
1560
+ color: string;
1561
+ intensity: number;
1562
+ };
1563
+ ambient: {
1564
+ color: string;
1565
+ intensity: number;
1566
+ };
1567
+ }
1568
+ /** Frame a model from its authored bounds and camera aspect. The margin keeps end geometry out of the frustum. */
1569
+ declare function cameraForBounds(bounds: SceneBounds, aspect: number, fovDegrees?: number, margin?: number): {
1570
+ target: readonly [number, number, number];
1571
+ position: readonly [number, number, number];
1572
+ distance: number;
1573
+ };
1574
+ /** A bounded, monotone encoding for stream animation; zero flow is static and high rates never become frantic. */
1575
+ declare function flowSpeed(rate: number, referenceRate: number): number;
1576
+ /** Stable radial separation for authored cutaway parts, centred on the model bounds. */
1577
+ declare function explodedOffsets(parts: ExplodedPart[], scale?: number): Record<string, Vec3>;
1578
+ declare function detailTier(distance: number): DetailTier;
1579
+ declare function sceneEnvironment(theme: 'light' | 'dark'): SceneEnvironment;
1580
+
1581
+ export { BREAKPOINTS, BarChart, type BarChartProps, type BarDatum, BiText, Callout, type CalloutBox, type CalloutState, type CameraFlyOptions, type CameraFrame, type CameraPose, CardDeck, type CardDeckProps, type CaseDef, type CaseFocusConfig, type CaseGroup, type CaseKind, CaseSelector, type CaseSelectorProps, type CaseSelectorText, CaseWorkbench, type CaseWorkbenchProps, ChipGroup, type ChipGroupProps, type ChipOption, type Citation, CitationsProvider, Cite, DECK_TEXT, DOC_AREAS, type DeckCard, type DetailTier, DocPage, type DocPageProps, DocReferences, DocRefsScope, DocSection, type DocSectionProps, EXECUTIVE_SCHEMA_VERSION, Equation, type ExecutiveData, type ExecutiveProblem, ExecutiveView, type ExecutiveViewProps, type ExplodedPart, FLIP_LIMITS, FLIP_TEXT, FOCUS_PARAM, FOCUS_TEXT, FOUR_CS, Figure, FlipCard, type FlipCardProps, type FocusMode, type FocusModeConfig, type FocusModeOptions, FocusShell, type FocusShellProps, FormatOptions, Gauge, type GaugeProps, type GaugeZone, Glossary, type GlossaryEntry, InlineMath, Knob, type KnobProps, Landing, type Lane, LaneBadge, Lang, LanguageToggle, LinkedViewProvider, type LinkedViewSide, type LinkedViewState, type LinkedViewStore, MAX_PEER_TABS, MAX_WORKBENCH_GROUPS, type MotionOptions, type MotionStage, PanelBoundary, type PausedVizController, PlotCard, type PlotCardProps, type Provenance, Question, type QuestionProps, type RailSection, Readout, type ReadoutItem, type ReadoutProps, ReferenceList, Refs, Scene3DFrame, type Scene3DFrameProps, type SceneBounds, type SceneCalloutDef, SceneCallouts, type SceneEnvironment, type SelectionOrigin, Stage, type StageSize, Stat, type StatProps, type StoryAccent, StoryFrame, type StoryFrameProps, type StoryStep, type SubTabDef, SubTabs, type SubTabsProps, type SurfaceFocusConfig, SurfacePage, type SurfacePageProps, type TabDef, type TabGroupDef, TabGroups, type TabGroupsProps, Tabs, type TabsProps, type Theme, ThemeToggle, type Tone, type UsePausedVizOptions, VariantBar, type VariantBarProps, type VariantDef, type Vec3, Verdict, type VerdictProps, type ViewFocusConfig, ViewsRow, type ViewsRowProps, type VizFrame, type VizLoop, type VizLoopDeps, type VizLoopOptions, type WorkbenchGroup, WorkbenchLayout, type WorkbenchLayoutProps, type WorkbenchRoute, WorkbenchShell, type WorkbenchShellProps, type WorkbenchState, WorkbenchStateContext, applyTheme, cameraForBounds, caseKind, caseTooltip, casesInSource, createLinkedViewStore, createVizLoop, deckPosition, deckWindow, detailTier, explodedOffsets, firstAppearance, flowSpeed, flyCamera, groupByCategory, isStale, layoutSceneCallouts, makeStateKey, perPageFor, prefersReducedMotion, readCaseParam, readTheme, removeQueryParam, replaceQueryParam, runStagedTransition, sceneEnvironment, sourcesPresent, useFocusMode, useLinkedCursor, useLinkedItem, useLinkedView, usePausedViz, useStageSize, useThemeStore, useUrlView, useWorkbenchState, validateExecutive, viewParamOf, withCaseParam };