@weasel-js/forge 1.8.0 → 1.8.1
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 +78 -0
- package/dist/{FrameController-RdGggdGA.d.ts → FrameController-BH8xJHZ8.d.ts} +36 -1
- package/dist/{chunk-NYBMOSSR.js → chunk-5N4YP5HS.js} +166 -10
- package/dist/chunk-5N4YP5HS.js.map +1 -0
- package/dist/chunk-CJX3W5HY.js +151 -0
- package/dist/chunk-CJX3W5HY.js.map +1 -0
- package/dist/{chunk-SEK6EKHO.js → chunk-GHTVXHNJ.js} +72 -10
- package/dist/chunk-GHTVXHNJ.js.map +1 -0
- package/dist/{chunk-KIFCYY4F.js → chunk-JQD3MVUQ.js} +4 -4
- package/dist/{chunk-KIFCYY4F.js.map → chunk-JQD3MVUQ.js.map} +1 -1
- package/dist/chunk-KJGXJD3U.js +15 -0
- package/dist/chunk-KJGXJD3U.js.map +1 -0
- package/dist/chunk-L5XM5VKB.js +47 -0
- package/dist/chunk-L5XM5VKB.js.map +1 -0
- package/dist/{chunk-YKN3IAEX.js → chunk-MGQWCPYE.js} +4 -24
- package/dist/chunk-MGQWCPYE.js.map +1 -0
- package/dist/{chunk-JNJGIUYU.js → chunk-NI5FYQHW.js} +8 -5
- package/dist/chunk-NI5FYQHW.js.map +1 -0
- package/dist/{config-BJIgUhiI.d.ts → config-DoLWwEb2.d.ts} +5 -1
- package/dist/csf/preview-api.js +2 -1
- package/dist/csf/preview-api.js.map +1 -1
- package/dist/frame/index.css +1 -0
- package/dist/frame/index.css.map +1 -1
- package/dist/frame/index.d.ts +2 -2
- package/dist/frame/index.js +5 -4
- package/dist/frame/index.js.map +1 -1
- package/dist/index.d.ts +79 -4
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/shell/index.css +14 -0
- package/dist/shell/index.css.map +1 -1
- package/dist/shell/index.d.ts +2 -2
- package/dist/shell/index.js +225 -56
- package/dist/shell/index.js.map +1 -1
- package/dist/test/index.d.ts +1 -1
- package/dist/test/index.js +6 -5
- package/dist/test/index.js.map +1 -1
- package/dist/vite/index.js +160 -16
- package/dist/vite/index.js.map +1 -1
- package/package.json +5 -5
- package/dist/chunk-JNJGIUYU.js.map +0 -1
- package/dist/chunk-NYBMOSSR.js.map +0 -1
- package/dist/chunk-SEK6EKHO.js.map +0 -1
- package/dist/chunk-Y3WZ2EWR.js +0 -15
- package/dist/chunk-Y3WZ2EWR.js.map +0 -1
- package/dist/chunk-YKN3IAEX.js.map +0 -1
package/dist/frame/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/frame/FrameController.tsx","../../src/frame/index/startIndex.tsx","../../src/frame/mountFrame.tsx"],"names":["createRoot","jsx","flushSync","id","stories","story"],"mappings":"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","file":"index.js","sourcesContent":["import { flushSync } from 'react-dom';\nimport { createRoot } from 'react-dom/client';\nimport type { Channel } from '../protocol/channel';\nimport {\n type CssVarReport,\n type FaultPhase,\n type FromFrame,\n type Globals,\n stableStringify,\n type ToFrame,\n} from '../protocol/messages';\nimport { answerSchema, describeSchema } from '../protocol/schema';\nimport type { Decorator, LoadedStory, StoryContext } from '../story/types';\nimport { runAxe } from './a11y';\nimport { captureElement } from './capture';\nimport { createOverrides, resolveCssVar, scanCssVars } from './cssVars';\nimport { createGlobalsTarget, type GlobalsTarget } from './globalsTarget';\nimport { StoryHost } from './StoryHost';\n\n/** The frame config: what `defineFrameConfig` returns and the `frameConfig` module default-exports. */\nexport interface FrameSetup {\n /** Wraps every story, outermost; receives the globals. From the frame config (`frameConfig`). */\n decorators?: Decorator[];\n /** Applies globals to a target: theme mode, fonts. The target is a frame document's root, or one story's host in\n * the workshop document, so a rule the setup writes goes through `target.style` under `target.scope`. */\n applyGlobals?: (globals: Globals, target: GlobalsTarget) => void;\n /**\n * The elements a CSS variable override is declared on; `:root` by default. An override has to be declared on\n * whichever element declares the token itself — a theme wrapper, say — or that element's own value wins.\n */\n cssVarsScope?: string;\n /** Project-wide CSF parameters, Storybook's preview `parameters`: under each meta's and story's. */\n parameters?: Record<string, unknown>;\n /**\n * Awaited once a story is loaded and before it first renders — the place to import what only some stories\n * need, so the rest never load it.\n */\n prepare?: (story: LoadedStory) => void | Promise<void>;\n}\n\n/** Inputs to `startFrame`: the story, the channel to the shell, and the element to render into. */\nexport interface StartFrameOptions {\n story: LoadedStory;\n channel: Channel<ToFrame, FromFrame>;\n container: HTMLElement;\n setup?: FrameSetup;\n}\n\nconst VARS_SETTLE_MS = 100;\n\nfunction fault(phase: FaultPhase, error: unknown, seq?: number): FromFrame {\n return {\n type: 'fault',\n phase,\n message: error instanceof Error ? error.message : String(error),\n ...(error instanceof Error && error.stack ? { stack: error.stack } : {}),\n ...(seq === undefined ? {} : { seq }),\n };\n}\n\n/** Sends `ready`, then renders the story on `init` and keeps it in step. Returns a stop function. */\nexport function startFrame({ story, channel, container, setup = {} }: StartFrameOptions): () => void {\n const { send } = channel;\n send({ type: 'ready', schema: describeSchema(story.config), layout: story.layout, viewport: story.viewport });\n\n const wrapper = document.createElement('div');\n wrapper.className = `fg-frame fg-frame--${story.layout}`;\n container.append(wrapper);\n const root = createRoot(wrapper);\n const decorators = setup.decorators ?? [];\n\n let initialized = false;\n let rendered = false;\n let config: unknown;\n let state: unknown = null;\n let globals: Globals = {};\n let answeredKey: string | null = null;\n let resetKey = 0;\n let seq = 0;\n\n const overrides = createOverrides(document, setup.cssVarsScope);\n const globalsTarget = createGlobalsTarget(document.documentElement, ':root');\n let lastVars: CssVarReport[] | null = null;\n let reported: string | null = null;\n const publishVars = (vars: CssVarReport[]) => {\n lastVars = vars;\n const key = JSON.stringify(vars);\n if (key === reported) return;\n reported = key;\n send({ type: 'vars', vars });\n };\n const reportVars = () => publishVars(scanCssVars(document, overrides.has));\n const ownMutation = (record: MutationRecord) =>\n overrides.owns(record.target) ||\n (record.type === 'childList' &&\n [...record.addedNodes, ...record.removedNodes].length > 0 &&\n [...record.addedNodes, ...record.removedNodes].every(overrides.owns));\n let settleTimer: ReturnType<typeof setTimeout> | undefined;\n const mutations =\n typeof MutationObserver === 'undefined'\n ? null\n : new MutationObserver((records) => {\n if (records.every(ownMutation)) return;\n clearTimeout(settleTimer);\n settleTimer = setTimeout(reportVars, VARS_SETTLE_MS);\n });\n // Every attribute, not just style and class: a stylesheet can select on any of them, `[data-wzl-mode]` included.\n mutations?.observe(document.documentElement, { subtree: true, childList: true, characterData: true, attributes: true });\n\n const setConfig = (path: string, value: unknown) => send({ type: 'setConfig', path, value });\n const setState = (next: unknown) => {\n state = typeof next === 'function' ? (next as (prev: unknown) => unknown)(state) : next;\n send({ type: 'setState', state });\n render();\n };\n\n const render = () => {\n const ctx: StoryContext = { config, setConfig, state, setState, globals, title: story.title, name: story.name };\n const at = seq;\n root.render(\n <StoryHost\n story={story}\n ctx={ctx}\n decorators={decorators}\n resetKey={resetKey}\n onError={(error) => send(fault('render', error, at))}\n />,\n );\n const key = stableStringify(config);\n if (key !== answeredKey) {\n answeredKey = key;\n send({ type: 'answers', answers: { configKey: key, ...answerSchema(story.config, config) } });\n }\n };\n\n // Input from the trial commits synchronously, so a `play` that follows sees the rendered story. A throw while\n // applying it faults like a render would; otherwise the trial would wait on a frame that never answers.\n const input = (apply: () => void) => {\n seq += 1;\n try {\n apply();\n if (!initialized) return;\n resetKey += 1;\n flushSync(render);\n } catch (error) {\n send(fault('render', error, seq));\n return;\n }\n if (!rendered) {\n rendered = true;\n announceRendered();\n }\n reportVars();\n };\n\n /**\n * The shell unhides the frame on `rendered` and fades it in, so whatever\n * reflows after that message reads as a glide rather than a jump. A webfont\n * swapping in is the reflow that does it: a `layout: 'padded'` story is\n * top-anchored, so the line-height change walks the whole story upward.\n * Waiting for the fonts and then one painted frame means the story the\n * shell reveals is the settled one.\n *\n * `document.fonts` is absent in jsdom, where there is no paint to wait for\n * and no font to swap — the message stays synchronous there, which is also\n * what `FrameController.test.tsx` observes. The deferral itself is only\n * exercised in a browser.\n */\n const announceRendered = () => {\n const { fonts } = document;\n if (!fonts) {\n send({ type: 'rendered' });\n return;\n }\n const afterPaint = () => requestAnimationFrame(() => send({ type: 'rendered' }));\n void fonts.ready.then(afterPaint, afterPaint);\n };\n\n const play = async () => {\n try {\n await story.play?.({ canvasElement: wrapper, config, globals });\n send({ type: 'played', ok: true });\n } catch (error) {\n send({ type: 'played', ok: false, message: error instanceof Error ? error.message : String(error) });\n send(fault('play', error));\n }\n };\n\n const audit = async (id: string) => {\n try {\n send({ type: 'a11y', id, ok: true, report: await runAxe(wrapper) });\n } catch (error) {\n send({ type: 'a11y', id, ok: false, message: error instanceof Error ? error.message : String(error) });\n }\n };\n\n const picture = (id: string) => {\n try {\n send({ type: 'capture', id, ok: true, picture: captureElement(wrapper) });\n } catch (error) {\n send({ type: 'capture', id, ok: false, message: error instanceof Error ? error.message : String(error) });\n }\n };\n\n const off = channel.on((msg) => {\n switch (msg.type) {\n case 'init':\n input(() => {\n initialized = true;\n config = msg.config;\n globals = msg.globals;\n state = msg.state;\n if (state === null && story.initialState) {\n state = story.initialState(config);\n send({ type: 'setState', state });\n }\n setup.applyGlobals?.(globals, globalsTarget);\n });\n break;\n case 'config':\n input(() => {\n config = msg.config;\n });\n break;\n case 'state':\n input(() => {\n state = msg.state;\n });\n break;\n case 'globals':\n input(() => {\n globals = msg.globals;\n setup.applyGlobals?.(globals, globalsTarget);\n });\n break;\n case 'vars.set': {\n overrides.set(msg.name, msg.value);\n const at = lastVars?.findIndex((v) => v.name === msg.name) ?? -1;\n if (!lastVars || at < 0) break;\n const vars = lastVars.slice();\n vars[at] = { name: msg.name, value: resolveCssVar(document, msg.name), overridden: overrides.has(msg.name) };\n publishVars(vars);\n break;\n }\n case 'play':\n void play();\n break;\n case 'a11y.run':\n void audit(msg.id);\n break;\n case 'capture.run':\n picture(msg.id);\n break;\n }\n });\n\n const observer =\n typeof ResizeObserver === 'undefined'\n ? null\n : new ResizeObserver(() => {\n const { width, height } = wrapper.getBoundingClientRect();\n send({ type: 'size', width: Math.ceil(width), height: Math.ceil(height) });\n });\n observer?.observe(wrapper);\n\n return () => {\n off();\n observer?.disconnect();\n mutations?.disconnect();\n clearTimeout(settleTimer);\n overrides.dispose();\n globalsTarget.dispose();\n root.unmount();\n wrapper.remove();\n };\n}\n\n/** Reports an import failure — there is no story to start. */\nexport function reportImportFault(channel: Channel<ToFrame, FromFrame>, error: unknown): void {\n channel.send(fault('import', error));\n}\n","import { f } from '@weasel-js/labkit/config';\nimport { Component, type ReactNode } from 'react';\nimport { flushSync } from 'react-dom';\nimport { createRoot } from 'react-dom/client';\nimport type { Channel } from '../../protocol/channel';\nimport type { FromFrame, Globals, ToFrame } from '../../protocol/messages';\nimport { describeSchema } from '../../protocol/schema';\nimport type { IndexRender, LoadedStory } from '../../story/types';\nimport { runAxe } from '../a11y';\nimport { captureElement } from '../capture';\nimport type { FrameSetup } from '../FrameController';\nimport { createGlobalsTarget } from '../globalsTarget';\nimport { type IndexEnv, IndexPage } from './IndexPage';\n\nexport interface StartIndexOptions {\n title: string;\n /** The package the component ships in. */\n library?: string;\n description?: string;\n /** Whether the component is a gallery. */\n gallery?: boolean;\n /** The ids of the stories tagged `gallery`. */\n galleries?: readonly string[];\n /** In file order. */\n stories: readonly LoadedStory[];\n descriptions: Readonly<Record<string, string>>;\n /** The component's own page; null for the generated one. */\n render: IndexRender | null;\n channel: Channel<ToFrame, FromFrame>;\n container: HTMLElement;\n setup?: FrameSetup;\n}\n\nconst message = (error: unknown): string => (error instanceof Error ? error.message : String(error));\n\n/** Faults the frame when the page itself throws. A single story's throw stays in its own cell. */\nclass PageBoundary extends Component<{ onError: (error: unknown) => void; children: ReactNode }, { failed: unknown }> {\n override state = { failed: null as unknown };\n\n static getDerivedStateFromError(error: unknown) {\n return { failed: error ?? new Error('Index page failed') };\n }\n\n override componentDidCatch(error: unknown): void {\n this.props.onError(error);\n }\n\n override render(): ReactNode {\n return this.state.failed ? null : this.props.children;\n }\n}\n\n/**\n * Sends `ready` for a page with no controls, then renders the component's index on `init` and follows the lab's\n * globals. Returns a stop function.\n */\nexport function startIndex(options: StartIndexOptions): () => void {\n const { channel, container, setup = {} } = options;\n const { send } = channel;\n send({ type: 'ready', schema: describeSchema(f.schema({})), layout: 'fullscreen', viewport: null });\n\n const wrapper = document.createElement('div');\n wrapper.className = 'fg-frame fg-frame--fullscreen';\n container.append(wrapper);\n const root = createRoot(wrapper);\n const globalsTarget = createGlobalsTarget(document.documentElement, ':root');\n let globals: Globals | null = null;\n let announced = false;\n\n const render = (): void => {\n if (!globals) return;\n const env: IndexEnv = {\n title: options.title,\n ...(options.library === undefined ? {} : { library: options.library }),\n ...(options.description === undefined ? {} : { description: options.description }),\n stories: options.stories,\n descriptions: options.descriptions,\n gallery: options.gallery ?? false,\n galleries: options.galleries ?? [],\n globals,\n decorators: setup.decorators ?? [],\n open: (id) => send({ type: 'open', id }),\n // A story that throws shows its error in its own cell; the rest of the page is still worth reading.\n onError: (error) => console.error(error),\n };\n root.render(\n <PageBoundary onError={(error) => send({ type: 'fault', phase: 'render', message: message(error) })}>\n <IndexPage env={env} render={options.render} />\n </PageBoundary>,\n );\n };\n\n const announce = (): void => {\n if (announced) return;\n announced = true;\n const { fonts } = document;\n if (!fonts) {\n send({ type: 'rendered' });\n return;\n }\n const afterPaint = () => requestAnimationFrame(() => send({ type: 'rendered' }));\n void fonts.ready.then(afterPaint, afterPaint);\n };\n\n const off = channel.on((msg) => {\n switch (msg.type) {\n case 'init':\n case 'globals':\n globals = msg.globals;\n setup.applyGlobals?.(globals, globalsTarget);\n flushSync(render);\n announce();\n break;\n case 'a11y.run':\n runAxe(wrapper).then(\n (report) => send({ type: 'a11y', id: msg.id, ok: true, report }),\n (error: unknown) => send({ type: 'a11y', id: msg.id, ok: false, message: message(error) }),\n );\n break;\n case 'capture.run':\n try {\n send({ type: 'capture', id: msg.id, ok: true, picture: captureElement(wrapper) });\n } catch (error) {\n send({ type: 'capture', id: msg.id, ok: false, message: message(error) });\n }\n break;\n default:\n break;\n }\n });\n\n return () => {\n off();\n globalsTarget.dispose();\n root.unmount();\n wrapper.remove();\n };\n}\n","import { openChannel } from '../protocol/channel';\nimport { FRAME_HELLO, type FromFrame, PORT_HANDOFF, type ToFrame } from '../protocol/messages';\nimport { indexId, isIndexId } from '../story/indexPages';\nimport { libraryOf } from '../story/library';\nimport { isGallery } from '../story/tags';\nimport { indexRenderOf, loadStories } from '../story/load';\nimport type { LoadedStory } from '../story/types';\nimport { type FrameSetup, reportImportFault, startFrame } from './FrameController';\nimport { startIndex } from './index/startIndex';\n\n/** Story modules by file path, each loaded on first use. */\nexport interface FrameImporters {\n [file: string]: () => Promise<Record<string, unknown>>;\n}\n\n/** One story as a frame document needs to find it, before its module is loaded. */\nexport interface FrameIndexEntry {\n id: string;\n /** The story's title as indexed, which titles the file's stories when its meta names none. */\n title: string;\n file: string;\n exportName: string;\n /** The JSDoc above the story's export, which its index page shows. */\n description?: string;\n /** The JSDoc above the file's meta, which heads the index page. */\n componentDescription?: string;\n /** The meta's `tags`. */\n tags?: readonly string[];\n}\n\n/** Inputs to `mountFrame`. `load` replaces the default module loader, `loadStories`. */\nexport interface MountFrameOptions {\n index: readonly FrameIndexEntry[];\n importers: FrameImporters;\n setup?: FrameSetup;\n load?: (mod: Record<string, unknown>, autoTitle: string, parameters?: Record<string, unknown>) => LoadedStory[];\n}\n\nexport { indexRenderOf, loadStories } from '../story/load';\n\nfunction waitForHandoff():Promise<{ port: MessagePort; id: string | null }> {\n return new Promise((resolve) => {\n const onMessage = (event: MessageEvent) => {\n const data = event.data as { type?: unknown; id?: unknown } | null;\n const port = event.ports[0];\n if (event.origin !== location.origin || event.source !== window.parent) return;\n if (typeof data !== 'object' || data === null || data.type !== PORT_HANDOFF || !port) return;\n window.removeEventListener('message', onMessage);\n resolve({ port, id: typeof data.id === 'string' ? data.id : null });\n };\n window.addEventListener('message', onMessage);\n });\n}\n\n/**\n * The frame document's entry: asks its parent for a port and shows what the handoff names, or, from a shell that\n * names nothing, what the hash does. The hash is read at once, so its module loads during the handshake.\n */\nexport async function mountFrame(options: MountFrameOptions): Promise<void> {\n const imports = new Map<string, Promise<Record<string, unknown>>>();\n const importOf = (file: string): Promise<Record<string, unknown>> => {\n let loading = imports.get(file);\n if (!loading) {\n const importer = options.importers[file];\n if (!importer) throw new Error(`No importer for ${file}`);\n loading = importer();\n imports.set(file, loading);\n }\n return loading;\n };\n /** The entries `id` shows: one story, or every story of the component an index id names. */\n const entriesOf = (id: string): FrameIndexEntry[] =>\n isIndexId(id)\n ? options.index.filter((e) => indexId(e.title) === id)\n : options.index.filter((e) => e.id === id);\n const early = location.hash.slice(1) || null;\n // Only starts the fetch; whoever awaits the import later sees its outcome.\n for (const file of new Set(early === null ? [] : entriesOf(early).map((e) => e.file))) {\n if (options.importers[file]) importOf(file).catch(() => {});\n }\n\n const handoff = waitForHandoff();\n window.parent.postMessage({ type: FRAME_HELLO }, location.origin);\n const { port, id: handed } = await handoff;\n const channel = openChannel<ToFrame, FromFrame>(port);\n const id = handed ?? early ?? '';\n const container = document.getElementById('root') ?? document.body;\n try {\n if (isIndexId(id)) {\n const entries = entriesOf(id);\n const title = entries[0]?.title;\n if (title === undefined) throw new Error(`No component with index \"${id}\"`);\n const files = [...new Set(entries.map((e) => e.file))];\n const mods = await Promise.all(files.map(importOf));\n const loaded = files.map((file, i) => ({\n file,\n stories: (options.load ?? loadStories)(mods[i] ?? {}, title, options.setup?.parameters),\n }));\n const stories = entries.flatMap(\n (e) => loaded.find((l) => l.file === e.file)?.stories.find((s) => s.exportName === e.exportName) ?? [],\n );\n for (const story of stories) await options.setup?.prepare?.(story);\n startIndex({\n title,\n ...(entries[0]?.componentDescription === undefined ? {} : { description: entries[0].componentDescription }),\n library: libraryOf({ file: entries[0]?.file ?? '', title }),\n gallery: entries.every(isGallery),\n galleries: entries.filter(isGallery).map((e) => e.id),\n stories,\n descriptions: Object.fromEntries(entries.flatMap((e) => (e.description ? [[e.id, e.description]] : []))),\n render: mods.map(indexRenderOf).find((render) => render !== null) ?? null,\n channel,\n container,\n ...(options.setup ? { setup: options.setup } : {}),\n });\n return;\n }\n const entry = options.index.find((e) => e.id === id);\n if (!entry) throw new Error(`No story with id \"${id}\"`);\n const mod = await importOf(entry.file);\n const stories = (options.load ?? loadStories)(mod, entry.title, options.setup?.parameters);\n const story = stories.find((s) => s.exportName === entry.exportName);\n if (!story) throw new Error(`${entry.file} has no story export \"${entry.exportName}\"`);\n await options.setup?.prepare?.(story);\n startFrame({ story, channel, container, setup: options.setup });\n } catch (error) {\n reportImportFault(channel, error);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/frame/FrameController.tsx","../../src/frame/index/startIndex.tsx","../../src/frame/mountFrame.tsx"],"names":["createRoot","jsx","flushSync","id","stories","story"],"mappings":"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","file":"index.js","sourcesContent":["import { flushSync } from 'react-dom';\nimport { createRoot } from 'react-dom/client';\nimport type { Channel } from '../protocol/channel';\nimport {\n type CssVarReport,\n type FaultPhase,\n type FromFrame,\n type Globals,\n stableStringify,\n type ToFrame,\n} from '../protocol/messages';\nimport { answerSchema, describeSchema } from '../protocol/schema';\nimport type { Decorator, LoadedStory, StoryContext } from '../story/types';\nimport { runAxe } from './a11y';\nimport { captureElement } from './capture';\nimport { createOverrides, resolveCssVar, scanCssVars } from './cssVars';\nimport { createGlobalsTarget, type GlobalsTarget } from './globalsTarget';\nimport { StoryHost } from './StoryHost';\n\n/** The frame config: what `defineFrameConfig` returns and the `frameConfig` module default-exports. */\nexport interface FrameSetup {\n /** Wraps every story, outermost; receives the globals. From the frame config (`frameConfig`). */\n decorators?: Decorator[];\n /** Applies globals to a target: theme mode, fonts. The target is a frame document's root, or one story's host in\n * the workshop document, so a rule the setup writes goes through `target.style` under `target.scope`. */\n applyGlobals?: (globals: Globals, target: GlobalsTarget) => void;\n /**\n * The elements a CSS variable override is declared on; `:root` by default. An override has to be declared on\n * whichever element declares the token itself — a theme wrapper, say — or that element's own value wins.\n */\n cssVarsScope?: string;\n /** Project-wide CSF parameters, Storybook's preview `parameters`: under each meta's and story's. */\n parameters?: Record<string, unknown>;\n /**\n * Awaited once a story is loaded and before it first renders — the place to import what only some stories\n * need, so the rest never load it.\n */\n prepare?: (story: LoadedStory) => void | Promise<void>;\n}\n\n/** Inputs to `startFrame`: the story, the channel to the shell, and the element to render into. */\nexport interface StartFrameOptions {\n story: LoadedStory;\n channel: Channel<ToFrame, FromFrame>;\n container: HTMLElement;\n setup?: FrameSetup;\n}\n\nconst VARS_SETTLE_MS = 100;\n\nfunction fault(phase: FaultPhase, error: unknown, seq?: number): FromFrame {\n return {\n type: 'fault',\n phase,\n message: error instanceof Error ? error.message : String(error),\n ...(error instanceof Error && error.stack ? { stack: error.stack } : {}),\n ...(seq === undefined ? {} : { seq }),\n };\n}\n\n/** Sends `ready`, then renders the story on `init` and keeps it in step. Returns a stop function. */\nexport function startFrame({ story, channel, container, setup = {} }: StartFrameOptions): () => void {\n const { send } = channel;\n send({ type: 'ready', schema: describeSchema(story.config), layout: story.layout, viewport: story.viewport });\n\n const wrapper = document.createElement('div');\n wrapper.className = `fg-frame fg-frame--${story.layout}`;\n container.append(wrapper);\n const root = createRoot(wrapper);\n const decorators = setup.decorators ?? [];\n\n let initialized = false;\n let rendered = false;\n let config: unknown;\n let state: unknown = null;\n let globals: Globals = {};\n let answeredKey: string | null = null;\n let resetKey = 0;\n let seq = 0;\n\n const overrides = createOverrides(document, setup.cssVarsScope);\n const globalsTarget = createGlobalsTarget(document.documentElement, ':root');\n let lastVars: CssVarReport[] | null = null;\n let reported: string | null = null;\n const publishVars = (vars: CssVarReport[]) => {\n lastVars = vars;\n const key = JSON.stringify(vars);\n if (key === reported) return;\n reported = key;\n send({ type: 'vars', vars });\n };\n const reportVars = () => publishVars(scanCssVars(document, overrides.has));\n const ownMutation = (record: MutationRecord) =>\n overrides.owns(record.target) ||\n (record.type === 'childList' &&\n [...record.addedNodes, ...record.removedNodes].length > 0 &&\n [...record.addedNodes, ...record.removedNodes].every(overrides.owns));\n let settleTimer: ReturnType<typeof setTimeout> | undefined;\n const mutations =\n typeof MutationObserver === 'undefined'\n ? null\n : new MutationObserver((records) => {\n if (records.every(ownMutation)) return;\n clearTimeout(settleTimer);\n settleTimer = setTimeout(reportVars, VARS_SETTLE_MS);\n });\n // Every attribute, not just style and class: a stylesheet can select on any of them, `[data-wzl-mode]` included.\n mutations?.observe(document.documentElement, { subtree: true, childList: true, characterData: true, attributes: true });\n\n const setConfig = (path: string, value: unknown) => send({ type: 'setConfig', path, value });\n const setState = (next: unknown) => {\n state = typeof next === 'function' ? (next as (prev: unknown) => unknown)(state) : next;\n send({ type: 'setState', state });\n render();\n };\n\n const render = () => {\n const ctx: StoryContext = { config, setConfig, state, setState, globals, title: story.title, name: story.name };\n const at = seq;\n root.render(\n <StoryHost\n story={story}\n ctx={ctx}\n decorators={decorators}\n resetKey={resetKey}\n onError={(error) => send(fault('render', error, at))}\n />,\n );\n const key = stableStringify(config);\n if (key !== answeredKey) {\n answeredKey = key;\n send({ type: 'answers', answers: { configKey: key, ...answerSchema(story.config, config) } });\n }\n };\n\n // Input from the trial commits synchronously, so a `play` that follows sees the rendered story. A throw while\n // applying it faults like a render would; otherwise the trial would wait on a frame that never answers.\n const input = (apply: () => void) => {\n seq += 1;\n try {\n apply();\n if (!initialized) return;\n resetKey += 1;\n flushSync(render);\n } catch (error) {\n send(fault('render', error, seq));\n return;\n }\n if (!rendered) {\n rendered = true;\n announceRendered();\n }\n reportVars();\n };\n\n /**\n * The shell unhides the frame on `rendered` and fades it in, so whatever\n * reflows after that message reads as a glide rather than a jump. A webfont\n * swapping in is the reflow that does it: a `layout: 'padded'` story is\n * top-anchored, so the line-height change walks the whole story upward.\n * Waiting for the fonts and then one painted frame means the story the\n * shell reveals is the settled one.\n *\n * `document.fonts` is absent in jsdom, where there is no paint to wait for\n * and no font to swap — the message stays synchronous there, which is also\n * what `FrameController.test.tsx` observes. The deferral itself is only\n * exercised in a browser.\n */\n const announceRendered = () => {\n const { fonts } = document;\n if (!fonts) {\n send({ type: 'rendered' });\n return;\n }\n const afterPaint = () => requestAnimationFrame(() => send({ type: 'rendered' }));\n void fonts.ready.then(afterPaint, afterPaint);\n };\n\n const play = async () => {\n try {\n await story.play?.({ canvasElement: wrapper, config, globals });\n send({ type: 'played', ok: true });\n } catch (error) {\n send({ type: 'played', ok: false, message: error instanceof Error ? error.message : String(error) });\n send(fault('play', error));\n }\n };\n\n const audit = async (id: string) => {\n try {\n send({ type: 'a11y', id, ok: true, report: await runAxe(wrapper) });\n } catch (error) {\n send({ type: 'a11y', id, ok: false, message: error instanceof Error ? error.message : String(error) });\n }\n };\n\n const picture = (id: string) => {\n try {\n send({ type: 'capture', id, ok: true, picture: captureElement(wrapper) });\n } catch (error) {\n send({ type: 'capture', id, ok: false, message: error instanceof Error ? error.message : String(error) });\n }\n };\n\n const off = channel.on((msg) => {\n switch (msg.type) {\n case 'init':\n input(() => {\n initialized = true;\n config = msg.config;\n globals = msg.globals;\n state = msg.state;\n if (state === null && story.initialState) {\n state = story.initialState(config);\n send({ type: 'setState', state });\n }\n setup.applyGlobals?.(globals, globalsTarget);\n });\n break;\n case 'config':\n input(() => {\n config = msg.config;\n });\n break;\n case 'state':\n input(() => {\n state = msg.state;\n });\n break;\n case 'globals':\n input(() => {\n globals = msg.globals;\n setup.applyGlobals?.(globals, globalsTarget);\n });\n break;\n case 'vars.set': {\n overrides.set(msg.name, msg.value);\n const at = lastVars?.findIndex((v) => v.name === msg.name) ?? -1;\n if (!lastVars || at < 0) break;\n const vars = lastVars.slice();\n vars[at] = { name: msg.name, value: resolveCssVar(document, msg.name), overridden: overrides.has(msg.name) };\n publishVars(vars);\n break;\n }\n case 'play':\n void play();\n break;\n case 'a11y.run':\n void audit(msg.id);\n break;\n case 'capture.run':\n picture(msg.id);\n break;\n }\n });\n\n const observer =\n typeof ResizeObserver === 'undefined'\n ? null\n : new ResizeObserver(() => {\n const { width, height } = wrapper.getBoundingClientRect();\n send({ type: 'size', width: Math.ceil(width), height: Math.ceil(height) });\n });\n observer?.observe(wrapper);\n\n return () => {\n off();\n observer?.disconnect();\n mutations?.disconnect();\n clearTimeout(settleTimer);\n overrides.dispose();\n globalsTarget.dispose();\n root.unmount();\n wrapper.remove();\n };\n}\n\n/** Reports an import failure — there is no story to start. */\nexport function reportImportFault(channel: Channel<ToFrame, FromFrame>, error: unknown): void {\n channel.send(fault('import', error));\n}\n","import { f } from '@weasel-js/labkit/config';\nimport { Component, type ReactNode } from 'react';\nimport { flushSync } from 'react-dom';\nimport { createRoot } from 'react-dom/client';\nimport type { Channel } from '../../protocol/channel';\nimport type { FromFrame, Globals, ToFrame } from '../../protocol/messages';\nimport { describeSchema } from '../../protocol/schema';\nimport type { IndexRender, LoadedStory } from '../../story/types';\nimport { runAxe } from '../a11y';\nimport { captureElement } from '../capture';\nimport type { FrameSetup } from '../FrameController';\nimport { createGlobalsTarget } from '../globalsTarget';\nimport { type IndexEnv, IndexPage } from './IndexPage';\n\nexport interface StartIndexOptions {\n title: string;\n /** The package the component ships in. */\n library?: string;\n description?: string;\n /** Whether the component is a gallery. */\n gallery?: boolean;\n /** The ids of the stories tagged `gallery`. */\n galleries?: readonly string[];\n /** In file order. */\n stories: readonly LoadedStory[];\n descriptions: Readonly<Record<string, string>>;\n /** The component's own page; null for the generated one. */\n render: IndexRender | null;\n channel: Channel<ToFrame, FromFrame>;\n container: HTMLElement;\n setup?: FrameSetup;\n}\n\nconst message = (error: unknown): string => (error instanceof Error ? error.message : String(error));\n\n/** Faults the frame when the page itself throws. A single story's throw stays in its own cell. */\nclass PageBoundary extends Component<{ onError: (error: unknown) => void; children: ReactNode }, { failed: unknown }> {\n override state = { failed: null as unknown };\n\n static getDerivedStateFromError(error: unknown) {\n return { failed: error ?? new Error('Index page failed') };\n }\n\n override componentDidCatch(error: unknown): void {\n this.props.onError(error);\n }\n\n override render(): ReactNode {\n return this.state.failed ? null : this.props.children;\n }\n}\n\n/**\n * Sends `ready` for a page with no controls, then renders the component's index on `init` and follows the lab's\n * globals. Returns a stop function.\n */\nexport function startIndex(options: StartIndexOptions): () => void {\n const { channel, container, setup = {} } = options;\n const { send } = channel;\n send({ type: 'ready', schema: describeSchema(f.schema({})), layout: 'fullscreen', viewport: null });\n\n const wrapper = document.createElement('div');\n wrapper.className = 'fg-frame fg-frame--fullscreen';\n container.append(wrapper);\n const root = createRoot(wrapper);\n const globalsTarget = createGlobalsTarget(document.documentElement, ':root');\n let globals: Globals | null = null;\n let announced = false;\n\n const render = (): void => {\n if (!globals) return;\n const env: IndexEnv = {\n title: options.title,\n ...(options.library === undefined ? {} : { library: options.library }),\n ...(options.description === undefined ? {} : { description: options.description }),\n stories: options.stories,\n descriptions: options.descriptions,\n gallery: options.gallery ?? false,\n galleries: options.galleries ?? [],\n globals,\n decorators: setup.decorators ?? [],\n open: (id) => send({ type: 'open', id }),\n // A story that throws shows its error in its own cell; the rest of the page is still worth reading.\n onError: (error) => console.error(error),\n };\n root.render(\n <PageBoundary onError={(error) => send({ type: 'fault', phase: 'render', message: message(error) })}>\n <IndexPage env={env} render={options.render} />\n </PageBoundary>,\n );\n };\n\n const announce = (): void => {\n if (announced) return;\n announced = true;\n const { fonts } = document;\n if (!fonts) {\n send({ type: 'rendered' });\n return;\n }\n const afterPaint = () => requestAnimationFrame(() => send({ type: 'rendered' }));\n void fonts.ready.then(afterPaint, afterPaint);\n };\n\n const off = channel.on((msg) => {\n switch (msg.type) {\n case 'init':\n case 'globals':\n globals = msg.globals;\n setup.applyGlobals?.(globals, globalsTarget);\n flushSync(render);\n announce();\n break;\n case 'a11y.run':\n runAxe(wrapper).then(\n (report) => send({ type: 'a11y', id: msg.id, ok: true, report }),\n (error: unknown) => send({ type: 'a11y', id: msg.id, ok: false, message: message(error) }),\n );\n break;\n case 'capture.run':\n try {\n send({ type: 'capture', id: msg.id, ok: true, picture: captureElement(wrapper) });\n } catch (error) {\n send({ type: 'capture', id: msg.id, ok: false, message: message(error) });\n }\n break;\n default:\n break;\n }\n });\n\n return () => {\n off();\n globalsTarget.dispose();\n root.unmount();\n wrapper.remove();\n };\n}\n","import { openChannel } from '../protocol/channel';\nimport { FRAME_HELLO, type FromFrame, PORT_HANDOFF, type ToFrame } from '../protocol/messages';\nimport { indexId, isIndexId } from '../story/indexPages';\nimport { libraryOf } from '../story/library';\nimport { isGallery } from '../story/tags';\nimport { indexRenderOf, loadStories } from '../story/load';\nimport type { LoadedStory } from '../story/types';\nimport { type FrameSetup, reportImportFault, startFrame } from './FrameController';\nimport { startIndex } from './index/startIndex';\n\n/** Story modules by file path, each loaded on first use. */\nexport interface FrameImporters {\n [file: string]: () => Promise<Record<string, unknown>>;\n}\n\n/** One story as a frame document needs to find it, before its module is loaded. */\nexport interface FrameIndexEntry {\n id: string;\n /** The story's title as indexed, which titles the file's stories when its meta names none. */\n title: string;\n file: string;\n exportName: string;\n /** The JSDoc above the story's export, which its index page shows. */\n description?: string;\n /** The JSDoc above the file's meta, which heads the index page. */\n componentDescription?: string;\n /** The meta's `tags`. */\n tags?: readonly string[];\n}\n\n/** Inputs to `mountFrame`. `load` replaces the default module loader, `loadStories`. */\nexport interface MountFrameOptions {\n index: readonly FrameIndexEntry[];\n importers: FrameImporters;\n setup?: FrameSetup;\n load?: (mod: Record<string, unknown>, autoTitle: string, parameters?: Record<string, unknown>) => LoadedStory[];\n}\n\nexport { indexRenderOf, loadStories } from '../story/load';\n\nfunction waitForHandoff():Promise<{ port: MessagePort; id: string | null }> {\n return new Promise((resolve) => {\n const onMessage = (event: MessageEvent) => {\n const data = event.data as { type?: unknown; id?: unknown } | null;\n const port = event.ports[0];\n if (event.origin !== location.origin || event.source !== window.parent) return;\n if (typeof data !== 'object' || data === null || data.type !== PORT_HANDOFF || !port) return;\n window.removeEventListener('message', onMessage);\n resolve({ port, id: typeof data.id === 'string' ? data.id : null });\n };\n window.addEventListener('message', onMessage);\n });\n}\n\n/**\n * The frame document's entry: asks its parent for a port and shows what the handoff names, or, from a shell that\n * names nothing, what the hash does. The hash is read at once, so its module loads during the handshake.\n */\nexport async function mountFrame(options: MountFrameOptions): Promise<void> {\n const imports = new Map<string, Promise<Record<string, unknown>>>();\n const importOf = (file: string): Promise<Record<string, unknown>> => {\n let loading = imports.get(file);\n if (!loading) {\n const importer = options.importers[file];\n if (!importer) throw new Error(`No importer for ${file}`);\n loading = importer();\n imports.set(file, loading);\n }\n return loading;\n };\n /** The entries `id` shows: one story, or every story of the component an index id names. */\n const entriesOf = (id: string): FrameIndexEntry[] =>\n isIndexId(id)\n ? options.index.filter((e) => indexId(e.title) === id)\n : options.index.filter((e) => e.id === id);\n const early = location.hash.slice(1) || null;\n // Only starts the fetch; whoever awaits the import later sees its outcome.\n for (const file of new Set(early === null ? [] : entriesOf(early).map((e) => e.file))) {\n if (options.importers[file]) importOf(file).catch(() => {});\n }\n\n const handoff = waitForHandoff();\n window.parent.postMessage({ type: FRAME_HELLO }, location.origin);\n const { port, id: handed } = await handoff;\n const channel = openChannel<ToFrame, FromFrame>(port);\n const id = handed ?? early ?? '';\n const container = document.getElementById('root') ?? document.body;\n try {\n if (isIndexId(id)) {\n const entries = entriesOf(id);\n const title = entries[0]?.title;\n if (title === undefined) throw new Error(`No component with index \"${id}\"`);\n const files = [...new Set(entries.map((e) => e.file))];\n const mods = await Promise.all(files.map(importOf));\n const loaded = files.map((file, i) => ({\n file,\n stories: (options.load ?? loadStories)(mods[i] ?? {}, title, options.setup?.parameters),\n }));\n const stories = entries.flatMap(\n (e) => loaded.find((l) => l.file === e.file)?.stories.find((s) => s.exportName === e.exportName) ?? [],\n );\n for (const story of stories) await options.setup?.prepare?.(story);\n startIndex({\n title,\n ...(entries[0]?.componentDescription === undefined ? {} : { description: entries[0].componentDescription }),\n library: libraryOf({ file: entries[0]?.file ?? '', title }),\n gallery: entries.every(isGallery),\n galleries: entries.filter(isGallery).map((e) => e.id),\n stories,\n descriptions: Object.fromEntries(entries.flatMap((e) => (e.description ? [[e.id, e.description]] : []))),\n render: mods.map(indexRenderOf).find((render) => render !== null) ?? null,\n channel,\n container,\n ...(options.setup ? { setup: options.setup } : {}),\n });\n return;\n }\n const entry = options.index.find((e) => e.id === id);\n if (!entry) throw new Error(`No story with id \"${id}\"`);\n const mod = await importOf(entry.file);\n const stories = (options.load ?? loadStories)(mod, entry.title, options.setup?.parameters);\n const story = stories.find((s) => s.exportName === entry.exportName);\n if (!story) throw new Error(`${entry.file} has no story export \"${entry.exportName}\"`);\n await options.setup?.prepare?.(story);\n startFrame({ story, channel, container, setup: options.setup });\n } catch (error) {\n reportImportFault(channel, error);\n }\n}\n"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
|
+
import { ConfigSchema } from '@weasel-js/labkit/config';
|
|
1
2
|
export { f } from '@weasel-js/labkit/config';
|
|
2
|
-
export { F as FOLLOW_APP, G as GlobalDeclaration, a as GlobalDeclarations, L as LabChrome, S as ShellConfig, d as defineFrameConfig, b as defineShellConfig } from './config-
|
|
3
|
+
export { F as FOLLOW_APP, G as GlobalDeclaration, a as GlobalDeclarations, L as LabChrome, S as ShellConfig, d as defineFrameConfig, b as defineShellConfig } from './config-DoLWwEb2.js';
|
|
3
4
|
import { ComponentType, ReactNode } from 'react';
|
|
4
|
-
import { G as Globals, M as MetaSpec, S as StorySpec } from './FrameController-
|
|
5
|
-
export { A as A11yFinding,
|
|
5
|
+
import { G as Globals, M as MetaSpec, S as StorySpec, C as ClockState, a as SpanOverride } from './FrameController-BH8xJHZ8.js';
|
|
6
|
+
export { A as A11yFinding, b as A11yNode, c as A11yReport, d as ComponentDeps, D as Decorator, e as DepGraph, F as FrameSetup, f as GlobalsTarget, I as IndexContext, g as IndexRender, h as IndexStoryProps, L as LoadedStory, P as PlayContext, i as StoryContext, T as TimelineSpec } from './FrameController-BH8xJHZ8.js';
|
|
6
7
|
import '@weasel-js/labkit';
|
|
7
8
|
import '@weasel-js/theme';
|
|
8
9
|
|
|
@@ -103,12 +104,86 @@ interface StoryObj<T = unknown> extends Shared<T> {
|
|
|
103
104
|
storyName?: string;
|
|
104
105
|
}
|
|
105
106
|
|
|
107
|
+
/** Param names that are never knobs. */
|
|
108
|
+
declare const RESERVED_PARAMS: ReadonlySet<string>;
|
|
109
|
+
/** What a forge hash holds: the story it names, and every param after it, knobs and reserved alike, in order. */
|
|
110
|
+
interface ForgeRoute {
|
|
111
|
+
story: string | null;
|
|
112
|
+
params: Readonly<Record<string, string>>;
|
|
113
|
+
}
|
|
114
|
+
/** Reads a hash (`location.hash`, with or without its `#`). Anything not in the `#/<id>` form names no story. */
|
|
115
|
+
declare function parseRoute(hash: string): ForgeRoute;
|
|
116
|
+
/** The hash for `route`, with its leading `#`. The inverse of `parseRoute`. */
|
|
117
|
+
declare function formatRoute(route: ForgeRoute): string;
|
|
118
|
+
/** The params that are knobs, with the reserved ones left out. */
|
|
119
|
+
declare function knobParams(params: Readonly<Record<string, string>>): Record<string, string>;
|
|
120
|
+
/** The params that are not knobs. Kept as they are when the knobs are rewritten. */
|
|
121
|
+
declare function reservedParams(params: Readonly<Record<string, string>>): Record<string, string>;
|
|
122
|
+
/** What a knob's value is decoded against: its schema leaf's declared kind, its default, and its choices. */
|
|
123
|
+
interface KnobLeaf {
|
|
124
|
+
kind: string | null;
|
|
125
|
+
default: unknown;
|
|
126
|
+
annotations?: {
|
|
127
|
+
options?: readonly {
|
|
128
|
+
value: string;
|
|
129
|
+
}[];
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
/** A value as one param. Undefined for a value no param can carry, such as a function. */
|
|
133
|
+
declare function encodeKnob(value: unknown): string | undefined;
|
|
134
|
+
/**
|
|
135
|
+
* One param read as `leaf`'s type: `{ value }`, or undefined for a param that does not parse as one — a number that
|
|
136
|
+
* is not a number, an option the enum does not list, malformed JSON. A bare boolean param (`?dark`) reads as true.
|
|
137
|
+
*/
|
|
138
|
+
declare function decodeKnob(raw: string, leaf: KnobLeaf): {
|
|
139
|
+
value: unknown;
|
|
140
|
+
} | undefined;
|
|
141
|
+
/** One leaf a URL can address: its dotted path, and what its value decodes against. */
|
|
142
|
+
interface KnobPath {
|
|
143
|
+
path: string;
|
|
144
|
+
leaf: KnobLeaf;
|
|
145
|
+
}
|
|
146
|
+
/** Every leaf of `schema` a param can carry, in schema order, with branches flattened into dotted paths. */
|
|
147
|
+
declare function knobPaths(schema: Pick<ConfigSchema<unknown>, 'nodes'>): KnobPath[];
|
|
148
|
+
/**
|
|
149
|
+
* The knob params for `config`: one per leaf whose value differs from its default, keyed by dotted path, in schema
|
|
150
|
+
* order. A leaf absent from `config` is at its default.
|
|
151
|
+
*/
|
|
152
|
+
declare function knobsToParams(schema: Pick<ConfigSchema<unknown>, 'nodes'>, config: unknown): Record<string, string>;
|
|
153
|
+
/**
|
|
154
|
+
* The knob values `params` sets, by dotted path, each coerced to its leaf's type. A param naming no leaf, a reserved
|
|
155
|
+
* param, and one that does not parse as its leaf's type are left out rather than failing the rest.
|
|
156
|
+
*/
|
|
157
|
+
declare function paramsToKnobs(schema: Pick<ConfigSchema<unknown>, 'nodes'>, params: Readonly<Record<string, string>>): Record<string, unknown>;
|
|
158
|
+
/**
|
|
159
|
+
* A link to a story at a given state, for a host that has no schema to hand: each knob is a dotted path and a value,
|
|
160
|
+
* encoded by its own type. `params` adds workshop params, such as `t`.
|
|
161
|
+
*/
|
|
162
|
+
declare function storyHref(story: string, knobs?: Readonly<Record<string, unknown>>, params?: Readonly<Record<string, string>>): string;
|
|
163
|
+
|
|
106
164
|
/** Declares a native story file's meta; default-export the result. */
|
|
107
165
|
declare function meta(spec: MetaSpec): MetaSpec;
|
|
108
166
|
/** Declares one native story; export the result under the story's name. `C` and `S` come from `config` and `state`. */
|
|
109
167
|
declare function story<C = Record<string, never>, S = undefined>(spec: StorySpec<C, S>): StorySpec<C, S>;
|
|
110
168
|
|
|
169
|
+
/** What `useTimeline` hands a story: where its playhead stands, and the moves the transport makes. Times in ms. */
|
|
170
|
+
interface StoryTimeline extends ClockState {
|
|
171
|
+
play(): void;
|
|
172
|
+
pause(): void;
|
|
173
|
+
seek(time: number): void;
|
|
174
|
+
setLoop(loop: boolean): void;
|
|
175
|
+
setRate(rate: number): void;
|
|
176
|
+
/** Replaces the declared span, for one the story only learns once it runs; null goes back to the declared one. */
|
|
177
|
+
setSpan(span: SpanOverride | null): void;
|
|
178
|
+
}
|
|
179
|
+
/** The story's playhead, in ms. Re-renders only the component calling it, on every move. Throws outside a story that
|
|
180
|
+
* declares a timeline. */
|
|
181
|
+
declare function usePlayhead(): number;
|
|
182
|
+
/** The story's whole clock: playhead, span, play state, loop and rate, and the moves on them. Throws outside a story
|
|
183
|
+
* that declares a timeline. */
|
|
184
|
+
declare function useTimeline(): StoryTimeline;
|
|
185
|
+
|
|
111
186
|
/** The meta tag marking a story file as a gallery: a catalog of many components, or of every permutation of one. */
|
|
112
187
|
declare const GALLERY_TAG = "gallery";
|
|
113
188
|
|
|
114
|
-
export { type ArgType, type ArgsOf, type CsfDecorator, type CsfPlayContext, type CsfStep, type CsfStoryContext, GALLERY_TAG, type Meta, MetaSpec, type StoryObj, StorySpec, meta, story };
|
|
189
|
+
export { type ArgType, type ArgsOf, type CsfDecorator, type CsfPlayContext, type CsfStep, type CsfStoryContext, type ForgeRoute, GALLERY_TAG, type KnobLeaf, type KnobPath, type Meta, MetaSpec, RESERVED_PARAMS, SpanOverride, type StoryObj, StorySpec, type StoryTimeline, decodeKnob, encodeKnob, formatRoute, knobParams, knobPaths, knobsToParams, meta, paramsToKnobs, parseRoute, reservedParams, story, storyHref, usePlayhead, useTimeline };
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
|
+
export { RESERVED_PARAMS, decodeKnob, encodeKnob, formatRoute, knobParams, knobPaths, knobsToParams, paramsToKnobs, parseRoute, reservedParams, storyHref } from './chunk-CJX3W5HY.js';
|
|
1
2
|
export { GALLERY_TAG } from './chunk-WEQSLPKT.js';
|
|
2
|
-
export { FOLLOW_APP } from './chunk-
|
|
3
|
-
export { meta, story } from './chunk-
|
|
3
|
+
export { FOLLOW_APP } from './chunk-NI5FYQHW.js';
|
|
4
|
+
export { meta, story, usePlayhead, useTimeline } from './chunk-L5XM5VKB.js';
|
|
5
|
+
import './chunk-KJGXJD3U.js';
|
|
4
6
|
export { f } from '@weasel-js/labkit/config';
|
|
5
7
|
|
|
6
8
|
// src/config.ts
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/config.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../src/config.ts"],"names":[],"mappings":";;;;;;;;AA2BO,SAAS,kBAAkB,MAAA,EAAgC;AAChE,EAAA,OAAO,MAAA;AACT;AAGO,SAAS,kBAAkB,MAAA,EAAkC;AAClE,EAAA,OAAO,MAAA;AACT","file":"index.js","sourcesContent":["import type { LabContribution, LabPage } from '@weasel-js/labkit';\nimport type { Theme } from '@weasel-js/theme';\nimport type { ControlRenderer } from '@weasel-js/labkit/config';\nimport type { FrameSetup } from './frame/FrameController';\nimport type { Globals } from './protocol/messages';\nimport type { GlobalDeclarations } from './shell/globals';\n\n/** A shell config module: what the workshop adds to the lab. Only the workshop page imports it. */\nexport interface ShellConfig {\n /** The workshop's name, in its header and as the document title. Default `weaselforge`. */\n title?: string;\n /** Whether the lab offers the CSS Vars panel. Default true. */\n cssVars?: boolean;\n labChrome?: readonly LabContribution[];\n controls?: Record<string, ControlRenderer>;\n /** Globals the lab's header sets for every story, each pinnable per trial. Frames apply them with `applyGlobals`. */\n globals?: GlobalDeclarations;\n /** The theme the workshop's own chrome takes at the lab's current globals, so a global can restyle the workshop\n * as well as the stories. Default: labkit's. */\n labTheme?: (globals: Globals) => Theme;\n /** The project's other labs, offered in the workshop's title menu. */\n pages?: readonly LabPage[];\n /** Which of `pages` the workshop is, when the URL alone cannot say, as across dev servers on different ports. */\n path?: string;\n}\n\n/** A frame config module's default export. Only frame documents import it, so its CSS stays out of the workshop. */\nexport function defineFrameConfig(config: FrameSetup): FrameSetup {\n return config;\n}\n\n/** A shell config module's default export. */\nexport function defineShellConfig(config: ShellConfig): ShellConfig {\n return config;\n}\n"]}
|
package/dist/shell/index.css
CHANGED
|
@@ -468,6 +468,19 @@
|
|
|
468
468
|
font-size: var(--wzl-font-size-sm);
|
|
469
469
|
}
|
|
470
470
|
|
|
471
|
+
/* src/timeline/timeline.css */
|
|
472
|
+
.fg-transport {
|
|
473
|
+
display: flex;
|
|
474
|
+
align-items: center;
|
|
475
|
+
gap: var(--wzl-space-6);
|
|
476
|
+
min-inline-size: 0;
|
|
477
|
+
}
|
|
478
|
+
.fg-transport__scrub {
|
|
479
|
+
inline-size: 16rem;
|
|
480
|
+
min-inline-size: 6rem;
|
|
481
|
+
flex: 1 1 16rem;
|
|
482
|
+
}
|
|
483
|
+
|
|
471
484
|
/* src/frame/index/index.css */
|
|
472
485
|
.fg-index {
|
|
473
486
|
box-sizing: border-box;
|
|
@@ -539,6 +552,7 @@
|
|
|
539
552
|
}
|
|
540
553
|
.fg-index-cell--padded > .fg-index-cell__stage {
|
|
541
554
|
display: block;
|
|
555
|
+
min-height: 0;
|
|
542
556
|
}
|
|
543
557
|
.fg-index-cell--fullscreen {
|
|
544
558
|
width: auto;
|
package/dist/shell/index.css.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/shell/shell.css","../../src/frame/index/index.css"],"sourcesContent":[".fg-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: var(--wzl-space-xs);\n min-height: 100vh;\n padding-inline: var(--wzl-space-md);\n background: var(--wzl-surface-sunken);\n color: var(--wzl-fg);\n}\n\n.fg-empty__title {\n margin: 0;\n font-weight: var(--wzl-font-weight-bold);\n}\n\n.fg-empty__globs {\n margin: 0;\n padding: 0;\n list-style: none;\n font-family: var(--wzl-font-mono);\n font-size: var(--wzl-font-size-sm);\n}\n\n/* One story's box in the workshop document; the theme attributes land on it from applyGlobals. `contain: paint`,\n exactly that value, makes it the containing block for fixed-position descendants, so a Dialog stays inside its\n trial, and it is the one containment React Aria's positioning recognizes: `layout paint` also contains, but the\n popover math then still assumes the viewport and lands a list a whole host offset too high. */\n.fg-story {\n position: relative;\n box-sizing: border-box;\n width: 100%;\n height: 100%;\n overflow: auto;\n contain: paint;\n background: var(--wzl-surface);\n color: var(--wzl-fg);\n transition: opacity var(--wzl-motion-fast) var(--wzl-ease-out-cubic);\n}\n\n.fg-story[data-pending] {\n visibility: hidden;\n opacity: 0;\n}\n\n.fg-story[data-fg-layout='centered'] {\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.fg-story[data-fg-layout='padded'] {\n padding: 16px;\n}\n\n.fg-story[data-fg-layout='fullscreen'] {\n padding: 0;\n}\n\n.fg-story--loading {\n visibility: visible;\n opacity: 1;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .fg-story {\n transition: none;\n }\n}\n\n.fg-frame-host {\n position: relative;\n width: 100%;\n height: 100%;\n}\n\n.fg-frame-slot {\n display: contents;\n}\n\n/* Warm frames lay out at a trial's usual size, so moving one into place is not its first layout. */\n.fg-frame-pool {\n position: fixed;\n top: 0;\n left: -10000px;\n width: 1024px;\n height: 768px;\n visibility: hidden;\n pointer-events: none;\n}\n\n.fg-frame-pool > iframe {\n width: 100%;\n height: 100%;\n border: 0;\n}\n\n.fg-frame-view {\n display: block;\n width: 100%;\n height: 100%;\n border: 0;\n transition: opacity var(--wzl-motion-fast) var(--wzl-ease-out-cubic);\n}\n\n.fg-frame-view[data-pending] {\n visibility: hidden;\n opacity: 0;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .fg-frame-view {\n transition: none;\n }\n}\n\n.fg-fault {\n position: absolute;\n inset: 0;\n display: flex;\n flex-direction: column;\n gap: var(--wzl-space-xs);\n padding: var(--wzl-space-md);\n overflow: auto;\n background: var(--wzl-surface-sunken);\n color: var(--wzl-fg);\n font-family: var(--wzl-font-mono);\n font-size: var(--wzl-font-size-sm);\n}\n\n.fg-fault__phase {\n color: var(--wzl-danger);\n font-weight: var(--wzl-font-weight-bold);\n text-transform: uppercase;\n}\n\n.fg-fault__message {\n margin: 0;\n white-space: pre-wrap;\n}\n\n.fg-tree {\n display: flex;\n flex-direction: column;\n gap: var(--wzl-space-xs);\n padding: 0 var(--wzl-space-sm) var(--wzl-space-sm);\n border-bottom: var(--wzl-border-w) solid var(--wzl-line-subtle);\n color: var(--wzl-fg);\n}\n\n.fg-tree__heading {\n margin: 0;\n padding-block: var(--wzl-space-xs);\n color: var(--wzl-fg-muted);\n font-family: var(--wzl-font-display);\n font-size: var(--wzl-font-size-sm);\n font-weight: var(--wzl-font-weight-bold);\n letter-spacing: 0.08em;\n text-transform: uppercase;\n}\n\n.fg-route-miss {\n margin: 0;\n color: var(--wzl-danger);\n font-size: var(--wzl-font-size-sm);\n}\n\n.fg-tree__filter {\n box-sizing: border-box;\n width: 100%;\n font-size: var(--wzl-font-size);\n}\n\n.fg-tree__items,\n.fg-tree__group {\n display: flex;\n flex-direction: column;\n}\n\n.fg-tree__items {\n font-size: var(--wzl-font-size);\n}\n\n.fg-tree__group {\n padding-inline-start: var(--wzl-space-sm);\n}\n\n.fg-tree__node {\n display: flex;\n flex-direction: column;\n min-width: 0;\n outline: none;\n}\n\n.fg-tree__item {\n display: flex;\n align-items: center;\n gap: var(--wzl-space-xs);\n padding: calc(var(--wzl-space-xs) / 2) var(--wzl-space-xs);\n border-radius: var(--wzl-radius-sm);\n overflow: hidden;\n color: inherit;\n text-decoration: none;\n white-space: nowrap;\n cursor: pointer;\n}\n\n/* text-overflow does not reach a flex container's anonymous text box, so the label clips itself. */\n.fg-tree__label {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.fg-tree__item:hover {\n background: var(--wzl-surface-hover);\n}\n\n/* Sits after the label, which is the element that shrinks, so the tag keeps\n its width and the rows' tags line up down the column. */\n.fg-tree__item > .fg-tree__tag {\n flex: none;\n margin-inline-start: auto;\n}\n\n.fg-tree__tag {\n --badge-font-size: var(--wzl-font-size-2xs);\n}\n\n.fg-tree__libraries {\n display: flex;\n flex-wrap: wrap;\n gap: var(--wzl-space-xs);\n margin: 0;\n padding: 0;\n border: 0;\n}\n\n.fg-tree__libraries-legend {\n padding: 0;\n color: var(--wzl-fg-muted);\n font-size: var(--wzl-font-size-sm);\n}\n\n/* A folder item holds its group, so its ring goes on its own row rather than around the subtree. */\n.fg-tree__story:focus-visible,\n.fg-tree__node:focus-visible > .fg-tree__folder {\n outline: var(--wzl-line-width) solid var(--wzl-accent);\n outline-offset: calc(-1 * var(--wzl-line-width));\n}\n\n.fg-tree__item[aria-current='true'],\n.fg-tree__node[aria-current='true'] > .fg-tree__folder {\n color: var(--wzl-secondary-fg);\n}\n\n/* Padded out to a hit target and pulled back by the same amount, except on the label's side, where the padding\n widens the gap to the label. */\n.fg-tree__fold {\n flex: none;\n display: flex;\n align-items: center;\n justify-content: center;\n margin: calc(-1 * var(--wzl-space-xs));\n margin-inline-end: 0;\n padding: var(--wzl-space-xs);\n}\n\n.fg-tree__folder {\n font-weight: calc(var(--wzl-font-weight-normal) + 100);\n}\n\n.fg-tree__story {\n /* The CSS floor, which the browser rounds up to the lightest weight the face has. */\n font-weight: 100;\n /* Clears the folder rows' 13px fold mark, so a story's label lines up with its folder's. */\n padding-inline-start: calc(var(--wzl-space-xs) * 3 + 13px);\n}\n\n.lk-trial.fg-flash {\n outline: var(--wzl-line-width) solid var(--wzl-accent);\n outline-offset: calc(-1 * var(--wzl-line-width));\n animation: fg-flash 600ms ease-out forwards;\n}\n\n@keyframes fg-flash {\n from {\n outline-color: var(--wzl-accent);\n }\n to {\n outline-color: transparent;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .lk-trial.fg-flash {\n animation: none;\n }\n}\n\n.fg-css-vars {\n display: flex;\n flex-direction: column;\n gap: var(--wzl-space-xs);\n}\n\n.fg-css-vars-focus {\n display: flex;\n flex-direction: column;\n gap: var(--wzl-space-xs);\n min-width: 0;\n}\n\n.fg-css-vars__trial {\n margin: 0;\n overflow: hidden;\n color: var(--wzl-fg-muted);\n font-size: var(--wzl-font-size-sm);\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n/* Held at the top while the list scrolls the aside under it. */\n.fg-css-vars__controls {\n position: sticky;\n top: 0;\n z-index: 1;\n display: flex;\n flex-direction: column;\n gap: var(--wzl-space-xs);\n padding-block-end: var(--wzl-space-xs);\n background: var(--wzl-surface);\n}\n\n.fg-css-vars__save {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: var(--wzl-space-xs);\n}\n\n.fg-css-vars__notice {\n margin: 0;\n font-size: var(--wzl-font-size-sm);\n}\n\n.fg-css-vars__notice--saved {\n color: var(--wzl-fg-muted);\n}\n\n.fg-css-vars__notice--error {\n color: var(--wzl-danger);\n}\n\n.fg-css-vars__empty {\n margin: 0;\n color: var(--wzl-fg-muted);\n font-size: var(--wzl-font-size-sm);\n}\n\n.fg-globals,\n.fg-globals__item {\n display: flex;\n align-items: center;\n gap: var(--wzl-space-xs);\n}\n\n.fg-globals__item {\n gap: 0;\n}\n\n.fg-globals__popover {\n display: flex;\n flex-direction: column;\n gap: var(--wzl-space-sm);\n min-width: 14rem;\n}\n\n\n.fg-a11y,\n.fg-a11y-focus {\n display: flex;\n flex-direction: column;\n gap: var(--wzl-space-xs);\n min-width: 0;\n}\n\n.fg-a11y__trial {\n margin: 0;\n overflow: hidden;\n color: var(--wzl-fg-muted);\n font-size: var(--wzl-font-size-sm);\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.fg-a11y__controls {\n display: flex;\n gap: var(--wzl-space-xs);\n}\n\n.fg-a11y__note,\n.fg-a11y__tally {\n margin: 0;\n color: var(--wzl-fg-muted);\n font-size: var(--wzl-font-size-sm);\n}\n\n.fg-a11y__group {\n display: flex;\n flex-direction: column;\n gap: var(--wzl-space-xs);\n}\n\n.fg-a11y__group-title {\n margin: 0;\n font-size: var(--wzl-font-size-sm);\n}\n\n.fg-a11y__findings,\n.fg-a11y__nodes {\n display: flex;\n flex-direction: column;\n gap: var(--wzl-space-xs);\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n.fg-a11y__finding {\n border-inline-start: 2px solid var(--wzl-border);\n padding-inline-start: var(--wzl-space-xs);\n}\n\n.fg-a11y__help {\n display: flex;\n align-items: baseline;\n gap: var(--wzl-space-xs);\n margin: 0;\n font-size: var(--wzl-font-size-sm);\n}\n\n.fg-a11y__impact {\n color: var(--wzl-fg-muted);\n font-size: var(--wzl-font-size-xs);\n text-transform: uppercase;\n}\n\n.fg-a11y__impact[data-impact='serious'],\n.fg-a11y__impact[data-impact='critical'] {\n color: var(--wzl-danger);\n}\n\n.fg-a11y__nodes {\n color: var(--wzl-fg-muted);\n font-size: var(--wzl-font-size-xs);\n word-break: break-all;\n}\n\n/* Get Info */\n\n.fg-info-dialog {\n /* Wide enough for the longest row a dossier carries — an absolute story file\n path — to sit on one line. */\n inline-size: min(52rem, 90vw);\n}\n\n.fg-info {\n display: flex;\n flex-direction: column;\n gap: var(--wzl-space-md);\n}\n\n.fg-info__section {\n display: flex;\n flex-direction: column;\n gap: var(--wzl-space-xs);\n}\n\n.fg-info__heading {\n margin: 0;\n color: var(--wzl-fg-muted);\n font-size: var(--wzl-font-size-xs);\n font-weight: var(--wzl-font-weight-medium);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n}\n\n.fg-info__doc {\n margin: 0;\n white-space: pre-line;\n}\n\n.fg-info__doc--component {\n color: var(--wzl-fg-muted);\n font-size: var(--wzl-font-size-sm);\n}\n\n.fg-info__rows {\n display: grid;\n grid-template-columns: max-content 1fr;\n gap: var(--wzl-space-xs) var(--wzl-space-sm);\n margin: 0;\n font-size: var(--wzl-font-size-sm);\n}\n\n.fg-info__row {\n display: contents;\n}\n\n.fg-info__key {\n color: var(--wzl-fg-muted);\n text-align: end;\n}\n\n.fg-info__value {\n margin: 0;\n min-inline-size: 0;\n overflow-wrap: anywhere;\n}\n\n.fg-info__path {\n font-size: var(--wzl-font-size-xs);\n}\n\n.fg-info__args {\n inline-size: 100%;\n border-collapse: collapse;\n font-size: var(--wzl-font-size-sm);\n text-align: start;\n}\n\n.fg-info__args th,\n.fg-info__args td {\n padding: var(--wzl-space-xs) var(--wzl-space-xs);\n border-block-end: 1px solid var(--wzl-border);\n vertical-align: baseline;\n text-align: start;\n font-weight: var(--wzl-font-weight-normal);\n}\n\n.fg-info__args thead th {\n color: var(--wzl-fg-muted);\n font-size: var(--wzl-font-size-xs);\n text-transform: uppercase;\n}\n\n.fg-info__arg-name {\n display: block;\n}\n\n.fg-info__arg-doc {\n display: block;\n color: var(--wzl-fg-muted);\n font-size: var(--wzl-font-size-xs);\n}\n\n.fg-info__arg-kind {\n color: var(--wzl-fg-muted);\n}\n\n.fg-info__value-cell {\n overflow-wrap: anywhere;\n}\n\n.fg-info__empty {\n margin: 0;\n color: var(--wzl-fg-muted);\n font-size: var(--wzl-font-size-sm);\n}\n",".fg-index {\n box-sizing: border-box;\n max-width: 1200px;\n margin: 0 auto;\n padding: var(--wzl-space-lg);\n font-family: var(--wzl-font-ui);\n font-size: var(--wzl-font-size);\n color: var(--wzl-fg);\n}\n\n.fg-index__head {\n margin-bottom: calc(var(--wzl-space-lg) * 2);\n}\n\n.fg-index__path {\n margin: 0 0 var(--wzl-space-2);\n font-size: var(--wzl-font-size-lg);\n color: var(--wzl-fg-muted);\n}\n\n.fg-index__title {\n margin: 0;\n font-family: var(--wzl-panel-title-font);\n font-size: calc(var(--wzl-font-size-xl) * 1.6);\n font-weight: var(--wzl-font-weight-medium);\n letter-spacing: var(--wzl-panel-title-tracking);\n text-transform: var(--wzl-panel-title-case);\n}\n\n.fg-index__description,\n.fg-index-story__description {\n max-width: 72ch;\n margin: var(--wzl-space-4) 0 0;\n font-family: var(--wzl-font-body);\n line-height: 1.5;\n color: var(--wzl-fg-muted);\n}\n\n.fg-index-story {\n padding-top: calc(var(--wzl-space-lg) * 1.5);\n margin-top: calc(var(--wzl-space-lg) * 1.5);\n border-top: var(--wzl-border-w) solid var(--wzl-border);\n}\n\n.fg-index-story__head {\n display: flex;\n align-items: center;\n gap: var(--wzl-space-6);\n}\n\n.fg-index-story__name {\n margin: 0;\n font-family: var(--wzl-panel-title-font);\n font-size: var(--wzl-font-size-xl);\n font-weight: var(--wzl-panel-title-weight);\n letter-spacing: var(--wzl-panel-title-tracking);\n text-transform: var(--wzl-panel-title-case);\n color: var(--wzl-panel-title-color);\n}\n\n.fg-index-cell {\n margin: var(--wzl-space-8) 0 0;\n width: fit-content;\n max-width: 100%;\n}\n\n.fg-index-cell__stage {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 96px;\n padding: var(--wzl-space-2);\n border: var(--wzl-border-w) solid var(--wzl-border);\n border-radius: var(--wzl-radius-md);\n background: var(--wzl-surface);\n overflow: auto;\n}\n\n.fg-index-cell--padded > .fg-index-cell__stage {\n display: block;\n}\n\n.fg-index-cell--fullscreen {\n width: auto;\n}\n\n.fg-index-cell--fullscreen > .fg-index-cell__stage {\n display: block;\n height: 360px;\n padding: 0;\n}\n\n.fg-index-cell__label {\n margin-top: var(--wzl-space-3);\n font-family: var(--wzl-font-mono);\n font-size: var(--wzl-font-size-sm);\n color: var(--wzl-fg-muted);\n}\n\n.fg-index-variants__row {\n margin-top: calc(var(--wzl-space-lg) * 1.25);\n}\n\n/* Set as the kit's panel titles are, at the small size. */\n.fg-index-variants__label {\n margin: 0;\n font-family: var(--wzl-panel-title-font);\n font-size: var(--wzl-font-size-sm);\n font-weight: var(--wzl-panel-title-weight);\n letter-spacing: 0.06em;\n text-transform: uppercase;\n color: var(--wzl-fg-muted);\n}\n\n.fg-index-variants__cells {\n display: flex;\n flex-wrap: wrap;\n align-items: flex-start;\n gap: var(--wzl-space-6);\n}\n\n.fg-index-variants__cells > .fg-index-cell {\n margin-top: var(--wzl-space-4);\n}\n\n.fg-index__library {\n margin-inline-end: var(--wzl-space-4);\n vertical-align: middle;\n}\n\n.fg-index__title-row {\n display: flex;\n align-items: center;\n gap: var(--wzl-space-6);\n}\n\n.fg-index-deps {\n display: grid;\n grid-template-columns: max-content 1fr;\n gap: var(--wzl-space-3) var(--wzl-space-8);\n margin: var(--wzl-space-8) 0 0;\n font-size: var(--wzl-font-size-sm);\n}\n\n.fg-index-deps__row {\n display: contents;\n}\n\n.fg-index-deps__label {\n color: var(--wzl-fg-muted);\n}\n\n.fg-index-deps__value {\n margin: 0;\n}\n\n.fg-index-deps__list {\n display: flex;\n flex-wrap: wrap;\n gap: var(--wzl-space-2) var(--wzl-space-6);\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n.fg-index-deps__link {\n color: var(--wzl-accent-fg);\n text-decoration: none;\n}\n\n.fg-index-deps__link:hover {\n text-decoration: underline;\n}\n\n.fg-index-deps__prefix,\n.fg-index-deps__empty,\n.fg-index-deps__none {\n color: var(--wzl-fg-muted);\n}\n\n.fg-index-deps__none {\n max-width: 72ch;\n margin: var(--wzl-space-8) 0 0;\n font-size: var(--wzl-font-size-sm);\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/shell/shell.css","../../src/timeline/timeline.css","../../src/frame/index/index.css"],"sourcesContent":[".fg-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: var(--wzl-space-xs);\n min-height: 100vh;\n padding-inline: var(--wzl-space-md);\n background: var(--wzl-surface-sunken);\n color: var(--wzl-fg);\n}\n\n.fg-empty__title {\n margin: 0;\n font-weight: var(--wzl-font-weight-bold);\n}\n\n.fg-empty__globs {\n margin: 0;\n padding: 0;\n list-style: none;\n font-family: var(--wzl-font-mono);\n font-size: var(--wzl-font-size-sm);\n}\n\n/* One story's box in the workshop document; the theme attributes land on it from applyGlobals. `contain: paint`,\n exactly that value, makes it the containing block for fixed-position descendants, so a Dialog stays inside its\n trial, and it is the one containment React Aria's positioning recognizes: `layout paint` also contains, but the\n popover math then still assumes the viewport and lands a list a whole host offset too high. */\n.fg-story {\n position: relative;\n box-sizing: border-box;\n width: 100%;\n height: 100%;\n overflow: auto;\n contain: paint;\n background: var(--wzl-surface);\n color: var(--wzl-fg);\n transition: opacity var(--wzl-motion-fast) var(--wzl-ease-out-cubic);\n}\n\n.fg-story[data-pending] {\n visibility: hidden;\n opacity: 0;\n}\n\n.fg-story[data-fg-layout='centered'] {\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.fg-story[data-fg-layout='padded'] {\n padding: 16px;\n}\n\n.fg-story[data-fg-layout='fullscreen'] {\n padding: 0;\n}\n\n.fg-story--loading {\n visibility: visible;\n opacity: 1;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .fg-story {\n transition: none;\n }\n}\n\n.fg-frame-host {\n position: relative;\n width: 100%;\n height: 100%;\n}\n\n.fg-frame-slot {\n display: contents;\n}\n\n/* Warm frames lay out at a trial's usual size, so moving one into place is not its first layout. */\n.fg-frame-pool {\n position: fixed;\n top: 0;\n left: -10000px;\n width: 1024px;\n height: 768px;\n visibility: hidden;\n pointer-events: none;\n}\n\n.fg-frame-pool > iframe {\n width: 100%;\n height: 100%;\n border: 0;\n}\n\n.fg-frame-view {\n display: block;\n width: 100%;\n height: 100%;\n border: 0;\n transition: opacity var(--wzl-motion-fast) var(--wzl-ease-out-cubic);\n}\n\n.fg-frame-view[data-pending] {\n visibility: hidden;\n opacity: 0;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .fg-frame-view {\n transition: none;\n }\n}\n\n.fg-fault {\n position: absolute;\n inset: 0;\n display: flex;\n flex-direction: column;\n gap: var(--wzl-space-xs);\n padding: var(--wzl-space-md);\n overflow: auto;\n background: var(--wzl-surface-sunken);\n color: var(--wzl-fg);\n font-family: var(--wzl-font-mono);\n font-size: var(--wzl-font-size-sm);\n}\n\n.fg-fault__phase {\n color: var(--wzl-danger);\n font-weight: var(--wzl-font-weight-bold);\n text-transform: uppercase;\n}\n\n.fg-fault__message {\n margin: 0;\n white-space: pre-wrap;\n}\n\n.fg-tree {\n display: flex;\n flex-direction: column;\n gap: var(--wzl-space-xs);\n padding: 0 var(--wzl-space-sm) var(--wzl-space-sm);\n border-bottom: var(--wzl-border-w) solid var(--wzl-line-subtle);\n color: var(--wzl-fg);\n}\n\n.fg-tree__heading {\n margin: 0;\n padding-block: var(--wzl-space-xs);\n color: var(--wzl-fg-muted);\n font-family: var(--wzl-font-display);\n font-size: var(--wzl-font-size-sm);\n font-weight: var(--wzl-font-weight-bold);\n letter-spacing: 0.08em;\n text-transform: uppercase;\n}\n\n.fg-route-miss {\n margin: 0;\n color: var(--wzl-danger);\n font-size: var(--wzl-font-size-sm);\n}\n\n.fg-tree__filter {\n box-sizing: border-box;\n width: 100%;\n font-size: var(--wzl-font-size);\n}\n\n.fg-tree__items,\n.fg-tree__group {\n display: flex;\n flex-direction: column;\n}\n\n.fg-tree__items {\n font-size: var(--wzl-font-size);\n}\n\n.fg-tree__group {\n padding-inline-start: var(--wzl-space-sm);\n}\n\n.fg-tree__node {\n display: flex;\n flex-direction: column;\n min-width: 0;\n outline: none;\n}\n\n.fg-tree__item {\n display: flex;\n align-items: center;\n gap: var(--wzl-space-xs);\n padding: calc(var(--wzl-space-xs) / 2) var(--wzl-space-xs);\n border-radius: var(--wzl-radius-sm);\n overflow: hidden;\n color: inherit;\n text-decoration: none;\n white-space: nowrap;\n cursor: pointer;\n}\n\n/* text-overflow does not reach a flex container's anonymous text box, so the label clips itself. */\n.fg-tree__label {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.fg-tree__item:hover {\n background: var(--wzl-surface-hover);\n}\n\n/* Sits after the label, which is the element that shrinks, so the tag keeps\n its width and the rows' tags line up down the column. */\n.fg-tree__item > .fg-tree__tag {\n flex: none;\n margin-inline-start: auto;\n}\n\n.fg-tree__tag {\n --badge-font-size: var(--wzl-font-size-2xs);\n}\n\n.fg-tree__libraries {\n display: flex;\n flex-wrap: wrap;\n gap: var(--wzl-space-xs);\n margin: 0;\n padding: 0;\n border: 0;\n}\n\n.fg-tree__libraries-legend {\n padding: 0;\n color: var(--wzl-fg-muted);\n font-size: var(--wzl-font-size-sm);\n}\n\n/* A folder item holds its group, so its ring goes on its own row rather than around the subtree. */\n.fg-tree__story:focus-visible,\n.fg-tree__node:focus-visible > .fg-tree__folder {\n outline: var(--wzl-line-width) solid var(--wzl-accent);\n outline-offset: calc(-1 * var(--wzl-line-width));\n}\n\n.fg-tree__item[aria-current='true'],\n.fg-tree__node[aria-current='true'] > .fg-tree__folder {\n color: var(--wzl-secondary-fg);\n}\n\n/* Padded out to a hit target and pulled back by the same amount, except on the label's side, where the padding\n widens the gap to the label. */\n.fg-tree__fold {\n flex: none;\n display: flex;\n align-items: center;\n justify-content: center;\n margin: calc(-1 * var(--wzl-space-xs));\n margin-inline-end: 0;\n padding: var(--wzl-space-xs);\n}\n\n.fg-tree__folder {\n font-weight: calc(var(--wzl-font-weight-normal) + 100);\n}\n\n.fg-tree__story {\n /* The CSS floor, which the browser rounds up to the lightest weight the face has. */\n font-weight: 100;\n /* Clears the folder rows' 13px fold mark, so a story's label lines up with its folder's. */\n padding-inline-start: calc(var(--wzl-space-xs) * 3 + 13px);\n}\n\n.lk-trial.fg-flash {\n outline: var(--wzl-line-width) solid var(--wzl-accent);\n outline-offset: calc(-1 * var(--wzl-line-width));\n animation: fg-flash 600ms ease-out forwards;\n}\n\n@keyframes fg-flash {\n from {\n outline-color: var(--wzl-accent);\n }\n to {\n outline-color: transparent;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .lk-trial.fg-flash {\n animation: none;\n }\n}\n\n.fg-css-vars {\n display: flex;\n flex-direction: column;\n gap: var(--wzl-space-xs);\n}\n\n.fg-css-vars-focus {\n display: flex;\n flex-direction: column;\n gap: var(--wzl-space-xs);\n min-width: 0;\n}\n\n.fg-css-vars__trial {\n margin: 0;\n overflow: hidden;\n color: var(--wzl-fg-muted);\n font-size: var(--wzl-font-size-sm);\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n/* Held at the top while the list scrolls the aside under it. */\n.fg-css-vars__controls {\n position: sticky;\n top: 0;\n z-index: 1;\n display: flex;\n flex-direction: column;\n gap: var(--wzl-space-xs);\n padding-block-end: var(--wzl-space-xs);\n background: var(--wzl-surface);\n}\n\n.fg-css-vars__save {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: var(--wzl-space-xs);\n}\n\n.fg-css-vars__notice {\n margin: 0;\n font-size: var(--wzl-font-size-sm);\n}\n\n.fg-css-vars__notice--saved {\n color: var(--wzl-fg-muted);\n}\n\n.fg-css-vars__notice--error {\n color: var(--wzl-danger);\n}\n\n.fg-css-vars__empty {\n margin: 0;\n color: var(--wzl-fg-muted);\n font-size: var(--wzl-font-size-sm);\n}\n\n.fg-globals,\n.fg-globals__item {\n display: flex;\n align-items: center;\n gap: var(--wzl-space-xs);\n}\n\n.fg-globals__item {\n gap: 0;\n}\n\n.fg-globals__popover {\n display: flex;\n flex-direction: column;\n gap: var(--wzl-space-sm);\n min-width: 14rem;\n}\n\n\n.fg-a11y,\n.fg-a11y-focus {\n display: flex;\n flex-direction: column;\n gap: var(--wzl-space-xs);\n min-width: 0;\n}\n\n.fg-a11y__trial {\n margin: 0;\n overflow: hidden;\n color: var(--wzl-fg-muted);\n font-size: var(--wzl-font-size-sm);\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.fg-a11y__controls {\n display: flex;\n gap: var(--wzl-space-xs);\n}\n\n.fg-a11y__note,\n.fg-a11y__tally {\n margin: 0;\n color: var(--wzl-fg-muted);\n font-size: var(--wzl-font-size-sm);\n}\n\n.fg-a11y__group {\n display: flex;\n flex-direction: column;\n gap: var(--wzl-space-xs);\n}\n\n.fg-a11y__group-title {\n margin: 0;\n font-size: var(--wzl-font-size-sm);\n}\n\n.fg-a11y__findings,\n.fg-a11y__nodes {\n display: flex;\n flex-direction: column;\n gap: var(--wzl-space-xs);\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n.fg-a11y__finding {\n border-inline-start: 2px solid var(--wzl-border);\n padding-inline-start: var(--wzl-space-xs);\n}\n\n.fg-a11y__help {\n display: flex;\n align-items: baseline;\n gap: var(--wzl-space-xs);\n margin: 0;\n font-size: var(--wzl-font-size-sm);\n}\n\n.fg-a11y__impact {\n color: var(--wzl-fg-muted);\n font-size: var(--wzl-font-size-xs);\n text-transform: uppercase;\n}\n\n.fg-a11y__impact[data-impact='serious'],\n.fg-a11y__impact[data-impact='critical'] {\n color: var(--wzl-danger);\n}\n\n.fg-a11y__nodes {\n color: var(--wzl-fg-muted);\n font-size: var(--wzl-font-size-xs);\n word-break: break-all;\n}\n\n/* Get Info */\n\n.fg-info-dialog {\n /* Wide enough for the longest row a dossier carries — an absolute story file\n path — to sit on one line. */\n inline-size: min(52rem, 90vw);\n}\n\n.fg-info {\n display: flex;\n flex-direction: column;\n gap: var(--wzl-space-md);\n}\n\n.fg-info__section {\n display: flex;\n flex-direction: column;\n gap: var(--wzl-space-xs);\n}\n\n.fg-info__heading {\n margin: 0;\n color: var(--wzl-fg-muted);\n font-size: var(--wzl-font-size-xs);\n font-weight: var(--wzl-font-weight-medium);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n}\n\n.fg-info__doc {\n margin: 0;\n white-space: pre-line;\n}\n\n.fg-info__doc--component {\n color: var(--wzl-fg-muted);\n font-size: var(--wzl-font-size-sm);\n}\n\n.fg-info__rows {\n display: grid;\n grid-template-columns: max-content 1fr;\n gap: var(--wzl-space-xs) var(--wzl-space-sm);\n margin: 0;\n font-size: var(--wzl-font-size-sm);\n}\n\n.fg-info__row {\n display: contents;\n}\n\n.fg-info__key {\n color: var(--wzl-fg-muted);\n text-align: end;\n}\n\n.fg-info__value {\n margin: 0;\n min-inline-size: 0;\n overflow-wrap: anywhere;\n}\n\n.fg-info__path {\n font-size: var(--wzl-font-size-xs);\n}\n\n.fg-info__args {\n inline-size: 100%;\n border-collapse: collapse;\n font-size: var(--wzl-font-size-sm);\n text-align: start;\n}\n\n.fg-info__args th,\n.fg-info__args td {\n padding: var(--wzl-space-xs) var(--wzl-space-xs);\n border-block-end: 1px solid var(--wzl-border);\n vertical-align: baseline;\n text-align: start;\n font-weight: var(--wzl-font-weight-normal);\n}\n\n.fg-info__args thead th {\n color: var(--wzl-fg-muted);\n font-size: var(--wzl-font-size-xs);\n text-transform: uppercase;\n}\n\n.fg-info__arg-name {\n display: block;\n}\n\n.fg-info__arg-doc {\n display: block;\n color: var(--wzl-fg-muted);\n font-size: var(--wzl-font-size-xs);\n}\n\n.fg-info__arg-kind {\n color: var(--wzl-fg-muted);\n}\n\n.fg-info__value-cell {\n overflow-wrap: anywhere;\n}\n\n.fg-info__empty {\n margin: 0;\n color: var(--wzl-fg-muted);\n font-size: var(--wzl-font-size-sm);\n}\n",".fg-transport {\n display: flex;\n align-items: center;\n gap: var(--wzl-space-6);\n min-inline-size: 0;\n}\n\n.fg-transport__scrub {\n inline-size: 16rem;\n min-inline-size: 6rem;\n flex: 1 1 16rem;\n}\n",".fg-index {\n box-sizing: border-box;\n max-width: 1200px;\n margin: 0 auto;\n padding: var(--wzl-space-lg);\n font-family: var(--wzl-font-ui);\n font-size: var(--wzl-font-size);\n color: var(--wzl-fg);\n}\n\n.fg-index__head {\n margin-bottom: calc(var(--wzl-space-lg) * 2);\n}\n\n.fg-index__path {\n margin: 0 0 var(--wzl-space-2);\n font-size: var(--wzl-font-size-lg);\n color: var(--wzl-fg-muted);\n}\n\n.fg-index__title {\n margin: 0;\n font-family: var(--wzl-panel-title-font);\n font-size: calc(var(--wzl-font-size-xl) * 1.6);\n font-weight: var(--wzl-font-weight-medium);\n letter-spacing: var(--wzl-panel-title-tracking);\n text-transform: var(--wzl-panel-title-case);\n}\n\n.fg-index__description,\n.fg-index-story__description {\n max-width: 72ch;\n margin: var(--wzl-space-4) 0 0;\n font-family: var(--wzl-font-body);\n line-height: 1.5;\n color: var(--wzl-fg-muted);\n}\n\n.fg-index-story {\n padding-top: calc(var(--wzl-space-lg) * 1.5);\n margin-top: calc(var(--wzl-space-lg) * 1.5);\n border-top: var(--wzl-border-w) solid var(--wzl-border);\n}\n\n.fg-index-story__head {\n display: flex;\n align-items: center;\n gap: var(--wzl-space-6);\n}\n\n.fg-index-story__name {\n margin: 0;\n font-family: var(--wzl-panel-title-font);\n font-size: var(--wzl-font-size-xl);\n font-weight: var(--wzl-panel-title-weight);\n letter-spacing: var(--wzl-panel-title-tracking);\n text-transform: var(--wzl-panel-title-case);\n color: var(--wzl-panel-title-color);\n}\n\n.fg-index-cell {\n margin: var(--wzl-space-8) 0 0;\n width: fit-content;\n max-width: 100%;\n}\n\n.fg-index-cell__stage {\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 96px;\n padding: var(--wzl-space-2);\n border: var(--wzl-border-w) solid var(--wzl-border);\n border-radius: var(--wzl-radius-md);\n background: var(--wzl-surface);\n overflow: auto;\n}\n\n/* A padded story sits top-left as it would on a page, so the minimum height\n that gives a centered one presence would only leave room under it. */\n.fg-index-cell--padded > .fg-index-cell__stage {\n display: block;\n min-height: 0;\n}\n\n.fg-index-cell--fullscreen {\n width: auto;\n}\n\n.fg-index-cell--fullscreen > .fg-index-cell__stage {\n display: block;\n height: 360px;\n padding: 0;\n}\n\n.fg-index-cell__label {\n margin-top: var(--wzl-space-3);\n font-family: var(--wzl-font-mono);\n font-size: var(--wzl-font-size-sm);\n color: var(--wzl-fg-muted);\n}\n\n.fg-index-variants__row {\n margin-top: calc(var(--wzl-space-lg) * 1.25);\n}\n\n/* Set as the kit's panel titles are, at the small size. */\n.fg-index-variants__label {\n margin: 0;\n font-family: var(--wzl-panel-title-font);\n font-size: var(--wzl-font-size-sm);\n font-weight: var(--wzl-panel-title-weight);\n letter-spacing: 0.06em;\n text-transform: uppercase;\n color: var(--wzl-fg-muted);\n}\n\n.fg-index-variants__cells {\n display: flex;\n flex-wrap: wrap;\n align-items: flex-start;\n gap: var(--wzl-space-6);\n}\n\n.fg-index-variants__cells > .fg-index-cell {\n margin-top: var(--wzl-space-4);\n}\n\n.fg-index__library {\n margin-inline-end: var(--wzl-space-4);\n vertical-align: middle;\n}\n\n.fg-index__title-row {\n display: flex;\n align-items: center;\n gap: var(--wzl-space-6);\n}\n\n.fg-index-deps {\n display: grid;\n grid-template-columns: max-content 1fr;\n gap: var(--wzl-space-3) var(--wzl-space-8);\n margin: var(--wzl-space-8) 0 0;\n font-size: var(--wzl-font-size-sm);\n}\n\n.fg-index-deps__row {\n display: contents;\n}\n\n.fg-index-deps__label {\n color: var(--wzl-fg-muted);\n}\n\n.fg-index-deps__value {\n margin: 0;\n}\n\n.fg-index-deps__list {\n display: flex;\n flex-wrap: wrap;\n gap: var(--wzl-space-2) var(--wzl-space-6);\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n.fg-index-deps__link {\n color: var(--wzl-accent-fg);\n text-decoration: none;\n}\n\n.fg-index-deps__link:hover {\n text-decoration: underline;\n}\n\n.fg-index-deps__prefix,\n.fg-index-deps__empty,\n.fg-index-deps__none {\n color: var(--wzl-fg-muted);\n}\n\n.fg-index-deps__none {\n max-width: 72ch;\n margin: var(--wzl-space-8) 0 0;\n font-size: var(--wzl-font-size-sm);\n}\n"],"mappings":"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","names":[]}
|
package/dist/shell/index.d.ts
CHANGED
|
@@ -2,8 +2,8 @@ import * as react from 'react';
|
|
|
2
2
|
import { RefObject, ReactNode } from 'react';
|
|
3
3
|
import { LabContribution, StorageAdapter, RenderContext, InstrumentList } from '@weasel-js/labkit';
|
|
4
4
|
import { FrameImporters } from '../frame/index.js';
|
|
5
|
-
import {
|
|
6
|
-
import { S as ShellConfig, a as GlobalDeclarations } from '../config-
|
|
5
|
+
import { j as IndexEntry, F as FrameSetup, e as DepGraph, L as LoadedStory, k as Layout, G as Globals, l as FromFrame, c as A11yReport, m as ToFrame, n as CssVarReport, o as CapturedPicture, V as Viewport } from '../FrameController-BH8xJHZ8.js';
|
|
6
|
+
import { S as ShellConfig, a as GlobalDeclarations } from '../config-DoLWwEb2.js';
|
|
7
7
|
import '@weasel-js/labkit/config';
|
|
8
8
|
import '@weasel-js/theme';
|
|
9
9
|
|