@weasel-js/forge 1.7.0 → 1.7.1

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/shell/a11y/A11yPanel.tsx","../../src/shell/storyChanges.ts","../../src/shell/dependencies.ts","../../src/shell/cssVars/saveScales.ts","../../src/shell/cssVars/CssVarsPanel.tsx","../../src/shell/breadcrumb.ts","../../src/shell/info/dossier.ts","../../src/shell/info/StoryDossier.tsx","../../src/shell/info/StoryInfoDialog.tsx","../../src/shell/framePool.ts","../../src/shell/GlobalsToolbar.tsx","../../src/shell/revealTrial.ts","../../src/shell/useRoute.ts","../../src/shell/tree/buildTree.ts","../../src/shell/tree/buildComponents.ts","../../src/shell/tree/StoryTree.tsx","../../src/shell/answers.ts","../../src/shell/IndexTrial.tsx","../../src/shell/documentInstrument.tsx","../../src/shell/readyKey.ts","../../src/shell/FrameView.tsx","../../src/shell/storyInstrument.tsx","../../src/shell/useStoryRegistry.ts","../../src/shell/Workshop.tsx","../../src/shell/mountWorkshop.tsx"],"names":["generateScale","f","useTrialId","useState","jsxs","jsx","ToggleBar","Button","useLabContext","labGlobals","TrialIdContext","handle","createContext","usePersistedState","useMemo","useCallback","useRef","Fragment","useEffect","LibraryBadge","setRoute","rest","row","keyOf","useContext","settle","answers","NO_GLOBALS","ids"],"mappings":"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","file":"index.js","sourcesContent":["import {\n Button,\n type LabContribution,\n TrialIdContext,\n useLabContext,\n useTrialId,\n} from '@weasel-js/labkit';\nimport { useEffect, useRef, useState } from 'react';\nimport type { A11yFinding } from '../../protocol/messages';\nimport { useTrialFrame } from '../trialFrames';\n\nfunction Finding({ finding }: { finding: A11yFinding }) {\n return (\n <li className=\"fg-a11y__finding\">\n <p className=\"fg-a11y__help\">\n <a href={finding.helpUrl} target=\"_blank\" rel=\"noreferrer\">\n {finding.help}\n </a>\n {finding.impact ? <span className=\"fg-a11y__impact\" data-impact={finding.impact}>{finding.impact}</span> : null}\n </p>\n <ul className=\"fg-a11y__nodes\">\n {finding.nodes.map((node) => (\n <li key={`${finding.id}:${node.target.join(',')}`}>\n <code>{node.target.join(' ')}</code>\n </li>\n ))}\n </ul>\n </li>\n );\n}\n\nfunction Findings({ title, findings }: { title: string; findings: readonly A11yFinding[] }) {\n if (findings.length === 0) return null;\n return (\n <section className=\"fg-a11y__group\">\n <h3 className=\"fg-a11y__group-title\">\n {title} ({findings.length})\n </h3>\n <ul className=\"fg-a11y__findings\">\n {findings.map((finding) => (\n <Finding key={finding.id} finding={finding} />\n ))}\n </ul>\n </section>\n );\n}\n\n/** What axe found in the story of the trial this is rendered inside, re-run on demand. */\nexport function A11yPanel() {\n const trialId = useTrialId();\n const frame = useTrialFrame(trialId);\n const [running, setRunning] = useState(false);\n const audit = frame.audit;\n // One automatic run per connected frame, so opening the panel answers without being asked.\n const ran = useRef<typeof audit>(null);\n\n useEffect(() => {\n if (!audit || ran.current === audit) return;\n ran.current = audit;\n setRunning(true);\n void audit().finally(() => setRunning(false));\n }, [audit]);\n\n const rerun = () => {\n if (!audit) return;\n setRunning(true);\n void audit().finally(() => setRunning(false));\n };\n\n const outcome = frame.a11y;\n return (\n <div className=\"fg-a11y\">\n <div className=\"fg-a11y__controls\">\n <Button size=\"sm\" variant=\"secondary\" onClick={rerun} disabled={!audit || running}>\n {running ? 'Checking…' : 'Re-check'}\n </Button>\n </div>\n {!audit ? <p className=\"fg-a11y__note\">No frame is connected.</p> : null}\n {audit && !outcome ? <p className=\"fg-a11y__note\">{running ? 'Running axe…' : 'Not checked yet.'}</p> : null}\n {outcome && !outcome.ok ? (\n <p className=\"fg-a11y__note\" role=\"alert\">\n axe could not run: {outcome.message}\n </p>\n ) : null}\n {outcome?.ok ? (\n <>\n <p className=\"fg-a11y__tally\">\n {outcome.report.violations.length} violations · {outcome.report.incomplete.length} to review ·{' '}\n {outcome.report.passes} passes\n </p>\n <Findings title=\"Violations\" findings={outcome.report.violations} />\n <Findings title=\"Needs review\" findings={outcome.report.incomplete} />\n </>\n ) : null}\n </div>\n );\n}\n\n/** The panel for the lab's focused trial, rendered as though inside that trial. */\nfunction FocusedA11y() {\n const { focusedTrialId, trials, instruments } = useLabContext();\n const record = trials.find((trial) => trial.id === focusedTrialId);\n if (!record) return null;\n const instrument = instruments.find((i) => i.name === record.instrumentName);\n return (\n <section className=\"fg-a11y-focus\" aria-label=\"Accessibility\">\n <p className=\"fg-a11y__trial\">{record.title ?? instrument?.title ?? record.instrumentName}</p>\n <TrialIdContext.Provider value={record.id}>\n <A11yPanel />\n </TrialIdContext.Provider>\n </section>\n );\n}\n\nexport const A11Y_SECTION: LabContribution = {\n id: 'fg-a11y',\n region: 'aside',\n item: { title: 'Accessibility', body: <FocusedA11y /> },\n};\n","/** Story files edited while the workshop runs, for the registry to load again. */\nexport interface StoryChanges {\n subscribe(listener: (file: string) => void): () => void;\n emit(file: string): void;\n}\n\nexport function createStoryChanges(): StoryChanges {\n const listeners = new Set<(file: string) => void>();\n return {\n subscribe(listener) {\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n emit(file) {\n for (const listener of [...listeners]) listener(file);\n },\n };\n}\n","import { createContext } from 'react';\nimport type { DepGraph } from '../story/types';\n\n/** The component graph the vite plugin derived from source; null until it arrives. */\nexport const DependenciesContext = createContext<DepGraph | null>(null);\n","import type { TokenScaleRule } from '@weasel-js/labkit';\nimport { isByAxis, type AxisDefs, type Selection, type ThemeDefinition } from '@weasel-js/theme';\nimport type { Globals } from '../../protocol/messages';\n\n/** A scale as the panel left it: what a save writes into the definition. */\nexport interface ScaleEdit {\n readonly base: number;\n readonly rule: TokenScaleRule;\n}\n\nexport type ScaleEditResult =\n | { readonly ok: true; readonly definition: ThemeDefinition }\n | { readonly ok: false; readonly message: string };\n\ntype Holder = Record<string | number, unknown>;\n\ninterface Slot {\n readonly holder: Holder;\n readonly key: string | number;\n /** Where the slot is, for a message: `scales.font-size.base`, `seeds.ui-base.compact`. */\n readonly where: string;\n}\n\nconst SEED_REF = /^\\{seeds\\.([^}]+)\\}$/;\nconst RULE_KEYS = { factors: 'factors', ratio: 'ratio', step: 'step' } as const;\n\n/**\n * The axis values a trial renders under, from the workshop's globals: a global named for an axis picks its value; an\n * axis no global names renders at its default. A global holding something the axis does not offer (`mode: 'auto'`)\n * leaves that axis out, because which value it resolved to is not known here.\n */\nexport function selectionFor(axes: AxisDefs, globals: Globals): Selection {\n const out: Record<string, string> = {};\n for (const [axis, def] of Object.entries(axes)) {\n const value = globals[axis];\n if (value === undefined) out[axis] = def.default;\n else if (typeof value === 'string' && value in def.values) out[axis] = value;\n }\n return out;\n}\n\nclass EditError extends Error {}\n\n/** Follows a param through its per-axis branches and `{seeds.name}` references to the number that defines it. */\nfunction slotOf(root: ThemeDefinition, holder: Holder, key: string | number, where: string, selection: Selection, depth = 0): Slot {\n if (depth > 16) throw new EditError(`${where} references itself`);\n let h = holder;\n let k = key;\n let w = where;\n let value = h[k];\n while (isByAxis(value)) {\n const axis = value.by;\n const picked = selection[axis];\n if (picked === undefined || picked === 'by' || !(picked in value)) {\n throw new EditError(`${w} differs by ${axis}, and which ${axis} this trial shows is not known`);\n }\n h = value as unknown as Holder;\n k = picked;\n w = `${w}.${picked}`;\n value = h[k];\n }\n if (typeof value === 'number') return { holder: h, key: k, where: w };\n if (typeof value === 'string') {\n const ref = SEED_REF.exec(value);\n if (!ref) throw new EditError(`${w} is \"${value}\", which is not a number or a seed`);\n const name = ref[1]!;\n const seeds = root.seeds as Holder | undefined;\n if (!seeds || !(name in seeds)) throw new EditError(`${w} names the seed \"${name}\", which this theme inherits rather than defines`);\n return slotOf(root, seeds, name, `seeds.${name}`, selection, depth + 1);\n }\n throw new EditError(`${w} is not a number`);\n}\n\n/** The factor list the selection reads, through any per-axis branches. */\nfunction factorsOf(holder: Holder, where: string, selection: Selection): { list: Holder; where: string } {\n let value = holder.factors;\n let w = `${where}.factors`;\n while (isByAxis(value)) {\n const picked = selection[value.by];\n if (picked === undefined || !(picked in value)) {\n throw new EditError(`${w} differs by ${value.by}, and which ${value.by} this trial shows is not known`);\n }\n w = `${w}.${picked}`;\n value = (value as unknown as Holder)[picked];\n }\n if (!Array.isArray(value)) throw new EditError(`${w} is not a list`);\n return { list: value as unknown as Holder, where: w };\n}\n\nconst kindOf = (scale: Holder): TokenScaleRule['kind'] | null =>\n scale.factors !== undefined ? 'factors' : scale.ratio !== undefined ? 'ratio' : scale.step !== undefined ? 'step' : null;\n\nconst plainLiteral = (value: unknown): boolean =>\n typeof value === 'number' || (Array.isArray(value) && value.every((v) => typeof v === 'number'));\n\n/** Swaps `scale`'s rule key for another in place, in the same position, since record order is emission order. */\nfunction swapRule(scale: Holder, from: string | null, to: string, value: unknown): void {\n const entries = Object.entries(scale);\n for (const [k] of entries) delete scale[k];\n for (const [k, v] of entries) scale[k === from ? to : k] = k === from ? value : v;\n if (from === null) scale[to] = value;\n}\n\n/**\n * `definition` with each edited scale written back. A number the scale reads through a reference or a per-axis branch\n * is written where it lives — `{seeds.ui-base}` changes the seed, and only the branch for `selection` — so every other\n * axis value keeps its own. Changing a scale's rule kind replaces the rule, which is refused when the old one was\n * anything but a plain literal, since that would flatten it.\n */\nexport function applyScaleEdits(\n definition: ThemeDefinition,\n edits: Readonly<Record<string, ScaleEdit>>,\n selection: Selection,\n): ScaleEditResult {\n const root = structuredClone(definition) as ThemeDefinition & { scales?: Record<string, Holder> };\n const writes = new Map<Holder, Map<string | number, number>>();\n const write = (slot: Slot, value: number) => {\n let byKey = writes.get(slot.holder);\n if (!byKey) writes.set(slot.holder, (byKey = new Map()));\n const pending = byKey.get(slot.key);\n if (pending !== undefined && pending !== value) throw new EditError(`${slot.where} would need to be both ${pending} and ${value}`);\n byKey.set(slot.key, value);\n };\n\n try {\n for (const [name, edit] of Object.entries(edits)) {\n const scales = root.scales;\n const scale = scales?.[name];\n if (!scales || !scale) throw new EditError(`the theme defines no scale \"${name}\"`);\n const where = `scales.${name}`;\n write(slotOf(root, scale, 'base', `${where}.base`, selection), edit.base);\n\n const { rule } = edit;\n const had = kindOf(scale);\n if (had !== rule.kind) {\n const from = had ? RULE_KEYS[had] : null;\n if (from && !plainLiteral(scale[from])) {\n throw new EditError(`${where} would lose its ${from} to become a ${rule.kind} scale, and its ${from} is not a plain number`);\n }\n const value = rule.kind === 'factors' ? [...rule.factors] : rule.kind === 'ratio' ? rule.ratio : rule.step;\n swapRule(scale, from, RULE_KEYS[rule.kind], value);\n continue;\n }\n if (rule.kind === 'factors') {\n const { list, where: at } = factorsOf(scale, where, selection);\n if ((list as unknown as unknown[]).length !== rule.factors.length) {\n throw new EditError(`${at} has ${(list as unknown as unknown[]).length} factors, and the edit ${rule.factors.length}`);\n }\n rule.factors.forEach((factor, i) => write(slotOf(root, list, i, `${at}.${i}`, selection), factor));\n } else {\n const key = RULE_KEYS[rule.kind];\n write(slotOf(root, scale, key, `${where}.${key}`, selection), rule.kind === 'ratio' ? rule.ratio : rule.step);\n }\n }\n } catch (e) {\n if (e instanceof EditError) return { ok: false, message: `Cannot save: ${e.message}.` };\n throw e;\n }\n\n for (const [holder, byKey] of writes) for (const [key, value] of byKey) holder[key] = value;\n return { ok: true, definition: root };\n}\n","import {\n Input,\n inferTokenType,\n type LabContribution,\n ToggleBar,\n type ToggleBarItem,\n refitScale,\n type TokenCategory,\n type TokenEntry,\n TokenPanel,\n type TokenScale,\n type TokenScaleRule,\n TrialIdContext,\n useLabContext,\n usePersistedState,\n useTrialId,\n} from '@weasel-js/labkit';\nimport { THEME_SOURCES, TOKEN_MANIFEST } from '@weasel-js/theme';\nimport { scale as generateScale, httpThemeApi, type ThemeApi } from '@weasel-js/theme/engine';\nimport { Button } from '@weasel-js/ui';\nimport { useCallback, useContext, useMemo, useState } from 'react';\nimport type { Globals } from '../../protocol/messages';\nimport { effectiveGlobals, GLOBALS_KEY } from '../globals';\nimport { StoryGlobalsContext } from '../StoryGlobalsContext';\nimport { useTrialFrame } from '../trialFrames';\nimport { useCssOverrides } from './overrides';\nimport { applyScaleEdits, type ScaleEdit, selectionFor } from './saveScales';\n\ntype Tab = 'theme' | 'story';\n\nconst TABS: readonly ToggleBarItem<Tab>[] = [\n { value: 'theme', label: 'Theme' },\n { value: 'story', label: 'Story' },\n];\n\nconst MANIFEST = new Map(TOKEN_MANIFEST.map((token) => [token.name, token]));\n\nconst THEME_NAME = 'weasel';\n\ninterface ScaleSource {\n readonly name: string;\n readonly group: string;\n readonly steps: readonly string[];\n readonly tokens: readonly string[];\n /** The definition's rule, or its kind alone when a parameter is a reference or varies by axis. */\n readonly rule: TokenScaleRule | TokenScaleRule['kind'];\n}\n\nconst literal = (v: unknown): v is number => typeof v === 'number';\n\n/** The weasel theme's scales, as the panel can regenerate them. */\nconst SCALE_SOURCES: readonly ScaleSource[] = Object.entries(THEME_SOURCES[THEME_NAME]?.scales ?? {}).flatMap(([name, def]) => {\n if (!Array.isArray(def.steps)) return [];\n const steps = def.steps as readonly string[];\n const tokens = steps.map((step) => `--wzl-${name}-${step}`);\n const group = MANIFEST.get(tokens[0] ?? '')?.group;\n if (!group) return [];\n const factors = Array.isArray(def.factors) && def.factors.every(literal) ? (def.factors as number[]) : null;\n const rule: ScaleSource['rule'] =\n def.factors !== undefined\n ? factors\n ? { kind: 'factors', factors }\n : 'factors'\n : def.ratio !== undefined\n ? literal(def.ratio)\n ? { kind: 'ratio', ratio: def.ratio }\n : 'ratio'\n : literal(def.step)\n ? { kind: 'step', step: def.step }\n : 'step';\n return [{ name, group, steps, tokens, rule }];\n});\n\n/** Each of a scale's tokens and the value `next` gives it. */\nfunction scaleValues(source: ScaleSource, next: TokenScale): [string, string][] {\n const { rule } = next;\n const values = generateScale(source.steps, {\n base: next.base,\n ...(rule.kind === 'factors' ? { factors: rule.factors } : rule.kind === 'ratio' ? { ratio: rule.ratio } : { step: rule.step }),\n });\n return source.steps.flatMap((step, i) => {\n const value = values[step];\n const name = source.tokens[i];\n return value !== undefined && name !== undefined ? [[name, value]] : [];\n });\n}\n\ntype Notice = { readonly trialId: string | null; readonly tone: 'saved' | 'error'; readonly text: string };\n\n/** A scale as its steps stand: the definition's rule, with the base read back from the values the frame reports. */\nfunction standingScale(source: ScaleSource, amounts: readonly number[]): TokenScale {\n const seed: TokenScale = { tokens: source.tokens, base: amounts[0] ?? 0, rule: { kind: 'step', step: 0 } };\n if (typeof source.rule === 'string') return refitScale(seed, source.rule, amounts);\n const { rule } = source;\n if (rule.kind !== 'factors') return { ...seed, rule };\n // The step nearest ×1 carries the least rounding back into the base.\n let at = 0;\n rule.factors.forEach((f, i) => {\n if (Math.abs(f - 1) < Math.abs((rule.factors[at] ?? 1) - 1)) at = i;\n });\n const base = (amounts[at] ?? 0) / (rule.factors[at] ?? 1);\n return { ...seed, base: Math.round(base * 100) / 100, rule };\n}\n\n/** A reported var's group: its name without the leading dashes or its last segment, which names the step. */\nfunction groupOf(name: string): string {\n const segments = name.replace(/^--/, '').split('-');\n return segments.length > 1 ? segments.slice(0, -1).join('-') : name.replace(/^--/, '');\n}\n\nexport interface CssVarsPanelProps {\n /** The globals the trial renders under, which pick the axis values a save writes into. */\n readonly globals?: Globals;\n /** Where a save goes. Defaults to the dev server's theme store. */\n readonly themeApi?: ThemeApi;\n}\n\nconst NO_GLOBALS: Globals = {};\n\n/**\n * Shows and overrides the CSS variables of the trial it is rendered inside: the theme's tokens, or what its frame\n * reports. Scale edits can be saved into the theme's definition file.\n */\nexport function CssVarsPanel({ globals = NO_GLOBALS, themeApi }: CssVarsPanelProps = {}) {\n const trialId = useTrialId();\n const frame = useTrialFrame(trialId);\n const [overrides, setOverrides] = useCssOverrides();\n const [folds, setFolds] = usePersistedState<Partial<Record<TokenCategory, boolean>>>(\n 'fg-css-vars-folds',\n {},\n { scope: 'lab' },\n );\n const [edited, setEdited] = usePersistedState<Record<string, TokenScale>>('fg-css-vars-scales', {}, { scope: 'lab' });\n const [tab, setTab] = useState<Tab>('theme');\n const [filter, setFilter] = useState('');\n\n const tokens = useMemo<TokenEntry[]>(() => {\n if (tab === 'story') {\n return frame.vars.map(({ name, value }) => {\n const known = MANIFEST.get(name);\n return { name, type: known?.type ?? inferTokenType(value), group: known?.group ?? groupOf(name), value };\n });\n }\n const reported = new Map(frame.vars.map((v) => [v.name, v.value]));\n return TOKEN_MANIFEST.map((token) => ({\n name: token.name,\n type: token.type,\n group: token.group,\n value: reported.get(token.name) ?? token.defaultValue,\n description: token.description,\n }));\n }, [tab, frame.vars]);\n\n const query = filter.trim().toLowerCase();\n const shown = tokens\n .map((token) => {\n const override = overrides[token.name];\n return override === undefined ? token : { ...token, value: override, overridden: true };\n })\n .filter((token) => !query || token.name.toLowerCase().includes(query) || token.value.toLowerCase().includes(query));\n\n const scales = useMemo(() => {\n if (tab !== 'theme') return undefined;\n const values = new Map(shown.map((t) => [t.name, t.value]));\n const out: Record<string, TokenScale> = {};\n for (const source of SCALE_SOURCES) {\n const amounts = source.tokens.map((name) => Number.parseFloat(values.get(name) ?? ''));\n if (amounts.some(Number.isNaN)) continue;\n const own = source.tokens.some((name) => overrides[name] !== undefined) ? edited[source.group] : undefined;\n out[source.group] = own ?? standingScale(source, amounts);\n }\n return out;\n }, [tab, shown, overrides, edited]);\n\n const send = frame.send;\n const write = useCallback(\n (name: string, value: string | null) => {\n setOverrides((prev) => {\n const { [name]: _dropped, ...rest } = prev;\n return value === null ? rest : { ...rest, [name]: value };\n });\n send?.({ type: 'vars.set', name, value });\n },\n [setOverrides, send],\n );\n const onScaleChange = useCallback(\n (group: string, next: TokenScale) => {\n const source = SCALE_SOURCES.find((sc) => sc.group === group);\n if (!source) return;\n setEdited((prev) => ({ ...prev, [group]: next }));\n for (const [name, value] of scaleValues(source, next)) write(name, value);\n },\n [setEdited, write],\n );\n\n // A scale is saved only while every one of its steps still holds what its edit generated: a step edited by hand\n // after the scale is an override the definition has no place for.\n const unsaved = useMemo(\n () =>\n SCALE_SOURCES.flatMap((source) => {\n const edit = edited[source.group];\n if (!edit || !source.tokens.some((name) => overrides[name] !== undefined)) return [];\n const values = scaleValues(source, edit);\n return values.every(([name, value]) => overrides[name] === value) ? [{ source, edit }] : [];\n }),\n [edited, overrides],\n );\n const [saving, setSaving] = useState(false);\n const [held, setHeld] = useState<Notice | null>(null);\n const notice = held?.trialId === trialId ? held : null;\n const setNotice = (next: Omit<Notice, 'trialId'> | null) => setHeld(next && { ...next, trialId });\n const save = async () => {\n setSaving(true);\n setNotice(null);\n try {\n const api = themeApi ?? httpThemeApi();\n const stored = await api.get(THEME_NAME);\n const file = `themes/${THEME_NAME}.json`;\n if (JSON.stringify(stored.definition) !== JSON.stringify(THEME_SOURCES[THEME_NAME])) {\n setNotice({ tone: 'error', text: `${file} has changed since this page loaded. Reload to edit against it.` });\n return;\n }\n const edits: Record<string, ScaleEdit> = Object.fromEntries(\n unsaved.map(({ source, edit }) => [source.name, { base: edit.base, rule: edit.rule }]),\n );\n const next = applyScaleEdits(stored.definition, edits, selectionFor(stored.definition.axes ?? {}, globals));\n if (!next.ok) {\n setNotice({ tone: 'error', text: next.message });\n return;\n }\n const result = await api.put(THEME_NAME, next.definition, stored.hash);\n if (result.status === 'conflict') {\n setNotice({ tone: 'error', text: `${file} changed on disk while saving. Nothing was written; reload to edit against it.` });\n return;\n }\n if (result.status === 'invalid') {\n setNotice({ tone: 'error', text: result.message });\n return;\n }\n for (const { source } of unsaved) for (const name of source.tokens) write(name, null);\n const groups = new Set(unsaved.map(({ source }) => source.group));\n setEdited((prev) => Object.fromEntries(Object.entries(prev).filter(([group]) => !groups.has(group))));\n setNotice(\n result.regenerated || result.problems.length === 0\n ? { tone: 'saved', text: `Saved to ${file}.` }\n : { tone: 'error', text: `Saved to ${file}, but the tokens were not regenerated: ${result.problems.join('; ')}` },\n );\n } catch (e) {\n setNotice({ tone: 'error', text: `Saving needs forge's dev server, which did not answer: ${(e as Error).message}` });\n } finally {\n setSaving(false);\n }\n };\n const onCollapsedChange = useCallback(\n (category: TokenCategory, collapsed: boolean) => setFolds((prev) => ({ ...prev, [category]: collapsed })),\n [setFolds],\n );\n\n return (\n <div className=\"fg-css-vars\">\n <div className=\"fg-css-vars__controls\">\n <ToggleBar\n ariaLabel=\"Variables\"\n variant=\"flat\"\n items={TABS}\n value={tab}\n onChange={(next) => {\n if (next) setTab(next);\n }}\n />\n <Input aria-label=\"Filter\" placeholder=\"Filter by name or value\" value={filter} onChange={setFilter} />\n {tab === 'theme' && (unsaved.length > 0 || notice) ? (\n <div className=\"fg-css-vars__save\">\n {unsaved.length > 0 ? (\n <Button variant=\"primary\" size=\"sm\" loading={saving} disabled={saving} onClick={() => void save()}>\n Save scales to theme\n </Button>\n ) : null}\n {notice ? (\n <p\n className={`fg-css-vars__notice fg-css-vars__notice--${notice.tone}`}\n role={notice.tone === 'error' ? 'alert' : 'status'}\n >\n {notice.text}\n </p>\n ) : null}\n </div>\n ) : null}\n </div>\n {shown.length === 0 ? (\n <p className=\"fg-css-vars__empty\">\n {tokens.length === 0 ? 'The story’s frame has reported no variables.' : 'No variables match.'}\n </p>\n ) : (\n <TokenPanel\n tokens={shown}\n onChange={write}\n scales={scales}\n onScaleChange={onScaleChange}\n collapsed={folds}\n onCollapsedChange={onCollapsedChange}\n />\n )}\n </div>\n );\n}\n\n/** The panel for the lab's focused trial, rendered as though inside that trial. */\nfunction FocusedCssVars() {\n const { focusedTrialId, trials, instruments } = useLabContext();\n const labGlobals = useContext(StoryGlobalsContext);\n const record = trials.find((trial) => trial.id === focusedTrialId);\n if (!record) return null;\n const pins = (record.config as Record<string, unknown> | null | undefined)?.[GLOBALS_KEY];\n const instrument = instruments.find((i) => i.name === record.instrumentName);\n return (\n <section className=\"fg-css-vars-focus\" aria-label=\"CSS Vars\">\n <p className=\"fg-css-vars__trial\">{record.title ?? instrument?.title ?? record.instrumentName}</p>\n <TrialIdContext.Provider value={record.id}>\n <CssVarsPanel globals={effectiveGlobals(labGlobals, pins)} />\n </TrialIdContext.Provider>\n </section>\n );\n}\n\nexport const CSS_VARS_SECTION: LabContribution = {\n id: 'fg-css-vars',\n region: 'aside',\n item: { title: 'CSS Vars', body: <FocusedCssVars /> },\n};\n","/** A story's place as one line: each title segment, then the story's name. An `index` segment adds nothing the\n * one before it does not already say, so it is left out. */\nexport function breadcrumb(title: string, name: string): string {\n const segments = [...title.split('/'), name].filter((segment, i) => i === 0 || segment.toLowerCase() !== 'index');\n return segments.join(' > ');\n}\n","import type { Instrument } from '@weasel-js/labkit';\nimport { type ConfigNode, type ConfigShape, isConfigBranch, valueAtPath } from '@weasel-js/labkit/config';\nimport type { IndexEntry } from '../../story/types';\nimport { libraryOf } from '../../story/library';\n\n/** One prop of the story, as the dossier prints it. */\nexport interface DossierArg {\n /** Dotted path within the schema — what the value is written at. */\n path: string;\n /** The author's `argTypes` name, else the path's last segment. */\n label: string;\n /** The control kind labkit resolved, or null while rules have not run. */\n kind: string | null;\n default: unknown;\n /** The focused trial's value, which is `default` until someone edits it. */\n value: unknown;\n description?: string;\n}\n\n/** Everything Get Info prints about one story. */\nexport interface Dossier {\n id: string;\n title: string;\n name: string;\n exportName: string;\n file: string;\n /** Which package the story file lives in. */\n library: string;\n componentName?: string;\n description?: string;\n componentDescription?: string;\n args: DossierArg[];\n /** The story's frame has not reported its schema yet, so an empty `args`\n * means \"not loaded\" rather than \"takes none\". */\n argsPending: boolean;\n}\n\n/** The group forge hides the lab's globals in. Those are the lab's settings,\n * not the story's props, and the dossier is about the story. */\nconst GLOBALS = '$globals';\n\n/** Every visible leaf of `shape`, depth first, carrying its dotted path. */\nfunction leaves(shape: ConfigShape, prefix = ''): { path: string; node: ConfigNode }[] {\n const out: { path: string; node: ConfigNode }[] = [];\n for (const [key, entry] of Object.entries(shape)) {\n if (prefix === '' && key === GLOBALS) continue;\n const path = prefix ? `${prefix}.${key}` : key;\n if (isConfigBranch(entry)) out.push(...leaves(entry.children, path));\n else if (!entry.annotations.hidden) out.push({ path, node: entry });\n }\n return out;\n}\n\n/**\n * The dossier for one story. A pure function of the records the shell already\n * holds: the index entry, the instrument built from the story's `ready`\n * message, and the focused trial's config. An instrument exists before its\n * frame reports anything, and its schema is empty until then — so `ready`\n * decides whether an empty `args` reads as pending or as none.\n */\nexport function storyDossier(input: {\n entry: IndexEntry;\n instrument?: Instrument<unknown, unknown> | undefined;\n config?: unknown;\n ready?: boolean;\n}): Dossier {\n const { entry, instrument, config, ready = true } = input;\n const schema = ready ? instrument?.config : undefined;\n const args = schema\n ? leaves(schema.nodes).map(({ path, node }): DossierArg => {\n const value = valueAtPath(config, path);\n return {\n path,\n label: node.annotations.name ?? path.split('.').pop() ?? path,\n kind: node.kind,\n default: node.default,\n value: value === undefined ? node.default : value,\n ...(node.annotations.description === undefined\n ? {}\n : { description: node.annotations.description }),\n };\n })\n : [];\n return {\n id: entry.id,\n title: entry.title,\n name: entry.name,\n exportName: entry.exportName,\n file: entry.file,\n library: libraryOf(entry),\n ...(entry.componentName === undefined ? {} : { componentName: entry.componentName }),\n ...(entry.description === undefined ? {} : { description: entry.description }),\n ...(entry.componentDescription === undefined\n ? {}\n : { componentDescription: entry.componentDescription }),\n args,\n argsPending: !schema,\n };\n}\n","import type { Dossier, DossierArg } from './dossier';\n\n/** A value as the dossier prints it: quoted strings, `—` for nothing. */\nfunction printed(value: unknown): string {\n if (value === undefined || value === null) return '—';\n if (typeof value === 'string') return value === '' ? '\"\"' : value;\n if (typeof value === 'function') return 'ƒ';\n if (typeof value === 'object') return JSON.stringify(value);\n return String(value);\n}\n\nfunction Row({ label, children }: { label: string; children: React.ReactNode }) {\n return (\n <div className=\"fg-info__row\">\n <dt className=\"fg-info__key\">{label}</dt>\n <dd className=\"fg-info__value\">{children}</dd>\n </div>\n );\n}\n\nfunction ArgRows({ args }: { args: readonly DossierArg[] }) {\n return (\n <table className=\"fg-info__args\">\n <thead>\n <tr>\n <th scope=\"col\">Name</th>\n <th scope=\"col\">Kind</th>\n <th scope=\"col\">Value</th>\n <th scope=\"col\">Default</th>\n </tr>\n </thead>\n <tbody>\n {args.map((arg) => (\n <tr key={arg.path}>\n <th scope=\"row\">\n <span className=\"fg-info__arg-name\">{arg.label}</span>\n {arg.description ? <span className=\"fg-info__arg-doc\">{arg.description}</span> : null}\n </th>\n <td className=\"fg-info__arg-kind\">{arg.kind ?? '—'}</td>\n <td className=\"fg-info__value-cell\">{printed(arg.value)}</td>\n <td className=\"fg-info__value-cell\">{printed(arg.default)}</td>\n </tr>\n ))}\n </tbody>\n </table>\n );\n}\n\n/**\n * The Get Info dossier, rendered. Presentation only: it reads no lab context\n * and owns no open state, so a dialog and a sidebar section can each host it\n * without either one knowing about the other.\n */\nexport function StoryDossier({ dossier }: { dossier: Dossier }) {\n return (\n <div className=\"fg-info\">\n {dossier.description || dossier.componentDescription ? (\n <section className=\"fg-info__section\" aria-label=\"Docs\">\n {dossier.description ? <p className=\"fg-info__doc\">{dossier.description}</p> : null}\n {dossier.componentDescription ? (\n <p className=\"fg-info__doc fg-info__doc--component\">{dossier.componentDescription}</p>\n ) : null}\n </section>\n ) : null}\n\n <section className=\"fg-info__section\" aria-label=\"Identity\">\n <dl className=\"fg-info__rows\">\n <Row label=\"Story\">{dossier.name}</Row>\n <Row label=\"Component\">{dossier.componentName ?? dossier.title.split('/').pop()}</Row>\n <Row label=\"Library\">{dossier.library}</Row>\n <Row label=\"Title\">{dossier.title}</Row>\n <Row label=\"Export\">\n <code>{dossier.exportName}</code>\n </Row>\n <Row label=\"Id\">\n <code>{dossier.id}</code>\n </Row>\n <Row label=\"File\">\n <code className=\"fg-info__path\">{dossier.file}</code>\n </Row>\n </dl>\n </section>\n\n <section className=\"fg-info__section\" aria-label=\"Args\">\n <h3 className=\"fg-info__heading\">Args</h3>\n {dossier.argsPending ? (\n <p className=\"fg-info__empty\">Open this story to read its args.</p>\n ) : dossier.args.length === 0 ? (\n <p className=\"fg-info__empty\">This story takes no args.</p>\n ) : (\n <ArgRows args={dossier.args} />\n )}\n </section>\n </div>\n );\n}\n","import { breadcrumb } from '../breadcrumb';\nimport { useLabContext } from '@weasel-js/labkit';\nimport { Dialog } from '@weasel-js/ui';\nimport type { IndexEntry } from '../../story/types';\nimport { storyDossier } from './dossier';\nimport { StoryDossier } from './StoryDossier';\n\nexport interface StoryInfoDialogProps {\n index: readonly IndexEntry[];\n /** Whether a story's frame has reported its schema — `StoryRegistry.isReady`. */\n isReady: (id: string) => boolean;\n isOpen: boolean;\n onOpenChange: (open: boolean) => void;\n}\n\n/**\n * Get Info for the focused trial's story. Mount inside `<Lab>`: it reads the\n * lab's context, and renders nothing until it is opened.\n */\nexport function StoryInfoDialog({ index, isReady, isOpen, onOpenChange }: StoryInfoDialogProps) {\n const { focusedTrialId, trials, instruments } = useLabContext();\n const trial = trials.find((record) => record.id === focusedTrialId);\n const entry = trial ? index.find((candidate) => candidate.id === trial.instrumentName) : undefined;\n if (!entry) return null;\n const dossier = storyDossier({\n entry,\n instrument: instruments.find((candidate) => candidate.name === entry.id),\n config: trial?.config,\n ready: isReady(entry.id),\n });\n return (\n <Dialog\n isOpen={isOpen}\n onOpenChange={onOpenChange}\n title={breadcrumb(dossier.title, dossier.name)}\n className=\"fg-info-dialog\"\n >\n <StoryDossier dossier={dossier} />\n </Dialog>\n );\n}\n","import { createContext } from 'react';\nimport { FRAME_HELLO } from '../protocol/messages';\n\n/** Frame documents loaded ahead of need, blank until a view hands one a port. */\nexport interface FramePool {\n /**\n * A frame that has loaded and said hello, detached from the pool so the caller can move it into place with\n * `moveBefore`; null when none is ready or the browser cannot move an iframe without reloading it.\n */\n claim(): HTMLIFrameElement | null;\n dispose(): void;\n}\n\ntype Movable = Element & { moveBefore(node: Node, child: Node | null): void };\n\n/** Whether `moveBefore` exists here, the one way to move an iframe without reloading its document. */\nexport function canMoveFrames(): boolean {\n return typeof Element !== 'undefined' && 'moveBefore' in Element.prototype;\n}\n\n/** Moves `frame` to the start of `host` without reloading it. */\nexport function moveFrame(host: Element, frame: HTMLIFrameElement): void {\n (host as Movable).moveBefore(frame, host.firstChild);\n}\n\nconst whenIdle = (fn: () => void): (() => void) => {\n if (typeof requestIdleCallback === 'function') {\n const handle = requestIdleCallback(fn, { timeout: 500 });\n return () => cancelIdleCallback(handle);\n }\n const handle = setTimeout(fn, 200);\n return () => clearTimeout(handle);\n};\n\n/**\n * Keeps `size` blank frames of `frameUrl` loaded off-screen. A claimed frame is the caller's to discard: it never\n * comes back, so nothing one story left in a document reaches the next. A replacement loads when the page is idle.\n */\nexport function createFramePool(frameUrl: string, size = 2): FramePool {\n const shelf = document.createElement('div');\n shelf.className = 'fg-frame-pool';\n shelf.setAttribute('aria-hidden', 'true');\n document.body.append(shelf);\n const warm: HTMLIFrameElement[] = [];\n let loading = 0;\n let cancelRefill: (() => void) | null = null;\n let disposed = false;\n\n const load = () => {\n loading += 1;\n const frame = document.createElement('iframe');\n frame.tabIndex = -1;\n frame.src = frameUrl;\n const onMessage = (event: MessageEvent) => {\n if (event.source !== frame.contentWindow || event.origin !== location.origin) return;\n if ((event.data as { type?: unknown } | null)?.type !== FRAME_HELLO) return;\n window.removeEventListener('message', onMessage);\n loading -= 1;\n warm.push(frame);\n };\n window.addEventListener('message', onMessage);\n shelf.append(frame);\n };\n\n const refill = () => {\n if (disposed || cancelRefill) return;\n cancelRefill = whenIdle(() => {\n cancelRefill = null;\n while (!disposed && warm.length + loading < size) load();\n });\n };\n if (canMoveFrames()) refill();\n\n return {\n claim() {\n if (!canMoveFrames()) return null;\n const frame = warm.shift() ?? null;\n refill();\n return frame;\n },\n dispose() {\n disposed = true;\n cancelRefill?.();\n shelf.remove();\n },\n };\n}\n\nexport const FramePoolContext = createContext<FramePool | null>(null);\n","import { Select, useLabContext, usePersistedState } from '@weasel-js/labkit';\nimport { Button, Callout, TuneIcon } from '@weasel-js/ui';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type { Globals } from '../protocol/messages';\nimport { followApp, type GlobalDeclaration, type GlobalDeclarations, labGlobals, labOptions } from './globals';\n\nconst RECORD = 'fg-globals';\n\nfunction useLabGlobals(declarations: GlobalDeclarations): [Globals, (key: string, value: string) => void] {\n const [stored, setStored] = usePersistedState<unknown>(RECORD, null, { scope: 'lab' });\n const values = useMemo(() => labGlobals(declarations, stored), [declarations, stored]);\n const set = useCallback(\n (key: string, value: string) => setStored((prev: unknown) => ({ ...labGlobals(declarations, prev), [key]: value })),\n [declarations, setStored],\n );\n return [values, set];\n}\n\ninterface GlobalSelectProps {\n name: string;\n declaration: GlobalDeclaration;\n values: Globals;\n set: (key: string, value: string) => void;\n labeled?: boolean;\n}\n\nfunction GlobalSelect({ name, declaration, values, set, labeled = false }: GlobalSelectProps) {\n return (\n <Select\n {...(labeled ? { label: declaration.label } : { 'aria-label': declaration.label })}\n width={labeled ? 'fill' : 'fit'}\n selectedKey={String(values[name])}\n onSelectionChange={(value) => set(name, value)}\n options={labOptions(declaration, values)}\n />\n );\n}\n\n/**\n * The lab's header control for its global values: one select per declaration, then, at the end, a button for each\n * declaration that others are declared `under`, opening those others in a popover.\n */\nexport function GlobalsToolbar({ declarations }: { declarations: GlobalDeclarations }) {\n const [values, set] = useLabGlobals(declarations);\n const entries = Object.entries(declarations);\n const top = entries.filter(([, declaration]) => declaration.under === undefined);\n return (\n <div className=\"fg-globals\" role=\"toolbar\" aria-label=\"Globals\">\n {top.map(([key, declaration]) => (\n <div key={key} className=\"fg-globals__item\">\n <GlobalSelect name={key} declaration={declaration} values={values} set={set} />\n </div>\n ))}\n {top.map(([key, declaration]) => {\n const nested = entries.filter(([, other]) => other.under === key);\n return nested.length > 0 ? (\n <NestedGlobals key={key} label={declaration.label} nested={nested} values={values} set={set} />\n ) : null;\n })}\n </div>\n );\n}\n\nfunction NestedGlobals({\n label,\n nested,\n values,\n set,\n}: {\n label: string;\n nested: readonly [string, GlobalDeclaration][];\n values: Globals;\n set: (key: string, value: string) => void;\n}) {\n const anchor = useRef<HTMLButtonElement>(null);\n const [open, setOpen] = useState(false);\n return (\n <>\n <Button\n ref={anchor}\n variant=\"ghost\"\n size=\"sm\"\n iconOnly\n ariaLabel={`More ${label} settings`}\n pressed={open}\n onClick={() => setOpen((was) => !was)}\n >\n <TuneIcon size={16} />\n </Button>\n <Callout\n triggerRef={anchor}\n isOpen={open}\n onOpenChange={setOpen}\n placement=\"bottom end\"\n showCloseButton={false}\n title={label}\n className=\"fg-globals__popover\"\n >\n {nested.map(([key, declaration]) => (\n <GlobalSelect key={key} name={key} declaration={declaration} values={values} set={set} labeled />\n ))}\n </Callout>\n </>\n );\n}\n\n/**\n * Reports the lab's global values, as the toolbar persists them and with each `App` resolved against the lab's own\n * chrome, to `onChange`. Renders nothing; mount it inside the lab.\n */\nexport function LabGlobals({\n declarations,\n onChange,\n}: {\n declarations: GlobalDeclarations;\n onChange: (values: Globals) => void;\n}) {\n const [values] = useLabGlobals(declarations);\n const { mode } = useLabContext();\n const resolved = useMemo(() => followApp(declarations, values, { mode }), [declarations, values, mode]);\n useEffect(() => onChange(resolved), [resolved, onChange]);\n return null;\n}\n","const FLASH_MS = 600;\nconst flashes = new WeakMap<Element, ReturnType<typeof setTimeout>>();\n\n/** Scrolls a trial into view and flashes its outline. False when no trial has that id. */\nexport function revealTrial(trialId: string, root: ParentNode = document): boolean {\n const trial = root.querySelector<HTMLElement>(`.lk-trial[data-trial-id=\"${CSS.escape(trialId)}\"]`);\n if (!trial) return false;\n trial.scrollIntoView({ block: 'nearest' });\n clearTimeout(flashes.get(trial));\n trial.classList.remove('fg-flash');\n // Reading layout between the remove and the add restarts the animation on a second reveal.\n void trial.offsetWidth;\n trial.classList.add('fg-flash');\n flashes.set(\n trial,\n setTimeout(() => {\n trial.classList.remove('fg-flash');\n flashes.delete(trial);\n }, FLASH_MS),\n );\n return true;\n}\n","import { useEffect, useState } from 'react';\n\n/** What forge keeps on a history entry: its place in the session, and whether reaching it swapped a trial's story in place. */\nexport interface RouteEntry {\n step: number;\n inPlace: boolean;\n}\n\n/** The story id `#/<id>` names, or null. */\nexport function readRoute(): string | null {\n const { hash } = location;\n if (!hash.startsWith('#/')) return null;\n return decodeURIComponent(hash.slice(2)) || null;\n}\n\n/** The current history entry's forge state, or null for one forge did not write, such as a typed URL. */\nexport function readRouteEntry(): RouteEntry | null {\n const state = history.state as { forgeRoute?: unknown } | null;\n const entry = state?.forgeRoute as RouteEntry | undefined;\n return typeof entry?.step === 'number' ? entry : null;\n}\n\n/** Whether moving between two entries crosses an in-place swap: back off one, or forward onto one. */\nexport function crossesInPlace(from: RouteEntry | null, to: RouteEntry | null): boolean {\n if (!from || !to || from.step === to.step) return false;\n return to.step < from.step ? from.inPlace : to.inPlace;\n}\n\nfunction stamp(entry: RouteEntry, hash: string): void {\n history.replaceState({ ...(history.state ?? {}), forgeRoute: entry }, '', hash);\n}\n\n/** Names story `id` in the URL; `inPlace` says it replaced the previous story in its trial. */\nexport function setRoute(id: string, options: { inPlace?: boolean } = {}): void {\n const hash = `#/${encodeURIComponent(id)}`;\n if (readRoute() === id) {\n history.replaceState(history.state, '', hash);\n return;\n }\n const from = readRouteEntry() ?? { step: 0, inPlace: false };\n stamp(from, location.hash);\n location.hash = hash;\n stamp({ step: from.step + 1, inPlace: options.inPlace ?? false }, hash);\n}\n\n/** The story the URL names, and `setRoute` to name another. */\nexport function useRoute(): [string | null, typeof setRoute] {\n const [route, setCurrent] = useState(readRoute);\n useEffect(() => {\n const sync = (): void => setCurrent(readRoute());\n window.addEventListener('hashchange', sync);\n sync();\n return () => window.removeEventListener('hashchange', sync);\n }, []);\n return [route, setRoute];\n}\n","import { indexEntries } from '../../story/indexPages';\nimport { isGallery } from '../../story/tags';\nimport type { IndexEntry } from '../../story/types';\n\nexport type TreeNode =\n | { kind: 'folder'; label: string; path: string; children: TreeNode[]; tag?: string; index?: IndexEntry }\n | { kind: 'story'; entry: IndexEntry; tag?: string; label?: string };\n\ntype Folder = Extract<TreeNode, { kind: 'folder' }>;\n\nfunction sortFolder(nodes: TreeNode[]): TreeNode[] {\n const folders = nodes.filter((n): n is Folder => n.kind === 'folder');\n folders.sort((a, b) => a.label.localeCompare(b.label));\n for (const folder of folders) folder.children = sortFolder(folder.children);\n return [...folders, ...nodes.filter((n) => n.kind === 'story')];\n}\n\n/**\n * `nodes` with every folder that holds nothing but a gallery replaced by that gallery under the folder's name, so a\n * gallery titled `ui/Cursors/Gallery` lists as `Cursors` with its stories directly beneath it. The gallery keeps its\n * own path and index page, so its route and story ids are unchanged.\n */\nexport function foldGalleries(nodes: TreeNode[]): TreeNode[] {\n return nodes.map((node) => {\n if (node.kind !== 'folder') return node;\n const children = foldGalleries(node.children);\n const [only] = children;\n // Only a gallery one segment down: one already folded would carry this folder off and lose its name.\n if (\n !node.index\n && children.length === 1\n && only?.kind === 'folder'\n && only.path === `${node.path}/${only.label}`\n && only.index\n && isGallery(only.index)\n ) {\n return { ...only, label: node.label, tag: node.tag ?? only.tag };\n }\n return { ...node, children };\n });\n}\n\n/**\n * Story titles as nested folders, split on `/`; the last segment is the component, which carries its index page and\n * holds its subfolders, then its stories.\n */\nexport function buildTree(index: readonly IndexEntry[]): TreeNode[] {\n const root: TreeNode[] = [];\n const folders = new Map<string, Folder>();\n const pages = new Map(indexEntries(index).map((page) => [page.title, page]));\n for (const entry of index) {\n let siblings = root;\n let path = '';\n for (const label of entry.title.split('/')) {\n path = path ? `${path}/${label}` : label;\n let folder = folders.get(path);\n if (!folder) {\n const page = pages.get(path);\n folder = { kind: 'folder', label, path, children: [], ...(page ? { index: page } : {}) };\n folders.set(path, folder);\n siblings.push(folder);\n }\n siblings = folder.children;\n }\n siblings.push({ kind: 'story', entry });\n }\n return sortFolder(root);\n}\n\n/**\n * The stories whose `title/name` contains `query`, ignoring case, with their ancestors. A folder keeps its index\n * page only when its own path matches.\n */\nexport function filterTree(nodes: TreeNode[], query: string): TreeNode[] {\n const needle = query.trim().toLowerCase();\n if (!needle) return nodes;\n const walk = (list: TreeNode[]): TreeNode[] =>\n list.flatMap((node): TreeNode[] => {\n if (node.kind === 'story') {\n return `${node.entry.title}/${node.entry.name}`.toLowerCase().includes(needle) ? [node] : [];\n }\n const children = walk(node.children);\n if (children.length === 0) return [];\n const { index: page, ...folder } = node;\n return [page && node.path.toLowerCase().includes(needle) ? { ...folder, children, index: page } : { ...folder, children }];\n });\n return walk(nodes);\n}\n","import { indexEntries } from '../../story/indexPages';\nimport { libraryOf } from '../../story/library';\nimport type { IndexEntry } from '../../story/types';\nimport { foldGalleries, type TreeNode } from './buildTree';\n\ntype Folder = Extract<TreeNode, { kind: 'folder' }>;\n\n/** One component — a story title — with the stories declared under it. */\nexport interface ComponentRow {\n /** The full story title, unique per component and used as the row key. */\n path: string;\n /** The title's last segment: the component's own name. */\n label: string;\n /** Which library it ships in. */\n library: string;\n /** The component's index page; absent when a filter kept the row only for some of its stories. */\n index?: IndexEntry;\n entries: IndexEntry[];\n}\n\n/** Every component in the index as one flat, alphabetical list. Components\n * sharing a name are kept apart by their library, then by their full title. */\nexport function buildComponents(index: readonly IndexEntry[]): ComponentRow[] {\n const byTitle = new Map<string, ComponentRow>();\n const pages = new Map(indexEntries(index).map((page) => [page.title, page]));\n for (const entry of index) {\n let row = byTitle.get(entry.title);\n if (!row) {\n const segments = entry.title.split('/');\n row = {\n path: entry.title,\n label: segments[segments.length - 1],\n library: libraryOf(entry),\n index: pages.get(entry.title),\n entries: [],\n };\n byTitle.set(entry.title, row);\n }\n row.entries.push(entry);\n }\n const rows = [...byTitle.values()];\n disambiguate(rows);\n return rows.sort(\n (a, b) =>\n a.label.localeCompare(b.label)\n || a.library.localeCompare(b.library)\n || a.path.localeCompare(b.path),\n );\n}\n\n/**\n * Widen each label leftward until it tells its row apart from the others in\n * its library.\n * `ui/Cursors/Gallery` and `ui/Icons/Gallery` are two different\n * components whose last segments agree, and a flat list that prints both as\n * `Gallery` is unusable — the grouping that used to separate them is the very\n * thing this view removes.\n */\nfunction disambiguate(rows: readonly ComponentRow[]): void {\n // Rows in different libraries are already told apart by their tag.\n const byLabel = new Map<string, ComponentRow[]>();\n for (const row of rows) {\n const key = `${row.library}\\0${row.label}`;\n const group = byLabel.get(key);\n if (group) group.push(row);\n else byLabel.set(key, [row]);\n }\n for (const group of byLabel.values()) {\n if (group.length < 2) continue;\n for (const row of group) {\n const segments = row.path.split('/');\n // One more segment at a time, stopping at the full title.\n for (let take = 2; take <= segments.length; take++) {\n row.label = segments.slice(-take).join('/');\n if (group.every((other) => other === row || !other.path.endsWith(`/${row.label}`))) break;\n }\n }\n }\n}\n\n/** The components whose name, library or story names contain `query`,\n * ignoring case. A matching component keeps its index page and all its\n * stories; a component matching only through one story keeps just the\n * stories that matched. */\nexport function filterComponents(rows: readonly ComponentRow[], query: string): ComponentRow[] {\n const needle = query.trim().toLowerCase();\n if (!needle) return [...rows];\n const out: ComponentRow[] = [];\n for (const row of rows) {\n if (`${row.path}/${row.library}`.toLowerCase().includes(needle)) {\n out.push(row);\n continue;\n }\n const entries = row.entries.filter((entry) => entry.name.toLowerCase().includes(needle));\n if (entries.length > 0) out.push({ path: row.path, label: row.label, library: row.library, entries });\n }\n return out;\n}\n\n/**\n * The component list as tree nodes, so the sidebar renders and navigates both\n * views with one code path. A slash in a label is a directory: `Icons/Gallery`\n * is a `Gallery` folder inside an `Icons` folder, which it shares with any\n * other row of its library widened to the same prefix. Every component is a\n * folder carrying its index page and holding its stories. A folder a gallery's label opened, holding only that\n * gallery, is folded into it.\n */\nexport function componentNodes(rows: readonly ComponentRow[]): TreeNode[] {\n const root: TreeNode[] = [];\n const folders = new Map<string, Folder>();\n for (const row of rows) {\n const labels = row.label.split('/');\n const title = row.path.split('/');\n let siblings = root;\n let tag: string | undefined = row.library;\n for (let i = 0; i < labels.length - 1; i++) {\n const path = title.slice(0, title.length - labels.length + i + 1).join('/');\n let folder = folders.get(path);\n if (!folder) {\n folder = { kind: 'folder', label: labels[i], path, tag, children: [] };\n folders.set(path, folder);\n siblings.push(folder);\n }\n siblings = folder.children;\n tag = undefined;\n }\n siblings.push({\n kind: 'folder',\n label: labels[labels.length - 1],\n path: row.path,\n tag,\n ...(row.index ? { index: row.index } : {}),\n children: row.entries.map((entry) => ({ kind: 'story', entry }) as const),\n });\n }\n return foldGalleries(root);\n}\n\n/** Every library present in `index`, alphabetically. */\nexport function librariesIn(index: readonly IndexEntry[]): string[] {\n return [...new Set(index.map(libraryOf))].sort((a, b) => a.localeCompare(b));\n}\n","import { type LabChromeContext, usePersistedState } from '@weasel-js/labkit';\nimport { Checkbox, DisclosureMark, ToggleBar, type ToggleBarItem } from '@weasel-js/ui';\nimport { type FocusEvent, type KeyboardEvent, type ReactNode, useId, useMemo, useRef, useState } from 'react';\nimport { indexEntries } from '../../story/indexPages';\nimport { isGallery } from '../../story/tags';\nimport type { IndexEntry } from '../../story/types';\nimport { revealTrial } from '../revealTrial';\nimport { useRoute } from '../useRoute';\nimport { buildTree, filterTree, type TreeNode } from './buildTree';\nimport { buildComponents, componentNodes, filterComponents, librariesIn } from './buildComponents';\nimport { libraryOf } from '../../story/library';\nimport { LibraryBadge as PackageBadge } from '../../frame/index/LibraryBadge';\n\n/** Which shape the sidebar lists the index in. */\ntype View = 'tree' | 'components' | 'gallery';\n\nconst VIEWS: readonly ToggleBarItem<View>[] = [\n { value: 'tree', label: 'Tree' },\n { value: 'components', label: 'Components' },\n { value: 'gallery', label: 'Gallery' },\n];\n\nexport interface StoryTreeProps {\n ctx: LabChromeContext;\n index: readonly IndexEntry[];\n}\n\ninterface Row {\n key: string;\n node: TreeNode;\n parent: string | null;\n}\n\nconst keyOf = (node: TreeNode): string => (node.kind === 'folder' ? `folder:${node.path}` : `story:${node.entry.id}`);\n\n/** The folder paths above a story's component, and the component's own. */\nfunction ancestorsOf(entry: IndexEntry | undefined): Set<string> {\n const paths = new Set<string>();\n if (!entry) return paths;\n let path = '';\n for (const label of entry.title.split('/')) {\n path = path ? `${path}/${label}` : label;\n paths.add(path);\n }\n return paths;\n}\n\n/** A component's package, as the sidebar tags its rows. */\nfunction LibraryBadge({ library }: { library: string }) {\n return <PackageBadge library={library} className=\"fg-tree__tag\" />;\n}\n\n/** The indexed stories as a filterable tree; opening one runs it in the focused trial, or with Shift in another. */\nexport function StoryTree({ ctx, index }: StoryTreeProps) {\n const headingId = useId();\n const [route, setRoute] = useRoute();\n const [query, setQuery] = useState('');\n const [folds, setFolds] = usePersistedState<Record<string, boolean>>('fg-tree-open', {}, { scope: 'lab' });\n const [view, setView] = usePersistedState<View>('fg-tree-view', 'components', { scope: 'lab' });\n // Stored as what is *off*, so a library added later is on without anyone\n // going back to tick it.\n const [hidden, setHidden] = usePersistedState<Record<string, boolean>>('fg-tree-libraries', {}, { scope: 'lab' });\n const [focusKey, setFocusKey] = useState<string | null>(null);\n const items = useRef(new Map<string, HTMLElement>());\n\n const libraries = useMemo(() => librariesIn(index), [index]);\n // The package filter runs on the index, so it means the same thing in both\n // views rather than once per view's own grouping.\n const kept = useMemo(() => index.filter((entry) => !hidden[libraryOf(entry)]), [index, hidden]);\n // Galleries list only in their own view, grouped the way Components groups.\n const [galleryEntries, rest] = useMemo(() => {\n const yes: IndexEntry[] = [];\n const no: IndexEntry[] = [];\n for (const entry of kept) (isGallery(entry) ? yes : no).push(entry);\n return [yes, no];\n }, [kept]);\n const tree = useMemo(() => buildTree(rest), [rest]);\n const components = useMemo(() => buildComponents(rest), [rest]);\n const galleries = useMemo(() => buildComponents(galleryEntries), [galleryEntries]);\n const shown = useMemo(\n () =>\n view === 'tree'\n ? filterTree(tree, query)\n : componentNodes(filterComponents(view === 'gallery' ? galleries : components, query)),\n [view, components, galleries, tree, query],\n );\n const routable = useMemo(() => [...kept, ...indexEntries(kept)], [kept]);\n const routed = routable.find((entry) => entry.id === route);\n const routeAncestors = useMemo(() => ancestorsOf(routed), [routed]);\n const filtering = query.trim() !== '';\n const isOpen = (path: string): boolean =>\n filtering || (folds[path] ?? routeAncestors.has(path));\n\n const rows: Row[] = [];\n const collect = (nodes: readonly TreeNode[], parent: string | null): void => {\n for (const node of nodes) {\n rows.push({ key: keyOf(node), node, parent });\n if (node.kind === 'folder' && isOpen(node.path)) collect(node.children, keyOf(node));\n }\n };\n collect(shown, null);\n const active = rows.some((row) => row.key === focusKey) ? focusKey : (rows[0]?.key ?? null);\n\n const openIds = new Set(ctx.trials.map((trial) => trial.instrumentName));\n\n // A filter forces every folder open, so a toggle then would change state nobody can see.\n const setOpen = (path: string, open: boolean): void => {\n if (!filtering) setFolds((prev) => ({ ...prev, [path]: open }));\n };\n\n const moveTo = (key: string | undefined): void => {\n if (key === undefined) return;\n setFocusKey(key);\n items.current.get(key)?.focus();\n };\n\n const activate = (entry: IndexEntry, another: boolean): void => {\n const focused = ctx.trials.find((trial) => trial.id === ctx.focusedTrialId);\n if (another || !focused) ctx.addTrial(entry.id);\n else if (focused.instrumentName === entry.id) revealTrial(focused.id);\n else {\n ctx.swapTrial(focused.id, entry.id);\n setRoute(entry.id, { inPlace: true });\n return;\n }\n setRoute(entry.id);\n };\n\n // A component's row opens its index page as well as its folder; the fold mark alone only folds.\n const openFolder = (node: Extract<TreeNode, { kind: 'folder' }>, another: boolean): void => {\n if (!node.index) {\n setOpen(node.path, !isOpen(node.path));\n return;\n }\n // Selection opens it, and closes it again once the selection moves on; only a manual fold is stored. A\n // manual close would outrank the selection, so it is dropped.\n if (folds[node.path] === false) {\n setFolds(({ [node.path]: _dropped, ...rest }) => rest);\n }\n activate(node.index, another);\n };\n\n const onKeyDown = (event: KeyboardEvent<HTMLDivElement>): void => {\n const at = rows.findIndex((row) => row.key === active);\n const row = rows[at];\n if (!row) return;\n const { node } = row;\n switch (event.key) {\n case 'ArrowDown':\n moveTo(rows[at + 1]?.key);\n break;\n case 'ArrowUp':\n moveTo(rows[at - 1]?.key);\n break;\n case 'Home':\n moveTo(rows[0]?.key);\n break;\n case 'End':\n moveTo(rows[rows.length - 1]?.key);\n break;\n case 'ArrowRight':\n if (node.kind !== 'folder') break;\n if (!isOpen(node.path)) setOpen(node.path, true);\n else if (rows[at + 1]?.parent === row.key) moveTo(rows[at + 1]?.key);\n break;\n case 'ArrowLeft':\n if (node.kind === 'folder' && isOpen(node.path) && !filtering) setOpen(node.path, false);\n else moveTo(row.parent ?? undefined);\n break;\n case 'Enter':\n case ' ':\n if (node.kind === 'story') activate(node.entry, event.shiftKey);\n else openFolder(node, event.shiftKey);\n break;\n default:\n return;\n }\n event.preventDefault();\n };\n\n const itemProps = (node: TreeNode, level: number) => {\n const key = keyOf(node);\n return {\n role: 'treeitem',\n 'aria-level': level,\n tabIndex: key === active ? 0 : -1,\n ref: (el: HTMLElement | null) => {\n if (el) items.current.set(key, el);\n else items.current.delete(key);\n },\n // A folder item contains its children, so their focus bubbles through it.\n onFocus: (event: FocusEvent) => {\n if (event.target === event.currentTarget) setFocusKey(key);\n },\n };\n };\n\n const renderNodes = (nodes: readonly TreeNode[], level: number): ReactNode =>\n nodes.map((node) => {\n if (node.kind === 'folder') {\n const open = isOpen(node.path);\n return (\n <div\n key={keyOf(node)}\n {...itemProps(node, level)}\n aria-expanded={open}\n aria-label={node.label}\n aria-current={node.index && openIds.has(node.index.id) ? 'true' : undefined}\n className=\"fg-tree__node\"\n >\n <div\n className=\"fg-tree__item fg-tree__folder\"\n onClick={(event) => {\n setFocusKey(keyOf(node));\n openFolder(node, event.shiftKey);\n }}\n >\n <span\n aria-hidden=\"true\"\n className=\"fg-tree__fold\"\n onClick={(event) => {\n event.stopPropagation();\n setOpen(node.path, !open);\n }}\n >\n <DisclosureMark open={open} />\n </span>\n <span className=\"fg-tree__label\">{node.label}</span>\n {node.tag ? <LibraryBadge library={node.tag} /> : null}\n </div>\n {open ? (\n <div role=\"group\" className=\"fg-tree__group\">\n {renderNodes(node.children, level + 1)}\n </div>\n ) : null}\n </div>\n );\n }\n const { entry } = node;\n return (\n <a\n key={keyOf(node)}\n {...itemProps(node, level)}\n href={`#/${encodeURIComponent(entry.id)}`}\n aria-current={openIds.has(entry.id) ? 'true' : undefined}\n className=\"fg-tree__item fg-tree__story\"\n onClick={(event) => {\n if (event.button !== 0 || event.metaKey || event.ctrlKey || event.altKey) return;\n event.preventDefault();\n setFocusKey(keyOf(node));\n activate(entry, event.shiftKey);\n }}\n >\n <span className=\"fg-tree__label\">{node.label ?? entry.name}</span>\n {node.tag ? <LibraryBadge library={node.tag} /> : null}\n </a>\n );\n });\n\n return (\n <section className=\"fg-tree\">\n <h2 id={headingId} className=\"fg-tree__heading\">\n Stories\n </h2>\n {route && !routed ? (\n <p className=\"fg-route-miss\">\n No story <code>{route}</code>\n </p>\n ) : null}\n <ToggleBar\n ariaLabel=\"Sidebar view\"\n variant=\"flat\"\n items={VIEWS}\n value={view}\n onChange={(next) => {\n if (next) setView(next);\n }}\n />\n <fieldset className=\"fg-tree__libraries\">\n <legend className=\"fg-tree__libraries-legend\">Packages</legend>\n {libraries.map((library) => (\n <Checkbox\n key={library}\n isSelected={!hidden[library]}\n onChange={(on) => setHidden((prev) => ({ ...prev, [library]: !on }))}\n >\n <LibraryBadge library={library} />\n </Checkbox>\n ))}\n </fieldset>\n <input\n type=\"search\"\n className=\"fg-tree__filter\"\n aria-label=\"Filter stories\"\n value={query}\n onChange={(event) => setQuery(event.target.value)}\n />\n <div role=\"tree\" aria-labelledby={headingId} className=\"fg-tree__items\" onKeyDown={onKeyDown}>\n {renderNodes(shown, 1)}\n </div>\n </section>\n );\n}\n","import { type ConfigAnswers, stableStringify } from '../protocol/messages';\nimport type { SchemaAnswers } from '../protocol/schema';\nimport { storyConfig } from './globals';\n\nexport interface AnswerBook extends SchemaAnswers {\n record(answers: ConfigAnswers): void;\n /** Marks `config` as one an open trial shows until the returned release runs. */\n hold(config: unknown): () => void;\n subscribe(fn: () => void): () => void;\n}\n\nconst KEPT_CONFIGS = 50;\n\nconst UNANSWERED = stableStringify({ hidden: [], errors: {} });\n\n/** Keeps the last 50 configs' answers. A config it has no answer for shows every node and reports no errors.\n * Subscribers hear of an answer only when it differs from the one kept for its config, and a trial holds that config. */\nexport function createAnswerBook(): AnswerBook {\n const byConfig = new Map<\n string,\n { hidden: readonly string[]; errors: Readonly<Record<string, string[]>>; key: string }\n >();\n const listeners = new Set<() => void>();\n const held = new Map<string, number>();\n const keyOf = (config: unknown) => stableStringify(storyConfig(config));\n const answerFor = (config: unknown) => byConfig.get(keyOf(config));\n\n return {\n record(answers) {\n const key = stableStringify({ hidden: answers.hidden, errors: answers.errors });\n const changed = key !== (byConfig.get(answers.configKey)?.key ?? UNANSWERED);\n byConfig.delete(answers.configKey);\n byConfig.set(answers.configKey, { hidden: answers.hidden, errors: answers.errors, key });\n if (byConfig.size > KEPT_CONFIGS) {\n const oldest = byConfig.keys().next().value;\n if (oldest !== undefined) byConfig.delete(oldest);\n }\n if (changed && held.has(answers.configKey)) for (const fn of listeners) fn();\n },\n hold(config) {\n const key = keyOf(config);\n held.set(key, (held.get(key) ?? 0) + 1);\n return () => {\n const count = (held.get(key) ?? 1) - 1;\n if (count > 0) held.set(key, count);\n else held.delete(key);\n };\n },\n hidden(path, config) {\n const hidden = answerFor(config)?.hidden;\n return hidden?.some((h) => path === h || path.startsWith(`${h}.`)) ?? false;\n },\n errors: (path, config) => answerFor(config)?.errors[path] ?? [],\n subscribe(fn) {\n listeners.add(fn);\n return () => {\n listeners.delete(fn);\n };\n },\n };\n}\n","import { TrialIdContext, useLabContext } from '@weasel-js/labkit';\nimport { useContext } from 'react';\nimport { isGallery } from '../story/tags';\nimport type { FrameSetup } from '../frame/FrameController';\nimport { type IndexEnv, IndexPage } from '../frame/index/IndexPage';\nimport type { Globals } from '../protocol/messages';\nimport type { IndexRender, LoadedStory } from '../story/types';\nimport { DependenciesContext } from './dependencies';\nimport { TrialHost } from './TrialHost';\nimport { setRoute } from './useRoute';\n\n/** A component's index page as the registry loads it: its stories in index order, and the page's own render. */\nexport interface IndexBundle {\n title: string;\n /** The package the component ships in. */\n library: string;\n description?: string;\n /** The tags every story of the component carries. */\n tags?: readonly string[];\n /** The ids of the stories tagged `gallery`. */\n galleries: readonly string[];\n stories: readonly LoadedStory[];\n descriptions: Readonly<Record<string, string>>;\n render: IndexRender | null;\n}\n\nexport interface IndexTrialProps {\n bundle: IndexBundle;\n setup: FrameSetup;\n config: unknown;\n}\n\n/** A component's index page rendered in the workshop document; `open` swaps its own trial to the story clicked. */\nexport function IndexTrial({ bundle, setup, config }: IndexTrialProps) {\n const lab = useLabContext();\n const trialId = useContext(TrialIdContext);\n const graph = useContext(DependenciesContext);\n const gallery = isGallery(bundle);\n const dependencies = gallery ? undefined : graph?.[bundle.title];\n const open = (id: string) => {\n if (!trialId || !lab.instruments.some((instrument) => instrument.name === id)) return;\n lab.swapTrial(trialId, id);\n setRoute(id, { inPlace: true });\n };\n const render = (globals: Globals) => {\n const env: IndexEnv = {\n title: bundle.title,\n library: bundle.library,\n ...(bundle.description === undefined ? {} : { description: bundle.description }),\n stories: bundle.stories,\n descriptions: bundle.descriptions,\n gallery,\n galleries: bundle.galleries,\n ...(dependencies ? { dependencies } : {}),\n globals,\n decorators: setup.decorators ?? [],\n open,\n // A story that throws shows its error in its own cell; the rest of the page is still worth reading.\n onError: (error) => console.error(error),\n };\n return <IndexPage env={env} render={bundle.render} />;\n };\n return (\n <TrialHost layout=\"fullscreen\" setup={setup} config={config}>\n {render}\n </TrialHost>\n );\n}\n","import type { Instrument } from '@weasel-js/labkit';\nimport { type ConfigSchema, f } from '@weasel-js/labkit/config';\nimport { useEffect } from 'react';\nimport type { FrameSetup } from '../frame/FrameController';\nimport type { IndexEntry } from '../story/types';\nimport { breadcrumb } from './breadcrumb';\nimport { type GlobalDeclarations, withGlobals } from './globals';\nimport { type IndexBundle, IndexTrial } from './IndexTrial';\nimport { StoryTrial } from './StoryTrial';\n\n/** What the registry has loaded for an entry: one story, or a component's index page. */\nexport type Loaded = { kind: 'story'; story: import('../story/types').LoadedStory } | { kind: 'index'; bundle: IndexBundle };\n\nexport interface DocumentInstrumentOptions {\n entry: IndexEntry;\n loaded: Loaded;\n setup: FrameSetup;\n globals?: GlobalDeclarations;\n}\n\n/** A loaded story, or index page, as a lab instrument rendering in the workshop document. */\nexport function documentInstrument(options: DocumentInstrumentOptions): Instrument<unknown, unknown> {\n const { entry, loaded, setup, globals = {} } = options;\n const schema = loaded.kind === 'story' ? loaded.story.config : (f.schema({}) as ConfigSchema<unknown>);\n const config = withGlobals(schema, globals);\n const initialState = loaded.kind === 'story' ? loaded.story.initialState : null;\n return {\n name: entry.id,\n title: breadcrumb(entry.title, entry.name),\n config,\n defaultConfig: () => config.defaults(),\n initialState: (c) => initialState?.(c) ?? null,\n render: (ctx) =>\n loaded.kind === 'story' ? (\n <StoryTrial story={loaded.story} setup={setup} ctx={ctx} />\n ) : (\n <IndexTrial bundle={loaded.bundle} setup={setup} config={ctx.config} />\n ),\n ...(loaded.kind === 'story' && loaded.story.viewport\n ? { stage: { size: { width: loaded.story.viewport.width, height: loaded.story.viewport.height } } }\n : {}),\n };\n}\n\nexport interface PendingInstrumentOptions {\n entry: IndexEntry;\n globals?: GlobalDeclarations;\n /** Asked for the entry's module the first time a trial renders it. */\n load: (entry: IndexEntry) => void;\n /** Why the module could not load, when it could not. */\n fault?: Error;\n /** Bumped by a reload, so a face already mounted asks again. */\n generation?: number;\n}\n\n/** The instrument's face while its module loads, and the fault when the load fails. */\nfunction StoryLoad({ entry, load, fault }: PendingInstrumentOptions) {\n useEffect(() => {\n if (!fault) load(entry);\n }, [entry, load, fault]);\n return (\n <div className=\"fg-story fg-story--loading\" data-fg-layout=\"fullscreen\">\n {fault ? (\n <div className=\"fg-fault\" role=\"alert\">\n <span className=\"fg-fault__phase\">import</span>\n <p className=\"fg-fault__message\">{fault.message}</p>\n </div>\n ) : null}\n </div>\n );\n}\n\n/** An entry's instrument before its module has loaded: an empty schema, and a render that asks for the load. */\nexport function pendingInstrument(options: PendingInstrumentOptions): Instrument<unknown, unknown> {\n const { entry, globals = {} } = options;\n const config = withGlobals(f.schema({}) as ConfigSchema<unknown>, globals);\n return {\n name: entry.id,\n title: breadcrumb(entry.title, entry.name),\n config,\n defaultConfig: () => config.defaults(),\n initialState: () => null,\n render: () => <StoryLoad key={options.generation ?? 0} {...options} />,\n };\n}\n","import { type FromFrame, stableStringify } from '../protocol/messages';\n\nexport type Ready = Extract<FromFrame, { type: 'ready' }>;\n\n/** The part of a `ready` an instrument is built from; two readies with one key build the same instrument. */\nexport const readyKey = (ready: Ready): string =>\n stableStringify({ schema: ready.schema, layout: ready.layout, viewport: ready.viewport });\n","import { breadcrumb } from './breadcrumb';\nimport './shell.css';\nimport { type RenderContext, TrialIdContext, useLabContext } from '@weasel-js/labkit';\nimport { type RefObject, useContext, useEffect, useMemo, useRef, useState } from 'react';\nimport { type Channel, type Mismatch, openChannel } from '../protocol/channel';\nimport {\n type FaultPhase,\n FRAME_HELLO,\n type FromFrame,\n type Globals,\n PORT_HANDOFF,\n type PortHandoff,\n PROTOCOL_VERSION,\n stableStringify,\n type CapturedPicture,\n type ToFrame,\n} from '../protocol/messages';\nimport type { IndexEntry } from '../story/types';\nimport type { AnswerBook } from './answers';\nimport { useCssOverrides } from './cssVars/overrides';\nimport { FramePoolContext, moveFrame } from './framePool';\n\nimport { effectiveGlobals, GLOBALS_KEY, isGlobalsPath, storyConfig } from './globals';\nimport { type Ready, readyKey } from './readyKey';\nimport { type A11yOutcome, TrialFramesContext } from './trialFrames';\nimport { StoryGlobalsContext } from './StoryGlobalsContext';\nimport { setRoute } from './useRoute';\n\nexport interface FrameViewProps {\n entry: IndexEntry;\n frameUrl: string;\n answers: AnswerBook;\n onReady: (entry: IndexEntry, ready: Ready) => void;\n /** `readyKey` of the ready this view's instrument was built from; null while the instrument is provisional. */\n descriptionKey: string | null;\n ctx: RenderContext<unknown, unknown>;\n}\n\nconst START_TIMEOUT_MS = 10_000;\n/** Longer than a cold dev server takes to serve a frame document its first time. */\nconst HELLO_TIMEOUT_MS = 30_000;\n/** Distinguishes one frame request from the next; only ever compared, never read. */\nlet requests = 0;\n/** How far past the viewport a frame stays mounted, so a small scroll back does not reload it. */\nconst IN_VIEW_MARGIN = '50%';\n\n/** Whether `ref`'s element is near the viewport; true where the browser cannot say. */\nfunction useInView(ref: RefObject<Element | null>): boolean {\n const [inView, setInView] = useState(true);\n useEffect(() => {\n const el = ref.current;\n if (!el || typeof IntersectionObserver === 'undefined') return;\n const observer = new IntersectionObserver(\n (entries) => {\n const last = entries.at(-1);\n if (last) setInView(last.isIntersecting);\n },\n { rootMargin: IN_VIEW_MARGIN },\n );\n observer.observe(el);\n return () => observer.disconnect();\n }, [ref]);\n return inView;\n}\n\ninterface Settle {\n resolve: (value: never) => void;\n fail: (error: Error) => void;\n /** How this request ends when the frame goes away before answering. */\n gone: () => void;\n}\n\ninterface Fault {\n phase: FaultPhase | null;\n message: string;\n}\n\n/** One handshake with one frame document; a reload replaces it. */\ninterface Link {\n channel: Channel<FromFrame, ToFrame>;\n timer: ReturnType<typeof setTimeout>;\n /** The key of a `ready` whose `init` waits for an instrument built from it. */\n awaiting: string | null;\n /** What the frame holds, from `init` on — the story's config without the trial's pins; null until then. */\n sent: { config: unknown; state: unknown; globals: Globals } | null;\n /** `init`, `config`, `state` and `globals` messages sent; a render fault's `seq` counts the same messages. */\n inputs: number;\n /** Takes this link's channel out of the trial's frame registry. */\n disconnect: () => void;\n /** Requests waiting on an answer carrying the same id. */\n pending: Map<string, Settle>;\n /** Whether the frame has said it rendered; before that there is no story to ask anything about. */\n hasRendered: boolean;\n /** Requests held until it has. */\n queued: (() => void)[];\n}\n\nfunction closeLink(link: RefObject<Link | null>): void {\n if (!link.current) return;\n clearTimeout(link.current.timer);\n for (const settle of link.current.pending.values()) settle.gone();\n link.current.pending.clear();\n link.current.disconnect();\n link.current.channel.close();\n link.current = null;\n}\n\nfunction settle(link: Link, id: string, value: unknown): void {\n (link.pending.get(id)?.resolve as ((v: unknown) => void) | undefined)?.(value);\n link.pending.delete(id);\n}\n\nfunction mismatchMessage(mismatch: Mismatch): string {\n return mismatch.reason === 'version'\n ? `Frame speaks protocol ${String(mismatch.version)}; this workshop speaks ${PROTOCOL_VERSION}`\n : 'Frame sent a message that is not a forge envelope';\n}\n\nexport function FrameView(props: FrameViewProps) {\n const { entry, frameUrl, answers, descriptionKey, ctx } = props;\n const labGlobals = useContext(StoryGlobalsContext);\n const pins = (ctx.config as Record<string, unknown> | null | undefined)?.[GLOBALS_KEY];\n const globals = useMemo(() => effectiveGlobals(labGlobals, pins), [labGlobals, pins]);\n const trialId = useContext(TrialIdContext);\n const frames = useContext(TrialFramesContext);\n const [overrides] = useCssOverrides();\n const pool = useContext(FramePoolContext);\n const lab = useLabContext();\n const src = `${frameUrl}#${entry.id}`;\n const title = breadcrumb(entry.title, entry.name);\n const iframeRef = useRef<HTMLIFrameElement | null>(null);\n const hostRef = useRef<HTMLDivElement>(null);\n const slotRef = useRef<HTMLDivElement>(null);\n const inView = useInView(hostRef);\n const link = useRef<Link | null>(null);\n const latest = useRef({ ...props, globals, overrides, pool, lab, title });\n latest.current = { ...props, globals, overrides, pool, lab, title };\n const [fault, setFault] = useState<Fault | null>(null);\n // A loaded document stays hidden until its story has rendered, so a new trial never shows the blank page.\n const [pending, setPending] = useState(true);\n\n const init = (current: Link): void => {\n const { ctx: live, globals: liveGlobals } = latest.current;\n current.awaiting = null;\n current.sent = { config: storyConfig(live.config), state: live.state, globals: liveGlobals };\n current.inputs += 1;\n current.channel.send({ type: 'init', ...current.sent });\n };\n\n const receive = (current: Link, msg: FromFrame): void => {\n const { ctx: live, answers, onReady } = latest.current;\n switch (msg.type) {\n case 'ready': {\n clearTimeout(current.timer);\n setFault(null);\n for (const [name, value] of Object.entries(latest.current.overrides)) {\n current.channel.send({ type: 'vars.set', name, value });\n }\n const key = readyKey(msg);\n current.awaiting = key;\n onReady(latest.current.entry, msg);\n if (current.awaiting === key && key === latest.current.descriptionKey) init(current);\n break;\n }\n case 'rendered':\n setPending(false);\n current.hasRendered = true;\n for (const ask of current.queued.splice(0)) ask();\n break;\n case 'setConfig':\n // The pins belong to the trial; a story cannot see them, so it cannot set them either.\n if (!isGlobalsPath(msg.path)) live.setConfig(msg.path, msg.value);\n break;\n case 'setState':\n if (current.sent) current.sent.state = msg.state;\n live.setState(msg.state);\n break;\n case 'answers':\n answers.record(msg.answers);\n break;\n case 'vars':\n if (trialId) frames?.report(trialId, msg.vars);\n break;\n case 'size':\n if (trialId) frames?.reportSize(trialId, { width: msg.width, height: msg.height });\n break;\n case 'a11y': {\n const outcome: A11yOutcome = msg.ok ? { ok: true, report: msg.report } : { ok: false, message: msg.message };\n if (trialId) frames?.reportA11y(trialId, outcome);\n settle(current, msg.id, outcome);\n break;\n }\n case 'capture':\n if (msg.ok) settle(current, msg.id, msg.picture);\n else current.pending.get(msg.id)?.fail(new Error(msg.message));\n current.pending.delete(msg.id);\n break;\n case 'open': {\n const { lab: liveLab } = latest.current;\n if (!trialId || !liveLab.instruments.some((instrument) => instrument.name === msg.id)) break;\n liveLab.swapTrial(trialId, msg.id);\n setRoute(msg.id, { inPlace: true });\n break;\n }\n case 'fault':\n // A newer input is already on its way to the frame, which faults again if it still throws.\n if (msg.phase === 'render' && msg.seq !== undefined && msg.seq < current.inputs) break;\n clearTimeout(current.timer);\n setFault({ phase: msg.phase, message: msg.message });\n break;\n }\n };\n\n const connect = (frame: HTMLIFrameElement): void => {\n closeLink(link);\n setPending(true);\n const target = frame.contentWindow;\n if (!target) return;\n const { port1, port2 } = new MessageChannel();\n const timer = setTimeout(() => setFault({ phase: null, message: `Frame did not start: ${src}` }), START_TIMEOUT_MS);\n const channel = openChannel<FromFrame, ToFrame>(port1, {\n onMismatch: (mismatch) => {\n clearTimeout(timer);\n setFault({ phase: 'protocol', message: mismatchMessage(mismatch) });\n },\n });\n const waiting = new Map<string, Settle>();\n // Held until the frame says it rendered: before that there is no story to judge or to draw.\n const request = <T,>(id: string, msg: ToFrame, gone: (settle: Settle['resolve'], fail: (e: Error) => void) => void) =>\n new Promise<T>((resolve, reject) => {\n waiting.set(id, {\n resolve: resolve as Settle['resolve'],\n fail: reject,\n gone: () => gone(resolve as Settle['resolve'], reject),\n });\n const ask = () => channel.send(msg);\n if (current.hasRendered) ask();\n else current.queued.push(ask);\n });\n // An audit's failure is an outcome the panel shows; a capture's is a rejection, because labkit's\n // `base()` has nowhere to put one.\n const audit = (): Promise<A11yOutcome> => {\n const id = `a11y-${(requests += 1)}`;\n return request<A11yOutcome>(id, { type: 'a11y.run', id }, (resolve) =>\n resolve({ ok: false, message: 'The frame went away' } as never),\n );\n };\n const capture = (): Promise<CapturedPicture> => {\n const id = `capture-${(requests += 1)}`;\n return request<CapturedPicture>(id, { type: 'capture.run', id }, (_resolve, fail) =>\n fail(new Error('The frame could not draw itself')),\n );\n };\n const disconnect =\n frames && trialId ? frames.connect(trialId, { send: channel.send, audit, capture }) : () => {};\n const current: Link = {\n channel,\n timer,\n awaiting: null,\n sent: null,\n inputs: 0,\n disconnect,\n pending: waiting,\n hasRendered: false,\n queued: [],\n };\n link.current = current;\n channel.on((msg) => receive(current, msg));\n target.postMessage({ type: PORT_HANDOFF, id: latest.current.entry.id } satisfies PortHandoff, location.origin, [\n port2,\n ]);\n };\n\n const connectRef = useRef(connect);\n connectRef.current = connect;\n\n // A trial out of view drops its frame, and with it any WebGL contexts the story held; the config and state\n // live in the trial, so a return brings up a new frame and `init` carries them back.\n useEffect(() => {\n const slot = slotRef.current;\n if (!inView || !slot) return;\n const claimed = latest.current.pool?.claim() ?? null;\n const frame = claimed ?? document.createElement('iframe');\n frame.className = 'fg-frame-view';\n frame.title = latest.current.title;\n frame.removeAttribute('tabindex');\n frame.toggleAttribute('data-pending', true);\n iframeRef.current = frame;\n // Handshakes start on the document's hello, never on `load`: that fires before the hello, and a port handed\n // over then is one the frame, which keeps only its first, would still take in place of the right one.\n const unheard = claimed\n ? undefined\n : setTimeout(() => setFault({ phase: null, message: `Frame did not start: ${src}` }), HELLO_TIMEOUT_MS);\n const onMessage = (event: MessageEvent) => {\n if (event.source !== frame.contentWindow || event.origin !== location.origin) return;\n if ((event.data as { type?: unknown } | null)?.type !== FRAME_HELLO) return;\n clearTimeout(unheard);\n connectRef.current(frame);\n };\n window.addEventListener('message', onMessage);\n if (claimed) {\n moveFrame(slot, claimed);\n connectRef.current(claimed);\n } else {\n frame.src = src;\n slot.append(frame);\n }\n return () => {\n window.removeEventListener('message', onMessage);\n clearTimeout(unheard);\n closeLink(link);\n frame.remove();\n iframeRef.current = null;\n setPending(true);\n setFault(null);\n };\n }, [inView, src]);\n\n useEffect(() => {\n iframeRef.current?.toggleAttribute('data-pending', pending && !fault);\n }, [pending, fault, inView, src]);\n\n useEffect(() => {\n if (iframeRef.current) iframeRef.current.title = title;\n }, [title]);\n\n useEffect(() => answers.hold(ctx.config), [answers, ctx.config]);\n\n useEffect(() => {\n const current = link.current;\n if (!current) return;\n if (current.awaiting !== null) {\n if (current.awaiting === descriptionKey) init(current);\n return;\n }\n const sent = current.sent;\n if (!sent) return;\n let input = false;\n const config = storyConfig(ctx.config, sent.config);\n if (config !== sent.config) {\n sent.config = config;\n current.channel.send({ type: 'config', config });\n current.inputs += 1;\n input = true;\n }\n if (ctx.state !== sent.state) {\n sent.state = ctx.state;\n current.channel.send({ type: 'state', state: ctx.state });\n current.inputs += 1;\n input = true;\n }\n if (globals !== sent.globals && stableStringify(globals) !== stableStringify(sent.globals)) {\n sent.globals = globals;\n current.channel.send({ type: 'globals', globals });\n current.inputs += 1;\n input = true;\n }\n // The frame retries its render on new input and faults again if it still throws.\n if (input) setFault((shown) => (shown?.phase === 'render' ? null : shown));\n }, [ctx.config, ctx.state, globals, descriptionKey]);\n\n return (\n <div\n ref={(el) => {\n hostRef.current = el;\n if (trialId && frames) frames.hostRef(trialId).current = el;\n }}\n className=\"fg-frame-host\"\n >\n {/* The frame is placed here by hand: a pooled one arrives already loaded, and React would reload it. */}\n <div ref={slotRef} className=\"fg-frame-slot\" />\n {fault ? (\n <div className=\"fg-fault\" role=\"alert\">\n {fault.phase ? <span className=\"fg-fault__phase\">{fault.phase}</span> : null}\n <p className=\"fg-fault__message\">{fault.message}</p>\n </div>\n ) : null}\n </div>\n );\n}\n","import { breadcrumb } from './breadcrumb';\nimport type { Instrument } from '@weasel-js/labkit';\nimport { type ConfigSchema, f } from '@weasel-js/labkit/config';\nimport { schemaFromDescription } from '../protocol/schema';\nimport type { IndexEntry } from '../story/types';\nimport type { AnswerBook } from './answers';\nimport { FrameView } from './FrameView';\nimport { type GlobalDeclarations, withGlobals } from './globals';\nimport { type Ready, readyKey } from './readyKey';\n\nexport interface StoryInstrumentOptions {\n entry: IndexEntry;\n /** The frame's `ready`, once one arrived; absent, the instrument is provisional. */\n ready?: Ready;\n answers: AnswerBook;\n frameUrl: string;\n onReady: (entry: IndexEntry, ready: Ready) => void;\n /** Declared globals, which the schema gains as a `$globals` group of per-trial pins. */\n globals?: GlobalDeclarations;\n}\n\n/** A story as a lab instrument. Its frame reads the lab's globals from the surrounding `StoryGlobalsContext`. */\nexport function storyInstrument(options: StoryInstrumentOptions): Instrument<unknown, unknown> {\n const { entry, ready, answers, frameUrl, onReady, globals = {} } = options;\n const config = withGlobals(\n ready ? schemaFromDescription(ready.schema, answers) : (f.schema({}) as ConfigSchema<unknown>),\n globals,\n );\n const descriptionKey = ready ? readyKey(ready) : null;\n return {\n name: entry.id,\n title: breadcrumb(entry.title, entry.name),\n config,\n defaultConfig: () => config.defaults(),\n initialState: () => null,\n render: (ctx) => (\n <FrameView\n entry={entry}\n frameUrl={frameUrl}\n answers={answers}\n onReady={onReady}\n descriptionKey={descriptionKey}\n ctx={ctx}\n />\n ),\n ...(ready?.viewport ? { stage: { size: { width: ready.viewport.width, height: ready.viewport.height } } } : {}),\n };\n}\n","import type { Instrument, InstrumentList } from '@weasel-js/labkit';\nimport { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport type { FrameSetup } from '../frame/FrameController';\nimport type { FrameImporters } from '../frame/mountFrame';\nimport { stableStringify } from '../protocol/messages';\nimport { indexId, isIndexId } from '../story/indexPages';\nimport { libraryOf } from '../story/library';\nimport { isGallery } from '../story/tags';\nimport { indexRenderOf, loadStories } from '../story/load';\nimport type { IndexEntry, LoadedStory } from '../story/types';\nimport { type AnswerBook, createAnswerBook } from './answers';\nimport { documentInstrument, type Loaded, pendingInstrument } from './documentInstrument';\nimport type { GlobalDeclarations } from './globals';\nimport { type Ready, readyKey } from './readyKey';\nimport { storyInstrument } from './storyInstrument';\n\nexport interface StoryRegistry {\n instruments: InstrumentList;\n /** Whether a story's schema is known: its module has loaded, or its frame has reported. An instrument is built\n * either way, and before that its schema is empty — which reads as \"no args\" to anything that cannot tell the\n * two apart. */\n isReady: (id: string) => boolean;\n /** Called by FrameView. Replaces the story's instrument only when `ready.schema`, layout or viewport differ from what it holds. */\n onReady: (entry: IndexEntry, ready: Ready) => void;\n /** Drops what was loaded from `file` and loads it again for every entry that had it, as after an edit. */\n reload: (file: string) => void;\n}\n\nexport interface StoryRegistryOptions {\n frameUrl: string;\n globals?: GlobalDeclarations;\n /** Story modules by file. Given, every entry without `isolate` renders in the workshop document; absent, every\n * entry renders in a frame. */\n importers?: FrameImporters;\n /** The frame config, applied to each story host in the document. */\n setup?: FrameSetup;\n load?: (mod: Record<string, unknown>, autoTitle: string, parameters?: Record<string, unknown>) => LoadedStory[];\n}\n\ninterface Built {\n entryKey: string;\n ready: Ready | undefined;\n loaded: Loaded | undefined;\n fault: Error | undefined;\n frameUrl: string;\n globals: GlobalDeclarations;\n setup: FrameSetup | undefined;\n inDocument: boolean;\n generation: number;\n revision: number;\n instrument: Instrument<unknown, unknown>;\n}\n\ninterface Cache {\n built: ReadonlyMap<string, Built>;\n books: ReadonlyMap<string, AnswerBook>;\n list: InstrumentList;\n}\n\nconst NO_GLOBALS: GlobalDeclarations = {};\nconst NO_SETUP: FrameSetup = {};\n\nconst pruned = <V>(map: ReadonlyMap<string, V>, ids: Set<string>): ReadonlyMap<string, V> =>\n [...map.keys()].every((id) => ids.has(id)) ? map : new Map([...map].filter(([id]) => ids.has(id)));\n\nconst toError = (error: unknown): Error => (error instanceof Error ? error : new Error(String(error)));\n\n/**\n * One instrument per story in `index`, each schema holding a `$globals` group for `globals`. The lab's global values\n * reach the stories through `StoryGlobalsContext`, not through here.\n */\nexport function useStoryRegistry(index: readonly IndexEntry[], options: StoryRegistryOptions): StoryRegistry {\n const { frameUrl, globals = NO_GLOBALS, importers, setup = NO_SETUP, load = loadStories } = options;\n const [readies, setReadies] = useState<ReadonlyMap<string, Ready>>(() => new Map());\n const [loaded, setLoaded] = useState<ReadonlyMap<string, Loaded>>(() => new Map());\n const [faults, setFaults] = useState<ReadonlyMap<string, Error>>(() => new Map());\n // Per file, how many reloads it has had: a pending face keyed by it asks again after one.\n const [generations, setGenerations] = useState<ReadonlyMap<string, number>>(() => new Map());\n // Bumped when a story's frame answers something new. labkit's panel re-reads the answer book only when\n // the trial's config changes, and replacing the instrument is what refills it.\n const [revisions, setRevisions] = useState<ReadonlyMap<string, number>>(() => new Map());\n\n const onReady = useCallback((entry: IndexEntry, ready: Ready) => {\n setReadies((prev) => {\n const held = prev.get(entry.id);\n if (held && readyKey(held) === readyKey(ready)) return prev;\n return new Map(prev).set(entry.id, ready);\n });\n }, []);\n\n useEffect(() => {\n const ids = new Set(index.map((entry) => entry.id));\n setReadies((prev) => pruned(prev, ids));\n setLoaded((prev) => pruned(prev, ids));\n setFaults((prev) => pruned(prev, ids));\n setRevisions((prev) => pruned(prev, ids));\n }, [index]);\n\n // One import per file, shared by every entry it holds; a reload drops the file's promise and asks again.\n const imports = useRef(new Map<string, Promise<Record<string, unknown>>>());\n const live = useRef({ index, importers, setup, load });\n live.current = { index, importers, setup, load };\n\n const importOf = useCallback((file: string): Promise<Record<string, unknown>> => {\n let loading = imports.current.get(file);\n if (!loading) {\n const importer = live.current.importers?.[file];\n loading = importer ? importer() : Promise.reject(new Error(`No importer for ${file}`));\n imports.current.set(file, loading);\n }\n return loading;\n }, []);\n\n const request = useCallback(\n (entry: IndexEntry): void => {\n const { setup: current, load: loadModule } = live.current;\n const settle = (ids: string[], result: Map<string, Loaded>) => {\n setLoaded((prev) => {\n const next = new Map(prev);\n for (const [id, value] of result) next.set(id, value);\n return next;\n });\n setFaults((prev) => (ids.some((id) => prev.has(id)) ? pruned(prev, new Set([...prev.keys()].filter((id) => !ids.includes(id)))) : prev));\n };\n const fail = (ids: string[], error: unknown) => {\n const fault = toError(error);\n setFaults((prev) => {\n const next = new Map(prev);\n for (const id of ids) next.set(id, fault);\n return next;\n });\n };\n if (isIndexId(entry.id)) {\n const entries = live.current.index.filter((e) => !isIndexId(e.id) && indexId(e.title) === entry.id);\n const files = [...new Set(entries.map((e) => e.file))];\n void Promise.all(files.map(importOf))\n .then(async (mods) => {\n const byFile = new Map(files.map((file, i) => [file, loadModule(mods[i] ?? {}, entry.title, current.parameters)]));\n const stories = entries.flatMap(\n (e) => byFile.get(e.file)?.find((s) => s.exportName === e.exportName) ?? [],\n );\n for (const story of stories) await current.prepare?.(story);\n const result = new Map<string, Loaded>();\n result.set(entry.id, {\n kind: 'index',\n bundle: {\n title: entry.title,\n library: libraryOf(entry),\n ...(entry.componentDescription === undefined ? {} : { description: entry.componentDescription }),\n ...(entry.tags === undefined ? {} : { tags: entry.tags }),\n galleries: entries.filter(isGallery).map((e) => e.id),\n stories,\n descriptions: Object.fromEntries(entries.flatMap((e) => (e.description ? [[e.id, e.description]] : []))),\n render: mods.map(indexRenderOf).find((render) => render !== null) ?? null,\n },\n });\n settle([entry.id], result);\n })\n .catch((error: unknown) => fail([entry.id], error));\n return;\n }\n const siblings = live.current.index.filter((e) => e.file === entry.file && !isIndexId(e.id));\n const ids = siblings.map((e) => e.id);\n void importOf(entry.file)\n .then(async (mod) => {\n const stories = loadModule(mod, entry.title, current.parameters);\n const result = new Map<string, Loaded>();\n for (const sibling of siblings) {\n const story = stories.find((s) => s.exportName === sibling.exportName);\n if (!story) continue;\n await current.prepare?.(story);\n result.set(sibling.id, { kind: 'story', story });\n }\n if (!result.has(entry.id)) throw new Error(`${entry.file} has no story export \"${entry.exportName}\"`);\n settle(ids, result);\n })\n .catch((error: unknown) => fail(ids, error));\n },\n [importOf],\n );\n\n const reload = useCallback(\n (file: string) => {\n imports.current.delete(file);\n const affected = live.current.index.filter((e) => e.file === file || (isIndexId(e.id) && live.current.index.some((s) => s.file === file && indexId(s.title) === e.id)));\n const ids = new Set(affected.map((e) => e.id));\n setLoaded((prev) => pruned(prev, new Set([...prev.keys()].filter((id) => !ids.has(id)))));\n setFaults((prev) => pruned(prev, new Set([...prev.keys()].filter((id) => !ids.has(id)))));\n setGenerations((prev) => new Map(prev).set(file, (prev.get(file) ?? 0) + 1));\n },\n [],\n );\n\n const committed = useRef<Cache>({ built: new Map(), books: new Map(), list: [] });\n\n const cache = useMemo<Cache>(() => {\n const previous = committed.current;\n const built = new Map<string, Built>();\n const books = new Map<string, AnswerBook>();\n const list = index.map((entry) => {\n const ready = readies.get(entry.id);\n const inDocument = importers !== undefined && entry.isolate === undefined;\n const had = loaded.get(entry.id);\n const fault = faults.get(entry.id);\n const generation = generations.get(entry.file) ?? 0;\n const revision = revisions.get(entry.id) ?? 0;\n const entryKey = stableStringify(entry);\n const answers = previous.books.get(entry.id) ?? createAnswerBook();\n books.set(entry.id, answers);\n const held = previous.built.get(entry.id);\n const kept =\n held &&\n held.entryKey === entryKey &&\n held.ready === ready &&\n held.loaded === had &&\n held.fault === fault &&\n held.frameUrl === frameUrl &&\n held.globals === globals &&\n held.setup === setup &&\n held.inDocument === inDocument &&\n held.generation === generation &&\n held.revision === revision\n ? held\n : {\n entryKey,\n ready,\n loaded: had,\n fault,\n frameUrl,\n globals,\n setup,\n inDocument,\n generation,\n revision,\n instrument: !inDocument\n ? storyInstrument({ entry, ready, answers, frameUrl, onReady, globals })\n : had\n ? documentInstrument({ entry, loaded: had, setup, globals })\n : pendingInstrument({ entry, globals, load: request, generation, ...(fault ? { fault } : {}) }),\n };\n built.set(entry.id, kept);\n return kept.instrument;\n });\n const unchanged = list.length === previous.list.length && list.every((i, n) => i === previous.list[n]);\n return { built, books, list: unchanged ? previous.list : list };\n }, [index, readies, loaded, faults, generations, revisions, frameUrl, globals, setup, importers, onReady, request]);\n\n useLayoutEffect(() => {\n committed.current = cache;\n }, [cache]);\n\n useEffect(() => {\n const offs = [...cache.books].map(([id, book]) =>\n book.subscribe(() => setRevisions((prev) => new Map(prev).set(id, (prev.get(id) ?? 0) + 1))),\n );\n return () => {\n for (const off of offs) off();\n };\n }, [cache.books]);\n\n const isReady = useCallback((id: string) => readies.has(id) || loaded.has(id), [readies, loaded]);\n\n return { instruments: cache.list, isReady, onReady, reload };\n}\n","import { Lab, type LabContribution, type StorageAdapter, useLabContext } from '@weasel-js/labkit';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type { ShellConfig } from '../config';\nimport type { FrameSetup } from '../frame/FrameController';\nimport type { FrameImporters } from '../frame/mountFrame';\nimport { type Globals, stableStringify } from '../protocol/messages';\nimport { indexEntries } from '../story/indexPages';\nimport type { DepGraph, IndexEntry } from '../story/types';\nimport { DependenciesContext } from './dependencies';\nimport { InfoIcon } from '@weasel-js/ui';\nimport { A11Y_SECTION } from './a11y/A11yPanel';\nimport { CSS_VARS_SECTION } from './cssVars/CssVarsPanel';\nimport { StoryInfoDialog } from './info/StoryInfoDialog';\nimport { createFramePool, type FramePool, FramePoolContext } from './framePool';\nimport { createTrialFrames, TrialFramesContext } from './trialFrames';\nimport { type GlobalDeclarations, labGlobals } from './globals';\nimport { GlobalsToolbar, LabGlobals } from './GlobalsToolbar';\nimport type { StoryChanges } from './storyChanges';\nimport { StoryGlobalsContext } from './StoryGlobalsContext';\nimport { StoryTree } from './tree/StoryTree';\nimport { crossesInPlace, readRoute, readRouteEntry, useRoute } from './useRoute';\nimport { useStoryRegistry } from './useStoryRegistry';\n\nexport interface WorkshopProps {\n index: readonly IndexEntry[];\n /** The frame document, for the stories `isolate` keeps in one. */\n frameUrl: string;\n /** Story modules by file. Given, stories render in the workshop document; absent, every story renders in a frame. */\n importers?: FrameImporters;\n /** The frame config, applied to each story rendered in the document. */\n setup?: FrameSetup;\n /** Story files edited while the workshop runs; each is loaded again for the stories that had it. */\n changes?: StoryChanges;\n config?: ShellConfig;\n /** The story globs the index was built from, named when it is empty. */\n stories?: readonly string[];\n storageKey?: string;\n storage?: StorageAdapter;\n /** The component graph index pages list dependencies from. */\n dependencies?: DepGraph;\n}\n\nconst NO_DECLARATIONS: GlobalDeclarations = {};\n\n/** The story or index page `#/<id>` names, when there is one; otherwise `fallback`. Read when the lab mounts. */\nfunction initialStory(entries: readonly IndexEntry[], fallback: string): string {\n const route = readRoute();\n return route !== null && entries.some((entry) => entry.id === route) ? route : fallback;\n}\n\n/**\n * Shows the story the route names when no trial shows it, once per route, so closing that trial sticks. It goes\n * into the trial the previous route was in when a history step crosses an in-place swap, so Back returns that\n * trial to its previous story; otherwise into the focused trial, as a click in the tree does. Only a lab with no\n * trial at all gets a new one: another trial is what Shift-click is for.\n */\nfunction RouteOpener({ index }: { index: readonly IndexEntry[] }) {\n const lab = useLabContext();\n const [route] = useRoute();\n const handled = useRef<string | null>(null);\n const last = useRef({ route: readRoute(), entry: readRouteEntry() });\n useEffect(() => {\n const from = last.current;\n if (route !== from.route) last.current = { route, entry: readRouteEntry() };\n if (route === null || handled.current === route || !index.some((e) => e.id === route)) return;\n handled.current = route;\n if (lab.trials.some((trial) => trial.instrumentName === route)) return;\n const previous = lab.trials.find((trial) => trial.instrumentName === from.route);\n const target =\n (previous && crossesInPlace(from.entry, last.current.entry) ? previous : undefined) ??\n lab.trials.find((trial) => trial.id === lab.focusedTrialId) ??\n lab.trials[0];\n if (target) lab.swapTrial(target.id, route);\n else lab.addTrial(route);\n }, [route, index, lab]);\n return null;\n}\n\n/**\n * Opens Get Info on ⌘I / Ctrl+I. `ToolItem.shortcut` is a tooltip hint —\n * labkit binds no keys — so the shell binds its own.\n */\nfunction useInfoShortcut(open: (next: boolean) => void): void {\n useEffect(() => {\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key !== 'i' && event.key !== 'I') return;\n if (!(event.metaKey || event.ctrlKey) || event.altKey || event.shiftKey) return;\n const target = event.target as HTMLElement | null;\n if (target?.isContentEditable || /^(input|textarea|select)$/i.test(target?.tagName ?? '')) return;\n event.preventDefault();\n open(true);\n };\n window.addEventListener('keydown', onKeyDown);\n return () => window.removeEventListener('keydown', onKeyDown);\n }, [open]);\n}\n\nexport function Workshop({ index, frameUrl, importers, setup, changes, config, stories = [], storageKey, storage, dependencies }: WorkshopProps) {\n const declarations = config?.globals ?? NO_DECLARATIONS;\n const [frames] = useState(createTrialFrames);\n const [pool, setPool] = useState<FramePool | null>(null);\n // Warm frames are for the stories that render in one: every story when no importers are given, else the isolated.\n const framed = importers === undefined || index.some((entry) => entry.isolate !== undefined);\n useEffect(() => {\n if (!framed) return;\n const next = createFramePool(frameUrl);\n setPool(next);\n return () => {\n next.dispose();\n setPool(null);\n };\n }, [frameUrl, framed]);\n const entries = useMemo(() => [...index, ...indexEntries(index)], [index]);\n const registry = useStoryRegistry(entries, {\n frameUrl,\n globals: declarations,\n ...(importers ? { importers } : {}),\n ...(setup ? { setup } : {}),\n });\n const reload = registry.reload;\n useEffect(() => changes?.subscribe(reload), [changes, reload]);\n const [labValues, setLabValues] = useState<Globals>(() => labGlobals(declarations, undefined));\n const themeFor = config?.labTheme;\n const labTheme = useMemo(() => themeFor?.(labValues), [themeFor, labValues]);\n const [infoOpen, setInfoOpen] = useState(false);\n useInfoShortcut(setInfoOpen);\n const reportLabValues = useCallback(\n (next: Globals) => setLabValues((prev) => (stableStringify(prev) === stableStringify(next) ? prev : next)),\n [],\n );\n const labChrome = useMemo<readonly LabContribution[]>(\n () => [\n { id: 'fg-stories', region: 'sidebar', render: (ctx) => <StoryTree ctx={ctx} index={index} /> },\n {\n id: 'fg-info',\n region: 'palette',\n item: { icon: InfoIcon, label: 'Info', shortcut: '⌘I', onActivate: () => setInfoOpen(true) },\n },\n CSS_VARS_SECTION,\n A11Y_SECTION,\n ...(Object.keys(declarations).length > 0\n ? [{ id: 'fg-globals', region: 'header', render: () => <GlobalsToolbar declarations={declarations} /> } as const]\n : []),\n ...(config?.labChrome ?? []),\n ],\n [index, declarations, config?.labChrome],\n );\n const first = index[0];\n if (!first) {\n return (\n <div className=\"fg-empty\">\n <p className=\"fg-empty__title\">No stories found</p>\n {stories.length > 0 ? (\n <ul className=\"fg-empty__globs\" aria-label=\"Story globs\">\n {stories.map((glob) => (\n <li key={glob}>\n <code>{glob}</code>\n </li>\n ))}\n </ul>\n ) : null}\n </div>\n );\n }\n return (\n <StoryGlobalsContext.Provider value={labValues}>\n <DependenciesContext.Provider value={dependencies ?? null}>\n <FramePoolContext.Provider value={pool}>\n <TrialFramesContext.Provider value={frames}>\n <Lab\n title=\"weaselforge\"\n density=\"roomy\"\n {...(labTheme ? { theme: labTheme } : {})}\n instruments={registry.instruments}\n defaultInstrument={initialStory(entries, first.id)}\n storageKey={storageKey ?? 'weaselforge'}\n {...(storage ? { storage } : {})}\n labChrome={labChrome}\n addTrial={false}\n {...(config?.controls ? { controls: config.controls } : {})}\n {...(config?.pages ? { pages: config.pages } : {})}\n {...(config?.path !== undefined ? { path: config.path } : {})}\n >\n <RouteOpener index={entries} />\n <StoryInfoDialog\n index={index}\n isReady={registry.isReady}\n isOpen={infoOpen}\n onOpenChange={setInfoOpen}\n />\n <LabGlobals declarations={declarations} onChange={reportLabValues} />\n </Lab>\n </TrialFramesContext.Provider>\n </FramePoolContext.Provider>\n </DependenciesContext.Provider>\n </StoryGlobalsContext.Provider>\n );\n}\n","import { createRoot } from 'react-dom/client';\nimport type { FrameImporters } from '../frame/mountFrame';\nimport type { DepGraph, IndexEntry } from '../story/types';\nimport { createStoryChanges } from './storyChanges';\nimport { Workshop, type WorkshopProps } from './Workshop';\n\nexport interface MountWorkshopOptions extends WorkshopProps {\n /** Default: the document's `#root`. */\n container?: HTMLElement;\n}\n\nexport interface MountedWorkshop {\n /** Swaps in a re-indexed story list, as the vite plugin's `forge:index` event carries. */\n setIndex(index: readonly IndexEntry[]): void;\n /** Swaps in importers whose URLs fetch the modules as they are now, after an edit. */\n setImporters(importers: FrameImporters): void;\n /** Loads `file` again for every story that had it, through the current importers. */\n reloadStory(file: string): void;\n /** Swaps in the component graph, as the vite plugin's `forge:deps` event carries. */\n setDependencies(dependencies: DepGraph): void;\n unmount(): void;\n}\n\nexport function mountWorkshop({ container, ...props }: MountWorkshopOptions): MountedWorkshop {\n const target = container ?? document.getElementById('root');\n if (!target) throw new Error('mountWorkshop: no container given and no #root element');\n const root = createRoot(target);\n const changes = createStoryChanges();\n let current: WorkshopProps = { ...props, changes };\n root.render(<Workshop {...current} />);\n return {\n setIndex(index) {\n current = { ...current, index };\n root.render(<Workshop {...current} />);\n },\n setImporters(importers) {\n current = { ...current, importers };\n root.render(<Workshop {...current} />);\n },\n reloadStory: (file) => changes.emit(file),\n setDependencies(dependencies) {\n current = { ...current, dependencies };\n root.render(<Workshop {...current} />);\n },\n unmount: () => root.unmount(),\n };\n}\n"]}
1
+ {"version":3,"sources":["../../src/shell/a11y/A11yPanel.tsx","../../src/shell/storyChanges.ts","../../src/shell/dependencies.ts","../../src/shell/cssVars/saveScales.ts","../../src/shell/cssVars/CssVarsPanel.tsx","../../src/shell/breadcrumb.ts","../../src/shell/info/dossier.ts","../../src/shell/info/StoryDossier.tsx","../../src/shell/info/StoryInfoDialog.tsx","../../src/shell/framePool.ts","../../src/shell/GlobalsToolbar.tsx","../../src/shell/revealTrial.ts","../../src/shell/useRoute.ts","../../src/shell/tree/buildTree.ts","../../src/shell/tree/buildComponents.ts","../../src/shell/tree/StoryTree.tsx","../../src/shell/answers.ts","../../src/shell/IndexTrial.tsx","../../src/shell/documentInstrument.tsx","../../src/shell/readyKey.ts","../../src/shell/FrameView.tsx","../../src/shell/storyInstrument.tsx","../../src/shell/useStoryRegistry.ts","../../src/shell/Workshop.tsx","../../src/shell/mountWorkshop.tsx"],"names":["generateScale","f","useTrialId","useState","jsxs","jsx","ToggleBar","Button","useLabContext","labGlobals","TrialIdContext","handle","createContext","usePersistedState","useMemo","useCallback","useRef","Fragment","useEffect","LibraryBadge","setRoute","rest","row","keyOf","useContext","settle","answers","NO_GLOBALS","useLatest","ids"],"mappings":"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","file":"index.js","sourcesContent":["import {\n Button,\n type LabContribution,\n TrialIdContext,\n useLabContext,\n useTrialId,\n} from '@weasel-js/labkit';\nimport { useEffect, useRef, useState } from 'react';\nimport type { A11yFinding } from '../../protocol/messages';\nimport { useTrialFrame } from '../trialFrames';\n\nfunction Finding({ finding }: { finding: A11yFinding }) {\n return (\n <li className=\"fg-a11y__finding\">\n <p className=\"fg-a11y__help\">\n <a href={finding.helpUrl} target=\"_blank\" rel=\"noreferrer\">\n {finding.help}\n </a>\n {finding.impact ? <span className=\"fg-a11y__impact\" data-impact={finding.impact}>{finding.impact}</span> : null}\n </p>\n <ul className=\"fg-a11y__nodes\">\n {finding.nodes.map((node) => (\n <li key={`${finding.id}:${node.target.join(',')}`}>\n <code>{node.target.join(' ')}</code>\n </li>\n ))}\n </ul>\n </li>\n );\n}\n\nfunction Findings({ title, findings }: { title: string; findings: readonly A11yFinding[] }) {\n if (findings.length === 0) return null;\n return (\n <section className=\"fg-a11y__group\">\n <h3 className=\"fg-a11y__group-title\">\n {title} ({findings.length})\n </h3>\n <ul className=\"fg-a11y__findings\">\n {findings.map((finding) => (\n <Finding key={finding.id} finding={finding} />\n ))}\n </ul>\n </section>\n );\n}\n\n/** What axe found in the story of the trial this is rendered inside, re-run on demand. */\nexport function A11yPanel() {\n const trialId = useTrialId();\n const frame = useTrialFrame(trialId);\n const [running, setRunning] = useState(false);\n const audit = frame.audit;\n // One automatic run per connected frame, so opening the panel answers without being asked.\n const ran = useRef<typeof audit>(null);\n\n useEffect(() => {\n if (!audit || ran.current === audit) return;\n ran.current = audit;\n setRunning(true);\n void audit().finally(() => setRunning(false));\n }, [audit]);\n\n const rerun = () => {\n if (!audit) return;\n setRunning(true);\n void audit().finally(() => setRunning(false));\n };\n\n const outcome = frame.a11y;\n return (\n <div className=\"fg-a11y\">\n <div className=\"fg-a11y__controls\">\n <Button size=\"sm\" variant=\"secondary\" onClick={rerun} disabled={!audit || running}>\n {running ? 'Checking…' : 'Re-check'}\n </Button>\n </div>\n {!audit ? <p className=\"fg-a11y__note\">No frame is connected.</p> : null}\n {audit && !outcome ? <p className=\"fg-a11y__note\">{running ? 'Running axe…' : 'Not checked yet.'}</p> : null}\n {outcome && !outcome.ok ? (\n <p className=\"fg-a11y__note\" role=\"alert\">\n axe could not run: {outcome.message}\n </p>\n ) : null}\n {outcome?.ok ? (\n <>\n <p className=\"fg-a11y__tally\">\n {outcome.report.violations.length} violations · {outcome.report.incomplete.length} to review ·{' '}\n {outcome.report.passes} passes\n </p>\n <Findings title=\"Violations\" findings={outcome.report.violations} />\n <Findings title=\"Needs review\" findings={outcome.report.incomplete} />\n </>\n ) : null}\n </div>\n );\n}\n\n/** The panel for the lab's focused trial, rendered as though inside that trial. */\nfunction FocusedA11y() {\n const { focusedTrialId, trials, instruments } = useLabContext();\n const record = trials.find((trial) => trial.id === focusedTrialId);\n if (!record) return null;\n const instrument = instruments.find((i) => i.name === record.instrumentName);\n return (\n <section className=\"fg-a11y-focus\" aria-label=\"Accessibility\">\n <p className=\"fg-a11y__trial\">{record.title ?? instrument?.title ?? record.instrumentName}</p>\n <TrialIdContext.Provider value={record.id}>\n <A11yPanel />\n </TrialIdContext.Provider>\n </section>\n );\n}\n\n/** The lab aside section showing the focused trial's accessibility audit. */\nexport const A11Y_SECTION: LabContribution = {\n id: 'fg-a11y',\n region: 'aside',\n item: { title: 'Accessibility', body: <FocusedA11y /> },\n};\n","/** Story files edited while the workshop runs, for the registry to load again. */\nexport interface StoryChanges {\n subscribe(listener: (file: string) => void): () => void;\n emit(file: string): void;\n}\n\nexport function createStoryChanges(): StoryChanges {\n const listeners = new Set<(file: string) => void>();\n return {\n subscribe(listener) {\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n emit(file) {\n for (const listener of [...listeners]) listener(file);\n },\n };\n}\n","import { createContext } from 'react';\nimport type { DepGraph } from '../story/types';\n\n/** The component graph the vite plugin derived from source; null until it arrives. */\nexport const DependenciesContext = createContext<DepGraph | null>(null);\n","import type { TokenScaleRule } from '@weasel-js/labkit';\nimport { isByAxis, type AxisDefs, type Selection, type ThemeDefinition } from '@weasel-js/theme';\nimport type { Globals } from '../../protocol/messages';\n\n/** A scale as the panel left it: what a save writes into the definition. */\nexport interface ScaleEdit {\n readonly base: number;\n readonly rule: TokenScaleRule;\n}\n\nexport type ScaleEditResult =\n | { readonly ok: true; readonly definition: ThemeDefinition }\n | { readonly ok: false; readonly message: string };\n\ntype Holder = Record<string | number, unknown>;\n\ninterface Slot {\n readonly holder: Holder;\n readonly key: string | number;\n /** Where the slot is, for a message: `scales.font-size.base`, `seeds.ui-base.compact`. */\n readonly where: string;\n}\n\nconst SEED_REF = /^\\{seeds\\.([^}]+)\\}$/;\nconst RULE_KEYS = { factors: 'factors', ratio: 'ratio', step: 'step' } as const;\n\n/**\n * The axis values a trial renders under, from the workshop's globals: a global named for an axis picks its value; an\n * axis no global names renders at its default. A global holding something the axis does not offer (`mode: 'auto'`)\n * leaves that axis out, because which value it resolved to is not known here.\n */\nexport function selectionFor(axes: AxisDefs, globals: Globals): Selection {\n const out: Record<string, string> = {};\n for (const [axis, def] of Object.entries(axes)) {\n const value = globals[axis];\n if (value === undefined) out[axis] = def.default;\n else if (typeof value === 'string' && value in def.values) out[axis] = value;\n }\n return out;\n}\n\nclass EditError extends Error {}\n\n/** Follows a param through its per-axis branches and `{seeds.name}` references to the number that defines it. */\nfunction slotOf(root: ThemeDefinition, holder: Holder, key: string | number, where: string, selection: Selection, depth = 0): Slot {\n if (depth > 16) throw new EditError(`${where} references itself`);\n let h = holder;\n let k = key;\n let w = where;\n let value = h[k];\n while (isByAxis(value)) {\n const axis = value.by;\n const picked = selection[axis];\n if (picked === undefined || picked === 'by' || !(picked in value)) {\n throw new EditError(`${w} differs by ${axis}, and which ${axis} this trial shows is not known`);\n }\n h = value as unknown as Holder;\n k = picked;\n w = `${w}.${picked}`;\n value = h[k];\n }\n if (typeof value === 'number') return { holder: h, key: k, where: w };\n if (typeof value === 'string') {\n const ref = SEED_REF.exec(value);\n if (!ref) throw new EditError(`${w} is \"${value}\", which is not a number or a seed`);\n const name = ref[1]!;\n const seeds = root.seeds as Holder | undefined;\n if (!seeds || !(name in seeds)) throw new EditError(`${w} names the seed \"${name}\", which this theme inherits rather than defines`);\n return slotOf(root, seeds, name, `seeds.${name}`, selection, depth + 1);\n }\n throw new EditError(`${w} is not a number`);\n}\n\n/** The factor list the selection reads, through any per-axis branches. */\nfunction factorsOf(holder: Holder, where: string, selection: Selection): { list: Holder; where: string } {\n let value = holder.factors;\n let w = `${where}.factors`;\n while (isByAxis(value)) {\n const picked = selection[value.by];\n if (picked === undefined || !(picked in value)) {\n throw new EditError(`${w} differs by ${value.by}, and which ${value.by} this trial shows is not known`);\n }\n w = `${w}.${picked}`;\n value = (value as unknown as Holder)[picked];\n }\n if (!Array.isArray(value)) throw new EditError(`${w} is not a list`);\n return { list: value as unknown as Holder, where: w };\n}\n\nconst kindOf = (scale: Holder): TokenScaleRule['kind'] | null =>\n scale.factors !== undefined ? 'factors' : scale.ratio !== undefined ? 'ratio' : scale.step !== undefined ? 'step' : null;\n\nconst plainLiteral = (value: unknown): boolean =>\n typeof value === 'number' || (Array.isArray(value) && value.every((v) => typeof v === 'number'));\n\n/** Swaps `scale`'s rule key for another in place, in the same position, since record order is emission order. */\nfunction swapRule(scale: Holder, from: string | null, to: string, value: unknown): void {\n const entries = Object.entries(scale);\n for (const [k] of entries) delete scale[k];\n for (const [k, v] of entries) scale[k === from ? to : k] = k === from ? value : v;\n if (from === null) scale[to] = value;\n}\n\n/**\n * `definition` with each edited scale written back. A number the scale reads through a reference or a per-axis branch\n * is written where it lives — `{seeds.ui-base}` changes the seed, and only the branch for `selection` — so every other\n * axis value keeps its own. Changing a scale's rule kind replaces the rule, which is refused when the old one was\n * anything but a plain literal, since that would flatten it.\n */\nexport function applyScaleEdits(\n definition: ThemeDefinition,\n edits: Readonly<Record<string, ScaleEdit>>,\n selection: Selection,\n): ScaleEditResult {\n const root = structuredClone(definition) as ThemeDefinition & { scales?: Record<string, Holder> };\n const writes = new Map<Holder, Map<string | number, number>>();\n const write = (slot: Slot, value: number) => {\n let byKey = writes.get(slot.holder);\n if (!byKey) writes.set(slot.holder, (byKey = new Map()));\n const pending = byKey.get(slot.key);\n if (pending !== undefined && pending !== value) throw new EditError(`${slot.where} would need to be both ${pending} and ${value}`);\n byKey.set(slot.key, value);\n };\n\n try {\n for (const [name, edit] of Object.entries(edits)) {\n const scales = root.scales;\n const scale = scales?.[name];\n if (!scales || !scale) throw new EditError(`the theme defines no scale \"${name}\"`);\n const where = `scales.${name}`;\n write(slotOf(root, scale, 'base', `${where}.base`, selection), edit.base);\n\n const { rule } = edit;\n const had = kindOf(scale);\n if (had !== rule.kind) {\n const from = had ? RULE_KEYS[had] : null;\n if (from && !plainLiteral(scale[from])) {\n throw new EditError(`${where} would lose its ${from} to become a ${rule.kind} scale, and its ${from} is not a plain number`);\n }\n const value = rule.kind === 'factors' ? [...rule.factors] : rule.kind === 'ratio' ? rule.ratio : rule.step;\n swapRule(scale, from, RULE_KEYS[rule.kind], value);\n continue;\n }\n if (rule.kind === 'factors') {\n const { list, where: at } = factorsOf(scale, where, selection);\n if ((list as unknown as unknown[]).length !== rule.factors.length) {\n throw new EditError(`${at} has ${(list as unknown as unknown[]).length} factors, and the edit ${rule.factors.length}`);\n }\n rule.factors.forEach((factor, i) => write(slotOf(root, list, i, `${at}.${i}`, selection), factor));\n } else {\n const key = RULE_KEYS[rule.kind];\n write(slotOf(root, scale, key, `${where}.${key}`, selection), rule.kind === 'ratio' ? rule.ratio : rule.step);\n }\n }\n } catch (e) {\n if (e instanceof EditError) return { ok: false, message: `Cannot save: ${e.message}.` };\n throw e;\n }\n\n for (const [holder, byKey] of writes) for (const [key, value] of byKey) holder[key] = value;\n return { ok: true, definition: root };\n}\n","import {\n Input,\n inferTokenType,\n type LabContribution,\n ToggleBar,\n type ToggleBarItem,\n refitScale,\n type TokenCategory,\n type TokenEntry,\n TokenPanel,\n type TokenScale,\n type TokenScaleRule,\n TrialIdContext,\n useLabContext,\n usePersistedState,\n useTrialId,\n} from '@weasel-js/labkit';\nimport { THEME_SOURCES, TOKEN_MANIFEST } from '@weasel-js/theme';\nimport { scale as generateScale, httpThemeApi, type ThemeApi } from '@weasel-js/theme/engine';\nimport { Button } from '@weasel-js/ui';\nimport { useCallback, useContext, useMemo, useState } from 'react';\nimport type { Globals } from '../../protocol/messages';\nimport { effectiveGlobals, GLOBALS_KEY } from '../globals';\nimport { StoryGlobalsContext } from '../StoryGlobalsContext';\nimport { useTrialFrame } from '../trialFrames';\nimport { useCssOverrides } from './overrides';\nimport { applyScaleEdits, type ScaleEdit, selectionFor } from './saveScales';\n\ntype Tab = 'theme' | 'story';\n\nconst TABS: readonly ToggleBarItem<Tab>[] = [\n { value: 'theme', label: 'Theme' },\n { value: 'story', label: 'Story' },\n];\n\nconst MANIFEST = new Map(TOKEN_MANIFEST.map((token) => [token.name, token]));\n\nconst THEME_NAME = 'weasel';\n\ninterface ScaleSource {\n readonly name: string;\n readonly group: string;\n readonly steps: readonly string[];\n readonly tokens: readonly string[];\n /** The definition's rule, or its kind alone when a parameter is a reference or varies by axis. */\n readonly rule: TokenScaleRule | TokenScaleRule['kind'];\n}\n\nconst literal = (v: unknown): v is number => typeof v === 'number';\n\n/** The weasel theme's scales, as the panel can regenerate them. */\nconst SCALE_SOURCES: readonly ScaleSource[] = Object.entries(THEME_SOURCES[THEME_NAME]?.scales ?? {}).flatMap(([name, def]) => {\n if (!Array.isArray(def.steps)) return [];\n const steps = def.steps as readonly string[];\n const tokens = steps.map((step) => `--wzl-${name}-${step}`);\n const group = MANIFEST.get(tokens[0] ?? '')?.group;\n if (!group) return [];\n const factors = Array.isArray(def.factors) && def.factors.every(literal) ? (def.factors as number[]) : null;\n const rule: ScaleSource['rule'] =\n def.factors !== undefined\n ? factors\n ? { kind: 'factors', factors }\n : 'factors'\n : def.ratio !== undefined\n ? literal(def.ratio)\n ? { kind: 'ratio', ratio: def.ratio }\n : 'ratio'\n : literal(def.step)\n ? { kind: 'step', step: def.step }\n : 'step';\n return [{ name, group, steps, tokens, rule }];\n});\n\n/** Each of a scale's tokens and the value `next` gives it. */\nfunction scaleValues(source: ScaleSource, next: TokenScale): [string, string][] {\n const { rule } = next;\n const values = generateScale(source.steps, {\n base: next.base,\n ...(rule.kind === 'factors' ? { factors: rule.factors } : rule.kind === 'ratio' ? { ratio: rule.ratio } : { step: rule.step }),\n });\n return source.steps.flatMap((step, i) => {\n const value = values[step];\n const name = source.tokens[i];\n return value !== undefined && name !== undefined ? [[name, value]] : [];\n });\n}\n\ntype Notice = { readonly trialId: string | null; readonly tone: 'saved' | 'error'; readonly text: string };\n\n/** A scale as its steps stand: the definition's rule, with the base read back from the values the frame reports. */\nfunction standingScale(source: ScaleSource, amounts: readonly number[]): TokenScale {\n const seed: TokenScale = { tokens: source.tokens, base: amounts[0] ?? 0, rule: { kind: 'step', step: 0 } };\n if (typeof source.rule === 'string') return refitScale(seed, source.rule, amounts);\n const { rule } = source;\n if (rule.kind !== 'factors') return { ...seed, rule };\n // The step nearest ×1 carries the least rounding back into the base.\n let at = 0;\n rule.factors.forEach((f, i) => {\n if (Math.abs(f - 1) < Math.abs((rule.factors[at] ?? 1) - 1)) at = i;\n });\n const base = (amounts[at] ?? 0) / (rule.factors[at] ?? 1);\n return { ...seed, base: Math.round(base * 100) / 100, rule };\n}\n\n/** A reported var's group: its name without the leading dashes or its last segment, which names the step. */\nfunction groupOf(name: string): string {\n const segments = name.replace(/^--/, '').split('-');\n return segments.length > 1 ? segments.slice(0, -1).join('-') : name.replace(/^--/, '');\n}\n\nexport interface CssVarsPanelProps {\n /** The globals the trial renders under, which pick the axis values a save writes into. */\n readonly globals?: Globals;\n /** Where a save goes. Defaults to the dev server's theme store. */\n readonly themeApi?: ThemeApi;\n}\n\nconst NO_GLOBALS: Globals = {};\n\n/**\n * Shows and overrides the CSS variables of the trial it is rendered inside: the theme's tokens, or what its frame\n * reports. Scale edits can be saved into the theme's definition file.\n */\nexport function CssVarsPanel({ globals = NO_GLOBALS, themeApi }: CssVarsPanelProps = {}) {\n const trialId = useTrialId();\n const frame = useTrialFrame(trialId);\n const [overrides, setOverrides] = useCssOverrides();\n const [folds, setFolds] = usePersistedState<Partial<Record<TokenCategory, boolean>>>(\n 'fg-css-vars-folds',\n {},\n { scope: 'lab' },\n );\n const [edited, setEdited] = usePersistedState<Record<string, TokenScale>>('fg-css-vars-scales', {}, { scope: 'lab' });\n const [tab, setTab] = useState<Tab>('theme');\n const [filter, setFilter] = useState('');\n\n const tokens = useMemo<TokenEntry[]>(() => {\n if (tab === 'story') {\n return frame.vars.map(({ name, value }) => {\n const known = MANIFEST.get(name);\n return { name, type: known?.type ?? inferTokenType(value), group: known?.group ?? groupOf(name), value };\n });\n }\n const reported = new Map(frame.vars.map((v) => [v.name, v.value]));\n return TOKEN_MANIFEST.map((token) => ({\n name: token.name,\n type: token.type,\n group: token.group,\n value: reported.get(token.name) ?? token.defaultValue,\n description: token.description,\n }));\n }, [tab, frame.vars]);\n\n const query = filter.trim().toLowerCase();\n const shown = tokens\n .map((token) => {\n const override = overrides[token.name];\n return override === undefined ? token : { ...token, value: override, overridden: true };\n })\n .filter((token) => !query || token.name.toLowerCase().includes(query) || token.value.toLowerCase().includes(query));\n\n const scales = useMemo(() => {\n if (tab !== 'theme') return undefined;\n const values = new Map(shown.map((t) => [t.name, t.value]));\n const out: Record<string, TokenScale> = {};\n for (const source of SCALE_SOURCES) {\n const amounts = source.tokens.map((name) => Number.parseFloat(values.get(name) ?? ''));\n if (amounts.some(Number.isNaN)) continue;\n const own = source.tokens.some((name) => overrides[name] !== undefined) ? edited[source.group] : undefined;\n out[source.group] = own ?? standingScale(source, amounts);\n }\n return out;\n }, [tab, shown, overrides, edited]);\n\n const send = frame.send;\n const write = useCallback(\n (name: string, value: string | null) => {\n setOverrides((prev) => {\n const { [name]: _dropped, ...rest } = prev;\n return value === null ? rest : { ...rest, [name]: value };\n });\n send?.({ type: 'vars.set', name, value });\n },\n [setOverrides, send],\n );\n const onScaleChange = useCallback(\n (group: string, next: TokenScale) => {\n const source = SCALE_SOURCES.find((sc) => sc.group === group);\n if (!source) return;\n setEdited((prev) => ({ ...prev, [group]: next }));\n for (const [name, value] of scaleValues(source, next)) write(name, value);\n },\n [setEdited, write],\n );\n\n // A scale is saved only while every one of its steps still holds what its edit generated: a step edited by hand\n // after the scale is an override the definition has no place for.\n const unsaved = useMemo(\n () =>\n SCALE_SOURCES.flatMap((source) => {\n const edit = edited[source.group];\n if (!edit || !source.tokens.some((name) => overrides[name] !== undefined)) return [];\n const values = scaleValues(source, edit);\n return values.every(([name, value]) => overrides[name] === value) ? [{ source, edit }] : [];\n }),\n [edited, overrides],\n );\n const [saving, setSaving] = useState(false);\n const [held, setHeld] = useState<Notice | null>(null);\n const notice = held?.trialId === trialId ? held : null;\n const setNotice = (next: Omit<Notice, 'trialId'> | null) => setHeld(next && { ...next, trialId });\n const save = async () => {\n setSaving(true);\n setNotice(null);\n try {\n const api = themeApi ?? httpThemeApi();\n const stored = await api.get(THEME_NAME);\n const file = `themes/${THEME_NAME}.json`;\n if (JSON.stringify(stored.definition) !== JSON.stringify(THEME_SOURCES[THEME_NAME])) {\n setNotice({ tone: 'error', text: `${file} has changed since this page loaded. Reload to edit against it.` });\n return;\n }\n const edits: Record<string, ScaleEdit> = Object.fromEntries(\n unsaved.map(({ source, edit }) => [source.name, { base: edit.base, rule: edit.rule }]),\n );\n const next = applyScaleEdits(stored.definition, edits, selectionFor(stored.definition.axes ?? {}, globals));\n if (!next.ok) {\n setNotice({ tone: 'error', text: next.message });\n return;\n }\n const result = await api.put(THEME_NAME, next.definition, stored.hash);\n if (result.status === 'conflict') {\n setNotice({ tone: 'error', text: `${file} changed on disk while saving. Nothing was written; reload to edit against it.` });\n return;\n }\n if (result.status === 'invalid') {\n setNotice({ tone: 'error', text: result.message });\n return;\n }\n for (const { source } of unsaved) for (const name of source.tokens) write(name, null);\n const groups = new Set(unsaved.map(({ source }) => source.group));\n setEdited((prev) => Object.fromEntries(Object.entries(prev).filter(([group]) => !groups.has(group))));\n setNotice(\n result.regenerated || result.problems.length === 0\n ? { tone: 'saved', text: `Saved to ${file}.` }\n : { tone: 'error', text: `Saved to ${file}, but the tokens were not regenerated: ${result.problems.join('; ')}` },\n );\n } catch (e) {\n setNotice({ tone: 'error', text: `Saving needs forge's dev server, which did not answer: ${(e as Error).message}` });\n } finally {\n setSaving(false);\n }\n };\n const onCollapsedChange = useCallback(\n (category: TokenCategory, collapsed: boolean) => setFolds((prev) => ({ ...prev, [category]: collapsed })),\n [setFolds],\n );\n\n return (\n <div className=\"fg-css-vars\">\n <div className=\"fg-css-vars__controls\">\n <ToggleBar\n ariaLabel=\"Variables\"\n variant=\"flat\"\n items={TABS}\n value={tab}\n onChange={(next) => {\n if (next) setTab(next);\n }}\n />\n <Input aria-label=\"Filter\" placeholder=\"Filter by name or value\" value={filter} onChange={setFilter} />\n {tab === 'theme' && (unsaved.length > 0 || notice) ? (\n <div className=\"fg-css-vars__save\">\n {unsaved.length > 0 ? (\n <Button variant=\"primary\" size=\"sm\" loading={saving} disabled={saving} onClick={() => void save()}>\n Save scales to theme\n </Button>\n ) : null}\n {notice ? (\n <p\n className={`fg-css-vars__notice fg-css-vars__notice--${notice.tone}`}\n role={notice.tone === 'error' ? 'alert' : 'status'}\n >\n {notice.text}\n </p>\n ) : null}\n </div>\n ) : null}\n </div>\n {shown.length === 0 ? (\n <p className=\"fg-css-vars__empty\">\n {tokens.length === 0 ? 'The story’s frame has reported no variables.' : 'No variables match.'}\n </p>\n ) : (\n <TokenPanel\n tokens={shown}\n onChange={write}\n scales={scales}\n onScaleChange={onScaleChange}\n collapsed={folds}\n onCollapsedChange={onCollapsedChange}\n />\n )}\n </div>\n );\n}\n\n/** The panel for the lab's focused trial, rendered as though inside that trial. */\nfunction FocusedCssVars() {\n const { focusedTrialId, trials, instruments } = useLabContext();\n const labGlobals = useContext(StoryGlobalsContext);\n const record = trials.find((trial) => trial.id === focusedTrialId);\n if (!record) return null;\n const pins = (record.config as Record<string, unknown> | null | undefined)?.[GLOBALS_KEY];\n const instrument = instruments.find((i) => i.name === record.instrumentName);\n return (\n <section className=\"fg-css-vars-focus\" aria-label=\"CSS Vars\">\n <p className=\"fg-css-vars__trial\">{record.title ?? instrument?.title ?? record.instrumentName}</p>\n <TrialIdContext.Provider value={record.id}>\n <CssVarsPanel globals={effectiveGlobals(labGlobals, pins)} />\n </TrialIdContext.Provider>\n </section>\n );\n}\n\nexport const CSS_VARS_SECTION: LabContribution = {\n id: 'fg-css-vars',\n region: 'aside',\n item: { title: 'CSS Vars', body: <FocusedCssVars /> },\n};\n","/** A story's place as one line: each title segment, then the story's name. An `index` segment adds nothing the\n * one before it does not already say, so it is left out. */\nexport function breadcrumb(title: string, name: string): string {\n const segments = [...title.split('/'), name].filter((segment, i) => i === 0 || segment.toLowerCase() !== 'index');\n return segments.join(' > ');\n}\n","import type { Instrument } from '@weasel-js/labkit';\nimport { type ConfigNode, type ConfigShape, isConfigBranch, valueAtPath } from '@weasel-js/labkit/config';\nimport type { IndexEntry } from '../../story/types';\nimport { libraryOf } from '../../story/library';\n\n/** One prop of the story, as the dossier prints it. */\nexport interface DossierArg {\n /** Dotted path within the schema — what the value is written at. */\n path: string;\n /** The author's `argTypes` name, else the path's last segment. */\n label: string;\n /** The control kind labkit resolved, or null while rules have not run. */\n kind: string | null;\n default: unknown;\n /** The focused trial's value, which is `default` until someone edits it. */\n value: unknown;\n description?: string;\n}\n\n/** Everything Get Info prints about one story. */\nexport interface Dossier {\n id: string;\n title: string;\n name: string;\n exportName: string;\n file: string;\n /** Which package the story file lives in. */\n library: string;\n componentName?: string;\n description?: string;\n componentDescription?: string;\n args: DossierArg[];\n /** The story's frame has not reported its schema yet, so an empty `args`\n * means \"not loaded\" rather than \"takes none\". */\n argsPending: boolean;\n}\n\n/** The group forge hides the lab's globals in. Those are the lab's settings,\n * not the story's props, and the dossier is about the story. */\nconst GLOBALS = '$globals';\n\n/** Every visible leaf of `shape`, depth first, carrying its dotted path. */\nfunction leaves(shape: ConfigShape, prefix = ''): { path: string; node: ConfigNode }[] {\n const out: { path: string; node: ConfigNode }[] = [];\n for (const [key, entry] of Object.entries(shape)) {\n if (prefix === '' && key === GLOBALS) continue;\n const path = prefix ? `${prefix}.${key}` : key;\n if (isConfigBranch(entry)) out.push(...leaves(entry.children, path));\n else if (!entry.annotations.hidden) out.push({ path, node: entry });\n }\n return out;\n}\n\n/**\n * The dossier for one story. A pure function of the records the shell already\n * holds: the index entry, the instrument built from the story's `ready`\n * message, and the focused trial's config. An instrument exists before its\n * frame reports anything, and its schema is empty until then — so `ready`\n * decides whether an empty `args` reads as pending or as none.\n */\nexport function storyDossier(input: {\n entry: IndexEntry;\n instrument?: Instrument<unknown, unknown> | undefined;\n config?: unknown;\n ready?: boolean;\n}): Dossier {\n const { entry, instrument, config, ready = true } = input;\n const schema = ready ? instrument?.config : undefined;\n const args = schema\n ? leaves(schema.nodes).map(({ path, node }): DossierArg => {\n const value = valueAtPath(config, path);\n return {\n path,\n label: node.annotations.name ?? path.split('.').pop() ?? path,\n kind: node.kind,\n default: node.default,\n value: value === undefined ? node.default : value,\n ...(node.annotations.description === undefined\n ? {}\n : { description: node.annotations.description }),\n };\n })\n : [];\n return {\n id: entry.id,\n title: entry.title,\n name: entry.name,\n exportName: entry.exportName,\n file: entry.file,\n library: libraryOf(entry),\n ...(entry.componentName === undefined ? {} : { componentName: entry.componentName }),\n ...(entry.description === undefined ? {} : { description: entry.description }),\n ...(entry.componentDescription === undefined\n ? {}\n : { componentDescription: entry.componentDescription }),\n args,\n argsPending: !schema,\n };\n}\n","import type { Dossier, DossierArg } from './dossier';\n\n/** A value as the dossier prints it: quoted strings, `—` for nothing. */\nfunction printed(value: unknown): string {\n if (value === undefined || value === null) return '—';\n if (typeof value === 'string') return value === '' ? '\"\"' : value;\n if (typeof value === 'function') return 'ƒ';\n if (typeof value === 'object') return JSON.stringify(value);\n return String(value);\n}\n\nfunction Row({ label, children }: { label: string; children: React.ReactNode }) {\n return (\n <div className=\"fg-info__row\">\n <dt className=\"fg-info__key\">{label}</dt>\n <dd className=\"fg-info__value\">{children}</dd>\n </div>\n );\n}\n\nfunction ArgRows({ args }: { args: readonly DossierArg[] }) {\n return (\n <table className=\"fg-info__args\">\n <thead>\n <tr>\n <th scope=\"col\">Name</th>\n <th scope=\"col\">Kind</th>\n <th scope=\"col\">Value</th>\n <th scope=\"col\">Default</th>\n </tr>\n </thead>\n <tbody>\n {args.map((arg) => (\n <tr key={arg.path}>\n <th scope=\"row\">\n <span className=\"fg-info__arg-name\">{arg.label}</span>\n {arg.description ? <span className=\"fg-info__arg-doc\">{arg.description}</span> : null}\n </th>\n <td className=\"fg-info__arg-kind\">{arg.kind ?? '—'}</td>\n <td className=\"fg-info__value-cell\">{printed(arg.value)}</td>\n <td className=\"fg-info__value-cell\">{printed(arg.default)}</td>\n </tr>\n ))}\n </tbody>\n </table>\n );\n}\n\n/**\n * The Get Info dossier, rendered. Presentation only: it reads no lab context\n * and owns no open state, so a dialog and a sidebar section can each host it\n * without either one knowing about the other.\n */\nexport function StoryDossier({ dossier }: { dossier: Dossier }) {\n return (\n <div className=\"fg-info\">\n {dossier.description || dossier.componentDescription ? (\n <section className=\"fg-info__section\" aria-label=\"Docs\">\n {dossier.description ? <p className=\"fg-info__doc\">{dossier.description}</p> : null}\n {dossier.componentDescription ? (\n <p className=\"fg-info__doc fg-info__doc--component\">{dossier.componentDescription}</p>\n ) : null}\n </section>\n ) : null}\n\n <section className=\"fg-info__section\" aria-label=\"Identity\">\n <dl className=\"fg-info__rows\">\n <Row label=\"Story\">{dossier.name}</Row>\n <Row label=\"Component\">{dossier.componentName ?? dossier.title.split('/').pop()}</Row>\n <Row label=\"Library\">{dossier.library}</Row>\n <Row label=\"Title\">{dossier.title}</Row>\n <Row label=\"Export\">\n <code>{dossier.exportName}</code>\n </Row>\n <Row label=\"Id\">\n <code>{dossier.id}</code>\n </Row>\n <Row label=\"File\">\n <code className=\"fg-info__path\">{dossier.file}</code>\n </Row>\n </dl>\n </section>\n\n <section className=\"fg-info__section\" aria-label=\"Args\">\n <h3 className=\"fg-info__heading\">Args</h3>\n {dossier.argsPending ? (\n <p className=\"fg-info__empty\">Open this story to read its args.</p>\n ) : dossier.args.length === 0 ? (\n <p className=\"fg-info__empty\">This story takes no args.</p>\n ) : (\n <ArgRows args={dossier.args} />\n )}\n </section>\n </div>\n );\n}\n","import { breadcrumb } from '../breadcrumb';\nimport { useLabContext } from '@weasel-js/labkit';\nimport { Dialog } from '@weasel-js/ui';\nimport type { IndexEntry } from '../../story/types';\nimport { storyDossier } from './dossier';\nimport { StoryDossier } from './StoryDossier';\n\nexport interface StoryInfoDialogProps {\n index: readonly IndexEntry[];\n /** Whether a story's frame has reported its schema — `StoryRegistry.isReady`. */\n isReady: (id: string) => boolean;\n isOpen: boolean;\n onOpenChange: (open: boolean) => void;\n}\n\n/**\n * Get Info for the focused trial's story. Mount inside `<Lab>`: it reads the\n * lab's context, and renders nothing until it is opened.\n */\nexport function StoryInfoDialog({ index, isReady, isOpen, onOpenChange }: StoryInfoDialogProps) {\n const { focusedTrialId, trials, instruments } = useLabContext();\n const trial = trials.find((record) => record.id === focusedTrialId);\n const entry = trial ? index.find((candidate) => candidate.id === trial.instrumentName) : undefined;\n if (!entry) return null;\n const dossier = storyDossier({\n entry,\n instrument: instruments.find((candidate) => candidate.name === entry.id),\n config: trial?.config,\n ready: isReady(entry.id),\n });\n return (\n <Dialog\n isOpen={isOpen}\n onOpenChange={onOpenChange}\n title={breadcrumb(dossier.title, dossier.name)}\n className=\"fg-info-dialog\"\n >\n <StoryDossier dossier={dossier} />\n </Dialog>\n );\n}\n","import { createContext } from 'react';\nimport { FRAME_HELLO } from '../protocol/messages';\n\n/** Frame documents loaded ahead of need, blank until a view hands one a port. */\nexport interface FramePool {\n /**\n * A frame that has loaded and said hello, detached from the pool so the caller can move it into place with\n * `moveBefore`; null when none is ready or the browser cannot move an iframe without reloading it.\n */\n claim(): HTMLIFrameElement | null;\n dispose(): void;\n}\n\ntype Movable = Element & { moveBefore(node: Node, child: Node | null): void };\n\n/** Whether `moveBefore` exists here, the one way to move an iframe without reloading its document. */\nexport function canMoveFrames(): boolean {\n return typeof Element !== 'undefined' && 'moveBefore' in Element.prototype;\n}\n\n/** Moves `frame` to the start of `host` without reloading it. */\nexport function moveFrame(host: Element, frame: HTMLIFrameElement): void {\n (host as Movable).moveBefore(frame, host.firstChild);\n}\n\nconst whenIdle = (fn: () => void): (() => void) => {\n if (typeof requestIdleCallback === 'function') {\n const handle = requestIdleCallback(fn, { timeout: 500 });\n return () => cancelIdleCallback(handle);\n }\n const handle = setTimeout(fn, 200);\n return () => clearTimeout(handle);\n};\n\n/**\n * Keeps `size` blank frames of `frameUrl` loaded off-screen. A claimed frame is the caller's to discard: it never\n * comes back, so nothing one story left in a document reaches the next. A replacement loads when the page is idle.\n */\nexport function createFramePool(frameUrl: string, size = 2): FramePool {\n const shelf = document.createElement('div');\n shelf.className = 'fg-frame-pool';\n shelf.setAttribute('aria-hidden', 'true');\n document.body.append(shelf);\n const warm: HTMLIFrameElement[] = [];\n let loading = 0;\n let cancelRefill: (() => void) | null = null;\n let disposed = false;\n\n const load = () => {\n loading += 1;\n const frame = document.createElement('iframe');\n frame.tabIndex = -1;\n frame.src = frameUrl;\n const onMessage = (event: MessageEvent) => {\n if (event.source !== frame.contentWindow || event.origin !== location.origin) return;\n if ((event.data as { type?: unknown } | null)?.type !== FRAME_HELLO) return;\n window.removeEventListener('message', onMessage);\n loading -= 1;\n warm.push(frame);\n };\n window.addEventListener('message', onMessage);\n shelf.append(frame);\n };\n\n const refill = () => {\n if (disposed || cancelRefill) return;\n cancelRefill = whenIdle(() => {\n cancelRefill = null;\n while (!disposed && warm.length + loading < size) load();\n });\n };\n if (canMoveFrames()) refill();\n\n return {\n claim() {\n if (!canMoveFrames()) return null;\n const frame = warm.shift() ?? null;\n refill();\n return frame;\n },\n dispose() {\n disposed = true;\n cancelRefill?.();\n shelf.remove();\n },\n };\n}\n\nexport const FramePoolContext = createContext<FramePool | null>(null);\n","import { Select, useLabContext, usePersistedState } from '@weasel-js/labkit';\nimport { Button, Callout, TuneIcon } from '@weasel-js/ui';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type { Globals } from '../protocol/messages';\nimport { followApp, type GlobalDeclaration, type GlobalDeclarations, labGlobals, labOptions } from './globals';\n\nconst RECORD = 'fg-globals';\n\nfunction useLabGlobals(declarations: GlobalDeclarations): [Globals, (key: string, value: string) => void] {\n const [stored, setStored] = usePersistedState<unknown>(RECORD, null, { scope: 'lab' });\n const values = useMemo(() => labGlobals(declarations, stored), [declarations, stored]);\n const set = useCallback(\n (key: string, value: string) => setStored((prev: unknown) => ({ ...labGlobals(declarations, prev), [key]: value })),\n [declarations, setStored],\n );\n return [values, set];\n}\n\ninterface GlobalSelectProps {\n name: string;\n declaration: GlobalDeclaration;\n values: Globals;\n set: (key: string, value: string) => void;\n labeled?: boolean;\n}\n\nfunction GlobalSelect({ name, declaration, values, set, labeled = false }: GlobalSelectProps) {\n return (\n <Select\n {...(labeled ? { label: declaration.label } : { 'aria-label': declaration.label })}\n width={labeled ? 'fill' : 'fit'}\n selectedKey={String(values[name])}\n onSelectionChange={(value) => set(name, value)}\n options={labOptions(declaration, values)}\n />\n );\n}\n\n/**\n * The lab's header control for its global values: one select per declaration, then, at the end, a button for each\n * declaration that others are declared `under`, opening those others in a popover.\n */\nexport function GlobalsToolbar({ declarations }: { declarations: GlobalDeclarations }) {\n const [values, set] = useLabGlobals(declarations);\n const entries = Object.entries(declarations);\n const top = entries.filter(([, declaration]) => declaration.under === undefined);\n return (\n <div className=\"fg-globals\" role=\"toolbar\" aria-label=\"Globals\">\n {top.map(([key, declaration]) => (\n <div key={key} className=\"fg-globals__item\">\n <GlobalSelect name={key} declaration={declaration} values={values} set={set} />\n </div>\n ))}\n {top.map(([key, declaration]) => {\n const nested = entries.filter(([, other]) => other.under === key);\n return nested.length > 0 ? (\n <NestedGlobals key={key} label={declaration.label} nested={nested} values={values} set={set} />\n ) : null;\n })}\n </div>\n );\n}\n\nfunction NestedGlobals({\n label,\n nested,\n values,\n set,\n}: {\n label: string;\n nested: readonly [string, GlobalDeclaration][];\n values: Globals;\n set: (key: string, value: string) => void;\n}) {\n const anchor = useRef<HTMLButtonElement>(null);\n const [open, setOpen] = useState(false);\n return (\n <>\n <Button\n ref={anchor}\n variant=\"ghost\"\n size=\"sm\"\n iconOnly\n ariaLabel={`More ${label} settings`}\n pressed={open}\n onClick={() => setOpen((was) => !was)}\n >\n <TuneIcon size={16} />\n </Button>\n <Callout\n triggerRef={anchor}\n isOpen={open}\n onOpenChange={setOpen}\n placement=\"bottom end\"\n showCloseButton={false}\n title={label}\n className=\"fg-globals__popover\"\n >\n {nested.map(([key, declaration]) => (\n <GlobalSelect key={key} name={key} declaration={declaration} values={values} set={set} labeled />\n ))}\n </Callout>\n </>\n );\n}\n\n/**\n * Reports the lab's global values, as the toolbar persists them and with each `App` resolved against the lab's own\n * chrome, to `onChange`. Renders nothing; mount it inside the lab.\n */\nexport function LabGlobals({\n declarations,\n onChange,\n}: {\n declarations: GlobalDeclarations;\n onChange: (values: Globals) => void;\n}) {\n const [values] = useLabGlobals(declarations);\n const { mode } = useLabContext();\n const resolved = useMemo(() => followApp(declarations, values, { mode }), [declarations, values, mode]);\n useEffect(() => onChange(resolved), [resolved, onChange]);\n return null;\n}\n","const FLASH_MS = 600;\nconst flashes = new WeakMap<Element, ReturnType<typeof setTimeout>>();\n\n/** Scrolls a trial into view and flashes its outline. False when no trial has that id. */\nexport function revealTrial(trialId: string, root: ParentNode = document): boolean {\n const trial = root.querySelector<HTMLElement>(`.lk-trial[data-trial-id=\"${CSS.escape(trialId)}\"]`);\n if (!trial) return false;\n trial.scrollIntoView({ block: 'nearest' });\n clearTimeout(flashes.get(trial));\n trial.classList.remove('fg-flash');\n // Reading layout between the remove and the add restarts the animation on a second reveal.\n void trial.offsetWidth;\n trial.classList.add('fg-flash');\n flashes.set(\n trial,\n setTimeout(() => {\n trial.classList.remove('fg-flash');\n flashes.delete(trial);\n }, FLASH_MS),\n );\n return true;\n}\n","import { useEffect, useState } from 'react';\n\n/** What forge keeps on a history entry: its place in the session, and whether reaching it swapped a trial's story in place. */\nexport interface RouteEntry {\n step: number;\n inPlace: boolean;\n}\n\n/** The story id `#/<id>` names, or null. */\nexport function readRoute(): string | null {\n const { hash } = location;\n if (!hash.startsWith('#/')) return null;\n return decodeURIComponent(hash.slice(2)) || null;\n}\n\n/** The current history entry's forge state, or null for one forge did not write, such as a typed URL. */\nexport function readRouteEntry(): RouteEntry | null {\n const state = history.state as { forgeRoute?: unknown } | null;\n const entry = state?.forgeRoute as RouteEntry | undefined;\n return typeof entry?.step === 'number' ? entry : null;\n}\n\n/** Whether moving between two entries crosses an in-place swap: back off one, or forward onto one. */\nexport function crossesInPlace(from: RouteEntry | null, to: RouteEntry | null): boolean {\n if (!from || !to || from.step === to.step) return false;\n return to.step < from.step ? from.inPlace : to.inPlace;\n}\n\nfunction stamp(entry: RouteEntry, hash: string): void {\n history.replaceState({ ...(history.state ?? {}), forgeRoute: entry }, '', hash);\n}\n\n/** Names story `id` in the URL; `inPlace` says it replaced the previous story in its trial. */\nexport function setRoute(id: string, options: { inPlace?: boolean } = {}): void {\n const hash = `#/${encodeURIComponent(id)}`;\n if (readRoute() === id) {\n history.replaceState(history.state, '', hash);\n return;\n }\n const from = readRouteEntry() ?? { step: 0, inPlace: false };\n stamp(from, location.hash);\n location.hash = hash;\n stamp({ step: from.step + 1, inPlace: options.inPlace ?? false }, hash);\n}\n\n/** The story the URL names, and `setRoute` to name another. */\nexport function useRoute(): [string | null, typeof setRoute] {\n const [route, setCurrent] = useState(readRoute);\n useEffect(() => {\n const sync = (): void => setCurrent(readRoute());\n window.addEventListener('hashchange', sync);\n sync();\n return () => window.removeEventListener('hashchange', sync);\n }, []);\n return [route, setRoute];\n}\n","import { indexEntries } from '../../story/indexPages';\nimport { isGallery } from '../../story/tags';\nimport type { IndexEntry } from '../../story/types';\n\nexport type TreeNode =\n | { kind: 'folder'; label: string; path: string; children: TreeNode[]; tag?: string; index?: IndexEntry }\n | { kind: 'story'; entry: IndexEntry; tag?: string; label?: string };\n\ntype Folder = Extract<TreeNode, { kind: 'folder' }>;\n\nfunction sortFolder(nodes: TreeNode[]): TreeNode[] {\n const folders = nodes.filter((n): n is Folder => n.kind === 'folder');\n folders.sort((a, b) => a.label.localeCompare(b.label));\n for (const folder of folders) folder.children = sortFolder(folder.children);\n return [...folders, ...nodes.filter((n) => n.kind === 'story')];\n}\n\n/**\n * `nodes` with every folder that holds nothing but a gallery replaced by that gallery under the folder's name, so a\n * gallery titled `ui/Cursors/Gallery` lists as `Cursors` with its stories directly beneath it. The gallery keeps its\n * own path and index page, so its route and story ids are unchanged.\n */\nexport function foldGalleries(nodes: TreeNode[]): TreeNode[] {\n return nodes.map((node) => {\n if (node.kind !== 'folder') return node;\n const children = foldGalleries(node.children);\n const [only] = children;\n // Only a gallery one segment down: one already folded would carry this folder off and lose its name.\n if (\n !node.index\n && children.length === 1\n && only?.kind === 'folder'\n && only.path === `${node.path}/${only.label}`\n && only.index\n && isGallery(only.index)\n ) {\n return { ...only, label: node.label, tag: node.tag ?? only.tag };\n }\n return { ...node, children };\n });\n}\n\n/**\n * Story titles as nested folders, split on `/`; the last segment is the component, which carries its index page and\n * holds its subfolders, then its stories.\n */\nexport function buildTree(index: readonly IndexEntry[]): TreeNode[] {\n const root: TreeNode[] = [];\n const folders = new Map<string, Folder>();\n const pages = new Map(indexEntries(index).map((page) => [page.title, page]));\n for (const entry of index) {\n let siblings = root;\n let path = '';\n for (const label of entry.title.split('/')) {\n path = path ? `${path}/${label}` : label;\n let folder = folders.get(path);\n if (!folder) {\n const page = pages.get(path);\n folder = { kind: 'folder', label, path, children: [], ...(page ? { index: page } : {}) };\n folders.set(path, folder);\n siblings.push(folder);\n }\n siblings = folder.children;\n }\n siblings.push({ kind: 'story', entry });\n }\n return sortFolder(root);\n}\n\n/**\n * The stories whose `title/name` contains `query`, ignoring case, with their ancestors. A folder keeps its index\n * page only when its own path matches.\n */\nexport function filterTree(nodes: TreeNode[], query: string): TreeNode[] {\n const needle = query.trim().toLowerCase();\n if (!needle) return nodes;\n const walk = (list: TreeNode[]): TreeNode[] =>\n list.flatMap((node): TreeNode[] => {\n if (node.kind === 'story') {\n return `${node.entry.title}/${node.entry.name}`.toLowerCase().includes(needle) ? [node] : [];\n }\n const children = walk(node.children);\n if (children.length === 0) return [];\n const { index: page, ...folder } = node;\n return [page && node.path.toLowerCase().includes(needle) ? { ...folder, children, index: page } : { ...folder, children }];\n });\n return walk(nodes);\n}\n","import { indexEntries } from '../../story/indexPages';\nimport { libraryOf } from '../../story/library';\nimport type { IndexEntry } from '../../story/types';\nimport { foldGalleries, type TreeNode } from './buildTree';\n\ntype Folder = Extract<TreeNode, { kind: 'folder' }>;\n\n/** One component — a story title — with the stories declared under it. */\nexport interface ComponentRow {\n /** The full story title, unique per component and used as the row key. */\n path: string;\n /** The title's last segment: the component's own name. */\n label: string;\n /** Which library it ships in. */\n library: string;\n /** The component's index page; absent when a filter kept the row only for some of its stories. */\n index?: IndexEntry;\n entries: IndexEntry[];\n}\n\n/** Every component in the index as one flat, alphabetical list. Components\n * sharing a name are kept apart by their library, then by their full title. */\nexport function buildComponents(index: readonly IndexEntry[]): ComponentRow[] {\n const byTitle = new Map<string, ComponentRow>();\n const pages = new Map(indexEntries(index).map((page) => [page.title, page]));\n for (const entry of index) {\n let row = byTitle.get(entry.title);\n if (!row) {\n const segments = entry.title.split('/');\n row = {\n path: entry.title,\n label: segments[segments.length - 1],\n library: libraryOf(entry),\n index: pages.get(entry.title),\n entries: [],\n };\n byTitle.set(entry.title, row);\n }\n row.entries.push(entry);\n }\n const rows = [...byTitle.values()];\n disambiguate(rows);\n return rows.sort(\n (a, b) =>\n a.label.localeCompare(b.label)\n || a.library.localeCompare(b.library)\n || a.path.localeCompare(b.path),\n );\n}\n\n/**\n * Widen each label leftward until it tells its row apart from the others in\n * its library.\n * `ui/Cursors/Gallery` and `ui/Icons/Gallery` are two different\n * components whose last segments agree, and a flat list that prints both as\n * `Gallery` is unusable — the grouping that used to separate them is the very\n * thing this view removes.\n */\nfunction disambiguate(rows: readonly ComponentRow[]): void {\n // Rows in different libraries are already told apart by their tag.\n const byLabel = new Map<string, ComponentRow[]>();\n for (const row of rows) {\n const key = `${row.library}\\0${row.label}`;\n const group = byLabel.get(key);\n if (group) group.push(row);\n else byLabel.set(key, [row]);\n }\n for (const group of byLabel.values()) {\n if (group.length < 2) continue;\n for (const row of group) {\n const segments = row.path.split('/');\n // One more segment at a time, stopping at the full title.\n for (let take = 2; take <= segments.length; take++) {\n row.label = segments.slice(-take).join('/');\n if (group.every((other) => other === row || !other.path.endsWith(`/${row.label}`))) break;\n }\n }\n }\n}\n\n/** The components whose name, library or story names contain `query`,\n * ignoring case. A matching component keeps its index page and all its\n * stories; a component matching only through one story keeps just the\n * stories that matched. */\nexport function filterComponents(rows: readonly ComponentRow[], query: string): ComponentRow[] {\n const needle = query.trim().toLowerCase();\n if (!needle) return [...rows];\n const out: ComponentRow[] = [];\n for (const row of rows) {\n if (`${row.path}/${row.library}`.toLowerCase().includes(needle)) {\n out.push(row);\n continue;\n }\n const entries = row.entries.filter((entry) => entry.name.toLowerCase().includes(needle));\n if (entries.length > 0) out.push({ path: row.path, label: row.label, library: row.library, entries });\n }\n return out;\n}\n\n/**\n * The component list as tree nodes, so the sidebar renders and navigates both\n * views with one code path. A slash in a label is a directory: `Icons/Gallery`\n * is a `Gallery` folder inside an `Icons` folder, which it shares with any\n * other row of its library widened to the same prefix. Every component is a\n * folder carrying its index page and holding its stories. A folder a gallery's label opened, holding only that\n * gallery, is folded into it.\n */\nexport function componentNodes(rows: readonly ComponentRow[]): TreeNode[] {\n const root: TreeNode[] = [];\n const folders = new Map<string, Folder>();\n for (const row of rows) {\n const labels = row.label.split('/');\n const title = row.path.split('/');\n let siblings = root;\n let tag: string | undefined = row.library;\n for (let i = 0; i < labels.length - 1; i++) {\n const path = title.slice(0, title.length - labels.length + i + 1).join('/');\n let folder = folders.get(path);\n if (!folder) {\n folder = { kind: 'folder', label: labels[i], path, tag, children: [] };\n folders.set(path, folder);\n siblings.push(folder);\n }\n siblings = folder.children;\n tag = undefined;\n }\n siblings.push({\n kind: 'folder',\n label: labels[labels.length - 1],\n path: row.path,\n tag,\n ...(row.index ? { index: row.index } : {}),\n children: row.entries.map((entry) => ({ kind: 'story', entry }) as const),\n });\n }\n return foldGalleries(root);\n}\n\n/** Every library present in `index`, alphabetically. */\nexport function librariesIn(index: readonly IndexEntry[]): string[] {\n return [...new Set(index.map(libraryOf))].sort((a, b) => a.localeCompare(b));\n}\n","import { type LabChromeContext, usePersistedState } from '@weasel-js/labkit';\nimport { Checkbox, DisclosureMark, ToggleBar, type ToggleBarItem } from '@weasel-js/ui';\nimport { type FocusEvent, type KeyboardEvent, type ReactNode, useId, useMemo, useRef, useState } from 'react';\nimport { indexEntries } from '../../story/indexPages';\nimport { isGallery } from '../../story/tags';\nimport type { IndexEntry } from '../../story/types';\nimport { revealTrial } from '../revealTrial';\nimport { useRoute } from '../useRoute';\nimport { buildTree, filterTree, type TreeNode } from './buildTree';\nimport { buildComponents, componentNodes, filterComponents, librariesIn } from './buildComponents';\nimport { libraryOf } from '../../story/library';\nimport { LibraryBadge as PackageBadge } from '../../frame/index/LibraryBadge';\n\n/** Which shape the sidebar lists the index in. */\ntype View = 'tree' | 'components' | 'gallery';\n\nconst VIEWS: readonly ToggleBarItem<View>[] = [\n { value: 'tree', label: 'Tree' },\n { value: 'components', label: 'Components' },\n { value: 'gallery', label: 'Gallery' },\n];\n\nexport interface StoryTreeProps {\n ctx: LabChromeContext;\n index: readonly IndexEntry[];\n}\n\ninterface Row {\n key: string;\n node: TreeNode;\n parent: string | null;\n}\n\nconst keyOf = (node: TreeNode): string => (node.kind === 'folder' ? `folder:${node.path}` : `story:${node.entry.id}`);\n\n/** The folder paths above a story's component, and the component's own. */\nfunction ancestorsOf(entry: IndexEntry | undefined): Set<string> {\n const paths = new Set<string>();\n if (!entry) return paths;\n let path = '';\n for (const label of entry.title.split('/')) {\n path = path ? `${path}/${label}` : label;\n paths.add(path);\n }\n return paths;\n}\n\n/** A component's package, as the sidebar tags its rows. */\nfunction LibraryBadge({ library }: { library: string }) {\n return <PackageBadge library={library} className=\"fg-tree__tag\" />;\n}\n\n/** The indexed stories as a filterable tree; opening one runs it in the focused trial, or with Shift in another. */\nexport function StoryTree({ ctx, index }: StoryTreeProps) {\n const headingId = useId();\n const [route, setRoute] = useRoute();\n const [query, setQuery] = useState('');\n const [folds, setFolds] = usePersistedState<Record<string, boolean>>('fg-tree-open', {}, { scope: 'lab' });\n const [view, setView] = usePersistedState<View>('fg-tree-view', 'components', { scope: 'lab' });\n // Stored as what is *off*, so a library added later is on without anyone\n // going back to tick it.\n const [hidden, setHidden] = usePersistedState<Record<string, boolean>>('fg-tree-libraries', {}, { scope: 'lab' });\n const [focusKey, setFocusKey] = useState<string | null>(null);\n const items = useRef(new Map<string, HTMLElement>());\n\n const libraries = useMemo(() => librariesIn(index), [index]);\n // The package filter runs on the index, so it means the same thing in both\n // views rather than once per view's own grouping.\n const kept = useMemo(() => index.filter((entry) => !hidden[libraryOf(entry)]), [index, hidden]);\n // Galleries list only in their own view, grouped the way Components groups.\n const [galleryEntries, rest] = useMemo(() => {\n const yes: IndexEntry[] = [];\n const no: IndexEntry[] = [];\n for (const entry of kept) (isGallery(entry) ? yes : no).push(entry);\n return [yes, no];\n }, [kept]);\n const tree = useMemo(() => buildTree(rest), [rest]);\n const components = useMemo(() => buildComponents(rest), [rest]);\n const galleries = useMemo(() => buildComponents(galleryEntries), [galleryEntries]);\n const shown = useMemo(\n () =>\n view === 'tree'\n ? filterTree(tree, query)\n : componentNodes(filterComponents(view === 'gallery' ? galleries : components, query)),\n [view, components, galleries, tree, query],\n );\n const routable = useMemo(() => [...kept, ...indexEntries(kept)], [kept]);\n const routed = routable.find((entry) => entry.id === route);\n const routeAncestors = useMemo(() => ancestorsOf(routed), [routed]);\n const filtering = query.trim() !== '';\n const isOpen = (path: string): boolean =>\n filtering || (folds[path] ?? routeAncestors.has(path));\n\n const rows: Row[] = [];\n const collect = (nodes: readonly TreeNode[], parent: string | null): void => {\n for (const node of nodes) {\n rows.push({ key: keyOf(node), node, parent });\n if (node.kind === 'folder' && isOpen(node.path)) collect(node.children, keyOf(node));\n }\n };\n collect(shown, null);\n const active = rows.some((row) => row.key === focusKey) ? focusKey : (rows[0]?.key ?? null);\n\n const openIds = new Set(ctx.trials.map((trial) => trial.instrumentName));\n\n // A filter forces every folder open, so a toggle then would change state nobody can see.\n const setOpen = (path: string, open: boolean): void => {\n if (!filtering) setFolds((prev) => ({ ...prev, [path]: open }));\n };\n\n const moveTo = (key: string | undefined): void => {\n if (key === undefined) return;\n setFocusKey(key);\n items.current.get(key)?.focus();\n };\n\n const activate = (entry: IndexEntry, another: boolean): void => {\n const focused = ctx.trials.find((trial) => trial.id === ctx.focusedTrialId);\n if (another || !focused) ctx.addTrial(entry.id);\n else if (focused.instrumentName === entry.id) revealTrial(focused.id);\n else {\n ctx.swapTrial(focused.id, entry.id);\n setRoute(entry.id, { inPlace: true });\n return;\n }\n setRoute(entry.id);\n };\n\n // A component's row opens its index page as well as its folder; the fold mark alone only folds.\n const openFolder = (node: Extract<TreeNode, { kind: 'folder' }>, another: boolean): void => {\n if (!node.index) {\n setOpen(node.path, !isOpen(node.path));\n return;\n }\n // Selection opens it, and closes it again once the selection moves on; only a manual fold is stored. A\n // manual close would outrank the selection, so it is dropped.\n if (folds[node.path] === false) {\n setFolds(({ [node.path]: _dropped, ...rest }) => rest);\n }\n activate(node.index, another);\n };\n\n const onKeyDown = (event: KeyboardEvent<HTMLDivElement>): void => {\n const at = rows.findIndex((row) => row.key === active);\n const row = rows[at];\n if (!row) return;\n const { node } = row;\n switch (event.key) {\n case 'ArrowDown':\n moveTo(rows[at + 1]?.key);\n break;\n case 'ArrowUp':\n moveTo(rows[at - 1]?.key);\n break;\n case 'Home':\n moveTo(rows[0]?.key);\n break;\n case 'End':\n moveTo(rows[rows.length - 1]?.key);\n break;\n case 'ArrowRight':\n if (node.kind !== 'folder') break;\n if (!isOpen(node.path)) setOpen(node.path, true);\n else if (rows[at + 1]?.parent === row.key) moveTo(rows[at + 1]?.key);\n break;\n case 'ArrowLeft':\n if (node.kind === 'folder' && isOpen(node.path) && !filtering) setOpen(node.path, false);\n else moveTo(row.parent ?? undefined);\n break;\n case 'Enter':\n case ' ':\n if (node.kind === 'story') activate(node.entry, event.shiftKey);\n else openFolder(node, event.shiftKey);\n break;\n default:\n return;\n }\n event.preventDefault();\n };\n\n const itemProps = (node: TreeNode, level: number) => {\n const key = keyOf(node);\n return {\n role: 'treeitem',\n 'aria-level': level,\n tabIndex: key === active ? 0 : -1,\n ref: (el: HTMLElement | null) => {\n if (el) items.current.set(key, el);\n else items.current.delete(key);\n },\n // A folder item contains its children, so their focus bubbles through it.\n onFocus: (event: FocusEvent) => {\n if (event.target === event.currentTarget) setFocusKey(key);\n },\n };\n };\n\n const renderNodes = (nodes: readonly TreeNode[], level: number): ReactNode =>\n nodes.map((node) => {\n if (node.kind === 'folder') {\n const open = isOpen(node.path);\n return (\n <div\n key={keyOf(node)}\n {...itemProps(node, level)}\n aria-expanded={open}\n aria-label={node.label}\n aria-current={node.index && openIds.has(node.index.id) ? 'true' : undefined}\n className=\"fg-tree__node\"\n >\n <div\n className=\"fg-tree__item fg-tree__folder\"\n onClick={(event) => {\n setFocusKey(keyOf(node));\n openFolder(node, event.shiftKey);\n }}\n >\n <span\n aria-hidden=\"true\"\n className=\"fg-tree__fold\"\n onClick={(event) => {\n event.stopPropagation();\n setOpen(node.path, !open);\n }}\n >\n <DisclosureMark open={open} />\n </span>\n <span className=\"fg-tree__label\">{node.label}</span>\n {node.tag ? <LibraryBadge library={node.tag} /> : null}\n </div>\n {open ? (\n <div role=\"group\" className=\"fg-tree__group\">\n {renderNodes(node.children, level + 1)}\n </div>\n ) : null}\n </div>\n );\n }\n const { entry } = node;\n return (\n <a\n key={keyOf(node)}\n {...itemProps(node, level)}\n href={`#/${encodeURIComponent(entry.id)}`}\n aria-current={openIds.has(entry.id) ? 'true' : undefined}\n className=\"fg-tree__item fg-tree__story\"\n onClick={(event) => {\n if (event.button !== 0 || event.metaKey || event.ctrlKey || event.altKey) return;\n event.preventDefault();\n setFocusKey(keyOf(node));\n activate(entry, event.shiftKey);\n }}\n >\n <span className=\"fg-tree__label\">{node.label ?? entry.name}</span>\n {node.tag ? <LibraryBadge library={node.tag} /> : null}\n </a>\n );\n });\n\n return (\n <section className=\"fg-tree\">\n <h2 id={headingId} className=\"fg-tree__heading\">\n Stories\n </h2>\n {route && !routed ? (\n <p className=\"fg-route-miss\">\n No story <code>{route}</code>\n </p>\n ) : null}\n <ToggleBar\n ariaLabel=\"Sidebar view\"\n variant=\"flat\"\n items={VIEWS}\n value={view}\n onChange={(next) => {\n if (next) setView(next);\n }}\n />\n <fieldset className=\"fg-tree__libraries\">\n <legend className=\"fg-tree__libraries-legend\">Packages</legend>\n {libraries.map((library) => (\n <Checkbox\n key={library}\n isSelected={!hidden[library]}\n onChange={(on) => setHidden((prev) => ({ ...prev, [library]: !on }))}\n >\n <LibraryBadge library={library} />\n </Checkbox>\n ))}\n </fieldset>\n <input\n type=\"search\"\n className=\"fg-tree__filter\"\n aria-label=\"Filter stories\"\n value={query}\n onChange={(event) => setQuery(event.target.value)}\n />\n <div role=\"tree\" aria-labelledby={headingId} className=\"fg-tree__items\" onKeyDown={onKeyDown}>\n {renderNodes(shown, 1)}\n </div>\n </section>\n );\n}\n","import { type ConfigAnswers, stableStringify } from '../protocol/messages';\nimport type { SchemaAnswers } from '../protocol/schema';\nimport { storyConfig } from './globals';\n\nexport interface AnswerBook extends SchemaAnswers {\n record(answers: ConfigAnswers): void;\n /** Marks `config` as one an open trial shows until the returned release runs. */\n hold(config: unknown): () => void;\n subscribe(fn: () => void): () => void;\n}\n\nconst KEPT_CONFIGS = 50;\n\nconst UNANSWERED = stableStringify({ hidden: [], errors: {} });\n\n/** Keeps the last 50 configs' answers. A config it has no answer for shows every node and reports no errors.\n * Subscribers hear of an answer only when it differs from the one kept for its config, and a trial holds that config. */\nexport function createAnswerBook(): AnswerBook {\n const byConfig = new Map<\n string,\n { hidden: readonly string[]; errors: Readonly<Record<string, string[]>>; key: string }\n >();\n const listeners = new Set<() => void>();\n const held = new Map<string, number>();\n const keyOf = (config: unknown) => stableStringify(storyConfig(config));\n const answerFor = (config: unknown) => byConfig.get(keyOf(config));\n\n return {\n record(answers) {\n const key = stableStringify({ hidden: answers.hidden, errors: answers.errors });\n const changed = key !== (byConfig.get(answers.configKey)?.key ?? UNANSWERED);\n byConfig.delete(answers.configKey);\n byConfig.set(answers.configKey, { hidden: answers.hidden, errors: answers.errors, key });\n if (byConfig.size > KEPT_CONFIGS) {\n const oldest = byConfig.keys().next().value;\n if (oldest !== undefined) byConfig.delete(oldest);\n }\n if (changed && held.has(answers.configKey)) for (const fn of listeners) fn();\n },\n hold(config) {\n const key = keyOf(config);\n held.set(key, (held.get(key) ?? 0) + 1);\n return () => {\n const count = (held.get(key) ?? 1) - 1;\n if (count > 0) held.set(key, count);\n else held.delete(key);\n };\n },\n hidden(path, config) {\n const hidden = answerFor(config)?.hidden;\n return hidden?.some((h) => path === h || path.startsWith(`${h}.`)) ?? false;\n },\n errors: (path, config) => answerFor(config)?.errors[path] ?? [],\n subscribe(fn) {\n listeners.add(fn);\n return () => {\n listeners.delete(fn);\n };\n },\n };\n}\n","import { TrialIdContext, useLabContext } from '@weasel-js/labkit';\nimport { useContext } from 'react';\nimport { isGallery } from '../story/tags';\nimport type { FrameSetup } from '../frame/FrameController';\nimport { type IndexEnv, IndexPage } from '../frame/index/IndexPage';\nimport type { Globals } from '../protocol/messages';\nimport type { IndexRender, LoadedStory } from '../story/types';\nimport { DependenciesContext } from './dependencies';\nimport { TrialHost } from './TrialHost';\nimport { setRoute } from './useRoute';\n\n/** A component's index page as the registry loads it: its stories in index order, and the page's own render. */\nexport interface IndexBundle {\n title: string;\n /** The package the component ships in. */\n library: string;\n description?: string;\n /** The tags every story of the component carries. */\n tags?: readonly string[];\n /** The ids of the stories tagged `gallery`. */\n galleries: readonly string[];\n stories: readonly LoadedStory[];\n descriptions: Readonly<Record<string, string>>;\n render: IndexRender | null;\n}\n\nexport interface IndexTrialProps {\n bundle: IndexBundle;\n setup: FrameSetup;\n config: unknown;\n}\n\n/** A component's index page rendered in the workshop document; `open` swaps its own trial to the story clicked. */\nexport function IndexTrial({ bundle, setup, config }: IndexTrialProps) {\n const lab = useLabContext();\n const trialId = useContext(TrialIdContext);\n const graph = useContext(DependenciesContext);\n const gallery = isGallery(bundle);\n const dependencies = gallery ? undefined : graph?.[bundle.title];\n const open = (id: string) => {\n if (!trialId || !lab.instruments.some((instrument) => instrument.name === id)) return;\n lab.swapTrial(trialId, id);\n setRoute(id, { inPlace: true });\n };\n const render = (globals: Globals) => {\n const env: IndexEnv = {\n title: bundle.title,\n library: bundle.library,\n ...(bundle.description === undefined ? {} : { description: bundle.description }),\n stories: bundle.stories,\n descriptions: bundle.descriptions,\n gallery,\n galleries: bundle.galleries,\n ...(dependencies ? { dependencies } : {}),\n globals,\n decorators: setup.decorators ?? [],\n open,\n // A story that throws shows its error in its own cell; the rest of the page is still worth reading.\n onError: (error) => console.error(error),\n };\n return <IndexPage env={env} render={bundle.render} />;\n };\n return (\n <TrialHost layout=\"fullscreen\" setup={setup} config={config}>\n {render}\n </TrialHost>\n );\n}\n","import type { Instrument } from '@weasel-js/labkit';\nimport { type ConfigSchema, f } from '@weasel-js/labkit/config';\nimport { useEffect } from 'react';\nimport type { FrameSetup } from '../frame/FrameController';\nimport type { IndexEntry } from '../story/types';\nimport { breadcrumb } from './breadcrumb';\nimport { type GlobalDeclarations, withGlobals } from './globals';\nimport { type IndexBundle, IndexTrial } from './IndexTrial';\nimport { StoryTrial } from './StoryTrial';\n\n/** What the registry has loaded for an entry: one story, or a component's index page. */\nexport type Loaded = { kind: 'story'; story: import('../story/types').LoadedStory } | { kind: 'index'; bundle: IndexBundle };\n\nexport interface DocumentInstrumentOptions {\n entry: IndexEntry;\n loaded: Loaded;\n setup: FrameSetup;\n globals?: GlobalDeclarations;\n}\n\n/** A loaded story, or index page, as a lab instrument rendering in the workshop document. */\nexport function documentInstrument(options: DocumentInstrumentOptions): Instrument<unknown, unknown> {\n const { entry, loaded, setup, globals = {} } = options;\n const schema = loaded.kind === 'story' ? loaded.story.config : (f.schema({}) as ConfigSchema<unknown>);\n const config = withGlobals(schema, globals);\n const initialState = loaded.kind === 'story' ? loaded.story.initialState : null;\n return {\n name: entry.id,\n title: breadcrumb(entry.title, entry.name),\n config,\n defaultConfig: () => config.defaults(),\n initialState: (c) => initialState?.(c) ?? null,\n render: (ctx) =>\n loaded.kind === 'story' ? (\n <StoryTrial story={loaded.story} setup={setup} ctx={ctx} />\n ) : (\n <IndexTrial bundle={loaded.bundle} setup={setup} config={ctx.config} />\n ),\n ...(loaded.kind === 'story' && loaded.story.viewport\n ? { stage: { size: { width: loaded.story.viewport.width, height: loaded.story.viewport.height } } }\n : {}),\n };\n}\n\nexport interface PendingInstrumentOptions {\n entry: IndexEntry;\n globals?: GlobalDeclarations;\n /** Asked for the entry's module the first time a trial renders it. */\n load: (entry: IndexEntry) => void;\n /** Why the module could not load, when it could not. */\n fault?: Error;\n /** Bumped by a reload, so a face already mounted asks again. */\n generation?: number;\n}\n\n/** The instrument's face while its module loads, and the fault when the load fails. */\nfunction StoryLoad({ entry, load, fault }: PendingInstrumentOptions) {\n useEffect(() => {\n if (!fault) load(entry);\n }, [entry, load, fault]);\n return (\n <div className=\"fg-story fg-story--loading\" data-fg-layout=\"fullscreen\">\n {fault ? (\n <div className=\"fg-fault\" role=\"alert\">\n <span className=\"fg-fault__phase\">import</span>\n <p className=\"fg-fault__message\">{fault.message}</p>\n </div>\n ) : null}\n </div>\n );\n}\n\n/** An entry's instrument before its module has loaded: an empty schema, and a render that asks for the load. */\nexport function pendingInstrument(options: PendingInstrumentOptions): Instrument<unknown, unknown> {\n const { entry, globals = {} } = options;\n const config = withGlobals(f.schema({}) as ConfigSchema<unknown>, globals);\n return {\n name: entry.id,\n title: breadcrumb(entry.title, entry.name),\n config,\n defaultConfig: () => config.defaults(),\n initialState: () => null,\n render: () => <StoryLoad key={options.generation ?? 0} {...options} />,\n };\n}\n","import { type FromFrame, stableStringify } from '../protocol/messages';\n\nexport type Ready = Extract<FromFrame, { type: 'ready' }>;\n\n/** The part of a `ready` an instrument is built from; two readies with one key build the same instrument. */\nexport const readyKey = (ready: Ready): string =>\n stableStringify({ schema: ready.schema, layout: ready.layout, viewport: ready.viewport });\n","import { breadcrumb } from './breadcrumb';\nimport './shell.css';\nimport { useLatest } from '@weasel-js/core';\nimport { type RenderContext, TrialIdContext, useLabContext } from '@weasel-js/labkit';\nimport { type RefObject, useCallback, useContext, useEffect, useMemo, useRef, useState } from 'react';\nimport { type Channel, type Mismatch, openChannel } from '../protocol/channel';\nimport {\n type FaultPhase,\n FRAME_HELLO,\n type FromFrame,\n type Globals,\n PORT_HANDOFF,\n type PortHandoff,\n PROTOCOL_VERSION,\n stableStringify,\n type CapturedPicture,\n type ToFrame,\n} from '../protocol/messages';\nimport type { IndexEntry } from '../story/types';\nimport type { AnswerBook } from './answers';\nimport { useCssOverrides } from './cssVars/overrides';\nimport { FramePoolContext, moveFrame } from './framePool';\n\nimport { effectiveGlobals, GLOBALS_KEY, isGlobalsPath, storyConfig } from './globals';\nimport { type Ready, readyKey } from './readyKey';\nimport { type A11yOutcome, TrialFramesContext } from './trialFrames';\nimport { StoryGlobalsContext } from './StoryGlobalsContext';\nimport { setRoute } from './useRoute';\n\nexport interface FrameViewProps {\n entry: IndexEntry;\n frameUrl: string;\n answers: AnswerBook;\n onReady: (entry: IndexEntry, ready: Ready) => void;\n /** `readyKey` of the ready this view's instrument was built from; null while the instrument is provisional. */\n descriptionKey: string | null;\n ctx: RenderContext<unknown, unknown>;\n}\n\nconst START_TIMEOUT_MS = 10_000;\n/** Longer than a cold dev server takes to serve a frame document its first time. */\nconst HELLO_TIMEOUT_MS = 30_000;\n/** Distinguishes one frame request from the next; only ever compared, never read. */\nlet requests = 0;\n/** How far past the viewport a frame stays mounted, so a small scroll back does not reload it. */\nconst IN_VIEW_MARGIN = '50%';\n\n/** Whether `ref`'s element is near the viewport; true where the browser cannot say. */\nfunction useInView(ref: RefObject<Element | null>): boolean {\n const [inView, setInView] = useState(true);\n useEffect(() => {\n const el = ref.current;\n if (!el || typeof IntersectionObserver === 'undefined') return;\n const observer = new IntersectionObserver(\n (entries) => {\n const last = entries.at(-1);\n if (last) setInView(last.isIntersecting);\n },\n { rootMargin: IN_VIEW_MARGIN },\n );\n observer.observe(el);\n return () => observer.disconnect();\n }, [ref]);\n return inView;\n}\n\ninterface Settle {\n resolve: (value: never) => void;\n fail: (error: Error) => void;\n /** How this request ends when the frame goes away before answering. */\n gone: () => void;\n}\n\ninterface Fault {\n phase: FaultPhase | null;\n message: string;\n}\n\n/** One handshake with one frame document; a reload replaces it. */\ninterface Link {\n channel: Channel<FromFrame, ToFrame>;\n timer: ReturnType<typeof setTimeout>;\n /** The key of a `ready` whose `init` waits for an instrument built from it. */\n awaiting: string | null;\n /** What the frame holds, from `init` on — the story's config without the trial's pins; null until then. */\n sent: { config: unknown; state: unknown; globals: Globals } | null;\n /** `init`, `config`, `state` and `globals` messages sent; a render fault's `seq` counts the same messages. */\n inputs: number;\n /** Takes this link's channel out of the trial's frame registry. */\n disconnect: () => void;\n /** Requests waiting on an answer carrying the same id. */\n pending: Map<string, Settle>;\n /** Whether the frame has said it rendered; before that there is no story to ask anything about. */\n hasRendered: boolean;\n /** Requests held until it has. */\n queued: (() => void)[];\n}\n\nfunction closeLink(link: RefObject<Link | null>): void {\n if (!link.current) return;\n clearTimeout(link.current.timer);\n for (const settle of link.current.pending.values()) settle.gone();\n link.current.pending.clear();\n link.current.disconnect();\n link.current.channel.close();\n link.current = null;\n}\n\nfunction settle(link: Link, id: string, value: unknown): void {\n (link.pending.get(id)?.resolve as ((v: unknown) => void) | undefined)?.(value);\n link.pending.delete(id);\n}\n\nfunction mismatchMessage(mismatch: Mismatch): string {\n return mismatch.reason === 'version'\n ? `Frame speaks protocol ${String(mismatch.version)}; this workshop speaks ${PROTOCOL_VERSION}`\n : 'Frame sent a message that is not a forge envelope';\n}\n\nexport function FrameView(props: FrameViewProps) {\n const { entry, frameUrl, answers, descriptionKey, ctx } = props;\n const labGlobals = useContext(StoryGlobalsContext);\n const pins = (ctx.config as Record<string, unknown> | null | undefined)?.[GLOBALS_KEY];\n const globals = useMemo(() => effectiveGlobals(labGlobals, pins), [labGlobals, pins]);\n const trialId = useContext(TrialIdContext);\n const frames = useContext(TrialFramesContext);\n const [overrides] = useCssOverrides();\n const pool = useContext(FramePoolContext);\n const lab = useLabContext();\n const src = `${frameUrl}#${entry.id}`;\n const title = breadcrumb(entry.title, entry.name);\n const iframeRef = useRef<HTMLIFrameElement | null>(null);\n const hostRef = useRef<HTMLDivElement>(null);\n const slotRef = useRef<HTMLDivElement>(null);\n const inView = useInView(hostRef);\n const link = useRef<Link | null>(null);\n const latest = useLatest({ ...props, globals, overrides, pool, lab, title });\n const [fault, setFault] = useState<Fault | null>(null);\n // A loaded document stays hidden until its story has rendered, so a new trial never shows the blank page.\n const [pending, setPending] = useState(true);\n\n const init = useCallback((current: Link): void => {\n const { ctx: live, globals: liveGlobals } = latest.current;\n current.awaiting = null;\n current.sent = { config: storyConfig(live.config), state: live.state, globals: liveGlobals };\n current.inputs += 1;\n current.channel.send({ type: 'init', ...current.sent });\n }, [latest]);\n\n const receive = (current: Link, msg: FromFrame): void => {\n const { ctx: live, answers, onReady } = latest.current;\n switch (msg.type) {\n case 'ready': {\n clearTimeout(current.timer);\n setFault(null);\n for (const [name, value] of Object.entries(latest.current.overrides)) {\n current.channel.send({ type: 'vars.set', name, value });\n }\n const key = readyKey(msg);\n current.awaiting = key;\n onReady(latest.current.entry, msg);\n if (current.awaiting === key && key === latest.current.descriptionKey) init(current);\n break;\n }\n case 'rendered':\n setPending(false);\n current.hasRendered = true;\n for (const ask of current.queued.splice(0)) ask();\n break;\n case 'setConfig':\n // The pins belong to the trial; a story cannot see them, so it cannot set them either.\n if (!isGlobalsPath(msg.path)) live.setConfig(msg.path, msg.value);\n break;\n case 'setState':\n if (current.sent) current.sent.state = msg.state;\n live.setState(msg.state);\n break;\n case 'answers':\n answers.record(msg.answers);\n break;\n case 'vars':\n if (trialId) frames?.report(trialId, msg.vars);\n break;\n case 'size':\n if (trialId) frames?.reportSize(trialId, { width: msg.width, height: msg.height });\n break;\n case 'a11y': {\n const outcome: A11yOutcome = msg.ok ? { ok: true, report: msg.report } : { ok: false, message: msg.message };\n if (trialId) frames?.reportA11y(trialId, outcome);\n settle(current, msg.id, outcome);\n break;\n }\n case 'capture':\n if (msg.ok) settle(current, msg.id, msg.picture);\n else current.pending.get(msg.id)?.fail(new Error(msg.message));\n current.pending.delete(msg.id);\n break;\n case 'open': {\n const { lab: liveLab } = latest.current;\n if (!trialId || !liveLab.instruments.some((instrument) => instrument.name === msg.id)) break;\n liveLab.swapTrial(trialId, msg.id);\n setRoute(msg.id, { inPlace: true });\n break;\n }\n case 'fault':\n // A newer input is already on its way to the frame, which faults again if it still throws.\n if (msg.phase === 'render' && msg.seq !== undefined && msg.seq < current.inputs) break;\n clearTimeout(current.timer);\n setFault({ phase: msg.phase, message: msg.message });\n break;\n }\n };\n\n const connect = (frame: HTMLIFrameElement): void => {\n closeLink(link);\n setPending(true);\n const target = frame.contentWindow;\n if (!target) return;\n const { port1, port2 } = new MessageChannel();\n const timer = setTimeout(() => setFault({ phase: null, message: `Frame did not start: ${src}` }), START_TIMEOUT_MS);\n const channel = openChannel<FromFrame, ToFrame>(port1, {\n onMismatch: (mismatch) => {\n clearTimeout(timer);\n setFault({ phase: 'protocol', message: mismatchMessage(mismatch) });\n },\n });\n const waiting = new Map<string, Settle>();\n // Held until the frame says it rendered: before that there is no story to judge or to draw.\n const request = <T,>(id: string, msg: ToFrame, gone: (settle: Settle['resolve'], fail: (e: Error) => void) => void) =>\n new Promise<T>((resolve, reject) => {\n waiting.set(id, {\n resolve: resolve as Settle['resolve'],\n fail: reject,\n gone: () => gone(resolve as Settle['resolve'], reject),\n });\n const ask = () => channel.send(msg);\n if (current.hasRendered) ask();\n else current.queued.push(ask);\n });\n // An audit's failure is an outcome the panel shows; a capture's is a rejection, because labkit's\n // `base()` has nowhere to put one.\n const audit = (): Promise<A11yOutcome> => {\n const id = `a11y-${(requests += 1)}`;\n return request<A11yOutcome>(id, { type: 'a11y.run', id }, (resolve) =>\n resolve({ ok: false, message: 'The frame went away' } as never),\n );\n };\n const capture = (): Promise<CapturedPicture> => {\n const id = `capture-${(requests += 1)}`;\n return request<CapturedPicture>(id, { type: 'capture.run', id }, (_resolve, fail) =>\n fail(new Error('The frame could not draw itself')),\n );\n };\n const disconnect =\n frames && trialId ? frames.connect(trialId, { send: channel.send, audit, capture }) : () => {};\n const current: Link = {\n channel,\n timer,\n awaiting: null,\n sent: null,\n inputs: 0,\n disconnect,\n pending: waiting,\n hasRendered: false,\n queued: [],\n };\n link.current = current;\n channel.on((msg) => receive(current, msg));\n target.postMessage({ type: PORT_HANDOFF, id: latest.current.entry.id } satisfies PortHandoff, location.origin, [\n port2,\n ]);\n };\n\n const connectRef = useLatest(connect);\n\n // A trial out of view drops its frame, and with it any WebGL contexts the story held; the config and state\n // live in the trial, so a return brings up a new frame and `init` carries them back.\n useEffect(() => {\n const slot = slotRef.current;\n if (!inView || !slot) return;\n const claimed = latest.current.pool?.claim() ?? null;\n const frame = claimed ?? document.createElement('iframe');\n frame.className = 'fg-frame-view';\n frame.title = latest.current.title;\n frame.removeAttribute('tabindex');\n frame.toggleAttribute('data-pending', true);\n iframeRef.current = frame;\n // Handshakes start on the document's hello, never on `load`: that fires before the hello, and a port handed\n // over then is one the frame, which keeps only its first, would still take in place of the right one.\n const unheard = claimed\n ? undefined\n : setTimeout(() => setFault({ phase: null, message: `Frame did not start: ${src}` }), HELLO_TIMEOUT_MS);\n const onMessage = (event: MessageEvent) => {\n if (event.source !== frame.contentWindow || event.origin !== location.origin) return;\n if ((event.data as { type?: unknown } | null)?.type !== FRAME_HELLO) return;\n clearTimeout(unheard);\n connectRef.current(frame);\n };\n window.addEventListener('message', onMessage);\n if (claimed) {\n moveFrame(slot, claimed);\n connectRef.current(claimed);\n } else {\n frame.src = src;\n slot.append(frame);\n }\n return () => {\n window.removeEventListener('message', onMessage);\n clearTimeout(unheard);\n closeLink(link);\n frame.remove();\n iframeRef.current = null;\n setPending(true);\n setFault(null);\n };\n }, [inView, src, connectRef, latest]);\n\n useEffect(() => {\n iframeRef.current?.toggleAttribute('data-pending', pending && !fault);\n }, [pending, fault, inView, src]);\n\n useEffect(() => {\n if (iframeRef.current) iframeRef.current.title = title;\n }, [title]);\n\n useEffect(() => answers.hold(ctx.config), [answers, ctx.config]);\n\n useEffect(() => {\n const current = link.current;\n if (!current) return;\n if (current.awaiting !== null) {\n if (current.awaiting === descriptionKey) init(current);\n return;\n }\n const sent = current.sent;\n if (!sent) return;\n let input = false;\n const config = storyConfig(ctx.config, sent.config);\n if (config !== sent.config) {\n sent.config = config;\n current.channel.send({ type: 'config', config });\n current.inputs += 1;\n input = true;\n }\n if (ctx.state !== sent.state) {\n sent.state = ctx.state;\n current.channel.send({ type: 'state', state: ctx.state });\n current.inputs += 1;\n input = true;\n }\n if (globals !== sent.globals && stableStringify(globals) !== stableStringify(sent.globals)) {\n sent.globals = globals;\n current.channel.send({ type: 'globals', globals });\n current.inputs += 1;\n input = true;\n }\n // The frame retries its render on new input and faults again if it still throws.\n if (input) setFault((shown) => (shown?.phase === 'render' ? null : shown));\n }, [ctx.config, ctx.state, globals, descriptionKey, init]);\n\n return (\n <div\n ref={(el) => {\n hostRef.current = el;\n if (trialId && frames) frames.hostRef(trialId).current = el;\n }}\n className=\"fg-frame-host\"\n >\n {/* The frame is placed here by hand: a pooled one arrives already loaded, and React would reload it. */}\n <div ref={slotRef} className=\"fg-frame-slot\" />\n {fault ? (\n <div className=\"fg-fault\" role=\"alert\">\n {fault.phase ? <span className=\"fg-fault__phase\">{fault.phase}</span> : null}\n <p className=\"fg-fault__message\">{fault.message}</p>\n </div>\n ) : null}\n </div>\n );\n}\n","import { breadcrumb } from './breadcrumb';\nimport type { Instrument } from '@weasel-js/labkit';\nimport { type ConfigSchema, f } from '@weasel-js/labkit/config';\nimport { schemaFromDescription } from '../protocol/schema';\nimport type { IndexEntry } from '../story/types';\nimport type { AnswerBook } from './answers';\nimport { FrameView } from './FrameView';\nimport { type GlobalDeclarations, withGlobals } from './globals';\nimport { type Ready, readyKey } from './readyKey';\n\nexport interface StoryInstrumentOptions {\n entry: IndexEntry;\n /** The frame's `ready`, once one arrived; absent, the instrument is provisional. */\n ready?: Ready;\n answers: AnswerBook;\n frameUrl: string;\n onReady: (entry: IndexEntry, ready: Ready) => void;\n /** Declared globals, which the schema gains as a `$globals` group of per-trial pins. */\n globals?: GlobalDeclarations;\n}\n\n/** A story as a lab instrument. Its frame reads the lab's globals from the surrounding `StoryGlobalsContext`. */\nexport function storyInstrument(options: StoryInstrumentOptions): Instrument<unknown, unknown> {\n const { entry, ready, answers, frameUrl, onReady, globals = {} } = options;\n const config = withGlobals(\n ready ? schemaFromDescription(ready.schema, answers) : (f.schema({}) as ConfigSchema<unknown>),\n globals,\n );\n const descriptionKey = ready ? readyKey(ready) : null;\n return {\n name: entry.id,\n title: breadcrumb(entry.title, entry.name),\n config,\n defaultConfig: () => config.defaults(),\n initialState: () => null,\n render: (ctx) => (\n <FrameView\n entry={entry}\n frameUrl={frameUrl}\n answers={answers}\n onReady={onReady}\n descriptionKey={descriptionKey}\n ctx={ctx}\n />\n ),\n ...(ready?.viewport ? { stage: { size: { width: ready.viewport.width, height: ready.viewport.height } } } : {}),\n };\n}\n","import { useLatest } from '@weasel-js/core';\nimport type { Instrument, InstrumentList } from '@weasel-js/labkit';\nimport { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport type { FrameSetup } from '../frame/FrameController';\nimport type { FrameImporters } from '../frame/mountFrame';\nimport { stableStringify } from '../protocol/messages';\nimport { indexId, isIndexId } from '../story/indexPages';\nimport { libraryOf } from '../story/library';\nimport { isGallery } from '../story/tags';\nimport { indexRenderOf, loadStories } from '../story/load';\nimport type { IndexEntry, LoadedStory } from '../story/types';\nimport { type AnswerBook, createAnswerBook } from './answers';\nimport { documentInstrument, type Loaded, pendingInstrument } from './documentInstrument';\nimport type { GlobalDeclarations } from './globals';\nimport { type Ready, readyKey } from './readyKey';\nimport { storyInstrument } from './storyInstrument';\n\n/** The lab instruments `useStoryRegistry` builds, and the calls that keep them current. */\nexport interface StoryRegistry {\n instruments: InstrumentList;\n /** Whether a story's schema is known: its module has loaded, or its frame has reported. An instrument is built\n * either way, and before that its schema is empty — which reads as \"no args\" to anything that cannot tell the\n * two apart. */\n isReady: (id: string) => boolean;\n /** Called by FrameView. Replaces the story's instrument only when `ready.schema`, layout or viewport differ from what it holds. */\n onReady: (entry: IndexEntry, ready: Ready) => void;\n /** Drops what was loaded from `file` and loads it again for every entry that had it, as after an edit. */\n reload: (file: string) => void;\n}\n\nexport interface StoryRegistryOptions {\n frameUrl: string;\n globals?: GlobalDeclarations;\n /** Story modules by file. Given, every entry without `isolate` renders in the workshop document; absent, every\n * entry renders in a frame. */\n importers?: FrameImporters;\n /** The frame config, applied to each story host in the document. */\n setup?: FrameSetup;\n load?: (mod: Record<string, unknown>, autoTitle: string, parameters?: Record<string, unknown>) => LoadedStory[];\n}\n\ninterface Built {\n entryKey: string;\n ready: Ready | undefined;\n loaded: Loaded | undefined;\n fault: Error | undefined;\n frameUrl: string;\n globals: GlobalDeclarations;\n setup: FrameSetup | undefined;\n inDocument: boolean;\n generation: number;\n revision: number;\n instrument: Instrument<unknown, unknown>;\n}\n\ninterface Cache {\n built: ReadonlyMap<string, Built>;\n books: ReadonlyMap<string, AnswerBook>;\n list: InstrumentList;\n}\n\nconst NO_GLOBALS: GlobalDeclarations = {};\nconst NO_SETUP: FrameSetup = {};\n\nconst pruned = <V>(map: ReadonlyMap<string, V>, ids: Set<string>): ReadonlyMap<string, V> =>\n [...map.keys()].every((id) => ids.has(id)) ? map : new Map([...map].filter(([id]) => ids.has(id)));\n\nconst toError = (error: unknown): Error => (error instanceof Error ? error : new Error(String(error)));\n\n/**\n * One instrument per story in `index`, each schema holding a `$globals` group for `globals`. The lab's global values\n * reach the stories through `StoryGlobalsContext`, not through here.\n */\nexport function useStoryRegistry(index: readonly IndexEntry[], options: StoryRegistryOptions): StoryRegistry {\n const { frameUrl, globals = NO_GLOBALS, importers, setup = NO_SETUP, load = loadStories } = options;\n const [readies, setReadies] = useState<ReadonlyMap<string, Ready>>(() => new Map());\n const [loaded, setLoaded] = useState<ReadonlyMap<string, Loaded>>(() => new Map());\n const [faults, setFaults] = useState<ReadonlyMap<string, Error>>(() => new Map());\n // Per file, how many reloads it has had: a pending face keyed by it asks again after one.\n const [generations, setGenerations] = useState<ReadonlyMap<string, number>>(() => new Map());\n // Bumped when a story's frame answers something new. labkit's panel re-reads the answer book only when\n // the trial's config changes, and replacing the instrument is what refills it.\n const [revisions, setRevisions] = useState<ReadonlyMap<string, number>>(() => new Map());\n\n const onReady = useCallback((entry: IndexEntry, ready: Ready) => {\n setReadies((prev) => {\n const held = prev.get(entry.id);\n if (held && readyKey(held) === readyKey(ready)) return prev;\n return new Map(prev).set(entry.id, ready);\n });\n }, []);\n\n useEffect(() => {\n const ids = new Set(index.map((entry) => entry.id));\n setReadies((prev) => pruned(prev, ids));\n setLoaded((prev) => pruned(prev, ids));\n setFaults((prev) => pruned(prev, ids));\n setRevisions((prev) => pruned(prev, ids));\n }, [index]);\n\n // One import per file, shared by every entry it holds; a reload drops the file's promise and asks again.\n const imports = useRef(new Map<string, Promise<Record<string, unknown>>>());\n const live = useLatest({ index, importers, setup, load });\n\n const importOf = useCallback((file: string): Promise<Record<string, unknown>> => {\n let loading = imports.current.get(file);\n if (!loading) {\n const importer = live.current.importers?.[file];\n loading = importer ? importer() : Promise.reject(new Error(`No importer for ${file}`));\n imports.current.set(file, loading);\n }\n return loading;\n }, [live]);\n\n const request = useCallback(\n (entry: IndexEntry): void => {\n const { setup: current, load: loadModule } = live.current;\n const settle = (ids: string[], result: Map<string, Loaded>) => {\n setLoaded((prev) => {\n const next = new Map(prev);\n for (const [id, value] of result) next.set(id, value);\n return next;\n });\n setFaults((prev) => (ids.some((id) => prev.has(id)) ? pruned(prev, new Set([...prev.keys()].filter((id) => !ids.includes(id)))) : prev));\n };\n const fail = (ids: string[], error: unknown) => {\n const fault = toError(error);\n setFaults((prev) => {\n const next = new Map(prev);\n for (const id of ids) next.set(id, fault);\n return next;\n });\n };\n if (isIndexId(entry.id)) {\n const entries = live.current.index.filter((e) => !isIndexId(e.id) && indexId(e.title) === entry.id);\n const files = [...new Set(entries.map((e) => e.file))];\n void Promise.all(files.map(importOf))\n .then(async (mods) => {\n const byFile = new Map(files.map((file, i) => [file, loadModule(mods[i] ?? {}, entry.title, current.parameters)]));\n const stories = entries.flatMap(\n (e) => byFile.get(e.file)?.find((s) => s.exportName === e.exportName) ?? [],\n );\n for (const story of stories) await current.prepare?.(story);\n const result = new Map<string, Loaded>();\n result.set(entry.id, {\n kind: 'index',\n bundle: {\n title: entry.title,\n library: libraryOf(entry),\n ...(entry.componentDescription === undefined ? {} : { description: entry.componentDescription }),\n ...(entry.tags === undefined ? {} : { tags: entry.tags }),\n galleries: entries.filter(isGallery).map((e) => e.id),\n stories,\n descriptions: Object.fromEntries(entries.flatMap((e) => (e.description ? [[e.id, e.description]] : []))),\n render: mods.map(indexRenderOf).find((render) => render !== null) ?? null,\n },\n });\n settle([entry.id], result);\n })\n .catch((error: unknown) => fail([entry.id], error));\n return;\n }\n const siblings = live.current.index.filter((e) => e.file === entry.file && !isIndexId(e.id));\n const ids = siblings.map((e) => e.id);\n void importOf(entry.file)\n .then(async (mod) => {\n const stories = loadModule(mod, entry.title, current.parameters);\n const result = new Map<string, Loaded>();\n for (const sibling of siblings) {\n const story = stories.find((s) => s.exportName === sibling.exportName);\n if (!story) continue;\n await current.prepare?.(story);\n result.set(sibling.id, { kind: 'story', story });\n }\n if (!result.has(entry.id)) throw new Error(`${entry.file} has no story export \"${entry.exportName}\"`);\n settle(ids, result);\n })\n .catch((error: unknown) => fail(ids, error));\n },\n [importOf, live],\n );\n\n const reload = useCallback(\n (file: string) => {\n imports.current.delete(file);\n const affected = live.current.index.filter((e) => e.file === file || (isIndexId(e.id) && live.current.index.some((s) => s.file === file && indexId(s.title) === e.id)));\n const ids = new Set(affected.map((e) => e.id));\n setLoaded((prev) => pruned(prev, new Set([...prev.keys()].filter((id) => !ids.has(id)))));\n setFaults((prev) => pruned(prev, new Set([...prev.keys()].filter((id) => !ids.has(id)))));\n setGenerations((prev) => new Map(prev).set(file, (prev.get(file) ?? 0) + 1));\n },\n [live],\n );\n\n const committed = useRef<Cache>({ built: new Map(), books: new Map(), list: [] });\n\n const cache = useMemo<Cache>(() => {\n const previous = committed.current;\n const built = new Map<string, Built>();\n const books = new Map<string, AnswerBook>();\n const list = index.map((entry) => {\n const ready = readies.get(entry.id);\n const inDocument = importers !== undefined && entry.isolate === undefined;\n const had = loaded.get(entry.id);\n const fault = faults.get(entry.id);\n const generation = generations.get(entry.file) ?? 0;\n const revision = revisions.get(entry.id) ?? 0;\n const entryKey = stableStringify(entry);\n const answers = previous.books.get(entry.id) ?? createAnswerBook();\n books.set(entry.id, answers);\n const held = previous.built.get(entry.id);\n const kept =\n held &&\n held.entryKey === entryKey &&\n held.ready === ready &&\n held.loaded === had &&\n held.fault === fault &&\n held.frameUrl === frameUrl &&\n held.globals === globals &&\n held.setup === setup &&\n held.inDocument === inDocument &&\n held.generation === generation &&\n held.revision === revision\n ? held\n : {\n entryKey,\n ready,\n loaded: had,\n fault,\n frameUrl,\n globals,\n setup,\n inDocument,\n generation,\n revision,\n instrument: !inDocument\n ? storyInstrument({ entry, ready, answers, frameUrl, onReady, globals })\n : had\n ? documentInstrument({ entry, loaded: had, setup, globals })\n : pendingInstrument({ entry, globals, load: request, generation, ...(fault ? { fault } : {}) }),\n };\n built.set(entry.id, kept);\n return kept.instrument;\n });\n const unchanged = list.length === previous.list.length && list.every((i, n) => i === previous.list[n]);\n return { built, books, list: unchanged ? previous.list : list };\n }, [index, readies, loaded, faults, generations, revisions, frameUrl, globals, setup, importers, onReady, request]);\n\n useLayoutEffect(() => {\n committed.current = cache;\n }, [cache]);\n\n useEffect(() => {\n const offs = [...cache.books].map(([id, book]) =>\n book.subscribe(() => setRevisions((prev) => new Map(prev).set(id, (prev.get(id) ?? 0) + 1))),\n );\n return () => {\n for (const off of offs) off();\n };\n }, [cache.books]);\n\n const isReady = useCallback((id: string) => readies.has(id) || loaded.has(id), [readies, loaded]);\n\n return { instruments: cache.list, isReady, onReady, reload };\n}\n","import { Lab, type LabContribution, type StorageAdapter, useLabContext } from '@weasel-js/labkit';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type { ShellConfig } from '../config';\nimport type { FrameSetup } from '../frame/FrameController';\nimport type { FrameImporters } from '../frame/mountFrame';\nimport { type Globals, stableStringify } from '../protocol/messages';\nimport { indexEntries } from '../story/indexPages';\nimport type { DepGraph, IndexEntry } from '../story/types';\nimport { DependenciesContext } from './dependencies';\nimport { InfoIcon } from '@weasel-js/ui';\nimport { A11Y_SECTION } from './a11y/A11yPanel';\nimport { CSS_VARS_SECTION } from './cssVars/CssVarsPanel';\nimport { StoryInfoDialog } from './info/StoryInfoDialog';\nimport { createFramePool, type FramePool, FramePoolContext } from './framePool';\nimport { createTrialFrames, TrialFramesContext } from './trialFrames';\nimport { type GlobalDeclarations, labGlobals } from './globals';\nimport { GlobalsToolbar, LabGlobals } from './GlobalsToolbar';\nimport type { StoryChanges } from './storyChanges';\nimport { StoryGlobalsContext } from './StoryGlobalsContext';\nimport { StoryTree } from './tree/StoryTree';\nimport { crossesInPlace, readRoute, readRouteEntry, useRoute } from './useRoute';\nimport { useStoryRegistry } from './useStoryRegistry';\n\n/** Props for `Workshop`. `index`, `importers` and `dependencies` are what the vite plugin's virtual modules supply. */\nexport interface WorkshopProps {\n index: readonly IndexEntry[];\n /** The frame document, for the stories `isolate` keeps in one. */\n frameUrl: string;\n /** Story modules by file. Given, stories render in the workshop document; absent, every story renders in a frame. */\n importers?: FrameImporters;\n /** The frame config, applied to each story rendered in the document. */\n setup?: FrameSetup;\n /** Story files edited while the workshop runs; each is loaded again for the stories that had it. */\n changes?: StoryChanges;\n config?: ShellConfig;\n /** The story globs the index was built from, named when it is empty. */\n stories?: readonly string[];\n storageKey?: string;\n storage?: StorageAdapter;\n /** The component graph index pages list dependencies from. */\n dependencies?: DepGraph;\n}\n\nconst NO_DECLARATIONS: GlobalDeclarations = {};\n\n/** The story or index page `#/<id>` names, when there is one; otherwise `fallback`. Read when the lab mounts. */\nfunction initialStory(entries: readonly IndexEntry[], fallback: string): string {\n const route = readRoute();\n return route !== null && entries.some((entry) => entry.id === route) ? route : fallback;\n}\n\n/**\n * Shows the story the route names when no trial shows it, once per route, so closing that trial sticks. It goes\n * into the trial the previous route was in when a history step crosses an in-place swap, so Back returns that\n * trial to its previous story; otherwise into the focused trial, as a click in the tree does. Only a lab with no\n * trial at all gets a new one: another trial is what Shift-click is for.\n */\nfunction RouteOpener({ index }: { index: readonly IndexEntry[] }) {\n const lab = useLabContext();\n const [route] = useRoute();\n const handled = useRef<string | null>(null);\n const last = useRef({ route: readRoute(), entry: readRouteEntry() });\n useEffect(() => {\n const from = last.current;\n if (route !== from.route) last.current = { route, entry: readRouteEntry() };\n if (route === null || handled.current === route || !index.some((e) => e.id === route)) return;\n handled.current = route;\n if (lab.trials.some((trial) => trial.instrumentName === route)) return;\n const previous = lab.trials.find((trial) => trial.instrumentName === from.route);\n const target =\n (previous && crossesInPlace(from.entry, last.current.entry) ? previous : undefined) ??\n lab.trials.find((trial) => trial.id === lab.focusedTrialId) ??\n lab.trials[0];\n if (target) lab.swapTrial(target.id, route);\n else lab.addTrial(route);\n }, [route, index, lab]);\n return null;\n}\n\n/**\n * Opens Get Info on ⌘I / Ctrl+I. `ToolItem.shortcut` is a tooltip hint —\n * labkit binds no keys — so the shell binds its own.\n */\nfunction useInfoShortcut(open: (next: boolean) => void): void {\n useEffect(() => {\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key !== 'i' && event.key !== 'I') return;\n if (!(event.metaKey || event.ctrlKey) || event.altKey || event.shiftKey) return;\n const target = event.target as HTMLElement | null;\n if (target?.isContentEditable || /^(input|textarea|select)$/i.test(target?.tagName ?? '')) return;\n event.preventDefault();\n open(true);\n };\n window.addEventListener('keydown', onKeyDown);\n return () => window.removeEventListener('keydown', onKeyDown);\n }, [open]);\n}\n\n/** The workshop page: a labkit `Lab` with a story tree, where each story or index page opens as a trial. */\nexport function Workshop({ index, frameUrl, importers, setup, changes, config, stories = [], storageKey, storage, dependencies }: WorkshopProps) {\n const declarations = config?.globals ?? NO_DECLARATIONS;\n const [frames] = useState(createTrialFrames);\n const [pool, setPool] = useState<FramePool | null>(null);\n // Warm frames are for the stories that render in one: every story when no importers are given, else the isolated.\n const framed = importers === undefined || index.some((entry) => entry.isolate !== undefined);\n useEffect(() => {\n if (!framed) return;\n const next = createFramePool(frameUrl);\n setPool(next);\n return () => {\n next.dispose();\n setPool(null);\n };\n }, [frameUrl, framed]);\n const entries = useMemo(() => [...index, ...indexEntries(index)], [index]);\n const registry = useStoryRegistry(entries, {\n frameUrl,\n globals: declarations,\n ...(importers ? { importers } : {}),\n ...(setup ? { setup } : {}),\n });\n const reload = registry.reload;\n useEffect(() => changes?.subscribe(reload), [changes, reload]);\n const [labValues, setLabValues] = useState<Globals>(() => labGlobals(declarations, undefined));\n const themeFor = config?.labTheme;\n const labTheme = useMemo(() => themeFor?.(labValues), [themeFor, labValues]);\n const [infoOpen, setInfoOpen] = useState(false);\n useInfoShortcut(setInfoOpen);\n const reportLabValues = useCallback(\n (next: Globals) => setLabValues((prev) => (stableStringify(prev) === stableStringify(next) ? prev : next)),\n [],\n );\n const labChrome = useMemo<readonly LabContribution[]>(\n () => [\n { id: 'fg-stories', region: 'sidebar', render: (ctx) => <StoryTree ctx={ctx} index={index} /> },\n {\n id: 'fg-info',\n region: 'palette',\n item: { icon: InfoIcon, label: 'Info', shortcut: '⌘I', onActivate: () => setInfoOpen(true) },\n },\n CSS_VARS_SECTION,\n A11Y_SECTION,\n ...(Object.keys(declarations).length > 0\n ? [{ id: 'fg-globals', region: 'header', render: () => <GlobalsToolbar declarations={declarations} /> } as const]\n : []),\n ...(config?.labChrome ?? []),\n ],\n [index, declarations, config?.labChrome],\n );\n const first = index[0];\n if (!first) {\n return (\n <div className=\"fg-empty\">\n <p className=\"fg-empty__title\">No stories found</p>\n {stories.length > 0 ? (\n <ul className=\"fg-empty__globs\" aria-label=\"Story globs\">\n {stories.map((glob) => (\n <li key={glob}>\n <code>{glob}</code>\n </li>\n ))}\n </ul>\n ) : null}\n </div>\n );\n }\n return (\n <StoryGlobalsContext.Provider value={labValues}>\n <DependenciesContext.Provider value={dependencies ?? null}>\n <FramePoolContext.Provider value={pool}>\n <TrialFramesContext.Provider value={frames}>\n <Lab\n title=\"weaselforge\"\n density=\"roomy\"\n {...(labTheme ? { theme: labTheme } : {})}\n instruments={registry.instruments}\n defaultInstrument={initialStory(entries, first.id)}\n storageKey={storageKey ?? 'weaselforge'}\n {...(storage ? { storage } : {})}\n labChrome={labChrome}\n addTrial={false}\n {...(config?.controls ? { controls: config.controls } : {})}\n {...(config?.pages ? { pages: config.pages } : {})}\n {...(config?.path !== undefined ? { path: config.path } : {})}\n >\n <RouteOpener index={entries} />\n <StoryInfoDialog\n index={index}\n isReady={registry.isReady}\n isOpen={infoOpen}\n onOpenChange={setInfoOpen}\n />\n <LabGlobals declarations={declarations} onChange={reportLabValues} />\n </Lab>\n </TrialFramesContext.Provider>\n </FramePoolContext.Provider>\n </DependenciesContext.Provider>\n </StoryGlobalsContext.Provider>\n );\n}\n","import { createRoot } from 'react-dom/client';\nimport type { FrameImporters } from '../frame/mountFrame';\nimport type { DepGraph, IndexEntry } from '../story/types';\nimport { createStoryChanges } from './storyChanges';\nimport { Workshop, type WorkshopProps } from './Workshop';\n\n/** `Workshop`'s props, plus where to mount it. */\nexport interface MountWorkshopOptions extends WorkshopProps {\n /** Default: the document's `#root`. */\n container?: HTMLElement;\n}\n\n/** A mounted workshop, for feeding it what the vite plugin pushes after an edit. */\nexport interface MountedWorkshop {\n /** Swaps in a re-indexed story list, as the vite plugin's `forge:index` event carries. */\n setIndex(index: readonly IndexEntry[]): void;\n /** Swaps in importers whose URLs fetch the modules as they are now, after an edit. */\n setImporters(importers: FrameImporters): void;\n /** Loads `file` again for every story that had it, through the current importers. */\n reloadStory(file: string): void;\n /** Swaps in the component graph, as the vite plugin's `forge:deps` event carries. */\n setDependencies(dependencies: DepGraph): void;\n unmount(): void;\n}\n\n/** Renders a `Workshop` into its own React root. Throws when no container is given and the page has no `#root`. */\nexport function mountWorkshop({ container, ...props }: MountWorkshopOptions): MountedWorkshop {\n const target = container ?? document.getElementById('root');\n if (!target) throw new Error('mountWorkshop: no container given and no #root element');\n const root = createRoot(target);\n const changes = createStoryChanges();\n let current: WorkshopProps = { ...props, changes };\n root.render(<Workshop {...current} />);\n return {\n setIndex(index) {\n current = { ...current, index };\n root.render(<Workshop {...current} />);\n },\n setImporters(importers) {\n current = { ...current, importers };\n root.render(<Workshop {...current} />);\n },\n reloadStory: (file) => changes.emit(file),\n setDependencies(dependencies) {\n current = { ...current, dependencies };\n root.render(<Workshop {...current} />);\n },\n unmount: () => root.unmount(),\n };\n}\n"]}