@weasel-js/forge 1.5.0 → 1.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/dist/{FrameController-Ba3LaWfq.d.ts → FrameController-eZM3hlcE.d.ts} +74 -1
  2. package/dist/{chunk-O5OQZQRZ.js → chunk-2JDYOBWM.js} +5 -5
  3. package/dist/chunk-2JDYOBWM.js.map +1 -0
  4. package/dist/{chunk-KKF7ZX5E.js → chunk-5YHEO26U.js} +133 -23
  5. package/dist/chunk-5YHEO26U.js.map +1 -0
  6. package/dist/{chunk-UZCXH724.js → chunk-6SRQIHJQ.js} +3 -8
  7. package/dist/chunk-6SRQIHJQ.js.map +1 -0
  8. package/dist/{chunk-IOBG7GZQ.js → chunk-FTFR2YPM.js} +2 -2
  9. package/dist/chunk-FTFR2YPM.js.map +1 -0
  10. package/dist/chunk-TLO6UHF2.js +103 -0
  11. package/dist/chunk-TLO6UHF2.js.map +1 -0
  12. package/dist/{config-DdumOfyd.d.ts → config-CSVP6duU.d.ts} +6 -2
  13. package/dist/csf/preview-api.js +2 -2
  14. package/dist/frame/index.d.ts +5 -4
  15. package/dist/frame/index.js +5 -5
  16. package/dist/index.d.ts +97 -5
  17. package/dist/index.js.map +1 -1
  18. package/dist/shell/index.css +209 -12
  19. package/dist/shell/index.css.map +1 -1
  20. package/dist/shell/index.d.ts +62 -4
  21. package/dist/shell/index.js +712 -182
  22. package/dist/shell/index.js.map +1 -1
  23. package/dist/test/index.d.ts +2 -2
  24. package/dist/test/index.js +7 -7
  25. package/dist/test/index.js.map +1 -1
  26. package/dist/test/play.d.ts +25 -0
  27. package/dist/test/play.js +14 -0
  28. package/dist/test/play.js.map +1 -0
  29. package/dist/vite/index.js +72 -20
  30. package/dist/vite/index.js.map +1 -1
  31. package/package.json +14 -5
  32. package/dist/chunk-IOBG7GZQ.js.map +0 -1
  33. package/dist/chunk-KKF7ZX5E.js.map +0 -1
  34. package/dist/chunk-KKVTFMWV.js +0 -59
  35. package/dist/chunk-KKVTFMWV.js.map +0 -1
  36. package/dist/chunk-O5OQZQRZ.js.map +0 -1
  37. package/dist/chunk-UZCXH724.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/protocol/messages.ts"],"names":[],"mappings":";AAEO,IAAM,gBAAA,GAAmB;AA4FzB,IAAM,YAAA,GAAe;AAGrB,SAAS,gBAAgB,KAAA,EAAwB;AACtD,EAAA,OAAO,IAAA,CAAK,SAAA;AAAA,IAAU,KAAA;AAAA,IAAO,CAAC,IAAA,EAAM,CAAA,KAClC,CAAA,IAAK,OAAO,CAAA,KAAM,QAAA,IAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA,GAC1C,OAAO,WAAA,CAAY,MAAA,CAAO,OAAA,CAAQ,CAAC,CAAA,CAAE,IAAA,CAAK,CAAC,CAAC,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA,KAAO,CAAA,GAAI,CAAA,GAAI,EAAA,GAAK,CAAE,CAAC,CAAA,GACzE;AAAA,GACN;AACF","file":"chunk-FTFR2YPM.js","sourcesContent":["import type { SchemaDescription } from './schema';\n\nexport const PROTOCOL_VERSION = 1;\n\nexport type Globals = Readonly<Record<string, unknown>>;\nexport type Layout = 'centered' | 'padded' | 'fullscreen';\nexport interface Viewport {\n width: number;\n height: number;\n}\nexport type FaultPhase = 'import' | 'render' | 'play' | 'protocol';\n\n/** One custom property as the frame found it. */\nexport interface CssVarReport {\n name: string;\n value: string;\n /** Whether a `vars.set` override is in force on it. */\n overridden: boolean;\n}\n\n/** Visibility and validation answers, keyed by the config they were computed for. */\nexport interface ConfigAnswers {\n /** `stableStringify(config)` of the config the frame evaluated. */\n configKey: string;\n hidden: string[];\n errors: Record<string, string[]>;\n}\n\n/** One element axe faulted on, inside the frame's own document. */\nexport interface A11yNode {\n /** The CSS selectors, outermost first, that reach the element in the frame. */\n target: readonly string[];\n html: string;\n failureSummary?: string;\n}\n\n/** One axe rule's outcome on the story, with the elements it names. */\nexport interface A11yFinding {\n id: string;\n impact: 'minor' | 'moderate' | 'serious' | 'critical' | null;\n help: string;\n helpUrl: string;\n description: string;\n nodes: readonly A11yNode[];\n}\n\n/** What axe found on one story: the rules it failed, and the ones it could not decide. */\nexport interface A11yReport {\n violations: readonly A11yFinding[];\n incomplete: readonly A11yFinding[];\n /** Rules that passed, and rules no element on the page could be judged by. */\n passes: number;\n inapplicable: number;\n}\n\n/** A picture of the story the frame can put in a message: labkit's `CaptureSource` without the canvas,\n * which no structured clone carries. */\nexport type CapturedPicture = { kind: 'svg'; markup: string } | { kind: 'image'; src: string };\n\nexport type ToFrame =\n | { type: 'init'; config: unknown; state: unknown; globals: Globals }\n | { type: 'config'; config: unknown }\n | { type: 'state'; state: unknown }\n | { type: 'globals'; globals: Globals }\n | { type: 'vars.set'; name: string; value: string | null }\n | { type: 'play' }\n /** Run axe over the story's own subtree. Answered by `a11y` carrying the same `id`. */\n | { type: 'a11y.run'; id: string }\n /** Serialize the story's own subtree as a picture. Answered by `capture` carrying the same `id`. */\n | { type: 'capture.run'; id: string };\n\nexport type FromFrame =\n | { type: 'ready'; schema: SchemaDescription; layout: Layout; viewport: Viewport | null }\n /** Sent once, when the story's first render after `init` has committed. */\n | { type: 'rendered' }\n | { type: 'answers'; answers: ConfigAnswers }\n | { type: 'setConfig'; path: string; value: unknown }\n | { type: 'setState'; state: unknown }\n | { type: 'size'; width: number; height: number }\n | { type: 'vars'; vars: CssVarReport[] }\n | { type: 'played'; ok: boolean; message?: string }\n | { type: 'a11y'; id: string; ok: true; report: A11yReport }\n | { type: 'a11y'; id: string; ok: false; message: string }\n | { type: 'capture'; id: string; ok: true; picture: CapturedPicture }\n | { type: 'capture'; id: string; ok: false; message: string }\n /** `seq`, on a render fault only: how many `init`/`config`/`state`/`globals` messages the frame had received. */\n | { type: 'fault'; phase: FaultPhase; message: string; stack?: string; seq?: number };\n\nexport interface Envelope<M> {\n v: number;\n msg: M;\n}\n\n/** Posted on the frame's window with the port transferred alongside it. */\nexport const PORT_HANDOFF = 'weaselforge:port';\n\n/** JSON with object keys sorted, so two equal configs produce one key. */\nexport function stableStringify(value: unknown): string {\n return JSON.stringify(value, (_key, v) =>\n v && typeof v === 'object' && !Array.isArray(v)\n ? Object.fromEntries(Object.entries(v).sort(([a], [b]) => (a < b ? -1 : 1)))\n : v,\n );\n}\n"]}
@@ -0,0 +1,103 @@
1
+ import { stableStringify } from './chunk-FTFR2YPM.js';
2
+ import { createContext } from 'react';
3
+
4
+ var coverOf = (value) => stableStringify(value) ?? " undefined";
5
+ var appliedLocal = (local, config) => Object.fromEntries(
6
+ Object.entries(local).filter(([key, entry]) => coverOf(config[key]) === entry.over).map(([key, entry]) => [key, entry.value])
7
+ );
8
+ var ArgsContext = createContext(null);
9
+
10
+ // src/csf/portSafe.ts
11
+ var g = globalThis;
12
+ var CLONED_WHOLE = new Set(
13
+ [
14
+ "Date",
15
+ "RegExp",
16
+ "ArrayBuffer",
17
+ "DataView",
18
+ "Int8Array",
19
+ "Uint8Array",
20
+ "Uint8ClampedArray",
21
+ "Int16Array",
22
+ "Uint16Array",
23
+ "Int32Array",
24
+ "Uint32Array",
25
+ "Float16Array",
26
+ "Float32Array",
27
+ "Float64Array",
28
+ "BigInt64Array",
29
+ "BigUint64Array"
30
+ ].map((name) => g[name]?.prototype).filter(Boolean)
31
+ );
32
+ var hasOnlyClonedKeys = (v) => Reflect.ownKeys(v).every(
33
+ (key) => typeof key === "string" && (Object.prototype.propertyIsEnumerable.call(v, key) || Array.isArray(v) && key === "length")
34
+ );
35
+ function isPortSafe(value) {
36
+ const seen = /* @__PURE__ */ new Set();
37
+ const safe = (v) => {
38
+ if (v === null) return true;
39
+ if (typeof v !== "object") return typeof v !== "function" && typeof v !== "symbol";
40
+ if (seen.has(v)) return true;
41
+ seen.add(v);
42
+ const proto = Object.getPrototypeOf(v);
43
+ if (CLONED_WHOLE.has(proto)) return true;
44
+ if (proto === Map.prototype)
45
+ return hasOnlyClonedKeys(v) && [...v].every(([key, member]) => safe(key) && safe(member));
46
+ if (proto === Set.prototype) return hasOnlyClonedKeys(v) && [...v].every(safe);
47
+ if (proto !== Array.prototype && proto !== Object.prototype && proto !== null) return false;
48
+ return hasOnlyClonedKeys(v) && Object.values(v).every(safe);
49
+ };
50
+ try {
51
+ return safe(value);
52
+ } catch {
53
+ return false;
54
+ }
55
+ }
56
+ var isPlainOrNull = (v) => {
57
+ if (!v || typeof v !== "object") return false;
58
+ const proto = Object.getPrototypeOf(v);
59
+ return proto === Object.prototype || proto === null;
60
+ };
61
+ var splittable = (v) => (Array.isArray(v) ? Object.getPrototypeOf(v) === Array.prototype : isPlainOrNull(v) && !("$$typeof" in v)) && hasOnlyClonedKeys(v);
62
+ function portSafePart(value) {
63
+ const walking = /* @__PURE__ */ new Set();
64
+ const part = (v) => {
65
+ if (isPortSafe(v)) return { value: v };
66
+ if (!splittable(v) || walking.has(v)) return null;
67
+ walking.add(v);
68
+ try {
69
+ if (Array.isArray(v)) return { value: v.map((member) => part(member)?.value ?? null) };
70
+ const out = {};
71
+ for (const [key, member] of Object.entries(v)) {
72
+ const kept = part(member);
73
+ if (kept) out[key] = kept.value;
74
+ }
75
+ return { value: out };
76
+ } finally {
77
+ walking.delete(v);
78
+ }
79
+ };
80
+ try {
81
+ return part(value);
82
+ } catch {
83
+ return null;
84
+ }
85
+ }
86
+ function withUnsent(sent, original) {
87
+ if (isPortSafe(original)) return sent;
88
+ if (sent === null && portSafePart(original) === null) return original;
89
+ if (Array.isArray(original) && Array.isArray(sent))
90
+ return sent.map((member, i) => i < original.length ? withUnsent(member, original[i]) : member);
91
+ if (!splittable(original) || Array.isArray(original) || !isPlainOrNull(sent)) return sent;
92
+ const out = {};
93
+ for (const [key, member] of Object.entries(original)) {
94
+ if (key in sent) out[key] = withUnsent(sent[key], member);
95
+ else if (portSafePart(member) === null) out[key] = member;
96
+ }
97
+ for (const [key, member] of Object.entries(sent)) if (!(key in original)) out[key] = member;
98
+ return out;
99
+ }
100
+
101
+ export { ArgsContext, appliedLocal, coverOf, isPortSafe, portSafePart, withUnsent };
102
+ //# sourceMappingURL=chunk-TLO6UHF2.js.map
103
+ //# sourceMappingURL=chunk-TLO6UHF2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/csf/argsContext.ts","../src/csf/portSafe.ts"],"names":[],"mappings":"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","file":"chunk-TLO6UHF2.js","sourcesContent":["import { type Context, createContext, type Dispatch, type SetStateAction } from 'react';\nimport { stableStringify } from '../protocol/messages';\n\ntype Args = Record<string, unknown>;\n\n/** A frame-local arg, and the config value it was set over: it applies only while config still holds that. */\nexport interface LocalArg {\n value: unknown;\n over: string;\n}\n\nexport type LocalArgs = Record<string, LocalArg>;\n\n/** A config value in the form `LocalArg.over` records. */\nexport const coverOf = (value: unknown): string => stableStringify(value) ?? ' undefined';\n\n/** The frame-local values that still apply over `config`. */\nexport const appliedLocal = (local: LocalArgs, config: Args): Args =>\n Object.fromEntries(\n Object.entries(local)\n .filter(([key, entry]) => coverOf(config[key]) === entry.over)\n .map(([key, entry]) => [key, entry.value]),\n );\n\nexport interface ArgsScope {\n /** The args the story renders with: its own, then config, then the frame-local ones that still apply. */\n args: Args;\n /** The trial's config as it stands. An `undefined` key means the story's own arg. */\n config: Args;\n defaults: Args;\n /** The story's own args, before config and the frame-local ones. */\n original: Args;\n setConfig: (path: string, value: unknown) => void;\n /** Args a MessagePort would not deliver intact, kept in the frame because config crosses one. */\n setLocal: Dispatch<SetStateAction<LocalArgs>>;\n}\n\nexport const ArgsContext: Context<ArgsScope | null> = createContext<ArgsScope | null>(null);\n","const g = globalThis as Record<string, unknown>;\nconst CLONED_WHOLE = new Set<unknown>(\n [\n 'Date',\n 'RegExp',\n 'ArrayBuffer',\n 'DataView',\n 'Int8Array',\n 'Uint8Array',\n 'Uint8ClampedArray',\n 'Int16Array',\n 'Uint16Array',\n 'Int32Array',\n 'Uint32Array',\n 'Float16Array',\n 'Float32Array',\n 'Float64Array',\n 'BigInt64Array',\n 'BigUint64Array',\n ]\n .map((name) => (g[name] as { prototype?: object } | undefined)?.prototype)\n .filter(Boolean),\n);\n\n/** Own keys a clone keeps: enumerable string keys, plus an array's `length`. */\nconst hasOnlyClonedKeys = (v: object): boolean =>\n Reflect.ownKeys(v).every(\n (key) =>\n typeof key === 'string' &&\n (Object.prototype.propertyIsEnumerable.call(v, key) || (Array.isArray(v) && key === 'length')),\n );\n\n/**\n * Whether a MessagePort delivers `value` as the same thing it was. `structuredClone` succeeding is\n * not enough: it copies a class instance's fields onto a plain object and drops its methods.\n */\nexport function isPortSafe(value: unknown): boolean {\n const seen = new Set<object>();\n const safe = (v: unknown): boolean => {\n if (v === null) return true;\n if (typeof v !== 'object') return typeof v !== 'function' && typeof v !== 'symbol';\n if (seen.has(v)) return true;\n seen.add(v);\n const proto = Object.getPrototypeOf(v);\n if (CLONED_WHOLE.has(proto)) return true;\n if (proto === Map.prototype)\n return hasOnlyClonedKeys(v) && [...(v as Map<unknown, unknown>)].every(([key, member]) => safe(key) && safe(member));\n if (proto === Set.prototype) return hasOnlyClonedKeys(v) && [...(v as Set<unknown>)].every(safe);\n if (proto !== Array.prototype && proto !== Object.prototype && proto !== null) return false;\n return hasOnlyClonedKeys(v) && Object.values(v).every(safe);\n };\n try {\n return safe(value);\n } catch {\n return false;\n }\n}\n\nconst isPlainOrNull = (v: unknown): v is Record<string, unknown> => {\n if (!v || typeof v !== 'object') return false;\n const proto = Object.getPrototypeOf(v);\n return proto === Object.prototype || proto === null;\n};\n\n/** A plain object or array whose members can be split: React elements are plain objects, but whole. */\nconst splittable = (v: unknown): v is Record<string, unknown> | unknown[] =>\n (Array.isArray(v) ? Object.getPrototypeOf(v) === Array.prototype : isPlainOrNull(v) && !('$$typeof' in v)) &&\n hasOnlyClonedKeys(v as object);\n\n/**\n * The part of `value` a port delivers intact, or null when none of it can cross. A plain object\n * keeps its port-safe fields; an array holds null where a member has no part.\n */\nexport function portSafePart(value: unknown): { value: unknown } | null {\n const walking = new Set<object>();\n const part = (v: unknown): { value: unknown } | null => {\n if (isPortSafe(v)) return { value: v };\n if (!splittable(v) || walking.has(v)) return null;\n walking.add(v);\n try {\n if (Array.isArray(v)) return { value: v.map((member) => part(member)?.value ?? null) };\n const out: Record<string, unknown> = {};\n for (const [key, member] of Object.entries(v)) {\n const kept = part(member);\n if (kept) out[key] = kept.value;\n }\n return { value: out };\n } finally {\n walking.delete(v);\n }\n };\n try {\n return part(value);\n } catch {\n return null;\n }\n}\n\n/** `sent`, a value that crossed the port as `portSafePart(original)` or an edit of it, with what the part left behind put back. */\nexport function withUnsent(sent: unknown, original: unknown): unknown {\n if (isPortSafe(original)) return sent;\n if (sent === null && portSafePart(original) === null) return original;\n if (Array.isArray(original) && Array.isArray(sent))\n return sent.map((member, i) => (i < original.length ? withUnsent(member, original[i]) : member));\n if (!splittable(original) || Array.isArray(original) || !isPlainOrNull(sent)) return sent;\n const out: Record<string, unknown> = {};\n for (const [key, member] of Object.entries(original)) {\n if (key in sent) out[key] = withUnsent(sent[key], member);\n else if (portSafePart(member) === null) out[key] = member;\n }\n for (const [key, member] of Object.entries(sent)) if (!(key in original)) out[key] = member;\n return out;\n}\n"]}
@@ -1,6 +1,6 @@
1
- import { LabContribution } from '@weasel-js/labkit';
1
+ import { LabContribution, LabPage } from '@weasel-js/labkit';
2
2
  import { ControlRenderer } from '@weasel-js/labkit/config';
3
- import { F as FrameSetup } from './FrameController-Ba3LaWfq.js';
3
+ import { F as FrameSetup } from './FrameController-eZM3hlcE.js';
4
4
 
5
5
  /** One global the workshop's toolbar sets for every story, and a trial may pin for its own. */
6
6
  interface GlobalDeclaration {
@@ -19,6 +19,10 @@ interface ShellConfig {
19
19
  controls?: Record<string, ControlRenderer>;
20
20
  /** Globals the lab's header sets for every story, each pinnable per trial. Frames apply them with `applyGlobals`. */
21
21
  globals?: GlobalDeclarations;
22
+ /** The project's other labs, offered in the workshop's title menu. */
23
+ pages?: readonly LabPage[];
24
+ /** Which of `pages` the workshop is, when the URL alone cannot say, as across dev servers on different ports. */
25
+ path?: string;
22
26
  }
23
27
  /** A frame config module's default export. Only frame documents import it, so its CSS stays out of the workshop. */
24
28
  declare function defineFrameConfig(config: FrameSetup): FrameSetup;
@@ -1,5 +1,5 @@
1
- import { ArgsContext, coverOf, isPortSafe } from '../chunk-KKVTFMWV.js';
2
- import '../chunk-IOBG7GZQ.js';
1
+ import { ArgsContext, coverOf, isPortSafe } from '../chunk-TLO6UHF2.js';
2
+ import '../chunk-FTFR2YPM.js';
3
3
  import { useContext } from 'react';
4
4
 
5
5
  var sendable = (value) => {
@@ -1,5 +1,5 @@
1
- import { F as FrameSetup, L as LoadedStory } from '../FrameController-Ba3LaWfq.js';
2
- export { b as StartFrameOptions, r as reportImportFault, s as startFrame } from '../FrameController-Ba3LaWfq.js';
1
+ import { F as FrameSetup, L as LoadedStory } from '../FrameController-eZM3hlcE.js';
2
+ export { d as StartFrameOptions, r as reportImportFault, s as startFrame } from '../FrameController-eZM3hlcE.js';
3
3
  import '@weasel-js/labkit/config';
4
4
  import 'react';
5
5
 
@@ -8,15 +8,16 @@ interface FrameImporters {
8
8
  }
9
9
  interface FrameIndexEntry {
10
10
  id: string;
11
+ /** The story's title as indexed, which titles the file's stories when its meta names none. */
12
+ title: string;
11
13
  file: string;
12
14
  exportName: string;
13
15
  }
14
16
  interface MountFrameOptions {
15
17
  index: readonly FrameIndexEntry[];
16
18
  importers: FrameImporters;
17
- root: string;
18
19
  setup?: FrameSetup;
19
- load?: (mod: Record<string, unknown>, file: string, root: string, parameters?: Record<string, unknown>) => LoadedStory[];
20
+ load?: (mod: Record<string, unknown>, autoTitle: string, parameters?: Record<string, unknown>) => LoadedStory[];
20
21
  }
21
22
  /** The frame document's entry: takes the shell's port, loads the story named by the hash, and starts it. */
22
23
  declare function mountFrame(options: MountFrameOptions): Promise<void>;
@@ -1,8 +1,8 @@
1
- export { mountFrame, reportImportFault, startFrame } from '../chunk-KKF7ZX5E.js';
1
+ export { mountFrame, reportImportFault, startFrame } from '../chunk-5YHEO26U.js';
2
2
  import '../chunk-2GXKNXTJ.js';
3
- import '../chunk-UZCXH724.js';
4
- import '../chunk-O5OQZQRZ.js';
5
- import '../chunk-KKVTFMWV.js';
6
- import '../chunk-IOBG7GZQ.js';
3
+ import '../chunk-6SRQIHJQ.js';
4
+ import '../chunk-2JDYOBWM.js';
5
+ import '../chunk-TLO6UHF2.js';
6
+ import '../chunk-FTFR2YPM.js';
7
7
  //# sourceMappingURL=index.js.map
8
8
  //# sourceMappingURL=index.js.map
package/dist/index.d.ts CHANGED
@@ -1,11 +1,103 @@
1
1
  export { f } from '@weasel-js/labkit/config';
2
- export { G as GlobalDeclaration, a as GlobalDeclarations, S as ShellConfig, d as defineFrameConfig, b as defineShellConfig } from './config-DdumOfyd.js';
3
- import { M as MetaSpec, S as StorySpec } from './FrameController-Ba3LaWfq.js';
4
- export { D as Decorator, F as FrameSetup, L as LoadedStory, P as PlayContext, a as StoryContext } from './FrameController-Ba3LaWfq.js';
2
+ export { G as GlobalDeclaration, a as GlobalDeclarations, S as ShellConfig, d as defineFrameConfig, b as defineShellConfig } from './config-CSVP6duU.js';
3
+ import { ComponentType, ReactNode } from 'react';
4
+ import { G as Globals, M as MetaSpec, S as StorySpec } from './FrameController-eZM3hlcE.js';
5
+ export { A as A11yFinding, a as A11yNode, b as A11yReport, D as Decorator, F as FrameSetup, L as LoadedStory, P as PlayContext, c as StoryContext } from './FrameController-eZM3hlcE.js';
5
6
  import '@weasel-js/labkit';
6
- import 'react';
7
+
8
+ /** Storybook's conditional control: shown only while an arg, or a global, meets the test. */
9
+ type ArgCondition = ({
10
+ arg: string;
11
+ } | {
12
+ global: string;
13
+ }) & {
14
+ truthy?: boolean;
15
+ exists?: boolean;
16
+ eq?: unknown;
17
+ neq?: unknown;
18
+ };
19
+ /** A CSF `argTypes` entry, as far as forge reads it. */
20
+ interface ArgType {
21
+ name?: string;
22
+ description?: string;
23
+ control?: string | false | {
24
+ type?: string;
25
+ min?: number;
26
+ max?: number;
27
+ step?: number;
28
+ };
29
+ options?: readonly unknown[];
30
+ table?: {
31
+ disable?: boolean;
32
+ };
33
+ if?: ArgCondition;
34
+ }
35
+
36
+ /**
37
+ * The CSF surface forge reads, as types a story file can annotate itself with.
38
+ *
39
+ * Component Story Format is a plain-module convention — a default export of
40
+ * meta, one named export per story — and forge's loader (`loadCsfModule`)
41
+ * implements it directly. These types are that loader's `Annotations`
42
+ * interface made public, so a CSF file is typed by the tool that runs it.
43
+ *
44
+ * They are deliberately narrower than Storybook's: what is here is what forge
45
+ * reads. A field forge ignores is a field a story should not be writing.
46
+ */
47
+
48
+ /** The props a story's args describe: a component type resolves to its props,
49
+ * and a bare props type stands for itself. */
50
+ type ArgsOf<T> = T extends ComponentType<infer P> ? P : T;
51
+ /** What a `render`, `decorators` entry or `play` is handed alongside the args. */
52
+ interface CsfStoryContext {
53
+ args: Record<string, unknown>;
54
+ globals: Globals;
55
+ parameters: Record<string, unknown>;
56
+ title: string;
57
+ name: string;
58
+ id: string;
59
+ viewMode: 'story';
60
+ }
61
+ /** Groups a play function's steps for reporting. */
62
+ type CsfStep = (label: string, fn: () => void | Promise<void>) => Promise<void>;
63
+ /** What a `play` is handed: the story context, the element the story mounted
64
+ * into, and `step`. */
65
+ interface CsfPlayContext extends CsfStoryContext {
66
+ canvasElement: HTMLElement;
67
+ step: CsfStep;
68
+ }
69
+ /** Wraps a story. `Story` renders whatever it wraps — the next decorator in,
70
+ * or the story itself. */
71
+ type CsfDecorator = (Story: ComponentType, context: CsfStoryContext) => ReactNode;
72
+ /** Fields a meta and a story both accept. A story's value wins. */
73
+ interface Shared<T> {
74
+ args?: Partial<ArgsOf<T>>;
75
+ argTypes?: Partial<Record<keyof ArgsOf<T> & string, ArgType>> & Record<string, ArgType>;
76
+ parameters?: Record<string, unknown>;
77
+ globals?: Record<string, unknown>;
78
+ decorators?: CsfDecorator | CsfDecorator[];
79
+ render?: (args: ArgsOf<T>, context: CsfStoryContext) => ReactNode;
80
+ play?: (context: CsfPlayContext) => void | Promise<void>;
81
+ }
82
+ /** A CSF file's default export: what its stories share, and where they sit in
83
+ * the sidebar. */
84
+ interface Meta<T = unknown> extends Shared<T> {
85
+ /** Sidebar path, `/`-separated. Derived from the file's location when omitted. */
86
+ title?: string;
87
+ component?: ComponentType<ArgsOf<T>>;
88
+ /** Named exports to index as stories. Everything not excluded, by default. */
89
+ includeStories?: string[] | RegExp;
90
+ excludeStories?: string[] | RegExp;
91
+ }
92
+ /** One story: a named export of a CSF file. */
93
+ interface StoryObj<T = unknown> extends Shared<T> {
94
+ /** Overrides the name derived from the export's identifier. */
95
+ name?: string;
96
+ /** Storybook's older spelling of `name`; forge reads both. */
97
+ storyName?: string;
98
+ }
7
99
 
8
100
  declare function meta(spec: MetaSpec): MetaSpec;
9
101
  declare function story<C = Record<string, never>, S = undefined>(spec: StorySpec<C, S>): StorySpec<C, S>;
10
102
 
11
- export { MetaSpec, StorySpec, meta, story };
103
+ export { type ArgType, type ArgsOf, type CsfDecorator, type CsfPlayContext, type CsfStep, type CsfStoryContext, type Meta, MetaSpec, type StoryObj, StorySpec, meta, story };
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/config.ts"],"names":[],"mappings":";;;;AAcO,SAAS,kBAAkB,MAAA,EAAgC;AAChE,EAAA,OAAO,MAAA;AACT;AAGO,SAAS,kBAAkB,MAAA,EAAkC;AAClE,EAAA,OAAO,MAAA;AACT","file":"index.js","sourcesContent":["import type { LabContribution } from '@weasel-js/labkit';\nimport type { ControlRenderer } from '@weasel-js/labkit/config';\nimport type { FrameSetup } from './frame/FrameController';\nimport type { GlobalDeclarations } from './shell/globals';\n\n/** A shell config module: what the workshop adds to the lab. Only the workshop page imports it. */\nexport interface ShellConfig {\n labChrome?: readonly LabContribution[];\n controls?: Record<string, ControlRenderer>;\n /** Globals the lab's header sets for every story, each pinnable per trial. Frames apply them with `applyGlobals`. */\n globals?: GlobalDeclarations;\n}\n\n/** A frame config module's default export. Only frame documents import it, so its CSS stays out of the workshop. */\nexport function defineFrameConfig(config: FrameSetup): FrameSetup {\n return config;\n}\n\n/** A shell config module's default export. */\nexport function defineShellConfig(config: ShellConfig): ShellConfig {\n return config;\n}\n"]}
1
+ {"version":3,"sources":["../src/config.ts"],"names":[],"mappings":";;;;AAkBO,SAAS,kBAAkB,MAAA,EAAgC;AAChE,EAAA,OAAO,MAAA;AACT;AAGO,SAAS,kBAAkB,MAAA,EAAkC;AAClE,EAAA,OAAO,MAAA;AACT","file":"index.js","sourcesContent":["import type { LabContribution, LabPage } from '@weasel-js/labkit';\nimport type { ControlRenderer } from '@weasel-js/labkit/config';\nimport type { FrameSetup } from './frame/FrameController';\nimport type { GlobalDeclarations } from './shell/globals';\n\n/** A shell config module: what the workshop adds to the lab. Only the workshop page imports it. */\nexport interface ShellConfig {\n labChrome?: readonly LabContribution[];\n controls?: Record<string, ControlRenderer>;\n /** Globals the lab's header sets for every story, each pinnable per trial. Frames apply them with `applyGlobals`. */\n globals?: GlobalDeclarations;\n /** The project's other labs, offered in the workshop's title menu. */\n pages?: readonly LabPage[];\n /** Which of `pages` the workshop is, when the URL alone cannot say, as across dev servers on different ports. */\n path?: string;\n}\n\n/** A frame config module's default export. Only frame documents import it, so its CSS stays out of the workshop. */\nexport function defineFrameConfig(config: FrameSetup): FrameSetup {\n return config;\n}\n\n/** A shell config module's default export. */\nexport function defineShellConfig(config: ShellConfig): ShellConfig {\n return config;\n}\n"]}
@@ -31,6 +31,16 @@
31
31
  width: 100%;
32
32
  height: 100%;
33
33
  border: 0;
34
+ transition: opacity var(--wzl-motion-fast) var(--wzl-ease-out-cubic);
35
+ }
36
+ .fg-frame-view[data-pending] {
37
+ visibility: hidden;
38
+ opacity: 0;
39
+ }
40
+ @media (prefers-reduced-motion: reduce) {
41
+ .fg-frame-view {
42
+ transition: none;
43
+ }
34
44
  }
35
45
  .fg-fault {
36
46
  position: absolute;
@@ -80,6 +90,7 @@
80
90
  .fg-tree__filter {
81
91
  box-sizing: border-box;
82
92
  width: 100%;
93
+ font-size: var(--wzl-font-size);
83
94
  }
84
95
  .fg-tree__items,
85
96
  .fg-tree__group {
@@ -87,7 +98,7 @@
87
98
  flex-direction: column;
88
99
  }
89
100
  .fg-tree__items {
90
- font-size: var(--wzl-font-size-sm);
101
+ font-size: var(--wzl-font-size);
91
102
  }
92
103
  .fg-tree__group {
93
104
  padding-inline-start: var(--wzl-space-sm);
@@ -119,6 +130,28 @@
119
130
  .fg-tree__item:hover {
120
131
  background: var(--wzl-surface-hover);
121
132
  }
133
+ .fg-tree__tag {
134
+ flex: none;
135
+ margin-inline-start: auto;
136
+ padding: 0 var(--wzl-space-xs);
137
+ border-radius: var(--wzl-radius-sm);
138
+ background: var(--wzl-surface-sunken);
139
+ color: var(--wzl-fg-muted);
140
+ font-size: var(--wzl-font-size-sm);
141
+ }
142
+ .fg-tree__libraries {
143
+ display: flex;
144
+ flex-wrap: wrap;
145
+ gap: var(--wzl-space-xs);
146
+ margin: 0;
147
+ padding: 0;
148
+ border: 0;
149
+ }
150
+ .fg-tree__libraries-legend {
151
+ padding: 0;
152
+ color: var(--wzl-fg-muted);
153
+ font-size: var(--wzl-font-size-sm);
154
+ }
122
155
  .fg-tree__story:focus-visible,
123
156
  .fg-tree__node:focus-visible > .fg-tree__folder {
124
157
  outline: var(--wzl-line-width) solid var(--wzl-accent);
@@ -165,34 +198,198 @@
165
198
  flex-direction: column;
166
199
  gap: var(--wzl-space-xs);
167
200
  }
168
- .fg-css-vars__list {
201
+ .fg-css-vars-focus {
169
202
  display: flex;
170
203
  flex-direction: column;
171
204
  gap: var(--wzl-space-xs);
172
- max-height: 60vh;
173
- overflow: auto;
205
+ min-width: 0;
174
206
  }
175
- .fg-css-vars__empty {
207
+ .fg-css-vars__trial {
176
208
  margin: 0;
209
+ overflow: hidden;
177
210
  color: var(--wzl-fg-muted);
178
211
  font-size: var(--wzl-font-size-sm);
212
+ text-overflow: ellipsis;
213
+ white-space: nowrap;
179
214
  }
180
- .fg-css-var {
215
+ .fg-css-vars__controls {
216
+ position: sticky;
217
+ top: 0;
218
+ z-index: 1;
181
219
  display: flex;
182
- align-items: flex-end;
220
+ flex-direction: column;
183
221
  gap: var(--wzl-space-xs);
184
- font-family: var(--wzl-font-mono);
222
+ padding-block-end: var(--wzl-space-xs);
223
+ background: var(--wzl-surface);
185
224
  }
186
- .fg-css-var__rows {
187
- flex: 1;
188
- min-width: 0;
225
+ .fg-css-vars__empty {
226
+ margin: 0;
227
+ color: var(--wzl-fg-muted);
228
+ font-size: var(--wzl-font-size-sm);
189
229
  }
190
230
  .fg-globals {
191
231
  display: flex;
192
232
  align-items: center;
193
233
  gap: var(--wzl-space-xs);
194
234
  }
195
- .fg-globals__select {
235
+ .fg-a11y,
236
+ .fg-a11y-focus {
237
+ display: flex;
238
+ flex-direction: column;
239
+ gap: var(--wzl-space-xs);
240
+ min-width: 0;
241
+ }
242
+ .fg-a11y__trial {
243
+ margin: 0;
244
+ overflow: hidden;
245
+ color: var(--wzl-fg-muted);
246
+ font-size: var(--wzl-font-size-sm);
247
+ text-overflow: ellipsis;
248
+ white-space: nowrap;
249
+ }
250
+ .fg-a11y__controls {
251
+ display: flex;
252
+ gap: var(--wzl-space-xs);
253
+ }
254
+ .fg-a11y__note,
255
+ .fg-a11y__tally {
256
+ margin: 0;
257
+ color: var(--wzl-fg-muted);
258
+ font-size: var(--wzl-font-size-sm);
259
+ font-variant-numeric: tabular-nums;
260
+ }
261
+ .fg-a11y__group {
262
+ display: flex;
263
+ flex-direction: column;
264
+ gap: var(--wzl-space-xs);
265
+ }
266
+ .fg-a11y__group-title {
267
+ margin: 0;
268
+ font-size: var(--wzl-font-size-sm);
269
+ font-variant-numeric: tabular-nums;
270
+ }
271
+ .fg-a11y__findings,
272
+ .fg-a11y__nodes {
273
+ display: flex;
274
+ flex-direction: column;
275
+ gap: var(--wzl-space-xs);
276
+ margin: 0;
277
+ padding: 0;
278
+ list-style: none;
279
+ }
280
+ .fg-a11y__finding {
281
+ border-inline-start: 2px solid var(--wzl-border);
282
+ padding-inline-start: var(--wzl-space-xs);
283
+ }
284
+ .fg-a11y__help {
285
+ display: flex;
286
+ align-items: baseline;
287
+ gap: var(--wzl-space-xs);
288
+ margin: 0;
289
+ font-size: var(--wzl-font-size-sm);
290
+ }
291
+ .fg-a11y__impact {
292
+ color: var(--wzl-fg-muted);
293
+ font-size: var(--wzl-font-size-xs);
294
+ text-transform: uppercase;
295
+ }
296
+ .fg-a11y__impact[data-impact=serious],
297
+ .fg-a11y__impact[data-impact=critical] {
298
+ color: var(--wzl-danger);
299
+ }
300
+ .fg-a11y__nodes {
301
+ color: var(--wzl-fg-muted);
302
+ font-size: var(--wzl-font-size-xs);
303
+ word-break: break-all;
304
+ }
305
+ .fg-info-dialog {
306
+ inline-size: min(52rem, 90vw);
307
+ }
308
+ .fg-info {
309
+ display: flex;
310
+ flex-direction: column;
311
+ gap: var(--wzl-space-md);
312
+ }
313
+ .fg-info__section {
314
+ display: flex;
315
+ flex-direction: column;
316
+ gap: var(--wzl-space-xs);
317
+ }
318
+ .fg-info__heading {
319
+ margin: 0;
320
+ color: var(--wzl-fg-muted);
321
+ font-size: var(--wzl-font-size-xs);
322
+ font-weight: var(--wzl-font-weight-medium);
323
+ text-transform: uppercase;
324
+ letter-spacing: 0.04em;
325
+ }
326
+ .fg-info__doc {
327
+ margin: 0;
328
+ white-space: pre-line;
329
+ }
330
+ .fg-info__doc--component {
331
+ color: var(--wzl-fg-muted);
332
+ font-size: var(--wzl-font-size-sm);
333
+ }
334
+ .fg-info__rows {
335
+ display: grid;
336
+ grid-template-columns: max-content 1fr;
337
+ gap: var(--wzl-space-xs) var(--wzl-space-sm);
338
+ margin: 0;
339
+ font-size: var(--wzl-font-size-sm);
340
+ }
341
+ .fg-info__row {
342
+ display: contents;
343
+ }
344
+ .fg-info__key {
345
+ color: var(--wzl-fg-muted);
346
+ text-align: end;
347
+ }
348
+ .fg-info__value {
349
+ margin: 0;
350
+ min-inline-size: 0;
351
+ overflow-wrap: anywhere;
352
+ }
353
+ .fg-info__path {
354
+ font-size: var(--wzl-font-size-xs);
355
+ }
356
+ .fg-info__args {
357
+ inline-size: 100%;
358
+ border-collapse: collapse;
359
+ font-size: var(--wzl-font-size-sm);
360
+ font-variant-numeric: tabular-nums;
361
+ text-align: start;
362
+ }
363
+ .fg-info__args th,
364
+ .fg-info__args td {
365
+ padding: var(--wzl-space-xs) var(--wzl-space-xs);
366
+ border-block-end: 1px solid var(--wzl-border);
367
+ vertical-align: baseline;
368
+ text-align: start;
369
+ font-weight: var(--wzl-font-weight-normal);
370
+ }
371
+ .fg-info__args thead th {
372
+ color: var(--wzl-fg-muted);
373
+ font-size: var(--wzl-font-size-xs);
374
+ text-transform: uppercase;
375
+ }
376
+ .fg-info__arg-name {
377
+ display: block;
378
+ }
379
+ .fg-info__arg-doc {
380
+ display: block;
381
+ color: var(--wzl-fg-muted);
382
+ font-size: var(--wzl-font-size-xs);
383
+ }
384
+ .fg-info__arg-kind {
385
+ color: var(--wzl-fg-muted);
386
+ }
387
+ .fg-info__value-cell {
388
+ overflow-wrap: anywhere;
389
+ }
390
+ .fg-info__empty {
391
+ margin: 0;
392
+ color: var(--wzl-fg-muted);
196
393
  font-size: var(--wzl-font-size-sm);
197
394
  }
198
395
  /*# sourceMappingURL=index.css.map */
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/shell/shell.css"],"sourcesContent":[".fg-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: var(--wzl-space-xs);\n min-height: 100vh;\n padding-inline: var(--wzl-space-md);\n background: var(--wzl-surface-sunken);\n color: var(--wzl-fg);\n}\n\n.fg-empty__title {\n margin: 0;\n font-weight: var(--wzl-font-weight-bold);\n}\n\n.fg-empty__globs {\n margin: 0;\n padding: 0;\n list-style: none;\n font-family: var(--wzl-font-mono);\n font-size: var(--wzl-font-size-sm);\n}\n\n.fg-frame-host {\n position: relative;\n width: 100%;\n height: 100%;\n}\n\n.fg-frame-view {\n display: block;\n width: 100%;\n height: 100%;\n border: 0;\n}\n\n.fg-fault {\n position: absolute;\n inset: 0;\n display: flex;\n flex-direction: column;\n gap: var(--wzl-space-xs);\n padding: var(--wzl-space-md);\n overflow: auto;\n background: var(--wzl-surface-sunken);\n color: var(--wzl-fg);\n font-family: var(--wzl-font-mono);\n font-size: var(--wzl-font-size-sm);\n}\n\n.fg-fault__phase {\n color: var(--wzl-danger);\n font-weight: var(--wzl-font-weight-bold);\n text-transform: uppercase;\n}\n\n.fg-fault__message {\n margin: 0;\n white-space: pre-wrap;\n}\n\n.fg-tree {\n display: flex;\n flex-direction: column;\n gap: var(--wzl-space-xs);\n padding: 0 var(--wzl-space-xs) var(--wzl-space-xs);\n border-bottom: var(--wzl-border-w) solid var(--wzl-line-subtle);\n color: var(--wzl-fg);\n}\n\n.fg-tree__heading {\n margin: 0;\n padding-block: var(--wzl-space-xs);\n color: var(--wzl-fg-muted);\n font-family: var(--wzl-font-display);\n font-size: var(--wzl-font-size-sm);\n font-weight: var(--wzl-font-weight-normal);\n letter-spacing: 0.08em;\n text-transform: uppercase;\n}\n\n.fg-route-miss {\n margin: 0;\n color: var(--wzl-danger);\n font-size: var(--wzl-font-size-sm);\n}\n\n.fg-tree__filter {\n box-sizing: border-box;\n width: 100%;\n}\n\n.fg-tree__items,\n.fg-tree__group {\n display: flex;\n flex-direction: column;\n}\n\n.fg-tree__items {\n font-size: var(--wzl-font-size-sm);\n}\n\n.fg-tree__group {\n padding-inline-start: var(--wzl-space-sm);\n}\n\n.fg-tree__node {\n display: flex;\n flex-direction: column;\n min-width: 0;\n outline: none;\n}\n\n.fg-tree__item {\n display: flex;\n align-items: center;\n gap: var(--wzl-space-xs);\n padding: calc(var(--wzl-space-xs) / 2) var(--wzl-space-xs);\n border-radius: var(--wzl-radius-sm);\n overflow: hidden;\n color: inherit;\n text-decoration: none;\n white-space: nowrap;\n cursor: pointer;\n}\n\n/* text-overflow does not reach a flex container's anonymous text box, so the label clips itself. */\n.fg-tree__label {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.fg-tree__item:hover {\n background: var(--wzl-surface-hover);\n}\n\n/* A folder item holds its group, so its ring goes on its own row rather than around the subtree. */\n.fg-tree__story:focus-visible,\n.fg-tree__node:focus-visible > .fg-tree__folder {\n outline: var(--wzl-line-width) solid var(--wzl-accent);\n outline-offset: calc(-1 * var(--wzl-line-width));\n}\n\n.fg-tree__item[aria-current='true'] {\n color: var(--wzl-accent);\n}\n\n/* Drawn with borders rather than a glyph, which would join the item's accessible name. */\n.fg-tree__folder::before {\n content: '';\n flex: none;\n width: 0.35em;\n height: 0.35em;\n border: solid currentColor;\n border-width: 0 1.5px 1.5px 0;\n transform: rotate(-45deg);\n}\n\n.fg-tree__node[aria-expanded='true'] > .fg-tree__folder::before {\n transform: rotate(45deg);\n}\n\n.fg-tree__story {\n padding-inline-start: calc(var(--wzl-space-xs) * 2 + 0.35em);\n}\n\n.lk-trial.fg-flash {\n outline: var(--wzl-line-width) solid var(--wzl-accent);\n outline-offset: calc(-1 * var(--wzl-line-width));\n animation: fg-flash 600ms ease-out forwards;\n}\n\n@keyframes fg-flash {\n from {\n outline-color: var(--wzl-accent);\n }\n to {\n outline-color: transparent;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .lk-trial.fg-flash {\n animation: none;\n }\n}\n\n.fg-css-vars {\n display: flex;\n flex-direction: column;\n gap: var(--wzl-space-xs);\n}\n\n.fg-css-vars__list {\n display: flex;\n flex-direction: column;\n gap: var(--wzl-space-xs);\n max-height: 60vh;\n overflow: auto;\n}\n\n.fg-css-vars__empty {\n margin: 0;\n color: var(--wzl-fg-muted);\n font-size: var(--wzl-font-size-sm);\n}\n\n.fg-css-var {\n display: flex;\n align-items: flex-end;\n gap: var(--wzl-space-xs);\n font-family: var(--wzl-font-mono);\n}\n\n.fg-css-var__rows {\n flex: 1;\n min-width: 0;\n}\n\n.fg-globals {\n display: flex;\n align-items: center;\n gap: var(--wzl-space-xs);\n}\n\n.fg-globals__select {\n font-size: var(--wzl-font-size-sm);\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/shell/shell.css"],"sourcesContent":[".fg-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: var(--wzl-space-xs);\n min-height: 100vh;\n padding-inline: var(--wzl-space-md);\n background: var(--wzl-surface-sunken);\n color: var(--wzl-fg);\n}\n\n.fg-empty__title {\n margin: 0;\n font-weight: var(--wzl-font-weight-bold);\n}\n\n.fg-empty__globs {\n margin: 0;\n padding: 0;\n list-style: none;\n font-family: var(--wzl-font-mono);\n font-size: var(--wzl-font-size-sm);\n}\n\n.fg-frame-host {\n position: relative;\n width: 100%;\n height: 100%;\n}\n\n.fg-frame-view {\n display: block;\n width: 100%;\n height: 100%;\n border: 0;\n transition: opacity var(--wzl-motion-fast) var(--wzl-ease-out-cubic);\n}\n\n.fg-frame-view[data-pending] {\n visibility: hidden;\n opacity: 0;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .fg-frame-view {\n transition: none;\n }\n}\n\n.fg-fault {\n position: absolute;\n inset: 0;\n display: flex;\n flex-direction: column;\n gap: var(--wzl-space-xs);\n padding: var(--wzl-space-md);\n overflow: auto;\n background: var(--wzl-surface-sunken);\n color: var(--wzl-fg);\n font-family: var(--wzl-font-mono);\n font-size: var(--wzl-font-size-sm);\n}\n\n.fg-fault__phase {\n color: var(--wzl-danger);\n font-weight: var(--wzl-font-weight-bold);\n text-transform: uppercase;\n}\n\n.fg-fault__message {\n margin: 0;\n white-space: pre-wrap;\n}\n\n.fg-tree {\n display: flex;\n flex-direction: column;\n gap: var(--wzl-space-xs);\n padding: 0 var(--wzl-space-xs) var(--wzl-space-xs);\n border-bottom: var(--wzl-border-w) solid var(--wzl-line-subtle);\n color: var(--wzl-fg);\n}\n\n.fg-tree__heading {\n margin: 0;\n padding-block: var(--wzl-space-xs);\n color: var(--wzl-fg-muted);\n font-family: var(--wzl-font-display);\n font-size: var(--wzl-font-size-sm);\n font-weight: var(--wzl-font-weight-normal);\n letter-spacing: 0.08em;\n text-transform: uppercase;\n}\n\n.fg-route-miss {\n margin: 0;\n color: var(--wzl-danger);\n font-size: var(--wzl-font-size-sm);\n}\n\n.fg-tree__filter {\n box-sizing: border-box;\n width: 100%;\n font-size: var(--wzl-font-size);\n}\n\n.fg-tree__items,\n.fg-tree__group {\n display: flex;\n flex-direction: column;\n}\n\n.fg-tree__items {\n font-size: var(--wzl-font-size);\n}\n\n.fg-tree__group {\n padding-inline-start: var(--wzl-space-sm);\n}\n\n.fg-tree__node {\n display: flex;\n flex-direction: column;\n min-width: 0;\n outline: none;\n}\n\n.fg-tree__item {\n display: flex;\n align-items: center;\n gap: var(--wzl-space-xs);\n padding: calc(var(--wzl-space-xs) / 2) var(--wzl-space-xs);\n border-radius: var(--wzl-radius-sm);\n overflow: hidden;\n color: inherit;\n text-decoration: none;\n white-space: nowrap;\n cursor: pointer;\n}\n\n/* text-overflow does not reach a flex container's anonymous text box, so the label clips itself. */\n.fg-tree__label {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.fg-tree__item:hover {\n background: var(--wzl-surface-hover);\n}\n\n/* Sits after the label, which is the element that shrinks, so the tag keeps\n its width and the rows' tags line up down the column. */\n.fg-tree__tag {\n flex: none;\n margin-inline-start: auto;\n padding: 0 var(--wzl-space-xs);\n border-radius: var(--wzl-radius-sm);\n background: var(--wzl-surface-sunken);\n color: var(--wzl-fg-muted);\n font-size: var(--wzl-font-size-sm);\n}\n\n.fg-tree__libraries {\n display: flex;\n flex-wrap: wrap;\n gap: var(--wzl-space-xs);\n margin: 0;\n padding: 0;\n border: 0;\n}\n\n.fg-tree__libraries-legend {\n padding: 0;\n color: var(--wzl-fg-muted);\n font-size: var(--wzl-font-size-sm);\n}\n\n/* A folder item holds its group, so its ring goes on its own row rather than around the subtree. */\n.fg-tree__story:focus-visible,\n.fg-tree__node:focus-visible > .fg-tree__folder {\n outline: var(--wzl-line-width) solid var(--wzl-accent);\n outline-offset: calc(-1 * var(--wzl-line-width));\n}\n\n.fg-tree__item[aria-current='true'] {\n color: var(--wzl-accent);\n}\n\n/* Drawn with borders rather than a glyph, which would join the item's accessible name. */\n.fg-tree__folder::before {\n content: '';\n flex: none;\n width: 0.35em;\n height: 0.35em;\n border: solid currentColor;\n border-width: 0 1.5px 1.5px 0;\n transform: rotate(-45deg);\n}\n\n.fg-tree__node[aria-expanded='true'] > .fg-tree__folder::before {\n transform: rotate(45deg);\n}\n\n.fg-tree__story {\n padding-inline-start: calc(var(--wzl-space-xs) * 2 + 0.35em);\n}\n\n.lk-trial.fg-flash {\n outline: var(--wzl-line-width) solid var(--wzl-accent);\n outline-offset: calc(-1 * var(--wzl-line-width));\n animation: fg-flash 600ms ease-out forwards;\n}\n\n@keyframes fg-flash {\n from {\n outline-color: var(--wzl-accent);\n }\n to {\n outline-color: transparent;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .lk-trial.fg-flash {\n animation: none;\n }\n}\n\n.fg-css-vars {\n display: flex;\n flex-direction: column;\n gap: var(--wzl-space-xs);\n}\n\n.fg-css-vars-focus {\n display: flex;\n flex-direction: column;\n gap: var(--wzl-space-xs);\n min-width: 0;\n}\n\n.fg-css-vars__trial {\n margin: 0;\n overflow: hidden;\n color: var(--wzl-fg-muted);\n font-size: var(--wzl-font-size-sm);\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n/* Held at the top while the list scrolls the aside under it. */\n.fg-css-vars__controls {\n position: sticky;\n top: 0;\n z-index: 1;\n display: flex;\n flex-direction: column;\n gap: var(--wzl-space-xs);\n padding-block-end: var(--wzl-space-xs);\n background: var(--wzl-surface);\n}\n\n.fg-css-vars__empty {\n margin: 0;\n color: var(--wzl-fg-muted);\n font-size: var(--wzl-font-size-sm);\n}\n\n.fg-globals {\n display: flex;\n align-items: center;\n gap: var(--wzl-space-xs);\n}\n\n\n.fg-a11y,\n.fg-a11y-focus {\n display: flex;\n flex-direction: column;\n gap: var(--wzl-space-xs);\n min-width: 0;\n}\n\n.fg-a11y__trial {\n margin: 0;\n overflow: hidden;\n color: var(--wzl-fg-muted);\n font-size: var(--wzl-font-size-sm);\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.fg-a11y__controls {\n display: flex;\n gap: var(--wzl-space-xs);\n}\n\n.fg-a11y__note,\n.fg-a11y__tally {\n margin: 0;\n color: var(--wzl-fg-muted);\n font-size: var(--wzl-font-size-sm);\n font-variant-numeric: tabular-nums;\n}\n\n.fg-a11y__group {\n display: flex;\n flex-direction: column;\n gap: var(--wzl-space-xs);\n}\n\n.fg-a11y__group-title {\n margin: 0;\n font-size: var(--wzl-font-size-sm);\n font-variant-numeric: tabular-nums;\n}\n\n.fg-a11y__findings,\n.fg-a11y__nodes {\n display: flex;\n flex-direction: column;\n gap: var(--wzl-space-xs);\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n.fg-a11y__finding {\n border-inline-start: 2px solid var(--wzl-border);\n padding-inline-start: var(--wzl-space-xs);\n}\n\n.fg-a11y__help {\n display: flex;\n align-items: baseline;\n gap: var(--wzl-space-xs);\n margin: 0;\n font-size: var(--wzl-font-size-sm);\n}\n\n.fg-a11y__impact {\n color: var(--wzl-fg-muted);\n font-size: var(--wzl-font-size-xs);\n text-transform: uppercase;\n}\n\n.fg-a11y__impact[data-impact='serious'],\n.fg-a11y__impact[data-impact='critical'] {\n color: var(--wzl-danger);\n}\n\n.fg-a11y__nodes {\n color: var(--wzl-fg-muted);\n font-size: var(--wzl-font-size-xs);\n word-break: break-all;\n}\n\n/* Get Info */\n\n.fg-info-dialog {\n /* Wide enough for the longest row a dossier carries — an absolute story file\n path — to sit on one line. */\n inline-size: min(52rem, 90vw);\n}\n\n.fg-info {\n display: flex;\n flex-direction: column;\n gap: var(--wzl-space-md);\n}\n\n.fg-info__section {\n display: flex;\n flex-direction: column;\n gap: var(--wzl-space-xs);\n}\n\n.fg-info__heading {\n margin: 0;\n color: var(--wzl-fg-muted);\n font-size: var(--wzl-font-size-xs);\n font-weight: var(--wzl-font-weight-medium);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n}\n\n.fg-info__doc {\n margin: 0;\n white-space: pre-line;\n}\n\n.fg-info__doc--component {\n color: var(--wzl-fg-muted);\n font-size: var(--wzl-font-size-sm);\n}\n\n.fg-info__rows {\n display: grid;\n grid-template-columns: max-content 1fr;\n gap: var(--wzl-space-xs) var(--wzl-space-sm);\n margin: 0;\n font-size: var(--wzl-font-size-sm);\n}\n\n.fg-info__row {\n display: contents;\n}\n\n.fg-info__key {\n color: var(--wzl-fg-muted);\n text-align: end;\n}\n\n.fg-info__value {\n margin: 0;\n min-inline-size: 0;\n overflow-wrap: anywhere;\n}\n\n.fg-info__path {\n font-size: var(--wzl-font-size-xs);\n}\n\n.fg-info__args {\n inline-size: 100%;\n border-collapse: collapse;\n font-size: var(--wzl-font-size-sm);\n font-variant-numeric: tabular-nums;\n text-align: start;\n}\n\n.fg-info__args th,\n.fg-info__args td {\n padding: var(--wzl-space-xs) var(--wzl-space-xs);\n border-block-end: 1px solid var(--wzl-border);\n vertical-align: baseline;\n text-align: start;\n font-weight: var(--wzl-font-weight-normal);\n}\n\n.fg-info__args thead th {\n color: var(--wzl-fg-muted);\n font-size: var(--wzl-font-size-xs);\n text-transform: uppercase;\n}\n\n.fg-info__arg-name {\n display: block;\n}\n\n.fg-info__arg-doc {\n display: block;\n color: var(--wzl-fg-muted);\n font-size: var(--wzl-font-size-xs);\n}\n\n.fg-info__arg-kind {\n color: var(--wzl-fg-muted);\n}\n\n.fg-info__value-cell {\n overflow-wrap: anywhere;\n}\n\n.fg-info__empty {\n margin: 0;\n color: var(--wzl-fg-muted);\n font-size: var(--wzl-font-size-sm);\n}\n"],"mappings":"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","names":[]}