@fasl-work/caos-app-shell 0.11.2 → 0.13.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/bin/caos-shell-gate.mjs +72 -72
- package/dist/chart.js +2 -2
- package/dist/{chunk-DX36XRD5.js → chunk-3QYQCWSZ.js} +1 -1
- package/dist/{chunk-X6Y5CDUD.js → chunk-YVVDBSAC.js} +5 -3
- package/dist/index.d.ts +187 -3
- package/dist/index.js +1349 -43
- package/dist/{keys-CnvqkckF.d.ts → keys-CTQZafOf.d.ts} +7 -3
- package/dist/keys.d.ts +1 -1
- package/dist/keys.js +1 -1
- package/gate/areas.mjs +631 -327
- package/gate/inpage.mjs +1270 -1142
- package/gate/run.mjs +780 -755
- package/gate/serve.mjs +101 -97
- package/package.json +4 -2
- package/reserved-classes.json +86 -0
- package/src/content/executive.schema.json +659 -0
- package/styles.css +769 -717
package/bin/caos-shell-gate.mjs
CHANGED
|
@@ -1,72 +1,72 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
// caos-shell-gate: the measured web baseline of a CAOS product (ADR-0071, ADR-0017, ADR-0016, ADR-0078).
|
|
3
|
-
// The checks and the traps each one embeds are listed in gate/run.mjs; the self-test (npm run test:gate in the
|
|
4
|
-
// shell repository) plants one defect per check and requires each to fail.
|
|
5
|
-
//
|
|
6
|
-
// Usage:
|
|
7
|
-
// npx caos-shell-gate --serve dist --expect-brand "Contraste" a Pages-faithful server over the build
|
|
8
|
-
// npx caos-shell-gate --url https://contraste.fasl-work.com --expect-brand "Contraste" the deployed origin
|
|
9
|
-
// Options:
|
|
10
|
-
// --base-path /Repo/ the site's base path with --serve (a project page); default /
|
|
11
|
-
// --routes /,/methodology the routes; default: read from the header navigation
|
|
12
|
-
// --workbench /
|
|
13
|
-
// --sizes 390x844,...,2560x1440 --themes light,dark --langs en,es
|
|
14
|
-
// --case-sample id1,id2 cases walked outside the primary mode; default the first and the last
|
|
15
|
-
// --single-case the workbench has one case and no case control
|
|
16
|
-
// --idle-ms 3000 --settle-ms 15000 --text-floor 400 --instrument-min 0.5 --stage-fill-min 0.3 --stage-floor 140
|
|
17
|
-
// --wide-font-sizes 390x844,1280x800 the sizes of the wide-font pass (G10); --no-wide-font skips it
|
|
18
|
-
// --out gate-output report (gate-report.json), screenshots (shots/) and the capture index (index.html)
|
|
19
|
-
// Needs `playwright` in the consuming project (optional peer dependency). Exit 1 on any failure, 2 on misuse.
|
|
20
|
-
|
|
21
|
-
import { runGate } from '../gate/run.mjs';
|
|
22
|
-
|
|
23
|
-
const FLAGS = new Set(['single-case', 'no-wide-font']);
|
|
24
|
-
const args = {};
|
|
25
|
-
const argv = process.argv.slice(2);
|
|
26
|
-
for (let i = 0; i < argv.length; i += 1) {
|
|
27
|
-
const a = argv[i];
|
|
28
|
-
if (!a.startsWith('--')) continue;
|
|
29
|
-
const key = a.slice(2);
|
|
30
|
-
if (FLAGS.has(key)) args[key] = true;
|
|
31
|
-
else args[key] = argv[i + 1];
|
|
32
|
-
if (!FLAGS.has(key)) i += 1;
|
|
33
|
-
}
|
|
34
|
-
const num = (k) => (args[k] === undefined ? undefined : Number(args[k]));
|
|
35
|
-
const options = {
|
|
36
|
-
url: args.url,
|
|
37
|
-
serve: args.serve,
|
|
38
|
-
basePath: args['base-path'],
|
|
39
|
-
expectBrand: args['expect-brand'],
|
|
40
|
-
routes: args.routes,
|
|
41
|
-
workbench: args.workbench,
|
|
42
|
-
sizes: args.sizes,
|
|
43
|
-
themes: args.themes,
|
|
44
|
-
langs: args.langs,
|
|
45
|
-
caseSample: args['case-sample'],
|
|
46
|
-
singleCase: args['single-case'] === true,
|
|
47
|
-
idleMs: num('idle-ms'),
|
|
48
|
-
settleMs: num('settle-ms'),
|
|
49
|
-
textFloor: num('text-floor'),
|
|
50
|
-
instrumentMin: num('instrument-min'),
|
|
51
|
-
stageFillMin: num('stage-fill-min'),
|
|
52
|
-
stageFloor: num('stage-floor'),
|
|
53
|
-
wideFontSizes: args['wide-font-sizes'],
|
|
54
|
-
wideFont: args['no-wide-font'] === true ? false : undefined,
|
|
55
|
-
out: args.out,
|
|
56
|
-
};
|
|
57
|
-
for (const k of Object.keys(options)) if (options[k] === undefined) delete options[k];
|
|
58
|
-
|
|
59
|
-
let report;
|
|
60
|
-
try {
|
|
61
|
-
report = await runGate(options);
|
|
62
|
-
} catch (e) {
|
|
63
|
-
console.error(e.message);
|
|
64
|
-
process.exit(2);
|
|
65
|
-
}
|
|
66
|
-
const shown = report.failures.slice(0, 80);
|
|
67
|
-
for (const f of shown) console.log(`FAIL [${f.check}] ${f.route} ${f.mode}${f.trail ? ` (${f.trail})` : ''}: ${f.message}`);
|
|
68
|
-
if (report.failures.length > shown.length) console.log(`... and ${report.failures.length - shown.length} more in ${options.out ?? 'gate-output'}/gate-report.json`);
|
|
69
|
-
for (const w of report.waivers ?? []) console.log(`WAIVER ${w.route} (${w.lang}) ${w.floor}: ${w.reason}${w.valid ? '' : ' [refused]'}`);
|
|
70
|
-
const counts = Object.entries(report.checks).map(([k, n]) => `${k} ${n}`).join(', ');
|
|
71
|
-
console.log(report.ok ? `caos-shell-gate: OK, ${report.states} measured states` : `caos-shell-gate: ${report.failures.length} failure(s) in ${report.states} measured states (${counts})`);
|
|
72
|
-
process.exit(report.ok ? 0 : 1);
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// caos-shell-gate: the measured web baseline of a CAOS product (ADR-0071, ADR-0017, ADR-0016, ADR-0078).
|
|
3
|
+
// The checks and the traps each one embeds are listed in gate/run.mjs; the self-test (npm run test:gate in the
|
|
4
|
+
// shell repository) plants one defect per check and requires each to fail.
|
|
5
|
+
//
|
|
6
|
+
// Usage:
|
|
7
|
+
// npx caos-shell-gate --serve dist --expect-brand "Contraste" a Pages-faithful server over the build
|
|
8
|
+
// npx caos-shell-gate --url https://contraste.fasl-work.com --expect-brand "Contraste" the deployed origin
|
|
9
|
+
// Options:
|
|
10
|
+
// --base-path /Repo/ the site's base path with --serve (a project page); default /
|
|
11
|
+
// --routes /,/methodology the routes; default: read from the header navigation
|
|
12
|
+
// --workbench /app the routes that carry the case workbench; default /app
|
|
13
|
+
// --sizes 390x844,...,2560x1440 --themes light,dark --langs en,es
|
|
14
|
+
// --case-sample id1,id2 cases walked outside the primary mode; default the first and the last
|
|
15
|
+
// --single-case the workbench has one case and no case control
|
|
16
|
+
// --idle-ms 3000 --settle-ms 15000 --text-floor 400 --instrument-min 0.5 --stage-fill-min 0.3 --stage-floor 140
|
|
17
|
+
// --wide-font-sizes 390x844,1280x800 the sizes of the wide-font pass (G10); --no-wide-font skips it
|
|
18
|
+
// --out gate-output report (gate-report.json), screenshots (shots/) and the capture index (index.html)
|
|
19
|
+
// Needs `playwright` in the consuming project (optional peer dependency). Exit 1 on any failure, 2 on misuse.
|
|
20
|
+
|
|
21
|
+
import { runGate } from '../gate/run.mjs';
|
|
22
|
+
|
|
23
|
+
const FLAGS = new Set(['single-case', 'no-wide-font']);
|
|
24
|
+
const args = {};
|
|
25
|
+
const argv = process.argv.slice(2);
|
|
26
|
+
for (let i = 0; i < argv.length; i += 1) {
|
|
27
|
+
const a = argv[i];
|
|
28
|
+
if (!a.startsWith('--')) continue;
|
|
29
|
+
const key = a.slice(2);
|
|
30
|
+
if (FLAGS.has(key)) args[key] = true;
|
|
31
|
+
else args[key] = argv[i + 1];
|
|
32
|
+
if (!FLAGS.has(key)) i += 1;
|
|
33
|
+
}
|
|
34
|
+
const num = (k) => (args[k] === undefined ? undefined : Number(args[k]));
|
|
35
|
+
const options = {
|
|
36
|
+
url: args.url,
|
|
37
|
+
serve: args.serve,
|
|
38
|
+
basePath: args['base-path'],
|
|
39
|
+
expectBrand: args['expect-brand'],
|
|
40
|
+
routes: args.routes,
|
|
41
|
+
workbench: args.workbench,
|
|
42
|
+
sizes: args.sizes,
|
|
43
|
+
themes: args.themes,
|
|
44
|
+
langs: args.langs,
|
|
45
|
+
caseSample: args['case-sample'],
|
|
46
|
+
singleCase: args['single-case'] === true,
|
|
47
|
+
idleMs: num('idle-ms'),
|
|
48
|
+
settleMs: num('settle-ms'),
|
|
49
|
+
textFloor: num('text-floor'),
|
|
50
|
+
instrumentMin: num('instrument-min'),
|
|
51
|
+
stageFillMin: num('stage-fill-min'),
|
|
52
|
+
stageFloor: num('stage-floor'),
|
|
53
|
+
wideFontSizes: args['wide-font-sizes'],
|
|
54
|
+
wideFont: args['no-wide-font'] === true ? false : undefined,
|
|
55
|
+
out: args.out,
|
|
56
|
+
};
|
|
57
|
+
for (const k of Object.keys(options)) if (options[k] === undefined) delete options[k];
|
|
58
|
+
|
|
59
|
+
let report;
|
|
60
|
+
try {
|
|
61
|
+
report = await runGate(options);
|
|
62
|
+
} catch (e) {
|
|
63
|
+
console.error(e.message);
|
|
64
|
+
process.exit(2);
|
|
65
|
+
}
|
|
66
|
+
const shown = report.failures.slice(0, 80);
|
|
67
|
+
for (const f of shown) console.log(`FAIL [${f.check}] ${f.route} ${f.mode}${f.trail ? ` (${f.trail})` : ''}: ${f.message}`);
|
|
68
|
+
if (report.failures.length > shown.length) console.log(`... and ${report.failures.length - shown.length} more in ${options.out ?? 'gate-output'}/gate-report.json`);
|
|
69
|
+
for (const w of report.waivers ?? []) console.log(`WAIVER ${w.route} (${w.lang}) ${w.floor}: ${w.reason}${w.valid ? '' : ' [refused]'}`);
|
|
70
|
+
const counts = Object.entries(report.checks).map(([k, n]) => `${k} ${n}`).join(', ');
|
|
71
|
+
console.log(report.ok ? `caos-shell-gate: OK, ${report.states} measured states` : `caos-shell-gate: ${report.failures.length} failure(s) in ${report.states} measured states (${counts})`);
|
|
72
|
+
process.exit(report.ok ? 0 : 1);
|
package/dist/chart.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { useShellLang, useThemeStore, useStageSize, pick, resolveToken, NBSP, formatNumber, formatTicks } from './chunk-
|
|
2
|
-
import './chunk-
|
|
1
|
+
import { useShellLang, useThemeStore, useStageSize, pick, resolveToken, NBSP, formatNumber, formatTicks } from './chunk-3QYQCWSZ.js';
|
|
2
|
+
import './chunk-YVVDBSAC.js';
|
|
3
3
|
import { useRef, useCallback, useState, useMemo, useEffect } from 'react';
|
|
4
4
|
import uPlot from 'uplot';
|
|
5
5
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { LANG_STORAGE_KEY, THEME_STORAGE_KEY } from './chunk-
|
|
1
|
+
import { LANG_STORAGE_KEY, THEME_STORAGE_KEY } from './chunk-YVVDBSAC.js';
|
|
2
2
|
import { create } from 'zustand';
|
|
3
3
|
import { useMemo, useState, useRef, useCallback, useEffect } from 'react';
|
|
4
4
|
import { jsx } from 'react/jsx-runtime';
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
// src/shell/routes.ts
|
|
2
|
+
var LANDING_ROUTE = "/introduction";
|
|
3
|
+
var APP_ROUTE = "/app";
|
|
2
4
|
var STANDARD_ROUTES = [
|
|
3
|
-
{ path:
|
|
4
|
-
{ path:
|
|
5
|
+
{ path: LANDING_ROUTE, en: "Introduction", es: "Introducci\xF3n" },
|
|
6
|
+
{ path: APP_ROUTE, en: "App", es: "App" },
|
|
5
7
|
{ path: "/methodology", en: "Methodology", es: "Metodolog\xEDa" },
|
|
6
8
|
{ path: "/implementation", en: "Implementation", es: "Implementaci\xF3n" },
|
|
7
9
|
{ path: "/experiments", en: "Experiments", es: "Experimentos" },
|
|
@@ -13,4 +15,4 @@ var THEME_STORAGE_KEY = "caos.theme";
|
|
|
13
15
|
var LANG_STORAGE_KEY = "caos.lang";
|
|
14
16
|
var THEME_BOOT_SCRIPT = `(function(){try{var t=localStorage.getItem('${THEME_STORAGE_KEY}');if(t!=='light'&&t!=='dark'){t=matchMedia('(prefers-color-scheme: light)').matches?'light':'dark'}document.documentElement.dataset.theme=t;var l=localStorage.getItem('${LANG_STORAGE_KEY}');document.documentElement.lang=l==='es'?'es':'en'}catch(e){document.documentElement.dataset.theme='dark'}})();`;
|
|
15
17
|
|
|
16
|
-
export { LANG_STORAGE_KEY, STANDARD_ROUTES, THEME_BOOT_SCRIPT, THEME_STORAGE_KEY };
|
|
18
|
+
export { APP_ROUTE, LANDING_ROUTE, LANG_STORAGE_KEY, STANDARD_ROUTES, THEME_BOOT_SCRIPT, THEME_STORAGE_KEY };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { A as
|
|
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-CTQZafOf.js';
|
|
2
2
|
import * as react from 'react';
|
|
3
3
|
import { ReactNode, Component, ErrorInfo } from 'react';
|
|
4
4
|
import * as zustand from 'zustand';
|
|
@@ -7,6 +7,20 @@ export { N as NBSP, a as NOT_AVAILABLE, b as SCIENTIFIC_BELOW, c as SHELL_TOKENS
|
|
|
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
9
|
|
|
10
|
+
/**
|
|
11
|
+
* The landing route of a product (shell 0.13.0, Felipe 2026-10-13: "the shell and the apps must land at the Introduction,
|
|
12
|
+
* executive view"). Mount it on the root path and on the catch-all path:
|
|
13
|
+
*
|
|
14
|
+
* <Route path="/" element={<Landing />} />
|
|
15
|
+
* <Route path="/app" element={<App />} />
|
|
16
|
+
* <Route path="*" element={<Landing />} />
|
|
17
|
+
*
|
|
18
|
+
* The root and any unknown entry open the Introduction, whose executive view is its first and default view. An old link
|
|
19
|
+
* to the App, which was the root (`/?case=B2`, with a query string or a hash), is forwarded to the App route with the query
|
|
20
|
+
* string and the hash kept, so a link in a paper or a bookmark still reaches its case.
|
|
21
|
+
*/
|
|
22
|
+
declare function Landing(): react.JSX.Element;
|
|
23
|
+
|
|
10
24
|
/** One authenticated workbench destination rendered by the shared responsive navigation frame. */
|
|
11
25
|
interface WorkbenchRoute {
|
|
12
26
|
path: string;
|
|
@@ -401,7 +415,7 @@ declare function ReferenceList({ ids, heading }: {
|
|
|
401
415
|
* holds each area's rule; `test/docFloors.test.ts` keeps these names equal to that table's.
|
|
402
416
|
*/
|
|
403
417
|
declare const DOC_AREAS: {
|
|
404
|
-
readonly '/introduction': readonly ["
|
|
418
|
+
readonly '/introduction': readonly ["problem", "principles", "math", "pipeline", "honesty"];
|
|
405
419
|
readonly '/methodology': readonly ["method"];
|
|
406
420
|
readonly '/implementation': readonly ["architecture", "reproducibility", "engine", "lanes", "contract", "deployment"];
|
|
407
421
|
readonly '/experiments': readonly ["question", "metrics", "protocol", "datasets"];
|
|
@@ -467,6 +481,176 @@ interface StatProps {
|
|
|
467
481
|
*/
|
|
468
482
|
declare function Stat({ value, unit, source }: StatProps): react.JSX.Element;
|
|
469
483
|
|
|
484
|
+
interface ExecutiveViewProps {
|
|
485
|
+
/** The parsed `content/executive.json` of the product (validated against `executive.schema.json` in the page). */
|
|
486
|
+
data: unknown;
|
|
487
|
+
/** Where the product's site is served from; the illustration files are fetched from here (default `/`; a Pages site passes its base URL). */
|
|
488
|
+
base?: string;
|
|
489
|
+
/** Opens the technical view of the Introduction (default: selects the sibling tab `technical` of the tab that holds the view). */
|
|
490
|
+
onOpenTechnical?: () => void;
|
|
491
|
+
}
|
|
492
|
+
/**
|
|
493
|
+
* The executive view of an Introduction (CAOS_MANAGE conventions/problem-context-first.md, Felipe 2026-10-12 and
|
|
494
|
+
* 2026-10-13): the industry's problem framed for a decision maker. Above the sub-tabs, the landing block (the title, the key
|
|
495
|
+
* statement, two or three headline figures); then the five sections of `EXEC_SECTION_DEFS` as the sub-tabs of `SubTabs`, the
|
|
496
|
+
* first selected, each opening with its key message line; below them the numbered linked sources and two onward links (the
|
|
497
|
+
* technical view, the App). General, never a client, never a pitch. A product fills `content/executive.json`; it does not
|
|
498
|
+
* design this view, so the component takes no children. Invalid data renders an error state that lists each field path,
|
|
499
|
+
* never a blank.
|
|
500
|
+
*/
|
|
501
|
+
declare function ExecutiveView({ data, base, onOpenTechnical }: ExecutiveViewProps): react.JSX.Element;
|
|
502
|
+
|
|
503
|
+
/**
|
|
504
|
+
* The executive view standard (CAOS_MANAGE conventions/problem-context-first.md, Felipe 2026-10-12 and 2026-10-13): the
|
|
505
|
+
* types of the data file `content/executive.json`, its validator, its floors and its writing limits. The structure lives
|
|
506
|
+
* ONLY in `executive.schema.json` (this module interprets it); the rules a schema cannot say (the limits, the 4 C's, the
|
|
507
|
+
* sources by id, the owners that are roles, the wording) are here. `gate/areas.mjs` keeps the same limits and floors for
|
|
508
|
+
* the rendered page; a unit test keeps them equal.
|
|
509
|
+
*/
|
|
510
|
+
declare const EXECUTIVE_SCHEMA_VERSION = "2.0.0";
|
|
511
|
+
interface BiTextValue {
|
|
512
|
+
en: string;
|
|
513
|
+
es: string;
|
|
514
|
+
}
|
|
515
|
+
interface FourC {
|
|
516
|
+
name: BiTextValue;
|
|
517
|
+
definition: BiTextValue;
|
|
518
|
+
}
|
|
519
|
+
/**
|
|
520
|
+
* The 4 C's of the proposal (sub-tab 5), in order, with the names and definitions Felipe gave on 2026-10-13 (verbatim,
|
|
521
|
+
* English and Spanish). `proposal.four_cs` is required in every data file with exactly these four rows in this order, each
|
|
522
|
+
* `c` equal to the name and each with what the C means for the proposal (`applies`); the view shows the definition in small
|
|
523
|
+
* type beside the name. `gate/areas.mjs` EXEC_FOUR_CS holds the same values; a unit test keeps them equal.
|
|
524
|
+
*/
|
|
525
|
+
declare const FOUR_CS: readonly FourC[];
|
|
526
|
+
type Direction = 'rising' | 'easing' | 'steady';
|
|
527
|
+
type TrendKind = 'regulatory' | 'technological' | 'market' | 'practice';
|
|
528
|
+
type Horizon = 'now' | 'two_years' | 'ten_years';
|
|
529
|
+
type Confidence = 'low' | 'medium' | 'high';
|
|
530
|
+
interface ExecutiveFigure {
|
|
531
|
+
heading: BiTextValue;
|
|
532
|
+
value: BiTextValue;
|
|
533
|
+
unit: BiTextValue;
|
|
534
|
+
/** The id of an entry of `sources`. */
|
|
535
|
+
source: string;
|
|
536
|
+
}
|
|
537
|
+
interface ExecutiveIllustration {
|
|
538
|
+
/** The SVG file (a path under the site root), or one per language. */
|
|
539
|
+
file: string | BiTextValue;
|
|
540
|
+
caption: BiTextValue;
|
|
541
|
+
}
|
|
542
|
+
interface ExecutiveSource {
|
|
543
|
+
id: string;
|
|
544
|
+
/** The publication, in plain words. */
|
|
545
|
+
title: BiTextValue;
|
|
546
|
+
/** The page or document itself: an https link. */
|
|
547
|
+
url: string;
|
|
548
|
+
/** At most one sentence (for example a page number). */
|
|
549
|
+
note?: BiTextValue;
|
|
550
|
+
}
|
|
551
|
+
interface ExecutiveData {
|
|
552
|
+
title: BiTextValue;
|
|
553
|
+
key_statement: BiTextValue;
|
|
554
|
+
headline_figures: ExecutiveFigure[];
|
|
555
|
+
pain: {
|
|
556
|
+
key_message: BiTextValue;
|
|
557
|
+
paragraphs: BiTextValue[];
|
|
558
|
+
bearers: Array<{
|
|
559
|
+
who: BiTextValue;
|
|
560
|
+
cost: BiTextValue;
|
|
561
|
+
measure: BiTextValue;
|
|
562
|
+
}>;
|
|
563
|
+
figures: ExecutiveFigure[];
|
|
564
|
+
causes: Array<{
|
|
565
|
+
cause: BiTextValue;
|
|
566
|
+
weight: number;
|
|
567
|
+
}>;
|
|
568
|
+
};
|
|
569
|
+
context: {
|
|
570
|
+
key_message: BiTextValue;
|
|
571
|
+
paragraphs: BiTextValue[];
|
|
572
|
+
setting: BiTextValue;
|
|
573
|
+
forces: Array<{
|
|
574
|
+
force: BiTextValue;
|
|
575
|
+
direction: Direction;
|
|
576
|
+
}>;
|
|
577
|
+
evidence: Array<{
|
|
578
|
+
statement: BiTextValue;
|
|
579
|
+
source: string;
|
|
580
|
+
}>;
|
|
581
|
+
};
|
|
582
|
+
situation: {
|
|
583
|
+
key_message: BiTextValue;
|
|
584
|
+
roles: Array<{
|
|
585
|
+
role: BiTextValue;
|
|
586
|
+
decides: BiTextValue;
|
|
587
|
+
needs: BiTextValue;
|
|
588
|
+
}>;
|
|
589
|
+
interaction: BiTextValue;
|
|
590
|
+
state_of_the_art: Array<{
|
|
591
|
+
approach: BiTextValue;
|
|
592
|
+
achieves: BiTextValue;
|
|
593
|
+
falls_short: BiTextValue;
|
|
594
|
+
source: string;
|
|
595
|
+
}>;
|
|
596
|
+
status: {
|
|
597
|
+
heading: BiTextValue;
|
|
598
|
+
value: BiTextValue;
|
|
599
|
+
unit: BiTextValue;
|
|
600
|
+
date: BiTextValue;
|
|
601
|
+
source: string;
|
|
602
|
+
};
|
|
603
|
+
};
|
|
604
|
+
trends: {
|
|
605
|
+
key_message: BiTextValue;
|
|
606
|
+
items: Array<{
|
|
607
|
+
trend: BiTextValue;
|
|
608
|
+
kind: TrendKind;
|
|
609
|
+
direction: Direction;
|
|
610
|
+
horizon: Horizon;
|
|
611
|
+
signal: {
|
|
612
|
+
statement: BiTextValue;
|
|
613
|
+
source: string;
|
|
614
|
+
};
|
|
615
|
+
effect: BiTextValue;
|
|
616
|
+
confidence: Confidence;
|
|
617
|
+
}>;
|
|
618
|
+
};
|
|
619
|
+
proposal: {
|
|
620
|
+
key_message: BiTextValue;
|
|
621
|
+
paragraphs: BiTextValue[];
|
|
622
|
+
four_cs: Array<{
|
|
623
|
+
c: BiTextValue;
|
|
624
|
+
applies: BiTextValue;
|
|
625
|
+
}>;
|
|
626
|
+
actions: Array<{
|
|
627
|
+
action: BiTextValue;
|
|
628
|
+
owner: BiTextValue;
|
|
629
|
+
horizon: BiTextValue;
|
|
630
|
+
check: BiTextValue;
|
|
631
|
+
}>;
|
|
632
|
+
risks: BiTextValue[];
|
|
633
|
+
unknowns: BiTextValue[];
|
|
634
|
+
handoff?: BiTextValue;
|
|
635
|
+
};
|
|
636
|
+
illustrations: {
|
|
637
|
+
pain: ExecutiveIllustration;
|
|
638
|
+
situation: ExecutiveIllustration;
|
|
639
|
+
proposal: ExecutiveIllustration;
|
|
640
|
+
};
|
|
641
|
+
sources: ExecutiveSource[];
|
|
642
|
+
}
|
|
643
|
+
interface ExecutiveProblem {
|
|
644
|
+
/** The field path, for example `pain.bearers[1].cost.en` (empty for the document itself). */
|
|
645
|
+
path: string;
|
|
646
|
+
message: string;
|
|
647
|
+
}
|
|
648
|
+
/**
|
|
649
|
+
* Validates a product's `content/executive.json` against `executive.schema.json` and the rules on top of it. Pure; an
|
|
650
|
+
* empty array means valid.
|
|
651
|
+
*/
|
|
652
|
+
declare function validateExecutive(data: unknown): ExecutiveProblem[];
|
|
653
|
+
|
|
470
654
|
interface QuestionProps {
|
|
471
655
|
/** The business question the executive would ask. */
|
|
472
656
|
question: ReactNode;
|
|
@@ -918,4 +1102,4 @@ interface ViewsRowProps {
|
|
|
918
1102
|
*/
|
|
919
1103
|
declare function ViewsRow({ children, shares }: ViewsRowProps): react.JSX.Element;
|
|
920
1104
|
|
|
921
|
-
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, Equation, Figure, type FittedLabel, FocusShell, type FocusShellProps, FormatOptions, Gauge, type GaugeProps, type GaugeZone, Glossary, type GlossaryEntry, InlineMath, Knob, type KnobProps, 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, viewParamOf, widestLabel, withCaseParam };
|
|
1105
|
+
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 };
|