@fasl-work/caos-app-shell 0.13.1 → 0.14.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 +9 -1
- package/bin/caos-shell-gate.mjs +3 -1
- package/dist/index.d.ts +177 -2
- package/dist/index.js +529 -110
- package/gate/areas.mjs +67 -0
- package/gate/inpage.mjs +151 -5
- package/gate/run.mjs +260 -4
- package/package.json +1 -1
- package/reserved-classes.json +42 -0
- package/styles.css +65 -5
package/README.md
CHANGED
|
@@ -87,6 +87,14 @@ const config: ShellConfig = {
|
|
|
87
87
|
`fitLabel`, `niceTicks`) and declares `data-chart` ([docs/05](docs/05_drawings.md)).
|
|
88
88
|
- **Views in the URL:** `CaseWorkbench` and `SurfacePage` hold the open view in `?view=` (and the case selector the
|
|
89
89
|
case in `?case=`), so a view can be shared and survives a reload.
|
|
90
|
+
- **Focus mode for the App (0.14.0):** `<CaseWorkbench focus />` adds a Focus button to the rail head that opens the
|
|
91
|
+
selected case's open group in the full viewport (`FocusShell`: the stage is the view, the rail stays), keeps `?focus=1`
|
|
92
|
+
beside `?case=` and `?view=`, and returns with Escape or the exit button to the same case, group and sub-view; a product with
|
|
93
|
+
a simulation must offer it (ADR-0070, `caos-shell-gate --require-focus`). See [docs/04](docs/04_views.md).
|
|
94
|
+
- **Small cards and animation (0.14.0):** `FlipCard` and `CardDeck` for SMALL cards the reader scans by title (a flip card
|
|
95
|
+
shows its title and turns to its content; a deck is a row up to four cards and a carousel above), used by the executive
|
|
96
|
+
view for its bearers, roles, approaches and 4 C's; an executive illustration may be an animated SVG with a
|
|
97
|
+
`prefers-reduced-motion` block ([docs/04](docs/04_views.md), [docs/06](docs/06_executive-view.md)).
|
|
90
98
|
- **Icons:** lucide icons are sized by where they sit (`svg.lucide`); pass no `size` ([docs/06](docs/06_icons-and-numbers.md)).
|
|
91
99
|
- **Numbers:** `formatNumber(value, lang, opts)` or `useFormat()`; never `toFixed` in a view. A magnitude below 1e-4
|
|
92
100
|
is written in scientific notation (a p-value of 1e-200 is `1E-200`, not two hundred zeros); give `digits`, not
|
|
@@ -130,7 +138,7 @@ const config: ShellConfig = {
|
|
|
130
138
|
`ChipGroup`, `Stage`, `useStageSize`, `makeStateKey`, `isStale`, `useWorkbenchState`,
|
|
131
139
|
`WorkbenchStateContext`, `pick`; since 0.8.0 `SurfacePage`, `useUrlView`, `viewParamOf`, `replaceQueryParam`,
|
|
132
140
|
`BREAKPOINTS`, `BarChart`, `textWidth`, `widestLabel`, `fitLabel`, `niceTicks`, `niceStep`, `fontFamily`,
|
|
133
|
-
`formatTicks`, `NBSP`, `SCIENTIFIC_BELOW`, the type `ShellColorToken`; since 0.9.0 `ViewsRow`. Separate entries:
|
|
141
|
+
`formatTicks`, `NBSP`, `SCIENTIFIC_BELOW`, the type `ShellColorToken`; since 0.9.0 `ViewsRow`. Since 0.14.0 `FlipCard`, `CardDeck` (with `FLIP_LIMITS`, `FLIP_TEXT`, `DECK_TEXT`, `perPageFor`, `deckWindow`, `deckPosition`), the `focus` prop of `CaseWorkbench` (`CaseFocusConfig`, `FOCUS_TEXT`, `FOCUS_PARAM`) and `removeQueryParam`. Separate entries:
|
|
134
142
|
`/chart` (`UPlotChart` with `x.log`, `parity`, `onPick`; `drawMarks`, `tickSteps`, `repeatedLabels`, `seriesStyle`,
|
|
135
143
|
`sortOrder`, `parityRange`), `/keys` (the storage keys, no React), `/styles.css`, `/chart.css`,
|
|
136
144
|
`/reserved-classes.json`. Bin: `caos-shell-gate`.
|
package/bin/caos-shell-gate.mjs
CHANGED
|
@@ -15,12 +15,13 @@
|
|
|
15
15
|
// --single-case the workbench has one case and no case control
|
|
16
16
|
// --idle-ms 3000 --settle-ms 15000 --text-floor 400 --instrument-min 0.5 --stage-fill-min 0.3 --stage-floor 140
|
|
17
17
|
// --wide-font-sizes 390x844,1280x800 the sizes of the wide-font pass (G10); --no-wide-font skips it
|
|
18
|
+
// --require-focus fail an App without a Focus control (G18; ADR-0070 requires one in a product with simulations)
|
|
18
19
|
// --out gate-output report (gate-report.json), screenshots (shots/) and the capture index (index.html)
|
|
19
20
|
// Needs `playwright` in the consuming project (optional peer dependency). Exit 1 on any failure, 2 on misuse.
|
|
20
21
|
|
|
21
22
|
import { runGate } from '../gate/run.mjs';
|
|
22
23
|
|
|
23
|
-
const FLAGS = new Set(['single-case', 'no-wide-font']);
|
|
24
|
+
const FLAGS = new Set(['single-case', 'no-wide-font', 'require-focus']);
|
|
24
25
|
const args = {};
|
|
25
26
|
const argv = process.argv.slice(2);
|
|
26
27
|
for (let i = 0; i < argv.length; i += 1) {
|
|
@@ -44,6 +45,7 @@ const options = {
|
|
|
44
45
|
langs: args.langs,
|
|
45
46
|
caseSample: args['case-sample'],
|
|
46
47
|
singleCase: args['single-case'] === true,
|
|
48
|
+
requireFocus: args['require-focus'] === true,
|
|
47
49
|
idleMs: num('idle-ms'),
|
|
48
50
|
settleMs: num('settle-ms'),
|
|
49
51
|
textFloor: num('text-floor'),
|
package/dist/index.d.ts
CHANGED
|
@@ -63,9 +63,14 @@ interface FocusShellProps {
|
|
|
63
63
|
onExit: () => void;
|
|
64
64
|
exitLabel: string;
|
|
65
65
|
stageLabel: string;
|
|
66
|
+
/**
|
|
67
|
+
* True (default): the frame is the page's `main`. False: the frame sits inside a page that already has its `main` (the App's
|
|
68
|
+
* Focus mode does), so it renders a `div` and the page holds one `main`.
|
|
69
|
+
*/
|
|
70
|
+
landmark?: boolean;
|
|
66
71
|
}
|
|
67
72
|
/** Full-viewport, scenario-scoped analysis frame. The product supplies only its instrument and controls. */
|
|
68
|
-
declare function FocusShell({ stage, rail, title, description, hud, onExit, exitLabel, stageLabel }: FocusShellProps): react.JSX.Element;
|
|
73
|
+
declare function FocusShell({ stage, rail, title, description, hud, onExit, exitLabel, stageLabel, landmark }: FocusShellProps): react.JSX.Element;
|
|
69
74
|
|
|
70
75
|
/** Light/dark icon toggle. Shows the icon of the theme you would switch TO. */
|
|
71
76
|
declare function ThemeToggle(): react.JSX.Element;
|
|
@@ -665,6 +670,129 @@ interface QuestionProps {
|
|
|
665
670
|
*/
|
|
666
671
|
declare function Question({ question, answer }: QuestionProps): react.JSX.Element;
|
|
667
672
|
|
|
673
|
+
/**
|
|
674
|
+
* The limits of a SMALL card (rule of use, CAOS_MANAGE plans/app-shell/0-14-0-plan.md decision 3): a title of about eight
|
|
675
|
+
* words and a back of about forty. They are counted in the interface language: Spanish runs about a quarter longer than
|
|
676
|
+
* English for the same text, so its limits are a quarter higher. `gate/areas.mjs` FLIP_LIMITS holds the same values and
|
|
677
|
+
* `test/flipCard.test.tsx` keeps the two equal.
|
|
678
|
+
*/
|
|
679
|
+
declare const FLIP_LIMITS: {
|
|
680
|
+
readonly title: {
|
|
681
|
+
readonly en: 8;
|
|
682
|
+
readonly es: 10;
|
|
683
|
+
};
|
|
684
|
+
readonly back: {
|
|
685
|
+
readonly en: 40;
|
|
686
|
+
readonly es: 50;
|
|
687
|
+
};
|
|
688
|
+
};
|
|
689
|
+
/** The words the card itself writes (the product writes none of them). */
|
|
690
|
+
declare const FLIP_TEXT: {
|
|
691
|
+
readonly show: {
|
|
692
|
+
readonly en: "Show details";
|
|
693
|
+
readonly es: "Mostrar detalles";
|
|
694
|
+
};
|
|
695
|
+
readonly hide: {
|
|
696
|
+
readonly en: "Hide details";
|
|
697
|
+
readonly es: "Ocultar detalles";
|
|
698
|
+
};
|
|
699
|
+
};
|
|
700
|
+
interface FlipCardProps {
|
|
701
|
+
/** The face: a short title (a node, so a card may carry a source mark). */
|
|
702
|
+
title: ReactNode;
|
|
703
|
+
/** The title as plain text, repeated on the back beside the return control; omit it and the back shows none. */
|
|
704
|
+
label?: string;
|
|
705
|
+
/** The back: the content shown after the card turns. It stays in the markup while the face shows. */
|
|
706
|
+
children: ReactNode;
|
|
707
|
+
/** Base of the ids (default: generated). */
|
|
708
|
+
id?: string;
|
|
709
|
+
/** Start turned (default: face up). */
|
|
710
|
+
defaultOpen?: boolean;
|
|
711
|
+
/** Controlled turn, when the product holds it itself. */
|
|
712
|
+
open?: boolean;
|
|
713
|
+
onOpenChange?: (open: boolean) => void;
|
|
714
|
+
className?: string;
|
|
715
|
+
/** Forces the language of the card's own words (tests; the card otherwise follows the language toggle). */
|
|
716
|
+
lang?: Lang;
|
|
717
|
+
}
|
|
718
|
+
/**
|
|
719
|
+
* A small card whose face shows its title and whose back shows its content after a click or a key press (Enter or Space),
|
|
720
|
+
* and back again (shell 0.14.0). Use it only for a small card the reader scans by title first and opens when it matters
|
|
721
|
+
* (a title of about eight words, a back of about forty; the gate fails a card over the limit): a long card or an ordered
|
|
722
|
+
* sequence stays plain.
|
|
723
|
+
*
|
|
724
|
+
* - A real `button` carries `aria-expanded` and `aria-controls`; each face has one, so focus moves to the face that shows
|
|
725
|
+
* and never rests on a hidden one. Escape closes an open card.
|
|
726
|
+
* - The hidden face is out of the accessibility tree and the tab order (`aria-hidden` and `inert` at once, `visibility: hidden`
|
|
727
|
+
* after the turn) while its content stays in the markup (search, copy and the gate read it).
|
|
728
|
+
* - `prefers-reduced-motion: reduce` swaps the faces without the turn; colours are theme tokens only.
|
|
729
|
+
* - The face states that it turns: a small icon and a visually hidden label in both languages.
|
|
730
|
+
*/
|
|
731
|
+
declare function FlipCard({ title, label, children, id, defaultOpen, open: controlled, onOpenChange, className, lang: forced }: FlipCardProps): react.JSX.Element;
|
|
732
|
+
|
|
733
|
+
/** The words the deck itself writes (the product writes none of them). */
|
|
734
|
+
declare const DECK_TEXT: {
|
|
735
|
+
readonly previous: {
|
|
736
|
+
readonly en: "Previous";
|
|
737
|
+
readonly es: "Anterior";
|
|
738
|
+
};
|
|
739
|
+
readonly next: {
|
|
740
|
+
readonly en: "Next";
|
|
741
|
+
readonly es: "Siguiente";
|
|
742
|
+
};
|
|
743
|
+
readonly of: {
|
|
744
|
+
readonly en: "of";
|
|
745
|
+
readonly es: "de";
|
|
746
|
+
};
|
|
747
|
+
readonly to: {
|
|
748
|
+
readonly en: "to";
|
|
749
|
+
readonly es: "a";
|
|
750
|
+
};
|
|
751
|
+
};
|
|
752
|
+
/** How many cards of at least `minCard` px fit a row of `width` px with `gap` px between them: at least one. */
|
|
753
|
+
declare function perPageFor(width: number, minCard: number, gap: number): number;
|
|
754
|
+
/** The window `[start, end)` of `n` cards that `per` at a time show from `start`: never empty, never past the end, pulled back so it is full. */
|
|
755
|
+
declare function deckWindow(n: number, per: number, start: number): {
|
|
756
|
+
start: number;
|
|
757
|
+
end: number;
|
|
758
|
+
};
|
|
759
|
+
/** "2 of 5" for one card, "1 to 3 of 5" for several (1-based). */
|
|
760
|
+
declare function deckPosition(start: number, shown: number, n: number, lang: Lang): string;
|
|
761
|
+
interface DeckCard {
|
|
762
|
+
/** Stable key (default: the index). */
|
|
763
|
+
id?: string | number;
|
|
764
|
+
/** The title of the card (a flip card's face). */
|
|
765
|
+
title: ReactNode;
|
|
766
|
+
/** The title as plain text, for the back of a flip card. */
|
|
767
|
+
label?: string;
|
|
768
|
+
/** The content: a plain card's body, a flip card's back. */
|
|
769
|
+
body: ReactNode;
|
|
770
|
+
/** Attributes written on the card's list item (for example `data-exec-item`). */
|
|
771
|
+
attrs?: Record<string, string | number | undefined>;
|
|
772
|
+
}
|
|
773
|
+
interface CardDeckProps {
|
|
774
|
+
cards: DeckCard[];
|
|
775
|
+
/** Render each card as a `FlipCard` (a small card the reader scans by title; see FlipCard for the rule of use). */
|
|
776
|
+
flip?: boolean;
|
|
777
|
+
/** A list longer than this is a carousel; up to it, a row (default 4). */
|
|
778
|
+
carouselAbove?: number;
|
|
779
|
+
/** The accessible name of the deck. */
|
|
780
|
+
ariaLabel: string;
|
|
781
|
+
/** Extra classes of the list that holds the cards. */
|
|
782
|
+
className?: string;
|
|
783
|
+
/** Forces the language of the deck's own words (tests). */
|
|
784
|
+
lang?: Lang;
|
|
785
|
+
}
|
|
786
|
+
/**
|
|
787
|
+
* A list of cards, plain or as flip cards, shown as a row up to `carouselAbove` cards (default 4) and as a CAROUSEL above
|
|
788
|
+
* it (shell 0.14.0): one row of as many cards as fit (at least one), previous and next buttons, a swipe on touch, the arrow
|
|
789
|
+
* keys, Home and End while it has focus, and a position ("2 of 5"). No autoplay. Every card is reachable by keyboard: the
|
|
790
|
+
* cards the window hides are removed from sight and from the tab order but stay in the markup. The carousel pages through
|
|
791
|
+
* its cards instead of scrolling a strip, so neither the page nor its panel ever scrolls sideways (ADR-0071). Reduced
|
|
792
|
+
* motion removes the slide. When every card fits, the controls are not drawn.
|
|
793
|
+
*/
|
|
794
|
+
declare function CardDeck({ cards, flip, carouselAbove, ariaLabel, className, lang: forced }: CardDeckProps): react.JSX.Element;
|
|
795
|
+
|
|
668
796
|
interface SurfacePageProps {
|
|
669
797
|
/** The route's heading; omit it when the header's active route already names the surface. */
|
|
670
798
|
title?: BiText;
|
|
@@ -697,6 +825,8 @@ declare function SurfacePage({ title, lede, actions, tabs, value, onChange, deep
|
|
|
697
825
|
/** Writes one query parameter with replaceState, keeping the router's history state (React Router keeps its entry
|
|
698
826
|
* key and index there; replacing it with null broke the index the back button relies on). */
|
|
699
827
|
declare function replaceQueryParam(param: string, value: string): void;
|
|
828
|
+
/** Removes one query parameter with replaceState (the counterpart of `replaceQueryParam`). */
|
|
829
|
+
declare function removeQueryParam(param: string): void;
|
|
700
830
|
/**
|
|
701
831
|
* The open view of a tab row, held in the URL (`?view=` by default) so a reader can share it and a reload keeps it.
|
|
702
832
|
* Returns the id to show and the selector to call. Controlled when `value` is given: the product holds the state and
|
|
@@ -966,6 +1096,44 @@ interface VariantBarProps {
|
|
|
966
1096
|
* one-line note of what it shows. Selecting a regime must change every view of the case. */
|
|
967
1097
|
declare function VariantBar({ variants, activeId, onSelect, title, lane }: VariantBarProps): react.JSX.Element;
|
|
968
1098
|
|
|
1099
|
+
/** The words Focus mode writes (the product writes none of them). */
|
|
1100
|
+
declare const FOCUS_TEXT: {
|
|
1101
|
+
readonly enter: {
|
|
1102
|
+
readonly en: "Focus";
|
|
1103
|
+
readonly es: "Enfocar";
|
|
1104
|
+
};
|
|
1105
|
+
readonly enterLabel: {
|
|
1106
|
+
readonly en: "Open this case in focus mode";
|
|
1107
|
+
readonly es: "Abrir este caso en modo enfoque";
|
|
1108
|
+
};
|
|
1109
|
+
readonly exit: {
|
|
1110
|
+
readonly en: "Back to the App";
|
|
1111
|
+
readonly es: "Volver a la App";
|
|
1112
|
+
};
|
|
1113
|
+
readonly stage: {
|
|
1114
|
+
readonly en: "Focus stage";
|
|
1115
|
+
readonly es: "Escenario de enfoque";
|
|
1116
|
+
};
|
|
1117
|
+
};
|
|
1118
|
+
/** The query parameter that holds Focus mode (`?focus=1`), beside `?case=` and `?view=`. */
|
|
1119
|
+
declare const FOCUS_PARAM = "focus";
|
|
1120
|
+
/** What a product may say about the Focus mode of its App (`CaseWorkbench.focus`; `true` means all defaults). */
|
|
1121
|
+
interface CaseFocusConfig {
|
|
1122
|
+
/** The stage's heading (default: the name of the selected case). */
|
|
1123
|
+
title?: BiText;
|
|
1124
|
+
/** One line under it (default: the name of the open group). */
|
|
1125
|
+
description?: BiText;
|
|
1126
|
+
/** Readouts laid over the stage (ADR-0070): at most four on a phone. */
|
|
1127
|
+
hud?: Array<{
|
|
1128
|
+
label: BiText;
|
|
1129
|
+
value: string;
|
|
1130
|
+
}>;
|
|
1131
|
+
/** Called when Focus opens (`true`) and closes (`false`), for a product that records it. */
|
|
1132
|
+
onChange?: (on: boolean) => void;
|
|
1133
|
+
/** The query parameter (default `focus`). */
|
|
1134
|
+
param?: string;
|
|
1135
|
+
}
|
|
1136
|
+
|
|
969
1137
|
/** One group of views of the selected case, named for the question the user is asking (ADR-0071 rule 5). */
|
|
970
1138
|
interface WorkbenchGroup {
|
|
971
1139
|
id: string;
|
|
@@ -1016,6 +1184,13 @@ interface CaseWorkbenchProps {
|
|
|
1016
1184
|
* keeps it out of the URL. Ignored when `group` is controlled. */
|
|
1017
1185
|
deepLinkView?: boolean | string;
|
|
1018
1186
|
ariaLabel?: BiText;
|
|
1187
|
+
/**
|
|
1188
|
+
* Focus mode for the App (ADR-0070, shell 0.14.0): a Focus button in the rail head opens the selected case's open group in
|
|
1189
|
+
* the full viewport through `FocusShell` (the stage is the view, the rail stays), holds `?focus=1` beside `?case=` and
|
|
1190
|
+
* `?view=` in the URL, and returns with Escape or the exit button to the same case, group and sub-view. `true` takes all
|
|
1191
|
+
* the defaults. Omit it and the App is exactly what it was.
|
|
1192
|
+
*/
|
|
1193
|
+
focus?: boolean | CaseFocusConfig;
|
|
1019
1194
|
}
|
|
1020
1195
|
declare const MAX_WORKBENCH_GROUPS = 6;
|
|
1021
1196
|
/**
|
|
@@ -1104,4 +1279,4 @@ interface ViewsRowProps {
|
|
|
1104
1279
|
*/
|
|
1105
1280
|
declare function ViewsRow({ children, shares }: ViewsRowProps): react.JSX.Element;
|
|
1106
1281
|
|
|
1107
|
-
export { BREAKPOINTS, BarChart, type BarChartProps, type BarDatum, BiText, Callout, type CaseDef, type CaseGroup, type CaseKind, CaseSelector, type CaseSelectorProps, type CaseSelectorText, CaseWorkbench, type CaseWorkbenchProps, ChipGroup, type ChipGroupProps, type ChipOption, type Citation, CitationsProvider, Cite, DOC_AREAS, DocPage, type DocPageProps, DocReferences, DocRefsScope, DocSection, type DocSectionProps, EXECUTIVE_SCHEMA_VERSION, Equation, type ExecutiveData, type ExecutiveProblem, ExecutiveView, type ExecutiveViewProps, FOUR_CS, Figure, type FittedLabel, 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, 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, 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, firstAppearance, fitLabel, fontFamily, groupByCategory, isStale, makeStateKey, niceStep, niceTicks, readCaseParam, readTheme, replaceQueryParam, sourcesPresent, textWidth, usePausedViz, useStageSize, useThemeStore, useUrlView, useWorkbenchState, validateExecutive, viewParamOf, widestLabel, withCaseParam };
|
|
1282
|
+
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, type FittedLabel, FlipCard, type FlipCardProps, 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, 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, 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, fitLabel, fontFamily, groupByCategory, isStale, makeStateKey, niceStep, niceTicks, perPageFor, readCaseParam, readTheme, removeQueryParam, replaceQueryParam, sourcesPresent, textWidth, usePausedViz, useStageSize, useThemeStore, useUrlView, useWorkbenchState, validateExecutive, viewParamOf, widestLabel, withCaseParam };
|