@weasel-js/forge 1.5.0 → 1.5.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{FrameController-Ba3LaWfq.d.ts → FrameController-eZM3hlcE.d.ts} +74 -1
- package/dist/{chunk-O5OQZQRZ.js → chunk-2JDYOBWM.js} +5 -5
- package/dist/chunk-2JDYOBWM.js.map +1 -0
- package/dist/{chunk-KKF7ZX5E.js → chunk-5YHEO26U.js} +133 -23
- package/dist/chunk-5YHEO26U.js.map +1 -0
- package/dist/{chunk-UZCXH724.js → chunk-6SRQIHJQ.js} +3 -8
- package/dist/chunk-6SRQIHJQ.js.map +1 -0
- package/dist/{chunk-IOBG7GZQ.js → chunk-FTFR2YPM.js} +2 -2
- package/dist/chunk-FTFR2YPM.js.map +1 -0
- package/dist/chunk-TLO6UHF2.js +103 -0
- package/dist/chunk-TLO6UHF2.js.map +1 -0
- package/dist/{config-DdumOfyd.d.ts → config-CSVP6duU.d.ts} +6 -2
- package/dist/csf/preview-api.js +2 -2
- package/dist/frame/index.d.ts +5 -4
- package/dist/frame/index.js +5 -5
- package/dist/index.d.ts +97 -5
- package/dist/index.js.map +1 -1
- package/dist/shell/index.css +209 -12
- package/dist/shell/index.css.map +1 -1
- package/dist/shell/index.d.ts +62 -4
- package/dist/shell/index.js +712 -182
- package/dist/shell/index.js.map +1 -1
- package/dist/test/index.d.ts +2 -2
- package/dist/test/index.js +7 -7
- package/dist/test/index.js.map +1 -1
- package/dist/test/play.d.ts +25 -0
- package/dist/test/play.js +14 -0
- package/dist/test/play.js.map +1 -0
- package/dist/vite/index.js +72 -20
- package/dist/vite/index.js.map +1 -1
- package/package.json +14 -5
- package/dist/chunk-IOBG7GZQ.js.map +0 -1
- package/dist/chunk-KKF7ZX5E.js.map +0 -1
- package/dist/chunk-KKVTFMWV.js +0 -59
- package/dist/chunk-KKVTFMWV.js.map +0 -1
- package/dist/chunk-O5OQZQRZ.js.map +0 -1
- package/dist/chunk-UZCXH724.js.map +0 -1
package/dist/shell/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/shell/cssVars/color.ts","../../src/shell/cssVars/overrides.ts","../../src/shell/cssVars/trialFrames.ts","../../src/shell/cssVars/CssVarsPanel.tsx","../../src/shell/globals.ts","../../src/shell/GlobalsToolbar.tsx","../../src/shell/StoryGlobalsContext.ts","../../src/shell/revealTrial.ts","../../src/shell/useRoute.ts","../../src/shell/tree/buildTree.ts","../../src/shell/tree/StoryTree.tsx","../../src/shell/answers.ts","../../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":["VarRow","useCallback","usePersistedState","useMemo","jsx","createContext","useState","useEffect","row","jsxs","labGlobals","useContext","useRef","f"],"mappings":"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","file":"index.js","sourcesContent":["const HEX = /^#(?:[\\da-f]{3,4}|[\\da-f]{6}|[\\da-f]{8})$/i;\nconst RGB = /^rgba?\\(\\s*(\\d{1,3})[\\s,]+(\\d{1,3})[\\s,]+(\\d{1,3})\\b/i;\nconst COLOR_FUNCTION = /^(?:rgba?|hsla?|hwb|lab|lch|oklab|oklch|color|color-mix)\\(.+\\)$/i;\nconst KEYWORDS = new Set([\n 'transparent',\n 'currentcolor',\n 'black',\n 'white',\n 'gray',\n 'silver',\n 'red',\n 'orange',\n 'yellow',\n 'gold',\n 'lime',\n 'green',\n 'teal',\n 'cyan',\n 'blue',\n 'navy',\n 'purple',\n 'magenta',\n 'pink',\n 'brown',\n]);\n\ntype Supports = ((value: string) => boolean) | null;\n\nfunction browserSupports(): Supports {\n return typeof CSS !== 'undefined' && typeof CSS.supports === 'function'\n ? (value) => CSS.supports('color', value)\n : null;\n}\n\n/** Whether `value` is a CSS color — the browser's answer where it has `CSS.supports`, a small parser's otherwise. */\nexport function parsesAsColor(value: string, supports: Supports = browserSupports()): boolean {\n const v = value.trim();\n // `CSS.supports` accepts any `var()` for any property.\n if (!v || v.includes('var(')) return false;\n if (supports) return supports(v);\n return HEX.test(v) || COLOR_FUNCTION.test(v) || KEYWORDS.has(v.toLowerCase());\n}\n\nfunction hexOf(v: string): string | null {\n if (HEX.test(v)) {\n const digits = v.slice(1).toLowerCase();\n return `#${digits.length <= 4 ? [...digits.slice(0, 3)].map((d) => d + d).join('') : digits.slice(0, 6)}`;\n }\n const rgb = RGB.exec(v);\n return rgb\n ? `#${rgb\n .slice(1, 4)\n .map((n) => Math.min(255, Number(n)).toString(16).padStart(2, '0'))\n .join('')}`\n : null;\n}\n\nlet paint: CanvasRenderingContext2D | null | undefined;\n\n/** The browser's serialization of a color, through a canvas fill style; null where it has none or rejects `value`. */\nfunction serialized(value: string): string | null {\n if (paint === undefined) {\n try {\n paint = document.createElement('canvas').getContext('2d');\n } catch {\n paint = null;\n }\n }\n if (!paint) return null;\n // A rejected value leaves the previous fill style, so two different ones tell a rejection apart.\n paint.fillStyle = '#000000';\n paint.fillStyle = value;\n const onBlack = String(paint.fillStyle);\n paint.fillStyle = '#ffffff';\n paint.fillStyle = value;\n return onBlack === String(paint.fillStyle) ? onBlack : null;\n}\n\n/** `value` as the `#rrggbb` a color input takes, alpha dropped; null when it cannot be converted. */\nexport function toHex(value: string): string | null {\n const v = value.trim();\n const direct = hexOf(v);\n if (direct) return direct;\n const browser = typeof document === 'undefined' ? null : serialized(v);\n return browser && browser !== v ? hexOf(browser) : null;\n}\n","import { usePersistedState } from '@weasel-js/labkit';\n\nexport type CssOverrides = Readonly<Record<string, string>>;\n\nconst NONE: CssOverrides = {};\n\n/** The CSS variable overrides of the trial this is rendered inside, persisted with it. */\nexport function useCssOverrides() {\n return usePersistedState<CssOverrides>('fg-css-overrides', NONE, { scope: 'trial' });\n}\n","import { createContext, useCallback, useContext, useSyncExternalStore } from 'react';\nimport type { CssVarReport, ToFrame } from '../../protocol/messages';\n\ntype Send = (msg: ToFrame) => void;\n\n/** What trial chrome can reach of the frame its trial shows. */\nexport interface TrialFrame {\n /** Null while no frame is connected. */\n send: Send | null;\n /** The frame's latest `vars` report. */\n vars: readonly CssVarReport[];\n}\n\n/** Each trial's frame, keyed by trial id: `FrameView` connects and reports, trial chrome reads. */\nexport interface TrialFrames {\n /** Returns a disconnect that does nothing once a newer connection replaced this one. */\n connect(trialId: string, send: Send): () => void;\n report(trialId: string, vars: readonly CssVarReport[]): void;\n get(trialId: string): TrialFrame;\n subscribe(listener: () => void): () => void;\n}\n\nconst NO_FRAME: TrialFrame = { send: null, vars: [] };\n\nexport function createTrialFrames(): TrialFrames {\n const frames = new Map<string, TrialFrame>();\n const listeners = new Set<() => void>();\n const changed = () => {\n for (const listener of [...listeners]) listener();\n };\n return {\n connect(trialId, send) {\n frames.set(trialId, { send, vars: [] });\n changed();\n return () => {\n if (frames.get(trialId)?.send !== send) return;\n frames.delete(trialId);\n changed();\n };\n },\n report(trialId, vars) {\n const frame = frames.get(trialId);\n if (!frame) return;\n frames.set(trialId, { ...frame, vars });\n changed();\n },\n get: (trialId) => frames.get(trialId) ?? NO_FRAME,\n subscribe(listener) {\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n };\n}\n\nexport const TrialFramesContext = createContext<TrialFrames | null>(null);\n\n/** The frame of the trial `trialId` names, re-read when it connects or reports. */\nexport function useTrialFrame(trialId: string): TrialFrame {\n const frames = useContext(TrialFramesContext);\n const subscribe = useCallback((listener: () => void) => frames?.subscribe(listener) ?? (() => {}), [frames]);\n const read = () => frames?.get(trialId) ?? NO_FRAME;\n return useSyncExternalStore(subscribe, read, read);\n}\n","import {\n Button,\n ColorRow,\n PropertyList,\n TextRow,\n ToggleBar,\n type ToggleBarItem,\n type TrialContribution,\n useTrialId,\n} from '@weasel-js/labkit';\nimport { TOKEN_MANIFEST } from '@weasel-js/theme';\nimport { memo, useCallback, useMemo, useState } from 'react';\nimport { parsesAsColor, toHex } from './color';\nimport { useCssOverrides } from './overrides';\nimport { useTrialFrame } from './trialFrames';\n\ntype Tab = 'theme' | 'story';\n\nconst TABS: readonly ToggleBarItem<Tab>[] = [\n { value: 'theme', label: 'Theme' },\n { value: 'story', label: 'Story' },\n];\n\ninterface VarRowProps {\n name: string;\n value: string;\n overridden: boolean;\n write: (name: string, value: string | null) => void;\n}\n\nconst VarRow = memo(function VarRow({ name, value, overridden, write }: VarRowProps) {\n const hex = useMemo(() => (parsesAsColor(value) ? toHex(value) : null), [value]);\n const onChange = useCallback((next: string | null) => write(name, next), [write, name]);\n const reset = useCallback(() => write(name, null), [write, name]);\n return (\n <div className=\"fg-css-var\" role=\"group\" aria-label={name}>\n <PropertyList className=\"fg-css-var__rows\" pack=\"one-up\" density=\"tight\">\n <TextRow label={name} value={value} onChange={onChange} />\n {hex ? <ColorRow label=\"Color\" value={hex} onChange={onChange} /> : null}\n </PropertyList>\n {overridden ? (\n <Button variant=\"ghost\" size=\"sm\" ariaLabel={`Reset ${name}`} onClick={reset}>\n Reset\n </Button>\n ) : null}\n </div>\n );\n});\n\n/** Shows and overrides the CSS variables of the trial it is rendered inside: the theme's tokens, or what its frame reports. */\nexport function CssVarsPanel() {\n const trialId = useTrialId();\n const frame = useTrialFrame(trialId);\n const [overrides, setOverrides] = useCssOverrides();\n const [tab, setTab] = useState<Tab>('theme');\n const [filter, setFilter] = useState('');\n\n const rows = useMemo(() => {\n if (tab === 'story') return frame.vars.map(({ name, value }) => ({ name, value }));\n const reported = new Map(frame.vars.map((v) => [v.name, v.value]));\n return TOKEN_MANIFEST.map((token) => ({ name: token.name, value: reported.get(token.name) ?? token.defaultValue }));\n }, [tab, frame.vars]);\n\n const query = filter.trim().toLowerCase();\n const shown = rows\n .map((row) => ({ ...row, value: overrides[row.name] ?? row.value }))\n .filter((row) => !query || row.name.toLowerCase().includes(query) || row.value.toLowerCase().includes(query));\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\n return (\n <div className=\"fg-css-vars\">\n <ToggleBar\n ariaLabel=\"Variables\"\n size=\"sm\"\n items={TABS}\n value={tab}\n onChange={(next) => {\n if (next) setTab(next);\n }}\n />\n <PropertyList pack=\"one-up\" density=\"tight\">\n <TextRow label=\"Filter\" value={filter} placeholder=\"Name or value\" onChange={setFilter} />\n </PropertyList>\n {shown.length === 0 ? (\n <p className=\"fg-css-vars__empty\">\n {rows.length === 0 ? 'The story’s frame has reported no variables.' : 'No variables match.'}\n </p>\n ) : (\n <div className=\"fg-css-vars__list\">\n {shown.map((row) => (\n <VarRow\n key={row.name}\n name={row.name}\n value={row.value}\n overridden={row.name in overrides}\n write={write}\n />\n ))}\n </div>\n )}\n </div>\n );\n}\n\nexport const CSS_VARS_SECTION: TrialContribution = {\n id: 'fg-css-vars',\n region: 'sidebar',\n item: { title: 'CSS Vars', body: <CssVarsPanel /> },\n};\n","import { type ConfigSchema, f } from '@weasel-js/labkit/config';\nimport type { Globals } from '../protocol/messages';\n\n/** One global the workshop's toolbar sets for every story, and a trial may pin for its own. */\nexport interface GlobalDeclaration {\n label: string;\n options: readonly { value: string; label: string }[];\n default: string;\n}\n\nexport type GlobalDeclarations = Readonly<Record<string, GlobalDeclaration>>;\n\n/** The config group every story schema gains, holding the trial's pins. A story never sees it. */\nexport const GLOBALS_KEY = '$globals';\n/** A pin's value when the trial follows the lab. */\nexport const FOLLOW_LAB = 'lab';\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value);\n\nexport const isGlobalsPath = (path: string): boolean => path === GLOBALS_KEY || path.startsWith(`${GLOBALS_KEY}.`);\n\n/** The lab's values from what was stored: declared keys only, and a value no option offers falls back to the default. */\nexport function labGlobals(declarations: GlobalDeclarations, stored: unknown): Globals {\n const from = isRecord(stored) ? stored : {};\n return Object.fromEntries(\n Object.entries(declarations).map(([key, declaration]) => {\n const value = from[key];\n return [key, declaration.options.some((option) => option.value === value) ? value : declaration.default];\n }),\n );\n}\n\n/** The lab's values, overridden by the pins in a trial's config that do not follow the lab. */\nexport function effectiveGlobals(lab: Globals, pins: unknown): Globals {\n if (!isRecord(pins)) return lab;\n const pinned = Object.entries(pins).filter(([key, value]) => key in lab && value !== FOLLOW_LAB);\n return pinned.length === 0 ? lab : { ...lab, ...Object.fromEntries(pinned) };\n}\n\n/**\n * The config a story receives: the trial's, without its pins. Returns `previous` when every other entry is the same,\n * so a change to a pin alone is not a change to the story's config.\n */\nexport function storyConfig(config: unknown, previous?: unknown): unknown {\n if (!isRecord(config) || !(GLOBALS_KEY in config)) return config;\n const rest = Object.fromEntries(Object.entries(config).filter(([key]) => key !== GLOBALS_KEY));\n if (isRecord(previous)) {\n const keys = Object.keys(rest);\n if (keys.length === Object.keys(previous).length && keys.every((key) => rest[key] === previous[key])) return previous;\n }\n return rest;\n}\n\n/** `schema` with a `$globals` group appended: one leaf per declaration, following the lab until pinned. */\nexport function withGlobals(schema: ConfigSchema<unknown>, declarations: GlobalDeclarations): ConfigSchema<unknown> {\n const entries = Object.entries(declarations);\n if (entries.length === 0) return schema;\n const leaves = Object.fromEntries(\n entries.map(([key, declaration]) => [\n key,\n f.enum(FOLLOW_LAB, [{ value: FOLLOW_LAB, label: 'Lab' }, ...declaration.options]).label(declaration.label),\n ]),\n );\n // An empty group name contributes rows without a heading of its own, under the section's.\n const group = f.group(leaves).label('').section('Globals');\n return f.schema({ ...schema.nodes, [GLOBALS_KEY]: group }) as ConfigSchema<unknown>;\n}\n","import { usePersistedState } from '@weasel-js/labkit';\nimport { useCallback, useEffect, useMemo } from 'react';\nimport type { Globals } from '../protocol/messages';\nimport { type GlobalDeclarations, labGlobals } 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\n/** The lab's header control for its global values: one select per declaration. */\nexport function GlobalsToolbar({ declarations }: { declarations: GlobalDeclarations }) {\n const [values, set] = useLabGlobals(declarations);\n return (\n <div className=\"fg-globals\" role=\"toolbar\" aria-label=\"Globals\">\n {Object.entries(declarations).map(([key, declaration]) => (\n <select\n key={key}\n className=\"fg-globals__select\"\n aria-label={declaration.label}\n value={String(values[key])}\n onChange={(event) => set(key, event.target.value)}\n >\n {declaration.options.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label}\n </option>\n ))}\n </select>\n ))}\n </div>\n );\n}\n\n/** Reports the lab's global values, as the toolbar persists them, to `onChange`. Renders nothing; mount it inside the lab. */\nexport function LabGlobals({\n declarations,\n onChange,\n}: {\n declarations: GlobalDeclarations;\n onChange: (values: Globals) => void;\n}) {\n const [values] = useLabGlobals(declarations);\n useEffect(() => onChange(values), [values, onChange]);\n return null;\n}\n","import { createContext } from 'react';\nimport type { Globals } from '../protocol/messages';\n\n/** The lab's global values, which a trial's pins override. A change reaches open frames without replacing instruments. */\nexport const StoryGlobalsContext = createContext<Globals>({});\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 { useCallback, useEffect, useState } from 'react';\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 story the URL names, and a way to name another. */\nexport function useRoute(): [string | null, (id: string) => void] {\n const [route, setRoute] = useState(readRoute);\n useEffect(() => {\n const sync = (): void => setRoute(readRoute());\n window.addEventListener('hashchange', sync);\n sync();\n return () => window.removeEventListener('hashchange', sync);\n }, []);\n const go = useCallback((id: string) => {\n const hash = `#/${encodeURIComponent(id)}`;\n if (readRoute() === id) history.replaceState(null, '', hash);\n else location.hash = hash;\n }, []);\n return [route, go];\n}\n","import type { IndexEntry } from '../../story/types';\n\nexport type TreeNode =\n | { kind: 'folder'; label: string; path: string; children: TreeNode[] }\n | { kind: 'story'; entry: IndexEntry };\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 const stories = nodes.filter((n) => n.kind === 'story');\n folders.sort((a, b) => a.label.localeCompare(b.label));\n for (const folder of folders) folder.children = sortFolder(folder.children);\n return [...folders, ...stories];\n}\n\n/** Story titles as nested folders, split on `/`; the last segment is the component holding its stories. */\nexport function buildTree(index: readonly IndexEntry[]): TreeNode[] {\n const root: TreeNode[] = [];\n const folders = new Map<string, Folder>();\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 folder = { kind: 'folder', label, path, children: [] };\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/** The stories whose `title/name` contains `query`, ignoring case, with their ancestors. */\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 return children.length > 0 ? [{ ...node, children }] : [];\n });\n return walk(nodes);\n}\n","import { type LabChromeContext, usePersistedState } from '@weasel-js/labkit';\nimport { type FocusEvent, type KeyboardEvent, type ReactNode, useId, useMemo, useRef, useState } from 'react';\nimport type { IndexEntry } from '../../story/types';\nimport { revealTrial } from '../revealTrial';\nimport { useRoute } from '../useRoute';\nimport { buildTree, filterTree, type TreeNode } from './buildTree';\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/** The indexed stories as a filterable tree; opening one opens, or reveals, its trial. */\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 [focusKey, setFocusKey] = useState<string | null>(null);\n const items = useRef(new Map<string, HTMLElement>());\n\n const tree = useMemo(() => buildTree(index), [index]);\n const shown = useMemo(() => filterTree(tree, query), [tree, query]);\n const routed = index.find((entry) => entry.id === route);\n const routeAncestors = useMemo(() => ancestorsOf(routed), [routed]);\n const filtering = query.trim() !== '';\n const isOpen = (path: string): boolean => 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, fresh: boolean): void => {\n const open = ctx.trials.find((trial) => trial.instrumentName === entry.id);\n if (open && !fresh) revealTrial(open.id);\n else ctx.addTrial(entry.id);\n setRoute(entry.id);\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 === 'folder') setOpen(node.path, !isOpen(node.path));\n else activate(node.entry, event.metaKey || event.ctrlKey);\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 className=\"fg-tree__node\"\n >\n <div className=\"fg-tree__item fg-tree__folder\" onClick={() => setOpen(node.path, !open)}>\n <span className=\"fg-tree__label\">{node.label}</span>\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.shiftKey || event.altKey) return;\n event.preventDefault();\n setFocusKey(keyOf(node));\n activate(entry, event.metaKey || event.ctrlKey);\n }}\n >\n <span className=\"fg-tree__label\">{entry.name}</span>\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 <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 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 held for its config. */\nexport function createAnswerBook(): AnswerBook {\n const byConfig = new Map<string, { hidden: readonly string[]; key: string }>();\n let errors: Readonly<Record<string, string[]>> = {};\n const listeners = new Set<() => void>();\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, key });\n if (byConfig.size > KEPT_CONFIGS) {\n const oldest = byConfig.keys().next().value;\n if (oldest !== undefined) byConfig.delete(oldest);\n }\n // The frame lists only paths with errors, so a path absent from the latest answer has none.\n errors = answers.errors;\n if (changed) for (const fn of listeners) fn();\n },\n hidden(path, config) {\n const hidden = byConfig.get(stableStringify(storyConfig(config)))?.hidden;\n return hidden?.some((h) => path === h || path.startsWith(`${h}.`)) ?? false;\n },\n errors: (path) => errors[path] ?? [],\n subscribe(fn) {\n listeners.add(fn);\n return () => {\n listeners.delete(fn);\n };\n },\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 './shell.css';\nimport { type RenderContext, TrialIdContext } 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 type FromFrame,\n type Globals,\n PORT_HANDOFF,\n PROTOCOL_VERSION,\n stableStringify,\n type ToFrame,\n} from '../protocol/messages';\nimport type { IndexEntry } from '../story/types';\nimport type { AnswerBook } from './answers';\nimport { useCssOverrides } from './cssVars/overrides';\nimport { TrialFramesContext } from './cssVars/trialFrames';\nimport { effectiveGlobals, GLOBALS_KEY, isGlobalsPath, storyConfig } from './globals';\nimport { type Ready, readyKey } from './readyKey';\nimport { StoryGlobalsContext } from './StoryGlobalsContext';\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\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}\n\nfunction closeLink(link: RefObject<Link | null>): void {\n if (!link.current) return;\n clearTimeout(link.current.timer);\n link.current.disconnect();\n link.current.channel.close();\n link.current = null;\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, 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 src = `${frameUrl}#${entry.id}`;\n const iframeRef = useRef<HTMLIFrameElement>(null);\n const link = useRef<Link | null>(null);\n const latest = useRef({ ...props, globals, overrides });\n latest.current = { ...props, globals, overrides };\n const [fault, setFault] = useState<Fault | null>(null);\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 '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 '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 onLoad = (): void => {\n closeLink(link);\n const target = iframeRef.current?.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 disconnect = frames && trialId ? frames.connect(trialId, channel.send) : () => {};\n const current: Link = { channel, timer, awaiting: null, sent: null, inputs: 0, disconnect };\n link.current = current;\n channel.on((msg) => receive(current, msg));\n target.postMessage({ type: PORT_HANDOFF }, location.origin, [port2]);\n };\n\n useEffect(() => () => closeLink(link), []);\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 className=\"fg-frame-host\">\n <iframe\n ref={iframeRef}\n className=\"fg-frame-view\"\n src={src}\n title={`${entry.title} / ${entry.name}`}\n onLoad={onLoad}\n />\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 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: `${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 { stableStringify } from '../protocol/messages';\nimport type { IndexEntry } from '../story/types';\nimport { type AnswerBook, createAnswerBook } from './answers';\nimport type { GlobalDeclarations } from './globals';\nimport { type Ready, readyKey } from './readyKey';\nimport { storyInstrument } from './storyInstrument';\n\nexport interface StoryRegistry {\n instruments: InstrumentList;\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}\n\ninterface Built {\n entryKey: string;\n ready: Ready | undefined;\n frameUrl: string;\n globals: GlobalDeclarations;\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 = {};\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\n/**\n * One instrument per story in `index`, each schema holding a `$globals` group for `globals`. The lab's global values\n * reach the frames through `StoryGlobalsContext`, not through here.\n */\nexport function useStoryRegistry(\n index: readonly IndexEntry[],\n options: { frameUrl: string; globals?: GlobalDeclarations },\n): StoryRegistry {\n const { frameUrl, globals = NO_GLOBALS } = options;\n const [readies, setReadies] = useState<ReadonlyMap<string, Ready>>(() => 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 setRevisions((prev) => pruned(prev, ids));\n }, [index]);\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 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.frameUrl === frameUrl &&\n held.globals === globals &&\n held.revision === revision\n ? held\n : {\n entryKey,\n ready,\n frameUrl,\n globals,\n revision,\n instrument: storyInstrument({ entry, ready, answers, frameUrl, onReady, globals }),\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, revisions, frameUrl, globals, onReady]);\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 return { instruments: cache.list, onReady };\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 Globals, stableStringify } from '../protocol/messages';\nimport type { IndexEntry } from '../story/types';\nimport { CSS_VARS_SECTION } from './cssVars/CssVarsPanel';\nimport { createTrialFrames, TrialFramesContext } from './cssVars/trialFrames';\nimport { type GlobalDeclarations, labGlobals } from './globals';\nimport { GlobalsToolbar, LabGlobals } from './GlobalsToolbar';\nimport { StoryGlobalsContext } from './StoryGlobalsContext';\nimport { StoryTree } from './tree/StoryTree';\nimport { readRoute, useRoute } from './useRoute';\nimport { useStoryRegistry } from './useStoryRegistry';\n\nexport interface WorkshopProps {\n index: readonly IndexEntry[];\n frameUrl: string;\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}\n\nconst NO_DECLARATIONS: GlobalDeclarations = {};\nconst TRIAL_CHROME = [CSS_VARS_SECTION];\n\n/** The story `#/<id>` names, when it is indexed; otherwise the first story. Read when the lab mounts. */\nfunction initialStory(index: readonly IndexEntry[], fallback: string): string {\n const route = readRoute();\n return route !== null && index.some((entry) => entry.id === route) ? route : fallback;\n}\n\n/** Opens a trial of the story the route names when none is open, once per route, so closing that trial sticks. */\nfunction RouteOpener({ index }: { index: readonly IndexEntry[] }) {\n const lab = useLabContext();\n const [route] = useRoute();\n const handled = useRef<string | null>(null);\n useEffect(() => {\n if (route === null || handled.current === route || !index.some((entry) => entry.id === route)) return;\n handled.current = route;\n if (!lab.trials.some((trial) => trial.instrumentName === route)) lab.addTrial(route);\n }, [route, index, lab]);\n return null;\n}\n\nexport function Workshop({ index, frameUrl, config, stories = [], storageKey, storage }: WorkshopProps) {\n const declarations = config?.globals ?? NO_DECLARATIONS;\n const registry = useStoryRegistry(index, { frameUrl, globals: declarations });\n const [frames] = useState(createTrialFrames);\n const [labValues, setLabValues] = useState<Globals>(() => labGlobals(declarations, undefined));\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 ...(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 <TrialFramesContext.Provider value={frames}>\n <Lab\n title=\"weaselforge\"\n instruments={registry.instruments}\n defaultInstrument={initialStory(index, first.id)}\n storageKey={storageKey ?? 'weaselforge'}\n {...(storage ? { storage } : {})}\n labChrome={labChrome}\n chrome={TRIAL_CHROME}\n addTrial={false}\n {...(config?.controls ? { controls: config.controls } : {})}\n >\n <RouteOpener index={index} />\n <LabGlobals declarations={declarations} onChange={reportLabValues} />\n </Lab>\n </TrialFramesContext.Provider>\n </StoryGlobalsContext.Provider>\n );\n}\n","import { createRoot } from 'react-dom/client';\nimport type { IndexEntry } from '../story/types';\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 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 let current: WorkshopProps = props;\n root.render(<Workshop {...current} />);\n return {\n setIndex(index) {\n current = { ...current, index };\n root.render(<Workshop {...current} />);\n },\n unmount: () => root.unmount(),\n };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/shell/trialFrames.ts","../../src/shell/a11y/A11yPanel.tsx","../../src/shell/cssVars/overrides.ts","../../src/shell/cssVars/CssVarsPanel.tsx","../../src/shell/tree/buildComponents.ts","../../src/shell/info/dossier.ts","../../src/shell/info/StoryDossier.tsx","../../src/shell/info/StoryInfoDialog.tsx","../../src/shell/globals.ts","../../src/shell/GlobalsToolbar.tsx","../../src/shell/StoryGlobalsContext.ts","../../src/shell/revealTrial.ts","../../src/shell/useRoute.ts","../../src/shell/tree/buildTree.ts","../../src/shell/tree/StoryTree.tsx","../../src/shell/answers.ts","../../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":["f","useTrialId","usePersistedState","useState","useCallback","generateScale","jsxs","jsx","ToggleBar","useLabContext","TrialIdContext","leaves","useMemo","useEffect","createContext","useRef","row","keyOf","settle","labGlobals","useContext","answers"],"mappings":"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","file":"index.js","sourcesContent":["import { createContext, type RefObject, useCallback, useContext, useSyncExternalStore } from 'react';\nimport type { A11yReport, CapturedPicture, CssVarReport, ToFrame, Viewport } from '../protocol/messages';\n\ntype Send = (msg: ToFrame) => void;\n\n/** What an axe run in the frame came back with. */\nexport type A11yOutcome = { ok: true; report: A11yReport } | { ok: false; message: string };\n\n/** The half of a trial's frame that answers a request: each call is one round trip over the frame's channel. */\nexport interface TrialFrameCalls {\n send: Send;\n audit: () => Promise<A11yOutcome>;\n /** Rejects when the frame could not draw itself, or went away before it did. */\n capture: () => Promise<CapturedPicture>;\n}\n\n/** What trial chrome can reach of the frame its trial shows. */\nexport interface TrialFrame {\n /** Null while no frame is connected. */\n send: Send | null;\n /** The frame's latest `vars` report. */\n vars: readonly CssVarReport[];\n /** Runs axe over the story and records the answer as `a11y`. Null while no frame is connected. */\n audit: (() => Promise<A11yOutcome>) | null;\n /** What the last audit found; null until one has run against the connected frame. */\n a11y: A11yOutcome | null;\n /** The story's own picture, for an export to draw over. Null while no frame is connected. */\n capture: (() => Promise<CapturedPicture>) | null;\n /** The story's content box, as the frame last measured it; null until it has. */\n size: Viewport | null;\n}\n\n/** Each trial's frame, keyed by trial id: `FrameView` connects and reports, trial chrome reads. */\nexport interface TrialFrames {\n /** Returns a disconnect that does nothing once a newer connection replaced this one. */\n connect(trialId: string, calls: TrialFrameCalls): () => void;\n report(trialId: string, vars: readonly CssVarReport[]): void;\n reportA11y(trialId: string, outcome: A11yOutcome): void;\n reportSize(trialId: string, size: Viewport): void;\n /** The element a trial's frame is mounted in — stable across the frame reloads that replace the link,\n * because an annotation target's ref has to outlive them. */\n hostRef(trialId: string): RefObject<HTMLElement | null>;\n get(trialId: string): TrialFrame;\n subscribe(listener: () => void): () => void;\n}\n\nconst NO_FRAME: TrialFrame = { send: null, vars: [], audit: null, a11y: null, capture: null, size: null };\n\nexport function createTrialFrames(): TrialFrames {\n const frames = new Map<string, TrialFrame>();\n const hosts = new Map<string, RefObject<HTMLElement | null>>();\n const listeners = new Set<() => void>();\n const changed = () => {\n for (const listener of [...listeners]) listener();\n };\n const patch = (trialId: string, next: Partial<TrialFrame>) => {\n const frame = frames.get(trialId);\n if (!frame) return;\n frames.set(trialId, { ...frame, ...next });\n changed();\n };\n return {\n connect(trialId, calls) {\n const held = frames.get(trialId);\n frames.set(trialId, {\n send: calls.send,\n vars: [],\n audit: calls.audit,\n a11y: null,\n capture: calls.capture,\n size: held?.size ?? null,\n });\n changed();\n return () => {\n if (frames.get(trialId)?.send !== calls.send) return;\n frames.delete(trialId);\n changed();\n };\n },\n report: (trialId, vars) => patch(trialId, { vars }),\n reportA11y: (trialId, a11y) => patch(trialId, { a11y }),\n reportSize(trialId, size) {\n const frame = frames.get(trialId) ?? NO_FRAME;\n if (frame.size?.width === size.width && frame.size?.height === size.height) return;\n frames.set(trialId, { ...frame, size });\n changed();\n },\n hostRef(trialId) {\n let ref = hosts.get(trialId);\n if (!ref) {\n ref = { current: null };\n hosts.set(trialId, ref);\n }\n return ref;\n },\n get: (trialId) => frames.get(trialId) ?? NO_FRAME,\n subscribe(listener) {\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n };\n}\n\nexport const TrialFramesContext = createContext<TrialFrames | null>(null);\n\n/** The frame of the trial `trialId` names, re-read when it connects or reports. */\nexport function useTrialFrame(trialId: string): TrialFrame {\n const frames = useContext(TrialFramesContext);\n const subscribe = useCallback((listener: () => void) => frames?.subscribe(listener) ?? (() => {}), [frames]);\n const read = () => frames?.get(trialId) ?? NO_FRAME;\n return useSyncExternalStore(subscribe, read, read);\n}\n","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","import { usePersistedState } from '@weasel-js/labkit';\n\nexport type CssOverrides = Readonly<Record<string, string>>;\n\nconst NONE: CssOverrides = {};\n\n/** The CSS variable overrides of the trial this is rendered inside, persisted with it. */\nexport function useCssOverrides() {\n return usePersistedState<CssOverrides>('fg-css-overrides', NONE, { scope: 'trial' });\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 } from '@weasel-js/theme/engine';\nimport { useCallback, useMemo, useState } from 'react';\nimport { useCssOverrides } from './overrides';\nimport { useTrialFrame } from '../trialFrames';\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\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.weasel?.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/** 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\n/** Shows and overrides the CSS variables of the trial it is rendered inside: the theme's tokens, or what its frame reports. */\nexport function CssVarsPanel() {\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 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 source.steps.forEach((step, i) => {\n const value = values[step];\n const name = source.tokens[i];\n if (value !== undefined && name !== undefined) write(name, value);\n });\n },\n [setEdited, write],\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 </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 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-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 />\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","import type { IndexEntry } from '../../story/types';\nimport type { TreeNode } from './buildTree';\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 entries: IndexEntry[];\n}\n\n/**\n * Which library a story file belongs to, by the package it lives in rather\n * than by its title's first segment. The title prefix is authored per story\n * and disagrees with itself — `packages/ui` alone declares both `Primitives/`\n * and `weasel-ui/` — so the path is the answer that cannot drift.\n */\nconst LIBRARIES: readonly (readonly [marker: string, label: string])[] = [\n ['/packages/ui/', 'weasel-ui'],\n ['/packages/labkit/', 'labkit'],\n ['/packages/forge/', 'forge'],\n ['/apps/draw/', 'draw'],\n ['/apps/forge/', 'forge'],\n];\n\n/** `entry`'s library, falling back to its title's first segment for a file\n * under none of the known packages. */\nexport function libraryOf(entry: IndexEntry): string {\n const file = entry.file.replaceAll('\\\\', '/');\n for (const [marker, label] of LIBRARIES) {\n if (file.includes(marker)) return label;\n }\n return entry.title.split('/')[0];\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 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 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.\n * `weasel-ui/Cursors/Gallery` and `weasel-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 const byLabel = new Map<string, ComponentRow[]>();\n for (const row of rows) {\n const group = byLabel.get(row.label);\n if (group) group.push(row);\n else byLabel.set(row.label, [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 all its stories; a component\n * matching only through one story keeps just the 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({ ...row, entries });\n }\n return out;\n}\n\n/**\n * The flat component list as tree nodes, so the sidebar renders and navigates\n * both views with one code path. A component with a single story becomes that\n * story's row directly — an expander onto one child is a click for nothing.\n */\nexport function componentNodes(rows: readonly ComponentRow[]): TreeNode[] {\n return rows.map((row): TreeNode =>\n row.entries.length === 1\n ? { kind: 'story', entry: row.entries[0], tag: row.library, label: row.label }\n : {\n kind: 'folder',\n label: row.label,\n path: row.path,\n tag: row.library,\n children: row.entries.map((entry) => ({ kind: 'story', entry })),\n },\n );\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 { 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 '../tree/buildComponents';\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 { 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={`${dossier.title} / ${dossier.name}`}\n className=\"fg-info-dialog\"\n >\n <StoryDossier dossier={dossier} />\n </Dialog>\n );\n}\n","import { type ConfigSchema, f } from '@weasel-js/labkit/config';\nimport type { Globals } from '../protocol/messages';\n\n/** One global the workshop's toolbar sets for every story, and a trial may pin for its own. */\nexport interface GlobalDeclaration {\n label: string;\n options: readonly { value: string; label: string }[];\n default: string;\n}\n\nexport type GlobalDeclarations = Readonly<Record<string, GlobalDeclaration>>;\n\n/** The config group every story schema gains, holding the trial's pins. A story never sees it. */\nexport const GLOBALS_KEY = '$globals';\n/** A pin's value when the trial follows the lab. */\nexport const FOLLOW_LAB = 'lab';\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === 'object' && value !== null && !Array.isArray(value);\n\nexport const isGlobalsPath = (path: string): boolean => path === GLOBALS_KEY || path.startsWith(`${GLOBALS_KEY}.`);\n\n/** The lab's values from what was stored: declared keys only, and a value no option offers falls back to the default. */\nexport function labGlobals(declarations: GlobalDeclarations, stored: unknown): Globals {\n const from = isRecord(stored) ? stored : {};\n return Object.fromEntries(\n Object.entries(declarations).map(([key, declaration]) => {\n const value = from[key];\n return [key, declaration.options.some((option) => option.value === value) ? value : declaration.default];\n }),\n );\n}\n\n/** The lab's values, overridden by the pins in a trial's config that do not follow the lab. */\nexport function effectiveGlobals(lab: Globals, pins: unknown): Globals {\n if (!isRecord(pins)) return lab;\n const pinned = Object.entries(pins).filter(([key, value]) => key in lab && value !== FOLLOW_LAB);\n return pinned.length === 0 ? lab : { ...lab, ...Object.fromEntries(pinned) };\n}\n\n/**\n * The config a story receives: the trial's, without its pins. Returns `previous` when every other entry is the same,\n * so a change to a pin alone is not a change to the story's config.\n */\nexport function storyConfig(config: unknown, previous?: unknown): unknown {\n if (!isRecord(config) || !(GLOBALS_KEY in config)) return config;\n const rest = Object.fromEntries(Object.entries(config).filter(([key]) => key !== GLOBALS_KEY));\n if (isRecord(previous)) {\n const keys = Object.keys(rest);\n if (keys.length === Object.keys(previous).length && keys.every((key) => rest[key] === previous[key])) return previous;\n }\n return rest;\n}\n\n/** `schema` with a `$globals` group appended: one leaf per declaration, following the lab until pinned. */\nexport function withGlobals(schema: ConfigSchema<unknown>, declarations: GlobalDeclarations): ConfigSchema<unknown> {\n const entries = Object.entries(declarations);\n if (entries.length === 0) return schema;\n const leaves = Object.fromEntries(\n entries.map(([key, declaration]) => [\n key,\n f.enum(FOLLOW_LAB, [{ value: FOLLOW_LAB, label: 'Lab' }, ...declaration.options]).label(declaration.label),\n ]),\n );\n // An empty group name contributes rows without a heading of its own, under the section's.\n const group = f.group(leaves).label('').section('Globals', { layout: 'inline', pack: 'pairs' });\n return f.schema({ ...schema.nodes, [GLOBALS_KEY]: group }) as ConfigSchema<unknown>;\n}\n","import { Select, usePersistedState } from '@weasel-js/labkit';\nimport { useCallback, useEffect, useMemo } from 'react';\nimport type { Globals } from '../protocol/messages';\nimport { type GlobalDeclarations, labGlobals } 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\n/** The lab's header control for its global values: one select per declaration. */\nexport function GlobalsToolbar({ declarations }: { declarations: GlobalDeclarations }) {\n const [values, set] = useLabGlobals(declarations);\n return (\n <div className=\"fg-globals\" role=\"toolbar\" aria-label=\"Globals\">\n {Object.entries(declarations).map(([key, declaration]) => (\n <Select\n key={key}\n aria-label={declaration.label}\n width=\"fit\"\n selectedKey={String(values[key])}\n onSelectionChange={(value) => set(key, value)}\n options={declaration.options}\n />\n ))}\n </div>\n );\n}\n\n/** Reports the lab's global values, as the toolbar persists them, to `onChange`. Renders nothing; mount it inside the lab. */\nexport function LabGlobals({\n declarations,\n onChange,\n}: {\n declarations: GlobalDeclarations;\n onChange: (values: Globals) => void;\n}) {\n const [values] = useLabGlobals(declarations);\n useEffect(() => onChange(values), [values, onChange]);\n return null;\n}\n","import { createContext } from 'react';\nimport type { Globals } from '../protocol/messages';\n\n/** The lab's global values, which a trial's pins override. A change reaches open frames without replacing instruments. */\nexport const StoryGlobalsContext = createContext<Globals>({});\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 { useCallback, useEffect, useState } from 'react';\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 story the URL names, and a way to name another. */\nexport function useRoute(): [string | null, (id: string) => void] {\n const [route, setRoute] = useState(readRoute);\n useEffect(() => {\n const sync = (): void => setRoute(readRoute());\n window.addEventListener('hashchange', sync);\n sync();\n return () => window.removeEventListener('hashchange', sync);\n }, []);\n const go = useCallback((id: string) => {\n const hash = `#/${encodeURIComponent(id)}`;\n if (readRoute() === id) history.replaceState(null, '', hash);\n else location.hash = hash;\n }, []);\n return [route, go];\n}\n","import type { IndexEntry } from '../../story/types';\n\nexport type TreeNode =\n | { kind: 'folder'; label: string; path: string; children: TreeNode[]; tag?: string }\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 const stories = nodes.filter((n) => n.kind === 'story');\n folders.sort((a, b) => a.label.localeCompare(b.label));\n for (const folder of folders) folder.children = sortFolder(folder.children);\n return [...folders, ...stories];\n}\n\n/** Story titles as nested folders, split on `/`; the last segment is the component holding its stories. */\nexport function buildTree(index: readonly IndexEntry[]): TreeNode[] {\n const root: TreeNode[] = [];\n const folders = new Map<string, Folder>();\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 folder = { kind: 'folder', label, path, children: [] };\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/** The stories whose `title/name` contains `query`, ignoring case, with their ancestors. */\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 return children.length > 0 ? [{ ...node, children }] : [];\n });\n return walk(nodes);\n}\n","import { type LabChromeContext, usePersistedState } from '@weasel-js/labkit';\nimport { Checkbox, ToggleBar, type ToggleBarItem } from '@weasel-js/ui';\nimport { type FocusEvent, type KeyboardEvent, type ReactNode, useId, useMemo, useRef, useState } from 'react';\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, libraryOf } from './buildComponents';\n\n/** Which shape the sidebar lists the index in. */\ntype View = 'tree' | 'components';\n\nconst VIEWS: readonly ToggleBarItem<View>[] = [\n { value: 'tree', label: 'Tree' },\n { value: 'components', label: 'Components' },\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/** 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', 'tree', { 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 const tree = useMemo(() => buildTree(kept), [kept]);\n const components = useMemo(() => buildComponents(kept), [kept]);\n const shown = useMemo(\n () =>\n view === 'components'\n ? componentNodes(filterComponents(components, query))\n : filterTree(tree, query),\n [view, components, tree, query],\n );\n const routed = kept.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] ?? (view === 'tree' && 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 ctx.swapTrial(focused.id, entry.id);\n setRoute(entry.id);\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 === 'folder') setOpen(node.path, !isOpen(node.path));\n else activate(node.entry, 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 className=\"fg-tree__node\"\n >\n <div className=\"fg-tree__item fg-tree__folder\" onClick={() => setOpen(node.path, !open)}>\n <span className=\"fg-tree__label\">{node.label}</span>\n {node.tag ? <span className=\"fg-tree__tag\">{node.tag}</span> : 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 ? <span className=\"fg-tree__tag\">{node.tag}</span> : 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 {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 { 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 './shell.css';\nimport { type RenderContext, TrialIdContext } 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 type FromFrame,\n type Globals,\n PORT_HANDOFF,\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';\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';\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/** 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 src = `${frameUrl}#${entry.id}`;\n const iframeRef = useRef<HTMLIFrameElement>(null);\n const hostRef = useRef<HTMLDivElement>(null);\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 reloads the frame and `init` carries them back.\n const inView = useInView(hostRef);\n const link = useRef<Link | null>(null);\n const latest = useRef({ ...props, globals, overrides });\n latest.current = { ...props, globals, overrides };\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 '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 onLoad = (): void => {\n closeLink(link);\n setPending(true);\n const target = iframeRef.current?.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 }, location.origin, [port2]);\n };\n\n useEffect(() => () => closeLink(link), []);\n\n useEffect(() => {\n if (inView) return;\n closeLink(link);\n setPending(true);\n setFault(null);\n }, [inView]);\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 {inView ? (\n <iframe\n ref={iframeRef}\n className=\"fg-frame-view\"\n src={src}\n title={`${entry.title} / ${entry.name}`}\n onLoad={onLoad}\n data-pending={pending && !fault ? '' : undefined}\n />\n ) : null}\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 type { AnnotationsCapability, 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';\nimport type { TrialFrames } from './trialFrames';\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 /** The workshop's frame registry. Without it the instrument takes no marks: an annotation target's\n * picture is the frame's to draw, and its box is the frame's to measure. */\n frames?: TrialFrames;\n}\n\n/** The story itself, as the one region of the trial that takes marks. */\nfunction annotationsOn(frames: TrialFrames): AnnotationsCapability<unknown, unknown> {\n return {\n targets: (_state, _config, trial) => {\n const ref = frames.hostRef(trial.id);\n const frame = frames.get(trial.id);\n const box = frame.size ?? { width: ref.current?.clientWidth ?? 0, height: ref.current?.clientHeight ?? 0 };\n const capture = frame.capture;\n return [\n {\n id: 'story',\n ref,\n content: { w: Math.max(1, box.width), h: Math.max(1, box.height) },\n ...(capture ? { base: () => capture() } : {}),\n },\n ];\n },\n };\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 = {}, frames } = 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: `${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 ...(frames ? { annotations: annotationsOn(frames) } : {}),\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 { stableStringify } from '../protocol/messages';\nimport type { IndexEntry } from '../story/types';\nimport { type AnswerBook, createAnswerBook } from './answers';\nimport type { GlobalDeclarations } from './globals';\nimport { type Ready, readyKey } from './readyKey';\nimport { storyInstrument } from './storyInstrument';\nimport type { TrialFrames } from './trialFrames';\n\nexport interface StoryRegistry {\n instruments: InstrumentList;\n /** Whether a story's frame has reported its schema. An instrument is built\n * either way, and before the report its schema is empty — which reads as\n * \"no args\" to anything that cannot tell the 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}\n\ninterface Built {\n entryKey: string;\n ready: Ready | undefined;\n frameUrl: string;\n globals: GlobalDeclarations;\n frames: TrialFrames | undefined;\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 = {};\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\n/**\n * One instrument per story in `index`, each schema holding a `$globals` group for `globals`. The lab's global values\n * reach the frames through `StoryGlobalsContext`, not through here.\n */\nexport function useStoryRegistry(\n index: readonly IndexEntry[],\n options: { frameUrl: string; globals?: GlobalDeclarations; frames?: TrialFrames },\n): StoryRegistry {\n const { frameUrl, globals = NO_GLOBALS, frames } = options;\n const [readies, setReadies] = useState<ReadonlyMap<string, Ready>>(() => 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 setRevisions((prev) => pruned(prev, ids));\n }, [index]);\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 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.frameUrl === frameUrl &&\n held.globals === globals &&\n held.frames === frames &&\n held.revision === revision\n ? held\n : {\n entryKey,\n ready,\n frameUrl,\n globals,\n frames,\n revision,\n instrument: storyInstrument({ entry, ready, answers, frameUrl, onReady, globals, ...(frames ? { frames } : {}) }),\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, revisions, frameUrl, globals, frames, onReady]);\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), [readies]);\n\n return { instruments: cache.list, isReady, onReady };\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 Globals, stableStringify } from '../protocol/messages';\nimport type { IndexEntry } from '../story/types';\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 { createTrialFrames, TrialFramesContext } from './trialFrames';\nimport { type GlobalDeclarations, labGlobals } from './globals';\nimport { GlobalsToolbar, LabGlobals } from './GlobalsToolbar';\nimport { StoryGlobalsContext } from './StoryGlobalsContext';\nimport { StoryTree } from './tree/StoryTree';\nimport { readRoute, useRoute } from './useRoute';\nimport { useStoryRegistry } from './useStoryRegistry';\n\nexport interface WorkshopProps {\n index: readonly IndexEntry[];\n frameUrl: string;\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}\n\nconst NO_DECLARATIONS: GlobalDeclarations = {};\n\n/** The story `#/<id>` names, when it is indexed; otherwise the first story. Read when the lab mounts. */\nfunction initialStory(index: readonly IndexEntry[], fallback: string): string {\n const route = readRoute();\n return route !== null && index.some((entry) => entry.id === route) ? route : fallback;\n}\n\n/** Opens a trial of the story the route names when none is open, once per route, so closing that trial sticks. */\nfunction RouteOpener({ index }: { index: readonly IndexEntry[] }) {\n const lab = useLabContext();\n const [route] = useRoute();\n const handled = useRef<string | null>(null);\n useEffect(() => {\n if (route === null || handled.current === route || !index.some((entry) => entry.id === route)) return;\n handled.current = route;\n if (!lab.trials.some((trial) => trial.instrumentName === route)) 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, config, stories = [], storageKey, storage }: WorkshopProps) {\n const declarations = config?.globals ?? NO_DECLARATIONS;\n const [frames] = useState(createTrialFrames);\n const registry = useStoryRegistry(index, { frameUrl, globals: declarations, frames });\n const [labValues, setLabValues] = useState<Globals>(() => labGlobals(declarations, undefined));\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 <TrialFramesContext.Provider value={frames}>\n <Lab\n title=\"weaselforge\"\n density=\"roomy\"\n instruments={registry.instruments}\n defaultInstrument={initialStory(index, 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={index} />\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 </StoryGlobalsContext.Provider>\n );\n}\n","import { createRoot } from 'react-dom/client';\nimport type { IndexEntry } from '../story/types';\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 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 let current: WorkshopProps = props;\n root.render(<Workshop {...current} />);\n return {\n setIndex(index) {\n current = { ...current, index };\n root.render(<Workshop {...current} />);\n },\n unmount: () => root.unmount(),\n };\n}\n"]}
|
package/dist/test/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { F as FrameSetup } from '../FrameController-
|
|
1
|
+
import { F as FrameSetup } from '../FrameController-eZM3hlcE.js';
|
|
2
2
|
import '@weasel-js/labkit/config';
|
|
3
3
|
import 'react';
|
|
4
4
|
|
|
@@ -12,6 +12,6 @@ interface RunStoryOptions {
|
|
|
12
12
|
* Renders one story the way the workshop's frame does — defaults, no state, no globals — then plays it.
|
|
13
13
|
* Throws on any fault the frame reports, or a play function that fails.
|
|
14
14
|
*/
|
|
15
|
-
declare function runStory(mod: Record<string, unknown>, exportName: string, file: string,
|
|
15
|
+
declare function runStory(mod: Record<string, unknown>, exportName: string, file: string, autoTitle: string, { setup, viewport }?: RunStoryOptions): Promise<void>;
|
|
16
16
|
|
|
17
17
|
export { type RunStoryOptions, runStory };
|