@weasel-js/forge 1.10.0 → 1.11.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 (38) hide show
  1. package/README.md +1 -3
  2. package/dist/{FrameController-UeTY7ubF.d.ts → FrameController-BRhShqut.d.ts} +5 -0
  3. package/dist/{chunk-FL2MUPUL.js → chunk-2OJAV522.js} +2 -2
  4. package/dist/chunk-2OJAV522.js.map +1 -0
  5. package/dist/{chunk-DFKCLZKS.js → chunk-7BQPHMA2.js} +2 -2
  6. package/dist/chunk-7BQPHMA2.js.map +1 -0
  7. package/dist/{chunk-DKWHGSBZ.js → chunk-DPTECNYC.js} +3 -3
  8. package/dist/{chunk-DKWHGSBZ.js.map → chunk-DPTECNYC.js.map} +1 -1
  9. package/dist/{chunk-ENXU34PI.js → chunk-J3GYSNCK.js} +4 -4
  10. package/dist/{chunk-ENXU34PI.js.map → chunk-J3GYSNCK.js.map} +1 -1
  11. package/dist/{chunk-4NM3RTYK.js → chunk-NVNTQ4AT.js} +89 -11
  12. package/dist/chunk-NVNTQ4AT.js.map +1 -0
  13. package/dist/{chunk-V4RI7GWD.js → chunk-R5F44ECM.js} +17 -7
  14. package/dist/chunk-R5F44ECM.js.map +1 -0
  15. package/dist/{chunk-GB6PRJET.js → chunk-SQ4KCIEH.js} +3 -3
  16. package/dist/{chunk-GB6PRJET.js.map → chunk-SQ4KCIEH.js.map} +1 -1
  17. package/dist/{config-Cz7ZyGF-.d.ts → config-BwScQukB.d.ts} +5 -4
  18. package/dist/csf/preview-api.js +2 -2
  19. package/dist/frame/index.d.ts +3 -2
  20. package/dist/frame/index.js +7 -8
  21. package/dist/frame/index.js.map +1 -1
  22. package/dist/index.d.ts +5 -4
  23. package/dist/index.js +3 -3
  24. package/dist/shell/index.css +8 -0
  25. package/dist/shell/index.css.map +1 -1
  26. package/dist/shell/index.d.ts +4 -3
  27. package/dist/shell/index.js +278 -128
  28. package/dist/shell/index.js.map +1 -1
  29. package/dist/test/index.d.ts +2 -1
  30. package/dist/test/index.js +5 -5
  31. package/dist/vite/index.d.ts +13 -1
  32. package/dist/vite/index.js +11 -2
  33. package/dist/vite/index.js.map +1 -1
  34. package/package.json +8 -6
  35. package/dist/chunk-4NM3RTYK.js.map +0 -1
  36. package/dist/chunk-DFKCLZKS.js.map +0 -1
  37. package/dist/chunk-FL2MUPUL.js.map +0 -1
  38. package/dist/chunk-V4RI7GWD.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/frame/a11y.ts","../src/frame/cssVarUse.ts","../src/frame/cssVars.ts","../src/frame/globalsTarget.ts","../src/timeline/useClockLoop.ts","../src/timeline/clock.ts","../src/timeline/StoryClock.tsx","../src/frame/StoryHost.tsx","../src/csf/argsToSchema.ts","../src/timeline/declare.ts","../src/csf/loadCsfModule.tsx","../src/story/native.ts","../src/story/load.ts","../src/frame/useNearViewport.ts"],"names":["last","raf","useEffect","jsx","value","isPlainObject","useContext","useState","config","f"],"mappings":"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","file":"chunk-NVNTQ4AT.js","sourcesContent":["import type { A11yFinding, A11yReport } from '../protocol/messages';\n\n/** The shape of `axe.run`'s answer this module reads. */\ninterface AxeResult {\n violations: readonly AxeFinding[];\n incomplete: readonly AxeFinding[];\n passes: readonly unknown[];\n inapplicable: readonly unknown[];\n}\ninterface AxeFinding {\n id: string;\n impact?: string | null;\n help: string;\n helpUrl: string;\n description: string;\n nodes: readonly { target: readonly unknown[]; html: string; failureSummary?: string }[];\n}\ninterface AxeModule {\n run(context: Element, options?: unknown): Promise<AxeResult>;\n}\n\nconst IMPACTS = new Set(['minor', 'moderate', 'serious', 'critical']);\n\nfunction finding(from: AxeFinding): A11yFinding {\n const impact = from.impact ?? '';\n return {\n id: from.id,\n impact: IMPACTS.has(impact) ? (impact as A11yFinding['impact']) : null,\n help: from.help,\n helpUrl: from.helpUrl,\n description: from.description,\n nodes: from.nodes.map((node) => ({\n // An axe target entry is a selector, or an array of them for an element inside a shadow root.\n target: node.target.map((part) => (Array.isArray(part) ? part.join(' ') : String(part))),\n html: node.html,\n ...(node.failureSummary === undefined ? {} : { failureSummary: node.failureSummary }),\n })),\n };\n}\n\nlet loading: Promise<AxeModule> | null = null;\n\n/** axe is ~500 KB, so a frame that is never audited never pays for it. */\nfunction loadAxe(): Promise<AxeModule> {\n loading ??= import('axe-core').then((mod) => (mod as unknown as { default?: AxeModule }).default ?? (mod as unknown as AxeModule));\n return loading;\n}\n\n/** Rules that judge the page rather than the element audited; off when the element is one story on a page of many. */\nexport const PAGE_RULES: readonly string[] = [\n 'bypass',\n 'document-title',\n 'html-has-lang',\n 'html-lang-valid',\n 'html-xml-lang-mismatch',\n 'landmark-one-main',\n 'page-has-heading-one',\n 'region',\n];\n\nexport interface RunAxeOptions {\n /** Whether `element` stands for the whole page. False leaves `PAGE_RULES` out. Default true. */\n page?: boolean;\n}\n\n// axe refuses a run while another is under way in the same document, and the workshop page holds every story.\nlet last: Promise<unknown> = Promise.resolve();\n\n/** Runs axe over `element` and reduces its answer to what crosses the frame's channel. A run waits for the one before it. */\nexport async function runAxe(element: Element, { page = true }: RunAxeOptions = {}): Promise<A11yReport> {\n const axe = await loadAxe();\n const rules = page ? undefined : Object.fromEntries(PAGE_RULES.map((id) => [id, { enabled: false }]));\n const run = () => axe.run(element, rules ? { rules } : undefined);\n const running = last.then(run, run);\n last = running;\n const result = await running;\n return {\n violations: result.violations.map(finding),\n incomplete: result.incomplete.map(finding),\n passes: result.passes.length,\n inapplicable: result.inapplicable.length,\n };\n}\n","const VAR_REF = /var\\(\\s*(--[\\w-]+)/g;\nconst CUSTOM_DECL = /(?:^|[;{\\s])(--[\\w-]+)\\s*:\\s*([^;]*)/g;\n// A selector naming a pseudo-element, or a state the pointer or focus has to be in, matches no element at rest.\nconst RESTLESS = /::?(?:before|after|first-line|first-letter|marker|placeholder|selection|backdrop|file-selector-button)\\b|::[\\w-]+(?:\\([^)]*\\))?|:(?:hover|active|focus-visible|focus-within|focus|visited|target)\\b/g;\nconst STYLE_RULE = 1;\n\n/** Every custom property `text` reads with `var()`. */\nexport function varRefs(text: string, into: Set<string> = new Set()): Set<string> {\n if (!text.includes('var(')) return into;\n for (const [, name] of text.matchAll(VAR_REF)) into.add(name!);\n return into;\n}\n\n/** Where a selector lands relative to the story: on it or inside it, or on an ancestor whose declarations it inherits. */\ninterface Reach {\n readonly within: boolean;\n readonly above: boolean;\n}\n\nfunction reach(selector: string, root: Element): Reach {\n const resting = selector.replace(RESTLESS, '').trim() || '*';\n try {\n return { within: root.matches(resting) || root.querySelector(resting) !== null, above: root.parentElement?.closest(resting) != null };\n } catch {\n // A selector the engine can't query is kept rather than lost.\n return { within: true, above: true };\n }\n}\n\n/** A declaration block split into what it defines and the custom properties its other declarations read. */\nfunction readBlock(block: string, defs: Map<string, Set<string>>, seeds: Set<string> | null): void {\n for (const [, name, value] of block.matchAll(CUSTOM_DECL)) {\n const refs = defs.get(name!) ?? new Set<string>();\n varRefs(value!, refs);\n defs.set(name!, refs);\n }\n if (seeds) varRefs(block.replace(CUSTOM_DECL, ''), seeds);\n}\n\nfunction blockOf(rule: CSSRule): string {\n const text = rule.cssText;\n const open = text.indexOf('{');\n return open < 0 ? '' : text.slice(open + 1, text.lastIndexOf('}'));\n}\n\nfunction walk(rules: CSSRuleList, root: Element, defs: Map<string, Set<string>>, seeds: Set<string>, parent?: Reach): void {\n for (const rule of Array.from(rules)) {\n const imported = (rule as CSSRule & { styleSheet?: CSSStyleSheet | null }).styleSheet;\n if (imported) {\n const inner = cssRulesOf(imported);\n if (inner) walk(inner, root, defs, seeds);\n continue;\n }\n const children = (rule as CSSRule & { cssRules?: CSSRuleList }).cssRules;\n if (rule.type !== STYLE_RULE) {\n // @media, @supports, @layer and @container hold rules; a keyframe or a font face reaches no element.\n if (children) walk(children, root, defs, seeds, parent);\n continue;\n }\n // A nested rule's selector is relative to its parent's, so it inherits the parent's reach.\n const at = parent ?? reach((rule as CSSStyleRule).selectorText, root);\n if (at.within || at.above) readBlock(blockOf(rule), defs, at.within ? seeds : null);\n }\n}\n\nfunction cssRulesOf(sheet: CSSStyleSheet): CSSRuleList | null {\n try {\n return sheet.cssRules;\n } catch {\n // A cross-origin sheet refuses to be read.\n return null;\n }\n}\n\n/**\n * The custom properties the story under `root` uses: those read by a declaration of a rule matching an element in\n * it, or by its inline styles, and every property one of those reads in turn through a definition that reaches it.\n * A definition on an ancestor reaches it by inheritance; an ancestor's other declarations do not count as use.\n */\nexport function usedCssVars(doc: Document, root: Element): Set<string> {\n const defs = new Map<string, Set<string>>();\n const seeds = new Set<string>();\n for (const sheet of Array.from(doc.styleSheets)) {\n const rules = cssRulesOf(sheet);\n if (rules) walk(rules, root, defs, seeds);\n }\n for (const el of Array.from(doc.querySelectorAll('[style]'))) {\n const within = root.contains(el);\n if (within || el.contains(root)) readBlock(el.getAttribute('style') ?? '', defs, within ? seeds : null);\n }\n\n const used = new Set<string>();\n const queue = [...seeds];\n while (queue.length > 0) {\n const name = queue.pop()!;\n if (used.has(name)) continue;\n used.add(name);\n for (const ref of defs.get(name) ?? []) queue.push(ref);\n }\n return used;\n}\n","import type { CssVarReport } from '../protocol/messages';\nimport { usedCssVars, varRefs } from './cssVarUse';\n\nconst collect = (text: string, names: Set<string>) => void varRefs(text, names);\n\n/** A grouping rule's text holds its children's; an `@import` holds only its URL, so its sheet is read too. */\nfunction walkRules(sheet: CSSStyleSheet, names: Set<string>): void {\n let rules: CSSRuleList;\n try {\n rules = sheet.cssRules;\n } catch {\n // A cross-origin sheet refuses to be read.\n return;\n }\n for (const rule of Array.from(rules)) {\n const imported = (rule as CSSRule & { styleSheet?: CSSStyleSheet | null }).styleSheet;\n if (imported) walkRules(imported, names);\n else collect(rule.cssText, names);\n }\n}\n\n/**\n * Every custom property the document references with `var()`, from inline styles and stylesheet rules — computed\n * styles have already substituted the reference away — each marked with whether the story under `root` uses it.\n * Values resolve on `root`, the document's by default, or else on the first element under it that declares one.\n */\nexport function scanCssVars(\n doc: Document,\n overridden: (name: string) => boolean = () => false,\n root: Element = doc.documentElement,\n): CssVarReport[] {\n const names = new Set<string>();\n for (const el of Array.from(doc.querySelectorAll('[style]'))) collect(el.getAttribute('style') ?? '', names);\n for (const sheet of Array.from(doc.styleSheets)) walkRules(sheet, names);\n\n const values = resolveValues(doc, names, root);\n const used = usedCssVars(doc, root);\n return [...names]\n .sort()\n .map((name) => ({ name, value: values.get(name) ?? '', overridden: overridden(name), used: used.has(name) }));\n}\n\nfunction resolveValues(doc: Document, names: Iterable<string>, root: Element): Map<string, string> {\n const view = doc.defaultView;\n const values = new Map<string, string>();\n if (!view) return values;\n const own = view.getComputedStyle(root);\n const missing: string[] = [];\n for (const name of names) {\n const value = own.getPropertyValue(name).trim();\n if (value) values.set(name, value);\n else missing.push(name);\n }\n const under = root === doc.documentElement ? (doc.body ?? root) : root;\n for (const el of missing.length > 0 ? Array.from(under.querySelectorAll('*')) : []) {\n const style = view.getComputedStyle(el);\n for (let i = missing.length - 1; i >= 0; i--) {\n const value = style.getPropertyValue(missing[i]!).trim();\n if (!value) continue;\n values.set(missing[i]!, value);\n missing.splice(i, 1);\n }\n if (missing.length === 0) break;\n }\n return values;\n}\n\n/** One custom property's value, resolved the way `scanCssVars` resolves each. */\nexport function resolveCssVar(doc: Document, name: string, root: Element = doc.documentElement): string {\n return resolveValues(doc, [name], root).get(name) ?? '';\n}\n\nexport interface Overrides {\n set(name: string, value: string | null): void;\n has(name: string): boolean;\n /** Whether `node` is the override style element or inside it. */\n owns(node: Node): boolean;\n dispose(): void;\n}\n\n/**\n * Custom property overrides as one rule on `scope`, kept last in `<head>`. `:not(#fg-overrides)` adds an ID's weight\n * without `!important`, so the rule outranks a theme's attribute selectors; a stylesheet that lands after it sends\n * the element back to the end.\n */\nexport function createOverrides(doc: Document, scope = ':root'): Overrides {\n const values = new Map<string, string>();\n const style = doc.createElement('style');\n style.setAttribute('data-fg-overrides', '');\n\n // Another instance's style counts as last place too, or two instances would take turns moving forever.\n const keepLast = () => {\n if (style.parentNode === doc.head) {\n let next = style.nextElementSibling;\n while (next?.hasAttribute('data-fg-overrides')) next = next.nextElementSibling;\n if (next === null) return;\n }\n doc.head.append(style);\n };\n const write = () => {\n const decls = [...values].map(([name, value]) => ` ${name}: ${value};`);\n style.textContent = decls.length > 0 ? `:is(${scope}):not(#fg-overrides) {\\n${decls.join('\\n')}\\n}\\n` : '';\n };\n\n keepLast();\n const observer = typeof MutationObserver === 'undefined' ? null : new MutationObserver(keepLast);\n observer?.observe(doc.head, { childList: true });\n\n return {\n set(name, value) {\n if (value === null) values.delete(name);\n else values.set(name, value);\n write();\n },\n has: (name) => values.has(name),\n owns: (node) => style.contains(node),\n dispose() {\n observer?.disconnect();\n style.remove();\n },\n };\n}\n","/** What a setup's `applyGlobals` is handed: the element the globals apply to, and a way to style it alone. */\nexport interface GlobalsTarget {\n /** A frame document's root, or one story's host in the workshop document. */\n root: HTMLElement;\n /** A selector matching `root` and nothing else, so a rule written under it reaches only this target. */\n scope: string;\n /** Replaces the CSS forge keeps for this target. */\n style: (css: string) => void;\n}\n\n/** A target over `root`, owning one `<style>` in the document's head; `dispose` removes it. */\nexport function createGlobalsTarget(root: HTMLElement, scope: string): GlobalsTarget & { dispose: () => void } {\n const doc = root.ownerDocument;\n let style: HTMLStyleElement | null = null;\n return {\n root,\n scope,\n style(css) {\n if (!style) {\n style = doc.createElement('style');\n style.setAttribute('data-fg-globals', scope);\n doc.head.append(style);\n }\n style.textContent = css;\n },\n dispose() {\n style?.remove();\n style = null;\n },\n };\n}\n","import { useVisibleRaf, type VisibleRafTarget } from '@weasel-js/core';\nimport { useEffect, useRef, useSyncExternalStore } from 'react';\nimport type { Clock } from './clock';\n\nconst NEVER = () => () => {};\nconst notPlaying = () => false;\n\n/** Drives `clock` from frames while it plays. Frames stop while the page or `target` is out of sight, and the time\n * spent there is dropped rather than arriving as one long frame. */\nexport function useClockLoop(clock: Clock | null, target?: VisibleRafTarget): void {\n const playing = useSyncExternalStore(clock?.subscribe ?? NEVER, clock ? () => clock.get().playing : notPlaying);\n const last = useRef<number | null>(null);\n const raf = useVisibleRaf(\n (now, raf) => {\n if (!clock) return;\n const prev = last.current;\n last.current = now;\n if (prev !== null) clock.tick(now - prev);\n if (clock.get().playing) raf.request();\n },\n {\n ...(target ? { target } : {}),\n onResume: () => {\n last.current = null;\n },\n },\n );\n useEffect(() => {\n if (!playing) return;\n last.current = null;\n raf.request();\n return () => raf.cancel();\n }, [playing, raf]);\n}\n","import { createEmitter } from '@weasel-js/registry';\n\n/** What a story declares to get a playhead. Times are in ms, as `@weasel-js/ui`'s timeline components take them. */\nexport interface TimelineSpec {\n /** How long the span runs. */\n duration: number;\n /** Where the span begins; below zero gives a lead-in before the story's zero. A fresh trial opens here. Default 0. */\n start?: number;\n /** Whether playing past the end wraps back to `start`. Default true. */\n loop?: boolean;\n /** Playback speed multiplier. Default 1. */\n rate?: number;\n}\n\n/** The span a playhead may stand in, in ms. */\nexport interface Span {\n start: number;\n end: number;\n}\n\n/** Everything a clock holds. */\nexport interface ClockState {\n /** The playhead, in ms, always inside `span`. */\n time: number;\n playing: boolean;\n loop: boolean;\n rate: number;\n span: Span;\n}\n\n/** A span replacing the declared one at runtime, as `StoryTimeline.setSpan` takes it. */\nexport type SpanOverride = Pick<TimelineSpec, 'duration' | 'start'>;\n\nexport function spanOf(spec: SpanOverride): Span {\n const start = Number.isFinite(spec.start) ? (spec.start as number) : 0;\n const duration = Number.isFinite(spec.duration) && spec.duration > 0 ? spec.duration : 0;\n return { start, end: start + duration };\n}\n\nexport function clampTime(span: Span, t: number): number {\n if (Number.isNaN(t)) return span.start;\n return Math.min(span.end, Math.max(span.start, t));\n}\n\n/** `state` after `elapsed` ms of wall time. Past the end it wraps when looping, and otherwise stops there, paused. */\nexport function advance(state: ClockState, elapsed: number): ClockState {\n if (!state.playing) return state;\n const { start, end } = state.span;\n const length = end - start;\n if (length <= 0) return { ...state, time: start, playing: false };\n const next = state.time + elapsed * state.rate;\n if (next <= end) return { ...state, time: next };\n if (!state.loop) return { ...state, time: end, playing: false };\n return { ...state, time: start + ((next - start) % length) };\n}\n\nconst validRate = (rate: number | undefined): rate is number => typeof rate === 'number' && Number.isFinite(rate) && rate > 0;\n\n/** A story's clock: its state as an external store, and the moves the transport and the story make on it. */\nexport interface Clock {\n get(): ClockState;\n subscribe(listener: () => void): () => void;\n play(): void;\n pause(): void;\n seek(time: number): void;\n /**\n * Pauses at `time`, asked for from outside the story — a URL, a persisted value — and keeps asking: every span\n * change clamps it afresh, so a span that only arrives later can still hold it, until play, a seek or another\n * request moves the playhead. Null asks for the span's start, wherever it ends up.\n */\n request(time: number | null): void;\n /** The requested time while the span cannot hold it yet, or null. Whatever echoes the playhead outward waits on it. */\n pending(): number | null;\n setLoop(loop: boolean): void;\n setRate(rate: number): void;\n /** Replaces the declared span until called with null. */\n setSpan(span: SpanOverride | null): void;\n /** The story's declaration changed, as after an edit or a new config. Only its span is taken up. */\n declare(spec: TimelineSpec): void;\n /** Advances a playing clock by `elapsed` ms of wall time. */\n tick(elapsed: number): void;\n}\n\n/** Where a request puts the playhead in `span`; null asks for its start. */\nconst placed = (span: Span, requested: number | null): number =>\n requested === null ? span.start : clampTime(span, requested);\n\n/** A clock for `spec`, paused at a request for `initial`, which is the span start when none is given. */\nexport function createClock(spec: TimelineSpec, initial?: number | null): Clock {\n let declared = spanOf(spec);\n let override: Span | null = null;\n // Until something moves the playhead it stands where it was asked to, re-placed in every new span, so a span set\n // after mount still opens at the start — or at a URL's time beyond the span declared before it.\n let requested: { time: number | null } | null = { time: initial ?? null };\n let state: ClockState = {\n time: placed(declared, requested.time),\n playing: false,\n loop: spec.loop ?? true,\n rate: validRate(spec.rate) ? spec.rate : 1,\n span: declared,\n };\n const changed = createEmitter();\n const pendingIn = (at: ClockState): number | null =>\n requested && requested.time !== null && requested.time !== at.time ? requested.time : null;\n // What echoes the playhead outward waits on a pending request, so its coming and going notifies as a move does.\n let pending = pendingIn(state);\n\n const set = (next: ClockState): void => {\n const nextPending = pendingIn(next);\n if (\n nextPending === pending &&\n next.time === state.time &&\n next.playing === state.playing &&\n next.loop === state.loop &&\n next.rate === state.rate &&\n next.span.start === state.span.start &&\n next.span.end === state.span.end\n )\n return;\n state = next;\n pending = nextPending;\n changed.emit();\n };\n const moved = (next: ClockState): void => {\n requested = null;\n set(next);\n };\n const respan = (): void => {\n const span = override ?? declared;\n set({ ...state, span, time: requested ? placed(span, requested.time) : clampTime(span, state.time) });\n };\n\n return {\n get: () => state,\n subscribe: changed.subscribe,\n play() {\n if (state.playing) return;\n // Playing from the end starts over, as a player's play button does.\n moved({ ...state, playing: true, time: state.time >= state.span.end ? state.span.start : state.time });\n },\n pause: () => set({ ...state, playing: false }),\n seek: (time) => moved({ ...state, time: clampTime(state.span, time) }),\n request(time) {\n requested = { time: Number.isNaN(time) ? null : time };\n set({ ...state, playing: false, time: placed(state.span, requested.time) });\n },\n pending: () => pending,\n setLoop: (loop) => set({ ...state, loop }),\n setRate(rate) {\n if (validRate(rate)) set({ ...state, rate });\n },\n setSpan(span) {\n override = span ? spanOf(span) : null;\n respan();\n },\n declare(next) {\n declared = spanOf(next);\n respan();\n },\n tick(elapsed) {\n if (state.playing) moved(advance(state, elapsed));\n },\n };\n}\n","import { useLatest } from '@weasel-js/core';\nimport { type ReactNode, useContext, useEffect, useState } from 'react';\nimport type { LoadedStory } from '../story/types';\nimport { type Clock, createClock, type TimelineSpec } from './clock';\nimport { ClockContext } from './context';\nimport { useClockLoop } from './useClockLoop';\n\n/**\n * A clock for a story declaring `spec`, kept across renders and redeclared when the span it declares changes. It is\n * made when a declaration appears and dropped when it goes, as an edit can do either. `initial` is read only when\n * the clock is made.\n */\nexport function useStoryClock(spec: TimelineSpec | null, initial: () => number | null): Clock | null {\n const [clock, setClock] = useState(() => (spec ? createClock(spec, initial()) : null));\n let current = clock;\n if (spec && !clock) {\n current = createClock(spec, initial());\n setClock(current);\n } else if (!spec && clock) {\n current = null;\n setClock(null);\n }\n const latest = useLatest(spec);\n const spanKey = spec ? `${spec.start ?? 0}:${spec.duration}` : null;\n useEffect(() => {\n if (current && latest.current) current.declare(latest.current);\n }, [current, spanKey, latest]);\n return current;\n}\n\nconst NO_INITIAL = () => null;\n\nfunction OwnClock({ spec, children }: { spec: TimelineSpec; children: ReactNode }) {\n const clock = useStoryClock(spec, NO_INITIAL);\n useClockLoop(clock);\n return <ClockContext.Provider value={clock}>{children}</ClockContext.Provider>;\n}\n\n/**\n * Gives a story declaring a timeline a clock of its own where nothing above supplies one — an index page, a frame, a\n * story test. It stands paused at the span's start, with no transport, until the story moves it.\n */\nexport function WithStoryClock({ story, config, children }: { story: LoadedStory; config: unknown; children: ReactNode }) {\n const outer = useContext(ClockContext);\n if (outer || !story.timeline) return children;\n return <OwnClock spec={story.timeline(config)}>{children}</OwnClock>;\n}\n","import { Component, type ReactNode } from 'react';\nimport type { Decorator, LoadedStory, StoryContext } from '../story/types';\nimport { WithStoryClock } from '../timeline/StoryClock';\n\nexport interface StoryHostProps {\n story: LoadedStory;\n ctx: StoryContext;\n /** Outermost decorators, from the frame setup. */\n decorators: readonly Decorator[];\n /** A change clears a caught error, so new input retries the render. */\n resetKey: number;\n onError: (error: unknown) => void;\n}\n\nfunction RenderStory({ story, ctx }: { story: LoadedStory; ctx: StoryContext }): ReactNode {\n return story.render(ctx);\n}\n\nfunction Decorated({ story, ctx, decorators }: Omit<StoryHostProps, 'resetKey' | 'onError'>): ReactNode {\n let inner: () => ReactNode = () => <RenderStory story={story} ctx={ctx} />;\n for (const decorate of [...story.decorators, ...decorators]) {\n const wrapped = inner;\n inner = () => decorate(wrapped, ctx);\n }\n return inner();\n}\n\ninterface BoundaryState {\n error: unknown;\n failed: boolean;\n resetKey: number;\n}\n\nexport class StoryHost extends Component<StoryHostProps, BoundaryState> {\n override state: BoundaryState = { error: null, failed: false, resetKey: this.props.resetKey };\n\n static getDerivedStateFromProps(props: StoryHostProps, state: BoundaryState): Partial<BoundaryState> | null {\n return props.resetKey === state.resetKey ? null : { error: null, failed: false, resetKey: props.resetKey };\n }\n\n static getDerivedStateFromError(error: unknown): Partial<BoundaryState> {\n return { error, failed: true };\n }\n\n override componentDidCatch(error: unknown): void {\n this.props.onError(error);\n }\n\n override render(): ReactNode {\n if (this.state.failed) {\n const { error } = this.state;\n return <pre className=\"fg-frame__fault\">{error instanceof Error ? error.message : String(error)}</pre>;\n }\n const { story, ctx, decorators } = this.props;\n return (\n <WithStoryClock story={story} config={ctx.config}>\n <Decorated story={story} ctx={ctx} decorators={decorators} />\n </WithStoryClock>\n );\n }\n}\n","import { type ConfigNode, type ConfigSchema, type ConfigShape, f } from '@weasel-js/labkit/config';\nimport { isPlainObject } from '@weasel-js/core';\nimport { iconFromData } from '@weasel-js/ui';\nimport { portSafePart } from './portSafe';\n\n/** Storybook's conditional control: shown only while an arg, or a global, meets the test. */\nexport type ArgCondition = ({ arg: string } | { global: string }) & {\n truthy?: boolean;\n exists?: boolean;\n eq?: unknown;\n neq?: unknown;\n};\n\n/** A CSF `argTypes` entry, as far as forge reads it. */\nexport interface ArgType {\n name?: string;\n description?: string;\n control?:\n | string\n | false\n | {\n type?: string;\n min?: number;\n max?: number;\n step?: number;\n /** forge's own: a qualified icon ref (`ui:variantSolid`) per option, drawn in place of its label. */\n icons?: Readonly<Record<string, string>>;\n };\n options?: readonly unknown[];\n table?: { disable?: boolean };\n if?: ArgCondition;\n}\n\ninterface Leaf extends ConfigNode<unknown> {\n hidden(): Leaf;\n describe(description: string): Leaf;\n label(name: string): Leaf;\n showIf(predicate: (config: Record<string, unknown>) => boolean): Leaf;\n}\n\ninterface Control {\n type: string | undefined;\n min?: number;\n max?: number;\n step?: number;\n icons?: Readonly<Record<string, string>>;\n}\n\nfunction controlOf(argType: ArgType): Control | false {\n const { control } = argType;\n if (control === false) return false;\n if (typeof control === 'string') return { type: control };\n return { type: control?.type, min: control?.min, max: control?.max, step: control?.step, icons: control?.icons };\n}\n\nfunction stringOptions(argType: ArgType): string[] | null {\n const opts = argType.options;\n return opts && opts.length > 0 && opts.every((o) => typeof o === 'string') ? (opts as string[]) : null;\n}\n\nfunction inferred(value: unknown): Leaf | null {\n switch (typeof value) {\n case 'number':\n return f.number(value);\n case 'boolean':\n return f.boolean(value);\n case 'string':\n return f.string(value);\n default:\n return Array.isArray(value) || isPlainObject(value) ? f.custom('json', value) : null;\n }\n}\n\nfunction bounded(node: ReturnType<typeof f.number>, control: Control) {\n let out = node;\n if (control.min !== undefined && control.max !== undefined) out = out.range(control.min, control.max);\n if (control.step !== undefined) out = out.step(control.step);\n return out;\n}\n\nfunction controlled(control: Control, argType: ArgType, has: boolean, value: unknown): Leaf | null {\n const options = stringOptions(argType);\n // Storybook passes an argTypes-only key as undefined, so the component's own default applies.\n const def = <T>() => (has ? value : undefined) as T;\n switch (control.type) {\n case 'number': {\n const node = bounded(f.number(def()), control);\n return control.min !== undefined && control.max !== undefined ? node.input() : node;\n }\n case 'range':\n case 'slider':\n return has ? bounded(f.number(def()), control).slider() : null;\n case 'boolean':\n return f.boolean(def());\n case 'switch':\n return f.boolean(def()).toggle();\n case 'text':\n case 'textarea':\n return f.string(def());\n case 'select':\n case 'radio':\n case 'inline-radio':\n case undefined: {\n if (!options) return control.type === undefined && has ? inferred(value) : null;\n const { icons } = control;\n const node = f.enum(\n def<string>(),\n icons ? options.map((value) => {\n const ref = iconFromData(icons[value]);\n return { value, label: value, ...(ref ? { icon: ref } : {}) };\n }) : options,\n );\n return control.type === 'radio' || control.type === 'inline-radio' ? node.radio() : node;\n }\n case 'object':\n return has ? f.custom('json', value) : null;\n default:\n return has ? inferred(value) : null;\n }\n}\n\n/** The config predicate for an `if`; null for a condition on a global, which a story's config does not hold. */\nfunction conditionOf(condition: ArgCondition): ((config: Record<string, unknown>) => boolean) | null {\n if (!('arg' in condition)) return null;\n const { arg } = condition;\n return (config) => {\n const value = config[arg];\n if (condition.exists !== undefined) return (value !== undefined) === condition.exists;\n if ('eq' in condition) return Object.is(value, condition.eq);\n if ('neq' in condition) return !Object.is(value, condition.neq);\n return Boolean(value) === (condition.truthy ?? true);\n };\n}\n\n/** `parameters.controls.matchers`: arg names that pick a control when the arg's argType names none. */\nexport interface ControlMatchers {\n color?: RegExp;\n /** labkit has no date leaf, so a date match keeps the leaf its value infers. */\n date?: RegExp;\n}\n\n/** Storybook's rule: a string arg with no control or options whose name matches `color` gets a color picker. */\nfunction matched(key: string, value: unknown, argType: ArgType | undefined, matchers: ControlMatchers): Leaf | null {\n if (typeof value !== 'string' || argType?.control !== undefined || stringOptions(argType ?? {})) return null;\n return matchers.color?.test(key) ? f.color(value) : null;\n}\n\n/** A labkit schema for a CSF story's args, refined by its `argTypes`. */\nexport function argsToSchema(\n args: Readonly<Record<string, unknown>>,\n argTypes: Readonly<Record<string, ArgType | undefined>>,\n matchers: ControlMatchers = {},\n): ConfigSchema<unknown> {\n const nodes: Record<string, Leaf> = {};\n for (const key of new Set([...Object.keys(args), ...Object.keys(argTypes)])) {\n const has = key in args;\n // A control carries only what crosses the port; the frame puts the rest back from `args` (`withUnsent`).\n const part = has ? portSafePart(args[key]) : null;\n if (has && !part) continue;\n const value = part?.value;\n const argType = argTypes[key];\n const control = argType ? controlOf(argType) : false;\n\n let node: Leaf | null =\n (has ? matched(key, value, argType, matchers) : null) ??\n (control ? controlled(control, argType ?? {}, has, value) : has ? inferred(value) : null);\n if (!node) continue;\n if (argType && (argType.control === false || argType.table?.disable)) node = node.hidden();\n if (argType?.description) node = node.describe(argType.description);\n if (argType?.name) node = node.label(argType.name);\n const shownWhen = argType?.if ? conditionOf(argType.if) : null;\n if (shownWhen) node = node.showIf(shownWhen);\n nodes[key] = node;\n }\n return f.schema(nodes as ConfigShape);\n}\n","import type { TimelineSpec } from './clock';\n\nconst isSpec = (value: unknown): value is TimelineSpec =>\n !!value && typeof value === 'object' && typeof (value as { duration?: unknown }).duration === 'number';\n\n/** A declared timeline as a function of config: a spec stands for itself at every config, a function is called with\n * the config. Anything else declares none. `adapt` turns the trial's config into what the function is handed. */\nexport function timelineOf(\n value: unknown,\n adapt: (config: unknown) => unknown = (config) => config,\n): ((config: unknown) => TimelineSpec) | null {\n if (isSpec(value)) return () => value;\n if (typeof value === 'function') return (config) => (value as (input: unknown) => TimelineSpec)(adapt(config));\n return null;\n}\n","import {\n type ComponentType,\n createContext,\n createElement,\n type Dispatch,\n type ReactNode,\n type SetStateAction,\n useContext,\n useEffect,\n useState,\n} from 'react';\nimport type { Globals, Layout, Viewport } from '../protocol/messages';\nimport { storyId, storyNameFromExport } from '../story/ids';\nimport type { Decorator, LoadedStory, PlayContext, StoryContext } from '../story/types';\nimport { type ArgsScope, ArgsContext, appliedLocal, coverOf, type LocalArgs } from './argsContext';\nimport { type ArgType, argsToSchema, type ControlMatchers } from './argsToSchema';\nimport { isPlainObject } from '@weasel-js/core';\nimport { withUnsent } from './portSafe';\nimport { PROP_ARG_TYPES_EXPORT } from './propArgTypes';\nimport { timelineOf } from '../timeline/declare';\n\ntype Args = Record<string, unknown>;\ntype CsfContext = {\n args: Args;\n globals: Globals;\n parameters: Record<string, unknown>;\n title: string;\n name: string;\n id: string;\n viewMode: 'story';\n};\ntype CsfRender = (args: Args, context: CsfContext) => ReactNode;\ntype CsfDecorator = (Story: ComponentType, context: CsfContext) => ReactNode;\ntype CsfPlay = (context: CsfContext & { canvasElement: HTMLElement; step: CsfStep }) => void | Promise<void>;\ntype CsfStep = (label: string, fn: () => void | Promise<void>) => Promise<void>;\n\ninterface Annotations {\n title?: string;\n name?: string;\n storyName?: string;\n component?: ComponentType<Args>;\n args?: Args;\n argTypes?: Record<string, ArgType>;\n parameters?: Record<string, unknown>;\n globals?: Record<string, unknown>;\n decorators?: CsfDecorator | CsfDecorator[];\n render?: CsfRender;\n play?: CsfPlay;\n includeStories?: string[] | RegExp;\n excludeStories?: string[] | RegExp;\n}\n\nconst LAYOUTS: readonly Layout[] = ['centered', 'padded', 'fullscreen'];\n\nconst asArray = <T,>(value: T | T[] | undefined): T[] => (value === undefined ? [] : Array.isArray(value) ? value : [value]);\n\n/** Storybook's `deleteUndefined`, which its args store applies after every update. */\nconst withoutUndefined = (args: Args): Args =>\n Object.fromEntries(Object.entries(args).filter(([, value]) => value !== undefined));\n\n/** Storybook's `matches` from `isExportStory`. */\nconst matches = (key: string, filter: string[] | RegExp) =>\n Array.isArray(filter) ? filter.includes(key) : key.match(filter) !== null;\n\n/** Storybook's `combineParameters`: plain objects merge deeply, anything else is replaced. */\nfunction combineParameters(...sources: (Record<string, unknown> | undefined)[]): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n for (const source of sources) {\n for (const [key, value] of Object.entries(source ?? {})) {\n if (value === undefined) continue;\n out[key] = isPlainObject(value) && isPlainObject(out[key]) ? combineParameters(out[key], value) : value;\n }\n }\n return out;\n}\n\nfunction resolveViewport(parameters: Record<string, unknown>, globals: Record<string, unknown>): Viewport | null {\n const selected = globals.viewport as { value?: string; isRotated?: boolean } | undefined;\n const options = (parameters.viewport as { options?: Record<string, { styles?: { width?: string; height?: string } }> } | undefined)\n ?.options;\n const styles = selected?.value ? options?.[selected.value]?.styles : undefined;\n const px = (v: string | undefined) => (v && /^\\d+(\\.\\d+)?px$/.test(v) ? Number.parseFloat(v) : Number.NaN);\n const width = px(styles?.width);\n const height = px(styles?.height);\n if (Number.isNaN(width) || Number.isNaN(height)) return null;\n return selected?.isRotated ? { width: height, height: width } : { width, height };\n}\n\nconst InnerStory = createContext<(() => ReactNode) | null>(null);\n\nfunction Story(): ReactNode {\n return useContext(InnerStory)?.() ?? null;\n}\n\nfunction Call({ fn }: { fn: () => ReactNode }): ReactNode {\n return fn();\n}\n\ninterface StoryLocals {\n story: string;\n local: LocalArgs;\n setLocal: Dispatch<SetStateAction<LocalArgs>>;\n}\n\nconst LocalArgsContext = createContext<StoryLocals | null>(null);\n\n/** The outermost scope of a story holds its frame-local args, so its decorators and render share them. */\nfunction Scoped({\n id,\n build,\n fn,\n}: {\n id: string;\n build: (local: StoryLocals) => [ArgsScope, CsfContext];\n fn: (context: CsfContext) => ReactNode;\n}): ReactNode {\n const outer = useContext(LocalArgsContext);\n const [local, setLocal] = useState<LocalArgs>({});\n const shared = outer?.story === id ? outer : { story: id, local, setLocal };\n const [scope, context] = build(shared);\n const { config } = scope;\n const prune = shared.setLocal;\n // An entry config has moved past must not come back if config later returns to the value it covered.\n useEffect(() => {\n prune((prev) => {\n const kept = Object.entries(prev).filter(([key, entry]) => coverOf(config[key]) === entry.over);\n return kept.length === Object.keys(prev).length ? prev : Object.fromEntries(kept);\n });\n }, [config, prune]);\n return createElement(\n LocalArgsContext.Provider,\n { value: shared },\n createElement(ArgsContext.Provider, { value: scope }, createElement(Call, { fn: () => fn(context) })),\n );\n}\n\n/**\n * Normalizes a Component Story Format module. `title` is the index entry's, which wins over the meta's own: the\n * index reads the meta without running it and falls back to the auto title for one it cannot read, so taking the\n * meta's here would give one story two ids. `parameters` are the project's, under the meta's and each story's.\n */\nexport function loadCsfModule(\n mod: Record<string, unknown>,\n title: string,\n projectParameters: Record<string, unknown> = {},\n): LoadedStory[] {\n const meta = (isPlainObject(mod.default) ? mod.default : {}) as Annotations;\n const stories: LoadedStory[] = [];\n const propArgTypes = isPlainObject(mod[PROP_ARG_TYPES_EXPORT]) ? (mod[PROP_ARG_TYPES_EXPORT] as Record<string, ArgType>) : undefined;\n\n for (const [exportName, value] of Object.entries(mod)) {\n if (exportName === PROP_ARG_TYPES_EXPORT) continue;\n if (exportName === 'default' || exportName === '__namedExportsOrder' || exportName === '__esModule') continue;\n if (meta.includeStories && !matches(exportName, meta.includeStories)) continue;\n if (meta.excludeStories && matches(exportName, meta.excludeStories)) continue;\n if (!value || (typeof value !== 'object' && typeof value !== 'function')) continue;\n\n // A CSF 2 function export hoists its annotations onto itself.\n const spec: Annotations = typeof value === 'function' ? { ...value, render: value as CsfRender } : (value as Annotations);\n const id = storyId(title, exportName);\n const name = spec.name || spec.storyName || storyNameFromExport(exportName);\n const args = { ...meta.args, ...spec.args };\n const parameters = combineParameters(projectParameters, meta.parameters, spec.parameters);\n const matchers = (parameters.controls as { matchers?: ControlMatchers } | undefined)?.matchers;\n const render = spec.render ?? meta.render;\n // A render that takes no args draws the same thing whatever a prop's control says.\n const fromProps = render === undefined || render.length > 0 ? propArgTypes : undefined;\n const config = argsToSchema(\n args,\n combineParameters(fromProps, meta.argTypes, spec.argTypes) as Record<string, ArgType>,\n isPlainObject(matchers) ? matchers : {},\n );\n const defaults = config.defaults() as Args;\n const storyGlobals = { ...meta.globals, ...spec.globals };\n const component = meta.component;\n const renderFn: CsfRender | undefined =\n render ?? (component ? (a) => createElement(component, a) : undefined);\n\n const withArgs = (config: Args): Args =>\n Object.fromEntries(\n Object.entries(withoutUndefined(config)).map(([key, value]) => [key, key in args ? withUnsent(value, args[key]) : value]),\n );\n const csfContext = (config: unknown, globals: Globals, local: LocalArgs = {}): CsfContext => ({\n args: withoutUndefined({ ...args, ...withArgs(config as Args), ...appliedLocal(local, config as Args) }),\n globals,\n parameters,\n title,\n name,\n id,\n viewMode: 'story',\n });\n const scoped = (ctx: StoryContext, fn: (context: CsfContext) => ReactNode): ReactNode =>\n createElement(Scoped, {\n id,\n build: ({ local, setLocal }: StoryLocals): [ArgsScope, CsfContext] => {\n const context = csfContext(ctx.config, ctx.globals, local);\n const scope: ArgsScope = {\n args: context.args,\n config: ctx.config as Args,\n defaults,\n original: args,\n setConfig: ctx.setConfig,\n setLocal,\n };\n return [scope, context];\n },\n fn,\n });\n\n const adapt =\n (decorator: CsfDecorator): Decorator =>\n (inner, ctx) =>\n createElement(\n InnerStory.Provider,\n { value: inner },\n scoped(ctx, (context) => decorator(Story, context)),\n );\n\n const layout = parameters.layout as Layout | undefined;\n const forgeParams = parameters.forge as { isolate?: unknown; timeline?: unknown } | undefined;\n const isolate = forgeParams?.isolate;\n const play = spec.play ?? meta.play;\n\n stories.push({\n id,\n title,\n name,\n exportName,\n config,\n initialState: null,\n render: (ctx) => {\n if (!renderFn) return null;\n return scoped(ctx, (context) => renderFn(context.args, context));\n },\n decorators: [...asArray(spec.decorators), ...asArray(meta.decorators)].map(adapt),\n layout: layout && LAYOUTS.includes(layout) ? layout : 'padded',\n viewport: resolveViewport(parameters, storyGlobals),\n isolate: typeof isolate === 'string' ? isolate : null,\n play: play\n ? ({ canvasElement, config, globals }: PlayContext) =>\n play({ ...csfContext(config, globals), canvasElement, step: async (_label, fn) => fn() })\n : null,\n timeline: timelineOf(forgeParams?.timeline, (config) => csfContext(config, {}).args),\n });\n }\n return stories;\n}\n","import { f } from '@weasel-js/labkit/config';\nimport { isNative } from './define';\nimport { storyId, storyNameFromExport } from './ids';\nimport { timelineOf } from '../timeline/declare';\nimport type { LoadedStory, MetaSpec, StorySpec } from './types';\n\n/**\n * Normalizes a module written with `meta` and `story`; exports that are not stories are skipped. `title` is the index\n * entry's, which wins over the meta's own: the index reads the meta without running it and can miss it, so taking\n * the meta's here would give one story two titles.\n */\nexport function loadNativeModule(mod: Record<string, unknown>, title: string): LoadedStory[] {\n const metaSpec: MetaSpec = isNative(mod.default, 'meta') ? (mod.default as MetaSpec) : {};\n const stories: LoadedStory[] = [];\n for (const [exportName, value] of Object.entries(mod)) {\n if (exportName === 'default' || !isNative(value, 'story')) continue;\n const spec = value as StorySpec<unknown, unknown>;\n stories.push({\n id: storyId(title, exportName),\n title,\n name: spec.name ?? storyNameFromExport(exportName),\n exportName,\n config: spec.config ?? f.schema({}),\n initialState: spec.state ?? null,\n render: spec.render,\n decorators: [...(spec.decorators ?? []), ...(metaSpec.decorators ?? [])],\n layout: spec.layout ?? metaSpec.layout ?? 'centered',\n viewport: spec.viewport ?? null,\n isolate: spec.isolate ?? metaSpec.isolate ?? null,\n play: spec.play ?? null,\n timeline: timelineOf(spec.timeline ?? metaSpec.timeline),\n });\n }\n return stories;\n}\n","import { loadCsfModule } from '../csf/loadCsfModule';\nimport { isNative } from './define';\nimport { loadNativeModule } from './native';\nimport type { IndexRender, LoadedStory } from './types';\n\n/**\n * A story module's stories: a module whose default export is a forge `meta` is native, anything else is CSF under\n * `parameters`. `title` is the module's index entry title, which every story takes as given.\n */\nexport function loadStories(\n mod: Record<string, unknown>,\n title: string,\n parameters?: Record<string, unknown>,\n): LoadedStory[] {\n return isNative(mod.default, 'meta')\n ? loadNativeModule(mod, title)\n : loadCsfModule(mod, title, parameters);\n}\n\n/** A module's own index page: a native meta's `index`, or a CSF meta's `parameters.forge.index`. */\nexport function indexRenderOf(mod: Record<string, unknown>): IndexRender | null {\n const meta = mod.default as { index?: unknown; parameters?: { forge?: { index?: unknown } } } | undefined;\n const render = isNative(meta, 'meta') ? meta?.index : meta?.parameters?.forge?.index;\n return typeof render === 'function' ? (render as IndexRender) : null;\n}\n","import { type RefObject, useEffect, useState } from 'react';\n\n/** How far past the viewport a trial's story stays mounted, so a small scroll back does not reload it. */\nexport const IN_VIEW_MARGIN = '50%';\n\n/**\n * Whether `ref`'s element lies within `margin` of its document's viewport; true where the browser cannot say.\n * Decided by where the element is, not by whether any of it shows: `isIntersecting` is false too for an element an\n * `overflow` ancestor clips away, as a narrow lab tile does to its content while the tiling changes. `initial` is\n * the answer before the browser has given one: false for content too costly to mount everywhere at once.\n */\nexport function useNearViewport(ref: RefObject<Element | null>, margin: string, initial = true): boolean {\n const [near, setNear] = useState(() => initial || typeof IntersectionObserver === 'undefined');\n useEffect(() => {\n const el = ref.current;\n if (!el || typeof IntersectionObserver === 'undefined') return;\n // A fresh observe always reports, wherever the element is.\n const recheck = () => {\n observer.unobserve(el);\n observer.observe(el);\n };\n let watching = false;\n const watch = (on: boolean) => {\n if (on === watching) return;\n watching = on;\n if (on) {\n document.addEventListener('scroll', recheck, { capture: true, passive: true });\n window.addEventListener('resize', recheck);\n } else {\n document.removeEventListener('scroll', recheck, { capture: true });\n window.removeEventListener('resize', recheck);\n }\n };\n const observer = new IntersectionObserver(\n (entries) => {\n const last = entries.at(-1);\n if (!last) return;\n const root = last.rootBounds;\n const box = last.boundingClientRect;\n setNear(\n root\n ? box.bottom >= root.top && box.top <= root.bottom && box.right >= root.left && box.left <= root.right\n : last.isIntersecting,\n );\n // While nothing of it intersects, a clip can hide every move from the observer, so ask again on each scroll.\n watch(Boolean(root) && !last.isIntersecting);\n },\n { root: document, rootMargin: margin },\n );\n observer.observe(el);\n return () => {\n observer.disconnect();\n watch(false);\n };\n }, [ref, margin]);\n return near;\n}\n"]}
@@ -1,15 +1,25 @@
1
- import { useNearViewport, StoryHost } from './chunk-4NM3RTYK.js';
1
+ import { useNearViewport, StoryHost } from './chunk-NVNTQ4AT.js';
2
2
  import { sanitize } from './chunk-ZAWXMUGZ.js';
3
- import { PROTOCOL_VERSION } from './chunk-FL2MUPUL.js';
3
+ import { PROTOCOL_VERSION } from './chunk-2OJAV522.js';
4
+ import { createRoot } from 'react-dom/client';
5
+ import { IconRegistryProvider, isPlainObject } from '@weasel-js/core';
6
+ import { kitIcons } from '@weasel-js/ui/kit-icons';
7
+ import { jsx, jsxs } from 'react/jsx-runtime';
4
8
  import { f, resolveConfigSchema, isEntryShown, isConfigBranch, schemaNodeAtPath, titleCase } from '@weasel-js/labkit/config';
5
9
  import { createEmitter } from '@weasel-js/registry';
6
10
  import { createContext, useContext, useMemo, useState, useRef, useEffect, useId } from 'react';
7
11
  import { Badge } from '@weasel-js/ui/components/Badge';
8
- import { jsx, jsxs } from 'react/jsx-runtime';
9
12
  import { Button } from '@weasel-js/ui/components/Button';
10
- import { isPlainObject } from '@weasel-js/core';
11
13
  import num from '@weasel-js/theme/numeric.module.css';
12
14
 
15
+ function createKitRoot(container, extra = []) {
16
+ const root = createRoot(container);
17
+ const icons = extra.length > 0 ? [...kitIcons, ...extra] : kitIcons;
18
+ return {
19
+ render: (node) => root.render(/* @__PURE__ */ jsx(IconRegistryProvider, { icons, children: node })),
20
+ unmount: () => root.unmount()
21
+ };
22
+ }
13
23
  var joinPath = (at, key) => at === "" ? key : `${at}.${key}`;
14
24
  function describeShape(shape) {
15
25
  const out = {};
@@ -394,6 +404,6 @@ function IndexPage({ env, render }) {
394
404
  return /* @__PURE__ */ jsx(IndexEnvContext.Provider, { value: env, children: render ? render(indexContext(env)) : /* @__PURE__ */ jsx(DefaultIndex, {}) });
395
405
  }
396
406
 
397
- export { IndexPage, LibrariesContext, LibraryBadge, TITLE_LIBRARIES, answerSchema, describeSchema, indexEntries, indexId, isIndexId, librariesFrom, openChannel, schemaFromDescription };
398
- //# sourceMappingURL=chunk-V4RI7GWD.js.map
399
- //# sourceMappingURL=chunk-V4RI7GWD.js.map
407
+ export { IndexPage, LibrariesContext, LibraryBadge, TITLE_LIBRARIES, answerSchema, createKitRoot, describeSchema, indexEntries, indexId, isIndexId, librariesFrom, openChannel, schemaFromDescription };
408
+ //# sourceMappingURL=chunk-R5F44ECM.js.map
409
+ //# sourceMappingURL=chunk-R5F44ECM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/kitIcons.tsx","../src/protocol/schema.ts","../src/protocol/channel.ts","../src/story/indexPages.ts","../src/story/library.ts","../src/frame/index/LibraryBadge.tsx","../src/frame/index/variants.ts","../src/frame/index/IndexPage.tsx"],"names":["jsx","resolveConfigSchema","isEntryShown","isConfigBranch","createContext","useContext","Badge"],"mappings":"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","file":"chunk-R5F44ECM.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 { sanitize } from './ids';\nimport type { IndexEntry } from './types';\n\nconst SUFFIX = ':index';\n\n/** The name an index page goes by in the sidebar and in its trial's title. */\nexport const INDEX_NAME = 'Index';\n\n/** The id of `title`'s index page. A colon never survives `sanitize`, so no story id can collide with it. */\nexport function indexId(title: string): string {\n return `${sanitize(title)}${SUFFIX}`;\n}\n\nexport function isIndexId(id: string): boolean {\n return id.endsWith(SUFFIX);\n}\n\n/**\n * One index-page entry per title in `stories`, in the order titles first appear. It routes and runs like a story:\n * its `file` is the title's first story file, its descriptions are the title's own, and its tags are those every story\n * of the title carries.\n */\nexport function indexEntries(stories: readonly IndexEntry[]): IndexEntry[] {\n const byTitle = new Map<string, IndexEntry>();\n for (const entry of stories) {\n const page = byTitle.get(entry.title);\n if (page) {\n if (page.tags) {\n const common = page.tags.filter((tag) => entry.tags?.includes(tag));\n if (common.length > 0) page.tags = common;\n else delete page.tags;\n }\n continue;\n }\n byTitle.set(entry.title, {\n id: indexId(entry.title),\n title: entry.title,\n name: INDEX_NAME,\n exportName: '',\n file: entry.file,\n ...(entry.componentDescription === undefined ? {} : { componentDescription: entry.componentDescription }),\n ...(entry.componentName === undefined ? {} : { componentName: entry.componentName }),\n ...(entry.tags === undefined ? {} : { tags: entry.tags }),\n });\n }\n return [...byTitle.values()];\n}\n","import type { StanceProps } from '@weasel-js/ui';\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 tone of the library's badge, as a `<Badge>` takes one. Default: the badge's own muted tone. */\n tone?: StanceProps['tone'];\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 toneOf(label: string): StanceProps['tone'];\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 toneOf: (label) => table.find((library) => library.label === label)?.tone,\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","// 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 tone the project gave that library. */\nexport function LibraryBadge({ library, className }: { library: string; className?: string }) {\n const tone = useContext(LibrariesContext).toneOf(library);\n return (\n <Badge status=\"muted\" {...(tone === undefined ? {} : { tone })} 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 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 { Button } from '@weasel-js/ui/components/Button';\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 { 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 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. */\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={row.label}>\n <h4 className=\"fg-index-variants__label\">{row.label}</h4>\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 status=\"accent\" variant=\"subtle\" size=\"sm\">\n Gallery\n </Badge>\n );\n}\n\nfunction DependencyList({ label, titles, empty }: { label: string; titles: readonly string[]; empty: string }) {\n const env = useEnv();\n const labelId = useId();\n const follow = (event: MouseEvent, id: string) => {\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 <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 const id = indexId(title);\n return (\n <li key={title}>\n <a className=\"fg-index-deps__link\" href={`#/${encodeURIComponent(id)}`} onClick={(event) => follow(event, id)}>\n <span className=\"fg-index-deps__prefix\">{title.slice(0, cut)}</span>\n {title.slice(cut)}\n </a>\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 }: { label: string; iso: string }) {\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>\n </dd>\n </div>\n );\n}\n\n/** The release the component first shipped in, and when its source file was created and last changed, 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 <div className=\"fg-index-history__item\">\n <dt className=\"fg-index-history__label\">Since</dt>\n <dd className={`fg-index-history__value ${num.numeric}`}>{history.introduced ?? 'Unreleased'}</dd>\n </div>\n <HistoryDate label=\"Created\" iso={history.created} />\n <HistoryDate label=\"Modified\" iso={history.modified} />\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 return (\n <section className=\"fg-index-story\" aria-labelledby={headingId}>\n <header className=\"fg-index-story__head\">\n <h2 id={headingId} className=\"fg-index-story__name\">\n {story.name}\n </h2>\n {gallery ? <GalleryBadge /> : null}\n <Button variant=\"secondary\" size=\"sm\" onClick={() => env.open(story.id)}>\n Open\n </Button>\n </header>\n {description ? <p className=\"fg-index-story__description\">{description}</p> : null}\n <IndexStory story={story} />\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. Stories of one CSF file share their\n * meta's controls, and the same rows under every story would only repeat. */\nfunction firstOfEachControlSet(stories: readonly LoadedStory[]): Set<string> {\n const seen = new Set<string>();\n const shown = new Set<string>();\n for (const story of stories) {\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.stories]);\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 ? <p className=\"fg-index__description\">{env.description}</p> : 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,4 +1,4 @@
1
- import { stableStringify } from './chunk-FL2MUPUL.js';
1
+ import { stableStringify } from './chunk-2OJAV522.js';
2
2
  import { createContext } from 'react';
3
3
  import { isPlainObject } from '@weasel-js/core';
4
4
 
@@ -93,5 +93,5 @@ function withUnsent(sent, original) {
93
93
  }
94
94
 
95
95
  export { ArgsContext, appliedLocal, coverOf, isPortSafe, portSafePart, withUnsent };
96
- //# sourceMappingURL=chunk-GB6PRJET.js.map
97
- //# sourceMappingURL=chunk-GB6PRJET.js.map
96
+ //# sourceMappingURL=chunk-SQ4KCIEH.js.map
97
+ //# sourceMappingURL=chunk-SQ4KCIEH.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/csf/argsContext.ts","../src/csf/portSafe.ts"],"names":[],"mappings":"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","file":"chunk-GB6PRJET.js","sourcesContent":["import { type Context, createContext, type Dispatch, type SetStateAction } from 'react';\nimport { stableStringify } from '../protocol/messages';\n\ntype Args = Record<string, unknown>;\n\n/** A frame-local arg, and the config value it was set over: it applies only while config still holds that. */\nexport interface LocalArg {\n value: unknown;\n over: string;\n}\n\nexport type LocalArgs = Record<string, LocalArg>;\n\n/** A config value in the form `LocalArg.over` records. */\nexport const coverOf = (value: unknown): string => stableStringify(value) ?? ' undefined';\n\n/** The frame-local values that still apply over `config`. */\nexport const appliedLocal = (local: LocalArgs, config: Args): Args =>\n Object.fromEntries(\n Object.entries(local)\n .filter(([key, entry]) => coverOf(config[key]) === entry.over)\n .map(([key, entry]) => [key, entry.value]),\n );\n\nexport interface ArgsScope {\n /** The args the story renders with: its own, then config, then the frame-local ones that still apply. */\n args: Args;\n /** The trial's config as it stands. An `undefined` key means the story's own arg. */\n config: Args;\n defaults: Args;\n /** The story's own args, before config and the frame-local ones. */\n original: Args;\n setConfig: (path: string, value: unknown) => void;\n /** Args a MessagePort would not deliver intact, kept in the frame because config crosses one. */\n setLocal: Dispatch<SetStateAction<LocalArgs>>;\n}\n\nexport const ArgsContext: Context<ArgsScope | null> = createContext<ArgsScope | null>(null);\n","import { isPlainObject } from '@weasel-js/core';\n\nconst g = globalThis as Record<string, unknown>;\nconst CLONED_WHOLE = new Set<unknown>(\n [\n 'Date',\n 'RegExp',\n 'ArrayBuffer',\n 'DataView',\n 'Int8Array',\n 'Uint8Array',\n 'Uint8ClampedArray',\n 'Int16Array',\n 'Uint16Array',\n 'Int32Array',\n 'Uint32Array',\n 'Float16Array',\n 'Float32Array',\n 'Float64Array',\n 'BigInt64Array',\n 'BigUint64Array',\n ]\n .map((name) => (g[name] as { prototype?: object } | undefined)?.prototype)\n .filter(Boolean),\n);\n\n/** Own keys a clone keeps: enumerable string keys, plus an array's `length`. */\nconst hasOnlyClonedKeys = (v: object): boolean =>\n Reflect.ownKeys(v).every(\n (key) =>\n typeof key === 'string' &&\n (Object.prototype.propertyIsEnumerable.call(v, key) || (Array.isArray(v) && key === 'length')),\n );\n\n/**\n * Whether a MessagePort delivers `value` as the same thing it was. `structuredClone` succeeding is\n * not enough: it copies a class instance's fields onto a plain object and drops its methods.\n */\nexport function isPortSafe(value: unknown): boolean {\n const seen = new Set<object>();\n const safe = (v: unknown): boolean => {\n if (v === null) return true;\n if (typeof v !== 'object') return typeof v !== 'function' && typeof v !== 'symbol';\n if (seen.has(v)) return true;\n seen.add(v);\n const proto = Object.getPrototypeOf(v);\n if (CLONED_WHOLE.has(proto)) return true;\n if (proto === Map.prototype)\n return hasOnlyClonedKeys(v) && [...(v as Map<unknown, unknown>)].every(([key, member]) => safe(key) && safe(member));\n if (proto === Set.prototype) return hasOnlyClonedKeys(v) && [...(v as Set<unknown>)].every(safe);\n if (proto !== Array.prototype && proto !== Object.prototype && proto !== null) return false;\n return hasOnlyClonedKeys(v) && Object.values(v).every(safe);\n };\n try {\n return safe(value);\n } catch {\n return false;\n }\n}\n\n/** A plain object or array whose members can be split: React elements are plain objects, but whole. */\nconst splittable = (v: unknown): v is Record<string, unknown> | unknown[] =>\n (Array.isArray(v) ? Object.getPrototypeOf(v) === Array.prototype : isPlainObject(v) && !('$$typeof' in v)) &&\n hasOnlyClonedKeys(v as object);\n\n/**\n * The part of `value` a port delivers intact, or null when none of it can cross. A plain object\n * keeps its port-safe fields; an array holds null where a member has no part.\n */\nexport function portSafePart(value: unknown): { value: unknown } | null {\n const walking = new Set<object>();\n const part = (v: unknown): { value: unknown } | null => {\n if (isPortSafe(v)) return { value: v };\n if (!splittable(v) || walking.has(v)) return null;\n walking.add(v);\n try {\n if (Array.isArray(v)) return { value: v.map((member) => part(member)?.value ?? null) };\n const out: Record<string, unknown> = {};\n for (const [key, member] of Object.entries(v)) {\n const kept = part(member);\n if (kept) out[key] = kept.value;\n }\n return { value: out };\n } finally {\n walking.delete(v);\n }\n };\n try {\n return part(value);\n } catch {\n return null;\n }\n}\n\n/** `sent`, a value that crossed the port as `portSafePart(original)` or an edit of it, with what the part left behind put back. */\nexport function withUnsent(sent: unknown, original: unknown): unknown {\n if (isPortSafe(original)) return sent;\n if (sent === null && portSafePart(original) === null) return original;\n if (Array.isArray(original) && Array.isArray(sent))\n return sent.map((member, i) => (i < original.length ? withUnsent(member, original[i]) : member));\n if (!splittable(original) || Array.isArray(original) || !isPlainObject(sent)) return sent;\n const out: Record<string, unknown> = {};\n for (const [key, member] of Object.entries(original)) {\n if (key in sent) out[key] = withUnsent(sent[key], member);\n else if (portSafePart(member) === null) out[key] = member;\n }\n for (const [key, member] of Object.entries(sent)) if (!(key in original)) out[key] = member;\n return out;\n}\n"]}
1
+ {"version":3,"sources":["../src/csf/argsContext.ts","../src/csf/portSafe.ts"],"names":[],"mappings":";;;;AAcO,IAAM,OAAA,GAAU,CAAC,KAAA,KAA2B,eAAA,CAAgB,KAAK,CAAA,IAAK;AAGtE,IAAM,YAAA,GAAe,CAAC,KAAA,EAAkB,MAAA,KAC7C,MAAA,CAAO,WAAA;AAAA,EACL,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,CACjB,MAAA,CAAO,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM,OAAA,CAAQ,MAAA,CAAO,GAAG,CAAC,CAAA,KAAM,KAAA,CAAM,IAAI,CAAA,CAC5D,GAAA,CAAI,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM,CAAC,GAAA,EAAK,KAAA,CAAM,KAAK,CAAC;AAC7C;AAeK,IAAM,WAAA,GAAyC,cAAgC,IAAI;ACnC1F,IAAM,CAAA,GAAI,UAAA;AACV,IAAM,eAAe,IAAI,GAAA;AAAA,EACvB;AAAA,IACE,MAAA;AAAA,IACA,QAAA;AAAA,IACA,aAAA;AAAA,IACA,UAAA;AAAA,IACA,WAAA;AAAA,IACA,YAAA;AAAA,IACA,mBAAA;AAAA,IACA,YAAA;AAAA,IACA,aAAA;AAAA,IACA,YAAA;AAAA,IACA,aAAA;AAAA,IACA,cAAA;AAAA,IACA,cAAA;AAAA,IACA,cAAA;AAAA,IACA,eAAA;AAAA,IACA;AAAA,GACF,CACG,GAAA,CAAI,CAAC,IAAA,KAAU,CAAA,CAAE,IAAI,CAAA,EAA0C,SAAS,CAAA,CACxE,MAAA,CAAO,OAAO;AACnB,CAAA;AAGA,IAAM,oBAAoB,CAAC,CAAA,KACzB,OAAA,CAAQ,OAAA,CAAQ,CAAC,CAAA,CAAE,KAAA;AAAA,EACjB,CAAC,GAAA,KACC,OAAO,GAAA,KAAQ,QAAA,KACd,OAAO,SAAA,CAAU,oBAAA,CAAqB,IAAA,CAAK,CAAA,EAAG,GAAG,CAAA,IAAM,KAAA,CAAM,OAAA,CAAQ,CAAC,KAAK,GAAA,KAAQ,QAAA;AACxF,CAAA;AAMK,SAAS,WAAW,KAAA,EAAyB;AAClD,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,EAAA,MAAM,IAAA,GAAO,CAAC,CAAA,KAAwB;AACpC,IAAA,IAAI,CAAA,KAAM,MAAM,OAAO,IAAA;AACvB,IAAA,IAAI,OAAO,MAAM,QAAA,EAAU,OAAO,OAAO,CAAA,KAAM,UAAA,IAAc,OAAO,CAAA,KAAM,QAAA;AAC1E,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,EAAG,OAAO,IAAA;AACxB,IAAA,IAAA,CAAK,IAAI,CAAC,CAAA;AACV,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,cAAA,CAAe,CAAC,CAAA;AACrC,IAAA,IAAI,YAAA,CAAa,GAAA,CAAI,KAAK,CAAA,EAAG,OAAO,IAAA;AACpC,IAAA,IAAI,UAAU,GAAA,CAAI,SAAA;AAChB,MAAA,OAAO,kBAAkB,CAAC,CAAA,IAAK,CAAC,GAAI,CAA2B,EAAE,KAAA,CAAM,CAAC,CAAC,GAAA,EAAK,MAAM,CAAA,KAAM,IAAA,CAAK,GAAG,CAAA,IAAK,IAAA,CAAK,MAAM,CAAC,CAAA;AACrH,IAAA,IAAI,KAAA,KAAU,GAAA,CAAI,SAAA,EAAW,OAAO,iBAAA,CAAkB,CAAC,CAAA,IAAK,CAAC,GAAI,CAAkB,CAAA,CAAE,KAAA,CAAM,IAAI,CAAA;AAC/F,IAAA,IAAI,KAAA,KAAU,MAAM,SAAA,IAAa,KAAA,KAAU,OAAO,SAAA,IAAa,KAAA,KAAU,MAAM,OAAO,KAAA;AACtF,IAAA,OAAO,iBAAA,CAAkB,CAAC,CAAA,IAAK,MAAA,CAAO,OAAO,CAAC,CAAA,CAAE,MAAM,IAAI,CAAA;AAAA,EAC5D,CAAA;AACA,EAAA,IAAI;AACF,IAAA,OAAO,KAAK,KAAK,CAAA;AAAA,EACnB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAGA,IAAM,UAAA,GAAa,CAAC,CAAA,KAAA,CACjB,KAAA,CAAM,QAAQ,CAAC,CAAA,GAAI,OAAO,cAAA,CAAe,CAAC,MAAM,KAAA,CAAM,SAAA,GAAY,cAAc,CAAC,CAAA,IAAK,EAAE,UAAA,IAAc,CAAA,CAAA,KACvG,kBAAkB,CAAW,CAAA;AAMxB,SAAS,aAAa,KAAA,EAA2C;AACtE,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAY;AAChC,EAAA,MAAM,IAAA,GAAO,CAAC,CAAA,KAA0C;AACtD,IAAA,IAAI,WAAW,CAAC,CAAA,EAAG,OAAO,EAAE,OAAO,CAAA,EAAE;AACrC,IAAA,IAAI,CAAC,WAAW,CAAC,CAAA,IAAK,QAAQ,GAAA,CAAI,CAAC,GAAG,OAAO,IAAA;AAC7C,IAAA,OAAA,CAAQ,IAAI,CAAC,CAAA;AACb,IAAA,IAAI;AACF,MAAA,IAAI,MAAM,OAAA,CAAQ,CAAC,CAAA,EAAG,OAAO,EAAE,KAAA,EAAO,CAAA,CAAE,GAAA,CAAI,CAAC,WAAW,IAAA,CAAK,MAAM,CAAA,EAAG,KAAA,IAAS,IAAI,CAAA,EAAE;AACrF,MAAA,MAAM,MAA+B,EAAC;AACtC,MAAA,KAAA,MAAW,CAAC,GAAA,EAAK,MAAM,KAAK,MAAA,CAAO,OAAA,CAAQ,CAAC,CAAA,EAAG;AAC7C,QAAA,MAAM,IAAA,GAAO,KAAK,MAAM,CAAA;AACxB,QAAA,IAAI,IAAA,EAAM,GAAA,CAAI,GAAG,CAAA,GAAI,IAAA,CAAK,KAAA;AAAA,MAC5B;AACA,MAAA,OAAO,EAAE,OAAO,GAAA,EAAI;AAAA,IACtB,CAAA,SAAE;AACA,MAAA,OAAA,CAAQ,OAAO,CAAC,CAAA;AAAA,IAClB;AAAA,EACF,CAAA;AACA,EAAA,IAAI;AACF,IAAA,OAAO,KAAK,KAAK,CAAA;AAAA,EACnB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAGO,SAAS,UAAA,CAAW,MAAe,QAAA,EAA4B;AACpE,EAAA,IAAI,UAAA,CAAW,QAAQ,CAAA,EAAG,OAAO,IAAA;AACjC,EAAA,IAAI,SAAS,IAAA,IAAQ,YAAA,CAAa,QAAQ,CAAA,KAAM,MAAM,OAAO,QAAA;AAC7D,EAAA,IAAI,MAAM,OAAA,CAAQ,QAAQ,CAAA,IAAK,KAAA,CAAM,QAAQ,IAAI,CAAA;AAC/C,IAAA,OAAO,IAAA,CAAK,GAAA,CAAI,CAAC,MAAA,EAAQ,MAAO,CAAA,GAAI,QAAA,CAAS,MAAA,GAAS,UAAA,CAAW,MAAA,EAAQ,QAAA,CAAS,CAAC,CAAC,IAAI,MAAO,CAAA;AACjG,EAAA,IAAI,CAAC,UAAA,CAAW,QAAQ,CAAA,IAAK,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,IAAK,CAAC,aAAA,CAAc,IAAI,CAAA,EAAG,OAAO,IAAA;AACrF,EAAA,MAAM,MAA+B,EAAC;AACtC,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,MAAM,KAAK,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAA,EAAG;AACpD,IAAA,IAAI,GAAA,IAAO,MAAM,GAAA,CAAI,GAAG,IAAI,UAAA,CAAW,IAAA,CAAK,GAAG,CAAA,EAAG,MAAM,CAAA;AAAA,SAAA,IAC/C,aAAa,MAAM,CAAA,KAAM,IAAA,EAAM,GAAA,CAAI,GAAG,CAAA,GAAI,MAAA;AAAA,EACrD;AACA,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,MAAM,CAAA,IAAK,OAAO,OAAA,CAAQ,IAAI,CAAA,EAAG,IAAI,EAAE,GAAA,IAAO,QAAA,CAAA,EAAW,GAAA,CAAI,GAAG,CAAA,GAAI,MAAA;AACrF,EAAA,OAAO,GAAA;AACT","file":"chunk-SQ4KCIEH.js","sourcesContent":["import { type Context, createContext, type Dispatch, type SetStateAction } from 'react';\nimport { stableStringify } from '../protocol/messages';\n\ntype Args = Record<string, unknown>;\n\n/** A frame-local arg, and the config value it was set over: it applies only while config still holds that. */\nexport interface LocalArg {\n value: unknown;\n over: string;\n}\n\nexport type LocalArgs = Record<string, LocalArg>;\n\n/** A config value in the form `LocalArg.over` records. */\nexport const coverOf = (value: unknown): string => stableStringify(value) ?? ' undefined';\n\n/** The frame-local values that still apply over `config`. */\nexport const appliedLocal = (local: LocalArgs, config: Args): Args =>\n Object.fromEntries(\n Object.entries(local)\n .filter(([key, entry]) => coverOf(config[key]) === entry.over)\n .map(([key, entry]) => [key, entry.value]),\n );\n\nexport interface ArgsScope {\n /** The args the story renders with: its own, then config, then the frame-local ones that still apply. */\n args: Args;\n /** The trial's config as it stands. An `undefined` key means the story's own arg. */\n config: Args;\n defaults: Args;\n /** The story's own args, before config and the frame-local ones. */\n original: Args;\n setConfig: (path: string, value: unknown) => void;\n /** Args a MessagePort would not deliver intact, kept in the frame because config crosses one. */\n setLocal: Dispatch<SetStateAction<LocalArgs>>;\n}\n\nexport const ArgsContext: Context<ArgsScope | null> = createContext<ArgsScope | null>(null);\n","import { isPlainObject } from '@weasel-js/core';\n\nconst g = globalThis as Record<string, unknown>;\nconst CLONED_WHOLE = new Set<unknown>(\n [\n 'Date',\n 'RegExp',\n 'ArrayBuffer',\n 'DataView',\n 'Int8Array',\n 'Uint8Array',\n 'Uint8ClampedArray',\n 'Int16Array',\n 'Uint16Array',\n 'Int32Array',\n 'Uint32Array',\n 'Float16Array',\n 'Float32Array',\n 'Float64Array',\n 'BigInt64Array',\n 'BigUint64Array',\n ]\n .map((name) => (g[name] as { prototype?: object } | undefined)?.prototype)\n .filter(Boolean),\n);\n\n/** Own keys a clone keeps: enumerable string keys, plus an array's `length`. */\nconst hasOnlyClonedKeys = (v: object): boolean =>\n Reflect.ownKeys(v).every(\n (key) =>\n typeof key === 'string' &&\n (Object.prototype.propertyIsEnumerable.call(v, key) || (Array.isArray(v) && key === 'length')),\n );\n\n/**\n * Whether a MessagePort delivers `value` as the same thing it was. `structuredClone` succeeding is\n * not enough: it copies a class instance's fields onto a plain object and drops its methods.\n */\nexport function isPortSafe(value: unknown): boolean {\n const seen = new Set<object>();\n const safe = (v: unknown): boolean => {\n if (v === null) return true;\n if (typeof v !== 'object') return typeof v !== 'function' && typeof v !== 'symbol';\n if (seen.has(v)) return true;\n seen.add(v);\n const proto = Object.getPrototypeOf(v);\n if (CLONED_WHOLE.has(proto)) return true;\n if (proto === Map.prototype)\n return hasOnlyClonedKeys(v) && [...(v as Map<unknown, unknown>)].every(([key, member]) => safe(key) && safe(member));\n if (proto === Set.prototype) return hasOnlyClonedKeys(v) && [...(v as Set<unknown>)].every(safe);\n if (proto !== Array.prototype && proto !== Object.prototype && proto !== null) return false;\n return hasOnlyClonedKeys(v) && Object.values(v).every(safe);\n };\n try {\n return safe(value);\n } catch {\n return false;\n }\n}\n\n/** A plain object or array whose members can be split: React elements are plain objects, but whole. */\nconst splittable = (v: unknown): v is Record<string, unknown> | unknown[] =>\n (Array.isArray(v) ? Object.getPrototypeOf(v) === Array.prototype : isPlainObject(v) && !('$$typeof' in v)) &&\n hasOnlyClonedKeys(v as object);\n\n/**\n * The part of `value` a port delivers intact, or null when none of it can cross. A plain object\n * keeps its port-safe fields; an array holds null where a member has no part.\n */\nexport function portSafePart(value: unknown): { value: unknown } | null {\n const walking = new Set<object>();\n const part = (v: unknown): { value: unknown } | null => {\n if (isPortSafe(v)) return { value: v };\n if (!splittable(v) || walking.has(v)) return null;\n walking.add(v);\n try {\n if (Array.isArray(v)) return { value: v.map((member) => part(member)?.value ?? null) };\n const out: Record<string, unknown> = {};\n for (const [key, member] of Object.entries(v)) {\n const kept = part(member);\n if (kept) out[key] = kept.value;\n }\n return { value: out };\n } finally {\n walking.delete(v);\n }\n };\n try {\n return part(value);\n } catch {\n return null;\n }\n}\n\n/** `sent`, a value that crossed the port as `portSafePart(original)` or an edit of it, with what the part left behind put back. */\nexport function withUnsent(sent: unknown, original: unknown): unknown {\n if (isPortSafe(original)) return sent;\n if (sent === null && portSafePart(original) === null) return original;\n if (Array.isArray(original) && Array.isArray(sent))\n return sent.map((member, i) => (i < original.length ? withUnsent(member, original[i]) : member));\n if (!splittable(original) || Array.isArray(original) || !isPlainObject(sent)) return sent;\n const out: Record<string, unknown> = {};\n for (const [key, member] of Object.entries(original)) {\n if (key in sent) out[key] = withUnsent(sent[key], member);\n else if (portSafePart(member) === null) out[key] = member;\n }\n for (const [key, member] of Object.entries(sent)) if (!(key in original)) out[key] = member;\n return out;\n}\n"]}
@@ -1,8 +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-UeTY7ubF.js';
5
- import { IconName, StanceProps } from '@weasel-js/ui';
4
+ import { G as Globals, F as FrameSetup } from './FrameController-BRhShqut.js';
5
+ import { IconRef } from '@weasel-js/icons';
6
+ import { StanceProps } from '@weasel-js/ui';
6
7
 
7
8
  /** One global the workshop's toolbar sets for every story, and a trial may pin for its own. */
8
9
  interface GlobalDeclaration {
@@ -14,8 +15,8 @@ interface GlobalDeclaration {
14
15
  default: string;
15
16
  /** Another global's key: the toolbar shows this one in a popover beside that one rather than in the bar itself. */
16
17
  under?: string;
17
- /** The glyph on the button opening the globals declared `under` this one. Default `tune`. */
18
- icon?: IconName;
18
+ /** The glyph on the button opening the globals declared `under` this one. Default `core:tune`. */
19
+ icon?: IconRef;
19
20
  /**
20
21
  * Whether the toolbar offers `value` given the lab's other values; every option shows when absent. `globals` is
21
22
  * resolved without any declaration's `shows`, so one `shows` cannot depend on another's outcome.
@@ -1,5 +1,5 @@
1
- import { ArgsContext, coverOf, isPortSafe } from '../chunk-GB6PRJET.js';
2
- import '../chunk-FL2MUPUL.js';
1
+ import { ArgsContext, coverOf, isPortSafe } from '../chunk-SQ4KCIEH.js';
2
+ import '../chunk-2OJAV522.js';
3
3
  import { useContext } from 'react';
4
4
 
5
5
  var sendable = (value) => {
@@ -1,5 +1,6 @@
1
- import { F as FrameSetup, L as LoadedStory } from '../FrameController-UeTY7ubF.js';
2
- export { u as Channel, v as ConfigAnswers, w as FaultPhase, n as FromFrame, x as StartFrameOptions, o as ToFrame, y as reportImportFault, z as startFrame } from '../FrameController-UeTY7ubF.js';
1
+ import { F as FrameSetup, L as LoadedStory } from '../FrameController-BRhShqut.js';
2
+ export { u as Channel, v as ConfigAnswers, w as FaultPhase, n as FromFrame, x as StartFrameOptions, o as ToFrame, y as reportImportFault, z as startFrame } from '../FrameController-BRhShqut.js';
3
+ import '@weasel-js/icons';
3
4
  import '@weasel-js/labkit/config';
4
5
  import 'react';
5
6
 
@@ -1,12 +1,11 @@
1
- import { describeSchema, openChannel, isIndexId, TITLE_LIBRARIES, indexId, answerSchema, IndexPage } from '../chunk-V4RI7GWD.js';
1
+ import { describeSchema, createKitRoot, openChannel, isIndexId, TITLE_LIBRARIES, indexId, answerSchema, IndexPage } from '../chunk-R5F44ECM.js';
2
2
  import { isGallery } from '../chunk-WEQSLPKT.js';
3
- import { createOverrides, createGlobalsTarget, loadStories, indexRenderOf, scanCssVars, runAxe, StoryHost, resolveCssVar } from '../chunk-4NM3RTYK.js';
3
+ import { createOverrides, createGlobalsTarget, loadStories, indexRenderOf, scanCssVars, runAxe, StoryHost, resolveCssVar } from '../chunk-NVNTQ4AT.js';
4
4
  import '../chunk-L5XM5VKB.js';
5
5
  import '../chunk-ZAWXMUGZ.js';
6
- import '../chunk-GB6PRJET.js';
7
- import { FRAME_HELLO, stableStringify, PORT_HANDOFF } from '../chunk-FL2MUPUL.js';
6
+ import '../chunk-SQ4KCIEH.js';
7
+ import { FRAME_HELLO, stableStringify, PORT_HANDOFF } from '../chunk-2OJAV522.js';
8
8
  import { flushSync } from 'react-dom';
9
- import { createRoot } from 'react-dom/client';
10
9
  import { jsx } from 'react/jsx-runtime';
11
10
  import { f } from '@weasel-js/labkit/config';
12
11
  import { Component } from 'react';
@@ -27,7 +26,7 @@ function startFrame({ story, channel, container, setup = {} }) {
27
26
  const wrapper = document.createElement("div");
28
27
  wrapper.className = `fg-frame fg-frame--${story.layout}`;
29
28
  container.append(wrapper);
30
- const root = createRoot(wrapper);
29
+ const root = createKitRoot(wrapper, setup.icons);
31
30
  const decorators = setup.decorators ?? [];
32
31
  let initialized = false;
33
32
  let rendered = false;
@@ -153,7 +152,7 @@ function startFrame({ story, channel, container, setup = {} }) {
153
152
  const at = lastVars?.findIndex((v) => v.name === msg.name) ?? -1;
154
153
  if (!lastVars || at < 0) break;
155
154
  const vars = lastVars.slice();
156
- vars[at] = { name: msg.name, value: resolveCssVar(document, msg.name), overridden: overrides.has(msg.name) };
155
+ vars[at] = { ...vars[at], value: resolveCssVar(document, msg.name), overridden: overrides.has(msg.name) };
157
156
  publishVars(vars);
158
157
  break;
159
158
  }
@@ -195,7 +194,7 @@ function startIndex(options) {
195
194
  const wrapper = document.createElement("div");
196
195
  wrapper.className = "fg-frame fg-frame--fullscreen";
197
196
  container.append(wrapper);
198
- const root = createRoot(wrapper);
197
+ const root = createKitRoot(wrapper, setup.icons);
199
198
  const globalsTarget = createGlobalsTarget(document.documentElement, ":root");
200
199
  let globals = null;
201
200
  let announced = false;