@weasel-js/forge 1.13.0 → 1.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/README.md +1 -1
  2. package/dist/{FrameController-DgfVaENb.d.ts → FrameController-BM6xuEfY.d.ts} +6 -10
  3. package/dist/{chunk-7XJNVJB5.js → chunk-B26DWEYT.js} +3 -3
  4. package/dist/{chunk-7XJNVJB5.js.map → chunk-B26DWEYT.js.map} +1 -1
  5. package/dist/{chunk-3BAM6M26.js → chunk-FPF2JSWB.js} +3 -3
  6. package/dist/chunk-FPF2JSWB.js.map +1 -0
  7. package/dist/{chunk-ORMMZ5PV.js → chunk-MRYXJTDO.js} +7 -3
  8. package/dist/chunk-MRYXJTDO.js.map +1 -0
  9. package/dist/{chunk-GHPMNT2A.js → chunk-PGLOYXDP.js} +184 -184
  10. package/dist/chunk-PGLOYXDP.js.map +1 -0
  11. package/dist/{chunk-WFT5IOHX.js → chunk-PPB7VP6R.js} +5 -4
  12. package/dist/chunk-PPB7VP6R.js.map +1 -0
  13. package/dist/{chunk-COT4I347.js → chunk-SFKDHXVE.js} +26 -4
  14. package/dist/chunk-SFKDHXVE.js.map +1 -0
  15. package/dist/chunk-STK2AZH2.js +11 -0
  16. package/dist/chunk-STK2AZH2.js.map +1 -0
  17. package/dist/chunk-TT4ZOYB6.js +143 -0
  18. package/dist/chunk-TT4ZOYB6.js.map +1 -0
  19. package/dist/{chunk-XIBKYSRU.js → chunk-UDEUT7AG.js} +124 -80
  20. package/dist/chunk-UDEUT7AG.js.map +1 -0
  21. package/dist/{config-6fWf87Tt.d.ts → config-DOjWyIui.d.ts} +1 -1
  22. package/dist/csf/preview-api.js +2 -2
  23. package/dist/frame/index.css +0 -2
  24. package/dist/frame/index.css.map +1 -1
  25. package/dist/frame/index.d.ts +4 -4
  26. package/dist/frame/index.js +9 -6
  27. package/dist/frame/index.js.map +1 -1
  28. package/dist/index.d.ts +11 -5
  29. package/dist/index.js +4 -4
  30. package/dist/{mountFrame-Bs7u1ro-.d.ts → mountFrame-CRPAjg1M.d.ts} +1 -1
  31. package/dist/shell/index.css +164 -147
  32. package/dist/shell/index.css.map +1 -1
  33. package/dist/shell/index.d.ts +23 -5
  34. package/dist/shell/index.js +454 -318
  35. package/dist/shell/index.js.map +1 -1
  36. package/dist/test/index.d.ts +1 -1
  37. package/dist/test/index.js +8 -10
  38. package/dist/test/index.js.map +1 -1
  39. package/dist/vite/index.js +118 -30
  40. package/dist/vite/index.js.map +1 -1
  41. package/package.json +11 -9
  42. package/dist/chunk-2ZBZRBHI.js +0 -10
  43. package/dist/chunk-2ZBZRBHI.js.map +0 -1
  44. package/dist/chunk-3BAM6M26.js.map +0 -1
  45. package/dist/chunk-COT4I347.js.map +0 -1
  46. package/dist/chunk-GHPMNT2A.js.map +0 -1
  47. package/dist/chunk-L5XM5VKB.js +0 -47
  48. package/dist/chunk-L5XM5VKB.js.map +0 -1
  49. package/dist/chunk-ORMMZ5PV.js.map +0 -1
  50. package/dist/chunk-WFT5IOHX.js.map +0 -1
  51. package/dist/chunk-XIBKYSRU.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/shell/a11y/A11yPanel.tsx","../../src/shell/followEdits.ts","../../src/shell/loupe/captureContext.ts","../../src/shell/storyChanges.ts","../../src/shell/dependencies.ts","../../src/shell/useRoute.ts","../../src/timeline/playheadUrl.ts","../../src/timeline/TransportBar.tsx","../../src/shell/breadcrumb.ts","../../src/shell/treeReveal.ts","../../src/shell/Crumbs.tsx","../../src/shell/IndexTrial.tsx","../../src/shell/loupe/CaptureInputs.tsx","../../src/shell/documentInstrument.tsx","../../src/shell/cssVars/reveal.ts","../../src/shell/cssVars/SectionJump.tsx","../../src/shell/cssVars/saveScales.ts","../../src/shell/cssVars/saveTokens.ts","../../src/shell/cssVars/useTrialSelection.ts","../../src/shell/cssVars/useThemeSave.ts","../../src/shell/cssVars/useStoryTokens.ts","../../src/shell/cssVars/useThemeTokens.ts","../../src/shell/cssVars/varsHistory.ts","../../src/shell/cssVars/CssVarsPanel.tsx","../../src/shell/cssVars/cssVarsChrome.ts","../../src/shell/keys/keyRows.ts","../../src/shell/keys/KeysPanel.tsx","../../src/shell/keys/keysChrome.ts","../../src/shell/info/infoItem.ts","../../src/shell/info/dossier.ts","../../src/shell/info/StoryDossier.tsx","../../src/shell/info/StoryInfoDialog.tsx","../../src/shell/framePool.ts","../../src/shell/loupe/CompareMenu.tsx","../../src/shell/loupe/liveSource.ts","../../src/shell/loupe/tokenChain.ts","../../src/shell/loupe/readouts.tsx","../../src/shell/loupe/frameScroll.ts","../../src/shell/loupe/capturePayload.ts","../../src/shell/loupe/captureClient.ts","../../src/shell/loupe/pixelsLens.ts","../../src/shell/loupe/pixelsSource.ts","../../src/shell/loupe/usePixelsSource.ts","../../src/shell/loupe/ForgeLoupe.tsx","../../src/shell/routedTrial.ts","../../src/timeline/RoutePlayhead.tsx","../../src/shell/GlobalsToolbar.tsx","../../src/shell/globalsMenu.tsx","../../src/shell/RouteKnobs.tsx","../../src/shell/revealTrial.ts","../../src/shell/tree/buildTree.ts","../../src/shell/tree/buildComponents.ts","../../src/shell/tree/StoryTree.tsx","../../src/shell/answers.ts","../../src/shell/readyKey.ts","../../src/shell/frameLink.ts","../../src/shell/keptFrame.ts","../../src/shell/FrameView.tsx","../../src/shell/storyInstrument.tsx","../../src/shell/useStoryRegistry.ts","../../src/shell/Workshop.tsx","../../src/shell/mountWorkshop.tsx"],"names":["createEmitter","createContext","useState","useEffect","jsxs","jsx","Fragment","useLabContext","TrialIdContext","useContext","useRef","token","pending","useMemo","history","now","TOKEN_MANIFEST","useTrialId","usePersistedState","useSyncExternalStore","MANIFEST","THEME_SOURCES","generateScale","f","name","useCallback","ToggleBar","Icon","Button","labGlobals","RECORD","useActionsRegistry","formatShortcut","num","handle","shelf","isConfigBranch","listeners","aim","useLatest","parseColor","isPlainObject","kept","unavailableText","pixels","useReducer","pref","knobs","valueAtPath","LibraryBadge","setRoute","collect","rest","node","row","Checkbox","keyOf","frames","adopt","useLayoutEffect","NO_GLOBALS","revisions","ids","libraries","cssVarsChrome","keysChrome"],"mappings":"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","file":"index.js","sourcesContent":["import {\n Button,\n type LabContribution,\n TrialIdContext,\n useLabContext,\n useTrialId,\n} from '@weasel-js/labkit';\nimport num from '@weasel-js/theme/numeric.module.css';\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport type { A11yFinding, A11yNode } from '../../protocol/messages';\nimport { useTrialFrame } from '../trialFrames';\n\n/** Called with the elements an item names while the pointer or focus is on it, and with null when it leaves. */\ntype Point = (nodes: readonly A11yNode[] | null) => void;\n\n/** Handlers pointing at `nodes` while the pointer or focus is inside the element they are spread on. */\nfunction pointAt(point: Point, nodes: readonly A11yNode[]) {\n const enter = (event: { stopPropagation(): void }) => {\n event.stopPropagation();\n point(nodes);\n };\n return { onMouseOver: enter, onFocus: enter, onMouseLeave: () => point(null), onBlur: () => point(null) };\n}\n\nfunction Finding({ finding, point }: { finding: A11yFinding; point: Point }) {\n return (\n <li className=\"fg-a11y__finding\" {...pointAt(point, finding.nodes)}>\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(',')}`} {...pointAt(point, [node])}>\n <code>{node.target.join(' ')}</code>\n </li>\n ))}\n </ul>\n </li>\n );\n}\n\nfunction Findings({ title, findings, point }: { title: string; findings: readonly A11yFinding[]; point: Point }) {\n if (findings.length === 0) return null;\n return (\n <section className=\"fg-a11y__group\">\n <h3 className={`fg-a11y__group-title ${num.numeric}`}>\n {title} ({findings.length})\n </h3>\n <ul className=\"fg-a11y__findings\">\n {findings.map((finding) => (\n <Finding key={finding.id} finding={finding} point={point} />\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 [inFlight, setInFlight] = useState(0);\n const running = inFlight > 0;\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 const start = useCallback((run: NonNullable<typeof audit>) => {\n setInFlight((n) => n + 1);\n void run().finally(() => setInFlight((n) => n - 1));\n }, []);\n\n useEffect(() => {\n if (!audit || ran.current === audit) return;\n ran.current = audit;\n start(audit);\n }, [audit, start]);\n\n const send = frame.send;\n const [pointed, setPointed] = useState<readonly A11yNode[] | null>(null);\n useEffect(() => {\n if (!send || !pointed) return;\n send({ type: 'a11y.highlight', targets: pointed.map((node) => node.target) });\n return () => send({ type: 'a11y.highlight', targets: [] });\n }, [send, pointed]);\n\n const rerun = () => {\n if (audit) start(audit);\n };\n\n const outcome = frame.a11y;\n return (\n <div className=\"fg-a11y\">\n <div className=\"fg-a11y__controls\">\n <Button size=\"sm\" 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 ${num.numeric}`}>\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} point={setPointed} />\n <Findings title=\"Needs review\" findings={outcome.report.incomplete} point={setPointed} />\n </>\n ) : null}\n </div>\n );\n}\n\n/** The panel for the lab's focused trial, rendered as though inside that trial. */\nfunction FocusedA11y() {\n const { focusedTrialId, trials, instruments } = useLabContext();\n const record = trials.find((trial) => trial.id === focusedTrialId);\n if (!record) return null;\n const instrument = instruments.find((i) => i.name === record.instrumentName);\n return (\n <section className=\"fg-a11y-focus\" aria-label=\"Accessibility\">\n <p className=\"fg-a11y__trial\">{record.title ?? instrument?.title ?? record.instrumentName}</p>\n <TrialIdContext.Provider value={record.id}>\n <A11yPanel />\n </TrialIdContext.Provider>\n </section>\n );\n}\n\n/** The lab aside section showing the focused trial's accessibility audit. */\nexport const A11Y_SECTION: LabContribution = {\n id: 'fg-a11y',\n region: 'aside',\n item: { title: 'Accessibility', body: <FocusedA11y /> },\n};\n","import type { FrameImporters } from '../frame/mountFrame';\nimport type { DepGraph, IndexEntry } from '../story/types';\nimport type { MountedWorkshop } from './mountWorkshop';\n\n/** The part of vite's `import.meta.hot` the workshop listens on. */\nexport interface HotEvents {\n on(event: string, listener: (data: never) => void): void;\n}\n\n/** What the shell entry hands an accepted importers module to. */\nexport interface FollowedEdits {\n importers(next: FrameImporters | undefined): void;\n}\n\n/**\n * Feeds the workshop what the vite plugin pushes after an edit. An edit to a story file, or to a module one imports,\n * reaches the page as an update of the importers module, whose fresh import() URLs carry the new timestamps; the files\n * it reaches arrive just before, so the reload waits for the importers that can fetch them. Any update at all, a\n * stylesheet's included, means a capture taken before it may show the story as it no longer is.\n */\nexport function followEdits(hot: HotEvents | undefined, workshop: MountedWorkshop): FollowedEdits {\n const stale = new Set<string>();\n hot?.on('forge:index', (next: readonly IndexEntry[]) => workshop.setIndex(next));\n hot?.on('forge:deps', (next: DepGraph) => workshop.setDependencies(next));\n hot?.on('forge:story', ({ file }: { file: string }) => {\n stale.add(file);\n workshop.revise();\n });\n hot?.on('vite:beforeUpdate', () => workshop.revise());\n return {\n importers(next) {\n if (!next) return;\n workshop.setImporters(next);\n for (const file of stale) workshop.reloadStory(file);\n stale.clear();\n },\n };\n}\n","import { createEmitter } from '@weasel-js/registry';\nimport { createContext } from 'react';\nimport type { Layout } from '../../protocol/messages';\nimport type { IndexEntry } from '../../story/types';\nimport type { CssOverrides } from '../cssVars/overrides';\n\n/** A count of story edits since the workshop loaded: a capture taken at an older one shows a story that is gone. */\nexport interface Revision {\n get(): number;\n subscribe(listener: () => void): () => void;\n}\n\nexport function createRevision(): Revision & { bump(): void } {\n let n = 0;\n const bumped = createEmitter<[]>();\n return {\n get: () => n,\n subscribe: bumped.subscribe,\n bump() {\n n += 1;\n bumped.emit();\n },\n };\n}\n\n/** What a trial renders its story from, as a capture of it needs them. */\nexport interface TrialInputs {\n entry: Pick<IndexEntry, 'id' | 'isolate'>;\n layout: Layout;\n /** The trial's whole config, forge's `$` keys included. */\n config: unknown;\n state: unknown;\n overrides: CssOverrides;\n}\n\n/** Each story trial's inputs, by trial id, published by the trial and read by a Pixels lens over it. */\nexport interface CaptureTrials {\n /** Returns the withdrawal, which leaves a later publish for the same trial standing. */\n publish(trialId: string, inputs: TrialInputs): () => void;\n get(trialId: string): TrialInputs | null;\n subscribe(listener: () => void): () => void;\n}\n\nexport function createCaptureTrials(): CaptureTrials {\n const trials = new Map<string, TrialInputs>();\n const changed = createEmitter<[]>();\n return {\n publish(trialId, inputs) {\n trials.set(trialId, inputs);\n changed.emit();\n return () => {\n if (trials.get(trialId) !== inputs) return;\n trials.delete(trialId);\n changed.emit();\n };\n },\n get: (trialId) => trials.get(trialId) ?? null,\n subscribe: changed.subscribe,\n };\n}\n\n/** Where a Pixels lens asks for captures, and what it captures from; null where no dev server takes captures. */\nexport interface LoupeCapture {\n /** The dev server's base, under which its capture endpoint answers. */\n base: string;\n trials: CaptureTrials;\n revision: Revision;\n}\n\nexport const LoupeCaptureContext = createContext<LoupeCapture | null>(null);\n","import { createEmitter } from '@weasel-js/registry';\n\n/** Story files edited while the workshop runs, for the registry to load again. */\nexport interface StoryChanges {\n subscribe(listener: (file: string) => void): () => void;\n emit(file: string): void;\n}\n\nexport function createStoryChanges(): StoryChanges {\n const changes = createEmitter<[file: string]>();\n return { subscribe: changes.subscribe, emit: changes.emit };\n}\n","import { createContext } from 'react';\nimport type { DepGraph } from '../story/types';\n\n/** The component graph the vite plugin derived from source; null until it arrives. */\nexport const DependenciesContext = createContext<DepGraph | null>(null);\n","import { useEffect, useState } from 'react';\nimport { formatRoute, parseRoute } from '../route/url';\n\n/** What forge keeps on a history entry: its place in the session, and whether reaching it swapped a trial's story in place. */\nexport interface RouteEntry {\n step: number;\n inPlace: boolean;\n /** Set until the knobs first sync: the entry was written for a trial already showing the story, whose config stands. */\n fromTrial?: boolean;\n}\n\n/** The story id `#/<id>` names, or null. */\nexport function readRoute(): string | null {\n return parseRoute(location.hash).story;\n}\n\n/** Every param after the story id: its knobs, and the workshop's reserved params. */\nexport function readRouteParams(): Record<string, string> {\n return { ...parseRoute(location.hash).params };\n}\n\n/**\n * Rewrites the current story's params in place, with no new history entry: `update` is handed every param and\n * returns the ones to keep. The one way anything writes a param, so knobs and reserved params do not overwrite\n * each other. A no-op when no story is named.\n */\nexport function replaceRouteParams(update: (params: Record<string, string>) => Record<string, string>): void {\n const { story, params } = parseRoute(location.hash);\n if (story === null) return;\n const next = formatRoute({ story, params: update({ ...params }) });\n if (next !== location.hash) history.replaceState(history.state, '', next);\n}\n\n/** The current history entry's forge state, or null for one forge did not write, such as a typed URL. */\nexport function readRouteEntry(): RouteEntry | null {\n const state = history.state as { forgeRoute?: unknown } | null;\n const entry = state?.forgeRoute as RouteEntry | undefined;\n return typeof entry?.step === 'number' ? entry : null;\n}\n\n/** Whether moving between two entries crosses an in-place swap: back off one, or forward onto one. */\nexport function crossesInPlace(from: RouteEntry | null, to: RouteEntry | null): boolean {\n if (!from || !to || from.step === to.step) return false;\n return to.step < from.step ? from.inPlace : to.inPlace;\n}\n\nfunction stamp(entry: RouteEntry, hash: string): void {\n history.replaceState({ ...(history.state ?? {}), forgeRoute: entry }, '', hash);\n}\n\n/**\n * Names story `id` in the URL; `inPlace` says it replaced the previous story in its trial. A different story starts\n * with no params, so one story's knobs never reach the next; `fromTrial` says a trial already shows it, and that\n * trial's knobs are written to the URL where they would otherwise be read from it. Naming the current story again\n * keeps the params it has.\n */\nexport function setRoute(id: string, options: { inPlace?: boolean; fromTrial?: boolean } = {}): void {\n if (readRoute() === id) {\n history.replaceState(history.state, '', formatRoute({ story: id, params: readRouteParams() }));\n return;\n }\n const hash = formatRoute({ story: id, params: {} });\n const from = readRouteEntry() ?? { step: 0, inPlace: false };\n stamp(from, location.hash);\n location.hash = hash;\n stamp({ step: from.step + 1, inPlace: options.inPlace ?? false, ...(options.fromTrial ? { fromTrial: true } : {}) }, hash);\n}\n\n/** Whether the current entry was written for a trial already showing its story; asking clears it, so it answers yes once. */\nexport function takeRouteFromTrial(): boolean {\n const entry = readRouteEntry();\n if (!entry?.fromTrial) return false;\n stamp({ step: entry.step, inPlace: entry.inPlace }, location.hash);\n return true;\n}\n\n/** The story the URL names, and `setRoute` to name another. */\nexport function useRoute(): [string | null, typeof setRoute] {\n const [route, setCurrent] = useState(readRoute);\n useEffect(() => {\n const sync = (): void => setCurrent(readRoute());\n window.addEventListener('hashchange', sync);\n sync();\n return () => window.removeEventListener('hashchange', sync);\n }, []);\n return [route, setRoute];\n}\n","import { PLAYHEAD_PARAM } from '../route/url';\nimport { readRouteParams, replaceRouteParams } from '../shell/useRoute';\n\nexport function formatSeconds(ms: number): string {\n const rounded = Math.round(ms) / 1000;\n return String(rounded === 0 ? 0 : rounded);\n}\n\n/** Ms from a seconds string, or null for anything but a finite number. */\nexport function parseSeconds(text: string | null | undefined): number | null {\n if (text == null || !/^\\s*-?(\\d+\\.?\\d*|\\.\\d+)\\s*$/.test(text)) return null;\n return Math.round(Number(text) * 1000);\n}\n\n/** The playhead the URL holds, in ms, or null. */\nexport function readPlayheadParam(): number | null {\n return parseSeconds(readRouteParams()[PLAYHEAD_PARAM]);\n}\n\n/** Holds `ms` in the URL, or drops it for null, in place. */\nexport function writePlayheadParam(ms: number | null): void {\n replaceRouteParams(({ [PLAYHEAD_PARAM]: _held, ...rest }) =>\n ms === null ? rest : { ...rest, [PLAYHEAD_PARAM]: formatSeconds(ms) },\n );\n}\n","import { Slider } from '@weasel-js/ui/components/Slider';\nimport { Transport } from '@weasel-js/ui/components/Timeline';\nimport { useSyncExternalStore } from 'react';\nimport type { Clock } from './clock';\nimport { formatSeconds } from './playheadUrl';\nimport { useTrialClock } from './trialClocks';\nimport './timeline.css';\n\n/** A scrub bar across the clock's span, then `Transport`'s play, loop, rate and time readout. */\nexport function TransportBar({ clock }: { clock: Clock }) {\n const { time, playing, loop, rate, span } = useSyncExternalStore(clock.subscribe, clock.get);\n return (\n <div className=\"fg-transport\">\n <Slider\n className=\"fg-transport__scrub\"\n ariaLabel=\"Scrub\"\n thumbShape=\"dot\" trackHeight=\"var(--wzl-slider-track-h)\" thumbSize=\"var(--wzl-slider-thumb-size)\"\n readoutPlacement=\"none\"\n min={span.start}\n max={span.end > span.start ? span.end : span.start + 1}\n thumbs={[{ value: time, valueText: `${formatSeconds(time)} seconds` }]}\n onInput={([thumb]) => {\n if (thumb) clock.seek(thumb.value);\n }}\n />\n <Transport\n paused={!playing}\n loop={loop}\n rate={rate}\n playhead={time}\n duration={span.end}\n onPlay={clock.play}\n onPause={clock.pause}\n onLoopChange={(next) => clock.setLoop(next !== false && next !== 0)}\n onRateChange={clock.setRate}\n />\n </div>\n );\n}\n\n/** The transport of the clock trial `trialId`'s story published; nothing until it has. */\nexport function TrialTransport({ trialId }: { trialId: string }) {\n const clock = useTrialClock(trialId);\n return clock ? <TransportBar clock={clock} /> : null;\n}\n","/** One step of a story's place: its label, and the tree folder it names — null for the story itself. */\nexport interface Crumb {\n readonly label: string;\n readonly path: string | null;\n}\n\nconst bare = (label: string): string => label.toLowerCase().replace(/[^\\p{L}\\p{N}]/gu, '');\n\n/** Whether a story's name only restates its component's: `KeyDiagram` under `…/KeyDiagram`. */\nexport function restatesTitle(title: string, name: string): boolean {\n return bare(title.slice(title.lastIndexOf('/') + 1)) === bare(name);\n}\n\n/** A story's place step by step: each title segment, then the story's name. An `index` segment adds nothing the\n * one before it does not already say, so it is left out, and so is a name that restates the last segment, which\n * then stands for the story. */\nexport function crumbs(title: string, name: string): Crumb[] {\n const segments = title.split('/');\n const steps: Crumb[] = segments.map((label, i) => ({ label, path: segments.slice(0, i + 1).join('/') }));\n if (restatesTitle(title, name)) steps[steps.length - 1] = { label: segments[segments.length - 1], path: null };\n else steps.push({ label: name, path: null });\n return steps.filter((step, i) => i === 0 || step.label.toLowerCase() !== 'index');\n}\n\n/** A story's place as one line. */\nexport function breadcrumb(title: string, name: string): string {\n return crumbs(title, name)\n .map((step) => step.label)\n .join(' > ');\n}\n","import { createEmitter } from '@weasel-js/registry';\n\nconst reveals = createEmitter<[path: string]>();\n\n/** Asks the story tree to show the folder at `path`, as clicking its row would. */\nexport function revealInTree(path: string): void {\n reveals.emit(path);\n}\n\n/** Hears `revealInTree`; returns the unsubscribe. */\nexport function onRevealInTree(listener: (path: string) => void): () => void {\n return reveals.subscribe(listener);\n}\n","import './Crumbs.css';\nimport type { Instrument } from '@weasel-js/labkit';\nimport { Fragment } from 'react';\nimport type { IndexEntry } from '../story/types';\nimport { breadcrumb, crumbs } from './breadcrumb';\nimport { revealInTree } from './treeReveal';\n\nfunction Crumbs({ entry }: { entry: IndexEntry }) {\n const steps = crumbs(entry.title, entry.name);\n return (\n <span className=\"fg-crumbs\">\n {steps.map((step, i) => (\n <Fragment key={step.path ?? `${step.label}:${i}`}>\n {i > 0 ? (\n <span className=\"fg-crumbs__sep\" aria-hidden=\"true\">\n ›\n </span>\n ) : null}\n {step.path === null ? (\n <span className=\"fg-crumbs__here\">{step.label}</span>\n ) : (\n <button\n type=\"button\"\n className=\"fg-crumbs__step\"\n title={`Show ${step.label} in the story tree`}\n onPointerDown={(event) => event.stopPropagation()}\n onClick={() => revealInTree(step.path as string)}\n >\n {step.label}\n </button>\n )}\n </Fragment>\n ))}\n </span>\n );\n}\n\n/** An entry's trial title: its breadcrumb, drawn with each folder a link to that folder in the story tree. A trial\n * someone renamed shows the name it was given. */\nexport function crumbTitle(entry: IndexEntry): Pick<Instrument, 'title' | 'renderTitle'> {\n const title = breadcrumb(entry.title, entry.name);\n return { title, renderTitle: (shown) => (shown === title ? <Crumbs entry={entry} /> : shown) };\n}\n","import { TrialIdContext, useLabContext } from '@weasel-js/labkit';\nimport { useContext } from 'react';\nimport type { FrameSetup } from '../frame/FrameController';\nimport { indexEnvOf } from '../frame/index/indexEnv';\nimport { IndexPage } from '../frame/index/IndexPage';\nimport type { Globals } from '../protocol/messages';\nimport type { IndexBundle } from '../story/indexBundle';\nimport { DependenciesContext } from './dependencies';\nimport { LiveCopies } from './loupe/LiveCopies';\nimport { TrialHost } from './TrialHost';\nimport { setRoute } from './useRoute';\n\nexport interface IndexTrialProps {\n bundle: IndexBundle;\n setup: FrameSetup;\n config: unknown;\n}\n\n/** A component's index page rendered in the workshop document; `open` swaps its own trial to the story clicked. */\nexport function IndexTrial({ bundle, setup, config }: IndexTrialProps) {\n const lab = useLabContext();\n const trialId = useContext(TrialIdContext);\n const graph = useContext(DependenciesContext);\n const open = (id: string) => {\n if (!trialId || !lab.instruments.some((instrument) => instrument.name === id)) return;\n lab.swapTrial(trialId, id);\n setRoute(id, { inPlace: true });\n };\n const render = (globals: Globals) => (\n <IndexPage env={indexEnvOf(bundle, { graph, globals, decorators: setup.decorators ?? [], open })} render={bundle.render} />\n );\n return (\n <>\n <TrialHost layout=\"fullscreen\" setup={setup} config={config}>\n {render}\n </TrialHost>\n <LiveCopies trialId={trialId} layout=\"fullscreen\" setup={setup} trialConfig={config}>\n {render}\n </LiveCopies>\n </>\n );\n}\n","import { TrialIdContext } from '@weasel-js/labkit';\nimport { type ReactNode, useContext, useEffect, useMemo, useRef, useState } from 'react';\nimport type { Layout } from '../../protocol/messages';\nimport { useCssOverrides } from '../cssVars/overrides';\nimport { createCaptureTrials, type LoupeCapture, LoupeCaptureContext, type Revision, type TrialInputs } from './captureContext';\nimport { createLiveLenses, LiveLensesContext } from './liveLenses';\n\n/** Props for `CaptureInputs`. */\nexport interface CaptureInputsProps {\n entry: TrialInputs['entry'];\n layout: Layout;\n config: unknown;\n state: unknown;\n}\n\n/**\n * Publishes the trial it renders in to the workshop's Pixels lenses: what a capture of its story is made from. A\n * change republishes over the last; only unmounting, or moving to another trial, withdraws it, so a lens never sees\n * the trial gone between the two.\n */\nexport function CaptureInputs({ entry, layout, config, state }: CaptureInputsProps) {\n const capture = useContext(LoupeCaptureContext);\n const trialId = useContext(TrialIdContext);\n const [overrides] = useCssOverrides();\n const withdraw = useRef<(() => void) | null>(null);\n useEffect(() => {\n if (capture && trialId) withdraw.current = capture.trials.publish(trialId, { entry, layout, config, state, overrides });\n }, [capture, trialId, entry, layout, config, state, overrides]);\n useEffect(\n () => () => {\n withdraw.current?.();\n withdraw.current = null;\n },\n [capture, trialId],\n );\n return null;\n}\n\n/** Props for `LoupeProvider`. */\nexport interface LoupeProviderProps {\n /** The dev server's base; absent, lenses offer no Pixels source. */\n captureBase?: string | undefined;\n /** Bumped on every story edit. */\n revision?: Revision | undefined;\n children: ReactNode;\n}\n\nconst STILL: Revision = { get: () => 0, subscribe: () => () => {} };\n\n/** What the workshop's lenses read from its trials: the Live requests each trial answers, and each trial's inputs. */\nexport function LoupeProvider({ captureBase, revision = STILL, children }: LoupeProviderProps) {\n const [lenses] = useState(createLiveLenses);\n const [trials] = useState(createCaptureTrials);\n const capture = useMemo<LoupeCapture | null>(\n () => (captureBase === undefined ? null : { base: captureBase, trials, revision }),\n [captureBase, trials, revision],\n );\n return (\n <LiveLensesContext.Provider value={lenses}>\n <LoupeCaptureContext.Provider value={capture}>{children}</LoupeCaptureContext.Provider>\n </LiveLensesContext.Provider>\n );\n}\n","import type { Instrument } from '@weasel-js/labkit';\nimport { type ConfigSchema, f } from '@weasel-js/labkit/config';\nimport { useEffect } from 'react';\nimport type { FrameSetup } from '../frame/FrameController';\nimport type { IndexEntry } from '../story/types';\nimport { TrialTransport } from '../timeline/TransportBar';\nimport { crumbTitle } from './Crumbs';\nimport { type GlobalDeclarations, PLAYHEAD_KEY, withGlobals } from './globals';\nimport { IndexTrial } from './IndexTrial';\nimport type { Loaded } from '../story/indexBundle';\nimport { CaptureInputs } from './loupe/CaptureInputs';\nimport { StoryTrial } from './StoryTrial';\n\nexport type { Loaded };\n\nexport interface DocumentInstrumentOptions {\n entry: IndexEntry;\n loaded: Loaded;\n setup: FrameSetup;\n globals?: GlobalDeclarations;\n}\n\n/** `schema` with a hidden leaf for the paused playhead, which labkit then persists and snapshots with the trial. */\nfunction withPlayhead(schema: ConfigSchema<unknown>): ConfigSchema<unknown> {\n return f.schema({ ...schema.nodes, [PLAYHEAD_KEY]: f.custom<number | null>('forge-playhead', null).hidden() }) as ConfigSchema<unknown>;\n}\n\n/** A loaded story, or index page, as a lab instrument rendering in the workshop document. */\nexport function documentInstrument(options: DocumentInstrumentOptions): Instrument<unknown, unknown> {\n const { entry, loaded, setup, globals = {} } = options;\n const schema = loaded.kind === 'story' ? loaded.story.config : (f.schema({}) as ConfigSchema<unknown>);\n const timed = loaded.kind === 'story' && loaded.story.timeline !== null;\n const config = withGlobals(timed ? withPlayhead(schema) : schema, globals);\n const initialState = loaded.kind === 'story' ? loaded.story.initialState : null;\n return {\n name: entry.id,\n ...crumbTitle(entry),\n config,\n defaultConfig: () => config.defaults(),\n initialState: (c) => initialState?.(c) ?? null,\n render: (ctx) => (\n <>\n {loaded.kind === 'story' ? (\n <StoryTrial key={loaded.story.id} story={loaded.story} setup={setup} ctx={ctx} />\n ) : (\n <IndexTrial bundle={loaded.bundle} setup={setup} config={ctx.config} />\n )}\n <CaptureInputs\n entry={entry}\n layout={loaded.kind === 'story' ? loaded.story.layout : 'fullscreen'}\n config={ctx.config}\n state={ctx.state}\n />\n </>\n ),\n ...(loaded.kind === 'story' && loaded.story.viewport\n ? { stage: { size: { width: loaded.story.viewport.width, height: loaded.story.viewport.height } } }\n : {}),\n ...(timed\n ? { chrome: [{ id: 'fg-transport', region: 'status', render: (c) => <TrialTransport trialId={c.trialId} /> }] }\n : {}),\n };\n}\n\nexport interface PendingInstrumentOptions {\n entry: IndexEntry;\n globals?: GlobalDeclarations;\n /** Asked for the entry's module the first time a trial renders it. */\n load: (entry: IndexEntry) => void;\n /** Why the module could not load, when it could not. */\n fault?: Error;\n /** Bumped by a reload, so a face already mounted asks again. */\n generation?: number;\n}\n\n/** Why a trial has no story to show, drawn over its whole stage. */\nfunction Fault({ phase, message }: { phase: string; message: string }) {\n return (\n <div className=\"fg-fault\" role=\"alert\">\n <span className=\"fg-fault__phase\">{phase}</span>\n <p className=\"fg-fault__message\">{message}</p>\n </div>\n );\n}\n\n/** The instrument's face while its module loads, and the fault when the load fails. */\nfunction StoryLoad({ entry, load, fault }: PendingInstrumentOptions) {\n useEffect(() => {\n if (!fault) load(entry);\n }, [entry, load, fault]);\n return (\n <div className=\"fg-story fg-story--loading\" data-fg-layout=\"fullscreen\">\n {fault ? <Fault phase=\"import\" message={fault.message} /> : null}\n </div>\n );\n}\n\n/** An entry's instrument before its module has loaded: an empty schema, and a render that asks for the load. */\nexport function pendingInstrument(options: PendingInstrumentOptions): Instrument<unknown, unknown> {\n const { entry, globals = {} } = options;\n const config = withGlobals(f.schema({}) as ConfigSchema<unknown>, globals);\n return {\n name: entry.id,\n ...crumbTitle(entry),\n config,\n defaultConfig: () => config.defaults(),\n initialState: () => null,\n render: () => <StoryLoad key={options.generation ?? 0} {...options} />,\n };\n}\n\n/** The instrument a trial runs when the URL names `id` and no story has it, so the stage says so. */\nexport function missingInstrument(id: string, globals: GlobalDeclarations = {}): Instrument<unknown, unknown> {\n const config = withGlobals(f.schema({}) as ConfigSchema<unknown>, globals);\n return {\n name: id,\n title: `No story ${id}`,\n config,\n defaultConfig: () => config.defaults(),\n initialState: () => null,\n render: () => (\n <div className=\"fg-story fg-story--loading\" data-fg-layout=\"fullscreen\">\n <Fault phase=\"route\" message={`No story ${id}`} />\n </div>\n ),\n };\n}\n","import { tokenCategory, type TokenCategory, type TokenEntry } from '@weasel-js/ui/components/TokenPanel';\nimport { type RefObject, useEffect, useLayoutEffect, useRef, useState } from 'react';\n\nconst listeners = new Set<(name: string) => void>();\n/**\n * The token asked for until a panel has marked it, or has looked and lists it nowhere. The panel can mount only\n * after the reveal that turned it on, and the lab can mount it more than once on the way, so a reveal is spent by\n * the mark, not by being heard.\n */\nlet pending: string | null = null;\n\n/** Asks the CSS vars panel to open at the custom property `name`. */\nexport function revealVar(name: string): void {\n pending = name;\n for (const fn of [...listeners]) fn(name);\n}\n\n/** Calls `fn` with each token asked for, and at once with one asked for that no panel has marked yet. */\nexport function subscribeReveal(fn: (name: string) => void): () => void {\n listeners.add(fn);\n if (pending !== null) fn(pending);\n return () => {\n listeners.delete(fn);\n };\n}\n\nexport type RevealTab = 'theme' | 'story';\n\n/** How the panel brings a token into its list: the tab that lists it, and the section it is filed under. */\nexport type ShowToken = (name: string, tab: RevealTab, category: TokenCategory) => void;\n\nconst MARK = 'data-revealed';\n\n/**\n * Answers reveals for a CSS vars panel: brings the token into view through `show`, then marks its row — or its\n * swatch or slider thumb, which carry its name the same way — in `list` and scrolls to it. A token neither tab\n * lists is dropped once the story's frame has reported its variables, and shown when they arrive if it is among them.\n */\nexport function useRevealToken(\n list: RefObject<HTMLElement | null>,\n tokens: Readonly<Record<RevealTab, readonly TokenEntry[]>>,\n show: ShowToken,\n storyReported: boolean,\n): void {\n // The token to mark, until it is marked; a render is asked for, and the mark lands once its row is drawn.\n const asked = useRef<string | null>(null);\n const [, rerender] = useState(0);\n useEffect(\n () =>\n subscribeReveal((name) => {\n const tab = (['theme', 'story'] as const).find((t) => tokens[t].some((token) => token.name === name));\n const token = tab && tokens[tab].find((t) => t.name === name);\n if (!tab || !token) {\n if (storyReported && pending === name) pending = null;\n return;\n }\n show(name, tab, tokenCategory(token));\n asked.current = name;\n rerender((n) => n + 1);\n }),\n [tokens, show, storyReported],\n );\n useLayoutEffect(() => {\n const root = list.current;\n const revealed = asked.current;\n if (!root || revealed === null) return;\n const target = root.querySelector(`[aria-label=\"${revealed.replace(/[\"\\\\]/g, '\\\\$&')}\"]`);\n for (const el of Array.from(root.querySelectorAll(`[${MARK}]`))) if (el !== target) el.removeAttribute(MARK);\n if (!target) return;\n target.setAttribute(MARK, '');\n target.scrollIntoView?.({ block: 'nearest' });\n if (pending === revealed) pending = null;\n asked.current = null;\n });\n}\n","import type { IconRef } from '@weasel-js/icons';\nimport { Icon } from '@weasel-js/ui/components/Icon';\nimport { ToggleBar, type ToggleBarItem } from '@weasel-js/ui/components/ToggleBar';\nimport { TOKEN_CATEGORIES, type TokenCategory } from '@weasel-js/ui/components/TokenPanel';\nimport { useEffect, useRef, useState } from 'react';\nimport { icon } from '../../icons.gen';\n\nconst ICONS: Record<TokenCategory, IconRef> = {\n color: /* @icon */ 'ui:drop',\n type: /* @icon */ 'ui:type',\n size: /* @icon */ 'core:measure',\n motion: /* @icon */ 'ui:curveEaseInOut',\n depth: /* @icon */ 'ui:layers',\n other: /* @icon */ 'ui:more',\n};\n\nconst PANEL = '.fg-css-vars';\nconst HOST = '.lk-sidebar-section, .lk-panel-tile';\nconst MANUAL = ['wheel', 'touchmove', 'keydown'] as const;\n\nconst LIST = '.fg-css-vars__list';\n\n/** The top of the list's own scroller, which is the line a section counts as reached at. */\nfunction readLine(panel: Element): number {\n return (panel.querySelector(LIST) ?? panel).getBoundingClientRect().top;\n}\n\nfunction sectionsOf(panel: Element): HTMLElement[] {\n return [...panel.querySelectorAll<HTMLElement>('[data-token-category]')];\n}\n\n/** The CSS Vars panel's sections as a row of icons: picks one to scroll to it, and lights the one at the top. */\nexport function SectionJump() {\n const ref = useRef<HTMLDivElement>(null);\n const [present, setPresent] = useState<readonly TokenCategory[]>([]);\n const [current, setCurrent] = useState<TokenCategory | null>(null);\n // A picked section stays lit until the reader scrolls by hand: near the end of the list it cannot reach the top.\n const held = useRef(false);\n\n useEffect(() => {\n // The section holding this bar holds the panel too, docked or torn out, and outlives a remount of the panel.\n const root = ref.current?.closest(HOST) ?? document.body;\n const read = () => {\n const panel = root.querySelector(PANEL);\n const sections = panel ? sectionsOf(panel) : [];\n setPresent(sections.map((s) => s.dataset.tokenCategory as TokenCategory));\n if (!panel || held.current) return;\n const line = readLine(panel) + 1;\n let top = sections[0]?.dataset.tokenCategory as TokenCategory | undefined;\n for (const s of sections) if (s.getBoundingClientRect().top <= line) top = s.dataset.tokenCategory as TokenCategory;\n setCurrent(top ?? null);\n };\n const release = () => {\n held.current = false;\n };\n read();\n const observer = new MutationObserver(read);\n observer.observe(root, { childList: true, subtree: true });\n // Capturing, so a scroll anywhere above the panel reaches it whichever box ends up scrolling.\n document.addEventListener('scroll', read, { capture: true, passive: true });\n for (const type of MANUAL) document.addEventListener(type, release, { capture: true, passive: true });\n return () => {\n observer.disconnect();\n document.removeEventListener('scroll', read, { capture: true });\n for (const type of MANUAL) document.removeEventListener(type, release, { capture: true });\n };\n }, []);\n\n const items: ToggleBarItem<TokenCategory>[] = TOKEN_CATEGORIES.map(({ id, title }) => ({\n value: id,\n label: <Icon name={ICONS[id]} size={14} />,\n ariaLabel: title,\n tooltip: title,\n disabled: !present.includes(id),\n }));\n\n const jump = (next: TokenCategory | null) => {\n const panel = ref.current?.closest(HOST)?.querySelector(PANEL);\n const target = next && panel?.querySelector(`[data-token-category=\"${next}\"]`);\n const scroller = panel?.querySelector(LIST);\n if (!panel || !target || !scroller) return;\n held.current = true;\n setCurrent(next);\n scroller.scrollTop += target.getBoundingClientRect().top - readLine(panel);\n };\n\n return (\n <div ref={ref} className=\"fg-css-vars__jump\">\n <ToggleBar ariaLabel=\"Jump to section\" variant=\"flat\" size=\"sm\" items={items} value={current} onChange={jump} />\n </div>\n );\n}\n","import type { TokenScaleRule } from '@weasel-js/labkit';\nimport { isByAxis, type AxisDefs, type Selection, type ThemeDefinition } from '@weasel-js/theme';\nimport type { Globals } from '../../protocol/messages';\n\n/** A scale as the panel left it: what a save writes into the definition. */\nexport interface ScaleEdit {\n readonly base: number;\n readonly rule: TokenScaleRule;\n}\n\nexport type ScaleEditResult =\n | { readonly ok: true; readonly definition: ThemeDefinition }\n | { readonly ok: false; readonly message: string };\n\nexport type Holder = Record<string | number, unknown>;\n\nexport interface Slot {\n readonly holder: Holder;\n readonly key: string | number;\n /** Where the slot is, for a message: `scales.font-size.base`, `seeds.ui-base.compact`. */\n readonly where: string;\n}\n\nconst SEED_REF = /^\\{seeds\\.([^}]+)\\}$/;\nconst RULE_KEYS = { factors: 'factors', ratio: 'ratio', step: 'step' } as const;\n\n/**\n * The axis values a trial renders under, from the workshop's globals: a global named for an axis picks its value; an\n * axis no global names renders at its default. A global holding something the axis does not offer (`mode: 'auto'`)\n * leaves that axis out, because which value it resolved to is not known here.\n */\nexport function selectionFor(axes: AxisDefs, globals: Globals): Selection {\n const out: Record<string, string> = {};\n for (const [axis, def] of Object.entries(axes)) {\n const value = globals[axis];\n if (value === undefined) out[axis] = def.default;\n else if (typeof value === 'string' && value in def.values) out[axis] = value;\n }\n return out;\n}\n\nexport class EditError extends Error {}\n\n/** `holder[key]` followed through its per-axis branches to the one `selection` reads. */\nexport function branchOf(holder: Holder, key: string | number, where: string, selection: Selection): Slot {\n let slot: Slot = { holder, key, where };\n for (let value = holder[key]; isByAxis(value); value = slot.holder[slot.key]) {\n const axis = value.by;\n const picked = selection[axis];\n if (picked === undefined || picked === 'by' || !(picked in value)) {\n throw new EditError(`${slot.where} differs by ${axis}, and which ${axis} this trial shows is not known`);\n }\n slot = { holder: value as unknown as Holder, key: picked, where: `${slot.where}.${picked}` };\n }\n return slot;\n}\n\n/** Follows a param through its per-axis branches and `{seeds.name}` references to the number that defines it. */\nfunction slotOf(root: ThemeDefinition, holder: Holder, key: string | number, where: string, selection: Selection, depth = 0): Slot {\n if (depth > 16) throw new EditError(`${where} references itself`);\n const slot = branchOf(holder, key, where, selection);\n const { holder: h, key: k, where: w } = slot;\n const value = h[k];\n if (typeof value === 'number') return slot;\n if (typeof value === 'string') {\n const ref = SEED_REF.exec(value);\n if (!ref) throw new EditError(`${w} is \"${value}\", which is not a number or a seed`);\n const name = ref[1]!;\n const seeds = root.seeds as Holder | undefined;\n if (!seeds || !(name in seeds)) throw new EditError(`${w} names the seed \"${name}\", which this theme inherits rather than defines`);\n return slotOf(root, seeds, name, `seeds.${name}`, selection, depth + 1);\n }\n throw new EditError(`${w} is not a number`);\n}\n\n/** The factor list the selection reads, through any per-axis branches. */\nfunction factorsOf(holder: Holder, where: string, selection: Selection): { list: Holder; where: string } {\n const slot = branchOf(holder, 'factors', `${where}.factors`, selection);\n const value = slot.holder[slot.key];\n if (!Array.isArray(value)) throw new EditError(`${slot.where} is not a list`);\n return { list: value as unknown as Holder, where: slot.where };\n}\n\nconst kindOf = (scale: Holder): TokenScaleRule['kind'] | null =>\n scale.factors !== undefined ? 'factors' : scale.ratio !== undefined ? 'ratio' : scale.step !== undefined ? 'step' : null;\n\nconst plainLiteral = (value: unknown): boolean =>\n typeof value === 'number' || (Array.isArray(value) && value.every((v) => typeof v === 'number'));\n\n/** Swaps `scale`'s rule key for another in place, in the same position, since record order is emission order. */\nfunction swapRule(scale: Holder, from: string | null, to: string, value: unknown): void {\n const entries = Object.entries(scale);\n for (const [k] of entries) delete scale[k];\n for (const [k, v] of entries) scale[k === from ? to : k] = k === from ? value : v;\n if (from === null) scale[to] = value;\n}\n\n/**\n * `definition` with each edited scale written back. A number the scale reads through a reference or a per-axis branch\n * is written where it lives — `{seeds.ui-base}` changes the seed, and only the branch for `selection` — so every other\n * axis value keeps its own. Changing a scale's rule kind replaces the rule, which is refused when the old one was\n * anything but a plain literal, since that would flatten it.\n */\nexport function applyScaleEdits(\n definition: ThemeDefinition,\n edits: Readonly<Record<string, ScaleEdit>>,\n selection: Selection,\n): ScaleEditResult {\n const root = structuredClone(definition) as ThemeDefinition & { scales?: Record<string, Holder> };\n const writes = new Map<Holder, Map<string | number, number>>();\n const write = (slot: Slot, value: number) => {\n let byKey = writes.get(slot.holder);\n if (!byKey) writes.set(slot.holder, (byKey = new Map()));\n const pending = byKey.get(slot.key);\n if (pending !== undefined && pending !== value) throw new EditError(`${slot.where} would need to be both ${pending} and ${value}`);\n byKey.set(slot.key, value);\n };\n\n try {\n for (const [name, edit] of Object.entries(edits)) {\n const scales = root.scales;\n const scale = scales?.[name];\n if (!scales || !scale) throw new EditError(`the theme defines no scale \"${name}\"`);\n const where = `scales.${name}`;\n write(slotOf(root, scale, 'base', `${where}.base`, selection), edit.base);\n\n const { rule } = edit;\n const had = kindOf(scale);\n if (had !== rule.kind) {\n const from = had ? RULE_KEYS[had] : null;\n if (from && !plainLiteral(scale[from])) {\n throw new EditError(`${where} would lose its ${from} to become a ${rule.kind} scale, and its ${from} is not a plain number`);\n }\n const value = rule.kind === 'factors' ? [...rule.factors] : rule.kind === 'ratio' ? rule.ratio : rule.step;\n swapRule(scale, from, RULE_KEYS[rule.kind], value);\n continue;\n }\n if (rule.kind === 'factors') {\n const { list, where: at } = factorsOf(scale, where, selection);\n if ((list as unknown as unknown[]).length !== rule.factors.length) {\n throw new EditError(`${at} has ${(list as unknown as unknown[]).length} factors, and the edit ${rule.factors.length}`);\n }\n rule.factors.forEach((factor, i) => write(slotOf(root, list, i, `${at}.${i}`, selection), factor));\n } else {\n const key = RULE_KEYS[rule.kind];\n write(slotOf(root, scale, key, `${where}.${key}`, selection), rule.kind === 'ratio' ? rule.ratio : rule.step);\n }\n }\n } catch (e) {\n if (e instanceof EditError) return { ok: false, message: `Cannot save: ${e.message}.` };\n throw e;\n }\n\n for (const [holder, byKey] of writes) for (const [key, value] of byKey) holder[key] = value;\n return { ok: true, definition: root };\n}\n","import { isPlainObject } from '@weasel-js/core';\nimport type { Selection, ThemeDefinition } from '@weasel-js/theme';\nimport { branchOf, EditError, type Holder, type ScaleEditResult, type Slot } from './saveScales';\n\nconst REFERENCE = /\\{[^}]+\\}/;\n/** The layers a token's value can be written out in, in the order the definition resolves a name. */\nconst LAYERS = ['pins', 'semantics', 'components'] as const;\n\n/** A written-out value, or what makes `entry` something the theme works out instead. */\nfunction derivation(entry: unknown): string | null {\n const value = isPlainObject(entry) ? entry.value : entry;\n if (isPlainObject(entry) && value === undefined) return 'follows a rule';\n if (isPlainObject(entry) && entry.alpha !== undefined) return 'is drawn at an alpha';\n if (typeof value === 'string' && REFERENCE.test(value)) return `follows ${REFERENCE.exec(value)?.[0]}`;\n return typeof value === 'string' || typeof value === 'number' ? null : 'is a list';\n}\n\n/** The place `definition` writes `token`'s value out for `selection`. Throws when it has none. */\nfunction literalSlot(definition: ThemeDefinition, token: string, selection: Selection): Slot {\n for (const layer of LAYERS) {\n const entries = definition[layer] as Holder | undefined;\n if (!entries || !(token in entries)) continue;\n const slot = branchOf(entries, token, `${layer}.${token}`, selection);\n const why = derivation(slot.holder[slot.key]);\n if (why) throw new EditError(`${slot.where} ${why}, and only a value written out in the theme can be saved`);\n return slot;\n }\n for (const layer of ['ramps', 'scales'] as const) {\n const from = Object.keys(definition[layer] ?? {}).find((name) => token.startsWith(`${name}-`));\n if (from) throw new EditError(`${token} is a step ${layer}.${from} generates, and the theme pins no value over it`);\n }\n throw new EditError(`the theme defines no token \"${token}\"`);\n}\n\n/** Whether a save has a place for `token`: the definition writes its value out for `selection`. */\nexport function writtenOut(definition: ThemeDefinition, token: string, selection: Selection): boolean {\n try {\n literalSlot(definition, token, selection);\n return true;\n } catch (e) {\n if (e instanceof EditError) return false;\n throw e;\n }\n}\n\n/**\n * `definition` with each edited token's value written where the definition holds it: a pin, a component or a literal\n * semantic, and only the branch for `selection`. `edits` is keyed by token name, without the `--wzl-` prefix. A token\n * whose value the theme derives is refused, since writing a value over it would drop the derivation.\n */\nexport function applyTokenEdits(\n definition: ThemeDefinition,\n edits: Readonly<Record<string, string>>,\n selection: Selection,\n): ScaleEditResult {\n const root = structuredClone(definition);\n try {\n for (const [token, value] of Object.entries(edits)) {\n const { holder, key } = literalSlot(root, token, selection);\n const entry = holder[key];\n holder[key] = isPlainObject(entry) ? { ...entry, value } : value;\n }\n } catch (e) {\n if (e instanceof EditError) return { ok: false, message: `Cannot save: ${e.message}.` };\n throw e;\n }\n return { ok: true, definition: root };\n}\n","import { type AxisDefs, isColorModePreference, type Selection } from '@weasel-js/theme';\nimport { useResolvedColorMode } from '@weasel-js/theme/react';\nimport { useMemo } from 'react';\nimport type { Globals } from '../../protocol/messages';\nimport { selectionFor } from './saveScales';\n\n/**\n * The axis values a trial renders under. A mode global naming a preference rather than one of the axis's values,\n * as `auto` does, follows the OS scheme, which is what the story's root is given.\n */\nexport function useTrialSelection(axes: AxisDefs, globals: Globals): Selection {\n const { mode } = globals;\n const osMode = useResolvedColorMode(isColorModePreference(mode) ? mode : 'auto');\n return useMemo(() => {\n const selection = selectionFor(axes, globals);\n return axes.mode && osMode in axes.mode.values ? { mode: osMode, ...selection } : selection;\n }, [axes, globals, osMode]);\n}\n","import { type AxisDefs, THEME_SOURCES } from '@weasel-js/theme';\nimport { httpThemeApi, type ThemeApi } from '@weasel-js/theme/engine';\nimport { useMemo, useState } from 'react';\nimport type { Globals } from '../../protocol/messages';\nimport type { CssOverrides } from './overrides';\nimport { applyScaleEdits, type ScaleEdit } from './saveScales';\nimport { applyTokenEdits, writtenOut } from './saveTokens';\nimport { useTrialSelection } from './useTrialSelection';\nimport type { VarsHistory } from './varsHistory';\n\nexport const THEME_NAME = 'weasel';\nexport const TOKEN_PREFIX = '--wzl-';\nconst NO_AXES: AxisDefs = {};\n\ntype Notice = { readonly trialId: string | null; readonly outcome: 'saved' | 'error'; readonly text: string };\n\n/** A scale whose steps all hold what its edit generated. */\nexport interface UnsavedScale {\n /** The scale's name in the definition. */\n readonly name: string;\n /** The panel's group for it, which its edit is kept under. */\n readonly group: string;\n readonly tokens: readonly string[];\n readonly edit: ScaleEdit;\n}\n\nexport interface ThemeSaveOptions {\n readonly trialId: string | null;\n /** The globals the trial renders under, which pick the axis values a save writes into. */\n readonly globals: Globals;\n /** Where a save goes. Defaults to the dev server's theme store. */\n readonly themeApi: ThemeApi | undefined;\n readonly scales: readonly UnsavedScale[];\n readonly overrides: CssOverrides;\n readonly history: VarsHistory;\n}\n\nexport interface ThemeSave {\n /** Whether any edit has a place in the definition to be saved to. */\n readonly pending: boolean;\n readonly saving: boolean;\n readonly notice: Omit<Notice, 'trialId'> | null;\n save(): Promise<void>;\n}\n\n/**\n * Saves a trial's edits into the theme's definition file: each clean scale edit, and each token edited by hand whose\n * value the definition writes out. Every other override stays the trial's own.\n */\nexport function useThemeSave({ trialId, globals, themeApi, scales, overrides, history }: ThemeSaveOptions): ThemeSave {\n const definition = THEME_SOURCES[THEME_NAME];\n const selection = useTrialSelection(definition?.axes ?? NO_AXES, globals);\n const tokens = useMemo(() => {\n if (!definition) return {};\n const generated = new Set(scales.flatMap((scale) => scale.tokens));\n return Object.fromEntries(\n Object.entries(overrides).flatMap(([name, value]) => {\n if (!name.startsWith(TOKEN_PREFIX) || generated.has(name)) return [];\n const token = name.slice(TOKEN_PREFIX.length);\n return writtenOut(definition, token, selection) ? [[token, value]] : [];\n }),\n );\n }, [definition, selection, scales, overrides]);\n\n const [saving, setSaving] = useState(false);\n const [held, setHeld] = useState<Notice | null>(null);\n const setNotice = (next: Omit<Notice, 'trialId'> | null) => setHeld(next && { ...next, trialId });\n\n const save = async () => {\n setSaving(true);\n setNotice(null);\n try {\n const api = themeApi ?? httpThemeApi();\n const stored = await api.get(THEME_NAME);\n const file = `themes/${THEME_NAME}.json`;\n if (JSON.stringify(stored.definition) !== JSON.stringify(THEME_SOURCES[THEME_NAME])) {\n setNotice({ outcome: 'error', text: `${file} has changed since this page loaded. Reload to edit against it.` });\n return;\n }\n const scaled = applyScaleEdits(stored.definition, Object.fromEntries(scales.map((s) => [s.name, s.edit])), selection);\n const next = scaled.ok ? applyTokenEdits(scaled.definition, tokens, selection) : scaled;\n if (!next.ok) {\n setNotice({ outcome: 'error', text: next.message });\n return;\n }\n const result = await api.put(THEME_NAME, next.definition, stored.hash);\n if (result.status === 'conflict') {\n setNotice({ outcome: 'error', text: `${file} changed on disk while saving. Nothing was written; reload to edit against it.` });\n return;\n }\n if (result.status === 'invalid') {\n setNotice({ outcome: 'error', text: result.message });\n return;\n }\n // What was saved is the theme's own now, so nothing from before the save has a value to go back to.\n const saved = new Set([\n ...scales.flatMap((scale) => scale.tokens),\n ...Object.keys(tokens).map((token) => `${TOKEN_PREFIX}${token}`),\n ]);\n const groups = new Set(scales.map((scale) => scale.group));\n const now = history.current();\n history.reset({\n overrides: Object.fromEntries(Object.entries(now.overrides).filter(([name]) => !saved.has(name))),\n scales: Object.fromEntries(Object.entries(now.scales).filter(([group]) => !groups.has(group))),\n });\n setNotice(\n result.regenerated || result.problems.length === 0\n ? { outcome: 'saved', text: `Saved to ${file}.` }\n : { outcome: 'error', text: `Saved to ${file}, but the tokens were not regenerated: ${result.problems.join('; ')}` },\n );\n } catch (e) {\n setNotice({ outcome: 'error', text: `Saving needs forge's dev server, which did not answer: ${(e as Error).message}` });\n } finally {\n setSaving(false);\n }\n };\n\n return {\n pending: scales.length > 0 || Object.keys(tokens).length > 0,\n saving,\n notice: held?.trialId === trialId ? held : null,\n save,\n };\n}\n","import { inferTokenType, type TokenEntry, usePersistedState } from '@weasel-js/labkit';\nimport { TOKEN_MANIFEST } from '@weasel-js/theme';\nimport { useMemo } from 'react';\nimport type { CssVarReport } from '../../protocol/messages';\n\nconst MANIFEST = new Map(TOKEN_MANIFEST.map((token) => [token.name, token]));\n\n/** A reported var's group: its name without the leading dashes or its last segment, which names the step. */\nfunction groupOf(name: string): string {\n const segments = name.replace(/^--/, '').split('-');\n return segments.length > 1 ? segments.slice(0, -1).join('-') : name.replace(/^--/, '');\n}\n\nexport interface StoryTokens {\n readonly tokens: TokenEntry[];\n readonly showUnused: boolean;\n readonly setShowUnused: (show: boolean) => void;\n /** What the panel says when it lists none of them. */\n readonly emptyText: string;\n}\n\n/** The vars a trial's frame reports, the ones its story doesn't use left out until asked for. */\nexport function useStoryTokens(vars: readonly CssVarReport[]): StoryTokens {\n const [showUnused, setShowUnused] = usePersistedState('fg-css-vars-unused', false, { scope: 'lab' });\n const tokens = useMemo<TokenEntry[]>(\n () =>\n vars.flatMap(({ name, value, used }) => {\n if (!used && !showUnused) return [];\n const known = MANIFEST.get(name);\n return [{ name, type: known?.type ?? inferTokenType(value), group: known?.group ?? groupOf(name), value }];\n }),\n [vars, showUnused],\n );\n const emptyText = vars.length > 0 && !showUnused ? 'The story uses no variables.' : 'The story’s frame has reported no variables.';\n return { tokens, showUnused, setShowUnused, emptyText };\n}\n","import type { TokenEntry } from '@weasel-js/labkit';\nimport { resolveTheme, TOKEN_MANIFEST, themeAxes, weaselTheme } from '@weasel-js/theme';\nimport { useMemo } from 'react';\nimport type { CssVarReport, Globals } from '../../protocol/messages';\nimport { useTrialSelection } from './useTrialSelection';\n\nconst AXES = themeAxes(weaselTheme);\n\n/**\n * The theme's tokens as a trial shows them: each at the value its frame reports, or, for one the frame has not\n * reported, at what the theme gives it under the trial's globals.\n */\nexport function useThemeTokens(globals: Globals, vars: readonly CssVarReport[]): TokenEntry[] {\n const selection = useTrialSelection(AXES, globals);\n const themed = useMemo<Readonly<Record<string, string>>>(() => resolveTheme(weaselTheme, selection), [selection]);\n return useMemo(() => {\n const reported = new Map(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) ?? themed[token.name] ?? token.defaultValue,\n description: token.description,\n }));\n }, [vars, themed]);\n}\n","import { createHistory, type SerializedHistory, type SwapArgs, swapOp, useLatest } from '@weasel-js/core';\nimport { type TokenScale, usePersistedState, useTrialId } from '@weasel-js/labkit';\nimport { useEffect, useMemo, useRef, useSyncExternalStore } from 'react';\nimport type { CssOverrides } from './overrides';\n\n/** What an edit in the panel changes: the trial's overrides, and the scale each group's were generated from. */\nexport interface VarsState {\n readonly overrides: CssOverrides;\n readonly scales: Readonly<Record<string, TokenScale>>;\n}\n\nconst SWAP = 'fg.vars.swap';\n/** Edits this close together under one key undo as one, so typing a value is one step. */\nconst COALESCE_MS = 800;\n/** The history is kept with the trial, so it is held to a count. */\nconst LIMIT = 100;\n\nexport interface VarsHistory {\n /** The state as the last edit or step left it, ahead of the render that shows it. */\n current(): VarsState;\n /** Put `next` in force as one step back. Commits in one tick are one step, as are those sharing a `key` close together. */\n commit(next: VarsState, key: string): void;\n step(to: 'undo' | 'redo'): void;\n canUndo: boolean;\n canRedo: boolean;\n /** Put `next` in force and forget every step: nothing before it can be gone back to. */\n reset(next: VarsState): void;\n}\n\n/**\n * The undo history of the CSS variable edits of the trial this is rendered inside, kept with the trial so it\n * outlives a reload. `apply` puts a state in force, given the one it replaces.\n */\nexport function useVarsHistory(state: VarsState, apply: (from: VarsState, to: VarsState) => void): VarsHistory {\n const trialId = useTrialId();\n const [stored, setStored] = usePersistedState<SerializedHistory | null>('fg-css-vars-history', null, { scope: 'trial' });\n const rendered = useLatest(state);\n // What an edit left, until the render that shows it: a second edit in the same tick starts from here.\n const ahead = useRef<VarsState | null>(null);\n useEffect(() => {\n ahead.current = null;\n }, [state]);\n const current = () => ahead.current ?? rendered.current;\n const latestApply = useLatest(apply);\n const emit = (to: VarsState) => {\n const from = current();\n ahead.current = to;\n latestApply.current(from, to);\n };\n const swap = (before: VarsState, after: VarsState, coalesceKey?: string) =>\n swapOp({ name: SWAP, label: 'edit vars', before, after, emit, ...(coalesceKey !== undefined ? { coalesceKey } : {}) });\n\n const history = useMemo(() => {\n const opened = createHistory(null, {\n coalesceWindowMs: COALESCE_MS,\n historyLimit: LIMIT,\n rebuildOp: (name, args) => {\n const { before, after } = args as SwapArgs<VarsState>;\n return name === SWAP ? swap(before, after) : null;\n },\n });\n if (stored) opened.restore(stored);\n return opened;\n // eslint-disable-next-line react-hooks/exhaustive-deps -- a trial's history is opened once, from what was kept with it\n }, [trialId]);\n useSyncExternalStore(history.subscribe, history.getVersion);\n const keep = () => setStored(history.canUndo() || history.canRedo() ? history.serialize() : null);\n\n // The key of the tick's first commit, which the rest of the tick's commits take so they merge into it.\n const tick = useRef<string | null>(null);\n\n return {\n current,\n commit(next, key) {\n if (tick.current === null) {\n tick.current = key;\n queueMicrotask(() => {\n tick.current = null;\n });\n }\n history.applyOps([swap(current(), next, tick.current)], 'edit vars');\n keep();\n },\n step(to) {\n history[to]();\n keep();\n },\n canUndo: history.canUndo(),\n canRedo: history.canRedo(),\n reset(next) {\n emit(next);\n history.clear();\n setStored(null);\n },\n };\n}\n","import './cssVars.css';\nimport {\n Input,\n type LabContribution,\n ToggleBar,\n type ToggleBarItem,\n refitScale,\n type TokenCategory,\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, type ThemeApi } from '@weasel-js/theme/engine';\nimport { historyKey } from '@weasel-js/core';\nimport { Button } from '@weasel-js/ui/components/Button';\nimport { Checkbox } from '@weasel-js/ui/components/Checkbox';\nimport { Icon } from '@weasel-js/ui/components/Icon';\nimport { icon } from '../../icons.gen';\nimport { useCallback, useContext, useMemo, useRef, useState } from 'react';\nimport type { Globals } from '../../protocol/messages';\nimport { effectiveGlobals, GLOBALS_KEY } from '../globals';\nimport { StoryGlobalsContext } from '../StoryGlobalsContext';\nimport { useTrialFrame } from '../trialFrames';\nimport { useCssOverrides } from './overrides';\nimport { type ShowToken, useRevealToken } from './reveal';\nimport { SectionJump } from './SectionJump';\nimport { THEME_NAME, type ThemeSave, TOKEN_PREFIX, type UnsavedScale, useThemeSave } from './useThemeSave';\nimport { useStoryTokens } from './useStoryTokens';\nimport { useThemeTokens } from './useThemeTokens';\nimport { useVarsHistory, type VarsState } from './varsHistory';\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[THEME_NAME]?.scales ?? {}).flatMap(([name, def]) => {\n if (!Array.isArray(def.steps)) return [];\n const steps = def.steps as readonly string[];\n const tokens = steps.map((step) => `${TOKEN_PREFIX}${name}-${step}`);\n const group = MANIFEST.get(tokens[0] ?? '')?.group;\n if (!group) return [];\n const factors = Array.isArray(def.factors) && def.factors.every(literal) ? (def.factors as number[]) : null;\n const rule: ScaleSource['rule'] =\n def.factors !== undefined\n ? factors\n ? { kind: 'factors', factors }\n : 'factors'\n : def.ratio !== undefined\n ? literal(def.ratio)\n ? { kind: 'ratio', ratio: def.ratio }\n : 'ratio'\n : literal(def.step)\n ? { kind: 'step', step: def.step }\n : 'step';\n return [{ name, group, steps, tokens, rule }];\n});\n\n/** Each of a scale's tokens and the value `next` gives it. */\nfunction scaleValues(source: ScaleSource, next: TokenScale): [string, string][] {\n const { rule } = next;\n const values = generateScale(source.steps, {\n base: next.base,\n ...(rule.kind === 'factors' ? { factors: rule.factors } : rule.kind === 'ratio' ? { ratio: rule.ratio } : { step: rule.step }),\n });\n return source.steps.flatMap((step, i) => {\n const value = values[step];\n const name = source.tokens[i];\n return value !== undefined && name !== undefined ? [[name, value]] : [];\n });\n}\n\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/**\n * The edited scales a save writes. A scale is saved only while every one of its steps still holds what its edit\n * generated: a step edited by hand after the scale is an override the scale has no place for.\n */\nfunction unsavedScales(edited: Readonly<Record<string, TokenScale>>, overrides: Readonly<Record<string, string>>): UnsavedScale[] {\n return SCALE_SOURCES.flatMap((source): UnsavedScale[] => {\n const edit = edited[source.group];\n if (!edit || !source.tokens.some((name) => overrides[name] !== undefined)) return [];\n const { name, group, tokens } = source;\n const clean = scaleValues(source, edit).every(([token, value]) => overrides[token] === value);\n return clean ? [{ name, group, tokens, edit: { base: edit.base, rule: edit.rule } }] : [];\n });\n}\n\nexport interface CssVarsPanelProps {\n /** The globals the trial renders under, which pick the axis values a save writes into. */\n readonly globals?: Globals;\n /** Where a save goes. Defaults to the dev server's theme store. */\n readonly themeApi?: ThemeApi;\n}\n\nconst NO_GLOBALS: Globals = {};\n\n/**\n * Shows and overrides the CSS variables of the trial it is rendered inside: the theme's tokens, or what its frame\n * reports. A scale edit, and a token the theme writes out, can be saved into the theme's definition file.\n */\nexport function CssVarsPanel({ globals = NO_GLOBALS, themeApi }: CssVarsPanelProps = {}) {\n const trialId = useTrialId();\n const frame = useTrialFrame(trialId);\n const [overrides, setOverrides] = useCssOverrides();\n const [folds, setFolds] = usePersistedState<Partial<Record<TokenCategory, boolean>>>(\n 'fg-css-vars-folds',\n {},\n { scope: 'lab' },\n );\n const [edited, setEdited] = usePersistedState<Readonly<Record<string, TokenScale>>>('fg-css-vars-scales', {}, { scope: 'trial' });\n const [tab, setTab] = useState<Tab>('theme');\n const [filter, setFilter] = useState('');\n\n const themeTokens = useThemeTokens(globals, frame.vars);\n const story = useStoryTokens(frame.vars);\n const tokens = tab === 'theme' ? themeTokens : story.tokens;\n const listRef = useRef<HTMLDivElement>(null);\n const byTab = useMemo(() => ({ theme: themeTokens, story: story.tokens }), [themeTokens, story.tokens]);\n const show = useCallback<ShowToken>((name, at, category) => {\n setTab(at);\n setFilter((was) => (name.toLowerCase().includes(was.trim().toLowerCase()) ? was : ''));\n setFolds((prev) => (prev[category] ? { ...prev, [category]: false } : prev));\n }, [setFolds]);\n useRevealToken(listRef, byTab, show, frame.vars.length > 0);\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 state = useMemo<VarsState>(() => ({ overrides, scales: edited }), [overrides, edited]);\n const history = useVarsHistory(state, (from, to) => {\n setOverrides(to.overrides);\n setEdited(to.scales);\n for (const name of new Set([...Object.keys(from.overrides), ...Object.keys(to.overrides)])) {\n if (from.overrides[name] !== to.overrides[name]) send?.({ type: 'vars.set', name, value: to.overrides[name] ?? null });\n }\n });\n const write = (name: string, value: string | null) => {\n const now = history.current();\n const { [name]: _dropped, ...rest } = now.overrides;\n history.commit({ ...now, overrides: value === null ? rest : { ...rest, [name]: value } }, `token:${name}`);\n };\n const onScaleChange = (group: string, next: TokenScale) => {\n const source = SCALE_SOURCES.find((sc) => sc.group === group);\n if (!source) return;\n const now = history.current();\n history.commit(\n { overrides: { ...now.overrides, ...Object.fromEntries(scaleValues(source, next)) }, scales: { ...now.scales, [group]: next } },\n `scale:${group}`,\n );\n };\n\n const unsaved = useMemo(() => unsavedScales(edited, overrides), [edited, overrides]);\n const { pending, saving, notice, save } = useThemeSave({ trialId, globals, themeApi, scales: unsaved, overrides, history });\n const onCollapsedChange = useCallback(\n (category: TokenCategory, collapsed: boolean) => setFolds((prev) => ({ ...prev, [category]: collapsed })),\n [setFolds],\n );\n\n return (\n // Capture: React Aria's fields stop a keydown from bubbling past them.\n <div\n className=\"fg-css-vars\"\n onKeyDownCapture={(e) => {\n // The filter's text has its own undo.\n const to = (e.target as HTMLElement).closest('.fg-css-vars__filter') ? null : historyKey(e);\n if (!to) return;\n e.preventDefault();\n history.step(to);\n }}\n >\n <div className=\"fg-css-vars__controls\">\n <div className=\"fg-css-vars__bar\">\n <ToggleBar\n ariaLabel=\"Variables\"\n variant=\"flat\"\n size=\"sm\"\n items={TABS}\n value={tab}\n onChange={(next) => {\n if (next) setTab(next);\n }}\n />\n <Input\n className=\"fg-css-vars__filter\"\n aria-label=\"Filter\"\n placeholder=\"Filter\"\n value={filter}\n onChange={setFilter}\n leadingAdornment={<Icon name={/* @icon */ 'ui:search'} size={12} />}\n />\n <div className=\"fg-css-vars__steps\" role=\"group\" aria-label=\"History\">\n <Button iconOnly ariaLabel=\"Undo\" variant=\"ghost\" size=\"sm\" disabled={!history.canUndo} onClick={() => history.step('undo')}>\n <Icon name={/* @icon */ 'core:undo'} size={14} />\n </Button>\n <Button iconOnly ariaLabel=\"Redo\" variant=\"ghost\" size=\"sm\" disabled={!history.canRedo} onClick={() => history.step('redo')}>\n <Icon name={/* @icon */ 'core:redo'} size={14} />\n </Button>\n </div>\n </div>\n {tab === 'story' ? (\n <Checkbox className=\"fg-css-vars__unused\" isSelected={story.showUnused} onChange={story.setShowUnused}>\n Show variables the story doesn’t use\n </Checkbox>\n ) : null}\n {tab === 'theme' ? <SaveRow pending={pending} saving={saving} notice={notice} onSave={() => void save()} /> : null}\n </div>\n {shown.length === 0 ? (\n <p className=\"fg-css-vars__empty\">\n {tokens.length > 0 ? 'No variables match.' : tab === 'story' ? story.emptyText : 'The story’s frame has reported no variables.'}\n </p>\n ) : (\n <div ref={listRef} className=\"fg-css-vars__list\">\n <TokenPanel\n tokens={shown}\n namePrefix={TOKEN_PREFIX}\n onChange={write}\n scales={scales}\n onScaleChange={onScaleChange}\n collapsed={folds}\n onCollapsedChange={onCollapsedChange}\n />\n </div>\n )}\n </div>\n );\n}\n\ninterface SaveRowProps extends Pick<ThemeSave, 'pending' | 'saving' | 'notice'> {\n readonly onSave: () => void;\n}\n\n/** The Save to theme button while there is something to save, and what the last save said. */\nfunction SaveRow({ pending, saving, notice, onSave }: SaveRowProps) {\n if (!pending && !notice) return null;\n return (\n <div className=\"fg-css-vars__save\">\n {pending ? (\n <Button stance=\"confirm\" size=\"sm\" loading={saving} disabled={saving} onClick={onSave}>\n Save to theme\n </Button>\n ) : null}\n {notice ? (\n <p className={`fg-css-vars__notice fg-css-vars__notice--${notice.outcome}`} role={notice.outcome === 'error' ? 'alert' : 'status'}>\n {notice.text}\n </p>\n ) : null}\n </div>\n );\n}\n\n/** The panel for the lab's focused trial, rendered as though inside that trial. */\nfunction FocusedCssVars() {\n const { focusedTrialId, trials, instruments } = useLabContext();\n const labGlobals = useContext(StoryGlobalsContext);\n const record = trials.find((trial) => trial.id === focusedTrialId);\n if (!record) return null;\n const pins = (record.config as Record<string, unknown> | null | undefined)?.[GLOBALS_KEY];\n const instrument = instruments.find((i) => i.name === record.instrumentName);\n return (\n <section className=\"fg-css-vars-focus\" aria-label=\"CSS Vars\">\n <p className=\"fg-css-vars__trial\">{record.title ?? instrument?.title ?? record.instrumentName}</p>\n <TrialIdContext.Provider value={record.id}>\n <CssVarsPanel globals={effectiveGlobals(labGlobals, pins)} />\n </TrialIdContext.Provider>\n </section>\n );\n}\n\nexport const CSS_VARS_SECTION: LabContribution = {\n id: 'fg-css-vars',\n region: 'aside',\n item: { title: 'CSS Vars', actions: <SectionJump />, fill: true, body: <FocusedCssVars /> },\n};\n","import { type LabContribution, usePersistedState } from '@weasel-js/labkit';\nimport { useEffect, useMemo } from 'react';\nimport { icon } from '../../icons.gen';\nimport { CSS_VARS_SECTION } from './CssVarsPanel';\nimport { subscribeReveal } from './reveal';\n\nconst RECORD = 'fg-css-vars-shown';\n\n/** The header's CSS Vars toggle, then the panel itself while the toggle is on. */\nexport function cssVarsChrome(shown: boolean, toggle: () => void): readonly LabContribution[] {\n return [\n {\n id: 'fg-css-vars-toggle',\n region: 'header',\n group: 'story',\n item: { icon: /* @icon */ 'ui:typeBraces', label: 'CSS Vars panel', pressed: shown, onActivate: toggle },\n },\n ...(shown ? [CSS_VARS_SECTION] : []),\n ];\n}\n\n/**\n * Reports `cssVarsChrome` to `onChrome` as the lab's persisted choice changes; off until the toggle is first\n * pressed, or until a token is revealed. Renders nothing; mount it inside the lab, since the choice lives there.\n */\nexport function CssVarsChrome({ onChrome }: { onChrome: (chrome: readonly LabContribution[]) => void }) {\n const [shown, setShown] = usePersistedState<boolean>(RECORD, false, { scope: 'lab' });\n const chrome = useMemo(() => cssVarsChrome(shown, () => setShown((was) => !was)), [shown, setShown]);\n useEffect(() => onChrome(chrome), [chrome, onChrome]);\n useEffect(() => subscribeReveal(() => setShown(true)), [setShown]);\n return null;\n}\n","import {\n type Action,\n type ActionsRegistry,\n actionBindings,\n type GestureSpec,\n keymapLeaderId,\n type KeymapDef,\n keymapShortcuts,\n keySpecShortcut,\n} from '@weasel-js/core';\nimport type { useLabEntries } from '@weasel-js/labkit';\nimport { formatShortcut } from '@weasel-js/ui/components/ToolPalette';\n\n/** What a binding's chip says: the keys for a keystroke, a word for any other gesture. */\nexport function describeBinding(spec: GestureSpec): string {\n const chip = keySpecShortcut(spec);\n if (chip) return spec.kind === 'key-held' ? `Hold ${formatShortcut(chip)}` : (formatShortcut(chip) ?? '');\n switch (spec.kind) {\n case 'wheel': return 'Wheel';\n case 'hover': return 'Hover';\n case 'drag': return 'Drag';\n case 'click': return 'Click';\n default: return spec.kind[0]!.toUpperCase() + spec.kind.slice(1);\n }\n}\n\n/** One registered action and every way to trigger it: `keys` are keystroke chips, `others` the rest. */\nexport interface KeyRow {\n id: string;\n label: string;\n group: string;\n keys: readonly string[];\n others: readonly string[];\n}\n\n/** The keymaps among the lab's installed entries, each with the leader that opens it. */\nexport function keymapDefs(entries: ReturnType<typeof useLabEntries>): KeymapDef[] {\n const defs: KeymapDef[] = [];\n for (const entry of entries.values()) {\n if (!entry.eligibility.keymap) continue;\n const open = entries.get(`${entry.id}.leader`)?.actions?.find((a) => a.id === keymapLeaderId(entry.id));\n const leader = open ? actionBindings(open).map((b) => b.spec) : [];\n if (leader.length === 0) continue;\n defs.push({ id: entry.id, label: entry.presentation?.label ?? entry.id, leader, bindings: entry.bindings ?? [] });\n }\n return defs;\n}\n\n/** A row per action that has a binding, sorted by group then label. A keymap's keys carry the path through\n * their leader (`Loupe ▸ L`), so they never read as the plain key. */\nexport function keyRows(\n actions: readonly Action[],\n defs: readonly KeymapDef[],\n overrides?: ReturnType<ActionsRegistry['bindingOverrides']>,\n): KeyRow[] {\n const inKeymap = new Map<string, string[]>();\n for (const def of defs) {\n for (const [id, chips] of keymapShortcuts(def, overrides)) {\n inKeymap.set(id, [...(inKeymap.get(id) ?? []), ...chips.flatMap((c) => formatShortcut(c) ?? [])]);\n }\n }\n const rows: KeyRow[] = [];\n for (const action of actions) {\n const keys = new Set<string>();\n const others = new Set<string>();\n for (const { spec } of actionBindings(action)) {\n (keySpecShortcut(spec) ? keys : others).add(describeBinding(spec));\n }\n for (const chip of inKeymap.get(action.id) ?? []) keys.add(chip);\n if (keys.size + others.size === 0) continue;\n rows.push({ id: action.id, label: action.label, group: action.group ?? 'other', keys: [...keys], others: [...others] });\n }\n return rows.sort((a, b) => a.group.localeCompare(b.group) || a.label.localeCompare(b.label));\n}\n","import './keys.css';\nimport { useLabEntries, type LabContribution } from '@weasel-js/labkit';\nimport { useActionsRegistry } from '@weasel-js/core';\nimport { useEffect, useMemo, useReducer } from 'react';\nimport { type KeyRow, keymapDefs, keyRows } from './keyRows';\n\nexport { describeBinding } from './keyRows';\n\n/** Every key binding the lab's registry holds, by group, re-read as actions come and go. */\nexport function useKeyRows(): readonly KeyRow[] {\n const registry = useActionsRegistry();\n const entries = useLabEntries();\n const [version, bump] = useReducer((n: number) => n + 1, 0);\n useEffect(() => registry?.subscribe(bump), [registry]);\n return useMemo(\n () => (registry ? keyRows(registry.list(), keymapDefs(entries), registry.bindingOverrides()) : []),\n // `version` is the registry's change signal: `list()` has no identity to key on.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [registry, entries, version],\n );\n}\n\nfunction KeysPanel() {\n const rows = useKeyRows();\n if (rows.length === 0) return <p className=\"fg-keys__empty\">No key bindings.</p>;\n const groups = new Map<string, KeyRow[]>();\n for (const row of rows) groups.set(row.group, [...(groups.get(row.group) ?? []), row]);\n return (\n <div className=\"fg-keys\">\n {[...groups].map(([group, members]) => (\n <section key={group} className=\"fg-keys__group\" aria-label={group}>\n <h3 className=\"fg-keys__heading\">{group}</h3>\n <ul className=\"fg-keys__list\">\n {members.map((row) => (\n <li key={row.id} className=\"fg-keys__row\">\n <span className=\"fg-keys__label\">{row.label}</span>\n <span className=\"fg-keys__chips\">\n {row.keys.map((chip) => (\n <kbd key={chip} className=\"fg-keys__chip\">{chip}</kbd>\n ))}\n {row.others.map((chip) => (\n <kbd key={chip} className=\"fg-keys__chip fg-keys__chip--gesture\">{chip}</kbd>\n ))}\n </span>\n </li>\n ))}\n </ul>\n </section>\n ))}\n </div>\n );\n}\n\nexport const KEYS_SECTION: LabContribution = {\n id: 'fg-keys',\n region: 'aside',\n item: { title: 'Keys', body: <KeysPanel /> },\n};\n","import { type Action, useActionsRegistry } from '@weasel-js/core';\nimport { type LabContribution, usePersistedState } from '@weasel-js/labkit';\nimport { useEffect, useMemo } from 'react';\nimport { icon } from '../../icons.gen';\nimport { KEYS_SECTION } from './KeysPanel';\n\nconst RECORD = 'fg-keys-shown';\n\nexport const KEYS_TOGGLE_ID = 'forge.keys.toggle';\n\n/** Matched by code: Alt changes the character a key produces on macOS. Never plain `?`, which would fire while typing. */\nconst OPEN_KEY = { kind: 'key', key: '/', code: 'Slash', mods: { alt: true } } as const;\n\n/** The header's Keys toggle, then the panel itself while the toggle is on. */\nexport function keysChrome(shown: boolean, toggle: () => void): readonly LabContribution[] {\n return [\n {\n id: 'fg-keys-toggle',\n region: 'header',\n group: 'story',\n item: { icon: /* @icon */ 'ui:keyboard', label: 'Keys panel', pressed: shown, onActivate: toggle },\n },\n ...(shown ? [KEYS_SECTION] : []),\n ];\n}\n\n/**\n * Reports `keysChrome` to `onChrome` as the lab's persisted choice changes, and answers Alt+Slash by flipping it.\n * Renders nothing; mount it inside the lab, since the choice lives there.\n */\nexport function KeysChrome({ onChrome }: { onChrome: (chrome: readonly LabContribution[]) => void }) {\n const [shown, setShown] = usePersistedState<boolean>(RECORD, false, { scope: 'lab' });\n const registry = useActionsRegistry();\n const chrome = useMemo(() => keysChrome(shown, () => setShown((was) => !was)), [shown, setShown]);\n useEffect(() => onChrome(chrome), [chrome, onChrome]);\n useEffect(() => {\n if (!registry) return;\n const action: Action = {\n id: KEYS_TOGGLE_ID,\n label: 'Toggle the keys panel',\n group: 'forge',\n defaultBinding: [{ spec: OPEN_KEY, opts: { id: KEYS_TOGGLE_ID } }],\n invoker: { timing: 'immediate', run: () => setShown((was) => !was) },\n };\n return registry.register(action);\n }, [registry, setShown]);\n return null;\n}\n","import { formatShortcut } from '@weasel-js/ui/components/ToolPalette';\nimport type { LabChromeContext, LabHeaderItem } from '@weasel-js/labkit';\nimport { icon } from '../../icons.gen';\n\nconst KEYS = { kind: 'key', key: 'i', mods: { mod: true } } as const;\n\n/** The lab header's Info command; ⌘I / Ctrl+I runs it from anywhere but a text field. */\nexport function infoItem(open: () => void): LabHeaderItem<LabChromeContext> {\n return {\n icon: /* @icon */ 'ui:info',\n label: 'Info',\n shortcut: formatShortcut({ key: KEYS.key, mod: KEYS.mods.mod }),\n keys: KEYS,\n onActivate: open,\n };\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 { type Libraries, TITLE_LIBRARIES } from '../../story/library';\n\n/** One prop of the story, as the dossier prints it. */\nexport interface DossierArg {\n /** Dotted path within the schema — what the value is written at. */\n path: string;\n /** The author's `argTypes` name, else the path's last segment. */\n label: string;\n /** The control kind labkit resolved, or null while rules have not run. */\n kind: string | null;\n default: unknown;\n /** The focused trial's value, which is `default` until someone edits it. */\n value: unknown;\n description?: string;\n}\n\n/** Everything Get Info prints about one story. */\nexport interface Dossier {\n id: string;\n title: string;\n name: string;\n exportName: string;\n file: string;\n /** Which package the story file lives in. */\n library: string;\n componentName?: string;\n description?: string;\n componentDescription?: string;\n args: DossierArg[];\n /** The story's frame has not reported its schema yet, so an empty `args`\n * means \"not loaded\" rather than \"takes none\". */\n argsPending: boolean;\n}\n\n/** The group forge hides the lab's globals in. Those are the lab's settings,\n * not the story's props, and the dossier is about the story. */\nconst GLOBALS = '$globals';\n\n/** Every visible leaf of `shape`, depth first, carrying its dotted path. */\nfunction leaves(shape: ConfigShape, prefix = ''): { path: string; node: ConfigNode }[] {\n const out: { path: string; node: ConfigNode }[] = [];\n for (const [key, entry] of Object.entries(shape)) {\n if (prefix === '' && key === GLOBALS) continue;\n const path = prefix ? `${prefix}.${key}` : key;\n if (isConfigBranch(entry)) out.push(...leaves(entry.children, path));\n else if (!entry.annotations.hidden) out.push({ path, node: entry });\n }\n return out;\n}\n\n/**\n * The dossier for one story. A pure function of the records the shell already\n * holds: the index entry, the instrument built from the story's `ready`\n * message, and the focused trial's config. An instrument exists before its\n * frame reports anything, and its schema is empty until then — so `ready`\n * decides whether an empty `args` reads as pending or as none.\n */\nexport function storyDossier(input: {\n entry: IndexEntry;\n libraries?: Libraries;\n instrument?: Instrument<unknown, unknown> | undefined;\n config?: unknown;\n ready?: boolean;\n}): Dossier {\n const { entry, libraries = TITLE_LIBRARIES, 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: libraries.of(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 num from '@weasel-js/theme/numeric.module.css';\nimport type { Dossier, DossierArg } from './dossier';\nimport { Description } from '../../frame/index/Description';\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 ${num.numeric}`}>{printed(arg.value)}</td>\n <td className={`fg-info__value-cell ${num.numeric}`}>{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 ? <Description text={dossier.description} className=\"fg-info__doc\" /> : null}\n {dossier.componentDescription ? (\n <Description text={dossier.componentDescription} className=\"fg-info__doc fg-info__doc--component\" />\n ) : null}\n </section>\n ) : null}\n\n <section className=\"fg-info__section\" aria-label=\"Identity\">\n <dl className=\"fg-info__rows\">\n <Row label=\"Story\">{dossier.name}</Row>\n <Row label=\"Component\">{dossier.componentName ?? dossier.title.split('/').pop()}</Row>\n <Row label=\"Library\">{dossier.library}</Row>\n <Row label=\"Title\">{dossier.title}</Row>\n <Row label=\"Export\">\n <code>{dossier.exportName}</code>\n </Row>\n <Row label=\"Id\">\n <code>{dossier.id}</code>\n </Row>\n <Row label=\"File\">\n <code className=\"fg-info__path\">{dossier.file}</code>\n </Row>\n </dl>\n </section>\n\n <section className=\"fg-info__section\" aria-label=\"Args\">\n <h3 className=\"fg-info__heading\">Args</h3>\n {dossier.argsPending ? (\n <p className=\"fg-info__empty\">Open this story to read its args.</p>\n ) : dossier.args.length === 0 ? (\n <p className=\"fg-info__empty\">This story takes no args.</p>\n ) : (\n <ArgRows args={dossier.args} />\n )}\n </section>\n </div>\n );\n}\n","import { breadcrumb } from '../breadcrumb';\nimport { useLabContext } from '@weasel-js/labkit';\nimport { Dialog } from '@weasel-js/ui/components/Dialog';\nimport { useContext } from 'react';\nimport { LibrariesContext } from '../../story/library';\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 libraries = useContext(LibrariesContext);\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 libraries,\n instrument: instruments.find((candidate) => candidate.name === entry.id),\n config: trial?.config,\n ready: isReady(entry.id),\n });\n return (\n <Dialog\n isOpen={isOpen}\n onOpenChange={onOpenChange}\n title={breadcrumb(dossier.title, dossier.name)}\n className=\"fg-info-dialog\"\n >\n <StoryDossier dossier={dossier} />\n </Dialog>\n );\n}\n","import { createContext } from 'react';\nimport { FRAME_HELLO } from '../protocol/messages';\n\n/** Frame documents loaded ahead of need, blank until a view hands one a port. */\nexport interface FramePool {\n /**\n * A frame that has loaded and said hello, detached from the pool so the caller can move it into place with\n * `moveBefore`; null when none is ready or the browser cannot move an iframe without reloading it.\n */\n claim(): HTMLIFrameElement | null;\n dispose(): void;\n}\n\n/** How long a frame document has to say hello. Longer than a cold dev server takes to serve one its first time. */\nexport const HELLO_TIMEOUT_MS = 30_000;\n\ntype Movable = Element & { moveBefore(node: Node, child: Node | null): void };\n\n/** Whether `moveBefore` exists here, the one way to move an iframe without reloading its document. */\nexport function canMoveFrames(): boolean {\n return typeof Element !== 'undefined' && 'moveBefore' in Element.prototype;\n}\n\n/** Moves `frame` to the start of `host` without reloading it. */\nexport function moveFrame(host: Element, frame: HTMLIFrameElement): void {\n (host as Movable).moveBefore(frame, host.firstChild);\n}\n\nconst whenIdle = (fn: () => void): (() => void) => {\n if (typeof requestIdleCallback === 'function') {\n const handle = requestIdleCallback(fn, { timeout: 500 });\n return () => cancelIdleCallback(handle);\n }\n const handle = setTimeout(fn, 200);\n return () => clearTimeout(handle);\n};\n\n/**\n * Keeps `size` blank frames of `frameUrl` loaded off-screen. A claimed frame is the caller's to discard: it never\n * comes back, so nothing one story left in a document reaches the next. A replacement loads when the page is idle.\n */\nexport function createFramePool(frameUrl: string, size = 2): FramePool {\n const shelf = document.createElement('div');\n shelf.className = 'fg-frame-pool';\n shelf.setAttribute('aria-hidden', 'true');\n document.body.append(shelf);\n const warm: HTMLIFrameElement[] = [];\n /** Per frame still loading, what stops waiting for it. */\n const waits = new Set<() => void>();\n let cancelRefill: (() => void) | null = null;\n let disposed = false;\n\n const load = () => {\n const frame = document.createElement('iframe');\n frame.tabIndex = -1;\n frame.src = frameUrl;\n const stop = () => {\n window.removeEventListener('message', onMessage);\n clearTimeout(timer);\n waits.delete(stop);\n };\n const onMessage = (event: MessageEvent) => {\n if (event.source !== frame.contentWindow || event.origin !== location.origin) return;\n if ((event.data as { type?: unknown } | null)?.type !== FRAME_HELLO) return;\n stop();\n warm.push(frame);\n };\n const timer = setTimeout(() => {\n stop();\n frame.remove();\n refill();\n }, HELLO_TIMEOUT_MS);\n waits.add(stop);\n window.addEventListener('message', onMessage);\n shelf.append(frame);\n };\n\n const refill = () => {\n if (disposed || cancelRefill) return;\n cancelRefill = whenIdle(() => {\n cancelRefill = null;\n while (!disposed && warm.length + waits.size < size) load();\n });\n };\n if (canMoveFrames()) refill();\n\n return {\n claim() {\n if (!canMoveFrames()) return null;\n const frame = warm.shift() ?? null;\n refill();\n return frame;\n },\n dispose() {\n disposed = true;\n cancelRefill?.();\n for (const stop of [...waits]) stop();\n shelf.remove();\n },\n };\n}\n\nexport const FramePoolContext = createContext<FramePool | null>(null);\n","import { type Action, type MenuDef, useActionsRegistry, useMenuHost, useMenus } from '@weasel-js/core';\nimport { type ConfigEntry, type ConfigSchema, isConfigBranch } from '@weasel-js/labkit/config';\nimport { type LensActionApi, type LoupePoint, setLensOps } from '@weasel-js/labkit/loupe';\nimport { type PrefGroup, type PrefLeaf, pref } from '@weasel-js/prefs';\nimport { useEffect, useMemo } from 'react';\nimport { type GlobalDeclarations, isForgePath } from '../globals';\nimport type { ForgeComparison } from './conditions';\n\n/** The actions whose variants are the compare menu's rows, each setting the comparison of the lens it opened on.\n * DPR rows have one of their own, which a lens showing no Pixels disables. */\nexport const COMPARE_WITH_ID = 'loupe.compare.with';\nexport const COMPARE_DPR_ID = 'loupe.compare.dpr';\n/** Why a DPR row is disabled: a DPR changes only a Pixels capture. */\nexport const PIXELS_ONLY = 'Pixels only';\nexport const COMPARE_MENU_ID = 'loupe.compare';\n\nconst DPRS = [1, 2, 3] as const;\n\n/** One row of the compare menu: the submenu it sits in, its label, and the comparison it sets. */\nexport interface CompareChoice {\n /** The action whose variant the row is. */\n action: typeof COMPARE_WITH_ID | typeof COMPARE_DPR_ID;\n key: string;\n group: string;\n label: string;\n compare: ForgeComparison;\n}\n\n/** Each leaf of `shape` a comparison can set, by its dotted path: a boolean, or one with options. */\nfunction argChoices(shape: Readonly<Record<string, ConfigEntry>>, at: string): CompareChoice[] {\n return Object.entries(shape).flatMap(([key, entry]) => {\n const path = at === '' ? key : `${at}.${key}`;\n if (isForgePath(path)) return [];\n if (isConfigBranch(entry)) return argChoices(entry.children, path);\n const options: readonly { value: unknown; label: string }[] =\n entry.kind === 'boolean'\n ? [\n { value: true, label: 'On' },\n { value: false, label: 'Off' },\n ]\n : (entry.annotations.options ?? []);\n return options.map((o): CompareChoice => ({\n action: COMPARE_WITH_ID,\n key: `arg.${path}.${String(o.value)}`,\n group: `Arg ${path}`,\n label: o.label,\n compare: { kind: 'custom', args: { [path]: o.value } } as const,\n }));\n });\n}\n\n/** What a lens can be compared against: every declared global's options, DPR 1×, 2× and 3×, and the args of the\n * story under it that are booleans or have options. */\nexport function compareChoices(declarations: GlobalDeclarations, schema: ConfigSchema<unknown> | null): CompareChoice[] {\n const globals = Object.entries(declarations).flatMap(([key, declaration]) =>\n declaration.options.map((o): CompareChoice => ({\n action: COMPARE_WITH_ID,\n key: `global.${key}.${o.value}`,\n group: declaration.label,\n label: o.label,\n compare: { kind: 'custom', globals: { [key]: o.value } } as const,\n })),\n );\n const dprs = DPRS.map((dpr): CompareChoice => ({\n action: COMPARE_DPR_ID,\n key: `dpr.${dpr}`,\n group: 'DPR',\n label: `${dpr}×`,\n compare: { kind: 'custom', dpr } as const,\n }));\n return [...globals, ...dprs, ...(schema ? argChoices(schema.nodes, '') : [])];\n}\n\n/** The compare menu: a submenu per global, DPR, and arg, each row naming one variant of `COMPARE_WITH_ID`. */\nexport function compareMenuDef(choices: readonly CompareChoice[]): MenuDef {\n const groups = new Map<string, Record<string, PrefLeaf>>();\n for (const choice of choices) {\n const rows = groups.get(choice.group) ?? {};\n rows[`c${Object.keys(rows).length}`] = pref.action(`${choice.action}:${choice.key}`);\n groups.set(choice.group, rows);\n }\n const submenus: Record<string, PrefGroup> = {};\n [...groups].forEach(([label, rows], n) => {\n submenus[`g${n}`] = pref.group(label, rows, { as: 'menu' });\n });\n return { id: COMPARE_MENU_ID, menu: pref.group('', submenus) };\n}\n\n/** A request to show the menu: where, on which lens, whether it shows Pixels, and the choices for it. `seq` changes\n * on every open. */\nexport interface CompareMenuRequest {\n seq: number;\n client: LoupePoint;\n lensId: string;\n /** Whether the lens shows Pixels, the only source a DPR changes. */\n pixels: boolean;\n choices: readonly CompareChoice[];\n}\n\n/** The compare menu's two actions, a variant per row, each setting the comparison on the lens `request` opened on. */\nexport function compareActions(api: LensActionApi<ForgeComparison>, request: CompareMenuRequest): Action[] {\n const one = (id: CompareChoice['action'], label: string, enabled: () => true | string): Action => ({\n id,\n label,\n group: 'loupe',\n enabled,\n variants: request.choices\n .filter((c) => c.action === id)\n .map((c) => ({ key: c.key, label: `${c.group}: ${c.label}`, params: { compare: c.compare, lensId: request.lensId } })),\n invoker: {\n timing: 'immediate',\n run(_deps, params) {\n const lensId = (params?.lensId as string | undefined) ?? api.current();\n const compare = params?.compare as ForgeComparison | undefined;\n if (lensId !== null && compare) api.apply(setLensOps(api.scene, lensId, { compare }));\n },\n },\n });\n return [\n one(COMPARE_WITH_ID, 'Compare with', () => true),\n one(COMPARE_DPR_ID, 'Compare at DPR', () => (request.pixels ? true : PIXELS_ONLY)),\n ];\n}\n\n/** Props for `CompareMenu`. */\nexport interface CompareMenuProps {\n api: LensActionApi<ForgeComparison>;\n request: CompareMenuRequest | null;\n}\n\nconst NO_CHOICES: readonly CompareChoice[] = [];\n\n/** Registers the compare menu's actions for the lens asked about and opens the menu on it, at each request; the\n * actions go again once that menu closes. */\nexport function CompareMenu({ api, request }: CompareMenuProps) {\n const registry = useActionsRegistry();\n const host = useMenuHost();\n const choices = request?.choices ?? NO_CHOICES;\n const defs = useMemo(() => [compareMenuDef(choices)], [choices]);\n useMenus(defs);\n useEffect(() => {\n if (!registry || !host || !request) return;\n const offs = compareActions(api, request).map((a) => registry.register(a));\n let held = true;\n const drop = () => {\n if (!held) return;\n held = false;\n for (const off of offs) off();\n };\n // Opened after the registrations, which its rows resolve against.\n const opened = host.open({ menu: COMPARE_MENU_ID, client: request.client, source: 'keyboard' }) ? host.current()?.seq : undefined;\n if (opened === undefined) {\n drop();\n return;\n }\n // A menu closes before it runs the row picked, so the actions stay until that run has happened.\n const unsubscribe = host.subscribe(() => {\n if (host.current()?.seq !== opened) queueMicrotask(drop);\n });\n return () => {\n unsubscribe();\n drop();\n };\n }, [registry, host, api, request]);\n return null;\n}\n","import type { LensSource, LensSourceRequest } from '@weasel-js/labkit/loupe';\nimport type { Globals } from '../../protocol/messages';\nimport type { ForgeComparison, ResolveContext, ResolvedConditions } from './conditions';\nimport type { LiveLenses, LiveRequest } from './liveLenses';\nimport { trialAt } from './trialAt';\n\nexport const NOTHING_UNDER = 'Nothing under the reticle';\n\n/** The Live source, plus a way for its host to have every attached lens look again at what lies under it. */\nexport interface LiveSource extends LensSource<ForgeComparison> {\n /** Re-reads the trial under each lens: for a scroll, a resize, or a trial closing, none of which moves a reticle. */\n remeasure(): void;\n}\n\nconst sameContext = (a: ResolveContext, b: ResolveContext) =>\n a.declarations === b.declarations && a.modeGlobal === b.modeGlobal && a.prefersDark === b.prefersDark && a.labMode === b.labMode;\n\n/** The id a lens cell asks under: a cell showing a comparison is a request of its own beside the lens's story. */\nexport const liveCellId = (lensId: string, compare: ForgeComparison | null): string =>\n compare === null ? lensId : `${lensId}~compared`;\n\n/** Whether `b` would render the copy `a` does: a measure that finds nothing new posts nothing. */\nfunction sameRequest(a: LiveRequest | null, b: LiveRequest): boolean {\n return (\n a !== null &&\n a.slot === b.slot &&\n a.hit.host === b.hit.host &&\n a.hit.trialId === b.hit.trialId &&\n a.hit.local.x === b.hit.local.x &&\n a.hit.local.y === b.hit.local.y &&\n a.hit.scale === b.hit.scale &&\n a.factor === b.factor &&\n a.size.width === b.size.width &&\n a.size.height === b.size.height &&\n a.args === b.args &&\n a.compare === b.compare &&\n sameContext(a.ctx, b.ctx)\n );\n}\n\n/** What changes a story's look without moving its DOM: a hover, a focus, a transition ending. */\nconst LOOK_EVENTS = ['pointerover', 'pointerout', 'focusin', 'focusout', 'transitionend'] as const;\n\n/** Calls `notify` whenever the element it is pointed at changes; pointing it at null stops it. */\nfunction watchOf(notify: () => void): (el: HTMLElement | null) => void {\n const observer = typeof MutationObserver === 'undefined' ? null : new MutationObserver(notify);\n let watched: HTMLElement | null = null;\n return (el) => {\n if (el === watched) return;\n observer?.disconnect();\n for (const type of LOOK_EVENTS) watched?.removeEventListener(type, notify);\n watched = el;\n if (!el) return;\n observer?.observe(el, { subtree: true, childList: true, characterData: true, attributes: true });\n for (const type of LOOK_EVENTS) el.addEventListener(type, notify);\n };\n}\n\nconst now = (run: () => void) => run();\n\n/**\n * A lens showing a second copy of the story under its reticle, rendered by that story's own trial into the lens.\n * `conditions` is read on every measure, so a comparison resolves against the lab as it is then. `schedule` runs the\n * readers' notification: every change it gathers before running is one notification. The default runs it at once.\n */\nexport function createLiveSource(\n lenses: LiveLenses,\n resolve: (c: ForgeComparison | null, base: Globals, ctx: ResolveContext) => ResolvedConditions,\n conditions: () => { base: Globals; ctx: ResolveContext },\n schedule: (run: () => void) => void = now,\n): LiveSource {\n const measures = new Set<() => void>();\n const listeners = new Set<() => void>();\n let due = false;\n const flush = () => {\n due = false;\n for (const listener of [...listeners]) listener();\n };\n const notify = () => {\n if (due) return;\n due = true;\n schedule(flush);\n };\n return {\n kind: 'live',\n produces: 'dom',\n label: () => 'Live',\n status: () => true,\n // A reader hears of what it reads: the lens's copy, and with nothing compared, the main story under the reticle.\n subscribe(listener) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n attach(slot, first) {\n const doc = slot.ownerDocument;\n const target = doc.createElement('div');\n target.className = 'fg-lens-live';\n const empty = doc.createElement('div');\n empty.className = 'fg-lens-empty';\n empty.hidden = true;\n slot.append(target, empty);\n const watchCopy = watchOf(notify);\n watchCopy(target);\n const watchStory = watchOf(notify);\n let request: LensSourceRequest<ForgeComparison> = first;\n let posted: LiveRequest | null = null;\n const post = (next: LiveRequest | null) => {\n if (next === null ? posted === null : sameRequest(posted, next)) return;\n posted = next;\n lenses.set(liveCellId(request.lensId, request.conditions), next);\n };\n const measure = () => {\n const { lensId, reticle, conditions: compare } = request;\n const hit = trialAt(reticle, doc);\n watchStory(compare === null ? (hit?.host ?? null) : null);\n empty.hidden = hit !== null;\n if (!hit) {\n post(null);\n empty.textContent = NOTHING_UNDER;\n return;\n }\n const { base, ctx } = conditions();\n const resolved = resolve(compare, base, ctx);\n post({\n lensId: liveCellId(lensId, compare),\n slot: target,\n hit,\n factor: request.factor,\n size: request.size,\n compare,\n ctx,\n args: resolved.args,\n });\n };\n measures.add(measure);\n measure();\n return {\n update(next) {\n request = next;\n measure();\n },\n detach() {\n watchCopy(null);\n watchStory(null);\n measures.delete(measure);\n lenses.set(liveCellId(request.lensId, request.conditions), null);\n target.remove();\n empty.remove();\n },\n };\n },\n remeasure() {\n for (const measure of [...measures]) measure();\n },\n };\n}\n","import { parseColor } from '@weasel-js/core';\nimport { type LoupePoint, probeUnderLens } from '@weasel-js/labkit/loupe';\nimport { compareSpecificity, type Specificity, specificity, splitTopLevel } from '@weasel-js/svg';\nimport { cssRulesOf, varRefs } from '../../frame/cssVarUse';\n\n/** A color an element shows, and the property it shows it through. */\nexport interface ColorAt {\n element: Element;\n property: 'color' | 'background-color';\n /** The computed value. */\n value: string;\n}\n\n/** One declaration in a chain: what `property` is declared as, by which rule, on which element. */\nexport interface ChainLink {\n property: string;\n declared: string;\n selector: string;\n element: Element;\n}\n\n/** The selector a link reports for a declaration in an element's `style` attribute. */\nexport const INLINE = 'style attribute';\n\n/**\n * The topmost element under a client point inside `within`, `within` itself included. Inside a lens the layer takes\n * no pointer, so the hit test runs under labkit's `interior` probe, which stands the lens's interior up for it.\n */\nexport function topmostIn(within: Element, client: LoupePoint): Element | undefined {\n return probeUnderLens(within, 'interior', () =>\n (within.ownerDocument.elementsFromPoint?.(client.x, client.y) ?? []).find((el) => within.contains(el)),\n );\n}\n\n/** The first opaque `background-color` from `el` up to `stop`; null when none is, or the unreadable color that stopped the walk. */\nexport function backgroundOf(\n el: Element,\n stop?: Element,\n): { element: Element; color: string } | { unreadable: string } | null {\n for (let at: Element | null = el; at; at = at === stop ? null : at.parentElement) {\n const color = getComputedStyle(at).backgroundColor;\n if (color.trim() === '') continue;\n try {\n if (parseColor(color)[3] === 1) return { element: at, color };\n } catch {\n return { unreadable: color };\n }\n }\n return null;\n}\n\nconst inside = (r: DOMRect, p: LoupePoint) => p.x >= r.left && p.x <= r.right && p.y >= r.top && p.y <= r.bottom;\n\n/** Whether one of `el`'s own text runs is drawn under the point: the text's range rects, not the element's box. */\nfunction textUnder(el: Element, client: LoupePoint): boolean {\n const range = el.ownerDocument.createRange();\n return Array.from(el.childNodes).some((n) => {\n if (n.nodeType !== Node.TEXT_NODE || (n.textContent ?? '').trim() === '') return false;\n range.selectNodeContents(n);\n return Array.from(range.getClientRects()).some((r) => inside(r, client));\n });\n}\n\n/**\n * The color under a client point inside `within`: the text's `color` where text is drawn there, else the\n * `background-color` of the first opaque box from the topmost element up to `within`. Null over nothing, or where\n * no box up to `within` is opaque. The element is found by hit-testing rather than `caretPositionFromPoint`, which\n * answers only for the topmost layer and so cannot see a story under a lens.\n */\nexport function colorAt(client: LoupePoint, within: HTMLElement): ColorAt | null {\n const el = topmostIn(within, client);\n if (!el) return null;\n if (textUnder(el, client)) return { element: el, property: 'color', value: getComputedStyle(el).color };\n const bg = backgroundOf(el, within);\n if (bg === null) return null;\n if ('unreadable' in bg) return { element: el, property: 'background-color', value: bg.unreadable };\n return { element: bg.element, property: 'background-color', value: bg.color };\n}\n\nconst STYLE_RULE = 1;\n/** Longhands a chain is asked about, and the shorthands that can declare them: a shorthand holding a `var()` leaves its longhands empty in the CSSOM. */\nconst SHORTHANDS: Readonly<Record<string, readonly string[]>> = { 'background-color': ['background'] };\nconst INHERITED = (property: string) => property.startsWith('--') || property === 'color';\n\ninterface Rule {\n readonly selector: string;\n readonly style: CSSStyleDeclaration;\n}\n\n/** Whether a grouping rule's condition holds where `doc` is shown. `@container` and `@layer` are taken as holding. */\nfunction applies(rule: CSSRule, doc: Document): boolean {\n const media = (rule as CSSRule & { media?: MediaList }).media;\n if (media && media.mediaText && doc.defaultView && !doc.defaultView.matchMedia(media.mediaText).matches) return false;\n if (typeof CSSSupportsRule !== 'undefined' && rule instanceof CSSSupportsRule) return CSS.supports(rule.conditionText);\n return true;\n}\n\n/** A nested rule's selector made whole: `&` is its parent's, and a selector without one is a descendant of it. */\nfunction nest(selector: string, parent: string | undefined): string {\n if (parent === undefined) return selector;\n return splitTopLevel(selector, ',')\n .map((s) => (s.includes('&') ? s.replaceAll('&', `:is(${parent})`) : `:is(${parent}) ${s.trim()}`))\n .join(', ');\n}\n\nfunction collect(rules: CSSRuleList, doc: Document, into: Rule[], parent?: string): void {\n for (const rule of Array.from(rules)) {\n if (!applies(rule, doc)) continue;\n const imported = (rule as CSSRule & { styleSheet?: CSSStyleSheet | null }).styleSheet;\n if (imported) {\n const inner = cssRulesOf(imported);\n if (inner) collect(inner, doc, into);\n continue;\n }\n const children = (rule as CSSRule & { cssRules?: CSSRuleList }).cssRules;\n if (rule.type !== STYLE_RULE) {\n if (children) collect(children, doc, into, parent);\n continue;\n }\n const style = rule as CSSStyleRule;\n const selector = nest(style.selectorText, parent);\n into.push({ selector, style: style.style });\n if (children) collect(children, doc, into, selector);\n }\n}\n\n/** Every style rule `doc` applies, in source order: its sheets, then its adopted sheets, which come after them all. */\nfunction rulesOf(doc: Document): Rule[] {\n const out: Rule[] = [];\n for (const sheet of [...Array.from(doc.styleSheets), ...(doc.adoptedStyleSheets ?? [])]) {\n if (sheet.disabled) continue;\n const rules = cssRulesOf(sheet);\n if (rules) collect(rules, doc, out);\n }\n return out;\n}\n\n/** The specificity of the most specific selector in `list` that `el` matches, or null when none does. */\nfunction matching(el: Element, list: string): Specificity | null {\n let best: Specificity | null = null;\n for (const one of splitTopLevel(list, ',')) {\n let hit = false;\n try {\n hit = el.matches(one);\n } catch {\n // A pseudo-element, or a selector this engine cannot query, matches no element.\n }\n const s = hit ? specificity(one.trim()) : null;\n if (s && (best === null || compareSpecificity(s, best) > 0)) best = s;\n }\n return best;\n}\n\nfunction declaredIn(style: CSSStyleDeclaration, property: string): { value: string; important: boolean } | null {\n for (const name of [property, ...(SHORTHANDS[property] ?? [])]) {\n const value = style.getPropertyValue(name).trim();\n if (value) return { value, important: style.getPropertyPriority(name) === 'important' };\n }\n return null;\n}\n\n/** A rule's declaration of one property. */\ninterface Declared {\n readonly selector: string;\n readonly value: string;\n readonly important: boolean;\n}\n\n/** The rules declaring each property asked about, read from `rules` once per property. */\nfunction indexOf(rules: readonly Rule[]): (property: string) => readonly Declared[] {\n const index = new Map<string, Declared[]>();\n return (property) => {\n let got = index.get(property);\n if (!got) {\n got = rules.flatMap((r) => {\n const d = declaredIn(r.style, property);\n return d ? [{ selector: r.selector, ...d }] : [];\n });\n index.set(property, got);\n }\n return got;\n };\n}\n\n/**\n * The declaration of `property` that wins on `el` itself: important above normal, inline style above every rule of\n * the same importance, then the highest specificity, then the last in source order. Layer order is not modeled.\n */\nfunction winning(el: Element, property: string, rules: readonly Declared[]): ChainLink | null {\n let best: { value: string; important: boolean; spec: Specificity; selector: string } | null = null;\n for (const got of rules) {\n const spec = matching(el, got.selector);\n if (!spec) continue;\n const wins =\n best === null ||\n (got.important && !best.important) ||\n (got.important === best.important && compareSpecificity(spec, best.spec) >= 0);\n if (wins) best = { ...got, spec };\n }\n const inline = (el as Element & { style?: CSSStyleDeclaration }).style;\n const own = inline ? declaredIn(inline, property) : null;\n if (own && (best === null || own.important || !best.important)) return { property, declared: own.value, selector: INLINE, element: el };\n return best ? { property, declared: best.value, selector: best.selector, element: el } : null;\n}\n\n/** The winning declaration of `property` on `el`, or, for an inherited property, on its nearest ancestor that has one. */\nfunction declarationOf(el: Element, property: string, rules: readonly Declared[]): ChainLink | null {\n for (let at: Element | null = el; at; at = INHERITED(property) ? at.parentElement : null) {\n const link = winning(at, property, rules);\n if (link) return link;\n }\n return null;\n}\n\n/** How often each document's head has changed: a sheet added or removed, or a `<style>` rewritten, as a forge\n * override or a vite CSS update does. */\nconst revisions = new WeakMap<Document, { n: number; observer: MutationObserver | null }>();\n\nfunction revisionOf(doc: Document): number {\n let r = revisions.get(doc);\n if (!r) {\n const made = { n: 0, observer: null as MutationObserver | null };\n if (typeof MutationObserver !== 'undefined' && doc.head) {\n made.observer = new MutationObserver(() => {\n made.n += 1;\n });\n made.observer.observe(doc.head, { childList: true, subtree: true, characterData: true, attributes: true });\n }\n revisions.set(doc, made);\n r = made;\n }\n // Records not yet delivered count now, so a change made in this same task is not missed.\n if ((r.observer?.takeRecords().length ?? 0) > 0) r.n += 1;\n return r.n;\n}\n\nconst chains = new WeakMap<Element, Map<string, { key: string; chain: readonly ChainLink[] }>>();\n\n/**\n * How a color came to be: the declaration that sets its property, then, for each `var()` that names, the winning\n * declaration of that custom property on the element or its nearest ancestor declaring it, until a value names no\n * `var()`. A forge override is a rule like any other. User-agent styles are not modeled: where the user agent sets\n * an element's own color, as for a link or a button, an inherited property's chain is that of the nearest ancestor\n * an author rule declares it on, and empty when none does. Reused while the element's computed value and the\n * document's stylesheets stand as they were.\n */\nexport function tokenChain(at: ColorAt): readonly ChainLink[] {\n const doc = at.element.ownerDocument;\n const key = `${at.value}|${revisionOf(doc)}|${doc.styleSheets.length}|${doc.adoptedStyleSheets?.length ?? 0}`;\n let byProperty = chains.get(at.element);\n const held = byProperty?.get(at.property);\n if (held?.key === key) return held.chain;\n const chain = chainOf(at);\n if (!byProperty) {\n byProperty = new Map();\n chains.set(at.element, byProperty);\n }\n byProperty.set(at.property, { key, chain });\n return chain;\n}\n\nfunction chainOf(at: ColorAt): readonly ChainLink[] {\n const declaring = indexOf(rulesOf(at.element.ownerDocument));\n const chain: ChainLink[] = [];\n const seen = new Set<string>();\n const follow = (el: Element, property: string) => {\n if (seen.has(property)) return;\n seen.add(property);\n const link = declarationOf(el, property, declaring(property));\n if (!link) return;\n chain.push(link);\n for (const name of varRefs(link.declared)) follow(link.element, name);\n };\n follow(at.element, at.property);\n return chain;\n}\n","import { contrastRatio, parseColor, useLatest, wcagLevels } from '@weasel-js/core';\nimport {\n type LensCapture,\n type LensReadoutProps,\n type LensSlotProps,\n type LoupePoint,\n readBitmap,\n requestsOf,\n useShownSource,\n} from '@weasel-js/labkit/loupe';\nimport { Fragment, useCallback, useEffect, useMemo, useState, useSyncExternalStore } from 'react';\nimport { revealVar } from '../cssVars/reveal';\nimport type { ForgeComparison } from './conditions';\nimport { backgroundOf, colorAt, tokenChain } from './tokenChain';\nimport { trialAt } from './trialAt';\nimport { varRefs } from '../../frame/cssVarUse';\n\nexport const NO_TEXT = 'No text under the aim';\nexport const NO_BACKGROUND = 'No opaque background behind the text';\nexport const unreadable = (color: string) => `Cannot read the color \"${color}\"`;\nexport const NO_CAPTURE = 'No capture to read';\nexport const OUTSIDE = 'The aim is outside the capture';\nexport const NO_COLOR = 'No color under the aim';\nexport const NEEDS_LIVE = 'Token needs a Live source for changed conditions';\nexport const IN_FRAME = \"Cannot read inside an isolated story's frame\";\n\nexport type ContrastReading =\n | { ratio: number; aa: boolean; aaa: boolean; large: boolean }\n | { unavailable: string };\n\n/** Pixels either side of the aim that a Pixels reading looks at: a 5×5 neighborhood. */\nconst REACH = 2;\n\n/** WCAG's large text: 24px and up, or 18.66px and up when bold. */\nfunction isLarge(style: CSSStyleDeclaration): boolean {\n const px = Number.parseFloat(style.fontSize);\n const w = style.fontWeight === 'bold' ? 700 : Number.parseInt(style.fontWeight, 10);\n return px >= 24 || (px >= 18.66 && w >= 700);\n}\n\nconst rgb = (d: Uint8ClampedArray, i: number) => `rgb(${d[i]}, ${d[i + 1]}, ${d[i + 2]})`;\n\nfunction ofPixels(capture: LensCapture | undefined, point: LoupePoint): ContrastReading {\n const img = capture ? readBitmap(capture.bitmap) : null;\n if (!capture || !img) return { unavailable: NO_CAPTURE };\n const px = Math.floor(point.x * capture.dpr);\n const py = Math.floor(point.y * capture.dpr);\n if (px < 0 || py < 0 || px >= img.width || py >= img.height) return { unavailable: OUTSIDE };\n const { data, width, height } = img;\n const center = (py * width + px) * 4;\n let far = center;\n let best = 0;\n for (let y = Math.max(0, py - REACH); y <= Math.min(height - 1, py + REACH); y += 1) {\n for (let x = Math.max(0, px - REACH); x <= Math.min(width - 1, px + REACH); x += 1) {\n const i = (y * width + x) * 4;\n const d = [0, 1, 2].reduce((sum, c) => sum + ((data[i + c] as number) - (data[center + c] as number)) ** 2, 0);\n if (d > best) {\n best = d;\n far = i;\n }\n }\n }\n const ratio = contrastRatio(rgb(data, center), rgb(data, far));\n return ratio === null ? { unavailable: NO_CAPTURE } : { ratio, ...wcagLevels(ratio, false), large: false };\n}\n\n/**\n * The contrast of what lies under a lens's aim. Over a Live source it is the\n * text drawn at `point` inside `within` against the first opaque background\n * from it up to `within`, found by the same hit test as the Token readout's;\n * over Pixels it is the pixel at `point`, in host px, against the most\n * distant color within two pixels of it in `capture`.\n */\nexport function contrastAt(\n source: 'live' | 'pixels',\n at: { within?: HTMLElement; capture?: LensCapture; point: LoupePoint },\n): ContrastReading {\n if (source === 'pixels') return ofPixels(at.capture, at.point);\n const text = at.within ? colorAt(at.point, at.within) : null;\n if (!text || text.property !== 'color') return { unavailable: NO_TEXT };\n const style = getComputedStyle(text.element);\n const background = backgroundOf(text.element, at.within);\n if (background === null) return { unavailable: NO_BACKGROUND };\n if ('unreadable' in background) return { unavailable: unreadable(background.unreadable) };\n const ratio = contrastRatio(style.color, background.color);\n if (ratio === null) return { unavailable: unreadable(style.color) };\n const large = isLarge(style);\n return { ratio, ...wcagLevels(ratio, large), large };\n}\n\n/** A lens's own compared copy. A Split lens holds the compared render beside the base one, so the `~compared` copy is preferred. */\nfunction copyIn(interior: HTMLElement | null): HTMLElement | undefined {\n const copies = Array.from(interior?.querySelectorAll<HTMLElement>('[data-fg-copy]') ?? []);\n return copies.find((c) => (c.getAttribute('data-fg-host') ?? '').endsWith('~compared')) ?? copies[0];\n}\n\n/** Where a lens's compared render sits at its aim, in client px: the interior's center, in Swap and Split alike, since each side renders the whole interior. */\nfunction comparedAim(interior: HTMLElement | null): LoupePoint | null {\n const box = interior?.getBoundingClientRect();\n return box ? { x: box.left + box.width / 2, y: box.top + box.height / 2 } : null;\n}\n\n/** A Live reading's subject: an element to read inside and the client point to read at, or why there is none. */\ntype LiveAim = { within?: HTMLElement; point: LoupePoint } | { unavailable: string };\n\n/**\n * What a Live lens reads, and where in it: its compared copy at its aim when it has a comparison, else the main story\n * at the reticle. An isolated story renders in a frame of its own, whose document a readout cannot reach.\n */\nfunction liveAim(\n interior: HTMLElement | null,\n settings: LensSlotProps<ForgeComparison>['settings'],\n reticle: LoupePoint,\n): LiveAim {\n const aim =\n settings.compare === null\n ? { within: trialAt(reticle)?.host, point: reticle }\n : { within: copyIn(interior), point: comparedAim(interior) ?? reticle };\n return aim.within?.classList.contains('fg-frame-host') ? { unavailable: IN_FRAME } : aim;\n}\n\nconst verdict = (pass: boolean) => (pass ? 'pass' : 'fail');\n\nfunction textOf(reading: ContrastReading): string {\n if ('unavailable' in reading) return reading.unavailable;\n const base = `${reading.ratio.toFixed(2)}:1 · AA ${verdict(reading.aa)} · AAA ${verdict(reading.aaa)}`;\n return reading.large ? `${base} · large text` : base;\n}\n\n/** The Contrast readout: the WCAG ratio of what lies under the aim, and whether it passes AA and AAA. */\nexport function ContrastReadout({ lens, settings, sources, reticle, size, interior }: LensReadoutProps<ForgeComparison>) {\n const { source } = useShownSource(settings, sources);\n const kind = source?.kind;\n const subscribe = useCallback((fn: () => void) => source?.subscribe(fn) ?? (() => {}), [source]);\n // A Live reading is of the page as it stands, read each render and again whenever the source says a story changed.\n const live = useSyncExternalStore(subscribe, () => {\n if (kind !== 'live') return null;\n const aim = liveAim(interior, settings, reticle);\n return textOf('unavailable' in aim ? aim : contrastAt('live', aim));\n });\n const [pixels, setPixels] = useState<ContrastReading | null>(null);\n const [tick, setTick] = useState(0);\n useEffect(() => source?.subscribe(() => setTick((n) => n + 1)), [source]);\n const latest = useLatest({ lens, settings, reticle, size });\n useEffect(() => {\n if (kind !== 'pixels' || !source?.capture) return;\n const capture = source.capture.bind(source);\n let current = true;\n const timer = setTimeout(() => {\n const { lens: ids, settings: s, reticle: r, size: box } = latest.current;\n const [request] = requestsOf(source, ids, s, r, box);\n if (!request) return;\n void capture(request).then((got) => {\n if (current) setPixels('reason' in got ? { unavailable: got.reason } : contrastAt('pixels', { capture: got, point: got.at }));\n });\n }, 0);\n return () => {\n current = false;\n clearTimeout(timer);\n };\n }, [source, kind, reticle.x, reticle.y, settings.factor, settings.compare, tick, latest]);\n const text = kind === 'live' ? live : kind === 'pixels' && pixels ? textOf(pixels) : null;\n return text ? <span className=\"fg-lens-contrast\">{text}</span> : null;\n}\n\n/** A Token reading: the color's property, each custom property it passes through, and the value they end at. */\nexport type TokenReading = { steps: readonly string[] } | { unavailable: string };\n\n/**\n * How the color under a lens's aim is declared, read from the DOM: the lens's compared copy, or the main story when\n * nothing is compared. A Pixels capture of changed conditions has no DOM to read.\n */\nexport function tokenAt(\n kind: 'live' | 'pixels',\n interior: HTMLElement | null,\n settings: LensSlotProps<ForgeComparison>['settings'],\n reticle: LoupePoint,\n): TokenReading {\n if (kind === 'pixels' && settings.compare !== null) return { unavailable: NEEDS_LIVE };\n const aim = liveAim(interior, settings, reticle);\n if ('unavailable' in aim) return aim;\n const { within, point } = aim;\n const at = within ? colorAt(point, within) : null;\n if (!at) return { unavailable: NO_COLOR };\n try {\n parseColor(at.value);\n } catch {\n return { unavailable: unreadable(at.value) };\n }\n const chain = tokenChain(at);\n // A value naming several tokens branches, and its last branch's literal is not the color: end on what it computes to.\n const branches = chain.some((l) => varRefs(l.declared).size > 1);\n const end = branches ? at.value : (chain.at(-1)?.declared ?? at.value);\n return { steps: [at.property, ...chain.slice(1).map((l) => l.property), end] };\n}\n\nconst isToken = (step: string) => step.startsWith('--wzl-');\n\n/** The Token readout: the chain of tokens the color under the aim comes from, each token opening the CSS vars panel at it. */\nexport function TokenReadout({ settings, sources, reticle, interior }: LensReadoutProps<ForgeComparison>) {\n const { source } = useShownSource(settings, sources);\n const kind = source?.kind;\n const subscribe = useCallback((fn: () => void) => source?.subscribe(fn) ?? (() => {}), [source]);\n const json = useSyncExternalStore(subscribe, () =>\n kind === 'live' || kind === 'pixels' ? JSON.stringify(tokenAt(kind, interior, settings, reticle)) : null,\n );\n const reading = useMemo(() => (json === null ? null : (JSON.parse(json) as TokenReading)), [json]);\n if (!reading) return null;\n if ('unavailable' in reading) return <span className=\"fg-lens-token\">{reading.unavailable}</span>;\n return (\n <span className=\"fg-lens-token\">\n {reading.steps.map((step, i) => (\n <Fragment key={i}>\n {i > 0 ? ' ← ' : null}\n {isToken(step) && i < reading.steps.length - 1 ? (\n <button type=\"button\" className=\"fg-lens-token__link\" onClick={() => revealVar(step)}>\n {step}\n </button>\n ) : (\n step\n )}\n </Fragment>\n ))}\n </span>\n );\n}\n\n/** What a lens draws for the readouts it has on, other than the Pixel grid, which the lens draws itself. */\nexport function renderReadouts(props: LensReadoutProps<ForgeComparison>) {\n const { readouts } = props.settings;\n return (\n <>\n {readouts.includes('token') ? <TokenReadout {...props} /> : null}\n {readouts.includes('contrast') ? <ContrastReadout {...props} /> : null}\n </>\n );\n}\n","import { scrollerOf } from './trialAt';\n\n/** Where a story's scroller stands, in CSS px. */\nexport interface ScrollPosition {\n left: number;\n top: number;\n}\n\nconst ORIGIN: ScrollPosition = { left: 0, top: 0 };\n\n/** Where each isolated trial's frame document last said it stood, by trial id: a kept frame moves to a new host. */\nconst frames = new Map<string, ScrollPosition>();\n\nconst trialOf = (host: HTMLElement) => host.dataset.fgHost ?? '';\n\n/**\n * Records where the frame in `host` stands, and fires `scroll` on the host: its frame scrolls in a document of its\n * own, whose events never reach this one, so the host stands in for the scroller an in-document story has.\n */\nexport function reportFrameScroll(host: HTMLElement, scroll: ScrollPosition): void {\n frames.set(trialOf(host), { left: scroll.left, top: scroll.top });\n host.dispatchEvent(new Event('scroll'));\n}\n\n/** Where the story in `host` stands: its in-document scroller, or the frame document the host holds. */\nexport function scrollOf(host: HTMLElement): ScrollPosition {\n const scroller = scrollerOf(host);\n if (scroller) return { left: scroller.scrollLeft, top: scroller.scrollTop };\n return frames.get(trialOf(host)) ?? ORIGIN;\n}\n","import { isPlainObject } from '@weasel-js/core';\nimport type { Globals, Layout } from '../../protocol/messages';\nimport { type CapturePayload, MAX_DPR, MIN_DPR } from '../../vite/capture/payload';\nimport type { CssOverrides } from '../cssVars/overrides';\nimport { effectiveGlobals, GLOBALS_KEY, PLAYHEAD_KEY, storyConfig } from '../globals';\nimport type { TrialInputs } from './captureContext';\nimport {\n type ForgeComparison,\n type LabConditions,\n resolveComparison,\n resolveContextOf,\n type ResolvedConditions,\n withArgs,\n} from './conditions';\nimport { scrollOf } from './frameScroll';\nimport type { TrialHit } from './trialAt';\n\nexport const STATE_UNSENDABLE = \"this story's state cannot be sent to a capture\";\nexport const CONFIG_UNSENDABLE = \"this story's config cannot be sent to a capture\";\nexport const NO_STORY = 'this trial shows no story to capture';\nexport const NO_BOX = \"the story's box has no size\";\n\n/** What a capture of one trial is built from. */\nexport interface CapturePayloadInput {\n entry: TrialInputs['entry'];\n layout: Layout;\n /** The trial's whole config, forge's `$` keys included. */\n config: unknown;\n state: unknown;\n /** The globals the capture renders under: the comparison resolved over the trial's own. */\n globals: Globals;\n overrides: CssOverrides;\n /** The story's host, whose box the capture takes. */\n host: HTMLElement;\n dpr: number;\n /** The comparison, whose args are laid over the config and whose DPR, if any, replaces `dpr`. */\n resolved: ResolvedConditions;\n lab: CapturePayload['lab'];\n colorScheme: CapturePayload['colorScheme'];\n}\n\n/** Whether `round`, `value` sent through JSON, is `value` again: nothing dropped, nothing turned into something else. */\nfunction survived(value: unknown, round: unknown): boolean {\n if (value === null || typeof value === 'string' || typeof value === 'boolean') return value === round;\n if (typeof value === 'number') return Number.isFinite(value) && value === round;\n if (Array.isArray(value)) {\n if (!Array.isArray(round) || value.length !== round.length) return false;\n // `every` skips a hole, which JSON writes as null.\n for (let i = 0; i < value.length; i += 1) if (!(i in value) || !survived(value[i], round[i])) return false;\n return true;\n }\n if (!isPlainObject(value) || !isPlainObject(round)) return false;\n const keys = Object.keys(value);\n return keys.length === Object.keys(round).length && keys.every((key) => key in round && survived(value[key], round[key]));\n}\n\nfunction sendable(state: unknown): boolean {\n try {\n return survived(state, JSON.parse(JSON.stringify(state) ?? 'undefined'));\n } catch {\n return false;\n }\n}\n\n/** `value` without its plain objects' undefined entries, which JSON drops and a story reads as unset either way. */\nfunction withoutUndefined(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(withoutUndefined);\n if (!isPlainObject(value)) return value;\n return Object.fromEntries(\n Object.entries(value).flatMap(([key, v]) => (v === undefined ? [] : [[key, withoutUndefined(v)]])),\n );\n}\n\nconst clampDpr =(dpr: number) => Math.min(Math.max(dpr, MIN_DPR), MAX_DPR);\n\n/**\n * The payload a capture of the trial takes, or why it cannot be sent: a capture renders the story in another\n * document, so its config and state have to survive JSON on the way, and anything that does not would render a\n * different story.\n */\nexport function capturePayload(input: CapturePayloadInput): CapturePayload | { unavailable: string } {\n const { entry, layout, config, state, globals, overrides, host, dpr, resolved, lab, colorScheme } = input;\n if (!sendable(state)) return { unavailable: STATE_UNSENDABLE };\n const sent = withoutUndefined(withArgs(storyConfig(config), resolved.args));\n if (!sendable(sent)) return { unavailable: CONFIG_UNSENDABLE };\n const box = { width: host.offsetWidth, height: host.offsetHeight };\n if (!(box.width > 0 && box.height > 0)) return { unavailable: NO_BOX };\n const isolate = entry.isolate !== undefined;\n const kept = (config as Record<string, unknown> | null | undefined)?.[PLAYHEAD_KEY];\n return {\n story: entry.id,\n isolate,\n config: sent,\n state,\n globals,\n overrides,\n playhead: !isolate && typeof kept === 'number' && Number.isFinite(kept) ? kept : null,\n box,\n layout,\n dpr: clampDpr(resolved.dpr ?? dpr),\n scroll: scrollOf(host),\n lab,\n colorScheme,\n };\n}\n\n/**\n * The payload a Pixels lens over `hit` sends: `trial`'s story under `c`, resolved against the lab as it is now and\n * over the trial's own globals, pins included, the way a Live copy of it renders.\n */\nexport function trialPayload(\n trial: TrialInputs | null,\n lab: LabConditions,\n hit: TrialHit,\n dpr: number,\n c: ForgeComparison | null,\n): CapturePayload | { unavailable: string } {\n if (!trial) return { unavailable: NO_STORY };\n const ctx = resolveContextOf(lab);\n const own = effectiveGlobals(lab.labValues, (trial.config as Record<string, unknown> | null | undefined)?.[GLOBALS_KEY]);\n const resolved = resolveComparison(c, own, ctx);\n const colorScheme = ctx.prefersDark ? 'dark' : 'light';\n return capturePayload({\n ...trial,\n globals: resolved.globals,\n host: hit.host,\n dpr,\n resolved,\n lab: { globals: lab.labValues, mode: lab.mode === 'auto' ? colorScheme : lab.mode },\n colorScheme,\n });\n}\n","import type { LensSourceStatus } from '@weasel-js/labkit/loupe';\nimport { CAPTURE_PATH, type CapturePayload, messageOf } from '../../vite/capture/payload';\n\nexport const CHECKING = 'checking for a capture browser';\nconst UNAVAILABLE = 'captures are unavailable';\n/** A built workshop, served without the dev server, has no endpoint to ask. */\nexport const NO_ENDPOINT = 'this server takes no captures';\n\n/** The dev server's capture endpoint as a Pixels source talks to it. */\nexport interface CaptureClient {\n /** `true`, or why no capture can be taken, as the endpoint last said. */\n status(): LensSourceStatus;\n /** Also asks the endpoint again. */\n subscribe(listener: () => void): () => void;\n /** Asks the endpoint whether it can take captures, unless an ask is already out. */\n poll(): void;\n /** A capture of `payload`, or null when the endpoint answers that it cannot take one; throws on any other failure. */\n take(payload: CapturePayload): Promise<ImageBitmap | null>;\n}\n\nexport function createCaptureClient(base: string, send: typeof fetch): CaptureClient {\n const url = `${base}${CAPTURE_PATH}`;\n const listeners = new Set<() => void>();\n let status: LensSourceStatus = CHECKING;\n let polling: Promise<void> | null = null;\n const setStatus = (next: LensSourceStatus) => {\n if (next === status) return;\n status = next;\n for (const listener of [...listeners]) listener();\n };\n const poll = () => {\n polling ??= (async () => {\n try {\n const res = await send(url);\n if (!res.ok) return setStatus(NO_ENDPOINT);\n const body = (await res.json()) as { available?: boolean; reason?: string };\n setStatus(body.available === true ? true : (body.reason ?? UNAVAILABLE));\n } catch (err) {\n setStatus(`${NO_ENDPOINT}: ${messageOf(err)}`);\n } finally {\n polling = null;\n }\n })();\n };\n return {\n status: () => status,\n subscribe(listener) {\n listeners.add(listener);\n poll();\n return () => listeners.delete(listener);\n },\n poll,\n async take(payload) {\n const res = await send(url, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(payload) });\n if (res.status === 503) {\n setStatus(((await res.json()) as { reason?: string }).reason ?? UNAVAILABLE);\n return null;\n }\n if (!res.ok) {\n const body = (await res.json().catch(() => ({}))) as { error?: string };\n throw new Error(body.error ?? `capture failed: ${res.status}`);\n }\n return createImageBitmap(await res.blob());\n },\n };\n}\n","import { LENS_REST_MS, type LensSourceHandle, type LensSourceRequest, unavailableText } from '@weasel-js/labkit/loupe';\nimport { stableStringify } from '../../protocol/messages';\nimport { type CapturePayload, messageOf } from '../../vite/capture/payload';\nimport type { ForgeComparison } from './conditions';\nimport { NOTHING_UNDER } from './liveSource';\nimport { type TrialHit, trialAt } from './trialAt';\n\ntype Request = LensSourceRequest<ForgeComparison>;\nexport type PayloadFor = (hit: TrialHit, dpr: number, c: ForgeComparison | null) => CapturePayload | { unavailable: string };\n\n/** One lens side's last image: what it was captured from, and at which revision. */\nexport interface Shot {\n key: string;\n revision: number;\n bitmap: ImageBitmap;\n payload: CapturePayload;\n}\n\n/** What every Pixels lens shares: where captures come from, and the last image of each lens side. */\nexport interface PixelsShared {\n take(payload: CapturePayload): Promise<ImageBitmap | null>;\n payloadFor: PayloadFor;\n revision(): number;\n /** By `sideOf`. */\n shots: Map<string, Shot>;\n}\n\n/** One lens side: its lens, its DPR, and whether it shows the comparison or the story as it is. */\nexport const sideOf = (r: Request): string => `${r.lensId}:${r.dpr}${r.conditions === null ? '' : ':compared'}`;\n\n/** What a lens aims at: the payload it sends for the trial under its reticle, keyed by its content, or why none. */\nexport type Aimed = { hit: TrialHit; payload: CapturePayload; key: string } | { reason: string };\n\nexport function aim(shared: PixelsShared, request: Request, doc: Document): Aimed {\n const hit = trialAt(request.reticle, doc);\n if (!hit) return { reason: NOTHING_UNDER };\n const payload = shared.payloadFor(hit, request.dpr, request.conditions);\n if ('unavailable' in payload) return { reason: unavailableText('pixels', payload.unavailable) };\n return { hit, payload, key: stableStringify(payload) };\n}\n\n/** Whether `shot` is a capture of `key` taken since the last story edit. */\nexport const fresh = (shared: PixelsShared, shot: Shot | undefined, key: string): shot is Shot =>\n shot?.key === key && shot.revision === shared.revision();\n\n/** Draws `shot` into `canvas`, `factor` times its CSS size about `at`, in host px, with every pixel kept square. */\nfunction paint(canvas: HTMLCanvasElement, shot: Shot, at: TrialHit['local'], request: Request) {\n const sd = canvas.ownerDocument.defaultView?.devicePixelRatio ?? 1;\n const width = Math.max(1, Math.round(request.size.width * sd));\n const height = Math.max(1, Math.round(request.size.height * sd));\n if (canvas.width !== width) canvas.width = width;\n if (canvas.height !== height) canvas.height = height;\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n ctx.imageSmoothingEnabled = false;\n ctx.clearRect(0, 0, width, height);\n // Canvas px per PNG px: the PNG holds `dpr` of them per host px, and the lens shows a host px `factor` CSS px wide.\n const scale = (request.factor * sd) / shot.payload.dpr;\n const x = Math.round(width / 2 - at.x * request.factor * sd);\n const y = Math.round(height / 2 - at.y * request.factor * sd);\n ctx.drawImage(shot.bitmap, x, y, shot.bitmap.width * scale, shot.bitmap.height * scale);\n canvas.toggleAttribute('data-shown', true);\n}\n\nfunction blank(canvas: HTMLCanvasElement) {\n canvas.getContext('2d')?.clearRect(0, 0, canvas.width, canvas.height);\n canvas.toggleAttribute('data-shown', false);\n}\n\n/** An attached Pixels lens side, which its source tells to look again and to drop what it shows. */\nexport interface PixelsLens extends LensSourceHandle<ForgeComparison> {\n measure(): void;\n revised(): void;\n}\n\n/**\n * Attaches one lens side: a canvas showing the side's last capture, cropped about the reticle, and asking for a new\n * one when what lies under the reticle changes — at once the first time, after labkit's `LENS_REST_MS` at rest after\n * that. The last image stays up until the new one arrives, and a capture that started before a story edit is dropped.\n */\nexport function attachPixelsLens(slot: HTMLElement, first: Request, shared: PixelsShared, onDetach: () => void): PixelsLens {\n const doc = slot.ownerDocument;\n const canvas = doc.createElement('canvas');\n canvas.className = 'fg-lens-pixels';\n const empty = doc.createElement('div');\n empty.className = 'fg-lens-empty';\n empty.hidden = true;\n slot.append(canvas, empty);\n let request = first;\n let wanted: { key: string; payload: CapturePayload } | null = null;\n let pending: object | null = null;\n let timer: ReturnType<typeof setTimeout> | undefined;\n let started = false;\n let gone = false;\n const say = (text: string | null) => {\n empty.hidden = text === null;\n empty.textContent = text ?? '';\n };\n const cancel = () => {\n clearTimeout(timer);\n timer = undefined;\n };\n const run = async () => {\n const target = wanted;\n if (!target) return;\n const token = {};\n pending = token;\n const at = shared.revision();\n const side = sideOf(request);\n try {\n const bitmap = await shared.take(target.payload);\n if (gone || pending !== token || bitmap === null || shared.revision() !== at) return;\n shared.shots.set(side, { key: target.key, revision: at, bitmap, payload: target.payload });\n measure();\n } catch (err) {\n if (!gone && pending === token) say(`Capture failed: ${messageOf(err)}`);\n } finally {\n if (pending === token) pending = null;\n }\n };\n const schedule = () => {\n cancel();\n if (!started) {\n started = true;\n void run();\n return;\n }\n timer = setTimeout(() => {\n timer = undefined;\n void run();\n }, LENS_REST_MS);\n };\n const measure = () => {\n const aimed = aim(shared, request, doc);\n if ('reason' in aimed) {\n wanted = null;\n cancel();\n blank(canvas);\n say(aimed.reason);\n return;\n }\n const { hit, payload, key } = aimed;\n const shot = shared.shots.get(sideOf(request));\n if (fresh(shared, shot, key)) {\n wanted = { key, payload };\n cancel();\n say(null);\n paint(canvas, shot, hit.local, request);\n return;\n }\n // The last image stays up, and nothing is said over it, until the new one arrives.\n say(null);\n if (wanted?.key === key && pending !== null) return;\n wanted = { key, payload };\n schedule();\n };\n measure();\n return {\n measure,\n revised() {\n pending = null;\n wanted = null;\n blank(canvas);\n measure();\n },\n update(next) {\n request = next;\n measure();\n },\n detach() {\n gone = true;\n cancel();\n shared.shots.delete(sideOf(request));\n canvas.remove();\n empty.remove();\n onDetach();\n },\n };\n}\n","import './loupe.css';\nimport { type LensCapture, type LensSource, unavailableText } from '@weasel-js/labkit/loupe';\nimport { createEmitter } from '@weasel-js/registry';\nimport { createCaptureClient } from './captureClient';\nimport type { ForgeComparison } from './conditions';\nimport { aim, attachPixelsLens, fresh, type PayloadFor, type PixelsLens, type PixelsShared, type Shot, sideOf } from './pixelsLens';\n\n/** Why a capture is not given: the story was edited while it was being taken. */\nexport const STORY_CHANGED = 'the story changed while it was captured';\n\n/** The Pixels source, plus a way for its host to have every attached lens look again at what lies under it. */\nexport interface PixelsSource extends LensSource<ForgeComparison> {\n remeasure(): void;\n}\n\nexport interface PixelsSourceOptions {\n /** The dev server's base, under which its capture endpoint answers. */\n base: string;\n payloadFor: PayloadFor;\n fetch?: typeof fetch;\n /** The story edits so far; a capture taken at an older count is never shown. */\n revision: () => number;\n subscribeRevision: (fn: () => void) => () => void;\n}\n\n/**\n * A lens showing a real capture of the story under its reticle, taken by the dev server in headless Chromium at the\n * lens side's DPR and enlarged nearest-neighbor. Each lens side keeps its last image until a newer one arrives; an\n * edit to any story drops every one of them.\n */\nexport function createPixelsSource(opts: PixelsSourceOptions): PixelsSource {\n const client = createCaptureClient(opts.base, opts.fetch ?? ((input, init) => globalThis.fetch(input, init)));\n const shared: PixelsShared = { take: client.take, payloadFor: opts.payloadFor, revision: opts.revision, shots: new Map<string, Shot>() };\n const lenses = new Set<PixelsLens>();\n let unrevise: (() => void) | null = null;\n const remeasured = createEmitter<[]>();\n const revised = () => {\n shared.shots.clear();\n for (const lens of [...lenses]) lens.revised();\n };\n\n return {\n kind: 'pixels',\n produces: 'pixels',\n // A DPR comparison captures at its own DPR, as the payload does.\n label: ({ conditions, dpr }) => `Pixels ${(conditions?.kind === 'custom' ? conditions.dpr : undefined) ?? dpr}×`,\n status: client.status,\n // Also told whenever a capture may have gone stale, for a lens that captures without attaching, as Difference does.\n subscribe(listener) {\n const offs = [client.subscribe(listener), remeasured.subscribe(listener), opts.subscribeRevision(listener)];\n return () => {\n for (const off of offs) off();\n };\n },\n attach(slot, first) {\n client.poll();\n unrevise ??= opts.subscribeRevision(revised);\n const lens = attachPixelsLens(slot, first, shared, () => {\n lenses.delete(lens);\n if (lenses.size > 0) return;\n unrevise?.();\n unrevise = null;\n });\n lenses.add(lens);\n return lens;\n },\n async capture(request): Promise<LensCapture | { reason: string }> {\n const aimed = aim(shared, request, document);\n if ('reason' in aimed) return { reason: aimed.reason };\n const side = sideOf(request);\n let shot = shared.shots.get(side);\n if (!fresh(shared, shot, aimed.key)) {\n const at = opts.revision();\n const bitmap = await client.take(aimed.payload);\n if (bitmap === null) {\n const status = client.status();\n return { reason: unavailableText('pixels', status === true ? 'the capture was refused' : status) };\n }\n // The source tells its subscribers of the edit, and they ask again.\n if (opts.revision() !== at) return { reason: STORY_CHANGED };\n shot = { key: aimed.key, revision: at, bitmap, payload: aimed.payload };\n shared.shots.set(side, shot);\n }\n return { bitmap: shot.bitmap, dpr: aimed.payload.dpr, box: aimed.payload.box, at: aimed.hit.local };\n },\n remeasure() {\n for (const lens of [...lenses]) lens.measure();\n remeasured.emit();\n },\n };\n}\n","import { type RefObject, useContext, useEffect, useState } from 'react';\nimport { LoupeCaptureContext } from './captureContext';\nimport { trialPayload } from './capturePayload';\nimport type { LabConditions } from './conditions';\nimport { createPixelsSource, type PixelsSource } from './pixelsSource';\n\n/**\n * The workshop's Pixels source, capturing whichever trial lies under a lens as it renders against the lab now; null\n * where no dev server takes captures. Every attached lens looks again whenever a trial's inputs change.\n */\nexport function usePixelsSource(lab: RefObject<LabConditions>): PixelsSource | null {\n const capture = useContext(LoupeCaptureContext);\n const [source] = useState(() =>\n capture\n ? createPixelsSource({\n base: capture.base,\n payloadFor: (hit, dpr, c) => trialPayload(capture.trials.get(hit.trialId), lab.current, hit, dpr, c),\n revision: capture.revision.get,\n subscribeRevision: capture.revision.subscribe,\n })\n : null,\n );\n useEffect(() => (source && capture ? capture.trials.subscribe(() => source.remeasure()) : undefined), [source, capture]);\n return source;\n}\n","import './loupe.css';\nimport { effectivePose, type Op, type PoseHold, type RectPose, sceneToAdapter, useLatest, useVisibleRaf } from '@weasel-js/core';\nimport { useLabContext } from '@weasel-js/labkit';\nimport {\n addLensOps,\n BODY_SIZE,\n createLensScene,\n LensActions,\n type LensActionApi,\n type LensDescribeContext,\n LensOverlay,\n type LensScene,\n type LensSourceKind,\n type LensSources,\n lensesOf,\n lensIdsOf,\n type LoupePoint,\n MAX_LENSES,\n resolveSource,\n reticleAt,\n settingsOf,\n} from '@weasel-js/labkit/loupe';\nimport { KeymapHint } from '@weasel-js/ui/components/KeymapHint';\nimport { type RefObject, useCallback, useContext, useEffect, useMemo, useReducer, useRef, useState, useSyncExternalStore } from 'react';\nimport type { GlobalDeclarations } from '../globals';\nimport { StoryGlobalsContext } from '../StoryGlobalsContext';\nimport { CompareMenu, type CompareMenuRequest, compareChoices } from './CompareMenu';\nimport { describeLens, type ForgeComparison, type LabConditions, resolveComparison, resolveContextOf } from './conditions';\nimport { LiveLensesContext } from './liveLenses';\nimport { createLiveSource } from './liveSource';\nimport { renderReadouts } from './readouts';\nimport { trialAt } from './trialAt';\nimport { usePixelsSource } from './usePixelsSource';\n\n/** Props for `ForgeLoupe`. */\nexport interface ForgeLoupeProps {\n declarations: GlobalDeclarations;\n /** The global holding the color mode, which opposite mode flips. */\n modeGlobal: string;\n}\n\n/** Each new lens's body sits this far further along than the last, so lenses added in a row do not stack. */\nconst STAGGER = 24;\nconst OPPOSITE: ForgeComparison = { kind: 'opposite-mode' };\n\nconst clamp = (v: number, lo: number, hi: number) => Math.min(Math.max(v, lo), Math.max(lo, hi));\n\n/** A new body beside its reticle, in lab-body px, flipped left where the right has no room. */\nfunction bodyBeside(reticle: LoupePoint, box: DOMRect, n: number): LoupePoint {\n const half = BODY_SIZE / 2;\n const gap = BODY_SIZE * 0.75 + STAGGER * n;\n const x = reticle.x + gap + half > box.width ? reticle.x - gap : reticle.x + gap;\n return { x: clamp(x, half, box.width - half), y: clamp(reticle.y + STAGGER * n, half, box.height - half) };\n}\n\n/** A lens's reticle and body centers in client px, from the scene's lab-body px. */\nfunction lensClient(\n scene: LensScene<ForgeComparison>,\n lensId: string,\n body: HTMLElement | null,\n): { reticle: LoupePoint; body: LoupePoint } | null {\n const ids = lensIdsOf(scene, `${lensId}:body`);\n const reticle = ids ? scene.get(ids.reticle) : undefined;\n const lens = ids ? scene.get(ids.body) : undefined;\n if (!body || !reticle || !lens) return null;\n const box = body.getBoundingClientRect();\n const center = (p: RectPose) => ({ x: box.left + p.x + p.width / 2, y: box.top + p.y + p.height / 2 });\n return { reticle: center(effectivePose(scene, reticle)), body: center(effectivePose(scene, lens)) };\n}\n\n/**\n * The lens the lens actions act on, held in a ref so a chrome toggle's focus lands before its action reads it.\n * `LensOverlay` reports through `onFocusLens` both the chrome's focus and every selection the lens canvas makes.\n */\nexport function useLensFocus() {\n const focus = useRef<string | null>(null);\n const onFocusLens = useCallback((lensId: string | null) => {\n focus.current = lensId;\n }, []);\n return { focus, onFocusLens };\n}\n\n/** The lens API the actions drive, in client px at its edges and lab-body px in the scene. */\nexport function createApi(\n scene: LensScene<ForgeComparison>,\n refs: {\n body: RefObject<HTMLElement | null>;\n pointer: RefObject<LoupePoint | null>;\n focus: RefObject<string | null>;\n sources: RefObject<LensSources<ForgeComparison>>;\n /** Opens the compare menu on a lens. */\n compare?: RefObject<((lensId: string) => void) | null>;\n },\n): LensActionApi<ForgeComparison> {\n let next = 0;\n const holds = new Map<string, PoseHold<RectPose>>();\n const release = (lensId: string) => {\n holds.get(lensId)?.drop();\n holds.delete(lensId);\n };\n // An undo, a redo or a write from outside the actions can also take a lens out of Follow.\n scene.subscribe(() => {\n for (const lensId of [...holds.keys()]) if (settingsOf(scene, lensId)?.aim !== 'follow') release(lensId);\n });\n const toBody = (client: LoupePoint, box: DOMRect) => ({ x: client.x - box.left, y: client.y - box.top });\n const apply = (ops: readonly Op[]) => {\n if (ops.length > 0) sceneToAdapter(scene).applyOps([...ops], 'lens');\n };\n const current = () => {\n const focused = refs.focus.current;\n if (focused !== null && settingsOf(scene, focused)) return focused;\n return lensesOf(scene).at(-1)?.lensId ?? null;\n };\n return {\n scene,\n current,\n apply,\n add(at) {\n const body = refs.body.current;\n const count = lensesOf(scene).length;\n if (!body || count >= MAX_LENSES) return null;\n const box = body.getBoundingClientRect();\n const client = at ?? refs.pointer.current ?? { x: box.left + box.width / 2, y: box.top + box.height / 2 };\n const reticle = toBody(client, box);\n const lensId = `lens-${next++}`;\n apply(addLensOps(scene, lensId, { body: bodyBeside(reticle, box, count), reticle }));\n refs.focus.current = lensId;\n return lensId;\n },\n follow(client) {\n const lensId = current();\n const body = refs.body.current;\n if (lensId === null || !body) return;\n const pose = reticleAt(scene, lensId, toBody(client, body.getBoundingClientRect()));\n if (pose === null) return;\n const hold = holds.get(lensId) ?? scene.overrides.hold();\n holds.set(lensId, hold);\n hold.set([[`${lensId}:reticle` as never, pose]]);\n },\n unfollow: release,\n sourceAvailable: (kind: LensSourceKind) => refs.sources.current[kind]?.status() ?? 'not provided',\n openCompareMenu: (lensId) => refs.compare?.current?.(lensId),\n };\n}\n\n/** A source whose attached lenses can be told to look again at what lies under them. */\ninterface Remeasurable {\n remeasure(): void;\n}\n\n/** Has each source look again whenever what lies under a lens can change without a reticle moving. */\nexport function useRemeasure(sources: readonly Remeasurable[], body: HTMLElement | null, rerender: () => void) {\n const { trials, mode } = useLabContext();\n const labValues = useContext(StoryGlobalsContext);\n useEffect(() => {\n for (const source of sources) source.remeasure();\n }, [sources, trials, mode, labValues]);\n useEffect(() => {\n if (sources.length === 0 || !body) return;\n const remeasure = () => {\n for (const source of sources) source.remeasure();\n };\n // A resize can move the lab body, and with it every reticle's client point, which only a render recomputes.\n const resize = () => {\n rerender();\n remeasure();\n };\n body.addEventListener('scroll', remeasure, { capture: true, passive: true });\n window.addEventListener('resize', resize);\n // A host takes no pointer while `data-pending`, so a hit test skips it; a new story's host is only found once that\n // attribute goes, after the trials have already changed.\n const unveiled = typeof MutationObserver === 'undefined' ? null : new MutationObserver(remeasure);\n unveiled?.observe(body, { subtree: true, attributes: true, attributeFilter: ['data-pending'] });\n return () => {\n body.removeEventListener('scroll', remeasure, { capture: true });\n window.removeEventListener('resize', resize);\n unveiled?.disconnect();\n };\n }, [sources, body, rerender]);\n}\n\n/** Runs the last function handed to it on the next visible frame, once however many arrive before then. */\nfunction useFrameSchedule(): (run: () => void) => void {\n const next = useRef<(() => void) | null>(null);\n const frame = useVisibleRaf(() => {\n const run = next.current;\n next.current = null;\n run?.();\n });\n return useCallback(\n (run: () => void) => {\n next.current = run;\n frame.request();\n },\n [frame],\n );\n}\n\n/**\n * The workshop's lenses: the lens canvas over the lab, its actions in the Loupe keymap, the hint for that keymap, a\n * Live source rendering a second copy of whichever story sits under each reticle, and a Pixels source showing a real\n * capture of it. Lenses last as long as the workshop does and are never stored.\n */\nexport function ForgeLoupe({ declarations, modeGlobal }: ForgeLoupeProps) {\n const lenses = useContext(LiveLensesContext);\n const labValues = useContext(StoryGlobalsContext);\n const { mode, trials, instruments } = useLabContext();\n const [scene] = useState(createLensScene<ForgeComparison>);\n const [body, setBody] = useState<HTMLElement | null>(null);\n const bodyRef = useRef<HTMLElement | null>(null);\n const pointer = useRef<LoupePoint | null>(null);\n const { focus, onFocusLens } = useLensFocus();\n const conditions = useLatest<LabConditions>({ labValues, mode, declarations, modeGlobal });\n const onFrame = useFrameSchedule();\n const [live] = useState(() =>\n lenses\n ? createLiveSource(\n lenses,\n resolveComparison,\n () => ({ base: conditions.current.labValues, ctx: resolveContextOf(conditions.current) }),\n onFrame,\n )\n : null,\n );\n const pixels = usePixelsSource(conditions);\n const sources = useMemo<LensSources<ForgeComparison>>(\n () => ({ ...(live ? { live } : {}), ...(pixels ? { pixels } : {}) }),\n [live, pixels],\n );\n const remeasured = useMemo(() => [live, pixels].filter((s) => s !== null), [live, pixels]);\n const sourcesRef = useLatest(sources);\n const [menu, setMenu] = useState<CompareMenuRequest | null>(null);\n // The menu offers the args of the story under the lens's reticle, as it is when the menu opens.\n const compare = useLatest((lensId: string) => {\n const at = lensClient(scene, lensId, bodyRef.current);\n if (!at) return;\n const trialId = trialAt(at.reticle)?.trialId;\n const name = trials.find((t) => t.id === trialId)?.instrumentName;\n const schema = instruments.find((i) => i.name === name)?.config ?? null;\n const settings = settingsOf(scene, lensId);\n // Difference compares two Pixels captures whatever the lens's source.\n const pixels =\n settings !== null &&\n (settings.view === 'difference' || resolveSource(settings.source, sourcesRef.current).source?.kind === 'pixels');\n const choices = compareChoices(declarations, schema);\n setMenu((last) => ({ seq: (last?.seq ?? 0) + 1, client: at.body, lensId, pixels, choices }));\n });\n const [api] = useState(() => createApi(scene, { body: bodyRef, pointer, focus, sources: sourcesRef, compare }));\n // Named against the trial under the reticle, whose pins the lens renders under.\n const describe = useCallback(\n (c: ForgeComparison, at: LensDescribeContext) => {\n const trialId = trialAt(at.reticle)?.trialId;\n const config = trials.find((t) => t.id === trialId)?.config;\n return describeLens(c, { labValues, mode, declarations, modeGlobal }, config, at.source === 'pixels');\n },\n [declarations, labValues, mode, modeGlobal, trials],\n );\n const [, rerender] = useReducer((n: number) => n + 1, 0);\n // A Follow reticle moves through the scene's overrides, which bump no version; the lenses re-read it on a render.\n useSyncExternalStore(scene.overrides.subscribe, scene.overrides.getGeneration);\n useRemeasure(remeasured, body, rerender);\n\n useEffect(() => {\n if (!body) return;\n const track = (e: PointerEvent) => {\n pointer.current = { x: e.clientX, y: e.clientY };\n };\n body.addEventListener('pointermove', track, { passive: true });\n return () => body.removeEventListener('pointermove', track);\n }, [body]);\n\n // An overlay contribution renders inside the lab body, which is what this finds; the marker itself shows nothing.\n const attachMarker = useCallback((el: HTMLElement | null) => {\n const found = el?.closest<HTMLElement>('.lk-lab__body') ?? null;\n bodyRef.current = found;\n setBody(found);\n }, []);\n const opposite = useCallback(() => OPPOSITE, []);\n\n return (\n <>\n <span hidden ref={attachMarker} />\n <LensOverlay scene={scene} sources={sources} describe={describe} renderReadouts={renderReadouts} onFocusLens={onFocusLens} />\n <LensActions api={api} bodyRef={bodyRef} opposite={opposite} />\n <CompareMenu api={api} request={menu} />\n <KeymapHint className=\"fg-loupe-hint\" />\n </>\n );\n}\n","import type { TrialRecord } from '@weasel-js/labkit';\n\n/** The trial the URL's params belong to: the focused trial when it shows `route`, else the first that does. */\nexport function routedTrial<T extends Pick<TrialRecord, 'id' | 'instrumentName'>>(\n trials: readonly T[],\n focusedTrialId: string | null,\n route: string,\n): T | undefined {\n return (\n trials.find((t) => t.id === focusedTrialId && t.instrumentName === route) ??\n trials.find((t) => t.instrumentName === route)\n );\n}\n","import { useLabContext } from '@weasel-js/labkit';\nimport { type RefObject, useEffect, useRef } from 'react';\nimport { routedTrial } from '../shell/routedTrial';\nimport { readRoute, useRoute } from '../shell/useRoute';\nimport { readPlayheadParam, writePlayheadParam } from './playheadUrl';\nimport { useTrialClock } from './trialClocks';\n\ninterface PlayheadSyncProps {\n trialId: string;\n route: string;\n /** The route whose opening `t` has been applied, so a trial taking the URL over later does not adopt another's. */\n appliedRef: RefObject<string | null>;\n}\n\n/** Ties one trial's clock to the URL's `t`. */\nfunction PlayheadSync({ trialId, route, appliedRef }: PlayheadSyncProps) {\n const clock = useTrialClock(trialId);\n useEffect(() => {\n if (!clock) return;\n const fromUrl = (): void => {\n const t = readPlayheadParam();\n if (t === null || t === clock.get().time) return;\n clock.request(t);\n };\n // Paused off the span's start, the URL holds the time; playing or at the start, it holds none. While the span\n // cannot hold a requested time yet, the URL keeps the request rather than the clamped stand-in.\n let held: number | null | undefined;\n const toUrl = (): void => {\n if (clock.pending() !== null) return;\n const { playing, time, span } = clock.get();\n const next = playing || time === span.start ? null : time;\n if (next === held) return;\n held = next;\n writePlayheadParam(next);\n };\n if (appliedRef.current !== route) {\n appliedRef.current = route;\n fromUrl();\n }\n toUrl();\n const off = clock.subscribe(toUrl);\n const onHashChange = (): void => {\n // A hash naming another story belongs to the trial that takes over; this one is about to unmount.\n if (readRoute() !== route) return;\n held = undefined;\n fromUrl();\n toUrl();\n };\n window.addEventListener('hashchange', onHashChange);\n return () => {\n off();\n window.removeEventListener('hashchange', onHashChange);\n };\n }, [clock, route, appliedRef]);\n return null;\n}\n\n/**\n * Holds the playhead of the trial showing the routed story in the URL's `t`, by the rule the knobs follow: the\n * focused trial when it shows that story, else the first that does. No other trial's clock touches the URL.\n */\nexport function RoutePlayhead() {\n const lab = useLabContext();\n const [route] = useRoute();\n const applied = useRef<string | null>(null);\n const trial = route === null ? undefined : routedTrial(lab.trials, lab.focusedTrialId, route);\n if (!trial || route === null) return null;\n return <PlayheadSync key={`${trial.id} ${route}`} trialId={trial.id} route={route} appliedRef={applied} />;\n}\n","import { Select, useLabContext, usePersistedState } from '@weasel-js/labkit';\nimport type { IconRef } from '@weasel-js/icons';\nimport { Button } from '@weasel-js/ui/components/Button';\nimport { Callout } from '@weasel-js/ui/components/Callout';\nimport { Icon } from '@weasel-js/ui/components/Icon';\nimport { icon as glyph } from '../icons.gen';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type { Globals } from '../protocol/messages';\nimport { followApp, type GlobalDeclaration, type GlobalDeclarations, labGlobals, labOptions } from './globals';\n\nconst RECORD = 'fg-globals';\n\n/** The lab's global values, as persisted in the lab, and a setter for one. */\nexport function useLabGlobals(declarations: GlobalDeclarations): [Globals, (key: string, value: string) => void] {\n const [stored, setStored] = usePersistedState<unknown>(RECORD, null, { scope: 'lab' });\n const values = useMemo(() => labGlobals(declarations, stored), [declarations, stored]);\n const set = useCallback(\n (key: string, value: string) => setStored((prev: unknown) => ({ ...labGlobals(declarations, prev), [key]: value })),\n [declarations, setStored],\n );\n return [values, set];\n}\n\ninterface GlobalSelectProps {\n name: string;\n declaration: GlobalDeclaration;\n values: Globals;\n set: (key: string, value: string) => void;\n labeled?: boolean;\n}\n\nfunction GlobalSelect({ name, declaration, values, set, labeled = false }: GlobalSelectProps) {\n return (\n <Select\n {...(labeled ? { label: declaration.label } : { 'aria-label': declaration.label })}\n width={labeled ? 'fill' : 'fit'}\n selectedKey={String(values[name])}\n onSelectionChange={(value) => set(name, value)}\n options={labOptions(declaration, values)}\n />\n );\n}\n\n/**\n * The lab's header control for its global values: one select per declaration, then, at the end, a button for each\n * declaration that others are declared `under`, opening those others in a popover.\n */\nexport function GlobalsToolbar({ declarations }: { declarations: GlobalDeclarations }) {\n const [values, set] = useLabGlobals(declarations);\n const entries = Object.entries(declarations);\n const top = entries.filter(([, declaration]) => declaration.under === undefined);\n return (\n <div className=\"fg-globals\" role=\"toolbar\" aria-label=\"Globals\">\n {top.map(([key, declaration]) => (\n <div key={key} className=\"fg-globals__item\">\n <GlobalSelect name={key} declaration={declaration} values={values} set={set} />\n </div>\n ))}\n {top.map(([key, declaration]) => {\n const nested = entries.filter(([, other]) => other.under === key);\n return nested.length > 0 ? (\n <NestedGlobals\n key={key}\n label={declaration.label}\n icon={declaration.icon ?? /* @icon */ 'core:tune'}\n nested={nested}\n values={values}\n set={set}\n />\n ) : null;\n })}\n </div>\n );\n}\n\nfunction NestedGlobals({\n label,\n icon,\n nested,\n values,\n set,\n}: {\n label: string;\n icon: IconRef;\n nested: readonly [string, GlobalDeclaration][];\n values: Globals;\n set: (key: string, value: string) => void;\n}) {\n const anchor = useRef<HTMLButtonElement>(null);\n const [open, setOpen] = useState(false);\n return (\n <>\n <Button\n ref={anchor}\n variant=\"ghost\"\n size=\"sm\"\n iconOnly\n ariaLabel={`More ${label} settings`}\n pressed={open}\n onClick={() => setOpen((was) => !was)}\n >\n <Icon name={icon} size={16} />\n </Button>\n <Callout\n triggerRef={anchor}\n isOpen={open}\n onOpenChange={setOpen}\n placement=\"bottom end\"\n showCloseButton={false}\n title={label}\n className=\"fg-globals__popover\"\n >\n {nested.map(([key, declaration]) => (\n <GlobalSelect key={key} name={key} declaration={declaration} values={values} set={set} labeled />\n ))}\n </Callout>\n </>\n );\n}\n\n/**\n * Reports the lab's global values, as the toolbar persists them and with each `App` resolved against the lab's own\n * chrome, to `onChange`. Renders nothing; mount it inside the lab.\n */\nexport function LabGlobals({\n declarations,\n onChange,\n}: {\n declarations: GlobalDeclarations;\n onChange: (values: Globals) => void;\n}) {\n const [values] = useLabGlobals(declarations);\n const { mode } = useLabContext();\n const resolved = useMemo(() => followApp(declarations, values, { mode }), [declarations, values, mode]);\n useEffect(() => onChange(resolved), [resolved, onChange]);\n return null;\n}\n","import type { LabMenus } from '@weasel-js/labkit';\nimport { type PrefGroup, pref } from '@weasel-js/prefs';\nimport { useEffect, useMemo } from 'react';\nimport type { Globals } from '../protocol/messages';\nimport { type GlobalDeclarations, labOptions } from './globals';\nimport { useLabGlobals } from './GlobalsToolbar';\n\nconst leafPath = (n: number) => `globals.d${n}.v`;\n\n/**\n * The lab menu bar's Globals menu at `values`: a submenu per declaration holding one enum of the options the\n * header's select offers. `undefined` when nothing is declared.\n */\nexport function globalsMenu(\n declarations: GlobalDeclarations,\n values: Globals,\n set: (key: string, value: string) => void,\n): LabMenus | undefined {\n const entries = Object.entries(declarations);\n if (entries.length === 0) return undefined;\n const submenus: Record<string, PrefGroup> = {};\n const current: Record<string, unknown> = {};\n const keys = new Map<string, string>();\n entries.forEach(([key, declaration], n) => {\n const options = labOptions(declaration, values);\n submenus[`d${n}`] = pref.group(\n declaration.label,\n { v: pref.enum(declaration.label, declaration.default, options) },\n { as: 'menu' },\n );\n current[leafPath(n)] = values[key];\n keys.set(leafPath(n), key);\n });\n return {\n schema: pref.group('', { globals: pref.group('Globals', submenus, { as: 'menu' }) }),\n values: current,\n onChange: (path, value) => {\n const key = keys.get(path);\n if (key !== undefined && typeof value === 'string') set(key, value);\n },\n };\n}\n\n/**\n * Reports the lab's Globals menu to `onMenus` as the lab's values change. Renders nothing; mount it inside the\n * lab, since the values live there.\n */\nexport function GlobalsMenus({\n declarations,\n onMenus,\n}: {\n declarations: GlobalDeclarations;\n onMenus: (menus: LabMenus | undefined) => void;\n}) {\n const [values, set] = useLabGlobals(declarations);\n const menus = useMemo(() => globalsMenu(declarations, values, set), [declarations, values, set]);\n useEffect(() => onMenus(menus), [menus, onMenus]);\n return null;\n}\n","import { type InstrumentList, TrialIdContext, useLabContext, useTrialState } from '@weasel-js/labkit';\nimport { type ConfigSchema, valueAtPath } from '@weasel-js/labkit/config';\nimport { useEffect, useRef, useState } from 'react';\nimport { knobPaths, knobsToParams, paramsToKnobs, reservedParams, sameKnob } from '../route/url';\nimport { routedTrial } from './routedTrial';\nimport { readRouteParams, replaceRouteParams, takeRouteFromTrial, useRoute } from './useRoute';\n\ninterface KnobSyncProps {\n schema: ConfigSchema<unknown>;\n config: unknown;\n}\n\n/**\n * Keeps one trial's knobs and the URL in step. On mount, and whenever the hash changes under it, the URL's knobs are\n * written over the trial's config, with every leaf the URL could name and does not set returned to its default; after\n * that each change to the config is written back to the URL in place. A route written for this trial as it stood\n * skips that first read.\n */\nfunction KnobSync({ schema, config }: KnobSyncProps) {\n const { setConfig } = useTrialState();\n const reading = useRef(true);\n const [typed, setTyped] = useState(0);\n\n useEffect(() => {\n const onHashChange = (): void => {\n reading.current = true;\n setTyped((n) => n + 1);\n };\n window.addEventListener('hashchange', onHashChange);\n return () => window.removeEventListener('hashchange', onHashChange);\n }, []);\n\n useEffect(() => {\n if (reading.current && takeRouteFromTrial()) reading.current = false;\n if (reading.current) {\n reading.current = false;\n const knobs = paramsToKnobs(schema, readRouteParams());\n let wrote = false;\n for (const { path, leaf } of knobPaths(schema)) {\n const target = path in knobs ? knobs[path] : leaf.default;\n const current = valueAtPath(config, path);\n if (sameKnob(current === undefined ? leaf.default : current, target)) continue;\n setConfig(path as never, target as never);\n wrote = true;\n }\n // The write comes back as a config change, which runs this again to put it in the URL.\n if (wrote) return;\n }\n const knobs = knobsToParams(schema, config);\n replaceRouteParams((params) => ({ ...knobs, ...reservedParams(params) }));\n }, [schema, config, setConfig, typed]);\n\n return null;\n}\n\n/**\n * Ties the knobs of the trial showing the routed story to the URL's params: the focused trial when it shows that\n * story, else the first that does. Waits for the story's schema, since a provisional instrument has no leaves to\n * read the URL against and would otherwise wipe its knobs.\n */\nexport function RouteKnobs({ instruments, isReady }: { instruments: InstrumentList; isReady: (id: string) => boolean }) {\n const lab = useLabContext();\n const [route] = useRoute();\n if (route === null || !isReady(route)) return null;\n const trial = routedTrial(lab.trials, lab.focusedTrialId, route);\n const schema = instruments.find((instrument) => instrument.name === route)?.config;\n if (!trial || !schema) return null;\n return (\n <TrialIdContext.Provider value={trial.id}>\n <KnobSync key={`${trial.id} ${route}`} schema={schema as ConfigSchema<unknown>} config={trial.config} />\n </TrialIdContext.Provider>\n );\n}\n","const FLASH_MS = 600;\nconst flashes = new WeakMap<Element, ReturnType<typeof setTimeout>>();\n\n/** Scrolls a trial into view and flashes its outline. False when no trial has that id. */\nexport function revealTrial(trialId: string, root: ParentNode = document): boolean {\n const trial = root.querySelector<HTMLElement>(`.lk-trial[data-trial-id=\"${CSS.escape(trialId)}\"]`);\n if (!trial) return false;\n trial.scrollIntoView({ block: 'nearest' });\n clearTimeout(flashes.get(trial));\n trial.classList.remove('fg-flash');\n // Reading layout between the remove and the add restarts the animation on a second reveal.\n void trial.offsetWidth;\n trial.classList.add('fg-flash');\n flashes.set(\n trial,\n setTimeout(() => {\n trial.classList.remove('fg-flash');\n flashes.delete(trial);\n }, FLASH_MS),\n );\n return true;\n}\n","import { indexEntries } from '../../story/indexPages';\nimport { restatesTitle } from '../breadcrumb';\nimport { isGallery } from '../../story/tags';\nimport type { IndexEntry } from '../../story/types';\n\nexport type TreeNode =\n | { kind: 'folder'; label: string; path: string; children: TreeNode[]; tag?: string; index?: IndexEntry }\n | { kind: 'story'; entry: IndexEntry; tag?: string; label?: string };\n\ntype Folder = Extract<TreeNode, { kind: 'folder' }>;\n\nfunction sortFolder(nodes: TreeNode[]): TreeNode[] {\n const folders = nodes.filter((n): n is Folder => n.kind === 'folder');\n folders.sort((a, b) => a.label.localeCompare(b.label));\n for (const folder of folders) folder.children = sortFolder(folder.children);\n return [...folders, ...nodes.filter((n) => n.kind === 'story')];\n}\n\n/**\n * `nodes` with every folder that holds nothing but a gallery replaced by that gallery under the folder's name, so a\n * gallery titled `ui/Cursors/Gallery` lists as `Cursors` with its stories directly beneath it. The gallery keeps its\n * own path and index page, so its route and story ids are unchanged.\n */\nexport function foldGalleries(nodes: TreeNode[]): TreeNode[] {\n return nodes.map((node) => {\n if (node.kind !== 'folder') return node;\n const children = foldGalleries(node.children);\n const [only] = children;\n // Only a gallery one segment down: one already folded would carry this folder off and lose its name.\n if (\n !node.index\n && children.length === 1\n && only?.kind === 'folder'\n && only.path === `${node.path}/${only.label}`\n && only.index\n && isGallery(only.index)\n ) {\n return { ...only, label: node.label, tag: node.tag ?? only.tag };\n }\n return { ...node, children };\n });\n}\n\n/**\n * `nodes` with every component holding one story, whose name only restates the component's, replaced by that story\n * under the component's name: a file titled `…/KeyDiagram` exporting `KeyDiagram` lists once, not twice.\n */\nexport function hoistLoneStories(nodes: TreeNode[]): TreeNode[] {\n return nodes.map((node) => {\n if (node.kind !== 'folder') return node;\n const [only] = node.children;\n if (node.children.length === 1 && only?.kind === 'story' && restatesTitle(node.path, only.entry.name)) {\n return { kind: 'story', entry: only.entry, label: node.label, tag: node.tag ?? only.tag };\n }\n return { ...node, children: hoistLoneStories(node.children) };\n });\n}\n\n/**\n * Story titles as nested folders, split on `/`; the last segment is the component, which carries its index page and\n * holds its subfolders, then its stories.\n */\nexport function buildTree(index: readonly IndexEntry[]): TreeNode[] {\n const root: TreeNode[] = [];\n const folders = new Map<string, Folder>();\n const pages = new Map(indexEntries(index).map((page) => [page.title, page]));\n for (const entry of index) {\n let siblings = root;\n let path = '';\n for (const label of entry.title.split('/')) {\n path = path ? `${path}/${label}` : label;\n let folder = folders.get(path);\n if (!folder) {\n const page = pages.get(path);\n folder = { kind: 'folder', label, path, children: [], ...(page ? { index: page } : {}) };\n folders.set(path, folder);\n siblings.push(folder);\n }\n siblings = folder.children;\n }\n siblings.push({ kind: 'story', entry });\n }\n return hoistLoneStories(sortFolder(root));\n}\n\n/**\n * The stories whose `title/name` contains `query`, ignoring case, with their ancestors. A folder keeps its index\n * page only when its own path matches.\n */\nexport function filterTree(nodes: TreeNode[], query: string): TreeNode[] {\n const needle = query.trim().toLowerCase();\n if (!needle) return nodes;\n const walk = (list: TreeNode[]): TreeNode[] =>\n list.flatMap((node): TreeNode[] => {\n if (node.kind === 'story') {\n return `${node.entry.title}/${node.entry.name}`.toLowerCase().includes(needle) ? [node] : [];\n }\n const children = walk(node.children);\n if (children.length === 0) return [];\n const { index: page, ...folder } = node;\n return [page && node.path.toLowerCase().includes(needle) ? { ...folder, children, index: page } : { ...folder, children }];\n });\n return walk(nodes);\n}\n","import { indexEntries } from '../../story/indexPages';\nimport type { Libraries } from '../../story/library';\nimport type { IndexEntry } from '../../story/types';\nimport { foldGalleries, hoistLoneStories, type TreeNode } from './buildTree';\n\ntype Folder = Extract<TreeNode, { kind: 'folder' }>;\n\n/** One component — a story title — with the stories declared under it. */\nexport interface ComponentRow {\n /** The full story title, unique per component and used as the row key. */\n path: string;\n /** The title's last segment: the component's own name. */\n label: string;\n /** Which library it ships in. */\n library: string;\n /** The component's index page; absent when a filter kept the row only for some of its stories. */\n index?: IndexEntry;\n entries: IndexEntry[];\n}\n\n/** Every component in the index as one flat, alphabetical list. Components\n * sharing a name are kept apart by their library, then by their full title. */\nexport function buildComponents(index: readonly IndexEntry[], libraries: Libraries): ComponentRow[] {\n const byTitle = new Map<string, ComponentRow>();\n const pages = new Map(indexEntries(index).map((page) => [page.title, page]));\n for (const entry of index) {\n let row = byTitle.get(entry.title);\n if (!row) {\n const segments = entry.title.split('/');\n row = {\n path: entry.title,\n label: segments[segments.length - 1],\n library: libraries.of(entry),\n index: pages.get(entry.title),\n entries: [],\n };\n byTitle.set(entry.title, row);\n }\n row.entries.push(entry);\n }\n const rows = [...byTitle.values()];\n disambiguate(rows);\n return rows.sort(\n (a, b) =>\n a.label.localeCompare(b.label)\n || a.library.localeCompare(b.library)\n || a.path.localeCompare(b.path),\n );\n}\n\n/**\n * Widen each label leftward until it tells its row apart from the others in\n * its library.\n * `ui/Cursors/Gallery` and `ui/Icons/Gallery` are two different\n * components whose last segments agree, and a flat list that prints both as\n * `Gallery` is unusable — the grouping that used to separate them is the very\n * thing this view removes.\n */\nfunction disambiguate(rows: readonly ComponentRow[]): void {\n // Rows in different libraries are already told apart by their tag.\n const byLabel = new Map<string, ComponentRow[]>();\n for (const row of rows) {\n const key = `${row.library}\\0${row.label}`;\n const group = byLabel.get(key);\n if (group) group.push(row);\n else byLabel.set(key, [row]);\n }\n for (const group of byLabel.values()) {\n if (group.length < 2) continue;\n for (const row of group) {\n const segments = row.path.split('/');\n // One more segment at a time, stopping at the full title.\n for (let take = 2; take <= segments.length; take++) {\n row.label = segments.slice(-take).join('/');\n if (group.every((other) => other === row || !other.path.endsWith(`/${row.label}`))) break;\n }\n }\n }\n}\n\n/** The components whose name, library or story names contain `query`,\n * ignoring case. A matching component keeps its index page and all its\n * stories; a component matching only through one story keeps just the\n * stories that matched. */\nexport function filterComponents(rows: readonly ComponentRow[], query: string): ComponentRow[] {\n const needle = query.trim().toLowerCase();\n if (!needle) return [...rows];\n const out: ComponentRow[] = [];\n for (const row of rows) {\n if (`${row.path}/${row.library}`.toLowerCase().includes(needle)) {\n out.push(row);\n continue;\n }\n const entries = row.entries.filter((entry) => entry.name.toLowerCase().includes(needle));\n if (entries.length > 0) out.push({ path: row.path, label: row.label, library: row.library, entries });\n }\n return out;\n}\n\n/** The row whose title `row`'s extends, in its library: the longest such, so a page of a page nests under it. */\nfunction parentOf(row: ComponentRow, byPath: ReadonlyMap<string, ComponentRow>): ComponentRow | undefined {\n const segments = row.path.split('/');\n for (let take = segments.length - 1; take > 0; take--) {\n const parent = byPath.get(segments.slice(0, take).join('/'));\n if (parent && parent.library === row.library) return parent;\n }\n return undefined;\n}\n\n/**\n * The component list as tree nodes, so the sidebar renders and navigates both\n * views with one code path. A slash in a label is a directory: `Icons/Gallery`\n * is a `Gallery` folder inside an `Icons` folder, which it shares with any\n * other row of its library widened to the same prefix. Every component is a\n * folder carrying its index page and holding its stories. A component whose\n * title extends another's, `Prefs/PrefsForm` beside `Prefs`, is a folder inside\n * that one, ahead of its stories as in the tree. A folder a gallery's label opened,\n * holding only that gallery, is folded into it. A component whose one story restates its\n * name is that story.\n */\nexport function componentNodes(rows: readonly ComponentRow[]): TreeNode[] {\n const root: TreeNode[] = [];\n const folders = new Map<string, Folder>();\n const byPath = new Map(rows.map((row) => [row.path, row]));\n const nodes = new Map<string, Folder>();\n const subs = new Map<string, TreeNode[]>();\n for (const row of rows) subs.set(row.path, []);\n for (const row of rows) {\n const parent = parentOf(row, byPath);\n const title = row.path.split('/');\n const labels = parent ? title.slice(parent.path.split('/').length) : row.label.split('/');\n let siblings = parent ? subs.get(parent.path)! : root;\n let tag: string | undefined = parent ? undefined : row.library;\n for (let i = 0; i < labels.length - 1; i++) {\n const path = title.slice(0, title.length - labels.length + i + 1).join('/');\n let folder = folders.get(path);\n if (!folder) {\n folder = { kind: 'folder', label: labels[i], path, tag, children: [] };\n folders.set(path, folder);\n siblings.push(folder);\n }\n siblings = folder.children;\n tag = undefined;\n }\n const node: Folder = {\n kind: 'folder',\n label: labels[labels.length - 1],\n path: row.path,\n tag,\n ...(row.index ? { index: row.index } : {}),\n children: [],\n };\n nodes.set(row.path, node);\n siblings.push(node);\n }\n for (const row of rows) {\n nodes.get(row.path)!.children = [\n ...subs.get(row.path)!,\n ...row.entries.map((entry) => ({ kind: 'story', entry }) as const),\n ];\n }\n return hoistLoneStories(foldGalleries(root));\n}\n\n/** Every library present in `index`, alphabetically. */\nexport function librariesIn(index: readonly IndexEntry[], libraries: Libraries): string[] {\n return [...new Set(index.map(libraries.of))].sort((a, b) => a.localeCompare(b));\n}\n","import { type LabChromeContext, usePersistedState } from '@weasel-js/labkit';\nimport { Checkbox } from '@weasel-js/ui/components/Checkbox';\nimport { DisclosureMark } from '@weasel-js/ui/components/Disclosure';\nimport { ToggleBar, type ToggleBarItem } from '@weasel-js/ui/components/ToggleBar';\nimport { type FocusEvent, type KeyboardEvent, type ReactNode, useContext, useEffect, useId, useMemo, useRef, useState } from 'react';\nimport { indexEntries } from '../../story/indexPages';\nimport { isGallery, isLab } from '../../story/tags';\nimport type { IndexEntry } from '../../story/types';\nimport { revealTrial } from '../revealTrial';\nimport { onRevealInTree } from '../treeReveal';\nimport { useRoute } from '../useRoute';\nimport { buildTree, filterTree, type TreeNode } from './buildTree';\nimport { buildComponents, componentNodes, filterComponents, librariesIn } from './buildComponents';\nimport { LibrariesContext } from '../../story/library';\nimport { LabBadge } from '../../frame/index/LabBadge';\nimport { LibraryBadge as PackageBadge } from '../../frame/index/LibraryBadge';\n\n/** Which shape the sidebar lists the index in. */\ntype View = 'tree' | 'components' | 'gallery';\n\nconst VIEWS: readonly ToggleBarItem<View>[] = [\n { value: 'tree', label: 'Tree' },\n { value: 'components', label: 'Components' },\n { value: 'gallery', label: 'Gallery' },\n];\n\nexport interface StoryTreeProps {\n ctx: LabChromeContext;\n index: readonly IndexEntry[];\n}\n\ninterface Row {\n key: string;\n node: TreeNode;\n parent: string | null;\n}\n\nconst keyOf = (node: TreeNode): string => (node.kind === 'folder' ? `folder:${node.path}` : `story:${node.entry.id}`);\n\n/** The folder paths above a story's component, and the component's own. */\nfunction ancestorsOf(entry: IndexEntry | undefined): Set<string> {\n const paths = new Set<string>();\n if (!entry) return paths;\n let path = '';\n for (const label of entry.title.split('/')) {\n path = path ? `${path}/${label}` : label;\n paths.add(path);\n }\n return paths;\n}\n\n/** A component's package, as the sidebar tags its rows. */\nfunction LibraryBadge({ library }: { library: string }) {\n return <PackageBadge library={library} className=\"fg-tree__tag\" />;\n}\n\n/** What follows a row's label: a Lab badge on a whole screen, then the package. */\nfunction RowTags({ lab, library }: { lab: boolean; library: string | undefined }) {\n return (\n <>\n {lab ? <LabBadge className=\"fg-tree__lab\" /> : null}\n {library ? <LibraryBadge library={library} /> : null}\n </>\n );\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 [chosen, setView] = usePersistedState<View>('fg-tree-view', 'components', { scope: 'lab' });\n // Stored as what is *off*, so a library added later is on without anyone\n // going back to tick it.\n const [hidden, setHidden] = usePersistedState<Record<string, boolean>>('fg-tree-libraries', {}, { scope: 'lab' });\n const [focusKey, setFocusKey] = useState<string | null>(null);\n const items = useRef(new Map<string, HTMLElement>());\n\n const table = useContext(LibrariesContext);\n const libraries = useMemo(() => librariesIn(index, table), [index, table]);\n // A view is grayed out by what the project has, not by the package filter,\n // which would otherwise disable a view as a side effect of unticking a box.\n const views = useMemo(() => {\n const hasGallery = index.some(isGallery);\n const hasOther = index.some((entry) => !isGallery(entry));\n return VIEWS.map((item) => ({ ...item, disabled: item.value === 'gallery' ? !hasGallery : !hasOther }));\n }, [index]);\n // The stored choice is kept, so a view comes back once it has something in it.\n const enabled = (value: View): boolean => views.some((item) => item.value === value && !item.disabled);\n const view = [chosen, 'components' as const, 'gallery' as const].find(enabled) ?? chosen;\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[table.of(entry)]), [index, hidden, table]);\n // Galleries list only in their own view, grouped the way Components groups.\n const [galleryEntries, rest] = useMemo(() => {\n const yes: IndexEntry[] = [];\n const no: IndexEntry[] = [];\n for (const entry of kept) (isGallery(entry) ? yes : no).push(entry);\n return [yes, no];\n }, [kept]);\n const tree = useMemo(() => buildTree(rest), [rest]);\n const components = useMemo(() => buildComponents(rest, table), [rest, table]);\n const galleries = useMemo(() => buildComponents(galleryEntries, table), [galleryEntries, table]);\n const shown = useMemo(\n () =>\n view === 'tree'\n ? filterTree(tree, query)\n : componentNodes(filterComponents(view === 'gallery' ? galleries : components, query)),\n [view, components, galleries, tree, query],\n );\n const routable = useMemo(() => [...kept, ...indexEntries(kept)], [kept]);\n const routed = routable.find((entry) => entry.id === route);\n const routeAncestors = useMemo(() => ancestorsOf(routed), [routed]);\n const filtering = query.trim() !== '';\n const isOpen = (path: string): boolean =>\n filtering || (folds[path] ?? routeAncestors.has(path));\n\n const rows: Row[] = [];\n const collect = (nodes: readonly TreeNode[], parent: string | null): void => {\n for (const node of nodes) {\n rows.push({ key: keyOf(node), node, parent });\n if (node.kind === 'folder' && isOpen(node.path)) collect(node.children, keyOf(node));\n }\n };\n collect(shown, null);\n const active = rows.some((row) => row.key === focusKey) ? focusKey : (rows[0]?.key ?? null);\n\n const openIds = new Set(ctx.trials.map((trial) => trial.instrumentName));\n\n // A filter forces every folder open, so a toggle then would change state nobody can see.\n const setOpen = (path: string, open: boolean): void => {\n if (!filtering) setFolds((prev) => ({ ...prev, [path]: open }));\n };\n\n const moveTo = (key: string | undefined): void => {\n if (key === undefined) return;\n setFocusKey(key);\n items.current.get(key)?.focus();\n };\n\n const activate = (entry: IndexEntry, another: boolean): void => {\n const focused = ctx.trials.find((trial) => trial.id === ctx.focusedTrialId);\n if (another || !focused) ctx.addTrial(entry.id);\n else if (focused.instrumentName === entry.id) {\n // The URL may name another story, or none; the trial's knobs stand, or the route would read as \"no knobs set\".\n revealTrial(focused.id);\n setRoute(entry.id, { fromTrial: true });\n return;\n } else {\n ctx.swapTrial(focused.id, entry.id);\n setRoute(entry.id, { inPlace: true });\n return;\n }\n setRoute(entry.id);\n };\n\n // A component's row opens its index page as well as its folder; the fold mark alone only folds.\n const openFolder = (node: Extract<TreeNode, { kind: 'folder' }>, another: boolean): void => {\n if (!node.index) {\n setOpen(node.path, !isOpen(node.path));\n return;\n }\n // Selection opens it, and closes it again once the selection moves on; only a manual fold is stored. A\n // manual close would outrank the selection, so it is dropped.\n if (folds[node.path] === false) {\n setFolds(({ [node.path]: _dropped, ...rest }) => rest);\n }\n activate(node.index, another);\n };\n\n // A breadcrumb asks for a folder; it is shown the way clicking its row shows it, in the Tree view when the\n // current one has no such folder. The row scrolls itself into view once it has rendered.\n const scrollTo = useRef<string | null>(null);\n const reveal = (path: string): void => {\n const find = (nodes: readonly TreeNode[], at: string): Extract<TreeNode, { kind: 'folder' }> | undefined => {\n for (const node of nodes) {\n if (node.kind !== 'folder') continue;\n if (node.path === at) return node;\n const inner = find(node.children, at);\n if (inner) return inner;\n }\n return undefined;\n };\n const nodesOf = (v: View): readonly TreeNode[] =>\n v === 'tree' ? tree : componentNodes(v === 'gallery' ? galleries : components);\n // The current view first; a folder only another view holds switches to it; failing all three, the nearest folder above.\n const order = [view, ...VIEWS.map((item) => item.value).filter((v) => v !== view && enabled(v))];\n let node: Extract<TreeNode, { kind: 'folder' }> | undefined;\n let where: View = view;\n for (let at = path; at && !node; at = at.includes('/') ? at.slice(0, at.lastIndexOf('/')) : '') {\n for (const v of order) {\n node = find(nodesOf(v), at);\n if (node) {\n where = v;\n break;\n }\n }\n }\n const found = node;\n if (!found) return;\n if (where !== view) setView(where);\n setQuery('');\n const segments = found.path.split('/');\n const above = segments.slice(0, -1).map((_, i) => segments.slice(0, i + 1).join('/'));\n setFolds((prev) => ({ ...prev, ...Object.fromEntries(above.map((p) => [p, true])) }));\n setFocusKey(keyOf(found));\n scrollTo.current = keyOf(found);\n if (found.index) openFolder(found, false);\n else setFolds((prev) => ({ ...prev, [found.path]: true }));\n };\n // Resubscribed every commit, so the listener always reads this render's view and data.\n useEffect(() => onRevealInTree(reveal));\n\n const onKeyDown = (event: KeyboardEvent<HTMLDivElement>): void => {\n const at = rows.findIndex((row) => row.key === active);\n const row = rows[at];\n if (!row) return;\n const { node } = row;\n switch (event.key) {\n case 'ArrowDown':\n moveTo(rows[at + 1]?.key);\n break;\n case 'ArrowUp':\n moveTo(rows[at - 1]?.key);\n break;\n case 'Home':\n moveTo(rows[0]?.key);\n break;\n case 'End':\n moveTo(rows[rows.length - 1]?.key);\n break;\n case 'ArrowRight':\n if (node.kind !== 'folder') break;\n if (!isOpen(node.path)) setOpen(node.path, true);\n else if (rows[at + 1]?.parent === row.key) moveTo(rows[at + 1]?.key);\n break;\n case 'ArrowLeft':\n if (node.kind === 'folder' && isOpen(node.path) && !filtering) setOpen(node.path, false);\n else moveTo(row.parent ?? undefined);\n break;\n case 'Enter':\n case ' ':\n if (node.kind === 'story') activate(node.entry, event.shiftKey);\n else openFolder(node, event.shiftKey);\n break;\n default:\n return;\n }\n event.preventDefault();\n };\n\n const itemProps = (node: TreeNode, level: number) => {\n const key = keyOf(node);\n return {\n role: 'treeitem',\n 'aria-level': level,\n tabIndex: key === active ? 0 : -1,\n ref: (el: HTMLElement | null) => {\n if (el) items.current.set(key, el);\n else items.current.delete(key);\n if (el && scrollTo.current === key) {\n scrollTo.current = null;\n el.scrollIntoView({ block: 'nearest' });\n }\n },\n // A folder item contains its children, so their focus bubbles through it.\n onFocus: (event: FocusEvent) => {\n if (event.target === event.currentTarget) setFocusKey(key);\n },\n };\n };\n\n const renderNodes = (nodes: readonly TreeNode[], level: number): ReactNode =>\n nodes.map((node) => {\n if (node.kind === 'folder') {\n const open = isOpen(node.path);\n return (\n <div\n key={keyOf(node)}\n {...itemProps(node, level)}\n aria-expanded={open}\n aria-label={node.label}\n aria-current={node.index && openIds.has(node.index.id) ? 'true' : undefined}\n className=\"fg-tree__node\"\n >\n <div\n className=\"fg-tree__item fg-tree__folder\"\n onClick={(event) => {\n setFocusKey(keyOf(node));\n openFolder(node, event.shiftKey);\n }}\n >\n <span\n aria-hidden=\"true\"\n className=\"fg-tree__fold\"\n onClick={(event) => {\n event.stopPropagation();\n setOpen(node.path, !open);\n }}\n >\n <DisclosureMark open={open} />\n </span>\n <span className=\"fg-tree__label\">{node.label}</span>\n <RowTags lab={!!node.index && isLab(node.index)} library={node.tag} />\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 <RowTags lab={isLab(entry)} library={node.tag} />\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 size=\"sm\"\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 <span className=\"fg-tree__library\">\n <LibraryBadge library={library} />\n </span>\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 { createEmitter } from '@weasel-js/registry';\nimport { 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 answered = createEmitter();\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)) answered.emit();\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: answered.subscribe,\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 type { LabContextValue, RenderContext } from '@weasel-js/labkit';\nimport { type Dispatch, type RefObject, type SetStateAction, useCallback, useEffect, useRef } 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 type PortHandoff,\n PROTOCOL_VERSION,\n stableStringify,\n type ToFrame,\n} from '../protocol/messages';\nimport type { IndexEntry } from '../story/types';\nimport type { AnswerBook } from './answers';\nimport { isGlobalsPath, storyConfig } from './globals';\nimport { reportFrameScroll } from './loupe/frameScroll';\nimport { type Ready, readyKey } from './readyKey';\nimport { type A11yOutcome, type TrialFrames } from './trialFrames';\nimport { setRoute } from './useRoute';\n\nconst START_TIMEOUT_MS = 10_000;\n/** Distinguishes one frame request from the next; only ever compared, never read. */\nlet requests = 0;\n\nexport interface Fault {\n phase: FaultPhase | null;\n message: string;\n}\n\n/** One handshake with one frame document; a reload replaces it. */\nexport interface Link {\n channel: Channel<FromFrame, ToFrame>;\n /** Takes each message to the view that holds the frame now. */\n deliver: (msg: FromFrame) => void;\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 /** Audits waiting on an answer carrying the same id. */\n pending: Map<string, (outcome: A11yOutcome) => void>;\n /** Whether the frame has said it rendered; before that there is no story to audit. */\n hasRendered: boolean;\n /** Audits held until it has. */\n queued: (() => void)[];\n}\n\nexport function 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({ ok: false, message: 'The frame went away' });\n link.current.pending.clear();\n link.current.disconnect();\n link.current.channel.close();\n link.current = null;\n}\n\nexport function 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\n/** Sends the frame whichever of the trial's config, state and globals in `next` differ from what it holds; true when any did. */\nexport function sendInputs(current: Link, sent: NonNullable<Link['sent']>, next: NonNullable<Link['sent']>): boolean {\n const before = current.inputs;\n const { state, globals } = next;\n const config = storyConfig(next.config, sent.config);\n if (config !== sent.config) {\n sent.config = config;\n current.channel.send({ type: 'config', config });\n current.inputs += 1;\n }\n if (state !== sent.state) {\n sent.state = state;\n current.channel.send({ type: 'state', state });\n current.inputs += 1;\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 }\n return current.inputs !== before;\n}\n\n/** What a link reads of its view as each message arrives: always the view's last commit. */\nexport interface FrameLinkLatest {\n entry: IndexEntry;\n ctx: RenderContext<unknown, unknown>;\n answers: AnswerBook;\n onReady: (entry: IndexEntry, ready: Ready) => void;\n descriptionKey: string | null;\n globals: Globals;\n overrides: Readonly<Record<string, string>>;\n lab: LabContextValue;\n}\n\nexport interface FrameLinkOptions {\n latest: { readonly current: FrameLinkLatest };\n /** The frame's address, named in a fault when it never starts. */\n src: string;\n /** The trial whose frame registry entry, reports and swaps this link speaks for; null for none. */\n trialId: string | null;\n frames: TrialFrames | null;\n /** The view's host, which stands in for its frame's scroller in this document. */\n host: RefObject<HTMLElement | null>;\n setFault: Dispatch<SetStateAction<Fault | null>>;\n setPending: (pending: boolean) => void;\n /** A lens's copy of the trial's frame: it sends `init` on the first `ready`, and neither reports it nor records answers. */\n copy: boolean;\n /** The inputs sent to the frame whenever one changes. */\n config: unknown;\n state: unknown;\n globals: Globals;\n descriptionKey: string | null;\n}\n\n/** What `receive` and `openLink` read of the view: the hook's options at its last render, and its `init`. */\ninterface LinkDeps\n extends Pick<FrameLinkOptions, 'latest' | 'src' | 'trialId' | 'frames' | 'host' | 'setFault' | 'setPending' | 'copy'> {\n init: (current: Link) => void;\n}\n\n/** One message from the frame, taken as the view's last commit would. */\nfunction receive(deps: LinkDeps, current: Link, msg: FromFrame): void {\n const { latest: latestRef, trialId, frames, host, setFault, setPending, init, copy } = deps;\n const { ctx: live, answers, onReady } = latestRef.current;\n switch (msg.type) {\n case 'ready': {\n clearTimeout(current.timer);\n setFault(null);\n for (const [name, value] of Object.entries(latestRef.current.overrides)) {\n current.channel.send({ type: 'vars.set', name, value });\n }\n // A copy renders a story its trial's instrument already describes.\n if (copy) {\n init(current);\n break;\n }\n const key = readyKey(msg);\n current.awaiting = key;\n onReady(latestRef.current.entry, msg);\n if (current.awaiting === key && key === latestRef.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 if (!copy) answers.record(msg.answers);\n break;\n case 'vars':\n if (trialId) frames?.report(trialId, msg.vars);\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 current.pending.get(msg.id)?.(outcome);\n current.pending.delete(msg.id);\n break;\n }\n case 'scroll':\n // A copy follows its trial's scroll; where it stands itself is nothing anyone reads.\n if (!copy && host.current) reportFrameScroll(host.current, msg);\n break;\n case 'open': {\n const { lab: liveLab } = latestRef.current;\n if (!trialId || !liveLab.instruments.some((instrument) => instrument.name === msg.id)) break;\n liveLab.swapTrial(trialId, msg.id);\n setRoute(msg.id, { inPlace: true });\n break;\n }\n case 'fault':\n // A newer input is already on its way to the frame, which faults again if it still throws.\n if (msg.phase === 'render' && msg.seq !== undefined && msg.seq < current.inputs) break;\n clearTimeout(current.timer);\n setFault({ phase: msg.phase, message: msg.message });\n break;\n }\n}\n\n/** Hands `frame` a fresh port, closing the link before it, and holds the new link in `link`. */\nfunction openLink(deps: LinkDeps, link: RefObject<Link | null>, frame: HTMLIFrameElement): void {\n const { latest: latestRef, src, trialId, frames, setFault, setPending } = deps;\n closeLink(link);\n setPending(true);\n const target = frame.contentWindow;\n if (!target) return;\n const { port1, port2 } = new MessageChannel();\n const timer = setTimeout(() => setFault({ phase: null, message: `Frame did not start: ${src}` }), START_TIMEOUT_MS);\n const channel = openChannel<FromFrame, ToFrame>(port1, {\n onMismatch: (mismatch) => {\n clearTimeout(timer);\n setFault({ phase: 'protocol', message: mismatchMessage(mismatch) });\n },\n });\n const waiting = new Map<string, (outcome: A11yOutcome) => void>();\n // Held until the frame says it rendered: before that there is no story to judge.\n const audit = (): Promise<A11yOutcome> =>\n new Promise((resolve) => {\n const id = `a11y-${(requests += 1)}`;\n waiting.set(id, resolve);\n const ask = () => channel.send({ type: 'a11y.run', id });\n if (current.hasRendered) ask();\n else current.queued.push(ask);\n });\n const disconnect = frames && trialId ? frames.connect(trialId, { send: channel.send, audit }) : () => {};\n const current: Link = {\n channel,\n deliver: (msg) => receive(deps, current, msg),\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) => current.deliver(msg));\n target.postMessage({ type: PORT_HANDOFF, id: latestRef.current.entry.id } satisfies PortHandoff, location.origin, [\n port2,\n ]);\n}\n\n/**\n * The view's handshake with its frame: `connect` hands a loaded frame a port, `link` holds what came of it, and\n * `adopt` takes over the link of a frame handed on from the view before this one.\n */\nexport function useFrameLink(opts: FrameLinkOptions): {\n connect(frame: HTMLIFrameElement): void;\n adopt(adopted: Link): void;\n link: RefObject<Link | null>;\n} {\n const { latest: latestRef, src, trialId, frames, host, setFault, setPending, copy, config, state, globals, descriptionKey } = opts;\n const link = useRef<Link | null>(null);\n\n const init = useCallback((current: Link): void => {\n const { ctx: live, globals: liveGlobals } = latestRef.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 }, [latestRef]);\n\n const deps: LinkDeps = { latest: latestRef, src, trialId, frames, host, setFault, setPending, copy, init };\n const connect = (frame: HTMLIFrameElement): void => openLink(deps, link, frame);\n\n const adopt = (adopted: Link): void => {\n adopted.deliver = (msg) => receive(deps, adopted, msg);\n setPending(!adopted.hasRendered);\n };\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 // The frame retries its render on new input and faults again if it still throws.\n if (current.sent && sendInputs(current, current.sent, { config, state, globals })) {\n setFault((shown) => (shown?.phase === 'render' ? null : shown));\n }\n }, [config, state, globals, descriptionKey, init, setFault]);\n\n return { connect, adopt, link };\n}\n","import { useLatest } from '@weasel-js/core';\nimport { type RefObject, useCallback, useLayoutEffect, useRef } from 'react';\nimport { canMoveFrames, moveFrame } from './framePool';\n\n/** What of a frame's handshake decides whether the frame is worth handing on. */\nexport interface KeptLink {\n awaiting: string | null;\n sent: object | null;\n}\n\ninterface Kept {\n frame: HTMLIFrameElement;\n link: KeptLink;\n}\n\nconst kept = new Map<string, Kept>();\nlet shelf: HTMLDivElement | null = null;\n\n/** Where a kept frame waits, inside the document so it stays loaded. */\nfunction shelfElement(): HTMLDivElement {\n if (!shelf) {\n shelf = document.createElement('div');\n shelf.className = 'fg-frame-pool';\n shelf.setAttribute('aria-hidden', 'true');\n }\n if (!shelf.isConnected) document.body.append(shelf);\n return shelf;\n}\n\nexport interface KeptFrameOptions<L extends KeptLink> {\n /** Names the story and the trial showing it; null where there is no trial to hand a frame on within. */\n key: string | null;\n slot: RefObject<Element | null>;\n frame: RefObject<HTMLIFrameElement | null>;\n link: RefObject<L | null>;\n /** Called with the link of a frame taken over from the view before this one. */\n onAdopt: (link: L) => void;\n /** Closes the link of a frame no view took. */\n onDrop: () => void;\n}\n\n/** Takes over the frame the view before this one shelved under the same key, if it left one. */\nfunction adopt<L extends KeptLink>({ key, slot, frame, link, onAdopt }: KeptFrameOptions<L>): void {\n const waiting = key === null ? undefined : kept.get(key);\n if (key === null || !waiting || !slot.current) return;\n kept.delete(key);\n moveFrame(slot.current, waiting.frame);\n frame.current = waiting.frame;\n link.current = waiting.link as L;\n onAdopt(waiting.link as L);\n}\n\n/**\n * Shelves the view's frame for the view mounting in its place; true when there was a frame worth shelving. Takes\n * the holder of the options and reads it when called, as the view unmounts: the options are then those of the\n * view's last commit, not of its mount.\n */\nfunction shelve<L extends KeptLink>(options: { readonly current: KeptFrameOptions<L> }): boolean {\n const { key, frame, link, onDrop } = options.current;\n const element = frame.current;\n const current = link.current;\n if (key === null || !element?.isConnected || !current || !canMoveFrames()) return false;\n if (current.awaiting === null && current.sent === null) return false;\n const entry: Kept = { frame: element, link: current };\n moveFrame(shelfElement(), element);\n kept.set(key, entry);\n // The view taking over mounts in this commit, so a frame still here after it has no taker.\n queueMicrotask(() => {\n if (kept.get(key) !== entry) return;\n kept.delete(key);\n onDrop();\n element.remove();\n });\n return true;\n}\n\n/**\n * Hands a story's loaded frame from a view that unmounts to the one mounting in its place in the same commit, as a\n * trial does when its instrument gains a stage. Returns a function that answers, when called, whether this view's\n * frame has been handed on and is no longer its own to remove; an effect cleanup calls it, since the hand-off\n * happens as the view unmounts. Nothing is handed on where the browser cannot move an iframe without reloading it,\n * or before the frame's `ready`.\n */\nexport function useKeptFrame<L extends KeptLink>(options: KeptFrameOptions<L>): () => boolean {\n const handedOn = useRef(false);\n const latest = useLatest(options);\n // A layout effect on both sides: its cleanup runs before React takes the old view's elements out of the\n // document, which is the last moment the frame can move without reloading.\n useLayoutEffect(() => {\n adopt(latest.current);\n return () => {\n if (shelve(latest)) handedOn.current = true;\n };\n }, [latest]);\n return useCallback(() => handedOn.current, []);\n}\n","import { breadcrumb } from './breadcrumb';\nimport './shell.css';\nimport { useLatest } from '@weasel-js/core';\nimport { type RenderContext, TrialIdContext, useLabContext } from '@weasel-js/labkit';\nimport { type Dispatch, type RefObject, type SetStateAction, useContext, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport type { FrameSetup } from '../frame/FrameController';\nimport { IN_VIEW_MARGIN, useNearViewport } from '../frame/useNearViewport';\nimport { FRAME_HELLO } from '../protocol/messages';\nimport type { IndexEntry } from '../story/types';\nimport type { AnswerBook } from './answers';\nimport { useCssOverrides } from './cssVars/overrides';\nimport { closeLink, type Fault, type Link, useFrameLink } from './frameLink';\nimport { FramePoolContext, HELLO_TIMEOUT_MS, moveFrame } from './framePool';\nimport { effectiveGlobals, GLOBALS_KEY } from './globals';\nimport { applyGlobalsTo } from './hostConditions';\nimport { useKeptFrame } from './keptFrame';\nimport { scrollOf } from './loupe/frameScroll';\nimport { type LensFrameCopy, LiveFrameCopies, useCopyConfig } from './loupe/LiveCopies';\nimport type { Ready } from './readyKey';\nimport { 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 * Makes this view a lens's second copy of the trial's story, in a frame of its own: it takes `id` as its host id,\n * renders under `globals` with `args` laid over the trial's config, scrolls wherever `main` says the trial's frame\n * stands, and stays out of the frame pool, the kept frames, the frame registry and the answer book. It reports no\n * `ready` and swaps no trial.\n */\n copy?: LensFrameCopy;\n /** The workshop's frame setup. A copy's host takes its globals through it, so what it paints behind the copy's\n * frame is in the copy's mode rather than the lab's. */\n setup?: FrameSetup;\n}\n\ninterface FrameMount {\n inView: boolean;\n src: string;\n slotRef: RefObject<HTMLDivElement | null>;\n iframeRef: RefObject<HTMLIFrameElement | null>;\n latest: { readonly current: { pool: { claim(): HTMLIFrameElement | null } | null; title: string; copy?: FrameViewProps['copy'] } };\n connect: { readonly current: (frame: HTMLIFrameElement) => void };\n link: RefObject<Link | null>;\n handedOn: () => boolean;\n setFault: Dispatch<SetStateAction<Fault | null>>;\n setPending: (pending: boolean) => void;\n}\n\n/**\n * Puts the view's frame in its slot while it is in view: the one it adopted, a warm one from the pool, or a new one.\n * A trial out of view drops its frame, and with it any WebGL contexts the story held; the config and state live in\n * the trial, so a return brings up a new frame and `init` carries them back.\n */\nfunction mountFrame(m: FrameMount): (() => void) | undefined {\n const { inView, src, slotRef, iframeRef, latest: latestRef, connect: connectRef, link, handedOn, setFault, setPending } = m;\n const slot = slotRef.current;\n if (!inView || !slot) return undefined;\n // Already in the slot, loaded and linked, when it came from the view this one replaced.\n const adopted = iframeRef.current;\n const claimed = adopted || latestRef.current.copy ? null : (latestRef.current.pool?.claim() ?? null);\n const frame = adopted ?? claimed ?? document.createElement('iframe');\n frame.className = 'fg-frame-view';\n frame.title = latestRef.current.title;\n frame.removeAttribute('tabindex');\n frame.toggleAttribute('data-pending', true);\n iframeRef.current = frame;\n // Handshakes start on the document's hello, never on `load`: that fires before the hello, and a port handed\n // over then is one the frame, which keeps only its first, would still take in place of the right one.\n const unheard = adopted || claimed\n ? undefined\n : setTimeout(() => setFault({ phase: null, message: `Frame did not start: ${src}` }), HELLO_TIMEOUT_MS);\n const onMessage = (event: MessageEvent) => {\n if (event.source !== frame.contentWindow || event.origin !== location.origin) return;\n if ((event.data as { type?: unknown } | null)?.type !== FRAME_HELLO) return;\n clearTimeout(unheard);\n connectRef.current(frame);\n };\n window.addEventListener('message', onMessage);\n if (claimed) {\n moveFrame(slot, claimed);\n connectRef.current(claimed);\n } else if (!adopted) {\n frame.src = src;\n slot.append(frame);\n }\n return () => {\n window.removeEventListener('message', onMessage);\n clearTimeout(unheard);\n if (handedOn()) return;\n closeLink(link);\n frame.remove();\n iframeRef.current = null;\n setPending(true);\n setFault(null);\n };\n}\n\nconst NO_ARGS: Readonly<Record<string, unknown>> = {};\n\nexport function FrameView(props: FrameViewProps) {\n const { entry, frameUrl, answers, descriptionKey, ctx: trialCtx, copy } = props;\n const labGlobals = useContext(StoryGlobalsContext);\n const pins = (trialCtx.config as Record<string, unknown> | null | undefined)?.[GLOBALS_KEY];\n const own = useMemo(() => effectiveGlobals(labGlobals, pins), [labGlobals, pins]);\n const globals = copy ? copy.globals : own;\n const { config: laidConfig, setConfig: laidSetConfig } = useCopyConfig(trialCtx.config, trialCtx.setConfig, copy?.args ?? NO_ARGS);\n const ctx = useMemo(\n () => (copy ? { ...trialCtx, config: laidConfig, setConfig: laidSetConfig } : trialCtx),\n [copy, trialCtx, laidConfig, laidSetConfig],\n );\n const trialId = useContext(TrialIdContext);\n const frames = useContext(TrialFramesContext);\n const [overrides] = useCssOverrides();\n const pool = useContext(FramePoolContext);\n const lab = useLabContext();\n const src = `${frameUrl}#${entry.id}`;\n const title = breadcrumb(entry.title, entry.name);\n const iframeRef = useRef<HTMLIFrameElement | null>(null);\n const hostRef = useRef<HTMLDivElement>(null);\n const slotRef = useRef<HTMLDivElement>(null);\n const inView = useNearViewport(hostRef, IN_VIEW_MARGIN);\n const latestRef = useLatest({ ...props, ctx, globals, overrides, pool, lab, title });\n const [fault, setFault] = useState<Fault | null>(null);\n // A loaded document stays hidden until its story has rendered, so a new trial never shows the blank page.\n const [pending, setPending] = useState(true);\n\n const { connect, adopt, link } = useFrameLink({\n latest: latestRef,\n src,\n trialId: copy ? null : trialId,\n frames: copy ? null : frames,\n host: hostRef,\n setFault,\n setPending,\n copy: copy !== undefined,\n config: ctx.config,\n state: ctx.state,\n globals,\n descriptionKey,\n });\n\n const connectRef = useLatest(connect);\n\n const handedOn = useKeptFrame<Link>({\n key: trialId && !copy ? `${trialId} ${src}` : null,\n slot: slotRef,\n frame: iframeRef,\n link,\n onAdopt: adopt,\n onDrop: () => closeLink(link),\n });\n\n useEffect(\n () => mountFrame({ inView, src, slotRef, iframeRef, latest: latestRef, connect: connectRef, link, handedOn, setFault, setPending }),\n [inView, src, connectRef, latestRef, handedOn, link],\n );\n\n useEffect(() => {\n iframeRef.current?.toggleAttribute('data-pending', pending && !fault);\n }, [pending, fault, inView, src]);\n\n useEffect(() => {\n if (iframeRef.current) iframeRef.current.title = title;\n }, [title]);\n\n useEffect(() => (copy ? undefined : answers.hold(ctx.config)), [answers, ctx.config, copy]);\n\n const setup = props.setup;\n const copyId = copy?.id;\n useLayoutEffect(\n () => (copyId && setup && hostRef.current ? applyGlobalsTo(hostRef.current, copyId, globals, setup) : undefined),\n [copyId, globals, setup],\n );\n\n // Applied once the copy has rendered, when its document is tall enough to stand where the trial's does.\n const main = copy?.main;\n useEffect(() => {\n if (!main || pending) return undefined;\n const follow = () => link.current?.channel.send({ type: 'scroll', ...scrollOf(main) });\n follow();\n main.addEventListener('scroll', follow, { passive: true });\n return () => main.removeEventListener('scroll', follow);\n }, [main, pending, link]);\n\n return (\n <div ref={hostRef} className=\"fg-frame-host\" data-fg-host={copy?.id ?? trialId ?? undefined} data-fg-copy={copy ? '' : undefined}>\n {/* The frame is placed here by hand: a pooled one arrives already loaded, and React would reload it. */}\n <div ref={slotRef} className=\"fg-frame-slot\" />\n {fault ? (\n <div className=\"fg-fault\" role=\"alert\">\n {fault.phase ? <span className=\"fg-fault__phase\">{fault.phase}</span> : null}\n <p className=\"fg-fault__message\">{fault.message}</p>\n </div>\n ) : null}\n {copy ? null : (\n <LiveFrameCopies trialId={trialId} trialConfig={trialCtx.config}>\n {(lensCopy) => <FrameView {...props} copy={lensCopy} />}\n </LiveFrameCopies>\n )}\n </div>\n );\n}\n","import { crumbTitle } from './Crumbs';\nimport type { Instrument } from '@weasel-js/labkit';\nimport { type ConfigSchema, f } from '@weasel-js/labkit/config';\nimport type { FrameSetup } from '../frame/FrameController';\nimport { schemaFromDescription } from '../protocol/schema';\nimport type { IndexEntry } from '../story/types';\nimport type { AnswerBook } from './answers';\nimport { FrameView } from './FrameView';\nimport { CaptureInputs } from './loupe/CaptureInputs';\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 /** The workshop's frame setup, which applies the globals to a lens copy's host. */\n setup?: FrameSetup;\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 = {}, setup } = 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 const viewport = ready ? ready.viewport : entry.viewport;\n return {\n name: entry.id,\n ...crumbTitle(entry),\n config,\n defaultConfig: () => config.defaults(),\n initialState: () => null,\n render: (ctx) => (\n <>\n <FrameView\n entry={entry}\n frameUrl={frameUrl}\n answers={answers}\n onReady={onReady}\n descriptionKey={descriptionKey}\n ctx={ctx}\n {...(setup ? { setup } : {})}\n />\n <CaptureInputs entry={entry} layout={ready?.layout ?? 'centered'} config={ctx.config} state={ctx.state} />\n </>\n ),\n // Taken from the index until the frame reports, so the trial does not move the frame into a stage and reload it.\n ...(viewport ? { stage: { size: { width: viewport.width, height: viewport.height } } } : {}),\n };\n}\n","import { useLatest } from '@weasel-js/core';\nimport type { Instrument, InstrumentList } from '@weasel-js/labkit';\nimport { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport type { FrameSetup } from '../frame/FrameController';\nimport type { FrameImporters } from '../frame/mountFrame';\nimport { stableStringify } from '../protocol/messages';\nimport { loadIndexBundle } from '../story/indexBundle';\nimport { indexId, isIndexId } from '../story/indexPages';\nimport { type Libraries, TITLE_LIBRARIES } from '../story/library';\nimport { loadStories } from '../story/load';\nimport type { IndexEntry, LoadedStory } from '../story/types';\nimport { type AnswerBook, createAnswerBook } from './answers';\nimport { documentInstrument, type Loaded, pendingInstrument } from './documentInstrument';\nimport type { GlobalDeclarations } from './globals';\nimport { type Ready, readyKey } from './readyKey';\nimport { storyInstrument } from './storyInstrument';\n\n/** The lab instruments `useStoryRegistry` builds, and the calls that keep them current. */\nexport interface StoryRegistry {\n instruments: InstrumentList;\n /** Whether a story's schema is known: its module has loaded, or its frame has reported. An instrument is built\n * either way, and before that its schema is empty — which reads as \"no args\" to anything that cannot tell the\n * two apart. */\n isReady: (id: string) => boolean;\n /** Called by FrameView. Replaces the story's instrument only when `ready.schema`, layout or viewport differ from what it holds. */\n onReady: (entry: IndexEntry, ready: Ready) => void;\n /** Drops what was loaded from `file` and loads it again for every entry that had it, as after an edit. */\n reload: (file: string) => void;\n}\n\n/** What `useStoryRegistry` loads stories from, and what it shows them with. */\nexport interface StoryRegistryOptions {\n frameUrl: string;\n globals?: GlobalDeclarations;\n /** Story modules by file. Given, every entry without `isolate` renders in the workshop document; absent, every\n * entry renders in a frame. */\n importers?: FrameImporters;\n /** The frame config, applied to each story host in the document. */\n setup?: FrameSetup;\n /** Names the library an index page's component ships in. Default: its title's first segment. */\n libraries?: Libraries;\n load?: (mod: Record<string, unknown>, title: string, parameters?: Record<string, unknown>) => LoadedStory[];\n}\n\ninterface Built {\n entryKey: string;\n ready: Ready | undefined;\n loaded: Loaded | undefined;\n fault: Error | undefined;\n frameUrl: string;\n globals: GlobalDeclarations;\n setup: FrameSetup | undefined;\n inDocument: boolean;\n generation: number;\n revision: number;\n instrument: Instrument<unknown, unknown>;\n}\n\ninterface Cache {\n built: ReadonlyMap<string, Built>;\n books: ReadonlyMap<string, AnswerBook>;\n list: InstrumentList;\n}\n\nconst NO_GLOBALS: GlobalDeclarations = {};\nconst NO_SETUP: FrameSetup = {};\n\nconst pruned = <V>(map: ReadonlyMap<string, V>, ids: Set<string>): ReadonlyMap<string, V> =>\n [...map.keys()].every((id) => ids.has(id)) ? map : new Map([...map].filter(([id]) => ids.has(id)));\n\nconst toError = (error: unknown): Error => (error instanceof Error ? error : new Error(String(error)));\n\n/**\n * One instrument per story in `index`, each schema holding a `$globals` group for `globals`. The lab's global values\n * reach the stories through `StoryGlobalsContext`, not through here.\n */\nexport function useStoryRegistry(index: readonly IndexEntry[], options: StoryRegistryOptions): StoryRegistry {\n const { frameUrl, globals = NO_GLOBALS, importers, setup = NO_SETUP, libraries = TITLE_LIBRARIES, load = loadStories } = options;\n const [readies, setReadies] = useState<ReadonlyMap<string, Ready>>(() => new Map());\n const [loaded, setLoaded] = useState<ReadonlyMap<string, Loaded>>(() => new Map());\n const [faults, setFaults] = useState<ReadonlyMap<string, Error>>(() => new Map());\n // Per file, how many reloads it has had: a pending face keyed by it asks again after one.\n const [generations, setGenerations] = useState<ReadonlyMap<string, number>>(() => new Map());\n // Bumped when a story's frame answers something new. labkit's panel re-reads the answer book only when\n // the trial's config changes, and replacing the instrument is what refills it.\n const [revisions, setRevisions] = useState<ReadonlyMap<string, number>>(() => new Map());\n\n const onReady = useCallback((entry: IndexEntry, ready: Ready) => {\n setReadies((prev) => {\n const held = prev.get(entry.id);\n if (held && readyKey(held) === readyKey(ready)) return prev;\n return new Map(prev).set(entry.id, ready);\n });\n }, []);\n\n // Keyed by content: a caller may rebuild an equal index every render, and an identity key would loop.\n const indexIds = JSON.stringify(index.map((entry) => entry.id));\n const [prunedFor, setPrunedFor] = useState(indexIds);\n if (prunedFor !== indexIds) {\n setPrunedFor(indexIds);\n const ids = new Set(index.map((entry) => entry.id));\n setReadies((prev) => pruned(prev, ids));\n setLoaded((prev) => pruned(prev, ids));\n setFaults((prev) => pruned(prev, ids));\n setRevisions((prev) => pruned(prev, ids));\n }\n\n // One import per file, shared by every entry it holds; a reload drops the file's promise and asks again.\n const imports = useRef(new Map<string, Promise<Record<string, unknown>>>());\n const liveRef = useLatest({ index, importers, setup, load, libraries });\n // Files asked for before the importers held them: a story file added while the workshop runs lists first.\n const missing = useRef(new Set<string>());\n\n const importOf = useCallback((file: string): Promise<Record<string, unknown>> => {\n let loading = imports.current.get(file);\n if (!loading) {\n const importer = liveRef.current.importers?.[file];\n if (!importer) missing.current.add(file);\n loading = importer ? importer() : Promise.reject(new Error(`No importer for ${file}`));\n imports.current.set(file, loading);\n }\n return loading;\n }, [liveRef]);\n\n const request = useCallback(\n (entry: IndexEntry): void => {\n const { setup: current, load: loadModule } = liveRef.current;\n const settle = (ids: string[], result: Map<string, Loaded>) => {\n setLoaded((prev) => {\n const next = new Map(prev);\n for (const [id, value] of result) next.set(id, value);\n return next;\n });\n setFaults((prev) => (ids.some((id) => prev.has(id)) ? pruned(prev, new Set([...prev.keys()].filter((id) => !ids.includes(id)))) : prev));\n };\n const fail = (ids: string[], error: unknown) => {\n const fault = toError(error);\n setFaults((prev) => {\n const next = new Map(prev);\n for (const id of ids) next.set(id, fault);\n return next;\n });\n };\n if (isIndexId(entry.id)) {\n const { index: entries, libraries } = liveRef.current;\n const source = { index: entries, importOf, load: loadModule, parameters: current.parameters, prepare: current.prepare, libraries };\n void loadIndexBundle(entry.id, source)\n .then((bundle) => settle([entry.id], new Map<string, Loaded>([[entry.id, { kind: 'index', bundle }]])))\n .catch((error: unknown) => fail([entry.id], error));\n return;\n }\n const siblings = liveRef.current.index.filter((e) => e.file === entry.file && !isIndexId(e.id));\n const ids = siblings.map((e) => e.id);\n void importOf(entry.file)\n .then(async (mod) => {\n const stories = loadModule(mod, entry.title, current.parameters);\n const result = new Map<string, Loaded>();\n for (const sibling of siblings) {\n const story = stories.find((s) => s.exportName === sibling.exportName);\n if (!story) continue;\n await current.prepare?.(story);\n result.set(sibling.id, { kind: 'story', story });\n }\n if (!result.has(entry.id)) throw new Error(`${entry.file} has no story export \"${entry.exportName}\"`);\n settle(ids, result);\n })\n .catch((error: unknown) => fail(ids, error));\n },\n [importOf, liveRef],\n );\n\n const reload = useCallback(\n (file: string) => {\n imports.current.delete(file);\n const affected = liveRef.current.index.filter((e) => e.file === file || (isIndexId(e.id) && liveRef.current.index.some((s) => s.file === file && indexId(s.title) === e.id)));\n const ids = new Set(affected.map((e) => e.id));\n setLoaded((prev) => pruned(prev, new Set([...prev.keys()].filter((id) => !ids.has(id)))));\n setFaults((prev) => pruned(prev, new Set([...prev.keys()].filter((id) => !ids.has(id)))));\n setGenerations((prev) => new Map(prev).set(file, (prev.get(file) ?? 0) + 1));\n },\n [liveRef],\n );\n\n useEffect(() => {\n for (const file of [...missing.current]) {\n if (!importers?.[file]) continue;\n missing.current.delete(file);\n reload(file);\n }\n }, [importers, reload]);\n\n const committed = useRef<Cache>({ built: new Map(), books: new Map(), list: [] });\n\n const cache = useMemo<Cache>(() => {\n const previous = committed.current;\n const built = new Map<string, Built>();\n const books = new Map<string, AnswerBook>();\n const list = index.map((entry) => {\n const ready = readies.get(entry.id);\n const inDocument = importers !== undefined && entry.isolate === undefined;\n const had = loaded.get(entry.id);\n const fault = faults.get(entry.id);\n const generation = generations.get(entry.file) ?? 0;\n const revision = revisions.get(entry.id) ?? 0;\n const entryKey = stableStringify(entry);\n const answers = previous.books.get(entry.id) ?? createAnswerBook();\n books.set(entry.id, answers);\n const held = previous.built.get(entry.id);\n const kept =\n held &&\n held.entryKey === entryKey &&\n held.ready === ready &&\n held.loaded === had &&\n held.fault === fault &&\n held.frameUrl === frameUrl &&\n held.globals === globals &&\n held.setup === setup &&\n held.inDocument === inDocument &&\n held.generation === generation &&\n held.revision === revision\n ? held\n : {\n entryKey,\n ready,\n loaded: had,\n fault,\n frameUrl,\n globals,\n setup,\n inDocument,\n generation,\n revision,\n instrument: !inDocument\n ? storyInstrument({ entry, ready, answers, frameUrl, onReady, globals, setup })\n : had\n ? documentInstrument({ entry, loaded: had, setup, globals })\n : pendingInstrument({ entry, globals, load: request, generation, ...(fault ? { fault } : {}) }),\n };\n built.set(entry.id, kept);\n return kept.instrument;\n });\n const unchanged = list.length === previous.list.length && list.every((i, n) => i === previous.list[n]);\n return { built, books, list: unchanged ? previous.list : list };\n }, [index, readies, loaded, faults, generations, revisions, frameUrl, globals, setup, importers, onReady, request]);\n\n useLayoutEffect(() => {\n committed.current = cache;\n }, [cache]);\n\n useEffect(() => {\n const offs = [...cache.books].map(([id, book]) =>\n book.subscribe(() => setRevisions((prev) => new Map(prev).set(id, (prev.get(id) ?? 0) + 1))),\n );\n return () => {\n for (const off of offs) off();\n };\n }, [cache.books]);\n\n const isReady = useCallback((id: string) => readies.has(id) || loaded.has(id), [readies, loaded]);\n\n return { instruments: cache.list, isReady, onReady, reload };\n}\n","import {\n Lab,\n type LabContribution,\n type LabMenus,\n type StorageAdapter,\n useLabContext,\n} from '@weasel-js/labkit';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type { ShellConfig } from '../config';\nimport { DEFAULT_TITLE } from '../title';\nimport type { FrameSetup } from '../frame/FrameController';\nimport type { FrameImporters } from '../frame/mountFrame';\nimport { type Globals, stableStringify } from '../protocol/messages';\nimport { indexEntries } from '../story/indexPages';\nimport { LibrariesContext, librariesFrom } from '../story/library';\nimport type { DepGraph, IndexEntry } from '../story/types';\nimport { DependenciesContext } from './dependencies';\nimport { missingInstrument } from './documentInstrument';\nimport { A11Y_SECTION } from './a11y/A11yPanel';\nimport { CssVarsChrome } from './cssVars/cssVarsChrome';\nimport { KeysChrome } from './keys/keysChrome';\nimport { infoItem } from './info/infoItem';\nimport { StoryInfoDialog } from './info/StoryInfoDialog';\nimport { createFramePool, type FramePool, FramePoolContext } from './framePool';\nimport { ForgeLoupe } from './loupe/ForgeLoupe';\nimport type { Revision } from './loupe/captureContext';\nimport { LoupeProvider } from './loupe/CaptureInputs';\nimport { createTrialFrames, TrialFramesContext } from './trialFrames';\nimport { RoutePlayhead } from '../timeline/RoutePlayhead';\nimport { createTrialClocks, TrialClocksContext } from '../timeline/trialClocks';\nimport { type GlobalDeclarations, labGlobals } from './globals';\nimport { GlobalsToolbar, LabGlobals } from './GlobalsToolbar';\nimport { GlobalsMenus } from './globalsMenu';\nimport type { StoryChanges } from './storyChanges';\nimport { StoryGlobalsContext } from './StoryGlobalsContext';\nimport { LAB_DENSITY } from './labDensity';\nimport { RouteKnobs } from './RouteKnobs';\nimport { StoryTree } from './tree/StoryTree';\nimport { crossesInPlace, readRoute, readRouteEntry, useRoute } from './useRoute';\nimport { useStoryRegistry } from './useStoryRegistry';\n\n/** Props for `Workshop`. `index`, `importers` and `dependencies` are what the vite plugin's virtual modules supply. */\nexport interface WorkshopProps {\n index: readonly IndexEntry[];\n /** The frame document, for the stories `isolate` keeps in one. */\n frameUrl: string;\n /** Story modules by file. Given, stories render in the workshop document; absent, every story renders in a frame. */\n importers?: FrameImporters;\n /** The frame config, applied to each story rendered in the document. */\n setup?: FrameSetup;\n /** Story files edited while the workshop runs; each is loaded again for the stories that had it. */\n changes?: StoryChanges;\n config?: ShellConfig;\n /** The story globs the index was built from, named when it is empty. */\n stories?: readonly string[];\n storageKey?: string;\n storage?: StorageAdapter;\n /** The component graph index pages list dependencies from. */\n dependencies?: DepGraph;\n /** The dev server's base, where it takes captures of a story; absent, lenses offer no Pixels source. */\n captureBase?: string;\n /** Bumped on every story edit, so no lens shows a capture of a story as it was. */\n revision?: Revision;\n}\n\nconst NO_DECLARATIONS: GlobalDeclarations = {};\n\n/**\n * Shows the story the route names when no trial shows it, once per route, so closing that trial sticks. It goes\n * into the trial the previous route was in when a history step crosses an in-place swap, so Back returns that\n * trial to its previous story; otherwise into the focused trial, as a click in the tree does. Only a lab with no\n * trial at all gets a new one: another trial is what Shift-click is for.\n */\nfunction RouteOpener() {\n const lab = useLabContext();\n const [route] = useRoute();\n const handled = useRef<string | null>(null);\n const last = useRef({ route: readRoute(), entry: readRouteEntry() });\n useEffect(() => {\n const from = last.current;\n if (route !== from.route) last.current = { route, entry: readRouteEntry() };\n if (route === null || handled.current === route || !lab.instruments.some((i) => i.name === route)) return;\n handled.current = route;\n if (lab.trials.some((trial) => trial.instrumentName === route)) return;\n const previous = lab.trials.find((trial) => trial.instrumentName === from.route);\n const target =\n (previous && crossesInPlace(from.entry, last.current.entry) ? previous : undefined) ??\n lab.trials.find((trial) => trial.id === lab.focusedTrialId) ??\n lab.trials[0];\n if (target) lab.swapTrial(target.id, route);\n else lab.addTrial(route);\n }, [route, lab]);\n return null;\n}\n\nfunction useDocumentTitle(title: string) {\n useEffect(() => {\n document.title = title;\n }, [title]);\n}\n\n/** What the workshop shows when the index is empty, naming the globs it was built from. */\nfunction NoStories({ stories }: { stories: readonly string[] }) {\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\n/** The workshop page: a labkit `Lab` with a story tree, where each story or index page opens as a trial. */\nexport function Workshop(props: WorkshopProps) {\n const { index, frameUrl, importers, setup, changes, config, stories = [], storageKey, storage, dependencies } = props;\n const declarations = config?.globals ?? NO_DECLARATIONS;\n const title = config?.title ?? DEFAULT_TITLE;\n useDocumentTitle(title);\n const [frames] = useState(createTrialFrames);\n const [clocks] = useState(createTrialClocks);\n const [pool, setPool] = useState<FramePool | null>(null);\n // Warm frames are for the stories that render in one: every story when no importers are given, else the isolated.\n const framed = importers === undefined || index.some((entry) => entry.isolate !== undefined);\n useEffect(() => {\n if (!framed) return;\n const next = createFramePool(frameUrl);\n // eslint-disable-next-line react-hooks/set-state-in-effect -- publishes the frame pool this effect creates\n setPool(next);\n return () => {\n next.dispose();\n setPool(null);\n };\n }, [frameUrl, framed]);\n const entries = useMemo(() => [...index, ...indexEntries(index)], [index]);\n const table = config?.libraries;\n const libraries = useMemo(() => librariesFrom(table), [table]);\n const registry = useStoryRegistry(entries, {\n frameUrl,\n globals: declarations,\n libraries,\n ...(importers ? { importers } : {}),\n ...(setup ? { setup } : {}),\n });\n // A route no story has gets an instrument of its own, so the trial it would open in says the story is missing.\n const [route] = useRoute();\n const missing = route !== null && !entries.some((entry) => entry.id === route) ? route : null;\n const instruments = useMemo(\n () => (missing === null ? registry.instruments : [...registry.instruments, missingInstrument(missing, declarations)]),\n [registry.instruments, missing, declarations],\n );\n const reload = registry.reload;\n useEffect(() => changes?.subscribe(reload), [changes, reload]);\n const [labValues, setLabValues] = useState<Globals>(() => labGlobals(declarations, undefined));\n const themeFor = config?.labTheme;\n const labTheme = useMemo(() => themeFor?.(labValues), [themeFor, labValues]);\n const [infoOpen, setInfoOpen] = useState(false);\n const reportLabValues = useCallback(\n (next: Globals) => setLabValues((prev) => (stableStringify(prev) === stableStringify(next) ? prev : next)),\n [],\n );\n const infoCommand = useMemo(() => infoItem(() => setInfoOpen(true)), []);\n const showsCssVars = config?.cssVars !== false;\n const modeGlobal = config?.loupe?.modeGlobal ?? 'mode';\n const [cssVarsChrome, setCssVarsChrome] = useState<readonly LabContribution[]>([]);\n const [keysChrome, setKeysChrome] = useState<readonly LabContribution[]>([]);\n const labChrome = useMemo<readonly LabContribution[]>(\n () => [\n { id: 'fg-stories', region: 'sidebar', render: (ctx) => <StoryTree ctx={ctx} index={index} /> },\n ...(showsCssVars ? cssVarsChrome : []),\n A11Y_SECTION,\n ...keysChrome,\n ...(Object.keys(declarations).length > 0\n ? [{ id: 'fg-globals', region: 'header', render: () => <GlobalsToolbar declarations={declarations} /> } as const]\n : []),\n { id: 'fg-info', region: 'header', group: 'story', item: infoCommand },\n { id: 'fg-loupe', region: 'overlay', render: () => <ForgeLoupe declarations={declarations} modeGlobal={modeGlobal} /> },\n ...(config?.labChrome ?? []),\n ],\n [index, infoCommand, declarations, showsCssVars, cssVarsChrome, keysChrome, config?.labChrome, modeGlobal],\n );\n const [menus, setMenus] = useState<LabMenus>();\n const first = index[0];\n if (!first) return <NoStories stories={stories} />;\n return (\n <LibrariesContext.Provider value={libraries}>\n <StoryGlobalsContext.Provider value={labValues}>\n <DependenciesContext.Provider value={dependencies ?? null}>\n <FramePoolContext.Provider value={pool}>\n <TrialFramesContext.Provider value={frames}>\n <TrialClocksContext.Provider value={clocks}>\n <LoupeProvider captureBase={props.captureBase} revision={props.revision}>\n <Lab\n title={title}\n density={LAB_DENSITY}\n {...(labTheme ? { theme: labTheme } : {})}\n instruments={instruments}\n defaultInstrument={readRoute() ?? first.id}\n storageKey={storageKey ?? 'weaselforge'}\n {...(storage ? { storage } : {})}\n labChrome={labChrome}\n addTrial={false}\n {...(menus ? { menus } : {})}\n {...(config?.controls ? { controls: config.controls } : {})}\n {...(config?.pages ? { pages: config.pages } : {})}\n {...(config?.path !== undefined ? { path: config.path } : {})}\n >\n <RouteOpener />\n <RouteKnobs instruments={registry.instruments} isReady={registry.isReady} />\n <RoutePlayhead />\n <StoryInfoDialog\n index={index}\n isReady={registry.isReady}\n isOpen={infoOpen}\n onOpenChange={setInfoOpen}\n />\n <LabGlobals declarations={declarations} onChange={reportLabValues} />\n <GlobalsMenus declarations={declarations} onMenus={setMenus} />\n {showsCssVars ? <CssVarsChrome onChrome={setCssVarsChrome} /> : null}\n <KeysChrome onChrome={setKeysChrome} />\n </Lab>\n </LoupeProvider>\n </TrialClocksContext.Provider>\n </TrialFramesContext.Provider>\n </FramePoolContext.Provider>\n </DependenciesContext.Provider>\n </StoryGlobalsContext.Provider>\n </LibrariesContext.Provider>\n );\n}\n","import { createKitRoot } from '../kitIcons';\nimport type { FrameImporters } from '../frame/mountFrame';\nimport type { DepGraph, IndexEntry } from '../story/types';\nimport { createRevision } from './loupe/captureContext';\nimport { createStoryChanges } from './storyChanges';\nimport { Workshop, type WorkshopProps } from './Workshop';\n\n/** `Workshop`'s props, plus where to mount it. */\nexport interface MountWorkshopOptions extends WorkshopProps {\n /** Default: the document's `#root`. */\n container?: HTMLElement;\n}\n\n/** A mounted workshop, for feeding it what the vite plugin pushes after an edit. */\nexport interface MountedWorkshop {\n /** Swaps in a re-indexed story list, as the vite plugin's `forge:index` event carries. */\n setIndex(index: readonly IndexEntry[]): void;\n /** Swaps in importers whose URLs fetch the modules as they are now, after an edit. */\n setImporters(importers: FrameImporters): void;\n /** Loads `file` again for every story that had it, through the current importers. */\n reloadStory(file: string): void;\n /** Swaps in the component graph, as the vite plugin's `forge:deps` event carries. */\n setDependencies(dependencies: DepGraph): void;\n /** Says a story, or a module one imports, was edited: no lens shows a capture taken before it. */\n revise(): void;\n unmount(): void;\n}\n\n/** Renders a `Workshop` into its own React root. Throws when no container is given and the page has no `#root`. */\nexport function mountWorkshop({ container, ...props }: MountWorkshopOptions): MountedWorkshop {\n const target = container ?? document.getElementById('root');\n if (!target) throw new Error('mountWorkshop: no container given and no #root element');\n const root = createKitRoot(target, props.setup?.icons);\n const changes = createStoryChanges();\n const revision = createRevision();\n let current: WorkshopProps = { ...props, changes, revision };\n root.render(<Workshop {...current} />);\n return {\n setIndex(index) {\n current = { ...current, index };\n root.render(<Workshop {...current} />);\n },\n setImporters(importers) {\n current = { ...current, importers };\n root.render(<Workshop {...current} />);\n },\n reloadStory: (file) => changes.emit(file),\n setDependencies(dependencies) {\n current = { ...current, dependencies };\n root.render(<Workshop {...current} />);\n },\n revise: () => revision.bump(),\n unmount: () => root.unmount(),\n };\n}\n"]}
1
+ {"version":3,"sources":["../../src/shell/a11y/reasons.ts","../../src/shell/a11y/A11yPanel.tsx","../../src/shell/followEdits.ts","../../src/shell/loupe/captureContext.ts","../../src/shell/storyChanges.ts","../../src/shell/dependencies.ts","../../src/shell/breadcrumb.ts","../../src/shell/treeReveal.ts","../../src/shell/Crumbs.tsx","../../src/shell/useRoute.ts","../../src/shell/IndexTrial.tsx","../../src/shell/loupe/CaptureInputs.tsx","../../src/shell/storyMarks.ts","../../src/shell/documentInstrument.tsx","../../src/shell/cssVars/reveal.ts","../../src/shell/cssVars/SectionJump.tsx","../../src/shell/cssVars/saveScales.ts","../../src/shell/cssVars/saveTokens.ts","../../src/shell/cssVars/useTrialSelection.ts","../../src/shell/cssVars/useThemeSave.ts","../../src/shell/cssVars/useStoryTokens.ts","../../src/shell/cssVars/useThemeTokens.ts","../../src/shell/cssVars/varsHistory.ts","../../src/shell/cssVars/CssVarsPanel.tsx","../../src/shell/cssVars/cssVarsChrome.ts","../../src/shell/keys/keyRows.ts","../../src/shell/keys/KeysPanel.tsx","../../src/shell/keys/keysChrome.ts","../../src/shell/info/infoItem.ts","../../src/shell/issues/IssuesPanel.tsx","../../src/shell/issues/tracker.ts","../../src/shell/issues/TrackedIssues.tsx","../../src/shell/issues/issuesSection.tsx","../../src/shell/info/dossier.ts","../../src/shell/info/StoryDossier.tsx","../../src/shell/info/StoryInfoDialog.tsx","../../src/shell/framePool.ts","../../src/shell/loupe/CompareMenu.tsx","../../src/shell/loupe/liveSource.ts","../../src/shell/loupe/tokenChain.ts","../../src/shell/loupe/readouts.tsx","../../src/shell/loupe/frameScroll.ts","../../src/shell/loupe/capturePayload.ts","../../src/shell/loupe/captureClient.ts","../../src/shell/loupe/pixelsLens.ts","../../src/shell/loupe/pixelsSource.ts","../../src/shell/loupe/usePixelsSource.ts","../../src/shell/loupe/ForgeLoupe.tsx","../../src/shell/routedTrial.ts","../../src/timeline/playheadUrl.ts","../../src/timeline/RoutePlayhead.tsx","../../src/shell/GlobalsToolbar.tsx","../../src/shell/globalsMenu.tsx","../../src/shell/RouteKnobs.tsx","../../src/shell/revealTrial.ts","../../src/shell/tree/buildTree.ts","../../src/shell/tree/buildComponents.ts","../../src/shell/tree/StoryTree.tsx","../../src/shell/answers.ts","../../src/shell/readyKey.ts","../../src/shell/frameLink.ts","../../src/shell/keptFrame.ts","../../src/shell/FrameView.tsx","../../src/shell/storyInstrument.tsx","../../src/shell/useStoryRegistry.ts","../../src/shell/Workshop.tsx","../../src/shell/mountWorkshop.tsx"],"names":["createEmitter","createContext","jsx","jsxs","Fragment","useState","useEffect","useLabContext","TrialIdContext","useContext","useRef","token","pending","useMemo","history","now","TOKEN_MANIFEST","useTrialId","usePersistedState","MANIFEST","THEME_SOURCES","generateScale","f","name","useCallback","ToggleBar","Input","Icon","Button","labGlobals","RECORD","useActionsRegistry","formatShortcut","num","handle","shelf","isConfigBranch","listeners","aim","useSyncExternalStore","useLatest","parseColor","isPlainObject","unavailableText","pixels","useReducer","useTrialClockHandle","pref","knobs","valueAtPath","LibraryBadge","setRoute","kept","rest","node","Checkbox","keyOf","frames","adopt","useLayoutEffect","NO_GLOBALS","revisions","ids","libraries","cssVarsChrome","keysChrome"],"mappings":"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","file":"index.js","sourcesContent":["import type { A11yNode } from '../../protocol/messages';\n\n/** axe's message keys for a node it could not decide, said for a person deciding whether to look closer. */\nconst PLAIN: Record<string, string> = {\n bgOverlap: \"axe couldn't tell the background: another element lies on top of this one.\",\n pseudoContent: \"axe couldn't tell the background: a ::before or ::after box paints over or behind this text.\",\n bgGradient: \"axe couldn't tell the background: it is a gradient.\",\n bgImage: \"axe couldn't tell the background: it is an image.\",\n imgNode: \"axe couldn't tell the background: an image or canvas sits behind this text.\",\n elmPartiallyObscured: \"axe couldn't tell the background: it covers only part of this text.\",\n elmPartiallyObscuring: \"axe couldn't tell the background: this text runs across more than one element.\",\n outsideViewport: \"axe couldn't see this text: it is scrolled out of view.\",\n blended: \"Couldn't tell the colors: this text or something around it is see-through, filtered, or blended.\",\n fgAlpha: \"axe couldn't tell the text color: it is partly see-through.\",\n complexTextShadows: \"axe couldn't tell the contrast: the text has a shadow.\",\n equalRatio: 'The text is the same color as its background, so it may be hidden on purpose.',\n shortTextContent: 'Fails contrast, but is a single character that may be a symbol rather than text.',\n nonBmp: 'Holds only symbols or icons, not text.',\n};\n\n/** Why a review item is there, in plain words: the known reasons rewritten, anything else in axe's own sentence. */\nexport function plainReason(reason: A11yNode['reason']): string | null {\n if (!reason) return null;\n return (reason.key ? PLAIN[reason.key] : undefined) ?? reason.message ?? null;\n}\n","import './A11yPanel.css';\nimport {\n Button,\n type LabContribution,\n TrialIdContext,\n useLabContext,\n useTrialId,\n} from '@weasel-js/labkit';\nimport num from '@weasel-js/theme/numeric.module.css';\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport type { A11yFinding, A11yNode } from '../../protocol/messages';\nimport { useTrialFrame } from '../trialFrames';\nimport { plainReason } from './reasons';\n\n/** Called with the elements an item names while the pointer or focus is on it, and with null when it leaves. */\ntype Point = (nodes: readonly A11yNode[] | null) => void;\n\n/** Handlers pointing at `nodes` while the pointer or focus is inside the element they are spread on. */\nfunction pointAt(point: Point, nodes: readonly A11yNode[]) {\n const enter = (event: { stopPropagation(): void }) => {\n event.stopPropagation();\n point(nodes);\n };\n return { onMouseOver: enter, onFocus: enter, onMouseLeave: () => point(null), onBlur: () => point(null) };\n}\n\nfunction Finding({ finding, point }: { finding: A11yFinding; point: Point }) {\n return (\n <li className=\"fg-a11y__finding\" {...pointAt(point, finding.nodes)}>\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 const reason = plainReason(node.reason);\n return (\n <li key={`${finding.id}:${node.target.join(',')}`} {...pointAt(point, [node])}>\n <code>{node.target.join(' ')}</code>\n {reason ? <p className=\"fg-a11y__reason\">{reason}</p> : null}\n </li>\n );\n })}\n </ul>\n </li>\n );\n}\n\nfunction Findings({ title, findings, point }: { title: string; findings: readonly A11yFinding[]; point: Point }) {\n if (findings.length === 0) return null;\n return (\n <section className=\"fg-a11y__group\">\n <h3 className={`fg-a11y__group-title ${num.numeric}`}>\n {title} ({findings.length})\n </h3>\n <ul className=\"fg-a11y__findings\">\n {findings.map((finding) => (\n <Finding key={finding.id} finding={finding} point={point} />\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 [inFlight, setInFlight] = useState(0);\n const running = inFlight > 0;\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 const start = useCallback((run: NonNullable<typeof audit>) => {\n setInFlight((n) => n + 1);\n void run().finally(() => setInFlight((n) => n - 1));\n }, []);\n\n useEffect(() => {\n if (!audit || ran.current === audit) return;\n ran.current = audit;\n start(audit);\n }, [audit, start]);\n\n const send = frame.send;\n const [pointed, setPointed] = useState<readonly A11yNode[] | null>(null);\n useEffect(() => {\n if (!send || !pointed) return;\n send({ type: 'a11y.highlight', targets: pointed.map((node) => node.target) });\n return () => send({ type: 'a11y.highlight', targets: [] });\n }, [send, pointed]);\n\n const rerun = () => {\n if (audit) start(audit);\n };\n\n const outcome = frame.a11y;\n return (\n <div className=\"fg-a11y\">\n <div className=\"fg-a11y__controls\">\n <Button size=\"sm\" 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 ${num.numeric}`}>\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} point={setPointed} />\n <Findings title=\"Needs review\" findings={outcome.report.incomplete} point={setPointed} />\n </>\n ) : null}\n </div>\n );\n}\n\n/** The panel for the lab's focused trial, rendered as though inside that trial. */\nfunction FocusedA11y() {\n const { focusedTrialId, trials, instruments } = useLabContext();\n const record = trials.find((trial) => trial.id === focusedTrialId);\n if (!record) return null;\n const instrument = instruments.find((i) => i.name === record.instrumentName);\n return (\n <section className=\"fg-a11y-focus\" aria-label=\"Accessibility\">\n <p className=\"fg-a11y__trial\">{record.title ?? instrument?.title ?? record.instrumentName}</p>\n <TrialIdContext.Provider value={record.id}>\n <A11yPanel />\n </TrialIdContext.Provider>\n </section>\n );\n}\n\n/** The lab aside section showing the focused trial's accessibility audit. */\nexport const A11Y_SECTION: LabContribution = {\n id: 'fg-a11y',\n region: 'aside',\n item: { title: 'Accessibility', body: <FocusedA11y /> },\n};\n","import type { FrameImporters } from '../frame/mountFrame';\nimport type { DepGraph, IndexEntry } from '../story/types';\nimport type { MountedWorkshop } from './mountWorkshop';\n\n/** The part of vite's `import.meta.hot` the workshop listens on. */\nexport interface HotEvents {\n on(event: string, listener: (data: never) => void): void;\n}\n\n/** What the shell entry hands an accepted importers module to. */\nexport interface FollowedEdits {\n importers(next: FrameImporters | undefined): void;\n}\n\n/**\n * Feeds the workshop what the vite plugin pushes after an edit. An edit to a story file, or to a module one imports,\n * reaches the page as an update of the importers module, whose fresh import() URLs carry the new timestamps; the files\n * it reaches arrive just before, so the reload waits for the importers that can fetch them. Any update at all, a\n * stylesheet's included, means a capture taken before it may show the story as it no longer is.\n */\nexport function followEdits(hot: HotEvents | undefined, workshop: MountedWorkshop): FollowedEdits {\n const stale = new Set<string>();\n hot?.on('forge:index', (next: readonly IndexEntry[]) => workshop.setIndex(next));\n hot?.on('forge:deps', (next: DepGraph) => workshop.setDependencies(next));\n hot?.on('forge:story', ({ file }: { file: string }) => {\n stale.add(file);\n workshop.revise();\n });\n hot?.on('vite:beforeUpdate', () => workshop.revise());\n return {\n importers(next) {\n if (!next) return;\n workshop.setImporters(next);\n for (const file of stale) workshop.reloadStory(file);\n stale.clear();\n },\n };\n}\n","import { createEmitter } from '@weasel-js/registry';\nimport { createContext } from 'react';\nimport type { Layout } from '../../protocol/messages';\nimport type { IndexEntry } from '../../story/types';\nimport type { CssOverrides } from '../cssVars/overrides';\n\n/** A count of story edits since the workshop loaded: a capture taken at an older one shows a story that is gone. */\nexport interface Revision {\n get(): number;\n subscribe(listener: () => void): () => void;\n}\n\nexport function createRevision(): Revision & { bump(): void } {\n let n = 0;\n const bumped = createEmitter<[]>();\n return {\n get: () => n,\n subscribe: bumped.subscribe,\n bump() {\n n += 1;\n bumped.emit();\n },\n };\n}\n\n/** What a trial renders its story from, as a capture of it needs them. */\nexport interface TrialInputs {\n entry: Pick<IndexEntry, 'id' | 'isolate'>;\n layout: Layout;\n /** The trial's whole config, forge's `$` keys included. */\n config: unknown;\n state: unknown;\n overrides: CssOverrides;\n /** Where the story's playhead stands while paused, read when a capture is taken; null while it plays, or with no\n * timeline. */\n playhead(): number | null;\n}\n\n/** Each story trial's inputs, by trial id, published by the trial and read by a Pixels lens over it. */\nexport interface CaptureTrials {\n /** Returns the withdrawal, which leaves a later publish for the same trial standing. */\n publish(trialId: string, inputs: TrialInputs): () => void;\n get(trialId: string): TrialInputs | null;\n subscribe(listener: () => void): () => void;\n}\n\nexport function createCaptureTrials(): CaptureTrials {\n const trials = new Map<string, TrialInputs>();\n const changed = createEmitter<[]>();\n return {\n publish(trialId, inputs) {\n trials.set(trialId, inputs);\n changed.emit();\n return () => {\n if (trials.get(trialId) !== inputs) return;\n trials.delete(trialId);\n changed.emit();\n };\n },\n get: (trialId) => trials.get(trialId) ?? null,\n subscribe: changed.subscribe,\n };\n}\n\n/** Where a Pixels lens asks for captures, and what it captures from; null where no dev server takes captures. */\nexport interface LoupeCapture {\n /** The dev server's base, under which its capture endpoint answers. */\n base: string;\n trials: CaptureTrials;\n revision: Revision;\n}\n\nexport const LoupeCaptureContext = createContext<LoupeCapture | null>(null);\n","import { createEmitter } from '@weasel-js/registry';\n\n/** Story files edited while the workshop runs, for the registry to load again. */\nexport interface StoryChanges {\n subscribe(listener: (file: string) => void): () => void;\n emit(file: string): void;\n}\n\nexport function createStoryChanges(): StoryChanges {\n const changes = createEmitter<[file: string]>();\n return { subscribe: changes.subscribe, emit: changes.emit };\n}\n","import { createContext } from 'react';\nimport type { DepGraph } from '../story/types';\n\n/** The component graph the vite plugin derived from source; null until it arrives. */\nexport const DependenciesContext = createContext<DepGraph | null>(null);\n","/** One step of a story's place: its label, and the tree folder it names — null for the story itself. */\nexport interface Crumb {\n readonly label: string;\n readonly path: string | null;\n}\n\nconst bare = (label: string): string => label.toLowerCase().replace(/[^\\p{L}\\p{N}]/gu, '');\n\n/** Whether a story's name only restates its component's: `KeyDiagram` under `…/KeyDiagram`. */\nexport function restatesTitle(title: string, name: string): boolean {\n return bare(title.slice(title.lastIndexOf('/') + 1)) === bare(name);\n}\n\n/** A story's place step by step: each title segment, then the story's name. An `index` segment adds nothing the\n * one before it does not already say, so it is left out, and so is a name that restates the last segment, which\n * then stands for the story. */\nexport function crumbs(title: string, name: string): Crumb[] {\n const segments = title.split('/');\n const steps: Crumb[] = segments.map((label, i) => ({ label, path: segments.slice(0, i + 1).join('/') }));\n if (restatesTitle(title, name)) steps[steps.length - 1] = { label: segments[segments.length - 1], path: null };\n else steps.push({ label: name, path: null });\n return steps.filter((step, i) => i === 0 || step.label.toLowerCase() !== 'index');\n}\n\n/** A story's place as one line. */\nexport function breadcrumb(title: string, name: string): string {\n return crumbs(title, name)\n .map((step) => step.label)\n .join(' > ');\n}\n","import { createEmitter } from '@weasel-js/registry';\n\nconst reveals = createEmitter<[path: string]>();\n\n/** Asks the story tree to show the folder at `path`, as clicking its row would. */\nexport function revealInTree(path: string): void {\n reveals.emit(path);\n}\n\n/** Hears `revealInTree`; returns the unsubscribe. */\nexport function onRevealInTree(listener: (path: string) => void): () => void {\n return reveals.subscribe(listener);\n}\n","import './Crumbs.css';\nimport type { Instrument } from '@weasel-js/labkit';\nimport { Fragment } from 'react';\nimport type { IndexEntry } from '../story/types';\nimport { breadcrumb, crumbs } from './breadcrumb';\nimport { revealInTree } from './treeReveal';\n\nfunction Crumbs({ entry }: { entry: IndexEntry }) {\n const steps = crumbs(entry.title, entry.name);\n return (\n <span className=\"fg-crumbs\">\n {steps.map((step, i) => (\n <Fragment key={step.path ?? `${step.label}:${i}`}>\n {i > 0 ? (\n <span className=\"fg-crumbs__sep\" aria-hidden=\"true\">\n ›\n </span>\n ) : null}\n {step.path === null ? (\n <span className=\"fg-crumbs__here\">{step.label}</span>\n ) : (\n <button\n type=\"button\"\n className=\"fg-crumbs__step\"\n title={`Show ${step.label} in the story tree`}\n onPointerDown={(event) => event.stopPropagation()}\n onClick={() => revealInTree(step.path as string)}\n >\n {step.label}\n </button>\n )}\n </Fragment>\n ))}\n </span>\n );\n}\n\n/** An entry's trial title: its breadcrumb, drawn with each folder a link to that folder in the story tree. A trial\n * someone renamed shows the name it was given. */\nexport function crumbTitle(entry: IndexEntry): Pick<Instrument, 'title' | 'renderTitle'> {\n const title = breadcrumb(entry.title, entry.name);\n return { title, renderTitle: (shown) => (shown === title ? <Crumbs entry={entry} /> : shown) };\n}\n","import { useEffect, useState } from 'react';\nimport { formatRoute, parseRoute } from '../route/url';\n\n/** What forge keeps on a history entry: its place in the session, and whether reaching it swapped a trial's story in place. */\nexport interface RouteEntry {\n step: number;\n inPlace: boolean;\n /** Set until the knobs first sync: the entry was written for a trial already showing the story, whose config stands. */\n fromTrial?: boolean;\n}\n\n/** The story id `#/<id>` names, or null. */\nexport function readRoute(): string | null {\n return parseRoute(location.hash).story;\n}\n\n/** Every param after the story id: its knobs, and the workshop's reserved params. */\nexport function readRouteParams(): Record<string, string> {\n return { ...parseRoute(location.hash).params };\n}\n\n/**\n * Rewrites the current story's params in place, with no new history entry: `update` is handed every param and\n * returns the ones to keep. The one way anything writes a param, so knobs and reserved params do not overwrite\n * each other. A no-op when no story is named.\n */\nexport function replaceRouteParams(update: (params: Record<string, string>) => Record<string, string>): void {\n const { story, params } = parseRoute(location.hash);\n if (story === null) return;\n const next = formatRoute({ story, params: update({ ...params }) });\n if (next !== location.hash) history.replaceState(history.state, '', next);\n}\n\n/** The current history entry's forge state, or null for one forge did not write, such as a typed URL. */\nexport function readRouteEntry(): RouteEntry | null {\n const state = history.state as { forgeRoute?: unknown } | null;\n const entry = state?.forgeRoute as RouteEntry | undefined;\n return typeof entry?.step === 'number' ? entry : null;\n}\n\n/** Whether moving between two entries crosses an in-place swap: back off one, or forward onto one. */\nexport function crossesInPlace(from: RouteEntry | null, to: RouteEntry | null): boolean {\n if (!from || !to || from.step === to.step) return false;\n return to.step < from.step ? from.inPlace : to.inPlace;\n}\n\nfunction stamp(entry: RouteEntry, hash: string): void {\n history.replaceState({ ...(history.state ?? {}), forgeRoute: entry }, '', hash);\n}\n\n/**\n * Names story `id` in the URL; `inPlace` says it replaced the previous story in its trial. A different story starts\n * with no params, so one story's knobs never reach the next; `fromTrial` says a trial already shows it, and that\n * trial's knobs are written to the URL where they would otherwise be read from it. Naming the current story again\n * keeps the params it has.\n */\nexport function setRoute(id: string, options: { inPlace?: boolean; fromTrial?: boolean } = {}): void {\n if (readRoute() === id) {\n history.replaceState(history.state, '', formatRoute({ story: id, params: readRouteParams() }));\n return;\n }\n const hash = formatRoute({ story: id, params: {} });\n const from = readRouteEntry() ?? { step: 0, inPlace: false };\n stamp(from, location.hash);\n location.hash = hash;\n stamp({ step: from.step + 1, inPlace: options.inPlace ?? false, ...(options.fromTrial ? { fromTrial: true } : {}) }, hash);\n}\n\n/** Whether the current entry was written for a trial already showing its story; asking clears it, so it answers yes once. */\nexport function takeRouteFromTrial(): boolean {\n const entry = readRouteEntry();\n if (!entry?.fromTrial) return false;\n stamp({ step: entry.step, inPlace: entry.inPlace }, location.hash);\n return true;\n}\n\n/** The story the URL names, and `setRoute` to name another. */\nexport function useRoute(): [string | null, typeof setRoute] {\n const [route, setCurrent] = useState(readRoute);\n useEffect(() => {\n const sync = (): void => setCurrent(readRoute());\n window.addEventListener('hashchange', sync);\n sync();\n return () => window.removeEventListener('hashchange', sync);\n }, []);\n return [route, setRoute];\n}\n","import { TrialIdContext, useLabContext } from '@weasel-js/labkit';\nimport { useContext } from 'react';\nimport type { FrameSetup } from '../frame/FrameController';\nimport { indexEnvOf } from '../frame/index/indexEnv';\nimport { IndexPage } from '../frame/index/IndexPage';\nimport type { Globals } from '../protocol/messages';\nimport type { IndexBundle } from '../story/indexBundle';\nimport { DependenciesContext } from './dependencies';\nimport { LiveCopies } from './loupe/LiveCopies';\nimport { TrialHost } from './TrialHost';\nimport { setRoute } from './useRoute';\n\nexport interface IndexTrialProps {\n bundle: IndexBundle;\n setup: FrameSetup;\n config: unknown;\n}\n\n/** A component's index page rendered in the workshop document; `open` swaps its own trial to the story clicked. */\nexport function IndexTrial({ bundle, setup, config }: IndexTrialProps) {\n const lab = useLabContext();\n const trialId = useContext(TrialIdContext);\n const graph = useContext(DependenciesContext);\n const open = (id: string) => {\n if (!trialId || !lab.instruments.some((instrument) => instrument.name === id)) return;\n lab.swapTrial(trialId, id);\n setRoute(id, { inPlace: true });\n };\n const render = (globals: Globals) => (\n <IndexPage env={indexEnvOf(bundle, { graph, globals, decorators: setup.decorators ?? [], open })} render={bundle.render} />\n );\n return (\n <>\n <TrialHost layout=\"fullscreen\" setup={setup} config={config}>\n {render}\n </TrialHost>\n <LiveCopies trialId={trialId} layout=\"fullscreen\" setup={setup} trialConfig={config}>\n {render}\n </LiveCopies>\n </>\n );\n}\n","import { TrialIdContext, useTrialClockHandle } from '@weasel-js/labkit';\nimport { type ReactNode, useContext, useEffect, useMemo, useRef, useState } from 'react';\nimport type { Layout } from '../../protocol/messages';\nimport { shownTime } from '../../timeline/shown';\nimport { useCssOverrides } from '../cssVars/overrides';\nimport { createCaptureTrials, type LoupeCapture, LoupeCaptureContext, type Revision, type TrialInputs } from './captureContext';\nimport { createLiveLenses, LiveLensesContext } from './liveLenses';\n\n/** Props for `CaptureInputs`. */\nexport interface CaptureInputsProps {\n entry: TrialInputs['entry'];\n layout: Layout;\n config: unknown;\n state: unknown;\n /** Whether the story declares a timeline, so the trial's clock is its playhead. A story in a frame has none here. */\n timed?: boolean;\n}\n\n/**\n * Publishes the trial it renders in to the workshop's Pixels lenses: what a capture of its story is made from. A\n * change republishes over the last; only unmounting, or moving to another trial, withdraws it, so a lens never sees\n * the trial gone between the two.\n */\nexport function CaptureInputs({ entry, layout, config, state, timed = false }: CaptureInputsProps) {\n const capture = useContext(LoupeCaptureContext);\n const trialId = useContext(TrialIdContext);\n const [overrides] = useCssOverrides();\n const withdraw = useRef<(() => void) | null>(null);\n const handle = useTrialClockHandle();\n const clock = timed ? (handle?.clock ?? null) : null;\n useEffect(() => {\n if (!capture || !trialId) return;\n const playhead = () => (clock && clock.rate === 0 ? shownTime(clock) : null);\n withdraw.current = capture.trials.publish(trialId, { entry, layout, config, state, overrides, playhead });\n }, [capture, trialId, entry, layout, config, state, overrides, clock]);\n useEffect(\n () => () => {\n withdraw.current?.();\n withdraw.current = null;\n },\n [capture, trialId],\n );\n return null;\n}\n\n/** Props for `LoupeProvider`. */\nexport interface LoupeProviderProps {\n /** The dev server's base; absent, lenses offer no Pixels source. */\n captureBase?: string | undefined;\n /** Bumped on every story edit. */\n revision?: Revision | undefined;\n children: ReactNode;\n}\n\nconst STILL: Revision = { get: () => 0, subscribe: () => () => {} };\n\n/** What the workshop's lenses read from its trials: the Live requests each trial answers, and each trial's inputs. */\nexport function LoupeProvider({ captureBase, revision = STILL, children }: LoupeProviderProps) {\n const [lenses] = useState(createLiveLenses);\n const [trials] = useState(createCaptureTrials);\n const capture = useMemo<LoupeCapture | null>(\n () => (captureBase === undefined ? null : { base: captureBase, trials, revision }),\n [captureBase, trials, revision],\n );\n return (\n <LiveLensesContext.Provider value={lenses}>\n <LoupeCaptureContext.Provider value={capture}>{children}</LoupeCaptureContext.Provider>\n </LiveLensesContext.Provider>\n );\n}\n","import type { AnnotationsCapability, CaptureSource, ContentWindow } from '@weasel-js/labkit';\nimport { scanCssVars } from '../frame/cssVars';\nimport type { StoryHosts } from './storyHosts';\n\nconst SVG_NS = 'http://www.w3.org/2000/svg';\n\n/** Every rule the document can read. A cross-origin sheet refuses, and is skipped. */\nfunction documentCss(doc: Document): string {\n const out: string[] = [];\n for (const sheet of Array.from(doc.styleSheets)) {\n try {\n for (const rule of Array.from(sheet.cssRules)) out.push(rule.cssText);\n } catch {\n // A cross-origin sheet refuses to be read.\n }\n }\n return out.join('\\n');\n}\n\n/** Where a story host's content is: the box its scroller scrolls, and the part of that the host shows. */\nexport interface StoryBox {\n /** The scrolled content's size, never smaller than the host's own box. */\n content: { w: number; h: number };\n /** The host's layout box, at the scroller's offset into the content. */\n shown: ContentWindow;\n}\n\n/**\n * Measures `host` in its content's coordinates. The scroller fills the host, so a point of the content sits at the\n * same place in both once the scroll offset is taken off. Layout sizes, which a zoomed stage leaves alone.\n */\nexport function storyBox(host: HTMLElement | null): StoryBox {\n const w = Math.max(1, host?.offsetWidth ?? 0);\n const h = Math.max(1, host?.offsetHeight ?? 0);\n const scroller = host?.querySelector<HTMLElement>(':scope > .fg-story__scroll') ?? null;\n return {\n content: { w: Math.max(w, scroller?.scrollWidth ?? 0), h: Math.max(h, scroller?.scrollHeight ?? 0) },\n shown: { x: scroller?.scrollLeft ?? 0, y: scroller?.scrollTop ?? 0, w, h },\n };\n}\n\n/**\n * A story host's whole content as an SVG picture, however far it scrolls: its DOM inside a `<foreignObject>`, with\n * the document's stylesheets beside it, and the host's copy sized to the content so its scroller shows all of it.\n *\n * The capture root is a `<div>`, so nothing a rule hangs off `:root`, `html` or `body` reaches the story — hence the\n * custom properties, as they resolve on the host, restated on the root: theme tokens travel by them.\n */\nexport function captureHost(host: HTMLElement): Extract<CaptureSource, { kind: 'svg' }> {\n const doc = host.ownerDocument;\n const { w, h } = storyBox(host).content;\n const root = doc.createElement('div');\n root.setAttribute('data-fg-capture', '');\n const tokens = scanCssVars(doc, undefined, host)\n .filter((v) => v.value)\n .map((v) => `${v.name}: ${v.value};`)\n .join('');\n const style = doc.createElement('style');\n style.textContent = [\n documentCss(doc),\n `[data-fg-capture]{${tokens}}`,\n `[data-fg-capture] > .fg-story{width:${w}px;height:${h}px}`,\n ].join('\\n');\n const copy = host.cloneNode(true) as HTMLElement;\n // Pending only hides the host from view until its fonts have painted; a still picture has no jump to hide.\n copy.removeAttribute('data-pending');\n root.append(style, copy);\n // XML, not HTML: an `<svg>` base is parsed again as XML, where `<br>` and friends have to be closed.\n const inner = new XMLSerializer().serializeToString(root);\n return {\n kind: 'svg',\n markup: `<svg xmlns=\"${SVG_NS}\" width=\"${w}\" height=\"${h}\" viewBox=\"0 0 ${w} ${h}\"><foreignObject x=\"0\" y=\"0\" width=\"${w}\" height=\"${h}\">${inner}</foreignObject></svg>`,\n };\n}\n\n/**\n * The story's host as the one region of a trial that takes marks. Marks live in the coordinates of the content the\n * host scrolls, so they move with it, and an export draws them over a capture of all of that content.\n */\nexport function storyMarks(hosts: StoryHosts): AnnotationsCapability<unknown, unknown> {\n return {\n targets: (_state, _config, trial) => {\n const ref = hosts.ref(trial.id);\n const { content, shown } = storyBox(ref.current);\n return [\n {\n id: 'story',\n ref,\n content,\n shown,\n // Out of view, a host holds no content; it is rendered for the capture rather than scrolled to, which\n // would move the reader's view.\n base: async () => {\n const release = await hosts.show(trial.id);\n try {\n if (!ref.current) throw new Error('[forge] the story has no host to capture');\n return captureHost(ref.current);\n } finally {\n release();\n }\n },\n },\n ];\n },\n };\n}\n","import { type Instrument, TrialTransport } from '@weasel-js/labkit';\nimport { type ConfigSchema, f } from '@weasel-js/labkit/config';\nimport { useEffect } from 'react';\nimport type { FrameSetup } from '../frame/FrameController';\nimport type { IndexEntry } from '../story/types';\nimport { clockSpecOf } from '../timeline/clockSpec';\nimport '../timeline/transport.css';\nimport { crumbTitle } from './Crumbs';\nimport { type GlobalDeclarations, storyConfig, withGlobals } from './globals';\nimport { IndexTrial } from './IndexTrial';\nimport type { Loaded } from '../story/indexBundle';\nimport { CaptureInputs } from './loupe/CaptureInputs';\nimport type { StoryHosts } from './storyHosts';\nimport { storyMarks } from './storyMarks';\nimport { StoryTrial } from './StoryTrial';\n\nexport type { Loaded };\n\nexport interface DocumentInstrumentOptions {\n entry: IndexEntry;\n loaded: Loaded;\n setup: FrameSetup;\n globals?: GlobalDeclarations;\n /** The workshop's story hosts. Without them the instrument takes no marks. */\n hosts?: StoryHosts;\n}\n\n/** A loaded story, or index page, as a lab instrument rendering in the workshop document. */\nexport function documentInstrument(options: DocumentInstrumentOptions): Instrument<unknown, unknown> {\n const { entry, loaded, setup, globals = {}, hosts } = options;\n const schema = loaded.kind === 'story' ? loaded.story.config : (f.schema({}) as ConfigSchema<unknown>);\n const timeline = loaded.kind === 'story' ? loaded.story.timeline : null;\n const config = withGlobals(schema, globals);\n const initialState = loaded.kind === 'story' ? loaded.story.initialState : null;\n return {\n name: entry.id,\n ...crumbTitle(entry),\n config,\n defaultConfig: () => config.defaults(),\n initialState: (c) => initialState?.(c) ?? null,\n render: (ctx) => (\n <>\n {loaded.kind === 'story' ? (\n <StoryTrial key={loaded.story.id} story={loaded.story} setup={setup} ctx={ctx} />\n ) : (\n <IndexTrial bundle={loaded.bundle} setup={setup} config={ctx.config} />\n )}\n <CaptureInputs\n entry={entry}\n layout={loaded.kind === 'story' ? loaded.story.layout : 'fullscreen'}\n config={ctx.config}\n state={ctx.state}\n timed={timeline !== null}\n />\n </>\n ),\n ...(hosts ? { annotations: storyMarks(hosts) } : {}),\n ...(loaded.kind === 'story' && loaded.story.viewport\n ? { stage: { size: { width: loaded.story.viewport.width, height: loaded.story.viewport.height } } }\n : {}),\n ...(timeline\n ? {\n clock: (c: unknown) => clockSpecOf(timeline(storyConfig(c))),\n chrome: [{ id: 'fg-transport', region: 'status', render: (c) => <TrialTransport trialId={c.trialId} className=\"fg-transport\" /> }],\n }\n : {}),\n };\n}\n\nexport interface PendingInstrumentOptions {\n entry: IndexEntry;\n globals?: GlobalDeclarations;\n /** Asked for the entry's module the first time a trial renders it. */\n load: (entry: IndexEntry) => void;\n /** Why the module could not load, when it could not. */\n fault?: Error;\n /** Bumped by a reload, so a face already mounted asks again. */\n generation?: number;\n}\n\n/** Why a trial has no story to show, drawn over its whole stage. */\nfunction Fault({ phase, message }: { phase: string; message: string }) {\n return (\n <div className=\"fg-fault\" role=\"alert\">\n <span className=\"fg-fault__phase\">{phase}</span>\n <p className=\"fg-fault__message\">{message}</p>\n </div>\n );\n}\n\n/** The instrument's face while its module loads, and the fault when the load fails. */\nfunction StoryLoad({ entry, load, fault }: PendingInstrumentOptions) {\n useEffect(() => {\n if (!fault) load(entry);\n }, [entry, load, fault]);\n return (\n <div className=\"fg-story fg-story--loading\" data-fg-layout=\"fullscreen\">\n {fault ? <Fault phase=\"import\" message={fault.message} /> : null}\n </div>\n );\n}\n\n/** An entry's instrument before its module has loaded: an empty schema, and a render that asks for the load. */\nexport function pendingInstrument(options: PendingInstrumentOptions): Instrument<unknown, unknown> {\n const { entry, globals = {} } = options;\n const config = withGlobals(f.schema({}) as ConfigSchema<unknown>, globals);\n return {\n name: entry.id,\n ...crumbTitle(entry),\n config,\n defaultConfig: () => config.defaults(),\n initialState: () => null,\n render: () => <StoryLoad key={options.generation ?? 0} {...options} />,\n };\n}\n\n/** The instrument a trial runs when the URL names `id` and no story has it, so the stage says so. */\nexport function missingInstrument(id: string, globals: GlobalDeclarations = {}): Instrument<unknown, unknown> {\n const config = withGlobals(f.schema({}) as ConfigSchema<unknown>, globals);\n return {\n name: id,\n title: `No story ${id}`,\n config,\n defaultConfig: () => config.defaults(),\n initialState: () => null,\n render: () => (\n <div className=\"fg-story fg-story--loading\" data-fg-layout=\"fullscreen\">\n <Fault phase=\"route\" message={`No story ${id}`} />\n </div>\n ),\n };\n}\n","import { tokenCategory, type TokenCategory, type TokenEntry } from '@weasel-js/ui/components/TokenPanel';\nimport { type RefObject, useEffect, useLayoutEffect, useRef, useState } from 'react';\n\nconst listeners = new Set<(name: string) => void>();\n/**\n * The token asked for until a panel has marked it, or has looked and lists it nowhere. The panel can mount only\n * after the reveal that turned it on, and the lab can mount it more than once on the way, so a reveal is spent by\n * the mark, not by being heard.\n */\nlet pending: string | null = null;\n\n/** Asks the CSS vars panel to open at the custom property `name`. */\nexport function revealVar(name: string): void {\n pending = name;\n for (const fn of [...listeners]) fn(name);\n}\n\n/** Calls `fn` with each token asked for, and at once with one asked for that no panel has marked yet. */\nexport function subscribeReveal(fn: (name: string) => void): () => void {\n listeners.add(fn);\n if (pending !== null) fn(pending);\n return () => {\n listeners.delete(fn);\n };\n}\n\nexport type RevealTab = 'theme' | 'story';\n\n/** How the panel brings a token into its list: the tab that lists it, and the section it is filed under. */\nexport type ShowToken = (name: string, tab: RevealTab, category: TokenCategory) => void;\n\nconst MARK = 'data-revealed';\n\n/**\n * Answers reveals for a CSS vars panel: brings the token into view through `show`, then marks its row — or its\n * swatch or slider thumb, which carry its name the same way — in `list` and scrolls to it. A token neither tab\n * lists is dropped once the story's frame has reported its variables, and shown when they arrive if it is among them.\n */\nexport function useRevealToken(\n list: RefObject<HTMLElement | null>,\n tokens: Readonly<Record<RevealTab, readonly TokenEntry[]>>,\n show: ShowToken,\n storyReported: boolean,\n): void {\n // The token to mark, until it is marked; a render is asked for, and the mark lands once its row is drawn.\n const asked = useRef<string | null>(null);\n const [, rerender] = useState(0);\n useEffect(\n () =>\n subscribeReveal((name) => {\n const tab = (['theme', 'story'] as const).find((t) => tokens[t].some((token) => token.name === name));\n const token = tab && tokens[tab].find((t) => t.name === name);\n if (!tab || !token) {\n if (storyReported && pending === name) pending = null;\n return;\n }\n show(name, tab, tokenCategory(token));\n asked.current = name;\n rerender((n) => n + 1);\n }),\n [tokens, show, storyReported],\n );\n useLayoutEffect(() => {\n const root = list.current;\n const revealed = asked.current;\n if (!root || revealed === null) return;\n const target = root.querySelector(`[aria-label=\"${revealed.replace(/[\"\\\\]/g, '\\\\$&')}\"]`);\n for (const el of Array.from(root.querySelectorAll(`[${MARK}]`))) if (el !== target) el.removeAttribute(MARK);\n if (!target) return;\n target.setAttribute(MARK, '');\n target.scrollIntoView?.({ block: 'nearest' });\n if (pending === revealed) pending = null;\n asked.current = null;\n });\n}\n","import type { IconRef } from '@weasel-js/icons';\nimport { Icon } from '@weasel-js/ui/components/Icon';\nimport { ToggleBar, type ToggleBarItem } from '@weasel-js/ui/components/ToggleBar';\nimport { TOKEN_CATEGORIES, type TokenCategory } from '@weasel-js/ui/components/TokenPanel';\nimport { useEffect, useRef, useState } from 'react';\nimport { icon } from '../../icons.gen';\n\nconst ICONS: Record<TokenCategory, IconRef> = {\n color: /* @icon */ 'ui:drop',\n type: /* @icon */ 'ui:type',\n size: /* @icon */ 'core:measure',\n motion: /* @icon */ 'ui:curveEaseInOut',\n depth: /* @icon */ 'ui:layers',\n other: /* @icon */ 'ui:more',\n};\n\nconst PANEL = '.fg-css-vars';\nconst HOST = '.lk-sidebar-section, .lk-panel-tile';\nconst MANUAL = ['wheel', 'touchmove', 'keydown'] as const;\n\nconst LIST = '.fg-css-vars__list';\n\n/** The top of the list's own scroller, which is the line a section counts as reached at. */\nfunction readLine(panel: Element): number {\n return (panel.querySelector(LIST) ?? panel).getBoundingClientRect().top;\n}\n\nfunction sectionsOf(panel: Element): HTMLElement[] {\n return [...panel.querySelectorAll<HTMLElement>('[data-token-category]')];\n}\n\n/** The CSS Vars panel's sections as a row of icons: picks one to scroll to it, and lights the one at the top. */\nexport function SectionJump() {\n const ref = useRef<HTMLDivElement>(null);\n const [present, setPresent] = useState<readonly TokenCategory[]>([]);\n const [current, setCurrent] = useState<TokenCategory | null>(null);\n // A picked section stays lit until the reader scrolls by hand: near the end of the list it cannot reach the top.\n const held = useRef(false);\n\n useEffect(() => {\n // The section holding this bar holds the panel too, docked or torn out, and outlives a remount of the panel.\n const root = ref.current?.closest(HOST) ?? document.body;\n const read = () => {\n const panel = root.querySelector(PANEL);\n const sections = panel ? sectionsOf(panel) : [];\n setPresent(sections.map((s) => s.dataset.tokenCategory as TokenCategory));\n if (!panel || held.current) return;\n const line = readLine(panel) + 1;\n let top = sections[0]?.dataset.tokenCategory as TokenCategory | undefined;\n for (const s of sections) if (s.getBoundingClientRect().top <= line) top = s.dataset.tokenCategory as TokenCategory;\n setCurrent(top ?? null);\n };\n const release = () => {\n held.current = false;\n };\n read();\n const observer = new MutationObserver(read);\n observer.observe(root, { childList: true, subtree: true });\n // Capturing, so a scroll anywhere above the panel reaches it whichever box ends up scrolling.\n document.addEventListener('scroll', read, { capture: true, passive: true });\n for (const type of MANUAL) document.addEventListener(type, release, { capture: true, passive: true });\n return () => {\n observer.disconnect();\n document.removeEventListener('scroll', read, { capture: true });\n for (const type of MANUAL) document.removeEventListener(type, release, { capture: true });\n };\n }, []);\n\n const items: ToggleBarItem<TokenCategory>[] = TOKEN_CATEGORIES.map(({ id, title }) => ({\n value: id,\n label: <Icon name={ICONS[id]} size={14} />,\n ariaLabel: title,\n tooltip: title,\n disabled: !present.includes(id),\n }));\n\n const jump = (next: TokenCategory | null) => {\n const panel = ref.current?.closest(HOST)?.querySelector(PANEL);\n const target = next && panel?.querySelector(`[data-token-category=\"${next}\"]`);\n const scroller = panel?.querySelector(LIST);\n if (!panel || !target || !scroller) return;\n held.current = true;\n setCurrent(next);\n scroller.scrollTop += target.getBoundingClientRect().top - readLine(panel);\n };\n\n return (\n <div ref={ref} className=\"fg-css-vars__jump\">\n <ToggleBar ariaLabel=\"Jump to section\" variant=\"flat\" size=\"sm\" items={items} value={current} onChange={jump} />\n </div>\n );\n}\n","import type { TokenScaleRule } from '@weasel-js/labkit';\nimport { isByAxis, type AxisDefs, type Selection, type ThemeDefinition } from '@weasel-js/theme';\nimport type { Globals } from '../../protocol/messages';\n\n/** A scale as the panel left it: what a save writes into the definition. */\nexport interface ScaleEdit {\n readonly base: number;\n readonly rule: TokenScaleRule;\n}\n\nexport type ScaleEditResult =\n | { readonly ok: true; readonly definition: ThemeDefinition }\n | { readonly ok: false; readonly message: string };\n\nexport type Holder = Record<string | number, unknown>;\n\nexport interface Slot {\n readonly holder: Holder;\n readonly key: string | number;\n /** Where the slot is, for a message: `scales.font-size.base`, `seeds.ui-base.compact`. */\n readonly where: string;\n}\n\nconst SEED_REF = /^\\{seeds\\.([^}]+)\\}$/;\nconst RULE_KEYS = { factors: 'factors', ratio: 'ratio', step: 'step' } as const;\n\n/**\n * The axis values a trial renders under, from the workshop's globals: a global named for an axis picks its value; an\n * axis no global names renders at its default. A global holding something the axis does not offer (`mode: 'auto'`)\n * leaves that axis out, because which value it resolved to is not known here.\n */\nexport function selectionFor(axes: AxisDefs, globals: Globals): Selection {\n const out: Record<string, string> = {};\n for (const [axis, def] of Object.entries(axes)) {\n const value = globals[axis];\n if (value === undefined) out[axis] = def.default;\n else if (typeof value === 'string' && value in def.values) out[axis] = value;\n }\n return out;\n}\n\nexport class EditError extends Error {}\n\n/** `holder[key]` followed through its per-axis branches to the one `selection` reads. */\nexport function branchOf(holder: Holder, key: string | number, where: string, selection: Selection): Slot {\n let slot: Slot = { holder, key, where };\n for (let value = holder[key]; isByAxis(value); value = slot.holder[slot.key]) {\n const axis = value.by;\n const picked = selection[axis];\n if (picked === undefined || picked === 'by' || !(picked in value)) {\n throw new EditError(`${slot.where} differs by ${axis}, and which ${axis} this trial shows is not known`);\n }\n slot = { holder: value as unknown as Holder, key: picked, where: `${slot.where}.${picked}` };\n }\n return slot;\n}\n\n/** Follows a param through its per-axis branches and `{seeds.name}` references to the number that defines it. */\nfunction slotOf(root: ThemeDefinition, holder: Holder, key: string | number, where: string, selection: Selection, depth = 0): Slot {\n if (depth > 16) throw new EditError(`${where} references itself`);\n const slot = branchOf(holder, key, where, selection);\n const { holder: h, key: k, where: w } = slot;\n const value = h[k];\n if (typeof value === 'number') return slot;\n if (typeof value === 'string') {\n const ref = SEED_REF.exec(value);\n if (!ref) throw new EditError(`${w} is \"${value}\", which is not a number or a seed`);\n const name = ref[1]!;\n const seeds = root.seeds as Holder | undefined;\n if (!seeds || !(name in seeds)) throw new EditError(`${w} names the seed \"${name}\", which this theme inherits rather than defines`);\n return slotOf(root, seeds, name, `seeds.${name}`, selection, depth + 1);\n }\n throw new EditError(`${w} is not a number`);\n}\n\n/** The factor list the selection reads, through any per-axis branches. */\nfunction factorsOf(holder: Holder, where: string, selection: Selection): { list: Holder; where: string } {\n const slot = branchOf(holder, 'factors', `${where}.factors`, selection);\n const value = slot.holder[slot.key];\n if (!Array.isArray(value)) throw new EditError(`${slot.where} is not a list`);\n return { list: value as unknown as Holder, where: slot.where };\n}\n\nconst kindOf = (scale: Holder): TokenScaleRule['kind'] | null =>\n scale.factors !== undefined ? 'factors' : scale.ratio !== undefined ? 'ratio' : scale.step !== undefined ? 'step' : null;\n\nconst plainLiteral = (value: unknown): boolean =>\n typeof value === 'number' || (Array.isArray(value) && value.every((v) => typeof v === 'number'));\n\n/** Swaps `scale`'s rule key for another in place, in the same position, since record order is emission order. */\nfunction swapRule(scale: Holder, from: string | null, to: string, value: unknown): void {\n const entries = Object.entries(scale);\n for (const [k] of entries) delete scale[k];\n for (const [k, v] of entries) scale[k === from ? to : k] = k === from ? value : v;\n if (from === null) scale[to] = value;\n}\n\n/**\n * `definition` with each edited scale written back. A number the scale reads through a reference or a per-axis branch\n * is written where it lives — `{seeds.ui-base}` changes the seed, and only the branch for `selection` — so every other\n * axis value keeps its own. Changing a scale's rule kind replaces the rule, which is refused when the old one was\n * anything but a plain literal, since that would flatten it.\n */\nexport function applyScaleEdits(\n definition: ThemeDefinition,\n edits: Readonly<Record<string, ScaleEdit>>,\n selection: Selection,\n): ScaleEditResult {\n const root = structuredClone(definition) as ThemeDefinition & { scales?: Record<string, Holder> };\n const writes = new Map<Holder, Map<string | number, number>>();\n const write = (slot: Slot, value: number) => {\n let byKey = writes.get(slot.holder);\n if (!byKey) writes.set(slot.holder, (byKey = new Map()));\n const pending = byKey.get(slot.key);\n if (pending !== undefined && pending !== value) throw new EditError(`${slot.where} would need to be both ${pending} and ${value}`);\n byKey.set(slot.key, value);\n };\n\n try {\n for (const [name, edit] of Object.entries(edits)) {\n const scales = root.scales;\n const scale = scales?.[name];\n if (!scales || !scale) throw new EditError(`the theme defines no scale \"${name}\"`);\n const where = `scales.${name}`;\n write(slotOf(root, scale, 'base', `${where}.base`, selection), edit.base);\n\n const { rule } = edit;\n const had = kindOf(scale);\n if (had !== rule.kind) {\n const from = had ? RULE_KEYS[had] : null;\n if (from && !plainLiteral(scale[from])) {\n throw new EditError(`${where} would lose its ${from} to become a ${rule.kind} scale, and its ${from} is not a plain number`);\n }\n const value = rule.kind === 'factors' ? [...rule.factors] : rule.kind === 'ratio' ? rule.ratio : rule.step;\n swapRule(scale, from, RULE_KEYS[rule.kind], value);\n continue;\n }\n if (rule.kind === 'factors') {\n const { list, where: at } = factorsOf(scale, where, selection);\n if ((list as unknown as unknown[]).length !== rule.factors.length) {\n throw new EditError(`${at} has ${(list as unknown as unknown[]).length} factors, and the edit ${rule.factors.length}`);\n }\n rule.factors.forEach((factor, i) => write(slotOf(root, list, i, `${at}.${i}`, selection), factor));\n } else {\n const key = RULE_KEYS[rule.kind];\n write(slotOf(root, scale, key, `${where}.${key}`, selection), rule.kind === 'ratio' ? rule.ratio : rule.step);\n }\n }\n } catch (e) {\n if (e instanceof EditError) return { ok: false, message: `Cannot save: ${e.message}.` };\n throw e;\n }\n\n for (const [holder, byKey] of writes) for (const [key, value] of byKey) holder[key] = value;\n return { ok: true, definition: root };\n}\n","import { isPlainObject } from '@weasel-js/core';\nimport type { Selection, ThemeDefinition } from '@weasel-js/theme';\nimport { branchOf, EditError, type Holder, type ScaleEditResult, type Slot } from './saveScales';\n\nconst REFERENCE = /\\{[^}]+\\}/;\n/** The layers a token's value can be written out in, in the order the definition resolves a name. */\nconst LAYERS = ['pins', 'semantics', 'components'] as const;\n\n/** A written-out value, or what makes `entry` something the theme works out instead. */\nfunction derivation(entry: unknown): string | null {\n const value = isPlainObject(entry) ? entry.value : entry;\n if (isPlainObject(entry) && value === undefined) return 'follows a rule';\n if (isPlainObject(entry) && entry.alpha !== undefined) return 'is drawn at an alpha';\n if (typeof value === 'string' && REFERENCE.test(value)) return `follows ${REFERENCE.exec(value)?.[0]}`;\n return typeof value === 'string' || typeof value === 'number' ? null : 'is a list';\n}\n\n/** The place `definition` writes `token`'s value out for `selection`. Throws when it has none. */\nfunction literalSlot(definition: ThemeDefinition, token: string, selection: Selection): Slot {\n for (const layer of LAYERS) {\n const entries = definition[layer] as Holder | undefined;\n if (!entries || !(token in entries)) continue;\n const slot = branchOf(entries, token, `${layer}.${token}`, selection);\n const why = derivation(slot.holder[slot.key]);\n if (why) throw new EditError(`${slot.where} ${why}, and only a value written out in the theme can be saved`);\n return slot;\n }\n for (const layer of ['ramps', 'scales'] as const) {\n const from = Object.keys(definition[layer] ?? {}).find((name) => token.startsWith(`${name}-`));\n if (from) throw new EditError(`${token} is a step ${layer}.${from} generates, and the theme pins no value over it`);\n }\n throw new EditError(`the theme defines no token \"${token}\"`);\n}\n\n/** Whether a save has a place for `token`: the definition writes its value out for `selection`. */\nexport function writtenOut(definition: ThemeDefinition, token: string, selection: Selection): boolean {\n try {\n literalSlot(definition, token, selection);\n return true;\n } catch (e) {\n if (e instanceof EditError) return false;\n throw e;\n }\n}\n\n/**\n * `definition` with each edited token's value written where the definition holds it: a pin, a component or a literal\n * semantic, and only the branch for `selection`. `edits` is keyed by token name, without the `--wzl-` prefix. A token\n * whose value the theme derives is refused, since writing a value over it would drop the derivation.\n */\nexport function applyTokenEdits(\n definition: ThemeDefinition,\n edits: Readonly<Record<string, string>>,\n selection: Selection,\n): ScaleEditResult {\n const root = structuredClone(definition);\n try {\n for (const [token, value] of Object.entries(edits)) {\n const { holder, key } = literalSlot(root, token, selection);\n const entry = holder[key];\n holder[key] = isPlainObject(entry) ? { ...entry, value } : value;\n }\n } catch (e) {\n if (e instanceof EditError) return { ok: false, message: `Cannot save: ${e.message}.` };\n throw e;\n }\n return { ok: true, definition: root };\n}\n","import { type AxisDefs, isColorModePreference, type Selection } from '@weasel-js/theme';\nimport { useResolvedColorMode } from '@weasel-js/theme/react';\nimport { useMemo } from 'react';\nimport type { Globals } from '../../protocol/messages';\nimport { selectionFor } from './saveScales';\n\n/**\n * The axis values a trial renders under. A mode global naming a preference rather than one of the axis's values,\n * as `auto` does, follows the OS scheme, which is what the story's root is given.\n */\nexport function useTrialSelection(axes: AxisDefs, globals: Globals): Selection {\n const { mode } = globals;\n const osMode = useResolvedColorMode(isColorModePreference(mode) ? mode : 'auto');\n return useMemo(() => {\n const selection = selectionFor(axes, globals);\n return axes.mode && osMode in axes.mode.values ? { mode: osMode, ...selection } : selection;\n }, [axes, globals, osMode]);\n}\n","import { type AxisDefs, THEME_SOURCES } from '@weasel-js/theme';\nimport { httpThemeApi, type ThemeApi } from '@weasel-js/theme/engine';\nimport { useMemo, useState } from 'react';\nimport type { Globals } from '../../protocol/messages';\nimport type { CssOverrides } from './overrides';\nimport { applyScaleEdits, type ScaleEdit } from './saveScales';\nimport { applyTokenEdits, writtenOut } from './saveTokens';\nimport { useTrialSelection } from './useTrialSelection';\nimport type { VarsHistory } from './varsHistory';\n\nexport const THEME_NAME = 'weasel';\nexport const TOKEN_PREFIX = '--wzl-';\nconst NO_AXES: AxisDefs = {};\n\ntype Notice = { readonly trialId: string | null; readonly outcome: 'saved' | 'error'; readonly text: string };\n\n/** A scale whose steps all hold what its edit generated. */\nexport interface UnsavedScale {\n /** The scale's name in the definition. */\n readonly name: string;\n /** The panel's group for it, which its edit is kept under. */\n readonly group: string;\n readonly tokens: readonly string[];\n readonly edit: ScaleEdit;\n}\n\nexport interface ThemeSaveOptions {\n readonly trialId: string | null;\n /** The globals the trial renders under, which pick the axis values a save writes into. */\n readonly globals: Globals;\n /** Where a save goes. Defaults to the dev server's theme store. */\n readonly themeApi: ThemeApi | undefined;\n readonly scales: readonly UnsavedScale[];\n readonly overrides: CssOverrides;\n readonly history: VarsHistory;\n}\n\nexport interface ThemeSave {\n /** Whether any edit has a place in the definition to be saved to. */\n readonly pending: boolean;\n readonly saving: boolean;\n readonly notice: Omit<Notice, 'trialId'> | null;\n save(): Promise<void>;\n}\n\n/**\n * Saves a trial's edits into the theme's definition file: each clean scale edit, and each token edited by hand whose\n * value the definition writes out. Every other override stays the trial's own.\n */\nexport function useThemeSave({ trialId, globals, themeApi, scales, overrides, history }: ThemeSaveOptions): ThemeSave {\n const definition = THEME_SOURCES[THEME_NAME];\n const selection = useTrialSelection(definition?.axes ?? NO_AXES, globals);\n const tokens = useMemo(() => {\n if (!definition) return {};\n const generated = new Set(scales.flatMap((scale) => scale.tokens));\n return Object.fromEntries(\n Object.entries(overrides).flatMap(([name, value]) => {\n if (!name.startsWith(TOKEN_PREFIX) || generated.has(name)) return [];\n const token = name.slice(TOKEN_PREFIX.length);\n return writtenOut(definition, token, selection) ? [[token, value]] : [];\n }),\n );\n }, [definition, selection, scales, overrides]);\n\n const [saving, setSaving] = useState(false);\n const [held, setHeld] = useState<Notice | null>(null);\n const setNotice = (next: Omit<Notice, 'trialId'> | null) => setHeld(next && { ...next, trialId });\n\n const save = async () => {\n setSaving(true);\n setNotice(null);\n try {\n const api = themeApi ?? httpThemeApi();\n const stored = await api.get(THEME_NAME);\n const file = `themes/${THEME_NAME}.json`;\n if (JSON.stringify(stored.definition) !== JSON.stringify(THEME_SOURCES[THEME_NAME])) {\n setNotice({ outcome: 'error', text: `${file} has changed since this page loaded. Reload to edit against it.` });\n return;\n }\n const scaled = applyScaleEdits(stored.definition, Object.fromEntries(scales.map((s) => [s.name, s.edit])), selection);\n const next = scaled.ok ? applyTokenEdits(scaled.definition, tokens, selection) : scaled;\n if (!next.ok) {\n setNotice({ outcome: 'error', text: next.message });\n return;\n }\n const result = await api.put(THEME_NAME, next.definition, stored.hash);\n if (result.status === 'conflict') {\n setNotice({ outcome: 'error', text: `${file} changed on disk while saving. Nothing was written; reload to edit against it.` });\n return;\n }\n if (result.status === 'invalid') {\n setNotice({ outcome: 'error', text: result.message });\n return;\n }\n // What was saved is the theme's own now, so nothing from before the save has a value to go back to.\n const saved = new Set([\n ...scales.flatMap((scale) => scale.tokens),\n ...Object.keys(tokens).map((token) => `${TOKEN_PREFIX}${token}`),\n ]);\n const groups = new Set(scales.map((scale) => scale.group));\n const now = history.current();\n history.reset({\n overrides: Object.fromEntries(Object.entries(now.overrides).filter(([name]) => !saved.has(name))),\n scales: Object.fromEntries(Object.entries(now.scales).filter(([group]) => !groups.has(group))),\n });\n setNotice(\n result.regenerated || result.problems.length === 0\n ? { outcome: 'saved', text: `Saved to ${file}.` }\n : { outcome: 'error', text: `Saved to ${file}, but the tokens were not regenerated: ${result.problems.join('; ')}` },\n );\n } catch (e) {\n setNotice({ outcome: 'error', text: `Saving needs forge's dev server, which did not answer: ${(e as Error).message}` });\n } finally {\n setSaving(false);\n }\n };\n\n return {\n pending: scales.length > 0 || Object.keys(tokens).length > 0,\n saving,\n notice: held?.trialId === trialId ? held : null,\n save,\n };\n}\n","import { inferTokenType, type TokenEntry, usePersistedState } from '@weasel-js/labkit';\nimport { TOKEN_MANIFEST } from '@weasel-js/theme';\nimport { useMemo } from 'react';\nimport type { CssVarReport } from '../../protocol/messages';\n\nconst MANIFEST = new Map(TOKEN_MANIFEST.map((token) => [token.name, token]));\n\n/** A reported var's group: its name without the leading dashes or its last segment, which names the step. */\nfunction groupOf(name: string): string {\n const segments = name.replace(/^--/, '').split('-');\n return segments.length > 1 ? segments.slice(0, -1).join('-') : name.replace(/^--/, '');\n}\n\nexport interface StoryTokens {\n readonly tokens: TokenEntry[];\n readonly showUnused: boolean;\n readonly setShowUnused: (show: boolean) => void;\n /** What the panel says when it lists none of them. */\n readonly emptyText: string;\n}\n\n/** The vars a trial's frame reports, the ones its story doesn't use left out until asked for. */\nexport function useStoryTokens(vars: readonly CssVarReport[]): StoryTokens {\n const [showUnused, setShowUnused] = usePersistedState('fg-css-vars-unused', false, { scope: 'lab' });\n const tokens = useMemo<TokenEntry[]>(\n () =>\n vars.flatMap(({ name, value, used }) => {\n if (!used && !showUnused) return [];\n const known = MANIFEST.get(name);\n return [{ name, type: known?.type ?? inferTokenType(value), group: known?.group ?? groupOf(name), value }];\n }),\n [vars, showUnused],\n );\n const emptyText = vars.length > 0 && !showUnused ? 'The story uses no variables.' : 'The story’s frame has reported no variables.';\n return { tokens, showUnused, setShowUnused, emptyText };\n}\n","import type { TokenEntry } from '@weasel-js/labkit';\nimport { resolveTheme, TOKEN_MANIFEST, themeAxes, weaselTheme } from '@weasel-js/theme';\nimport { useMemo } from 'react';\nimport type { CssVarReport, Globals } from '../../protocol/messages';\nimport { useTrialSelection } from './useTrialSelection';\n\nconst AXES = themeAxes(weaselTheme);\n\n/**\n * The theme's tokens as a trial shows them: each at the value its frame reports, or, for one the frame has not\n * reported, at what the theme gives it under the trial's globals.\n */\nexport function useThemeTokens(globals: Globals, vars: readonly CssVarReport[]): TokenEntry[] {\n const selection = useTrialSelection(AXES, globals);\n const themed = useMemo<Readonly<Record<string, string>>>(() => resolveTheme(weaselTheme, selection), [selection]);\n return useMemo(() => {\n const reported = new Map(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) ?? themed[token.name] ?? token.defaultValue,\n description: token.description,\n }));\n }, [vars, themed]);\n}\n","import { createHistory, type SerializedHistory, type SwapArgs, swapOp, useLatest } from '@weasel-js/core';\nimport { type TokenScale, usePersistedState, useTrialId } from '@weasel-js/labkit';\nimport { useEffect, useMemo, useRef, useSyncExternalStore } from 'react';\nimport type { CssOverrides } from './overrides';\n\n/** What an edit in the panel changes: the trial's overrides, and the scale each group's were generated from. */\nexport interface VarsState {\n readonly overrides: CssOverrides;\n readonly scales: Readonly<Record<string, TokenScale>>;\n}\n\nconst SWAP = 'fg.vars.swap';\n/** Edits this close together under one key undo as one, so typing a value is one step. */\nconst COALESCE_MS = 800;\n/** The history is kept with the trial, so it is held to a count. */\nconst LIMIT = 100;\n\nexport interface VarsHistory {\n /** The state as the last edit or step left it, ahead of the render that shows it. */\n current(): VarsState;\n /** Put `next` in force as one step back. Commits in one tick are one step, as are those sharing a `key` close together. */\n commit(next: VarsState, key: string): void;\n step(to: 'undo' | 'redo'): void;\n canUndo: boolean;\n canRedo: boolean;\n /** Put `next` in force and forget every step: nothing before it can be gone back to. */\n reset(next: VarsState): void;\n}\n\n/**\n * The undo history of the CSS variable edits of the trial this is rendered inside, kept with the trial so it\n * outlives a reload. `apply` puts a state in force, given the one it replaces.\n */\nexport function useVarsHistory(state: VarsState, apply: (from: VarsState, to: VarsState) => void): VarsHistory {\n const trialId = useTrialId();\n const [stored, setStored] = usePersistedState<SerializedHistory | null>('fg-css-vars-history', null, { scope: 'trial' });\n const rendered = useLatest(state);\n // What an edit left, until the render that shows it: a second edit in the same tick starts from here.\n const ahead = useRef<VarsState | null>(null);\n useEffect(() => {\n ahead.current = null;\n }, [state]);\n const current = () => ahead.current ?? rendered.current;\n const latestApply = useLatest(apply);\n const emit = (to: VarsState) => {\n const from = current();\n ahead.current = to;\n latestApply.current(from, to);\n };\n const swap = (before: VarsState, after: VarsState, coalesceKey?: string) =>\n swapOp({ name: SWAP, label: 'edit vars', before, after, emit, ...(coalesceKey !== undefined ? { coalesceKey } : {}) });\n\n const history = useMemo(() => {\n const opened = createHistory(null, {\n coalesceWindowMs: COALESCE_MS,\n historyLimit: LIMIT,\n rebuildOp: (name, args) => {\n const { before, after } = args as SwapArgs<VarsState>;\n return name === SWAP ? swap(before, after) : null;\n },\n });\n if (stored) opened.restore(stored);\n return opened;\n // eslint-disable-next-line react-hooks/exhaustive-deps -- a trial's history is opened once, from what was kept with it\n }, [trialId]);\n useSyncExternalStore(history.subscribe, history.getVersion);\n const keep = () => setStored(history.canUndo() || history.canRedo() ? history.serialize() : null);\n\n // The key of the tick's first commit, which the rest of the tick's commits take so they merge into it.\n const tick = useRef<string | null>(null);\n\n return {\n current,\n commit(next, key) {\n if (tick.current === null) {\n tick.current = key;\n queueMicrotask(() => {\n tick.current = null;\n });\n }\n history.applyOps([swap(current(), next, tick.current)], 'edit vars');\n keep();\n },\n step(to) {\n history[to]();\n keep();\n },\n canUndo: history.canUndo(),\n canRedo: history.canRedo(),\n reset(next) {\n emit(next);\n history.clear();\n setStored(null);\n },\n };\n}\n","import './cssVars.css';\nimport {\n Input,\n type LabContribution,\n ToggleBar,\n type ToggleBarItem,\n refitScale,\n type TokenCategory,\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, type ThemeApi } from '@weasel-js/theme/engine';\nimport { historyKey } from '@weasel-js/core';\nimport { Button } from '@weasel-js/ui/components/Button';\nimport { Checkbox } from '@weasel-js/ui/components/Checkbox';\nimport { Icon } from '@weasel-js/ui/components/Icon';\nimport { icon } from '../../icons.gen';\nimport { useCallback, useContext, useMemo, useRef, useState } from 'react';\nimport type { Globals } from '../../protocol/messages';\nimport { effectiveGlobals, GLOBALS_KEY } from '../globals';\nimport { StoryGlobalsContext } from '../StoryGlobalsContext';\nimport { useTrialFrame } from '../trialFrames';\nimport { useCssOverrides } from './overrides';\nimport { type ShowToken, useRevealToken } from './reveal';\nimport { SectionJump } from './SectionJump';\nimport { THEME_NAME, type ThemeSave, TOKEN_PREFIX, type UnsavedScale, useThemeSave } from './useThemeSave';\nimport { useStoryTokens } from './useStoryTokens';\nimport { useThemeTokens } from './useThemeTokens';\nimport { useVarsHistory, type VarsState } from './varsHistory';\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[THEME_NAME]?.scales ?? {}).flatMap(([name, def]) => {\n if (!Array.isArray(def.steps)) return [];\n const steps = def.steps as readonly string[];\n const tokens = steps.map((step) => `${TOKEN_PREFIX}${name}-${step}`);\n const group = MANIFEST.get(tokens[0] ?? '')?.group;\n if (!group) return [];\n const factors = Array.isArray(def.factors) && def.factors.every(literal) ? (def.factors as number[]) : null;\n const rule: ScaleSource['rule'] =\n def.factors !== undefined\n ? factors\n ? { kind: 'factors', factors }\n : 'factors'\n : def.ratio !== undefined\n ? literal(def.ratio)\n ? { kind: 'ratio', ratio: def.ratio }\n : 'ratio'\n : literal(def.step)\n ? { kind: 'step', step: def.step }\n : 'step';\n return [{ name, group, steps, tokens, rule }];\n});\n\n/** Each of a scale's tokens and the value `next` gives it. */\nfunction scaleValues(source: ScaleSource, next: TokenScale): [string, string][] {\n const { rule } = next;\n const values = generateScale(source.steps, {\n base: next.base,\n ...(rule.kind === 'factors' ? { factors: rule.factors } : rule.kind === 'ratio' ? { ratio: rule.ratio } : { step: rule.step }),\n });\n return source.steps.flatMap((step, i) => {\n const value = values[step];\n const name = source.tokens[i];\n return value !== undefined && name !== undefined ? [[name, value]] : [];\n });\n}\n\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/**\n * The edited scales a save writes. A scale is saved only while every one of its steps still holds what its edit\n * generated: a step edited by hand after the scale is an override the scale has no place for.\n */\nfunction unsavedScales(edited: Readonly<Record<string, TokenScale>>, overrides: Readonly<Record<string, string>>): UnsavedScale[] {\n return SCALE_SOURCES.flatMap((source): UnsavedScale[] => {\n const edit = edited[source.group];\n if (!edit || !source.tokens.some((name) => overrides[name] !== undefined)) return [];\n const { name, group, tokens } = source;\n const clean = scaleValues(source, edit).every(([token, value]) => overrides[token] === value);\n return clean ? [{ name, group, tokens, edit: { base: edit.base, rule: edit.rule } }] : [];\n });\n}\n\nexport interface CssVarsPanelProps {\n /** The globals the trial renders under, which pick the axis values a save writes into. */\n readonly globals?: Globals;\n /** Where a save goes. Defaults to the dev server's theme store. */\n readonly themeApi?: ThemeApi;\n}\n\nconst NO_GLOBALS: Globals = {};\n\n/**\n * Shows and overrides the CSS variables of the trial it is rendered inside: the theme's tokens, or what its frame\n * reports. A scale edit, and a token the theme writes out, can be saved into the theme's definition file.\n */\nexport function CssVarsPanel({ globals = NO_GLOBALS, themeApi }: CssVarsPanelProps = {}) {\n const trialId = useTrialId();\n const frame = useTrialFrame(trialId);\n const [overrides, setOverrides] = useCssOverrides();\n const [folds, setFolds] = usePersistedState<Partial<Record<TokenCategory, boolean>>>(\n 'fg-css-vars-folds',\n {},\n { scope: 'lab' },\n );\n const [edited, setEdited] = usePersistedState<Readonly<Record<string, TokenScale>>>('fg-css-vars-scales', {}, { scope: 'trial' });\n const [tab, setTab] = useState<Tab>('theme');\n const [filter, setFilter] = useState('');\n\n const themeTokens = useThemeTokens(globals, frame.vars);\n const story = useStoryTokens(frame.vars);\n const tokens = tab === 'theme' ? themeTokens : story.tokens;\n const listRef = useRef<HTMLDivElement>(null);\n const byTab = useMemo(() => ({ theme: themeTokens, story: story.tokens }), [themeTokens, story.tokens]);\n const show = useCallback<ShowToken>((name, at, category) => {\n setTab(at);\n setFilter((was) => (name.toLowerCase().includes(was.trim().toLowerCase()) ? was : ''));\n setFolds((prev) => (prev[category] ? { ...prev, [category]: false } : prev));\n }, [setFolds]);\n useRevealToken(listRef, byTab, show, frame.vars.length > 0);\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 state = useMemo<VarsState>(() => ({ overrides, scales: edited }), [overrides, edited]);\n const history = useVarsHistory(state, (from, to) => {\n setOverrides(to.overrides);\n setEdited(to.scales);\n for (const name of new Set([...Object.keys(from.overrides), ...Object.keys(to.overrides)])) {\n if (from.overrides[name] !== to.overrides[name]) send?.({ type: 'vars.set', name, value: to.overrides[name] ?? null });\n }\n });\n const write = (name: string, value: string | null) => {\n const now = history.current();\n const { [name]: _dropped, ...rest } = now.overrides;\n history.commit({ ...now, overrides: value === null ? rest : { ...rest, [name]: value } }, `token:${name}`);\n };\n const onScaleChange = (group: string, next: TokenScale) => {\n const source = SCALE_SOURCES.find((sc) => sc.group === group);\n if (!source) return;\n const now = history.current();\n history.commit(\n { overrides: { ...now.overrides, ...Object.fromEntries(scaleValues(source, next)) }, scales: { ...now.scales, [group]: next } },\n `scale:${group}`,\n );\n };\n\n const unsaved = useMemo(() => unsavedScales(edited, overrides), [edited, overrides]);\n const { pending, saving, notice, save } = useThemeSave({ trialId, globals, themeApi, scales: unsaved, overrides, history });\n const onCollapsedChange = useCallback(\n (category: TokenCategory, collapsed: boolean) => setFolds((prev) => ({ ...prev, [category]: collapsed })),\n [setFolds],\n );\n\n return (\n // Capture: React Aria's fields stop a keydown from bubbling past them.\n <div\n className=\"fg-css-vars\"\n onKeyDownCapture={(e) => {\n // The filter's text has its own undo.\n const to = (e.target as HTMLElement).closest('.fg-css-vars__filter') ? null : historyKey(e);\n if (!to) return;\n e.preventDefault();\n history.step(to);\n }}\n >\n <div className=\"fg-css-vars__controls\">\n <div className=\"fg-css-vars__bar\">\n <ToggleBar\n ariaLabel=\"Variables\"\n variant=\"flat\"\n size=\"sm\"\n items={TABS}\n value={tab}\n onChange={(next) => {\n if (next) setTab(next);\n }}\n />\n <Input\n className=\"fg-css-vars__filter\"\n aria-label=\"Filter\"\n placeholder=\"Filter\"\n value={filter}\n onChange={setFilter}\n leadingAdornment={<Icon name={/* @icon */ 'ui:search'} size={12} />}\n />\n <div className=\"fg-css-vars__steps\" role=\"group\" aria-label=\"History\">\n <Button iconOnly ariaLabel=\"Undo\" variant=\"ghost\" size=\"sm\" disabled={!history.canUndo} onClick={() => history.step('undo')}>\n <Icon name={/* @icon */ 'core:undo'} size={14} />\n </Button>\n <Button iconOnly ariaLabel=\"Redo\" variant=\"ghost\" size=\"sm\" disabled={!history.canRedo} onClick={() => history.step('redo')}>\n <Icon name={/* @icon */ 'core:redo'} size={14} />\n </Button>\n </div>\n </div>\n {tab === 'story' ? (\n <Checkbox className=\"fg-css-vars__unused\" isSelected={story.showUnused} onChange={story.setShowUnused}>\n Show variables the story doesn’t use\n </Checkbox>\n ) : null}\n {tab === 'theme' ? <SaveRow pending={pending} saving={saving} notice={notice} onSave={() => void save()} /> : null}\n </div>\n {shown.length === 0 ? (\n <p className=\"fg-css-vars__empty\">\n {tokens.length > 0 ? 'No variables match.' : tab === 'story' ? story.emptyText : 'The story’s frame has reported no variables.'}\n </p>\n ) : (\n <div ref={listRef} className=\"fg-css-vars__list\">\n <TokenPanel\n tokens={shown}\n namePrefix={TOKEN_PREFIX}\n onChange={write}\n scales={scales}\n onScaleChange={onScaleChange}\n collapsed={folds}\n onCollapsedChange={onCollapsedChange}\n />\n </div>\n )}\n </div>\n );\n}\n\ninterface SaveRowProps extends Pick<ThemeSave, 'pending' | 'saving' | 'notice'> {\n readonly onSave: () => void;\n}\n\n/** The Save to theme button while there is something to save, and what the last save said. */\nfunction SaveRow({ pending, saving, notice, onSave }: SaveRowProps) {\n if (!pending && !notice) return null;\n return (\n <div className=\"fg-css-vars__save\">\n {pending ? (\n <Button stance=\"confirm\" size=\"sm\" loading={saving} disabled={saving} onClick={onSave}>\n Save to theme\n </Button>\n ) : null}\n {notice ? (\n <p className={`fg-css-vars__notice fg-css-vars__notice--${notice.outcome}`} role={notice.outcome === 'error' ? 'alert' : 'status'}>\n {notice.text}\n </p>\n ) : null}\n </div>\n );\n}\n\n/** The panel for the lab's focused trial, rendered as though inside that trial. */\nfunction FocusedCssVars() {\n const { focusedTrialId, trials, instruments } = useLabContext();\n const labGlobals = useContext(StoryGlobalsContext);\n const record = trials.find((trial) => trial.id === focusedTrialId);\n if (!record) return null;\n const pins = (record.config as Record<string, unknown> | null | undefined)?.[GLOBALS_KEY];\n const instrument = instruments.find((i) => i.name === record.instrumentName);\n return (\n <section className=\"fg-css-vars-focus\" aria-label=\"CSS Vars\">\n <p className=\"fg-css-vars__trial\">{record.title ?? instrument?.title ?? record.instrumentName}</p>\n <TrialIdContext.Provider value={record.id}>\n <CssVarsPanel globals={effectiveGlobals(labGlobals, pins)} />\n </TrialIdContext.Provider>\n </section>\n );\n}\n\nexport const CSS_VARS_SECTION: LabContribution = {\n id: 'fg-css-vars',\n region: 'aside',\n item: { title: 'CSS Vars', actions: <SectionJump />, fill: true, body: <FocusedCssVars /> },\n};\n","import { type LabContribution, usePersistedState } from '@weasel-js/labkit';\nimport { useEffect, useMemo } from 'react';\nimport { icon } from '../../icons.gen';\nimport { CSS_VARS_SECTION } from './CssVarsPanel';\nimport { subscribeReveal } from './reveal';\n\nconst RECORD = 'fg-css-vars-shown';\n\n/** The header's CSS Vars toggle, then the panel itself while the toggle is on. */\nexport function cssVarsChrome(shown: boolean, toggle: () => void): readonly LabContribution[] {\n return [\n {\n id: 'fg-css-vars-toggle',\n region: 'header',\n group: 'story',\n item: { icon: /* @icon */ 'ui:typeBraces', label: 'CSS Vars panel', pressed: shown, onActivate: toggle },\n },\n ...(shown ? [CSS_VARS_SECTION] : []),\n ];\n}\n\n/**\n * Reports `cssVarsChrome` to `onChrome` as the lab's persisted choice changes; off until the toggle is first\n * pressed, or until a token is revealed. Renders nothing; mount it inside the lab, since the choice lives there.\n */\nexport function CssVarsChrome({ onChrome }: { onChrome: (chrome: readonly LabContribution[]) => void }) {\n const [shown, setShown] = usePersistedState<boolean>(RECORD, false, { scope: 'lab' });\n const chrome = useMemo(() => cssVarsChrome(shown, () => setShown((was) => !was)), [shown, setShown]);\n useEffect(() => onChrome(chrome), [chrome, onChrome]);\n useEffect(() => subscribeReveal(() => setShown(true)), [setShown]);\n return null;\n}\n","import {\n type Action,\n type ActionsRegistry,\n actionBindings,\n type GestureSpec,\n keymapLeaderId,\n type KeymapDef,\n keymapShortcuts,\n keySpecShortcut,\n} from '@weasel-js/core';\nimport type { useLabEntries } from '@weasel-js/labkit';\nimport { formatShortcut } from '@weasel-js/ui/components/ToolPalette';\n\n/** What a binding's chip says: the keys for a keystroke, a word for any other gesture. */\nexport function describeBinding(spec: GestureSpec): string {\n const chip = keySpecShortcut(spec);\n if (chip) return spec.kind === 'key-held' ? `Hold ${formatShortcut(chip)}` : (formatShortcut(chip) ?? '');\n switch (spec.kind) {\n case 'wheel': return 'Wheel';\n case 'hover': return 'Hover';\n case 'drag': return 'Drag';\n case 'click': return 'Click';\n default: return spec.kind[0]!.toUpperCase() + spec.kind.slice(1);\n }\n}\n\n/** One registered action and every way to trigger it: `keys` are keystroke chips, `others` the rest. */\nexport interface KeyRow {\n id: string;\n label: string;\n group: string;\n keys: readonly string[];\n others: readonly string[];\n}\n\n/** The keymaps among the lab's installed entries, each with the leader that opens it. */\nexport function keymapDefs(entries: ReturnType<typeof useLabEntries>): KeymapDef[] {\n const defs: KeymapDef[] = [];\n for (const entry of entries.values()) {\n if (!entry.eligibility.keymap) continue;\n const open = entries.get(`${entry.id}.leader`)?.actions?.find((a) => a.id === keymapLeaderId(entry.id));\n const leader = open ? actionBindings(open).map((b) => b.spec) : [];\n if (leader.length === 0) continue;\n defs.push({ id: entry.id, label: entry.presentation?.label ?? entry.id, leader, bindings: entry.bindings ?? [] });\n }\n return defs;\n}\n\n/** A row per action that has a binding, sorted by group then label. A keymap's keys carry the path through\n * their leader (`Loupe ▸ L`), so they never read as the plain key. */\nexport function keyRows(\n actions: readonly Action[],\n defs: readonly KeymapDef[],\n overrides?: ReturnType<ActionsRegistry['bindingOverrides']>,\n): KeyRow[] {\n const inKeymap = new Map<string, string[]>();\n for (const def of defs) {\n for (const [id, chips] of keymapShortcuts(def, overrides)) {\n inKeymap.set(id, [...(inKeymap.get(id) ?? []), ...chips.flatMap((c) => formatShortcut(c) ?? [])]);\n }\n }\n const rows: KeyRow[] = [];\n for (const action of actions) {\n const keys = new Set<string>();\n const others = new Set<string>();\n for (const { spec } of actionBindings(action)) {\n (keySpecShortcut(spec) ? keys : others).add(describeBinding(spec));\n }\n for (const chip of inKeymap.get(action.id) ?? []) keys.add(chip);\n if (keys.size + others.size === 0) continue;\n rows.push({ id: action.id, label: action.label, group: action.group ?? 'other', keys: [...keys], others: [...others] });\n }\n return rows.sort((a, b) => a.group.localeCompare(b.group) || a.label.localeCompare(b.label));\n}\n","import './keys.css';\nimport { useLabEntries, type LabContribution } from '@weasel-js/labkit';\nimport { useActionsRegistry } from '@weasel-js/core';\nimport { useEffect, useMemo, useReducer } from 'react';\nimport { type KeyRow, keymapDefs, keyRows } from './keyRows';\n\nexport { describeBinding } from './keyRows';\n\n/** Every key binding the lab's registry holds, by group, re-read as actions come and go. */\nexport function useKeyRows(): readonly KeyRow[] {\n const registry = useActionsRegistry();\n const entries = useLabEntries();\n const [version, bump] = useReducer((n: number) => n + 1, 0);\n useEffect(() => registry?.subscribe(bump), [registry]);\n return useMemo(\n () => (registry ? keyRows(registry.list(), keymapDefs(entries), registry.bindingOverrides()) : []),\n // `version` is the registry's change signal: `list()` has no identity to key on.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [registry, entries, version],\n );\n}\n\nfunction KeysPanel() {\n const rows = useKeyRows();\n if (rows.length === 0) return <p className=\"fg-keys__empty\">No key bindings.</p>;\n const groups = new Map<string, KeyRow[]>();\n for (const row of rows) groups.set(row.group, [...(groups.get(row.group) ?? []), row]);\n return (\n <div className=\"fg-keys\">\n {[...groups].map(([group, members]) => (\n <section key={group} className=\"fg-keys__group\" aria-label={group}>\n <h3 className=\"fg-keys__heading\">{group}</h3>\n <ul className=\"fg-keys__list\">\n {members.map((row) => (\n <li key={row.id} className=\"fg-keys__row\">\n <span className=\"fg-keys__label\">{row.label}</span>\n <span className=\"fg-keys__chips\">\n {row.keys.map((chip) => (\n <kbd key={chip} className=\"fg-keys__chip\">{chip}</kbd>\n ))}\n {row.others.map((chip) => (\n <kbd key={chip} className=\"fg-keys__chip fg-keys__chip--gesture\">{chip}</kbd>\n ))}\n </span>\n </li>\n ))}\n </ul>\n </section>\n ))}\n </div>\n );\n}\n\nexport const KEYS_SECTION: LabContribution = {\n id: 'fg-keys',\n region: 'aside',\n item: { title: 'Keys', body: <KeysPanel /> },\n};\n","import { type Action, useActionsRegistry } from '@weasel-js/core';\nimport { type LabContribution, usePersistedState } from '@weasel-js/labkit';\nimport { useEffect, useMemo } from 'react';\nimport { icon } from '../../icons.gen';\nimport { KEYS_SECTION } from './KeysPanel';\n\nconst RECORD = 'fg-keys-shown';\n\nexport const KEYS_TOGGLE_ID = 'forge.keys.toggle';\n\n/** Matched by code: Alt changes the character a key produces on macOS. Never plain `?`, which would fire while typing. */\nconst OPEN_KEY = { kind: 'key', key: '/', code: 'Slash', mods: { alt: true } } as const;\n\n/** The header's Keys toggle, then the panel itself while the toggle is on. */\nexport function keysChrome(shown: boolean, toggle: () => void): readonly LabContribution[] {\n return [\n {\n id: 'fg-keys-toggle',\n region: 'header',\n group: 'story',\n item: { icon: /* @icon */ 'ui:keyboard', label: 'Keys panel', pressed: shown, onActivate: toggle },\n },\n ...(shown ? [KEYS_SECTION] : []),\n ];\n}\n\n/**\n * Reports `keysChrome` to `onChrome` as the lab's persisted choice changes, and answers Alt+Slash by flipping it.\n * Renders nothing; mount it inside the lab, since the choice lives there.\n */\nexport function KeysChrome({ onChrome }: { onChrome: (chrome: readonly LabContribution[]) => void }) {\n const [shown, setShown] = usePersistedState<boolean>(RECORD, false, { scope: 'lab' });\n const registry = useActionsRegistry();\n const chrome = useMemo(() => keysChrome(shown, () => setShown((was) => !was)), [shown, setShown]);\n useEffect(() => onChrome(chrome), [chrome, onChrome]);\n useEffect(() => {\n if (!registry) return;\n const action: Action = {\n id: KEYS_TOGGLE_ID,\n label: 'Toggle the keys panel',\n group: 'forge',\n defaultBinding: [{ spec: OPEN_KEY, opts: { id: KEYS_TOGGLE_ID } }],\n invoker: { timing: 'immediate', run: () => setShown((was) => !was) },\n };\n return registry.register(action);\n }, [registry, setShown]);\n return null;\n}\n","import { formatShortcut } from '@weasel-js/ui/components/ToolPalette';\nimport type { LabChromeContext, LabHeaderItem } from '@weasel-js/labkit';\nimport { icon } from '../../icons.gen';\n\nconst KEYS = { kind: 'key', key: 'i', mods: { mod: true } } as const;\n\n/** The lab header's Info command; ⌘I / Ctrl+I runs it from anywhere but a text field. */\nexport function infoItem(open: () => void): LabHeaderItem<LabChromeContext> {\n return {\n icon: /* @icon */ 'ui:info',\n label: 'Info',\n shortcut: formatShortcut({ key: KEYS.key, mod: KEYS.mods.mod }),\n keys: KEYS,\n onActivate: open,\n };\n}\n","import './issues.css';\nimport num from '@weasel-js/theme/numeric.module.css';\nimport { Button } from '@weasel-js/ui/components/Button';\nimport { Input } from '@weasel-js/ui/components/Input';\nimport { TextArea } from '@weasel-js/ui/components/TextArea';\nimport { type FormEvent, useState } from 'react';\nimport type { ForgeIssue } from '../../vite/issues/answer';\nimport type { IssueReport } from './tracker';\n\nexport type { ForgeIssue } from '../../vite/issues/answer';\nexport type { IssueReport } from './tracker';\n\nexport interface IssuesPanelProps {\n component: string;\n storyId: string;\n /** The component's open issues. Absent, the panel is not connected to a tracker and says so. */\n issues?: readonly ForgeIssue[];\n /** Shown in place of the list when `issues` is absent: why the tracker lists nothing, or that it is still asking. */\n listNote?: string;\n /** Absent, the Report button stays disabled. */\n onReport?: (report: IssueReport) => void;\n}\n\nconst dateFormat = new Intl.DateTimeFormat(undefined, { dateStyle: 'medium' });\n\nfunction IssueList({ component, issues, note }: { component: string; issues?: readonly ForgeIssue[]; note?: string }) {\n if (!issues) return <p className=\"fg-issues__note\">{note ?? 'Not connected to an issue tracker.'}</p>;\n if (issues.length === 0) return <p className=\"fg-issues__note\">No open issues for {component}.</p>;\n return (\n <ul className=\"fg-issues__list\">\n {issues.map((issue) => (\n <li key={issue.number} className=\"fg-issues__item\">\n <a href={issue.url} target=\"_blank\" rel=\"noreferrer\" className=\"fg-issues__link\">\n <span className={`fg-issues__number ${num.numeric}`}>#{issue.number}</span>\n <span className=\"fg-issues__title\">{issue.title}</span>\n </a>\n <time className={`fg-issues__opened ${num.numeric}`} dateTime={issue.opened}>\n {dateFormat.format(new Date(issue.opened))}\n </time>\n </li>\n ))}\n </ul>\n );\n}\n\n/** A component's open issues, and a form for reporting a new one. */\nexport function IssuesPanel({ component, storyId, issues, listNote, onReport }: IssuesPanelProps) {\n const [title, setTitle] = useState('');\n const [body, setBody] = useState('');\n const canReport = onReport !== undefined && title.trim() !== '';\n const submit = (event: FormEvent) => {\n event.preventDefault();\n if (!canReport) return;\n onReport({ component, storyId, title: title.trim(), body });\n setTitle('');\n setBody('');\n };\n return (\n <div className=\"fg-issues\">\n <section className=\"fg-issues__group\" aria-label=\"Open issues\">\n <h3 className=\"fg-issues__heading\">Open</h3>\n <IssueList component={component} {...(issues ? { issues } : {})} {...(listNote ? { note: listNote } : {})} />\n </section>\n <form className=\"fg-issues__group\" aria-label=\"Report an issue\" onSubmit={submit}>\n <h3 className=\"fg-issues__heading\">Report</h3>\n <Input label=\"Title\" value={title} onChange={setTitle} />\n <TextArea label=\"Description\" value={body} onChange={setBody} placeholder=\"What did you expect, and what happened?\" />\n <div className=\"fg-issues__actions\">\n <Button size=\"sm\" type=\"submit\" disabled={!canReport}>\n Report\n </Button>\n </div>\n {onReport ? null : <p className=\"fg-issues__note\">Reporting is not connected yet.</p>}\n </form>\n </div>\n );\n}\n","import type { ConfigSchema } from '@weasel-js/labkit/config';\nimport type { Globals } from '../../protocol/messages';\nimport { formatRoute, knobsToParams, pinParams } from '../../route/url';\nimport { ISSUES_PATH, type IssueRepo, type IssuesAnswer, issueLabel } from '../../vite/issues/answer';\n\n/** What the Report form hands its host. */\nexport interface IssueReport {\n /** The component the report is about, as the panel names it. */\n component: string;\n /** The story the report was made from. */\n storyId: string;\n title: string;\n body: string;\n}\n\n/** Asks the dev server at `base` for `component`'s open issues and the checkout they are filed from. */\nexport async function fetchIssues(base: string, component: string, signal?: AbortSignal): Promise<IssuesAnswer> {\n const res = await fetch(`${base}${ISSUES_PATH}?${new URLSearchParams({ component })}`, signal ? { signal } : {});\n const type = res.headers.get('Content-Type') ?? '';\n if (!type.includes('application/json')) throw new Error(`The dev server answered ${res.status} with no issues.`);\n return (await res.json()) as IssuesAnswer;\n}\n\n/** A workshop URL reopening `story` at `config`'s knobs, with every global in `globals` pinned on its trial. */\nexport function reopenLink(\n page: string,\n story: string,\n schema: Pick<ConfigSchema<unknown>, 'nodes'>,\n config: unknown,\n globals: Globals,\n): string {\n return `${page}${formatRoute({ story, params: { ...knobsToParams(schema, config), ...pinParams(globals) } })}`;\n}\n\n/** Where the report was made from: the link back to it, and the checkout. */\nexport interface ReportContext {\n link: string;\n branch: string | null;\n commit: string | null;\n}\n\n/** An issue body: what the reporter wrote, then the story, the link back to it and the checkout. */\nexport function reportBody(report: IssueReport, context: ReportContext): string {\n const code = (text: string) => `\\`${text}\\``;\n const checkout = [\n context.branch === null ? null : `**Branch:** ${code(context.branch)}`,\n context.commit === null ? null : `**Commit:** ${context.commit}`,\n ].filter((line) => line !== null);\n return [\n report.body.trim(),\n '---',\n [`**Story:** ${code(report.storyId)}`, `**Reopen:** ${context.link}`, ...checkout].join('\\n'),\n '<!-- Paste a screenshot here. -->',\n ]\n .filter((part) => part !== '')\n .join('\\n\\n');\n}\n\n/** GitHub's new-issue page for `repo`, with the report's title, body and component label filled in. */\nexport function newIssueUrl(repo: IssueRepo, report: IssueReport, context: ReportContext): string {\n const params = new URLSearchParams({\n title: report.title,\n body: reportBody(report, context),\n labels: issueLabel(report.component),\n });\n return `${repo.url}/issues/new?${params}`;\n}\n","import { useLabContext } from '@weasel-js/labkit';\nimport type { ConfigSchema } from '@weasel-js/labkit/config';\nimport { useContext, useEffect, useState } from 'react';\nimport type { ForgeIssue, IssuesAnswer } from '../../vite/issues/answer';\nimport { effectiveGlobals, GLOBALS_KEY } from '../globals';\nimport { StoryGlobalsContext } from '../StoryGlobalsContext';\nimport { IssuesPanel } from './IssuesPanel';\nimport { fetchIssues, type IssueReport, newIssueUrl, reopenLink } from './tracker';\n\n/** What the panel shows of the dev server's answer: the issues, or a note in their place. */\ntype Listing = { issues: readonly ForgeIssue[] } | { note: string };\n\nconst couldNot = (reason: string): Listing => ({ note: `Could not list issues: ${reason}` });\n\nconst listingOf = (answer: IssuesAnswer): Listing =>\n answer.issues ? { issues: answer.issues } : answer.unavailable ? { note: answer.unavailable } : couldNot(answer.error ?? 'no reason given');\n\nconst NO_KNOBS: Pick<ConfigSchema<unknown>, 'nodes'> = { nodes: {} };\n\n/**\n * The Issues panel for one story, connected to the dev server at `base`: it lists the component's issues through\n * the server, and Report opens GitHub's new-issue page for the checkout's repository with a link reopening the\n * focused trial as it stands.\n */\nexport function TrackedIssues({ base, storyId, component }: { base: string; storyId: string; component: string }) {\n const lab = useLabContext();\n const labGlobals = useContext(StoryGlobalsContext);\n const [answer, setAnswer] = useState<IssuesAnswer | null>(null);\n const [listing, setListing] = useState<Listing>({ note: 'Listing issues…' });\n useEffect(() => {\n const abort = new AbortController();\n fetchIssues(base, component, abort.signal).then(\n (next) => {\n setAnswer(next);\n setListing(listingOf(next));\n },\n (err: unknown) => {\n if (!abort.signal.aborted) setListing(couldNot(err instanceof Error ? err.message : String(err)));\n },\n );\n return () => abort.abort();\n }, [base, component]);\n\n const report = (made: IssueReport) => {\n if (!answer?.repo) return;\n const trial = lab.trials.find((t) => t.id === lab.focusedTrialId);\n const config = (trial?.config ?? null) as Record<string, unknown> | null;\n const schema = lab.instruments.find((instrument) => instrument.name === storyId)?.config as\n | ConfigSchema<unknown>\n | undefined;\n const globals = effectiveGlobals(labGlobals, config?.[GLOBALS_KEY]);\n const page = `${location.origin}${location.pathname}${location.search}`;\n const link = reopenLink(page, storyId, schema ?? NO_KNOBS, config, globals);\n window.open(newIssueUrl(answer.repo, made, { link, branch: answer.branch, commit: answer.commit }), '_blank', 'noopener');\n };\n\n return (\n <IssuesPanel\n component={component}\n storyId={storyId}\n {...('issues' in listing ? { issues: listing.issues } : { listNote: listing.note })}\n {...(answer?.repo ? { onReport: report } : {})}\n />\n );\n}\n","import { type LabContribution, useLabContext } from '@weasel-js/labkit';\nimport type { IndexEntry } from '../../story/types';\nimport { IssuesPanel } from './IssuesPanel';\nimport { TrackedIssues } from './TrackedIssues';\n\n/** The panel for the lab's focused trial, naming the component its story renders. */\nfunction FocusedIssues({ index, base }: { index: readonly IndexEntry[]; base: string | undefined }) {\n const { focusedTrialId, trials } = useLabContext();\n const record = trials.find((trial) => trial.id === focusedTrialId);\n const entry = record && index.find((e) => e.id === record.instrumentName);\n if (!entry) return null;\n const component = entry.componentName ?? entry.title.split('/').at(-1) ?? entry.title;\n return (\n <section className=\"fg-issues-focus\" aria-label=\"Issues\">\n <p className=\"fg-issues__component\">{component}</p>\n {base === undefined ? (\n <IssuesPanel key={entry.id} component={component} storyId={entry.id} />\n ) : (\n <TrackedIssues key={entry.id} base={base} storyId={entry.id} component={component} />\n )}\n </section>\n );\n}\n\n/**\n * The lab aside section listing and reporting issues against the focused trial's component, through the dev server\n * at `base`. With no `base`, as in a built workshop, it says it is not connected.\n */\nexport function issuesSection(index: readonly IndexEntry[], base?: string): LabContribution {\n return { id: 'fg-issues', region: 'aside', item: { title: 'Issues', body: <FocusedIssues index={index} base={base} /> } };\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 { type Libraries, TITLE_LIBRARIES } from '../../story/library';\n\n/** One prop of the story, as the dossier prints it. */\nexport interface DossierArg {\n /** Dotted path within the schema — what the value is written at. */\n path: string;\n /** The author's `argTypes` name, else the path's last segment. */\n label: string;\n /** The control kind labkit resolved, or null while rules have not run. */\n kind: string | null;\n default: unknown;\n /** The focused trial's value, which is `default` until someone edits it. */\n value: unknown;\n description?: string;\n}\n\n/** Everything Get Info prints about one story. */\nexport interface Dossier {\n id: string;\n title: string;\n name: string;\n exportName: string;\n file: string;\n /** Which package the story file lives in. */\n library: string;\n componentName?: string;\n description?: string;\n componentDescription?: string;\n args: DossierArg[];\n /** The story's frame has not reported its schema yet, so an empty `args`\n * means \"not loaded\" rather than \"takes none\". */\n argsPending: boolean;\n}\n\n/** The group forge hides the lab's globals in. Those are the lab's settings,\n * not the story's props, and the dossier is about the story. */\nconst GLOBALS = '$globals';\n\n/** Every visible leaf of `shape`, depth first, carrying its dotted path. */\nfunction leaves(shape: ConfigShape, prefix = ''): { path: string; node: ConfigNode }[] {\n const out: { path: string; node: ConfigNode }[] = [];\n for (const [key, entry] of Object.entries(shape)) {\n if (prefix === '' && key === GLOBALS) continue;\n const path = prefix ? `${prefix}.${key}` : key;\n if (isConfigBranch(entry)) out.push(...leaves(entry.children, path));\n else if (!entry.annotations.hidden) out.push({ path, node: entry });\n }\n return out;\n}\n\n/**\n * The dossier for one story. A pure function of the records the shell already\n * holds: the index entry, the instrument built from the story's `ready`\n * message, and the focused trial's config. An instrument exists before its\n * frame reports anything, and its schema is empty until then — so `ready`\n * decides whether an empty `args` reads as pending or as none.\n */\nexport function storyDossier(input: {\n entry: IndexEntry;\n libraries?: Libraries;\n instrument?: Instrument<unknown, unknown> | undefined;\n config?: unknown;\n ready?: boolean;\n}): Dossier {\n const { entry, libraries = TITLE_LIBRARIES, 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: libraries.of(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 num from '@weasel-js/theme/numeric.module.css';\nimport type { Dossier, DossierArg } from './dossier';\nimport { Description } from '../../frame/index/Description';\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 ${num.numeric}`}>{printed(arg.value)}</td>\n <td className={`fg-info__value-cell ${num.numeric}`}>{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 ? <Description text={dossier.description} className=\"fg-info__doc\" /> : null}\n {dossier.componentDescription ? (\n <Description text={dossier.componentDescription} className=\"fg-info__doc fg-info__doc--component\" />\n ) : null}\n </section>\n ) : null}\n\n <section className=\"fg-info__section\" aria-label=\"Identity\">\n <dl className=\"fg-info__rows\">\n <Row label=\"Story\">{dossier.name}</Row>\n <Row label=\"Component\">{dossier.componentName ?? dossier.title.split('/').pop()}</Row>\n <Row label=\"Library\">{dossier.library}</Row>\n <Row label=\"Title\">{dossier.title}</Row>\n <Row label=\"Export\">\n <code>{dossier.exportName}</code>\n </Row>\n <Row label=\"Id\">\n <code>{dossier.id}</code>\n </Row>\n <Row label=\"File\">\n <code className=\"fg-info__path\">{dossier.file}</code>\n </Row>\n </dl>\n </section>\n\n <section className=\"fg-info__section\" aria-label=\"Args\">\n <h3 className=\"fg-info__heading\">Args</h3>\n {dossier.argsPending ? (\n <p className=\"fg-info__empty\">Open this story to read its args.</p>\n ) : dossier.args.length === 0 ? (\n <p className=\"fg-info__empty\">This story takes no args.</p>\n ) : (\n <ArgRows args={dossier.args} />\n )}\n </section>\n </div>\n );\n}\n","import { breadcrumb } from '../breadcrumb';\nimport { useLabContext } from '@weasel-js/labkit';\nimport { Dialog } from '@weasel-js/ui/components/Dialog';\nimport { useContext } from 'react';\nimport { LibrariesContext } from '../../story/library';\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 libraries = useContext(LibrariesContext);\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 libraries,\n instrument: instruments.find((candidate) => candidate.name === entry.id),\n config: trial?.config,\n ready: isReady(entry.id),\n });\n return (\n <Dialog\n isOpen={isOpen}\n onOpenChange={onOpenChange}\n title={breadcrumb(dossier.title, dossier.name)}\n className=\"fg-info-dialog\"\n >\n <StoryDossier dossier={dossier} />\n </Dialog>\n );\n}\n","import { createContext } from 'react';\nimport { FRAME_HELLO } from '../protocol/messages';\n\n/** Frame documents loaded ahead of need, blank until a view hands one a port. */\nexport interface FramePool {\n /**\n * A frame that has loaded and said hello, detached from the pool so the caller can move it into place with\n * `moveBefore`; null when none is ready or the browser cannot move an iframe without reloading it.\n */\n claim(): HTMLIFrameElement | null;\n dispose(): void;\n}\n\n/** How long a frame document has to say hello. Longer than a cold dev server takes to serve one its first time. */\nexport const HELLO_TIMEOUT_MS = 30_000;\n\ntype Movable = Element & { moveBefore(node: Node, child: Node | null): void };\n\n/** Whether `moveBefore` exists here, the one way to move an iframe without reloading its document. */\nexport function canMoveFrames(): boolean {\n return typeof Element !== 'undefined' && 'moveBefore' in Element.prototype;\n}\n\n/** Moves `frame` to the start of `host` without reloading it. */\nexport function moveFrame(host: Element, frame: HTMLIFrameElement): void {\n (host as Movable).moveBefore(frame, host.firstChild);\n}\n\nconst whenIdle = (fn: () => void): (() => void) => {\n if (typeof requestIdleCallback === 'function') {\n const handle = requestIdleCallback(fn, { timeout: 500 });\n return () => cancelIdleCallback(handle);\n }\n const handle = setTimeout(fn, 200);\n return () => clearTimeout(handle);\n};\n\n/**\n * Keeps `size` blank frames of `frameUrl` loaded off-screen. A claimed frame is the caller's to discard: it never\n * comes back, so nothing one story left in a document reaches the next. A replacement loads when the page is idle.\n */\nexport function createFramePool(frameUrl: string, size = 2): FramePool {\n const shelf = document.createElement('div');\n shelf.className = 'fg-frame-pool';\n shelf.setAttribute('aria-hidden', 'true');\n document.body.append(shelf);\n const warm: HTMLIFrameElement[] = [];\n /** Per frame still loading, what stops waiting for it. */\n const waits = new Set<() => void>();\n let cancelRefill: (() => void) | null = null;\n let disposed = false;\n\n const load = () => {\n const frame = document.createElement('iframe');\n frame.tabIndex = -1;\n frame.src = frameUrl;\n const stop = () => {\n window.removeEventListener('message', onMessage);\n clearTimeout(timer);\n waits.delete(stop);\n };\n const onMessage = (event: MessageEvent) => {\n if (event.source !== frame.contentWindow || event.origin !== location.origin) return;\n if ((event.data as { type?: unknown } | null)?.type !== FRAME_HELLO) return;\n stop();\n warm.push(frame);\n };\n const timer = setTimeout(() => {\n stop();\n frame.remove();\n refill();\n }, HELLO_TIMEOUT_MS);\n waits.add(stop);\n window.addEventListener('message', onMessage);\n shelf.append(frame);\n };\n\n const refill = () => {\n if (disposed || cancelRefill) return;\n cancelRefill = whenIdle(() => {\n cancelRefill = null;\n while (!disposed && warm.length + waits.size < size) load();\n });\n };\n if (canMoveFrames()) refill();\n\n return {\n claim() {\n if (!canMoveFrames()) return null;\n const frame = warm.shift() ?? null;\n refill();\n return frame;\n },\n dispose() {\n disposed = true;\n cancelRefill?.();\n for (const stop of [...waits]) stop();\n shelf.remove();\n },\n };\n}\n\nexport const FramePoolContext = createContext<FramePool | null>(null);\n","import { type Action, type MenuDef, useActionsRegistry, useMenuHost, useMenus } from '@weasel-js/core';\nimport { type ConfigEntry, type ConfigSchema, isConfigBranch } from '@weasel-js/labkit/config';\nimport { type LensActionApi, type LoupePoint, setLensOps } from '@weasel-js/labkit/loupe';\nimport { type PrefGroup, type PrefLeaf, pref } from '@weasel-js/prefs';\nimport { useEffect, useMemo } from 'react';\nimport { type GlobalDeclarations, isForgePath } from '../globals';\nimport type { ForgeComparison } from './conditions';\n\n/** The actions whose variants are the compare menu's rows, each setting the comparison of the lens it opened on.\n * DPR rows have one of their own, which a lens showing no Pixels disables. */\nexport const COMPARE_WITH_ID = 'loupe.compare.with';\nexport const COMPARE_DPR_ID = 'loupe.compare.dpr';\n/** Why a DPR row is disabled: a DPR changes only a Pixels capture. */\nexport const PIXELS_ONLY = 'Pixels only';\nexport const COMPARE_MENU_ID = 'loupe.compare';\n\nconst DPRS = [1, 2, 3] as const;\n\n/** One row of the compare menu: the submenu it sits in, its label, and the comparison it sets. */\nexport interface CompareChoice {\n /** The action whose variant the row is. */\n action: typeof COMPARE_WITH_ID | typeof COMPARE_DPR_ID;\n key: string;\n group: string;\n label: string;\n compare: ForgeComparison;\n}\n\n/** Each leaf of `shape` a comparison can set, by its dotted path: a boolean, or one with options. */\nfunction argChoices(shape: Readonly<Record<string, ConfigEntry>>, at: string): CompareChoice[] {\n return Object.entries(shape).flatMap(([key, entry]) => {\n const path = at === '' ? key : `${at}.${key}`;\n if (isForgePath(path)) return [];\n if (isConfigBranch(entry)) return argChoices(entry.children, path);\n const options: readonly { value: unknown; label: string }[] =\n entry.kind === 'boolean'\n ? [\n { value: true, label: 'On' },\n { value: false, label: 'Off' },\n ]\n : (entry.annotations.options ?? []);\n return options.map((o): CompareChoice => ({\n action: COMPARE_WITH_ID,\n key: `arg.${path}.${String(o.value)}`,\n group: `Arg ${path}`,\n label: o.label,\n compare: { kind: 'custom', args: { [path]: o.value } } as const,\n }));\n });\n}\n\n/** What a lens can be compared against: every declared global's options, DPR 1×, 2× and 3×, and the args of the\n * story under it that are booleans or have options. */\nexport function compareChoices(declarations: GlobalDeclarations, schema: ConfigSchema<unknown> | null): CompareChoice[] {\n const globals = Object.entries(declarations).flatMap(([key, declaration]) =>\n declaration.options.map((o): CompareChoice => ({\n action: COMPARE_WITH_ID,\n key: `global.${key}.${o.value}`,\n group: declaration.label,\n label: o.label,\n compare: { kind: 'custom', globals: { [key]: o.value } } as const,\n })),\n );\n const dprs = DPRS.map((dpr): CompareChoice => ({\n action: COMPARE_DPR_ID,\n key: `dpr.${dpr}`,\n group: 'DPR',\n label: `${dpr}×`,\n compare: { kind: 'custom', dpr } as const,\n }));\n return [...globals, ...dprs, ...(schema ? argChoices(schema.nodes, '') : [])];\n}\n\n/** The compare menu: a submenu per global, DPR, and arg, each row naming one variant of `COMPARE_WITH_ID`. */\nexport function compareMenuDef(choices: readonly CompareChoice[]): MenuDef {\n const groups = new Map<string, Record<string, PrefLeaf>>();\n for (const choice of choices) {\n const rows = groups.get(choice.group) ?? {};\n rows[`c${Object.keys(rows).length}`] = pref.action(`${choice.action}:${choice.key}`);\n groups.set(choice.group, rows);\n }\n const submenus: Record<string, PrefGroup> = {};\n [...groups].forEach(([label, rows], n) => {\n submenus[`g${n}`] = pref.group(label, rows, { as: 'menu' });\n });\n return { id: COMPARE_MENU_ID, menu: pref.group('', submenus) };\n}\n\n/** A request to show the menu: where, on which lens, whether it shows Pixels, and the choices for it. `seq` changes\n * on every open. */\nexport interface CompareMenuRequest {\n seq: number;\n client: LoupePoint;\n lensId: string;\n /** Whether the lens shows Pixels, the only source a DPR changes. */\n pixels: boolean;\n choices: readonly CompareChoice[];\n}\n\n/** The compare menu's two actions, a variant per row, each setting the comparison on the lens `request` opened on. */\nexport function compareActions(api: LensActionApi<ForgeComparison>, request: CompareMenuRequest): Action[] {\n const one = (id: CompareChoice['action'], label: string, enabled: () => true | string): Action => ({\n id,\n label,\n group: 'loupe',\n enabled,\n variants: request.choices\n .filter((c) => c.action === id)\n .map((c) => ({ key: c.key, label: `${c.group}: ${c.label}`, params: { compare: c.compare, lensId: request.lensId } })),\n invoker: {\n timing: 'immediate',\n run(_deps, params) {\n const lensId = (params?.lensId as string | undefined) ?? api.current();\n const compare = params?.compare as ForgeComparison | undefined;\n if (lensId !== null && compare) api.apply(setLensOps(api.scene, lensId, { compare }));\n },\n },\n });\n return [\n one(COMPARE_WITH_ID, 'Compare with', () => true),\n one(COMPARE_DPR_ID, 'Compare at DPR', () => (request.pixels ? true : PIXELS_ONLY)),\n ];\n}\n\n/** Props for `CompareMenu`. */\nexport interface CompareMenuProps {\n api: LensActionApi<ForgeComparison>;\n request: CompareMenuRequest | null;\n}\n\nconst NO_CHOICES: readonly CompareChoice[] = [];\n\n/** Registers the compare menu's actions for the lens asked about and opens the menu on it, at each request; the\n * actions go again once that menu closes. */\nexport function CompareMenu({ api, request }: CompareMenuProps) {\n const registry = useActionsRegistry();\n const host = useMenuHost();\n const choices = request?.choices ?? NO_CHOICES;\n const defs = useMemo(() => [compareMenuDef(choices)], [choices]);\n useMenus(defs);\n useEffect(() => {\n if (!registry || !host || !request) return;\n const offs = compareActions(api, request).map((a) => registry.register(a));\n let held = true;\n const drop = () => {\n if (!held) return;\n held = false;\n for (const off of offs) off();\n };\n // Opened after the registrations, which its rows resolve against.\n const opened = host.open({ menu: COMPARE_MENU_ID, client: request.client, source: 'keyboard' }) ? host.current()?.seq : undefined;\n if (opened === undefined) {\n drop();\n return;\n }\n // A menu closes before it runs the row picked, so the actions stay until that run has happened.\n const unsubscribe = host.subscribe(() => {\n if (host.current()?.seq !== opened) queueMicrotask(drop);\n });\n return () => {\n unsubscribe();\n drop();\n };\n }, [registry, host, api, request]);\n return null;\n}\n","import type { LensSource, LensSourceRequest } from '@weasel-js/labkit/loupe';\nimport type { Globals } from '../../protocol/messages';\nimport type { ForgeComparison, ResolveContext, ResolvedConditions } from './conditions';\nimport type { LiveLenses, LiveRequest } from './liveLenses';\nimport { trialAt } from './trialAt';\n\nexport const NOTHING_UNDER = 'Nothing under the reticle';\n\n/** The Live source, plus a way for its host to have every attached lens look again at what lies under it. */\nexport interface LiveSource extends LensSource<ForgeComparison> {\n /** Re-reads the trial under each lens: for a scroll, a resize, or a trial closing, none of which moves a reticle. */\n remeasure(): void;\n}\n\nconst sameContext = (a: ResolveContext, b: ResolveContext) =>\n a.declarations === b.declarations && a.modeGlobal === b.modeGlobal && a.prefersDark === b.prefersDark && a.labMode === b.labMode;\n\n/** The id a lens cell asks under: a cell showing a comparison is a request of its own beside the lens's story. */\nexport const liveCellId = (lensId: string, compare: ForgeComparison | null): string =>\n compare === null ? lensId : `${lensId}~compared`;\n\n/** Whether `b` would render the copy `a` does: a measure that finds nothing new posts nothing. */\nfunction sameRequest(a: LiveRequest | null, b: LiveRequest): boolean {\n return (\n a !== null &&\n a.slot === b.slot &&\n a.hit.host === b.hit.host &&\n a.hit.trialId === b.hit.trialId &&\n a.hit.local.x === b.hit.local.x &&\n a.hit.local.y === b.hit.local.y &&\n a.hit.scale === b.hit.scale &&\n a.factor === b.factor &&\n a.size.width === b.size.width &&\n a.size.height === b.size.height &&\n a.args === b.args &&\n a.compare === b.compare &&\n sameContext(a.ctx, b.ctx)\n );\n}\n\n/** What changes a story's look without moving its DOM: a hover, a focus, a transition ending. */\nconst LOOK_EVENTS = ['pointerover', 'pointerout', 'focusin', 'focusout', 'transitionend'] as const;\n\n/** Calls `notify` whenever the element it is pointed at changes; pointing it at null stops it. */\nfunction watchOf(notify: () => void): (el: HTMLElement | null) => void {\n const observer = typeof MutationObserver === 'undefined' ? null : new MutationObserver(notify);\n let watched: HTMLElement | null = null;\n return (el) => {\n if (el === watched) return;\n observer?.disconnect();\n for (const type of LOOK_EVENTS) watched?.removeEventListener(type, notify);\n watched = el;\n if (!el) return;\n observer?.observe(el, { subtree: true, childList: true, characterData: true, attributes: true });\n for (const type of LOOK_EVENTS) el.addEventListener(type, notify);\n };\n}\n\nconst now = (run: () => void) => run();\n\n/**\n * A lens showing a second copy of the story under its reticle, rendered by that story's own trial into the lens.\n * `conditions` is read on every measure, so a comparison resolves against the lab as it is then. `schedule` runs the\n * readers' notification: every change it gathers before running is one notification. The default runs it at once.\n */\nexport function createLiveSource(\n lenses: LiveLenses,\n resolve: (c: ForgeComparison | null, base: Globals, ctx: ResolveContext) => ResolvedConditions,\n conditions: () => { base: Globals; ctx: ResolveContext },\n schedule: (run: () => void) => void = now,\n): LiveSource {\n const measures = new Set<() => void>();\n const listeners = new Set<() => void>();\n let due = false;\n const flush = () => {\n due = false;\n for (const listener of [...listeners]) listener();\n };\n const notify = () => {\n if (due) return;\n due = true;\n schedule(flush);\n };\n return {\n kind: 'live',\n produces: 'dom',\n label: () => 'Live',\n status: () => true,\n // A reader hears of what it reads: the lens's copy, and with nothing compared, the main story under the reticle.\n subscribe(listener) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n attach(slot, first) {\n const doc = slot.ownerDocument;\n const target = doc.createElement('div');\n target.className = 'fg-lens-live';\n const empty = doc.createElement('div');\n empty.className = 'fg-lens-empty';\n empty.hidden = true;\n slot.append(target, empty);\n const watchCopy = watchOf(notify);\n watchCopy(target);\n const watchStory = watchOf(notify);\n let request: LensSourceRequest<ForgeComparison> = first;\n let posted: LiveRequest | null = null;\n const post = (next: LiveRequest | null) => {\n if (next === null ? posted === null : sameRequest(posted, next)) return;\n posted = next;\n lenses.set(liveCellId(request.lensId, request.conditions), next);\n };\n const measure = () => {\n const { lensId, reticle, conditions: compare } = request;\n const hit = trialAt(reticle, doc);\n watchStory(compare === null ? (hit?.host ?? null) : null);\n empty.hidden = hit !== null;\n if (!hit) {\n post(null);\n empty.textContent = NOTHING_UNDER;\n return;\n }\n const { base, ctx } = conditions();\n const resolved = resolve(compare, base, ctx);\n post({\n lensId: liveCellId(lensId, compare),\n slot: target,\n hit,\n factor: request.factor,\n size: request.size,\n compare,\n ctx,\n args: resolved.args,\n });\n };\n measures.add(measure);\n measure();\n return {\n update(next) {\n request = next;\n measure();\n },\n detach() {\n watchCopy(null);\n watchStory(null);\n measures.delete(measure);\n lenses.set(liveCellId(request.lensId, request.conditions), null);\n target.remove();\n empty.remove();\n },\n };\n },\n remeasure() {\n for (const measure of [...measures]) measure();\n },\n };\n}\n","import { parseColor } from '@weasel-js/core';\nimport { type LoupePoint, probeUnderLens } from '@weasel-js/labkit/loupe';\nimport { compareSpecificity, type Specificity, specificity, splitTopLevel } from '@weasel-js/svg';\nimport { cssRulesOf, varRefs } from '../../frame/cssVarUse';\n\n/** A color an element shows, and the property it shows it through. */\nexport interface ColorAt {\n element: Element;\n property: 'color' | 'background-color';\n /** The computed value. */\n value: string;\n}\n\n/** One declaration in a chain: what `property` is declared as, by which rule, on which element. */\nexport interface ChainLink {\n property: string;\n declared: string;\n selector: string;\n element: Element;\n}\n\n/** The selector a link reports for a declaration in an element's `style` attribute. */\nexport const INLINE = 'style attribute';\n\n/**\n * The topmost element under a client point inside `within`, `within` itself included. Inside a lens the layer takes\n * no pointer, so the hit test runs under labkit's `interior` probe, which stands the lens's interior up for it.\n */\nexport function topmostIn(within: Element, client: LoupePoint): Element | undefined {\n return probeUnderLens(within, 'interior', () =>\n (within.ownerDocument.elementsFromPoint?.(client.x, client.y) ?? []).find((el) => within.contains(el)),\n );\n}\n\n/** The first opaque `background-color` from `el` up to `stop`; null when none is, or the unreadable color that stopped the walk. */\nexport function backgroundOf(\n el: Element,\n stop?: Element,\n): { element: Element; color: string } | { unreadable: string } | null {\n for (let at: Element | null = el; at; at = at === stop ? null : at.parentElement) {\n const color = getComputedStyle(at).backgroundColor;\n if (color.trim() === '') continue;\n try {\n if (parseColor(color)[3] === 1) return { element: at, color };\n } catch {\n return { unreadable: color };\n }\n }\n return null;\n}\n\nconst inside = (r: DOMRect, p: LoupePoint) => p.x >= r.left && p.x <= r.right && p.y >= r.top && p.y <= r.bottom;\n\n/** Whether one of `el`'s own text runs is drawn under the point: the text's range rects, not the element's box. */\nfunction textUnder(el: Element, client: LoupePoint): boolean {\n const range = el.ownerDocument.createRange();\n return Array.from(el.childNodes).some((n) => {\n if (n.nodeType !== Node.TEXT_NODE || (n.textContent ?? '').trim() === '') return false;\n range.selectNodeContents(n);\n return Array.from(range.getClientRects()).some((r) => inside(r, client));\n });\n}\n\n/**\n * The color under a client point inside `within`: the text's `color` where text is drawn there, else the\n * `background-color` of the first opaque box from the topmost element up to `within`. Null over nothing, or where\n * no box up to `within` is opaque. The element is found by hit-testing rather than `caretPositionFromPoint`, which\n * answers only for the topmost layer and so cannot see a story under a lens.\n */\nexport function colorAt(client: LoupePoint, within: HTMLElement): ColorAt | null {\n const el = topmostIn(within, client);\n if (!el) return null;\n if (textUnder(el, client)) return { element: el, property: 'color', value: getComputedStyle(el).color };\n const bg = backgroundOf(el, within);\n if (bg === null) return null;\n if ('unreadable' in bg) return { element: el, property: 'background-color', value: bg.unreadable };\n return { element: bg.element, property: 'background-color', value: bg.color };\n}\n\nconst STYLE_RULE = 1;\n/** Longhands a chain is asked about, and the shorthands that can declare them: a shorthand holding a `var()` leaves its longhands empty in the CSSOM. */\nconst SHORTHANDS: Readonly<Record<string, readonly string[]>> = { 'background-color': ['background'] };\nconst INHERITED = (property: string) => property.startsWith('--') || property === 'color';\n\ninterface Rule {\n readonly selector: string;\n readonly style: CSSStyleDeclaration;\n}\n\n/** Whether a grouping rule's condition holds where `doc` is shown. `@container` and `@layer` are taken as holding. */\nfunction applies(rule: CSSRule, doc: Document): boolean {\n const media = (rule as CSSRule & { media?: MediaList }).media;\n if (media && media.mediaText && doc.defaultView && !doc.defaultView.matchMedia(media.mediaText).matches) return false;\n if (typeof CSSSupportsRule !== 'undefined' && rule instanceof CSSSupportsRule) return CSS.supports(rule.conditionText);\n return true;\n}\n\n/** A nested rule's selector made whole: `&` is its parent's, and a selector without one is a descendant of it. */\nfunction nest(selector: string, parent: string | undefined): string {\n if (parent === undefined) return selector;\n return splitTopLevel(selector, ',')\n .map((s) => (s.includes('&') ? s.replaceAll('&', `:is(${parent})`) : `:is(${parent}) ${s.trim()}`))\n .join(', ');\n}\n\nfunction collect(rules: CSSRuleList, doc: Document, into: Rule[], parent?: string): void {\n for (const rule of Array.from(rules)) {\n if (!applies(rule, doc)) continue;\n const imported = (rule as CSSRule & { styleSheet?: CSSStyleSheet | null }).styleSheet;\n if (imported) {\n const inner = cssRulesOf(imported);\n if (inner) collect(inner, doc, into);\n continue;\n }\n const children = (rule as CSSRule & { cssRules?: CSSRuleList }).cssRules;\n if (rule.type !== STYLE_RULE) {\n if (children) collect(children, doc, into, parent);\n continue;\n }\n const style = rule as CSSStyleRule;\n const selector = nest(style.selectorText, parent);\n into.push({ selector, style: style.style });\n if (children) collect(children, doc, into, selector);\n }\n}\n\n/** Every style rule `doc` applies, in source order: its sheets, then its adopted sheets, which come after them all. */\nfunction rulesOf(doc: Document): Rule[] {\n const out: Rule[] = [];\n for (const sheet of [...Array.from(doc.styleSheets), ...(doc.adoptedStyleSheets ?? [])]) {\n if (sheet.disabled) continue;\n const rules = cssRulesOf(sheet);\n if (rules) collect(rules, doc, out);\n }\n return out;\n}\n\n/** The specificity of the most specific selector in `list` that `el` matches, or null when none does. */\nfunction matching(el: Element, list: string): Specificity | null {\n let best: Specificity | null = null;\n for (const one of splitTopLevel(list, ',')) {\n let hit = false;\n try {\n hit = el.matches(one);\n } catch {\n // A pseudo-element, or a selector this engine cannot query, matches no element.\n }\n const s = hit ? specificity(one.trim()) : null;\n if (s && (best === null || compareSpecificity(s, best) > 0)) best = s;\n }\n return best;\n}\n\nfunction declaredIn(style: CSSStyleDeclaration, property: string): { value: string; important: boolean } | null {\n for (const name of [property, ...(SHORTHANDS[property] ?? [])]) {\n const value = style.getPropertyValue(name).trim();\n if (value) return { value, important: style.getPropertyPriority(name) === 'important' };\n }\n return null;\n}\n\n/** A rule's declaration of one property. */\ninterface Declared {\n readonly selector: string;\n readonly value: string;\n readonly important: boolean;\n}\n\n/** The rules declaring each property asked about, read from `rules` once per property. */\nfunction indexOf(rules: readonly Rule[]): (property: string) => readonly Declared[] {\n const index = new Map<string, Declared[]>();\n return (property) => {\n let got = index.get(property);\n if (!got) {\n got = rules.flatMap((r) => {\n const d = declaredIn(r.style, property);\n return d ? [{ selector: r.selector, ...d }] : [];\n });\n index.set(property, got);\n }\n return got;\n };\n}\n\n/**\n * The declaration of `property` that wins on `el` itself: important above normal, inline style above every rule of\n * the same importance, then the highest specificity, then the last in source order. Layer order is not modeled.\n */\nfunction winning(el: Element, property: string, rules: readonly Declared[]): ChainLink | null {\n let best: { value: string; important: boolean; spec: Specificity; selector: string } | null = null;\n for (const got of rules) {\n const spec = matching(el, got.selector);\n if (!spec) continue;\n const wins =\n best === null ||\n (got.important && !best.important) ||\n (got.important === best.important && compareSpecificity(spec, best.spec) >= 0);\n if (wins) best = { ...got, spec };\n }\n const inline = (el as Element & { style?: CSSStyleDeclaration }).style;\n const own = inline ? declaredIn(inline, property) : null;\n if (own && (best === null || own.important || !best.important)) return { property, declared: own.value, selector: INLINE, element: el };\n return best ? { property, declared: best.value, selector: best.selector, element: el } : null;\n}\n\n/** The winning declaration of `property` on `el`, or, for an inherited property, on its nearest ancestor that has one. */\nfunction declarationOf(el: Element, property: string, rules: readonly Declared[]): ChainLink | null {\n for (let at: Element | null = el; at; at = INHERITED(property) ? at.parentElement : null) {\n const link = winning(at, property, rules);\n if (link) return link;\n }\n return null;\n}\n\n/** How often each document's head has changed: a sheet added or removed, or a `<style>` rewritten, as a forge\n * override or a vite CSS update does. */\nconst revisions = new WeakMap<Document, { n: number; observer: MutationObserver | null }>();\n\nfunction revisionOf(doc: Document): number {\n let r = revisions.get(doc);\n if (!r) {\n const made = { n: 0, observer: null as MutationObserver | null };\n if (typeof MutationObserver !== 'undefined' && doc.head) {\n made.observer = new MutationObserver(() => {\n made.n += 1;\n });\n made.observer.observe(doc.head, { childList: true, subtree: true, characterData: true, attributes: true });\n }\n revisions.set(doc, made);\n r = made;\n }\n // Records not yet delivered count now, so a change made in this same task is not missed.\n if ((r.observer?.takeRecords().length ?? 0) > 0) r.n += 1;\n return r.n;\n}\n\nconst chains = new WeakMap<Element, Map<string, { key: string; chain: readonly ChainLink[] }>>();\n\n/**\n * How a color came to be: the declaration that sets its property, then, for each `var()` that names, the winning\n * declaration of that custom property on the element or its nearest ancestor declaring it, until a value names no\n * `var()`. A forge override is a rule like any other. User-agent styles are not modeled: where the user agent sets\n * an element's own color, as for a link or a button, an inherited property's chain is that of the nearest ancestor\n * an author rule declares it on, and empty when none does. Reused while the element's computed value and the\n * document's stylesheets stand as they were.\n */\nexport function tokenChain(at: ColorAt): readonly ChainLink[] {\n const doc = at.element.ownerDocument;\n const key = `${at.value}|${revisionOf(doc)}|${doc.styleSheets.length}|${doc.adoptedStyleSheets?.length ?? 0}`;\n let byProperty = chains.get(at.element);\n const held = byProperty?.get(at.property);\n if (held?.key === key) return held.chain;\n const chain = chainOf(at);\n if (!byProperty) {\n byProperty = new Map();\n chains.set(at.element, byProperty);\n }\n byProperty.set(at.property, { key, chain });\n return chain;\n}\n\nfunction chainOf(at: ColorAt): readonly ChainLink[] {\n const declaring = indexOf(rulesOf(at.element.ownerDocument));\n const chain: ChainLink[] = [];\n const seen = new Set<string>();\n const follow = (el: Element, property: string) => {\n if (seen.has(property)) return;\n seen.add(property);\n const link = declarationOf(el, property, declaring(property));\n if (!link) return;\n chain.push(link);\n for (const name of varRefs(link.declared)) follow(link.element, name);\n };\n follow(at.element, at.property);\n return chain;\n}\n","import { contrastRatio, parseColor, useLatest, wcagLevels } from '@weasel-js/core';\nimport {\n type LensCapture,\n type LensReadoutProps,\n type LensSlotProps,\n type LoupePoint,\n readBitmap,\n requestsOf,\n useShownSource,\n} from '@weasel-js/labkit/loupe';\nimport { Fragment, useCallback, useEffect, useMemo, useState, useSyncExternalStore } from 'react';\nimport { revealVar } from '../cssVars/reveal';\nimport type { ForgeComparison } from './conditions';\nimport { backgroundOf, colorAt, tokenChain } from './tokenChain';\nimport { trialAt } from './trialAt';\nimport { varRefs } from '../../frame/cssVarUse';\n\nexport const NO_TEXT = 'No text under the aim';\nexport const NO_BACKGROUND = 'No opaque background behind the text';\nexport const unreadable = (color: string) => `Cannot read the color \"${color}\"`;\nexport const NO_CAPTURE = 'No capture to read';\nexport const OUTSIDE = 'The aim is outside the capture';\nexport const NO_COLOR = 'No color under the aim';\nexport const NEEDS_LIVE = 'Token needs a Live source for changed conditions';\nexport const IN_FRAME = \"Cannot read inside an isolated story's frame\";\n\nexport type ContrastReading =\n | { ratio: number; aa: boolean; aaa: boolean; large: boolean }\n | { unavailable: string };\n\n/** Pixels either side of the aim that a Pixels reading looks at: a 5×5 neighborhood. */\nconst REACH = 2;\n\n/** WCAG's large text: 24px and up, or 18.66px and up when bold. */\nfunction isLarge(style: CSSStyleDeclaration): boolean {\n const px = Number.parseFloat(style.fontSize);\n const w = style.fontWeight === 'bold' ? 700 : Number.parseInt(style.fontWeight, 10);\n return px >= 24 || (px >= 18.66 && w >= 700);\n}\n\nconst rgb = (d: Uint8ClampedArray, i: number) => `rgb(${d[i]}, ${d[i + 1]}, ${d[i + 2]})`;\n\nfunction ofPixels(capture: LensCapture | undefined, point: LoupePoint): ContrastReading {\n const img = capture ? readBitmap(capture.bitmap) : null;\n if (!capture || !img) return { unavailable: NO_CAPTURE };\n const px = Math.floor(point.x * capture.dpr);\n const py = Math.floor(point.y * capture.dpr);\n if (px < 0 || py < 0 || px >= img.width || py >= img.height) return { unavailable: OUTSIDE };\n const { data, width, height } = img;\n const center = (py * width + px) * 4;\n let far = center;\n let best = 0;\n for (let y = Math.max(0, py - REACH); y <= Math.min(height - 1, py + REACH); y += 1) {\n for (let x = Math.max(0, px - REACH); x <= Math.min(width - 1, px + REACH); x += 1) {\n const i = (y * width + x) * 4;\n const d = [0, 1, 2].reduce((sum, c) => sum + ((data[i + c] as number) - (data[center + c] as number)) ** 2, 0);\n if (d > best) {\n best = d;\n far = i;\n }\n }\n }\n const ratio = contrastRatio(rgb(data, center), rgb(data, far));\n return ratio === null ? { unavailable: NO_CAPTURE } : { ratio, ...wcagLevels(ratio, false), large: false };\n}\n\n/**\n * The contrast of what lies under a lens's aim. Over a Live source it is the\n * text drawn at `point` inside `within` against the first opaque background\n * from it up to `within`, found by the same hit test as the Token readout's;\n * over Pixels it is the pixel at `point`, in host px, against the most\n * distant color within two pixels of it in `capture`.\n */\nexport function contrastAt(\n source: 'live' | 'pixels',\n at: { within?: HTMLElement; capture?: LensCapture; point: LoupePoint },\n): ContrastReading {\n if (source === 'pixels') return ofPixels(at.capture, at.point);\n const text = at.within ? colorAt(at.point, at.within) : null;\n if (!text || text.property !== 'color') return { unavailable: NO_TEXT };\n const style = getComputedStyle(text.element);\n const background = backgroundOf(text.element, at.within);\n if (background === null) return { unavailable: NO_BACKGROUND };\n if ('unreadable' in background) return { unavailable: unreadable(background.unreadable) };\n const ratio = contrastRatio(style.color, background.color);\n if (ratio === null) return { unavailable: unreadable(style.color) };\n const large = isLarge(style);\n return { ratio, ...wcagLevels(ratio, large), large };\n}\n\n/** A lens's own compared copy. A Split lens holds the compared render beside the base one, so the `~compared` copy is preferred. */\nfunction copyIn(interior: HTMLElement | null): HTMLElement | undefined {\n const copies = Array.from(interior?.querySelectorAll<HTMLElement>('[data-fg-copy]') ?? []);\n return copies.find((c) => (c.getAttribute('data-fg-host') ?? '').endsWith('~compared')) ?? copies[0];\n}\n\n/** Where a lens's compared render sits at its aim, in client px: the interior's center, in Swap and Split alike, since each side renders the whole interior. */\nfunction comparedAim(interior: HTMLElement | null): LoupePoint | null {\n const box = interior?.getBoundingClientRect();\n return box ? { x: box.left + box.width / 2, y: box.top + box.height / 2 } : null;\n}\n\n/** A Live reading's subject: an element to read inside and the client point to read at, or why there is none. */\ntype LiveAim = { within?: HTMLElement; point: LoupePoint } | { unavailable: string };\n\n/**\n * What a Live lens reads, and where in it: its compared copy at its aim when it has a comparison, else the main story\n * at the reticle. An isolated story renders in a frame of its own, whose document a readout cannot reach.\n */\nfunction liveAim(\n interior: HTMLElement | null,\n settings: LensSlotProps<ForgeComparison>['settings'],\n reticle: LoupePoint,\n): LiveAim {\n const aim =\n settings.compare === null\n ? { within: trialAt(reticle)?.host, point: reticle }\n : { within: copyIn(interior), point: comparedAim(interior) ?? reticle };\n return aim.within?.classList.contains('fg-frame-host') ? { unavailable: IN_FRAME } : aim;\n}\n\nconst verdict = (pass: boolean) => (pass ? 'pass' : 'fail');\n\nfunction textOf(reading: ContrastReading): string {\n if ('unavailable' in reading) return reading.unavailable;\n const base = `${reading.ratio.toFixed(2)}:1 · AA ${verdict(reading.aa)} · AAA ${verdict(reading.aaa)}`;\n return reading.large ? `${base} · large text` : base;\n}\n\n/** The Contrast readout: the WCAG ratio of what lies under the aim, and whether it passes AA and AAA. */\nexport function ContrastReadout({ lens, settings, sources, reticle, size, interior }: LensReadoutProps<ForgeComparison>) {\n const { source } = useShownSource(settings, sources);\n const kind = source?.kind;\n const subscribe = useCallback((fn: () => void) => source?.subscribe(fn) ?? (() => {}), [source]);\n // A Live reading is of the page as it stands, read each render and again whenever the source says a story changed.\n const live = useSyncExternalStore(subscribe, () => {\n if (kind !== 'live') return null;\n const aim = liveAim(interior, settings, reticle);\n return textOf('unavailable' in aim ? aim : contrastAt('live', aim));\n });\n const [pixels, setPixels] = useState<ContrastReading | null>(null);\n const [tick, setTick] = useState(0);\n useEffect(() => source?.subscribe(() => setTick((n) => n + 1)), [source]);\n const latest = useLatest({ lens, settings, reticle, size });\n useEffect(() => {\n if (kind !== 'pixels' || !source?.capture) return;\n const capture = source.capture.bind(source);\n let current = true;\n const timer = setTimeout(() => {\n const { lens: ids, settings: s, reticle: r, size: box } = latest.current;\n const [request] = requestsOf(source, ids, s, r, box);\n if (!request) return;\n void capture(request).then((got) => {\n if (current) setPixels('reason' in got ? { unavailable: got.reason } : contrastAt('pixels', { capture: got, point: got.at }));\n });\n }, 0);\n return () => {\n current = false;\n clearTimeout(timer);\n };\n }, [source, kind, reticle.x, reticle.y, settings.factor, settings.compare, tick, latest]);\n const text = kind === 'live' ? live : kind === 'pixels' && pixels ? textOf(pixels) : null;\n return text ? <span className=\"fg-lens-contrast\">{text}</span> : null;\n}\n\n/** A Token reading: the color's property, each custom property it passes through, and the value they end at. */\nexport type TokenReading = { steps: readonly string[] } | { unavailable: string };\n\n/**\n * How the color under a lens's aim is declared, read from the DOM: the lens's compared copy, or the main story when\n * nothing is compared. A Pixels capture of changed conditions has no DOM to read.\n */\nexport function tokenAt(\n kind: 'live' | 'pixels',\n interior: HTMLElement | null,\n settings: LensSlotProps<ForgeComparison>['settings'],\n reticle: LoupePoint,\n): TokenReading {\n if (kind === 'pixels' && settings.compare !== null) return { unavailable: NEEDS_LIVE };\n const aim = liveAim(interior, settings, reticle);\n if ('unavailable' in aim) return aim;\n const { within, point } = aim;\n const at = within ? colorAt(point, within) : null;\n if (!at) return { unavailable: NO_COLOR };\n try {\n parseColor(at.value);\n } catch {\n return { unavailable: unreadable(at.value) };\n }\n const chain = tokenChain(at);\n // A value naming several tokens branches, and its last branch's literal is not the color: end on what it computes to.\n const branches = chain.some((l) => varRefs(l.declared).size > 1);\n const end = branches ? at.value : (chain.at(-1)?.declared ?? at.value);\n return { steps: [at.property, ...chain.slice(1).map((l) => l.property), end] };\n}\n\nconst isToken = (step: string) => step.startsWith('--wzl-');\n\n/** The Token readout: the chain of tokens the color under the aim comes from, each token opening the CSS vars panel at it. */\nexport function TokenReadout({ settings, sources, reticle, interior }: LensReadoutProps<ForgeComparison>) {\n const { source } = useShownSource(settings, sources);\n const kind = source?.kind;\n const subscribe = useCallback((fn: () => void) => source?.subscribe(fn) ?? (() => {}), [source]);\n const json = useSyncExternalStore(subscribe, () =>\n kind === 'live' || kind === 'pixels' ? JSON.stringify(tokenAt(kind, interior, settings, reticle)) : null,\n );\n const reading = useMemo(() => (json === null ? null : (JSON.parse(json) as TokenReading)), [json]);\n if (!reading) return null;\n if ('unavailable' in reading) return <span className=\"fg-lens-token\">{reading.unavailable}</span>;\n return (\n <span className=\"fg-lens-token\">\n {reading.steps.map((step, i) => (\n <Fragment key={i}>\n {i > 0 ? ' ← ' : null}\n {isToken(step) && i < reading.steps.length - 1 ? (\n <button type=\"button\" className=\"fg-lens-token__link\" onClick={() => revealVar(step)}>\n {step}\n </button>\n ) : (\n step\n )}\n </Fragment>\n ))}\n </span>\n );\n}\n\n/** What a lens draws for the readouts it has on, other than the Pixel grid, which the lens draws itself. */\nexport function renderReadouts(props: LensReadoutProps<ForgeComparison>) {\n const { readouts } = props.settings;\n return (\n <>\n {readouts.includes('token') ? <TokenReadout {...props} /> : null}\n {readouts.includes('contrast') ? <ContrastReadout {...props} /> : null}\n </>\n );\n}\n","import { scrollerOf } from './trialAt';\n\n/** Where a story's scroller stands, in CSS px. */\nexport interface ScrollPosition {\n left: number;\n top: number;\n}\n\nconst ORIGIN: ScrollPosition = { left: 0, top: 0 };\n\n/** Where each isolated trial's frame document last said it stood, by trial id: a kept frame moves to a new host. */\nconst frames = new Map<string, ScrollPosition>();\n\nconst trialOf = (host: HTMLElement) => host.dataset.fgHost ?? '';\n\n/**\n * Records where the frame in `host` stands, and fires `scroll` on the host: its frame scrolls in a document of its\n * own, whose events never reach this one, so the host stands in for the scroller an in-document story has.\n */\nexport function reportFrameScroll(host: HTMLElement, scroll: ScrollPosition): void {\n frames.set(trialOf(host), { left: scroll.left, top: scroll.top });\n host.dispatchEvent(new Event('scroll'));\n}\n\n/** Where the story in `host` stands: its in-document scroller, or the frame document the host holds. */\nexport function scrollOf(host: HTMLElement): ScrollPosition {\n const scroller = scrollerOf(host);\n if (scroller) return { left: scroller.scrollLeft, top: scroller.scrollTop };\n return frames.get(trialOf(host)) ?? ORIGIN;\n}\n","import { isPlainObject } from '@weasel-js/core';\nimport type { Globals, Layout } from '../../protocol/messages';\nimport { type CapturePayload, MAX_DPR, MIN_DPR } from '../../vite/capture/payload';\nimport type { CssOverrides } from '../cssVars/overrides';\nimport { effectiveGlobals, GLOBALS_KEY, storyConfig } from '../globals';\nimport type { TrialInputs } from './captureContext';\nimport {\n type ForgeComparison,\n type LabConditions,\n resolveComparison,\n resolveContextOf,\n type ResolvedConditions,\n withArgs,\n} from './conditions';\nimport { scrollOf } from './frameScroll';\nimport type { TrialHit } from './trialAt';\n\nexport const STATE_UNSENDABLE = \"this story's state cannot be sent to a capture\";\nexport const CONFIG_UNSENDABLE = \"this story's config cannot be sent to a capture\";\nexport const NO_STORY = 'this trial shows no story to capture';\nexport const NO_BOX = \"the story's box has no size\";\n\n/** What a capture of one trial is built from. */\nexport interface CapturePayloadInput {\n entry: TrialInputs['entry'];\n layout: Layout;\n /** The trial's whole config, forge's `$` keys included. */\n config: unknown;\n state: unknown;\n /** The globals the capture renders under: the comparison resolved over the trial's own. */\n globals: Globals;\n overrides: CssOverrides;\n /** The story's host, whose box the capture takes. */\n host: HTMLElement;\n dpr: number;\n /** The comparison, whose args are laid over the config and whose DPR, if any, replaces `dpr`. */\n resolved: ResolvedConditions;\n lab: CapturePayload['lab'];\n colorScheme: CapturePayload['colorScheme'];\n /** Where the story's playhead stands while paused; null while it plays, or with no timeline. */\n playhead: number | null;\n}\n\n/** Whether `round`, `value` sent through JSON, is `value` again: nothing dropped, nothing turned into something else. */\nfunction survived(value: unknown, round: unknown): boolean {\n if (value === null || typeof value === 'string' || typeof value === 'boolean') return value === round;\n if (typeof value === 'number') return Number.isFinite(value) && value === round;\n if (Array.isArray(value)) {\n if (!Array.isArray(round) || value.length !== round.length) return false;\n // `every` skips a hole, which JSON writes as null.\n for (let i = 0; i < value.length; i += 1) if (!(i in value) || !survived(value[i], round[i])) return false;\n return true;\n }\n if (!isPlainObject(value) || !isPlainObject(round)) return false;\n const keys = Object.keys(value);\n return keys.length === Object.keys(round).length && keys.every((key) => key in round && survived(value[key], round[key]));\n}\n\nfunction sendable(state: unknown): boolean {\n try {\n return survived(state, JSON.parse(JSON.stringify(state) ?? 'undefined'));\n } catch {\n return false;\n }\n}\n\n/** `value` without its plain objects' undefined entries, which JSON drops and a story reads as unset either way. */\nfunction withoutUndefined(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(withoutUndefined);\n if (!isPlainObject(value)) return value;\n return Object.fromEntries(\n Object.entries(value).flatMap(([key, v]) => (v === undefined ? [] : [[key, withoutUndefined(v)]])),\n );\n}\n\nconst clampDpr =(dpr: number) => Math.min(Math.max(dpr, MIN_DPR), MAX_DPR);\n\n/**\n * The payload a capture of the trial takes, or why it cannot be sent: a capture renders the story in another\n * document, so its config and state have to survive JSON on the way, and anything that does not would render a\n * different story.\n */\nexport function capturePayload(input: CapturePayloadInput): CapturePayload | { unavailable: string } {\n const { entry, layout, config, state, globals, overrides, host, dpr, resolved, lab, colorScheme, playhead } = input;\n if (!sendable(state)) return { unavailable: STATE_UNSENDABLE };\n const sent = withoutUndefined(withArgs(storyConfig(config), resolved.args));\n if (!sendable(sent)) return { unavailable: CONFIG_UNSENDABLE };\n const box = { width: host.offsetWidth, height: host.offsetHeight };\n if (!(box.width > 0 && box.height > 0)) return { unavailable: NO_BOX };\n const isolate = entry.isolate !== undefined;\n return {\n story: entry.id,\n isolate,\n config: sent,\n state,\n globals,\n overrides,\n playhead: isolate ? null : playhead,\n box,\n layout,\n dpr: clampDpr(resolved.dpr ?? dpr),\n scroll: scrollOf(host),\n lab,\n colorScheme,\n };\n}\n\n/**\n * The payload a Pixels lens over `hit` sends: `trial`'s story under `c`, resolved against the lab as it is now and\n * over the trial's own globals, pins included, the way a Live copy of it renders.\n */\nexport function trialPayload(\n trial: TrialInputs | null,\n lab: LabConditions,\n hit: TrialHit,\n dpr: number,\n c: ForgeComparison | null,\n): CapturePayload | { unavailable: string } {\n if (!trial) return { unavailable: NO_STORY };\n const ctx = resolveContextOf(lab);\n const own = effectiveGlobals(lab.labValues, (trial.config as Record<string, unknown> | null | undefined)?.[GLOBALS_KEY]);\n const resolved = resolveComparison(c, own, ctx);\n const colorScheme = ctx.prefersDark ? 'dark' : 'light';\n const { playhead, ...inputs } = trial;\n return capturePayload({\n ...inputs,\n playhead: playhead(),\n globals: resolved.globals,\n host: hit.host,\n dpr,\n resolved,\n lab: { globals: lab.labValues, mode: lab.mode === 'auto' ? colorScheme : lab.mode },\n colorScheme,\n });\n}\n","import type { LensSourceStatus } from '@weasel-js/labkit/loupe';\nimport { CAPTURE_PATH, type CapturePayload, messageOf } from '../../vite/capture/payload';\n\nexport const CHECKING = 'checking for a capture browser';\nconst UNAVAILABLE = 'captures are unavailable';\n/** A built workshop, served without the dev server, has no endpoint to ask. */\nexport const NO_ENDPOINT = 'this server takes no captures';\n\n/** The dev server's capture endpoint as a Pixels source talks to it. */\nexport interface CaptureClient {\n /** `true`, or why no capture can be taken, as the endpoint last said. */\n status(): LensSourceStatus;\n /** Also asks the endpoint again. */\n subscribe(listener: () => void): () => void;\n /** Asks the endpoint whether it can take captures, unless an ask is already out. */\n poll(): void;\n /** A capture of `payload`, or null when the endpoint answers that it cannot take one; throws on any other failure. */\n take(payload: CapturePayload): Promise<ImageBitmap | null>;\n}\n\nexport function createCaptureClient(base: string, send: typeof fetch): CaptureClient {\n const url = `${base}${CAPTURE_PATH}`;\n const listeners = new Set<() => void>();\n let status: LensSourceStatus = CHECKING;\n let polling: Promise<void> | null = null;\n const setStatus = (next: LensSourceStatus) => {\n if (next === status) return;\n status = next;\n for (const listener of [...listeners]) listener();\n };\n const poll = () => {\n polling ??= (async () => {\n try {\n const res = await send(url);\n if (!res.ok) return setStatus(NO_ENDPOINT);\n const body = (await res.json()) as { available?: boolean; reason?: string };\n setStatus(body.available === true ? true : (body.reason ?? UNAVAILABLE));\n } catch (err) {\n setStatus(`${NO_ENDPOINT}: ${messageOf(err)}`);\n } finally {\n polling = null;\n }\n })();\n };\n return {\n status: () => status,\n subscribe(listener) {\n listeners.add(listener);\n poll();\n return () => listeners.delete(listener);\n },\n poll,\n async take(payload) {\n const res = await send(url, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(payload) });\n if (res.status === 503) {\n setStatus(((await res.json()) as { reason?: string }).reason ?? UNAVAILABLE);\n return null;\n }\n if (!res.ok) {\n const body = (await res.json().catch(() => ({}))) as { error?: string };\n throw new Error(body.error ?? `capture failed: ${res.status}`);\n }\n return createImageBitmap(await res.blob());\n },\n };\n}\n","import { LENS_REST_MS, type LensSourceHandle, type LensSourceRequest, unavailableText } from '@weasel-js/labkit/loupe';\nimport { stableStringify } from '../../protocol/messages';\nimport { type CapturePayload, messageOf } from '../../vite/capture/payload';\nimport type { ForgeComparison } from './conditions';\nimport { NOTHING_UNDER } from './liveSource';\nimport { type TrialHit, trialAt } from './trialAt';\n\ntype Request = LensSourceRequest<ForgeComparison>;\nexport type PayloadFor = (hit: TrialHit, dpr: number, c: ForgeComparison | null) => CapturePayload | { unavailable: string };\n\n/** One lens side's last image: what it was captured from, and at which revision. */\nexport interface Shot {\n key: string;\n revision: number;\n bitmap: ImageBitmap;\n payload: CapturePayload;\n}\n\n/** What every Pixels lens shares: where captures come from, and the last image of each lens side. */\nexport interface PixelsShared {\n take(payload: CapturePayload): Promise<ImageBitmap | null>;\n payloadFor: PayloadFor;\n revision(): number;\n /** By `sideOf`. */\n shots: Map<string, Shot>;\n}\n\n/** One lens side: its lens, its DPR, and whether it shows the comparison or the story as it is. */\nexport const sideOf = (r: Request): string => `${r.lensId}:${r.dpr}${r.conditions === null ? '' : ':compared'}`;\n\n/** What a lens aims at: the payload it sends for the trial under its reticle, keyed by its content, or why none. */\nexport type Aimed = { hit: TrialHit; payload: CapturePayload; key: string } | { reason: string };\n\nexport function aim(shared: PixelsShared, request: Request, doc: Document): Aimed {\n const hit = trialAt(request.reticle, doc);\n if (!hit) return { reason: NOTHING_UNDER };\n const payload = shared.payloadFor(hit, request.dpr, request.conditions);\n if ('unavailable' in payload) return { reason: unavailableText('pixels', payload.unavailable) };\n return { hit, payload, key: stableStringify(payload) };\n}\n\n/** Whether `shot` is a capture of `key` taken since the last story edit. */\nexport const fresh = (shared: PixelsShared, shot: Shot | undefined, key: string): shot is Shot =>\n shot?.key === key && shot.revision === shared.revision();\n\n/** Draws `shot` into `canvas`, `factor` times its CSS size about `at`, in host px, with every pixel kept square. */\nfunction paint(canvas: HTMLCanvasElement, shot: Shot, at: TrialHit['local'], request: Request) {\n const sd = canvas.ownerDocument.defaultView?.devicePixelRatio ?? 1;\n const width = Math.max(1, Math.round(request.size.width * sd));\n const height = Math.max(1, Math.round(request.size.height * sd));\n if (canvas.width !== width) canvas.width = width;\n if (canvas.height !== height) canvas.height = height;\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n ctx.imageSmoothingEnabled = false;\n ctx.clearRect(0, 0, width, height);\n // Canvas px per PNG px: the PNG holds `dpr` of them per host px, and the lens shows a host px `factor` CSS px wide.\n const scale = (request.factor * sd) / shot.payload.dpr;\n const x = Math.round(width / 2 - at.x * request.factor * sd);\n const y = Math.round(height / 2 - at.y * request.factor * sd);\n ctx.drawImage(shot.bitmap, x, y, shot.bitmap.width * scale, shot.bitmap.height * scale);\n canvas.toggleAttribute('data-shown', true);\n}\n\nfunction blank(canvas: HTMLCanvasElement) {\n canvas.getContext('2d')?.clearRect(0, 0, canvas.width, canvas.height);\n canvas.toggleAttribute('data-shown', false);\n}\n\n/** An attached Pixels lens side, which its source tells to look again and to drop what it shows. */\nexport interface PixelsLens extends LensSourceHandle<ForgeComparison> {\n measure(): void;\n revised(): void;\n}\n\n/**\n * Attaches one lens side: a canvas showing the side's last capture, cropped about the reticle, and asking for a new\n * one when what lies under the reticle changes — at once the first time, after labkit's `LENS_REST_MS` at rest after\n * that. The last image stays up until the new one arrives, and a capture that started before a story edit is dropped.\n */\nexport function attachPixelsLens(slot: HTMLElement, first: Request, shared: PixelsShared, onDetach: () => void): PixelsLens {\n const doc = slot.ownerDocument;\n const canvas = doc.createElement('canvas');\n canvas.className = 'fg-lens-pixels';\n const empty = doc.createElement('div');\n empty.className = 'fg-lens-empty';\n empty.hidden = true;\n slot.append(canvas, empty);\n let request = first;\n let wanted: { key: string; payload: CapturePayload } | null = null;\n let pending: object | null = null;\n let timer: ReturnType<typeof setTimeout> | undefined;\n let started = false;\n let gone = false;\n const say = (text: string | null) => {\n empty.hidden = text === null;\n empty.textContent = text ?? '';\n };\n const cancel = () => {\n clearTimeout(timer);\n timer = undefined;\n };\n const run = async () => {\n const target = wanted;\n if (!target) return;\n const token = {};\n pending = token;\n const at = shared.revision();\n const side = sideOf(request);\n try {\n const bitmap = await shared.take(target.payload);\n if (gone || pending !== token || bitmap === null || shared.revision() !== at) return;\n shared.shots.set(side, { key: target.key, revision: at, bitmap, payload: target.payload });\n measure();\n } catch (err) {\n if (!gone && pending === token) say(`Capture failed: ${messageOf(err)}`);\n } finally {\n if (pending === token) pending = null;\n }\n };\n const schedule = () => {\n cancel();\n if (!started) {\n started = true;\n void run();\n return;\n }\n timer = setTimeout(() => {\n timer = undefined;\n void run();\n }, LENS_REST_MS);\n };\n const measure = () => {\n const aimed = aim(shared, request, doc);\n if ('reason' in aimed) {\n wanted = null;\n cancel();\n blank(canvas);\n say(aimed.reason);\n return;\n }\n const { hit, payload, key } = aimed;\n const shot = shared.shots.get(sideOf(request));\n if (fresh(shared, shot, key)) {\n wanted = { key, payload };\n cancel();\n say(null);\n paint(canvas, shot, hit.local, request);\n return;\n }\n // The last image stays up, and nothing is said over it, until the new one arrives.\n say(null);\n if (wanted?.key === key && pending !== null) return;\n wanted = { key, payload };\n schedule();\n };\n measure();\n return {\n measure,\n revised() {\n pending = null;\n wanted = null;\n blank(canvas);\n measure();\n },\n update(next) {\n request = next;\n measure();\n },\n detach() {\n gone = true;\n cancel();\n shared.shots.delete(sideOf(request));\n canvas.remove();\n empty.remove();\n onDetach();\n },\n };\n}\n","import './loupe.css';\nimport { type LensCapture, type LensSource, unavailableText } from '@weasel-js/labkit/loupe';\nimport { createEmitter } from '@weasel-js/registry';\nimport { createCaptureClient } from './captureClient';\nimport type { ForgeComparison } from './conditions';\nimport { aim, attachPixelsLens, fresh, type PayloadFor, type PixelsLens, type PixelsShared, type Shot, sideOf } from './pixelsLens';\n\n/** Why a capture is not given: the story was edited while it was being taken. */\nexport const STORY_CHANGED = 'the story changed while it was captured';\n\n/** The Pixels source, plus a way for its host to have every attached lens look again at what lies under it. */\nexport interface PixelsSource extends LensSource<ForgeComparison> {\n remeasure(): void;\n}\n\nexport interface PixelsSourceOptions {\n /** The dev server's base, under which its capture endpoint answers. */\n base: string;\n payloadFor: PayloadFor;\n fetch?: typeof fetch;\n /** The story edits so far; a capture taken at an older count is never shown. */\n revision: () => number;\n subscribeRevision: (fn: () => void) => () => void;\n}\n\n/**\n * A lens showing a real capture of the story under its reticle, taken by the dev server in headless Chromium at the\n * lens side's DPR and enlarged nearest-neighbor. Each lens side keeps its last image until a newer one arrives; an\n * edit to any story drops every one of them.\n */\nexport function createPixelsSource(opts: PixelsSourceOptions): PixelsSource {\n const client = createCaptureClient(opts.base, opts.fetch ?? ((input, init) => globalThis.fetch(input, init)));\n const shared: PixelsShared = { take: client.take, payloadFor: opts.payloadFor, revision: opts.revision, shots: new Map<string, Shot>() };\n const lenses = new Set<PixelsLens>();\n let unrevise: (() => void) | null = null;\n const remeasured = createEmitter<[]>();\n const revised = () => {\n shared.shots.clear();\n for (const lens of [...lenses]) lens.revised();\n };\n\n return {\n kind: 'pixels',\n produces: 'pixels',\n // A DPR comparison captures at its own DPR, as the payload does.\n label: ({ conditions, dpr }) => `Pixels ${(conditions?.kind === 'custom' ? conditions.dpr : undefined) ?? dpr}×`,\n status: client.status,\n // Also told whenever a capture may have gone stale, for a lens that captures without attaching, as Difference does.\n subscribe(listener) {\n const offs = [client.subscribe(listener), remeasured.subscribe(listener), opts.subscribeRevision(listener)];\n return () => {\n for (const off of offs) off();\n };\n },\n attach(slot, first) {\n client.poll();\n unrevise ??= opts.subscribeRevision(revised);\n const lens = attachPixelsLens(slot, first, shared, () => {\n lenses.delete(lens);\n if (lenses.size > 0) return;\n unrevise?.();\n unrevise = null;\n });\n lenses.add(lens);\n return lens;\n },\n async capture(request): Promise<LensCapture | { reason: string }> {\n const aimed = aim(shared, request, document);\n if ('reason' in aimed) return { reason: aimed.reason };\n const side = sideOf(request);\n let shot = shared.shots.get(side);\n if (!fresh(shared, shot, aimed.key)) {\n const at = opts.revision();\n const bitmap = await client.take(aimed.payload);\n if (bitmap === null) {\n const status = client.status();\n return { reason: unavailableText('pixels', status === true ? 'the capture was refused' : status) };\n }\n // The source tells its subscribers of the edit, and they ask again.\n if (opts.revision() !== at) return { reason: STORY_CHANGED };\n shot = { key: aimed.key, revision: at, bitmap, payload: aimed.payload };\n shared.shots.set(side, shot);\n }\n return { bitmap: shot.bitmap, dpr: aimed.payload.dpr, box: aimed.payload.box, at: aimed.hit.local };\n },\n remeasure() {\n for (const lens of [...lenses]) lens.measure();\n remeasured.emit();\n },\n };\n}\n","import { type RefObject, useContext, useEffect, useState } from 'react';\nimport { LoupeCaptureContext } from './captureContext';\nimport { trialPayload } from './capturePayload';\nimport type { LabConditions } from './conditions';\nimport { createPixelsSource, type PixelsSource } from './pixelsSource';\n\n/**\n * The workshop's Pixels source, capturing whichever trial lies under a lens as it renders against the lab now; null\n * where no dev server takes captures. Every attached lens looks again whenever a trial's inputs change.\n */\nexport function usePixelsSource(lab: RefObject<LabConditions>): PixelsSource | null {\n const capture = useContext(LoupeCaptureContext);\n const [source] = useState(() =>\n capture\n ? createPixelsSource({\n base: capture.base,\n payloadFor: (hit, dpr, c) => trialPayload(capture.trials.get(hit.trialId), lab.current, hit, dpr, c),\n revision: capture.revision.get,\n subscribeRevision: capture.revision.subscribe,\n })\n : null,\n );\n useEffect(() => (source && capture ? capture.trials.subscribe(() => source.remeasure()) : undefined), [source, capture]);\n return source;\n}\n","import './loupe.css';\nimport { effectivePose, type Op, type PoseHold, type RectPose, sceneToAdapter, useLatest, useVisibleRaf } from '@weasel-js/core';\nimport { useLabContext } from '@weasel-js/labkit';\nimport {\n addLensOps,\n BODY_SIZE,\n createLensScene,\n LensActions,\n type LensActionApi,\n type LensDescribeContext,\n LensOverlay,\n type LensScene,\n type LensSourceKind,\n type LensSources,\n lensesOf,\n lensIdsOf,\n type LoupePoint,\n MAX_LENSES,\n resolveSource,\n reticleAt,\n settingsOf,\n} from '@weasel-js/labkit/loupe';\nimport { KeymapHint } from '@weasel-js/ui/components/KeymapHint';\nimport { type RefObject, useCallback, useContext, useEffect, useMemo, useReducer, useRef, useState, useSyncExternalStore } from 'react';\nimport type { GlobalDeclarations } from '../globals';\nimport { StoryGlobalsContext } from '../StoryGlobalsContext';\nimport { CompareMenu, type CompareMenuRequest, compareChoices } from './CompareMenu';\nimport { describeLens, type ForgeComparison, type LabConditions, resolveComparison, resolveContextOf } from './conditions';\nimport { LiveLensesContext } from './liveLenses';\nimport { createLiveSource } from './liveSource';\nimport { renderReadouts } from './readouts';\nimport { trialAt } from './trialAt';\nimport { usePixelsSource } from './usePixelsSource';\n\n/** Props for `ForgeLoupe`. */\nexport interface ForgeLoupeProps {\n declarations: GlobalDeclarations;\n /** The global holding the color mode, which opposite mode flips. */\n modeGlobal: string;\n}\n\n/** Each new lens's body sits this far further along than the last, so lenses added in a row do not stack. */\nconst STAGGER = 24;\nconst OPPOSITE: ForgeComparison = { kind: 'opposite-mode' };\n\nconst clamp = (v: number, lo: number, hi: number) => Math.min(Math.max(v, lo), Math.max(lo, hi));\n\n/** A new body beside its reticle, in lab-body px, flipped left where the right has no room. */\nfunction bodyBeside(reticle: LoupePoint, box: DOMRect, n: number): LoupePoint {\n const half = BODY_SIZE / 2;\n const gap = BODY_SIZE * 0.75 + STAGGER * n;\n const x = reticle.x + gap + half > box.width ? reticle.x - gap : reticle.x + gap;\n return { x: clamp(x, half, box.width - half), y: clamp(reticle.y + STAGGER * n, half, box.height - half) };\n}\n\n/** A lens's reticle and body centers in client px, from the scene's lab-body px. */\nfunction lensClient(\n scene: LensScene<ForgeComparison>,\n lensId: string,\n body: HTMLElement | null,\n): { reticle: LoupePoint; body: LoupePoint } | null {\n const ids = lensIdsOf(scene, `${lensId}:body`);\n const reticle = ids ? scene.get(ids.reticle) : undefined;\n const lens = ids ? scene.get(ids.body) : undefined;\n if (!body || !reticle || !lens) return null;\n const box = body.getBoundingClientRect();\n const center = (p: RectPose) => ({ x: box.left + p.x + p.width / 2, y: box.top + p.y + p.height / 2 });\n return { reticle: center(effectivePose(scene, reticle)), body: center(effectivePose(scene, lens)) };\n}\n\n/**\n * The lens the lens actions act on, held in a ref so a chrome toggle's focus lands before its action reads it.\n * `LensOverlay` reports through `onFocusLens` both the chrome's focus and every selection the lens canvas makes.\n */\nexport function useLensFocus() {\n const focus = useRef<string | null>(null);\n const onFocusLens = useCallback((lensId: string | null) => {\n focus.current = lensId;\n }, []);\n return { focus, onFocusLens };\n}\n\n/** The lens API the actions drive, in client px at its edges and lab-body px in the scene. */\nexport function createApi(\n scene: LensScene<ForgeComparison>,\n refs: {\n body: RefObject<HTMLElement | null>;\n pointer: RefObject<LoupePoint | null>;\n focus: RefObject<string | null>;\n sources: RefObject<LensSources<ForgeComparison>>;\n /** Opens the compare menu on a lens. */\n compare?: RefObject<((lensId: string) => void) | null>;\n },\n): LensActionApi<ForgeComparison> {\n let next = 0;\n const holds = new Map<string, PoseHold<RectPose>>();\n const release = (lensId: string) => {\n holds.get(lensId)?.drop();\n holds.delete(lensId);\n };\n // An undo, a redo or a write from outside the actions can also take a lens out of Follow.\n scene.subscribe(() => {\n for (const lensId of [...holds.keys()]) if (settingsOf(scene, lensId)?.aim !== 'follow') release(lensId);\n });\n const toBody = (client: LoupePoint, box: DOMRect) => ({ x: client.x - box.left, y: client.y - box.top });\n const apply = (ops: readonly Op[]) => {\n if (ops.length > 0) sceneToAdapter(scene).applyOps([...ops], 'lens');\n };\n const current = () => {\n const focused = refs.focus.current;\n if (focused !== null && settingsOf(scene, focused)) return focused;\n return lensesOf(scene).at(-1)?.lensId ?? null;\n };\n return {\n scene,\n current,\n apply,\n add(at) {\n const body = refs.body.current;\n const count = lensesOf(scene).length;\n if (!body || count >= MAX_LENSES) return null;\n const box = body.getBoundingClientRect();\n const client = at ?? refs.pointer.current ?? { x: box.left + box.width / 2, y: box.top + box.height / 2 };\n const reticle = toBody(client, box);\n const lensId = `lens-${next++}`;\n apply(addLensOps(scene, lensId, { body: bodyBeside(reticle, box, count), reticle }));\n refs.focus.current = lensId;\n return lensId;\n },\n follow(client) {\n const lensId = current();\n const body = refs.body.current;\n if (lensId === null || !body) return;\n const pose = reticleAt(scene, lensId, toBody(client, body.getBoundingClientRect()));\n if (pose === null) return;\n const hold = holds.get(lensId) ?? scene.overrides.hold();\n holds.set(lensId, hold);\n hold.set([[`${lensId}:reticle` as never, pose]]);\n },\n unfollow: release,\n sourceAvailable: (kind: LensSourceKind) => refs.sources.current[kind]?.status() ?? 'not provided',\n openCompareMenu: (lensId) => refs.compare?.current?.(lensId),\n };\n}\n\n/** A source whose attached lenses can be told to look again at what lies under them. */\ninterface Remeasurable {\n remeasure(): void;\n}\n\n/** Has each source look again whenever what lies under a lens can change without a reticle moving. */\nexport function useRemeasure(sources: readonly Remeasurable[], body: HTMLElement | null, rerender: () => void) {\n const { trials, mode } = useLabContext();\n const labValues = useContext(StoryGlobalsContext);\n useEffect(() => {\n for (const source of sources) source.remeasure();\n }, [sources, trials, mode, labValues]);\n useEffect(() => {\n if (sources.length === 0 || !body) return;\n const remeasure = () => {\n for (const source of sources) source.remeasure();\n };\n // A resize can move the lab body, and with it every reticle's client point, which only a render recomputes.\n const resize = () => {\n rerender();\n remeasure();\n };\n body.addEventListener('scroll', remeasure, { capture: true, passive: true });\n window.addEventListener('resize', resize);\n // A host takes no pointer while `data-pending`, so a hit test skips it; a new story's host is only found once that\n // attribute goes, after the trials have already changed.\n const unveiled = typeof MutationObserver === 'undefined' ? null : new MutationObserver(remeasure);\n unveiled?.observe(body, { subtree: true, attributes: true, attributeFilter: ['data-pending'] });\n return () => {\n body.removeEventListener('scroll', remeasure, { capture: true });\n window.removeEventListener('resize', resize);\n unveiled?.disconnect();\n };\n }, [sources, body, rerender]);\n}\n\n/** Runs the last function handed to it on the next visible frame, once however many arrive before then. */\nfunction useFrameSchedule(): (run: () => void) => void {\n const next = useRef<(() => void) | null>(null);\n const frame = useVisibleRaf(() => {\n const run = next.current;\n next.current = null;\n run?.();\n });\n return useCallback(\n (run: () => void) => {\n next.current = run;\n frame.request();\n },\n [frame],\n );\n}\n\n/**\n * The workshop's lenses: the lens canvas over the lab, its actions in the Loupe keymap, the hint for that keymap, a\n * Live source rendering a second copy of whichever story sits under each reticle, and a Pixels source showing a real\n * capture of it. Lenses last as long as the workshop does and are never stored.\n */\nexport function ForgeLoupe({ declarations, modeGlobal }: ForgeLoupeProps) {\n const lenses = useContext(LiveLensesContext);\n const labValues = useContext(StoryGlobalsContext);\n const { mode, trials, instruments } = useLabContext();\n const [scene] = useState(createLensScene<ForgeComparison>);\n const [body, setBody] = useState<HTMLElement | null>(null);\n const bodyRef = useRef<HTMLElement | null>(null);\n const pointer = useRef<LoupePoint | null>(null);\n const { focus, onFocusLens } = useLensFocus();\n const conditions = useLatest<LabConditions>({ labValues, mode, declarations, modeGlobal });\n const onFrame = useFrameSchedule();\n const [live] = useState(() =>\n lenses\n ? createLiveSource(\n lenses,\n resolveComparison,\n () => ({ base: conditions.current.labValues, ctx: resolveContextOf(conditions.current) }),\n onFrame,\n )\n : null,\n );\n const pixels = usePixelsSource(conditions);\n const sources = useMemo<LensSources<ForgeComparison>>(\n () => ({ ...(live ? { live } : {}), ...(pixels ? { pixels } : {}) }),\n [live, pixels],\n );\n const remeasured = useMemo(() => [live, pixels].filter((s) => s !== null), [live, pixels]);\n const sourcesRef = useLatest(sources);\n const [menu, setMenu] = useState<CompareMenuRequest | null>(null);\n // The menu offers the args of the story under the lens's reticle, as it is when the menu opens.\n const compare = useLatest((lensId: string) => {\n const at = lensClient(scene, lensId, bodyRef.current);\n if (!at) return;\n const trialId = trialAt(at.reticle)?.trialId;\n const name = trials.find((t) => t.id === trialId)?.instrumentName;\n const schema = instruments.find((i) => i.name === name)?.config ?? null;\n const settings = settingsOf(scene, lensId);\n // Difference compares two Pixels captures whatever the lens's source.\n const pixels =\n settings !== null &&\n (settings.view === 'difference' || resolveSource(settings.source, sourcesRef.current).source?.kind === 'pixels');\n const choices = compareChoices(declarations, schema);\n setMenu((last) => ({ seq: (last?.seq ?? 0) + 1, client: at.body, lensId, pixels, choices }));\n });\n const [api] = useState(() => createApi(scene, { body: bodyRef, pointer, focus, sources: sourcesRef, compare }));\n // Named against the trial under the reticle, whose pins the lens renders under.\n const describe = useCallback(\n (c: ForgeComparison, at: LensDescribeContext) => {\n const trialId = trialAt(at.reticle)?.trialId;\n const config = trials.find((t) => t.id === trialId)?.config;\n return describeLens(c, { labValues, mode, declarations, modeGlobal }, config, at.source === 'pixels');\n },\n [declarations, labValues, mode, modeGlobal, trials],\n );\n const [, rerender] = useReducer((n: number) => n + 1, 0);\n // A Follow reticle moves through the scene's overrides, which bump no version; the lenses re-read it on a render.\n useSyncExternalStore(scene.overrides.subscribe, scene.overrides.getGeneration);\n useRemeasure(remeasured, body, rerender);\n\n useEffect(() => {\n if (!body) return;\n const track = (e: PointerEvent) => {\n pointer.current = { x: e.clientX, y: e.clientY };\n };\n body.addEventListener('pointermove', track, { passive: true });\n return () => body.removeEventListener('pointermove', track);\n }, [body]);\n\n // An overlay contribution renders inside the lab body, which is what this finds; the marker itself shows nothing.\n const attachMarker = useCallback((el: HTMLElement | null) => {\n const found = el?.closest<HTMLElement>('.lk-lab__body') ?? null;\n bodyRef.current = found;\n setBody(found);\n }, []);\n const opposite = useCallback(() => OPPOSITE, []);\n\n return (\n <>\n <span hidden ref={attachMarker} />\n <LensOverlay scene={scene} sources={sources} describe={describe} renderReadouts={renderReadouts} onFocusLens={onFocusLens} />\n <LensActions api={api} bodyRef={bodyRef} opposite={opposite} />\n <CompareMenu api={api} request={menu} />\n <KeymapHint className=\"fg-loupe-hint\" />\n </>\n );\n}\n","import type { TrialRecord } from '@weasel-js/labkit';\n\n/** The trial the URL's params belong to: the focused trial when it shows `route`, else the first that does. */\nexport function routedTrial<T extends Pick<TrialRecord, 'id' | 'instrumentName'>>(\n trials: readonly T[],\n focusedTrialId: string | null,\n route: string,\n): T | undefined {\n return (\n trials.find((t) => t.id === focusedTrialId && t.instrumentName === route) ??\n trials.find((t) => t.instrumentName === route)\n );\n}\n","import { PLAYHEAD_PARAM } from '../route/url';\nimport { readRouteParams, replaceRouteParams } from '../shell/useRoute';\n\nexport function formatSeconds(ms: number): string {\n const rounded = Math.round(ms) / 1000;\n return String(rounded === 0 ? 0 : rounded);\n}\n\n/** Ms from a seconds string, or null for anything but a finite number. */\nexport function parseSeconds(text: string | null | undefined): number | null {\n if (text == null || !/^\\s*-?(\\d+\\.?\\d*|\\.\\d+)\\s*$/.test(text)) return null;\n return Math.round(Number(text) * 1000);\n}\n\n/** The playhead the URL holds, in ms, or null. */\nexport function readPlayheadParam(): number | null {\n return parseSeconds(readRouteParams()[PLAYHEAD_PARAM]);\n}\n\n/** Holds `ms` in the URL, or drops it for null, in place. */\nexport function writePlayheadParam(ms: number | null): void {\n replaceRouteParams(({ [PLAYHEAD_PARAM]: _held, ...rest }) =>\n ms === null ? rest : { ...rest, [PLAYHEAD_PARAM]: formatSeconds(ms) },\n );\n}\n","import { holdAt, type PlayheadHold } from '@weasel-js/clock';\nimport { useLabContext, useTrialClockHandle } from '@weasel-js/labkit';\nimport { type RefObject, useEffect, useRef } from 'react';\nimport { routedTrial } from '../shell/routedTrial';\nimport { readRoute, useRoute } from '../shell/useRoute';\nimport { readPlayheadParam, writePlayheadParam } from './playheadUrl';\nimport { shownTime } from './shown';\n\ninterface PlayheadSyncProps {\n trialId: string;\n route: string;\n /** The route whose opening `t` has been applied, so a trial taking the URL over later does not adopt another's. */\n appliedRef: RefObject<string | null>;\n}\n\n/** Ties one trial's clock to the URL's `t`. */\nfunction PlayheadSync({ trialId, route, appliedRef }: PlayheadSyncProps) {\n const handle = useTrialClockHandle(trialId);\n useEffect(() => {\n if (!handle) return;\n const { clock } = handle;\n let hold: PlayheadHold | null = null;\n const fromUrl = (): void => {\n const t = readPlayheadParam();\n if (t === null || t === shownTime(clock)) return;\n hold?.release();\n hold = holdAt(handle, t);\n };\n // Paused off the span's start, the URL holds the time shown within the pass; playing or at the start, it holds\n // none. While the span cannot hold a requested time yet, the URL keeps the request.\n let held: number | null | undefined;\n const toUrl = (): void => {\n if (hold && hold.pending() !== null) return;\n const time = shownTime(clock);\n const next = clock.rate !== 0 || time === clock.origin ? null : time;\n if (next === held) return;\n held = next;\n writePlayheadParam(next);\n };\n if (appliedRef.current !== route) {\n appliedRef.current = route;\n fromUrl();\n }\n toUrl();\n const off = clock.subscribe(toUrl);\n const onHashChange = (): void => {\n // A hash naming another story belongs to the trial that takes over; this one is about to unmount.\n if (readRoute() !== route) return;\n held = undefined;\n fromUrl();\n toUrl();\n };\n window.addEventListener('hashchange', onHashChange);\n return () => {\n off();\n hold?.release();\n window.removeEventListener('hashchange', onHashChange);\n };\n }, [handle, route, appliedRef]);\n return null;\n}\n\n/**\n * Holds the playhead of the trial showing the routed story in the URL's `t`, by the rule the knobs follow: the\n * focused trial when it shows that story, else the first that does. No other trial's clock touches the URL.\n */\nexport function RoutePlayhead() {\n const lab = useLabContext();\n const [route] = useRoute();\n const applied = useRef<string | null>(null);\n const trial = route === null ? undefined : routedTrial(lab.trials, lab.focusedTrialId, route);\n if (!trial || route === null) return null;\n return <PlayheadSync key={`${trial.id} ${route}`} trialId={trial.id} route={route} appliedRef={applied} />;\n}\n","import { Select, useLabContext, usePersistedState } from '@weasel-js/labkit';\nimport type { IconRef } from '@weasel-js/icons';\nimport { Button } from '@weasel-js/ui/components/Button';\nimport { Callout } from '@weasel-js/ui/components/Callout';\nimport { Icon } from '@weasel-js/ui/components/Icon';\nimport { icon as glyph } from '../icons.gen';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type { Globals } from '../protocol/messages';\nimport { followApp, type GlobalDeclaration, type GlobalDeclarations, labGlobals, labOptions } from './globals';\n\nconst RECORD = 'fg-globals';\n\n/** The lab's global values, as persisted in the lab, and a setter for one. */\nexport function useLabGlobals(declarations: GlobalDeclarations): [Globals, (key: string, value: string) => void] {\n const [stored, setStored] = usePersistedState<unknown>(RECORD, null, { scope: 'lab' });\n const values = useMemo(() => labGlobals(declarations, stored), [declarations, stored]);\n const set = useCallback(\n (key: string, value: string) => setStored((prev: unknown) => ({ ...labGlobals(declarations, prev), [key]: value })),\n [declarations, setStored],\n );\n return [values, set];\n}\n\ninterface GlobalSelectProps {\n name: string;\n declaration: GlobalDeclaration;\n values: Globals;\n set: (key: string, value: string) => void;\n labeled?: boolean;\n}\n\nfunction GlobalSelect({ name, declaration, values, set, labeled = false }: GlobalSelectProps) {\n return (\n <Select\n {...(labeled ? { label: declaration.label } : { 'aria-label': declaration.label })}\n width={labeled ? 'fill' : 'fit'}\n selectedKey={String(values[name])}\n onSelectionChange={(value) => set(name, value)}\n options={labOptions(declaration, values)}\n />\n );\n}\n\n/**\n * The lab's header control for its global values: one select per declaration, then, at the end, a button for each\n * declaration that others are declared `under`, opening those others in a popover.\n */\nexport function GlobalsToolbar({ declarations }: { declarations: GlobalDeclarations }) {\n const [values, set] = useLabGlobals(declarations);\n const entries = Object.entries(declarations);\n const top = entries.filter(([, declaration]) => declaration.under === undefined);\n return (\n <div className=\"fg-globals\" role=\"toolbar\" aria-label=\"Globals\">\n {top.map(([key, declaration]) => (\n <div key={key} className=\"fg-globals__item\">\n <GlobalSelect name={key} declaration={declaration} values={values} set={set} />\n </div>\n ))}\n {top.map(([key, declaration]) => {\n const nested = entries.filter(([, other]) => other.under === key);\n return nested.length > 0 ? (\n <NestedGlobals\n key={key}\n label={declaration.label}\n icon={declaration.icon ?? /* @icon */ 'core:tune'}\n nested={nested}\n values={values}\n set={set}\n />\n ) : null;\n })}\n </div>\n );\n}\n\nfunction NestedGlobals({\n label,\n icon,\n nested,\n values,\n set,\n}: {\n label: string;\n icon: IconRef;\n nested: readonly [string, GlobalDeclaration][];\n values: Globals;\n set: (key: string, value: string) => void;\n}) {\n const anchor = useRef<HTMLButtonElement>(null);\n const [open, setOpen] = useState(false);\n return (\n <>\n <Button\n ref={anchor}\n variant=\"ghost\"\n size=\"sm\"\n iconOnly\n ariaLabel={`More ${label} settings`}\n pressed={open}\n onClick={() => setOpen((was) => !was)}\n >\n <Icon name={icon} size={16} />\n </Button>\n <Callout\n triggerRef={anchor}\n isOpen={open}\n onOpenChange={setOpen}\n placement=\"bottom end\"\n showCloseButton={false}\n title={label}\n className=\"fg-globals__popover\"\n >\n {nested.map(([key, declaration]) => (\n <GlobalSelect key={key} name={key} declaration={declaration} values={values} set={set} labeled />\n ))}\n </Callout>\n </>\n );\n}\n\n/**\n * Reports the lab's global values, as the toolbar persists them and with each `App` resolved against the lab's own\n * chrome, to `onChange`. Renders nothing; mount it inside the lab.\n */\nexport function LabGlobals({\n declarations,\n onChange,\n}: {\n declarations: GlobalDeclarations;\n onChange: (values: Globals) => void;\n}) {\n const [values] = useLabGlobals(declarations);\n const { mode } = useLabContext();\n const resolved = useMemo(() => followApp(declarations, values, { mode }), [declarations, values, mode]);\n useEffect(() => onChange(resolved), [resolved, onChange]);\n return null;\n}\n","import type { LabMenus } from '@weasel-js/labkit';\nimport { type PrefGroup, pref } from '@weasel-js/prefs';\nimport { useEffect, useMemo } from 'react';\nimport type { Globals } from '../protocol/messages';\nimport { type GlobalDeclarations, labOptions } from './globals';\nimport { useLabGlobals } from './GlobalsToolbar';\n\nconst leafPath = (n: number) => `globals.d${n}.v`;\n\n/**\n * The lab menu bar's Globals menu at `values`: a submenu per declaration holding one enum of the options the\n * header's select offers. `undefined` when nothing is declared.\n */\nexport function globalsMenu(\n declarations: GlobalDeclarations,\n values: Globals,\n set: (key: string, value: string) => void,\n): LabMenus | undefined {\n const entries = Object.entries(declarations);\n if (entries.length === 0) return undefined;\n const submenus: Record<string, PrefGroup> = {};\n const current: Record<string, unknown> = {};\n const keys = new Map<string, string>();\n entries.forEach(([key, declaration], n) => {\n const options = labOptions(declaration, values);\n submenus[`d${n}`] = pref.group(\n declaration.label,\n { v: pref.enum(declaration.label, declaration.default, options) },\n { as: 'menu' },\n );\n current[leafPath(n)] = values[key];\n keys.set(leafPath(n), key);\n });\n return {\n schema: pref.group('', { globals: pref.group('Globals', submenus, { as: 'menu' }) }),\n values: current,\n onChange: (path, value) => {\n const key = keys.get(path);\n if (key !== undefined && typeof value === 'string') set(key, value);\n },\n };\n}\n\n/**\n * Reports the lab's Globals menu to `onMenus` as the lab's values change. Renders nothing; mount it inside the\n * lab, since the values live there.\n */\nexport function GlobalsMenus({\n declarations,\n onMenus,\n}: {\n declarations: GlobalDeclarations;\n onMenus: (menus: LabMenus | undefined) => void;\n}) {\n const [values, set] = useLabGlobals(declarations);\n const menus = useMemo(() => globalsMenu(declarations, values, set), [declarations, values, set]);\n useEffect(() => onMenus(menus), [menus, onMenus]);\n return null;\n}\n","import { type InstrumentList, TrialIdContext, useLabContext, useTrialState } from '@weasel-js/labkit';\nimport { type ConfigSchema, valueAtPath } from '@weasel-js/labkit/config';\nimport { useEffect, useRef, useState } from 'react';\nimport { knobPaths, knobsToParams, paramsToKnobs, paramsToPins, reservedParams, sameKnob, withoutPins } from '../route/url';\nimport { routedTrial } from './routedTrial';\nimport { readRouteParams, replaceRouteParams, takeRouteFromTrial, useRoute } from './useRoute';\n\ninterface KnobSyncProps {\n schema: ConfigSchema<unknown>;\n config: unknown;\n}\n\n/**\n * Keeps one trial's knobs and the URL in step. On mount, and whenever the hash changes under it, the URL's knobs are\n * written over the trial's config, with every leaf the URL could name and does not set returned to its default, and the\n * globals it pins pinned; after that each change to the config is written back to the URL in place, without the pins.\n * A route written for this trial as it stood skips that first read.\n */\nfunction KnobSync({ schema, config }: KnobSyncProps) {\n const { setConfig } = useTrialState();\n const reading = useRef(true);\n const [typed, setTyped] = useState(0);\n\n useEffect(() => {\n const onHashChange = (): void => {\n reading.current = true;\n setTyped((n) => n + 1);\n };\n window.addEventListener('hashchange', onHashChange);\n return () => window.removeEventListener('hashchange', onHashChange);\n }, []);\n\n useEffect(() => {\n if (reading.current && takeRouteFromTrial()) reading.current = false;\n if (reading.current) {\n reading.current = false;\n const params = readRouteParams();\n const knobs = paramsToKnobs(schema, params);\n let wrote = false;\n for (const { path, leaf } of knobPaths(schema)) {\n const target = path in knobs ? knobs[path] : leaf.default;\n const current = valueAtPath(config, path);\n if (sameKnob(current === undefined ? leaf.default : current, target)) continue;\n setConfig(path as never, target as never);\n wrote = true;\n }\n for (const [path, pin] of Object.entries(paramsToPins(schema, params))) {\n if (valueAtPath(config, path) === pin) continue;\n setConfig(path as never, pin as never);\n wrote = true;\n }\n // The write comes back as a config change, which runs this again to put it in the URL.\n if (wrote) return;\n }\n const knobs = knobsToParams(schema, config);\n replaceRouteParams((params) => ({ ...knobs, ...withoutPins(reservedParams(params)) }));\n }, [schema, config, setConfig, typed]);\n\n return null;\n}\n\n/**\n * Ties the knobs of the trial showing the routed story to the URL's params: the focused trial when it shows that\n * story, else the first that does. Waits for the story's schema, since a provisional instrument has no leaves to\n * read the URL against and would otherwise wipe its knobs.\n */\nexport function RouteKnobs({ instruments, isReady }: { instruments: InstrumentList; isReady: (id: string) => boolean }) {\n const lab = useLabContext();\n const [route] = useRoute();\n if (route === null || !isReady(route)) return null;\n const trial = routedTrial(lab.trials, lab.focusedTrialId, route);\n const schema = instruments.find((instrument) => instrument.name === route)?.config;\n if (!trial || !schema) return null;\n return (\n <TrialIdContext.Provider value={trial.id}>\n <KnobSync key={`${trial.id} ${route}`} schema={schema as ConfigSchema<unknown>} config={trial.config} />\n </TrialIdContext.Provider>\n );\n}\n","const FLASH_MS = 600;\nconst flashes = new WeakMap<Element, ReturnType<typeof setTimeout>>();\n\n/** Scrolls a trial into view and flashes its outline. False when no trial has that id. */\nexport function revealTrial(trialId: string, root: ParentNode = document): boolean {\n const trial = root.querySelector<HTMLElement>(`.lk-trial[data-trial-id=\"${CSS.escape(trialId)}\"]`);\n if (!trial) return false;\n trial.scrollIntoView({ block: 'nearest' });\n clearTimeout(flashes.get(trial));\n trial.classList.remove('fg-flash');\n // Reading layout between the remove and the add restarts the animation on a second reveal.\n void trial.offsetWidth;\n trial.classList.add('fg-flash');\n flashes.set(\n trial,\n setTimeout(() => {\n trial.classList.remove('fg-flash');\n flashes.delete(trial);\n }, FLASH_MS),\n );\n return true;\n}\n","import { indexEntries } from '../../story/indexPages';\nimport { restatesTitle } from '../breadcrumb';\nimport { isGallery } from '../../story/tags';\nimport type { IndexEntry } from '../../story/types';\n\nexport type TreeNode =\n | { kind: 'folder'; label: string; path: string; children: TreeNode[]; tag?: string; index?: IndexEntry }\n | { kind: 'story'; entry: IndexEntry; tag?: string; label?: string };\n\ntype Folder = Extract<TreeNode, { kind: 'folder' }>;\n\nfunction sortFolder(nodes: TreeNode[]): TreeNode[] {\n const folders = nodes.filter((n): n is Folder => n.kind === 'folder');\n folders.sort((a, b) => a.label.localeCompare(b.label));\n for (const folder of folders) folder.children = sortFolder(folder.children);\n return [...folders, ...nodes.filter((n) => n.kind === 'story')];\n}\n\n/**\n * `nodes` with every folder that holds nothing but a gallery replaced by that gallery under the folder's name, so a\n * gallery titled `ui/Cursors/Gallery` lists as `Cursors` with its stories directly beneath it. The gallery keeps its\n * own path and index page, so its route and story ids are unchanged.\n */\nexport function foldGalleries(nodes: TreeNode[]): TreeNode[] {\n return nodes.map((node) => {\n if (node.kind !== 'folder') return node;\n const children = foldGalleries(node.children);\n const [only] = children;\n // Only a gallery one segment down: one already folded would carry this folder off and lose its name.\n if (\n !node.index\n && children.length === 1\n && only?.kind === 'folder'\n && only.path === `${node.path}/${only.label}`\n && only.index\n && isGallery(only.index)\n ) {\n return { ...only, label: node.label, tag: node.tag ?? only.tag };\n }\n return { ...node, children };\n });\n}\n\n/**\n * `nodes` with every component holding one story, whose name only restates the component's, replaced by that story\n * under the component's name: a file titled `…/KeyDiagram` exporting `KeyDiagram` lists once, not twice.\n */\nexport function hoistLoneStories(nodes: TreeNode[]): TreeNode[] {\n return nodes.map((node) => {\n if (node.kind !== 'folder') return node;\n const [only] = node.children;\n if (node.children.length === 1 && only?.kind === 'story' && restatesTitle(node.path, only.entry.name)) {\n return { kind: 'story', entry: only.entry, label: node.label, tag: node.tag ?? only.tag };\n }\n return { ...node, children: hoistLoneStories(node.children) };\n });\n}\n\n/**\n * Story titles as nested folders, split on `/`; the last segment is the component, which carries its index page and\n * holds its subfolders, then its stories.\n */\nexport function buildTree(index: readonly IndexEntry[]): TreeNode[] {\n const root: TreeNode[] = [];\n const folders = new Map<string, Folder>();\n const pages = new Map(indexEntries(index).map((page) => [page.title, page]));\n for (const entry of index) {\n let siblings = root;\n let path = '';\n for (const label of entry.title.split('/')) {\n path = path ? `${path}/${label}` : label;\n let folder = folders.get(path);\n if (!folder) {\n const page = pages.get(path);\n folder = { kind: 'folder', label, path, children: [], ...(page ? { index: page } : {}) };\n folders.set(path, folder);\n siblings.push(folder);\n }\n siblings = folder.children;\n }\n siblings.push({ kind: 'story', entry });\n }\n return hoistLoneStories(sortFolder(root));\n}\n\n/**\n * The stories whose `title/name` contains `query`, ignoring case, with their ancestors. A folder keeps its index\n * page only when its own path matches.\n */\nexport function filterTree(nodes: TreeNode[], query: string): TreeNode[] {\n const needle = query.trim().toLowerCase();\n if (!needle) return nodes;\n const walk = (list: TreeNode[]): TreeNode[] =>\n list.flatMap((node): TreeNode[] => {\n if (node.kind === 'story') {\n return `${node.entry.title}/${node.entry.name}`.toLowerCase().includes(needle) ? [node] : [];\n }\n const children = walk(node.children);\n if (children.length === 0) return [];\n const { index: page, ...folder } = node;\n return [page && node.path.toLowerCase().includes(needle) ? { ...folder, children, index: page } : { ...folder, children }];\n });\n return walk(nodes);\n}\n","import { indexEntries } from '../../story/indexPages';\nimport type { Libraries } from '../../story/library';\nimport type { IndexEntry } from '../../story/types';\nimport { foldGalleries, hoistLoneStories, type TreeNode } from './buildTree';\n\ntype Folder = Extract<TreeNode, { kind: 'folder' }>;\n\n/** One component — a story title — with the stories declared under it. */\nexport interface ComponentRow {\n /** The full story title, unique per component and used as the row key. */\n path: string;\n /** The title's last segment: the component's own name. */\n label: string;\n /** Which library it ships in. */\n library: string;\n /** The component's index page; absent when a filter kept the row only for some of its stories. */\n index?: IndexEntry;\n entries: IndexEntry[];\n}\n\n/** Every component in the index as one flat, alphabetical list. Components\n * sharing a name are kept apart by their library, then by their full title. */\nexport function buildComponents(index: readonly IndexEntry[], libraries: Libraries): ComponentRow[] {\n const byTitle = new Map<string, ComponentRow>();\n const pages = new Map(indexEntries(index).map((page) => [page.title, page]));\n for (const entry of index) {\n let row = byTitle.get(entry.title);\n if (!row) {\n const segments = entry.title.split('/');\n row = {\n path: entry.title,\n label: segments[segments.length - 1],\n library: libraries.of(entry),\n index: pages.get(entry.title),\n entries: [],\n };\n byTitle.set(entry.title, row);\n }\n row.entries.push(entry);\n }\n const rows = [...byTitle.values()];\n disambiguate(rows);\n return rows.sort(\n (a, b) =>\n a.label.localeCompare(b.label)\n || a.library.localeCompare(b.library)\n || a.path.localeCompare(b.path),\n );\n}\n\n/**\n * Widen each label leftward until it tells its row apart from the others in\n * its library.\n * `ui/Cursors/Gallery` and `ui/Icons/Gallery` are two different\n * components whose last segments agree, and a flat list that prints both as\n * `Gallery` is unusable — the grouping that used to separate them is the very\n * thing this view removes.\n */\nfunction disambiguate(rows: readonly ComponentRow[]): void {\n // Rows in different libraries are already told apart by their tag.\n const byLabel = new Map<string, ComponentRow[]>();\n for (const row of rows) {\n const key = `${row.library}\\0${row.label}`;\n const group = byLabel.get(key);\n if (group) group.push(row);\n else byLabel.set(key, [row]);\n }\n for (const group of byLabel.values()) {\n if (group.length < 2) continue;\n for (const row of group) {\n const segments = row.path.split('/');\n // One more segment at a time, stopping at the full title.\n for (let take = 2; take <= segments.length; take++) {\n row.label = segments.slice(-take).join('/');\n if (group.every((other) => other === row || !other.path.endsWith(`/${row.label}`))) break;\n }\n }\n }\n}\n\n/** The components whose name, library or story names contain `query`,\n * ignoring case. A matching component keeps its index page and all its\n * stories; a component matching only through one story keeps just the\n * stories that matched. */\nexport function filterComponents(rows: readonly ComponentRow[], query: string): ComponentRow[] {\n const needle = query.trim().toLowerCase();\n if (!needle) return [...rows];\n const out: ComponentRow[] = [];\n for (const row of rows) {\n if (`${row.path}/${row.library}`.toLowerCase().includes(needle)) {\n out.push(row);\n continue;\n }\n const entries = row.entries.filter((entry) => entry.name.toLowerCase().includes(needle));\n if (entries.length > 0) out.push({ path: row.path, label: row.label, library: row.library, entries });\n }\n return out;\n}\n\n/** The row whose title `row`'s extends, in its library: the longest such, so a page of a page nests under it. */\nfunction parentOf(row: ComponentRow, byPath: ReadonlyMap<string, ComponentRow>): ComponentRow | undefined {\n const segments = row.path.split('/');\n for (let take = segments.length - 1; take > 0; take--) {\n const parent = byPath.get(segments.slice(0, take).join('/'));\n if (parent && parent.library === row.library) return parent;\n }\n return undefined;\n}\n\n/**\n * The component list as tree nodes, so the sidebar renders and navigates both\n * views with one code path. A slash in a label is a directory: `Icons/Gallery`\n * is a `Gallery` folder inside an `Icons` folder, which it shares with any\n * other row of its library widened to the same prefix. Every component is a\n * folder carrying its index page and holding its stories. A component whose\n * title extends another's, `Prefs/PrefsForm` beside `Prefs`, is a folder inside\n * that one, ahead of its stories as in the tree. A folder a gallery's label opened,\n * holding only that gallery, is folded into it. A component whose one story restates its\n * name is that story.\n */\nexport function componentNodes(rows: readonly ComponentRow[]): TreeNode[] {\n const root: TreeNode[] = [];\n const folders = new Map<string, Folder>();\n const byPath = new Map(rows.map((row) => [row.path, row]));\n const nodes = new Map<string, Folder>();\n const subs = new Map<string, TreeNode[]>();\n for (const row of rows) subs.set(row.path, []);\n for (const row of rows) {\n const parent = parentOf(row, byPath);\n const title = row.path.split('/');\n const labels = parent ? title.slice(parent.path.split('/').length) : row.label.split('/');\n let siblings = parent ? subs.get(parent.path)! : root;\n let tag: string | undefined = parent ? undefined : row.library;\n for (let i = 0; i < labels.length - 1; i++) {\n const path = title.slice(0, title.length - labels.length + i + 1).join('/');\n let folder = folders.get(path);\n if (!folder) {\n folder = { kind: 'folder', label: labels[i], path, tag, children: [] };\n folders.set(path, folder);\n siblings.push(folder);\n }\n siblings = folder.children;\n tag = undefined;\n }\n const node: Folder = {\n kind: 'folder',\n label: labels[labels.length - 1],\n path: row.path,\n tag,\n ...(row.index ? { index: row.index } : {}),\n children: [],\n };\n nodes.set(row.path, node);\n siblings.push(node);\n }\n for (const row of rows) {\n nodes.get(row.path)!.children = [\n ...subs.get(row.path)!,\n ...row.entries.map((entry) => ({ kind: 'story', entry }) as const),\n ];\n }\n return hoistLoneStories(foldGalleries(root));\n}\n\n/** Every library present in `index`, alphabetically. */\nexport function librariesIn(index: readonly IndexEntry[], libraries: Libraries): string[] {\n return [...new Set(index.map(libraries.of))].sort((a, b) => a.localeCompare(b));\n}\n","import { type LabChromeContext, usePersistedState } from '@weasel-js/labkit';\nimport { Checkbox } from '@weasel-js/ui/components/Checkbox';\nimport { ToggleBar, type ToggleBarItem } from '@weasel-js/ui/components/ToggleBar';\nimport { Tree, type TreeNode as UiTreeNode, type TreeProps } from '@weasel-js/ui/components/Tree';\nimport { type ReactNode, useContext, useEffect, useId, useMemo, useRef, useState } from 'react';\nimport { indexEntries } from '../../story/indexPages';\nimport { isGallery, isLab } from '../../story/tags';\nimport type { IndexEntry } from '../../story/types';\nimport { revealTrial } from '../revealTrial';\nimport { onRevealInTree } from '../treeReveal';\nimport { useRoute } from '../useRoute';\nimport { buildTree, filterTree, type TreeNode as StoryNode } from './buildTree';\nimport { buildComponents, componentNodes, filterComponents, librariesIn } from './buildComponents';\nimport { LibrariesContext } from '../../story/library';\nimport { LabBadge } from '../../frame/index/LabBadge';\nimport { LibraryBadge as PackageBadge } from '../../frame/index/LibraryBadge';\n\n/** Which shape the sidebar lists the index in. */\ntype View = 'tree' | 'components' | 'gallery';\n\nconst VIEWS: readonly ToggleBarItem<View>[] = [\n { value: 'tree', label: 'Tree' },\n { value: 'components', label: 'Components' },\n { value: 'gallery', label: 'Gallery' },\n];\n\nexport interface StoryTreeProps {\n ctx: LabChromeContext;\n index: readonly IndexEntry[];\n}\n\ntype StoryFolder = Extract<StoryNode, { kind: 'folder' }>;\n\nconst keyOf = (node: StoryNode): string => (node.kind === 'folder' ? `folder:${node.path}` : `story:${node.entry.id}`);\nconst pathOf = (folderKey: string): string => folderKey.slice('folder:'.length);\nconst hrefOf = (entry: IndexEntry): string => `#/${encodeURIComponent(entry.id)}`;\n\n/** The folder paths above a story's component, and the component's own. */\nfunction ancestorsOf(entry: IndexEntry | undefined): Set<string> {\n const paths = new Set<string>();\n if (!entry) return paths;\n let path = '';\n for (const label of entry.title.split('/')) {\n path = path ? `${path}/${label}` : label;\n paths.add(path);\n }\n return paths;\n}\n\n/** A component's package, as the sidebar tags its rows. */\nfunction LibraryBadge({ library }: { library: string }) {\n return <PackageBadge library={library} className=\"fg-tree__tag\" />;\n}\n\n/** What follows a row's label: a Lab badge on a whole screen, then the package. */\nfunction rowTags(lab: boolean, library: string | undefined): ReactNode {\n if (!lab && !library) return undefined;\n return (\n <>\n {lab ? <LabBadge className=\"fg-tree__lab\" /> : null}\n {library ? <LibraryBadge library={library} /> : null}\n </>\n );\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 [chosen, setView] = usePersistedState<View>('fg-tree-view', 'components', { scope: 'lab' });\n // Stored as what is *off*, so a library added later is on without anyone\n // going back to tick it.\n const [hidden, setHidden] = usePersistedState<Record<string, boolean>>('fg-tree-libraries', {}, { scope: 'lab' });\n\n const table = useContext(LibrariesContext);\n const libraries = useMemo(() => librariesIn(index, table), [index, table]);\n // A view is grayed out by what the project has, not by the package filter,\n // which would otherwise disable a view as a side effect of unticking a box.\n const views = useMemo(() => {\n const hasGallery = index.some(isGallery);\n const hasOther = index.some((entry) => !isGallery(entry));\n return VIEWS.map((item) => ({ ...item, disabled: item.value === 'gallery' ? !hasGallery : !hasOther }));\n }, [index]);\n // The stored choice is kept, so a view comes back once it has something in it.\n const enabled = (value: View): boolean => views.some((item) => item.value === value && !item.disabled);\n const view = [chosen, 'components' as const, 'gallery' as const].find(enabled) ?? chosen;\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[table.of(entry)]), [index, hidden, table]);\n // Galleries list only in their own view, grouped the way Components groups.\n const [galleryEntries, rest] = useMemo(() => {\n const yes: IndexEntry[] = [];\n const no: IndexEntry[] = [];\n for (const entry of kept) (isGallery(entry) ? yes : no).push(entry);\n return [yes, no];\n }, [kept]);\n const tree = useMemo(() => buildTree(rest), [rest]);\n const components = useMemo(() => buildComponents(rest, table), [rest, table]);\n const galleries = useMemo(() => buildComponents(galleryEntries, table), [galleryEntries, table]);\n const shown = useMemo(\n () =>\n view === 'tree'\n ? filterTree(tree, query)\n : componentNodes(filterComponents(view === 'gallery' ? galleries : components, query)),\n [view, components, galleries, tree, query],\n );\n const routable = useMemo(() => [...kept, ...indexEntries(kept)], [kept]);\n const routed = routable.find((entry) => entry.id === route);\n const routeAncestors = useMemo(() => ancestorsOf(routed), [routed]);\n const filtering = query.trim() !== '';\n const openKey = ctx.trials.map((trial) => trial.instrumentName).join('\\n');\n const openIds = useMemo(() => new Set(openKey.split('\\n')), [openKey]);\n\n const { nodes, byId, folders: folderIds } = useMemo(() => {\n const ids = new Map<string, StoryNode>();\n const folders: string[] = [];\n const convert = (list: readonly StoryNode[]): UiTreeNode[] =>\n list.map((node) => {\n const id = keyOf(node);\n ids.set(id, node);\n if (node.kind === 'folder') {\n folders.push(id);\n return {\n id,\n label: node.label,\n className: 'fg-tree__folder',\n href: node.index ? hrefOf(node.index) : undefined,\n current: !!node.index && openIds.has(node.index.id),\n trailing: rowTags(!!node.index && isLab(node.index), node.tag),\n children: convert(node.children),\n };\n }\n return {\n id,\n label: node.label ?? node.entry.name,\n className: 'fg-tree__story',\n href: hrefOf(node.entry),\n current: openIds.has(node.entry.id),\n trailing: rowTags(isLab(node.entry), node.tag),\n };\n });\n return { nodes: convert(shown), byId: ids, folders };\n }, [shown, openIds]);\n const expanded = useMemo(\n () => new Set(folderIds.filter((id) => filtering || (folds[pathOf(id)] ?? routeAncestors.has(pathOf(id))))),\n [folderIds, filtering, folds, routeAncestors],\n );\n\n // A filter forces every folder open, so a toggle then would change state nobody can see.\n const onExpandedChange = (next: Set<string>): void => {\n if (filtering) return;\n const changed = folderIds.filter((id) => next.has(id) !== expanded.has(id));\n if (changed.length) setFolds((prev) => ({ ...prev, ...Object.fromEntries(changed.map((id) => [pathOf(id), next.has(id)])) }));\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) {\n // The URL may name another story, or none; the trial's knobs stand, or the route would read as \"no knobs set\".\n revealTrial(focused.id);\n setRoute(entry.id, { fromTrial: true });\n return;\n } else {\n ctx.swapTrial(focused.id, entry.id);\n setRoute(entry.id, { inPlace: true });\n return;\n }\n setRoute(entry.id);\n };\n\n // A component's row opens its index page, which opens its folder; only the fold mark folds it. Selection opens\n // it, and closes it again once the selection moves on; only a manual fold is stored. The row's activation has\n // already toggled the fold, so the stored fold goes back to what it was, less a manual close, which would\n // outrank the selection.\n const openIndex = (path: string, page: IndexEntry, another: boolean): void => {\n const was = folds[path];\n setFolds(({ [path]: _toggled, ...rest }) => (was ? { ...rest, [path]: was } : rest));\n activate(page, another);\n };\n\n const onAction: TreeProps['onAction'] = (id, mods) => {\n const node = byId.get(id);\n if (node?.kind === 'story') activate(node.entry, mods.shiftKey);\n else if (node?.index) openIndex(node.path, node.index, mods.shiftKey);\n };\n\n // A breadcrumb asks for a folder; it is shown the way clicking its row shows it, in the Tree view when the\n // current one has no such folder. The row scrolls itself into view once it has rendered.\n const treeEl = useRef<HTMLUListElement>(null);\n const scrollTo = useRef<string | null>(null);\n useEffect(() => {\n const id = scrollTo.current;\n if (id == null) return;\n const row = [...(treeEl.current?.querySelectorAll<HTMLElement>('[data-tree-id]') ?? [])].find((el) => el.dataset.treeId === id);\n if (!row) return;\n scrollTo.current = null;\n (row.firstElementChild as HTMLElement | null)?.scrollIntoView({ block: 'nearest' });\n });\n const reveal = (path: string): void => {\n const find = (list: readonly StoryNode[], at: string): StoryFolder | undefined => {\n for (const node of list) {\n if (node.kind !== 'folder') continue;\n if (node.path === at) return node;\n const inner = find(node.children, at);\n if (inner) return inner;\n }\n return undefined;\n };\n const nodesOf = (v: View): readonly StoryNode[] =>\n v === 'tree' ? tree : componentNodes(v === 'gallery' ? galleries : components);\n // The current view first; a folder only another view holds switches to it; failing all three, the nearest folder above.\n const order = [view, ...VIEWS.map((item) => item.value).filter((v) => v !== view && enabled(v))];\n let node: StoryFolder | undefined;\n let where: View = view;\n for (let at = path; at && !node; at = at.includes('/') ? at.slice(0, at.lastIndexOf('/')) : '') {\n for (const v of order) {\n node = find(nodesOf(v), at);\n if (node) {\n where = v;\n break;\n }\n }\n }\n const found = node;\n if (!found) return;\n if (where !== view) setView(where);\n setQuery('');\n const segments = found.path.split('/');\n const above = segments.slice(0, -1).map((_, i) => segments.slice(0, i + 1).join('/'));\n setFolds((prev) => ({ ...prev, ...Object.fromEntries(above.map((p) => [p, true])) }));\n scrollTo.current = keyOf(found);\n if (found.index) openIndex(found.path, found.index, false);\n else setFolds((prev) => ({ ...prev, [found.path]: true }));\n };\n // Resubscribed every commit, so the listener always reads this render's view and data.\n useEffect(() => onRevealInTree(reveal));\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 size=\"sm\"\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 <span className=\"fg-tree__library\">\n <LibraryBadge library={library} />\n </span>\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 <Tree\n ref={treeEl}\n aria-labelledby={headingId}\n className=\"fg-tree__items\"\n nodes={nodes}\n empty={filtering ? 'No stories match' : 'No stories'}\n expandedIds={expanded}\n onExpandedChange={onExpandedChange}\n onAction={onAction}\n />\n </section>\n );\n}\n","import { createEmitter } from '@weasel-js/registry';\nimport { 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 answered = createEmitter();\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)) answered.emit();\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: answered.subscribe,\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 type { LabContextValue, RenderContext } from '@weasel-js/labkit';\nimport { type Dispatch, type RefObject, type SetStateAction, useCallback, useEffect, useRef } 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 type PortHandoff,\n PROTOCOL_VERSION,\n stableStringify,\n type ToFrame,\n} from '../protocol/messages';\nimport type { IndexEntry } from '../story/types';\nimport type { AnswerBook } from './answers';\nimport { isGlobalsPath, storyConfig } from './globals';\nimport { reportFrameScroll } from './loupe/frameScroll';\nimport { type Ready, readyKey } from './readyKey';\nimport { type A11yOutcome, type TrialFrames } from './trialFrames';\nimport { setRoute } from './useRoute';\n\nconst START_TIMEOUT_MS = 10_000;\n/** Distinguishes one frame request from the next; only ever compared, never read. */\nlet requests = 0;\n\nexport interface Fault {\n phase: FaultPhase | null;\n message: string;\n}\n\n/** One handshake with one frame document; a reload replaces it. */\nexport interface Link {\n channel: Channel<FromFrame, ToFrame>;\n /** Takes each message to the view that holds the frame now. */\n deliver: (msg: FromFrame) => void;\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 /** Audits waiting on an answer carrying the same id. */\n pending: Map<string, (outcome: A11yOutcome) => void>;\n /** Whether the frame has said it rendered; before that there is no story to audit. */\n hasRendered: boolean;\n /** Audits held until it has. */\n queued: (() => void)[];\n}\n\nexport function 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({ ok: false, message: 'The frame went away' });\n link.current.pending.clear();\n link.current.disconnect();\n link.current.channel.close();\n link.current = null;\n}\n\nexport function 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\n/** Sends the frame whichever of the trial's config, state and globals in `next` differ from what it holds; true when any did. */\nexport function sendInputs(current: Link, sent: NonNullable<Link['sent']>, next: NonNullable<Link['sent']>): boolean {\n const before = current.inputs;\n const { state, globals } = next;\n const config = storyConfig(next.config, sent.config);\n if (config !== sent.config) {\n sent.config = config;\n current.channel.send({ type: 'config', config });\n current.inputs += 1;\n }\n if (state !== sent.state) {\n sent.state = state;\n current.channel.send({ type: 'state', state });\n current.inputs += 1;\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 }\n return current.inputs !== before;\n}\n\n/** What a link reads of its view as each message arrives: always the view's last commit. */\nexport interface FrameLinkLatest {\n entry: IndexEntry;\n ctx: RenderContext<unknown, unknown>;\n answers: AnswerBook;\n onReady: (entry: IndexEntry, ready: Ready) => void;\n descriptionKey: string | null;\n globals: Globals;\n overrides: Readonly<Record<string, string>>;\n lab: LabContextValue;\n}\n\nexport interface FrameLinkOptions {\n latest: { readonly current: FrameLinkLatest };\n /** The frame's address, named in a fault when it never starts. */\n src: string;\n /** The trial whose frame registry entry, reports and swaps this link speaks for; null for none. */\n trialId: string | null;\n frames: TrialFrames | null;\n /** The view's host, which stands in for its frame's scroller in this document. */\n host: RefObject<HTMLElement | null>;\n setFault: Dispatch<SetStateAction<Fault | null>>;\n setPending: (pending: boolean) => void;\n /** A lens's copy of the trial's frame: it sends `init` on the first `ready`, and neither reports it nor records answers. */\n copy: boolean;\n /** The inputs sent to the frame whenever one changes. */\n config: unknown;\n state: unknown;\n globals: Globals;\n descriptionKey: string | null;\n}\n\n/** What `receive` and `openLink` read of the view: the hook's options at its last render, and its `init`. */\ninterface LinkDeps\n extends Pick<FrameLinkOptions, 'latest' | 'src' | 'trialId' | 'frames' | 'host' | 'setFault' | 'setPending' | 'copy'> {\n init: (current: Link) => void;\n}\n\n/** One message from the frame, taken as the view's last commit would. */\nfunction receive(deps: LinkDeps, current: Link, msg: FromFrame): void {\n const { latest: latestRef, trialId, frames, host, setFault, setPending, init, copy } = deps;\n const { ctx: live, answers, onReady } = latestRef.current;\n switch (msg.type) {\n case 'ready': {\n clearTimeout(current.timer);\n setFault(null);\n for (const [name, value] of Object.entries(latestRef.current.overrides)) {\n current.channel.send({ type: 'vars.set', name, value });\n }\n // A copy renders a story its trial's instrument already describes.\n if (copy) {\n init(current);\n break;\n }\n const key = readyKey(msg);\n current.awaiting = key;\n onReady(latestRef.current.entry, msg);\n if (current.awaiting === key && key === latestRef.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 if (!copy) answers.record(msg.answers);\n break;\n case 'vars':\n if (trialId) frames?.report(trialId, msg.vars);\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 current.pending.get(msg.id)?.(outcome);\n current.pending.delete(msg.id);\n break;\n }\n case 'scroll':\n // A copy follows its trial's scroll; where it stands itself is nothing anyone reads.\n if (!copy && host.current) reportFrameScroll(host.current, msg);\n break;\n case 'open': {\n const { lab: liveLab } = latestRef.current;\n if (!trialId || !liveLab.instruments.some((instrument) => instrument.name === msg.id)) break;\n liveLab.swapTrial(trialId, msg.id);\n setRoute(msg.id, { inPlace: true });\n break;\n }\n case 'fault':\n // A newer input is already on its way to the frame, which faults again if it still throws.\n if (msg.phase === 'render' && msg.seq !== undefined && msg.seq < current.inputs) break;\n clearTimeout(current.timer);\n setFault({ phase: msg.phase, message: msg.message });\n break;\n }\n}\n\n/** Hands `frame` a fresh port, closing the link before it, and holds the new link in `link`. */\nfunction openLink(deps: LinkDeps, link: RefObject<Link | null>, frame: HTMLIFrameElement): void {\n const { latest: latestRef, src, trialId, frames, setFault, setPending } = deps;\n closeLink(link);\n setPending(true);\n const target = frame.contentWindow;\n if (!target) return;\n const { port1, port2 } = new MessageChannel();\n const timer = setTimeout(() => setFault({ phase: null, message: `Frame did not start: ${src}` }), START_TIMEOUT_MS);\n const channel = openChannel<FromFrame, ToFrame>(port1, {\n onMismatch: (mismatch) => {\n clearTimeout(timer);\n setFault({ phase: 'protocol', message: mismatchMessage(mismatch) });\n },\n });\n const waiting = new Map<string, (outcome: A11yOutcome) => void>();\n // Held until the frame says it rendered: before that there is no story to judge.\n const audit = (): Promise<A11yOutcome> =>\n new Promise((resolve) => {\n const id = `a11y-${(requests += 1)}`;\n waiting.set(id, resolve);\n const ask = () => channel.send({ type: 'a11y.run', id });\n if (current.hasRendered) ask();\n else current.queued.push(ask);\n });\n const disconnect = frames && trialId ? frames.connect(trialId, { send: channel.send, audit }) : () => {};\n const current: Link = {\n channel,\n deliver: (msg) => receive(deps, current, msg),\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) => current.deliver(msg));\n target.postMessage({ type: PORT_HANDOFF, id: latestRef.current.entry.id } satisfies PortHandoff, location.origin, [\n port2,\n ]);\n}\n\n/**\n * The view's handshake with its frame: `connect` hands a loaded frame a port, `link` holds what came of it, and\n * `adopt` takes over the link of a frame handed on from the view before this one.\n */\nexport function useFrameLink(opts: FrameLinkOptions): {\n connect(frame: HTMLIFrameElement): void;\n adopt(adopted: Link): void;\n link: RefObject<Link | null>;\n} {\n const { latest: latestRef, src, trialId, frames, host, setFault, setPending, copy, config, state, globals, descriptionKey } = opts;\n const link = useRef<Link | null>(null);\n\n const init = useCallback((current: Link): void => {\n const { ctx: live, globals: liveGlobals } = latestRef.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 }, [latestRef]);\n\n const deps: LinkDeps = { latest: latestRef, src, trialId, frames, host, setFault, setPending, copy, init };\n const connect = (frame: HTMLIFrameElement): void => openLink(deps, link, frame);\n\n const adopt = (adopted: Link): void => {\n adopted.deliver = (msg) => receive(deps, adopted, msg);\n setPending(!adopted.hasRendered);\n };\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 // The frame retries its render on new input and faults again if it still throws.\n if (current.sent && sendInputs(current, current.sent, { config, state, globals })) {\n setFault((shown) => (shown?.phase === 'render' ? null : shown));\n }\n }, [config, state, globals, descriptionKey, init, setFault]);\n\n return { connect, adopt, link };\n}\n","import { useLatest } from '@weasel-js/core';\nimport { type RefObject, useCallback, useLayoutEffect, useRef } from 'react';\nimport { canMoveFrames, moveFrame } from './framePool';\n\n/** What of a frame's handshake decides whether the frame is worth handing on. */\nexport interface KeptLink {\n awaiting: string | null;\n sent: object | null;\n}\n\ninterface Kept {\n frame: HTMLIFrameElement;\n link: KeptLink;\n}\n\nconst kept = new Map<string, Kept>();\nlet shelf: HTMLDivElement | null = null;\n\n/** Where a kept frame waits, inside the document so it stays loaded. */\nfunction shelfElement(): HTMLDivElement {\n if (!shelf) {\n shelf = document.createElement('div');\n shelf.className = 'fg-frame-pool';\n shelf.setAttribute('aria-hidden', 'true');\n }\n if (!shelf.isConnected) document.body.append(shelf);\n return shelf;\n}\n\nexport interface KeptFrameOptions<L extends KeptLink> {\n /** Names the story and the trial showing it; null where there is no trial to hand a frame on within. */\n key: string | null;\n slot: RefObject<Element | null>;\n frame: RefObject<HTMLIFrameElement | null>;\n link: RefObject<L | null>;\n /** Called with the link of a frame taken over from the view before this one. */\n onAdopt: (link: L) => void;\n /** Closes the link of a frame no view took. */\n onDrop: () => void;\n}\n\n/** Takes over the frame the view before this one shelved under the same key, if it left one. */\nfunction adopt<L extends KeptLink>({ key, slot, frame, link, onAdopt }: KeptFrameOptions<L>): void {\n const waiting = key === null ? undefined : kept.get(key);\n if (key === null || !waiting || !slot.current) return;\n kept.delete(key);\n moveFrame(slot.current, waiting.frame);\n frame.current = waiting.frame;\n link.current = waiting.link as L;\n onAdopt(waiting.link as L);\n}\n\n/**\n * Shelves the view's frame for the view mounting in its place; true when there was a frame worth shelving. Takes\n * the holder of the options and reads it when called, as the view unmounts: the options are then those of the\n * view's last commit, not of its mount.\n */\nfunction shelve<L extends KeptLink>(options: { readonly current: KeptFrameOptions<L> }): boolean {\n const { key, frame, link, onDrop } = options.current;\n const element = frame.current;\n const current = link.current;\n if (key === null || !element?.isConnected || !current || !canMoveFrames()) return false;\n if (current.awaiting === null && current.sent === null) return false;\n const entry: Kept = { frame: element, link: current };\n moveFrame(shelfElement(), element);\n kept.set(key, entry);\n // The view taking over mounts in this commit, so a frame still here after it has no taker.\n queueMicrotask(() => {\n if (kept.get(key) !== entry) return;\n kept.delete(key);\n onDrop();\n element.remove();\n });\n return true;\n}\n\n/**\n * Hands a story's loaded frame from a view that unmounts to the one mounting in its place in the same commit, as a\n * trial does when its instrument gains a stage. Returns a function that answers, when called, whether this view's\n * frame has been handed on and is no longer its own to remove; an effect cleanup calls it, since the hand-off\n * happens as the view unmounts. Nothing is handed on where the browser cannot move an iframe without reloading it,\n * or before the frame's `ready`.\n */\nexport function useKeptFrame<L extends KeptLink>(options: KeptFrameOptions<L>): () => boolean {\n const handedOn = useRef(false);\n const latest = useLatest(options);\n // A layout effect on both sides: its cleanup runs before React takes the old view's elements out of the\n // document, which is the last moment the frame can move without reloading.\n useLayoutEffect(() => {\n adopt(latest.current);\n return () => {\n if (shelve(latest)) handedOn.current = true;\n };\n }, [latest]);\n return useCallback(() => handedOn.current, []);\n}\n","import { breadcrumb } from './breadcrumb';\nimport './shell.css';\nimport { useLatest } from '@weasel-js/core';\nimport { type RenderContext, TrialIdContext, useLabContext } from '@weasel-js/labkit';\nimport { type Dispatch, type RefObject, type SetStateAction, useContext, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport type { FrameSetup } from '../frame/FrameController';\nimport { useNearViewport } from '@weasel-js/react';\nimport { IN_VIEW_MARGIN } from './inViewMargin';\nimport { FRAME_HELLO } from '../protocol/messages';\nimport type { IndexEntry } from '../story/types';\nimport type { AnswerBook } from './answers';\nimport { useCssOverrides } from './cssVars/overrides';\nimport { closeLink, type Fault, type Link, useFrameLink } from './frameLink';\nimport { FramePoolContext, HELLO_TIMEOUT_MS, moveFrame } from './framePool';\nimport { effectiveGlobals, GLOBALS_KEY } from './globals';\nimport { applyGlobalsTo } from './hostConditions';\nimport { useKeptFrame } from './keptFrame';\nimport { scrollOf } from './loupe/frameScroll';\nimport { type LensFrameCopy, LiveFrameCopies, useCopyConfig } from './loupe/LiveCopies';\nimport type { Ready } from './readyKey';\nimport { 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 * Makes this view a lens's second copy of the trial's story, in a frame of its own: it takes `id` as its host id,\n * renders under `globals` with `args` laid over the trial's config, scrolls wherever `main` says the trial's frame\n * stands, and stays out of the frame pool, the kept frames, the frame registry and the answer book. It reports no\n * `ready` and swaps no trial.\n */\n copy?: LensFrameCopy;\n /** The workshop's frame setup. A copy's host takes its globals through it, so what it paints behind the copy's\n * frame is in the copy's mode rather than the lab's. */\n setup?: FrameSetup;\n}\n\ninterface FrameMount {\n inView: boolean;\n src: string;\n slotRef: RefObject<HTMLDivElement | null>;\n iframeRef: RefObject<HTMLIFrameElement | null>;\n latest: { readonly current: { pool: { claim(): HTMLIFrameElement | null } | null; title: string; copy?: FrameViewProps['copy'] } };\n connect: { readonly current: (frame: HTMLIFrameElement) => void };\n link: RefObject<Link | null>;\n handedOn: () => boolean;\n setFault: Dispatch<SetStateAction<Fault | null>>;\n setPending: (pending: boolean) => void;\n}\n\n/**\n * Puts the view's frame in its slot while it is in view: the one it adopted, a warm one from the pool, or a new one.\n * A trial out of view drops its frame, and with it any WebGL contexts the story held; the config and state live in\n * the trial, so a return brings up a new frame and `init` carries them back.\n */\nfunction mountFrame(m: FrameMount): (() => void) | undefined {\n const { inView, src, slotRef, iframeRef, latest: latestRef, connect: connectRef, link, handedOn, setFault, setPending } = m;\n const slot = slotRef.current;\n if (!inView || !slot) return undefined;\n // Already in the slot, loaded and linked, when it came from the view this one replaced.\n const adopted = iframeRef.current;\n const claimed = adopted || latestRef.current.copy ? null : (latestRef.current.pool?.claim() ?? null);\n const frame = adopted ?? claimed ?? document.createElement('iframe');\n frame.className = 'fg-frame-view';\n frame.title = latestRef.current.title;\n frame.removeAttribute('tabindex');\n frame.toggleAttribute('data-pending', true);\n iframeRef.current = frame;\n // Handshakes start on the document's hello, never on `load`: that fires before the hello, and a port handed\n // over then is one the frame, which keeps only its first, would still take in place of the right one.\n const unheard = adopted || claimed\n ? undefined\n : setTimeout(() => setFault({ phase: null, message: `Frame did not start: ${src}` }), HELLO_TIMEOUT_MS);\n const onMessage = (event: MessageEvent) => {\n if (event.source !== frame.contentWindow || event.origin !== location.origin) return;\n if ((event.data as { type?: unknown } | null)?.type !== FRAME_HELLO) return;\n clearTimeout(unheard);\n connectRef.current(frame);\n };\n window.addEventListener('message', onMessage);\n if (claimed) {\n moveFrame(slot, claimed);\n connectRef.current(claimed);\n } else if (!adopted) {\n frame.src = src;\n slot.append(frame);\n }\n return () => {\n window.removeEventListener('message', onMessage);\n clearTimeout(unheard);\n if (handedOn()) return;\n closeLink(link);\n frame.remove();\n iframeRef.current = null;\n setPending(true);\n setFault(null);\n };\n}\n\nconst NO_ARGS: Readonly<Record<string, unknown>> = {};\n\nexport function FrameView(props: FrameViewProps) {\n const { entry, frameUrl, answers, descriptionKey, ctx: trialCtx, copy } = props;\n const labGlobals = useContext(StoryGlobalsContext);\n const pins = (trialCtx.config as Record<string, unknown> | null | undefined)?.[GLOBALS_KEY];\n const own = useMemo(() => effectiveGlobals(labGlobals, pins), [labGlobals, pins]);\n const globals = copy ? copy.globals : own;\n const { config: laidConfig, setConfig: laidSetConfig } = useCopyConfig(trialCtx.config, trialCtx.setConfig, copy?.args ?? NO_ARGS);\n const ctx = useMemo(\n () => (copy ? { ...trialCtx, config: laidConfig, setConfig: laidSetConfig } : trialCtx),\n [copy, trialCtx, laidConfig, laidSetConfig],\n );\n const trialId = useContext(TrialIdContext);\n const frames = useContext(TrialFramesContext);\n const [overrides] = useCssOverrides();\n const pool = useContext(FramePoolContext);\n const lab = useLabContext();\n const src = `${frameUrl}#${entry.id}`;\n const title = breadcrumb(entry.title, entry.name);\n const iframeRef = useRef<HTMLIFrameElement | null>(null);\n const hostRef = useRef<HTMLDivElement>(null);\n const slotRef = useRef<HTMLDivElement>(null);\n const inView = useNearViewport(hostRef, IN_VIEW_MARGIN);\n const latestRef = useLatest({ ...props, ctx, globals, overrides, pool, lab, title });\n const [fault, setFault] = useState<Fault | null>(null);\n // A loaded document stays hidden until its story has rendered, so a new trial never shows the blank page.\n const [pending, setPending] = useState(true);\n\n const { connect, adopt, link } = useFrameLink({\n latest: latestRef,\n src,\n trialId: copy ? null : trialId,\n frames: copy ? null : frames,\n host: hostRef,\n setFault,\n setPending,\n copy: copy !== undefined,\n config: ctx.config,\n state: ctx.state,\n globals,\n descriptionKey,\n });\n\n const connectRef = useLatest(connect);\n\n const handedOn = useKeptFrame<Link>({\n key: trialId && !copy ? `${trialId} ${src}` : null,\n slot: slotRef,\n frame: iframeRef,\n link,\n onAdopt: adopt,\n onDrop: () => closeLink(link),\n });\n\n useEffect(\n () => mountFrame({ inView, src, slotRef, iframeRef, latest: latestRef, connect: connectRef, link, handedOn, setFault, setPending }),\n [inView, src, connectRef, latestRef, handedOn, link],\n );\n\n useEffect(() => {\n iframeRef.current?.toggleAttribute('data-pending', pending && !fault);\n }, [pending, fault, inView, src]);\n\n useEffect(() => {\n if (iframeRef.current) iframeRef.current.title = title;\n }, [title]);\n\n useEffect(() => (copy ? undefined : answers.hold(ctx.config)), [answers, ctx.config, copy]);\n\n const setup = props.setup;\n const copyId = copy?.id;\n useLayoutEffect(\n () => (copyId && setup && hostRef.current ? applyGlobalsTo(hostRef.current, copyId, globals, setup) : undefined),\n [copyId, globals, setup],\n );\n\n // No observer in the frame sees the lens's transform, which is outside its document, so a canvas there measures the\n // scale it is shown at again only on a resize.\n const factor = copy?.factor;\n useEffect(() => {\n if (factor !== undefined) iframeRef.current?.contentWindow?.dispatchEvent(new Event('resize'));\n }, [factor]);\n\n // Applied once the copy has rendered, when its document is tall enough to stand where the trial's does.\n const main = copy?.main;\n useEffect(() => {\n if (!main || pending) return undefined;\n const follow = () => link.current?.channel.send({ type: 'scroll', ...scrollOf(main) });\n follow();\n main.addEventListener('scroll', follow, { passive: true });\n return () => main.removeEventListener('scroll', follow);\n }, [main, pending, link]);\n\n return (\n <div ref={hostRef} className=\"fg-frame-host\" data-fg-host={copy?.id ?? trialId ?? undefined} data-fg-copy={copy ? '' : undefined}>\n {/* The frame is placed here by hand: a pooled one arrives already loaded, and React would reload it. */}\n <div ref={slotRef} className=\"fg-frame-slot\" />\n {fault ? (\n <div className=\"fg-fault\" role=\"alert\">\n {fault.phase ? <span className=\"fg-fault__phase\">{fault.phase}</span> : null}\n <p className=\"fg-fault__message\">{fault.message}</p>\n </div>\n ) : null}\n {copy ? null : (\n <LiveFrameCopies trialId={trialId} trialConfig={trialCtx.config}>\n {(lensCopy) => <FrameView {...props} copy={lensCopy} />}\n </LiveFrameCopies>\n )}\n </div>\n );\n}\n","import { crumbTitle } from './Crumbs';\nimport type { Instrument } from '@weasel-js/labkit';\nimport { type ConfigSchema, f } from '@weasel-js/labkit/config';\nimport type { FrameSetup } from '../frame/FrameController';\nimport { schemaFromDescription } from '../protocol/schema';\nimport type { IndexEntry } from '../story/types';\nimport type { AnswerBook } from './answers';\nimport { FrameView } from './FrameView';\nimport { CaptureInputs } from './loupe/CaptureInputs';\nimport { type GlobalDeclarations, withGlobals } from './globals';\nimport { type Ready, readyKey } from './readyKey';\nimport { DEFAULT_LAYOUT } from '../protocol/messages';\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 setup, which applies the globals to a lens copy's host. */\n setup?: FrameSetup;\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 = {}, setup } = 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 const viewport = ready ? ready.viewport : entry.viewport;\n return {\n name: entry.id,\n ...crumbTitle(entry),\n config,\n defaultConfig: () => config.defaults(),\n initialState: () => null,\n render: (ctx) => (\n <>\n <FrameView\n entry={entry}\n frameUrl={frameUrl}\n answers={answers}\n onReady={onReady}\n descriptionKey={descriptionKey}\n ctx={ctx}\n {...(setup ? { setup } : {})}\n />\n <CaptureInputs entry={entry} layout={ready?.layout ?? DEFAULT_LAYOUT} config={ctx.config} state={ctx.state} />\n </>\n ),\n // Taken from the index until the frame reports, so the trial does not move the frame into a stage and reload it.\n ...(viewport ? { stage: { size: { width: viewport.width, height: viewport.height } } } : {}),\n };\n}\n","import { useLatest } from '@weasel-js/core';\nimport type { Instrument, InstrumentList } from '@weasel-js/labkit';\nimport { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport type { FrameSetup } from '../frame/FrameController';\nimport type { FrameImporters } from '../frame/mountFrame';\nimport { stableStringify } from '../protocol/messages';\nimport { loadIndexBundle } from '../story/indexBundle';\nimport { indexId, isIndexId } from '../story/indexPages';\nimport { type Libraries, TITLE_LIBRARIES } from '../story/library';\nimport { loadStories } from '../story/load';\nimport type { IndexEntry, LoadedStory } from '../story/types';\nimport { type AnswerBook, createAnswerBook } from './answers';\nimport { documentInstrument, type Loaded, pendingInstrument } from './documentInstrument';\nimport type { GlobalDeclarations } from './globals';\nimport { type Ready, readyKey } from './readyKey';\nimport type { StoryHosts } from './storyHosts';\nimport { storyInstrument } from './storyInstrument';\n\n/** The lab instruments `useStoryRegistry` builds, and the calls that keep them current. */\nexport interface StoryRegistry {\n instruments: InstrumentList;\n /** Whether a story's schema is known: its module has loaded, or its frame has reported. An instrument is built\n * either way, and before that its schema is empty — which reads as \"no args\" to anything that cannot tell the\n * two apart. */\n isReady: (id: string) => boolean;\n /** Called by FrameView. Replaces the story's instrument only when `ready.schema`, layout or viewport differ from what it holds. */\n onReady: (entry: IndexEntry, ready: Ready) => void;\n /** Drops what was loaded from `file` and loads it again for every entry that had it, as after an edit. */\n reload: (file: string) => void;\n}\n\n/** What `useStoryRegistry` loads stories from, and what it shows them with. */\nexport interface StoryRegistryOptions {\n frameUrl: string;\n globals?: GlobalDeclarations;\n /** Story modules by file. Given, every entry without `isolate` renders in the workshop document; absent, every\n * entry renders in a frame. */\n importers?: FrameImporters;\n /** The frame config, applied to each story host in the document. */\n setup?: FrameSetup;\n /** Names the library an index page's component ships in. Default: its title's first segment. */\n libraries?: Libraries;\n /** The workshop's story hosts. Given, a story or index page rendered in the document takes marks. Keep it the\n * same object: an instrument already built keeps the hosts it was built with. */\n hosts?: StoryHosts;\n load?: (mod: Record<string, unknown>, title: string, parameters?: Record<string, unknown>) => LoadedStory[];\n}\n\ninterface Built {\n entryKey: string;\n ready: Ready | undefined;\n loaded: Loaded | undefined;\n fault: Error | undefined;\n frameUrl: string;\n globals: GlobalDeclarations;\n setup: FrameSetup | undefined;\n inDocument: boolean;\n generation: number;\n revision: number;\n instrument: Instrument<unknown, unknown>;\n}\n\ninterface Cache {\n built: ReadonlyMap<string, Built>;\n books: ReadonlyMap<string, AnswerBook>;\n list: InstrumentList;\n}\n\nconst NO_GLOBALS: GlobalDeclarations = {};\nconst NO_SETUP: FrameSetup = {};\n\nconst pruned = <V>(map: ReadonlyMap<string, V>, ids: Set<string>): ReadonlyMap<string, V> =>\n [...map.keys()].every((id) => ids.has(id)) ? map : new Map([...map].filter(([id]) => ids.has(id)));\n\nconst toError = (error: unknown): Error => (error instanceof Error ? error : new Error(String(error)));\n\n/**\n * One instrument per story in `index`, each schema holding a `$globals` group for `globals`. The lab's global values\n * reach the stories through `StoryGlobalsContext`, not through here.\n */\nexport function useStoryRegistry(index: readonly IndexEntry[], options: StoryRegistryOptions): StoryRegistry {\n const { frameUrl, globals = NO_GLOBALS, importers, setup = NO_SETUP, libraries = TITLE_LIBRARIES, load = loadStories, hosts } = options;\n const [readies, setReadies] = useState<ReadonlyMap<string, Ready>>(() => new Map());\n const [loaded, setLoaded] = useState<ReadonlyMap<string, Loaded>>(() => new Map());\n const [faults, setFaults] = useState<ReadonlyMap<string, Error>>(() => new Map());\n // Per file, how many reloads it has had: a pending face keyed by it asks again after one.\n const [generations, setGenerations] = useState<ReadonlyMap<string, number>>(() => new Map());\n // Bumped when a story's frame answers something new. labkit's panel re-reads the answer book only when\n // the trial's config changes, and replacing the instrument is what refills it.\n const [revisions, setRevisions] = useState<ReadonlyMap<string, number>>(() => new Map());\n\n const onReady = useCallback((entry: IndexEntry, ready: Ready) => {\n setReadies((prev) => {\n const held = prev.get(entry.id);\n if (held && readyKey(held) === readyKey(ready)) return prev;\n return new Map(prev).set(entry.id, ready);\n });\n }, []);\n\n // Keyed by content: a caller may rebuild an equal index every render, and an identity key would loop.\n const indexIds = JSON.stringify(index.map((entry) => entry.id));\n const [prunedFor, setPrunedFor] = useState(indexIds);\n if (prunedFor !== indexIds) {\n setPrunedFor(indexIds);\n const ids = new Set(index.map((entry) => entry.id));\n setReadies((prev) => pruned(prev, ids));\n setLoaded((prev) => pruned(prev, ids));\n setFaults((prev) => pruned(prev, ids));\n setRevisions((prev) => pruned(prev, ids));\n }\n\n // One import per file, shared by every entry it holds; a reload drops the file's promise and asks again.\n const imports = useRef(new Map<string, Promise<Record<string, unknown>>>());\n const liveRef = useLatest({ index, importers, setup, load, libraries });\n // Files asked for before the importers held them: a story file added while the workshop runs lists first.\n const missing = useRef(new Set<string>());\n\n const importOf = useCallback((file: string): Promise<Record<string, unknown>> => {\n let loading = imports.current.get(file);\n if (!loading) {\n const importer = liveRef.current.importers?.[file];\n if (!importer) missing.current.add(file);\n loading = importer ? importer() : Promise.reject(new Error(`No importer for ${file}`));\n imports.current.set(file, loading);\n }\n return loading;\n }, [liveRef]);\n\n const request = useCallback(\n (entry: IndexEntry): void => {\n const { setup: current, load: loadModule } = liveRef.current;\n const settle = (ids: string[], result: Map<string, Loaded>) => {\n setLoaded((prev) => {\n const next = new Map(prev);\n for (const [id, value] of result) next.set(id, value);\n return next;\n });\n setFaults((prev) => (ids.some((id) => prev.has(id)) ? pruned(prev, new Set([...prev.keys()].filter((id) => !ids.includes(id)))) : prev));\n };\n const fail = (ids: string[], error: unknown) => {\n const fault = toError(error);\n setFaults((prev) => {\n const next = new Map(prev);\n for (const id of ids) next.set(id, fault);\n return next;\n });\n };\n if (isIndexId(entry.id)) {\n const { index: entries, libraries } = liveRef.current;\n const source = { index: entries, importOf, load: loadModule, parameters: current.parameters, prepare: current.prepare, libraries };\n void loadIndexBundle(entry.id, source)\n .then((bundle) => settle([entry.id], new Map<string, Loaded>([[entry.id, { kind: 'index', bundle }]])))\n .catch((error: unknown) => fail([entry.id], error));\n return;\n }\n const siblings = liveRef.current.index.filter((e) => e.file === entry.file && !isIndexId(e.id));\n const ids = siblings.map((e) => e.id);\n void importOf(entry.file)\n .then(async (mod) => {\n const stories = loadModule(mod, entry.title, current.parameters);\n const result = new Map<string, Loaded>();\n for (const sibling of siblings) {\n const story = stories.find((s) => s.exportName === sibling.exportName);\n if (!story) continue;\n await current.prepare?.(story);\n result.set(sibling.id, { kind: 'story', story });\n }\n if (!result.has(entry.id)) throw new Error(`${entry.file} has no story export \"${entry.exportName}\"`);\n settle(ids, result);\n })\n .catch((error: unknown) => fail(ids, error));\n },\n [importOf, liveRef],\n );\n\n const reload = useCallback(\n (file: string) => {\n imports.current.delete(file);\n const affected = liveRef.current.index.filter((e) => e.file === file || (isIndexId(e.id) && liveRef.current.index.some((s) => s.file === file && indexId(s.title) === e.id)));\n const ids = new Set(affected.map((e) => e.id));\n setLoaded((prev) => pruned(prev, new Set([...prev.keys()].filter((id) => !ids.has(id)))));\n setFaults((prev) => pruned(prev, new Set([...prev.keys()].filter((id) => !ids.has(id)))));\n setGenerations((prev) => new Map(prev).set(file, (prev.get(file) ?? 0) + 1));\n },\n [liveRef],\n );\n\n useEffect(() => {\n for (const file of [...missing.current]) {\n if (!importers?.[file]) continue;\n missing.current.delete(file);\n reload(file);\n }\n }, [importers, reload]);\n\n const committed = useRef<Cache>({ built: new Map(), books: new Map(), list: [] });\n\n const cache = useMemo<Cache>(() => {\n const previous = committed.current;\n const built = new Map<string, Built>();\n const books = new Map<string, AnswerBook>();\n const list = index.map((entry) => {\n const ready = readies.get(entry.id);\n const inDocument = importers !== undefined && entry.isolate === undefined;\n const had = loaded.get(entry.id);\n const fault = faults.get(entry.id);\n const generation = generations.get(entry.file) ?? 0;\n const revision = revisions.get(entry.id) ?? 0;\n const entryKey = stableStringify(entry);\n const answers = previous.books.get(entry.id) ?? createAnswerBook();\n books.set(entry.id, answers);\n const held = previous.built.get(entry.id);\n const kept =\n held &&\n held.entryKey === entryKey &&\n held.ready === ready &&\n held.loaded === had &&\n held.fault === fault &&\n held.frameUrl === frameUrl &&\n held.globals === globals &&\n held.setup === setup &&\n held.inDocument === inDocument &&\n held.generation === generation &&\n held.revision === revision\n ? held\n : {\n entryKey,\n ready,\n loaded: had,\n fault,\n frameUrl,\n globals,\n setup,\n inDocument,\n generation,\n revision,\n instrument: !inDocument\n ? storyInstrument({ entry, ready, answers, frameUrl, onReady, globals, setup })\n : had\n ? documentInstrument({ entry, loaded: had, setup, globals, ...(hosts ? { hosts } : {}) })\n : pendingInstrument({ entry, globals, load: request, generation, ...(fault ? { fault } : {}) }),\n };\n built.set(entry.id, kept);\n return kept.instrument;\n });\n const unchanged = list.length === previous.list.length && list.every((i, n) => i === previous.list[n]);\n return { built, books, list: unchanged ? previous.list : list };\n }, [index, readies, loaded, faults, generations, revisions, frameUrl, globals, setup, hosts, importers, onReady, request]);\n\n useLayoutEffect(() => {\n committed.current = cache;\n }, [cache]);\n\n useEffect(() => {\n const offs = [...cache.books].map(([id, book]) =>\n book.subscribe(() => setRevisions((prev) => new Map(prev).set(id, (prev.get(id) ?? 0) + 1))),\n );\n return () => {\n for (const off of offs) off();\n };\n }, [cache.books]);\n\n const isReady = useCallback((id: string) => readies.has(id) || loaded.has(id), [readies, loaded]);\n\n return { instruments: cache.list, isReady, onReady, reload };\n}\n","import {\n Lab,\n type LabContribution,\n type LabMenus,\n type StorageAdapter,\n useLabContext,\n} from '@weasel-js/labkit';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type { ShellConfig } from '../config';\nimport { DEFAULT_TITLE } from '../title';\nimport type { FrameSetup } from '../frame/FrameController';\nimport type { FrameImporters } from '../frame/mountFrame';\nimport { type Globals, stableStringify } from '../protocol/messages';\nimport { indexEntries } from '../story/indexPages';\nimport { LibrariesContext, librariesFrom } from '../story/library';\nimport type { DepGraph, IndexEntry } from '../story/types';\nimport { DependenciesContext } from './dependencies';\nimport { missingInstrument } from './documentInstrument';\nimport { A11Y_SECTION } from './a11y/A11yPanel';\nimport { CssVarsChrome } from './cssVars/cssVarsChrome';\nimport { KeysChrome } from './keys/keysChrome';\nimport { infoItem } from './info/infoItem';\nimport { issuesSection } from './issues/issuesSection';\nimport { StoryInfoDialog } from './info/StoryInfoDialog';\nimport { createFramePool, type FramePool, FramePoolContext } from './framePool';\nimport { ForgeLoupe } from './loupe/ForgeLoupe';\nimport type { Revision } from './loupe/captureContext';\nimport { LoupeProvider } from './loupe/CaptureInputs';\nimport { createStoryHosts, StoryHostsContext } from './storyHosts';\nimport { createTrialFrames, TrialFramesContext } from './trialFrames';\nimport { RoutePlayhead } from '../timeline/RoutePlayhead';\nimport { type GlobalDeclarations, labGlobals } from './globals';\nimport { GlobalsToolbar, LabGlobals } from './GlobalsToolbar';\nimport { GlobalsMenus } from './globalsMenu';\nimport type { StoryChanges } from './storyChanges';\nimport { StoryGlobalsContext } from './StoryGlobalsContext';\nimport { LAB_DENSITY } from './labDensity';\nimport { RouteKnobs } from './RouteKnobs';\nimport { StoryTree } from './tree/StoryTree';\nimport { crossesInPlace, readRoute, readRouteEntry, useRoute } from './useRoute';\nimport { useStoryRegistry } from './useStoryRegistry';\n\n/** Props for `Workshop`. `index`, `importers` and `dependencies` are what the vite plugin's virtual modules supply. */\nexport interface WorkshopProps {\n index: readonly IndexEntry[];\n /** The frame document, for the stories `isolate` keeps in one. */\n frameUrl: string;\n /** Story modules by file. Given, stories render in the workshop document; absent, every story renders in a frame. */\n importers?: FrameImporters;\n /** The frame config, applied to each story rendered in the document. */\n setup?: FrameSetup;\n /** Story files edited while the workshop runs; each is loaded again for the stories that had it. */\n changes?: StoryChanges;\n config?: ShellConfig;\n /** The story globs the index was built from, named when it is empty. */\n stories?: readonly string[];\n storageKey?: string;\n storage?: StorageAdapter;\n /** The component graph index pages list dependencies from. */\n dependencies?: DepGraph;\n /** The dev server's base, where it takes captures of a story; absent, lenses offer no Pixels source. */\n captureBase?: string;\n /** The dev server's base, where it lists a component's issues; absent, the Issues panel says it is not connected. */\n issuesBase?: string;\n /** Bumped on every story edit, so no lens shows a capture of a story as it was. */\n revision?: Revision;\n}\n\nconst NO_DECLARATIONS: GlobalDeclarations = {};\n\n/**\n * Shows the story the route names when no trial shows it, once per route, so closing that trial sticks. It goes\n * into the trial the previous route was in when a history step crosses an in-place swap, so Back returns that\n * trial to its previous story; otherwise into the focused trial, as a click in the tree does. Only a lab with no\n * trial at all gets a new one: another trial is what Shift-click is for.\n */\nfunction RouteOpener() {\n const lab = useLabContext();\n const [route] = useRoute();\n const handled = useRef<string | null>(null);\n const last = useRef({ route: readRoute(), entry: readRouteEntry() });\n useEffect(() => {\n const from = last.current;\n if (route !== from.route) last.current = { route, entry: readRouteEntry() };\n if (route === null || handled.current === route || !lab.instruments.some((i) => i.name === route)) return;\n handled.current = route;\n if (lab.trials.some((trial) => trial.instrumentName === route)) return;\n const previous = lab.trials.find((trial) => trial.instrumentName === from.route);\n const target =\n (previous && crossesInPlace(from.entry, last.current.entry) ? previous : undefined) ??\n lab.trials.find((trial) => trial.id === lab.focusedTrialId) ??\n lab.trials[0];\n if (target) lab.swapTrial(target.id, route);\n else lab.addTrial(route);\n }, [route, lab]);\n return null;\n}\n\nfunction useDocumentTitle(title: string) {\n useEffect(() => {\n document.title = title;\n }, [title]);\n}\n\n/** A pool of warm frames at `frameUrl` while `framed`; null otherwise. */\nfunction useFramePool(frameUrl: string, framed: boolean): FramePool | null {\n const [pool, setPool] = useState<FramePool | null>(null);\n useEffect(() => {\n if (!framed) return;\n const next = createFramePool(frameUrl);\n // eslint-disable-next-line react-hooks/set-state-in-effect -- publishes the frame pool this effect creates\n setPool(next);\n return () => {\n next.dispose();\n setPool(null);\n };\n }, [frameUrl, framed]);\n return pool;\n}\n\n/** What the workshop shows when the index is empty, naming the globs it was built from. */\nfunction NoStories({ stories }: { stories: readonly string[] }) {\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\n/** The workshop page: a labkit `Lab` with a story tree, where each story or index page opens as a trial. */\nexport function Workshop(props: WorkshopProps) {\n const { index, frameUrl, importers, setup, changes, config, stories = [], storageKey, storage, dependencies } = props;\n const declarations = config?.globals ?? NO_DECLARATIONS;\n const title = config?.title ?? DEFAULT_TITLE;\n useDocumentTitle(title);\n const [frames] = useState(createTrialFrames);\n const [hosts] = useState(createStoryHosts);\n // Warm frames are for the stories that render in one: every story when no importers are given, else the isolated.\n const pool = useFramePool(frameUrl, importers === undefined || index.some((entry) => entry.isolate !== undefined));\n const entries = useMemo(() => [...index, ...indexEntries(index)], [index]);\n const table = config?.libraries;\n const libraries = useMemo(() => librariesFrom(table), [table]);\n const registry = useStoryRegistry(entries, {\n frameUrl,\n globals: declarations,\n libraries,\n hosts,\n ...(importers ? { importers } : {}),\n ...(setup ? { setup } : {}),\n });\n // A route no story has gets an instrument of its own, so the trial it would open in says the story is missing.\n const [route] = useRoute();\n const missing = route !== null && !entries.some((entry) => entry.id === route) ? route : null;\n const instruments = useMemo(\n () => (missing === null ? registry.instruments : [...registry.instruments, missingInstrument(missing, declarations)]),\n [registry.instruments, missing, declarations],\n );\n const reload = registry.reload;\n useEffect(() => changes?.subscribe(reload), [changes, reload]);\n const [labValues, setLabValues] = useState<Globals>(() => labGlobals(declarations, undefined));\n const themeFor = config?.labTheme;\n const labTheme = useMemo(() => themeFor?.(labValues), [themeFor, labValues]);\n const [infoOpen, setInfoOpen] = useState(false);\n const reportLabValues = useCallback(\n (next: Globals) => setLabValues((prev) => (stableStringify(prev) === stableStringify(next) ? prev : next)),\n [],\n );\n const infoCommand = useMemo(() => infoItem(() => setInfoOpen(true)), []);\n const showsCssVars = config?.cssVars !== false;\n const modeGlobal = config?.loupe?.modeGlobal ?? 'mode';\n const [cssVarsChrome, setCssVarsChrome] = useState<readonly LabContribution[]>([]);\n const [keysChrome, setKeysChrome] = useState<readonly LabContribution[]>([]);\n const labChrome = useMemo<readonly LabContribution[]>(\n () => [\n { id: 'fg-stories', region: 'sidebar', render: (ctx) => <StoryTree ctx={ctx} index={index} /> },\n ...(showsCssVars ? cssVarsChrome : []),\n A11Y_SECTION,\n issuesSection(index, props.issuesBase),\n ...keysChrome,\n ...(Object.keys(declarations).length > 0\n ? [{ id: 'fg-globals', region: 'header', render: () => <GlobalsToolbar declarations={declarations} /> } as const]\n : []),\n { id: 'fg-info', region: 'header', group: 'story', item: infoCommand },\n { id: 'fg-loupe', region: 'overlay', render: () => <ForgeLoupe declarations={declarations} modeGlobal={modeGlobal} /> },\n ...(config?.labChrome ?? []),\n ],\n [index, props.issuesBase, infoCommand, declarations, showsCssVars, cssVarsChrome, keysChrome, config?.labChrome, modeGlobal],\n );\n const [menus, setMenus] = useState<LabMenus>();\n const first = index[0];\n if (!first) return <NoStories stories={stories} />;\n return (\n <LibrariesContext.Provider value={libraries}>\n <StoryGlobalsContext.Provider value={labValues}>\n <DependenciesContext.Provider value={dependencies ?? null}>\n <FramePoolContext.Provider value={pool}>\n <TrialFramesContext.Provider value={frames}>\n <StoryHostsContext.Provider value={hosts}>\n <LoupeProvider captureBase={props.captureBase} revision={props.revision}>\n <Lab\n title={title}\n density={LAB_DENSITY}\n {...(labTheme ? { theme: labTheme } : {})}\n instruments={instruments}\n defaultInstrument={readRoute() ?? first.id}\n storageKey={storageKey ?? 'weaselforge'}\n {...(storage ? { storage } : {})}\n labChrome={labChrome}\n addTrial={false}\n marks={false}\n {...(menus ? { menus } : {})}\n {...(config?.controls ? { controls: config.controls } : {})}\n {...(config?.pages ? { pages: config.pages } : {})}\n {...(config?.path !== undefined ? { path: config.path } : {})}\n >\n <RouteOpener />\n <RouteKnobs instruments={registry.instruments} isReady={registry.isReady} />\n <RoutePlayhead />\n <StoryInfoDialog\n index={index}\n isReady={registry.isReady}\n isOpen={infoOpen}\n onOpenChange={setInfoOpen}\n />\n <LabGlobals declarations={declarations} onChange={reportLabValues} />\n <GlobalsMenus declarations={declarations} onMenus={setMenus} />\n {showsCssVars ? <CssVarsChrome onChrome={setCssVarsChrome} /> : null}\n <KeysChrome onChrome={setKeysChrome} />\n </Lab>\n </LoupeProvider>\n </StoryHostsContext.Provider>\n </TrialFramesContext.Provider>\n </FramePoolContext.Provider>\n </DependenciesContext.Provider>\n </StoryGlobalsContext.Provider>\n </LibrariesContext.Provider>\n );\n}\n","import { createKitRoot } from '../kitIcons';\nimport type { FrameImporters } from '../frame/mountFrame';\nimport type { DepGraph, IndexEntry } from '../story/types';\nimport { createRevision } from './loupe/captureContext';\nimport { createStoryChanges } from './storyChanges';\nimport { Workshop, type WorkshopProps } from './Workshop';\n\n/** `Workshop`'s props, plus where to mount it. */\nexport interface MountWorkshopOptions extends WorkshopProps {\n /** Default: the document's `#root`. */\n container?: HTMLElement;\n}\n\n/** A mounted workshop, for feeding it what the vite plugin pushes after an edit. */\nexport interface MountedWorkshop {\n /** Swaps in a re-indexed story list, as the vite plugin's `forge:index` event carries. */\n setIndex(index: readonly IndexEntry[]): void;\n /** Swaps in importers whose URLs fetch the modules as they are now, after an edit. */\n setImporters(importers: FrameImporters): void;\n /** Loads `file` again for every story that had it, through the current importers. */\n reloadStory(file: string): void;\n /** Swaps in the component graph, as the vite plugin's `forge:deps` event carries. */\n setDependencies(dependencies: DepGraph): void;\n /** Says a story, or a module one imports, was edited: no lens shows a capture taken before it. */\n revise(): void;\n unmount(): void;\n}\n\n/** Renders a `Workshop` into its own React root. Throws when no container is given and the page has no `#root`. */\nexport function mountWorkshop({ container, ...props }: MountWorkshopOptions): MountedWorkshop {\n const target = container ?? document.getElementById('root');\n if (!target) throw new Error('mountWorkshop: no container given and no #root element');\n const root = createKitRoot(target, props.setup?.icons);\n const changes = createStoryChanges();\n const revision = createRevision();\n let current: WorkshopProps = { ...props, changes, revision };\n root.render(<Workshop {...current} />);\n return {\n setIndex(index) {\n current = { ...current, index };\n root.render(<Workshop {...current} />);\n },\n setImporters(importers) {\n current = { ...current, importers };\n root.render(<Workshop {...current} />);\n },\n reloadStory: (file) => changes.emit(file),\n setDependencies(dependencies) {\n current = { ...current, dependencies };\n root.render(<Workshop {...current} />);\n },\n revise: () => revision.bump(),\n unmount: () => root.unmount(),\n };\n}\n"]}