@weasel-js/forge 1.12.0 → 1.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +20 -5
- package/dist/{FrameController-CdnaIo4C.d.ts → FrameController-DgfVaENb.d.ts} +15 -3
- package/dist/{chunk-GH5RE5X5.js → chunk-2ZBZRBHI.js} +2 -2
- package/dist/{chunk-GH5RE5X5.js.map → chunk-2ZBZRBHI.js.map} +1 -1
- package/dist/{chunk-KEQBGDUZ.js → chunk-7XJNVJB5.js} +3 -3
- package/dist/{chunk-KEQBGDUZ.js.map → chunk-7XJNVJB5.js.map} +1 -1
- package/dist/{chunk-LTTEILXY.js → chunk-COT4I347.js} +3 -3
- package/dist/{chunk-LTTEILXY.js.map → chunk-COT4I347.js.map} +1 -1
- package/dist/{chunk-WMGEO5M6.js → chunk-GHPMNT2A.js} +83 -13
- package/dist/chunk-GHPMNT2A.js.map +1 -0
- package/dist/chunk-RVJHUY7W.js +60 -0
- package/dist/chunk-RVJHUY7W.js.map +1 -0
- package/dist/chunk-VUPN73JP.js +16 -0
- package/dist/chunk-VUPN73JP.js.map +1 -0
- package/dist/{chunk-ATI7FYJ7.js → chunk-WFT5IOHX.js} +98 -63
- package/dist/chunk-WFT5IOHX.js.map +1 -0
- package/dist/{chunk-YDLRSEUN.js → chunk-XIBKYSRU.js} +5 -4
- package/dist/chunk-XIBKYSRU.js.map +1 -0
- package/dist/{config-Mg05Ja9r.d.ts → config-6fWf87Tt.d.ts} +3 -21
- package/dist/csf/preview-api.js +2 -2
- package/dist/frame/index.css +26 -0
- package/dist/frame/index.css.map +1 -1
- package/dist/frame/index.d.ts +14 -8
- package/dist/frame/index.js +109 -75
- package/dist/frame/index.js.map +1 -1
- package/dist/index.d.ts +29 -5
- package/dist/index.js +3 -3
- package/dist/library-CdTj-hFp.d.ts +21 -0
- package/dist/{mountFrame-Ds3QLnBF.d.ts → mountFrame-Bs7u1ro-.d.ts} +1 -1
- package/dist/shell/index.css +33 -5
- package/dist/shell/index.css.map +1 -1
- package/dist/shell/index.d.ts +6 -5
- package/dist/shell/index.js +190 -108
- package/dist/shell/index.js.map +1 -1
- package/dist/test/index.css +2 -3
- package/dist/test/index.css.map +1 -1
- package/dist/test/index.d.ts +1 -1
- package/dist/test/index.js +4 -4
- package/dist/vite/index.js +78 -16
- package/dist/vite/index.js.map +1 -1
- package/package.json +9 -9
- package/dist/chunk-ATI7FYJ7.js.map +0 -1
- package/dist/chunk-WEQSLPKT.js +0 -9
- package/dist/chunk-WEQSLPKT.js.map +0 -1
- package/dist/chunk-WMGEO5M6.js.map +0 -1
- package/dist/chunk-YDLRSEUN.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/frame/a11y.ts","../src/frame/a11yHighlight.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","../src/shell/hostConditions.ts"],"names":["last","raf","useEffect","jsx","value","isPlainObject","useContext","useState","config","f","useLatest","useRef"],"mappings":"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","file":"chunk-GHPMNT2A.js","sourcesContent":["import type { A11yFinding, A11yOutcome, 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\n/** `runAxe`, with a failure to run reported as an outcome rather than thrown. */\nexport async function auditElement(element: Element, options?: RunAxeOptions): Promise<A11yOutcome> {\n try {\n return { ok: true, report: await runAxe(element, options) };\n } catch (error) {\n return { ok: false, message: error instanceof Error ? error.message : String(error) };\n }\n}\n","/** Outlines over the elements an axe finding names, drawn in the document that holds them. */\nexport interface A11yHighlighter {\n /** Outlines every element `targets` reaches, replacing what was shown; an empty list clears. */\n show(targets: readonly (readonly string[])[]): void;\n dispose(): void;\n}\n\nconst CSS = `[data-fg-a11y-highlight] {\n position: fixed;\n z-index: var(--wzl-z-drag, 10000);\n box-sizing: border-box;\n pointer-events: none;\n border: 2px solid var(--wzl-danger, #e5484d);\n border-radius: 2px;\n background: color-mix(in srgb, var(--wzl-danger, #e5484d) 15%, transparent);\n}\n`;\n\n/** The element an axe target reaches: each entry after the first steps into the frame or shadow root before it. */\nexport function resolveTarget(doc: Document, target: readonly string[]): Element | null {\n let scope: Document | ShadowRoot = doc;\n let found: Element | null = null;\n for (const selector of target) {\n try {\n found = scope.querySelector(selector);\n } catch {\n return null;\n }\n if (!found) return null;\n const inner: Document | ShadowRoot | null | undefined =\n found.shadowRoot ?? (found as HTMLIFrameElement).contentDocument;\n if (inner) scope = inner;\n }\n return found;\n}\n\nexport function createA11yHighlighter(doc: Document): A11yHighlighter {\n let style: HTMLStyleElement | null = null;\n let boxes: { el: Element; box: HTMLElement }[] = [];\n const view = doc.defaultView;\n\n const place = () => {\n for (const { el, box } of boxes) {\n const rect = el.getBoundingClientRect();\n box.style.left = `${rect.left}px`;\n box.style.top = `${rect.top}px`;\n box.style.width = `${rect.width}px`;\n box.style.height = `${rect.height}px`;\n }\n };\n\n const clear = () => {\n for (const { box } of boxes) box.remove();\n boxes = [];\n view?.removeEventListener('scroll', place, true);\n view?.removeEventListener('resize', place);\n };\n\n return {\n show(targets) {\n clear();\n const elements = targets.map((target) => resolveTarget(doc, target)).filter((el) => el !== null);\n if (elements.length === 0) return;\n if (!style) {\n style = doc.createElement('style');\n style.setAttribute('data-fg-a11y-highlight-style', '');\n style.textContent = CSS;\n doc.head.append(style);\n }\n boxes = elements.map((el) => {\n const box = doc.createElement('div');\n box.setAttribute('data-fg-a11y-highlight', '');\n box.setAttribute('aria-hidden', 'true');\n doc.body.append(box);\n return { el, box };\n });\n place();\n view?.addEventListener('scroll', place, true);\n view?.addEventListener('resize', place);\n },\n dispose() {\n clear();\n style?.remove();\n style = null;\n },\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\nexport function 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';\nimport { isSafeOverride } from './safeOverride';\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 selector = `:is(${scope}):not(#fg-overrides)`;\n /** Each declaration goes through the rule's own CSSOM, which drops what the browser would not take as one value,\n * and the text is written back from what it kept; an override that could close the rule is never offered. */\n const write = () => {\n style.textContent = values.size > 0 ? `${selector} {}` : '';\n const rule = style.sheet?.cssRules[0] as CSSStyleRule | undefined;\n if (!rule) return;\n for (const [name, value] of values) if (isSafeOverride(name, value)) rule.style.setProperty(name, value);\n const decls = [...values.keys()].flatMap((name) => {\n const value = rule.style.getPropertyValue(name).trim();\n return value && isSafeOverride(name, value) ? [` ${name}: ${value};`] : [];\n });\n style.textContent = decls.length > 0 ? `${selector} {\\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, ObjectNode, UnionNode } from '@weasel-js/labkit/config';\nimport { isPlainObject } from '@weasel-js/core';\nimport { iconFromData } from '@weasel-js/ui/components/Icon';\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/**\n * Storybook's `SBType`, as far as forge reads it: the shape of an arg's value. A control is built from the parts of\n * an array, an object or a union, and a union of objects that each pin one field to a string is edited as a choice\n * of that string, with the chosen object's own fields under it.\n */\nexport type ArgShape =\n | { name: 'boolean' | 'string' | 'number' }\n | { name: 'enum'; value: readonly string[] }\n | { name: 'array'; value: ArgShape }\n | { name: 'object'; value: Readonly<Record<string, ArgShape>> }\n | { name: 'union'; value: readonly ArgShape[] };\n\n/** A CSF `argTypes` entry, as far as forge reads it. */\nexport interface ArgType {\n name?: string;\n description?: string;\n type?: ArgShape;\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\ntype ObjectShape = Extract<ArgShape, { name: 'object' }>;\n\n/**\n * A union's members by the string each pins one field to, with that field: the first field every member pins.\n * Members pinning the same string are one variant, holding the fields of each.\n */\nfunction variantsOf(members: readonly ArgShape[]): { tag: string; variants: Map<string, ObjectShape> } | null {\n const objects = members.filter((m): m is ObjectShape => m.name === 'object');\n if (objects.length !== members.length || objects.length === 0) return null;\n const pinned = (m: ObjectShape, key: string) => {\n const field = m.value[key];\n return field?.name === 'enum' && field.value.length === 1 ? field.value[0] : undefined;\n };\n const tag = Object.keys(objects[0]!.value).find((key) => objects.every((m) => pinned(m, key) !== undefined));\n if (tag === undefined) return null;\n const variants = new Map<string, ObjectShape>();\n for (const member of objects) {\n const name = pinned(member, tag)!;\n const held = variants.get(name)?.value ?? {};\n const added = Object.entries(member.value).filter(([key]) => !(key in held));\n variants.set(name, { name: 'object', value: { ...held, ...Object.fromEntries(added) } });\n }\n return { tag, variants };\n}\n\nfunction fieldsOf(shape: ObjectShape, value: unknown, omit?: string): Record<string, Leaf> | null {\n const held = isPlainObject(value) ? value : {};\n const fields: Record<string, Leaf> = {};\n for (const [key, field] of Object.entries(shape.value)) {\n if (key === omit) continue;\n const leaf = shaped(field, held[key]);\n if (leaf) fields[key] = leaf;\n }\n return Object.keys(fields).length > 0 ? fields : null;\n}\n\n/** A leaf editing a value of `shape`, starting at `value`; null for a shape no control can edit. */\nfunction shaped(shape: ArgShape, value: unknown): Leaf | null {\n switch (shape.name) {\n case 'boolean':\n return f.boolean(value as boolean);\n case 'string':\n return f.string(value as string);\n case 'number':\n return f.number(value as number);\n case 'enum':\n return shape.value.length > 0 ? f.enum(value as string, shape.value) : null;\n case 'array': {\n const item = shaped(shape.value, undefined);\n return item ? (f.list(Array.isArray(value) ? value : [], item) as unknown as Leaf) : null;\n }\n case 'object': {\n const fields = fieldsOf(shape, value);\n if (!fields) return null;\n const node = f.object(fields);\n return new ObjectNode(isPlainObject(value) ? value : node.default, node.annotations, node.options) as unknown as Leaf;\n }\n case 'union': {\n const union = variantsOf(shape.value);\n if (!union) return null;\n const { tag, variants } = union;\n const held = isPlainObject(value) ? value[tag] : undefined;\n const nodes = Object.fromEntries(\n [...variants].map(([name, member]) => [name, f.object(fieldsOf(member, held === name ? value : undefined, tag) ?? {})]),\n );\n const node = f.union(tag, nodes);\n const start = typeof held === 'string' && variants.has(held) ? value : node.default;\n return new UnionNode(start, node.annotations, node.options) as unknown as Leaf;\n }\n default:\n return null;\n }\n}\n\n/** A leaf for an object-valued arg: from its argType's shape where one is given and editable, else a JSON leaf. */\nfunction structured(argType: ArgType, value: unknown): Leaf | null {\n return (argType.type ? shaped(argType.type, value) : null) ?? inferred(value);\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 ? structured(argType, 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 ? (argType.type ? shaped(argType.type, value) : null) ?? 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","import { useLatest } from '@weasel-js/core';\nimport { type RefObject, useLayoutEffect, useRef } from 'react';\nimport { createOverrides, type Overrides } from '../frame/cssVars';\nimport type { FrameSetup } from '../frame/FrameController';\nimport { createGlobalsTarget } from '../frame/globalsTarget';\nimport type { Globals } from '../protocol/messages';\nimport type { CssOverrides } from './cssVars/overrides';\n\n/** A selector matching only the element carrying `id`. */\nexport const scopeOf = (id: string) => `[data-fg-host=\"${id}\"]`;\n\n/** Applies `globals` to the host carrying `hostId` through `setup`; the returned function removes what it styled. */\nexport function applyGlobalsTo(host: HTMLElement, hostId: string, globals: Globals, setup: FrameSetup): () => void {\n const target = createGlobalsTarget(host, scopeOf(hostId));\n setup.applyGlobals?.(globals, target);\n return () => target.dispose();\n}\n\n/**\n * The conditions a host element lives under: its globals target, and its CSS variable overrides rule with the\n * trial's persisted overrides put back and kept in step. Everything is scoped to `hostId`; no registry connection.\n * The returned ref holds the overrides while `host` is set.\n */\nexport function useHostConditions(\n host: HTMLElement | null,\n opts: { hostId: string; globals: Globals; overrides: CssOverrides; setup: FrameSetup },\n): RefObject<Overrides | null> {\n const { hostId, globals, overrides: persisted, setup } = opts;\n const latest = useLatest({ setup });\n const overridesRef = useRef<Overrides | null>(null);\n\n useLayoutEffect(() => {\n if (!host) return;\n const scope = scopeOf(hostId);\n const { cssVarsScope } = latest.current.setup;\n overridesRef.current = createOverrides(\n host.ownerDocument,\n cssVarsScope ? `${scope}, ${scope} :is(${cssVarsScope})` : scope,\n );\n return () => {\n overridesRef.current?.dispose();\n overridesRef.current = null;\n };\n }, [host, hostId, latest]);\n\n const applied = useRef<Record<string, string>>({});\n useLayoutEffect(() => {\n const overrides = overridesRef.current;\n if (!overrides) return;\n for (const name of Object.keys(applied.current)) if (!(name in persisted)) overrides.set(name, null);\n for (const [name, value] of Object.entries(persisted)) overrides.set(name, value);\n applied.current = { ...persisted };\n }, [host, hostId, persisted]);\n\n useLayoutEffect(\n () => (host ? applyGlobalsTo(host, hostId, globals, latest.current.setup) : undefined),\n [host, hostId, globals, latest],\n );\n\n return overridesRef;\n}\n"]}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { sanitize } from './chunk-5WS67HMU.js';
|
|
2
|
+
|
|
3
|
+
// src/story/indexPages.ts
|
|
4
|
+
var SUFFIX = ":index";
|
|
5
|
+
var INDEX_NAME = "Index";
|
|
6
|
+
function indexId(title) {
|
|
7
|
+
return `${sanitize(title)}${SUFFIX}`;
|
|
8
|
+
}
|
|
9
|
+
function isIndexId(id) {
|
|
10
|
+
return id.endsWith(SUFFIX);
|
|
11
|
+
}
|
|
12
|
+
function stemOf(file) {
|
|
13
|
+
const name = file.replaceAll("\\", "/").split("/").pop() ?? file;
|
|
14
|
+
return name.replace(/(?:\.(?:story|stories))?\.[^.]+$/i, "");
|
|
15
|
+
}
|
|
16
|
+
function primaryFile(title, files) {
|
|
17
|
+
const name = (title.split("/").pop() ?? title).toLowerCase();
|
|
18
|
+
return files.find((file) => stemOf(file).toLowerCase() === name) ?? files[0];
|
|
19
|
+
}
|
|
20
|
+
function byComponent(stories) {
|
|
21
|
+
const byTitle = /* @__PURE__ */ new Map();
|
|
22
|
+
for (const entry of stories) {
|
|
23
|
+
const group = byTitle.get(entry.title);
|
|
24
|
+
if (group) group.push(entry);
|
|
25
|
+
else byTitle.set(entry.title, [entry]);
|
|
26
|
+
}
|
|
27
|
+
return [...byTitle].flatMap(([title, group]) => {
|
|
28
|
+
const primary = primaryFile(title, [...new Set(group.map((entry) => entry.file))]);
|
|
29
|
+
return [...group.filter((entry) => entry.file === primary), ...group.filter((entry) => entry.file !== primary)];
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
function indexEntries(stories) {
|
|
33
|
+
const byTitle = /* @__PURE__ */ new Map();
|
|
34
|
+
for (const entry of byComponent(stories)) {
|
|
35
|
+
const page = byTitle.get(entry.title);
|
|
36
|
+
if (page) {
|
|
37
|
+
if (page.tags) {
|
|
38
|
+
const common = page.tags.filter((tag) => entry.tags?.includes(tag));
|
|
39
|
+
if (common.length > 0) page.tags = common;
|
|
40
|
+
else delete page.tags;
|
|
41
|
+
}
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
byTitle.set(entry.title, {
|
|
45
|
+
id: indexId(entry.title),
|
|
46
|
+
title: entry.title,
|
|
47
|
+
name: INDEX_NAME,
|
|
48
|
+
exportName: "",
|
|
49
|
+
file: entry.file,
|
|
50
|
+
...entry.componentDescription === void 0 ? {} : { componentDescription: entry.componentDescription },
|
|
51
|
+
...entry.componentName === void 0 ? {} : { componentName: entry.componentName },
|
|
52
|
+
...entry.tags === void 0 ? {} : { tags: entry.tags }
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
return [...byTitle.values()];
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export { byComponent, indexEntries, indexId, isIndexId };
|
|
59
|
+
//# sourceMappingURL=chunk-RVJHUY7W.js.map
|
|
60
|
+
//# sourceMappingURL=chunk-RVJHUY7W.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/story/indexPages.ts"],"names":[],"mappings":"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","file":"chunk-RVJHUY7W.js","sourcesContent":["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/** A story file's name with its `.stories.tsx`-style suffix removed: `Bar` for `/x/Bar.stories.tsx`. */\nfunction stemOf(file: string): string {\n const name = file.replaceAll('\\\\', '/').split('/').pop() ?? file;\n return name.replace(/(?:\\.(?:story|stories))?\\.[^.]+$/i, '');\n}\n\n/**\n * The file that speaks for a title several story files share: the one named for the title's last segment, so\n * `Bar.stories.tsx` over `lab/BarArc.stories.tsx` for `ui/Bar`, else the first. Its meta describes the component.\n */\nexport function primaryFile(title: string, files: readonly string[]): string | undefined {\n const name = (title.split('/').pop() ?? title).toLowerCase();\n return files.find((file) => stemOf(file).toLowerCase() === name) ?? files[0];\n}\n\n/** `stories` grouped by title, in the order titles first appear, each title's primary file's stories first. */\nexport function byComponent<E extends Pick<IndexEntry, 'title' | 'file'>>(stories: readonly E[]): E[] {\n const byTitle = new Map<string, E[]>();\n for (const entry of stories) {\n const group = byTitle.get(entry.title);\n if (group) group.push(entry);\n else byTitle.set(entry.title, [entry]);\n }\n return [...byTitle].flatMap(([title, group]) => {\n const primary = primaryFile(title, [...new Set(group.map((entry) => entry.file))]);\n return [...group.filter((entry) => entry.file === primary), ...group.filter((entry) => entry.file !== primary)];\n });\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 primary file, its descriptions are that file's, 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 byComponent(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"]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
// src/story/tags.ts
|
|
2
|
+
var GALLERY_TAG = "gallery";
|
|
3
|
+
function isGallery(entry) {
|
|
4
|
+
return entry.tags?.includes(GALLERY_TAG) ?? false;
|
|
5
|
+
}
|
|
6
|
+
var LAB_TAG = "lab";
|
|
7
|
+
function isLab(entry) {
|
|
8
|
+
return entry.tags?.includes(LAB_TAG) ?? false;
|
|
9
|
+
}
|
|
10
|
+
function taggedIds(entries) {
|
|
11
|
+
return { galleries: entries.filter(isGallery).map((e) => e.id), labs: entries.filter(isLab).map((e) => e.id) };
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export { GALLERY_TAG, LAB_TAG, isGallery, isLab, taggedIds };
|
|
15
|
+
//# sourceMappingURL=chunk-VUPN73JP.js.map
|
|
16
|
+
//# sourceMappingURL=chunk-VUPN73JP.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/story/tags.ts"],"names":[],"mappings":";AACO,IAAM,WAAA,GAAc;AAEpB,SAAS,UAAU,KAAA,EAA8C;AACtE,EAAA,OAAO,KAAA,CAAM,IAAA,EAAM,QAAA,CAAS,WAAW,CAAA,IAAK,KAAA;AAC9C;AAGO,IAAM,OAAA,GAAU;AAEhB,SAAS,MAAM,KAAA,EAA8C;AAClE,EAAA,OAAO,KAAA,CAAM,IAAA,EAAM,QAAA,CAAS,OAAO,CAAA,IAAK,KAAA;AAC1C;AAGO,SAAS,UAAU,OAAA,EAGxB;AACA,EAAA,OAAO,EAAE,WAAW,OAAA,CAAQ,MAAA,CAAO,SAAS,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,EAAE,GAAG,IAAA,EAAM,OAAA,CAAQ,OAAO,KAAK,CAAA,CAAE,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,EAAE,CAAA,EAAE;AAC/G","file":"chunk-VUPN73JP.js","sourcesContent":["/** The meta tag marking a story file as a gallery: a catalog of many components, or of every permutation of one. */\nexport const GALLERY_TAG = 'gallery';\n\nexport function isGallery(entry: { tags?: readonly string[] }): boolean {\n return entry.tags?.includes(GALLERY_TAG) ?? false;\n}\n\n/** The meta tag marking a story file as a lab: a whole screen for exercising a component, not a specimen of it. */\nexport const LAB_TAG = 'lab';\n\nexport function isLab(entry: { tags?: readonly string[] }): boolean {\n return entry.tags?.includes(LAB_TAG) ?? false;\n}\n\n/** The ids among `entries` tagged as galleries and as labs, as an index page is handed them. */\nexport function taggedIds(entries: readonly { id: string; tags?: readonly string[] }[]): {\n galleries: string[];\n labs: string[];\n} {\n return { galleries: entries.filter(isGallery).map((e) => e.id), labs: entries.filter(isLab).map((e) => e.id) };\n}\n"]}
|
|
@@ -1,15 +1,16 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import { isIndexId, indexId, byComponent } from './chunk-RVJHUY7W.js';
|
|
2
|
+
import { taggedIds, isGallery } from './chunk-VUPN73JP.js';
|
|
3
|
+
import { loadStories, indexRenderOf, useNearViewport, StoryHost } from './chunk-GHPMNT2A.js';
|
|
4
|
+
import { PROTOCOL_VERSION } from './chunk-2ZBZRBHI.js';
|
|
4
5
|
import { createRoot } from 'react-dom/client';
|
|
5
6
|
import { IconRegistryProvider, isPlainObject } from '@weasel-js/core';
|
|
6
7
|
import { kitIcons } from '@weasel-js/ui/kit-icons';
|
|
7
|
-
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
8
|
+
import { jsx, Fragment, jsxs } from 'react/jsx-runtime';
|
|
8
9
|
import { f, resolveConfigSchema, isEntryShown, isConfigBranch, schemaNodeAtPath, titleCase } from '@weasel-js/labkit/config';
|
|
9
10
|
import { createEmitter } from '@weasel-js/registry';
|
|
10
11
|
import { createContext, useContext, useMemo, useState, useRef, useEffect, useId } from 'react';
|
|
11
12
|
import { Badge } from '@weasel-js/ui/components/Badge';
|
|
12
|
-
import {
|
|
13
|
+
import { InlineMarkdown } from '@weasel-js/ui/components/InlineMarkdown';
|
|
13
14
|
import num from '@weasel-js/theme/numeric.module.css';
|
|
14
15
|
|
|
15
16
|
function createKitRoot(container, extra = []) {
|
|
@@ -124,58 +125,78 @@ function openChannel(port, options = {}) {
|
|
|
124
125
|
}
|
|
125
126
|
};
|
|
126
127
|
}
|
|
127
|
-
|
|
128
|
-
// src/story/indexPages.ts
|
|
129
|
-
var SUFFIX = ":index";
|
|
130
|
-
var INDEX_NAME = "Index";
|
|
131
|
-
function indexId(title) {
|
|
132
|
-
return `${sanitize(title)}${SUFFIX}`;
|
|
133
|
-
}
|
|
134
|
-
function isIndexId(id) {
|
|
135
|
-
return id.endsWith(SUFFIX);
|
|
136
|
-
}
|
|
137
|
-
function indexEntries(stories) {
|
|
138
|
-
const byTitle = /* @__PURE__ */ new Map();
|
|
139
|
-
for (const entry of stories) {
|
|
140
|
-
const page = byTitle.get(entry.title);
|
|
141
|
-
if (page) {
|
|
142
|
-
if (page.tags) {
|
|
143
|
-
const common = page.tags.filter((tag) => entry.tags?.includes(tag));
|
|
144
|
-
if (common.length > 0) page.tags = common;
|
|
145
|
-
else delete page.tags;
|
|
146
|
-
}
|
|
147
|
-
continue;
|
|
148
|
-
}
|
|
149
|
-
byTitle.set(entry.title, {
|
|
150
|
-
id: indexId(entry.title),
|
|
151
|
-
title: entry.title,
|
|
152
|
-
name: INDEX_NAME,
|
|
153
|
-
exportName: "",
|
|
154
|
-
file: entry.file,
|
|
155
|
-
...entry.componentDescription === void 0 ? {} : { componentDescription: entry.componentDescription },
|
|
156
|
-
...entry.componentName === void 0 ? {} : { componentName: entry.componentName },
|
|
157
|
-
...entry.tags === void 0 ? {} : { tags: entry.tags }
|
|
158
|
-
});
|
|
159
|
-
}
|
|
160
|
-
return [...byTitle.values()];
|
|
161
|
-
}
|
|
162
128
|
function librariesFrom(table = []) {
|
|
163
129
|
return {
|
|
164
130
|
of(entry) {
|
|
165
131
|
const file = entry.file.replaceAll("\\", "/");
|
|
166
132
|
return table.find((library) => file.includes(library.path))?.label ?? entry.title.split("/")[0] ?? entry.title;
|
|
167
133
|
},
|
|
168
|
-
|
|
134
|
+
tintOf: (label) => table.find((library) => library.label === label)?.tint
|
|
169
135
|
};
|
|
170
136
|
}
|
|
171
137
|
var TITLE_LIBRARIES = librariesFrom();
|
|
172
138
|
var LibrariesContext = createContext(TITLE_LIBRARIES);
|
|
173
139
|
|
|
140
|
+
// src/story/indexBundle.ts
|
|
141
|
+
var commonTags = (entries) => {
|
|
142
|
+
const [first, ...rest] = entries;
|
|
143
|
+
const common = (first?.tags ?? []).filter((tag) => rest.every((e) => e.tags?.includes(tag)));
|
|
144
|
+
return common.length > 0 ? common : void 0;
|
|
145
|
+
};
|
|
146
|
+
async function loadIndexBundle(id, source) {
|
|
147
|
+
const { importOf, load = loadStories, parameters, prepare, libraries = TITLE_LIBRARIES } = source;
|
|
148
|
+
const entries = source.index.filter((e) => !isIndexId(e.id) && indexId(e.title) === id);
|
|
149
|
+
const primary = byComponent(entries)[0];
|
|
150
|
+
if (!primary) throw new Error(`No component with index "${id}"`);
|
|
151
|
+
const { title } = primary;
|
|
152
|
+
const files = [...new Set(entries.map((e) => e.file))];
|
|
153
|
+
const mods = await Promise.all(files.map(importOf));
|
|
154
|
+
const byFile = new Map(files.map((file, i) => [file, load(mods[i] ?? {}, title, parameters)]));
|
|
155
|
+
const stories = entries.flatMap((e) => byFile.get(e.file)?.find((s) => s.exportName === e.exportName) ?? []);
|
|
156
|
+
for (const story of stories) await prepare?.(story);
|
|
157
|
+
const tags = commonTags(entries);
|
|
158
|
+
return {
|
|
159
|
+
title,
|
|
160
|
+
library: libraries.of(primary),
|
|
161
|
+
...primary.componentDescription === void 0 ? {} : { description: primary.componentDescription },
|
|
162
|
+
...tags === void 0 ? {} : { tags },
|
|
163
|
+
...taggedIds(entries),
|
|
164
|
+
stories,
|
|
165
|
+
descriptions: Object.fromEntries(entries.flatMap((e) => e.description ? [[e.id, e.description]] : [])),
|
|
166
|
+
render: mods.map(indexRenderOf).find((render) => render !== null) ?? null
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
|
|
174
170
|
// src/shell/labDensity.ts
|
|
175
171
|
var LAB_DENSITY = "roomy";
|
|
172
|
+
|
|
173
|
+
// src/frame/index/indexEnv.ts
|
|
174
|
+
function indexEnvOf(bundle, { graph, globals, decorators, open }) {
|
|
175
|
+
const gallery = isGallery(bundle);
|
|
176
|
+
const dependencies = gallery ? void 0 : graph?.[bundle.title];
|
|
177
|
+
return {
|
|
178
|
+
title: bundle.title,
|
|
179
|
+
library: bundle.library,
|
|
180
|
+
...bundle.description === void 0 ? {} : { description: bundle.description },
|
|
181
|
+
stories: bundle.stories,
|
|
182
|
+
descriptions: bundle.descriptions,
|
|
183
|
+
gallery,
|
|
184
|
+
galleries: bundle.galleries,
|
|
185
|
+
labs: bundle.labs,
|
|
186
|
+
...dependencies ? { dependencies } : {},
|
|
187
|
+
globals,
|
|
188
|
+
decorators,
|
|
189
|
+
open,
|
|
190
|
+
// A story that throws shows its error in its own cell; the rest of the page is still worth reading.
|
|
191
|
+
onError: (error) => console.error(error)
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
function LabBadge({ className }) {
|
|
195
|
+
return /* @__PURE__ */ jsx(Badge, { grade: "info", variant: "subtle", size: "sm", ...className ? { className } : {}, children: "Lab" });
|
|
196
|
+
}
|
|
176
197
|
function LibraryBadge({ library, className }) {
|
|
177
|
-
const
|
|
178
|
-
return /* @__PURE__ */ jsx(Badge, {
|
|
198
|
+
const tint = useContext(LibrariesContext).tintOf(library);
|
|
199
|
+
return /* @__PURE__ */ jsx(Badge, { emphasis: "low", ...tint === void 0 ? {} : { tint }, variant: "subtle", size: "sm", ...className ? { className } : {}, children: library });
|
|
179
200
|
}
|
|
180
201
|
var MAX_ENUM_OPTIONS = 8;
|
|
181
202
|
var MAX_ROWS = 6;
|
|
@@ -219,6 +240,12 @@ function withValueAt(config, path, value) {
|
|
|
219
240
|
const record = isPlainObject(config) ? config : {};
|
|
220
241
|
return { ...record, [head]: rest.length === 0 ? value : withValueAt(record[head], rest.join("."), value) };
|
|
221
242
|
}
|
|
243
|
+
function paragraphsOf(text) {
|
|
244
|
+
return text.split(/\n\s*\n/).map((paragraph) => paragraph.split("\n").map((line) => line.trim()).filter(Boolean).join(" ")).filter(Boolean);
|
|
245
|
+
}
|
|
246
|
+
function Description({ text, className }) {
|
|
247
|
+
return /* @__PURE__ */ jsx(Fragment, { children: paragraphsOf(text).map((paragraph, i) => /* @__PURE__ */ jsx("p", { className, children: /* @__PURE__ */ jsx(InlineMarkdown, { text: paragraph }) }, i)) });
|
|
248
|
+
}
|
|
222
249
|
var IndexEnvContext = createContext(null);
|
|
223
250
|
function useEnv() {
|
|
224
251
|
const env = useContext(IndexEnvContext);
|
|
@@ -266,8 +293,8 @@ function IndexVariants({ story }) {
|
|
|
266
293
|
const rows = useMemo(() => variantRows(story.config), [story]);
|
|
267
294
|
const defaults = useMemo(() => story.config.defaults(), [story]);
|
|
268
295
|
if (rows.length === 0) return null;
|
|
269
|
-
return /* @__PURE__ */ jsx("div", { className: "fg-index-variants", children: rows.map((row) => /* @__PURE__ */ jsxs("section", { className: "fg-index-variants__row", "aria-label": row.label
|
|
270
|
-
/* @__PURE__ */ jsx("
|
|
296
|
+
return /* @__PURE__ */ jsx("div", { className: "fg-index-variants", children: rows.map((row) => /* @__PURE__ */ jsxs("section", { className: "fg-index-variants__row", "aria-label": `${story.name}: ${row.label}`, children: [
|
|
297
|
+
/* @__PURE__ */ jsx("h3", { className: "fg-index-variants__label", children: row.label }),
|
|
271
298
|
/* @__PURE__ */ jsx("div", { className: "fg-index-variants__cells", children: row.values.map((v) => /* @__PURE__ */ jsx(
|
|
272
299
|
IndexStory,
|
|
273
300
|
{
|
|
@@ -280,22 +307,24 @@ function IndexVariants({ story }) {
|
|
|
280
307
|
] }, row.path)) });
|
|
281
308
|
}
|
|
282
309
|
function GalleryBadge() {
|
|
283
|
-
return /* @__PURE__ */ jsx(Badge, {
|
|
310
|
+
return /* @__PURE__ */ jsx(Badge, { emphasis: "high", variant: "subtle", size: "sm", children: "Gallery" });
|
|
284
311
|
}
|
|
285
|
-
function
|
|
312
|
+
function OpenLink({ id, className, children }) {
|
|
286
313
|
const env = useEnv();
|
|
287
|
-
const
|
|
288
|
-
const follow = (event, id) => {
|
|
314
|
+
const follow = (event) => {
|
|
289
315
|
if (event.button !== 0 || event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) return;
|
|
290
316
|
event.preventDefault();
|
|
291
317
|
env.open(id);
|
|
292
318
|
};
|
|
319
|
+
return /* @__PURE__ */ jsx("a", { className, href: `#/${encodeURIComponent(id)}`, onClick: follow, children });
|
|
320
|
+
}
|
|
321
|
+
function DependencyList({ label, titles, empty }) {
|
|
322
|
+
const labelId = useId();
|
|
293
323
|
return /* @__PURE__ */ jsxs("div", { className: "fg-index-deps__row", children: [
|
|
294
324
|
/* @__PURE__ */ jsx("dt", { id: labelId, className: "fg-index-deps__label", children: label }),
|
|
295
325
|
/* @__PURE__ */ jsx("dd", { className: "fg-index-deps__value", children: titles.length === 0 ? /* @__PURE__ */ jsx("span", { className: "fg-index-deps__empty", children: empty }) : /* @__PURE__ */ jsx("ul", { className: "fg-index-deps__list", "aria-labelledby": labelId, children: titles.map((title) => {
|
|
296
326
|
const cut = title.lastIndexOf("/") + 1;
|
|
297
|
-
|
|
298
|
-
return /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsxs("a", { className: "fg-index-deps__link", href: `#/${encodeURIComponent(id)}`, onClick: (event) => follow(event, id), children: [
|
|
327
|
+
return /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsxs(OpenLink, { className: "fg-index-deps__link", id: indexId(title), children: [
|
|
299
328
|
/* @__PURE__ */ jsx("span", { className: "fg-index-deps__prefix", children: title.slice(0, cut) }),
|
|
300
329
|
title.slice(cut)
|
|
301
330
|
] }) }, title);
|
|
@@ -343,21 +372,27 @@ function StorySection({ story, variants }) {
|
|
|
343
372
|
const headingId = useId();
|
|
344
373
|
const description = env.descriptions[story.id];
|
|
345
374
|
const gallery = !env.gallery && env.galleries?.includes(story.id);
|
|
375
|
+
const lab = env.labs?.includes(story.id) ?? false;
|
|
346
376
|
return /* @__PURE__ */ jsxs("section", { className: "fg-index-story", "aria-labelledby": headingId, children: [
|
|
347
|
-
/* @__PURE__ */ jsxs("
|
|
348
|
-
/* @__PURE__ */
|
|
349
|
-
|
|
350
|
-
|
|
377
|
+
/* @__PURE__ */ jsxs("div", { className: "fg-index-story__main", children: [
|
|
378
|
+
/* @__PURE__ */ jsxs("div", { className: "fg-index-story__text", children: [
|
|
379
|
+
/* @__PURE__ */ jsxs("header", { className: "fg-index-story__head", children: [
|
|
380
|
+
/* @__PURE__ */ jsx("h2", { id: headingId, className: "fg-index-story__name", children: /* @__PURE__ */ jsx(OpenLink, { className: "fg-index-story__link", id: story.id, children: story.name }) }),
|
|
381
|
+
gallery ? /* @__PURE__ */ jsx(GalleryBadge, {}) : null,
|
|
382
|
+
lab ? /* @__PURE__ */ jsx(LabBadge, {}) : null
|
|
383
|
+
] }),
|
|
384
|
+
description ? /* @__PURE__ */ jsx(Description, { text: description, className: "fg-index-story__description" }) : null
|
|
385
|
+
] }),
|
|
386
|
+
lab ? null : /* @__PURE__ */ jsx(IndexStory, { story })
|
|
351
387
|
] }),
|
|
352
|
-
description ? /* @__PURE__ */ jsx("p", { className: "fg-index-story__description", children: description }) : null,
|
|
353
|
-
/* @__PURE__ */ jsx(IndexStory, { story }),
|
|
354
388
|
variants ? /* @__PURE__ */ jsx(IndexVariants, { story }) : null
|
|
355
389
|
] });
|
|
356
390
|
}
|
|
357
|
-
function firstOfEachControlSet(stories) {
|
|
391
|
+
function firstOfEachControlSet(stories, labs) {
|
|
358
392
|
const seen = /* @__PURE__ */ new Set();
|
|
359
393
|
const shown = /* @__PURE__ */ new Set();
|
|
360
394
|
for (const story of stories) {
|
|
395
|
+
if (labs.includes(story.id)) continue;
|
|
361
396
|
const key = JSON.stringify(variantRows(story.config));
|
|
362
397
|
if (seen.has(key)) continue;
|
|
363
398
|
seen.add(key);
|
|
@@ -367,7 +402,7 @@ function firstOfEachControlSet(stories) {
|
|
|
367
402
|
}
|
|
368
403
|
function DefaultIndex() {
|
|
369
404
|
const env = useEnv();
|
|
370
|
-
const withVariants = useMemo(() => firstOfEachControlSet(env.stories), [env.stories]);
|
|
405
|
+
const withVariants = useMemo(() => firstOfEachControlSet(env.stories, env.labs ?? []), [env.stories, env.labs]);
|
|
371
406
|
const segments = env.title.split("/");
|
|
372
407
|
const name = segments.pop();
|
|
373
408
|
const { library } = env;
|
|
@@ -382,7 +417,7 @@ function DefaultIndex() {
|
|
|
382
417
|
/* @__PURE__ */ jsx("h1", { className: "fg-index__title", children: name }),
|
|
383
418
|
env.gallery ? /* @__PURE__ */ jsx(GalleryBadge, {}) : null
|
|
384
419
|
] }),
|
|
385
|
-
env.description ? /* @__PURE__ */ jsx(
|
|
420
|
+
env.description ? /* @__PURE__ */ jsx(Description, { text: env.description, className: "fg-index__description" }) : null,
|
|
386
421
|
/* @__PURE__ */ jsx(IndexHistory, {}),
|
|
387
422
|
/* @__PURE__ */ jsx(IndexDependencies, {})
|
|
388
423
|
] }),
|
|
@@ -408,6 +443,6 @@ function IndexPage({ env, render }) {
|
|
|
408
443
|
return /* @__PURE__ */ jsx(IndexEnvContext.Provider, { value: env, children: render ? render(indexContext(env)) : /* @__PURE__ */ jsx(DefaultIndex, {}) });
|
|
409
444
|
}
|
|
410
445
|
|
|
411
|
-
export { IndexPage, LAB_DENSITY, LibrariesContext, LibraryBadge, TITLE_LIBRARIES, answerSchema, createKitRoot, describeSchema,
|
|
412
|
-
//# sourceMappingURL=chunk-
|
|
413
|
-
//# sourceMappingURL=chunk-
|
|
446
|
+
export { Description, IndexPage, LAB_DENSITY, LabBadge, LibrariesContext, LibraryBadge, TITLE_LIBRARIES, answerSchema, createKitRoot, describeSchema, indexEnvOf, librariesFrom, loadIndexBundle, openChannel, schemaFromDescription };
|
|
447
|
+
//# sourceMappingURL=chunk-WFT5IOHX.js.map
|
|
448
|
+
//# sourceMappingURL=chunk-WFT5IOHX.js.map
|