@weasel-js/forge 1.12.0 → 1.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/README.md +20 -5
  2. package/dist/{FrameController-CdnaIo4C.d.ts → FrameController-DgfVaENb.d.ts} +15 -3
  3. package/dist/{chunk-GH5RE5X5.js → chunk-2ZBZRBHI.js} +2 -2
  4. package/dist/{chunk-GH5RE5X5.js.map → chunk-2ZBZRBHI.js.map} +1 -1
  5. package/dist/{chunk-KEQBGDUZ.js → chunk-7XJNVJB5.js} +3 -3
  6. package/dist/{chunk-KEQBGDUZ.js.map → chunk-7XJNVJB5.js.map} +1 -1
  7. package/dist/{chunk-LTTEILXY.js → chunk-COT4I347.js} +3 -3
  8. package/dist/{chunk-LTTEILXY.js.map → chunk-COT4I347.js.map} +1 -1
  9. package/dist/{chunk-WMGEO5M6.js → chunk-GHPMNT2A.js} +83 -13
  10. package/dist/chunk-GHPMNT2A.js.map +1 -0
  11. package/dist/chunk-RVJHUY7W.js +60 -0
  12. package/dist/chunk-RVJHUY7W.js.map +1 -0
  13. package/dist/chunk-VUPN73JP.js +16 -0
  14. package/dist/chunk-VUPN73JP.js.map +1 -0
  15. package/dist/{chunk-ATI7FYJ7.js → chunk-WFT5IOHX.js} +98 -63
  16. package/dist/chunk-WFT5IOHX.js.map +1 -0
  17. package/dist/{chunk-YDLRSEUN.js → chunk-XIBKYSRU.js} +5 -4
  18. package/dist/chunk-XIBKYSRU.js.map +1 -0
  19. package/dist/{config-Mg05Ja9r.d.ts → config-6fWf87Tt.d.ts} +3 -21
  20. package/dist/csf/preview-api.js +2 -2
  21. package/dist/frame/index.css +26 -0
  22. package/dist/frame/index.css.map +1 -1
  23. package/dist/frame/index.d.ts +14 -8
  24. package/dist/frame/index.js +109 -75
  25. package/dist/frame/index.js.map +1 -1
  26. package/dist/index.d.ts +29 -5
  27. package/dist/index.js +3 -3
  28. package/dist/library-CdTj-hFp.d.ts +21 -0
  29. package/dist/{mountFrame-Ds3QLnBF.d.ts → mountFrame-Bs7u1ro-.d.ts} +1 -1
  30. package/dist/shell/index.css +33 -5
  31. package/dist/shell/index.css.map +1 -1
  32. package/dist/shell/index.d.ts +6 -5
  33. package/dist/shell/index.js +190 -108
  34. package/dist/shell/index.js.map +1 -1
  35. package/dist/test/index.css +2 -3
  36. package/dist/test/index.css.map +1 -1
  37. package/dist/test/index.d.ts +1 -1
  38. package/dist/test/index.js +4 -4
  39. package/dist/vite/index.js +78 -16
  40. package/dist/vite/index.js.map +1 -1
  41. package/package.json +9 -9
  42. package/dist/chunk-ATI7FYJ7.js.map +0 -1
  43. package/dist/chunk-WEQSLPKT.js +0 -9
  44. package/dist/chunk-WEQSLPKT.js.map +0 -1
  45. package/dist/chunk-WMGEO5M6.js.map +0 -1
  46. package/dist/chunk-YDLRSEUN.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/kitIcons.tsx","../src/protocol/schema.ts","../src/protocol/channel.ts","../src/story/library.ts","../src/story/indexBundle.ts","../src/shell/labDensity.ts","../src/frame/index/indexEnv.ts","../src/frame/index/LabBadge.tsx","../src/frame/index/LibraryBadge.tsx","../src/frame/index/variants.ts","../src/frame/index/Description.tsx","../src/frame/index/IndexPage.tsx"],"names":["jsx","Badge","resolveConfigSchema","isEntryShown","isConfigBranch","createContext","useContext"],"mappings":"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","file":"chunk-WFT5IOHX.js","sourcesContent":["import type { ReactNode } from 'react';\nimport { createRoot, type Root } from 'react-dom/client';\nimport { IconRegistryProvider } from '@weasel-js/core';\nimport type { IconTable } from '@weasel-js/icons';\nimport { kitIcons } from '@weasel-js/ui/kit-icons';\n\n/** A React root whose every render draws its icons from the kit's tables, plus `extra` (an app's own): the\n * workshop's, and each story frame's. */\nexport function createKitRoot(container: Element, extra: readonly IconTable[] = []): Pick<Root, 'render' | 'unmount'> {\n const root = createRoot(container);\n const icons = extra.length > 0 ? [...kitIcons, ...extra] : kitIcons;\n return {\n render: (node: ReactNode) => root.render(<IconRegistryProvider icons={icons}>{node}</IconRegistryProvider>),\n unmount: () => root.unmount(),\n };\n}\n","import {\n f,\n isConfigBranch,\n isEntryShown,\n resolveConfigSchema,\n schemaNodeAtPath,\n type Annotations,\n type BranchAnnotations,\n type ConfigBranch,\n type ConfigEntry,\n type ConfigNode,\n type ConfigSchema,\n type ConfigShape,\n type NodeOptions,\n} from '@weasel-js/labkit/config';\n\n/** The section a described entry sits in, as structured-clone data. */\nexport interface SectionDescription {\n label: string;\n collapsed?: boolean;\n}\n\n/** One key of a described shape: a leaf, or a branch holding more. */\nexport type DescribedEntry =\n | {\n branch: true;\n annotations: BranchAnnotations;\n section?: SectionDescription;\n conditional: boolean;\n children: DescribedShape;\n }\n | {\n branch: false;\n kind: string | null;\n default: unknown;\n annotations: Annotations;\n section?: SectionDescription;\n conditional: boolean;\n validated: boolean;\n /** The node draws its own row with `.render`, which stays in the frame. */\n customControl: boolean;\n };\n\n/** A config shape as structured-clone data: each key's entry, described. */\nexport type DescribedShape = { [key: string]: DescribedEntry };\n\n/** A story's `f.schema` as structured-clone data. */\nexport interface SchemaDescription {\n nodes: DescribedShape;\n}\n\n/** Answers the workshop has for the rebuilt schema's predicates. */\nexport interface SchemaAnswers {\n hidden(path: string, config: unknown): boolean;\n errors(path: string, config: unknown): string[];\n}\n\nconst joinPath = (at: string, key: string): string => (at === '' ? key : `${at}.${key}`);\n\nfunction describeShape(shape: ConfigShape): DescribedShape {\n const out: DescribedShape = {};\n for (const [key, entry] of Object.entries(shape)) {\n const { section, showIf } = entry.options;\n const common = {\n annotations: { ...entry.annotations },\n ...(section === undefined ? {} : { section: { ...section } }),\n conditional: showIf !== undefined,\n };\n out[key] = isConfigBranch(entry)\n ? { branch: true, ...common, children: describeShape(entry.children) }\n : {\n branch: false,\n kind: entry.kind,\n default: entry.default,\n ...common,\n validated: entry.options.validate !== undefined,\n customControl: entry.options.render !== undefined,\n };\n }\n return out;\n}\n\nexport function describeSchema(schema: ConfigSchema<unknown>): SchemaDescription {\n return { nodes: describeShape(schema.nodes) };\n}\n\nfunction rebuildShape(shape: DescribedShape, at: string, answers: SchemaAnswers): ConfigShape {\n const out: Record<string, ConfigEntry> = {};\n for (const [key, entry] of Object.entries(shape)) {\n const path = joinPath(at, key);\n const options: NodeOptions = {\n ...(entry.section === undefined ? {} : { section: entry.section }),\n ...(entry.conditional ? { showIf: (config) => !answers.hidden(path, config) } : {}),\n };\n if (entry.branch) {\n const branch: ConfigBranch = {\n children: rebuildShape(entry.children, path, answers),\n annotations: entry.annotations,\n options,\n };\n out[key] = branch;\n } else {\n const node: ConfigNode = {\n kind: entry.kind,\n default: entry.default,\n annotations: entry.annotations,\n options: entry.validated ? { ...options, validate: (_leaf, config) => answers.errors(path, config) } : options,\n };\n out[key] = node;\n }\n }\n return out;\n}\n\nexport function schemaFromDescription(\n description: SchemaDescription,\n answers: SchemaAnswers,\n): ConfigSchema<unknown> {\n return f.schema(rebuildShape(description.nodes, '', answers)) as ConfigSchema<unknown>;\n}\n\n/** Evaluate a schema's own predicates for one config — the frame's half of `answers`. */\nexport function answerSchema(\n schema: ConfigSchema<unknown>,\n config: unknown,\n): { hidden: string[]; errors: Record<string, string[]> } {\n const hidden: string[] = [];\n const errors: Record<string, string[]> = {};\n const record = config as Record<string, unknown>;\n const { group } = resolveConfigSchema(schema);\n\n const walk = (shape: ConfigShape, at: string): void => {\n for (const [key, entry] of Object.entries(shape)) {\n const path = joinPath(at, key);\n if (!isEntryShown(entry, record, group)) hidden.push(path);\n if (isConfigBranch(entry)) {\n walk(entry.children, path);\n continue;\n }\n const { validate } = entry.options;\n if (!validate) continue;\n const leaf = schemaNodeAtPath(group, path);\n if (!leaf || 'children' in leaf) continue;\n const found = validate(leaf, record);\n if (found.length > 0) errors[path] = found;\n }\n };\n walk(schema.nodes, '');\n return { hidden, errors };\n}\n","import { createEmitter } from '@weasel-js/registry';\nimport { type Envelope, PROTOCOL_VERSION } from './messages';\n\nexport interface PortLike {\n postMessage(message: unknown): void;\n addEventListener(type: 'message', fn: (event: MessageEvent) => void): void;\n removeEventListener(type: 'message', fn: (event: MessageEvent) => void): void;\n start?(): void;\n close(): void;\n}\n\n/** One end of a two-way message link: sends `Out`, hears `In`. */\nexport interface Channel<In, Out> {\n send(msg: Out): void;\n on(fn: (msg: In) => void): () => void;\n close(): void;\n}\n\nexport type Mismatch = { reason: 'not-an-envelope' } | { reason: 'version'; version: unknown };\n\nexport interface ChannelOptions {\n onMismatch?: (mismatch: Mismatch) => void;\n}\n\nexport function openChannel<In, Out>(port: PortLike, options: ChannelOptions = {}): Channel<In, Out> {\n const messages = createEmitter<[msg: In]>();\n const onMessage = (event: MessageEvent) => {\n const data: unknown = event.data;\n if (typeof data !== 'object' || data === null || !('msg' in data)) {\n options.onMismatch?.({ reason: 'not-an-envelope' });\n return;\n }\n const envelope = data as Partial<Envelope<In>>;\n if (envelope.v !== PROTOCOL_VERSION) {\n options.onMismatch?.({ reason: 'version', version: envelope.v });\n return;\n }\n messages.emit(envelope.msg as In);\n };\n port.addEventListener('message', onMessage);\n port.start?.();\n return {\n send: (msg) => port.postMessage({ v: PROTOCOL_VERSION, msg } satisfies Envelope<Out>),\n on: messages.subscribe,\n close: () => {\n port.removeEventListener('message', onMessage);\n port.close();\n },\n };\n}\n","import type { AppearanceProps } from '@weasel-js/ui/appearance';\nimport { createContext } from 'react';\n\n/** One library of a project: the story files under `path` carry `label`. */\nexport interface Library {\n /** A stretch of path every story file of the library has, with forward slashes: `/packages/ui/`. */\n path: string;\n label: string;\n /** The tint of the library's badge, as a `<Badge>` takes one. Default: the badge's own low emphasis. */\n tint?: AppearanceProps['tint'];\n}\n\n/** A project's libraries, as the tree's package filter, the index page header, and Get Info ask about them. */\nexport interface Libraries {\n /** The label of the first library whose `path` the story's file holds, else its title's first segment. */\n of(entry: { file: string; title: string }): string;\n tintOf(label: string): AppearanceProps['tint'];\n}\n\nexport function librariesFrom(table: readonly Library[] = []): Libraries {\n return {\n of(entry) {\n const file = entry.file.replaceAll('\\\\', '/');\n return table.find((library) => file.includes(library.path))?.label ?? entry.title.split('/')[0] ?? entry.title;\n },\n tintOf: (label) => table.find((library) => library.label === label)?.tint,\n };\n}\n\n/** No table: every story's library is its title's first segment. */\nexport const TITLE_LIBRARIES = librariesFrom();\n\n/** The workshop's libraries, from `ShellConfig.libraries`. */\nexport const LibrariesContext = createContext<Libraries>(TITLE_LIBRARIES);\n","import { byComponent, indexId, isIndexId } from './indexPages';\nimport { type Libraries, TITLE_LIBRARIES } from './library';\nimport { indexRenderOf, loadStories } from './load';\nimport { taggedIds } from './tags';\nimport type { IndexRender, LoadedStory } from './types';\n\n/** A component's index page as it loads: its stories in index order, and the page's own render. */\nexport interface IndexBundle {\n title: string;\n /** The package the component ships in. */\n library: string;\n description?: string;\n /** The tags every story of the component carries. */\n tags?: readonly string[];\n /** The ids of the stories tagged `gallery`. */\n galleries: readonly string[];\n /** The ids of the stories tagged `lab`. */\n labs: readonly string[];\n stories: readonly LoadedStory[];\n descriptions: Readonly<Record<string, string>>;\n render: IndexRender | null;\n}\n\n/** What a document has loaded for an entry: one story, or a component's index page. */\nexport type Loaded = { kind: 'story'; story: LoadedStory } | { kind: 'index'; bundle: IndexBundle };\n\n/** One story as an index page's loader finds it. */\nexport interface BundleEntry {\n id: string;\n title: string;\n file: string;\n exportName: string;\n description?: string;\n componentDescription?: string;\n tags?: readonly string[];\n}\n\n/** Where `loadIndexBundle` reads a component's stories from. */\nexport interface IndexBundleSource {\n index: readonly BundleEntry[];\n /** The module of a story file; called once per file the component's stories live in. */\n importOf: (file: string) => Promise<Record<string, unknown>>;\n load?: ((mod: Record<string, unknown>, title: string, parameters?: Record<string, unknown>) => LoadedStory[]) | undefined;\n parameters?: Record<string, unknown> | undefined;\n prepare?: ((story: LoadedStory) => void | Promise<void>) | undefined;\n libraries?: Libraries | undefined;\n}\n\nconst commonTags = (entries: readonly BundleEntry[]): string[] | undefined => {\n const [first, ...rest] = entries;\n const common = (first?.tags ?? []).filter((tag) => rest.every((e) => e.tags?.includes(tag)));\n return common.length > 0 ? common : undefined;\n};\n\n/**\n * The index page `id` names, loaded from every file its component's stories live in. Its description and library are\n * its primary file's. Rejects when no story of `index` belongs to the component.\n */\nexport async function loadIndexBundle(id: string, source: IndexBundleSource): Promise<IndexBundle> {\n const { importOf, load = loadStories, parameters, prepare, libraries = TITLE_LIBRARIES } = source;\n const entries = source.index.filter((e) => !isIndexId(e.id) && indexId(e.title) === id);\n const primary = byComponent(entries)[0];\n if (!primary) throw new Error(`No component with index \"${id}\"`);\n const { title } = primary;\n const files = [...new Set(entries.map((e) => e.file))];\n const mods = await Promise.all(files.map(importOf));\n const byFile = new Map(files.map((file, i) => [file, load(mods[i] ?? {}, title, parameters)]));\n const stories = entries.flatMap((e) => byFile.get(e.file)?.find((s) => s.exportName === e.exportName) ?? []);\n for (const story of stories) await prepare?.(story);\n const tags = commonTags(entries);\n return {\n title,\n library: libraries.of(primary),\n ...(primary.componentDescription === undefined ? {} : { description: primary.componentDescription }),\n ...(tags === undefined ? {} : { tags }),\n ...taggedIds(entries),\n stories,\n descriptions: Object.fromEntries(entries.flatMap((e) => (e.description ? [[e.id, e.description]] : []))),\n render: mods.map(indexRenderOf).find((render) => render !== null) ?? null,\n };\n}\n","/** The density the workshop's lab is drawn at, and so the density a capture of a story in it takes. */\nexport const LAB_DENSITY = 'roomy';\n","import type { Globals } from '../../protocol/messages';\nimport type { IndexBundle } from '../../story/indexBundle';\nimport { isGallery } from '../../story/tags';\nimport type { Decorator, DepGraph } from '../../story/types';\nimport type { IndexEnv } from './IndexPage';\n\n/** What an index page's document adds to its bundle. */\nexport interface IndexEnvInputs {\n /** The component graph, or null where it has not arrived or the document has none. */\n graph: DepGraph | null;\n globals: Globals;\n /** The frame config's, outermost. */\n decorators: readonly Decorator[];\n open: (id: string) => void;\n}\n\n/** What every cell of `bundle`'s page shares, in whichever document renders it. */\nexport function indexEnvOf(bundle: IndexBundle, { graph, globals, decorators, open }: IndexEnvInputs): IndexEnv {\n const gallery = isGallery(bundle);\n const dependencies = gallery ? undefined : graph?.[bundle.title];\n return {\n title: bundle.title,\n library: bundle.library,\n ...(bundle.description === undefined ? {} : { description: bundle.description }),\n stories: bundle.stories,\n descriptions: bundle.descriptions,\n gallery,\n galleries: bundle.galleries,\n labs: bundle.labs,\n ...(dependencies ? { dependencies } : {}),\n globals,\n decorators,\n open,\n // A story that throws shows its error in its own cell; the rest of the page is still worth reading.\n onError: (error) => console.error(error),\n };\n}\n","// The component's own entry, not the barrel: the barrel would bring every weasel-ui component into each frame.\nimport { Badge } from '@weasel-js/ui/components/Badge';\n\n/** Marks a story tagged `lab`: opening it opens a whole screen, not a specimen. */\nexport function LabBadge({ className }: { className?: string }) {\n return (\n <Badge grade=\"info\" variant=\"subtle\" size=\"sm\" {...(className ? { className } : {})}>\n Lab\n </Badge>\n );\n}\n","// The component's own entry, not the barrel: the barrel would bring every weasel-ui component into each frame.\nimport { Badge } from '@weasel-js/ui/components/Badge';\nimport { useContext } from 'react';\nimport { LibrariesContext } from '../../story/library';\n\n/** A component's library, as a badge in the tint the project gave that library. */\nexport function LibraryBadge({ library, className }: { library: string; className?: string }) {\n const tint = useContext(LibrariesContext).tintOf(library);\n return (\n <Badge emphasis=\"low\" {...(tint === undefined ? {} : { tint })} variant=\"subtle\" size=\"sm\" {...(className ? { className } : {})}>\n {library}\n </Badge>\n );\n}\n","import { type ConfigSchema, type ConfigShape, isConfigBranch, isEntryShown, resolveConfigSchema, titleCase } from '@weasel-js/labkit/config';\nimport { isPlainObject } from '@weasel-js/core';\n\nexport interface VariantValue {\n value: unknown;\n label: string;\n}\n\n/** One control a story is shown varying along, with every other control at its default. */\nexport interface VariantRow {\n /** Dotted, as `setConfig` takes it. */\n path: string;\n label: string;\n values: VariantValue[];\n}\n\n/** Above this many choices a row stops being something to scan. */\nexport const MAX_ENUM_OPTIONS = 8;\nexport const MAX_ROWS = 6;\n\nconst labelOf = (key: string, name: string | undefined): string => name ?? titleCase(key);\n\n/**\n * The boolean and enum controls of `schema` a story can be shown varying along, in schema order: skipped are\n * controls that draw their own row, controls hidden at the defaults, and enums with more than\n * `MAX_ENUM_OPTIONS` choices. At most `MAX_ROWS`.\n */\nexport function variantRows(schema: ConfigSchema<unknown>): VariantRow[] {\n const defaults = schema.defaults() as Record<string, unknown>;\n const { group } = resolveConfigSchema(schema);\n const rows: VariantRow[] = [];\n const walk = (shape: ConfigShape, at: string): void => {\n for (const [key, entry] of Object.entries(shape)) {\n if (rows.length >= MAX_ROWS) return;\n const path = at === '' ? key : `${at}.${key}`;\n if (!isEntryShown(entry, defaults, group)) continue;\n if (isConfigBranch(entry)) {\n walk(entry.children, path);\n continue;\n }\n if (entry.annotations.hidden || entry.options.render) continue;\n const label = labelOf(key, entry.annotations.name);\n if (entry.kind === 'boolean') {\n rows.push({ path, label, values: [false, true].map((value) => ({ value, label: String(value) })) });\n } else if (entry.kind === 'enum') {\n const options = entry.annotations.options ?? [];\n if (options.length < 2 || options.length > MAX_ENUM_OPTIONS) continue;\n rows.push({ path, label, values: options.map((o) => ({ value: o.value, label: o.label })) });\n }\n }\n };\n walk(schema.nodes, '');\n return rows;\n}\n\n/** `over` merged into `base`: nested plain objects merge, anything else replaces. */\nexport function mergeConfig(base: unknown, over: unknown): unknown {\n if (!isPlainObject(base) || !isPlainObject(over)) return over === undefined ? base : over;\n const out: Record<string, unknown> = { ...base };\n for (const [key, value] of Object.entries(over)) out[key] = mergeConfig(base[key], value);\n return out;\n}\n\n/** `config` with `value` at dotted `path`, copying each object along the way. */\nexport function withValueAt(config: unknown, path: string, value: unknown): unknown {\n const [head, ...rest] = path.split('.');\n if (head === undefined) return value;\n const record = isPlainObject(config) ? config : {};\n return { ...record, [head]: rest.length === 0 ? value : withValueAt(record[head], rest.join('.'), value) };\n}\n","// The component's own entry, not the barrel: the barrel would bring every weasel-ui component into each frame.\nimport { InlineMarkdown } from '@weasel-js/ui/components/InlineMarkdown';\n\n/** Splits JSDoc prose into paragraphs at blank lines, rejoining the lines a comment wrapped. */\nexport function paragraphsOf(text: string): string[] {\n return text\n .split(/\\n\\s*\\n/)\n .map((paragraph) => paragraph.split('\\n').map((line) => line.trim()).filter(Boolean).join(' '))\n .filter(Boolean);\n}\n\n/** A story's or component's JSDoc description, a paragraph per `className`-ed `<p>`, its inline markdown drawn. */\nexport function Description({ text, className }: { text: string; className: string }) {\n return (\n <>\n {paragraphsOf(text).map((paragraph, i) => (\n <p key={i} className={className}>\n <InlineMarkdown text={paragraph} />\n </p>\n ))}\n </>\n );\n}\n","// The components' own entries, not the barrel: the barrel would bring every weasel-ui component into each frame.\nimport { Badge } from '@weasel-js/ui/components/Badge';\nimport {\n createContext,\n type MouseEvent,\n type ReactNode,\n useContext,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport type { Globals } from '../../protocol/messages';\nimport { indexId } from '../../story/indexPages';\nimport type { ComponentDeps, Decorator, IndexContext, IndexStoryProps, LoadedStory, StoryContext } from '../../story/types';\nimport { StoryHost } from '../StoryHost';\nimport { useNearViewport } from '../useNearViewport';\nimport { mergeConfig, variantRows, withValueAt } from './variants';\nimport './index.css';\nimport { Description } from './Description';\nimport { LabBadge } from './LabBadge';\nimport { LibraryBadge } from './LibraryBadge';\nimport num from '@weasel-js/theme/numeric.module.css';\n\n/** What every cell on an index page shares with the frame that hosts it. */\nexport interface IndexEnv {\n title: string;\n /** The package the component ships in. */\n library?: string;\n description?: string;\n stories: readonly LoadedStory[];\n /** Per story id, the JSDoc above its export. */\n descriptions: Readonly<Record<string, string>>;\n /** A catalog or showcase rather than one component: every story of it is tagged `gallery`. */\n gallery?: boolean;\n /** The ids of the stories tagged `gallery`. */\n galleries?: readonly string[];\n /** The ids of the stories tagged `lab`: whole screens, which the page links to but does not embed. */\n labs?: readonly string[];\n /** The component's place in the component graph; absent until the graph arrives, and for a gallery. */\n dependencies?: ComponentDeps;\n globals: Globals;\n /** The frame config's, outermost. */\n decorators: readonly Decorator[];\n open: (id: string) => void;\n onError: (error: unknown) => void;\n}\n\nexport const IndexEnvContext = createContext<IndexEnv | null>(null);\n\nfunction useEnv(): IndexEnv {\n const env = useContext(IndexEnvContext);\n if (!env) throw new Error('An index page part rendered outside its index page');\n return env;\n}\n\n/** How far past the viewport a cell stays mounted. */\nconst NEAR_MARGIN = '100%';\n\n/**\n * One story at its defaults with `config` over them. It keeps its own config and state, so it stays interactive, and\n * it mounts only while near the viewport, so a page of canvas stories stays under the browser's WebGL context cap.\n */\nexport function IndexStory({ story, config: over, label }: IndexStoryProps) {\n const env = useEnv();\n const [config, setConfig] = useState(() => mergeConfig(story.config.defaults(), over));\n const [state, setState] = useState<unknown>(() => story.initialState?.(config) ?? null);\n const cell = useRef<HTMLElement>(null);\n // Starts unmounted, so a page of canvas stories never mounts every cell at once.\n const near = useNearViewport(cell, NEAR_MARGIN, false);\n // Held while unmounted, so scrolling past a cell does not move everything after it.\n const [height, setHeight] = useState<number | null>(null);\n useEffect(() => {\n const el = cell.current;\n if (!near || !el || typeof ResizeObserver === 'undefined') return;\n const observer = new ResizeObserver(() => setHeight(el.getBoundingClientRect().height));\n observer.observe(el);\n return () => observer.disconnect();\n }, [near]);\n const ctx: StoryContext = {\n config,\n setConfig: (path, value) => setConfig((prev: unknown) => withValueAt(prev, path, value)),\n state,\n setState: (next) =>\n setState((prev: unknown) => (typeof next === 'function' ? (next as (p: unknown) => unknown)(prev) : next)),\n globals: env.globals,\n title: story.title,\n name: story.name,\n };\n return (\n <figure\n ref={cell}\n className={`fg-index-cell fg-index-cell--${story.layout}`}\n style={!near && height !== null ? { minHeight: height } : undefined}\n >\n <div className=\"fg-index-cell__stage\">\n {near ? (\n <StoryHost story={story} ctx={ctx} decorators={env.decorators} resetKey={0} onError={env.onError} />\n ) : null}\n </div>\n {label === undefined ? null : <figcaption className=\"fg-index-cell__label\">{label}</figcaption>}\n </figure>\n );\n}\n\n/** `story` once per value of each boolean and enum control, every other control at its default. Each row is headed one\n * level below the story's `h2`, and named for the story as well, since every story's rows share labels. */\nexport function IndexVariants({ story }: { story: LoadedStory }) {\n const rows = useMemo(() => variantRows(story.config), [story]);\n const defaults = useMemo(() => story.config.defaults(), [story]);\n if (rows.length === 0) return null;\n return (\n <div className=\"fg-index-variants\">\n {rows.map((row) => (\n <section key={row.path} className=\"fg-index-variants__row\" aria-label={`${story.name}: ${row.label}`}>\n <h3 className=\"fg-index-variants__label\">{row.label}</h3>\n <div className=\"fg-index-variants__cells\">\n {row.values.map((v) => (\n <IndexStory\n key={String(v.value)}\n story={story}\n config={withValueAt(defaults, row.path, v.value) as Record<string, unknown>}\n label={v.label}\n />\n ))}\n </div>\n </section>\n ))}\n </div>\n );\n}\n\nfunction GalleryBadge() {\n return (\n <Badge emphasis=\"high\" variant=\"subtle\" size=\"sm\">\n Gallery\n </Badge>\n );\n}\n\n/** A link to `id` in the workshop. A plain click opens it in place; a modified one is left to the browser. */\nfunction OpenLink({ id, className, children }: { id: string; className: string; children: ReactNode }) {\n const env = useEnv();\n const follow = (event: MouseEvent) => {\n if (event.button !== 0 || event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) return;\n event.preventDefault();\n env.open(id);\n };\n return (\n <a className={className} href={`#/${encodeURIComponent(id)}`} onClick={follow}>\n {children}\n </a>\n );\n}\n\nfunction DependencyList({ label, titles, empty }: { label: string; titles: readonly string[]; empty: string }) {\n const labelId = useId();\n return (\n <div className=\"fg-index-deps__row\">\n <dt id={labelId} className=\"fg-index-deps__label\">\n {label}\n </dt>\n <dd className=\"fg-index-deps__value\">\n {titles.length === 0 ? (\n <span className=\"fg-index-deps__empty\">{empty}</span>\n ) : (\n <ul className=\"fg-index-deps__list\" aria-labelledby={labelId}>\n {titles.map((title) => {\n const cut = title.lastIndexOf('/') + 1;\n return (\n <li key={title}>\n <OpenLink className=\"fg-index-deps__link\" id={indexId(title)}>\n <span className=\"fg-index-deps__prefix\">{title.slice(0, cut)}</span>\n {title.slice(cut)}\n </OpenLink>\n </li>\n );\n })}\n </ul>\n )}\n </dd>\n </div>\n );\n}\n\n/** The listed components this one uses and those that use it, read from source. Nothing for a gallery. */\nexport function IndexDependencies() {\n const { gallery, dependencies } = useEnv();\n if (gallery || !dependencies) return null;\n if (dependencies.source === null) {\n return (\n <p className=\"fg-index-deps__none\">\n forge found no source file for this component, so it lists none of its dependencies. It looks for the\n import the meta&rsquo;s <code>component</code> names, or else the one the title&rsquo;s last segment names.\n </p>\n );\n }\n return (\n <dl className=\"fg-index-deps\" aria-label=\"Dependencies\">\n <DependencyList label=\"Uses\" titles={dependencies.uses} empty=\"No listed component.\" />\n <DependencyList label=\"Used by\" titles={dependencies.usedBy} empty=\"No listed component uses it.\" />\n </dl>\n );\n}\n\nconst DAY = new Intl.DateTimeFormat(undefined, { dateStyle: 'medium' });\n\nfunction HistoryDate({ label, iso, version }: { label: string; iso: string; version: string | null }) {\n return (\n <div className=\"fg-index-history__item\">\n <dt className=\"fg-index-history__label\">{label}</dt>\n <dd className={`fg-index-history__value ${num.numeric}`}>\n <time dateTime={iso}>{DAY.format(new Date(iso))}</time> ({version ?? 'unreleased'})\n </dd>\n </div>\n );\n}\n\n/** When the component's source file was created and last changed, each with the release that shipped it, read from\n * git. Nothing for a gallery, or for a source file git has never committed. */\nexport function IndexHistory() {\n const { gallery, dependencies } = useEnv();\n const history = gallery ? undefined : dependencies?.history;\n if (!history) return null;\n return (\n <dl className=\"fg-index-history\" aria-label=\"History\">\n <HistoryDate label=\"Created\" iso={history.created} version={history.introduced} />\n <HistoryDate label=\"Modified\" iso={history.modified} version={history.modifiedIn} />\n </dl>\n );\n}\n\nfunction StorySection({ story, variants }: { story: LoadedStory; variants: boolean }) {\n const env = useEnv();\n const headingId = useId();\n const description = env.descriptions[story.id];\n const gallery = !env.gallery && env.galleries?.includes(story.id);\n const lab = env.labs?.includes(story.id) ?? false;\n return (\n <section className=\"fg-index-story\" aria-labelledby={headingId}>\n <div className=\"fg-index-story__main\">\n <div className=\"fg-index-story__text\">\n <header className=\"fg-index-story__head\">\n <h2 id={headingId} className=\"fg-index-story__name\">\n <OpenLink className=\"fg-index-story__link\" id={story.id}>\n {story.name}\n </OpenLink>\n </h2>\n {gallery ? <GalleryBadge /> : null}\n {lab ? <LabBadge /> : null}\n </header>\n {description ? <Description text={description} className=\"fg-index-story__description\" /> : null}\n </div>\n {lab ? null : <IndexStory story={story} />}\n </div>\n {variants ? <IndexVariants story={story} /> : null}\n </section>\n );\n}\n\n/** Which of `stories` show their variants: the first of each set of controls, leaving out labs. Stories of one CSF\n * file share their meta's controls, and the same rows under every story would only repeat. */\nfunction firstOfEachControlSet(stories: readonly LoadedStory[], labs: readonly string[]): Set<string> {\n const seen = new Set<string>();\n const shown = new Set<string>();\n for (const story of stories) {\n if (labs.includes(story.id)) continue;\n const key = JSON.stringify(variantRows(story.config));\n if (seen.has(key)) continue;\n seen.add(key);\n shown.add(story.id);\n }\n return shown;\n}\n\n/** The generated page: the component's title and description, then each story, with the variants of the first of\n * each set of controls. */\nexport function DefaultIndex() {\n const env = useEnv();\n const withVariants = useMemo(() => firstOfEachControlSet(env.stories, env.labs ?? []), [env.stories, env.labs]);\n const segments = env.title.split('/');\n const name = segments.pop();\n const { library } = env;\n if (library !== undefined && segments[0] === library) segments.shift();\n return (\n <article className=\"fg-index\">\n <header className=\"fg-index__head\">\n {segments.length > 0 || library !== undefined ? (\n <p className=\"fg-index__path\">\n {library !== undefined ? <LibraryBadge library={library} className=\"fg-index__library\" /> : null}\n {segments.join(' / ')}\n </p>\n ) : null}\n <div className=\"fg-index__title-row\">\n <h1 className=\"fg-index__title\">{name}</h1>\n {env.gallery ? <GalleryBadge /> : null}\n </div>\n {env.description ? <Description text={env.description} className=\"fg-index__description\" /> : null}\n <IndexHistory />\n <IndexDependencies />\n </header>\n {env.stories.map((story) => (\n <StorySection key={story.id} story={story} variants={withVariants.has(story.id)} />\n ))}\n </article>\n );\n}\n\n/** What a component's own index page is handed. */\nexport function indexContext(env: IndexEnv): IndexContext {\n return {\n title: env.title,\n ...(env.description === undefined ? {} : { description: env.description }),\n stories: env.stories,\n globals: env.globals,\n Story: IndexStory,\n Variants: IndexVariants,\n DefaultIndex,\n Dependencies: IndexDependencies,\n History: IndexHistory,\n gallery: env.gallery ?? false,\n open: env.open,\n };\n}\n\n/** The page itself: the component's own, or the generated one. */\nexport function IndexPage({ env, render }: { env: IndexEnv; render: ((ctx: IndexContext) => ReactNode) | null }) {\n return (\n <IndexEnvContext.Provider value={env}>{render ? render(indexContext(env)) : <DefaultIndex />}</IndexEnvContext.Provider>\n );\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  import { GLOBALS_KEY, effectiveGlobals, storyConfig, isForgePath, PLAYHEAD_KEY, FOLLOW_APP } from './chunk-3BAM6M26.js';
2
- import { StoryHost, useNearViewport, IN_VIEW_MARGIN, useHostConditions, createA11yHighlighter, useStoryClock, useClockLoop, scanCssVars, auditElement } from './chunk-WMGEO5M6.js';
2
+ import { StoryHost, useNearViewport, IN_VIEW_MARGIN, useHostConditions, createA11yHighlighter, useStoryClock, useClockLoop, scanCssVars, auditElement } from './chunk-GHPMNT2A.js';
3
3
  import { ClockContext } from './chunk-L5XM5VKB.js';
4
4
  import { createEmitter } from '@weasel-js/registry';
5
5
  import { createContext, memo, useContext, useCallback, useSyncExternalStore, useMemo, useId, useState, useRef, useLayoutEffect, useEffect } from 'react';
@@ -422,7 +422,8 @@ function FrameLensCopy({ request, trialId, trialConfig, children }) {
422
422
  const globals = useCopyGlobals(request, trialConfig);
423
423
  const id = copyId(trialId, request);
424
424
  const { args } = request;
425
- const copy = useMemo(() => ({ id, globals, args }), [id, globals, args]);
425
+ const main = request.hit.host;
426
+ const copy = useMemo(() => ({ id, main, globals, args }), [id, main, globals, args]);
426
427
  return /* @__PURE__ */ jsx(LensPortal, { request, children: children(copy) });
427
428
  }
428
429
  function FrameCopies({ lenses, trialId, ...props }) {
@@ -497,5 +498,5 @@ function StoryTrial({ story, setup, ctx, hostRef, onRendered, onError }) {
497
498
  }
498
499
 
499
500
  export { LiveCopies, LiveFrameCopies, LiveLensesContext, StoryGlobalsContext, StoryTrial, TrialClocksContext, TrialFramesContext, TrialHost, createLiveLenses, createTrialClocks, createTrialFrames, describeLens, resolveComparison, resolveContextOf, scrollerOf, trialAt, useCopyConfig, useCssOverrides, useTrialClock, useTrialFrame, withArgs };
500
- //# sourceMappingURL=chunk-YDLRSEUN.js.map
501
- //# sourceMappingURL=chunk-YDLRSEUN.js.map
501
+ //# sourceMappingURL=chunk-XIBKYSRU.js.map
502
+ //# sourceMappingURL=chunk-XIBKYSRU.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/shell/trialFrames.ts","../src/shell/StoryGlobalsContext.ts","../src/shell/cssVars/overrides.ts","../src/shell/StoryScroller.tsx","../src/shell/TrialHost.tsx","../src/timeline/trialClocks.ts","../src/timeline/usePersistedPlayhead.ts","../src/shell/StoryBody.tsx","../src/shell/loupe/conditions.ts","../src/shell/loupe/liveLenses.ts","../src/shell/loupe/trialAt.ts","../src/shell/loupe/LiveCopies.tsx","../src/shell/StoryTrial.tsx"],"names":["createContext","jsx","useContext","useState","useLayoutEffect","createEmitter","NONE","useSyncExternalStore","useRef","useLatest","useEffect","StoryBody","useMemo","useCallback","TrialIdContext","jsxs","Fragment"],"mappings":"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","file":"chunk-XIBKYSRU.js","sourcesContent":["import { createEmitter } from '@weasel-js/registry';\nimport { createContext, useCallback, useContext, useSyncExternalStore } from 'react';\nimport type { A11yOutcome, CssVarReport, ToFrame } from '../protocol/messages';\n\nexport type { A11yOutcome };\n\n/** The half of a trial's frame that answers a request: each call is one round trip over the frame's channel. */\nexport interface TrialFrameCalls {\n send: (msg: ToFrame) => void;\n audit: () => Promise<A11yOutcome>;\n}\n\n/** What trial chrome can reach of the frame its trial shows. */\nexport interface TrialFrame {\n /** Null while no frame is connected. */\n send: ((msg: ToFrame) => void) | null;\n /** The frame's latest `vars` report. */\n vars: readonly CssVarReport[];\n /** Runs axe over the story and records the answer as `a11y`. Null while no frame is connected. */\n audit: (() => Promise<A11yOutcome>) | null;\n /** What the last audit found; null until one has run against the connected frame. */\n a11y: A11yOutcome | null;\n}\n\n/** Each trial's frame, keyed by trial id: `FrameView` connects and reports, trial chrome reads. */\nexport interface TrialFrames {\n /** Returns a disconnect that does nothing once a newer connection replaced this one. */\n connect(trialId: string, calls: TrialFrameCalls): () => void;\n report(trialId: string, vars: readonly CssVarReport[]): void;\n reportA11y(trialId: string, outcome: A11yOutcome): void;\n get(trialId: string): TrialFrame;\n subscribe(listener: () => void): () => void;\n}\n\nconst NO_FRAME: TrialFrame = { send: null, vars: [], audit: null, a11y: null };\n\nexport function createTrialFrames(): TrialFrames {\n const frames = new Map<string, TrialFrame>();\n const changes = createEmitter();\n const changed = changes.emit;\n const patch = (trialId: string, next: Partial<TrialFrame>) => {\n const frame = frames.get(trialId);\n if (!frame) return;\n frames.set(trialId, { ...frame, ...next });\n changed();\n };\n return {\n connect(trialId, calls) {\n frames.set(trialId, { send: calls.send, vars: [], audit: calls.audit, a11y: null });\n changed();\n return () => {\n if (frames.get(trialId)?.send !== calls.send) return;\n frames.delete(trialId);\n changed();\n };\n },\n report: (trialId, vars) => patch(trialId, { vars }),\n reportA11y: (trialId, a11y) => patch(trialId, { a11y }),\n get: (trialId) => frames.get(trialId) ?? NO_FRAME,\n subscribe: changes.subscribe,\n };\n}\n\n/** The workshop's `TrialFrames`; `null` outside a `Workshop`. */\nexport const TrialFramesContext = createContext<TrialFrames | null>(null);\n\n/** The frame of the trial `trialId` names, re-read when it connects or reports. */\nexport function useTrialFrame(trialId: string): TrialFrame {\n const frames = useContext(TrialFramesContext);\n const subscribe = useCallback((listener: () => void) => frames?.subscribe(listener) ?? (() => {}), [frames]);\n const read = () => frames?.get(trialId) ?? NO_FRAME;\n return useSyncExternalStore(subscribe, read, read);\n}\n","import { createContext } from 'react';\nimport type { Globals } from '../protocol/messages';\n\n/** The lab's global values, which a trial's pins override. A change reaches open frames without replacing instruments. */\nexport const StoryGlobalsContext = createContext<Globals>({});\n","import { usePersistedState } from '@weasel-js/labkit';\n\nexport type CssOverrides = Readonly<Record<string, string>>;\n\nconst NONE: CssOverrides = {};\n\n/** The CSS variable overrides of the trial this is rendered inside, persisted with it. */\nexport function useCssOverrides() {\n return usePersistedState<CssOverrides>('fg-css-overrides', NONE, { scope: 'trial' });\n}\n","import { useTrialTitle } from '@weasel-js/labkit';\nimport { type ReactNode, useLayoutEffect, useState } from 'react';\n\nconst overflows = (el: HTMLElement) => el.scrollHeight > el.clientHeight || el.scrollWidth > el.clientWidth;\n\n/** Whether `el` currently has more content than it shows, rechecked as it or any child resizes. */\nfunction useOverflowing(el: HTMLElement | null): boolean {\n const [overflowing, setOverflowing] = useState(false);\n useLayoutEffect(() => {\n if (!el || typeof ResizeObserver === 'undefined') return;\n const check = () => setOverflowing(overflows(el));\n const sizes = new ResizeObserver(check);\n const watch = () => {\n sizes.disconnect();\n sizes.observe(el);\n for (const child of el.children) sizes.observe(child, { box: 'border-box' });\n };\n const children = new MutationObserver(() => {\n watch();\n check();\n });\n children.observe(el, { childList: true });\n watch();\n check();\n return () => {\n children.disconnect();\n sizes.disconnect();\n };\n }, [el]);\n return overflowing;\n}\n\n/**\n * The story's own box. While its story overflows it is a tab stop, so a keyboard can scroll it, and a region named\n * for the trial, as WCAG asks of a focusable scroller.\n */\nexport function StoryScroller({ children }: { children: ReactNode }) {\n const [el, setEl] = useState<HTMLDivElement | null>(null);\n const overflowing = useOverflowing(el);\n const title = useTrialTitle();\n return (\n <div\n ref={setEl}\n className=\"fg-story__scroll\"\n {...(overflowing ? { tabIndex: 0, role: 'region', 'aria-label': title ?? 'Story' } : {})}\n >\n {children}\n </div>\n );\n}\n","import { useLatest } from '@weasel-js/core';\nimport { LabBoundary, TrialIdContext } from '@weasel-js/labkit';\nimport { OverlayPortalProvider } from '@weasel-js/ui/portal-host';\nimport {\n type ReactNode,\n type RefObject,\n useContext,\n useEffect,\n useId,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { auditElement } from '../frame/a11y';\nimport { createA11yHighlighter } from '../frame/a11yHighlight';\nimport { scanCssVars } from '../frame/cssVars';\nimport type { FrameSetup } from '../frame/FrameController';\nimport { IN_VIEW_MARGIN, useNearViewport } from '../frame/useNearViewport';\nimport type { CssVarReport, Globals, Layout, ToFrame } from '../protocol/messages';\nimport { useCssOverrides } from './cssVars/overrides';\nimport { effectiveGlobals, GLOBALS_KEY } from './globals';\nimport { useHostConditions } from './hostConditions';\nimport { StoryGlobalsContext } from './StoryGlobalsContext';\nimport { StoryScroller } from './StoryScroller';\nimport { TrialFramesContext } from './trialFrames';\n\n/** Props for `TrialHost`. */\nexport interface TrialHostProps {\n layout: Layout;\n setup: FrameSetup;\n /** The trial's config, read for its `$globals` pins. */\n config: unknown;\n /** Rendered once the host element exists, with the globals in force on it. */\n children: (globals: Globals) => ReactNode;\n /** Receives the host element, for a caller with no trial to reach it through. */\n hostRef?: RefObject<HTMLElement | null>;\n /** Called once the children's first commit has painted. */\n onRendered?: () => void;\n /**\n * Makes this host a second copy of the trial's story: it takes `id` as its host id and `globals` in place of the\n * computed ones, carries `data-fg-copy`, and stays out of the frame registry, the a11y highlighter and `onRendered`.\n */\n copy?: { id: string; globals: Globals };\n}\n\nconst VARS_SETTLE_MS = 100;\n\n/**\n * The workshop is itself a lab; below the boundary a story sees no lab, trial or theme above it, as in a document of\n * its own. Overlays portal to the host, outside the scroller, so they stay put as it scrolls, and a modal takes the\n * host for its viewport.\n */\nfunction StoryContent({ host, children }: { host: HTMLElement; children: ReactNode }) {\n return (\n <LabBoundary>\n <OverlayPortalProvider container={host} contained>{children}</OverlayPortalProvider>\n </LabBoundary>\n );\n}\n\n/**\n * One story's box in the workshop document: what a frame document was, as an element. It applies the globals to\n * itself, keeps its CSS variable overrides on itself, contains fixed-position descendants and portals, reports its\n * vars and audits to the trial's frame registry, and unmounts its content while out of view.\n */\nexport function TrialHost({ layout, setup, config, children, hostRef, onRendered, copy }: TrialHostProps) {\n const trialId = useContext(TrialIdContext);\n const frames = useContext(TrialFramesContext);\n const labGlobals = useContext(StoryGlobalsContext);\n const pins = (config as Record<string, unknown> | null | undefined)?.[GLOBALS_KEY];\n const computed = useMemo(() => effectiveGlobals(labGlobals, pins), [labGlobals, pins]);\n const globals = copy?.globals ?? computed;\n const [persisted] = useCssOverrides();\n const reactId = useId();\n const hostId = copy?.id ?? trialId ?? reactId;\n const [host, setHost] = useState<HTMLDivElement | null>(null);\n const elementRef = useRef<HTMLDivElement | null>(null);\n const inView = useNearViewport(elementRef, IN_VIEW_MARGIN);\n const [pending, setPending] = useState(true);\n const latest = useLatest({ onRendered: copy ? undefined : onRendered });\n\n const overridesRef = useHostConditions(host, { hostId, globals, overrides: persisted, setup });\n\n // The registry connection: the host's vars and audits, reported to the trial. A copy has none.\n useLayoutEffect(() => {\n const overrides = overridesRef.current;\n if (!host || !overrides || copy) return;\n const doc = host.ownerDocument;\n let lastVars: CssVarReport[] | null = null;\n let reported: string | null = null;\n const publish = (vars: CssVarReport[]) => {\n lastVars = vars;\n const key = JSON.stringify(vars);\n if (key === reported) return;\n reported = key;\n if (trialId) frames?.report(trialId, vars);\n };\n const scan = () => publish(scanCssVars(doc, overrides.has, host));\n let settleTimer: ReturnType<typeof setTimeout> | undefined;\n const ownMutation = (record: MutationRecord) =>\n overrides.owns(record.target) ||\n (record.type === 'childList' &&\n [...record.addedNodes, ...record.removedNodes].length > 0 &&\n [...record.addedNodes, ...record.removedNodes].every(overrides.owns));\n const mutations =\n typeof MutationObserver === 'undefined'\n ? null\n : new MutationObserver((records) => {\n if (records.every(ownMutation)) return;\n clearTimeout(settleTimer);\n settleTimer = setTimeout(scan, VARS_SETTLE_MS);\n });\n mutations?.observe(host, { subtree: true, childList: true, characterData: true, attributes: true });\n\n const highlighter = createA11yHighlighter(doc);\n const send = (msg: ToFrame) => {\n if (msg.type === 'a11y.highlight') highlighter.show(msg.targets);\n if (msg.type !== 'vars.set') return;\n overrides.set(msg.name, msg.value);\n if (lastVars?.some((v) => v.name === msg.name)) scan();\n };\n const audit = async () => {\n const outcome = await auditElement(host, { page: false });\n if (trialId) frames?.reportA11y(trialId, outcome);\n return outcome;\n };\n const disconnect = frames && trialId ? frames.connect(trialId, { send, audit }) : () => {};\n\n return () => {\n disconnect();\n highlighter.dispose();\n mutations?.disconnect();\n clearTimeout(settleTimer);\n };\n }, [host, hostId, trialId, frames, copy, overridesRef]);\n\n // The host is hidden until its first commit has painted with its fonts, so a new trial never shows a jump.\n const announced = useRef(false);\n useEffect(() => {\n if (!host || !inView || announced.current) return;\n let canceled = false;\n const done = () => {\n if (canceled) return;\n announced.current = true;\n setPending(false);\n latest.current.onRendered?.();\n };\n const { fonts } = host.ownerDocument;\n if (!fonts) {\n done();\n return;\n }\n const afterPaint = () => requestAnimationFrame(done);\n void fonts.ready.then(afterPaint, afterPaint);\n return () => {\n canceled = true;\n };\n }, [host, inView, latest]);\n\n return (\n <div\n ref={(el) => {\n elementRef.current = el;\n if (hostRef) hostRef.current = el;\n setHost(el);\n }}\n className=\"fg-story\"\n data-fg-host={hostId}\n data-fg-copy={copy ? '' : undefined}\n data-fg-layout={layout}\n data-pending={pending || undefined}\n >\n <StoryScroller>{host && inView ? <StoryContent host={host}>{children(globals)}</StoryContent> : null}</StoryScroller>\n </div>\n );\n}\n","import { createEmitter } from '@weasel-js/registry';\nimport { createContext, useContext, useSyncExternalStore } from 'react';\nimport type { Clock } from './clock';\n\n/** Each trial's story clock, by trial id: the story's trial publishes it, and the trial's transport reads it. */\nexport interface TrialClocks {\n /** Publishes `clock` as `trialId`'s; the returned function withdraws it. */\n publish(trialId: string, clock: Clock): () => void;\n get(trialId: string): Clock | null;\n subscribe(listener: () => void): () => void;\n}\n\nexport function createTrialClocks(): TrialClocks {\n const clocks = new Map<string, Clock>();\n const changed = createEmitter();\n const notify = changed.emit;\n return {\n publish(trialId, clock) {\n clocks.set(trialId, clock);\n notify();\n return () => {\n if (clocks.get(trialId) !== clock) return;\n clocks.delete(trialId);\n notify();\n };\n },\n get: (trialId) => clocks.get(trialId) ?? null,\n subscribe: changed.subscribe,\n };\n}\n\nexport const TrialClocksContext = createContext<TrialClocks | null>(null);\n\nconst NEVER = () => () => {};\nconst NONE = () => null;\n\n/** The clock trial `trialId`'s story published, or null. */\nexport function useTrialClock(trialId: string): Clock | null {\n const clocks = useContext(TrialClocksContext);\n return useSyncExternalStore(clocks?.subscribe ?? NEVER, clocks ? () => clocks.get(trialId) : NONE);\n}\n","import { useLatest } from '@weasel-js/core';\nimport { useEffect, useRef } from 'react';\nimport type { Clock } from './clock';\n\n/**\n * Keeps `clock`'s paused time in the trial, through `write`, so a reload or a snapshot brings the story back there.\n * It writes when the clock stops or moves while stopped, never on a playing frame. A `persisted` value arriving from\n * outside — a snapshot loaded, a Reset — is requested of the clock, so a span set later can still hold it; null\n * stands for the span's start. Nothing is written while a request waits on a span.\n */\nexport function usePersistedPlayhead(clock: Clock | null, persisted: number | null, write: (time: number) => void): void {\n const written = useRef(persisted);\n const latestWrite = useLatest(write);\n\n useEffect(() => {\n if (!clock || persisted === written.current) return;\n written.current = persisted;\n clock.request(persisted);\n }, [clock, persisted]);\n\n useEffect(() => {\n if (!clock) return;\n return clock.subscribe(() => {\n const { playing, time } = clock.get();\n if (playing || clock.pending() !== null || time === written.current) return;\n written.current = time;\n latestWrite.current(time);\n });\n }, [clock, latestWrite]);\n}\n","import { memo } from 'react';\nimport { StoryHost } from '../frame/StoryHost';\nimport type { Globals } from '../protocol/messages';\nimport type { Decorator, LoadedStory, StoryContext } from '../story/types';\n\nexport interface StoryBodyProps {\n story: LoadedStory;\n config: StoryContext['config'];\n setConfig: StoryContext['setConfig'];\n state: unknown;\n setState: StoryContext['setState'];\n globals: Globals;\n decorators: readonly Decorator[];\n resetKey: number;\n onError: (error: unknown) => void;\n}\n\n/** Calls `render` only when its inputs change, as Storybook does: the lab re-renders a trial for its own reasons, and a\n * story declaring a component inside `render` remounts it on every extra call. */\nexport const StoryBody = memo(function StoryBody({ story, config, setConfig, state, setState, globals, decorators, resetKey, onError }: StoryBodyProps) {\n const storyCtx: StoryContext = { config, setConfig, state, setState, globals, title: story.title, name: story.name };\n return <StoryHost story={story} ctx={storyCtx} decorators={decorators} resetKey={resetKey} onError={onError} />;\n});\n","import type { LabMode } from '@weasel-js/labkit';\nimport { withValueAtPath } from '@weasel-js/labkit/config';\nimport type { Globals } from '../../protocol/messages';\nimport { effectiveGlobals, FOLLOW_APP, GLOBALS_KEY, type GlobalDeclarations } from '../globals';\n\n/** What a lens compares the story against: the opposite color mode, or globals, args and a DPR of its own. */\nexport type ForgeComparison =\n | { kind: 'opposite-mode' }\n | {\n kind: 'custom';\n globals?: Readonly<Record<string, string>>;\n args?: Readonly<Record<string, unknown>>;\n dpr?: number;\n };\n\n/** The conditions a compared render runs under. `dpr` is null where the comparison leaves it alone. */\nexport interface ResolvedConditions {\n globals: Globals;\n args: Readonly<Record<string, unknown>>;\n dpr: number | null;\n}\n\n/** What resolving a comparison reads besides the comparison and the globals it starts from. */\nexport interface ResolveContext {\n declarations: GlobalDeclarations;\n modeGlobal: string;\n prefersDark: boolean;\n labMode: LabMode;\n}\n\nconst NO_ARGS: Readonly<Record<string, unknown>> = {};\n\n/** `value` with `App` read from the lab's own mode and `auto` from the OS, as the story would be shown. */\nfunction shownMode(value: string, ctx: ResolveContext): string {\n const followed = value === FOLLOW_APP ? ctx.labMode : value;\n return followed === 'auto' ? (ctx.prefersDark ? 'dark' : 'light') : followed;\n}\n\nconst SWAP: Readonly<Record<string, string>> = { light: 'dark', dark: 'light' };\n\n/**\n * The mode opposite the one `base` shows, from its declaration's `opposite` or else a swap of light and dark; `to`\n * is undefined where it has none.\n */\nexport function oppositeMode(base: Globals, ctx: ResolveContext): { from: string; to: string | undefined } {\n const from = shownMode(String(base[ctx.modeGlobal] ?? ''), ctx);\n const own = ctx.declarations[ctx.modeGlobal]?.opposite;\n return { from, to: own ? own(from, base) : SWAP[from] };\n}\n\n/**\n * The conditions `c` asks for, starting from `base` — the globals the story renders under before the comparison,\n * pins included. Resolved when a lens renders rather than when the comparison is chosen, so opposite mode keeps\n * showing the opposite after the lab's mode changes; a mode with no opposite leaves the story as it is.\n */\nexport function resolveComparison(c: ForgeComparison | null, base: Globals, ctx: ResolveContext): ResolvedConditions {\n if (c === null) return { globals: base, args: NO_ARGS, dpr: null };\n if (c.kind === 'opposite-mode') {\n const { to } = oppositeMode(base, ctx);\n return { globals: to === undefined ? base : { ...base, [ctx.modeGlobal]: to }, args: NO_ARGS, dpr: null };\n }\n return {\n globals: c.globals ? { ...base, ...c.globals } : base,\n args: c.args ?? NO_ARGS,\n dpr: c.dpr ?? null,\n };\n}\n\n/** A global's value as the toolbar names it: \"Theme: Ocean\". */\nfunction globalLabel(key: string, value: string, declarations: GlobalDeclarations): string {\n const declaration = declarations[key];\n if (!declaration) return `${key}: ${value}`;\n const option = declaration.options.find((o) => o.value === value);\n return `${declaration.label}: ${option?.label ?? value}`;\n}\n\n/** What a lens's comparison is named against: the globals it resolves over, and whether the lens shows Pixels. */\nexport interface DescribeAgainst {\n base: Globals;\n ctx: ResolveContext;\n /** False on a lens that shows no Pixels, where a DPR comparison changes nothing. */\n pixels?: boolean;\n}\n\n/**\n * How a lens names `c`: \"Opposite mode\", \"Theme: Ocean\", \"Arg size = 3\", \"DPR 2×\". Given what the lens renders\n * against, opposite mode says so when there is no opposite to show, and a DPR says it applies to Pixels only on a\n * lens that shows none.\n */\nexport function describeComparison(c: ForgeComparison, declarations: GlobalDeclarations, against?: DescribeAgainst): string {\n if (c.kind === 'opposite-mode') {\n const flip = against ? oppositeMode(against.base, against.ctx) : null;\n return flip && flip.to === undefined ? `Opposite mode: no opposite for '${flip.from}'` : 'Opposite mode';\n }\n const globals = Object.entries(c.globals ?? {}).map(([key, value]) => globalLabel(key, value, declarations));\n const args = Object.entries(c.args ?? {}).map(([path, value]) => `Arg ${path} = ${String(value)}`);\n const dpr = c.dpr ? [`DPR ${c.dpr}×${against?.pixels === false ? ' (Pixels only)' : ''}`] : [];\n return [...globals, ...args, ...dpr].join(', ') || 'As it is';\n}\n\n/**\n * How a lens over a trial names `c`: against that trial's own globals, pins included, as the lens renders it, and\n * whether the lens shows Pixels.\n */\nexport function describeLens(c: ForgeComparison, lab: LabConditions, trialConfig: unknown, pixels: boolean): string {\n const pins = (trialConfig as Record<string, unknown> | null | undefined)?.[GLOBALS_KEY];\n const base = effectiveGlobals(lab.labValues, pins);\n return describeComparison(c, lab.declarations, { base, ctx: resolveContextOf(lab), pixels });\n}\n\n/** `config` with each of `args` written at its path. */\nexport const withArgs = (config: unknown, args: Readonly<Record<string, unknown>>): unknown =>\n Object.entries(args).reduce((c, [path, value]) => withValueAtPath(c, path, value), config);\n\n/** The lab as a lens reads it when it renders: its globals, its mode, and the declarations behind them. */\nexport interface LabConditions {\n labValues: Globals;\n mode: LabMode;\n declarations: GlobalDeclarations;\n modeGlobal: string;\n}\n\n/** What resolving a comparison against `lab` reads, the OS color scheme included. */\nexport function resolveContextOf(lab: LabConditions): ResolveContext {\n const prefersDark = globalThis.matchMedia?.('(prefers-color-scheme: dark)').matches ?? false;\n return { declarations: lab.declarations, modeGlobal: lab.modeGlobal, prefersDark, labMode: lab.mode };\n}\n","import { createContext } from 'react';\nimport type { ForgeComparison, ResolveContext } from './conditions';\nimport type { TrialHit } from './trialAt';\n\n/** One Live lens cell's ask of the trial under its reticle: render a copy into `slot`, magnified about `hit.local`. */\nexport interface LiveRequest {\n /** The lens's id; a cell showing a comparison adds `~compared`, so a Split lens's two cells are two requests. */\n lensId: string;\n slot: HTMLElement;\n hit: TrialHit;\n factor: number;\n /** The slot's size, in CSS px. */\n size: { width: number; height: number };\n /** What the copy compares against, resolved over the trial's own globals, pins included; null shows the story\n * as it is. */\n compare: ForgeComparison | null;\n ctx: ResolveContext;\n /** Config values written over the trial's at their paths. */\n args: Readonly<Record<string, unknown>>;\n}\n\n/** The Live requests standing, by lens, read by each trial for the copies it owes. */\nexport interface LiveLenses {\n /** `null` withdraws the lens's request. */\n set(lensId: string, request: LiveRequest | null): void;\n /** The same array until a request changes. */\n forTrial(trialId: string): readonly LiveRequest[];\n subscribe(listener: () => void): () => void;\n}\n\nconst NONE: readonly LiveRequest[] = [];\n\nexport function createLiveLenses(): LiveLenses {\n const requests = new Map<string, LiveRequest>();\n const listeners = new Set<() => void>();\n let byTrial = new Map<string, readonly LiveRequest[]>();\n return {\n set(lensId, request) {\n if (request === null) {\n if (!requests.delete(lensId)) return;\n } else requests.set(lensId, request);\n byTrial = new Map();\n for (const listener of [...listeners]) listener();\n },\n forTrial(trialId) {\n let found = byTrial.get(trialId);\n if (!found) {\n const mine = [...requests.values()].filter((r) => r.hit.trialId === trialId);\n found = mine.length === 0 ? NONE : mine;\n byTrial.set(trialId, found);\n }\n return found;\n },\n subscribe(listener) {\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n };\n}\n\n/** The workshop's Live requests; null outside a workshop, where no trial renders copies. */\nexport const LiveLensesContext = createContext<LiveLenses | null>(null);\n","import type { LoupePoint } from '@weasel-js/labkit/loupe';\n\n/** The trial under a client point: its host, and the point in the host's own px. */\nexport interface TrialHit {\n trialId: string;\n host: HTMLElement;\n /** In the host's own px: the client offset from its corner, undone by any zoom on the pane holding it. */\n local: LoupePoint;\n /** Client px per host px. */\n scale: number;\n}\n\n/** The element an in-document story scrolls in, inside its host; null for a host with none, as a frame's. */\nexport const scrollerOf = (host: HTMLElement | null): HTMLElement | null =>\n host?.querySelector<HTMLElement>(':scope > .fg-story__scroll') ?? null;\n\nconst stackAt = (client: LoupePoint, doc: Document): readonly Element[] =>\n doc.elementsFromPoint?.(client.x, client.y) ?? [];\n\n/**\n * The topmost story host under `client`, an in-document story's or an isolated one's frame host, skipping a lens's\n * copies, which only ever show some host beneath them.\n */\nexport function trialAt(client: LoupePoint, doc: Document = document): TrialHit | null {\n for (const el of stackAt(client, doc)) {\n const host = el.closest<HTMLElement>('[data-fg-host]');\n if (!host || host.hasAttribute('data-fg-copy')) continue;\n const rect = host.getBoundingClientRect();\n const scale = host.offsetWidth > 0 ? rect.width / host.offsetWidth : 1;\n return {\n trialId: host.dataset.fgHost ?? '',\n host,\n local: { x: (client.x - rect.left) / scale, y: (client.y - rect.top) / scale },\n scale,\n };\n }\n return null;\n}\n","import './loupe.css';\nimport {\n type CSSProperties,\n type ReactNode,\n useCallback,\n useContext,\n useEffect,\n useLayoutEffect,\n useMemo,\n useSyncExternalStore,\n} from 'react';\nimport { createPortal } from 'react-dom';\nimport type { FrameSetup } from '../../frame/FrameController';\nimport type { Globals, Layout } from '../../protocol/messages';\nimport type { Clock } from '../../timeline/clock';\nimport { ClockContext } from '../../timeline/context';\nimport { effectiveGlobals, GLOBALS_KEY } from '../globals';\nimport { StoryBody, type StoryBodyProps } from '../StoryBody';\nimport { StoryGlobalsContext } from '../StoryGlobalsContext';\nimport { TrialHost } from '../TrialHost';\nimport { resolveComparison, withArgs } from './conditions';\nimport { type LiveLenses, LiveLensesContext, type LiveRequest } from './liveLenses';\nimport { scrollerOf } from './trialAt';\n\n/** Props for `LiveCopies`: what a trial renders its own content with, which every copy of it shares. */\nexport interface LiveCopiesProps {\n trialId: string | null;\n layout: Layout;\n setup: FrameSetup;\n /** The trial's whole config, read for its `$globals` pins. */\n trialConfig: unknown;\n /** One copy's content, under the copy's globals and with the lens's args to write over the trial's config. */\n children: (globals: Globals, args: Readonly<Record<string, unknown>>) => ReactNode;\n}\n\n/** Props for `StoryCopy`. */\nexport interface StoryCopyProps {\n /** The story's own body props; a copy replaces `config`, `setConfig` and `globals`. */\n body: Omit<StoryBodyProps, 'globals'>;\n /** The trial's clock; a copy reads it and never drives it. */\n clock: Clock | null;\n globals: Globals;\n args: Readonly<Record<string, unknown>>;\n}\n\n/** A story trial's copy: its body under the copy's globals, with the lens's args written over its config. */\nexport function StoryCopy({ body, clock, globals, args }: StoryCopyProps) {\n const { config, setConfig } = useCopyConfig(body.config, body.setConfig, args);\n return (\n <ClockContext.Provider value={clock}>\n <StoryBody {...body} config={config} setConfig={setConfig} globals={globals} />\n </ClockContext.Provider>\n );\n}\n\n/** Whether a write to `path` would land on, inside or over the arg at `arg`. */\nconst covers = (arg: string, path: string) =>\n path === arg || path.startsWith(`${arg}.`) || arg.startsWith(`${path}.`);\n\nconst px = (n: number) => `${n}px`;\n\n/** Where the copy sits in its slot: the host's own size, scaled by the factor about the hit point, which lands on the\n * slot's center. Set as custom properties, which the stylesheet reads. */\nfunction placement(request: LiveRequest): CSSProperties {\n const { hit, factor, size } = request;\n return {\n ['--fg-lens-copy-w' as string]: px(hit.host.offsetWidth),\n ['--fg-lens-copy-h' as string]: px(hit.host.offsetHeight),\n ['--fg-lens-copy-x' as string]: px(size.width / 2 - hit.local.x * factor),\n ['--fg-lens-copy-y' as string]: px(size.height / 2 - hit.local.y * factor),\n ['--fg-lens-copy-f' as string]: String(factor),\n } as CSSProperties;\n}\n\n\n/** Runs `sync` after every commit of the copy's content, which mounts a render after the copy's host does. */\nfunction AfterCommit({ sync }: { sync: () => void }) {\n useLayoutEffect(sync);\n return null;\n}\n\n/** The globals a lens's copy renders under: the comparison resolved over the trial's own, pins included. */\nfunction useCopyGlobals(request: LiveRequest, trialConfig: unknown): Globals {\n const labGlobals = useContext(StoryGlobalsContext);\n const pins = (trialConfig as Record<string, unknown> | null | undefined)?.[GLOBALS_KEY];\n const own = useMemo(() => effectiveGlobals(labGlobals, pins), [labGlobals, pins]);\n const { compare, ctx } = request;\n return useMemo<Globals>(() => resolveComparison(compare, own, ctx).globals, [own, compare, ctx]);\n}\n\n/**\n * A copy's config and its writer: the trial's config with each of `args` written at its path, and a `setConfig`\n * that drops a write to any of them, since the comparison owns those, and passes every other write to the trial.\n */\nexport function useCopyConfig(\n trialConfig: unknown,\n trialSetConfig: (path: string, value: unknown) => void,\n args: Readonly<Record<string, unknown>>,\n): { config: unknown; setConfig: (path: string, value: unknown) => void } {\n const config = useMemo(() => withArgs(trialConfig, args), [args, trialConfig]);\n // Keyed by the paths alone, so a comparison re-resolved to the same args keeps the story's `setConfig` stable.\n const argPaths = Object.keys(args).join('\\n');\n const setConfig = useCallback(\n (path: string, value: unknown) => {\n const owned = argPaths === '' ? [] : argPaths.split('\\n');\n if (!owned.some((arg) => covers(arg, path))) trialSetConfig(path, value);\n },\n [argPaths, trialSetConfig],\n );\n return { config, setConfig };\n}\n\n/** Portals a copy into its lens's slot, placed and scaled about the reticle's point. */\nfunction LensPortal({ request, children }: { request: LiveRequest; children: ReactNode }) {\n return createPortal(\n <div className=\"fg-lens-copy\" style={placement(request)}>\n {children}\n </div>,\n request.slot,\n );\n}\n\nconst copyId = (trialId: string, request: LiveRequest) => `${trialId}~lens-${request.lensId}`;\n\n/** The Live requests standing over `trialId`, re-read as they change. */\nfunction useRequests(lenses: LiveLenses, trialId: string): readonly LiveRequest[] {\n const forTrial = useCallback(() => lenses.forTrial(trialId), [lenses, trialId]);\n return useSyncExternalStore(lenses.subscribe, forTrial);\n}\n\nfunction LensCopy({ request, trialId, layout, setup, trialConfig, children }: LiveCopiesProps & { request: LiveRequest; trialId: string }) {\n const globals = useCopyGlobals(request, trialConfig);\n const id = copyId(trialId, request);\n const copy = useMemo(() => ({ id, globals }), [id, globals]);\n\n const main = request.hit.host;\n const { slot } = request;\n // Found from the slot, not through the copy's host ref, which a re-render of the host detaches until after its\n // content's layout effects have run.\n const sync = useCallback(() => {\n const from = scrollerOf(main);\n const to = scrollerOf(slot.querySelector<HTMLElement>(':scope > .fg-lens-copy > [data-fg-copy]'));\n if (!from || !to) return;\n to.scrollTop = from.scrollTop;\n to.scrollLeft = from.scrollLeft;\n }, [main, slot]);\n useEffect(() => {\n const from = scrollerOf(main);\n from?.addEventListener('scroll', sync, { passive: true });\n return () => from?.removeEventListener('scroll', sync);\n }, [main, sync]);\n\n return (\n <LensPortal request={request}>\n {/* Remounted on a new factor: no observer sees a transform change, and a canvas inside sizes its backing\n store for the magnification it mounted under. */}\n <TrialHost key={request.factor} layout={layout} setup={setup} config={trialConfig} copy={copy}>\n {(g) => (\n <>\n {children(g, request.args)}\n <AfterCommit sync={sync} />\n </>\n )}\n </TrialHost>\n </LensPortal>\n );\n}\n\nfunction Copies({ lenses, trialId, ...props }: LiveCopiesProps & { lenses: LiveLenses; trialId: string }) {\n const requests = useRequests(lenses, trialId);\n return requests.map((request) => (\n <LensCopy key={request.lensId} request={request} trialId={trialId} {...props} />\n ));\n}\n\n/**\n * The trial's copies for the Live lenses over it: each a second render of its content, portaled into its lens, under\n * the lens's globals and args, following its scroll.\n */\nexport function LiveCopies(props: LiveCopiesProps) {\n const lenses = useContext(LiveLensesContext);\n const { trialId } = props;\n return lenses && trialId ? <Copies {...props} lenses={lenses} trialId={trialId} /> : null;\n}\n\n/**\n * What a lens's copy of an isolated story renders: its host id, the globals and args it renders under, and the trial's\n * host, whose scroll it follows.\n */\nexport interface LensFrameCopy {\n id: string;\n main: HTMLElement;\n globals: Globals;\n args: Readonly<Record<string, unknown>>;\n}\n\n/** Props for `LiveFrameCopies`. */\nexport interface LiveFrameCopiesProps {\n trialId: string | null;\n /** The trial's whole config, read for its `$globals` pins. */\n trialConfig: unknown;\n /** The trial's frame view in copy mode. */\n children: (copy: LensFrameCopy) => ReactNode;\n}\n\nfunction FrameLensCopy({ request, trialId, trialConfig, children }: Omit<LiveFrameCopiesProps, 'trialId'> & { request: LiveRequest; trialId: string }) {\n const globals = useCopyGlobals(request, trialConfig);\n const id = copyId(trialId, request);\n const { args } = request;\n const main = request.hit.host;\n const copy = useMemo(() => ({ id, main, globals, args }), [id, main, globals, args]);\n return <LensPortal request={request}>{children(copy)}</LensPortal>;\n}\n\nfunction FrameCopies({ lenses, trialId, ...props }: Omit<LiveFrameCopiesProps, 'trialId'> & { lenses: LiveLenses; trialId: string }) {\n const requests = useRequests(lenses, trialId);\n return requests.map((request) => <FrameLensCopy key={request.lensId} request={request} trialId={trialId} {...props} />);\n}\n\n/**\n * The copies an isolated trial owes the Live lenses over it: each a frame of its own, portaled into its lens, under\n * the lens's globals and args, following its scroll. The trial's frame view renders itself as each copy, through\n * `children`.\n */\nexport function LiveFrameCopies(props: LiveFrameCopiesProps) {\n const lenses = useContext(LiveLensesContext);\n const { trialId } = props;\n return lenses && trialId ? <FrameCopies {...props} lenses={lenses} trialId={trialId} /> : null;\n}\n","import { type RenderContext, TrialIdContext } from '@weasel-js/labkit';\nimport { useLatest } from '@weasel-js/core';\nimport { type RefObject, useCallback, useContext, useEffect, useRef, useState } from 'react';\nimport type { FrameSetup } from '../frame/FrameController';\nimport type { Globals } from '../protocol/messages';\nimport type { Decorator, LoadedStory } from '../story/types';\nimport { ClockContext } from '../timeline/context';\nimport { useStoryClock } from '../timeline/StoryClock';\nimport { TrialClocksContext } from '../timeline/trialClocks';\nimport { useClockLoop } from '../timeline/useClockLoop';\nimport { usePersistedPlayhead } from '../timeline/usePersistedPlayhead';\nimport { isForgePath, PLAYHEAD_KEY, storyConfig } from './globals';\nimport { LiveCopies, StoryCopy } from './loupe/LiveCopies';\nimport { StoryBody } from './StoryBody';\nimport { TrialHost } from './TrialHost';\n\n/** Props for `StoryTrial`. */\nexport interface StoryTrialProps {\n story: LoadedStory;\n setup: FrameSetup;\n /** The trial's config and state; the story reads and writes them through its `StoryContext`. */\n ctx: Pick<RenderContext<unknown, unknown>, 'config' | 'state' | 'setConfig' | 'setState'>;\n hostRef?: RefObject<HTMLElement | null>;\n onRendered?: () => void;\n /** A render throw, after the boundary has shown it. */\n onError?: (error: unknown) => void;\n}\n\nconst NO_DECORATORS: readonly Decorator[] = [];\n\n/** A story rendered in the workshop document, inside a `TrialHost`, from the trial's own config and state. */\nexport function StoryTrial({ story, setup, ctx, hostRef, onRendered, onError }: StoryTrialProps) {\n const latestRef = useLatest(ctx);\n // Kept across a write to a key forge owns, so moving the playhead or a pin does not re-render the story.\n const [heldConfig, setHeldConfig] = useState(() => storyConfig(ctx.config));\n const config = storyConfig(ctx.config, heldConfig);\n if (config !== heldConfig) setHeldConfig(config);\n\n // A trial opened on the provisional instrument starts at `null`; the story's own initial state fills it once.\n const seeded = useRef(false);\n useEffect(() => {\n if (seeded.current || ctx.state !== null || !story.initialState) return;\n seeded.current = true;\n ctx.setState(story.initialState(config));\n }, [ctx, story, config]);\n\n // Each new input retries a render the boundary caught, as the frame did on each message.\n // State, not a ref: a render React throws away takes its bump with it.\n const [input, setInput] = useState({ config, state: ctx.state, key: 0 });\n let resetKey = input.key;\n if (input.config !== config || input.state !== ctx.state) {\n resetKey = input.key + 1;\n setInput({ config, state: ctx.state, key: resetKey });\n }\n\n // Stable, as the frame's were: a story may list them as effect dependencies.\n // The pins belong to the trial; a story cannot see them, so it cannot set them either.\n const setConfig = useCallback((path: string, value: unknown) => {\n if (!isForgePath(path)) latestRef.current.setConfig(path, value);\n }, [latestRef]);\n const setState = useCallback((next: unknown) => latestRef.current.setState(next), [latestRef]);\n\n // The story's clock lives with its trial: the trial's transport reads it from the registry, the story from context.\n const trialId = useContext(TrialIdContext);\n const clocks = useContext(TrialClocksContext);\n const ownHost = useRef<HTMLElement | null>(null);\n const host = hostRef ?? ownHost;\n const kept = (ctx.config as Record<string, unknown> | null)?.[PLAYHEAD_KEY];\n const persisted = typeof kept === 'number' && Number.isFinite(kept) ? kept : null;\n const clock = useStoryClock(story.timeline?.(config) ?? null, () => persisted);\n useClockLoop(clock, host);\n usePersistedPlayhead(clock, persisted, (time) => latestRef.current.setConfig(PLAYHEAD_KEY, time));\n useEffect(() => (clock && clocks && trialId ? clocks.publish(trialId, clock) : undefined), [clock, clocks, trialId]);\n\n const decorators = setup.decorators ?? NO_DECORATORS;\n const latestError = useLatest(onError);\n const reportError = useCallback((error: unknown) => latestError.current?.(error), [latestError]);\n const body = {\n story,\n config,\n setConfig,\n state: ctx.state,\n setState,\n decorators,\n resetKey,\n onError: reportError,\n };\n const render = (globals: Globals) => (\n <ClockContext.Provider value={clock}>\n <StoryBody {...body} globals={globals} />\n </ClockContext.Provider>\n );\n\n return (\n <>\n <TrialHost\n layout={story.layout}\n setup={setup}\n config={ctx.config}\n hostRef={host}\n {...(onRendered ? { onRendered } : {})}\n >\n {render}\n </TrialHost>\n <LiveCopies trialId={trialId} layout={story.layout} setup={setup} trialConfig={ctx.config}>\n {(globals, args) => <StoryCopy body={body} clock={clock} globals={globals} args={args} />}\n </LiveCopies>\n </>\n );\n}\n"]}
@@ -1,9 +1,9 @@
1
1
  import { LabMode, LabContribution, LabPage } from '@weasel-js/labkit';
2
2
  import { Theme } from '@weasel-js/theme';
3
3
  import { ControlRenderer } from '@weasel-js/labkit/config';
4
- import { G as Globals, F as FrameSetup } from './FrameController-CdnaIo4C.js';
4
+ import { G as Globals, F as FrameSetup } from './FrameController-DgfVaENb.js';
5
5
  import { IconRef } from '@weasel-js/icons';
6
- import { StanceProps } from '@weasel-js/ui/stance';
6
+ import { L as Library } from './library-CdTj-hFp.js';
7
7
 
8
8
  /** One global the workshop's toolbar sets for every story, and a trial may pin for its own. */
9
9
  interface GlobalDeclaration {
@@ -44,24 +44,6 @@ type GlobalDeclarations = Readonly<Record<string, GlobalDeclaration>>;
44
44
  /** A lab value, for a declaration that `follows` the app, meaning whatever the app's chrome is set to. */
45
45
  declare const FOLLOW_APP = "app";
46
46
 
47
- /** One library of a project: the story files under `path` carry `label`. */
48
- interface Library {
49
- /** A stretch of path every story file of the library has, with forward slashes: `/packages/ui/`. */
50
- path: string;
51
- label: string;
52
- /** The tone of the library's badge, as a `<Badge>` takes one. Default: the badge's own muted tone. */
53
- tone?: StanceProps['tone'];
54
- }
55
- /** A project's libraries, as the tree's package filter, the index page header, and Get Info ask about them. */
56
- interface Libraries {
57
- /** The label of the first library whose `path` the story's file holds, else its title's first segment. */
58
- of(entry: {
59
- file: string;
60
- title: string;
61
- }): string;
62
- toneOf(label: string): StanceProps['tone'];
63
- }
64
-
65
47
  /** A shell config module: what the workshop adds to the lab. Only the workshop page imports it. */
66
48
  interface ShellConfig {
67
49
  /** The workshop's name, in its header and as the document title. Default `weaselforge`. The served page reads
@@ -101,4 +83,4 @@ declare function defineFrameConfig(config: FrameSetup): FrameSetup;
101
83
  /** A shell config module's default export. */
102
84
  declare function defineShellConfig(config: ShellConfig): ShellConfig;
103
85
 
104
- export { FOLLOW_APP as F, type GlobalDeclaration as G, type LabChrome as L, type ShellConfig as S, type GlobalDeclarations as a, type Library as b, defineShellConfig as c, defineFrameConfig as d, type Libraries as e };
86
+ export { FOLLOW_APP as F, type GlobalDeclaration as G, type LabChrome as L, type ShellConfig as S, type GlobalDeclarations as a, defineShellConfig as b, defineFrameConfig as d };
@@ -1,5 +1,5 @@
1
- import { ArgsContext, coverOf, isPortSafe } from '../chunk-KEQBGDUZ.js';
2
- import '../chunk-GH5RE5X5.js';
1
+ import { ArgsContext, coverOf, isPortSafe } from '../chunk-7XJNVJB5.js';
2
+ import '../chunk-2ZBZRBHI.js';
3
3
  import { useContext } from 'react';
4
4
 
5
5
  var sendable = (value) => {
@@ -73,6 +73,24 @@ body {
73
73
  margin-top: calc(var(--wzl-space-lg) * 1.5);
74
74
  border-top: var(--wzl-border-w) solid var(--wzl-border);
75
75
  }
76
+ .fg-index-story__main {
77
+ display: flex;
78
+ flex-wrap: wrap;
79
+ align-items: flex-start;
80
+ gap: var(--wzl-space-8) calc(var(--wzl-space-lg) * 1.5);
81
+ }
82
+ .fg-index-story__text {
83
+ flex: 1 1 20rem;
84
+ min-width: 0;
85
+ }
86
+ .fg-index-story__main > .fg-index-cell {
87
+ flex: 0 1 auto;
88
+ margin: 0;
89
+ }
90
+ .fg-index-story__main > .fg-index-cell--padded,
91
+ .fg-index-story__main > .fg-index-cell--fullscreen {
92
+ flex: 2 1 28rem;
93
+ }
76
94
  .fg-index-story__head {
77
95
  display: flex;
78
96
  align-items: center;
@@ -87,6 +105,14 @@ body {
87
105
  text-transform: var(--wzl-panel-title-case);
88
106
  color: var(--wzl-panel-title-color);
89
107
  }
108
+ .fg-index-story__link {
109
+ color: inherit;
110
+ text-decoration: none;
111
+ }
112
+ .fg-index-story__link:hover {
113
+ color: var(--wzl-accent-fg);
114
+ text-decoration: underline;
115
+ }
90
116
  .fg-index-cell {
91
117
  margin: var(--wzl-space-8) 0 0;
92
118
  width: fit-content;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/frame/frame.css","../../src/frame/index/index.css","../../src/frame/capture/capture.css"],"sourcesContent":["html,\nbody {\n margin: 0;\n}\n\n.fg-frame {\n box-sizing: border-box;\n}\n\n.fg-frame--centered {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 100vh;\n}\n\n.fg-frame--padded {\n padding: var(--wzl-space-8);\n}\n\n.fg-frame--fullscreen {\n height: 100vh;\n padding: 0;\n}\n\n.fg-frame__fault {\n margin: 0;\n padding: var(--wzl-space-8);\n white-space: pre-wrap;\n border: 1px solid #f2b8b5;\n border-radius: 4px;\n background: #fdecea;\n color: #8c1d18;\n font: 13px/1.4 ui-monospace, SFMono-Regular, Menlo, monospace;\n}\n",".fg-index {\n box-sizing: border-box;\n max-width: 1200px;\n margin: 0 auto;\n padding: var(--wzl-space-lg);\n font-family: var(--wzl-font-ui);\n font-size: var(--wzl-font-size);\n color: var(--wzl-fg);\n}\n\n.fg-index__head {\n margin-bottom: calc(var(--wzl-space-lg) * 2);\n}\n\n.fg-index__path {\n margin: 0 0 var(--wzl-space-2);\n font-size: var(--wzl-font-size-lg);\n color: var(--wzl-fg-muted);\n}\n\n.fg-index__title {\n margin: 0;\n font-family: var(--wzl-panel-title-font);\n font-size: calc(var(--wzl-font-size-xl) * 1.6);\n font-weight: var(--wzl-font-weight-medium);\n letter-spacing: var(--wzl-panel-title-tracking);\n text-transform: var(--wzl-panel-title-case);\n}\n\n.fg-index__description,\n.fg-index-story__description {\n max-width: 72ch;\n margin: var(--wzl-space-4) 0 0;\n font-family: var(--wzl-font-body);\n line-height: 1.5;\n color: var(--wzl-fg-muted);\n}\n\n.fg-index-story {\n padding-top: calc(var(--wzl-space-lg) * 1.5);\n margin-top: calc(var(--wzl-space-lg) * 1.5);\n border-top: var(--wzl-border-w) solid var(--wzl-border);\n}\n\n.fg-index-story__head {\n display: flex;\n align-items: center;\n gap: var(--wzl-space-6);\n}\n\n.fg-index-story__name {\n margin: 0;\n font-family: var(--wzl-panel-title-font);\n font-size: var(--wzl-font-size-xl);\n font-weight: var(--wzl-panel-title-weight);\n letter-spacing: var(--wzl-panel-title-tracking);\n text-transform: var(--wzl-panel-title-case);\n color: var(--wzl-panel-title-color);\n}\n\n.fg-index-cell {\n margin: var(--wzl-space-8) 0 0;\n width: fit-content;\n /* A fluid specimen (a slider, a tiled workspace) has no width of its own,\n so hugging it alone collapses the cell to its padding. */\n min-width: min(100%, 20rem);\n max-width: 100%;\n}\n\n.fg-index-cell__stage {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 96px;\n padding: var(--wzl-space-2);\n border: var(--wzl-border-w) solid var(--wzl-border);\n border-radius: var(--wzl-radius-md);\n background: var(--wzl-surface);\n overflow: auto;\n}\n\n/* A padded story sits top-left as it would on a page: the column's width, and\n none of the minimum height that gives a centered one presence. */\n.fg-index-cell--padded {\n width: auto;\n}\n\n.fg-index-cell--padded > .fg-index-cell__stage {\n display: block;\n min-height: 0;\n}\n\n.fg-index-cell--fullscreen {\n width: auto;\n}\n\n.fg-index-cell--fullscreen > .fg-index-cell__stage {\n display: block;\n height: 360px;\n padding: 0;\n}\n\n.fg-index-cell__label {\n margin-top: var(--wzl-space-3);\n font-family: var(--wzl-font-mono);\n font-size: var(--wzl-font-size-sm);\n color: var(--wzl-fg-muted);\n}\n\n.fg-index-variants__row {\n margin-top: calc(var(--wzl-space-lg) * 1.25);\n}\n\n/* Set as the kit's panel titles are, at the small size. */\n.fg-index-variants__label {\n margin: 0;\n font-family: var(--wzl-panel-title-font);\n font-size: var(--wzl-font-size-sm);\n font-weight: var(--wzl-panel-title-weight);\n letter-spacing: 0.06em;\n text-transform: uppercase;\n color: var(--wzl-fg-muted);\n}\n\n.fg-index-variants__cells {\n display: flex;\n flex-wrap: wrap;\n align-items: flex-start;\n gap: var(--wzl-space-6);\n}\n\n.fg-index-variants__cells > .fg-index-cell {\n margin-top: var(--wzl-space-4);\n}\n\n.fg-index__library {\n margin-inline-end: var(--wzl-space-4);\n vertical-align: middle;\n}\n\n.fg-index__title-row {\n display: flex;\n align-items: center;\n gap: var(--wzl-space-6);\n}\n\n.fg-index-history {\n display: flex;\n flex-wrap: wrap;\n gap: var(--wzl-space-2) var(--wzl-space-8);\n margin: var(--wzl-space-8) 0 0;\n font-size: var(--wzl-font-size-sm);\n}\n\n.fg-index-history__item {\n display: flex;\n gap: var(--wzl-space-3);\n}\n\n.fg-index-history__label {\n color: var(--wzl-fg-muted);\n}\n\n.fg-index-history__value {\n margin: 0;\n}\n\n.fg-index-deps {\n display: grid;\n grid-template-columns: max-content 1fr;\n gap: var(--wzl-space-3) var(--wzl-space-8);\n margin: var(--wzl-space-8) 0 0;\n font-size: var(--wzl-font-size-sm);\n}\n\n.fg-index-deps__row {\n display: contents;\n}\n\n.fg-index-deps__label {\n color: var(--wzl-fg-muted);\n}\n\n.fg-index-deps__value {\n margin: 0;\n}\n\n.fg-index-deps__list {\n display: flex;\n flex-wrap: wrap;\n gap: var(--wzl-space-2) var(--wzl-space-6);\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n.fg-index-deps__link {\n color: var(--wzl-accent-fg);\n text-decoration: none;\n}\n\n.fg-index-deps__link:hover {\n text-decoration: underline;\n}\n\n.fg-index-deps__prefix,\n.fg-index-deps__empty,\n.fg-index-deps__none {\n color: var(--wzl-fg-muted);\n}\n\n.fg-index-deps__none {\n max-width: 72ch;\n margin: var(--wzl-space-8) 0 0;\n font-size: var(--wzl-font-size-sm);\n}\n","/* The capture box is the host's size exactly, whatever else styles a `.fg-story`. An isolated story's frame wrapper\n measures `100vh` against the page, which the capture sizes to the box. */\n.fg-story[data-fg-capture] {\n position: relative;\n box-sizing: border-box;\n width: var(--fg-capture-w);\n height: var(--fg-capture-h);\n overflow: hidden;\n contain: paint;\n container-type: size;\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/frame/frame.css","../../src/frame/index/index.css","../../src/frame/capture/capture.css"],"sourcesContent":["html,\nbody {\n margin: 0;\n}\n\n.fg-frame {\n box-sizing: border-box;\n}\n\n.fg-frame--centered {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 100vh;\n}\n\n.fg-frame--padded {\n padding: var(--wzl-space-8);\n}\n\n.fg-frame--fullscreen {\n height: 100vh;\n padding: 0;\n}\n\n.fg-frame__fault {\n margin: 0;\n padding: var(--wzl-space-8);\n white-space: pre-wrap;\n border: 1px solid #f2b8b5;\n border-radius: 4px;\n background: #fdecea;\n color: #8c1d18;\n font: 13px/1.4 ui-monospace, SFMono-Regular, Menlo, monospace;\n}\n",".fg-index {\n box-sizing: border-box;\n max-width: 1200px;\n margin: 0 auto;\n padding: var(--wzl-space-lg);\n font-family: var(--wzl-font-ui);\n font-size: var(--wzl-font-size);\n color: var(--wzl-fg);\n}\n\n.fg-index__head {\n margin-bottom: calc(var(--wzl-space-lg) * 2);\n}\n\n.fg-index__path {\n margin: 0 0 var(--wzl-space-2);\n font-size: var(--wzl-font-size-lg);\n color: var(--wzl-fg-muted);\n}\n\n.fg-index__title {\n margin: 0;\n font-family: var(--wzl-panel-title-font);\n font-size: calc(var(--wzl-font-size-xl) * 1.6);\n font-weight: var(--wzl-font-weight-medium);\n letter-spacing: var(--wzl-panel-title-tracking);\n text-transform: var(--wzl-panel-title-case);\n}\n\n.fg-index__description,\n.fg-index-story__description {\n max-width: 72ch;\n margin: var(--wzl-space-4) 0 0;\n font-family: var(--wzl-font-body);\n line-height: 1.5;\n color: var(--wzl-fg-muted);\n}\n\n.fg-index-story {\n padding-top: calc(var(--wzl-space-lg) * 1.5);\n margin-top: calc(var(--wzl-space-lg) * 1.5);\n border-top: var(--wzl-border-w) solid var(--wzl-border);\n}\n\n/* Text and example share a row while both fit, and the example wraps under the text rather than squeezing it. */\n.fg-index-story__main {\n display: flex;\n flex-wrap: wrap;\n align-items: flex-start;\n gap: var(--wzl-space-8) calc(var(--wzl-space-lg) * 1.5);\n}\n\n.fg-index-story__text {\n flex: 1 1 20rem;\n min-width: 0;\n}\n\n.fg-index-story__main > .fg-index-cell {\n flex: 0 1 auto;\n margin: 0;\n}\n\n.fg-index-story__main > .fg-index-cell--padded,\n.fg-index-story__main > .fg-index-cell--fullscreen {\n flex: 2 1 28rem;\n}\n\n.fg-index-story__head {\n display: flex;\n align-items: center;\n gap: var(--wzl-space-6);\n}\n\n.fg-index-story__name {\n margin: 0;\n font-family: var(--wzl-panel-title-font);\n font-size: var(--wzl-font-size-xl);\n font-weight: var(--wzl-panel-title-weight);\n letter-spacing: var(--wzl-panel-title-tracking);\n text-transform: var(--wzl-panel-title-case);\n color: var(--wzl-panel-title-color);\n}\n\n.fg-index-story__link {\n color: inherit;\n text-decoration: none;\n}\n\n.fg-index-story__link:hover {\n color: var(--wzl-accent-fg);\n text-decoration: underline;\n}\n\n.fg-index-cell {\n margin: var(--wzl-space-8) 0 0;\n width: fit-content;\n /* A fluid specimen (a slider, a tiled workspace) has no width of its own,\n so hugging it alone collapses the cell to its padding. */\n min-width: min(100%, 20rem);\n max-width: 100%;\n}\n\n.fg-index-cell__stage {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 96px;\n padding: var(--wzl-space-2);\n border: var(--wzl-border-w) solid var(--wzl-border);\n border-radius: var(--wzl-radius-md);\n background: var(--wzl-surface);\n overflow: auto;\n}\n\n/* A padded story sits top-left as it would on a page: the column's width, and\n none of the minimum height that gives a centered one presence. */\n.fg-index-cell--padded {\n width: auto;\n}\n\n.fg-index-cell--padded > .fg-index-cell__stage {\n display: block;\n min-height: 0;\n}\n\n.fg-index-cell--fullscreen {\n width: auto;\n}\n\n.fg-index-cell--fullscreen > .fg-index-cell__stage {\n display: block;\n height: 360px;\n padding: 0;\n}\n\n.fg-index-cell__label {\n margin-top: var(--wzl-space-3);\n font-family: var(--wzl-font-mono);\n font-size: var(--wzl-font-size-sm);\n color: var(--wzl-fg-muted);\n}\n\n.fg-index-variants__row {\n margin-top: calc(var(--wzl-space-lg) * 1.25);\n}\n\n/* Set as the kit's panel titles are, at the small size. */\n.fg-index-variants__label {\n margin: 0;\n font-family: var(--wzl-panel-title-font);\n font-size: var(--wzl-font-size-sm);\n font-weight: var(--wzl-panel-title-weight);\n letter-spacing: 0.06em;\n text-transform: uppercase;\n color: var(--wzl-fg-muted);\n}\n\n.fg-index-variants__cells {\n display: flex;\n flex-wrap: wrap;\n align-items: flex-start;\n gap: var(--wzl-space-6);\n}\n\n.fg-index-variants__cells > .fg-index-cell {\n margin-top: var(--wzl-space-4);\n}\n\n.fg-index__library {\n margin-inline-end: var(--wzl-space-4);\n vertical-align: middle;\n}\n\n.fg-index__title-row {\n display: flex;\n align-items: center;\n gap: var(--wzl-space-6);\n}\n\n.fg-index-history {\n display: flex;\n flex-wrap: wrap;\n gap: var(--wzl-space-2) var(--wzl-space-8);\n margin: var(--wzl-space-8) 0 0;\n font-size: var(--wzl-font-size-sm);\n}\n\n.fg-index-history__item {\n display: flex;\n gap: var(--wzl-space-3);\n}\n\n.fg-index-history__label {\n color: var(--wzl-fg-muted);\n}\n\n.fg-index-history__value {\n margin: 0;\n}\n\n.fg-index-deps {\n display: grid;\n grid-template-columns: max-content 1fr;\n gap: var(--wzl-space-3) var(--wzl-space-8);\n margin: var(--wzl-space-8) 0 0;\n font-size: var(--wzl-font-size-sm);\n}\n\n.fg-index-deps__row {\n display: contents;\n}\n\n.fg-index-deps__label {\n color: var(--wzl-fg-muted);\n}\n\n.fg-index-deps__value {\n margin: 0;\n}\n\n.fg-index-deps__list {\n display: flex;\n flex-wrap: wrap;\n gap: var(--wzl-space-2) var(--wzl-space-6);\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n.fg-index-deps__link {\n color: var(--wzl-accent-fg);\n text-decoration: none;\n}\n\n.fg-index-deps__link:hover {\n text-decoration: underline;\n}\n\n.fg-index-deps__prefix,\n.fg-index-deps__empty,\n.fg-index-deps__none {\n color: var(--wzl-fg-muted);\n}\n\n.fg-index-deps__none {\n max-width: 72ch;\n margin: var(--wzl-space-8) 0 0;\n font-size: var(--wzl-font-size-sm);\n}\n","/* The capture box is the host's size exactly, whatever else styles a `.fg-story`. An isolated story's frame wrapper\n measures `100vh` against the page, which the capture sizes to the box. */\n.fg-story[data-fg-capture] {\n position: relative;\n box-sizing: border-box;\n width: var(--fg-capture-w);\n height: var(--fg-capture-h);\n overflow: hidden;\n contain: paint;\n container-type: size;\n}\n"],"mappings":"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","names":[]}
@@ -1,11 +1,13 @@
1
- import { G as Globals, L as Layout, I as IndexEntry, F as FrameSetup } from '../FrameController-CdnaIo4C.js';
2
- export { C as Channel, a as ConfigAnswers, b as FaultPhase, c as FromFrame, S as StartFrameOptions, T as ToFrame, r as reportImportFault, s as startFrame } from '../FrameController-CdnaIo4C.js';
3
- import { F as FrameImporters } from '../mountFrame-Ds3QLnBF.js';
4
- export { a as FrameIndexEntry, M as MountFrameOptions, m as mountFrame } from '../mountFrame-Ds3QLnBF.js';
1
+ import { G as Globals, L as Layout, I as IndexEntry, F as FrameSetup, D as DepGraph } from '../FrameController-DgfVaENb.js';
2
+ export { C as Channel, a as ConfigAnswers, b as FaultPhase, c as FromFrame, S as StartFrameOptions, T as ToFrame, r as reportImportFault, s as startFrame } from '../FrameController-DgfVaENb.js';
3
+ import { F as FrameImporters } from '../mountFrame-Bs7u1ro-.js';
4
+ export { a as FrameIndexEntry, M as MountFrameOptions, m as mountFrame } from '../mountFrame-Bs7u1ro-.js';
5
5
  import { Theme } from '@weasel-js/theme';
6
+ import { L as Library } from '../library-CdTj-hFp.js';
6
7
  import '@weasel-js/icons';
7
8
  import '@weasel-js/labkit/config';
8
9
  import 'react';
10
+ import '@weasel-js/ui/appearance';
9
11
 
10
12
  /** Everything the screen renders a story from, as the capture endpoint takes it. */
11
13
  interface CapturePayload {
@@ -53,6 +55,10 @@ interface MountCaptureOptions {
53
55
  setup: FrameSetup;
54
56
  /** The shell config's `labTheme`; only the shell's capture page has one. */
55
57
  labTheme?: ((globals: Globals) => Theme) | undefined;
58
+ /** The shell config's `libraries`, which an index page's header names and tints. */
59
+ libraries?: readonly Library[] | undefined;
60
+ /** The component graph an index page reads its dependencies and history from, asked for at its first capture. */
61
+ dependencies?: (() => Promise<DepGraph>) | undefined;
56
62
  }
57
63
  declare global {
58
64
  interface Window {
@@ -63,10 +69,10 @@ declare global {
63
69
  }
64
70
  }
65
71
  /**
66
- * A capture page's entry: exposes `window.__forgeCapture.render(payload)`, which loads the payload's story, renders
67
- * it afresh into `#root`, and resolves once it has painted. Rejects for a story the index does not hold, and with
68
- * whatever throws outside the story's own error boundary.
72
+ * A capture page's entry: exposes `window.__forgeCapture.render(payload)`, which loads the payload's story, or the
73
+ * index page its index id names, renders it afresh into `#root`, and resolves once it has painted. Rejects for an id
74
+ * the index does not hold, and with whatever throws outside the story's own error boundary.
69
75
  */
70
- declare function mountCapture({ index, importers, setup, labTheme }: MountCaptureOptions): void;
76
+ declare function mountCapture(options: MountCaptureOptions): void;
71
77
 
72
78
  export { FrameImporters, FrameSetup, type MountCaptureOptions, mountCapture };