@weasel-js/labkit 1.4.0-pre.1 → 1.4.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/dist/_dts/{CanvasStackContext-LnCfqNBA.d.ts → CanvasStackContext-D6M0o8cQ.d.ts} +1 -1
- package/dist/_dts/{frac-C-2c72Ij.d.ts → frac-QS7XzvpG.d.ts} +2 -2
- package/dist/_dts/{index-BDVzvRzQ.d.ts → index-B2X21G1c.d.ts} +8 -2
- package/dist/_dts/{types-D6s4b7if.d.ts → types-C1Zw7s5P.d.ts} +1 -0
- package/dist/_dts/{types-DYMaEvM5.d.ts → types-ChVJJHvk.d.ts} +3 -0
- package/dist/_dts/{useTrialState-gmMvZqPc.d.ts → useTrialState-Cdm13fvl.d.ts} +2 -1
- package/dist/canvas/index.d.ts +6 -6
- package/dist/canvas/index.js +2 -2
- package/dist/chrome/index.d.ts +4 -4
- package/dist/chrome/index.js +5 -5
- package/dist/chunk-2YILQ7Y5.js +33 -0
- package/dist/chunk-2YILQ7Y5.js.map +1 -0
- package/dist/{chunk-QB5SM4BM.js → chunk-4AMN4MMB.js} +5 -5
- package/dist/{chunk-QB5SM4BM.js.map → chunk-4AMN4MMB.js.map} +1 -1
- package/dist/{chunk-L5QJOOLV.js → chunk-7VW3S44V.js} +512 -56
- package/dist/chunk-7VW3S44V.js.map +1 -0
- package/dist/{chunk-ESIQNQ6K.js → chunk-B5VWJBWM.js} +12 -6
- package/dist/chunk-B5VWJBWM.js.map +1 -0
- package/dist/{chunk-RBGKL7NF.js → chunk-L5WBGUVR.js} +1664 -1628
- package/dist/chunk-L5WBGUVR.js.map +1 -0
- package/dist/{chunk-XJ6N32QP.js → chunk-LJSIUFYD.js} +14 -30
- package/dist/chunk-LJSIUFYD.js.map +1 -0
- package/dist/{chunk-HHGVISVZ.js → chunk-QR5V3AFG.js} +6 -4
- package/dist/chunk-QR5V3AFG.js.map +1 -0
- package/dist/{chunk-6OEYTYML.js → chunk-UD7TEHZT.js} +15 -15
- package/dist/chunk-UD7TEHZT.js.map +1 -0
- package/dist/{chunk-HMFODCOX.js → chunk-VHFQKAUL.js} +3 -3
- package/dist/{chunk-HMFODCOX.js.map → chunk-VHFQKAUL.js.map} +1 -1
- package/dist/{chunk-TO2FUOKF.js → chunk-W3KSUXXR.js} +16 -13
- package/dist/chunk-W3KSUXXR.js.map +1 -0
- package/dist/{chunk-AE5CNVRU.js → chunk-XCBCZEBO.js} +3 -3
- package/dist/{chunk-AE5CNVRU.js.map → chunk-XCBCZEBO.js.map} +1 -1
- package/dist/{chunk-E2UQVZ44.js → chunk-Y2HK44TG.js} +3 -3
- package/dist/{chunk-E2UQVZ44.js.map → chunk-Y2HK44TG.js.map} +1 -1
- package/dist/{chunk-M75ZU6ZZ.js → chunk-YQGQUBKA.js} +3 -3
- package/dist/{chunk-M75ZU6ZZ.js.map → chunk-YQGQUBKA.js.map} +1 -1
- package/dist/controls/index.d.ts +2 -2
- package/dist/controls/index.js +3 -3
- package/dist/dragdrop/index.d.ts +3 -3
- package/dist/dragdrop/index.js +2 -2
- package/dist/index.d.ts +55 -12
- package/dist/index.js +306 -159
- package/dist/index.js.map +1 -1
- package/dist/layers/index.d.ts +4 -4
- package/dist/layers/index.js +3 -3
- package/dist/loupe/index.d.ts +5 -5
- package/dist/loupe/index.js +2 -2
- package/dist/passthrough/weasel-canvas.js +1 -1
- package/dist/passthrough/weasel-ui.d.ts +336 -15
- package/dist/passthrough/weasel-ui.js +2 -2
- package/dist/primitives/index.js +4 -4
- package/dist/state/index.d.ts +3 -3
- package/dist/state/index.js +4 -2
- package/dist/state/index.js.map +1 -1
- package/dist/styles.css +64 -5
- package/dist/surface/index.d.ts +17 -2
- package/dist/surface/index.js +3 -2
- package/dist/ui/layers/index.js +2 -2
- package/dist/undo/index.d.ts +3 -3
- package/package.json +8 -8
- package/src/annotations/AnnotationOverlay.tsx +10 -6
- package/src/annotations/Annotations.less +6 -0
- package/src/annotations/Annotations.overlay.test.tsx +113 -0
- package/src/annotations/MarkList.tsx +3 -2
- package/src/config/builder.test.ts +5 -0
- package/src/config/builder.ts +6 -0
- package/src/config/types.ts +1 -0
- package/src/controls/ControlPanel.test.tsx +23 -0
- package/src/controls/ControlPanel.tsx +3 -0
- package/src/lab/Lab.surface.test.tsx +8 -3
- package/src/lab/LabHeader.test.tsx +12 -0
- package/src/lab/LabHeader.tsx +16 -6
- package/src/passthrough/weasel-ui.test.ts +9 -0
- package/src/passthrough/weasel-ui.ts +4 -0
- package/src/primitives/ZoomControl.tsx +2 -0
- package/src/state/store.ts +10 -0
- package/src/state/types.ts +3 -0
- package/src/surface/AGENTS.md +11 -1
- package/src/surface/index.ts +7 -1
- package/src/surface/useSurfaceTile.ts +20 -2
- package/src/surface/useTiledSurface.ts +4 -1
- package/src/theme/Interstellar.stories.tsx +4 -3
- package/src/theme/base.less +39 -1
- package/src/trial/Trial.less +27 -5
- package/src/trial/TrialBody.test.tsx +67 -0
- package/src/trial/TrialBody.tsx +155 -0
- package/src/trial/TrialChrome.tsx +18 -10
- package/src/trial/index.ts +2 -0
- package/dist/chunk-6OEYTYML.js.map +0 -1
- package/dist/chunk-ESIQNQ6K.js.map +0 -1
- package/dist/chunk-HHGVISVZ.js.map +0 -1
- package/dist/chunk-L5QJOOLV.js.map +0 -1
- package/dist/chunk-RBGKL7NF.js.map +0 -1
- package/dist/chunk-TO2FUOKF.js.map +0 -1
- package/dist/chunk-XJ6N32QP.js.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../svg/src/types.ts","../../svg/src/transform.ts","../../svg/src/patterns.ts","../../svg/src/path-serializer.ts","../../svg/src/gradients.ts","../../svg/src/serialize.ts","../src/annotations/paint.ts","../src/annotations/staleness.ts","../src/annotations/drawOne.ts","../src/annotations/svgNodes.ts","../src/annotations/capture.ts","../src/annotations/frac.ts","../src/annotations/history.ts","../src/annotations/store.ts","../src/annotations/view.ts","../src/annotations/AnnotationOverlay.tsx","../src/annotations/AnnotationTargets.tsx","../src/config/builder.ts","../src/config/rules.ts","../src/config/resolve.ts","../src/lab/LabContext.ts","../src/config/useConfigSchema.ts","../src/instrument/defineInstrument.ts","../src/instrument/validateConfigSchema.ts","../../theme/src/generated/themes.ts","../../theme/src/theme.ts","../../theme/src/dtcg/color.ts","../../theme/src/dtcg/resolve.ts","../../theme/src/resolveTheme.ts","../../theme/src/applyTheme.ts","../../theme/src/react.tsx","../../theme/src/dtcg/types.ts","../../theme/src/dtcg/flatten.ts","../../theme/src/loadDTCG.ts","../src/theme/interstellar.tokens.json","../src/theme/interstellar.ts","../src/state/view.ts","../src/trial/TrialDragContext.ts","../src/trial/TrialTitleBar.tsx","../src/lab/panelHost.ts","../src/trial/UndockedSections.tsx","../src/trial/TrialChrome.tsx","../src/trial/Trial.tsx","../src/trial/trialOps.ts","../src/lab/LabHeader.tsx","../src/lab/LabPalette.tsx","../src/lab/useSystemMode.ts","../src/lab/LabShell.tsx","../src/lab/Workspace.tsx","../src/lab/Lab.tsx"],"names":["b","m","r","x","y","c","PATH_M","PATH_L","PATH_C","PATH_Q","PATH_Z","escapeAttr","boundsOfPath","p","k","w","asNodeId","f","jsx","Fragment","chain","useContext","g","createContext","useRef","useMemo","jsxs","createPortal","useStore","useState","useEffect","DEFAULT_VIEW","_","store","useLayoutEffect","useCallback"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Public types for `@weasel-js/svg`. The package exposes a flat,\n * discriminated-union node model (`SvgNode`) that mirrors the SVG element\n * tree but uses weasel-native leaf data (`Path`, `FillStyle`) for geometry and\n * paint.\n *\n * Parsing collapses every `transform=\"...\"` onto its descendants' geometry,\n * so the `SvgNode` tree returned from `parseSvg` never has a non-identity\n * group transform. Consumers may still construct groups with explicit\n * transforms before serializing, in which case the serializer emits a\n * single `matrix(a b c d e f)` on the `<g>`.\n */\n\nimport type { Path, FillStyle, Stroke, StyledRun, TextStyle } from '@weasel-js/core';\n\n/**\n * Opaque pass-through bag for namespaced XML content.\n *\n * weasel-svg does not interpret the contents — it only ensures that any\n * attributes or child elements in a *declared* XML namespace round-trip\n * losslessly through parse → serialize. Consumers (e.g. an app-specific\n * bridge layer) hang their domain semantics off this structure.\n *\n * Keyed by namespace prefix (the prefix is a write-time choice; the URI\n * is the canonical identifier and is supplied via `ParseOptions.namespaces`\n * / `SerializeOptions.namespaces`).\n */\nexport interface NamespaceMeta {\n [prefix: string]: {\n /** Local-name → string-value map for attributes in this namespace. */\n attrs?: Record<string, string>;\n /**\n * Child elements in this namespace, keyed by local name. Each entry\n * is an array because a namespace can host multiple sibling elements\n * with the same tag (e.g. `<wd:layer/><wd:layer/>`).\n */\n elements?: Record<string, NamespacedElement[]>;\n };\n}\n\n/** Opaque structured representation of a namespaced element. */\nexport interface NamespacedElement {\n /** Attribute local-name → string-value. */\n attrs: Record<string, string>;\n /** Text content, when the element contains only text (no child elements). */\n text?: string;\n /** Nested namespaced children, keyed by local name (recursive). */\n children?: Record<string, NamespacedElement[]>;\n}\n\n/**\n * 2x3 affine matrix in column-major form (SVG's `matrix(a b c d e f)`\n * order). Maps `[x', y'] = [a*x + c*y + e, b*x + d*y + f]`.\n */\nexport type Matrix = readonly [number, number, number, number, number, number];\n\n/** Identity matrix — useful as a default in tests / constructors. */\nexport const IDENTITY_MATRIX: Matrix = [1, 0, 0, 1, 0, 0];\n\n/**\n * FillStyle description in the SVG sense — either explicit `none`, a solid\n * color, or a reference to a weasel-native gradient `FillStyle`. Solid colors\n * are normalized to `#rrggbb` strings; opacity is carried separately so\n * `fill-opacity` and `stroke-opacity` round-trip cleanly.\n */\nexport type SvgPaint =\n | { kind: 'none' }\n | { kind: 'solid'; color: string; opacity?: number }\n | { kind: 'gradient'; paint: FillStyle };\n\n/** Stroke description: a paint plus structural line parameters. */\nexport interface SvgStroke {\n paint: SvgPaint;\n width: number;\n opacity?: number;\n /** `stroke-linecap`. Default per SVG spec is `'butt'`. */\n cap?: 'butt' | 'round' | 'square';\n /** `stroke-linejoin`. Default per SVG spec is `'miter'`. SVG's `arcs` / `miter-clip` map to `'miter'` with a warning. */\n join?: 'miter' | 'round' | 'bevel';\n /** `stroke-dasharray` as a flat number array. Odd-length inputs are doubled per SVG spec. */\n dash?: number[];\n /**\n * `stroke-miterlimit`. SVG's default is 4. Weasel's renderer defaults to\n * 10 (Canvas2D) when unset, so parsed strokes without an explicit\n * attribute may render with longer miters than the source SVG intended.\n */\n miterLimit?: number;\n /** `marker-start` / `marker-mid` / `marker-end`, as the bare `url(#id)` key. */\n markerStart?: string;\n markerMid?: string;\n markerEnd?: string;\n}\n\n/**\n * Leaf node: a path geometry plus fill/stroke. All other v1 shapes\n * (`<rect>`, `<ellipse>`, etc.) are lowered to this representation on\n * parse — `<rect>` uses weasel's `RectPath` fast-path subtype when\n * possible, everything else becomes a `PolygonPath`.\n */\nexport interface SvgPathNode {\n kind: 'path';\n path: Path;\n fill: SvgPaint;\n stroke?: SvgStroke;\n /** Element-level opacity (`opacity=\"...\"`), 0..1. */\n opacity?: number;\n /** Element-level rotation in **radians**, pivoting around the AABB\n * center of the underlying `path` geometry. Emitted as SVG\n * `transform=\"rotate(angleDegrees cx cy)\"`. */\n rotation?: number;\n /** Opaque per-element bag for declared namespaces. See `NamespaceMeta`. */\n meta?: NamespaceMeta;\n}\n\n/**\n * Group node: an SVG `<g>`. On parse, `transform` is always omitted (any\n * `transform` attribute is collapsed onto descendants' geometry). On\n * serialize, a non-identity `transform` is emitted as\n * `matrix(a b c d e f)`.\n */\nexport interface SvgGroupNode {\n kind: 'group';\n children: SvgNode[];\n transform?: Matrix;\n opacity?: number;\n /** Opaque per-element bag for declared namespaces. See `NamespaceMeta`. */\n meta?: NamespaceMeta;\n}\n\n/**\n * Width given to an external `<text>` that carries no `data-weasel-width`:\n * large enough that line wrapping never fires, since SVG text flows from a\n * baseline and the source says nothing about a box.\n *\n * It is a wrap sentinel, not a measurement. Anything that treats a text\n * node's width as geometry — a union AABB, a fit-clamp — has to recognize it\n * and substitute an estimate, or one text node swamps the whole file.\n */\nexport const UNBOUNDED_TEXT_WIDTH = 99999;\n\n/**\n * Text leaf node. Mirrors the kit's `TextPose` shape — a bounding box plus\n * text content, optional rich-text `runs` (per-range styling), and an\n * optional `TextStyle` for the node-wide defaults.\n *\n * Note on SVG text geometry: native `<text>` flows from a baseline; it\n * doesn't have width/height attributes. The serializer emits\n * `dominant-baseline=\"text-before-edge\"` so `y` is the top of the text\n * box, plus `data-weasel-width` / `data-weasel-height` so weasel's\n * explicit box dimensions round-trip losslessly. External SVG text\n * (lacking the data-* attrs) imports with estimated dimensions —\n * {@link UNBOUNDED_TEXT_WIDTH} and\n * `height = fontSize * lineHeight * (lineCount || 1)`.\n */\nexport interface SvgTextNode {\n kind: 'text';\n x: number;\n y: number;\n width: number;\n height: number;\n /** Plain text. When `runs` is set, `runsToPlainText(runs)` must equal `text`. */\n text: string;\n /** Optional per-range styling — same shape as `TextPose.runs`. */\n runs?: StyledRun[];\n /** Node-wide typography. Defaults applied at render time via `resolveTextStyle`. */\n style?: TextStyle;\n /**\n * Node-wide glyph paint, the `FillStyle` / `Stroke` a kit text node holds\n * in `data.fill` / `data.stroke`. Not `SvgPaint`, which is the path\n * nodes' shape — a text paint reaches the renderer through the runs, and\n * `StyledRun.fill` / `.stroke` override these per range.\n */\n fill?: FillStyle;\n stroke?: Stroke;\n /** Element-level opacity (`opacity=\"...\"`), 0..1. */\n opacity?: number;\n /** Element-level rotation in **radians**, pivoting around the unrotated\n * AABB center `(x + width/2, y + height/2)`. Emitted as SVG\n * `transform=\"rotate(angleDegrees cx cy)\"`. */\n rotation?: number;\n /** Opaque per-element bag for declared namespaces. See `NamespaceMeta`. */\n meta?: NamespaceMeta;\n}\n\n/**\n * Raster-image leaf — an SVG `<image>`. `href` is the element's `href` (or\n * legacy `xlink:href`) verbatim: an external URL or a `data:` URI. The\n * package neither fetches nor decodes it, so an external URL round-trips as\n * a reference and only resolves when something downstream loads it.\n *\n * SVG's `preserveAspectRatio` is not modeled; the box is taken literally.\n */\nexport interface SvgImageNode {\n kind: 'image';\n href: string;\n x: number;\n y: number;\n width: number;\n height: number;\n /** Element-level opacity (`opacity=\"...\"`), 0..1. */\n opacity?: number;\n /** Element-level rotation in **radians**, pivoting around the unrotated\n * AABB center `(x + width/2, y + height/2)`. Emitted as SVG\n * `transform=\"rotate(angleDegrees cx cy)\"`. */\n rotation?: number;\n /** Opaque per-element bag for declared namespaces. See `NamespaceMeta`. */\n meta?: NamespaceMeta;\n}\n\n/** Discriminated-union node — the leaf of the public tree. */\nexport type SvgNode = SvgPathNode | SvgGroupNode | SvgTextNode | SvgImageNode;\n\n/** Options for {@link parseSvg}. */\nexport interface ParseOptions {\n /**\n * Map of prefix → URI for XML namespaces the caller wants surfaced.\n * Attributes / child elements in any declared namespace are collected\n * into `SvgNode.meta` (per element) or `ParseResult.documentMeta` (root).\n * Undeclared namespaces are preserved in the DOM but not promoted into\n * the structured `meta` bag; they are silently dropped at serialize time.\n */\n namespaces?: Record<string, string>;\n}\n\n/** Output of {@link parseSvg}. */\nexport interface ParseResult {\n nodes: SvgNode[];\n /** Non-fatal notices (unsupported elements, unrecognized attributes). */\n warnings: string[];\n /**\n * Opaque per-document bag for declared namespaces. Holds root-level\n * namespaced attributes (`documentMeta.<prefix>.attrs`) and namespaced\n * root children (`documentMeta.<prefix>.elements`).\n */\n documentMeta?: NamespaceMeta;\n /** Root `viewBox` attribute, parsed from `\"x y width height\"`. */\n viewBox?: { x: number; y: number; width: number; height: number };\n /** Root `width` attribute, parsed as a unitless number when present. */\n width?: number;\n /** Root `height` attribute, parsed as a unitless number when present. */\n height?: number;\n /** Text content of the first `<title>` child of `<svg>`, when present. */\n title?: string;\n}\n\n/** Options for {@link serializeSvg}. */\nexport interface SerializeOptions {\n /**\n * Override the root `viewBox`. When omitted, the serializer computes\n * a tight bounding box from the supplied nodes.\n */\n viewBox?: { x: number; y: number; width: number; height: number };\n /**\n * Called for paint that can't be expressed in SVG and is dropped — a\n * conic gradient, or a pattern carrying a `TextureHandle` instead of a\n * `TilePatternSpec`. Without this the loss is silent.\n */\n onWarn?: (message: string) => void;\n /** Emit `width=\"...\"` on the root `<svg>`. */\n width?: number;\n /** Emit `height=\"...\"` on the root `<svg>`. */\n height?: number;\n /**\n * Emit `<title>...</title>` as the first child of the root `<svg>`. The\n * value is XML-escaped on output. Empty strings are skipped.\n */\n title?: string;\n /**\n * Map of prefix → URI for XML namespaces to declare on the root\n * `<svg>`. The serializer reads `documentMeta[prefix]` and\n * `node.meta[prefix]` to write the actual attributes and elements.\n */\n namespaces?: Record<string, string>;\n /**\n * Opaque per-document namespaced extras. Each `<prefix>.attrs` becomes\n * `<prefix>:<name>=\"...\"` attributes on the root `<svg>`. Each\n * `<prefix>.elements[localName]` becomes `<prefix>:<localName>...>`\n * children placed immediately before any geometry.\n */\n documentMeta?: NamespaceMeta;\n /** Pretty-print with newlines + indentation. Default `false`. */\n pretty?: boolean;\n}\n","/**\n * SVG transform attribute helpers. Parses the four primitive transform\n * functions weasel-svg supports (`matrix`, `translate`, `scale`, `rotate`)\n * into a single 2x3 affine matrix, and exposes the point/path mappers we\n * need to collapse `transform=` onto leaf geometry at parse time.\n */\n\nimport type { Matrix } from './types';\nimport { IDENTITY_MATRIX } from './types';\n\n/** Multiply two 2x3 affine matrices (a then b applied to a column vector). */\nexport function multiply(a: Matrix, b: Matrix): Matrix {\n // [a0 a2 a4] [b0 b2 b4]\n // [a1 a3 a5] [b1 b3 b5]\n return [\n a[0] * b[0] + a[2] * b[1],\n a[1] * b[0] + a[3] * b[1],\n a[0] * b[2] + a[2] * b[3],\n a[1] * b[2] + a[3] * b[3],\n a[0] * b[4] + a[2] * b[5] + a[4],\n a[1] * b[4] + a[3] * b[5] + a[5],\n ];\n}\n\n/** Apply a 2x3 affine to a 2D point. */\nexport function applyMatrix(m: Matrix, x: number, y: number): { x: number; y: number } {\n return { x: m[0] * x + m[2] * y + m[4], y: m[1] * x + m[3] * y + m[5] };\n}\n\n/** True if `m` is the identity within a small epsilon. */\nexport function isIdentity(m: Matrix, eps = 1e-9): boolean {\n return (\n Math.abs(m[0] - 1) < eps &&\n Math.abs(m[1]) < eps &&\n Math.abs(m[2]) < eps &&\n Math.abs(m[3] - 1) < eps &&\n Math.abs(m[4]) < eps &&\n Math.abs(m[5]) < eps\n );\n}\n\nconst NUM_RE = /[-+]?(?:\\d*\\.\\d+|\\d+\\.?)(?:[eE][-+]?\\d+)?/g;\n\nfunction readNumbers(s: string): number[] {\n const out: number[] = [];\n const matches = s.match(NUM_RE);\n if (!matches) return out;\n for (const m of matches) {\n const n = Number(m);\n if (Number.isFinite(n)) out.push(n);\n }\n return out;\n}\n\n/**\n * Parse an SVG `transform=\"...\"` string into a single 2x3 matrix.\n * Functions compose right-to-left in SVG's coordinate model: in\n * `transform=\"A B\"`, the rightmost function is applied first to a point's\n * local coordinates. We accumulate accordingly: `result = result * fn`.\n *\n * Unrecognized functions emit a warning via the optional callback and are\n * skipped (the rest of the transform list still applies).\n */\nexport function parseTransform(\n attr: string | null | undefined,\n onWarn?: (message: string) => void,\n): Matrix {\n if (!attr) return IDENTITY_MATRIX;\n let result: Matrix = IDENTITY_MATRIX;\n // Split into \"name(args)\" chunks.\n const fnRe = /([A-Za-z]+)\\s*\\(([^)]*)\\)/g;\n let match: RegExpExecArray | null;\n while ((match = fnRe.exec(attr)) !== null) {\n const name = match[1].toLowerCase();\n const nums = readNumbers(match[2]);\n let local: Matrix | null = null;\n if (name === 'matrix' && nums.length >= 6) {\n local = [nums[0], nums[1], nums[2], nums[3], nums[4], nums[5]];\n } else if (name === 'translate') {\n const tx = nums[0] ?? 0;\n const ty = nums[1] ?? 0;\n local = [1, 0, 0, 1, tx, ty];\n } else if (name === 'scale') {\n const sx = nums[0] ?? 1;\n const sy = nums.length >= 2 ? nums[1] : sx;\n local = [sx, 0, 0, sy, 0, 0];\n } else if (name === 'rotate') {\n const ang = ((nums[0] ?? 0) * Math.PI) / 180;\n const c = Math.cos(ang);\n const s = Math.sin(ang);\n const rot: Matrix = [c, s, -s, c, 0, 0];\n if (nums.length >= 3) {\n // rotate(angle, cx, cy) = translate(cx,cy) * rotate * translate(-cx,-cy)\n const cx = nums[1];\n const cy = nums[2];\n local = multiply(multiply([1, 0, 0, 1, cx, cy], rot), [1, 0, 0, 1, -cx, -cy]);\n } else {\n local = rot;\n }\n } else if (name === 'skewx' || name === 'skewy') {\n const ang = ((nums[0] ?? 0) * Math.PI) / 180;\n const t = Math.tan(ang);\n local = name === 'skewx' ? [1, 0, t, 1, 0, 0] : [1, t, 0, 1, 0, 0];\n } else {\n onWarn?.(`unsupported transform function: ${name}`);\n continue;\n }\n result = multiply(result, local);\n }\n return result;\n}\n\n/** Inverse of a 2x3 affine, or null when it is singular. */\nexport function invertMatrix(m: Matrix): Matrix | null {\n const det = m[0] * m[3] - m[1] * m[2];\n if (!Number.isFinite(det) || Math.abs(det) < 1e-12) return null;\n const a = m[3] / det, b = -m[1] / det, c = -m[2] / det, d = m[0] / det;\n return [a, b, c, d, -(a * m[4] + c * m[5]), -(b * m[4] + d * m[5])];\n}\n\n/**\n * Re-express an element's own `transform` in the frame its inherited `ctm`\n * maps into: `ctm * local * ctm⁻¹`.\n *\n * A leaf's geometry is baked through `ctm` at parse time, so its own\n * transform has to move with it. Decomposing the raw local matrix against\n * bounds that have already been through `ctm` compares two different\n * coordinate spaces, and a rotation inside a translated `<g>` fails to\n * decompose for no reason but the offset. A singular `ctm` has no inverse\n * and collapses the geometry anyway; the local matrix passes through.\n */\nexport function rebaseTransform(ctm: Matrix, local: Matrix): Matrix {\n const inv = invertMatrix(ctm);\n return inv ? multiply(multiply(ctm, local), inv) : local;\n}\n\n/** Try to factor `m` as \"rotation by theta about (cx, cy)\". Returns the\n * angle in radians when `m` is (within `eps`) a pure rotation about the\n * given pivot. Returns `null` otherwise.\n *\n * Pure rotation about (cx, cy) has the matrix form:\n * [ cos -sin cx - cx*cos + cy*sin ]\n * [ sin cos cy - cx*sin - cy*cos ]\n * i.e. m[0] = m[3] = cos, m[1] = -m[2] = sin, with a translation that\n * equals the pivot's \"rotate-then-translate-back\" residue. We reconstruct\n * theta from atan2(m[1], m[0]) and verify the rest.\n */\nexport function decomposeRotation(\n m: Matrix,\n cx: number,\n cy: number,\n eps = 1e-4,\n): number | null {\n const [a, b, c, d, e, f] = m;\n // Pure rotation requires a == d and b == -c.\n if (Math.abs(a - d) > eps) return null;\n if (Math.abs(b + c) > eps) return null;\n // Determinant must be 1 (no scale, no flip).\n const det = a * d - b * c;\n if (Math.abs(det - 1) > eps) return null;\n const theta = Math.atan2(b, a);\n // Verify translation = (cx - cx*cos + cy*sin, cy - cx*sin - cy*cos).\n const expectedE = cx - cx * a + cy * b;\n const expectedF = cy - cx * b - cy * a;\n if (Math.abs(e - expectedE) > eps) return null;\n if (Math.abs(f - expectedF) > eps) return null;\n return theta;\n}\n\n/** Best-effort rotational-component extraction for a general matrix (any\n * scale + rotation, ignoring translation). Used for parse-time warnings\n * on un-decomposable matrices: we can detect \"there is a rotation here\"\n * even if we won't preserve it as `node.rotation`. For a non-uniform\n * matrix the \"rotation\" is ambiguous; we report atan2(b, a) which\n * corresponds to where the +x basis vector points.\n */\nexport function rotationComponent(m: Matrix): number {\n return Math.atan2(m[1], m[0]);\n}\n\n/**\n * Format a matrix as an SVG `matrix(a b c d e f)` value. Returns `null`\n * when `m` is (effectively) the identity, so the caller can omit the\n * attribute entirely.\n */\nexport function formatMatrix(m: Matrix): string | null {\n if (isIdentity(m)) return null;\n return `matrix(${m.map((n) => trimNumber(n)).join(' ')})`;\n}\n\n/** Trim trailing zeros from a numeric value for compact SVG output. */\nexport function trimNumber(n: number): string {\n if (!Number.isFinite(n)) return '0';\n // Round to ~6 decimal places to avoid floating-point cruft.\n const r = Math.round(n * 1e6) / 1e6;\n if (Number.isInteger(r)) return String(r);\n return String(r);\n}\n","/**\n * Map between SVG `<pattern>` elements and weasel's `pattern` `FillStyle`.\n * The counterpart to `gradients.ts` for the other paint-server kind.\n *\n * The tile's shapes come from `tileGeometry` in core, so the vector form a\n * viewer sees is generated from the same description that rasterizes the GL\n * texture. Alongside them we write the spec itself onto a `data-weasel-tile`\n * attribute: any SVG consumer renders the shapes, and weasel reads the\n * attribute back to recover the exact spec rather than reverse-engineering\n * it from geometry.\n *\n * A pattern whose payload is a `TextureHandle` has no vector form — the\n * handle is a session-scoped registry key with no tile description behind\n * it — and exports as nothing, with a warning. Same treatment conic\n * gradients get.\n */\n\nimport { tileGeometry, type TileShape } from '@weasel-js/core/patterns-builtin';\nimport type { FillStyle, TilePatternSpec } from '@weasel-js/core';\nimport { collectElementsByTag } from './elements';\nimport { trimNumber } from './transform';\n\ntype PatternFill = Extract<FillStyle, { fill: 'pattern' }>;\n\n/** Collected pattern definitions, keyed by element id. */\nexport type PatternTable = Map<string, FillStyle>;\n\n/** Whether a pattern paint carries a serializable spec. */\nexport function patternSpecOf(paint: PatternFill): TilePatternSpec | null {\n return 'tile' in paint.pattern ? paint.pattern : null;\n}\n\nexport function patternXml(id: string, paint: PatternFill, onWarn?: (m: string) => void): string {\n const spec = patternSpecOf(paint);\n if (!spec) {\n onWarn?.('pattern fill carries a TextureHandle, which has no vector form — omitted from <defs>');\n return '';\n }\n const geometry = tileGeometry(spec);\n const body = geometry.shapes.map(shapeXml).join('');\n const origin = paint.origin ?? { x: 0, y: 0 };\n const attrs = [\n `id=\"${id}\"`,\n 'patternUnits=\"userSpaceOnUse\"',\n `width=\"${trimNumber(geometry.size)}\"`,\n `height=\"${trimNumber(geometry.size)}\"`,\n ];\n if (origin.x !== 0 || origin.y !== 0) {\n attrs.push(`x=\"${trimNumber(origin.x)}\"`, `y=\"${trimNumber(origin.y)}\"`);\n }\n attrs.push(`data-weasel-tile=\"${escapeAttr(JSON.stringify(spec))}\"`);\n return `<pattern ${attrs.join(' ')}>${body}</pattern>`;\n}\n\n/**\n * A single tile as a standalone `<svg>` document, sized to its own extent.\n * For UI that needs to show a tile outside a document — a picker swatch,\n * set as a repeating CSS `background-image` via a data URI. Shares the shape\n * mapper with `patternXml`, so a preview can't drift from what paints.\n */\nexport function tilePreviewSvg(spec: TilePatternSpec, background?: string): string {\n const geometry = tileGeometry(spec);\n const s = trimNumber(geometry.size);\n const bg = background\n ? `<rect width=\"${s}\" height=\"${s}\" fill=\"${background}\"/>`\n : '';\n return `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${s}\" height=\"${s}\" `\n + `viewBox=\"0 0 ${s} ${s}\">${bg}${geometry.shapes.map(shapeXml).join('')}</svg>`;\n}\n\n/** `tilePreviewSvg` packed as a `url(...)` value for CSS `background-image`. */\nexport function tilePreviewCssUrl(spec: TilePatternSpec, background?: string): string {\n return `url(\"data:image/svg+xml,${encodeURIComponent(tilePreviewSvg(spec, background))}\")`;\n}\n\nfunction shapeXml(shape: TileShape): string {\n switch (shape.kind) {\n case 'line':\n return `<line x1=\"${trimNumber(shape.x1)}\" y1=\"${trimNumber(shape.y1)}\" `\n + `x2=\"${trimNumber(shape.x2)}\" y2=\"${trimNumber(shape.y2)}\" `\n + `stroke=\"${shape.color}\" stroke-width=\"${trimNumber(shape.width)}\"/>`;\n case 'circle':\n return `<circle cx=\"${trimNumber(shape.cx)}\" cy=\"${trimNumber(shape.cy)}\" `\n + `r=\"${trimNumber(shape.r)}\" fill=\"${shape.color}\"/>`;\n case 'ellipse': {\n const deg = (shape.rotation * 180) / Math.PI;\n const transform = deg === 0\n ? ''\n : ` transform=\"rotate(${trimNumber(deg)} ${trimNumber(shape.cx)} ${trimNumber(shape.cy)})\"`;\n return `<ellipse cx=\"${trimNumber(shape.cx)}\" cy=\"${trimNumber(shape.cy)}\" `\n + `rx=\"${trimNumber(shape.rx)}\" ry=\"${trimNumber(shape.ry)}\" `\n + `fill=\"${shape.color}\"${transform}/>`;\n }\n case 'rect':\n return `<rect x=\"${trimNumber(shape.x)}\" y=\"${trimNumber(shape.y)}\" `\n + `width=\"${trimNumber(shape.width)}\" height=\"${trimNumber(shape.height)}\" `\n + `fill=\"${shape.color}\"/>`;\n default:\n return '';\n }\n}\n\n/** Read every `<pattern>` in the document back into pattern paints. */\nexport function collectPatterns(svg: Element, onWarn?: (m: string) => void): PatternTable {\n const out: PatternTable = new Map();\n for (const [id, el] of collectElementsByTag(svg, PATTERN_TAGS)) {\n const paint = readPattern(el, onWarn);\n if (paint) out.set(id, paint);\n }\n return out;\n}\n\nconst PATTERN_TAGS = new Set(['pattern']);\n\nfunction readPattern(el: Element, onWarn?: (m: string) => void): FillStyle | null {\n const raw = el.getAttribute('data-weasel-tile');\n if (!raw) {\n // A hand-authored pattern (Illustrator, Inkscape) holds arbitrary\n // geometry no `TilePatternSpec` can express. Recognizing it would mean\n // reverse-engineering a tile from its children; dropping it with a\n // warning is honest, and the element survives in the source file.\n onWarn?.(`<pattern id=\"${el.getAttribute('id')}\"> has no data-weasel-tile — unsupported pattern, dropped`);\n return null;\n }\n let spec: TilePatternSpec;\n try {\n spec = JSON.parse(raw) as TilePatternSpec;\n } catch {\n onWarn?.(`<pattern id=\"${el.getAttribute('id')}\"> has malformed data-weasel-tile — dropped`);\n return null;\n }\n if (typeof spec?.tile !== 'string' || typeof spec?.color !== 'string') {\n onWarn?.(`<pattern id=\"${el.getAttribute('id')}\"> data-weasel-tile is not a tile spec — dropped`);\n return null;\n }\n const x = parseFloat(el.getAttribute('x') ?? '0');\n const y = parseFloat(el.getAttribute('y') ?? '0');\n const paint: PatternFill = { fill: 'pattern', pattern: spec };\n if (x !== 0 || y !== 0) paint.origin = { x, y };\n return paint;\n}\n\nfunction escapeAttr(s: string): string {\n return s\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"');\n}\n","/**\n * Serialize a weasel `Path` to an SVG `d=` attribute string. `RectPath`\n * lowers to `M h v h Z`; `PolygonPath` walks the (commands, coords)\n * arrays, emitting one SVG command per kit command.\n *\n * Output uses absolute commands only and a small amount of whitespace\n * compression (no leading zeros stripped beyond what `Number.toString`\n * already does). Numbers are rounded to ~6 decimals via `trimNumber`.\n */\n\nimport {\n PATH_C, PATH_L, PATH_M, PATH_Q, PATH_Z,\n type Path,\n} from '@weasel-js/core';\nimport { trimNumber } from './transform';\n\n/** Serialize a weasel `Path` to an SVG `d=` attribute string. */\nexport function serializePathD(path: Path): string {\n if (path.kind === 'rect') {\n const { x, y, width, height } = path;\n return `M${trimNumber(x)} ${trimNumber(y)}h${trimNumber(width)}v${trimNumber(height)}h${trimNumber(-width)}Z`;\n }\n const cmds = path.commands;\n const xs = path.coords;\n const out: string[] = [];\n let ci = 0;\n for (let i = 0; i < cmds.length; i++) {\n const c = cmds[i];\n if (c === PATH_M) {\n out.push(`M${trimNumber(xs[ci])} ${trimNumber(xs[ci + 1])}`);\n ci += 2;\n } else if (c === PATH_L) {\n out.push(`L${trimNumber(xs[ci])} ${trimNumber(xs[ci + 1])}`);\n ci += 2;\n } else if (c === PATH_C) {\n out.push(\n `C${trimNumber(xs[ci])} ${trimNumber(xs[ci + 1])} ` +\n `${trimNumber(xs[ci + 2])} ${trimNumber(xs[ci + 3])} ` +\n `${trimNumber(xs[ci + 4])} ${trimNumber(xs[ci + 5])}`,\n );\n ci += 6;\n } else if (c === PATH_Q) {\n out.push(\n `Q${trimNumber(xs[ci])} ${trimNumber(xs[ci + 1])} ` +\n `${trimNumber(xs[ci + 2])} ${trimNumber(xs[ci + 3])}`,\n );\n ci += 4;\n } else if (c === PATH_Z) {\n out.push('Z');\n }\n }\n return out.join('');\n}\n","/**\n * Map between SVG `<linearGradient>` / `<radialGradient>` elements and\n * weasel's `FillStyle` gradient variants. Definitions are indexed by id\n * wherever in the document they appear, and looked up when a `fill` /\n * `stroke` attribute references one as `url(#id)`. On serialize, we\n * emit a fresh `<defs>` block with stable generated ids.\n */\n\nimport { getPaintKind, getMarker } from '@weasel-js/core';\nimport type { FillStyle, GradStop, GradientUnits, MarkerEntry } from '@weasel-js/core';\nimport { parsePaintAttr } from './color';\nimport { trimNumber } from './transform';\nimport { patternXml } from './patterns';\nimport { collectElementsByTag, type ElementTable } from './elements';\nimport { serializePathD } from './path-serializer';\n\n/** Collected gradient definitions, keyed by element id. */\nexport type GradientTable = Map<string, FillStyle>;\n\nconst GRADIENT_TAGS = new Set(['lineargradient', 'radialgradient']);\n\nconst XLINK_NS = 'http://www.w3.org/1999/xlink';\n\n/** Read every gradient definition in the document, keyed by element id. */\nexport function collectGradients(svg: Element, onWarn?: (m: string) => void): GradientTable {\n const out: GradientTable = new Map();\n const elements = collectElementsByTag(svg, GRADIENT_TAGS);\n for (const [id, el] of elements) {\n const paint = el.tagName.toLowerCase() === 'lineargradient'\n ? readLinearGradient(el, elements, onWarn)\n : readRadialGradient(el, elements, onWarn);\n if (paint) out.set(id, paint);\n }\n warnUnsupportedDefsChildren(svg, onWarn);\n return out;\n}\n\n/** Paint servers and `<marker>` aside, a `<defs>` child is something this\n * package does not model (`<clipPath>`, a `<use>` template). Say so once here. */\nfunction warnUnsupportedDefsChildren(svg: Element, onWarn?: (m: string) => void): void {\n if (!onWarn) return;\n const defs = svg.getElementsByTagName('defs');\n for (let d = 0; d < defs.length; d++) {\n const root = defs[d];\n for (let i = 0; i < root.children.length; i++) {\n const child = root.children[i];\n const tag = child.tagName.toLowerCase();\n if (GRADIENT_TAGS.has(tag) || tag === 'pattern' || tag === 'marker') continue;\n onWarn(`unsupported <defs> child: <${child.tagName}>`);\n }\n }\n}\n\n/**\n * The gradient a `href` / `xlink:href` attribute points at, or null. SVG lets\n * one gradient inherit another's stops and attributes this way, and authoring\n * tools lean on it heavily — a chain that isn't followed resolves to a\n * gradient with no stops, which paints nothing.\n */\nfunction hrefTarget(el: Element, elements: ElementTable): Element | null {\n const raw = el.getAttribute('href')\n ?? el.getAttributeNS(XLINK_NS, 'href')\n ?? el.getAttribute('xlink:href');\n if (!raw || !raw.startsWith('#')) return null;\n return elements.get(raw.slice(1)) ?? null;\n}\n\n/** An attribute's value on `el` or, when absent, on the gradient it inherits\n * from. `seen` breaks a reference cycle. */\nfunction inheritedAttr(\n el: Element, elements: ElementTable, name: string, seen: Set<Element> = new Set(),\n): string | null {\n if (el.hasAttribute(name)) return el.getAttribute(name);\n seen.add(el);\n const ref = hrefTarget(el, elements);\n if (!ref || seen.has(ref)) return null;\n return inheritedAttr(ref, elements, name, seen);\n}\n\n/** `el`'s own stops or, when it declares none, the stops it inherits. */\nfunction inheritedStops(\n el: Element, elements: ElementTable, onWarn?: (m: string) => void,\n seen: Set<Element> = new Set(),\n): GradStop[] {\n const own = readStops(el, onWarn);\n if (own.length > 0) return own;\n seen.add(el);\n const ref = hrefTarget(el, elements);\n if (!ref || seen.has(ref)) return own;\n return inheritedStops(ref, elements, onWarn, seen);\n}\n\n/** Parse a `stop-opacity` / offset value that may carry a `%` suffix. */\nfunction parseRatio(raw: string): number {\n const n = parseFloat(raw);\n if (!Number.isFinite(n)) return NaN;\n return raw.trimEnd().endsWith('%') ? n / 100 : n;\n}\n\nfunction readStops(el: Element, onWarn?: (m: string) => void): GradStop[] {\n const stops: GradStop[] = [];\n for (let i = 0; i < el.children.length; i++) {\n const c = el.children[i];\n if (c.tagName.toLowerCase() !== 'stop') continue;\n const offsetRaw = parseRatio(c.getAttribute('offset') ?? '0');\n const offset = Number.isFinite(offsetRaw) ? offsetRaw : 0;\n const colorAttr = c.getAttribute('stop-color') ?? '#000000';\n const parsed = parsePaintAttr(colorAttr);\n if (parsed && parsed.kind === 'solid') {\n const opacityAttr = c.getAttribute('stop-opacity');\n const own = opacityAttr != null ? parseRatio(opacityAttr) : NaN;\n const alpha = Number.isFinite(own) ? own : parsed.alpha;\n stops.push({ offset, color: alpha < 1 ? applyAlpha(parsed.color, alpha) : parsed.color });\n } else {\n onWarn?.(`gradient stop has unrecognized stop-color: ${colorAttr}`);\n stops.push({ offset, color: '#000000' });\n }\n }\n return stops;\n}\n\nfunction applyAlpha(hex: string, alpha: number): string {\n // Pack alpha into an 8-digit hex so it round-trips through weasel's\n // string-color storage. This is non-standard CSS hex but parses cleanly\n // back via our color.ts parser.\n const a = Math.max(0, Math.min(255, Math.round(alpha * 255)));\n return `${hex}${a.toString(16).padStart(2, '0')}`;\n}\n\n/** SVG `gradientUnits` → the kit's `GradientUnits`. SVG's default is\n * `objectBoundingBox`, which is what the attribute defaults above assume\n * (`x2=\"1\"`, `r=\"0.5\"`), so the two have to be read together. */\nfunction readGradientUnits(el: Element, elements: ElementTable): 'bounds' | 'world' {\n return inheritedAttr(el, elements, 'gradientUnits') === 'userSpaceOnUse' ? 'world' : 'bounds';\n}\n\n/** `gradientTransform` has no slot in the kit's gradient model, so a gradient\n * carrying one paints in the wrong place rather than not at all. */\nfunction warnGradientTransform(\n el: Element, elements: ElementTable, onWarn?: (m: string) => void,\n): void {\n const t = inheritedAttr(el, elements, 'gradientTransform');\n if (t != null && t.trim() !== '') {\n onWarn?.(`gradientTransform=\"${t}\" is not modeled; the gradient paints untransformed`);\n }\n}\n\nfunction num(raw: string | null, fallback: number): number {\n if (raw == null) return fallback;\n const n = parseRatio(raw);\n return Number.isFinite(n) ? n : fallback;\n}\n\nfunction readLinearGradient(\n el: Element, elements: ElementTable, onWarn?: (m: string) => void,\n): FillStyle | null {\n warnGradientTransform(el, elements, onWarn);\n return {\n fill: 'linear-gradient',\n from: {\n x: num(inheritedAttr(el, elements, 'x1'), 0),\n y: num(inheritedAttr(el, elements, 'y1'), 0),\n },\n to: {\n x: num(inheritedAttr(el, elements, 'x2'), 1),\n y: num(inheritedAttr(el, elements, 'y2'), 0),\n },\n stops: inheritedStops(el, elements, onWarn),\n units: readGradientUnits(el, elements),\n };\n}\n\nfunction readRadialGradient(\n el: Element, elements: ElementTable, onWarn?: (m: string) => void,\n): FillStyle | null {\n warnGradientTransform(el, elements, onWarn);\n return {\n fill: 'radial-gradient',\n center: {\n x: num(inheritedAttr(el, elements, 'cx'), 0.5),\n y: num(inheritedAttr(el, elements, 'cy'), 0.5),\n },\n radius: num(inheritedAttr(el, elements, 'r'), 0.5),\n stops: inheritedStops(el, elements, onWarn),\n units: readGradientUnits(el, elements),\n };\n}\n\n/**\n * Pre-pass that assigns stable serialization ids to the paint servers —\n * gradients and patterns — used by any leaf in the tree. We key on object\n * identity so two leaves sharing the exact same `FillStyle` reference reuse\n * one `<defs>` entry; structurally equal but distinct objects get separate\n * ids.\n */\nexport class PaintServerRegistry {\n private byPaint = new Map<FillStyle, string>();\n private order: FillStyle[] = [];\n private counter = 0;\n\n // Marker keys referenced by any stroke, in first-use order. The `<defs>`\n // id is the marker key itself, not a minted counter id: `parseSvg` reads a\n // `marker-end=\"url(#id)\"` fragment back as the marker key directly (it\n // never inspects the `<marker>` element), so a synthetic id would come\n // back unresolvable and warn on round-trip.\n private markerKeys: string[] = [];\n private markerKeySet = new Set<string>();\n\n register(paint: FillStyle): string {\n const existing = this.byPaint.get(paint);\n if (existing) return existing;\n const id = paint.fill === 'pattern' ? `pat${this.counter++}` : `grad${this.counter++}`;\n this.byPaint.set(paint, id);\n this.order.push(paint);\n return id;\n }\n\n /** The `<defs>` id for a marker key — the key itself, minting nothing.\n * `undefined` when nothing is registered under `key`, so a caller emits no\n * attribute at all rather than a `url(#…)` pointing at a def that will\n * never be written. */\n markerId(key: string): string | undefined {\n if (getMarker(key) === undefined) return undefined;\n if (!this.markerKeySet.has(key)) {\n this.markerKeySet.add(key);\n this.markerKeys.push(key);\n }\n return key;\n }\n\n /** Emit `<defs>...</defs>` XML for every registered paint server and marker. */\n toDefsXml(onWarn?: (m: string) => void): string {\n if (this.order.length === 0 && this.markerKeys.length === 0) return '';\n const parts: string[] = ['<defs>'];\n for (const paint of this.order) {\n parts.push(paintServerXml(this.byPaint.get(paint)!, paint, onWarn));\n }\n for (const key of this.markerKeys) {\n const entry = getMarker(key);\n if (!entry) continue;\n parts.push(entry.toSvg ? entry.toSvg(key, entry) : defaultMarkerXml(key, entry));\n }\n parts.push('</defs>');\n return parts.join('');\n }\n}\n\n/** The `<marker>` def for an entry with no `toSvg` of its own. */\nfunction defaultMarkerXml(id: string, entry: MarkerEntry): string {\n const path = entry.path({ size: 1, stroke: { paint: { fill: 'solid', color: '#000' } } });\n const d = serializePathD(path);\n const fill = entry.fill === 'none' ? 'none' : 'context-stroke';\n const outline = entry.outline\n ? ` stroke=\"context-stroke\" stroke-width=\"${entry.outline.width}\" stroke-linecap=\"round\" stroke-linejoin=\"round\"`\n : '';\n // `overflow=\"visible\"` overrides the UA default of `hidden`, which would\n // otherwise clip the arrowhead to the marker's viewport.\n return (\n `<marker id=\"${id}\" markerUnits=\"strokeWidth\" markerWidth=\"8\" markerHeight=\"8\"` +\n ` refX=\"0\" refY=\"0\" orient=\"auto\" overflow=\"visible\">` +\n `<path d=\"${d}\" fill=\"${fill}\"${outline}/></marker>`\n );\n}\n\n/** One paint server's `<defs>` entry: the built-in mapping, else the kind's\n * own `toSvg`, else nothing plus a warning. The referencing element already\n * carries `fill=\"url(#id)\"`, so a silent omission is a dangling reference and\n * the shape vanishes in a viewer. */\nfunction paintServerXml(id: string, paint: FillStyle, onWarn?: (m: string) => void): string {\n if (paint.fill === 'pattern') return patternXml(id, paint, onWarn);\n const builtin = gradientXml(id, paint);\n if (builtin) return builtin;\n const custom = getPaintKind(paint.fill)?.toSvg?.(id, paint);\n if (custom) return custom;\n onWarn?.(`${paint.fill} fill has no vector form — omitted from <defs>`);\n return '';\n}\n\n/** `GradientUnits` → SVG `gradientUnits`. `'screen'` (the kit's default, and\n * a viewport-fixed wash) has no SVG analog at all; it lowers to user space,\n * which at least puts the paint somewhere the geometry is. */\nfunction gradientUnitsAttr(units: GradientUnits | undefined): string {\n return units === 'bounds' ? 'objectBoundingBox' : 'userSpaceOnUse';\n}\n\nfunction gradientXml(id: string, paint: FillStyle): string {\n if (paint.fill === 'linear-gradient') {\n const stops = paint.stops.map(stopXml).join('');\n return (\n `<linearGradient id=\"${id}\" gradientUnits=\"${gradientUnitsAttr(paint.units)}\" ` +\n `x1=\"${trimNumber(paint.from.x)}\" y1=\"${trimNumber(paint.from.y)}\" ` +\n `x2=\"${trimNumber(paint.to.x)}\" y2=\"${trimNumber(paint.to.y)}\">${stops}</linearGradient>`\n );\n }\n if (paint.fill === 'radial-gradient') {\n const stops = paint.stops.map(stopXml).join('');\n return (\n `<radialGradient id=\"${id}\" gradientUnits=\"${gradientUnitsAttr(paint.units)}\" ` +\n `cx=\"${trimNumber(paint.center.x)}\" cy=\"${trimNumber(paint.center.y)}\" ` +\n `r=\"${trimNumber(paint.radius)}\">${stops}</radialGradient>`\n );\n }\n return '';\n}\n\nfunction stopXml(s: GradStop): string {\n // Detect packed-alpha hex (#rrggbbaa) and split out stop-opacity.\n const m = /^#([0-9a-f]{6})([0-9a-f]{2})$/i.exec(s.color);\n if (m) {\n const alpha = parseInt(m[2], 16) / 255;\n return `<stop offset=\"${trimNumber(s.offset)}\" stop-color=\"#${m[1].toLowerCase()}\" stop-opacity=\"${trimNumber(alpha)}\"/>`;\n }\n return `<stop offset=\"${trimNumber(s.offset)}\" stop-color=\"${s.color}\"/>`;\n}\n","/**\n * Serialize a `SvgNode[]` tree to an SVG document string. Every leaf is\n * emitted as a `<path>` (even shapes that started as `<rect>` etc.) —\n * lossless geometry round-trip beats round-tripping the element-kind\n * label. Gradient paints are gathered into a single `<defs>` block.\n */\n\nimport type { Path, Stroke } from '@weasel-js/core';\nimport { boundsOfPath, resolveStrokeWidth, SCRIPT_METRICS } from '@weasel-js/core';\nimport type {\n Matrix, NamespaceMeta, NamespacedElement, SerializeOptions, SvgGroupNode,\n SvgNode, SvgPaint, SvgPathNode, SvgStroke, SvgTextNode, SvgImageNode,\n} from './types';\nimport { IDENTITY_MATRIX } from './types';\nimport { serializePathD } from './path-serializer';\nimport { formatMatrix, multiply, trimNumber } from './transform';\nimport { PaintServerRegistry } from './gradients';\n\n/**\n * Walk the tree and produce an SVG document string. The root `<svg>`'s\n * `viewBox` is taken from `opts.viewBox` if supplied, otherwise computed\n * as a tight bounding box around every leaf.\n */\nexport function serializeSvg(nodes: SvgNode[], opts: SerializeOptions = {}): string {\n const registry = new PaintServerRegistry();\n registerPaintServers(nodes, registry);\n\n const bounds = opts.viewBox ?? computeBounds(nodes);\n const vb = `${trimNumber(bounds.x)} ${trimNumber(bounds.y)} ${trimNumber(bounds.width)} ${trimNumber(bounds.height)}`;\n const namespaces = opts.namespaces ?? {};\n\n const rootAttrs: string[] = [`xmlns=\"http://www.w3.org/2000/svg\"`];\n for (const [prefix, uri] of Object.entries(namespaces)) {\n rootAttrs.push(`xmlns:${prefix}=\"${escapeAttr(uri)}\"`);\n }\n rootAttrs.push(`viewBox=\"${vb}\"`);\n if (opts.width != null) rootAttrs.push(`width=\"${trimNumber(opts.width)}\"`);\n if (opts.height != null) rootAttrs.push(`height=\"${trimNumber(opts.height)}\"`);\n // documentMeta attrs onto the root, in declared-namespace order.\n if (opts.documentMeta) {\n for (const prefix of Object.keys(namespaces)) {\n const bucket = opts.documentMeta[prefix];\n if (!bucket?.attrs) continue;\n for (const [name, value] of Object.entries(bucket.attrs)) {\n rootAttrs.push(`${prefix}:${name}=\"${escapeAttr(value)}\"`);\n }\n }\n }\n\n // documentMeta elements after <defs>, before geometry body.\n let docMetaXml = '';\n if (opts.documentMeta) {\n for (const prefix of Object.keys(namespaces)) {\n const bucket = opts.documentMeta[prefix];\n if (!bucket?.elements) continue;\n for (const [localName, list] of Object.entries(bucket.elements)) {\n for (const el of list) docMetaXml += namespacedElementXml(prefix, localName, el);\n }\n }\n }\n\n const defsXml = registry.toDefsXml(opts.onWarn);\n const bodyXml = nodes.map((n) => nodeXml(n, registry, namespaces)).join('');\n\n // `<title>` goes immediately inside `<svg>` per SVG-spec convention; it's\n // an accessibility hook and (for our purposes) a stable place to round-trip\n // the user-visible document title.\n const titleXml = opts.title && opts.title.length > 0\n ? `<title>${escapeText(opts.title)}</title>`\n : '';\n\n return `<svg ${rootAttrs.join(' ')}>${titleXml}${defsXml}${docMetaXml}${bodyXml}</svg>`;\n}\n\nfunction namespacedElementXml(prefix: string, localName: string, el: NamespacedElement): string {\n const attrs: string[] = [];\n for (const [name, value] of Object.entries(el.attrs)) {\n attrs.push(`${name}=\"${escapeAttr(value)}\"`);\n }\n const head = attrs.length > 0 ? `<${prefix}:${localName} ${attrs.join(' ')}>` : `<${prefix}:${localName}>`;\n let body = '';\n if (el.children) {\n for (const [childName, list] of Object.entries(el.children)) {\n for (const child of list) body += namespacedElementXml(prefix, childName, child);\n }\n } else if (el.text != null) {\n body = escapeText(el.text);\n }\n return `${head}${body}</${prefix}:${localName}>`;\n}\n\nfunction metaAttrsXml(meta: NamespaceMeta | undefined, namespaces: Record<string, string>): string {\n if (!meta) return '';\n const parts: string[] = [];\n for (const prefix of Object.keys(namespaces)) {\n const bucket = meta[prefix];\n if (!bucket?.attrs) continue;\n for (const [name, value] of Object.entries(bucket.attrs)) {\n parts.push(`${prefix}:${name}=\"${escapeAttr(value)}\"`);\n }\n }\n return parts.length > 0 ? ` ${parts.join(' ')}` : '';\n}\n\nfunction metaElementsXml(meta: NamespaceMeta | undefined, namespaces: Record<string, string>): string {\n if (!meta) return '';\n let out = '';\n for (const prefix of Object.keys(namespaces)) {\n const bucket = meta[prefix];\n if (!bucket?.elements) continue;\n for (const [localName, list] of Object.entries(bucket.elements)) {\n for (const el of list) out += namespacedElementXml(prefix, localName, el);\n }\n }\n return out;\n}\n\nfunction registerPaintServers(nodes: SvgNode[], registry: PaintServerRegistry): void {\n for (const n of nodes) {\n if (n.kind === 'group') {\n registerPaintServers(n.children, registry);\n } else if (n.kind === 'path') {\n if (n.fill.kind === 'gradient') registry.register(n.fill.paint);\n if (n.stroke && n.stroke.paint.kind === 'gradient') registry.register(n.stroke.paint.paint);\n registerMarkers(n.stroke, registry);\n } else if (n.kind === 'text') {\n // Text paints flow through `style` / `runs` rather than a top-level\n // SvgPaint, so register direct FillStyle references when present. This\n // pre-pass is load-bearing: `<defs>` is emitted before the body, so a\n // paint first seen while writing an element would be referenced by an\n // id that no definition backs.\n registerTextPaint(n.fill, registry);\n registerTextPaint(n.stroke?.paint, registry);\n registerMarkers(n.stroke, registry);\n for (const run of n.runs ?? []) {\n registerTextPaint(run.fill, registry);\n registerTextPaint(run.stroke?.paint, registry);\n }\n }\n }\n}\n\n/** Register one text paint if it is a paint server rather than a colour. */\nfunction registerTextPaint(\n paint: import('@weasel-js/core').FillStyle | undefined,\n registry: PaintServerRegistry,\n): void {\n if (paint && !('color' in paint)) registry.register(paint);\n}\n\n/** A marker reference in either shape — `SvgStroke` stores a bare key, the kit\n * `Stroke` stores a `MarkerRef`. */\nfunction markerKeyOfRef(ref: unknown): string | undefined {\n if (typeof ref === 'string') return ref;\n if (ref && typeof ref === 'object' && 'key' in ref) return String((ref as { key: string }).key);\n return undefined;\n}\n\n/** Mint a `<defs>` id for every marker a stroke names, before the body is\n * written — same reason as the paint pre-pass above. */\nfunction registerMarkers(\n stroke: { markerStart?: unknown; markerMid?: unknown; markerEnd?: unknown } | undefined,\n registry: PaintServerRegistry,\n): void {\n if (!stroke) return;\n for (const ref of [stroke.markerStart, stroke.markerMid, stroke.markerEnd]) {\n const key = markerKeyOfRef(ref);\n if (key) registry.markerId(key);\n }\n}\n\nfunction nodeXml(node: SvgNode, registry: PaintServerRegistry, namespaces: Record<string, string>): string {\n if (node.kind === 'group') return groupXml(node, registry, namespaces);\n if (node.kind === 'text') return textXml(node, registry, namespaces);\n if (node.kind === 'image') return imageXml(node, namespaces);\n return pathXml(node, registry, namespaces);\n}\n\n/**\n * Emit an `<image>`. `preserveAspectRatio=\"none\"` is unconditional: the node\n * carries a literal box and nothing else, so letting a viewer letterbox it\n * would place the pixels somewhere the model never said.\n */\nfunction imageXml(node: SvgImageNode, namespaces: Record<string, string>): string {\n const attrs: string[] = [\n `href=\"${escapeAttr(node.href)}\"`,\n `x=\"${trimNumber(node.x)}\"`,\n `y=\"${trimNumber(node.y)}\"`,\n `width=\"${trimNumber(node.width)}\"`,\n `height=\"${trimNumber(node.height)}\"`,\n `preserveAspectRatio=\"none\"`,\n ];\n if (node.opacity != null && node.opacity !== 1) {\n attrs.push(`opacity=\"${trimNumber(node.opacity)}\"`);\n }\n if (node.rotation != null && node.rotation !== 0) {\n const cx = node.x + node.width / 2;\n const cy = node.y + node.height / 2;\n const deg = (node.rotation * 180) / Math.PI;\n attrs.push(`transform=\"rotate(${trimNumber(deg)} ${trimNumber(cx)} ${trimNumber(cy)})\"`);\n }\n const metaAttrs = metaAttrsXml(node.meta, namespaces);\n const metaEls = metaElementsXml(node.meta, namespaces);\n if (metaEls) return `<image ${attrs.join(' ')}${metaAttrs}>${metaEls}</image>`;\n return `<image ${attrs.join(' ')}${metaAttrs}/>`;\n}\n\nfunction groupXml(node: SvgGroupNode, registry: PaintServerRegistry, namespaces: Record<string, string>): string {\n const attrs: string[] = [];\n if (node.transform) {\n const m = formatMatrix(node.transform);\n if (m) attrs.push(`transform=\"${m}\"`);\n }\n if (node.opacity != null && node.opacity !== 1) {\n attrs.push(`opacity=\"${trimNumber(node.opacity)}\"`);\n }\n const metaAttrs = metaAttrsXml(node.meta, namespaces);\n // `metaAttrs` already starts with a leading space (or is empty), so we\n // can splice it after the existing attr list without extra logic.\n const head = attrs.length > 0\n ? `<g ${attrs.join(' ')}${metaAttrs}>`\n : `<g${metaAttrs}>`;\n const body = node.children.map((c) => nodeXml(c, registry, namespaces)).join('');\n return `${head}${body}${metaElementsXml(node.meta, namespaces)}</g>`;\n}\n\nfunction pathXml(node: SvgPathNode, registry: PaintServerRegistry, namespaces: Record<string, string>): string {\n const attrs: string[] = [`d=\"${serializePathD(node.path)}\"`];\n const fillAttrs = paintAttrs(node.fill, 'fill', registry);\n for (const a of fillAttrs) attrs.push(a);\n // Emit fill-rule only when it diverges from SVG's default ('nonzero').\n // RectPath has no fillRule field — only PolygonPath carries one.\n if (node.path.kind === 'polygon' && node.path.fillRule === 'evenodd') {\n attrs.push(`fill-rule=\"evenodd\"`);\n }\n if (node.stroke) {\n const strokeAttrs = strokeAttrsFor(node.stroke, registry);\n for (const a of strokeAttrs) attrs.push(a);\n } else {\n attrs.push('stroke=\"none\"');\n }\n if (node.opacity != null && node.opacity !== 1) {\n attrs.push(`opacity=\"${trimNumber(node.opacity)}\"`);\n }\n if (node.rotation != null && node.rotation !== 0) {\n const b = pathBounds(node.path);\n const cx = b.minX + (b.maxX - b.minX) / 2;\n const cy = b.minY + (b.maxY - b.minY) / 2;\n const deg = (node.rotation * 180) / Math.PI;\n attrs.push(`transform=\"rotate(${trimNumber(deg)} ${trimNumber(cx)} ${trimNumber(cy)})\"`);\n }\n const metaAttrs = metaAttrsXml(node.meta, namespaces);\n const metaEls = metaElementsXml(node.meta, namespaces);\n if (metaEls) {\n return `<path ${attrs.join(' ')}${metaAttrs}>${metaEls}</path>`;\n }\n return `<path ${attrs.join(' ')}${metaAttrs}/>`;\n}\n\nfunction paintAttrs(\n paint: SvgPaint,\n name: 'fill' | 'stroke',\n registry: PaintServerRegistry,\n includeOpacity = true,\n): string[] {\n if (paint.kind === 'none') return [`${name}=\"none\"`];\n if (paint.kind === 'solid') {\n const out = [`${name}=\"${paint.color}\"`];\n if (includeOpacity && paint.opacity != null && paint.opacity !== 1) {\n out.push(`${name}-opacity=\"${trimNumber(paint.opacity)}\"`);\n }\n return out;\n }\n // gradient\n const id = registry.register(paint.paint);\n return [`${name}=\"url(#${id})\"`];\n}\n\n/**\n * Attributes for a kit `Stroke` — the shape text carries, whose `paint` is a\n * `FillStyle` rather than an `SvgPaint`. Text strokes ride inside\n * `TextStyle` / `StyledRun` rather than as a node-level `SvgStroke`, because\n * that is where the kit's text model puts them.\n *\n * Absent, or zero-width, emits nothing at all: unstroked text should not\n * carry a `stroke` attribute, and SVG's own default (`none`) already says so.\n */\nfunction coreStrokeAttrs(stroke: Stroke | undefined, registry: PaintServerRegistry): string[] {\n if (!stroke) return [];\n // SVG has no accumulated-transform scale to resolve a `{ px }` width\n // against; its number is emitted as-is.\n const width = resolveStrokeWidth(stroke.width ?? 1, 1);\n if (!(width > 0)) return [];\n const attrs: string[] = [];\n if ('color' in stroke.paint) {\n attrs.push(`stroke=\"${stroke.paint.color}\"`);\n if (stroke.paint.opacity != null && stroke.paint.opacity !== 1) {\n attrs.push(`stroke-opacity=\"${trimNumber(stroke.paint.opacity)}\"`);\n }\n } else {\n attrs.push(`stroke=\"url(#${registry.register(stroke.paint)})\"`);\n }\n attrs.push(`stroke-width=\"${trimNumber(width)}\"`);\n if (stroke.cap) attrs.push(`stroke-linecap=\"${stroke.cap}\"`);\n if (stroke.join) attrs.push(`stroke-linejoin=\"${stroke.join}\"`);\n if (stroke.dash && stroke.dash.length > 0) {\n attrs.push(`stroke-dasharray=\"${stroke.dash.map(trimNumber).join(' ')}\"`);\n }\n if (stroke.miterLimit != null) attrs.push(`stroke-miterlimit=\"${trimNumber(stroke.miterLimit)}\"`);\n for (const [field, attr] of [\n ['markerStart', 'marker-start'],\n ['markerMid', 'marker-mid'],\n ['markerEnd', 'marker-end'],\n ] as const) {\n const ref = stroke[field];\n if (ref === undefined) continue;\n const key = typeof ref === 'string' ? ref : ref.key;\n const id = registry.markerId(key);\n if (id === undefined) continue;\n attrs.push(`${attr}=\"url(#${id})\"`);\n }\n return attrs;\n}\n\nfunction strokeAttrsFor(stroke: SvgStroke, registry: PaintServerRegistry): string[] {\n // `SvgStroke.opacity` and the paint's own `opacity` are two models of one\n // SVG attribute, and parse fills in both. Emitting each would write\n // `stroke-opacity` twice, which is not well-formed XML at all.\n const attrs = paintAttrs(stroke.paint, 'stroke', registry, false);\n attrs.push(`stroke-width=\"${trimNumber(stroke.width)}\"`);\n const opacity = stroke.opacity\n ?? (stroke.paint.kind === 'solid' ? stroke.paint.opacity : undefined);\n if (opacity != null && opacity !== 1) {\n attrs.push(`stroke-opacity=\"${trimNumber(opacity)}\"`);\n }\n if (stroke.cap) {\n attrs.push(`stroke-linecap=\"${stroke.cap}\"`);\n }\n if (stroke.join) {\n attrs.push(`stroke-linejoin=\"${stroke.join}\"`);\n }\n if (stroke.dash && stroke.dash.length > 0) {\n attrs.push(`stroke-dasharray=\"${stroke.dash.map(trimNumber).join(' ')}\"`);\n }\n if (stroke.miterLimit != null) {\n attrs.push(`stroke-miterlimit=\"${trimNumber(stroke.miterLimit)}\"`);\n }\n for (const [field, attr] of [\n ['markerStart', 'marker-start'],\n ['markerMid', 'marker-mid'],\n ['markerEnd', 'marker-end'],\n ] as const) {\n const ref = stroke[field];\n if (ref === undefined) continue;\n const id = registry.markerId(ref);\n if (id === undefined) continue;\n attrs.push(`${attr}=\"url(#${id})\"`);\n }\n return attrs;\n}\n\n/**\n * Tight bounding box around everything the tree draws, in the root's\n * coordinates — the fallback `viewBox` when the caller supplies none. A\n * node's `rotation` and a group's `transform` both move ink, so both are\n * applied here; a box taken from unrotated geometry crops the document.\n */\nfunction computeBounds(nodes: SvgNode[]): { x: number; y: number; width: number; height: number } {\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n const visit = (n: SvgNode, ctm: Matrix): void => {\n if (n.kind === 'group') {\n const childCtm = n.transform ? multiply(ctm, n.transform) : ctm;\n n.children.forEach((c) => visit(c, childCtm));\n return;\n }\n const b = n.kind === 'text' || n.kind === 'image'\n ? { minX: n.x, minY: n.y, maxX: n.x + n.width, maxY: n.y + n.height }\n : pathBounds(n.path);\n const local = n.rotation ? rotateAboutCenter(ctm, b, n.rotation) : ctm;\n for (const [x, y] of corners(b)) {\n const px = local[0] * x + local[2] * y + local[4];\n const py = local[1] * x + local[3] * y + local[5];\n if (px < minX) minX = px;\n if (py < minY) minY = py;\n if (px > maxX) maxX = px;\n if (py > maxY) maxY = py;\n }\n };\n nodes.forEach((n) => visit(n, IDENTITY_MATRIX));\n if (!Number.isFinite(minX)) {\n return { x: 0, y: 0, width: 0, height: 0 };\n }\n return { x: minX, y: minY, width: maxX - minX, height: maxY - minY };\n}\n\nfunction corners(b: { minX: number; minY: number; maxX: number; maxY: number }): [number, number][] {\n return [[b.minX, b.minY], [b.maxX, b.minY], [b.maxX, b.maxY], [b.minX, b.maxY]];\n}\n\n/** `ctm` composed with the same `rotate(angle cx cy)` the element emits. */\nfunction rotateAboutCenter(\n ctm: Matrix,\n b: { minX: number; minY: number; maxX: number; maxY: number },\n angle: number,\n): Matrix {\n const cx = (b.minX + b.maxX) / 2;\n const cy = (b.minY + b.maxY) / 2;\n const c = Math.cos(angle);\n const s = Math.sin(angle);\n return multiply(ctm, [c, s, -s, c, cx - cx * c + cy * s, cy - cx * s - cy * c]);\n}\n\n/**\n * Emit a `<text>` element. Uses `dominant-baseline=\"text-before-edge\"` so\n * the `y` attribute matches weasel's top-of-box pose; stashes the explicit\n * width/height (which native SVG text doesn't model) in `data-weasel-*`\n * attributes so they round-trip through the parser losslessly.\n */\nfunction textXml(node: SvgTextNode, registry: PaintServerRegistry, namespaces: Record<string, string>): string {\n const attrs: string[] = [\n `x=\"${trimNumber(node.x)}\"`,\n `y=\"${trimNumber(node.y)}\"`,\n `dominant-baseline=\"text-before-edge\"`,\n // The runs model stores real line breaks; SVG's default whitespace\n // handling would collapse them (and any indentation) away on re-import.\n `xml:space=\"preserve\"`,\n `data-weasel-width=\"${trimNumber(node.width)}\"`,\n `data-weasel-height=\"${trimNumber(node.height)}\"`,\n ];\n\n const style = node.style;\n if (style?.fontSize != null) attrs.push(`font-size=\"${trimNumber(style.fontSize)}\"`);\n if (style?.fontFamily) attrs.push(`font-family=\"${escapeAttr(style.fontFamily)}\"`);\n if (style?.fontWeight != null) attrs.push(`font-weight=\"${String(style.fontWeight)}\"`);\n if (style?.fontStyle && style.fontStyle !== 'normal') attrs.push(`font-style=\"${style.fontStyle}\"`);\n const direction = style?.direction ?? 'ltr';\n if (direction === 'rtl') attrs.push('direction=\"rtl\"');\n if (style?.align != null || direction === 'rtl') {\n // `text-anchor` is reading-order relative in SVG exactly as `start` / `end`\n // are here, so the two relative values pass straight through and only the\n // absolute pair has to be turned into an edge the reader resolves the same\n // way. Under `ltr` this collapses to what it always wrote.\n const align = style?.align ?? 'left';\n const anchor = align === 'center' ? 'middle'\n : align === 'start' ? 'start'\n : align === 'end' ? 'end'\n : (align === 'left') === (direction === 'ltr') ? 'start' : 'end';\n if (anchor !== 'start') attrs.push(`text-anchor=\"${anchor}\"`);\n }\n if (style?.letterSpacing != null && style.letterSpacing !== 0) {\n attrs.push(`letter-spacing=\"${trimNumber(style.letterSpacing)}\"`);\n }\n const decoration = textDecorationValue(style?.underline, style?.strikethrough, style?.overline);\n if (decoration) attrs.push(`text-decoration=\"${decoration}\"`);\n // Note: `lineHeight` is NOT emitted here. The bridge layer (svgInterop)\n // lifts it into `meta.wd.attrs['line-height']`, which `metaAttrsXml`\n // below emits as `wd:line-height=\"...\"`. There is no compat write of\n // `data-weasel-line-height` — per the SVG-native plan's Migration section,\n // no installed base exists to compat against.\n if (node.fill) {\n if ('color' in node.fill) {\n attrs.push(`fill=\"${node.fill.color}\"`);\n if (node.fill.opacity != null && node.fill.opacity !== 1) {\n attrs.push(`fill-opacity=\"${trimNumber(node.fill.opacity)}\"`);\n }\n } else {\n const id = registry.register(node.fill);\n attrs.push(`fill=\"url(#${id})\"`);\n }\n }\n for (const a of coreStrokeAttrs(node.stroke, registry)) attrs.push(a);\n if (node.opacity != null && node.opacity !== 1) {\n attrs.push(`opacity=\"${trimNumber(node.opacity)}\"`);\n }\n if (node.rotation != null && node.rotation !== 0) {\n const cx = node.x + node.width / 2;\n const cy = node.y + node.height / 2;\n const deg = (node.rotation * 180) / Math.PI;\n attrs.push(`transform=\"rotate(${trimNumber(deg)} ${trimNumber(cx)} ${trimNumber(cy)})\"`);\n }\n\n const body = node.runs && node.runs.length > 0\n ? node.runs.map((r) => runXml(r, registry)).join('')\n : escapeText(node.text);\n const metaAttrs = metaAttrsXml(node.meta, namespaces);\n const metaEls = metaElementsXml(node.meta, namespaces);\n return `<text ${attrs.join(' ')}${metaAttrs}>${body}${metaEls}</text>`;\n}\n\nfunction runXml(run: import('@weasel-js/core').StyledRun, registry: PaintServerRegistry): string {\n const attrs: string[] = [];\n if (run.bold) attrs.push(`font-weight=\"700\"`);\n if (run.italic) attrs.push(`font-style=\"italic\"`);\n if (run.fontFamily) attrs.push(`font-family=\"${escapeAttr(run.fontFamily)}\"`);\n // A percentage `font-size` is relative to the parent's, which is what\n // `fontScale` means; an absolute `fontSize` wins over it here as it does in\n // the runs model.\n //\n // `baseline-shift=\"super\"` carries the preset's *size* as well as its rise,\n // so a run that overrode only the rise has no keyword left to say the size\n // with and must spell it out — without this the superscript comes back\n // full-size at a raised baseline.\n const presetScale = run.script != null && run.baselineShift != null\n ? SCRIPT_METRICS[run.script].size\n : undefined;\n const scale = run.fontScale ?? presetScale;\n if (run.fontSize != null) attrs.push(`font-size=\"${trimNumber(run.fontSize)}\"`);\n else if (scale != null) attrs.push(`font-size=\"${trimNumber(scale * 100)}%\"`);\n // Same story for `baseline-shift`: an SVG percentage resolves against the\n // parent's font size, which is the unit `baselineShift` is already in.\n if (run.baselineShift != null) {\n attrs.push(`baseline-shift=\"${trimNumber(run.baselineShift * 100)}%\"`);\n } else if (run.script) {\n attrs.push(`baseline-shift=\"${run.script}\"`);\n }\n // Unlike the node-level style guard above, a run-level `0` is a meaningful\n // *override* (distinct from \"inherit the node's letterSpacing\") per the\n // runs model's additive-flags contract — emit it whenever it's set.\n if (run.letterSpacing != null) {\n attrs.push(`letter-spacing=\"${trimNumber(run.letterSpacing)}\"`);\n }\n const runDecoration = textDecorationValue(run.underline, run.strikethrough, run.overline);\n if (runDecoration) attrs.push(`text-decoration=\"${runDecoration}\"`);\n if (run.fill) {\n if ('color' in run.fill) {\n attrs.push(`fill=\"${run.fill.color}\"`);\n } else {\n const id = registry.register(run.fill);\n attrs.push(`fill=\"url(#${id})\"`);\n }\n }\n for (const a of coreStrokeAttrs(run.stroke, registry)) attrs.push(a);\n const head = attrs.length > 0 ? `<tspan ${attrs.join(' ')}>` : '<tspan>';\n return `${head}${escapeText(run.text)}</tspan>`;\n}\n\n/**\n * Combine the decoration flags into an SVG `text-decoration` value —\n * `\"underline line-through\"` when both are set, a single token when only\n * one is, or `null` (omit the attribute) when none is set.\n */\nfunction textDecorationValue(\n underline: boolean | undefined,\n strikethrough: boolean | undefined,\n overline: boolean | undefined,\n): string | null {\n const tokens: string[] = [];\n if (underline) tokens.push('underline');\n if (strikethrough) tokens.push('line-through');\n if (overline) tokens.push('overline');\n return tokens.length > 0 ? tokens.join(' ') : null;\n}\n\nfunction escapeAttr(s: string): string {\n return s.replace(/&/g, '&').replace(/\"/g, '"').replace(/</g, '<');\n}\n\nfunction escapeText(s: string): string {\n return s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');\n}\n\nfunction pathBounds(path: Path): { minX: number; minY: number; maxX: number; maxY: number } {\n if (path.kind === 'rect') {\n return {\n minX: path.x, minY: path.y,\n maxX: path.x + path.width, maxY: path.y + path.height,\n };\n }\n const b = boundsOfPath(path);\n return { minX: b.x, minY: b.y, maxX: b.x + b.width, maxY: b.y + b.height };\n}\n\n","import type { DrawCommand, Path, Stroke } from '@weasel-js/core';\nimport {\n ellipsePath,\n linePath,\n markerDrawCommands,\n PathBuilder,\n rectPath,\n textCommand,\n} from '@weasel-js/core';\nimport type { WorldRect } from './frac';\nimport type { AnnotationData, FracPoint } from './types';\n\n/** One loud color, not a themed one: a mark sits over the instrument's own\n * picture and has to be legible against whatever that picture is. */\nconst MARK_COLOR = '#e5484d';\n/** World units, so a mark thickens with the picture it annotates — and so the\n * marker geometry can be resolved here, which needs a resolved width. */\nconst MARK_WIDTH = 2;\nconst TEXT_SIZE = 14;\n\n/** The subset of a mark's scene node this needs: where it is, and what it is. */\nexport interface PaintableMark {\n pose: WorldRect;\n data: AnnotationData;\n}\n\n/** How a mark is drawn, as opposed to where. Resolved by the overlay from the\n * instrument's vocabulary and the mark's own staleness. */\nexport interface MarkStyle {\n /** The status's colour, or the default. */\n color?: string;\n /** A mark whose stored position no longer describes the picture. Drawn\n * dashed rather than hidden: it still describes *something*, and dropping\n * it would lose it. */\n stale?: boolean;\n}\n\nconst toWorld = (p: FracPoint, content: { w: number; h: number }) => ({\n x: p.x * content.w,\n y: p.y * content.h,\n});\n\n/** A mark's stored vertices in world units, or the pose's diagonal — a stored\n * mark whose `points` did not survive still has to draw somewhere. */\nfunction vertices(m: PaintableMark, content: { w: number; h: number }): { x: number; y: number }[] {\n const stored = m.data.points;\n if (stored && stored.length >= 2) return stored.map((p) => toWorld(p, content));\n const { x, y, width, height } = m.pose;\n return [\n { x, y },\n { x: x + width, y: y + height },\n ];\n}\n\nfunction polyline(points: { x: number; y: number }[]): Path {\n const b = new PathBuilder();\n const first = points[0];\n if (!first) return rectPath(0, 0, 0, 0);\n b.moveTo(first.x, first.y);\n for (const p of points.slice(1)) b.lineTo(p.x, p.y);\n return b.build();\n}\n\n/**\n * What one mark draws, in its target's world.\n *\n * Pure: a node and the target's content box in, draw commands out. Geometry\n * that a bounding box cannot describe — a line's ends, a stroke's path — comes\n * from `data.points`, which is in fractions like the bounds.\n */\nexport function markCommands(\n m: PaintableMark,\n content: { w: number; h: number },\n style: MarkStyle = {},\n): DrawCommand[] {\n const color = style.color ?? MARK_COLOR;\n const stroke: Stroke = {\n paint: { color },\n width: MARK_WIDTH,\n cap: 'round',\n join: 'round',\n ...(style.stale ? { dash: [6, 4] } : {}),\n };\n\n switch (m.data.kind) {\n case 'rect':\n return [\n { kind: 'path', path: rectPath(m.pose.x, m.pose.y, m.pose.width, m.pose.height), stroke },\n ];\n case 'ellipse':\n return [{ kind: 'path', path: ellipsePath(m.pose), stroke }];\n case 'line': {\n const [a, b] = vertices(m, content);\n return [{ kind: 'path', path: linePath(a, b), stroke }];\n }\n case 'arrow': {\n const [a, b] = vertices(m, content);\n // The spec's arrow: a line carrying an end marker, not its own geometry.\n // Markers are separate commands — a stroke's `markerEnd` is inert unless\n // something turns it into geometry, and only the kit's own node painter\n // does that, for the nodes it owns.\n const marked: Stroke = { ...stroke, markerEnd: 'arrow' };\n const path = linePath(a, b);\n return [\n { kind: 'path', path, stroke: marked },\n ...markerDrawCommands(path, marked, MARK_WIDTH, undefined),\n ];\n }\n case 'stroke':\n return [{ kind: 'path', path: polyline(vertices(m, content)), stroke }];\n case 'text': {\n const text = m.data.title;\n if (!text) return [];\n return [\n textCommand(\n m.pose.x,\n m.pose.y,\n text,\n { fontSize: TEXT_SIZE },\n undefined,\n undefined,\n undefined,\n {\n fill: { color },\n },\n ),\n ];\n }\n }\n}\n","/**\n * Whether a stored mark still describes the picture the current config\n * produces. A target names the config keys its positions depend on; labkit\n * snapshots and compares them without knowing what any of them mean.\n */\n\n/** The values of `keys` in `config`, for storing beside a new mark. Keys the\n * config does not carry are omitted rather than stored as undefined, so the\n * snapshot says what was known rather than what was asked. */\nexport function seenFrom(config: unknown, keys: readonly string[]): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n if (config === null || typeof config !== 'object') return out;\n const src = config as Record<string, unknown>;\n for (const k of keys) {\n if (k in src) out[k] = src[k];\n }\n return out;\n}\n\n/**\n * Whether the picture moved under the mark.\n *\n * Only keys present in `seen` are compared. A mark filed before its target\n * declared a new dependency must not go stale retroactively: nothing can know\n * what that key was at the time, and guessing would grey out every old mark\n * the first time a target grows a key.\n */\nexport function isStale(\n seen: Readonly<Record<string, unknown>> | undefined,\n config: unknown,\n keys: readonly string[],\n): boolean {\n if (!seen || keys.length === 0) return false;\n if (config === null || typeof config !== 'object') return false;\n const src = config as Record<string, unknown>;\n for (const k of keys) {\n if (!(k in seen)) continue;\n if (!Object.is(seen[k], src[k])) return true;\n }\n return false;\n}\n","import type { DrawCommand, SceneNode, View } from '@weasel-js/core';\nimport type { WorldRect } from './frac';\nimport { type MarkStyle, markCommands } from './paint';\nimport { isStale } from './staleness';\nimport type { AnnotationData, AnnotationMeaning } from './types';\n\n/** What resolving a mark's appearance needs beyond the mark itself. */\nexport interface MarkDrawOptions {\n /** The target's content box — the world a mark's geometry is in. */\n content: { w: number; h: number };\n /** The target's `positionDependsOn`, for staleness. */\n positionDependsOn?: readonly string[];\n /** The trial's config at the time of the draw. */\n config: unknown;\n /** The instrument's vocabulary, for a status's colour. */\n meaning?: AnnotationMeaning;\n}\n\n/**\n * How one mark is drawn — shared by the pane on screen and by an export.\n *\n * One function rather than two call sites building their own, because an\n * export that resolves a status colour or a stale dash differently from the\n * screen produces a picture nobody was looking at.\n */\nexport function createMarkDrawOne(\n opts: MarkDrawOptions,\n): (\n node: SceneNode<AnnotationData, 'marks', WorldRect>,\n pose: WorldRect,\n view: View,\n) => DrawCommand[] {\n return (node, pose) =>\n markCommands({ pose, data: node.data }, opts.content, resolveMarkStyle(node.data, opts));\n}\n\n/** How a mark looks, as opposed to where it is. Separate from the callback\n * above because an SVG export resolves the same appearance without ever\n * building a draw command. */\nexport function resolveMarkStyle(data: AnnotationData, opts: MarkDrawOptions): MarkStyle {\n return {\n color: opts.meaning?.statuses?.find((s) => s.id === data.status)?.color,\n // Read off the node rather than through the store's `isStale`, which\n // wants a projected Annotation this path does not have.\n stale: isStale(data.seen, opts.config, opts.positionDependsOn ?? []),\n };\n}\n","import type { DrawCommand, FillStyle, Stroke } from '@weasel-js/core';\nimport { resolveStrokeWidth } from '@weasel-js/core';\nimport type { SvgNode, SvgPaint, SvgStroke } from '@weasel-js/svg';\nimport { type MarkStyle, markCommands, type PaintableMark } from './paint';\n\nconst NO_PAINT: SvgPaint = { kind: 'none' };\n\nfunction toSvgPaint(paint: FillStyle | undefined): SvgPaint {\n if (!paint) return NO_PAINT;\n if ('color' in paint && typeof paint.color === 'string') {\n return {\n kind: 'solid',\n color: paint.color,\n ...(paint.opacity != null ? { opacity: paint.opacity } : {}),\n };\n }\n return { kind: 'gradient', paint };\n}\n\n/** Marker references are deliberately dropped: `markCommands` already resolves\n * a marker into its own path command, and keeping the reference would make\n * the serializer emit a `<marker>` def that draws the head a second time. */\nfunction toSvgStroke(stroke: Stroke): SvgStroke {\n return {\n paint: toSvgPaint(stroke.paint),\n width: resolveStrokeWidth(stroke.width ?? 1, 1),\n ...(stroke.cap ? { cap: stroke.cap } : {}),\n ...(stroke.join ? { join: stroke.join } : {}),\n ...(stroke.dash ? { dash: [...stroke.dash] } : {}),\n ...(stroke.miterLimit != null ? { miterLimit: stroke.miterLimit } : {}),\n };\n}\n\nfunction toSvgNode(cmd: DrawCommand, m: PaintableMark): SvgNode {\n if (cmd.kind === 'path') {\n return {\n kind: 'path',\n path: cmd.path,\n fill: toSvgPaint(cmd.fill),\n ...(cmd.stroke ? { stroke: toSvgStroke(cmd.stroke) } : {}),\n };\n }\n if (cmd.kind === 'text') {\n return {\n kind: 'text',\n x: cmd.x,\n y: cmd.y,\n width: m.pose.width,\n height: m.pose.height,\n text: cmd.runs.map((run) => run.text).join(''),\n style: cmd.style,\n ...(cmd.runs[0]?.fill ? { fill: cmd.runs[0].fill } : {}),\n };\n }\n // Unreachable while `markCommands` emits only paths and text. A throw rather\n // than a skip: a new mark kind silently vanishing from every export is a\n // worse afternoon than a loud one.\n throw new Error(`[labkit] a mark drew a '${cmd.kind}' command, which has no vector form`);\n}\n\n/**\n * One mark as SVG nodes, converted from the very commands the pane paints.\n *\n * Deliberately not a second switch over `data.kind`: geometry has one source,\n * and this is a translation of it. `serializeSvg` turns the result into a\n * document.\n */\nexport function markSvgNodes(\n m: PaintableMark,\n content: { w: number; h: number },\n style: MarkStyle = {},\n): SvgNode[] {\n return markCommands(m, content, style).map((cmd) => toSvgNode(cmd, m));\n}\n","import { asNodeId, renderSceneToPixels } from '@weasel-js/core';\nimport { serializeSvg } from '@weasel-js/svg';\nimport { createMarkDrawOne, type MarkDrawOptions, resolveMarkStyle } from './drawOne';\nimport type { MarkScene } from './store';\nimport { markSvgNodes } from './svgNodes';\nimport type { AnnotationData, CaptureOptions, CaptureResult, CaptureSource } from './types';\n\nconst SVG_NS = 'http://www.w3.org/2000/svg';\n\n/** Which of the two composition routes an export takes. */\nexport type CapturePlan = 'svg-document' | 'raster-stack';\n\n/**\n * Vector all the way through, or both sides rasterized and stacked.\n *\n * An SVG base is the only one that nests: the marks serialize beside the\n * artifact's own markup and the whole document rasterizes once at the end. A\n * raster base, or none at all, takes the renderer's own path instead — which\n * is also what draws marks onto transparency for a target that declares no\n * base.\n */\nexport function capturePlan(base: CaptureSource | undefined, format: 'png' | 'svg'): CapturePlan {\n if (format === 'svg') return 'svg-document';\n return base?.kind === 'svg' ? 'svg-document' : 'raster-stack';\n}\n\n/** Re-frame a base's own `<svg>` onto the content box, keeping its `viewBox`.\n * Parsed rather than string-spliced: a base whose declared width disagrees\n * with its viewBox would otherwise land at the wrong scale. */\nfunction nestBaseSvg(markup: string, w: number, h: number): string {\n const doc = new DOMParser().parseFromString(markup, 'image/svg+xml');\n const root = doc.documentElement;\n if (doc.getElementsByTagName('parsererror').length > 0 || root.localName !== 'svg') {\n throw new Error(\"[labkit] a target's `base()` returned markup that is not an <svg> document\");\n }\n root.setAttribute('x', '0');\n root.setAttribute('y', '0');\n root.setAttribute('width', String(w));\n root.setAttribute('height', String(h));\n return new XMLSerializer().serializeToString(root);\n}\n\n/** A raster base as an `<image>` filling the content box. An external `src`\n * round-trips as a reference, so the export is only self-contained when it\n * is already a `data:` URI. */\nfunction embedRasterBase(\n base: CaptureSource,\n w: number,\n h: number,\n onWarn?: (m: string) => void,\n): string {\n const href =\n base.kind === 'canvas' ? base.canvas.toDataURL() : base.kind === 'image' ? base.src : '';\n if (base.kind === 'image' && !href.startsWith('data:')) {\n onWarn?.(`base image '${href}' is a reference, so this SVG is not self-contained`);\n }\n return serializeSvg([{ kind: 'image', href, x: 0, y: 0, width: w, height: h }], {\n viewBox: { x: 0, y: 0, width: w, height: h },\n });\n}\n\n/** Every mark on a scene, as SVG nodes, styled the way the pane styles them. */\nfunction markNodesOf(scene: MarkScene, draw: MarkDrawOptions) {\n return [...scene.renderOrder()].flatMap((id) => {\n const node = scene.get(asNodeId(String(id)));\n if (!node) return [];\n return markSvgNodes(\n { pose: node.pose, data: node.data as AnnotationData },\n draw.content,\n resolveMarkStyle(node.data as AnnotationData, draw),\n );\n });\n}\n\nexport interface ComposeSvgArgs {\n base?: CaptureSource;\n scene: MarkScene;\n draw: MarkDrawOptions;\n scale: number;\n onWarn?: (message: string) => void;\n}\n\n/**\n * The base and the marks in one SVG document.\n *\n * The outer `viewBox` is the content box, so marks — which are already in it —\n * need no transform, and `width`/`height` carry the export scale. Both halves\n * nest as child `<svg>` elements, which each establish their own viewport and\n * so keep their own `viewBox` maths out of this function.\n */\nexport function composeCaptureSvg(args: ComposeSvgArgs): string {\n const { base, scene, draw, scale, onWarn } = args;\n const { w, h } = draw.content;\n const baseXml =\n base === undefined\n ? ''\n : base.kind === 'svg'\n ? nestBaseSvg(base.markup, w, h)\n : embedRasterBase(base, w, h, onWarn);\n // No width/height on the marks document: a nested <svg> without them fills\n // the outer viewport exactly, which is the alignment this relies on.\n const marksXml = serializeSvg(markNodesOf(scene, draw), {\n viewBox: { x: 0, y: 0, width: w, height: h },\n onWarn,\n });\n const outW = Math.max(1, Math.round(w * scale));\n const outH = Math.max(1, Math.round(h * scale));\n return `<svg xmlns=\"${SVG_NS}\" width=\"${outW}\" height=\"${outH}\" viewBox=\"0 0 ${w} ${h}\">${baseXml}${marksXml}</svg>`;\n}\n\nfunction context2d(width: number, height: number): CanvasRenderingContext2D {\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext('2d');\n if (!ctx) throw new Error('[labkit] capture needs a 2D canvas context, and this one has none');\n return ctx;\n}\n\nfunction toPngBlob(canvas: HTMLCanvasElement): Promise<Blob> {\n return new Promise((resolve, reject) => {\n let done: (b: Blob | null) => void;\n try {\n done = (blob) =>\n blob ? resolve(blob) : reject(new Error('[labkit] the browser produced no PNG'));\n canvas.toBlob(done, 'image/png');\n } catch (err) {\n // A base referencing an image from another origin taints the canvas and\n // `toBlob` throws SecurityError. Name the cause: the DOM exception on\n // its own sends people looking at labkit.\n reject(\n new Error(\n '[labkit] the capture canvas is tainted, so it cannot be read back — a base referencing a cross-origin image does this. Embed it as a data: URI.',\n { cause: err },\n ),\n );\n }\n });\n}\n\nfunction loadImage(src: string): Promise<HTMLImageElement> {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.onload = () => resolve(img);\n img.onerror = () => reject(new Error(`[labkit] a capture base failed to load: ${src}`));\n img.src = src;\n });\n}\n\n/** Rasterize a composed document by handing it to the browser's own SVG\n * renderer — one pass over base and marks together. */\nasync function rasterizeSvg(svg: string, width: number, height: number): Promise<Blob> {\n const url = URL.createObjectURL(new Blob([svg], { type: 'image/svg+xml;charset=utf-8' }));\n try {\n const img = await loadImage(url);\n const ctx = context2d(width, height);\n ctx.drawImage(img, 0, 0, width, height);\n return await toPngBlob(ctx.canvas);\n } finally {\n URL.revokeObjectURL(url);\n }\n}\n\n/** Base pixels, then mark pixels over them. The marks come from\n * `renderSceneToPixels` rather than a readback of the live surface, so a\n * capture neither depends on nor disturbs what is on screen. */\nasync function stackRaster(\n args: ComposeSvgArgs & { width: number; height: number },\n): Promise<Blob> {\n const { base, scene, draw, scale, width, height } = args;\n const ctx = context2d(width, height);\n if (base?.kind === 'image') ctx.drawImage(await loadImage(base.src), 0, 0, width, height);\n else if (base?.kind === 'canvas') ctx.drawImage(base.canvas, 0, 0, width, height);\n\n const raster = renderSceneToPixels({\n scene,\n sourceRect: { x: 0, y: 0, width: draw.content.w, height: draw.content.h },\n scale: { x: scale, y: scale },\n drawOne: createMarkDrawOne(draw),\n });\n // Through a second canvas rather than `putImageData` on this one, which\n // replaces pixels instead of compositing and would erase the base.\n const marks = context2d(raster.width, raster.height);\n marks.putImageData(\n new ImageData(Uint8ClampedArray.from(raster.data), raster.width, raster.height),\n 0,\n 0,\n );\n ctx.drawImage(marks.canvas, 0, 0, width, height);\n return toPngBlob(ctx.canvas);\n}\n\n/** What a capture needs about the target it is exporting. */\nexport interface CaptureArgs {\n target: string;\n scene: MarkScene;\n draw: MarkDrawOptions;\n base?: () => CaptureSource | Promise<CaptureSource>;\n onWarn?: (message: string) => void;\n}\n\n/** Export one target's picture with its marks on it. */\nexport async function captureTarget(\n args: CaptureArgs,\n opts: CaptureOptions = {},\n): Promise<CaptureResult> {\n const format = opts.format ?? 'png';\n const scale = opts.scale ?? 2;\n const { content } = args.draw;\n const width = Math.max(1, Math.round(content.w * scale));\n const height = Math.max(1, Math.round(content.h * scale));\n const base = await args.base?.();\n const compose: ComposeSvgArgs = {\n base,\n scene: args.scene,\n draw: args.draw,\n scale,\n onWarn: args.onWarn,\n };\n\n if (capturePlan(base, format) === 'raster-stack') {\n return {\n target: args.target,\n blob: await stackRaster({ ...compose, width, height }),\n format,\n width,\n height,\n };\n }\n\n const svg = composeCaptureSvg(compose);\n const blob =\n format === 'svg'\n ? new Blob([svg], { type: 'image/svg+xml;charset=utf-8' })\n : await rasterizeSvg(svg, width, height);\n return { target: args.target, blob, format, width, height };\n}\n","import type { FracPoint, FracRect } from './types';\n\n/** A mark's box in its target's world: CSS pixels at zoom 1. Matches weasel's\n * default `RectPose`, which is what the scene stores. */\nexport interface WorldRect {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\n/** Where a fraction lands on a content box of this size. */\nexport function fracToWorld(f: FracRect, content: { w: number; h: number }): WorldRect {\n return {\n x: f.x * content.w,\n y: f.y * content.h,\n width: f.w * content.w,\n height: f.h * content.h,\n };\n}\n\n/** What fraction of the content box a world rect covers.\n *\n * A pane measured before layout is 0×0, and dividing by that would seed every\n * stored position with `NaN` — which compares false against everything and so\n * fails silently rather than loudly. Zero sides give zeros. */\nexport function worldToFrac(r: WorldRect, content: { w: number; h: number }): FracRect {\n const sx = content.w === 0 ? 0 : 1 / content.w;\n const sy = content.h === 0 ? 0 : 1 / content.h;\n return { x: r.x * sx, y: r.y * sy, w: r.width * sx, h: r.height * sy };\n}\n\nconst DP = 10_000;\n\n/** Snap to 4dp. Positions are diffed by humans in stored documents, so the\n * last digits of a float are noise that hides the change that matters. */\nexport function roundFrac(f: FracRect): FracRect {\n return {\n x: Math.round(f.x * DP) / DP,\n y: Math.round(f.y * DP) / DP,\n w: Math.round(f.w * DP) / DP,\n h: Math.round(f.h * DP) / DP,\n };\n}\n\n/** Whether `pt` falls in `box`, widened by `tol` on every side so a hairline\n * mark stays reachable. */\nexport function fracContains(box: FracRect, pt: FracPoint, tol = 0): boolean {\n return (\n pt.x >= box.x - tol &&\n pt.x <= box.x + box.w + tol &&\n pt.y >= box.y - tol &&\n pt.y <= box.y + box.h + tol\n );\n}\n\n/** Whether `outer` wholly encloses `inner`. A marquee takes what it encloses,\n * not what it grazes — brushing selection is a different gesture. */\nexport function fracIntersects(outer: FracRect, inner: FracRect): boolean {\n return (\n inner.x >= outer.x &&\n inner.y >= outer.y &&\n inner.x + inner.w <= outer.x + outer.w &&\n inner.y + inner.h <= outer.y + outer.h\n );\n}\n","import type { Scene } from '@weasel-js/core';\n\n/** What the ordering needs of a scene: its history depth, and the two moves. */\nexport interface HistoryScene {\n historyIndex(): number;\n undo(): boolean;\n redo(): boolean;\n canUndo(): boolean;\n canRedo(): boolean;\n}\n\n/**\n * One undo ordering over several scenes.\n *\n * Each target's marks live in their own scene and each scene owns its own undo\n * stack, so \"take back the last thing I did\" is a question no single scene can\n * answer. This keeps the order changes arrived in.\n *\n * The order is maintained from each scene's `historyIndex()`, not from its\n * subscribe callback: a scene notifies on ephemeral changes that are not\n * history at all, and an undo driven from inside a pane's own keymap has to\n * *move* this ordering rather than append to it.\n */\nexport class MarkHistory {\n private readonly depth = new Map<string, number>();\n private undoable: string[] = [];\n private redoable: string[] = [];\n /** Set while this class is driving, so a redo is not read as a new change. */\n private replaying: 'undo' | 'redo' | null = null;\n\n /** Start following `scene` under `target`. Idempotent per target. */\n track(target: string, scene: HistoryScene): void {\n if (this.depth.has(target)) return;\n this.depth.set(target, scene.historyIndex());\n }\n\n /** Call on every notification from `target`'s scene. */\n observe(target: string, scene: HistoryScene): void {\n const now = scene.historyIndex();\n const before = this.depth.get(target) ?? 0;\n this.depth.set(target, now);\n if (now > before) {\n if (this.replaying === 'redo') {\n drop(this.redoable, target);\n } else {\n // A change dropped whatever was redoable — weasel's own scene did the\n // same to its stack.\n this.redoable = [];\n }\n this.undoable.push(target);\n } else if (now < before) {\n drop(this.undoable, target);\n this.redoable.push(target);\n }\n }\n\n /** The target `undo` would act on, skipping any whose scene has nothing\n * left — a scene can drop entries this ordering still lists. */\n private next(\n stack: string[],\n can: (s: HistoryScene) => boolean,\n at: (t: string) => HistoryScene | undefined,\n ): string | null {\n for (let i = stack.length - 1; i >= 0; i--) {\n const target = stack[i];\n if (target === undefined) continue;\n const scene = at(target);\n if (scene && can(scene)) return target;\n }\n return null;\n }\n\n canUndo(at: (t: string) => HistoryScene | undefined): boolean {\n return this.next(this.undoable, (s) => s.canUndo(), at) !== null;\n }\n\n canRedo(at: (t: string) => HistoryScene | undefined): boolean {\n return this.next(this.redoable, (s) => s.canRedo(), at) !== null;\n }\n\n undo(at: (t: string) => HistoryScene | undefined): boolean {\n const target = this.next(this.undoable, (s) => s.canUndo(), at);\n const scene = target === null ? undefined : at(target);\n if (!scene) return false;\n this.replaying = 'undo';\n try {\n return scene.undo();\n } finally {\n this.replaying = null;\n }\n }\n\n redo(at: (t: string) => HistoryScene | undefined): boolean {\n const target = this.next(this.redoable, (s) => s.canRedo(), at);\n const scene = target === null ? undefined : at(target);\n if (!scene) return false;\n this.replaying = 'redo';\n try {\n return scene.redo();\n } finally {\n this.replaying = null;\n }\n }\n}\n\n/** Remove the last occurrence of `value`, in place. */\nfunction drop(stack: string[], value: string): void {\n for (let i = stack.length - 1; i >= 0; i--) {\n if (stack[i] === value) {\n stack.splice(i, 1);\n return;\n }\n }\n}\n\n/** A `Scene` satisfies `HistoryScene`; this names the narrowing once. */\nexport const asHistoryScene = (scene: Scene<never, never, never> | HistoryScene): HistoryScene =>\n scene as HistoryScene;\n","import {\n asNodeId,\n createScene,\n type Scene,\n type SerializedScene,\n sceneFromJSON,\n} from '@weasel-js/core';\nimport { captureTarget } from './capture';\nimport type { WorldRect } from './frac';\nimport { fracContains, fracIntersects, fracToWorld, roundFrac, worldToFrac } from './frac';\nimport { MarkHistory } from './history';\nimport { isStale as isStaleAgainst, seenFrom } from './staleness';\nimport type {\n Annotation,\n AnnotationData,\n AnnotationInit,\n AnnotationMeaning,\n AnnotationPatch,\n AnnotationQuery,\n AnnotationsApi,\n AnnotationTargetInfo,\n CaptureOptions,\n CaptureResult,\n FracPoint,\n FracRect,\n SerializedAnnotations,\n} from './types';\n\n/** A mark's box in its target's world. Matches weasel's default `RectPose`. */\ntype MarkPose = WorldRect;\n\n/** The scene one target's marks live in. */\nexport type MarkScene = Scene<AnnotationData, 'marks', MarkPose>;\n\n/** A mark scene: one layer, because marks do not stack in tiers. */\nexport function createAnnotationScene(): MarkScene {\n return createScene<AnnotationData, 'marks', MarkPose>({ systemLayers: [{ id: 'marks' }] });\n}\n\nexport interface AnnotationStoreOptions {\n /** Re-read on every call, so a target resizing or gaining a dependency takes\n * effect without rebuilding the store. */\n targets: () => readonly AnnotationTargetInfo[];\n /** Serialized scenes from a previous `toJSON`, keyed by target. */\n restore?: Readonly<Record<string, unknown>>;\n /** The instrument's vocabulary, so an export draws a mark in the colour its\n * status gives it. */\n meaning?: AnnotationMeaning;\n /** The trial's live config. A getter for the same reason `targets` is: the\n * store is built once and the config changes under it. */\n config?: () => unknown;\n /** Notified after every finished export. */\n onCapture?: (result: CaptureResult) => void;\n}\n\n/** Everything a capture needs that is not the store's own state. Split out so\n * `capture.ts` takes data rather than reaching back into the store. */\nexport interface CaptureDeps {\n scene: MarkScene;\n target: AnnotationTargetInfo;\n meaning?: AnnotationMeaning;\n config: unknown;\n}\n\nconst NO_CONTENT = { w: 0, h: 0 };\n\n/** A mark's id is its target and its node. One scene per target, so a node id\n * is only unique within one — and an annotation is addressed by both. */\nfunction splitId(id: string): { target: string; node: string } | undefined {\n const at = id.lastIndexOf('/');\n return at <= 0 ? undefined : { target: id.slice(0, at), node: id.slice(at + 1) };\n}\n\n/**\n * A facade over one weasel scene per target: the scenes are the truth, this\n * answers questions about them. Everything crossing this boundary is in\n * fractions of a target's content box; the scenes hold world units.\n *\n * A scene per target rather than one scene with a `target` field, because a\n * pane's hit-test, marquee and paint all walk the whole scene it is given and\n * take no filter — one shared scene puts every other pane's marks under the\n * pointer.\n */\nexport function createAnnotationStore(opts: AnnotationStoreOptions): AnnotationsApi {\n const { targets, restore } = opts;\n const scenes = new Map<string, MarkScene>();\n const subs = new Set<() => void>();\n const history = new MarkHistory();\n const notify = (): void => {\n for (const fn of subs) fn();\n };\n\n const sceneFor = (target: string): MarkScene => {\n const known = scenes.get(target);\n if (known) return known;\n const raw = restore?.[target];\n const scene = raw\n ? sceneFromJSON<AnnotationData, 'marks', MarkPose>(\n raw as SerializedScene<AnnotationData, 'marks', MarkPose>,\n {},\n )\n : createAnnotationScene();\n scenes.set(target, scene);\n history.track(target, scene);\n scene.subscribe(() => {\n history.observe(target, scene);\n notify();\n });\n return scene;\n };\n\n /** Only for scenes that exist: asking for one would create it, and the\n * ordering never names a target it has not seen. */\n const historySceneAt = (target: string) => scenes.get(target);\n\n // Restored scenes are materialized up front: everything below reads\n // `scenes`, and a mark that only appears once its pane asks for its scene is\n // a mark a sidebar cannot list.\n for (const target of Object.keys(restore ?? {})) sceneFor(target);\n\n const targetOf = (id: string): AnnotationTargetInfo | undefined =>\n targets().find((t) => t.id === id);\n\n const contentOf = (id: string) => targetOf(id)?.content ?? NO_CONTENT;\n\n const project = (target: string, node: string): Annotation | undefined => {\n const found = scenes.get(target)?.get(asNodeId(node));\n if (!found) return undefined;\n return {\n ...found.data,\n target,\n id: `${target}/${node}`,\n frac: roundFrac(worldToFrac(found.pose as MarkPose, contentOf(target))),\n };\n };\n\n /** Every target with a scene, in declaration order — then any whose target\n * the instrument has since stopped declaring, so its marks are not lost. */\n const liveTargets = (): string[] => {\n const declared = targets().map((t) => t.id);\n const rest = [...scenes.keys()].filter((id) => !declared.includes(id));\n return [...declared, ...rest];\n };\n\n const marksOn = (target: string): Annotation[] => {\n const scene = scenes.get(target);\n if (!scene) return [];\n const out: Annotation[] = [];\n for (const id of scene.renderOrder()) {\n const a = project(target, String(id));\n if (a) out.push(a);\n }\n return out;\n };\n\n const all = (): Annotation[] => liveTargets().flatMap(marksOn);\n\n const matches = (a: Annotation, q: AnnotationQuery): boolean => {\n if (q.target !== undefined && a.target !== q.target) return false;\n if (q.kind !== undefined && a.kind !== q.kind) return false;\n if (q.status !== undefined && a.status !== q.status) return false;\n if (q.tags !== undefined) {\n const have = a.tags ?? [];\n for (const t of q.tags) if (!have.includes(t)) return false;\n }\n if (q.where && !q.where(a)) return false;\n return true;\n };\n\n /** The node behind a public id, or undefined. */\n const nodeOf = (id: string) => {\n const parts = splitId(id);\n if (!parts) return undefined;\n const scene = scenes.get(parts.target);\n const node = scene?.get(asNodeId(parts.node));\n return node && scene ? { ...parts, scene, node } : undefined;\n };\n\n return {\n sceneFor,\n\n targets,\n\n get(id) {\n const parts = splitId(id);\n return parts ? project(parts.target, parts.node) : undefined;\n },\n\n query(q) {\n return q ? all().filter((a) => matches(a, q)) : all();\n },\n\n hitTest(target, pt: FracPoint, tol = 0) {\n return marksOn(target)\n .filter((a) => fracContains(a.frac, pt, tol))\n .reverse();\n },\n\n within(target, box: FracRect) {\n return marksOn(target).filter((a) => fracIntersects(box, a.frac));\n },\n\n isStale(a, config) {\n const keys = targetOf(a.target)?.positionDependsOn ?? [];\n return isStaleAgainst(a.seen, config, keys);\n },\n\n canUndo() {\n return history.canUndo(historySceneAt);\n },\n\n canRedo() {\n return history.canRedo(historySceneAt);\n },\n\n undo() {\n return history.undo(historySceneAt);\n },\n\n redo() {\n return history.redo(historySceneAt);\n },\n\n selection() {\n const out: string[] = [];\n for (const target of liveTargets()) {\n const scene = scenes.get(target);\n if (!scene) continue;\n for (const node of scene.getSelection()) {\n if (scene.get(node)) out.push(`${target}/${String(node)}`);\n }\n }\n return out;\n },\n\n setSelection(ids) {\n const wanted = new Map<string, string[]>();\n for (const id of ids) {\n const found = nodeOf(id);\n if (!found) continue;\n const node = String(found.node.id);\n const on = wanted.get(found.target);\n if (!on) wanted.set(found.target, [node]);\n else if (!on.includes(node)) on.push(node);\n }\n for (const [target, scene] of scenes) {\n const next = wanted.get(target) ?? [];\n const now = scene.getSelection();\n if (now.length === next.length && next.every((n, i) => String(now[i]) === n)) continue;\n scene.setSelection(next.map(asNodeId));\n }\n },\n\n subscribe(fn) {\n subs.add(fn);\n return () => {\n subs.delete(fn);\n };\n },\n\n add(init: AnnotationInit, config?: unknown) {\n const target = targetOf(init.target);\n const data: AnnotationData = {\n target: init.target,\n kind: init.kind,\n ...(init.points ? { points: init.points } : {}),\n ...(init.title !== undefined ? { title: init.title } : {}),\n ...(init.status !== undefined ? { status: init.status } : {}),\n ...(init.tags !== undefined ? { tags: init.tags } : {}),\n ...(init.meta !== undefined ? { meta: init.meta } : {}),\n seen: seenFrom(config, target?.positionDependsOn ?? []),\n };\n const node = sceneFor(init.target).add({\n kind: 'leaf',\n layer: 'marks',\n pose: fracToWorld(roundFrac(init.frac), target?.content ?? NO_CONTENT),\n data,\n });\n return `${init.target}/${String(node)}`;\n },\n\n update(id, patch: AnnotationPatch) {\n const found = nodeOf(id);\n if (!found) return;\n const { frac, ...meaning } = patch;\n const nid = asNodeId(found.node.id);\n if (Object.keys(meaning).length > 0) {\n found.scene.update(nid, { data: { ...found.node.data, ...meaning } });\n }\n if (frac) {\n found.scene.setPose(nid, fracToWorld(roundFrac(frac), contentOf(found.target)));\n }\n },\n\n setMeta(id, meta) {\n const found = nodeOf(id);\n if (!found) return;\n found.scene.update(asNodeId(found.node.id), { data: { ...found.node.data, meta } });\n },\n\n remove(id) {\n const found = nodeOf(id);\n if (found) found.scene.remove(asNodeId(found.node.id));\n },\n\n async capture(target: string, captureOpts?: CaptureOptions) {\n const info = targetOf(target);\n if (!info) throw new Error(`[labkit] no annotation target called '${target}'`);\n const result = await captureTarget(\n {\n target,\n scene: sceneFor(target),\n draw: {\n content: info.content,\n positionDependsOn: info.positionDependsOn,\n config: opts.config?.(),\n meaning: opts.meaning,\n },\n base: info.base,\n onWarn: (message) => console.warn(`[labkit] capture: ${message}`),\n },\n captureOpts,\n );\n opts.onCapture?.(result);\n return result;\n },\n\n toJSON(): SerializedAnnotations {\n const out: Record<string, unknown> = {};\n for (const [target, scene] of scenes) out[target] = scene.toJSON();\n return { version: 1, scenes: out };\n },\n };\n}\n\n/** Rebuild a store from what `toJSON` wrote. Unknown or future versions give\n * an empty store rather than throwing: a lab that cannot read its marks\n * should still open. */\nexport function annotationsFromJSON(\n raw: unknown,\n targets: () => readonly AnnotationTargetInfo[],\n rest: Omit<AnnotationStoreOptions, 'targets' | 'restore'> = {},\n): AnnotationsApi {\n const doc = raw as Partial<SerializedAnnotations> | null;\n if (doc?.version !== 1 || !doc.scenes) return createAnnotationStore({ targets, ...rest });\n return createAnnotationStore({ targets, restore: doc.scenes, ...rest });\n}\n","import type { View } from '@weasel-js/core';\nimport type { ViewTransform } from '../instrument/types';\n\n/** A target's world in CSS pixels: the box its fractions are fractions of. */\nexport interface ContentSize {\n w: number;\n h: number;\n}\n\n/** A target's drawn box on the surface, in CSS pixels. */\nexport interface PaneSize {\n w: number;\n h: number;\n}\n\n/** labkit's camera in weasel's shape. Zoom is uniform, so it lands on both\n * scale axes; pan is weasel's translation unchanged. */\nexport function toWeaselView(v: ViewTransform): View {\n return { x: v.pan.x, y: v.pan.y, scale: { x: v.zoom, y: v.zoom } };\n}\n\n/** The inverse. A weasel view with unequal axis scales collapses to its x —\n * labkit's camera has one zoom and cannot hold the other. */\nexport function fromWeaselView(v: View): ViewTransform {\n return { zoom: v.scale.x, pan: { x: v.x, y: v.y } };\n}\n\n/**\n * The camera a target with none of its own draws through: its content box\n * scaled to fit the box it is drawn in, anchored at the origin.\n *\n * The spec calls the camera \"a plain scale\" at zoom 1; zoom 1 is only right\n * when the pane happens to be the content's size, and a mark drawn on a\n * scaled-down pane otherwise lands outside it.\n */\nexport function fitView(content: ContentSize, pane: PaneSize): ViewTransform {\n const zoom =\n content.w > 0 && content.h > 0 ? Math.min(pane.w / content.w, pane.h / content.h) : 1;\n return { zoom: Number.isFinite(zoom) && zoom > 0 ? zoom : 1, pan: { x: 0, y: 0 } };\n}\n","import {\n type InsertNodeFactory,\n SceneCanvas,\n type SceneCanvasApi,\n useActiveToolContext,\n type View,\n WeaselProvider,\n} from '@weasel-js/core';\nimport { type CSSProperties, useEffect, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport type { Rect } from '../surface/rect';\nimport { useSurfaceCanvas, useSurfaceOptional } from '../surface/useSurfaceTile';\nimport { createMarkDrawOne } from './drawOne';\nimport type { WorldRect } from './frac';\nimport { seenFrom } from './staleness';\nimport type { MarkScene } from './store';\nimport { ANNOTATION_WEASEL_TOOLS, annotationToolInfo } from './toolMap';\nimport type {\n AnnotationData,\n AnnotationKind,\n AnnotationMeaning,\n AnnotationTarget,\n FracPoint,\n} from './types';\nimport { fitView, toWeaselView } from './view';\n\n/** Props for `<AnnotationOverlay>`. */\nexport interface AnnotationOverlayProps {\n target: AnnotationTarget;\n /** The trial's mark scene — shared by every target; a mark's own `target`\n * field is what separates them. */\n scene: MarkScene;\n /** Snapshotted onto each new mark, so staleness can be answered later. */\n config: unknown;\n /** The trial's resolved tool slot. */\n activeToolId: string | null;\n /** The instrument's vocabulary, for a status's colour. */\n meaning?: AnnotationMeaning;\n}\n\nconst sameRect = (a: Rect | null, b: Rect): boolean =>\n a !== null && a.x === b.x && a.y === b.y && a.w === b.w && a.h === b.h;\n\n/** Pushes the trial's tool into the weasel scope this pane owns. Its own\n * component because the context only exists below `<WeaselProvider>`. */\nfunction ToolBridge({ toolId }: { toolId: string }) {\n const tools = useActiveToolContext();\n const setActive = tools.setActive;\n useEffect(() => {\n setActive(toolId);\n }, [toolId, setActive]);\n return null;\n}\n\n/** Every vertex the insert carried, in fractions of the content box. */\nfunction pointsOf(\n extras: Record<string, unknown>,\n content: { w: number; h: number },\n): readonly FracPoint[] | undefined {\n const toFrac = (p: { x: number; y: number }): FracPoint => ({\n x: content.w === 0 ? 0 : p.x / content.w,\n y: content.h === 0 ? 0 : p.y / content.h,\n });\n if (extras.kind === 'line') {\n return [toFrac(extras.a as FracPoint), toFrac(extras.b as FracPoint)];\n }\n if (extras.kind === 'pencil') {\n return (extras.samples as { x: number; y: number }[]).map(toFrac);\n }\n return undefined;\n}\n\n/**\n * One target's drawing surface: a transparent box over the target's element\n * taking the input, and a `<SceneCanvas>` painting into the lab's shared\n * buffer at that box's rect.\n *\n * The box is portalled into the surface container because that is what tile\n * rects are measured against; positioning it among the instrument's own DOM\n * would put it in whatever positioning context happened to be there.\n */\nexport function AnnotationOverlay({\n target,\n scene,\n config,\n activeToolId,\n meaning,\n}: AnnotationOverlayProps) {\n const surface = useSurfaceOptional();\n const canvas = useSurfaceCanvas();\n const [rect, setRect] = useState<Rect | null>(null);\n const [input, setInput] = useState<HTMLDivElement | null>(null);\n const sceneCanvas = useRef<SceneCanvasApi | null>(null);\n\n // Read in the insert factory, which is built once and must see the tool the\n // pane is holding now — `arrow` and `stroke` are indistinguishable from\n // `line` and `pencil` at the weasel end.\n const toolRef = useRef(activeToolId);\n toolRef.current = activeToolId;\n const configRef = useRef(config);\n configRef.current = config;\n\n const id = target.id;\n const lastTile = useRef<HTMLElement | null>(null);\n useEffect(() => {\n const el = target.ref.current ?? null;\n if (el === lastTile.current) return;\n lastTile.current = el;\n surface?.registerTile(id, el);\n });\n useEffect(\n () => () => {\n // Clearing this is what lets the effect above re-register on the next\n // commit. StrictMode's mount / unmount / mount would otherwise take the\n // tile out and never put it back, and the surface would measure nothing.\n lastTile.current = null;\n surface?.registerTile(id, null);\n },\n [surface, id],\n );\n\n useEffect(\n () =>\n surface?.registerPainter(id, (next) => {\n setRect((prev) => (sameRect(prev, next) ? prev : next));\n // The shared buffer was cleared if it resized this frame; this pane's\n // own loop has no way to know that.\n sceneCanvas.current?.requestRedraw();\n }),\n [surface, id],\n );\n\n const container = surface?.getContainer() ?? null;\n if (!container || !rect) return null;\n\n const view: View = toWeaselView(target.view ?? fitView(target.content, { w: rect.w, h: rect.h }));\n\n const drawOne = createMarkDrawOne({\n content: target.content,\n positionDependsOn: target.positionDependsOn,\n config,\n meaning,\n });\n\n const factories: Record<string, InsertNodeFactory> = {};\n for (const weaselTool of ANNOTATION_WEASEL_TOOLS) {\n factories[weaselTool] = (_bounds, extras) => {\n const info = annotationToolInfo(toolRef.current);\n const kind: AnnotationKind | undefined = info?.kind;\n if (!kind) return null;\n const points = pointsOf(extras as unknown as Record<string, unknown>, target.content);\n const data: AnnotationData = {\n target: id,\n kind,\n ...(points ? { points } : {}),\n seen: seenFrom(configRef.current, target.positionDependsOn ?? []),\n };\n return { data };\n };\n }\n\n // A measured rect has nowhere to live but the element's own style. Set as\n // custom properties, which the stylesheet reads — the sanctioned use.\n const box = {\n ['--lk-anno-x' as string]: `${rect.x}px`,\n ['--lk-anno-y' as string]: `${rect.y}px`,\n ['--lk-anno-w' as string]: `${rect.w}px`,\n ['--lk-anno-h' as string]: `${rect.h}px`,\n } as CSSProperties;\n\n return createPortal(\n <>\n <div\n ref={setInput}\n className=\"lk-annotate__input\"\n data-annotation-target={id}\n role=\"application\"\n aria-label={`Annotations on ${id}`}\n // biome-ignore lint/a11y/noNoninteractiveTabindex: role=\"application\" IS the interactive case — a region with its own keymap. The rule's allowed-role list stops at the native widget roles and does not include it, and the gesture dispatcher listens on this element, so without focus no tool's keyboard binding ever fires.\n tabIndex={0}\n style={box}\n />\n {canvas && input ? (\n // One scope per pane: a shared <ActionsProvider> lets only the newest\n // canvas under it respond to input, and the rest go silently dead.\n <WeaselProvider isolate>\n <ToolBridge toolId={annotationToolInfo(activeToolId)?.weaselTool ?? 'select'} />\n <SceneCanvas<AnnotationData, 'marks', WorldRect>\n ref={sceneCanvas}\n scene={scene}\n width={rect.w}\n height={rect.h}\n view={view}\n paintInto={{ canvas, x: rect.x, y: rect.y }}\n inputElement={input}\n defaultTools={ANNOTATION_WEASEL_TOOLS}\n insertNodeFactories={factories}\n layers={{ scene: { drawOne } }}\n />\n </WeaselProvider>\n ) : null}\n </>,\n container,\n );\n}\n","import { AnnotationOverlay } from './AnnotationOverlay';\nimport type { AnnotationsApi, AnnotationsCapability } from './types';\n\n/** Props for `<AnnotationTargets>`. */\nexport interface AnnotationTargetsProps {\n capability: AnnotationsCapability;\n state: unknown;\n config: unknown;\n annotations: AnnotationsApi;\n activeToolId: string | null;\n}\n\n/** One overlay per region the instrument said accepts marks. */\nexport function AnnotationTargets({\n capability,\n state,\n config,\n annotations,\n activeToolId,\n}: AnnotationTargetsProps) {\n const targets = capability.targets(state, config);\n\n return (\n <>\n {targets.map((t) => (\n <AnnotationOverlay\n key={t.id}\n target={t}\n scene={annotations.sceneFor(t.id)}\n meaning={capability.meaning}\n config={config}\n activeToolId={activeToolId}\n />\n ))}\n </>\n );\n}\n","import type { PrefLeaf } from '@weasel-js/ui';\nimport type {\n Annotations,\n ConfigNode,\n ConfigOption,\n ConfigSchema,\n ControlRenderer,\n InferConfig,\n NodeOptions,\n} from './types';\n\n/** Shared chaining surface. Every method clones, so a node can be reused as a\n * base for several leaves without one bleeding into the next. */\nabstract class BaseNode<T> implements ConfigNode<T> {\n abstract readonly kind: string | null;\n\n // `default` is a reserved word in a parameter position, so the field is\n // declared rather than taken as a parameter property.\n readonly default: T;\n\n constructor(\n defaultValue: T,\n readonly annotations: Readonly<Annotations> = {},\n readonly options: Readonly<NodeOptions> = {},\n ) {\n this.default = defaultValue;\n }\n\n /** Clone into the same subclass. Subclasses with extra constructor\n * arguments override this. */\n protected with(annotations: Annotations, options: NodeOptions): this {\n const Ctor = this.constructor as new (d: T, a: Annotations, o: NodeOptions) => this;\n return new Ctor(this.default, annotations, options);\n }\n\n protected ann(patch: Annotations): this {\n return this.with({ ...this.annotations, ...patch }, this.options);\n }\n\n protected opt(patch: NodeOptions): this {\n return this.with(this.annotations, { ...this.options, ...patch });\n }\n\n /** Human-readable label. Defaults to the key, title-cased. */\n label(name: string): this {\n return this.ann({ name });\n }\n\n /** Longer help text, surfaced as a tooltip on the row label. */\n describe(description: string): this {\n return this.ann({ description });\n }\n\n /** Omit from the panel unless it is asked to show hidden leaves. */\n hidden(): this {\n return this.ann({ hidden: true });\n }\n\n /** Pair with a sibling sharing this id, side-by-side on one row. */\n pair(pair: string): this {\n return this.ann({ pair });\n }\n\n /** Render under a named section heading. */\n section(section: string): this {\n return this.opt({ section });\n }\n\n /** Show this row only while the predicate holds. Presentational — the value\n * stays in config and the instrument still reads it. */\n showIf(predicate: (config: Record<string, unknown>) => boolean): this {\n return this.opt({ showIf: predicate });\n }\n\n /** Draw this one row yourself, keeping the kind, default and validation. */\n render(renderer: ControlRenderer): this {\n return this.opt({ render: renderer });\n }\n}\n\nclass NumberNode extends BaseNode<number> {\n readonly kind = 'number';\n\n /** Bound the value. A number with both bounds renders as a slider. */\n range(min: number, max: number): this {\n return this.ann({ min, max });\n }\n\n step(step: number): this {\n return this.ann({ step });\n }\n\n /** Force a slider even without both bounds. */\n slider(): this {\n return this.ann({ control: 'slider' });\n }\n\n /** Force a typed input even when both bounds are set. */\n input(): this {\n return this.ann({ control: 'input' });\n }\n}\n\nclass BooleanNode extends BaseNode<boolean> {\n readonly kind = 'boolean';\n\n /** Ask for a switch. `ControlPanel` still draws a checkbox; weasel-ui's\n * `PrefsForm` honors the distinction. */\n toggle(): this {\n return this.ann({ control: 'switch' });\n }\n}\n\nclass StringNode extends BaseNode<string> {\n readonly kind = 'string';\n\n placeholder(placeholder: string): this {\n return this.ann({ placeholder });\n }\n\n maxLength(maxLength: number): this {\n return this.ann({ maxLength });\n }\n\n /** Milliseconds to debounce live writes. 0 commits every keystroke. */\n debounce(debounceMs: number): this {\n return this.ann({ debounceMs });\n }\n}\n\nclass ColorNode extends BaseNode<string> {\n readonly kind = 'color';\n}\n\nclass EnumNode<T extends string> extends BaseNode<T> {\n readonly kind = 'enum';\n\n /** Render as a segmented control rather than a select. */\n radio(): this {\n return this.ann({ control: 'radio' });\n }\n\n /** Relabel the choices. Named `labels` rather than `options` because\n * `options` is the node's own extras bag. */\n labels(options: readonly ConfigOption[]): this {\n return this.ann({ options });\n }\n}\n\n/** A leaf whose kind the rule chain decides. */\nclass ValueNode<T> extends BaseNode<T> {\n readonly kind = null;\n}\n\n/** A leaf of a kind labkit does not ship a row for. */\nclass CustomNode<T> extends BaseNode<T> {\n constructor(\n readonly kind: string,\n defaultValue: T,\n annotations: Readonly<Annotations> = {},\n options: Readonly<NodeOptions> = {},\n ) {\n super(defaultValue, annotations, options);\n }\n\n protected override with(annotations: Annotations, options: NodeOptions): this {\n return new CustomNode(this.kind, this.default, annotations, options) as this;\n }\n}\n\nconst expand = <T extends string>(\n options: readonly T[] | readonly ConfigOption[],\n): readonly ConfigOption[] =>\n options.map((o) => (typeof o === 'string' ? { value: o, label: o } : o));\n\n/**\n * Builds an instrument's config: the values, their types, and how each is\n * edited, in one declaration.\n *\n * ```ts\n * const config = f.schema({\n * showGrid: f.boolean(true),\n * cellSize: f.number(20).range(5, 80).step(5).label('Grid spacing'),\n * })\n * ```\n */\nexport const f = {\n number: (def: number): NumberNode => new NumberNode(def),\n boolean: (def: boolean): BooleanNode => new BooleanNode(def),\n string: (def: string): StringNode => new StringNode(def),\n color: (def: string): ColorNode => new ColorNode(def),\n\n /** A fixed set of choices. The default's literal type flows into the config\n * type, so `f.enum('fast', ['fast', 'accurate'])` gives\n * `'fast' | 'accurate'` with no `as const`. */\n enum: <const T extends string>(\n def: T,\n options: readonly T[] | readonly ConfigOption[],\n ): EnumNode<T> => new EnumNode<T>(def, { options: expand(options) }),\n\n /** A leaf with no declared kind: the rule chain decides, which is how a lab\n * states a convention like \"every `*Color` key is a color picker\". */\n value: <T>(def: T): ValueNode<T> => new ValueNode(def),\n\n /** A leaf of a kind a lab supplies the control for, through `controls`. */\n custom: <T>(kind: string, def: T, validate?: (leaf: PrefLeaf) => string[]): CustomNode<T> =>\n new CustomNode(kind, def, {}, validate ? { validate } : {}),\n\n /** Collect leaves into an instrument's config. */\n schema<S extends Record<string, ConfigNode>>(nodes: S): ConfigSchema<InferConfig<S>> {\n return {\n nodes,\n defaults: () => {\n const out: Record<string, unknown> = {};\n for (const [key, node] of Object.entries(nodes)) out[key] = node.default;\n return out as InferConfig<S>;\n },\n };\n },\n};\n","import type { ConfigRule, ConfigRuleContext, LeafPatch } from './types';\n\n/** `cellSize` -> `Cell size`. Splits camelCase without shattering acronyms. */\nexport function titleCase(key: string): string {\n const words = key\n .replace(/[_-]+/g, ' ')\n .split(/(?<=[a-z0-9])(?=[A-Z])/)\n .join(' ')\n .trim()\n .toLowerCase();\n return words.length === 0 ? words : words[0].toUpperCase() + words.slice(1);\n}\n\n/** An `f.value` leaf takes its kind from the shape of its default. */\nconst kindFromValue: ConfigRule = (ctx) => {\n const t = typeof ctx.default;\n if (t === 'boolean' || t === 'number' || t === 'string') return { kind: t };\n return null;\n};\n\nconst labelFromKey: ConfigRule = (ctx) => ({ name: titleCase(ctx.key) });\n\n/** A number bounded on both sides is a slider; one bound or none is an input. */\nconst sliderWhenBounded: ConfigRule = (ctx) => {\n if (ctx.leaf.kind !== 'number') return null;\n const bounded = ctx.leaf.min !== undefined && ctx.leaf.max !== undefined;\n return bounded ? { control: 'slider' } : null;\n};\n\n/** `PrefBase.description` is required, so every leaf must end up with one. */\nconst descriptionDefault: ConfigRule = () => ({ description: '' });\n\n/**\n * labkit's own inference, expressed in the same vocabulary a consumer\n * extends. Runs after the consumer's rules, so a lab always wins.\n *\n * If one of these ever needs something a `ConfigRule` cannot express, the\n * seam is too weak — that is the point of writing them this way.\n */\nexport const builtinRules: readonly ConfigRule[] = [\n kindFromValue,\n labelFromKey,\n sliderWhenBounded,\n descriptionDefault,\n];\n\n/**\n * Fold a rule chain into one leaf patch. Gap-filling: a property already\n * settled is never overwritten, so the accumulator seeded with the author's\n * annotations beats every rule, and earlier rules beat later ones.\n */\nexport function applyRules(\n seed: LeafPatch,\n ctx: Omit<ConfigRuleContext, 'leaf'>,\n rules: readonly ConfigRule[],\n): LeafPatch {\n const acc: LeafPatch = { ...seed };\n for (const rule of rules) {\n const patch = rule({ ...ctx, leaf: acc });\n if (patch === null) continue;\n for (const [k, v] of Object.entries(patch)) {\n if (v !== undefined && acc[k as keyof LeafPatch] === undefined) {\n (acc as Record<string, unknown>)[k] = v;\n }\n }\n }\n return acc;\n}\n","import type { PrefGroup, PrefLeaf } from '@weasel-js/ui';\nimport { applyRules, builtinRules } from './rules';\nimport type {\n ConfigRule,\n ConfigSchema,\n ControlRenderer,\n LeafPatch,\n ResolvedConfig,\n SectionSpec,\n} from './types';\n\n/** Drop keys whose value is undefined, so an unset annotation stays a gap the\n * rule chain can fill rather than a settled `undefined`. */\nfunction defined(annotations: Record<string, unknown>): LeafPatch {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(annotations)) if (v !== undefined) out[k] = v;\n return out as LeafPatch;\n}\n\n/**\n * Resolve a schema into the vocabulary weasel-ui renders, running each leaf\n * through the consumer's rules and then labkit's own.\n *\n * The group is flat — every leaf is a direct child — so a leaf's path is its\n * config key and both `ControlPanel` and `PrefsForm` address it identically.\n */\nexport function resolveConfigSchema<TC>(\n schema: ConfigSchema<TC>,\n rules: readonly ConfigRule[] = [],\n): ResolvedConfig {\n const children: Record<string, PrefLeaf> = {};\n const sectionOrder: string[] = [];\n const sectionPaths = new Map<string, string[]>();\n const showIf = new Map<string, (config: Record<string, unknown>) => boolean>();\n const renderers: Record<string, ControlRenderer> = {};\n\n const chain = [...rules, ...builtinRules];\n\n for (const [key, node] of Object.entries(schema.nodes)) {\n const seed: LeafPatch = defined({\n ...node.annotations,\n ...(node.kind === null ? {} : { kind: node.kind }),\n });\n\n const patch = applyRules(seed, { key, path: key, default: node.default }, chain);\n children[key] = { ...patch, default: node.default } as PrefLeaf;\n\n const { section, showIf: predicate, render } = node.options;\n if (section !== undefined) {\n if (!sectionPaths.has(section)) {\n sectionOrder.push(section);\n sectionPaths.set(section, []);\n }\n sectionPaths.get(section)?.push(key);\n }\n if (predicate) showIf.set(key, predicate);\n if (render) renderers[key] = render;\n }\n\n const group: PrefGroup = { name: '', children };\n const sections: SectionSpec[] = sectionOrder.map((label) => ({\n label,\n paths: sectionPaths.get(label) ?? [],\n }));\n\n return { group, sections, showIf, renderers };\n}\n","import { createContext, useContext } from 'react';\nimport type { ConfigRule, ControlRenderer } from '../config/types';\nimport type { InstrumentList } from '../instrument/types';\nimport type { LabMode, SavedSnapshot, TrialRecord } from '../state/types';\n\n/** Lab-wide state and commands: the available instruments, the open\n * trials and the operations over them, saved snapshots, and the color\n * mode. */\nexport interface LabContextValue {\n instruments: InstrumentList;\n trials: TrialRecord[];\n addTrial: (instrumentName: string) => void;\n cloneTrial: (id: string) => void;\n closeTrial: (id: string) => void;\n resetTrial: (id: string) => void;\n reorderTrials: (ids: readonly string[]) => void;\n savedSnapshots: SavedSnapshot[];\n saveSnapshot: (trialId: string, name?: string) => void;\n loadSnapshot: (trialId: string, snapshotId: string) => void;\n deleteSnapshot: (snapshotId: string) => void;\n mode: LabMode;\n setMode: (m: LabMode) => void;\n /** Lab-wide rules run over every instrument's config leaves, before\n * labkit's own inference. */\n configRules?: readonly ConfigRule[];\n /** Lab-wide control overrides, keyed by config path or by leaf kind. */\n controls?: Record<string, ControlRenderer>;\n}\n\n/** Context carrying the surrounding lab. Prefer `useLabContext`. */\nexport const LabContext = createContext<LabContextValue | null>(null);\n\n/** The surrounding lab. Throws outside a `<Lab>`. */\nexport function useLabContext(): LabContextValue {\n const ctx = useContext(LabContext);\n if (ctx === null) {\n throw new Error('useLabContext must be used inside <Lab>');\n }\n return ctx;\n}\n","import { useContext, useMemo } from 'react';\nimport type { Instrument } from '../instrument/types';\nimport { LabContext } from '../lab/LabContext';\nimport { fromConfigFields } from './fromConfigField';\nimport { resolveConfigSchema } from './resolve';\nimport type { ResolvedConfig } from './types';\n\nconst NO_RULES: readonly [] = [];\n\n/**\n * An instrument's controls, resolved against the surrounding lab's rules.\n *\n * Resolution cannot happen in `defineInstrument` — rules are lab-scoped and\n * that runs at module load — so it happens here, at render. Both instrument\n * paths land in the same shape, so callers never branch on which was used.\n */\nexport function useConfigSchema(\n // biome-ignore lint/suspicious/noExplicitAny: instruments are stored contravariantly; see InstrumentList\n instrument: Instrument<any, any, any>, // eslint-disable-line @typescript-eslint/no-explicit-any\n): ResolvedConfig {\n const lab = useContext(LabContext);\n const rules = lab?.configRules ?? NO_RULES;\n return useMemo(\n () =>\n instrument.config\n ? resolveConfigSchema(instrument.config, rules)\n : fromConfigFields(instrument.configSchema?.() ?? []),\n [instrument, rules],\n );\n}\n","import type { ConfigSchema } from '../config/types';\nimport type { Instrument } from './types';\n\n/** An instrument as it is written: either the legacy `defaultConfig` (plus an\n * optional `configSchema`), or a `config` schema that supplies both. */\nexport type InstrumentSpec<TS, TC, TItem = unknown> =\n | Instrument<TS, TC, TItem>\n | (Omit<Instrument<TS, TC, TItem>, 'defaultConfig'> & { config: ConfigSchema<TC> });\n\n/**\n * Normalizes an instrument spec, and infers its state and config types from\n * the literal rather than making them be written out.\n *\n * A spec declaring `config` gets its `defaultConfig` synthesized from the\n * schema, so nothing downstream branches on which way the config was\n * declared. A spec written the legacy way is returned unchanged, by\n * reference.\n *\n * Resolving the schema into controls does not happen here: rules are\n * lab-scoped and this runs at module load. `useConfigSchema` does that.\n *\n * TypeScript infers all three type arguments or none, so a call that names\n * `TS` and `TC` leaves `TItem` at `unknown` and a job's `onItem` needs a cast.\n * Name the item type too, or pass no type arguments at all.\n */\nexport function defineInstrument<TS, TC, TItem = unknown>(\n spec: InstrumentSpec<TS, TC, TItem>,\n): Instrument<TS, TC, TItem> {\n if (spec.config && !('defaultConfig' in spec && spec.defaultConfig)) {\n const schema = spec.config;\n return { ...spec, defaultConfig: () => schema.defaults() } as Instrument<TS, TC, TItem>;\n }\n return spec as Instrument<TS, TC, TItem>;\n}\n","import type { ConfigField } from '../controls/types';\n\n/** Whether a config schema is usable, and every problem found rather than\n * just the first. */\nexport interface ValidationResult {\n valid: boolean;\n errors: string[];\n}\n\n/** Check a config schema for the mistakes that would otherwise surface as a\n * silently broken control: empty or duplicate keys, and fields whose own\n * constraints do not hold.\n *\n * An unrecognized type is not an error — a lab supplies controls for its own\n * kinds through `ControlPanel`'s `renderers`, and this cannot see them. Such\n * a field simply has no constraints to check here. */\nexport function validateConfigSchema(fields: ConfigField[]): ValidationResult {\n const errors: string[] = [];\n const seenKeys = new Set<string>();\n\n for (const field of fields) {\n if (field.key === '') {\n errors.push('Field has empty key');\n } else if (seenKeys.has(field.key)) {\n errors.push(`Duplicate config key: \"${field.key}\"`);\n } else {\n seenKeys.add(field.key);\n }\n\n if (field.label === '') {\n errors.push(`Field \"${field.key}\" has empty label`);\n }\n\n if (field.type === 'slider') {\n if (!Number.isFinite(field.default)) {\n errors.push(`Field \"${field.key}\": default must be a finite number`);\n }\n if (field.min >= field.max) {\n errors.push(`Slider \"${field.key}\": min must be < max`);\n } else if (field.default < field.min || field.default > field.max) {\n errors.push(`Slider \"${field.key}\": default ${field.default} is outside [min, max]`);\n }\n } else if (field.type === 'number') {\n if (!Number.isFinite(field.default)) {\n errors.push(`Field \"${field.key}\": default must be a finite number`);\n }\n } else if (field.type === 'select') {\n if (field.options.length === 0) {\n errors.push(`Select \"${field.key}\": options array must not be empty`);\n } else {\n const seenValues = new Set<string>();\n for (const opt of field.options) {\n if (seenValues.has(opt.value)) {\n errors.push(`Select \"${field.key}\": duplicate option value \"${opt.value}\"`);\n } else {\n seenValues.add(opt.value);\n }\n }\n if (!seenValues.has(field.default)) {\n errors.push(`Select \"${field.key}\": default \"${field.default}\" is not among options`);\n }\n }\n }\n }\n\n return { valid: errors.length === 0, errors };\n}\n","// GENERATED by packages/theme/scripts/build-tokens.ts — do not edit.\n\nimport type { RawToken } from '../dtcg/types';\n\n/** Every design token the built-in themes declare, spelled as the CSS\n * custom property it becomes. */\nexport type TokenName =\n | '--wzl-accent'\n | '--wzl-accent-base'\n | '--wzl-accent-fg'\n | '--wzl-accent-hover'\n | '--wzl-accent-soft'\n | '--wzl-accent-strong'\n | '--wzl-backdrop'\n | '--wzl-border'\n | '--wzl-border-raised'\n | '--wzl-border-strong'\n | '--wzl-border-w'\n | '--wzl-control-h'\n | '--wzl-curve-color'\n | '--wzl-curve-width'\n | '--wzl-danger'\n | '--wzl-danger-base'\n | '--wzl-ease-in-cubic'\n | '--wzl-ease-in-out-cubic'\n | '--wzl-ease-out-back'\n | '--wzl-ease-out-cubic'\n | '--wzl-fg'\n | '--wzl-fg-inverse'\n | '--wzl-fg-muted'\n | '--wzl-fg-on-accent'\n | '--wzl-fg-subtle'\n | '--wzl-focus-ring'\n | '--wzl-font-body'\n | '--wzl-font-display'\n | '--wzl-font-mono'\n | '--wzl-font-size'\n | '--wzl-font-size-2xs'\n | '--wzl-font-size-lg'\n | '--wzl-font-size-sm'\n | '--wzl-font-size-xl'\n | '--wzl-font-size-xs'\n | '--wzl-font-ui'\n | '--wzl-font-weight-bold'\n | '--wzl-font-weight-light'\n | '--wzl-font-weight-medium'\n | '--wzl-font-weight-normal'\n | '--wzl-glass-blur'\n | '--wzl-glass-tint'\n | '--wzl-gray-100'\n | '--wzl-gray-200'\n | '--wzl-gray-300'\n | '--wzl-gray-400'\n | '--wzl-gray-50'\n | '--wzl-gray-500'\n | '--wzl-gray-600'\n | '--wzl-gray-700'\n | '--wzl-gray-800'\n | '--wzl-gray-900'\n | '--wzl-leading'\n | '--wzl-leading-snug'\n | '--wzl-leading-tight'\n | '--wzl-line'\n | '--wzl-line-strong'\n | '--wzl-line-subtle'\n | '--wzl-line-width'\n | '--wzl-motion-fast'\n | '--wzl-motion-medium'\n | '--wzl-radius-lg'\n | '--wzl-radius-md'\n | '--wzl-radius-pill'\n | '--wzl-radius-sm'\n | '--wzl-shadow'\n | '--wzl-space-lg'\n | '--wzl-space-md'\n | '--wzl-space-sm'\n | '--wzl-space-xs'\n | '--wzl-success'\n | '--wzl-success-base'\n | '--wzl-surface'\n | '--wzl-surface-hover'\n | '--wzl-surface-pressed'\n | '--wzl-surface-raised'\n | '--wzl-surface-sunken'\n | '--wzl-swatch-amber'\n | '--wzl-swatch-cyan'\n | '--wzl-swatch-gold'\n | '--wzl-swatch-green'\n | '--wzl-swatch-magenta'\n | '--wzl-swatch-mint'\n | '--wzl-swatch-orange'\n | '--wzl-swatch-pink'\n | '--wzl-swatch-sky'\n | '--wzl-swatch-violet'\n | '--wzl-tb-height'\n | '--wzl-tracking-none'\n | '--wzl-tracking-wide'\n | '--wzl-tracking-wider'\n | '--wzl-warning'\n | '--wzl-warning-base'\n | '--wzl-z-modal'\n | '--wzl-z-overlay'\n | '--wzl-z-toolbar';\n\n/** A built-in theme with its aliases already collapsed: every mode maps\n * every token name to a final CSS value. */\nexport interface GeneratedTheme {\n readonly name: string;\n readonly defaultMode: string;\n readonly modes: Readonly<Record<string, Readonly<Record<TokenName, string>>>>;\n}\n\n/** The built-in themes, resolved, keyed by theme name. Read this to list\n * or preview themes without resolving a token graph yourself. */\nexport const THEMES = {\n \"weasel\": {\n name: \"weasel\",\n defaultMode: \"dark\",\n modes: {\n \"dark\": {\n '--wzl-gray-50': \"#f5f5f6\",\n '--wzl-gray-100': \"#e6e7e9\",\n '--wzl-gray-200': \"#c9cbcf\",\n '--wzl-gray-300': \"#9ea1a8\",\n '--wzl-gray-400': \"#6f737b\",\n '--wzl-gray-500': \"#4d5058\",\n '--wzl-gray-600': \"#383b42\",\n '--wzl-gray-700': \"#25272c\",\n '--wzl-gray-800': \"#181a1e\",\n '--wzl-gray-900': \"#0e0f12\",\n '--wzl-accent-soft': \"#1d1454\",\n '--wzl-accent-base': \"#2e1f7a\",\n '--wzl-accent-strong': \"#5841b8\",\n '--wzl-danger-base': \"#d94a3f\",\n '--wzl-warning-base': \"#d99a3f\",\n '--wzl-success-base': \"#2ec27e\",\n '--wzl-fg-on-accent': \"#f5f5f6\",\n '--wzl-fg': \"#e6e7e9\",\n '--wzl-line-subtle': \"rgba(230, 231, 233, 0.1)\",\n '--wzl-line': \"rgba(230, 231, 233, 0.2)\",\n '--wzl-line-strong': \"rgba(230, 231, 233, 0.4)\",\n '--wzl-curve-color': \"#5841b8\",\n '--wzl-accent': \"#2e1f7a\",\n '--wzl-accent-hover': \"#5841b8\",\n '--wzl-danger': \"#d94a3f\",\n '--wzl-warning': \"#d99a3f\",\n '--wzl-success': \"#2ec27e\",\n '--wzl-focus-ring': \"#5841b8\",\n '--wzl-glass-tint': \"#2e1f7a\",\n '--wzl-surface-hover': \"rgba(230, 231, 233, 0.1)\",\n '--wzl-surface-pressed': \"rgba(230, 231, 233, 0.18)\",\n '--wzl-swatch-green': \"#2fdd18\",\n '--wzl-swatch-pink': \"#ff5885\",\n '--wzl-swatch-cyan': \"#00dfff\",\n '--wzl-swatch-gold': \"#dcb700\",\n '--wzl-swatch-amber': \"#ff8c00\",\n '--wzl-swatch-violet': \"#a497ff\",\n '--wzl-swatch-mint': \"#00e7af\",\n '--wzl-swatch-sky': \"#00b8ff\",\n '--wzl-swatch-orange': \"#ff6b00\",\n '--wzl-swatch-magenta': \"#ff6eff\",\n '--wzl-radius-sm': \"3px\",\n '--wzl-radius-md': \"5px\",\n '--wzl-radius-lg': \"14px\",\n '--wzl-radius-pill': \"999px\",\n '--wzl-border-w': \"1px\",\n '--wzl-line-width': \"2px\",\n '--wzl-curve-width': \"3px\",\n '--wzl-tb-height': \"28px\",\n '--wzl-control-h': \"24px\",\n '--wzl-glass-blur': \"3px\",\n '--wzl-font-size-2xs': \"9px\",\n '--wzl-font-size-xs': \"10px\",\n '--wzl-font-size-sm': \"11px\",\n '--wzl-font-size': \"13px\",\n '--wzl-font-size-lg': \"16px\",\n '--wzl-font-size-xl': \"20px\",\n '--wzl-space-xs': \"4px\",\n '--wzl-space-sm': \"8px\",\n '--wzl-space-md': \"12px\",\n '--wzl-space-lg': \"16px\",\n '--wzl-tracking-none': \"0\",\n '--wzl-tracking-wide': \"0.06em\",\n '--wzl-tracking-wider': \"0.08em\",\n '--wzl-z-toolbar': \"10\",\n '--wzl-z-overlay': \"20\",\n '--wzl-z-modal': \"30\",\n '--wzl-leading-tight': \"1\",\n '--wzl-leading-snug': \"1.2\",\n '--wzl-leading': \"1.4\",\n '--wzl-backdrop': \"none\",\n '--wzl-motion-fast': \"120ms\",\n '--wzl-motion-medium': \"240ms\",\n '--wzl-ease-in-cubic': \"cubic-bezier(0.32, 0, 0.67, 0)\",\n '--wzl-ease-out-cubic': \"cubic-bezier(0.33, 1, 0.68, 1)\",\n '--wzl-ease-in-out-cubic': \"cubic-bezier(0.65, 0, 0.35, 1)\",\n '--wzl-ease-out-back': \"cubic-bezier(0.34, 1.56, 0.64, 1)\",\n '--wzl-font-ui': \"Oswald, 'Helvetica Neue Condensed', 'Arial Narrow', system-ui, sans-serif\",\n '--wzl-font-display': \"Oswald, 'Helvetica Neue Condensed', 'Arial Narrow', system-ui, sans-serif\",\n '--wzl-font-body': \"Inter, system-ui, -apple-system, 'Segoe UI', sans-serif\",\n '--wzl-font-mono': \"ui-monospace, SFMono-Regular, Menlo, Consolas, monospace\",\n '--wzl-font-weight-light': \"200\",\n '--wzl-font-weight-normal': \"300\",\n '--wzl-font-weight-medium': \"350\",\n '--wzl-font-weight-bold': \"400\",\n '--wzl-surface': \"#181a1e\",\n '--wzl-surface-raised': \"#25272c\",\n '--wzl-surface-sunken': \"#0e0f12\",\n '--wzl-fg-muted': \"#9ea1a8\",\n '--wzl-fg-subtle': \"#6f737b\",\n '--wzl-border': \"#25272c\",\n '--wzl-border-strong': \"#383b42\",\n '--wzl-accent-fg': \"#5841b8\",\n '--wzl-fg-inverse': \"#0e0f12\",\n '--wzl-shadow': \"rgba(0, 0, 0, 0.6)\",\n '--wzl-border-raised': \"#6f737b\",\n },\n \"light\": {\n '--wzl-gray-50': \"#f5f5f6\",\n '--wzl-gray-100': \"#e6e7e9\",\n '--wzl-gray-200': \"#c9cbcf\",\n '--wzl-gray-300': \"#9ea1a8\",\n '--wzl-gray-400': \"#6f737b\",\n '--wzl-gray-500': \"#4d5058\",\n '--wzl-gray-600': \"#383b42\",\n '--wzl-gray-700': \"#25272c\",\n '--wzl-gray-800': \"#181a1e\",\n '--wzl-gray-900': \"#0e0f12\",\n '--wzl-accent-soft': \"#1d1454\",\n '--wzl-accent-base': \"#2e1f7a\",\n '--wzl-accent-strong': \"#5841b8\",\n '--wzl-danger-base': \"#d94a3f\",\n '--wzl-warning-base': \"#d99a3f\",\n '--wzl-success-base': \"#2ec27e\",\n '--wzl-fg-on-accent': \"#f5f5f6\",\n '--wzl-fg': \"#0e0f12\",\n '--wzl-line-subtle': \"rgba(14, 15, 18, 0.1)\",\n '--wzl-line': \"rgba(14, 15, 18, 0.2)\",\n '--wzl-line-strong': \"rgba(14, 15, 18, 0.4)\",\n '--wzl-curve-color': \"#5841b8\",\n '--wzl-accent': \"#2e1f7a\",\n '--wzl-accent-hover': \"#5841b8\",\n '--wzl-danger': \"#d94a3f\",\n '--wzl-warning': \"#d99a3f\",\n '--wzl-success': \"#2ec27e\",\n '--wzl-focus-ring': \"#5841b8\",\n '--wzl-glass-tint': \"#2e1f7a\",\n '--wzl-surface-hover': \"rgba(14, 15, 18, 0.1)\",\n '--wzl-surface-pressed': \"rgba(14, 15, 18, 0.18)\",\n '--wzl-swatch-green': \"#2fdd18\",\n '--wzl-swatch-pink': \"#ff5885\",\n '--wzl-swatch-cyan': \"#00dfff\",\n '--wzl-swatch-gold': \"#dcb700\",\n '--wzl-swatch-amber': \"#ff8c00\",\n '--wzl-swatch-violet': \"#a497ff\",\n '--wzl-swatch-mint': \"#00e7af\",\n '--wzl-swatch-sky': \"#00b8ff\",\n '--wzl-swatch-orange': \"#ff6b00\",\n '--wzl-swatch-magenta': \"#ff6eff\",\n '--wzl-radius-sm': \"3px\",\n '--wzl-radius-md': \"5px\",\n '--wzl-radius-lg': \"14px\",\n '--wzl-radius-pill': \"999px\",\n '--wzl-border-w': \"1px\",\n '--wzl-line-width': \"2px\",\n '--wzl-curve-width': \"3px\",\n '--wzl-tb-height': \"28px\",\n '--wzl-control-h': \"24px\",\n '--wzl-glass-blur': \"3px\",\n '--wzl-font-size-2xs': \"9px\",\n '--wzl-font-size-xs': \"10px\",\n '--wzl-font-size-sm': \"11px\",\n '--wzl-font-size': \"13px\",\n '--wzl-font-size-lg': \"16px\",\n '--wzl-font-size-xl': \"20px\",\n '--wzl-space-xs': \"4px\",\n '--wzl-space-sm': \"8px\",\n '--wzl-space-md': \"12px\",\n '--wzl-space-lg': \"16px\",\n '--wzl-tracking-none': \"0\",\n '--wzl-tracking-wide': \"0.06em\",\n '--wzl-tracking-wider': \"0.08em\",\n '--wzl-z-toolbar': \"10\",\n '--wzl-z-overlay': \"20\",\n '--wzl-z-modal': \"30\",\n '--wzl-leading-tight': \"1\",\n '--wzl-leading-snug': \"1.2\",\n '--wzl-leading': \"1.4\",\n '--wzl-backdrop': \"none\",\n '--wzl-motion-fast': \"120ms\",\n '--wzl-motion-medium': \"240ms\",\n '--wzl-ease-in-cubic': \"cubic-bezier(0.32, 0, 0.67, 0)\",\n '--wzl-ease-out-cubic': \"cubic-bezier(0.33, 1, 0.68, 1)\",\n '--wzl-ease-in-out-cubic': \"cubic-bezier(0.65, 0, 0.35, 1)\",\n '--wzl-ease-out-back': \"cubic-bezier(0.34, 1.56, 0.64, 1)\",\n '--wzl-font-ui': \"Oswald, 'Helvetica Neue Condensed', 'Arial Narrow', system-ui, sans-serif\",\n '--wzl-font-display': \"Oswald, 'Helvetica Neue Condensed', 'Arial Narrow', system-ui, sans-serif\",\n '--wzl-font-body': \"Inter, system-ui, -apple-system, 'Segoe UI', sans-serif\",\n '--wzl-font-mono': \"ui-monospace, SFMono-Regular, Menlo, Consolas, monospace\",\n '--wzl-font-weight-light': \"200\",\n '--wzl-font-weight-normal': \"300\",\n '--wzl-font-weight-medium': \"350\",\n '--wzl-font-weight-bold': \"400\",\n '--wzl-surface': \"#f5f5f6\",\n '--wzl-surface-raised': \"#e6e7e9\",\n '--wzl-surface-sunken': \"#c9cbcf\",\n '--wzl-fg-muted': \"#383b42\",\n '--wzl-fg-subtle': \"#4d5058\",\n '--wzl-border': \"#c9cbcf\",\n '--wzl-border-strong': \"#9ea1a8\",\n '--wzl-accent-fg': \"#2e1f7a\",\n '--wzl-fg-inverse': \"#f5f5f6\",\n '--wzl-shadow': \"rgba(0, 0, 0, 0.18)\",\n '--wzl-border-raised': \"#6f737b\",\n },\n },\n },\n} as const satisfies Record<string, GeneratedTheme>;\n\n/** Unresolved token graph. `extends` needs the aliases intact so an override\n * of a base primitive still reaches everything referencing it. */\nexport interface ThemeSource {\n readonly primitives: Readonly<Record<string, RawToken>>;\n readonly modes: Readonly<Record<string, Readonly<Record<string, RawToken>>>>;\n}\n\n/** The same built-in themes as `THEMES`, unresolved. This is what\n * `defineTheme` layers onto. */\nexport const THEME_SOURCES: Readonly<Record<string, ThemeSource>> = {\n \"weasel\": {\n \"primitives\": {\n \"gray-50\": {\n \"type\": \"color\",\n \"value\": \"#f5f5f6\"\n },\n \"gray-100\": {\n \"type\": \"color\",\n \"value\": \"#e6e7e9\"\n },\n \"gray-200\": {\n \"type\": \"color\",\n \"value\": \"#c9cbcf\"\n },\n \"gray-300\": {\n \"type\": \"color\",\n \"value\": \"#9ea1a8\"\n },\n \"gray-400\": {\n \"type\": \"color\",\n \"value\": \"#6f737b\"\n },\n \"gray-500\": {\n \"type\": \"color\",\n \"value\": \"#4d5058\"\n },\n \"gray-600\": {\n \"type\": \"color\",\n \"value\": \"#383b42\"\n },\n \"gray-700\": {\n \"type\": \"color\",\n \"value\": \"#25272c\"\n },\n \"gray-800\": {\n \"type\": \"color\",\n \"value\": \"#181a1e\"\n },\n \"gray-900\": {\n \"type\": \"color\",\n \"value\": \"#0e0f12\"\n },\n \"accent-soft\": {\n \"type\": \"color\",\n \"value\": \"#1d1454\"\n },\n \"accent-base\": {\n \"type\": \"color\",\n \"value\": \"#2e1f7a\",\n \"description\": \"Midnight blue-violet. Deep and saturated; anchors primary actions on light and dark surfaces alike.\"\n },\n \"accent-strong\": {\n \"type\": \"color\",\n \"value\": \"#5841b8\"\n },\n \"danger-base\": {\n \"type\": \"color\",\n \"value\": \"#d94a3f\"\n },\n \"warning-base\": {\n \"type\": \"color\",\n \"value\": \"#d99a3f\"\n },\n \"success-base\": {\n \"type\": \"color\",\n \"value\": \"#2ec27e\"\n },\n \"fg-on-accent\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-50}\"\n },\n \"line-subtle\": {\n \"type\": \"color\",\n \"value\": \"{color.fg}\",\n \"alpha\": 0.1,\n \"description\": \"Barely-there separators (table rows).\"\n },\n \"line\": {\n \"type\": \"color\",\n \"value\": \"{color.fg}\",\n \"alpha\": 0.2,\n \"description\": \"Primary gridlines on sunken surfaces.\"\n },\n \"line-strong\": {\n \"type\": \"color\",\n \"value\": \"{color.fg}\",\n \"alpha\": 0.4,\n \"description\": \"Axes and emphasized dividers.\"\n },\n \"curve-color\": {\n \"type\": \"color\",\n \"value\": \"{color.accent-strong}\",\n \"description\": \"Drawn data curves. Routes through the bright accent because accent-base is too dim on sunken surfaces.\"\n },\n \"accent\": {\n \"type\": \"color\",\n \"value\": \"{color.accent-base}\"\n },\n \"accent-hover\": {\n \"type\": \"color\",\n \"value\": \"{color.accent-strong}\"\n },\n \"danger\": {\n \"type\": \"color\",\n \"value\": \"{color.danger-base}\"\n },\n \"warning\": {\n \"type\": \"color\",\n \"value\": \"{color.warning-base}\"\n },\n \"success\": {\n \"type\": \"color\",\n \"value\": \"{color.success-base}\"\n },\n \"focus-ring\": {\n \"type\": \"color\",\n \"value\": \"{color.accent-strong}\"\n },\n \"glass-tint\": {\n \"type\": \"color\",\n \"value\": \"{color.accent}\",\n \"description\": \"Frosted-glass tint. Components compose it as color-mix(in srgb, var(--wzl-glass-tint) 78%, transparent) with backdrop-filter: blur(3px).\"\n },\n \"surface-hover\": {\n \"type\": \"color\",\n \"value\": \"{color.fg}\",\n \"alpha\": 0.1,\n \"description\": \"Hover wash over a raised surface. Same formula as line-subtle, different job — do not collapse them.\"\n },\n \"surface-pressed\": {\n \"type\": \"color\",\n \"value\": \"{color.fg}\",\n \"alpha\": 0.18,\n \"description\": \"Pressed wash over a raised surface.\"\n },\n \"swatch-green\": {\n \"type\": \"color\",\n \"value\": \"#2fdd18\",\n \"description\": \"First of ten categorical spot colors for plotting, status and data viz. Ordered — take them in sequence. Mode-invariant on purpose: a series keeps its color when the mode flips.\"\n },\n \"swatch-pink\": {\n \"type\": \"color\",\n \"value\": \"#ff5885\"\n },\n \"swatch-cyan\": {\n \"type\": \"color\",\n \"value\": \"#00dfff\"\n },\n \"swatch-gold\": {\n \"type\": \"color\",\n \"value\": \"#dcb700\"\n },\n \"swatch-amber\": {\n \"type\": \"color\",\n \"value\": \"#ff8c00\"\n },\n \"swatch-violet\": {\n \"type\": \"color\",\n \"value\": \"#a497ff\"\n },\n \"swatch-mint\": {\n \"type\": \"color\",\n \"value\": \"#00e7af\"\n },\n \"swatch-sky\": {\n \"type\": \"color\",\n \"value\": \"#00b8ff\"\n },\n \"swatch-orange\": {\n \"type\": \"color\",\n \"value\": \"#ff6b00\"\n },\n \"swatch-magenta\": {\n \"type\": \"color\",\n \"value\": \"#ff6eff\"\n },\n \"radius-sm\": {\n \"type\": \"dimension\",\n \"value\": \"3px\"\n },\n \"radius-md\": {\n \"type\": \"dimension\",\n \"value\": \"5px\"\n },\n \"radius-lg\": {\n \"type\": \"dimension\",\n \"value\": \"14px\"\n },\n \"radius-pill\": {\n \"type\": \"dimension\",\n \"value\": \"999px\",\n \"description\": \"Fully rounded ends — segmented controls, progress tracks.\"\n },\n \"border-w\": {\n \"type\": \"dimension\",\n \"value\": \"1px\"\n },\n \"line-width\": {\n \"type\": \"dimension\",\n \"value\": \"2px\",\n \"description\": \"Structural lines — gridlines, dividers, axes.\"\n },\n \"curve-width\": {\n \"type\": \"dimension\",\n \"value\": \"3px\",\n \"description\": \"Drawn data curves. Heavier than structural lines so data reads as primary content.\"\n },\n \"tb-height\": {\n \"type\": \"dimension\",\n \"value\": \"28px\",\n \"description\": \"Height of a horizontal toolbar strip (ActionsBar, OptionsBar, ToolOptionsBar). Taller than control-h so the controls inside a strip are not flush with its edges.\"\n },\n \"control-h\": {\n \"type\": \"dimension\",\n \"value\": \"24px\",\n \"description\": \"Height of an interactive control — button, input, select, segmented control. Distinct from tb-height, which sizes the strip a row of them sits in.\"\n },\n \"glass-blur\": {\n \"type\": \"dimension\",\n \"value\": \"3px\",\n \"description\": \"Backdrop blur radius for frosted surfaces. Pairs with glass-tint.\"\n },\n \"font-size-2xs\": {\n \"type\": \"dimension\",\n \"value\": \"9px\",\n \"description\": \"Shortcut keys and index badges. The floor for chrome text.\"\n },\n \"font-size-xs\": {\n \"type\": \"dimension\",\n \"value\": \"10px\",\n \"description\": \"Tool-button labels under an icon.\"\n },\n \"font-size-sm\": {\n \"type\": \"dimension\",\n \"value\": \"11px\",\n \"description\": \"Chrome labels, status readouts, section headings.\"\n },\n \"font-size\": {\n \"type\": \"dimension\",\n \"value\": \"13px\",\n \"description\": \"Controls and body text.\"\n },\n \"font-size-lg\": {\n \"type\": \"dimension\",\n \"value\": \"16px\",\n \"description\": \"Panel and dialog titles.\"\n },\n \"font-size-xl\": {\n \"type\": \"dimension\",\n \"value\": \"20px\",\n \"description\": \"The largest chrome text — a lab or app title.\"\n },\n \"space-xs\": {\n \"type\": \"dimension\",\n \"value\": \"4px\"\n },\n \"space-sm\": {\n \"type\": \"dimension\",\n \"value\": \"8px\"\n },\n \"space-md\": {\n \"type\": \"dimension\",\n \"value\": \"12px\"\n },\n \"space-lg\": {\n \"type\": \"dimension\",\n \"value\": \"16px\"\n },\n \"tracking-none\": {\n \"type\": \"dimension\",\n \"value\": \"0\"\n },\n \"tracking-wide\": {\n \"type\": \"dimension\",\n \"value\": \"0.06em\",\n \"description\": \"Uppercase section headings.\"\n },\n \"tracking-wider\": {\n \"type\": \"dimension\",\n \"value\": \"0.08em\",\n \"description\": \"Uppercase at 11px and below.\"\n },\n \"z-toolbar\": {\n \"type\": \"number\",\n \"value\": 10\n },\n \"z-overlay\": {\n \"type\": \"number\",\n \"value\": 20\n },\n \"z-modal\": {\n \"type\": \"number\",\n \"value\": 30\n },\n \"leading-tight\": {\n \"type\": \"number\",\n \"value\": 1,\n \"description\": \"Single-line controls; the box sets the height.\"\n },\n \"leading-snug\": {\n \"type\": \"number\",\n \"value\": 1.2,\n \"description\": \"Headings and two-line labels.\"\n },\n \"leading\": {\n \"type\": \"number\",\n \"value\": 1.4,\n \"description\": \"Body and anything that wraps.\"\n },\n \"backdrop\": {\n \"type\": \"gradient\",\n \"value\": \"none\",\n \"description\": \"Layered backdrop fill for a page or lab root. `none` here; a theme with a signature background sets it.\"\n },\n \"motion-fast\": {\n \"type\": \"duration\",\n \"value\": \"120ms\",\n \"description\": \"Micro-interactions — hover, focus, pressed.\"\n },\n \"motion-medium\": {\n \"type\": \"duration\",\n \"value\": \"240ms\",\n \"description\": \"Entrances and exits — toasts, popovers, panels.\"\n },\n \"ease-in-cubic\": {\n \"type\": \"cubicBezier\",\n \"value\": [\n 0.32,\n 0,\n 0.67,\n 0\n ]\n },\n \"ease-out-cubic\": {\n \"type\": \"cubicBezier\",\n \"value\": [\n 0.33,\n 1,\n 0.68,\n 1\n ]\n },\n \"ease-in-out-cubic\": {\n \"type\": \"cubicBezier\",\n \"value\": [\n 0.65,\n 0,\n 0.35,\n 1\n ]\n },\n \"ease-out-back\": {\n \"type\": \"cubicBezier\",\n \"value\": [\n 0.34,\n 1.56,\n 0.64,\n 1\n ]\n },\n \"font-ui\": {\n \"type\": \"fontFamily\",\n \"value\": [\n \"Oswald\",\n \"Helvetica Neue Condensed\",\n \"Arial Narrow\",\n \"system-ui\",\n \"sans-serif\"\n ],\n \"description\": \"Condensed UI/display face. The heavier cuts get blocky at any size, so the weight tokens stay in the 200-400 range.\"\n },\n \"font-display\": {\n \"type\": \"fontFamily\",\n \"value\": [\n \"Oswald\",\n \"Helvetica Neue Condensed\",\n \"Arial Narrow\",\n \"system-ui\",\n \"sans-serif\"\n ]\n },\n \"font-body\": {\n \"type\": \"fontFamily\",\n \"value\": [\n \"Inter\",\n \"system-ui\",\n \"-apple-system\",\n \"Segoe UI\",\n \"sans-serif\"\n ]\n },\n \"font-mono\": {\n \"type\": \"fontFamily\",\n \"value\": [\n \"ui-monospace\",\n \"SFMono-Regular\",\n \"Menlo\",\n \"Consolas\",\n \"monospace\"\n ]\n },\n \"font-weight-light\": {\n \"type\": \"fontWeight\",\n \"value\": 200\n },\n \"font-weight-normal\": {\n \"type\": \"fontWeight\",\n \"value\": 300\n },\n \"font-weight-medium\": {\n \"type\": \"fontWeight\",\n \"value\": 350\n },\n \"font-weight-bold\": {\n \"type\": \"fontWeight\",\n \"value\": 400\n }\n },\n \"modes\": {\n \"dark\": {\n \"surface\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-800}\"\n },\n \"surface-raised\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-700}\"\n },\n \"surface-sunken\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-900}\"\n },\n \"fg\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-100}\"\n },\n \"fg-muted\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-300}\"\n },\n \"fg-subtle\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-400}\"\n },\n \"border\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-700}\"\n },\n \"border-strong\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-600}\"\n },\n \"accent-fg\": {\n \"type\": \"color\",\n \"value\": \"{color.accent-strong}\",\n \"description\": \"Accent for foreground use — text, icons, selected labels drawn on a surface. accent is a fill; the midnight base is too dim to read as text on dark surfaces.\"\n },\n \"fg-inverse\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-900}\",\n \"description\": \"Text drawn on a filled foreground-colored element (e.g. a slider thumb). Flips with the mode, so it is a semantic, not an alias to a primitive.\"\n },\n \"shadow\": {\n \"type\": \"color\",\n \"value\": \"rgba(0, 0, 0, 0.6)\",\n \"description\": \"Elevation. Always darker than any surface — never derived from fg, which is near-white on dark.\"\n },\n \"border-raised\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-400}\",\n \"description\": \"The line around a raised surface. Clears 3:1 against surface and surface-raised in either mode, which the general-purpose border does not; over surface-sunken it does not, so a panel on a sunken field needs its own answer.\"\n }\n },\n \"light\": {\n \"surface\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-50}\"\n },\n \"surface-raised\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-100}\"\n },\n \"surface-sunken\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-200}\"\n },\n \"fg\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-900}\"\n },\n \"fg-muted\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-600}\"\n },\n \"fg-subtle\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-500}\"\n },\n \"border\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-200}\"\n },\n \"border-strong\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-300}\"\n },\n \"accent-fg\": {\n \"type\": \"color\",\n \"value\": \"{color.accent-base}\",\n \"description\": \"Flips to the deep base in light mode, where it is the legible one.\"\n },\n \"fg-inverse\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-50}\",\n \"description\": \"Flips with the mode — see the dark layer.\"\n },\n \"shadow\": {\n \"type\": \"color\",\n \"value\": \"rgba(0, 0, 0, 0.18)\"\n },\n \"border-raised\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-400}\"\n }\n }\n }\n }\n};\n","import type { FlatTokens, RawToken } from './dtcg/types';\nimport { THEME_SOURCES } from './generated/themes';\n\n/** Authoring shorthand: a bare string is a literal or a `{ref}`. */\nexport type TokenInput = string | number | RawToken;\n\n/** What `defineTheme` accepts: a name, the base theme to layer onto, and the\n * token overrides, split into mode-invariant and per-mode. */\nexport interface ThemeInput {\n readonly name: string;\n /** Base to layer onto. Defaults to `weaselTheme`; `null` opts out. */\n readonly extends?: Theme | null;\n readonly defaultMode?: string;\n /** Mode-invariant overrides. */\n readonly tokens?: Readonly<Record<string, TokenInput>>;\n readonly modes: Readonly<Record<string, Readonly<Record<string, TokenInput>>>>;\n}\n\n/**\n * A theme: a named set of design tokens, organized into a mode-invariant layer\n * plus one layer per mode (light, dark, …), optionally extending another theme.\n * Tokens are held unresolved — aliases between them are collapsed later by\n * `resolveTheme`, so an override of a base primitive still reaches everything\n * that references it.\n */\nexport interface Theme {\n readonly name: string;\n readonly extends: Theme | null;\n readonly defaultMode: string;\n readonly tokens: FlatTokens;\n readonly modes: Readonly<Record<string, FlatTokens>>;\n}\n\nfunction normalize(input: Readonly<Record<string, TokenInput>>): FlatTokens {\n const out: FlatTokens = {};\n for (const [name, v] of Object.entries(input)) {\n out[name] =\n typeof v === 'object'\n ? v\n : { type: 'unknown', value: v, alpha: undefined, description: undefined };\n }\n return out;\n}\n\n/** The built-in theme, materialized from the generated source. */\nexport const weaselTheme: Theme = {\n name: 'weasel',\n extends: null,\n defaultMode: 'dark',\n tokens: THEME_SOURCES.weasel.primitives as FlatTokens,\n modes: THEME_SOURCES.weasel.modes as Record<string, FlatTokens>,\n};\n\n/** Build a theme from authoring shorthand. Unless `extends` says otherwise the\n * result layers onto `weaselTheme`, so a theme only needs to name what it\n * changes. */\nexport function defineTheme(input: ThemeInput): Theme {\n const base = input.extends === undefined ? weaselTheme : input.extends;\n const modes: Record<string, FlatTokens> = {};\n for (const [mode, tokens] of Object.entries(input.modes)) modes[mode] = normalize(tokens);\n return {\n name: input.name,\n extends: base,\n defaultMode: input.defaultMode ?? base?.defaultMode ?? 'dark',\n tokens: normalize(input.tokens ?? {}),\n modes,\n };\n}\n","/**\n * Hex → `rgba()`. The JS side of the alpha extension; the CSS side emits\n * `color-mix()` instead so DOM chrome keeps tracking a downstream override of\n * the referenced token.\n */\nexport function hexToRgba(hex: string, alpha: number): string {\n const m = /^#([0-9a-f]{3}|[0-9a-f]{6})$/i.exec(hex.trim());\n if (!m) throw new Error(`Expected a hex color, got \"${hex}\"`);\n\n const body = m[1];\n const full = body.length === 3 ? body.replace(/./g, (c) => c + c) : body;\n const r = Number.parseInt(full.slice(0, 2), 16);\n const g = Number.parseInt(full.slice(2, 4), 16);\n const b = Number.parseInt(full.slice(4, 6), 16);\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n}\n","import { hexToRgba } from './color';\nimport type { FlatTokens, ResolvedTokenMap, TokenValue } from './types';\n\n/** `{color.gray-100}` → `gray-100`. The type group is dropped, per the naming rule. */\nconst REF = /^\\{([^}]+)\\}$/;\n\nfunction refTarget(value: TokenValue): string | null {\n if (typeof value !== 'string') return null;\n const m = REF.exec(value.trim());\n if (!m) return null;\n const path = m[1];\n const dot = path.indexOf('.');\n return dot === -1 ? path : path.slice(dot + 1);\n}\n\n/**\n * Quote family names containing whitespace; leave everything else bare.\n * Generic keywords (`sans-serif`) and hyphen-prefixed identifiers\n * (`-apple-system`) break if quoted, and neither contains a space.\n */\nfunction fontStack(value: readonly (string | number)[]): string {\n return value.map((f) => (typeof f === 'string' && /\\s/.test(f) ? `'${f}'` : String(f))).join(', ');\n}\n\nfunction serialize(type: string, value: TokenValue): string {\n if (Array.isArray(value)) {\n if (type === 'cubicBezier') return `cubic-bezier(${value.join(', ')})`;\n if (type === 'fontFamily') return fontStack(value);\n return value.join(', ');\n }\n return String(value);\n}\n\n/**\n * Resolve flat tokens to final CSS-ready strings.\n *\n * Merge modes before calling: this function has no notion of modes, only of a\n * complete token set.\n */\nexport function resolveTokens(tokens: FlatTokens): ResolvedTokenMap {\n const out: ResolvedTokenMap = {};\n const inProgress = new Set<string>();\n\n const resolveOne = (name: string): string => {\n const cached = out[name];\n if (cached !== undefined) return cached;\n\n const token = tokens[name];\n if (!token) throw new Error(`Unknown token \"${name}\"`);\n\n if (inProgress.has(name)) {\n throw new Error(`Reference cycle at token \"${name}\" (${[...inProgress].join(' → ')})`);\n }\n inProgress.add(name);\n\n const target = refTarget(token.value);\n let value: string;\n if (target === null) {\n value = serialize(token.type, token.value);\n } else if (!tokens[target]) {\n throw new Error(`Token \"${name}\" references \"${target}\", which is not defined`);\n } else {\n value = resolveOne(target);\n }\n\n if (token.alpha !== undefined) value = hexToRgba(value, token.alpha);\n\n inProgress.delete(name);\n out[name] = value;\n return value;\n };\n\n for (const name of Object.keys(tokens)) resolveOne(name);\n return out;\n}\n\n/** Merge a mode's tokens over the mode-invariant set. Later wins. */\nexport function mergeTokens(base: FlatTokens, mode: FlatTokens): FlatTokens {\n return { ...base, ...mode };\n}\n","import { resolveTokens } from './dtcg/resolve';\nimport type { FlatTokens } from './dtcg/types';\nimport type { Theme } from './theme';\nimport type { TokenName } from './generated/themes';\n\n/** The output of `resolveTheme`: every token of a theme, for one mode, keyed\n * by CSS custom-property name and flattened to a final CSS value. */\nexport type ResolvedTheme = Readonly<Record<TokenName, string>>;\n\n/** Root-first so the leaf theme's overrides land last. */\nfunction chain(theme: Theme): Theme[] {\n const out: Theme[] = [];\n for (let t: Theme | null = theme; t; t = t.extends) out.unshift(t);\n return out;\n}\n\n/**\n * Merge the extends chain, layer the mode over it, resolve every alias, and\n * key the result by CSS custom-property name.\n *\n * Pure — no DOM. An unresolvable reference throws rather than falling back.\n */\nexport function resolveTheme(theme: Theme, mode: string): ResolvedTheme {\n const themes = chain(theme);\n const effectiveMode = themes.some((t) => mode in t.modes) ? mode : theme.defaultMode;\n\n // Each theme contributes its mode-invariant tokens and then its mode layer,\n // before the next theme down the chain gets a turn. Collecting all `tokens`\n // first and all mode layers second would let the *base's* mode layer outrank\n // a derived theme's deliberate mode-invariant override.\n let merged: FlatTokens = {};\n for (const t of themes) {\n merged = { ...merged, ...t.tokens, ...(t.modes[effectiveMode] ?? {}) };\n }\n\n const resolved = resolveTokens(merged);\n const out: Record<string, string> = {};\n for (const [name, value] of Object.entries(resolved)) out[`--wzl-${name}`] = value;\n return out as ResolvedTheme;\n}\n","import { resolveTheme } from './resolveTheme';\nimport type { Theme } from './theme';\n\nconst STYLE_ID = 'wzl-themes';\n/** `theme.name::mode` → the rule text currently published for it. Keyed by\n * name because that is what the rule's selector matches on, and holding the\n * text is what lets a redefinition under the same name replace its rule\n * rather than be swallowed as a cache hit. */\nconst emitted = new Map<string, string>();\nlet sheet: CSSStyleSheet | null = null;\nlet styleEl: HTMLStyleElement | null = null;\n\n/** Test seam — drops the module-level cache so each case starts clean. */\nexport function __resetThemeSheet(): void {\n emitted.clear();\n sheet = null;\n styleEl = null;\n}\n\nfunction canAdopt(): boolean {\n return (\n typeof CSSStyleSheet !== 'undefined' &&\n 'replaceSync' in CSSStyleSheet.prototype &&\n Array.isArray(document.adoptedStyleSheets)\n );\n}\n\n/** Republish every rule from `emitted`. Rewriting the whole sheet rather than\n * appending keeps it the size of the theme set: a theme redefined under a\n * name it already used replaces its rule instead of stacking another one. */\nfunction flushRules(): void {\n const css = [...emitted.values()].join('\\n');\n if (canAdopt()) {\n if (!sheet) {\n sheet = new CSSStyleSheet();\n document.adoptedStyleSheets = [...document.adoptedStyleSheets, sheet];\n }\n sheet.replaceSync(css);\n return;\n }\n if (!styleEl) {\n styleEl = document.createElement('style');\n styleEl.id = STYLE_ID;\n document.head.appendChild(styleEl);\n }\n styleEl.textContent = css;\n}\n\n/**\n * Apply `theme` at `mode` to `el`'s subtree.\n *\n * Stamps two data attributes and ensures a matching rule block exists in a\n * module-owned stylesheet. Deliberately not inline properties: the cascade\n * then does the work, per-subtree overrides are just a different theme name,\n * and no `!important` is ever needed. No-op outside a DOM.\n */\nexport function applyTheme(el: HTMLElement, theme: Theme, mode: string): void {\n if (typeof document === 'undefined') return;\n\n const key = `${theme.name}::${mode}`;\n const resolved = resolveTheme(theme, mode);\n const body = Object.entries(resolved)\n .map(([name, value]) => `${name}: ${value};`)\n .join(' ');\n const rule = `[data-wzl-theme='${theme.name}'][data-wzl-mode='${mode}'] { ${body} }`;\n if (emitted.get(key) !== rule) {\n emitted.set(key, rule);\n flushRules();\n }\n\n el.setAttribute('data-wzl-theme', theme.name);\n el.setAttribute('data-wzl-mode', mode);\n}\n","import React, { createContext, useContext, useMemo, useRef, useLayoutEffect } from 'react';\nimport { applyTheme } from './applyTheme';\nimport { resolveTheme, type ResolvedTheme } from './resolveTheme';\nimport { weaselTheme, type Theme } from './theme';\n\n/** What `<ThemeProvider>` publishes: the theme, the mode in force, and the\n * fully resolved token record for that pair. */\nexport interface ThemeContextValue {\n readonly theme: Theme;\n readonly mode: string;\n readonly resolved: ResolvedTheme;\n}\n\nconst ThemeContext = createContext<ThemeContextValue | null>(null);\n\n/** Props for `<ThemeProvider>`. */\nexport interface ThemeProviderProps {\n readonly theme?: Theme;\n readonly mode?: string;\n /** Applied to the wrapper element, so it can be the layout element too. */\n readonly className?: string;\n readonly style?: React.CSSProperties;\n readonly children: React.ReactNode;\n}\n\n/**\n * Applies a theme to a wrapper element and publishes the resolved record.\n *\n * Consumers that draw outside the DOM (the WebGL HUD) read `resolved` and\n * never touch `getComputedStyle`.\n *\n * The wrapper is a real element in the layout. Pass `className` rather than\n * nesting your own div inside — an anonymous div between a flex parent and\n * its child breaks percentage heights.\n */\nexport function ThemeProvider({\n theme = weaselTheme,\n mode,\n className,\n style,\n children,\n}: ThemeProviderProps): React.ReactElement {\n const ref = useRef<HTMLDivElement>(null);\n const effectiveMode = mode ?? theme.defaultMode;\n\n const value = useMemo<ThemeContextValue>(\n () => ({ theme, mode: effectiveMode, resolved: resolveTheme(theme, effectiveMode) }),\n [theme, effectiveMode],\n );\n\n useLayoutEffect(() => {\n if (ref.current) applyTheme(ref.current, theme, effectiveMode);\n }, [theme, effectiveMode]);\n\n return (\n <ThemeContext.Provider value={value}>\n <div\n ref={ref}\n className={className}\n style={style}\n data-wzl-theme={theme.name}\n data-wzl-mode={effectiveMode}\n >\n {children}\n </div>\n </ThemeContext.Provider>\n );\n}\n\n/** The theme in force. Throws outside a `<ThemeProvider>`; use\n * `useThemeOptional` where the provider is not guaranteed. */\nexport function useTheme(): ThemeContextValue {\n const ctx = useContext(ThemeContext);\n if (!ctx) throw new Error('useTheme must be used inside a <ThemeProvider>');\n return ctx;\n}\n\n/**\n * The theme if one is provided, `null` otherwise.\n *\n * For kit internals that should follow a theme when the app supplies one but\n * must still work in an app that never mounted a provider — `useHud` is the\n * motivating case.\n */\nexport function useThemeOptional(): ThemeContextValue | null {\n return useContext(ThemeContext);\n}\n","/** The one `$extensions` key this kit defines. */\nexport const ALPHA_EXT = 'com.weasel.alpha';\n\nexport type TokenValue = string | number | readonly (string | number)[];\n\n/**\n * A single design token as authored, before aliases are resolved: a DTCG-shaped\n * `{ type, value }` pair where `value` may still be a `{ref}` to another token.\n */\nexport interface RawToken {\n readonly type: string;\n readonly value: TokenValue;\n /** Render the referenced color at this alpha, 0–1. */\n readonly alpha?: number | undefined;\n readonly description?: string | undefined;\n}\n\n/** A token graph flattened to one level, keyed by token name (no `--wzl-`\n * prefix). Still unresolved — see `ResolvedTokenMap` for the output side. */\nexport type FlatTokens = Record<string, RawToken>;\n\n/** A resolved theme: every token name mapped to its final CSS-ready string.\n * Named ...Map, not ...Tokens, to stay distinct from hud's public `ResolvedTokens`. */\nexport type ResolvedTokenMap = Record<string, string>;\n","import { ALPHA_EXT, type FlatTokens, type RawToken, type TokenValue } from './types';\n\ninterface DtcgToken {\n $value: TokenValue;\n $type?: string;\n $description?: string;\n $extensions?: Record<string, unknown>;\n}\n\nconst isToken = (v: unknown): v is DtcgToken =>\n typeof v === 'object' && v !== null && '$value' in v;\n\n/**\n * Collapse a DTCG document into flat token names.\n *\n * Groups exist only to carry `$type`; they contribute nothing to the name, so\n * `color.fg-muted` becomes `fg-muted` and in turn `--wzl-fg-muted`. This shape\n * is forced by the token set: `--wzl-accent` and `--wzl-accent-base` are both\n * real tokens, and DTCG forbids a token that is also a group.\n */\nexport function flattenTokens(doc: Record<string, unknown>): FlatTokens {\n const out: FlatTokens = {};\n\n for (const [groupName, group] of Object.entries(doc)) {\n if (groupName.startsWith('$')) continue;\n if (typeof group !== 'object' || group === null) continue;\n\n const g = group as Record<string, unknown> & { $type?: string };\n const groupType = g.$type;\n\n for (const [leaf, node] of Object.entries(g)) {\n if (leaf.startsWith('$')) continue;\n if (!isToken(node)) continue;\n\n const type = node.$type ?? groupType;\n if (!type) {\n throw new Error(`Token \"${leaf}\" has no $type and its group \"${groupName}\" declares none`);\n }\n if (leaf in out) {\n throw new Error(`Duplicate token name \"${leaf}\" — leaf keys must be unique across type groups`);\n }\n\n const alphaRaw = node.$extensions?.[ALPHA_EXT];\n const token: RawToken = {\n type,\n value: node.$value,\n alpha: typeof alphaRaw === 'number' ? alphaRaw : undefined,\n description: node.$description,\n };\n out[leaf] = token;\n }\n }\n\n return out;\n}\n","import { flattenTokens } from './dtcg/flatten';\nimport type { FlatTokens } from './dtcg/types';\nimport { weaselTheme, type Theme } from './theme';\n\ninterface DtcgDocument {\n name?: unknown;\n defaultMode?: unknown;\n extends?: Theme | null;\n primitives?: Record<string, unknown>;\n modes?: Record<string, Record<string, unknown>>;\n}\n\n/**\n * Build a `Theme` from a DTCG document — the interchange path, for tokens\n * exported by a design tool rather than authored in TS.\n */\nexport function loadDTCG(doc: DtcgDocument): Theme {\n if (typeof doc.name !== 'string' || doc.name === '') {\n throw new Error('DTCG document needs a string \"name\"');\n }\n const modes: Record<string, FlatTokens> = {};\n for (const [mode, body] of Object.entries(doc.modes ?? {})) {\n modes[mode] = flattenTokens(body);\n }\n const base = doc.extends === undefined ? weaselTheme : doc.extends;\n return {\n name: doc.name,\n extends: base,\n defaultMode:\n typeof doc.defaultMode === 'string' ? doc.defaultMode : (base?.defaultMode ?? 'dark'),\n tokens: flattenTokens(doc.primitives ?? {}),\n modes,\n };\n}\n","{\n \"name\": \"interstellar\",\n \"defaultMode\": \"dark\",\n \"primitives\": {\n \"dimension\": {\n \"$type\": \"dimension\",\n \"radius-md\": { \"$value\": \"6px\" },\n \"glass-blur\": { \"$value\": \"12px\" }\n },\n \"fontWeight\": {\n \"$type\": \"fontWeight\",\n \"font-weight-light\": { \"$value\": 300 },\n \"font-weight-medium\": { \"$value\": 500 },\n \"font-weight-bold\": { \"$value\": 700 }\n }\n },\n \"modes\": {\n \"dark\": {\n \"color\": {\n \"$type\": \"color\",\n \"surface\": { \"$value\": \"#0a0a14\" },\n \"surface-raised\": { \"$value\": \"rgba(20, 20, 36, 0.55)\" },\n \"surface-sunken\": { \"$value\": \"#02020a\" },\n \"border\": { \"$value\": \"rgba(255, 255, 255, 0.14)\" },\n \"line-subtle\": { \"$value\": \"rgba(255, 255, 255, 0.08)\" },\n \"fg\": { \"$value\": \"#e8e8f0\" },\n \"fg-muted\": { \"$value\": \"#a8a8c0\" },\n \"fg-subtle\": { \"$value\": \"#5a5a78\" },\n \"accent\": { \"$value\": \"#b08adb\" },\n \"accent-hover\": { \"$value\": \"#c6a3ee\" },\n \"focus-ring\": { \"$value\": \"rgba(176, 138, 219, 0.45)\" },\n \"shadow\": { \"$value\": \"rgba(0, 0, 0, 0.7)\" },\n \"border-raised\": { \"$value\": \"rgba(255, 255, 255, 0.36)\" }\n },\n \"gradient\": {\n \"$type\": \"gradient\",\n \"backdrop\": {\n \"$value\": \"radial-gradient(ellipse 60% 80% at 18% 30%, rgba(150, 80, 200, 0.22), transparent 70%), radial-gradient(ellipse 55% 90% at 78% 70%, rgba(220, 100, 140, 0.18), transparent 65%), radial-gradient(ellipse 50% 70% at 50% 50%, rgba(60, 110, 200, 0.18), transparent 75%), radial-gradient(ellipse at center, #0a0a18 0%, #02020a 100%)\"\n }\n }\n },\n \"light\": {\n \"color\": {\n \"$type\": \"color\",\n \"surface\": { \"$value\": \"#fafaf7\" },\n \"surface-raised\": { \"$value\": \"#ffffff\" },\n \"surface-sunken\": { \"$value\": \"#f0ebe2\" },\n \"border\": { \"$value\": \"#c9bba5\" },\n \"line-subtle\": { \"$value\": \"rgba(0, 0, 0, 0.08)\" },\n \"fg\": { \"$value\": \"#2a2018\" },\n \"fg-muted\": { \"$value\": \"#6b5c4a\" },\n \"fg-subtle\": { \"$value\": \"#a89b85\" },\n \"accent\": { \"$value\": \"#a86f3c\" },\n \"accent-hover\": { \"$value\": \"#c2854f\" },\n \"focus-ring\": { \"$value\": \"rgba(168, 111, 60, 0.35)\" },\n \"shadow\": { \"$value\": \"rgba(80, 60, 40, 0.18)\" },\n \"border-raised\": { \"$value\": \"#9e8b71\" }\n }\n }\n }\n}\n","import { loadDTCG, type Theme } from '@weasel-js/theme';\nimport doc from './interstellar.tokens.json' with { type: 'json' };\n\n/**\n * labkit's theme: a cosmic dark and a warm parchment light, extending the\n * built-in weasel theme. Authored as DTCG and loaded at import time — the\n * interchange path a theme exported from a design tool would take.\n */\nexport const interstellarTheme: Theme = loadDTCG(doc);\n","import type { ViewTransform } from '../instrument/types';\n\n/** The 2D view labkit has always shipped, and what a trial gets when it names no\n * other. Re-exported under its own name so a consumer can say which it means. */\nexport type ViewTransform2D = ViewTransform;\n\nexport const DEFAULT_VIEW: ViewTransform2D = { zoom: 1, pan: { x: 0, y: 0 } };\n\n/** A trial's view is opaque to labkit, so anything that needs the 2D shape — the\n * zoom chrome, `CanvasStack` — asks for it and handles not getting it. */\nexport function as2DView(view: unknown): ViewTransform2D | null {\n if (typeof view !== 'object' || view === null) return null;\n const v = view as Partial<ViewTransform2D>;\n if (typeof v.zoom !== 'number') return null;\n if (typeof v.pan !== 'object' || v.pan === null) return null;\n if (typeof v.pan.x !== 'number' || typeof v.pan.y !== 'number') return null;\n return { zoom: v.zoom, pan: { x: v.pan.x, y: v.pan.y } };\n}\n","import { createContext, useContext } from 'react';\nimport type { NodeId } from 'windease';\n\n/** Supplied by `<Workspace>` when trials are reorderable, so a trial's title\n * bar can be the drag surface. Null when reordering is off. */\nexport const TrialDragContext = createContext<{ nodeId: NodeId } | null>(null);\n\nexport function useTrialDrag(): { nodeId: NodeId } | null {\n return useContext(TrialDragContext);\n}\n","import type { ReactNode } from 'react';\nimport type { NodeId } from 'windease';\nimport { useDragHandle } from 'windease/react';\nimport { useTrialDrag } from './TrialDragContext';\n\n/** Props for `<TrialTitleBar>`. */\nexport interface TrialTitleBarProps {\n title: string;\n children?: ReactNode;\n}\n\n// `useDragHandle` needs a node id and windease's DragProvider, so the draggable\n// form is a separate component rather than a conditional hook.\nfunction Draggable({ nodeId, title, children }: TrialTitleBarProps & { nodeId: NodeId }) {\n const handlers = useDragHandle(nodeId);\n return (\n <div className=\"lk-trial__titlebar lk-trial__titlebar--draggable\" {...handlers}>\n <span className=\"lk-trial__title\">{title}</span>\n {children}\n </div>\n );\n}\n\n/** A trial's title bar. When the workspace allows reordering the whole bar is\n * the drag surface — there is no separate grip, because a window's title bar\n * is already the thing you expect to drag. */\nexport function TrialTitleBar({ title, children }: TrialTitleBarProps) {\n const drag = useTrialDrag();\n if (drag)\n return (\n <Draggable nodeId={drag.nodeId} title={title}>\n {children}\n </Draggable>\n );\n return (\n <div className=\"lk-trial__titlebar\">\n <span className=\"lk-trial__title\">{title}</span>\n {children}\n </div>\n );\n}\n","import { createContext, useContext } from 'react';\n\n/** Where an undocked panel's DOM lives. The panel's *content* stays owned by\n * its trial — it is React-portalled into the host — so a torn-out section\n * keeps the trial's context, state and subscriptions instead of being rebuilt\n * as a sibling of the trial it came from. */\nexport interface PanelHostRegistry {\n set: (key: string, el: HTMLElement | null) => void;\n get: (key: string) => HTMLElement | null;\n subscribe: (fn: () => void) => () => void;\n}\n\nexport function createPanelHostRegistry(): PanelHostRegistry {\n const hosts = new Map<string, HTMLElement>();\n const listeners = new Set<() => void>();\n const notify = () => {\n for (const fn of listeners) fn();\n };\n return {\n set: (key, el) => {\n if (el) hosts.set(key, el);\n else hosts.delete(key);\n notify();\n },\n get: (key) => hosts.get(key) ?? null,\n subscribe: (fn) => {\n listeners.add(fn);\n return () => listeners.delete(fn);\n },\n };\n}\n\nexport const PanelHostContext = createContext<PanelHostRegistry | null>(null);\n\nexport function usePanelHosts(): PanelHostRegistry | null {\n return useContext(PanelHostContext);\n}\n","import { useSyncExternalStore } from 'react';\nimport { createPortal } from 'react-dom';\nimport type { SidebarSection, TrialContribution } from '../chrome/types';\nimport { usePanelHosts } from '../lab/panelHost';\nimport { panelKey } from '../state/undock';\n\n/** Props for `<UndockedSections>`. */\nexport interface UndockedSectionsProps {\n trialId: string;\n /** The trial's sidebar contributions that are currently torn out. */\n sections: readonly TrialContribution[];\n onDock: (sectionId: string) => void;\n}\n\nfunction Portalled({\n trialId,\n contribution,\n onDock,\n}: {\n trialId: string;\n contribution: TrialContribution;\n onDock: (sectionId: string) => void;\n}) {\n const hosts = usePanelHosts();\n const key = panelKey(trialId, contribution.id);\n const host = useSyncExternalStore(\n (fn) => hosts?.subscribe(fn) ?? (() => {}),\n () => hosts?.get(key) ?? null,\n () => null,\n );\n if (!host || !contribution.item) return null;\n const item = contribution.item as SidebarSection;\n return createPortal(\n <>\n <div className=\"lk-panel-tile__titlebar\">\n <span className=\"lk-panel-tile__title\">{item.title}</span>\n <button\n type=\"button\"\n className=\"lk-panel-tile__dock\"\n aria-label={`Dock ${item.title}`}\n title={`Dock ${item.title}`}\n onClick={() => onDock(contribution.id)}\n >\n ⇤\n </button>\n </div>\n {item.body}\n </>,\n host,\n );\n}\n\n/** Renders a torn-out section's body into the workspace panel holding it. The\n * body stays mounted in the trial's React tree — only its DOM moves — so it\n * keeps the trial's context and its own state across an undock. */\nexport function UndockedSections({ trialId, sections, onDock }: UndockedSectionsProps) {\n if (sections.length === 0) return null;\n return (\n <>\n {sections.map((c) => (\n <Portalled key={c.id} trialId={trialId} contribution={c} onDock={onDock} />\n ))}\n </>\n );\n}\n","import { type KeyboardEvent, type ReactNode, useContext, useMemo } from 'react';\nimport { useStore } from 'zustand/react';\nimport { builtinContributions } from '../chrome/builtins';\nimport { mergeContributions, suppressContributions } from '../chrome/merge';\nimport { PaletteRegion } from '../chrome/regions/PaletteRegion';\nimport { SidebarRegion } from '../chrome/regions/SidebarRegion';\nimport { StatusRegion } from '../chrome/regions/StatusRegion';\nimport { TitleBarRegion } from '../chrome/regions/TitleBarRegion';\nimport { ToolbarRegion } from '../chrome/regions/ToolbarRegion';\nimport { ViewportRegion } from '../chrome/regions/ViewportRegion';\nimport type { TrialChromeContext, TrialContribution, TrialRegion } from '../chrome/types';\nimport { useConfigSchema } from '../config/useConfigSchema';\nimport type { Instrument } from '../instrument/types';\nimport type { JobHandle } from '../job/types';\nimport { useLabContext } from '../lab/LabContext';\nimport { JobProgress } from '../primitives/JobProgress';\nimport { LabStoreContext } from '../state/context';\nimport type { TrialRecord } from '../state/types';\nimport { as2DView } from '../state/view';\nimport { TrialTitleBar } from './TrialTitleBar';\nimport { UndockedSections } from './UndockedSections';\n\n/** The trial's loupe as its chrome sees it: a switch and its position. */\nexport interface LoupeBindings {\n on: boolean;\n toggle: () => void;\n}\n\nexport interface UndoBindings {\n canUndo: boolean;\n canRedo: boolean;\n undo: () => void;\n redo: () => void;\n}\n\n/** Props for `<TrialChrome>`. */\nexport interface TrialChromeProps {\n trialId: string;\n record: TrialRecord;\n instrument: Instrument;\n isLastTrial: boolean;\n undoBindings?: UndoBindings;\n /** Supplied when the instrument declares a `job`. */\n job?: JobHandle;\n /** Supplied when the instrument declares a `loupe`. The lens itself is the\n * trial's to mount; the chrome only offers the switch. */\n loupe?: LoupeBindings;\n /** Contributions the trial runtime itself adds — the drag palette and the\n * layer list, which depend on runtime state the instrument cannot reach. */\n trialChrome?: readonly TrialContribution[];\n /** Contributions from the lab, merged last. */\n chrome?: readonly TrialContribution[];\n /** Built-in contribution ids to drop. Throws on an id that is not there. */\n suppress?: readonly string[];\n /** The trial's resolved tool slot, and the setter that writes whichever\n * slot it resolved to. `Trial` owns the resolution. */\n activeToolId?: string | null;\n setActiveTool?: (id: string) => void;\n children: ReactNode;\n}\n\nconst NO_OP = (): void => {};\n\n/** The frame around a running instrument. Builds one chrome context, assembles\n * the contributions the instrument, the runtime and the lab declare, and hands\n * each region its slice. */\nexport function TrialChrome({\n trialId,\n record,\n instrument,\n isLastTrial,\n undoBindings,\n job,\n loupe,\n trialChrome,\n chrome,\n suppress,\n activeToolId = null,\n setActiveTool = NO_OP,\n children,\n}: TrialChromeProps) {\n const lab = useLabContext();\n const storeCtx = useContext(LabStoreContext);\n if (!storeCtx) throw new Error('[labkit] TrialChrome requires <LabStoreProvider>');\n const updateTrialView = useStore(storeCtx.store, (s) => s.updateTrialView);\n const updateTrialConfig = useStore(storeCtx.store, (s) => s.updateTrialConfig);\n const updateTrialState = useStore(storeCtx.store, (s) => s.updateTrialState);\n const undockPanelAction = useStore(storeCtx.store, (s) => s.undockPanel);\n const dockPanelAction = useStore(storeCtx.store, (s) => s.dockPanel);\n const undockedPanels = useStore(storeCtx.store, (s) => s.undockedPanels);\n const undockedIds = useMemo(\n () =>\n Object.values(undockedPanels)\n .filter((p) => p.trialId === trialId)\n .map((p) => p.sectionId),\n [undockedPanels, trialId],\n );\n\n // The trial view is opaque to labkit, so the zoom chrome asks for the 2D shape\n // and goes inert when the trial holds something else — an orbit, say.\n const view2d = as2DView(record.view);\n\n const configSchema = useConfigSchema(instrument);\n\n const ctx = useMemo<TrialChromeContext>(() => {\n const setZoom = (z: number): void => {\n if (!view2d) return;\n updateTrialView(trialId, { ...view2d, zoom: z });\n };\n return {\n trialId,\n instrumentName: record.instrumentName,\n isLastTrial,\n zoom: view2d ? view2d.zoom : null,\n setZoom,\n canUndo: undoBindings?.canUndo ?? false,\n canRedo: undoBindings?.canRedo ?? false,\n undo: undoBindings?.undo ?? NO_OP,\n redo: undoBindings?.redo ?? NO_OP,\n loupeOn: loupe?.on ?? false,\n toggleLoupe: loupe?.toggle ?? NO_OP,\n configSchema,\n configFields: instrument.config ? [] : (instrument.configSchema?.() ?? []),\n config: record.config,\n setConfig: (key, value) => {\n const prevConfig = record.config as Record<string, unknown>;\n if (process.env.NODE_ENV !== 'production' && !(key in prevConfig)) {\n console.warn(\n `[labkit] setConfig: unknown key \"${key}\" for instrument \"${record.instrumentName}\"`,\n );\n }\n updateTrialConfig(trialId, key as never, value as never);\n if (instrument.onConfigChange) {\n const nextConfig = { ...prevConfig, [key]: value };\n const nextState = instrument.onConfigChange(nextConfig, prevConfig, record.state);\n updateTrialState(trialId, nextState as never);\n }\n },\n undockedPanels: undockedIds,\n undockPanel: (sectionId, as) => undockPanelAction(trialId, sectionId, as),\n dockPanel: (sectionId) => dockPanelAction(trialId, sectionId),\n savedSnapshots: lab.savedSnapshots.filter((s) => s.trialId === trialId),\n saveSnapshot: (name) => lab.saveSnapshot(trialId, name),\n loadSnapshot: (snapshotId) => lab.loadSnapshot(trialId, snapshotId),\n clone: () => lab.cloneTrial(trialId),\n reset: () => lab.resetTrial(trialId),\n close: () => lab.closeTrial(trialId),\n activeToolId,\n setActiveTool,\n };\n }, [\n trialId,\n record,\n instrument,\n lab,\n isLastTrial,\n updateTrialView,\n updateTrialConfig,\n updateTrialState,\n undoBindings,\n loupe,\n view2d,\n activeToolId,\n setActiveTool,\n configSchema,\n undockedIds,\n undockPanelAction,\n dockPanelAction,\n ]);\n\n const contributions = useMemo(\n () =>\n suppressContributions(\n mergeContributions(\n builtinContributions(instrument, ctx, lab.controls),\n [...(instrument.chrome ?? [])],\n [...(trialChrome ?? [])],\n [...(chrome ?? [])],\n ),\n suppress ?? [],\n ),\n [instrument, ctx, trialChrome, chrome, suppress, lab.controls],\n );\n\n const inRegion = (region: TrialRegion): TrialContribution[] =>\n contributions.filter((c) => c.region === region);\n\n const handleKeyDown = (e: KeyboardEvent<HTMLElement>): void => {\n const mod = e.metaKey || e.ctrlKey;\n if (!mod) return;\n if (e.key === 'z' || e.key === 'Z') {\n e.preventDefault();\n if (e.shiftKey) ctx.redo();\n else ctx.undo();\n } else if (e.key === 's' || e.key === 'S') {\n e.preventDefault();\n ctx.saveSnapshot();\n }\n };\n\n return (\n <section\n className=\"lk-trial\"\n aria-label={`Trial ${record.instrumentName}`}\n tabIndex={-1}\n onKeyDown={handleKeyDown}\n >\n <TrialTitleBar title={record.instrumentName}>\n <TitleBarRegion contributions={inRegion('titlebar')} ctx={ctx} />\n </TrialTitleBar>\n <div className=\"lk-trial__toolbar\">\n <ToolbarRegion contributions={inRegion('toolbar')} ctx={ctx} />\n </div>\n <div className=\"lk-trial__body\">\n <PaletteRegion contributions={inRegion('palette')} ctx={ctx} />\n <div className=\"lk-trial__sidebar\">\n <SidebarRegion contributions={inRegion('sidebar')} ctx={ctx} />\n <UndockedSections\n trialId={trialId}\n sections={inRegion('sidebar').filter((c) => undockedIds.includes(c.id))}\n onDock={ctx.dockPanel}\n />\n </div>\n <div className={`lk-trial__content${instrument.canvas ? ' lk-trial__content--flush' : ''}`}>\n {children}\n <ViewportRegion contributions={inRegion('viewport')} ctx={ctx} />\n </div>\n </div>\n <div className=\"lk-trial__status\">\n {job ? <JobProgress job={job} /> : null}\n <StatusRegion contributions={inRegion('status')} ctx={ctx} />\n </div>\n </section>\n );\n}\n","import { type ReactNode, useContext, useEffect, useMemo, useRef, useState } from 'react';\nimport { useStore } from 'zustand/react';\nimport { AnnotationsContext } from '../annotations/AnnotationsContext';\nimport { AnnotationTargets } from '../annotations/AnnotationTargets';\nimport { annotationsFromJSON } from '../annotations/store';\nimport type { AnnotationTargetInfo } from '../annotations/types';\nimport { CanvasStack } from '../canvas/CanvasStack';\nimport type { CanvasLayerDescriptor } from '../canvas/useLayerScheduler';\nimport { applyCamera, type ViewportSize } from '../canvas/worldSpec';\nimport type { TrialContribution } from '../chrome/types';\nimport { DragOverlay, useDragDrop } from '../dragdrop/DragDropRuntime';\nimport { Palette } from '../dragdrop/Palette';\nimport type { Instrument, LayerDescriptor, PaletteItem, RenderContext } from '../instrument/types';\nimport { useJob } from '../job/useJob';\nimport { useLabContext } from '../lab/LabContext';\nimport { LayerList } from '../layers/LayerList';\nimport { TrialLoupe } from '../loupe/TrialLoupe';\nimport { resolveLoupe } from '../loupe/types';\nimport { LabStoreContext, TrialIdProvider } from '../state/context';\nimport type { LabStore } from '../state/store';\nimport type { TrialRecord } from '../state/types';\nimport { as2DView, DEFAULT_VIEW } from '../state/view';\nimport { createEventBus, type EventBus } from '../undo/eventBus';\nimport { pushSnapshot, redo as undoRedo, undo as undoUndo } from '../undo/undoStack';\nimport type { LoupeBindings, UndoBindings } from './TrialChrome';\nimport { TrialChrome } from './TrialChrome';\n\n/** Props for `<Trial>`. */\nexport interface TrialProps {\n id: string;\n /** Contributions the lab adds to this trial's chrome, merged after the\n * instrument's own. */\n chrome?: readonly TrialContribution[];\n /** Built-in contribution ids to drop. Throws on an id that is not there. */\n suppress?: readonly string[];\n}\n\n/** Renders one trial from the lab store: looks up its record and\n * instrument, and mounts the instrument inside the trial chrome. */\nexport function Trial({ id, chrome, suppress }: TrialProps) {\n const lab = useLabContext();\n const storeCtx = useContext(LabStoreContext);\n if (!storeCtx) throw new Error('[labkit] <Trial> requires <LabStoreProvider>');\n const record = useStore(storeCtx.store, (s) => s.trials.find((w) => w.id === id));\n if (!record) {\n return <div className=\"lk-trial lk-trial--unknown\">Trial not found: {id}</div>;\n }\n const instrument = lab.instruments.find((i) => i.name === record.instrumentName);\n if (!instrument) {\n return (\n <div className=\"lk-trial lk-trial--unknown\">Unknown instrument: {record.instrumentName}</div>\n );\n }\n return (\n <TrialRuntime\n record={record}\n instrument={instrument}\n store={storeCtx.store}\n isLast={lab.trials.length <= 1}\n chrome={chrome}\n suppress={suppress}\n />\n );\n}\n\ninterface TrialRuntimeProps {\n record: TrialRecord;\n instrument: Instrument;\n store: LabStore;\n isLast: boolean;\n chrome?: readonly TrialContribution[];\n suppress?: readonly string[];\n}\n\nfunction TrialRuntime({ record, instrument, store, isLast, chrome, suppress }: TrialRuntimeProps) {\n const canvasContainerRef = useRef<HTMLDivElement | null>(null);\n const loupeHostRef = useRef<HTMLDivElement | null>(null);\n const updateTrialState = useStore(store, (s) => s.updateTrialState);\n const updateTrialConfig = useStore(store, (s) => s.updateTrialConfig);\n const updateTrialView = useStore(store, (s) => s.updateTrialView);\n const updateTrialUndoStack = useStore(store, (s) => s.updateTrialUndoStack);\n const updateTrialAnnotations = useStore(store, (s) => s.updateTrialAnnotations);\n const labToolId = useStore(store, (s) => s.activeToolId);\n const setLabTool = useStore(store, (s) => s.setLabTool);\n const setTrialTool = useStore(store, (s) => s.setTrialTool);\n\n const busRef = useRef<EventBus | null>(null);\n if (busRef.current === null) busRef.current = createEventBus();\n const bus = busRef.current;\n\n const [layerVisibility, setLayerVisibility] = useState<Record<string, boolean>>({});\n const [layerOrder, setLayerOrder] = useState<string[] | null>(null);\n const [loupeOn, setLoupeOn] = useState(false);\n\n const visibleLayers = useMemo(\n () =>\n (instrument.canvas?.layers ?? [])\n .filter((l) => layerVisibility[l.id] !== false)\n .map((l) => l.id),\n [instrument.canvas, layerVisibility],\n );\n\n const undoCap = instrument.undo;\n const undoEvents = useMemo(() => new Set(undoCap?.snapshotOn ?? ['state.change']), [undoCap]);\n const maxDepth = undoCap?.maxDepth ?? 50;\n\n const snapshotIfNeeded = (event: string): void => {\n if (!undoCap || !undoEvents.has(event)) return;\n const current = store.getState().trials.find((w) => w.id === record.id);\n if (!current) return;\n const snap = structuredClone(current.state);\n updateTrialUndoStack(record.id, (prev) => pushSnapshot(prev, snap, maxDepth));\n };\n\n const setView = (v: unknown): void => updateTrialView(record.id, v);\n\n // A function `initialView` needs the canvas size, so `trialOps` leaves the\n // view null and the first measurement resolves it. Reset nulls it again,\n // which re-frames — so the guard is the null itself, not a \"have I run\" flag.\n const placeView = (size: ViewportSize): void => {\n const declared = instrument.canvas?.initialView;\n if (typeof declared !== 'function') return;\n if (record.view != null) return;\n setView(declared(size));\n };\n\n // The capability's own `targets` thunk, re-read on every call: a target\n // resizing or gaining a dependency must not need the store rebuilt. Held in\n // a ref because the store is built once and closes over it.\n const annotationsCap = instrument.annotations;\n const targetsRef = useRef<() => readonly AnnotationTargetInfo[]>(() => []);\n targetsRef.current = () =>\n annotationsCap ? annotationsCap.targets(record.state, record.config) : [];\n\n // One store for the trial's lifetime. Marks do not survive a reload yet —\n // the storage slot is 3d.\n const annotationsRef = useRef<ReturnType<typeof annotationsFromJSON> | null>(null);\n // Read through refs for the same reason `targets` is: the store is built\n // once, and an export must draw against the config the trial holds now.\n const configRef = useRef<unknown>(record.config);\n configRef.current = record.config;\n if (annotationsRef.current === null) {\n // Seeded from wherever the marks were kept: the instrument's own store if\n // it declared one, else this trial's slot.\n const kept = annotationsCap?.storage ? annotationsCap.storage.load() : record.annotations;\n annotationsRef.current = annotationsFromJSON(kept, () => targetsRef.current(), {\n meaning: annotationsCap?.meaning,\n config: () => configRef.current,\n onCapture: (result) => annotationsCap?.onCapture?.(result),\n });\n }\n const annotations = annotationsRef.current;\n\n // Written on a trailing debounce rather than per notification: a scene\n // mutates every frame of a drag, and a zustand write per frame re-renders\n // every trial in the lab. The unmount flush is not an optimization — the\n // last mark before a trial closes is otherwise lost.\n const saveCap = annotationsCap?.storage;\n const saveRef = useRef<(doc: unknown) => void>(() => {});\n saveRef.current = (doc) => {\n if (saveCap) saveCap.save(doc as never);\n else updateTrialAnnotations(record.id, doc);\n };\n // Only when the pair flips, which is rare: bumping React state on every\n // scene notification would re-render the trial on every frame of a drag,\n // which is the thing the debounce below exists to avoid.\n const [markMoves, setMarkMoves] = useState({ undo: false, redo: false });\n useEffect(() => {\n if (!annotationsCap) return;\n const read = (): void => {\n const next = { undo: annotations.canUndo(), redo: annotations.canRedo() };\n setMarkMoves((prev) => (prev.undo === next.undo && prev.redo === next.redo ? prev : next));\n };\n read();\n return annotations.subscribe(read);\n }, [annotations, annotationsCap]);\n\n useEffect(() => {\n if (!annotationsCap) return;\n let timer: ReturnType<typeof setTimeout> | null = null;\n let dirty = false;\n const flush = (): void => {\n if (!dirty) return;\n dirty = false;\n saveRef.current(annotations.toJSON());\n };\n const off = annotations.subscribe(() => {\n dirty = true;\n if (timer) clearTimeout(timer);\n timer = setTimeout(() => {\n timer = null;\n flush();\n }, 250);\n });\n return () => {\n off();\n if (timer) clearTimeout(timer);\n flush();\n };\n }, [annotations, annotationsCap]);\n\n // A trial gets its own slot when its instrument declares tools; otherwise it\n // reads the lab's. Which slot a change writes follows from the same thing.\n // Annotation tools are a trial's own for the same reason: two trials\n // annotating different pictures must not share one active tool.\n const declaresTools = instrument.tools != null || instrument.annotations != null;\n const resolvedToolId = declaresTools\n ? (record.activeToolId ??\n instrument.tools?.initial ??\n instrument.tools?.tools[0]?.id ??\n (instrument.annotations ? 'select' : null))\n : labToolId;\n const setActiveTool = (id: string): void => {\n if (declaresTools) setTrialTool(record.id, id);\n else setLabTool(id);\n };\n\n // `CanvasStack` and the zoom controls are 2D; a trial holding another view shape\n // gets the default here and simply never renders them.\n const view2d = as2DView(record.view);\n\n const jobCap = instrument.job;\n // Hooks cannot be conditional, so a trial without the capability still calls\n // this — with a runner that yields nothing and is never started.\n const job = useJob({\n capability: jobCap ?? { run: async function* () {}, onItem: (_i, st) => st },\n config: record.config,\n state: record.state,\n setState: (next) => updateTrialState(record.id, next as never),\n });\n\n const renderCtx: RenderContext<unknown, unknown> = {\n state: record.state,\n config: record.config,\n setState: (next) => {\n snapshotIfNeeded('state.change');\n updateTrialState(record.id, next);\n bus.emit('state.change');\n },\n setConfig: (key, value) => {\n const evt = `config.change:${String(key)}`;\n snapshotIfNeeded('config.change');\n snapshotIfNeeded(evt);\n updateTrialConfig(record.id, key as never, value as never);\n bus.emit('config.change');\n bus.emit(evt);\n },\n trial: {\n id: record.id,\n view: record.view,\n setView,\n zoom: view2d?.zoom ?? 1,\n setZoom: (z) => {\n if (!view2d) return;\n updateTrialView(record.id, { ...view2d, zoom: z });\n },\n activeToolId: resolvedToolId,\n visibleLayers,\n },\n emit: (event) => {\n snapshotIfNeeded(event);\n bus.emit(event);\n },\n job: jobCap ? job : undefined,\n };\n\n // Marks are undone through weasel history, not through labkit's snapshot\n // stack — the spec's rule, and the reason a mark scene is the truth. A trial\n // declaring both takes the marks first: the most recent thing the user did\n // is what undo is for, and only a mark change moves the mark history.\n const undoState = () => {\n const result = undoUndo(record.undoStack, structuredClone(record.state));\n if (!result) return;\n updateTrialState(record.id, result.snapshot as never);\n updateTrialUndoStack(record.id, result.stack);\n };\n const redoState = () => {\n const result = undoRedo(record.undoStack, structuredClone(record.state));\n if (!result) return;\n updateTrialState(record.id, result.snapshot as never);\n updateTrialUndoStack(record.id, result.stack);\n };\n\n const undoBindings: UndoBindings | undefined =\n undoCap || annotationsCap\n ? {\n canUndo: markMoves.undo || (undoCap ? record.undoStack.past.length > 0 : false),\n canRedo: markMoves.redo || (undoCap ? record.undoStack.future.length > 0 : false),\n undo: () => {\n if (annotationsCap && annotations.undo()) return;\n if (undoCap) undoState();\n },\n redo: () => {\n if (annotationsCap && annotations.redo()) return;\n if (undoCap) redoState();\n },\n }\n : undefined;\n\n const loupeCap = useMemo(() => {\n const declared = instrument.loupe;\n if (declared == null) return null;\n return resolveLoupe(typeof declared === 'function' ? declared(record.config) : declared);\n }, [instrument.loupe, record.config]);\n const loupeBindings: LoupeBindings | undefined = loupeCap\n ? { on: loupeOn, toggle: () => setLoupeOn((v) => !v) }\n : undefined;\n\n const canvasLayers: CanvasLayerDescriptor[] = useMemo(() => {\n if (!instrument.canvas) return [];\n const baseLayers = instrument.canvas.layers;\n const ordered = layerOrder\n ? [...baseLayers].sort((a, b) => layerOrder.indexOf(a.id) - layerOrder.indexOf(b.id))\n : baseLayers;\n return ordered.map((layer) => ({\n id: layer.id,\n visible: layerVisibility[layer.id] !== false,\n render: (ctx, view, frame) => {\n // Camera applied here, so a layer draws in world coordinates. `zoom`\n // stays in the args for line widths, which must not scale with it.\n applyCamera(ctx, view, frame);\n layer.draw(ctx, { state: record.state, config: record.config, zoom: view.zoom });\n },\n }));\n }, [instrument.canvas, record.state, record.config, layerVisibility, layerOrder]);\n\n const layerDescriptors: LayerDescriptor[] = useMemo(() => {\n if (!instrument.layers) return [];\n return instrument.layers.ids.map((l) => (typeof l === 'string' ? { id: l, label: l } : l));\n }, [instrument.layers]);\n\n const dragDropResult = useDragDrop({\n capability: instrument.dragDrop ?? { palette: [], onDrop: (_p, _i, s) => s },\n canvasContainerRef,\n view: view2d ?? DEFAULT_VIEW,\n worldSpec: instrument.canvas?.worldSpec,\n state: record.state,\n config: record.config,\n setState: (next) => {\n snapshotIfNeeded('canvas.itemAdded');\n updateTrialState(record.id, next as never);\n },\n emit: (evt) => {\n snapshotIfNeeded(evt);\n bus.emit(evt);\n },\n });\n\n const paletteItems: PaletteItem[] = useMemo(() => {\n if (!instrument.dragDrop) return [];\n const p = instrument.dragDrop.palette;\n return typeof p === 'function' ? p(record.state, record.config) : p;\n }, [instrument.dragDrop, record.state, record.config]);\n\n const layersWithFeedback: CanvasLayerDescriptor[] = useMemo(() => {\n if (!dragDropResult.drag?.feedback) return canvasLayers;\n const fb = dragDropResult.drag.feedback;\n const screen = dragDropResult.drag.screenPos;\n return [\n ...canvasLayers,\n {\n id: '__lk_drag_feedback',\n visible: true,\n render: (ctx) => {\n const el = canvasContainerRef.current;\n if (!el) return;\n const r = el.getBoundingClientRect();\n ctx.save();\n ctx.strokeStyle = fb.ok ? '#3a7' : '#c44';\n ctx.lineWidth = 2;\n ctx.beginPath();\n ctx.arc(screen.x - r.left, screen.y - r.top, 16, 0, Math.PI * 2);\n ctx.stroke();\n ctx.restore();\n },\n },\n ];\n }, [canvasLayers, dragDropResult.drag]);\n\n // The lens tracks the pointer over whatever box holds the content: the canvas\n // stack's own element, which it takes from context, or the wrapper below.\n const lens = loupeCap ? (\n <TrialLoupe\n capability={loupeCap}\n enabled={loupeOn}\n state={record.state}\n config={record.config}\n view={view2d ?? DEFAULT_VIEW}\n worldSpec={instrument.canvas?.worldSpec}\n hostRef={loupeHostRef}\n />\n ) : null;\n\n let body: ReactNode;\n if (instrument.canvas) {\n body = (\n <div ref={canvasContainerRef} className=\"lk-trial__canvas-host\">\n <CanvasStack\n layers={layersWithFeedback}\n view={view2d ?? DEFAULT_VIEW}\n onViewChange={setView}\n worldSpec={instrument.canvas.worldSpec}\n onResize={placeView}\n minZoom={instrument.canvas.minZoom}\n maxZoom={instrument.canvas.maxZoom}\n >\n {instrument.render(renderCtx)}\n {lens}\n </CanvasStack>\n <DragOverlay drag={dragDropResult.drag} />\n </div>\n );\n } else if (lens) {\n body = (\n <div ref={loupeHostRef} className=\"lk-trial__loupe-host\">\n {instrument.render(renderCtx)}\n {lens}\n </div>\n );\n } else {\n body = instrument.render(renderCtx);\n }\n\n const startDrag = dragDropResult.startDrag;\n const paletteNode = useMemo(\n () =>\n paletteItems.length > 0 ? <Palette items={paletteItems} onDragStart={startDrag} /> : null,\n [paletteItems, startDrag],\n );\n\n const layerListNode = useMemo(\n () =>\n instrument.layers && layerDescriptors.length > 0 ? (\n <LayerList\n layers={layerDescriptors}\n visibility={layerVisibility}\n onReorder={(next) => {\n setLayerOrder(next.map((l) => l.id));\n bus.emit('layers.reorder');\n }}\n onToggle={(lid, visible) => {\n setLayerVisibility((prev) => ({ ...prev, [lid]: visible }));\n bus.emit('layers.toggle');\n }}\n />\n ) : null,\n [instrument.layers, layerDescriptors, layerVisibility, bus],\n );\n\n const extraChrome = useMemo<TrialContribution[]>(() => {\n const out: TrialContribution[] = [];\n if (paletteNode) {\n out.push({\n id: 'dragdrop-palette',\n region: 'sidebar',\n item: { title: 'Parts', body: paletteNode },\n });\n }\n if (layerListNode) {\n out.push({\n id: 'layer-list',\n region: 'sidebar',\n item: { title: 'Layers', body: layerListNode },\n });\n }\n return out;\n }, [paletteNode, layerListNode]);\n\n // Rendered beside the body rather than inside it: an overlay portals itself\n // into the surface container, so where it sits in this tree decides only\n // when its effects run — after the instrument's refs have attached.\n const annotationOverlays = annotationsCap ? (\n <AnnotationTargets\n capability={annotationsCap}\n state={record.state}\n config={record.config}\n annotations={annotations}\n activeToolId={resolvedToolId}\n />\n ) : null;\n\n return (\n <TrialIdProvider trialId={record.id}>\n <AnnotationsContext.Provider value={annotationsCap ? annotations : null}>\n <TrialChrome\n job={jobCap ? job : undefined}\n loupe={loupeBindings}\n trialId={record.id}\n record={record}\n instrument={instrument}\n isLastTrial={isLast}\n undoBindings={undoBindings}\n trialChrome={extraChrome}\n chrome={chrome}\n suppress={suppress}\n activeToolId={resolvedToolId}\n setActiveTool={setActiveTool}\n >\n {body}\n {annotationOverlays}\n </TrialChrome>\n </AnnotationsContext.Provider>\n </TrialIdProvider>\n );\n}\n","import type { Instrument, InstrumentList } from '../instrument/types';\nimport type { TrialRecord } from '../state/types';\n\nconst DEFAULT_VIEW = { zoom: 1, pan: { x: 0, y: 0 } } as const;\n\nfunction findInstrument(instruments: InstrumentList, name: string): Instrument {\n const found = instruments.find((i) => i.name === name);\n if (!found) {\n throw new Error(`[labkit] Unknown instrument: \"${name}\"`);\n }\n return found;\n}\n\nfunction initialView(instrument: Instrument): TrialRecord['view'] {\n const declared = instrument.canvas?.initialView;\n // A function needs the canvas size, which no trial has at creation. `null`\n // is the unplaced marker; `Trial` resolves it on the first non-empty size.\n if (typeof declared === 'function') return null;\n return declared ? structuredClone(declared) : { ...DEFAULT_VIEW, pan: { ...DEFAULT_VIEW.pan } };\n}\n\n/** Append a new trial running `instrumentName`, at that instrument's\n * default config and initial state. */\nexport function addTrial(\n trials: TrialRecord[],\n instruments: InstrumentList,\n instrumentName: string,\n): TrialRecord[] {\n const instrument = findInstrument(instruments, instrumentName);\n const config = instrument.defaultConfig();\n const state = instrument.initialState(config);\n const record: TrialRecord = {\n id: crypto.randomUUID(),\n instrumentName,\n config,\n state,\n view: initialView(instrument),\n undoStack: { past: [], future: [] },\n };\n return [...trials, record];\n}\n\n/** Insert a deep copy of a trial directly after it. The copy starts with\n * an empty undo history — the original's is not shared. */\nexport function cloneTrial(trials: TrialRecord[], id: string): TrialRecord[] {\n const sourceIdx = trials.findIndex((w) => w.id === id);\n const source = trials[sourceIdx];\n if (!source) return trials;\n const clone: TrialRecord = {\n ...source,\n id: crypto.randomUUID(),\n config: structuredClone(source.config),\n state: structuredClone(source.state),\n view: structuredClone(source.view),\n undoStack: { past: [], future: [] },\n };\n return [...trials.slice(0, sourceIdx + 1), clone, ...trials.slice(sourceIdx + 1)];\n}\n\n/** Remove a trial, unless it is the last one — a lab always has at least\n * one. */\nexport function closeTrial(trials: TrialRecord[], id: string): TrialRecord[] {\n if (trials.length <= 1) return trials;\n const next = trials.filter((w) => w.id !== id);\n return next.length === trials.length ? trials : next;\n}\n\n/** Return a trial to its instrument's defaults, keeping its id and its\n * place in the list. */\nexport function resetTrial(\n trials: TrialRecord[],\n id: string,\n instruments: InstrumentList,\n): TrialRecord[] {\n const idx = trials.findIndex((w) => w.id === id);\n const current = trials[idx];\n if (!current) return trials;\n const instrument = findInstrument(instruments, current.instrumentName);\n const config = instrument.defaultConfig();\n const state = instrument.initialState(config);\n const reset: TrialRecord = {\n ...current,\n config,\n state,\n view: initialView(instrument),\n };\n return [...trials.slice(0, idx), reset, ...trials.slice(idx + 1)];\n}\n\n/**\n * Reorder to match `ids`. Ids the list doesn't mention keep their relative\n * order at the end, and ids it names that no longer exist are dropped — a\n * reorder that raced a close should not resurrect the closed trial.\n */\nexport function reorderTrials(trials: TrialRecord[], ids: readonly string[]): TrialRecord[] {\n const byId = new Map(trials.map((w) => [w.id, w]));\n const named = ids.map((id) => byId.get(id)).filter((w): w is TrialRecord => w !== undefined);\n const seen = new Set(named.map((w) => w.id));\n const rest = trials.filter((w) => !seen.has(w.id));\n return [...named, ...rest];\n}\n","import { AddIcon } from '@weasel-js/ui';\nimport { Select, ToggleBar } from '../passthrough/weasel-ui';\nimport type { LabMode } from '../state/types';\nimport { useLabContext } from './LabContext';\n\nconst MODES: { value: LabMode; label: string }[] = [\n { value: 'auto', label: 'Auto' },\n { value: 'light', label: 'Light' },\n { value: 'dark', label: 'Dark' },\n];\n\n/** The controls `<Lab>` puts in its header: add a trial, and choose the color\n * mode. Both drive `LabContext`, which carried them with no UI at all — so\n * every consumer rebuilt these two. Rendered before a consumer's own header\n * content, which still lands beside them. */\nexport function LabHeader() {\n const lab = useLabContext();\n const only = lab.instruments.length === 1 ? lab.instruments[0] : null;\n\n return (\n <>\n {only ? (\n <button\n type=\"button\"\n className=\"lk-lab-header__add\"\n onClick={() => lab.addTrial(only.name)}\n >\n <AddIcon size={16} />\n <span>Add trial</span>\n </button>\n ) : (\n // Held at null so the control stays an \"add one\" action rather than\n // reading as the current instrument.\n <Select\n className=\"lk-lab-header__add-select\"\n aria-label=\"Add trial\"\n placeholder=\"Add trial…\"\n selectedKey={null}\n options={lab.instruments.map((i) => ({ value: i.name, label: i.name }))}\n onSelectionChange={(name) => {\n if (name != null) lab.addTrial(String(name));\n }}\n />\n )}\n\n <ToggleBar\n className=\"lk-lab-header__mode\"\n ariaLabel=\"Color mode\"\n items={MODES}\n value={lab.mode}\n onChange={(next) => {\n if (next) lab.setMode(next);\n }}\n />\n </>\n );\n}\n","import { useContext } from 'react';\nimport { useStore } from 'zustand/react';\nimport { PaletteRegion } from '../chrome/regions/PaletteRegion';\nimport type { TrialChromeContext, TrialContribution } from '../chrome/types';\nimport { LabStoreContext } from '../state/context';\nimport type { TrialTool } from '../tools/types';\n\n/** Props for `<LabPalette>`. */\nexport interface LabPaletteProps {\n tools: readonly TrialTool[];\n}\n\n/** The lab's tool strip. Writes the lab's tool slot, which every trial whose\n * instrument declares no tools of its own resolves to. */\nexport function LabPalette({ tools }: LabPaletteProps) {\n const storeCtx = useContext(LabStoreContext);\n if (!storeCtx) throw new Error('[labkit] LabPalette requires <LabStoreProvider>');\n const activeToolId = useStore(storeCtx.store, (s) => s.activeToolId);\n const setLabTool = useStore(storeCtx.store, (s) => s.setLabTool);\n\n const contributions: TrialContribution[] = tools.map((t) => ({\n id: t.id,\n region: 'palette',\n group: t.group,\n item: { icon: t.icon, label: t.label, shortcut: t.shortcut },\n }));\n\n const ctx = {\n activeToolId,\n setActiveTool: setLabTool,\n } as unknown as TrialChromeContext;\n\n return <PaletteRegion contributions={contributions} ctx={ctx} />;\n}\n","import { useEffect, useState } from 'react';\nimport type { LabMode } from '../state/types';\n\nfunction query(): MediaQueryList | null {\n if (typeof window === 'undefined' || !window.matchMedia) return null;\n return window.matchMedia('(prefers-color-scheme: light)');\n}\n\n/**\n * Resolve a `LabMode` to the mode the theme resolver understands.\n *\n * `auto` is not a mode — it means \"read the OS\", live. An explicit choice\n * opts out of the subscription entirely.\n */\nexport function useResolvedMode(mode: LabMode): 'light' | 'dark' {\n const [system, setSystem] = useState<'light' | 'dark'>(() =>\n query()?.matches ? 'light' : 'dark',\n );\n\n useEffect(() => {\n if (mode !== 'auto') return;\n const mq = query();\n if (!mq) return;\n const onChange = (e: MediaQueryListEvent) => setSystem(e.matches ? 'light' : 'dark');\n mq.addEventListener('change', onChange);\n return () => mq.removeEventListener('change', onChange);\n }, [mode]);\n\n return mode === 'auto' ? system : mode;\n}\n","import { ThemeProvider, useThemeOptional } from '@weasel-js/theme/react';\nimport type { ReactNode } from 'react';\nimport type { LabMode } from '../state/types';\nimport { interstellarTheme } from '../theme/interstellar';\nimport { useResolvedMode } from './useSystemMode';\n\n/** Props for `<LabShell>`. */\nexport interface LabShellProps {\n title: string;\n children: ReactNode;\n /** Optional content rendered into the header (e.g., action buttons). */\n header?: ReactNode;\n /** Optional content rendered into the footer. */\n footer?: ReactNode;\n /** Color mode. \"auto\" (default) follows prefers-color-scheme. */\n mode?: LabMode;\n}\n\n/** Page frame for a lab: a titled header, a body, and an optional footer,\n * themed for the resolved color mode. Presentational only — use `<Lab>` when\n * the trial runtime is wanted too. */\nexport function LabShell({ title, children, header, footer, mode = 'auto' }: LabShellProps) {\n const resolved = useResolvedMode(mode);\n const outer = useThemeOptional();\n\n const shell = (\n <div className=\"lk-root lk-shell\">\n <header className=\"lk-shell-header\">\n <h1 className=\"lk-shell-title\">{title}</h1>\n {header && <div className=\"lk-shell-header-actions\">{header}</div>}\n </header>\n <main className=\"lk-shell-body\">{children}</main>\n {footer && <footer className=\"lk-shell-footer\">{footer}</footer>}\n </div>\n );\n\n // Inside <Lab> the theme is already applied on `.lk-lab`; wrapping again\n // would only add a div.\n return outer ? (\n shell\n ) : (\n <ThemeProvider theme={interstellarTheme} mode={resolved}>\n {shell}\n </ThemeProvider>\n );\n}\n","import {\n Children,\n type ReactNode,\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n} from 'react';\nimport { asNodeId, createNode, floatingStrategy, gridStrategy, type NodeId, Store } from 'windease';\nimport {\n type ChromeMap,\n Container,\n DragProvider,\n Provider,\n StrategyRegistryProvider,\n} from 'windease/react';\n\nimport { useSurfaceOptional } from '../surface/useSurfaceTile';\nimport { TrialDragContext } from '../trial/TrialDragContext';\nimport { usePanelHosts } from './panelHost';\n\nconst ZONE_ID = asNodeId('lk-workspace');\nconst STRATEGIES = { grid: gridStrategy as never, floating: floatingStrategy as never };\nconst FLOAT_ZONE_ID = asNodeId('lk-workspace-floating');\nconst PANEL_KIND = 'panel';\nconst KIND = 'trial';\n\n/** A tile's persisted extent, keyed by the id its caller gave it. Grid resizes\n * write `span`; `size` is here because a strategy swap would write that. */\nexport type TrialLayout = Record<\n string,\n { size?: { w?: number; h?: number }; span?: { cols?: number; rows?: number } }\n>;\n\nexport interface WorkspaceProps {\n children: ReactNode;\n /**\n * Stable id per child, positionally matched. Supply these whenever a tile\n * can be closed from the middle: without them a tile is identified by its\n * position, so closing one shifts every id after it and the panes inherit\n * each other's dragged extents. `layout` and `reorderable` both key off\n * these, so neither means much without them.\n */\n ids?: readonly string[];\n /** Draggable seams between tiles. Off by default — an even tiling is the\n * behavior every existing caller has. */\n resizable?: boolean;\n /** Let a tile be dragged to a new position. Off by default. The grid never\n * reorders `children` itself: it reports the order a drop would produce and\n * the caller commits it. */\n reorderable?: boolean;\n /** The full id list a drop would produce, in its new order. */\n onReorder?: (ids: string[]) => void;\n /** Extents from a previous session, applied to tiles as they register. */\n layout?: TrialLayout;\n /** Fires when a tile's extent changes. Persist it and hand it back as\n * `layout` to make a resize survive a reload. */\n onLayoutChange?: (layout: TrialLayout) => void;\n gap?: number;\n padding?: number;\n /** Undocked sidebar panels to render alongside the trials. A `'tile'` panel\n * joins the grid as a peer of the trials; a `'floating'` one goes into the\n * floating zone above it. The body is portalled in by the trial that owns\n * it, so all this renders is the frame and the host. */\n panels?: readonly PanelDescriptor[];\n /**\n * Fixed tiling extent. Omit in an app — the grid measures its own box. Supply\n * it where nothing measures, notably jsdom: at a zero measurement the grid\n * renders no tiles at all.\n */\n viewport?: { w: number; h: number };\n}\n\nfunction extentOf(store: Store, id: NodeId): TrialLayout[string] | null {\n const p = store.getNode(id)?.membership?.placement as TrialLayout[string] | undefined;\n if (!p) return null;\n const out: TrialLayout[string] = {};\n if (p.size) out.size = p.size;\n if (p.span) out.span = p.span;\n return Object.keys(out).length > 0 ? out : null;\n}\n\n/**\n * Auto-balanced tiling of trials, `ceil(sqrt(n))` columns wide.\n *\n * Tiles are absolutely positioned at the rects `gridStrategy` computes, not\n * laid out by CSS — `windease/styles.css` (folded into\n * `@weasel-js/labkit/styles.css`) carries the rules that positioning depends on.\n *\n * `panels` are undocked sidebar sections. A `'tile'` panel is registered as a\n * peer of the trials under `PANEL_KIND`, so the grid places and resizes it like\n * one; a `'floating'` panel goes in the overlay above. Either way this renders\n * only the frame and an empty host: the section's content is portalled in by\n * the trial that owns it, which is what keeps a torn-out section inside its\n * trial's React tree instead of rebuilding it as a sibling.\n */\n\n/** The frame an undocked panel gets: a box, and the host element its trial\n * portals into. The title and the dock control come through the portal with\n * the body — the workspace knows a panel's key, not what is in it. */\nfunction PanelFrame({ panel, floating = false }: { panel: PanelDescriptor; floating?: boolean }) {\n const hosts = usePanelHosts();\n return (\n <div className={floating ? 'lk-panel-tile lk-panel-tile--floating' : 'lk-panel-tile'}>\n <div className=\"lk-panel-tile__body\" ref={(el) => hosts?.set(panel.key, el)} />\n </div>\n );\n}\n\n/** One undocked panel, as the workspace needs to know it. */\nexport interface PanelDescriptor {\n /** Stable key; also the portal host key the owning trial writes into. */\n key: string;\n title: string;\n as: 'tile' | 'floating';\n}\n\nexport function Workspace({\n children,\n ids,\n panels,\n resizable = false,\n reorderable = false,\n onReorder,\n layout,\n onLayoutChange,\n gap = 12,\n padding = 0,\n viewport,\n}: WorkspaceProps) {\n const items = Children.toArray(children);\n const tilePanels = useMemo(() => (panels ?? []).filter((p) => p.as === 'tile'), [panels]);\n const floatPanels = useMemo(() => (panels ?? []).filter((p) => p.as === 'floating'), [panels]);\n // Identity has to be stable while the id *contents* are unchanged: the sync\n // effect below keys off it, and a fresh array every render would re-register\n // every tile forever. A ref keyed on the joined ids says that directly, where\n // a `useMemo` on the same key can only say it by suppressing both linters.\n const wantedIds = [\n ...items.map((_, i) => ids?.[i] ?? `lk-ws-${i}`),\n ...tilePanels.map((p) => `lk-panel-${p.key}`),\n ];\n const idKey = wantedIds.join(',');\n const idKeyRef = useRef<string | null>(null);\n const nodeIdsRef = useRef<NodeId[]>([]);\n if (idKeyRef.current !== idKey) {\n idKeyRef.current = idKey;\n nodeIdsRef.current = wantedIds.map(asNodeId);\n }\n const nodeIds = nodeIdsRef.current;\n\n // Held in refs rather than depended on: a fresh object each render would\n // re-run the sync effect, and only a newly registered tile reads `layout`.\n const layoutRef = useRef(layout);\n layoutRef.current = layout;\n const onLayoutChangeRef = useRef(onLayoutChange);\n onLayoutChangeRef.current = onLayoutChange;\n\n // One store for the component's lifetime: a tile's dragged extent lives in\n // its node, so rebuilding the store on every add or close would silently\n // reset every pane.\n const storeRef = useRef<Store | null>(null);\n if (storeRef.current === null) {\n const store = new Store();\n store.registerNode(\n createNode({\n kind: 'zone',\n id: ZONE_ID,\n container: { strategyId: 'grid', config: { resizable, gap, padding } },\n }),\n );\n store.registerNode(\n createNode({\n kind: 'zone',\n id: FLOAT_ZONE_ID,\n container: { strategyId: 'floating', config: {} },\n }),\n );\n storeRef.current = store;\n }\n const store = storeRef.current;\n\n // A tile that only moves reports nothing to a ResizeObserver, and only this\n // component knows the grid moved one. Optional: a lab may own no surface.\n const surface = useSurfaceOptional();\n\n useLayoutEffect(() => {\n store.updateContainerConfig(ZONE_ID, { resizable, gap, padding });\n }, [store, resizable, gap, padding]);\n\n useLayoutEffect(() => {\n const present = new Set(store.getContainerView(ZONE_ID)?.childOrder ?? []);\n const wanted = new Set(nodeIds);\n for (const id of present) {\n if (!wanted.has(id)) store.unregisterNode(id);\n }\n for (const id of nodeIds) {\n if (present.has(id)) continue;\n const kind = String(id).startsWith('lk-panel-') ? PANEL_KIND : KIND;\n store.registerNode(createNode({ kind, id, parentId: ZONE_ID, focus: true }));\n store.showNode(id);\n const saved = layoutRef.current?.[id];\n if (saved) store.patchPlacement(id, saved);\n }\n store.setChildOrder(ZONE_ID, [...nodeIds]);\n }, [store, nodeIds]);\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: nodeIds is the signal that the tile set changed — a re-tile moves tiles without resizing any — not a value this reads\n useEffect(() => {\n if (!surface) return;\n surface.invalidateRects();\n return store.events.on('node.placementChanged', () => surface.invalidateRects());\n }, [store, surface, nodeIds]); // eslint-disable-line react-hooks/exhaustive-deps\n\n useEffect(() => {\n if (!onLayoutChange) return;\n return store.events.on('node.placementChanged', () => {\n const next: TrialLayout = {};\n for (const child of store.getChildren(ZONE_ID)) {\n const extent = extentOf(store, child.id);\n if (extent) next[child.id] = extent;\n }\n onLayoutChangeRef.current?.(next);\n });\n }, [store, onLayoutChange]);\n\n const commitOrder = useCallback(\n (nextIds: NodeId[]) => onReorder?.(nextIds.map(String)),\n [onReorder],\n );\n\n const chrome = useMemo<ChromeMap>(() => {\n const byId = new Map<string, ReactNode>(nodeIds.map((id, i) => [id, items[i]]));\n const panelByNode = new Map<string, PanelDescriptor>(\n tilePanels.map((p) => [`lk-panel-${p.key}`, p]),\n );\n return {\n [PANEL_KIND]: ({ node }) => {\n const panel = panelByNode.get(String(node.id));\n if (!panel) return null;\n return <PanelFrame panel={panel} />;\n },\n [KIND]: ({ node }) => {\n const content = byId.get(node.id) ?? null;\n if (!reorderable) return content;\n return (\n // No grip strip: the trial's own title bar is the drag surface.\n <TrialDragContext.Provider value={{ nodeId: node.id }}>\n <div className=\"lk-trial-tile\">{content}</div>\n </TrialDragContext.Provider>\n );\n },\n };\n }, [nodeIds, items, reorderable, tilePanels]);\n\n const floatingLayer =\n floatPanels.length === 0 ? null : (\n <div className=\"lk-workspace__floating\">\n {floatPanels.map((p) => (\n <PanelFrame key={p.key} panel={p} floating />\n ))}\n </div>\n );\n\n const grid = (\n <Container\n parentId={ZONE_ID}\n chrome={chrome}\n className=\"lk-workspace windease-zone\"\n affordances={resizable}\n viewport={viewport}\n onChildOrderChange={reorderable ? commitOrder : undefined}\n />\n );\n\n return (\n <Provider store={store}>\n <StrategyRegistryProvider strategies={STRATEGIES}>\n {floatingLayer ? (\n // The floating layer insets against the workspace, so it needs a\n // positioned box around both. Without one it insets against the page\n // and lands over the lab header.\n <div className=\"lk-workspace-host\">\n {reorderable ? <DragProvider>{grid}</DragProvider> : grid}\n {floatingLayer}\n </div>\n ) : reorderable ? (\n <DragProvider>{grid}</DragProvider>\n ) : (\n grid\n )}\n </StrategyRegistryProvider>\n </Provider>\n );\n}\n","import { ThemeProvider } from '@weasel-js/theme/react';\nimport {\n type CSSProperties,\n type ReactNode,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { useStore } from 'zustand/react';\nimport type { TrialContribution } from '../chrome/types';\nimport type { ConfigRule, ControlRenderer } from '../config/types';\nimport type { InstrumentList } from '../instrument/types';\nimport { noneAdapter } from '../state/adapters';\nimport { LabStoreContext } from '../state/context';\nimport { createLabStore, type LabStore } from '../state/store';\nimport type { LabMode, StorageAdapter, TrialRecord } from '../state/types';\nimport { SurfaceCanvasContext, SurfaceContext } from '../surface/SurfaceContext';\nimport { useSurfaceCanvas, useSurfaceOptional } from '../surface/useSurfaceTile';\nimport { useTiledSurface } from '../surface/useTiledSurface';\nimport { interstellarTheme } from '../theme/interstellar';\nimport type { TrialTool } from '../tools/types';\nimport { Trial } from '../trial/Trial';\nimport {\n addTrial as addTrialOp,\n cloneTrial as cloneTrialOp,\n closeTrial as closeTrialOp,\n reorderTrials as reorderTrialsOp,\n resetTrial as resetTrialOp,\n} from '../trial/trialOps';\nimport { LabContext, type LabContextValue } from './LabContext';\nimport { LabHeader } from './LabHeader';\nimport { LabPalette } from './LabPalette';\nimport { LabShell } from './LabShell';\nimport { createPanelHostRegistry, PanelHostContext } from './panelHost';\nimport { useResolvedMode } from './useSystemMode';\nimport { type PanelDescriptor, type TrialLayout, Workspace } from './Workspace';\n\n/** Props for `<Lab>`. */\nexport interface LabProps {\n instruments: InstrumentList;\n defaultInstrument: string;\n storage?: StorageAdapter | null;\n storageKey?: string;\n mode?: LabMode;\n /**\n * Optional list of CSS colors used to compose the interstellar theme's\n * cosmic backdrop. Each color becomes one radial-gradient blob on the\n * dark void base. Order maps to a fixed spread of positions; extras wrap\n * around. Ignored unless the resolved mode is dark.\n */\n nebula?: readonly string[];\n title?: string;\n /** Rendered in the shell's footer, below the workspace. */\n footer?: ReactNode;\n /** Contributions added to every trial's chrome, after the instrument's own. */\n chrome?: readonly TrialContribution[];\n /** Built-in contribution ids to drop. Throws on an id that is not there. */\n suppress?: readonly string[];\n /** Tools offered lab-wide. A trial whose instrument declares none of its own\n * reflects and writes this slot. */\n tools?: readonly TrialTool[];\n /** Rules run over every instrument's config leaves, before labkit's own\n * inference — where a lab states a convention once instead of annotating\n * each field. Memoize or hoist. */\n configRules?: readonly ConfigRule[];\n /** Control overrides and app-defined kinds for every trial's settings panel.\n * Keys are config paths (checked first) or leaf kinds. Memoize or hoist. */\n controls?: Record<string, ControlRenderer>;\n children?: ReactNode;\n}\n\nfunction buildStore(\n instruments: InstrumentList,\n defaultInstrument: string,\n storage: StorageAdapter,\n storageKey: string,\n initialMode: LabMode,\n): LabStore {\n const store = createLabStore({ storageKey, storage, initialMode });\n if (store.getState().trials.length === 0) {\n const seeded = addTrialOp([], instruments, defaultInstrument);\n const record = seeded[0];\n if (record) {\n const { undoStack: _undoStack, ...rest } = record;\n store.getState().addTrial(rest);\n }\n }\n return store;\n}\n\n// Fixed spread of nebula blob positions / sizes / fall-off stops. Colors\n// supplied via the `nebula` prop are slotted into these slots in order;\n// callers passing more than 5 wrap around (intentional — keeps the look\n// readable and bounded).\nconst NEBULA_SLOTS = [\n { cx: '18%', cy: '30%', sx: '60%', sy: '80%', stop: '70%' },\n { cx: '78%', cy: '70%', sx: '55%', sy: '90%', stop: '65%' },\n { cx: '50%', cy: '50%', sx: '50%', sy: '70%', stop: '75%' },\n { cx: '12%', cy: '82%', sx: '50%', sy: '70%', stop: '70%' },\n { cx: '85%', cy: '18%', sx: '55%', sy: '80%', stop: '70%' },\n] as const;\n\nfunction buildNebula(colors: readonly string[]): string {\n const blobs = colors.map((c, i) => {\n const p = NEBULA_SLOTS[i % NEBULA_SLOTS.length];\n return `radial-gradient(ellipse ${p.sx} ${p.sy} at ${p.cx} ${p.cy}, color-mix(in srgb, ${c} 22%, transparent), transparent ${p.stop})`;\n });\n blobs.push('radial-gradient(ellipse at center, #0a0a18 0%, #02020a 100%)');\n return blobs.join(', ');\n}\n\n/** The lab runtime: creates the store, provides it, and renders one trial\n * per record in a grid. Each trial runs one of `instruments`. */\nexport function Lab({\n instruments,\n defaultInstrument,\n storage,\n storageKey,\n mode,\n nebula,\n title,\n footer,\n chrome,\n suppress,\n tools,\n configRules,\n controls,\n children,\n}: LabProps) {\n if (process.env.NODE_ENV !== 'production' && instruments.length === 0) {\n throw new Error('[labkit] <Lab> requires a non-empty `instruments` array');\n }\n\n const storeRef = useRef<LabStore | null>(null);\n if (storeRef.current === null) {\n storeRef.current = buildStore(\n instruments,\n defaultInstrument,\n storage ?? noneAdapter,\n storageKey ?? 'labkit',\n mode ?? 'auto',\n );\n }\n const store = storeRef.current;\n\n const trials = useStore(store, (s) => s.trials);\n const savedSnapshots = useStore(store, (s) => s.savedSnapshots);\n const modeValue = useStore(store, (s) => s.mode);\n const layout = useStore(store, (s) => s.layout);\n const undockedPanels = useStore(store, (s) => s.undockedPanels);\n\n // One registry for the lab's lifetime: a panel host is a DOM node the\n // workspace owns and the trial portals into, so it must outlive both ends of\n // a dock/undock without being rebuilt.\n const panelHostsRef = useRef<ReturnType<typeof createPanelHostRegistry> | null>(null);\n if (panelHostsRef.current === null) panelHostsRef.current = createPanelHostRegistry();\n\n // One shared drawing surface for the whole lab, anchored to the body — tile\n // rects compose against it, and every tile paints into the one buffer.\n // `Workspace` invalidates rects when the grid moves something a\n // ResizeObserver cannot see. A host that already owns a surface keeps it: a\n // lab embedded in a larger shared-surface app must not open a second GL\n // tenancy, and mounts no buffer of its own.\n const outerSurface = useSurfaceOptional();\n const outerCanvas = useSurfaceCanvas();\n const [ownCanvas, setOwnCanvas] = useState<HTMLCanvasElement | null>(null);\n const ownCanvasRef = useRef<HTMLCanvasElement | null>(null);\n const bufferRef = useRef({ w: 0, h: 0 });\n const surfaceRef = useRef<ReturnType<typeof useTiledSurface> | null>(null);\n\n // Sizing the buffer clears all of it, so every tile has to repaint — not\n // only the one whose move triggered the measurement.\n const onFrame = useCallback((frame: { size: { width: number; height: number }; dpr: number }) => {\n const c = ownCanvasRef.current;\n if (!c) return;\n const w = Math.round(frame.size.width * frame.dpr);\n const h = Math.round(frame.size.height * frame.dpr);\n if (bufferRef.current.w === w && bufferRef.current.h === h) return;\n bufferRef.current = { w, h };\n c.width = w;\n c.height = h;\n c.style.width = `${frame.size.width}px`;\n c.style.height = `${frame.size.height}px`;\n surfaceRef.current?.invalidateAll();\n }, []);\n\n const ownSurface = useTiledSurface({ onFrame });\n surfaceRef.current = ownSurface;\n const surface = outerSurface ?? ownSurface;\n const surfaceCanvas = outerSurface ? outerCanvas : ownCanvas;\n\n const workspacePanels = useMemo<PanelDescriptor[]>(\n () =>\n Object.entries(undockedPanels).map(([key, panel]) => ({\n key,\n title: panel.sectionId,\n as: panel.as,\n })),\n [undockedPanels],\n );\n const resolvedMode = useResolvedMode(modeValue);\n\n useEffect(() => {\n if (mode && mode !== store.getState().mode) {\n store.getState().setMode(mode);\n }\n }, [mode, store]);\n\n const contextValue = useMemo<LabContextValue>(() => {\n const replaceTrials = (next: TrialRecord[]): void => {\n const currentById = new Map(store.getState().trials.map((w) => [w.id, w]));\n const merged = next.map((w) => currentById.get(w.id) ?? w);\n store.setState({ trials: merged });\n // Trigger persistence flush via a tracked action.\n store.getState().setMode(store.getState().mode);\n };\n\n return {\n instruments,\n trials,\n addTrial: (instrumentName) => {\n const next = addTrialOp(store.getState().trials, instruments, instrumentName);\n replaceTrials(next);\n },\n cloneTrial: (id) => {\n const next = cloneTrialOp(store.getState().trials, id);\n replaceTrials(next);\n },\n closeTrial: (id) => {\n const next = closeTrialOp(store.getState().trials, id);\n replaceTrials(next);\n },\n reorderTrials: (ids) => {\n replaceTrials(reorderTrialsOp(store.getState().trials, ids));\n },\n resetTrial: (id) => {\n const next = resetTrialOp(store.getState().trials, id, instruments);\n const record = next.find((w) => w.id === id);\n if (!record) return;\n store.setState((s) => ({\n trials: s.trials.map((w) =>\n w.id === id\n ? { ...w, config: record.config, state: record.state, view: record.view }\n : w,\n ),\n }));\n store.getState().updateTrialView(id, record.view);\n },\n savedSnapshots,\n saveSnapshot: (trialId, name) => {\n const taken = store.getState().savedSnapshots.filter((s) => s.trialId === trialId).length;\n store.getState().saveSnapshot(trialId, name ?? `Snapshot ${taken + 1}`);\n },\n loadSnapshot: (trialId, snapshotId) => {\n store.getState().loadSnapshot(snapshotId, trialId);\n },\n deleteSnapshot: (snapshotId) => {\n store.getState().deleteSnapshot(snapshotId);\n },\n mode: modeValue,\n setMode: (m) => {\n store.getState().setMode(m);\n },\n configRules,\n controls,\n };\n }, [instruments, trials, savedSnapshots, modeValue, store, configRules, controls]);\n\n // Only override the backdrop in dark, where there is one to override.\n // Setting a CSS custom property is the sanctioned use of inline style.\n const backdropStyle =\n resolvedMode === 'dark' && nebula && nebula.length > 0\n ? ({ ['--wzl-backdrop' as string]: buildNebula(nebula) } as CSSProperties)\n : undefined;\n\n return (\n <LabStoreContext.Provider value={{ store }}>\n <LabContext.Provider value={contextValue}>\n <ThemeProvider\n theme={interstellarTheme}\n mode={resolvedMode}\n className=\"lk-lab\"\n style={backdropStyle}\n >\n <LabShell\n title={title ?? 'Labkit'}\n mode={modeValue}\n footer={footer}\n header={\n <>\n <LabHeader />\n {children}\n </>\n }\n >\n <PanelHostContext.Provider value={panelHostsRef.current}>\n <SurfaceContext.Provider value={surface}>\n <SurfaceCanvasContext.Provider value={surfaceCanvas}>\n <div\n className=\"lk-lab__body\"\n ref={outerSurface ? undefined : ownSurface.containerRef}\n >\n {outerSurface ? null : (\n // Above the trials and inert: the marks a tile paints have\n // to sit over the instrument's own DOM, and nothing on this\n // buffer takes input — each tile has its own input box.\n <canvas\n className=\"lk-lab__surface\"\n ref={(el) => {\n ownCanvasRef.current = el;\n setOwnCanvas(el);\n }}\n />\n )}\n {tools ? <LabPalette tools={tools} /> : null}\n <Workspace\n panels={workspacePanels}\n ids={trials.map((w) => w.id)}\n resizable\n reorderable\n onReorder={(ids) => contextValue.reorderTrials(ids)}\n layout={layout as TrialLayout}\n onLayoutChange={(next) => store.getState().setLayout(next)}\n >\n {trials.map((w) => (\n <Trial key={w.id} id={w.id} chrome={chrome} suppress={suppress} />\n ))}\n </Workspace>\n </div>\n </SurfaceCanvasContext.Provider>\n </SurfaceContext.Provider>\n </PanelHostContext.Provider>\n </LabShell>\n </ThemeProvider>\n </LabContext.Provider>\n </LabStoreContext.Provider>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../svg/src/types.ts","../../svg/src/transform.ts","../../svg/src/patterns.ts","../../svg/src/path-serializer.ts","../../svg/src/gradients.ts","../../svg/src/serialize.ts","../src/annotations/paint.ts","../src/annotations/staleness.ts","../src/annotations/drawOne.ts","../src/annotations/svgNodes.ts","../src/annotations/capture.ts","../src/annotations/frac.ts","../src/annotations/history.ts","../src/annotations/store.ts","../src/annotations/view.ts","../src/annotations/AnnotationOverlay.tsx","../src/annotations/AnnotationTargets.tsx","../src/config/builder.ts","../src/config/rules.ts","../src/config/resolve.ts","../src/lab/LabContext.ts","../src/config/useConfigSchema.ts","../src/instrument/defineInstrument.ts","../src/instrument/validateConfigSchema.ts","../../theme/src/generated/themes.ts","../../theme/src/theme.ts","../../theme/src/dtcg/color.ts","../../theme/src/dtcg/resolve.ts","../../theme/src/resolveTheme.ts","../../theme/src/applyTheme.ts","../../theme/src/react.tsx","../../theme/src/dtcg/types.ts","../../theme/src/dtcg/flatten.ts","../../theme/src/loadDTCG.ts","../src/theme/interstellar.tokens.json","../src/theme/interstellar.ts","../src/state/view.ts","../src/trial/TrialBody.tsx","../src/trial/TrialDragContext.ts","../src/trial/TrialTitleBar.tsx","../src/lab/panelHost.ts","../src/trial/UndockedSections.tsx","../src/trial/TrialChrome.tsx","../src/trial/Trial.tsx","../src/trial/trialOps.ts","../src/lab/LabHeader.tsx","../src/lab/LabPalette.tsx","../src/lab/useSystemMode.ts","../src/lab/LabShell.tsx","../src/lab/Workspace.tsx","../src/lab/Lab.tsx"],"names":["b","r","x","c","PATH_M","PATH_L","PATH_C","PATH_Q","PATH_Z","escapeAttr","boundsOfPath","p","k","w","h","asNodeId","f","v","jsx","Fragment","chain","useContext","createContext","useRef","useMemo","store","useEffect","jsxs","createPortal","useStore","useState","DEFAULT_VIEW","ZONE_ID","STRATEGIES","_","Store","createNode","useLayoutEffect","Container","Provider","StrategyRegistryProvider","useCallback"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Public types for `@weasel-js/svg`. The package exposes a flat,\n * discriminated-union node model (`SvgNode`) that mirrors the SVG element\n * tree but uses weasel-native leaf data (`Path`, `FillStyle`) for geometry and\n * paint.\n *\n * Parsing collapses every `transform=\"...\"` onto its descendants' geometry,\n * so the `SvgNode` tree returned from `parseSvg` never has a non-identity\n * group transform. Consumers may still construct groups with explicit\n * transforms before serializing, in which case the serializer emits a\n * single `matrix(a b c d e f)` on the `<g>`.\n */\n\nimport type { Path, FillStyle, Stroke, StyledRun, TextStyle } from '@weasel-js/core';\n\n/**\n * Opaque pass-through bag for namespaced XML content.\n *\n * weasel-svg does not interpret the contents — it only ensures that any\n * attributes or child elements in a *declared* XML namespace round-trip\n * losslessly through parse → serialize. Consumers (e.g. an app-specific\n * bridge layer) hang their domain semantics off this structure.\n *\n * Keyed by namespace prefix (the prefix is a write-time choice; the URI\n * is the canonical identifier and is supplied via `ParseOptions.namespaces`\n * / `SerializeOptions.namespaces`).\n */\nexport interface NamespaceMeta {\n [prefix: string]: {\n /** Local-name → string-value map for attributes in this namespace. */\n attrs?: Record<string, string>;\n /**\n * Child elements in this namespace, keyed by local name. Each entry\n * is an array because a namespace can host multiple sibling elements\n * with the same tag (e.g. `<wd:layer/><wd:layer/>`).\n */\n elements?: Record<string, NamespacedElement[]>;\n };\n}\n\n/** Opaque structured representation of a namespaced element. */\nexport interface NamespacedElement {\n /** Attribute local-name → string-value. */\n attrs: Record<string, string>;\n /** Text content, when the element contains only text (no child elements). */\n text?: string;\n /** Nested namespaced children, keyed by local name (recursive). */\n children?: Record<string, NamespacedElement[]>;\n}\n\n/**\n * 2x3 affine matrix in column-major form (SVG's `matrix(a b c d e f)`\n * order). Maps `[x', y'] = [a*x + c*y + e, b*x + d*y + f]`.\n */\nexport type Matrix = readonly [number, number, number, number, number, number];\n\n/** Identity matrix — useful as a default in tests / constructors. */\nexport const IDENTITY_MATRIX: Matrix = [1, 0, 0, 1, 0, 0];\n\n/**\n * FillStyle description in the SVG sense — either explicit `none`, a solid\n * color, or a reference to a weasel-native gradient `FillStyle`. Solid colors\n * are normalized to `#rrggbb` strings; opacity is carried separately so\n * `fill-opacity` and `stroke-opacity` round-trip cleanly.\n */\nexport type SvgPaint =\n | { kind: 'none' }\n | { kind: 'solid'; color: string; opacity?: number }\n | { kind: 'gradient'; paint: FillStyle };\n\n/** Stroke description: a paint plus structural line parameters. */\nexport interface SvgStroke {\n paint: SvgPaint;\n width: number;\n opacity?: number;\n /** `stroke-linecap`. Default per SVG spec is `'butt'`. */\n cap?: 'butt' | 'round' | 'square';\n /** `stroke-linejoin`. Default per SVG spec is `'miter'`. SVG's `arcs` / `miter-clip` map to `'miter'` with a warning. */\n join?: 'miter' | 'round' | 'bevel';\n /** `stroke-dasharray` as a flat number array. Odd-length inputs are doubled per SVG spec. */\n dash?: number[];\n /**\n * `stroke-miterlimit`. SVG's default is 4. Weasel's renderer defaults to\n * 10 (Canvas2D) when unset, so parsed strokes without an explicit\n * attribute may render with longer miters than the source SVG intended.\n */\n miterLimit?: number;\n /** `marker-start` / `marker-mid` / `marker-end`, as the bare `url(#id)` key. */\n markerStart?: string;\n markerMid?: string;\n markerEnd?: string;\n}\n\n/**\n * Leaf node: a path geometry plus fill/stroke. All other v1 shapes\n * (`<rect>`, `<ellipse>`, etc.) are lowered to this representation on\n * parse — `<rect>` uses weasel's `RectPath` fast-path subtype when\n * possible, everything else becomes a `PolygonPath`.\n */\nexport interface SvgPathNode {\n kind: 'path';\n path: Path;\n fill: SvgPaint;\n stroke?: SvgStroke;\n /** Element-level opacity (`opacity=\"...\"`), 0..1. */\n opacity?: number;\n /** Element-level rotation in **radians**, pivoting around the AABB\n * center of the underlying `path` geometry. Emitted as SVG\n * `transform=\"rotate(angleDegrees cx cy)\"`. */\n rotation?: number;\n /** Opaque per-element bag for declared namespaces. See `NamespaceMeta`. */\n meta?: NamespaceMeta;\n}\n\n/**\n * Group node: an SVG `<g>`. On parse, `transform` is always omitted (any\n * `transform` attribute is collapsed onto descendants' geometry). On\n * serialize, a non-identity `transform` is emitted as\n * `matrix(a b c d e f)`.\n */\nexport interface SvgGroupNode {\n kind: 'group';\n children: SvgNode[];\n transform?: Matrix;\n opacity?: number;\n /** Opaque per-element bag for declared namespaces. See `NamespaceMeta`. */\n meta?: NamespaceMeta;\n}\n\n/**\n * Width given to an external `<text>` that carries no `data-weasel-width`:\n * large enough that line wrapping never fires, since SVG text flows from a\n * baseline and the source says nothing about a box.\n *\n * It is a wrap sentinel, not a measurement. Anything that treats a text\n * node's width as geometry — a union AABB, a fit-clamp — has to recognize it\n * and substitute an estimate, or one text node swamps the whole file.\n */\nexport const UNBOUNDED_TEXT_WIDTH = 99999;\n\n/**\n * Text leaf node. Mirrors the kit's `TextPose` shape — a bounding box plus\n * text content, optional rich-text `runs` (per-range styling), and an\n * optional `TextStyle` for the node-wide defaults.\n *\n * Note on SVG text geometry: native `<text>` flows from a baseline; it\n * doesn't have width/height attributes. The serializer emits\n * `dominant-baseline=\"text-before-edge\"` so `y` is the top of the text\n * box, plus `data-weasel-width` / `data-weasel-height` so weasel's\n * explicit box dimensions round-trip losslessly. External SVG text\n * (lacking the data-* attrs) imports with estimated dimensions —\n * {@link UNBOUNDED_TEXT_WIDTH} and\n * `height = fontSize * lineHeight * (lineCount || 1)`.\n */\nexport interface SvgTextNode {\n kind: 'text';\n x: number;\n y: number;\n width: number;\n height: number;\n /** Plain text. When `runs` is set, `runsToPlainText(runs)` must equal `text`. */\n text: string;\n /** Optional per-range styling — same shape as `TextPose.runs`. */\n runs?: StyledRun[];\n /** Node-wide typography. Defaults applied at render time via `resolveTextStyle`. */\n style?: TextStyle;\n /**\n * Node-wide glyph paint, the `FillStyle` / `Stroke` a kit text node holds\n * in `data.fill` / `data.stroke`. Not `SvgPaint`, which is the path\n * nodes' shape — a text paint reaches the renderer through the runs, and\n * `StyledRun.fill` / `.stroke` override these per range.\n */\n fill?: FillStyle;\n stroke?: Stroke;\n /** Element-level opacity (`opacity=\"...\"`), 0..1. */\n opacity?: number;\n /** Element-level rotation in **radians**, pivoting around the unrotated\n * AABB center `(x + width/2, y + height/2)`. Emitted as SVG\n * `transform=\"rotate(angleDegrees cx cy)\"`. */\n rotation?: number;\n /** Opaque per-element bag for declared namespaces. See `NamespaceMeta`. */\n meta?: NamespaceMeta;\n}\n\n/**\n * Raster-image leaf — an SVG `<image>`. `href` is the element's `href` (or\n * legacy `xlink:href`) verbatim: an external URL or a `data:` URI. The\n * package neither fetches nor decodes it, so an external URL round-trips as\n * a reference and only resolves when something downstream loads it.\n *\n * SVG's `preserveAspectRatio` is not modeled; the box is taken literally.\n */\nexport interface SvgImageNode {\n kind: 'image';\n href: string;\n x: number;\n y: number;\n width: number;\n height: number;\n /** Element-level opacity (`opacity=\"...\"`), 0..1. */\n opacity?: number;\n /** Element-level rotation in **radians**, pivoting around the unrotated\n * AABB center `(x + width/2, y + height/2)`. Emitted as SVG\n * `transform=\"rotate(angleDegrees cx cy)\"`. */\n rotation?: number;\n /** Opaque per-element bag for declared namespaces. See `NamespaceMeta`. */\n meta?: NamespaceMeta;\n}\n\n/** Discriminated-union node — the leaf of the public tree. */\nexport type SvgNode = SvgPathNode | SvgGroupNode | SvgTextNode | SvgImageNode;\n\n/** Options for {@link parseSvg}. */\nexport interface ParseOptions {\n /**\n * Map of prefix → URI for XML namespaces the caller wants surfaced.\n * Attributes / child elements in any declared namespace are collected\n * into `SvgNode.meta` (per element) or `ParseResult.documentMeta` (root).\n * Undeclared namespaces are preserved in the DOM but not promoted into\n * the structured `meta` bag; they are silently dropped at serialize time.\n */\n namespaces?: Record<string, string>;\n}\n\n/** Output of {@link parseSvg}. */\nexport interface ParseResult {\n nodes: SvgNode[];\n /** Non-fatal notices (unsupported elements, unrecognized attributes). */\n warnings: string[];\n /**\n * Opaque per-document bag for declared namespaces. Holds root-level\n * namespaced attributes (`documentMeta.<prefix>.attrs`) and namespaced\n * root children (`documentMeta.<prefix>.elements`).\n */\n documentMeta?: NamespaceMeta;\n /** Root `viewBox` attribute, parsed from `\"x y width height\"`. */\n viewBox?: { x: number; y: number; width: number; height: number };\n /** Root `width` attribute, parsed as a unitless number when present. */\n width?: number;\n /** Root `height` attribute, parsed as a unitless number when present. */\n height?: number;\n /** Text content of the first `<title>` child of `<svg>`, when present. */\n title?: string;\n}\n\n/** Options for {@link serializeSvg}. */\nexport interface SerializeOptions {\n /**\n * Override the root `viewBox`. When omitted, the serializer computes\n * a tight bounding box from the supplied nodes.\n */\n viewBox?: { x: number; y: number; width: number; height: number };\n /**\n * Called for paint that can't be expressed in SVG and is dropped — a\n * conic gradient, or a pattern carrying a `TextureHandle` instead of a\n * `TilePatternSpec`. Without this the loss is silent.\n */\n onWarn?: (message: string) => void;\n /** Emit `width=\"...\"` on the root `<svg>`. */\n width?: number;\n /** Emit `height=\"...\"` on the root `<svg>`. */\n height?: number;\n /**\n * Emit `<title>...</title>` as the first child of the root `<svg>`. The\n * value is XML-escaped on output. Empty strings are skipped.\n */\n title?: string;\n /**\n * Map of prefix → URI for XML namespaces to declare on the root\n * `<svg>`. The serializer reads `documentMeta[prefix]` and\n * `node.meta[prefix]` to write the actual attributes and elements.\n */\n namespaces?: Record<string, string>;\n /**\n * Opaque per-document namespaced extras. Each `<prefix>.attrs` becomes\n * `<prefix>:<name>=\"...\"` attributes on the root `<svg>`. Each\n * `<prefix>.elements[localName]` becomes `<prefix>:<localName>...>`\n * children placed immediately before any geometry.\n */\n documentMeta?: NamespaceMeta;\n /** Pretty-print with newlines + indentation. Default `false`. */\n pretty?: boolean;\n}\n","/**\n * SVG transform attribute helpers. Parses the four primitive transform\n * functions weasel-svg supports (`matrix`, `translate`, `scale`, `rotate`)\n * into a single 2x3 affine matrix, and exposes the point/path mappers we\n * need to collapse `transform=` onto leaf geometry at parse time.\n */\n\nimport type { Matrix } from './types';\nimport { IDENTITY_MATRIX } from './types';\n\n/** Multiply two 2x3 affine matrices (a then b applied to a column vector). */\nexport function multiply(a: Matrix, b: Matrix): Matrix {\n // [a0 a2 a4] [b0 b2 b4]\n // [a1 a3 a5] [b1 b3 b5]\n return [\n a[0] * b[0] + a[2] * b[1],\n a[1] * b[0] + a[3] * b[1],\n a[0] * b[2] + a[2] * b[3],\n a[1] * b[2] + a[3] * b[3],\n a[0] * b[4] + a[2] * b[5] + a[4],\n a[1] * b[4] + a[3] * b[5] + a[5],\n ];\n}\n\n/** Apply a 2x3 affine to a 2D point. */\nexport function applyMatrix(m: Matrix, x: number, y: number): { x: number; y: number } {\n return { x: m[0] * x + m[2] * y + m[4], y: m[1] * x + m[3] * y + m[5] };\n}\n\n/** True if `m` is the identity within a small epsilon. */\nexport function isIdentity(m: Matrix, eps = 1e-9): boolean {\n return (\n Math.abs(m[0] - 1) < eps &&\n Math.abs(m[1]) < eps &&\n Math.abs(m[2]) < eps &&\n Math.abs(m[3] - 1) < eps &&\n Math.abs(m[4]) < eps &&\n Math.abs(m[5]) < eps\n );\n}\n\nconst NUM_RE = /[-+]?(?:\\d*\\.\\d+|\\d+\\.?)(?:[eE][-+]?\\d+)?/g;\n\nfunction readNumbers(s: string): number[] {\n const out: number[] = [];\n const matches = s.match(NUM_RE);\n if (!matches) return out;\n for (const m of matches) {\n const n = Number(m);\n if (Number.isFinite(n)) out.push(n);\n }\n return out;\n}\n\n/**\n * Parse an SVG `transform=\"...\"` string into a single 2x3 matrix.\n * Functions compose right-to-left in SVG's coordinate model: in\n * `transform=\"A B\"`, the rightmost function is applied first to a point's\n * local coordinates. We accumulate accordingly: `result = result * fn`.\n *\n * Unrecognized functions emit a warning via the optional callback and are\n * skipped (the rest of the transform list still applies).\n */\nexport function parseTransform(\n attr: string | null | undefined,\n onWarn?: (message: string) => void,\n): Matrix {\n if (!attr) return IDENTITY_MATRIX;\n let result: Matrix = IDENTITY_MATRIX;\n // Split into \"name(args)\" chunks.\n const fnRe = /([A-Za-z]+)\\s*\\(([^)]*)\\)/g;\n let match: RegExpExecArray | null;\n while ((match = fnRe.exec(attr)) !== null) {\n const name = match[1].toLowerCase();\n const nums = readNumbers(match[2]);\n let local: Matrix | null = null;\n if (name === 'matrix' && nums.length >= 6) {\n local = [nums[0], nums[1], nums[2], nums[3], nums[4], nums[5]];\n } else if (name === 'translate') {\n const tx = nums[0] ?? 0;\n const ty = nums[1] ?? 0;\n local = [1, 0, 0, 1, tx, ty];\n } else if (name === 'scale') {\n const sx = nums[0] ?? 1;\n const sy = nums.length >= 2 ? nums[1] : sx;\n local = [sx, 0, 0, sy, 0, 0];\n } else if (name === 'rotate') {\n const ang = ((nums[0] ?? 0) * Math.PI) / 180;\n const c = Math.cos(ang);\n const s = Math.sin(ang);\n const rot: Matrix = [c, s, -s, c, 0, 0];\n if (nums.length >= 3) {\n // rotate(angle, cx, cy) = translate(cx,cy) * rotate * translate(-cx,-cy)\n const cx = nums[1];\n const cy = nums[2];\n local = multiply(multiply([1, 0, 0, 1, cx, cy], rot), [1, 0, 0, 1, -cx, -cy]);\n } else {\n local = rot;\n }\n } else if (name === 'skewx' || name === 'skewy') {\n const ang = ((nums[0] ?? 0) * Math.PI) / 180;\n const t = Math.tan(ang);\n local = name === 'skewx' ? [1, 0, t, 1, 0, 0] : [1, t, 0, 1, 0, 0];\n } else {\n onWarn?.(`unsupported transform function: ${name}`);\n continue;\n }\n result = multiply(result, local);\n }\n return result;\n}\n\n/** Inverse of a 2x3 affine, or null when it is singular. */\nexport function invertMatrix(m: Matrix): Matrix | null {\n const det = m[0] * m[3] - m[1] * m[2];\n if (!Number.isFinite(det) || Math.abs(det) < 1e-12) return null;\n const a = m[3] / det, b = -m[1] / det, c = -m[2] / det, d = m[0] / det;\n return [a, b, c, d, -(a * m[4] + c * m[5]), -(b * m[4] + d * m[5])];\n}\n\n/**\n * Re-express an element's own `transform` in the frame its inherited `ctm`\n * maps into: `ctm * local * ctm⁻¹`.\n *\n * A leaf's geometry is baked through `ctm` at parse time, so its own\n * transform has to move with it. Decomposing the raw local matrix against\n * bounds that have already been through `ctm` compares two different\n * coordinate spaces, and a rotation inside a translated `<g>` fails to\n * decompose for no reason but the offset. A singular `ctm` has no inverse\n * and collapses the geometry anyway; the local matrix passes through.\n */\nexport function rebaseTransform(ctm: Matrix, local: Matrix): Matrix {\n const inv = invertMatrix(ctm);\n return inv ? multiply(multiply(ctm, local), inv) : local;\n}\n\n/** Try to factor `m` as \"rotation by theta about (cx, cy)\". Returns the\n * angle in radians when `m` is (within `eps`) a pure rotation about the\n * given pivot. Returns `null` otherwise.\n *\n * Pure rotation about (cx, cy) has the matrix form:\n * [ cos -sin cx - cx*cos + cy*sin ]\n * [ sin cos cy - cx*sin - cy*cos ]\n * i.e. m[0] = m[3] = cos, m[1] = -m[2] = sin, with a translation that\n * equals the pivot's \"rotate-then-translate-back\" residue. We reconstruct\n * theta from atan2(m[1], m[0]) and verify the rest.\n */\nexport function decomposeRotation(\n m: Matrix,\n cx: number,\n cy: number,\n eps = 1e-4,\n): number | null {\n const [a, b, c, d, e, f] = m;\n // Pure rotation requires a == d and b == -c.\n if (Math.abs(a - d) > eps) return null;\n if (Math.abs(b + c) > eps) return null;\n // Determinant must be 1 (no scale, no flip).\n const det = a * d - b * c;\n if (Math.abs(det - 1) > eps) return null;\n const theta = Math.atan2(b, a);\n // Verify translation = (cx - cx*cos + cy*sin, cy - cx*sin - cy*cos).\n const expectedE = cx - cx * a + cy * b;\n const expectedF = cy - cx * b - cy * a;\n if (Math.abs(e - expectedE) > eps) return null;\n if (Math.abs(f - expectedF) > eps) return null;\n return theta;\n}\n\n/** Best-effort rotational-component extraction for a general matrix (any\n * scale + rotation, ignoring translation). Used for parse-time warnings\n * on un-decomposable matrices: we can detect \"there is a rotation here\"\n * even if we won't preserve it as `node.rotation`. For a non-uniform\n * matrix the \"rotation\" is ambiguous; we report atan2(b, a) which\n * corresponds to where the +x basis vector points.\n */\nexport function rotationComponent(m: Matrix): number {\n return Math.atan2(m[1], m[0]);\n}\n\n/**\n * Format a matrix as an SVG `matrix(a b c d e f)` value. Returns `null`\n * when `m` is (effectively) the identity, so the caller can omit the\n * attribute entirely.\n */\nexport function formatMatrix(m: Matrix): string | null {\n if (isIdentity(m)) return null;\n return `matrix(${m.map((n) => trimNumber(n)).join(' ')})`;\n}\n\n/** Trim trailing zeros from a numeric value for compact SVG output. */\nexport function trimNumber(n: number): string {\n if (!Number.isFinite(n)) return '0';\n // Round to ~6 decimal places to avoid floating-point cruft.\n const r = Math.round(n * 1e6) / 1e6;\n if (Number.isInteger(r)) return String(r);\n return String(r);\n}\n","/**\n * Map between SVG `<pattern>` elements and weasel's `pattern` `FillStyle`.\n * The counterpart to `gradients.ts` for the other paint-server kind.\n *\n * The tile's shapes come from `tileGeometry` in core, so the vector form a\n * viewer sees is generated from the same description that rasterizes the GL\n * texture. Alongside them we write the spec itself onto a `data-weasel-tile`\n * attribute: any SVG consumer renders the shapes, and weasel reads the\n * attribute back to recover the exact spec rather than reverse-engineering\n * it from geometry.\n *\n * A pattern whose payload is a `TextureHandle` has no vector form — the\n * handle is a session-scoped registry key with no tile description behind\n * it — and exports as nothing, with a warning. Same treatment conic\n * gradients get.\n */\n\nimport { tileGeometry, type TileShape } from '@weasel-js/core/patterns-builtin';\nimport type { FillStyle, TilePatternSpec } from '@weasel-js/core';\nimport { collectElementsByTag } from './elements';\nimport { trimNumber } from './transform';\n\ntype PatternFill = Extract<FillStyle, { fill: 'pattern' }>;\n\n/** Collected pattern definitions, keyed by element id. */\nexport type PatternTable = Map<string, FillStyle>;\n\n/** Whether a pattern paint carries a serializable spec. */\nexport function patternSpecOf(paint: PatternFill): TilePatternSpec | null {\n return 'tile' in paint.pattern ? paint.pattern : null;\n}\n\nexport function patternXml(id: string, paint: PatternFill, onWarn?: (m: string) => void): string {\n const spec = patternSpecOf(paint);\n if (!spec) {\n onWarn?.('pattern fill carries a TextureHandle, which has no vector form — omitted from <defs>');\n return '';\n }\n const geometry = tileGeometry(spec);\n const body = geometry.shapes.map(shapeXml).join('');\n const origin = paint.origin ?? { x: 0, y: 0 };\n const attrs = [\n `id=\"${id}\"`,\n 'patternUnits=\"userSpaceOnUse\"',\n `width=\"${trimNumber(geometry.size)}\"`,\n `height=\"${trimNumber(geometry.size)}\"`,\n ];\n if (origin.x !== 0 || origin.y !== 0) {\n attrs.push(`x=\"${trimNumber(origin.x)}\"`, `y=\"${trimNumber(origin.y)}\"`);\n }\n attrs.push(`data-weasel-tile=\"${escapeAttr(JSON.stringify(spec))}\"`);\n return `<pattern ${attrs.join(' ')}>${body}</pattern>`;\n}\n\n/**\n * A single tile as a standalone `<svg>` document, sized to its own extent.\n * For UI that needs to show a tile outside a document — a picker swatch,\n * set as a repeating CSS `background-image` via a data URI. Shares the shape\n * mapper with `patternXml`, so a preview can't drift from what paints.\n */\nexport function tilePreviewSvg(spec: TilePatternSpec, background?: string): string {\n const geometry = tileGeometry(spec);\n const s = trimNumber(geometry.size);\n const bg = background\n ? `<rect width=\"${s}\" height=\"${s}\" fill=\"${background}\"/>`\n : '';\n return `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${s}\" height=\"${s}\" `\n + `viewBox=\"0 0 ${s} ${s}\">${bg}${geometry.shapes.map(shapeXml).join('')}</svg>`;\n}\n\n/** `tilePreviewSvg` packed as a `url(...)` value for CSS `background-image`. */\nexport function tilePreviewCssUrl(spec: TilePatternSpec, background?: string): string {\n return `url(\"data:image/svg+xml,${encodeURIComponent(tilePreviewSvg(spec, background))}\")`;\n}\n\nfunction shapeXml(shape: TileShape): string {\n switch (shape.kind) {\n case 'line':\n return `<line x1=\"${trimNumber(shape.x1)}\" y1=\"${trimNumber(shape.y1)}\" `\n + `x2=\"${trimNumber(shape.x2)}\" y2=\"${trimNumber(shape.y2)}\" `\n + `stroke=\"${shape.color}\" stroke-width=\"${trimNumber(shape.width)}\"/>`;\n case 'circle':\n return `<circle cx=\"${trimNumber(shape.cx)}\" cy=\"${trimNumber(shape.cy)}\" `\n + `r=\"${trimNumber(shape.r)}\" fill=\"${shape.color}\"/>`;\n case 'ellipse': {\n const deg = (shape.rotation * 180) / Math.PI;\n const transform = deg === 0\n ? ''\n : ` transform=\"rotate(${trimNumber(deg)} ${trimNumber(shape.cx)} ${trimNumber(shape.cy)})\"`;\n return `<ellipse cx=\"${trimNumber(shape.cx)}\" cy=\"${trimNumber(shape.cy)}\" `\n + `rx=\"${trimNumber(shape.rx)}\" ry=\"${trimNumber(shape.ry)}\" `\n + `fill=\"${shape.color}\"${transform}/>`;\n }\n case 'rect':\n return `<rect x=\"${trimNumber(shape.x)}\" y=\"${trimNumber(shape.y)}\" `\n + `width=\"${trimNumber(shape.width)}\" height=\"${trimNumber(shape.height)}\" `\n + `fill=\"${shape.color}\"/>`;\n default:\n return '';\n }\n}\n\n/** Read every `<pattern>` in the document back into pattern paints. */\nexport function collectPatterns(svg: Element, onWarn?: (m: string) => void): PatternTable {\n const out: PatternTable = new Map();\n for (const [id, el] of collectElementsByTag(svg, PATTERN_TAGS)) {\n const paint = readPattern(el, onWarn);\n if (paint) out.set(id, paint);\n }\n return out;\n}\n\nconst PATTERN_TAGS = new Set(['pattern']);\n\nfunction readPattern(el: Element, onWarn?: (m: string) => void): FillStyle | null {\n const raw = el.getAttribute('data-weasel-tile');\n if (!raw) {\n // A hand-authored pattern (Illustrator, Inkscape) holds arbitrary\n // geometry no `TilePatternSpec` can express. Recognizing it would mean\n // reverse-engineering a tile from its children; dropping it with a\n // warning is honest, and the element survives in the source file.\n onWarn?.(`<pattern id=\"${el.getAttribute('id')}\"> has no data-weasel-tile — unsupported pattern, dropped`);\n return null;\n }\n let spec: TilePatternSpec;\n try {\n spec = JSON.parse(raw) as TilePatternSpec;\n } catch {\n onWarn?.(`<pattern id=\"${el.getAttribute('id')}\"> has malformed data-weasel-tile — dropped`);\n return null;\n }\n if (typeof spec?.tile !== 'string' || typeof spec?.color !== 'string') {\n onWarn?.(`<pattern id=\"${el.getAttribute('id')}\"> data-weasel-tile is not a tile spec — dropped`);\n return null;\n }\n const x = parseFloat(el.getAttribute('x') ?? '0');\n const y = parseFloat(el.getAttribute('y') ?? '0');\n const paint: PatternFill = { fill: 'pattern', pattern: spec };\n if (x !== 0 || y !== 0) paint.origin = { x, y };\n return paint;\n}\n\nfunction escapeAttr(s: string): string {\n return s\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"');\n}\n","/**\n * Serialize a weasel `Path` to an SVG `d=` attribute string. `RectPath`\n * lowers to `M h v h Z`; `PolygonPath` walks the (commands, coords)\n * arrays, emitting one SVG command per kit command.\n *\n * Output uses absolute commands only and a small amount of whitespace\n * compression (no leading zeros stripped beyond what `Number.toString`\n * already does). Numbers are rounded to ~6 decimals via `trimNumber`.\n */\n\nimport {\n PATH_C, PATH_L, PATH_M, PATH_Q, PATH_Z,\n type Path,\n} from '@weasel-js/core';\nimport { trimNumber } from './transform';\n\n/** Serialize a weasel `Path` to an SVG `d=` attribute string. */\nexport function serializePathD(path: Path): string {\n if (path.kind === 'rect') {\n const { x, y, width, height } = path;\n return `M${trimNumber(x)} ${trimNumber(y)}h${trimNumber(width)}v${trimNumber(height)}h${trimNumber(-width)}Z`;\n }\n const cmds = path.commands;\n const xs = path.coords;\n const out: string[] = [];\n let ci = 0;\n for (let i = 0; i < cmds.length; i++) {\n const c = cmds[i];\n if (c === PATH_M) {\n out.push(`M${trimNumber(xs[ci])} ${trimNumber(xs[ci + 1])}`);\n ci += 2;\n } else if (c === PATH_L) {\n out.push(`L${trimNumber(xs[ci])} ${trimNumber(xs[ci + 1])}`);\n ci += 2;\n } else if (c === PATH_C) {\n out.push(\n `C${trimNumber(xs[ci])} ${trimNumber(xs[ci + 1])} ` +\n `${trimNumber(xs[ci + 2])} ${trimNumber(xs[ci + 3])} ` +\n `${trimNumber(xs[ci + 4])} ${trimNumber(xs[ci + 5])}`,\n );\n ci += 6;\n } else if (c === PATH_Q) {\n out.push(\n `Q${trimNumber(xs[ci])} ${trimNumber(xs[ci + 1])} ` +\n `${trimNumber(xs[ci + 2])} ${trimNumber(xs[ci + 3])}`,\n );\n ci += 4;\n } else if (c === PATH_Z) {\n out.push('Z');\n }\n }\n return out.join('');\n}\n","/**\n * Map between SVG `<linearGradient>` / `<radialGradient>` elements and\n * weasel's `FillStyle` gradient variants. Definitions are indexed by id\n * wherever in the document they appear, and looked up when a `fill` /\n * `stroke` attribute references one as `url(#id)`. On serialize, we\n * emit a fresh `<defs>` block with stable generated ids.\n */\n\nimport { getPaintKind, getMarker } from '@weasel-js/core';\nimport type { FillStyle, GradStop, GradientUnits, MarkerEntry } from '@weasel-js/core';\nimport { parsePaintAttr } from './color';\nimport { trimNumber } from './transform';\nimport { patternXml } from './patterns';\nimport { collectElementsByTag, type ElementTable } from './elements';\nimport { serializePathD } from './path-serializer';\n\n/** Collected gradient definitions, keyed by element id. */\nexport type GradientTable = Map<string, FillStyle>;\n\nconst GRADIENT_TAGS = new Set(['lineargradient', 'radialgradient']);\n\nconst XLINK_NS = 'http://www.w3.org/1999/xlink';\n\n/** Read every gradient definition in the document, keyed by element id. */\nexport function collectGradients(svg: Element, onWarn?: (m: string) => void): GradientTable {\n const out: GradientTable = new Map();\n const elements = collectElementsByTag(svg, GRADIENT_TAGS);\n for (const [id, el] of elements) {\n const paint = el.tagName.toLowerCase() === 'lineargradient'\n ? readLinearGradient(el, elements, onWarn)\n : readRadialGradient(el, elements, onWarn);\n if (paint) out.set(id, paint);\n }\n warnUnsupportedDefsChildren(svg, onWarn);\n return out;\n}\n\n/** Paint servers and `<marker>` aside, a `<defs>` child is something this\n * package does not model (`<clipPath>`, a `<use>` template). Say so once here. */\nfunction warnUnsupportedDefsChildren(svg: Element, onWarn?: (m: string) => void): void {\n if (!onWarn) return;\n const defs = svg.getElementsByTagName('defs');\n for (let d = 0; d < defs.length; d++) {\n const root = defs[d];\n for (let i = 0; i < root.children.length; i++) {\n const child = root.children[i];\n const tag = child.tagName.toLowerCase();\n if (GRADIENT_TAGS.has(tag) || tag === 'pattern' || tag === 'marker') continue;\n onWarn(`unsupported <defs> child: <${child.tagName}>`);\n }\n }\n}\n\n/**\n * The gradient a `href` / `xlink:href` attribute points at, or null. SVG lets\n * one gradient inherit another's stops and attributes this way, and authoring\n * tools lean on it heavily — a chain that isn't followed resolves to a\n * gradient with no stops, which paints nothing.\n */\nfunction hrefTarget(el: Element, elements: ElementTable): Element | null {\n const raw = el.getAttribute('href')\n ?? el.getAttributeNS(XLINK_NS, 'href')\n ?? el.getAttribute('xlink:href');\n if (!raw || !raw.startsWith('#')) return null;\n return elements.get(raw.slice(1)) ?? null;\n}\n\n/** An attribute's value on `el` or, when absent, on the gradient it inherits\n * from. `seen` breaks a reference cycle. */\nfunction inheritedAttr(\n el: Element, elements: ElementTable, name: string, seen: Set<Element> = new Set(),\n): string | null {\n if (el.hasAttribute(name)) return el.getAttribute(name);\n seen.add(el);\n const ref = hrefTarget(el, elements);\n if (!ref || seen.has(ref)) return null;\n return inheritedAttr(ref, elements, name, seen);\n}\n\n/** `el`'s own stops or, when it declares none, the stops it inherits. */\nfunction inheritedStops(\n el: Element, elements: ElementTable, onWarn?: (m: string) => void,\n seen: Set<Element> = new Set(),\n): GradStop[] {\n const own = readStops(el, onWarn);\n if (own.length > 0) return own;\n seen.add(el);\n const ref = hrefTarget(el, elements);\n if (!ref || seen.has(ref)) return own;\n return inheritedStops(ref, elements, onWarn, seen);\n}\n\n/** Parse a `stop-opacity` / offset value that may carry a `%` suffix. */\nfunction parseRatio(raw: string): number {\n const n = parseFloat(raw);\n if (!Number.isFinite(n)) return NaN;\n return raw.trimEnd().endsWith('%') ? n / 100 : n;\n}\n\nfunction readStops(el: Element, onWarn?: (m: string) => void): GradStop[] {\n const stops: GradStop[] = [];\n for (let i = 0; i < el.children.length; i++) {\n const c = el.children[i];\n if (c.tagName.toLowerCase() !== 'stop') continue;\n const offsetRaw = parseRatio(c.getAttribute('offset') ?? '0');\n const offset = Number.isFinite(offsetRaw) ? offsetRaw : 0;\n const colorAttr = c.getAttribute('stop-color') ?? '#000000';\n const parsed = parsePaintAttr(colorAttr);\n if (parsed && parsed.kind === 'solid') {\n const opacityAttr = c.getAttribute('stop-opacity');\n const own = opacityAttr != null ? parseRatio(opacityAttr) : NaN;\n const alpha = Number.isFinite(own) ? own : parsed.alpha;\n stops.push({ offset, color: alpha < 1 ? applyAlpha(parsed.color, alpha) : parsed.color });\n } else {\n onWarn?.(`gradient stop has unrecognized stop-color: ${colorAttr}`);\n stops.push({ offset, color: '#000000' });\n }\n }\n return stops;\n}\n\nfunction applyAlpha(hex: string, alpha: number): string {\n // Pack alpha into an 8-digit hex so it round-trips through weasel's\n // string-color storage. This is non-standard CSS hex but parses cleanly\n // back via our color.ts parser.\n const a = Math.max(0, Math.min(255, Math.round(alpha * 255)));\n return `${hex}${a.toString(16).padStart(2, '0')}`;\n}\n\n/** SVG `gradientUnits` → the kit's `GradientUnits`. SVG's default is\n * `objectBoundingBox`, which is what the attribute defaults above assume\n * (`x2=\"1\"`, `r=\"0.5\"`), so the two have to be read together. */\nfunction readGradientUnits(el: Element, elements: ElementTable): 'bounds' | 'world' {\n return inheritedAttr(el, elements, 'gradientUnits') === 'userSpaceOnUse' ? 'world' : 'bounds';\n}\n\n/** `gradientTransform` has no slot in the kit's gradient model, so a gradient\n * carrying one paints in the wrong place rather than not at all. */\nfunction warnGradientTransform(\n el: Element, elements: ElementTable, onWarn?: (m: string) => void,\n): void {\n const t = inheritedAttr(el, elements, 'gradientTransform');\n if (t != null && t.trim() !== '') {\n onWarn?.(`gradientTransform=\"${t}\" is not modeled; the gradient paints untransformed`);\n }\n}\n\nfunction num(raw: string | null, fallback: number): number {\n if (raw == null) return fallback;\n const n = parseRatio(raw);\n return Number.isFinite(n) ? n : fallback;\n}\n\nfunction readLinearGradient(\n el: Element, elements: ElementTable, onWarn?: (m: string) => void,\n): FillStyle | null {\n warnGradientTransform(el, elements, onWarn);\n return {\n fill: 'linear-gradient',\n from: {\n x: num(inheritedAttr(el, elements, 'x1'), 0),\n y: num(inheritedAttr(el, elements, 'y1'), 0),\n },\n to: {\n x: num(inheritedAttr(el, elements, 'x2'), 1),\n y: num(inheritedAttr(el, elements, 'y2'), 0),\n },\n stops: inheritedStops(el, elements, onWarn),\n units: readGradientUnits(el, elements),\n };\n}\n\nfunction readRadialGradient(\n el: Element, elements: ElementTable, onWarn?: (m: string) => void,\n): FillStyle | null {\n warnGradientTransform(el, elements, onWarn);\n return {\n fill: 'radial-gradient',\n center: {\n x: num(inheritedAttr(el, elements, 'cx'), 0.5),\n y: num(inheritedAttr(el, elements, 'cy'), 0.5),\n },\n radius: num(inheritedAttr(el, elements, 'r'), 0.5),\n stops: inheritedStops(el, elements, onWarn),\n units: readGradientUnits(el, elements),\n };\n}\n\n/**\n * Pre-pass that assigns stable serialization ids to the paint servers —\n * gradients and patterns — used by any leaf in the tree. We key on object\n * identity so two leaves sharing the exact same `FillStyle` reference reuse\n * one `<defs>` entry; structurally equal but distinct objects get separate\n * ids.\n */\nexport class PaintServerRegistry {\n private byPaint = new Map<FillStyle, string>();\n private order: FillStyle[] = [];\n private counter = 0;\n\n // Marker keys referenced by any stroke, in first-use order. The `<defs>`\n // id is the marker key itself, not a minted counter id: `parseSvg` reads a\n // `marker-end=\"url(#id)\"` fragment back as the marker key directly (it\n // never inspects the `<marker>` element), so a synthetic id would come\n // back unresolvable and warn on round-trip.\n private markerKeys: string[] = [];\n private markerKeySet = new Set<string>();\n\n register(paint: FillStyle): string {\n const existing = this.byPaint.get(paint);\n if (existing) return existing;\n const id = paint.fill === 'pattern' ? `pat${this.counter++}` : `grad${this.counter++}`;\n this.byPaint.set(paint, id);\n this.order.push(paint);\n return id;\n }\n\n /** The `<defs>` id for a marker key — the key itself, minting nothing.\n * `undefined` when nothing is registered under `key`, so a caller emits no\n * attribute at all rather than a `url(#…)` pointing at a def that will\n * never be written. */\n markerId(key: string): string | undefined {\n if (getMarker(key) === undefined) return undefined;\n if (!this.markerKeySet.has(key)) {\n this.markerKeySet.add(key);\n this.markerKeys.push(key);\n }\n return key;\n }\n\n /** Emit `<defs>...</defs>` XML for every registered paint server and marker. */\n toDefsXml(onWarn?: (m: string) => void): string {\n if (this.order.length === 0 && this.markerKeys.length === 0) return '';\n const parts: string[] = ['<defs>'];\n for (const paint of this.order) {\n parts.push(paintServerXml(this.byPaint.get(paint)!, paint, onWarn));\n }\n for (const key of this.markerKeys) {\n const entry = getMarker(key);\n if (!entry) continue;\n parts.push(entry.toSvg ? entry.toSvg(key, entry) : defaultMarkerXml(key, entry));\n }\n parts.push('</defs>');\n return parts.join('');\n }\n}\n\n/** The `<marker>` def for an entry with no `toSvg` of its own. */\nfunction defaultMarkerXml(id: string, entry: MarkerEntry): string {\n const path = entry.path({ size: 1, stroke: { paint: { fill: 'solid', color: '#000' } } });\n const d = serializePathD(path);\n const fill = entry.fill === 'none' ? 'none' : 'context-stroke';\n const outline = entry.outline\n ? ` stroke=\"context-stroke\" stroke-width=\"${entry.outline.width}\" stroke-linecap=\"round\" stroke-linejoin=\"round\"`\n : '';\n // `overflow=\"visible\"` overrides the UA default of `hidden`, which would\n // otherwise clip the arrowhead to the marker's viewport.\n return (\n `<marker id=\"${id}\" markerUnits=\"strokeWidth\" markerWidth=\"8\" markerHeight=\"8\"` +\n ` refX=\"0\" refY=\"0\" orient=\"auto\" overflow=\"visible\">` +\n `<path d=\"${d}\" fill=\"${fill}\"${outline}/></marker>`\n );\n}\n\n/** One paint server's `<defs>` entry: the built-in mapping, else the kind's\n * own `toSvg`, else nothing plus a warning. The referencing element already\n * carries `fill=\"url(#id)\"`, so a silent omission is a dangling reference and\n * the shape vanishes in a viewer. */\nfunction paintServerXml(id: string, paint: FillStyle, onWarn?: (m: string) => void): string {\n if (paint.fill === 'pattern') return patternXml(id, paint, onWarn);\n const builtin = gradientXml(id, paint);\n if (builtin) return builtin;\n const custom = getPaintKind(paint.fill)?.toSvg?.(id, paint);\n if (custom) return custom;\n onWarn?.(`${paint.fill} fill has no vector form — omitted from <defs>`);\n return '';\n}\n\n/** `GradientUnits` → SVG `gradientUnits`. `'screen'` (the kit's default, and\n * a viewport-fixed wash) has no SVG analog at all; it lowers to user space,\n * which at least puts the paint somewhere the geometry is. */\nfunction gradientUnitsAttr(units: GradientUnits | undefined): string {\n return units === 'bounds' ? 'objectBoundingBox' : 'userSpaceOnUse';\n}\n\nfunction gradientXml(id: string, paint: FillStyle): string {\n if (paint.fill === 'linear-gradient') {\n const stops = paint.stops.map(stopXml).join('');\n return (\n `<linearGradient id=\"${id}\" gradientUnits=\"${gradientUnitsAttr(paint.units)}\" ` +\n `x1=\"${trimNumber(paint.from.x)}\" y1=\"${trimNumber(paint.from.y)}\" ` +\n `x2=\"${trimNumber(paint.to.x)}\" y2=\"${trimNumber(paint.to.y)}\">${stops}</linearGradient>`\n );\n }\n if (paint.fill === 'radial-gradient') {\n const stops = paint.stops.map(stopXml).join('');\n return (\n `<radialGradient id=\"${id}\" gradientUnits=\"${gradientUnitsAttr(paint.units)}\" ` +\n `cx=\"${trimNumber(paint.center.x)}\" cy=\"${trimNumber(paint.center.y)}\" ` +\n `r=\"${trimNumber(paint.radius)}\">${stops}</radialGradient>`\n );\n }\n return '';\n}\n\nfunction stopXml(s: GradStop): string {\n // Detect packed-alpha hex (#rrggbbaa) and split out stop-opacity.\n const m = /^#([0-9a-f]{6})([0-9a-f]{2})$/i.exec(s.color);\n if (m) {\n const alpha = parseInt(m[2], 16) / 255;\n return `<stop offset=\"${trimNumber(s.offset)}\" stop-color=\"#${m[1].toLowerCase()}\" stop-opacity=\"${trimNumber(alpha)}\"/>`;\n }\n return `<stop offset=\"${trimNumber(s.offset)}\" stop-color=\"${s.color}\"/>`;\n}\n","/**\n * Serialize a `SvgNode[]` tree to an SVG document string. Every leaf is\n * emitted as a `<path>` (even shapes that started as `<rect>` etc.) —\n * lossless geometry round-trip beats round-tripping the element-kind\n * label. Gradient paints are gathered into a single `<defs>` block.\n */\n\nimport type { Path, Stroke } from '@weasel-js/core';\nimport { boundsOfPath, resolveStrokeWidth, SCRIPT_METRICS } from '@weasel-js/core';\nimport type {\n Matrix, NamespaceMeta, NamespacedElement, SerializeOptions, SvgGroupNode,\n SvgNode, SvgPaint, SvgPathNode, SvgStroke, SvgTextNode, SvgImageNode,\n} from './types';\nimport { IDENTITY_MATRIX } from './types';\nimport { serializePathD } from './path-serializer';\nimport { formatMatrix, multiply, trimNumber } from './transform';\nimport { PaintServerRegistry } from './gradients';\n\n/**\n * Walk the tree and produce an SVG document string. The root `<svg>`'s\n * `viewBox` is taken from `opts.viewBox` if supplied, otherwise computed\n * as a tight bounding box around every leaf.\n */\nexport function serializeSvg(nodes: SvgNode[], opts: SerializeOptions = {}): string {\n const registry = new PaintServerRegistry();\n registerPaintServers(nodes, registry);\n\n const bounds = opts.viewBox ?? computeBounds(nodes);\n const vb = `${trimNumber(bounds.x)} ${trimNumber(bounds.y)} ${trimNumber(bounds.width)} ${trimNumber(bounds.height)}`;\n const namespaces = opts.namespaces ?? {};\n\n const rootAttrs: string[] = [`xmlns=\"http://www.w3.org/2000/svg\"`];\n for (const [prefix, uri] of Object.entries(namespaces)) {\n rootAttrs.push(`xmlns:${prefix}=\"${escapeAttr(uri)}\"`);\n }\n rootAttrs.push(`viewBox=\"${vb}\"`);\n if (opts.width != null) rootAttrs.push(`width=\"${trimNumber(opts.width)}\"`);\n if (opts.height != null) rootAttrs.push(`height=\"${trimNumber(opts.height)}\"`);\n // documentMeta attrs onto the root, in declared-namespace order.\n if (opts.documentMeta) {\n for (const prefix of Object.keys(namespaces)) {\n const bucket = opts.documentMeta[prefix];\n if (!bucket?.attrs) continue;\n for (const [name, value] of Object.entries(bucket.attrs)) {\n rootAttrs.push(`${prefix}:${name}=\"${escapeAttr(value)}\"`);\n }\n }\n }\n\n // documentMeta elements after <defs>, before geometry body.\n let docMetaXml = '';\n if (opts.documentMeta) {\n for (const prefix of Object.keys(namespaces)) {\n const bucket = opts.documentMeta[prefix];\n if (!bucket?.elements) continue;\n for (const [localName, list] of Object.entries(bucket.elements)) {\n for (const el of list) docMetaXml += namespacedElementXml(prefix, localName, el);\n }\n }\n }\n\n const defsXml = registry.toDefsXml(opts.onWarn);\n const bodyXml = nodes.map((n) => nodeXml(n, registry, namespaces)).join('');\n\n // `<title>` goes immediately inside `<svg>` per SVG-spec convention; it's\n // an accessibility hook and (for our purposes) a stable place to round-trip\n // the user-visible document title.\n const titleXml = opts.title && opts.title.length > 0\n ? `<title>${escapeText(opts.title)}</title>`\n : '';\n\n return `<svg ${rootAttrs.join(' ')}>${titleXml}${defsXml}${docMetaXml}${bodyXml}</svg>`;\n}\n\nfunction namespacedElementXml(prefix: string, localName: string, el: NamespacedElement): string {\n const attrs: string[] = [];\n for (const [name, value] of Object.entries(el.attrs)) {\n attrs.push(`${name}=\"${escapeAttr(value)}\"`);\n }\n const head = attrs.length > 0 ? `<${prefix}:${localName} ${attrs.join(' ')}>` : `<${prefix}:${localName}>`;\n let body = '';\n if (el.children) {\n for (const [childName, list] of Object.entries(el.children)) {\n for (const child of list) body += namespacedElementXml(prefix, childName, child);\n }\n } else if (el.text != null) {\n body = escapeText(el.text);\n }\n return `${head}${body}</${prefix}:${localName}>`;\n}\n\nfunction metaAttrsXml(meta: NamespaceMeta | undefined, namespaces: Record<string, string>): string {\n if (!meta) return '';\n const parts: string[] = [];\n for (const prefix of Object.keys(namespaces)) {\n const bucket = meta[prefix];\n if (!bucket?.attrs) continue;\n for (const [name, value] of Object.entries(bucket.attrs)) {\n parts.push(`${prefix}:${name}=\"${escapeAttr(value)}\"`);\n }\n }\n return parts.length > 0 ? ` ${parts.join(' ')}` : '';\n}\n\nfunction metaElementsXml(meta: NamespaceMeta | undefined, namespaces: Record<string, string>): string {\n if (!meta) return '';\n let out = '';\n for (const prefix of Object.keys(namespaces)) {\n const bucket = meta[prefix];\n if (!bucket?.elements) continue;\n for (const [localName, list] of Object.entries(bucket.elements)) {\n for (const el of list) out += namespacedElementXml(prefix, localName, el);\n }\n }\n return out;\n}\n\nfunction registerPaintServers(nodes: SvgNode[], registry: PaintServerRegistry): void {\n for (const n of nodes) {\n if (n.kind === 'group') {\n registerPaintServers(n.children, registry);\n } else if (n.kind === 'path') {\n if (n.fill.kind === 'gradient') registry.register(n.fill.paint);\n if (n.stroke && n.stroke.paint.kind === 'gradient') registry.register(n.stroke.paint.paint);\n registerMarkers(n.stroke, registry);\n } else if (n.kind === 'text') {\n // Text paints flow through `style` / `runs` rather than a top-level\n // SvgPaint, so register direct FillStyle references when present. This\n // pre-pass is load-bearing: `<defs>` is emitted before the body, so a\n // paint first seen while writing an element would be referenced by an\n // id that no definition backs.\n registerTextPaint(n.fill, registry);\n registerTextPaint(n.stroke?.paint, registry);\n registerMarkers(n.stroke, registry);\n for (const run of n.runs ?? []) {\n registerTextPaint(run.fill, registry);\n registerTextPaint(run.stroke?.paint, registry);\n }\n }\n }\n}\n\n/** Register one text paint if it is a paint server rather than a colour. */\nfunction registerTextPaint(\n paint: import('@weasel-js/core').FillStyle | undefined,\n registry: PaintServerRegistry,\n): void {\n if (paint && !('color' in paint)) registry.register(paint);\n}\n\n/** A marker reference in either shape — `SvgStroke` stores a bare key, the kit\n * `Stroke` stores a `MarkerRef`. */\nfunction markerKeyOfRef(ref: unknown): string | undefined {\n if (typeof ref === 'string') return ref;\n if (ref && typeof ref === 'object' && 'key' in ref) return String((ref as { key: string }).key);\n return undefined;\n}\n\n/** Mint a `<defs>` id for every marker a stroke names, before the body is\n * written — same reason as the paint pre-pass above. */\nfunction registerMarkers(\n stroke: { markerStart?: unknown; markerMid?: unknown; markerEnd?: unknown } | undefined,\n registry: PaintServerRegistry,\n): void {\n if (!stroke) return;\n for (const ref of [stroke.markerStart, stroke.markerMid, stroke.markerEnd]) {\n const key = markerKeyOfRef(ref);\n if (key) registry.markerId(key);\n }\n}\n\nfunction nodeXml(node: SvgNode, registry: PaintServerRegistry, namespaces: Record<string, string>): string {\n if (node.kind === 'group') return groupXml(node, registry, namespaces);\n if (node.kind === 'text') return textXml(node, registry, namespaces);\n if (node.kind === 'image') return imageXml(node, namespaces);\n return pathXml(node, registry, namespaces);\n}\n\n/**\n * Emit an `<image>`. `preserveAspectRatio=\"none\"` is unconditional: the node\n * carries a literal box and nothing else, so letting a viewer letterbox it\n * would place the pixels somewhere the model never said.\n */\nfunction imageXml(node: SvgImageNode, namespaces: Record<string, string>): string {\n const attrs: string[] = [\n `href=\"${escapeAttr(node.href)}\"`,\n `x=\"${trimNumber(node.x)}\"`,\n `y=\"${trimNumber(node.y)}\"`,\n `width=\"${trimNumber(node.width)}\"`,\n `height=\"${trimNumber(node.height)}\"`,\n `preserveAspectRatio=\"none\"`,\n ];\n if (node.opacity != null && node.opacity !== 1) {\n attrs.push(`opacity=\"${trimNumber(node.opacity)}\"`);\n }\n if (node.rotation != null && node.rotation !== 0) {\n const cx = node.x + node.width / 2;\n const cy = node.y + node.height / 2;\n const deg = (node.rotation * 180) / Math.PI;\n attrs.push(`transform=\"rotate(${trimNumber(deg)} ${trimNumber(cx)} ${trimNumber(cy)})\"`);\n }\n const metaAttrs = metaAttrsXml(node.meta, namespaces);\n const metaEls = metaElementsXml(node.meta, namespaces);\n if (metaEls) return `<image ${attrs.join(' ')}${metaAttrs}>${metaEls}</image>`;\n return `<image ${attrs.join(' ')}${metaAttrs}/>`;\n}\n\nfunction groupXml(node: SvgGroupNode, registry: PaintServerRegistry, namespaces: Record<string, string>): string {\n const attrs: string[] = [];\n if (node.transform) {\n const m = formatMatrix(node.transform);\n if (m) attrs.push(`transform=\"${m}\"`);\n }\n if (node.opacity != null && node.opacity !== 1) {\n attrs.push(`opacity=\"${trimNumber(node.opacity)}\"`);\n }\n const metaAttrs = metaAttrsXml(node.meta, namespaces);\n // `metaAttrs` already starts with a leading space (or is empty), so we\n // can splice it after the existing attr list without extra logic.\n const head = attrs.length > 0\n ? `<g ${attrs.join(' ')}${metaAttrs}>`\n : `<g${metaAttrs}>`;\n const body = node.children.map((c) => nodeXml(c, registry, namespaces)).join('');\n return `${head}${body}${metaElementsXml(node.meta, namespaces)}</g>`;\n}\n\nfunction pathXml(node: SvgPathNode, registry: PaintServerRegistry, namespaces: Record<string, string>): string {\n const attrs: string[] = [`d=\"${serializePathD(node.path)}\"`];\n const fillAttrs = paintAttrs(node.fill, 'fill', registry);\n for (const a of fillAttrs) attrs.push(a);\n // Emit fill-rule only when it diverges from SVG's default ('nonzero').\n // RectPath has no fillRule field — only PolygonPath carries one.\n if (node.path.kind === 'polygon' && node.path.fillRule === 'evenodd') {\n attrs.push(`fill-rule=\"evenodd\"`);\n }\n if (node.stroke) {\n const strokeAttrs = strokeAttrsFor(node.stroke, registry);\n for (const a of strokeAttrs) attrs.push(a);\n } else {\n attrs.push('stroke=\"none\"');\n }\n if (node.opacity != null && node.opacity !== 1) {\n attrs.push(`opacity=\"${trimNumber(node.opacity)}\"`);\n }\n if (node.rotation != null && node.rotation !== 0) {\n const b = pathBounds(node.path);\n const cx = b.minX + (b.maxX - b.minX) / 2;\n const cy = b.minY + (b.maxY - b.minY) / 2;\n const deg = (node.rotation * 180) / Math.PI;\n attrs.push(`transform=\"rotate(${trimNumber(deg)} ${trimNumber(cx)} ${trimNumber(cy)})\"`);\n }\n const metaAttrs = metaAttrsXml(node.meta, namespaces);\n const metaEls = metaElementsXml(node.meta, namespaces);\n if (metaEls) {\n return `<path ${attrs.join(' ')}${metaAttrs}>${metaEls}</path>`;\n }\n return `<path ${attrs.join(' ')}${metaAttrs}/>`;\n}\n\nfunction paintAttrs(\n paint: SvgPaint,\n name: 'fill' | 'stroke',\n registry: PaintServerRegistry,\n includeOpacity = true,\n): string[] {\n if (paint.kind === 'none') return [`${name}=\"none\"`];\n if (paint.kind === 'solid') {\n const out = [`${name}=\"${paint.color}\"`];\n if (includeOpacity && paint.opacity != null && paint.opacity !== 1) {\n out.push(`${name}-opacity=\"${trimNumber(paint.opacity)}\"`);\n }\n return out;\n }\n // gradient\n const id = registry.register(paint.paint);\n return [`${name}=\"url(#${id})\"`];\n}\n\n/**\n * Attributes for a kit `Stroke` — the shape text carries, whose `paint` is a\n * `FillStyle` rather than an `SvgPaint`. Text strokes ride inside\n * `TextStyle` / `StyledRun` rather than as a node-level `SvgStroke`, because\n * that is where the kit's text model puts them.\n *\n * Absent, or zero-width, emits nothing at all: unstroked text should not\n * carry a `stroke` attribute, and SVG's own default (`none`) already says so.\n */\nfunction coreStrokeAttrs(stroke: Stroke | undefined, registry: PaintServerRegistry): string[] {\n if (!stroke) return [];\n // SVG has no accumulated-transform scale to resolve a `{ px }` width\n // against; its number is emitted as-is.\n const width = resolveStrokeWidth(stroke.width ?? 1, 1);\n if (!(width > 0)) return [];\n const attrs: string[] = [];\n if ('color' in stroke.paint) {\n attrs.push(`stroke=\"${stroke.paint.color}\"`);\n if (stroke.paint.opacity != null && stroke.paint.opacity !== 1) {\n attrs.push(`stroke-opacity=\"${trimNumber(stroke.paint.opacity)}\"`);\n }\n } else {\n attrs.push(`stroke=\"url(#${registry.register(stroke.paint)})\"`);\n }\n attrs.push(`stroke-width=\"${trimNumber(width)}\"`);\n if (stroke.cap) attrs.push(`stroke-linecap=\"${stroke.cap}\"`);\n if (stroke.join) attrs.push(`stroke-linejoin=\"${stroke.join}\"`);\n if (stroke.dash && stroke.dash.length > 0) {\n attrs.push(`stroke-dasharray=\"${stroke.dash.map(trimNumber).join(' ')}\"`);\n }\n if (stroke.miterLimit != null) attrs.push(`stroke-miterlimit=\"${trimNumber(stroke.miterLimit)}\"`);\n for (const [field, attr] of [\n ['markerStart', 'marker-start'],\n ['markerMid', 'marker-mid'],\n ['markerEnd', 'marker-end'],\n ] as const) {\n const ref = stroke[field];\n if (ref === undefined) continue;\n const key = typeof ref === 'string' ? ref : ref.key;\n const id = registry.markerId(key);\n if (id === undefined) continue;\n attrs.push(`${attr}=\"url(#${id})\"`);\n }\n return attrs;\n}\n\nfunction strokeAttrsFor(stroke: SvgStroke, registry: PaintServerRegistry): string[] {\n // `SvgStroke.opacity` and the paint's own `opacity` are two models of one\n // SVG attribute, and parse fills in both. Emitting each would write\n // `stroke-opacity` twice, which is not well-formed XML at all.\n const attrs = paintAttrs(stroke.paint, 'stroke', registry, false);\n attrs.push(`stroke-width=\"${trimNumber(stroke.width)}\"`);\n const opacity = stroke.opacity\n ?? (stroke.paint.kind === 'solid' ? stroke.paint.opacity : undefined);\n if (opacity != null && opacity !== 1) {\n attrs.push(`stroke-opacity=\"${trimNumber(opacity)}\"`);\n }\n if (stroke.cap) {\n attrs.push(`stroke-linecap=\"${stroke.cap}\"`);\n }\n if (stroke.join) {\n attrs.push(`stroke-linejoin=\"${stroke.join}\"`);\n }\n if (stroke.dash && stroke.dash.length > 0) {\n attrs.push(`stroke-dasharray=\"${stroke.dash.map(trimNumber).join(' ')}\"`);\n }\n if (stroke.miterLimit != null) {\n attrs.push(`stroke-miterlimit=\"${trimNumber(stroke.miterLimit)}\"`);\n }\n for (const [field, attr] of [\n ['markerStart', 'marker-start'],\n ['markerMid', 'marker-mid'],\n ['markerEnd', 'marker-end'],\n ] as const) {\n const ref = stroke[field];\n if (ref === undefined) continue;\n const id = registry.markerId(ref);\n if (id === undefined) continue;\n attrs.push(`${attr}=\"url(#${id})\"`);\n }\n return attrs;\n}\n\n/**\n * Tight bounding box around everything the tree draws, in the root's\n * coordinates — the fallback `viewBox` when the caller supplies none. A\n * node's `rotation` and a group's `transform` both move ink, so both are\n * applied here; a box taken from unrotated geometry crops the document.\n */\nfunction computeBounds(nodes: SvgNode[]): { x: number; y: number; width: number; height: number } {\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n const visit = (n: SvgNode, ctm: Matrix): void => {\n if (n.kind === 'group') {\n const childCtm = n.transform ? multiply(ctm, n.transform) : ctm;\n n.children.forEach((c) => visit(c, childCtm));\n return;\n }\n const b = n.kind === 'text' || n.kind === 'image'\n ? { minX: n.x, minY: n.y, maxX: n.x + n.width, maxY: n.y + n.height }\n : pathBounds(n.path);\n const local = n.rotation ? rotateAboutCenter(ctm, b, n.rotation) : ctm;\n for (const [x, y] of corners(b)) {\n const px = local[0] * x + local[2] * y + local[4];\n const py = local[1] * x + local[3] * y + local[5];\n if (px < minX) minX = px;\n if (py < minY) minY = py;\n if (px > maxX) maxX = px;\n if (py > maxY) maxY = py;\n }\n };\n nodes.forEach((n) => visit(n, IDENTITY_MATRIX));\n if (!Number.isFinite(minX)) {\n return { x: 0, y: 0, width: 0, height: 0 };\n }\n return { x: minX, y: minY, width: maxX - minX, height: maxY - minY };\n}\n\nfunction corners(b: { minX: number; minY: number; maxX: number; maxY: number }): [number, number][] {\n return [[b.minX, b.minY], [b.maxX, b.minY], [b.maxX, b.maxY], [b.minX, b.maxY]];\n}\n\n/** `ctm` composed with the same `rotate(angle cx cy)` the element emits. */\nfunction rotateAboutCenter(\n ctm: Matrix,\n b: { minX: number; minY: number; maxX: number; maxY: number },\n angle: number,\n): Matrix {\n const cx = (b.minX + b.maxX) / 2;\n const cy = (b.minY + b.maxY) / 2;\n const c = Math.cos(angle);\n const s = Math.sin(angle);\n return multiply(ctm, [c, s, -s, c, cx - cx * c + cy * s, cy - cx * s - cy * c]);\n}\n\n/**\n * Emit a `<text>` element. Uses `dominant-baseline=\"text-before-edge\"` so\n * the `y` attribute matches weasel's top-of-box pose; stashes the explicit\n * width/height (which native SVG text doesn't model) in `data-weasel-*`\n * attributes so they round-trip through the parser losslessly.\n */\nfunction textXml(node: SvgTextNode, registry: PaintServerRegistry, namespaces: Record<string, string>): string {\n const attrs: string[] = [\n `x=\"${trimNumber(node.x)}\"`,\n `y=\"${trimNumber(node.y)}\"`,\n `dominant-baseline=\"text-before-edge\"`,\n // The runs model stores real line breaks; SVG's default whitespace\n // handling would collapse them (and any indentation) away on re-import.\n `xml:space=\"preserve\"`,\n `data-weasel-width=\"${trimNumber(node.width)}\"`,\n `data-weasel-height=\"${trimNumber(node.height)}\"`,\n ];\n\n const style = node.style;\n if (style?.fontSize != null) attrs.push(`font-size=\"${trimNumber(style.fontSize)}\"`);\n if (style?.fontFamily) attrs.push(`font-family=\"${escapeAttr(style.fontFamily)}\"`);\n if (style?.fontWeight != null) attrs.push(`font-weight=\"${String(style.fontWeight)}\"`);\n if (style?.fontStyle && style.fontStyle !== 'normal') attrs.push(`font-style=\"${style.fontStyle}\"`);\n const direction = style?.direction ?? 'ltr';\n if (direction === 'rtl') attrs.push('direction=\"rtl\"');\n if (style?.align != null || direction === 'rtl') {\n // `text-anchor` is reading-order relative in SVG exactly as `start` / `end`\n // are here, so the two relative values pass straight through and only the\n // absolute pair has to be turned into an edge the reader resolves the same\n // way. Under `ltr` this collapses to what it always wrote.\n const align = style?.align ?? 'left';\n const anchor = align === 'center' ? 'middle'\n : align === 'start' ? 'start'\n : align === 'end' ? 'end'\n : (align === 'left') === (direction === 'ltr') ? 'start' : 'end';\n if (anchor !== 'start') attrs.push(`text-anchor=\"${anchor}\"`);\n }\n if (style?.letterSpacing != null && style.letterSpacing !== 0) {\n attrs.push(`letter-spacing=\"${trimNumber(style.letterSpacing)}\"`);\n }\n const decoration = textDecorationValue(style?.underline, style?.strikethrough, style?.overline);\n if (decoration) attrs.push(`text-decoration=\"${decoration}\"`);\n // Note: `lineHeight` is NOT emitted here. The bridge layer (svgInterop)\n // lifts it into `meta.wd.attrs['line-height']`, which `metaAttrsXml`\n // below emits as `wd:line-height=\"...\"`. There is no compat write of\n // `data-weasel-line-height` — per the SVG-native plan's Migration section,\n // no installed base exists to compat against.\n if (node.fill) {\n if ('color' in node.fill) {\n attrs.push(`fill=\"${node.fill.color}\"`);\n if (node.fill.opacity != null && node.fill.opacity !== 1) {\n attrs.push(`fill-opacity=\"${trimNumber(node.fill.opacity)}\"`);\n }\n } else {\n const id = registry.register(node.fill);\n attrs.push(`fill=\"url(#${id})\"`);\n }\n }\n for (const a of coreStrokeAttrs(node.stroke, registry)) attrs.push(a);\n if (node.opacity != null && node.opacity !== 1) {\n attrs.push(`opacity=\"${trimNumber(node.opacity)}\"`);\n }\n if (node.rotation != null && node.rotation !== 0) {\n const cx = node.x + node.width / 2;\n const cy = node.y + node.height / 2;\n const deg = (node.rotation * 180) / Math.PI;\n attrs.push(`transform=\"rotate(${trimNumber(deg)} ${trimNumber(cx)} ${trimNumber(cy)})\"`);\n }\n\n const body = node.runs && node.runs.length > 0\n ? node.runs.map((r) => runXml(r, registry)).join('')\n : escapeText(node.text);\n const metaAttrs = metaAttrsXml(node.meta, namespaces);\n const metaEls = metaElementsXml(node.meta, namespaces);\n return `<text ${attrs.join(' ')}${metaAttrs}>${body}${metaEls}</text>`;\n}\n\nfunction runXml(run: import('@weasel-js/core').StyledRun, registry: PaintServerRegistry): string {\n const attrs: string[] = [];\n if (run.bold) attrs.push(`font-weight=\"700\"`);\n if (run.italic) attrs.push(`font-style=\"italic\"`);\n if (run.fontFamily) attrs.push(`font-family=\"${escapeAttr(run.fontFamily)}\"`);\n // A percentage `font-size` is relative to the parent's, which is what\n // `fontScale` means; an absolute `fontSize` wins over it here as it does in\n // the runs model.\n //\n // `baseline-shift=\"super\"` carries the preset's *size* as well as its rise,\n // so a run that overrode only the rise has no keyword left to say the size\n // with and must spell it out — without this the superscript comes back\n // full-size at a raised baseline.\n const presetScale = run.script != null && run.baselineShift != null\n ? SCRIPT_METRICS[run.script].size\n : undefined;\n const scale = run.fontScale ?? presetScale;\n if (run.fontSize != null) attrs.push(`font-size=\"${trimNumber(run.fontSize)}\"`);\n else if (scale != null) attrs.push(`font-size=\"${trimNumber(scale * 100)}%\"`);\n // Same story for `baseline-shift`: an SVG percentage resolves against the\n // parent's font size, which is the unit `baselineShift` is already in.\n if (run.baselineShift != null) {\n attrs.push(`baseline-shift=\"${trimNumber(run.baselineShift * 100)}%\"`);\n } else if (run.script) {\n attrs.push(`baseline-shift=\"${run.script}\"`);\n }\n // Unlike the node-level style guard above, a run-level `0` is a meaningful\n // *override* (distinct from \"inherit the node's letterSpacing\") per the\n // runs model's additive-flags contract — emit it whenever it's set.\n if (run.letterSpacing != null) {\n attrs.push(`letter-spacing=\"${trimNumber(run.letterSpacing)}\"`);\n }\n const runDecoration = textDecorationValue(run.underline, run.strikethrough, run.overline);\n if (runDecoration) attrs.push(`text-decoration=\"${runDecoration}\"`);\n if (run.fill) {\n if ('color' in run.fill) {\n attrs.push(`fill=\"${run.fill.color}\"`);\n } else {\n const id = registry.register(run.fill);\n attrs.push(`fill=\"url(#${id})\"`);\n }\n }\n for (const a of coreStrokeAttrs(run.stroke, registry)) attrs.push(a);\n const head = attrs.length > 0 ? `<tspan ${attrs.join(' ')}>` : '<tspan>';\n return `${head}${escapeText(run.text)}</tspan>`;\n}\n\n/**\n * Combine the decoration flags into an SVG `text-decoration` value —\n * `\"underline line-through\"` when both are set, a single token when only\n * one is, or `null` (omit the attribute) when none is set.\n */\nfunction textDecorationValue(\n underline: boolean | undefined,\n strikethrough: boolean | undefined,\n overline: boolean | undefined,\n): string | null {\n const tokens: string[] = [];\n if (underline) tokens.push('underline');\n if (strikethrough) tokens.push('line-through');\n if (overline) tokens.push('overline');\n return tokens.length > 0 ? tokens.join(' ') : null;\n}\n\nfunction escapeAttr(s: string): string {\n return s.replace(/&/g, '&').replace(/\"/g, '"').replace(/</g, '<');\n}\n\nfunction escapeText(s: string): string {\n return s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');\n}\n\nfunction pathBounds(path: Path): { minX: number; minY: number; maxX: number; maxY: number } {\n if (path.kind === 'rect') {\n return {\n minX: path.x, minY: path.y,\n maxX: path.x + path.width, maxY: path.y + path.height,\n };\n }\n const b = boundsOfPath(path);\n return { minX: b.x, minY: b.y, maxX: b.x + b.width, maxY: b.y + b.height };\n}\n\n","import type { DrawCommand, Path, Stroke } from '@weasel-js/core';\nimport {\n ellipsePath,\n linePath,\n markerDrawCommands,\n PathBuilder,\n rectPath,\n textCommand,\n} from '@weasel-js/core';\nimport type { WorldRect } from './frac';\nimport type { AnnotationData, FracPoint } from './types';\n\n/** One loud color, not a themed one: a mark sits over the instrument's own\n * picture and has to be legible against whatever that picture is. */\nconst MARK_COLOR = '#e5484d';\n/** World units, so a mark thickens with the picture it annotates — and so the\n * marker geometry can be resolved here, which needs a resolved width. */\nconst MARK_WIDTH = 2;\nconst TEXT_SIZE = 14;\n\n/** The subset of a mark's scene node this needs: where it is, and what it is. */\nexport interface PaintableMark {\n pose: WorldRect;\n data: AnnotationData;\n}\n\n/** How a mark is drawn, as opposed to where. Resolved by the overlay from the\n * instrument's vocabulary and the mark's own staleness. */\nexport interface MarkStyle {\n /** The status's colour, or the default. */\n color?: string;\n /** A mark whose stored position no longer describes the picture. Drawn\n * dashed rather than hidden: it still describes *something*, and dropping\n * it would lose it. */\n stale?: boolean;\n}\n\nconst toWorld = (p: FracPoint, content: { w: number; h: number }) => ({\n x: p.x * content.w,\n y: p.y * content.h,\n});\n\n/** A mark's stored vertices in world units, or the pose's diagonal — a stored\n * mark whose `points` did not survive still has to draw somewhere. */\nfunction vertices(m: PaintableMark, content: { w: number; h: number }): { x: number; y: number }[] {\n const stored = m.data.points;\n if (stored && stored.length >= 2) return stored.map((p) => toWorld(p, content));\n const { x, y, width, height } = m.pose;\n return [\n { x, y },\n { x: x + width, y: y + height },\n ];\n}\n\nfunction polyline(points: { x: number; y: number }[]): Path {\n const b = new PathBuilder();\n const first = points[0];\n if (!first) return rectPath(0, 0, 0, 0);\n b.moveTo(first.x, first.y);\n for (const p of points.slice(1)) b.lineTo(p.x, p.y);\n return b.build();\n}\n\n/**\n * What one mark draws, in its target's world.\n *\n * Pure: a node and the target's content box in, draw commands out. Geometry\n * that a bounding box cannot describe — a line's ends, a stroke's path — comes\n * from `data.points`, which is in fractions like the bounds.\n */\nexport function markCommands(\n m: PaintableMark,\n content: { w: number; h: number },\n style: MarkStyle = {},\n): DrawCommand[] {\n const color = style.color ?? MARK_COLOR;\n const stroke: Stroke = {\n paint: { color },\n width: MARK_WIDTH,\n cap: 'round',\n join: 'round',\n ...(style.stale ? { dash: [6, 4] } : {}),\n };\n\n switch (m.data.kind) {\n case 'rect':\n return [\n { kind: 'path', path: rectPath(m.pose.x, m.pose.y, m.pose.width, m.pose.height), stroke },\n ];\n case 'ellipse':\n return [{ kind: 'path', path: ellipsePath(m.pose), stroke }];\n case 'line': {\n const [a, b] = vertices(m, content);\n return [{ kind: 'path', path: linePath(a, b), stroke }];\n }\n case 'arrow': {\n const [a, b] = vertices(m, content);\n // The spec's arrow: a line carrying an end marker, not its own geometry.\n // Markers are separate commands — a stroke's `markerEnd` is inert unless\n // something turns it into geometry, and only the kit's own node painter\n // does that, for the nodes it owns.\n const marked: Stroke = { ...stroke, markerEnd: 'arrow' };\n const path = linePath(a, b);\n return [\n { kind: 'path', path, stroke: marked },\n ...markerDrawCommands(path, marked, MARK_WIDTH, undefined),\n ];\n }\n case 'stroke':\n return [{ kind: 'path', path: polyline(vertices(m, content)), stroke }];\n case 'text': {\n const text = m.data.title;\n if (!text) return [];\n return [\n textCommand(\n m.pose.x,\n m.pose.y,\n text,\n { fontSize: TEXT_SIZE },\n undefined,\n undefined,\n undefined,\n {\n fill: { color },\n },\n ),\n ];\n }\n }\n}\n","/**\n * Whether a stored mark still describes the picture the current config\n * produces. A target names the config keys its positions depend on; labkit\n * snapshots and compares them without knowing what any of them mean.\n */\n\n/** The values of `keys` in `config`, for storing beside a new mark. Keys the\n * config does not carry are omitted rather than stored as undefined, so the\n * snapshot says what was known rather than what was asked. */\nexport function seenFrom(config: unknown, keys: readonly string[]): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n if (config === null || typeof config !== 'object') return out;\n const src = config as Record<string, unknown>;\n for (const k of keys) {\n if (k in src) out[k] = src[k];\n }\n return out;\n}\n\n/**\n * Whether the picture moved under the mark.\n *\n * Only keys present in `seen` are compared. A mark filed before its target\n * declared a new dependency must not go stale retroactively: nothing can know\n * what that key was at the time, and guessing would grey out every old mark\n * the first time a target grows a key.\n */\nexport function isStale(\n seen: Readonly<Record<string, unknown>> | undefined,\n config: unknown,\n keys: readonly string[],\n): boolean {\n if (!seen || keys.length === 0) return false;\n if (config === null || typeof config !== 'object') return false;\n const src = config as Record<string, unknown>;\n for (const k of keys) {\n if (!(k in seen)) continue;\n if (!Object.is(seen[k], src[k])) return true;\n }\n return false;\n}\n","import type { DrawCommand, SceneNode, View } from '@weasel-js/core';\nimport type { WorldRect } from './frac';\nimport { type MarkStyle, markCommands } from './paint';\nimport { isStale } from './staleness';\nimport type { AnnotationData, AnnotationMeaning } from './types';\n\n/** What resolving a mark's appearance needs beyond the mark itself. */\nexport interface MarkDrawOptions {\n /** The target's content box — the world a mark's geometry is in. */\n content: { w: number; h: number };\n /** The target's `positionDependsOn`, for staleness. */\n positionDependsOn?: readonly string[];\n /** The trial's config at the time of the draw. */\n config: unknown;\n /** The instrument's vocabulary, for a status's colour. */\n meaning?: AnnotationMeaning;\n}\n\n/**\n * How one mark is drawn — shared by the pane on screen and by an export.\n *\n * One function rather than two call sites building their own, because an\n * export that resolves a status colour or a stale dash differently from the\n * screen produces a picture nobody was looking at.\n */\nexport function createMarkDrawOne(\n opts: MarkDrawOptions,\n): (\n node: SceneNode<AnnotationData, 'marks', WorldRect>,\n pose: WorldRect,\n view: View,\n) => DrawCommand[] {\n return (node, pose) =>\n markCommands({ pose, data: node.data }, opts.content, resolveMarkStyle(node.data, opts));\n}\n\n/** How a mark looks, as opposed to where it is. Separate from the callback\n * above because an SVG export resolves the same appearance without ever\n * building a draw command. */\nexport function resolveMarkStyle(data: AnnotationData, opts: MarkDrawOptions): MarkStyle {\n return {\n color: opts.meaning?.statuses?.find((s) => s.id === data.status)?.color,\n // Read off the node rather than through the store's `isStale`, which\n // wants a projected Annotation this path does not have.\n stale: isStale(data.seen, opts.config, opts.positionDependsOn ?? []),\n };\n}\n","import type { DrawCommand, FillStyle, Stroke } from '@weasel-js/core';\nimport { resolveStrokeWidth } from '@weasel-js/core';\nimport type { SvgNode, SvgPaint, SvgStroke } from '@weasel-js/svg';\nimport { type MarkStyle, markCommands, type PaintableMark } from './paint';\n\nconst NO_PAINT: SvgPaint = { kind: 'none' };\n\nfunction toSvgPaint(paint: FillStyle | undefined): SvgPaint {\n if (!paint) return NO_PAINT;\n if ('color' in paint && typeof paint.color === 'string') {\n return {\n kind: 'solid',\n color: paint.color,\n ...(paint.opacity != null ? { opacity: paint.opacity } : {}),\n };\n }\n return { kind: 'gradient', paint };\n}\n\n/** Marker references are deliberately dropped: `markCommands` already resolves\n * a marker into its own path command, and keeping the reference would make\n * the serializer emit a `<marker>` def that draws the head a second time. */\nfunction toSvgStroke(stroke: Stroke): SvgStroke {\n return {\n paint: toSvgPaint(stroke.paint),\n width: resolveStrokeWidth(stroke.width ?? 1, 1),\n ...(stroke.cap ? { cap: stroke.cap } : {}),\n ...(stroke.join ? { join: stroke.join } : {}),\n ...(stroke.dash ? { dash: [...stroke.dash] } : {}),\n ...(stroke.miterLimit != null ? { miterLimit: stroke.miterLimit } : {}),\n };\n}\n\nfunction toSvgNode(cmd: DrawCommand, m: PaintableMark): SvgNode {\n if (cmd.kind === 'path') {\n return {\n kind: 'path',\n path: cmd.path,\n fill: toSvgPaint(cmd.fill),\n ...(cmd.stroke ? { stroke: toSvgStroke(cmd.stroke) } : {}),\n };\n }\n if (cmd.kind === 'text') {\n return {\n kind: 'text',\n x: cmd.x,\n y: cmd.y,\n width: m.pose.width,\n height: m.pose.height,\n text: cmd.runs.map((run) => run.text).join(''),\n style: cmd.style,\n ...(cmd.runs[0]?.fill ? { fill: cmd.runs[0].fill } : {}),\n };\n }\n // Unreachable while `markCommands` emits only paths and text. A throw rather\n // than a skip: a new mark kind silently vanishing from every export is a\n // worse afternoon than a loud one.\n throw new Error(`[labkit] a mark drew a '${cmd.kind}' command, which has no vector form`);\n}\n\n/**\n * One mark as SVG nodes, converted from the very commands the pane paints.\n *\n * Deliberately not a second switch over `data.kind`: geometry has one source,\n * and this is a translation of it. `serializeSvg` turns the result into a\n * document.\n */\nexport function markSvgNodes(\n m: PaintableMark,\n content: { w: number; h: number },\n style: MarkStyle = {},\n): SvgNode[] {\n return markCommands(m, content, style).map((cmd) => toSvgNode(cmd, m));\n}\n","import { asNodeId, renderSceneToPixels } from '@weasel-js/core';\nimport { serializeSvg } from '@weasel-js/svg';\nimport { createMarkDrawOne, type MarkDrawOptions, resolveMarkStyle } from './drawOne';\nimport type { MarkScene } from './store';\nimport { markSvgNodes } from './svgNodes';\nimport type { AnnotationData, CaptureOptions, CaptureResult, CaptureSource } from './types';\n\nconst SVG_NS = 'http://www.w3.org/2000/svg';\n\n/** Which of the two composition routes an export takes. */\nexport type CapturePlan = 'svg-document' | 'raster-stack';\n\n/**\n * Vector all the way through, or both sides rasterized and stacked.\n *\n * An SVG base is the only one that nests: the marks serialize beside the\n * artifact's own markup and the whole document rasterizes once at the end. A\n * raster base, or none at all, takes the renderer's own path instead — which\n * is also what draws marks onto transparency for a target that declares no\n * base.\n */\nexport function capturePlan(base: CaptureSource | undefined, format: 'png' | 'svg'): CapturePlan {\n if (format === 'svg') return 'svg-document';\n return base?.kind === 'svg' ? 'svg-document' : 'raster-stack';\n}\n\n/** Re-frame a base's own `<svg>` onto the content box, keeping its `viewBox`.\n * Parsed rather than string-spliced: a base whose declared width disagrees\n * with its viewBox would otherwise land at the wrong scale. */\nfunction nestBaseSvg(markup: string, w: number, h: number): string {\n const doc = new DOMParser().parseFromString(markup, 'image/svg+xml');\n const root = doc.documentElement;\n if (doc.getElementsByTagName('parsererror').length > 0 || root.localName !== 'svg') {\n throw new Error(\"[labkit] a target's `base()` returned markup that is not an <svg> document\");\n }\n root.setAttribute('x', '0');\n root.setAttribute('y', '0');\n root.setAttribute('width', String(w));\n root.setAttribute('height', String(h));\n return new XMLSerializer().serializeToString(root);\n}\n\n/** A raster base as an `<image>` filling the content box. An external `src`\n * round-trips as a reference, so the export is only self-contained when it\n * is already a `data:` URI. */\nfunction embedRasterBase(\n base: CaptureSource,\n w: number,\n h: number,\n onWarn?: (m: string) => void,\n): string {\n const href =\n base.kind === 'canvas' ? base.canvas.toDataURL() : base.kind === 'image' ? base.src : '';\n if (base.kind === 'image' && !href.startsWith('data:')) {\n onWarn?.(`base image '${href}' is a reference, so this SVG is not self-contained`);\n }\n return serializeSvg([{ kind: 'image', href, x: 0, y: 0, width: w, height: h }], {\n viewBox: { x: 0, y: 0, width: w, height: h },\n });\n}\n\n/** Every mark on a scene, as SVG nodes, styled the way the pane styles them. */\nfunction markNodesOf(scene: MarkScene, draw: MarkDrawOptions) {\n return [...scene.renderOrder()].flatMap((id) => {\n const node = scene.get(asNodeId(String(id)));\n if (!node) return [];\n return markSvgNodes(\n { pose: node.pose, data: node.data as AnnotationData },\n draw.content,\n resolveMarkStyle(node.data as AnnotationData, draw),\n );\n });\n}\n\nexport interface ComposeSvgArgs {\n base?: CaptureSource;\n scene: MarkScene;\n draw: MarkDrawOptions;\n scale: number;\n onWarn?: (message: string) => void;\n}\n\n/**\n * The base and the marks in one SVG document.\n *\n * The outer `viewBox` is the content box, so marks — which are already in it —\n * need no transform, and `width`/`height` carry the export scale. Both halves\n * nest as child `<svg>` elements, which each establish their own viewport and\n * so keep their own `viewBox` maths out of this function.\n */\nexport function composeCaptureSvg(args: ComposeSvgArgs): string {\n const { base, scene, draw, scale, onWarn } = args;\n const { w, h } = draw.content;\n const baseXml =\n base === undefined\n ? ''\n : base.kind === 'svg'\n ? nestBaseSvg(base.markup, w, h)\n : embedRasterBase(base, w, h, onWarn);\n // No width/height on the marks document: a nested <svg> without them fills\n // the outer viewport exactly, which is the alignment this relies on.\n const marksXml = serializeSvg(markNodesOf(scene, draw), {\n viewBox: { x: 0, y: 0, width: w, height: h },\n onWarn,\n });\n const outW = Math.max(1, Math.round(w * scale));\n const outH = Math.max(1, Math.round(h * scale));\n return `<svg xmlns=\"${SVG_NS}\" width=\"${outW}\" height=\"${outH}\" viewBox=\"0 0 ${w} ${h}\">${baseXml}${marksXml}</svg>`;\n}\n\nfunction context2d(width: number, height: number): CanvasRenderingContext2D {\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext('2d');\n if (!ctx) throw new Error('[labkit] capture needs a 2D canvas context, and this one has none');\n return ctx;\n}\n\nfunction toPngBlob(canvas: HTMLCanvasElement): Promise<Blob> {\n return new Promise((resolve, reject) => {\n let done: (b: Blob | null) => void;\n try {\n done = (blob) =>\n blob ? resolve(blob) : reject(new Error('[labkit] the browser produced no PNG'));\n canvas.toBlob(done, 'image/png');\n } catch (err) {\n // A base referencing an image from another origin taints the canvas and\n // `toBlob` throws SecurityError. Name the cause: the DOM exception on\n // its own sends people looking at labkit.\n reject(\n new Error(\n '[labkit] the capture canvas is tainted, so it cannot be read back — a base referencing a cross-origin image does this. Embed it as a data: URI.',\n { cause: err },\n ),\n );\n }\n });\n}\n\nfunction loadImage(src: string): Promise<HTMLImageElement> {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.onload = () => resolve(img);\n img.onerror = () => reject(new Error(`[labkit] a capture base failed to load: ${src}`));\n img.src = src;\n });\n}\n\n/** Rasterize a composed document by handing it to the browser's own SVG\n * renderer — one pass over base and marks together. */\nasync function rasterizeSvg(svg: string, width: number, height: number): Promise<Blob> {\n const url = URL.createObjectURL(new Blob([svg], { type: 'image/svg+xml;charset=utf-8' }));\n try {\n const img = await loadImage(url);\n const ctx = context2d(width, height);\n ctx.drawImage(img, 0, 0, width, height);\n return await toPngBlob(ctx.canvas);\n } finally {\n URL.revokeObjectURL(url);\n }\n}\n\n/** Base pixels, then mark pixels over them. The marks come from\n * `renderSceneToPixels` rather than a readback of the live surface, so a\n * capture neither depends on nor disturbs what is on screen. */\nasync function stackRaster(\n args: ComposeSvgArgs & { width: number; height: number },\n): Promise<Blob> {\n const { base, scene, draw, scale, width, height } = args;\n const ctx = context2d(width, height);\n if (base?.kind === 'image') ctx.drawImage(await loadImage(base.src), 0, 0, width, height);\n else if (base?.kind === 'canvas') ctx.drawImage(base.canvas, 0, 0, width, height);\n\n const raster = renderSceneToPixels({\n scene,\n sourceRect: { x: 0, y: 0, width: draw.content.w, height: draw.content.h },\n scale: { x: scale, y: scale },\n drawOne: createMarkDrawOne(draw),\n });\n // Through a second canvas rather than `putImageData` on this one, which\n // replaces pixels instead of compositing and would erase the base.\n const marks = context2d(raster.width, raster.height);\n marks.putImageData(\n new ImageData(Uint8ClampedArray.from(raster.data), raster.width, raster.height),\n 0,\n 0,\n );\n ctx.drawImage(marks.canvas, 0, 0, width, height);\n return toPngBlob(ctx.canvas);\n}\n\n/** What a capture needs about the target it is exporting. */\nexport interface CaptureArgs {\n target: string;\n scene: MarkScene;\n draw: MarkDrawOptions;\n base?: () => CaptureSource | Promise<CaptureSource>;\n onWarn?: (message: string) => void;\n}\n\n/** Export one target's picture with its marks on it. */\nexport async function captureTarget(\n args: CaptureArgs,\n opts: CaptureOptions = {},\n): Promise<CaptureResult> {\n const format = opts.format ?? 'png';\n const scale = opts.scale ?? 2;\n const { content } = args.draw;\n const width = Math.max(1, Math.round(content.w * scale));\n const height = Math.max(1, Math.round(content.h * scale));\n const base = await args.base?.();\n const compose: ComposeSvgArgs = {\n base,\n scene: args.scene,\n draw: args.draw,\n scale,\n onWarn: args.onWarn,\n };\n\n if (capturePlan(base, format) === 'raster-stack') {\n return {\n target: args.target,\n blob: await stackRaster({ ...compose, width, height }),\n format,\n width,\n height,\n };\n }\n\n const svg = composeCaptureSvg(compose);\n const blob =\n format === 'svg'\n ? new Blob([svg], { type: 'image/svg+xml;charset=utf-8' })\n : await rasterizeSvg(svg, width, height);\n return { target: args.target, blob, format, width, height };\n}\n","import type { FracPoint, FracRect } from './types';\n\n/** A mark's box in its target's world: CSS pixels at zoom 1. Matches weasel's\n * default `RectPose`, which is what the scene stores. */\nexport interface WorldRect {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\n/** Where a fraction lands on a content box of this size. */\nexport function fracToWorld(f: FracRect, content: { w: number; h: number }): WorldRect {\n return {\n x: f.x * content.w,\n y: f.y * content.h,\n width: f.w * content.w,\n height: f.h * content.h,\n };\n}\n\n/** What fraction of the content box a world rect covers.\n *\n * A pane measured before layout is 0×0, and dividing by that would seed every\n * stored position with `NaN` — which compares false against everything and so\n * fails silently rather than loudly. Zero sides give zeros. */\nexport function worldToFrac(r: WorldRect, content: { w: number; h: number }): FracRect {\n const sx = content.w === 0 ? 0 : 1 / content.w;\n const sy = content.h === 0 ? 0 : 1 / content.h;\n return { x: r.x * sx, y: r.y * sy, w: r.width * sx, h: r.height * sy };\n}\n\nconst DP = 10_000;\n\n/** Snap to 4dp. Positions are diffed by humans in stored documents, so the\n * last digits of a float are noise that hides the change that matters. */\nexport function roundFrac(f: FracRect): FracRect {\n return {\n x: Math.round(f.x * DP) / DP,\n y: Math.round(f.y * DP) / DP,\n w: Math.round(f.w * DP) / DP,\n h: Math.round(f.h * DP) / DP,\n };\n}\n\n/** Whether `pt` falls in `box`, widened by `tol` on every side so a hairline\n * mark stays reachable. */\nexport function fracContains(box: FracRect, pt: FracPoint, tol = 0): boolean {\n return (\n pt.x >= box.x - tol &&\n pt.x <= box.x + box.w + tol &&\n pt.y >= box.y - tol &&\n pt.y <= box.y + box.h + tol\n );\n}\n\n/** Whether `outer` wholly encloses `inner`. A marquee takes what it encloses,\n * not what it grazes — brushing selection is a different gesture. */\nexport function fracIntersects(outer: FracRect, inner: FracRect): boolean {\n return (\n inner.x >= outer.x &&\n inner.y >= outer.y &&\n inner.x + inner.w <= outer.x + outer.w &&\n inner.y + inner.h <= outer.y + outer.h\n );\n}\n","import type { Scene } from '@weasel-js/core';\n\n/** What the ordering needs of a scene: its history depth, and the two moves. */\nexport interface HistoryScene {\n historyIndex(): number;\n undo(): boolean;\n redo(): boolean;\n canUndo(): boolean;\n canRedo(): boolean;\n}\n\n/**\n * One undo ordering over several scenes.\n *\n * Each target's marks live in their own scene and each scene owns its own undo\n * stack, so \"take back the last thing I did\" is a question no single scene can\n * answer. This keeps the order changes arrived in.\n *\n * The order is maintained from each scene's `historyIndex()`, not from its\n * subscribe callback: a scene notifies on ephemeral changes that are not\n * history at all, and an undo driven from inside a pane's own keymap has to\n * *move* this ordering rather than append to it.\n */\nexport class MarkHistory {\n private readonly depth = new Map<string, number>();\n private undoable: string[] = [];\n private redoable: string[] = [];\n /** Set while this class is driving, so a redo is not read as a new change. */\n private replaying: 'undo' | 'redo' | null = null;\n\n /** Start following `scene` under `target`. Idempotent per target. */\n track(target: string, scene: HistoryScene): void {\n if (this.depth.has(target)) return;\n this.depth.set(target, scene.historyIndex());\n }\n\n /** Call on every notification from `target`'s scene. */\n observe(target: string, scene: HistoryScene): void {\n const now = scene.historyIndex();\n const before = this.depth.get(target) ?? 0;\n this.depth.set(target, now);\n if (now > before) {\n if (this.replaying === 'redo') {\n drop(this.redoable, target);\n } else {\n // A change dropped whatever was redoable — weasel's own scene did the\n // same to its stack.\n this.redoable = [];\n }\n this.undoable.push(target);\n } else if (now < before) {\n drop(this.undoable, target);\n this.redoable.push(target);\n }\n }\n\n /** The target `undo` would act on, skipping any whose scene has nothing\n * left — a scene can drop entries this ordering still lists. */\n private next(\n stack: string[],\n can: (s: HistoryScene) => boolean,\n at: (t: string) => HistoryScene | undefined,\n ): string | null {\n for (let i = stack.length - 1; i >= 0; i--) {\n const target = stack[i];\n if (target === undefined) continue;\n const scene = at(target);\n if (scene && can(scene)) return target;\n }\n return null;\n }\n\n canUndo(at: (t: string) => HistoryScene | undefined): boolean {\n return this.next(this.undoable, (s) => s.canUndo(), at) !== null;\n }\n\n canRedo(at: (t: string) => HistoryScene | undefined): boolean {\n return this.next(this.redoable, (s) => s.canRedo(), at) !== null;\n }\n\n undo(at: (t: string) => HistoryScene | undefined): boolean {\n const target = this.next(this.undoable, (s) => s.canUndo(), at);\n const scene = target === null ? undefined : at(target);\n if (!scene) return false;\n this.replaying = 'undo';\n try {\n return scene.undo();\n } finally {\n this.replaying = null;\n }\n }\n\n redo(at: (t: string) => HistoryScene | undefined): boolean {\n const target = this.next(this.redoable, (s) => s.canRedo(), at);\n const scene = target === null ? undefined : at(target);\n if (!scene) return false;\n this.replaying = 'redo';\n try {\n return scene.redo();\n } finally {\n this.replaying = null;\n }\n }\n}\n\n/** Remove the last occurrence of `value`, in place. */\nfunction drop(stack: string[], value: string): void {\n for (let i = stack.length - 1; i >= 0; i--) {\n if (stack[i] === value) {\n stack.splice(i, 1);\n return;\n }\n }\n}\n\n/** A `Scene` satisfies `HistoryScene`; this names the narrowing once. */\nexport const asHistoryScene = (scene: Scene<never, never, never> | HistoryScene): HistoryScene =>\n scene as HistoryScene;\n","import {\n asNodeId,\n createScene,\n type Scene,\n type SerializedScene,\n sceneFromJSON,\n} from '@weasel-js/core';\nimport { captureTarget } from './capture';\nimport type { WorldRect } from './frac';\nimport { fracContains, fracIntersects, fracToWorld, roundFrac, worldToFrac } from './frac';\nimport { MarkHistory } from './history';\nimport { isStale as isStaleAgainst, seenFrom } from './staleness';\nimport type {\n Annotation,\n AnnotationData,\n AnnotationInit,\n AnnotationMeaning,\n AnnotationPatch,\n AnnotationQuery,\n AnnotationsApi,\n AnnotationTargetInfo,\n CaptureOptions,\n CaptureResult,\n FracPoint,\n FracRect,\n SerializedAnnotations,\n} from './types';\n\n/** A mark's box in its target's world. Matches weasel's default `RectPose`. */\ntype MarkPose = WorldRect;\n\n/** The scene one target's marks live in. */\nexport type MarkScene = Scene<AnnotationData, 'marks', MarkPose>;\n\n/** A mark scene: one layer, because marks do not stack in tiers. */\nexport function createAnnotationScene(): MarkScene {\n return createScene<AnnotationData, 'marks', MarkPose>({ systemLayers: [{ id: 'marks' }] });\n}\n\nexport interface AnnotationStoreOptions {\n /** Re-read on every call, so a target resizing or gaining a dependency takes\n * effect without rebuilding the store. */\n targets: () => readonly AnnotationTargetInfo[];\n /** Serialized scenes from a previous `toJSON`, keyed by target. */\n restore?: Readonly<Record<string, unknown>>;\n /** The instrument's vocabulary, so an export draws a mark in the colour its\n * status gives it. */\n meaning?: AnnotationMeaning;\n /** The trial's live config. A getter for the same reason `targets` is: the\n * store is built once and the config changes under it. */\n config?: () => unknown;\n /** Notified after every finished export. */\n onCapture?: (result: CaptureResult) => void;\n}\n\n/** Everything a capture needs that is not the store's own state. Split out so\n * `capture.ts` takes data rather than reaching back into the store. */\nexport interface CaptureDeps {\n scene: MarkScene;\n target: AnnotationTargetInfo;\n meaning?: AnnotationMeaning;\n config: unknown;\n}\n\nconst NO_CONTENT = { w: 0, h: 0 };\n\n/** A mark's id is its target and its node. One scene per target, so a node id\n * is only unique within one — and an annotation is addressed by both. */\nfunction splitId(id: string): { target: string; node: string } | undefined {\n const at = id.lastIndexOf('/');\n return at <= 0 ? undefined : { target: id.slice(0, at), node: id.slice(at + 1) };\n}\n\n/**\n * A facade over one weasel scene per target: the scenes are the truth, this\n * answers questions about them. Everything crossing this boundary is in\n * fractions of a target's content box; the scenes hold world units.\n *\n * A scene per target rather than one scene with a `target` field, because a\n * pane's hit-test, marquee and paint all walk the whole scene it is given and\n * take no filter — one shared scene puts every other pane's marks under the\n * pointer.\n */\nexport function createAnnotationStore(opts: AnnotationStoreOptions): AnnotationsApi {\n const { targets, restore } = opts;\n const scenes = new Map<string, MarkScene>();\n const subs = new Set<() => void>();\n const history = new MarkHistory();\n const notify = (): void => {\n for (const fn of subs) fn();\n };\n\n const sceneFor = (target: string): MarkScene => {\n const known = scenes.get(target);\n if (known) return known;\n const raw = restore?.[target];\n const scene = raw\n ? sceneFromJSON<AnnotationData, 'marks', MarkPose>(\n raw as SerializedScene<AnnotationData, 'marks', MarkPose>,\n {},\n )\n : createAnnotationScene();\n scenes.set(target, scene);\n history.track(target, scene);\n scene.subscribe(() => {\n history.observe(target, scene);\n notify();\n });\n return scene;\n };\n\n /** Only for scenes that exist: asking for one would create it, and the\n * ordering never names a target it has not seen. */\n const historySceneAt = (target: string) => scenes.get(target);\n\n // Restored scenes are materialized up front: everything below reads\n // `scenes`, and a mark that only appears once its pane asks for its scene is\n // a mark a sidebar cannot list.\n for (const target of Object.keys(restore ?? {})) sceneFor(target);\n\n const targetOf = (id: string): AnnotationTargetInfo | undefined =>\n targets().find((t) => t.id === id);\n\n const contentOf = (id: string) => targetOf(id)?.content ?? NO_CONTENT;\n\n const project = (target: string, node: string): Annotation | undefined => {\n const found = scenes.get(target)?.get(asNodeId(node));\n if (!found) return undefined;\n return {\n ...found.data,\n target,\n id: `${target}/${node}`,\n frac: roundFrac(worldToFrac(found.pose as MarkPose, contentOf(target))),\n };\n };\n\n /** Every target with a scene, in declaration order — then any whose target\n * the instrument has since stopped declaring, so its marks are not lost. */\n const liveTargets = (): string[] => {\n const declared = targets().map((t) => t.id);\n const rest = [...scenes.keys()].filter((id) => !declared.includes(id));\n return [...declared, ...rest];\n };\n\n const marksOn = (target: string): Annotation[] => {\n const scene = scenes.get(target);\n if (!scene) return [];\n const out: Annotation[] = [];\n for (const id of scene.renderOrder()) {\n const a = project(target, String(id));\n if (a) out.push(a);\n }\n return out;\n };\n\n const all = (): Annotation[] => liveTargets().flatMap(marksOn);\n\n const matches = (a: Annotation, q: AnnotationQuery): boolean => {\n if (q.target !== undefined && a.target !== q.target) return false;\n if (q.kind !== undefined && a.kind !== q.kind) return false;\n if (q.status !== undefined && a.status !== q.status) return false;\n if (q.tags !== undefined) {\n const have = a.tags ?? [];\n for (const t of q.tags) if (!have.includes(t)) return false;\n }\n if (q.where && !q.where(a)) return false;\n return true;\n };\n\n /** The node behind a public id, or undefined. */\n const nodeOf = (id: string) => {\n const parts = splitId(id);\n if (!parts) return undefined;\n const scene = scenes.get(parts.target);\n const node = scene?.get(asNodeId(parts.node));\n return node && scene ? { ...parts, scene, node } : undefined;\n };\n\n return {\n sceneFor,\n\n targets,\n\n get(id) {\n const parts = splitId(id);\n return parts ? project(parts.target, parts.node) : undefined;\n },\n\n query(q) {\n return q ? all().filter((a) => matches(a, q)) : all();\n },\n\n hitTest(target, pt: FracPoint, tol = 0) {\n return marksOn(target)\n .filter((a) => fracContains(a.frac, pt, tol))\n .reverse();\n },\n\n within(target, box: FracRect) {\n return marksOn(target).filter((a) => fracIntersects(box, a.frac));\n },\n\n isStale(a, config) {\n const keys = targetOf(a.target)?.positionDependsOn ?? [];\n return isStaleAgainst(a.seen, config, keys);\n },\n\n canUndo() {\n return history.canUndo(historySceneAt);\n },\n\n canRedo() {\n return history.canRedo(historySceneAt);\n },\n\n undo() {\n return history.undo(historySceneAt);\n },\n\n redo() {\n return history.redo(historySceneAt);\n },\n\n selection() {\n const out: string[] = [];\n for (const target of liveTargets()) {\n const scene = scenes.get(target);\n if (!scene) continue;\n for (const node of scene.getSelection()) {\n if (scene.get(node)) out.push(`${target}/${String(node)}`);\n }\n }\n return out;\n },\n\n setSelection(ids) {\n const wanted = new Map<string, string[]>();\n for (const id of ids) {\n const found = nodeOf(id);\n if (!found) continue;\n const node = String(found.node.id);\n const on = wanted.get(found.target);\n if (!on) wanted.set(found.target, [node]);\n else if (!on.includes(node)) on.push(node);\n }\n for (const [target, scene] of scenes) {\n const next = wanted.get(target) ?? [];\n const now = scene.getSelection();\n if (now.length === next.length && next.every((n, i) => String(now[i]) === n)) continue;\n scene.setSelection(next.map(asNodeId));\n }\n },\n\n subscribe(fn) {\n subs.add(fn);\n return () => {\n subs.delete(fn);\n };\n },\n\n add(init: AnnotationInit, config?: unknown) {\n const target = targetOf(init.target);\n const data: AnnotationData = {\n target: init.target,\n kind: init.kind,\n ...(init.points ? { points: init.points } : {}),\n ...(init.title !== undefined ? { title: init.title } : {}),\n ...(init.status !== undefined ? { status: init.status } : {}),\n ...(init.tags !== undefined ? { tags: init.tags } : {}),\n ...(init.meta !== undefined ? { meta: init.meta } : {}),\n seen: seenFrom(config, target?.positionDependsOn ?? []),\n };\n const node = sceneFor(init.target).add({\n kind: 'leaf',\n layer: 'marks',\n pose: fracToWorld(roundFrac(init.frac), target?.content ?? NO_CONTENT),\n data,\n });\n return `${init.target}/${String(node)}`;\n },\n\n update(id, patch: AnnotationPatch) {\n const found = nodeOf(id);\n if (!found) return;\n const { frac, ...meaning } = patch;\n const nid = asNodeId(found.node.id);\n if (Object.keys(meaning).length > 0) {\n found.scene.update(nid, { data: { ...found.node.data, ...meaning } });\n }\n if (frac) {\n found.scene.setPose(nid, fracToWorld(roundFrac(frac), contentOf(found.target)));\n }\n },\n\n setMeta(id, meta) {\n const found = nodeOf(id);\n if (!found) return;\n found.scene.update(asNodeId(found.node.id), { data: { ...found.node.data, meta } });\n },\n\n remove(id) {\n const found = nodeOf(id);\n if (found) found.scene.remove(asNodeId(found.node.id));\n },\n\n async capture(target: string, captureOpts?: CaptureOptions) {\n const info = targetOf(target);\n if (!info) throw new Error(`[labkit] no annotation target called '${target}'`);\n const result = await captureTarget(\n {\n target,\n scene: sceneFor(target),\n draw: {\n content: info.content,\n positionDependsOn: info.positionDependsOn,\n config: opts.config?.(),\n meaning: opts.meaning,\n },\n base: info.base,\n onWarn: (message) => console.warn(`[labkit] capture: ${message}`),\n },\n captureOpts,\n );\n opts.onCapture?.(result);\n return result;\n },\n\n toJSON(): SerializedAnnotations {\n const out: Record<string, unknown> = {};\n for (const [target, scene] of scenes) out[target] = scene.toJSON();\n return { version: 1, scenes: out };\n },\n };\n}\n\n/** Rebuild a store from what `toJSON` wrote. Unknown or future versions give\n * an empty store rather than throwing: a lab that cannot read its marks\n * should still open. */\nexport function annotationsFromJSON(\n raw: unknown,\n targets: () => readonly AnnotationTargetInfo[],\n rest: Omit<AnnotationStoreOptions, 'targets' | 'restore'> = {},\n): AnnotationsApi {\n const doc = raw as Partial<SerializedAnnotations> | null;\n if (doc?.version !== 1 || !doc.scenes) return createAnnotationStore({ targets, ...rest });\n return createAnnotationStore({ targets, restore: doc.scenes, ...rest });\n}\n","import type { View } from '@weasel-js/core';\nimport type { ViewTransform } from '../instrument/types';\n\n/** A target's world in CSS pixels: the box its fractions are fractions of. */\nexport interface ContentSize {\n w: number;\n h: number;\n}\n\n/** A target's drawn box on the surface, in CSS pixels. */\nexport interface PaneSize {\n w: number;\n h: number;\n}\n\n/** labkit's camera in weasel's shape. Zoom is uniform, so it lands on both\n * scale axes; pan is weasel's translation unchanged. */\nexport function toWeaselView(v: ViewTransform): View {\n return { x: v.pan.x, y: v.pan.y, scale: { x: v.zoom, y: v.zoom } };\n}\n\n/** The inverse. A weasel view with unequal axis scales collapses to its x —\n * labkit's camera has one zoom and cannot hold the other. */\nexport function fromWeaselView(v: View): ViewTransform {\n return { zoom: v.scale.x, pan: { x: v.x, y: v.y } };\n}\n\n/**\n * The camera a target with none of its own draws through: its content box\n * scaled to fit the box it is drawn in, anchored at the origin.\n *\n * The spec calls the camera \"a plain scale\" at zoom 1; zoom 1 is only right\n * when the pane happens to be the content's size, and a mark drawn on a\n * scaled-down pane otherwise lands outside it.\n */\nexport function fitView(content: ContentSize, pane: PaneSize): ViewTransform {\n const zoom =\n content.w > 0 && content.h > 0 ? Math.min(pane.w / content.w, pane.h / content.h) : 1;\n return { zoom: Number.isFinite(zoom) && zoom > 0 ? zoom : 1, pan: { x: 0, y: 0 } };\n}\n","import {\n type InsertNodeFactory,\n SceneCanvas,\n type SceneCanvasApi,\n useActiveToolContext,\n type View,\n WeaselProvider,\n} from '@weasel-js/core';\nimport { type CSSProperties, useEffect, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport type { Rect } from '../surface/rect';\nimport { useSurfaceCanvas, useSurfaceOptional, useTileId } from '../surface/useSurfaceTile';\nimport { createMarkDrawOne } from './drawOne';\nimport type { WorldRect } from './frac';\nimport { seenFrom } from './staleness';\nimport type { MarkScene } from './store';\nimport { ANNOTATION_WEASEL_TOOLS, annotationToolInfo } from './toolMap';\nimport type {\n AnnotationData,\n AnnotationKind,\n AnnotationMeaning,\n AnnotationTarget,\n FracPoint,\n} from './types';\nimport { fitView, toWeaselView } from './view';\n\n/** Props for `<AnnotationOverlay>`. */\nexport interface AnnotationOverlayProps {\n target: AnnotationTarget;\n /** The trial's mark scene — shared by every target; a mark's own `target`\n * field is what separates them. */\n scene: MarkScene;\n /** Snapshotted onto each new mark, so staleness can be answered later. */\n config: unknown;\n /** The trial's resolved tool slot. */\n activeToolId: string | null;\n /** The instrument's vocabulary, for a status's colour. */\n meaning?: AnnotationMeaning;\n}\n\nconst sameRect = (a: Rect | null, b: Rect): boolean =>\n a !== null && a.x === b.x && a.y === b.y && a.w === b.w && a.h === b.h;\n\n/** Pushes the trial's tool into the weasel scope this pane owns. Its own\n * component because the context only exists below `<WeaselProvider>`. */\nfunction ToolBridge({ toolId }: { toolId: string }) {\n const tools = useActiveToolContext();\n const setActive = tools.setActive;\n useEffect(() => {\n setActive(toolId);\n }, [toolId, setActive]);\n return null;\n}\n\n/** Every vertex the insert carried, in fractions of the content box. */\nfunction pointsOf(\n extras: Record<string, unknown>,\n content: { w: number; h: number },\n): readonly FracPoint[] | undefined {\n const toFrac = (p: { x: number; y: number }): FracPoint => ({\n x: content.w === 0 ? 0 : p.x / content.w,\n y: content.h === 0 ? 0 : p.y / content.h,\n });\n if (extras.kind === 'line') {\n return [toFrac(extras.a as FracPoint), toFrac(extras.b as FracPoint)];\n }\n if (extras.kind === 'pencil') {\n return (extras.samples as { x: number; y: number }[]).map(toFrac);\n }\n return undefined;\n}\n\n/**\n * One target's drawing surface: a transparent box over the target's element\n * taking the input, and a `<SceneCanvas>` painting into the lab's shared\n * buffer at that box's rect.\n *\n * The box is portalled into the surface container because that is what tile\n * rects are measured against; positioning it among the instrument's own DOM\n * would put it in whatever positioning context happened to be there.\n */\nexport function AnnotationOverlay({\n target,\n scene,\n config,\n activeToolId,\n meaning,\n}: AnnotationOverlayProps) {\n const surface = useSurfaceOptional();\n const canvas = useSurfaceCanvas();\n const [rect, setRect] = useState<Rect | null>(null);\n const [input, setInput] = useState<HTMLDivElement | null>(null);\n const sceneCanvas = useRef<SceneCanvasApi | null>(null);\n\n // Read in the insert factory, which is built once and must see the tool the\n // pane is holding now — `arrow` and `stroke` are indistinguishable from\n // `line` and `pencil` at the weasel end.\n const toolRef = useRef(activeToolId);\n toolRef.current = activeToolId;\n const configRef = useRef(config);\n configRef.current = config;\n\n const id = target.id;\n // The surface's tile namespace is the whole lab's, and every trial of an\n // instrument declares the same target ids — so the tile is registered under\n // the trial-scoped key, not under `id`.\n const tileId = useTileId(id);\n const lastTile = useRef<HTMLElement | null>(null);\n useEffect(() => {\n const el = target.ref.current ?? null;\n if (el === lastTile.current) return;\n lastTile.current = el;\n surface?.registerTile(tileId, el);\n });\n useEffect(\n () => () => {\n // Clearing this is what lets the effect above re-register on the next\n // commit. StrictMode's mount / unmount / mount would otherwise take the\n // tile out and never put it back, and the surface would measure nothing.\n lastTile.current = null;\n surface?.registerTile(tileId, null);\n },\n [surface, tileId],\n );\n\n useEffect(\n () =>\n surface?.registerPainter(tileId, (next) => {\n setRect((prev) => (sameRect(prev, next) ? prev : next));\n // The shared buffer was cleared if it resized this frame; this pane's\n // own loop has no way to know that.\n sceneCanvas.current?.requestRedraw();\n }),\n [surface, tileId],\n );\n\n const container = surface?.getContainer() ?? null;\n if (!container || !rect) return null;\n\n const view: View = toWeaselView(target.view ?? fitView(target.content, { w: rect.w, h: rect.h }));\n\n const drawOne = createMarkDrawOne({\n content: target.content,\n positionDependsOn: target.positionDependsOn,\n config,\n meaning,\n });\n\n const factories: Record<string, InsertNodeFactory> = {};\n for (const weaselTool of ANNOTATION_WEASEL_TOOLS) {\n factories[weaselTool] = (_bounds, extras) => {\n const info = annotationToolInfo(toolRef.current);\n const kind: AnnotationKind | undefined = info?.kind;\n if (!kind) return null;\n const points = pointsOf(extras as unknown as Record<string, unknown>, target.content);\n const data: AnnotationData = {\n target: id,\n kind,\n ...(points ? { points } : {}),\n seen: seenFrom(configRef.current, target.positionDependsOn ?? []),\n };\n return { data };\n };\n }\n\n // A measured rect has nowhere to live but the element's own style. Set as\n // custom properties, which the stylesheet reads — the sanctioned use.\n const box = {\n ['--lk-anno-x' as string]: `${rect.x}px`,\n ['--lk-anno-y' as string]: `${rect.y}px`,\n ['--lk-anno-w' as string]: `${rect.w}px`,\n ['--lk-anno-h' as string]: `${rect.h}px`,\n } as CSSProperties;\n\n return createPortal(\n <>\n <div\n ref={setInput}\n className=\"lk-annotate__input\"\n data-annotation-target={id}\n role=\"application\"\n aria-label={`Annotations on ${id}`}\n // biome-ignore lint/a11y/noNoninteractiveTabindex: role=\"application\" IS the interactive case — a region with its own keymap. The rule's allowed-role list stops at the native widget roles and does not include it, and the gesture dispatcher listens on this element, so without focus no tool's keyboard binding ever fires.\n tabIndex={0}\n style={box}\n />\n {canvas && input ? (\n // One scope per pane: a shared <ActionsProvider> lets only the newest\n // canvas under it respond to input, and the rest go silently dead.\n <WeaselProvider isolate>\n <ToolBridge toolId={annotationToolInfo(activeToolId)?.weaselTool ?? 'select'} />\n <SceneCanvas<AnnotationData, 'marks', WorldRect>\n ref={sceneCanvas}\n scene={scene}\n width={rect.w}\n height={rect.h}\n view={view}\n paintInto={{ canvas, x: rect.x, y: rect.y }}\n inputElement={input}\n defaultTools={ANNOTATION_WEASEL_TOOLS}\n insertNodeFactories={factories}\n layers={{ scene: { drawOne } }}\n />\n </WeaselProvider>\n ) : null}\n </>,\n container,\n );\n}\n","import { AnnotationOverlay } from './AnnotationOverlay';\nimport type { AnnotationsApi, AnnotationsCapability } from './types';\n\n/** Props for `<AnnotationTargets>`. */\nexport interface AnnotationTargetsProps {\n capability: AnnotationsCapability;\n state: unknown;\n config: unknown;\n annotations: AnnotationsApi;\n activeToolId: string | null;\n}\n\n/** One overlay per region the instrument said accepts marks. */\nexport function AnnotationTargets({\n capability,\n state,\n config,\n annotations,\n activeToolId,\n}: AnnotationTargetsProps) {\n const targets = capability.targets(state, config);\n\n return (\n <>\n {targets.map((t) => (\n <AnnotationOverlay\n key={t.id}\n target={t}\n scene={annotations.sceneFor(t.id)}\n meaning={capability.meaning}\n config={config}\n activeToolId={activeToolId}\n />\n ))}\n </>\n );\n}\n","import type { PrefLeaf } from '@weasel-js/ui';\nimport type {\n Annotations,\n ConfigNode,\n ConfigOption,\n ConfigSchema,\n ControlRenderer,\n InferConfig,\n NodeOptions,\n} from './types';\n\n/** Shared chaining surface. Every method clones, so a node can be reused as a\n * base for several leaves without one bleeding into the next. */\nabstract class BaseNode<T> implements ConfigNode<T> {\n abstract readonly kind: string | null;\n\n // `default` is a reserved word in a parameter position, so the field is\n // declared rather than taken as a parameter property.\n readonly default: T;\n\n constructor(\n defaultValue: T,\n readonly annotations: Readonly<Annotations> = {},\n readonly options: Readonly<NodeOptions> = {},\n ) {\n this.default = defaultValue;\n }\n\n /** Clone into the same subclass. Subclasses with extra constructor\n * arguments override this. */\n protected with(annotations: Annotations, options: NodeOptions): this {\n const Ctor = this.constructor as new (d: T, a: Annotations, o: NodeOptions) => this;\n return new Ctor(this.default, annotations, options);\n }\n\n protected ann(patch: Annotations): this {\n return this.with({ ...this.annotations, ...patch }, this.options);\n }\n\n protected opt(patch: NodeOptions): this {\n return this.with(this.annotations, { ...this.options, ...patch });\n }\n\n /** Human-readable label. Defaults to the key, title-cased. */\n label(name: string): this {\n return this.ann({ name });\n }\n\n /** Longer help text, surfaced as a tooltip on the row label. */\n describe(description: string): this {\n return this.ann({ description });\n }\n\n /** Omit from the panel unless it is asked to show hidden leaves. */\n hidden(): this {\n return this.ann({ hidden: true });\n }\n\n /** Pair with a sibling sharing this id, side-by-side on one row. */\n pair(pair: string): this {\n return this.ann({ pair });\n }\n\n /** Render under a named section heading. */\n section(section: string): this {\n return this.opt({ section });\n }\n\n /** Show this row only while the predicate holds. Presentational — the value\n * stays in config and the instrument still reads it. */\n showIf(predicate: (config: Record<string, unknown>) => boolean): this {\n return this.opt({ showIf: predicate });\n }\n\n /** Draw this one row yourself, keeping the kind, default and validation. */\n render(renderer: ControlRenderer): this {\n return this.opt({ render: renderer });\n }\n}\n\nclass NumberNode extends BaseNode<number> {\n readonly kind = 'number';\n\n /** Bound the value. A number with both bounds renders as a slider. */\n range(min: number, max: number): this {\n return this.ann({ min, max });\n }\n\n step(step: number): this {\n return this.ann({ step });\n }\n\n /** A display suffix for the value — `'px'`, `'ms'`, `'°'`. Presentation only:\n * it is never parsed, and the stored value stays a plain number. */\n suffix(suffix: string): this {\n return this.ann({ suffix });\n }\n\n /** Force a slider even without both bounds. */\n slider(): this {\n return this.ann({ control: 'slider' });\n }\n\n /** Force a typed input even when both bounds are set. */\n input(): this {\n return this.ann({ control: 'input' });\n }\n}\n\nclass BooleanNode extends BaseNode<boolean> {\n readonly kind = 'boolean';\n\n /** Ask for a switch. `ControlPanel` still draws a checkbox; weasel-ui's\n * `PrefsForm` honors the distinction. */\n toggle(): this {\n return this.ann({ control: 'switch' });\n }\n}\n\nclass StringNode extends BaseNode<string> {\n readonly kind = 'string';\n\n placeholder(placeholder: string): this {\n return this.ann({ placeholder });\n }\n\n maxLength(maxLength: number): this {\n return this.ann({ maxLength });\n }\n\n /** Milliseconds to debounce live writes. 0 commits every keystroke. */\n debounce(debounceMs: number): this {\n return this.ann({ debounceMs });\n }\n}\n\nclass ColorNode extends BaseNode<string> {\n readonly kind = 'color';\n}\n\nclass EnumNode<T extends string> extends BaseNode<T> {\n readonly kind = 'enum';\n\n /** Render as a segmented control rather than a select. */\n radio(): this {\n return this.ann({ control: 'radio' });\n }\n\n /** Relabel the choices. Named `labels` rather than `options` because\n * `options` is the node's own extras bag. */\n labels(options: readonly ConfigOption[]): this {\n return this.ann({ options });\n }\n}\n\n/** A leaf whose kind the rule chain decides. */\nclass ValueNode<T> extends BaseNode<T> {\n readonly kind = null;\n}\n\n/** A leaf of a kind labkit does not ship a row for. */\nclass CustomNode<T> extends BaseNode<T> {\n constructor(\n readonly kind: string,\n defaultValue: T,\n annotations: Readonly<Annotations> = {},\n options: Readonly<NodeOptions> = {},\n ) {\n super(defaultValue, annotations, options);\n }\n\n protected override with(annotations: Annotations, options: NodeOptions): this {\n return new CustomNode(this.kind, this.default, annotations, options) as this;\n }\n}\n\nconst expand = <T extends string>(\n options: readonly T[] | readonly ConfigOption[],\n): readonly ConfigOption[] =>\n options.map((o) => (typeof o === 'string' ? { value: o, label: o } : o));\n\n/**\n * Builds an instrument's config: the values, their types, and how each is\n * edited, in one declaration.\n *\n * ```ts\n * const config = f.schema({\n * showGrid: f.boolean(true),\n * cellSize: f.number(20).range(5, 80).step(5).label('Grid spacing'),\n * })\n * ```\n */\nexport const f = {\n number: (def: number): NumberNode => new NumberNode(def),\n boolean: (def: boolean): BooleanNode => new BooleanNode(def),\n string: (def: string): StringNode => new StringNode(def),\n color: (def: string): ColorNode => new ColorNode(def),\n\n /** A fixed set of choices. The default's literal type flows into the config\n * type, so `f.enum('fast', ['fast', 'accurate'])` gives\n * `'fast' | 'accurate'` with no `as const`. */\n enum: <const T extends string>(\n def: T,\n options: readonly T[] | readonly ConfigOption[],\n ): EnumNode<T> => new EnumNode<T>(def, { options: expand(options) }),\n\n /** A leaf with no declared kind: the rule chain decides, which is how a lab\n * states a convention like \"every `*Color` key is a color picker\". */\n value: <T>(def: T): ValueNode<T> => new ValueNode(def),\n\n /** A leaf of a kind a lab supplies the control for, through `controls`. */\n custom: <T>(kind: string, def: T, validate?: (leaf: PrefLeaf) => string[]): CustomNode<T> =>\n new CustomNode(kind, def, {}, validate ? { validate } : {}),\n\n /** Collect leaves into an instrument's config. */\n schema<S extends Record<string, ConfigNode>>(nodes: S): ConfigSchema<InferConfig<S>> {\n return {\n nodes,\n defaults: () => {\n const out: Record<string, unknown> = {};\n for (const [key, node] of Object.entries(nodes)) out[key] = node.default;\n return out as InferConfig<S>;\n },\n };\n },\n};\n","import type { ConfigRule, ConfigRuleContext, LeafPatch } from './types';\n\n/** `cellSize` -> `Cell size`. Splits camelCase without shattering acronyms. */\nexport function titleCase(key: string): string {\n const words = key\n .replace(/[_-]+/g, ' ')\n .split(/(?<=[a-z0-9])(?=[A-Z])/)\n .join(' ')\n .trim()\n .toLowerCase();\n return words.length === 0 ? words : words[0].toUpperCase() + words.slice(1);\n}\n\n/** An `f.value` leaf takes its kind from the shape of its default. */\nconst kindFromValue: ConfigRule = (ctx) => {\n const t = typeof ctx.default;\n if (t === 'boolean' || t === 'number' || t === 'string') return { kind: t };\n return null;\n};\n\nconst labelFromKey: ConfigRule = (ctx) => ({ name: titleCase(ctx.key) });\n\n/** A number bounded on both sides is a slider; one bound or none is an input. */\nconst sliderWhenBounded: ConfigRule = (ctx) => {\n if (ctx.leaf.kind !== 'number') return null;\n const bounded = ctx.leaf.min !== undefined && ctx.leaf.max !== undefined;\n return bounded ? { control: 'slider' } : null;\n};\n\n/** `PrefBase.description` is required, so every leaf must end up with one. */\nconst descriptionDefault: ConfigRule = () => ({ description: '' });\n\n/**\n * labkit's own inference, expressed in the same vocabulary a consumer\n * extends. Runs after the consumer's rules, so a lab always wins.\n *\n * If one of these ever needs something a `ConfigRule` cannot express, the\n * seam is too weak — that is the point of writing them this way.\n */\nexport const builtinRules: readonly ConfigRule[] = [\n kindFromValue,\n labelFromKey,\n sliderWhenBounded,\n descriptionDefault,\n];\n\n/**\n * Fold a rule chain into one leaf patch. Gap-filling: a property already\n * settled is never overwritten, so the accumulator seeded with the author's\n * annotations beats every rule, and earlier rules beat later ones.\n */\nexport function applyRules(\n seed: LeafPatch,\n ctx: Omit<ConfigRuleContext, 'leaf'>,\n rules: readonly ConfigRule[],\n): LeafPatch {\n const acc: LeafPatch = { ...seed };\n for (const rule of rules) {\n const patch = rule({ ...ctx, leaf: acc });\n if (patch === null) continue;\n for (const [k, v] of Object.entries(patch)) {\n if (v !== undefined && acc[k as keyof LeafPatch] === undefined) {\n (acc as Record<string, unknown>)[k] = v;\n }\n }\n }\n return acc;\n}\n","import type { PrefGroup, PrefLeaf } from '@weasel-js/ui';\nimport { applyRules, builtinRules } from './rules';\nimport type {\n ConfigRule,\n ConfigSchema,\n ControlRenderer,\n LeafPatch,\n ResolvedConfig,\n SectionSpec,\n} from './types';\n\n/** Drop keys whose value is undefined, so an unset annotation stays a gap the\n * rule chain can fill rather than a settled `undefined`. */\nfunction defined(annotations: Record<string, unknown>): LeafPatch {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(annotations)) if (v !== undefined) out[k] = v;\n return out as LeafPatch;\n}\n\n/**\n * Resolve a schema into the vocabulary weasel-ui renders, running each leaf\n * through the consumer's rules and then labkit's own.\n *\n * The group is flat — every leaf is a direct child — so a leaf's path is its\n * config key and both `ControlPanel` and `PrefsForm` address it identically.\n */\nexport function resolveConfigSchema<TC>(\n schema: ConfigSchema<TC>,\n rules: readonly ConfigRule[] = [],\n): ResolvedConfig {\n const children: Record<string, PrefLeaf> = {};\n const sectionOrder: string[] = [];\n const sectionPaths = new Map<string, string[]>();\n const showIf = new Map<string, (config: Record<string, unknown>) => boolean>();\n const renderers: Record<string, ControlRenderer> = {};\n\n const chain = [...rules, ...builtinRules];\n\n for (const [key, node] of Object.entries(schema.nodes)) {\n const seed: LeafPatch = defined({\n ...node.annotations,\n ...(node.kind === null ? {} : { kind: node.kind }),\n });\n\n const patch = applyRules(seed, { key, path: key, default: node.default }, chain);\n children[key] = { ...patch, default: node.default } as PrefLeaf;\n\n const { section, showIf: predicate, render } = node.options;\n if (section !== undefined) {\n if (!sectionPaths.has(section)) {\n sectionOrder.push(section);\n sectionPaths.set(section, []);\n }\n sectionPaths.get(section)?.push(key);\n }\n if (predicate) showIf.set(key, predicate);\n if (render) renderers[key] = render;\n }\n\n const group: PrefGroup = { name: '', children };\n const sections: SectionSpec[] = sectionOrder.map((label) => ({\n label,\n paths: sectionPaths.get(label) ?? [],\n }));\n\n return { group, sections, showIf, renderers };\n}\n","import { createContext, useContext } from 'react';\nimport type { ConfigRule, ControlRenderer } from '../config/types';\nimport type { InstrumentList } from '../instrument/types';\nimport type { LabMode, SavedSnapshot, TrialRecord } from '../state/types';\n\n/** Lab-wide state and commands: the available instruments, the open\n * trials and the operations over them, saved snapshots, and the color\n * mode. */\nexport interface LabContextValue {\n instruments: InstrumentList;\n trials: TrialRecord[];\n addTrial: (instrumentName: string) => void;\n cloneTrial: (id: string) => void;\n closeTrial: (id: string) => void;\n resetTrial: (id: string) => void;\n reorderTrials: (ids: readonly string[]) => void;\n savedSnapshots: SavedSnapshot[];\n saveSnapshot: (trialId: string, name?: string) => void;\n loadSnapshot: (trialId: string, snapshotId: string) => void;\n deleteSnapshot: (snapshotId: string) => void;\n mode: LabMode;\n setMode: (m: LabMode) => void;\n /** Lab-wide rules run over every instrument's config leaves, before\n * labkit's own inference. */\n configRules?: readonly ConfigRule[];\n /** Lab-wide control overrides, keyed by config path or by leaf kind. */\n controls?: Record<string, ControlRenderer>;\n}\n\n/** Context carrying the surrounding lab. Prefer `useLabContext`. */\nexport const LabContext = createContext<LabContextValue | null>(null);\n\n/** The surrounding lab. Throws outside a `<Lab>`. */\nexport function useLabContext(): LabContextValue {\n const ctx = useContext(LabContext);\n if (ctx === null) {\n throw new Error('useLabContext must be used inside <Lab>');\n }\n return ctx;\n}\n","import { useContext, useMemo } from 'react';\nimport type { Instrument } from '../instrument/types';\nimport { LabContext } from '../lab/LabContext';\nimport { fromConfigFields } from './fromConfigField';\nimport { resolveConfigSchema } from './resolve';\nimport type { ResolvedConfig } from './types';\n\nconst NO_RULES: readonly [] = [];\n\n/**\n * An instrument's controls, resolved against the surrounding lab's rules.\n *\n * Resolution cannot happen in `defineInstrument` — rules are lab-scoped and\n * that runs at module load — so it happens here, at render. Both instrument\n * paths land in the same shape, so callers never branch on which was used.\n */\nexport function useConfigSchema(\n // biome-ignore lint/suspicious/noExplicitAny: instruments are stored contravariantly; see InstrumentList\n instrument: Instrument<any, any, any>, // eslint-disable-line @typescript-eslint/no-explicit-any\n): ResolvedConfig {\n const lab = useContext(LabContext);\n const rules = lab?.configRules ?? NO_RULES;\n return useMemo(\n () =>\n instrument.config\n ? resolveConfigSchema(instrument.config, rules)\n : fromConfigFields(instrument.configSchema?.() ?? []),\n [instrument, rules],\n );\n}\n","import type { ConfigSchema } from '../config/types';\nimport type { Instrument } from './types';\n\n/** An instrument as it is written: either the legacy `defaultConfig` (plus an\n * optional `configSchema`), or a `config` schema that supplies both. */\nexport type InstrumentSpec<TS, TC, TItem = unknown> =\n | Instrument<TS, TC, TItem>\n | (Omit<Instrument<TS, TC, TItem>, 'defaultConfig'> & { config: ConfigSchema<TC> });\n\n/**\n * Normalizes an instrument spec, and infers its state and config types from\n * the literal rather than making them be written out.\n *\n * A spec declaring `config` gets its `defaultConfig` synthesized from the\n * schema, so nothing downstream branches on which way the config was\n * declared. A spec written the legacy way is returned unchanged, by\n * reference.\n *\n * Resolving the schema into controls does not happen here: rules are\n * lab-scoped and this runs at module load. `useConfigSchema` does that.\n *\n * TypeScript infers all three type arguments or none, so a call that names\n * `TS` and `TC` leaves `TItem` at `unknown` and a job's `onItem` needs a cast.\n * Name the item type too, or pass no type arguments at all.\n */\nexport function defineInstrument<TS, TC, TItem = unknown>(\n spec: InstrumentSpec<TS, TC, TItem>,\n): Instrument<TS, TC, TItem> {\n if (spec.config && !('defaultConfig' in spec && spec.defaultConfig)) {\n const schema = spec.config;\n return { ...spec, defaultConfig: () => schema.defaults() } as Instrument<TS, TC, TItem>;\n }\n return spec as Instrument<TS, TC, TItem>;\n}\n","import type { ConfigField } from '../controls/types';\n\n/** Whether a config schema is usable, and every problem found rather than\n * just the first. */\nexport interface ValidationResult {\n valid: boolean;\n errors: string[];\n}\n\n/** Check a config schema for the mistakes that would otherwise surface as a\n * silently broken control: empty or duplicate keys, and fields whose own\n * constraints do not hold.\n *\n * An unrecognized type is not an error — a lab supplies controls for its own\n * kinds through `ControlPanel`'s `renderers`, and this cannot see them. Such\n * a field simply has no constraints to check here. */\nexport function validateConfigSchema(fields: ConfigField[]): ValidationResult {\n const errors: string[] = [];\n const seenKeys = new Set<string>();\n\n for (const field of fields) {\n if (field.key === '') {\n errors.push('Field has empty key');\n } else if (seenKeys.has(field.key)) {\n errors.push(`Duplicate config key: \"${field.key}\"`);\n } else {\n seenKeys.add(field.key);\n }\n\n if (field.label === '') {\n errors.push(`Field \"${field.key}\" has empty label`);\n }\n\n if (field.type === 'slider') {\n if (!Number.isFinite(field.default)) {\n errors.push(`Field \"${field.key}\": default must be a finite number`);\n }\n if (field.min >= field.max) {\n errors.push(`Slider \"${field.key}\": min must be < max`);\n } else if (field.default < field.min || field.default > field.max) {\n errors.push(`Slider \"${field.key}\": default ${field.default} is outside [min, max]`);\n }\n } else if (field.type === 'number') {\n if (!Number.isFinite(field.default)) {\n errors.push(`Field \"${field.key}\": default must be a finite number`);\n }\n } else if (field.type === 'select') {\n if (field.options.length === 0) {\n errors.push(`Select \"${field.key}\": options array must not be empty`);\n } else {\n const seenValues = new Set<string>();\n for (const opt of field.options) {\n if (seenValues.has(opt.value)) {\n errors.push(`Select \"${field.key}\": duplicate option value \"${opt.value}\"`);\n } else {\n seenValues.add(opt.value);\n }\n }\n if (!seenValues.has(field.default)) {\n errors.push(`Select \"${field.key}\": default \"${field.default}\" is not among options`);\n }\n }\n }\n }\n\n return { valid: errors.length === 0, errors };\n}\n","// GENERATED by packages/theme/scripts/build-tokens.ts — do not edit.\n\nimport type { RawToken } from '../dtcg/types';\n\n/** Every design token the built-in themes declare, spelled as the CSS\n * custom property it becomes. */\nexport type TokenName =\n | '--wzl-accent'\n | '--wzl-accent-base'\n | '--wzl-accent-fg'\n | '--wzl-accent-hover'\n | '--wzl-accent-soft'\n | '--wzl-accent-strong'\n | '--wzl-backdrop'\n | '--wzl-border'\n | '--wzl-border-raised'\n | '--wzl-border-strong'\n | '--wzl-border-w'\n | '--wzl-control-h'\n | '--wzl-curve-color'\n | '--wzl-curve-width'\n | '--wzl-danger'\n | '--wzl-danger-base'\n | '--wzl-ease-in-cubic'\n | '--wzl-ease-in-out-cubic'\n | '--wzl-ease-out-back'\n | '--wzl-ease-out-cubic'\n | '--wzl-fg'\n | '--wzl-fg-inverse'\n | '--wzl-fg-muted'\n | '--wzl-fg-on-accent'\n | '--wzl-fg-subtle'\n | '--wzl-field-pad-x'\n | '--wzl-focus-ring'\n | '--wzl-font-body'\n | '--wzl-font-display'\n | '--wzl-font-mono'\n | '--wzl-font-size'\n | '--wzl-font-size-2xs'\n | '--wzl-font-size-lg'\n | '--wzl-font-size-sm'\n | '--wzl-font-size-xl'\n | '--wzl-font-size-xs'\n | '--wzl-font-ui'\n | '--wzl-font-weight-bold'\n | '--wzl-font-weight-light'\n | '--wzl-font-weight-medium'\n | '--wzl-font-weight-normal'\n | '--wzl-glass-blur'\n | '--wzl-glass-tint'\n | '--wzl-gray-100'\n | '--wzl-gray-200'\n | '--wzl-gray-300'\n | '--wzl-gray-400'\n | '--wzl-gray-50'\n | '--wzl-gray-500'\n | '--wzl-gray-600'\n | '--wzl-gray-700'\n | '--wzl-gray-800'\n | '--wzl-gray-900'\n | '--wzl-leading'\n | '--wzl-leading-snug'\n | '--wzl-leading-tight'\n | '--wzl-line'\n | '--wzl-line-strong'\n | '--wzl-line-subtle'\n | '--wzl-line-width'\n | '--wzl-motion-fast'\n | '--wzl-motion-medium'\n | '--wzl-radius-lg'\n | '--wzl-radius-md'\n | '--wzl-radius-pill'\n | '--wzl-radius-sm'\n | '--wzl-shadow'\n | '--wzl-slider-thumb-size'\n | '--wzl-slider-thumb-tint'\n | '--wzl-slider-track-h'\n | '--wzl-slider-track-tint'\n | '--wzl-space-lg'\n | '--wzl-space-md'\n | '--wzl-space-sm'\n | '--wzl-space-xs'\n | '--wzl-success'\n | '--wzl-success-base'\n | '--wzl-surface'\n | '--wzl-surface-hover'\n | '--wzl-surface-pressed'\n | '--wzl-surface-raised'\n | '--wzl-surface-sunken'\n | '--wzl-swatch-amber'\n | '--wzl-swatch-cyan'\n | '--wzl-swatch-gold'\n | '--wzl-swatch-green'\n | '--wzl-swatch-magenta'\n | '--wzl-swatch-mint'\n | '--wzl-swatch-orange'\n | '--wzl-swatch-pink'\n | '--wzl-swatch-sky'\n | '--wzl-swatch-violet'\n | '--wzl-tb-height'\n | '--wzl-tracking-none'\n | '--wzl-tracking-wide'\n | '--wzl-tracking-wider'\n | '--wzl-warning'\n | '--wzl-warning-base'\n | '--wzl-z-modal'\n | '--wzl-z-overlay'\n | '--wzl-z-toolbar';\n\n/** A built-in theme with its aliases already collapsed: every mode maps\n * every token name to a final CSS value. */\nexport interface GeneratedTheme {\n readonly name: string;\n readonly defaultMode: string;\n readonly modes: Readonly<Record<string, Readonly<Record<TokenName, string>>>>;\n}\n\n/** The built-in themes, resolved, keyed by theme name. Read this to list\n * or preview themes without resolving a token graph yourself. */\nexport const THEMES = {\n \"weasel\": {\n name: \"weasel\",\n defaultMode: \"dark\",\n modes: {\n \"dark\": {\n '--wzl-gray-50': \"#f5f5f6\",\n '--wzl-gray-100': \"#e6e7e9\",\n '--wzl-gray-200': \"#c9cbcf\",\n '--wzl-gray-300': \"#9ea1a8\",\n '--wzl-gray-400': \"#6f737b\",\n '--wzl-gray-500': \"#4d5058\",\n '--wzl-gray-600': \"#383b42\",\n '--wzl-gray-700': \"#25272c\",\n '--wzl-gray-800': \"#181a1e\",\n '--wzl-gray-900': \"#0e0f12\",\n '--wzl-accent-soft': \"#1d1454\",\n '--wzl-accent-base': \"#2e1f7a\",\n '--wzl-accent-strong': \"#5841b8\",\n '--wzl-danger-base': \"#d94a3f\",\n '--wzl-warning-base': \"#d99a3f\",\n '--wzl-success-base': \"#2ec27e\",\n '--wzl-fg-on-accent': \"#f5f5f6\",\n '--wzl-fg': \"#e6e7e9\",\n '--wzl-line-subtle': \"rgba(230, 231, 233, 0.1)\",\n '--wzl-line': \"rgba(230, 231, 233, 0.2)\",\n '--wzl-line-strong': \"rgba(230, 231, 233, 0.4)\",\n '--wzl-curve-color': \"#5841b8\",\n '--wzl-accent': \"#2e1f7a\",\n '--wzl-accent-hover': \"#5841b8\",\n '--wzl-danger': \"#d94a3f\",\n '--wzl-warning': \"#d99a3f\",\n '--wzl-success': \"#2ec27e\",\n '--wzl-focus-ring': \"#5841b8\",\n '--wzl-glass-tint': \"#2e1f7a\",\n '--wzl-surface-hover': \"rgba(230, 231, 233, 0.1)\",\n '--wzl-surface-pressed': \"rgba(230, 231, 233, 0.18)\",\n '--wzl-swatch-green': \"#2fdd18\",\n '--wzl-swatch-pink': \"#ff5885\",\n '--wzl-swatch-cyan': \"#00dfff\",\n '--wzl-swatch-gold': \"#dcb700\",\n '--wzl-swatch-amber': \"#ff8c00\",\n '--wzl-swatch-violet': \"#a497ff\",\n '--wzl-swatch-mint': \"#00e7af\",\n '--wzl-swatch-sky': \"#00b8ff\",\n '--wzl-swatch-orange': \"#ff6b00\",\n '--wzl-swatch-magenta': \"#ff6eff\",\n '--wzl-radius-sm': \"3px\",\n '--wzl-radius-md': \"5px\",\n '--wzl-radius-lg': \"14px\",\n '--wzl-radius-pill': \"999px\",\n '--wzl-border-w': \"1px\",\n '--wzl-line-width': \"2px\",\n '--wzl-curve-width': \"3px\",\n '--wzl-tb-height': \"28px\",\n '--wzl-control-h': \"24px\",\n '--wzl-slider-track-h': \"4px\",\n '--wzl-slider-thumb-size': \"8px\",\n '--wzl-slider-track-tint': \"18%\",\n '--wzl-slider-thumb-tint': \"70%\",\n '--wzl-field-pad-x': \"8px\",\n '--wzl-glass-blur': \"3px\",\n '--wzl-font-size-2xs': \"9px\",\n '--wzl-font-size-xs': \"10px\",\n '--wzl-font-size-sm': \"11px\",\n '--wzl-font-size': \"13px\",\n '--wzl-font-size-lg': \"16px\",\n '--wzl-font-size-xl': \"20px\",\n '--wzl-space-xs': \"4px\",\n '--wzl-space-sm': \"8px\",\n '--wzl-space-md': \"12px\",\n '--wzl-space-lg': \"16px\",\n '--wzl-tracking-none': \"0\",\n '--wzl-tracking-wide': \"0.06em\",\n '--wzl-tracking-wider': \"0.08em\",\n '--wzl-z-toolbar': \"10\",\n '--wzl-z-overlay': \"20\",\n '--wzl-z-modal': \"30\",\n '--wzl-leading-tight': \"1\",\n '--wzl-leading-snug': \"1.2\",\n '--wzl-leading': \"1.4\",\n '--wzl-backdrop': \"none\",\n '--wzl-motion-fast': \"120ms\",\n '--wzl-motion-medium': \"240ms\",\n '--wzl-ease-in-cubic': \"cubic-bezier(0.32, 0, 0.67, 0)\",\n '--wzl-ease-out-cubic': \"cubic-bezier(0.33, 1, 0.68, 1)\",\n '--wzl-ease-in-out-cubic': \"cubic-bezier(0.65, 0, 0.35, 1)\",\n '--wzl-ease-out-back': \"cubic-bezier(0.34, 1.56, 0.64, 1)\",\n '--wzl-font-ui': \"Oswald, 'Helvetica Neue Condensed', 'Arial Narrow', system-ui, sans-serif\",\n '--wzl-font-display': \"Oswald, 'Helvetica Neue Condensed', 'Arial Narrow', system-ui, sans-serif\",\n '--wzl-font-body': \"Inter, system-ui, -apple-system, 'Segoe UI', sans-serif\",\n '--wzl-font-mono': \"ui-monospace, SFMono-Regular, Menlo, Consolas, monospace\",\n '--wzl-font-weight-light': \"200\",\n '--wzl-font-weight-normal': \"300\",\n '--wzl-font-weight-medium': \"350\",\n '--wzl-font-weight-bold': \"400\",\n '--wzl-surface': \"#181a1e\",\n '--wzl-surface-raised': \"#25272c\",\n '--wzl-surface-sunken': \"#0e0f12\",\n '--wzl-fg-muted': \"#9ea1a8\",\n '--wzl-fg-subtle': \"#6f737b\",\n '--wzl-border': \"#25272c\",\n '--wzl-border-strong': \"#383b42\",\n '--wzl-accent-fg': \"#5841b8\",\n '--wzl-fg-inverse': \"#0e0f12\",\n '--wzl-shadow': \"rgba(0, 0, 0, 0.6)\",\n '--wzl-border-raised': \"#6f737b\",\n },\n \"light\": {\n '--wzl-gray-50': \"#f5f5f6\",\n '--wzl-gray-100': \"#e6e7e9\",\n '--wzl-gray-200': \"#c9cbcf\",\n '--wzl-gray-300': \"#9ea1a8\",\n '--wzl-gray-400': \"#6f737b\",\n '--wzl-gray-500': \"#4d5058\",\n '--wzl-gray-600': \"#383b42\",\n '--wzl-gray-700': \"#25272c\",\n '--wzl-gray-800': \"#181a1e\",\n '--wzl-gray-900': \"#0e0f12\",\n '--wzl-accent-soft': \"#1d1454\",\n '--wzl-accent-base': \"#2e1f7a\",\n '--wzl-accent-strong': \"#5841b8\",\n '--wzl-danger-base': \"#d94a3f\",\n '--wzl-warning-base': \"#d99a3f\",\n '--wzl-success-base': \"#2ec27e\",\n '--wzl-fg-on-accent': \"#f5f5f6\",\n '--wzl-fg': \"#0e0f12\",\n '--wzl-line-subtle': \"rgba(14, 15, 18, 0.1)\",\n '--wzl-line': \"rgba(14, 15, 18, 0.2)\",\n '--wzl-line-strong': \"rgba(14, 15, 18, 0.4)\",\n '--wzl-curve-color': \"#5841b8\",\n '--wzl-accent': \"#2e1f7a\",\n '--wzl-accent-hover': \"#5841b8\",\n '--wzl-danger': \"#d94a3f\",\n '--wzl-warning': \"#d99a3f\",\n '--wzl-success': \"#2ec27e\",\n '--wzl-focus-ring': \"#5841b8\",\n '--wzl-glass-tint': \"#2e1f7a\",\n '--wzl-surface-hover': \"rgba(14, 15, 18, 0.1)\",\n '--wzl-surface-pressed': \"rgba(14, 15, 18, 0.18)\",\n '--wzl-swatch-green': \"#2fdd18\",\n '--wzl-swatch-pink': \"#ff5885\",\n '--wzl-swatch-cyan': \"#00dfff\",\n '--wzl-swatch-gold': \"#dcb700\",\n '--wzl-swatch-amber': \"#ff8c00\",\n '--wzl-swatch-violet': \"#a497ff\",\n '--wzl-swatch-mint': \"#00e7af\",\n '--wzl-swatch-sky': \"#00b8ff\",\n '--wzl-swatch-orange': \"#ff6b00\",\n '--wzl-swatch-magenta': \"#ff6eff\",\n '--wzl-radius-sm': \"3px\",\n '--wzl-radius-md': \"5px\",\n '--wzl-radius-lg': \"14px\",\n '--wzl-radius-pill': \"999px\",\n '--wzl-border-w': \"1px\",\n '--wzl-line-width': \"2px\",\n '--wzl-curve-width': \"3px\",\n '--wzl-tb-height': \"28px\",\n '--wzl-control-h': \"24px\",\n '--wzl-slider-track-h': \"4px\",\n '--wzl-slider-thumb-size': \"8px\",\n '--wzl-slider-track-tint': \"18%\",\n '--wzl-slider-thumb-tint': \"70%\",\n '--wzl-field-pad-x': \"8px\",\n '--wzl-glass-blur': \"3px\",\n '--wzl-font-size-2xs': \"9px\",\n '--wzl-font-size-xs': \"10px\",\n '--wzl-font-size-sm': \"11px\",\n '--wzl-font-size': \"13px\",\n '--wzl-font-size-lg': \"16px\",\n '--wzl-font-size-xl': \"20px\",\n '--wzl-space-xs': \"4px\",\n '--wzl-space-sm': \"8px\",\n '--wzl-space-md': \"12px\",\n '--wzl-space-lg': \"16px\",\n '--wzl-tracking-none': \"0\",\n '--wzl-tracking-wide': \"0.06em\",\n '--wzl-tracking-wider': \"0.08em\",\n '--wzl-z-toolbar': \"10\",\n '--wzl-z-overlay': \"20\",\n '--wzl-z-modal': \"30\",\n '--wzl-leading-tight': \"1\",\n '--wzl-leading-snug': \"1.2\",\n '--wzl-leading': \"1.4\",\n '--wzl-backdrop': \"none\",\n '--wzl-motion-fast': \"120ms\",\n '--wzl-motion-medium': \"240ms\",\n '--wzl-ease-in-cubic': \"cubic-bezier(0.32, 0, 0.67, 0)\",\n '--wzl-ease-out-cubic': \"cubic-bezier(0.33, 1, 0.68, 1)\",\n '--wzl-ease-in-out-cubic': \"cubic-bezier(0.65, 0, 0.35, 1)\",\n '--wzl-ease-out-back': \"cubic-bezier(0.34, 1.56, 0.64, 1)\",\n '--wzl-font-ui': \"Oswald, 'Helvetica Neue Condensed', 'Arial Narrow', system-ui, sans-serif\",\n '--wzl-font-display': \"Oswald, 'Helvetica Neue Condensed', 'Arial Narrow', system-ui, sans-serif\",\n '--wzl-font-body': \"Inter, system-ui, -apple-system, 'Segoe UI', sans-serif\",\n '--wzl-font-mono': \"ui-monospace, SFMono-Regular, Menlo, Consolas, monospace\",\n '--wzl-font-weight-light': \"200\",\n '--wzl-font-weight-normal': \"300\",\n '--wzl-font-weight-medium': \"350\",\n '--wzl-font-weight-bold': \"400\",\n '--wzl-surface': \"#f5f5f6\",\n '--wzl-surface-raised': \"#e6e7e9\",\n '--wzl-surface-sunken': \"#c9cbcf\",\n '--wzl-fg-muted': \"#383b42\",\n '--wzl-fg-subtle': \"#4d5058\",\n '--wzl-border': \"#c9cbcf\",\n '--wzl-border-strong': \"#9ea1a8\",\n '--wzl-accent-fg': \"#2e1f7a\",\n '--wzl-fg-inverse': \"#f5f5f6\",\n '--wzl-shadow': \"rgba(0, 0, 0, 0.18)\",\n '--wzl-border-raised': \"#6f737b\",\n },\n },\n },\n} as const satisfies Record<string, GeneratedTheme>;\n\n/** Unresolved token graph. `extends` needs the aliases intact so an override\n * of a base primitive still reaches everything referencing it. */\nexport interface ThemeSource {\n readonly primitives: Readonly<Record<string, RawToken>>;\n readonly modes: Readonly<Record<string, Readonly<Record<string, RawToken>>>>;\n}\n\n/** The same built-in themes as `THEMES`, unresolved. This is what\n * `defineTheme` layers onto. */\nexport const THEME_SOURCES: Readonly<Record<string, ThemeSource>> = {\n \"weasel\": {\n \"primitives\": {\n \"gray-50\": {\n \"type\": \"color\",\n \"value\": \"#f5f5f6\"\n },\n \"gray-100\": {\n \"type\": \"color\",\n \"value\": \"#e6e7e9\"\n },\n \"gray-200\": {\n \"type\": \"color\",\n \"value\": \"#c9cbcf\"\n },\n \"gray-300\": {\n \"type\": \"color\",\n \"value\": \"#9ea1a8\"\n },\n \"gray-400\": {\n \"type\": \"color\",\n \"value\": \"#6f737b\"\n },\n \"gray-500\": {\n \"type\": \"color\",\n \"value\": \"#4d5058\"\n },\n \"gray-600\": {\n \"type\": \"color\",\n \"value\": \"#383b42\"\n },\n \"gray-700\": {\n \"type\": \"color\",\n \"value\": \"#25272c\"\n },\n \"gray-800\": {\n \"type\": \"color\",\n \"value\": \"#181a1e\"\n },\n \"gray-900\": {\n \"type\": \"color\",\n \"value\": \"#0e0f12\"\n },\n \"accent-soft\": {\n \"type\": \"color\",\n \"value\": \"#1d1454\"\n },\n \"accent-base\": {\n \"type\": \"color\",\n \"value\": \"#2e1f7a\",\n \"description\": \"Midnight blue-violet. Deep and saturated; anchors primary actions on light and dark surfaces alike.\"\n },\n \"accent-strong\": {\n \"type\": \"color\",\n \"value\": \"#5841b8\"\n },\n \"danger-base\": {\n \"type\": \"color\",\n \"value\": \"#d94a3f\"\n },\n \"warning-base\": {\n \"type\": \"color\",\n \"value\": \"#d99a3f\"\n },\n \"success-base\": {\n \"type\": \"color\",\n \"value\": \"#2ec27e\"\n },\n \"fg-on-accent\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-50}\"\n },\n \"line-subtle\": {\n \"type\": \"color\",\n \"value\": \"{color.fg}\",\n \"alpha\": 0.1,\n \"description\": \"Barely-there separators (table rows).\"\n },\n \"line\": {\n \"type\": \"color\",\n \"value\": \"{color.fg}\",\n \"alpha\": 0.2,\n \"description\": \"Primary gridlines on sunken surfaces.\"\n },\n \"line-strong\": {\n \"type\": \"color\",\n \"value\": \"{color.fg}\",\n \"alpha\": 0.4,\n \"description\": \"Axes and emphasized dividers.\"\n },\n \"curve-color\": {\n \"type\": \"color\",\n \"value\": \"{color.accent-strong}\",\n \"description\": \"Drawn data curves. Routes through the bright accent because accent-base is too dim on sunken surfaces.\"\n },\n \"accent\": {\n \"type\": \"color\",\n \"value\": \"{color.accent-base}\"\n },\n \"accent-hover\": {\n \"type\": \"color\",\n \"value\": \"{color.accent-strong}\"\n },\n \"danger\": {\n \"type\": \"color\",\n \"value\": \"{color.danger-base}\"\n },\n \"warning\": {\n \"type\": \"color\",\n \"value\": \"{color.warning-base}\"\n },\n \"success\": {\n \"type\": \"color\",\n \"value\": \"{color.success-base}\"\n },\n \"focus-ring\": {\n \"type\": \"color\",\n \"value\": \"{color.accent-strong}\"\n },\n \"glass-tint\": {\n \"type\": \"color\",\n \"value\": \"{color.accent}\",\n \"description\": \"Frosted-glass tint. Components compose it as color-mix(in srgb, var(--wzl-glass-tint) 78%, transparent) with backdrop-filter: blur(3px).\"\n },\n \"surface-hover\": {\n \"type\": \"color\",\n \"value\": \"{color.fg}\",\n \"alpha\": 0.1,\n \"description\": \"Hover wash over a raised surface. Same formula as line-subtle, different job — do not collapse them.\"\n },\n \"surface-pressed\": {\n \"type\": \"color\",\n \"value\": \"{color.fg}\",\n \"alpha\": 0.18,\n \"description\": \"Pressed wash over a raised surface.\"\n },\n \"swatch-green\": {\n \"type\": \"color\",\n \"value\": \"#2fdd18\",\n \"description\": \"First of ten categorical spot colors for plotting, status and data viz. Ordered — take them in sequence. Mode-invariant on purpose: a series keeps its color when the mode flips.\"\n },\n \"swatch-pink\": {\n \"type\": \"color\",\n \"value\": \"#ff5885\"\n },\n \"swatch-cyan\": {\n \"type\": \"color\",\n \"value\": \"#00dfff\"\n },\n \"swatch-gold\": {\n \"type\": \"color\",\n \"value\": \"#dcb700\"\n },\n \"swatch-amber\": {\n \"type\": \"color\",\n \"value\": \"#ff8c00\"\n },\n \"swatch-violet\": {\n \"type\": \"color\",\n \"value\": \"#a497ff\"\n },\n \"swatch-mint\": {\n \"type\": \"color\",\n \"value\": \"#00e7af\"\n },\n \"swatch-sky\": {\n \"type\": \"color\",\n \"value\": \"#00b8ff\"\n },\n \"swatch-orange\": {\n \"type\": \"color\",\n \"value\": \"#ff6b00\"\n },\n \"swatch-magenta\": {\n \"type\": \"color\",\n \"value\": \"#ff6eff\"\n },\n \"radius-sm\": {\n \"type\": \"dimension\",\n \"value\": \"3px\"\n },\n \"radius-md\": {\n \"type\": \"dimension\",\n \"value\": \"5px\"\n },\n \"radius-lg\": {\n \"type\": \"dimension\",\n \"value\": \"14px\"\n },\n \"radius-pill\": {\n \"type\": \"dimension\",\n \"value\": \"999px\",\n \"description\": \"Fully rounded ends — segmented controls, progress tracks.\"\n },\n \"border-w\": {\n \"type\": \"dimension\",\n \"value\": \"1px\"\n },\n \"line-width\": {\n \"type\": \"dimension\",\n \"value\": \"2px\",\n \"description\": \"Structural lines — gridlines, dividers, axes.\"\n },\n \"curve-width\": {\n \"type\": \"dimension\",\n \"value\": \"3px\",\n \"description\": \"Drawn data curves. Heavier than structural lines so data reads as primary content.\"\n },\n \"tb-height\": {\n \"type\": \"dimension\",\n \"value\": \"28px\",\n \"description\": \"Height of a horizontal toolbar strip (ActionsBar, OptionsBar, ToolOptionsBar). Taller than control-h so the controls inside a strip are not flush with its edges.\"\n },\n \"control-h\": {\n \"type\": \"dimension\",\n \"value\": \"24px\",\n \"description\": \"Height of an interactive control — button, input, select, segmented control. Distinct from tb-height, which sizes the strip a row of them sits in.\"\n },\n \"slider-track-h\": {\n \"type\": \"dimension\",\n \"value\": \"4px\",\n \"description\": \"Height of a linear range track. The kit's single-thumb ranges all wear this; Slider's default 24px canvas track does not.\"\n },\n \"slider-thumb-size\": {\n \"type\": \"dimension\",\n \"value\": \"8px\",\n \"description\": \"Diameter of a linear range thumb.\"\n },\n \"slider-track-tint\": {\n \"type\": \"dimension\",\n \"value\": \"18%\",\n \"description\": \"Accent proportion in a range track. Mixed into a real property, never into another custom property.\"\n },\n \"slider-thumb-tint\": {\n \"type\": \"dimension\",\n \"value\": \"70%\",\n \"description\": \"Accent proportion in a range thumb.\"\n },\n \"field-pad-x\": {\n \"type\": \"dimension\",\n \"value\": \"8px\",\n \"description\": \"Horizontal padding inside a boxed field. Pairs with --wzl-field-h, which is a container override and has no :root default.\"\n },\n \"glass-blur\": {\n \"type\": \"dimension\",\n \"value\": \"3px\",\n \"description\": \"Backdrop blur radius for frosted surfaces. Pairs with glass-tint.\"\n },\n \"font-size-2xs\": {\n \"type\": \"dimension\",\n \"value\": \"9px\",\n \"description\": \"Shortcut keys and index badges. The floor for chrome text.\"\n },\n \"font-size-xs\": {\n \"type\": \"dimension\",\n \"value\": \"10px\",\n \"description\": \"Tool-button labels under an icon.\"\n },\n \"font-size-sm\": {\n \"type\": \"dimension\",\n \"value\": \"11px\",\n \"description\": \"Chrome labels, status readouts, section headings.\"\n },\n \"font-size\": {\n \"type\": \"dimension\",\n \"value\": \"13px\",\n \"description\": \"Controls and body text.\"\n },\n \"font-size-lg\": {\n \"type\": \"dimension\",\n \"value\": \"16px\",\n \"description\": \"Panel and dialog titles.\"\n },\n \"font-size-xl\": {\n \"type\": \"dimension\",\n \"value\": \"20px\",\n \"description\": \"The largest chrome text — a lab or app title.\"\n },\n \"space-xs\": {\n \"type\": \"dimension\",\n \"value\": \"4px\"\n },\n \"space-sm\": {\n \"type\": \"dimension\",\n \"value\": \"8px\"\n },\n \"space-md\": {\n \"type\": \"dimension\",\n \"value\": \"12px\"\n },\n \"space-lg\": {\n \"type\": \"dimension\",\n \"value\": \"16px\"\n },\n \"tracking-none\": {\n \"type\": \"dimension\",\n \"value\": \"0\"\n },\n \"tracking-wide\": {\n \"type\": \"dimension\",\n \"value\": \"0.06em\",\n \"description\": \"Uppercase section headings.\"\n },\n \"tracking-wider\": {\n \"type\": \"dimension\",\n \"value\": \"0.08em\",\n \"description\": \"Uppercase at 11px and below.\"\n },\n \"z-toolbar\": {\n \"type\": \"number\",\n \"value\": 10\n },\n \"z-overlay\": {\n \"type\": \"number\",\n \"value\": 20\n },\n \"z-modal\": {\n \"type\": \"number\",\n \"value\": 30\n },\n \"leading-tight\": {\n \"type\": \"number\",\n \"value\": 1,\n \"description\": \"Single-line controls; the box sets the height.\"\n },\n \"leading-snug\": {\n \"type\": \"number\",\n \"value\": 1.2,\n \"description\": \"Headings and two-line labels.\"\n },\n \"leading\": {\n \"type\": \"number\",\n \"value\": 1.4,\n \"description\": \"Body and anything that wraps.\"\n },\n \"backdrop\": {\n \"type\": \"gradient\",\n \"value\": \"none\",\n \"description\": \"Layered backdrop fill for a page or lab root. `none` here; a theme with a signature background sets it.\"\n },\n \"motion-fast\": {\n \"type\": \"duration\",\n \"value\": \"120ms\",\n \"description\": \"Micro-interactions — hover, focus, pressed.\"\n },\n \"motion-medium\": {\n \"type\": \"duration\",\n \"value\": \"240ms\",\n \"description\": \"Entrances and exits — toasts, popovers, panels.\"\n },\n \"ease-in-cubic\": {\n \"type\": \"cubicBezier\",\n \"value\": [\n 0.32,\n 0,\n 0.67,\n 0\n ]\n },\n \"ease-out-cubic\": {\n \"type\": \"cubicBezier\",\n \"value\": [\n 0.33,\n 1,\n 0.68,\n 1\n ]\n },\n \"ease-in-out-cubic\": {\n \"type\": \"cubicBezier\",\n \"value\": [\n 0.65,\n 0,\n 0.35,\n 1\n ]\n },\n \"ease-out-back\": {\n \"type\": \"cubicBezier\",\n \"value\": [\n 0.34,\n 1.56,\n 0.64,\n 1\n ]\n },\n \"font-ui\": {\n \"type\": \"fontFamily\",\n \"value\": [\n \"Oswald\",\n \"Helvetica Neue Condensed\",\n \"Arial Narrow\",\n \"system-ui\",\n \"sans-serif\"\n ],\n \"description\": \"Condensed UI/display face. The heavier cuts get blocky at any size, so the weight tokens stay in the 200-400 range.\"\n },\n \"font-display\": {\n \"type\": \"fontFamily\",\n \"value\": [\n \"Oswald\",\n \"Helvetica Neue Condensed\",\n \"Arial Narrow\",\n \"system-ui\",\n \"sans-serif\"\n ]\n },\n \"font-body\": {\n \"type\": \"fontFamily\",\n \"value\": [\n \"Inter\",\n \"system-ui\",\n \"-apple-system\",\n \"Segoe UI\",\n \"sans-serif\"\n ]\n },\n \"font-mono\": {\n \"type\": \"fontFamily\",\n \"value\": [\n \"ui-monospace\",\n \"SFMono-Regular\",\n \"Menlo\",\n \"Consolas\",\n \"monospace\"\n ]\n },\n \"font-weight-light\": {\n \"type\": \"fontWeight\",\n \"value\": 200\n },\n \"font-weight-normal\": {\n \"type\": \"fontWeight\",\n \"value\": 300\n },\n \"font-weight-medium\": {\n \"type\": \"fontWeight\",\n \"value\": 350\n },\n \"font-weight-bold\": {\n \"type\": \"fontWeight\",\n \"value\": 400\n }\n },\n \"modes\": {\n \"dark\": {\n \"surface\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-800}\"\n },\n \"surface-raised\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-700}\"\n },\n \"surface-sunken\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-900}\"\n },\n \"fg\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-100}\"\n },\n \"fg-muted\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-300}\"\n },\n \"fg-subtle\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-400}\"\n },\n \"border\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-700}\"\n },\n \"border-strong\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-600}\"\n },\n \"accent-fg\": {\n \"type\": \"color\",\n \"value\": \"{color.accent-strong}\",\n \"description\": \"Accent for foreground use — text, icons, selected labels drawn on a surface. accent is a fill; the midnight base is too dim to read as text on dark surfaces.\"\n },\n \"fg-inverse\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-900}\",\n \"description\": \"Text drawn on a filled foreground-colored element (e.g. a slider thumb). Flips with the mode, so it is a semantic, not an alias to a primitive.\"\n },\n \"shadow\": {\n \"type\": \"color\",\n \"value\": \"rgba(0, 0, 0, 0.6)\",\n \"description\": \"Elevation. Always darker than any surface — never derived from fg, which is near-white on dark.\"\n },\n \"border-raised\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-400}\",\n \"description\": \"The line around a raised surface. Clears 3:1 against surface and surface-raised in either mode, which the general-purpose border does not; over surface-sunken it does not, so a panel on a sunken field needs its own answer.\"\n }\n },\n \"light\": {\n \"surface\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-50}\"\n },\n \"surface-raised\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-100}\"\n },\n \"surface-sunken\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-200}\"\n },\n \"fg\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-900}\"\n },\n \"fg-muted\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-600}\"\n },\n \"fg-subtle\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-500}\"\n },\n \"border\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-200}\"\n },\n \"border-strong\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-300}\"\n },\n \"accent-fg\": {\n \"type\": \"color\",\n \"value\": \"{color.accent-base}\",\n \"description\": \"Flips to the deep base in light mode, where it is the legible one.\"\n },\n \"fg-inverse\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-50}\",\n \"description\": \"Flips with the mode — see the dark layer.\"\n },\n \"shadow\": {\n \"type\": \"color\",\n \"value\": \"rgba(0, 0, 0, 0.18)\"\n },\n \"border-raised\": {\n \"type\": \"color\",\n \"value\": \"{color.gray-400}\"\n }\n }\n }\n }\n};\n","import type { FlatTokens, RawToken } from './dtcg/types';\nimport { THEME_SOURCES } from './generated/themes';\n\n/** Authoring shorthand: a bare string is a literal or a `{ref}`. */\nexport type TokenInput = string | number | RawToken;\n\n/** What `defineTheme` accepts: a name, the base theme to layer onto, and the\n * token overrides, split into mode-invariant and per-mode. */\nexport interface ThemeInput {\n readonly name: string;\n /** Base to layer onto. Defaults to `weaselTheme`; `null` opts out. */\n readonly extends?: Theme | null;\n readonly defaultMode?: string;\n /** Mode-invariant overrides. */\n readonly tokens?: Readonly<Record<string, TokenInput>>;\n readonly modes: Readonly<Record<string, Readonly<Record<string, TokenInput>>>>;\n}\n\n/**\n * A theme: a named set of design tokens, organized into a mode-invariant layer\n * plus one layer per mode (light, dark, …), optionally extending another theme.\n * Tokens are held unresolved — aliases between them are collapsed later by\n * `resolveTheme`, so an override of a base primitive still reaches everything\n * that references it.\n */\nexport interface Theme {\n readonly name: string;\n readonly extends: Theme | null;\n readonly defaultMode: string;\n readonly tokens: FlatTokens;\n readonly modes: Readonly<Record<string, FlatTokens>>;\n}\n\nfunction normalize(input: Readonly<Record<string, TokenInput>>): FlatTokens {\n const out: FlatTokens = {};\n for (const [name, v] of Object.entries(input)) {\n out[name] =\n typeof v === 'object'\n ? v\n : { type: 'unknown', value: v, alpha: undefined, description: undefined };\n }\n return out;\n}\n\n/** The built-in theme, materialized from the generated source. */\nexport const weaselTheme: Theme = {\n name: 'weasel',\n extends: null,\n defaultMode: 'dark',\n tokens: THEME_SOURCES.weasel.primitives as FlatTokens,\n modes: THEME_SOURCES.weasel.modes as Record<string, FlatTokens>,\n};\n\n/** Build a theme from authoring shorthand. Unless `extends` says otherwise the\n * result layers onto `weaselTheme`, so a theme only needs to name what it\n * changes. */\nexport function defineTheme(input: ThemeInput): Theme {\n const base = input.extends === undefined ? weaselTheme : input.extends;\n const modes: Record<string, FlatTokens> = {};\n for (const [mode, tokens] of Object.entries(input.modes)) modes[mode] = normalize(tokens);\n return {\n name: input.name,\n extends: base,\n defaultMode: input.defaultMode ?? base?.defaultMode ?? 'dark',\n tokens: normalize(input.tokens ?? {}),\n modes,\n };\n}\n","/**\n * Hex → `rgba()`. The JS side of the alpha extension; the CSS side emits\n * `color-mix()` instead so DOM chrome keeps tracking a downstream override of\n * the referenced token.\n */\nexport function hexToRgba(hex: string, alpha: number): string {\n const m = /^#([0-9a-f]{3}|[0-9a-f]{6})$/i.exec(hex.trim());\n if (!m) throw new Error(`Expected a hex color, got \"${hex}\"`);\n\n const body = m[1];\n const full = body.length === 3 ? body.replace(/./g, (c) => c + c) : body;\n const r = Number.parseInt(full.slice(0, 2), 16);\n const g = Number.parseInt(full.slice(2, 4), 16);\n const b = Number.parseInt(full.slice(4, 6), 16);\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n}\n","import { hexToRgba } from './color';\nimport type { FlatTokens, ResolvedTokenMap, TokenValue } from './types';\n\n/** `{color.gray-100}` → `gray-100`. The type group is dropped, per the naming rule. */\nconst REF = /^\\{([^}]+)\\}$/;\n\nfunction refTarget(value: TokenValue): string | null {\n if (typeof value !== 'string') return null;\n const m = REF.exec(value.trim());\n if (!m) return null;\n const path = m[1];\n const dot = path.indexOf('.');\n return dot === -1 ? path : path.slice(dot + 1);\n}\n\n/**\n * Quote family names containing whitespace; leave everything else bare.\n * Generic keywords (`sans-serif`) and hyphen-prefixed identifiers\n * (`-apple-system`) break if quoted, and neither contains a space.\n */\nfunction fontStack(value: readonly (string | number)[]): string {\n return value.map((f) => (typeof f === 'string' && /\\s/.test(f) ? `'${f}'` : String(f))).join(', ');\n}\n\nfunction serialize(type: string, value: TokenValue): string {\n if (Array.isArray(value)) {\n if (type === 'cubicBezier') return `cubic-bezier(${value.join(', ')})`;\n if (type === 'fontFamily') return fontStack(value);\n return value.join(', ');\n }\n return String(value);\n}\n\n/**\n * Resolve flat tokens to final CSS-ready strings.\n *\n * Merge modes before calling: this function has no notion of modes, only of a\n * complete token set.\n */\nexport function resolveTokens(tokens: FlatTokens): ResolvedTokenMap {\n const out: ResolvedTokenMap = {};\n const inProgress = new Set<string>();\n\n const resolveOne = (name: string): string => {\n const cached = out[name];\n if (cached !== undefined) return cached;\n\n const token = tokens[name];\n if (!token) throw new Error(`Unknown token \"${name}\"`);\n\n if (inProgress.has(name)) {\n throw new Error(`Reference cycle at token \"${name}\" (${[...inProgress].join(' → ')})`);\n }\n inProgress.add(name);\n\n const target = refTarget(token.value);\n let value: string;\n if (target === null) {\n value = serialize(token.type, token.value);\n } else if (!tokens[target]) {\n throw new Error(`Token \"${name}\" references \"${target}\", which is not defined`);\n } else {\n value = resolveOne(target);\n }\n\n if (token.alpha !== undefined) value = hexToRgba(value, token.alpha);\n\n inProgress.delete(name);\n out[name] = value;\n return value;\n };\n\n for (const name of Object.keys(tokens)) resolveOne(name);\n return out;\n}\n\n/** Merge a mode's tokens over the mode-invariant set. Later wins. */\nexport function mergeTokens(base: FlatTokens, mode: FlatTokens): FlatTokens {\n return { ...base, ...mode };\n}\n","import { resolveTokens } from './dtcg/resolve';\nimport type { FlatTokens } from './dtcg/types';\nimport type { Theme } from './theme';\nimport type { TokenName } from './generated/themes';\n\n/** The output of `resolveTheme`: every token of a theme, for one mode, keyed\n * by CSS custom-property name and flattened to a final CSS value. */\nexport type ResolvedTheme = Readonly<Record<TokenName, string>>;\n\n/** Root-first so the leaf theme's overrides land last. */\nfunction chain(theme: Theme): Theme[] {\n const out: Theme[] = [];\n for (let t: Theme | null = theme; t; t = t.extends) out.unshift(t);\n return out;\n}\n\n/**\n * Merge the extends chain, layer the mode over it, resolve every alias, and\n * key the result by CSS custom-property name.\n *\n * Pure — no DOM. An unresolvable reference throws rather than falling back.\n */\nexport function resolveTheme(theme: Theme, mode: string): ResolvedTheme {\n const themes = chain(theme);\n const effectiveMode = themes.some((t) => mode in t.modes) ? mode : theme.defaultMode;\n\n // Each theme contributes its mode-invariant tokens and then its mode layer,\n // before the next theme down the chain gets a turn. Collecting all `tokens`\n // first and all mode layers second would let the *base's* mode layer outrank\n // a derived theme's deliberate mode-invariant override.\n let merged: FlatTokens = {};\n for (const t of themes) {\n merged = { ...merged, ...t.tokens, ...(t.modes[effectiveMode] ?? {}) };\n }\n\n const resolved = resolveTokens(merged);\n const out: Record<string, string> = {};\n for (const [name, value] of Object.entries(resolved)) out[`--wzl-${name}`] = value;\n return out as ResolvedTheme;\n}\n","import { resolveTheme } from './resolveTheme';\nimport type { Theme } from './theme';\n\nconst STYLE_ID = 'wzl-themes';\n/** `theme.name::mode` → the rule text currently published for it. Keyed by\n * name because that is what the rule's selector matches on, and holding the\n * text is what lets a redefinition under the same name replace its rule\n * rather than be swallowed as a cache hit. */\nconst emitted = new Map<string, string>();\nlet sheet: CSSStyleSheet | null = null;\nlet styleEl: HTMLStyleElement | null = null;\n\n/** Test seam — drops the module-level cache so each case starts clean. */\nexport function __resetThemeSheet(): void {\n emitted.clear();\n sheet = null;\n styleEl = null;\n}\n\nfunction canAdopt(): boolean {\n return (\n typeof CSSStyleSheet !== 'undefined' &&\n 'replaceSync' in CSSStyleSheet.prototype &&\n Array.isArray(document.adoptedStyleSheets)\n );\n}\n\n/** Republish every rule from `emitted`. Rewriting the whole sheet rather than\n * appending keeps it the size of the theme set: a theme redefined under a\n * name it already used replaces its rule instead of stacking another one. */\nfunction flushRules(): void {\n const css = [...emitted.values()].join('\\n');\n if (canAdopt()) {\n if (!sheet) {\n sheet = new CSSStyleSheet();\n document.adoptedStyleSheets = [...document.adoptedStyleSheets, sheet];\n }\n sheet.replaceSync(css);\n return;\n }\n if (!styleEl) {\n styleEl = document.createElement('style');\n styleEl.id = STYLE_ID;\n document.head.appendChild(styleEl);\n }\n styleEl.textContent = css;\n}\n\n/**\n * Apply `theme` at `mode` to `el`'s subtree.\n *\n * Stamps two data attributes and ensures a matching rule block exists in a\n * module-owned stylesheet. Deliberately not inline properties: the cascade\n * then does the work, per-subtree overrides are just a different theme name,\n * and no `!important` is ever needed. No-op outside a DOM.\n */\nexport function applyTheme(el: HTMLElement, theme: Theme, mode: string): void {\n if (typeof document === 'undefined') return;\n\n const key = `${theme.name}::${mode}`;\n const resolved = resolveTheme(theme, mode);\n const body = Object.entries(resolved)\n .map(([name, value]) => `${name}: ${value};`)\n .join(' ');\n const rule = `[data-wzl-theme='${theme.name}'][data-wzl-mode='${mode}'] { ${body} }`;\n if (emitted.get(key) !== rule) {\n emitted.set(key, rule);\n flushRules();\n }\n\n el.setAttribute('data-wzl-theme', theme.name);\n el.setAttribute('data-wzl-mode', mode);\n}\n","import React, { createContext, useContext, useMemo, useRef, useLayoutEffect } from 'react';\nimport { applyTheme } from './applyTheme';\nimport { resolveTheme, type ResolvedTheme } from './resolveTheme';\nimport { weaselTheme, type Theme } from './theme';\n\n/** What `<ThemeProvider>` publishes: the theme, the mode in force, and the\n * fully resolved token record for that pair. */\nexport interface ThemeContextValue {\n readonly theme: Theme;\n readonly mode: string;\n readonly resolved: ResolvedTheme;\n}\n\nconst ThemeContext = createContext<ThemeContextValue | null>(null);\n\n/** Props for `<ThemeProvider>`. */\nexport interface ThemeProviderProps {\n readonly theme?: Theme;\n readonly mode?: string;\n /** Applied to the wrapper element, so it can be the layout element too. */\n readonly className?: string;\n readonly style?: React.CSSProperties;\n readonly children: React.ReactNode;\n}\n\n/**\n * Applies a theme to a wrapper element and publishes the resolved record.\n *\n * Consumers that draw outside the DOM (the WebGL HUD) read `resolved` and\n * never touch `getComputedStyle`.\n *\n * The wrapper is a real element in the layout. Pass `className` rather than\n * nesting your own div inside — an anonymous div between a flex parent and\n * its child breaks percentage heights.\n */\nexport function ThemeProvider({\n theme = weaselTheme,\n mode,\n className,\n style,\n children,\n}: ThemeProviderProps): React.ReactElement {\n const ref = useRef<HTMLDivElement>(null);\n const effectiveMode = mode ?? theme.defaultMode;\n\n const value = useMemo<ThemeContextValue>(\n () => ({ theme, mode: effectiveMode, resolved: resolveTheme(theme, effectiveMode) }),\n [theme, effectiveMode],\n );\n\n useLayoutEffect(() => {\n if (ref.current) applyTheme(ref.current, theme, effectiveMode);\n }, [theme, effectiveMode]);\n\n return (\n <ThemeContext.Provider value={value}>\n <div\n ref={ref}\n className={className}\n style={style}\n data-wzl-theme={theme.name}\n data-wzl-mode={effectiveMode}\n >\n {children}\n </div>\n </ThemeContext.Provider>\n );\n}\n\n/** The theme in force. Throws outside a `<ThemeProvider>`; use\n * `useThemeOptional` where the provider is not guaranteed. */\nexport function useTheme(): ThemeContextValue {\n const ctx = useContext(ThemeContext);\n if (!ctx) throw new Error('useTheme must be used inside a <ThemeProvider>');\n return ctx;\n}\n\n/**\n * The theme if one is provided, `null` otherwise.\n *\n * For kit internals that should follow a theme when the app supplies one but\n * must still work in an app that never mounted a provider — `useHud` is the\n * motivating case.\n */\nexport function useThemeOptional(): ThemeContextValue | null {\n return useContext(ThemeContext);\n}\n","/** The one `$extensions` key this kit defines. */\nexport const ALPHA_EXT = 'com.weasel.alpha';\n\nexport type TokenValue = string | number | readonly (string | number)[];\n\n/**\n * A single design token as authored, before aliases are resolved: a DTCG-shaped\n * `{ type, value }` pair where `value` may still be a `{ref}` to another token.\n */\nexport interface RawToken {\n readonly type: string;\n readonly value: TokenValue;\n /** Render the referenced color at this alpha, 0–1. */\n readonly alpha?: number | undefined;\n readonly description?: string | undefined;\n}\n\n/** A token graph flattened to one level, keyed by token name (no `--wzl-`\n * prefix). Still unresolved — see `ResolvedTokenMap` for the output side. */\nexport type FlatTokens = Record<string, RawToken>;\n\n/** A resolved theme: every token name mapped to its final CSS-ready string.\n * Named ...Map, not ...Tokens, to stay distinct from hud's public `ResolvedTokens`. */\nexport type ResolvedTokenMap = Record<string, string>;\n","import { ALPHA_EXT, type FlatTokens, type RawToken, type TokenValue } from './types';\n\ninterface DtcgToken {\n $value: TokenValue;\n $type?: string;\n $description?: string;\n $extensions?: Record<string, unknown>;\n}\n\nconst isToken = (v: unknown): v is DtcgToken =>\n typeof v === 'object' && v !== null && '$value' in v;\n\n/**\n * Collapse a DTCG document into flat token names.\n *\n * Groups exist only to carry `$type`; they contribute nothing to the name, so\n * `color.fg-muted` becomes `fg-muted` and in turn `--wzl-fg-muted`. This shape\n * is forced by the token set: `--wzl-accent` and `--wzl-accent-base` are both\n * real tokens, and DTCG forbids a token that is also a group.\n */\nexport function flattenTokens(doc: Record<string, unknown>): FlatTokens {\n const out: FlatTokens = {};\n\n for (const [groupName, group] of Object.entries(doc)) {\n if (groupName.startsWith('$')) continue;\n if (typeof group !== 'object' || group === null) continue;\n\n const g = group as Record<string, unknown> & { $type?: string };\n const groupType = g.$type;\n\n for (const [leaf, node] of Object.entries(g)) {\n if (leaf.startsWith('$')) continue;\n if (!isToken(node)) continue;\n\n const type = node.$type ?? groupType;\n if (!type) {\n throw new Error(`Token \"${leaf}\" has no $type and its group \"${groupName}\" declares none`);\n }\n if (leaf in out) {\n throw new Error(`Duplicate token name \"${leaf}\" — leaf keys must be unique across type groups`);\n }\n\n const alphaRaw = node.$extensions?.[ALPHA_EXT];\n const token: RawToken = {\n type,\n value: node.$value,\n alpha: typeof alphaRaw === 'number' ? alphaRaw : undefined,\n description: node.$description,\n };\n out[leaf] = token;\n }\n }\n\n return out;\n}\n","import { flattenTokens } from './dtcg/flatten';\nimport type { FlatTokens } from './dtcg/types';\nimport { weaselTheme, type Theme } from './theme';\n\ninterface DtcgDocument {\n name?: unknown;\n defaultMode?: unknown;\n extends?: Theme | null;\n primitives?: Record<string, unknown>;\n modes?: Record<string, Record<string, unknown>>;\n}\n\n/**\n * Build a `Theme` from a DTCG document — the interchange path, for tokens\n * exported by a design tool rather than authored in TS.\n */\nexport function loadDTCG(doc: DtcgDocument): Theme {\n if (typeof doc.name !== 'string' || doc.name === '') {\n throw new Error('DTCG document needs a string \"name\"');\n }\n const modes: Record<string, FlatTokens> = {};\n for (const [mode, body] of Object.entries(doc.modes ?? {})) {\n modes[mode] = flattenTokens(body);\n }\n const base = doc.extends === undefined ? weaselTheme : doc.extends;\n return {\n name: doc.name,\n extends: base,\n defaultMode:\n typeof doc.defaultMode === 'string' ? doc.defaultMode : (base?.defaultMode ?? 'dark'),\n tokens: flattenTokens(doc.primitives ?? {}),\n modes,\n };\n}\n","{\n \"name\": \"interstellar\",\n \"defaultMode\": \"dark\",\n \"primitives\": {\n \"dimension\": {\n \"$type\": \"dimension\",\n \"radius-md\": { \"$value\": \"6px\" },\n \"glass-blur\": { \"$value\": \"12px\" }\n },\n \"fontWeight\": {\n \"$type\": \"fontWeight\",\n \"font-weight-light\": { \"$value\": 300 },\n \"font-weight-medium\": { \"$value\": 500 },\n \"font-weight-bold\": { \"$value\": 700 }\n }\n },\n \"modes\": {\n \"dark\": {\n \"color\": {\n \"$type\": \"color\",\n \"surface\": { \"$value\": \"#0a0a14\" },\n \"surface-raised\": { \"$value\": \"rgba(20, 20, 36, 0.55)\" },\n \"surface-sunken\": { \"$value\": \"#02020a\" },\n \"border\": { \"$value\": \"rgba(255, 255, 255, 0.14)\" },\n \"line-subtle\": { \"$value\": \"rgba(255, 255, 255, 0.08)\" },\n \"fg\": { \"$value\": \"#e8e8f0\" },\n \"fg-muted\": { \"$value\": \"#a8a8c0\" },\n \"fg-subtle\": { \"$value\": \"#5a5a78\" },\n \"accent\": { \"$value\": \"#b08adb\" },\n \"accent-hover\": { \"$value\": \"#c6a3ee\" },\n \"focus-ring\": { \"$value\": \"rgba(176, 138, 219, 0.45)\" },\n \"shadow\": { \"$value\": \"rgba(0, 0, 0, 0.7)\" },\n \"border-raised\": { \"$value\": \"rgba(255, 255, 255, 0.36)\" }\n },\n \"gradient\": {\n \"$type\": \"gradient\",\n \"backdrop\": {\n \"$value\": \"radial-gradient(ellipse 60% 80% at 18% 30%, rgba(150, 80, 200, 0.22), transparent 70%), radial-gradient(ellipse 55% 90% at 78% 70%, rgba(220, 100, 140, 0.18), transparent 65%), radial-gradient(ellipse 50% 70% at 50% 50%, rgba(60, 110, 200, 0.18), transparent 75%), radial-gradient(ellipse at center, #0a0a18 0%, #02020a 100%)\"\n }\n }\n },\n \"light\": {\n \"color\": {\n \"$type\": \"color\",\n \"surface\": { \"$value\": \"#fafaf7\" },\n \"surface-raised\": { \"$value\": \"#ffffff\" },\n \"surface-sunken\": { \"$value\": \"#f0ebe2\" },\n \"border\": { \"$value\": \"#c9bba5\" },\n \"line-subtle\": { \"$value\": \"rgba(0, 0, 0, 0.08)\" },\n \"fg\": { \"$value\": \"#2a2018\" },\n \"fg-muted\": { \"$value\": \"#6b5c4a\" },\n \"fg-subtle\": { \"$value\": \"#a89b85\" },\n \"accent\": { \"$value\": \"#a86f3c\" },\n \"accent-hover\": { \"$value\": \"#c2854f\" },\n \"focus-ring\": { \"$value\": \"rgba(168, 111, 60, 0.35)\" },\n \"shadow\": { \"$value\": \"rgba(80, 60, 40, 0.18)\" },\n \"border-raised\": { \"$value\": \"#9e8b71\" }\n }\n }\n }\n}\n","import { loadDTCG, type Theme } from '@weasel-js/theme';\nimport doc from './interstellar.tokens.json' with { type: 'json' };\n\n/**\n * labkit's theme: a cosmic dark and a warm parchment light, extending the\n * built-in weasel theme. Authored as DTCG and loaded at import time — the\n * interchange path a theme exported from a design tool would take.\n */\nexport const interstellarTheme: Theme = loadDTCG(doc);\n","import type { ViewTransform } from '../instrument/types';\n\n/** The 2D view labkit has always shipped, and what a trial gets when it names no\n * other. Re-exported under its own name so a consumer can say which it means. */\nexport type ViewTransform2D = ViewTransform;\n\nexport const DEFAULT_VIEW: ViewTransform2D = { zoom: 1, pan: { x: 0, y: 0 } };\n\n/** A trial's view is opaque to labkit, so anything that needs the 2D shape — the\n * zoom chrome, `CanvasStack` — asks for it and handles not getting it. */\nexport function as2DView(view: unknown): ViewTransform2D | null {\n if (typeof view !== 'object' || view === null) return null;\n const v = view as Partial<ViewTransform2D>;\n if (typeof v.zoom !== 'number') return null;\n if (typeof v.pan !== 'object' || v.pan === null) return null;\n if (typeof v.pan.x !== 'number' || typeof v.pan.y !== 'number') return null;\n return { zoom: v.zoom, pan: { x: v.pan.x, y: v.pan.y } };\n}\n","import { type ReactNode, useEffect, useMemo, useRef } from 'react';\nimport { asNodeId, createNode, Store, stripStrategy } from 'windease';\nimport { type ChromeMap, Container, Provider, StrategyRegistryProvider } from 'windease/react';\n\nconst ZONE_ID = asNodeId('lk-trial-body');\nconst SIDEBAR_ID = asNodeId('lk-trial-sidebar');\nconst CONTENT_ID = asNodeId('lk-trial-content');\nconst STRATEGIES = { strip: stripStrategy as never };\n\n/** Props for `<TrialBody>`. */\nexport interface TrialBodyProps {\n /** The sidebar region's sections. */\n sidebar: ReactNode;\n /** The instrument's own output. */\n children: ReactNode;\n /** Extra class on the content pane — `Trial` marks a canvas instrument's\n * well flush. */\n contentClassName?: string;\n /** The sidebar's current extent in pixels. Omit for an unpersisted lab: the\n * seam still works, its result just does not outlive the mount. */\n width?: number;\n /** Where the sidebar starts before anyone drags it. */\n defaultWidth?: number;\n minWidth?: number;\n maxWidth?: number;\n /** How little the instrument may be squeezed to. Reported as the seam's\n * reachable maximum, so the drag stops there rather than clamping silently. */\n contentMinWidth?: number;\n /** Fires through the drag, not on release: the pane is already there. */\n onWidthChange?: (width: number) => void;\n /**\n * Fixed extent. Omit in an app — the strip measures its own box. Supply it\n * where nothing measures, notably jsdom, or both panes lay out at zero.\n */\n viewport?: { w: number; h: number };\n}\n\n/**\n * A trial's sidebar and content as a two-pane strip with a draggable seam.\n *\n * The seam is `stripStrategy`'s own resize affordance, so it arrives as a\n * `role=\"separator\"` carrying the reachable range, operable by pointer and by\n * arrows / Home / End, and clamped against the content pane's floor rather\n * than against the sidebar's alone.\n */\nexport function TrialBody({\n sidebar,\n children,\n contentClassName,\n width,\n defaultWidth = 320,\n minWidth = 140,\n maxWidth = 720,\n contentMinWidth = 160,\n onWidthChange,\n viewport,\n}: TrialBodyProps) {\n // The cross-axis half of every size hint below is inert: a horizontal strip\n // stretches its panes to the container's height and never reads `h`.\n const storeRef = useRef<Store | null>(null);\n if (storeRef.current === null) {\n const store = new Store();\n store.registerNode(\n createNode({\n kind: 'zone',\n id: ZONE_ID,\n container: { strategyId: 'strip', config: { axis: 'x', resizable: true } },\n }),\n );\n store.registerNode(\n createNode({\n kind: 'sidebar',\n id: SIDEBAR_ID,\n parentId: ZONE_ID,\n meta: { title: 'Sidebar' },\n placement: { size: { w: width ?? defaultWidth } },\n hints: { minSize: { w: minWidth, h: 0 }, maxSize: { w: maxWidth, h: 0 } },\n }),\n );\n store.registerNode(\n createNode({\n kind: 'content',\n id: CONTENT_ID,\n parentId: ZONE_ID,\n meta: { title: 'Content' },\n hints: { minSize: { w: contentMinWidth, h: 0 } },\n }),\n );\n store.showNode(SIDEBAR_ID);\n store.showNode(CONTENT_ID);\n storeRef.current = store;\n }\n const store = storeRef.current;\n\n // What the store last held, so the placement event can tell a drag from the\n // echo of our own write and a controlled `width` does not fight the seam.\n const widthRef = useRef(width ?? defaultWidth);\n\n useEffect(() => {\n store.setHints(SIDEBAR_ID, {\n minSize: { w: minWidth, h: 0 },\n maxSize: { w: maxWidth, h: 0 },\n });\n store.setHints(CONTENT_ID, { minSize: { w: contentMinWidth, h: 0 } });\n }, [store, minWidth, maxWidth, contentMinWidth]);\n\n useEffect(() => {\n if (width === undefined || width === widthRef.current) return;\n widthRef.current = width;\n store.patchPlacement(SIDEBAR_ID, { size: { w: width } });\n }, [store, width]);\n\n const onWidthChangeRef = useRef(onWidthChange);\n onWidthChangeRef.current = onWidthChange;\n useEffect(\n () =>\n store.events.on('node.placementChanged', () => {\n const next = (store.getPlacement(SIDEBAR_ID)?.size as { w?: number } | undefined)?.w;\n if (typeof next !== 'number' || next === widthRef.current) return;\n widthRef.current = next;\n onWidthChangeRef.current?.(next);\n }),\n [store],\n );\n\n const chrome = useMemo<ChromeMap>(\n () => ({\n sidebar: () => <div className=\"lk-trial__sidebar\">{sidebar}</div>,\n content: () => (\n <div\n className={\n contentClassName ? `lk-trial__content ${contentClassName}` : 'lk-trial__content'\n }\n >\n {children}\n </div>\n ),\n }),\n [sidebar, children, contentClassName],\n );\n\n return (\n <Provider store={store}>\n <StrategyRegistryProvider strategies={STRATEGIES}>\n <Container\n parentId={ZONE_ID}\n chrome={chrome}\n className=\"lk-trial__panes windease-zone\"\n affordances\n viewport={viewport}\n />\n </StrategyRegistryProvider>\n </Provider>\n );\n}\n","import { createContext, useContext } from 'react';\nimport type { NodeId } from 'windease';\n\n/** Supplied by `<Workspace>` when trials are reorderable, so a trial's title\n * bar can be the drag surface. Null when reordering is off. */\nexport const TrialDragContext = createContext<{ nodeId: NodeId } | null>(null);\n\nexport function useTrialDrag(): { nodeId: NodeId } | null {\n return useContext(TrialDragContext);\n}\n","import type { ReactNode } from 'react';\nimport type { NodeId } from 'windease';\nimport { useDragHandle } from 'windease/react';\nimport { useTrialDrag } from './TrialDragContext';\n\n/** Props for `<TrialTitleBar>`. */\nexport interface TrialTitleBarProps {\n title: string;\n children?: ReactNode;\n}\n\n// `useDragHandle` needs a node id and windease's DragProvider, so the draggable\n// form is a separate component rather than a conditional hook.\nfunction Draggable({ nodeId, title, children }: TrialTitleBarProps & { nodeId: NodeId }) {\n const handlers = useDragHandle(nodeId);\n return (\n <div className=\"lk-trial__titlebar lk-trial__titlebar--draggable\" {...handlers}>\n <span className=\"lk-trial__title\">{title}</span>\n {children}\n </div>\n );\n}\n\n/** A trial's title bar. When the workspace allows reordering the whole bar is\n * the drag surface — there is no separate grip, because a window's title bar\n * is already the thing you expect to drag. */\nexport function TrialTitleBar({ title, children }: TrialTitleBarProps) {\n const drag = useTrialDrag();\n if (drag)\n return (\n <Draggable nodeId={drag.nodeId} title={title}>\n {children}\n </Draggable>\n );\n return (\n <div className=\"lk-trial__titlebar\">\n <span className=\"lk-trial__title\">{title}</span>\n {children}\n </div>\n );\n}\n","import { createContext, useContext } from 'react';\n\n/** Where an undocked panel's DOM lives. The panel's *content* stays owned by\n * its trial — it is React-portalled into the host — so a torn-out section\n * keeps the trial's context, state and subscriptions instead of being rebuilt\n * as a sibling of the trial it came from. */\nexport interface PanelHostRegistry {\n set: (key: string, el: HTMLElement | null) => void;\n get: (key: string) => HTMLElement | null;\n subscribe: (fn: () => void) => () => void;\n}\n\nexport function createPanelHostRegistry(): PanelHostRegistry {\n const hosts = new Map<string, HTMLElement>();\n const listeners = new Set<() => void>();\n const notify = () => {\n for (const fn of listeners) fn();\n };\n return {\n set: (key, el) => {\n if (el) hosts.set(key, el);\n else hosts.delete(key);\n notify();\n },\n get: (key) => hosts.get(key) ?? null,\n subscribe: (fn) => {\n listeners.add(fn);\n return () => listeners.delete(fn);\n },\n };\n}\n\nexport const PanelHostContext = createContext<PanelHostRegistry | null>(null);\n\nexport function usePanelHosts(): PanelHostRegistry | null {\n return useContext(PanelHostContext);\n}\n","import { useSyncExternalStore } from 'react';\nimport { createPortal } from 'react-dom';\nimport type { SidebarSection, TrialContribution } from '../chrome/types';\nimport { usePanelHosts } from '../lab/panelHost';\nimport { panelKey } from '../state/undock';\n\n/** Props for `<UndockedSections>`. */\nexport interface UndockedSectionsProps {\n trialId: string;\n /** The trial's sidebar contributions that are currently torn out. */\n sections: readonly TrialContribution[];\n onDock: (sectionId: string) => void;\n}\n\nfunction Portalled({\n trialId,\n contribution,\n onDock,\n}: {\n trialId: string;\n contribution: TrialContribution;\n onDock: (sectionId: string) => void;\n}) {\n const hosts = usePanelHosts();\n const key = panelKey(trialId, contribution.id);\n const host = useSyncExternalStore(\n (fn) => hosts?.subscribe(fn) ?? (() => {}),\n () => hosts?.get(key) ?? null,\n () => null,\n );\n if (!host || !contribution.item) return null;\n const item = contribution.item as SidebarSection;\n return createPortal(\n <>\n <div className=\"lk-panel-tile__titlebar\">\n <span className=\"lk-panel-tile__title\">{item.title}</span>\n <button\n type=\"button\"\n className=\"lk-panel-tile__dock\"\n aria-label={`Dock ${item.title}`}\n title={`Dock ${item.title}`}\n onClick={() => onDock(contribution.id)}\n >\n ⇤\n </button>\n </div>\n {item.body}\n </>,\n host,\n );\n}\n\n/** Renders a torn-out section's body into the workspace panel holding it. The\n * body stays mounted in the trial's React tree — only its DOM moves — so it\n * keeps the trial's context and its own state across an undock. */\nexport function UndockedSections({ trialId, sections, onDock }: UndockedSectionsProps) {\n if (sections.length === 0) return null;\n return (\n <>\n {sections.map((c) => (\n <Portalled key={c.id} trialId={trialId} contribution={c} onDock={onDock} />\n ))}\n </>\n );\n}\n","import { type KeyboardEvent, type ReactNode, useContext, useMemo } from 'react';\nimport { useStore } from 'zustand/react';\nimport { builtinContributions } from '../chrome/builtins';\nimport { mergeContributions, suppressContributions } from '../chrome/merge';\nimport { PaletteRegion } from '../chrome/regions/PaletteRegion';\nimport { SidebarRegion } from '../chrome/regions/SidebarRegion';\nimport { StatusRegion } from '../chrome/regions/StatusRegion';\nimport { TitleBarRegion } from '../chrome/regions/TitleBarRegion';\nimport { ToolbarRegion } from '../chrome/regions/ToolbarRegion';\nimport { ViewportRegion } from '../chrome/regions/ViewportRegion';\nimport type { TrialChromeContext, TrialContribution, TrialRegion } from '../chrome/types';\nimport { useConfigSchema } from '../config/useConfigSchema';\nimport type { Instrument } from '../instrument/types';\nimport type { JobHandle } from '../job/types';\nimport { useLabContext } from '../lab/LabContext';\nimport { JobProgress } from '../primitives/JobProgress';\nimport { LabStoreContext } from '../state/context';\nimport type { TrialRecord } from '../state/types';\nimport { as2DView } from '../state/view';\nimport { TrialBody } from './TrialBody';\nimport { TrialTitleBar } from './TrialTitleBar';\nimport { UndockedSections } from './UndockedSections';\n\n/** The trial's loupe as its chrome sees it: a switch and its position. */\nexport interface LoupeBindings {\n on: boolean;\n toggle: () => void;\n}\n\nexport interface UndoBindings {\n canUndo: boolean;\n canRedo: boolean;\n undo: () => void;\n redo: () => void;\n}\n\n/** Props for `<TrialChrome>`. */\nexport interface TrialChromeProps {\n trialId: string;\n record: TrialRecord;\n instrument: Instrument;\n isLastTrial: boolean;\n undoBindings?: UndoBindings;\n /** Supplied when the instrument declares a `job`. */\n job?: JobHandle;\n /** Supplied when the instrument declares a `loupe`. The lens itself is the\n * trial's to mount; the chrome only offers the switch. */\n loupe?: LoupeBindings;\n /** Contributions the trial runtime itself adds — the drag palette and the\n * layer list, which depend on runtime state the instrument cannot reach. */\n trialChrome?: readonly TrialContribution[];\n /** Contributions from the lab, merged last. */\n chrome?: readonly TrialContribution[];\n /** Built-in contribution ids to drop. Throws on an id that is not there. */\n suppress?: readonly string[];\n /** The trial's resolved tool slot, and the setter that writes whichever\n * slot it resolved to. `Trial` owns the resolution. */\n activeToolId?: string | null;\n setActiveTool?: (id: string) => void;\n children: ReactNode;\n}\n\nconst NO_OP = (): void => {};\n\n/** The frame around a running instrument. Builds one chrome context, assembles\n * the contributions the instrument, the runtime and the lab declare, and hands\n * each region its slice. */\nexport function TrialChrome({\n trialId,\n record,\n instrument,\n isLastTrial,\n undoBindings,\n job,\n loupe,\n trialChrome,\n chrome,\n suppress,\n activeToolId = null,\n setActiveTool = NO_OP,\n children,\n}: TrialChromeProps) {\n const lab = useLabContext();\n const storeCtx = useContext(LabStoreContext);\n if (!storeCtx) throw new Error('[labkit] TrialChrome requires <LabStoreProvider>');\n const updateTrialView = useStore(storeCtx.store, (s) => s.updateTrialView);\n const updateTrialSidebarWidth = useStore(storeCtx.store, (s) => s.updateTrialSidebarWidth);\n const updateTrialConfig = useStore(storeCtx.store, (s) => s.updateTrialConfig);\n const updateTrialState = useStore(storeCtx.store, (s) => s.updateTrialState);\n const undockPanelAction = useStore(storeCtx.store, (s) => s.undockPanel);\n const dockPanelAction = useStore(storeCtx.store, (s) => s.dockPanel);\n const undockedPanels = useStore(storeCtx.store, (s) => s.undockedPanels);\n const undockedIds = useMemo(\n () =>\n Object.values(undockedPanels)\n .filter((p) => p.trialId === trialId)\n .map((p) => p.sectionId),\n [undockedPanels, trialId],\n );\n\n // The trial view is opaque to labkit, so the zoom chrome asks for the 2D shape\n // and goes inert when the trial holds something else — an orbit, say.\n const view2d = as2DView(record.view);\n\n const configSchema = useConfigSchema(instrument);\n\n const ctx = useMemo<TrialChromeContext>(() => {\n const setZoom = (z: number): void => {\n if (!view2d) return;\n updateTrialView(trialId, { ...view2d, zoom: z });\n };\n return {\n trialId,\n instrumentName: record.instrumentName,\n isLastTrial,\n zoom: view2d ? view2d.zoom : null,\n setZoom,\n canUndo: undoBindings?.canUndo ?? false,\n canRedo: undoBindings?.canRedo ?? false,\n undo: undoBindings?.undo ?? NO_OP,\n redo: undoBindings?.redo ?? NO_OP,\n loupeOn: loupe?.on ?? false,\n toggleLoupe: loupe?.toggle ?? NO_OP,\n configSchema,\n configFields: instrument.config ? [] : (instrument.configSchema?.() ?? []),\n config: record.config,\n setConfig: (key, value) => {\n const prevConfig = record.config as Record<string, unknown>;\n if (process.env.NODE_ENV !== 'production' && !(key in prevConfig)) {\n console.warn(\n `[labkit] setConfig: unknown key \"${key}\" for instrument \"${record.instrumentName}\"`,\n );\n }\n updateTrialConfig(trialId, key as never, value as never);\n if (instrument.onConfigChange) {\n const nextConfig = { ...prevConfig, [key]: value };\n const nextState = instrument.onConfigChange(nextConfig, prevConfig, record.state);\n updateTrialState(trialId, nextState as never);\n }\n },\n undockedPanels: undockedIds,\n undockPanel: (sectionId, as) => undockPanelAction(trialId, sectionId, as),\n dockPanel: (sectionId) => dockPanelAction(trialId, sectionId),\n savedSnapshots: lab.savedSnapshots.filter((s) => s.trialId === trialId),\n saveSnapshot: (name) => lab.saveSnapshot(trialId, name),\n loadSnapshot: (snapshotId) => lab.loadSnapshot(trialId, snapshotId),\n clone: () => lab.cloneTrial(trialId),\n reset: () => lab.resetTrial(trialId),\n close: () => lab.closeTrial(trialId),\n activeToolId,\n setActiveTool,\n };\n }, [\n trialId,\n record,\n instrument,\n lab,\n isLastTrial,\n updateTrialView,\n updateTrialConfig,\n updateTrialState,\n undoBindings,\n loupe,\n view2d,\n activeToolId,\n setActiveTool,\n configSchema,\n undockedIds,\n undockPanelAction,\n dockPanelAction,\n ]);\n\n const contributions = useMemo(\n () =>\n suppressContributions(\n mergeContributions(\n builtinContributions(instrument, ctx, lab.controls),\n [...(instrument.chrome ?? [])],\n [...(trialChrome ?? [])],\n [...(chrome ?? [])],\n ),\n suppress ?? [],\n ),\n [instrument, ctx, trialChrome, chrome, suppress, lab.controls],\n );\n\n const inRegion = (region: TrialRegion): TrialContribution[] =>\n contributions.filter((c) => c.region === region);\n\n const handleKeyDown = (e: KeyboardEvent<HTMLElement>): void => {\n const mod = e.metaKey || e.ctrlKey;\n if (!mod) return;\n if (e.key === 'z' || e.key === 'Z') {\n e.preventDefault();\n if (e.shiftKey) ctx.redo();\n else ctx.undo();\n } else if (e.key === 's' || e.key === 'S') {\n e.preventDefault();\n ctx.saveSnapshot();\n }\n };\n\n return (\n <section\n className=\"lk-trial\"\n aria-label={`Trial ${record.instrumentName}`}\n tabIndex={-1}\n onKeyDown={handleKeyDown}\n >\n <TrialTitleBar title={record.instrumentName}>\n <TitleBarRegion contributions={inRegion('titlebar')} ctx={ctx} />\n </TrialTitleBar>\n <div className=\"lk-trial__toolbar\">\n <ToolbarRegion contributions={inRegion('toolbar')} ctx={ctx} />\n </div>\n <div className=\"lk-trial__body\">\n <PaletteRegion contributions={inRegion('palette')} ctx={ctx} />\n <TrialBody\n width={record.sidebarWidth}\n onWidthChange={(w) => updateTrialSidebarWidth(trialId, w)}\n contentClassName={instrument.canvas ? 'lk-trial__content--flush' : undefined}\n sidebar={\n <>\n <SidebarRegion contributions={inRegion('sidebar')} ctx={ctx} />\n <UndockedSections\n trialId={trialId}\n sections={inRegion('sidebar').filter((c) => undockedIds.includes(c.id))}\n onDock={ctx.dockPanel}\n />\n </>\n }\n >\n {children}\n <ViewportRegion contributions={inRegion('viewport')} ctx={ctx} />\n </TrialBody>\n </div>\n <div className=\"lk-trial__status\">\n {job ? <JobProgress job={job} /> : null}\n <StatusRegion contributions={inRegion('status')} ctx={ctx} />\n </div>\n </section>\n );\n}\n","import { type ReactNode, useContext, useEffect, useMemo, useRef, useState } from 'react';\nimport { useStore } from 'zustand/react';\nimport { AnnotationsContext } from '../annotations/AnnotationsContext';\nimport { AnnotationTargets } from '../annotations/AnnotationTargets';\nimport { annotationsFromJSON } from '../annotations/store';\nimport type { AnnotationTargetInfo } from '../annotations/types';\nimport { CanvasStack } from '../canvas/CanvasStack';\nimport type { CanvasLayerDescriptor } from '../canvas/useLayerScheduler';\nimport { applyCamera, type ViewportSize } from '../canvas/worldSpec';\nimport type { TrialContribution } from '../chrome/types';\nimport { DragOverlay, useDragDrop } from '../dragdrop/DragDropRuntime';\nimport { Palette } from '../dragdrop/Palette';\nimport type { Instrument, LayerDescriptor, PaletteItem, RenderContext } from '../instrument/types';\nimport { useJob } from '../job/useJob';\nimport { useLabContext } from '../lab/LabContext';\nimport { LayerList } from '../layers/LayerList';\nimport { TrialLoupe } from '../loupe/TrialLoupe';\nimport { resolveLoupe } from '../loupe/types';\nimport { LabStoreContext, TrialIdProvider } from '../state/context';\nimport type { LabStore } from '../state/store';\nimport type { TrialRecord } from '../state/types';\nimport { as2DView, DEFAULT_VIEW } from '../state/view';\nimport { createEventBus, type EventBus } from '../undo/eventBus';\nimport { pushSnapshot, redo as undoRedo, undo as undoUndo } from '../undo/undoStack';\nimport type { LoupeBindings, UndoBindings } from './TrialChrome';\nimport { TrialChrome } from './TrialChrome';\n\n/** Props for `<Trial>`. */\nexport interface TrialProps {\n id: string;\n /** Contributions the lab adds to this trial's chrome, merged after the\n * instrument's own. */\n chrome?: readonly TrialContribution[];\n /** Built-in contribution ids to drop. Throws on an id that is not there. */\n suppress?: readonly string[];\n}\n\n/** Renders one trial from the lab store: looks up its record and\n * instrument, and mounts the instrument inside the trial chrome. */\nexport function Trial({ id, chrome, suppress }: TrialProps) {\n const lab = useLabContext();\n const storeCtx = useContext(LabStoreContext);\n if (!storeCtx) throw new Error('[labkit] <Trial> requires <LabStoreProvider>');\n const record = useStore(storeCtx.store, (s) => s.trials.find((w) => w.id === id));\n if (!record) {\n return <div className=\"lk-trial lk-trial--unknown\">Trial not found: {id}</div>;\n }\n const instrument = lab.instruments.find((i) => i.name === record.instrumentName);\n if (!instrument) {\n return (\n <div className=\"lk-trial lk-trial--unknown\">Unknown instrument: {record.instrumentName}</div>\n );\n }\n return (\n <TrialRuntime\n record={record}\n instrument={instrument}\n store={storeCtx.store}\n isLast={lab.trials.length <= 1}\n chrome={chrome}\n suppress={suppress}\n />\n );\n}\n\ninterface TrialRuntimeProps {\n record: TrialRecord;\n instrument: Instrument;\n store: LabStore;\n isLast: boolean;\n chrome?: readonly TrialContribution[];\n suppress?: readonly string[];\n}\n\nfunction TrialRuntime({ record, instrument, store, isLast, chrome, suppress }: TrialRuntimeProps) {\n const canvasContainerRef = useRef<HTMLDivElement | null>(null);\n const loupeHostRef = useRef<HTMLDivElement | null>(null);\n const updateTrialState = useStore(store, (s) => s.updateTrialState);\n const updateTrialConfig = useStore(store, (s) => s.updateTrialConfig);\n const updateTrialView = useStore(store, (s) => s.updateTrialView);\n const updateTrialUndoStack = useStore(store, (s) => s.updateTrialUndoStack);\n const updateTrialAnnotations = useStore(store, (s) => s.updateTrialAnnotations);\n const labToolId = useStore(store, (s) => s.activeToolId);\n const setLabTool = useStore(store, (s) => s.setLabTool);\n const setTrialTool = useStore(store, (s) => s.setTrialTool);\n\n const busRef = useRef<EventBus | null>(null);\n if (busRef.current === null) busRef.current = createEventBus();\n const bus = busRef.current;\n\n const [layerVisibility, setLayerVisibility] = useState<Record<string, boolean>>({});\n const [layerOrder, setLayerOrder] = useState<string[] | null>(null);\n const [loupeOn, setLoupeOn] = useState(false);\n\n const visibleLayers = useMemo(\n () =>\n (instrument.canvas?.layers ?? [])\n .filter((l) => layerVisibility[l.id] !== false)\n .map((l) => l.id),\n [instrument.canvas, layerVisibility],\n );\n\n const undoCap = instrument.undo;\n const undoEvents = useMemo(() => new Set(undoCap?.snapshotOn ?? ['state.change']), [undoCap]);\n const maxDepth = undoCap?.maxDepth ?? 50;\n\n const snapshotIfNeeded = (event: string): void => {\n if (!undoCap || !undoEvents.has(event)) return;\n const current = store.getState().trials.find((w) => w.id === record.id);\n if (!current) return;\n const snap = structuredClone(current.state);\n updateTrialUndoStack(record.id, (prev) => pushSnapshot(prev, snap, maxDepth));\n };\n\n const setView = (v: unknown): void => updateTrialView(record.id, v);\n\n // A function `initialView` needs the canvas size, so `trialOps` leaves the\n // view null and the first measurement resolves it. Reset nulls it again,\n // which re-frames — so the guard is the null itself, not a \"have I run\" flag.\n const placeView = (size: ViewportSize): void => {\n const declared = instrument.canvas?.initialView;\n if (typeof declared !== 'function') return;\n if (record.view != null) return;\n setView(declared(size));\n };\n\n // The capability's own `targets` thunk, re-read on every call: a target\n // resizing or gaining a dependency must not need the store rebuilt. Held in\n // a ref because the store is built once and closes over it.\n const annotationsCap = instrument.annotations;\n const targetsRef = useRef<() => readonly AnnotationTargetInfo[]>(() => []);\n targetsRef.current = () =>\n annotationsCap ? annotationsCap.targets(record.state, record.config) : [];\n\n // One store for the trial's lifetime. Marks do not survive a reload yet —\n // the storage slot is 3d.\n const annotationsRef = useRef<ReturnType<typeof annotationsFromJSON> | null>(null);\n // Read through refs for the same reason `targets` is: the store is built\n // once, and an export must draw against the config the trial holds now.\n const configRef = useRef<unknown>(record.config);\n configRef.current = record.config;\n if (annotationsRef.current === null) {\n // Seeded from wherever the marks were kept: the instrument's own store if\n // it declared one, else this trial's slot.\n const kept = annotationsCap?.storage ? annotationsCap.storage.load() : record.annotations;\n annotationsRef.current = annotationsFromJSON(kept, () => targetsRef.current(), {\n meaning: annotationsCap?.meaning,\n config: () => configRef.current,\n onCapture: (result) => annotationsCap?.onCapture?.(result),\n });\n }\n const annotations = annotationsRef.current;\n\n // Written on a trailing debounce rather than per notification: a scene\n // mutates every frame of a drag, and a zustand write per frame re-renders\n // every trial in the lab. The unmount flush is not an optimization — the\n // last mark before a trial closes is otherwise lost.\n const saveCap = annotationsCap?.storage;\n const saveRef = useRef<(doc: unknown) => void>(() => {});\n saveRef.current = (doc) => {\n if (saveCap) saveCap.save(doc as never);\n else updateTrialAnnotations(record.id, doc);\n };\n // Only when the pair flips, which is rare: bumping React state on every\n // scene notification would re-render the trial on every frame of a drag,\n // which is the thing the debounce below exists to avoid.\n const [markMoves, setMarkMoves] = useState({ undo: false, redo: false });\n useEffect(() => {\n if (!annotationsCap) return;\n const read = (): void => {\n const next = { undo: annotations.canUndo(), redo: annotations.canRedo() };\n setMarkMoves((prev) => (prev.undo === next.undo && prev.redo === next.redo ? prev : next));\n };\n read();\n return annotations.subscribe(read);\n }, [annotations, annotationsCap]);\n\n useEffect(() => {\n if (!annotationsCap) return;\n let timer: ReturnType<typeof setTimeout> | null = null;\n let dirty = false;\n const flush = (): void => {\n if (!dirty) return;\n dirty = false;\n saveRef.current(annotations.toJSON());\n };\n const off = annotations.subscribe(() => {\n dirty = true;\n if (timer) clearTimeout(timer);\n timer = setTimeout(() => {\n timer = null;\n flush();\n }, 250);\n });\n return () => {\n off();\n if (timer) clearTimeout(timer);\n flush();\n };\n }, [annotations, annotationsCap]);\n\n // A trial gets its own slot when its instrument declares tools; otherwise it\n // reads the lab's. Which slot a change writes follows from the same thing.\n // Annotation tools are a trial's own for the same reason: two trials\n // annotating different pictures must not share one active tool.\n const declaresTools = instrument.tools != null || instrument.annotations != null;\n const resolvedToolId = declaresTools\n ? (record.activeToolId ??\n instrument.tools?.initial ??\n instrument.tools?.tools[0]?.id ??\n (instrument.annotations ? 'select' : null))\n : labToolId;\n const setActiveTool = (id: string): void => {\n if (declaresTools) setTrialTool(record.id, id);\n else setLabTool(id);\n };\n\n // `CanvasStack` and the zoom controls are 2D; a trial holding another view shape\n // gets the default here and simply never renders them.\n const view2d = as2DView(record.view);\n\n const jobCap = instrument.job;\n // Hooks cannot be conditional, so a trial without the capability still calls\n // this — with a runner that yields nothing and is never started.\n const job = useJob({\n capability: jobCap ?? { run: async function* () {}, onItem: (_i, st) => st },\n config: record.config,\n state: record.state,\n setState: (next) => updateTrialState(record.id, next as never),\n });\n\n const renderCtx: RenderContext<unknown, unknown> = {\n state: record.state,\n config: record.config,\n setState: (next) => {\n snapshotIfNeeded('state.change');\n updateTrialState(record.id, next);\n bus.emit('state.change');\n },\n setConfig: (key, value) => {\n const evt = `config.change:${String(key)}`;\n snapshotIfNeeded('config.change');\n snapshotIfNeeded(evt);\n updateTrialConfig(record.id, key as never, value as never);\n bus.emit('config.change');\n bus.emit(evt);\n },\n trial: {\n id: record.id,\n view: record.view,\n setView,\n zoom: view2d?.zoom ?? 1,\n setZoom: (z) => {\n if (!view2d) return;\n updateTrialView(record.id, { ...view2d, zoom: z });\n },\n activeToolId: resolvedToolId,\n visibleLayers,\n },\n emit: (event) => {\n snapshotIfNeeded(event);\n bus.emit(event);\n },\n job: jobCap ? job : undefined,\n };\n\n // Marks are undone through weasel history, not through labkit's snapshot\n // stack — the spec's rule, and the reason a mark scene is the truth. A trial\n // declaring both takes the marks first: the most recent thing the user did\n // is what undo is for, and only a mark change moves the mark history.\n const undoState = () => {\n const result = undoUndo(record.undoStack, structuredClone(record.state));\n if (!result) return;\n updateTrialState(record.id, result.snapshot as never);\n updateTrialUndoStack(record.id, result.stack);\n };\n const redoState = () => {\n const result = undoRedo(record.undoStack, structuredClone(record.state));\n if (!result) return;\n updateTrialState(record.id, result.snapshot as never);\n updateTrialUndoStack(record.id, result.stack);\n };\n\n const undoBindings: UndoBindings | undefined =\n undoCap || annotationsCap\n ? {\n canUndo: markMoves.undo || (undoCap ? record.undoStack.past.length > 0 : false),\n canRedo: markMoves.redo || (undoCap ? record.undoStack.future.length > 0 : false),\n undo: () => {\n if (annotationsCap && annotations.undo()) return;\n if (undoCap) undoState();\n },\n redo: () => {\n if (annotationsCap && annotations.redo()) return;\n if (undoCap) redoState();\n },\n }\n : undefined;\n\n const loupeCap = useMemo(() => {\n const declared = instrument.loupe;\n if (declared == null) return null;\n return resolveLoupe(typeof declared === 'function' ? declared(record.config) : declared);\n }, [instrument.loupe, record.config]);\n const loupeBindings: LoupeBindings | undefined = loupeCap\n ? { on: loupeOn, toggle: () => setLoupeOn((v) => !v) }\n : undefined;\n\n const canvasLayers: CanvasLayerDescriptor[] = useMemo(() => {\n if (!instrument.canvas) return [];\n const baseLayers = instrument.canvas.layers;\n const ordered = layerOrder\n ? [...baseLayers].sort((a, b) => layerOrder.indexOf(a.id) - layerOrder.indexOf(b.id))\n : baseLayers;\n return ordered.map((layer) => ({\n id: layer.id,\n visible: layerVisibility[layer.id] !== false,\n render: (ctx, view, frame) => {\n // Camera applied here, so a layer draws in world coordinates. `zoom`\n // stays in the args for line widths, which must not scale with it.\n applyCamera(ctx, view, frame);\n layer.draw(ctx, { state: record.state, config: record.config, zoom: view.zoom });\n },\n }));\n }, [instrument.canvas, record.state, record.config, layerVisibility, layerOrder]);\n\n const layerDescriptors: LayerDescriptor[] = useMemo(() => {\n if (!instrument.layers) return [];\n return instrument.layers.ids.map((l) => (typeof l === 'string' ? { id: l, label: l } : l));\n }, [instrument.layers]);\n\n const dragDropResult = useDragDrop({\n capability: instrument.dragDrop ?? { palette: [], onDrop: (_p, _i, s) => s },\n canvasContainerRef,\n view: view2d ?? DEFAULT_VIEW,\n worldSpec: instrument.canvas?.worldSpec,\n state: record.state,\n config: record.config,\n setState: (next) => {\n snapshotIfNeeded('canvas.itemAdded');\n updateTrialState(record.id, next as never);\n },\n emit: (evt) => {\n snapshotIfNeeded(evt);\n bus.emit(evt);\n },\n });\n\n const paletteItems: PaletteItem[] = useMemo(() => {\n if (!instrument.dragDrop) return [];\n const p = instrument.dragDrop.palette;\n return typeof p === 'function' ? p(record.state, record.config) : p;\n }, [instrument.dragDrop, record.state, record.config]);\n\n const layersWithFeedback: CanvasLayerDescriptor[] = useMemo(() => {\n if (!dragDropResult.drag?.feedback) return canvasLayers;\n const fb = dragDropResult.drag.feedback;\n const screen = dragDropResult.drag.screenPos;\n return [\n ...canvasLayers,\n {\n id: '__lk_drag_feedback',\n visible: true,\n render: (ctx) => {\n const el = canvasContainerRef.current;\n if (!el) return;\n const r = el.getBoundingClientRect();\n ctx.save();\n ctx.strokeStyle = fb.ok ? '#3a7' : '#c44';\n ctx.lineWidth = 2;\n ctx.beginPath();\n ctx.arc(screen.x - r.left, screen.y - r.top, 16, 0, Math.PI * 2);\n ctx.stroke();\n ctx.restore();\n },\n },\n ];\n }, [canvasLayers, dragDropResult.drag]);\n\n // The lens tracks the pointer over whatever box holds the content: the canvas\n // stack's own element, which it takes from context, or the wrapper below.\n const lens = loupeCap ? (\n <TrialLoupe\n capability={loupeCap}\n enabled={loupeOn}\n state={record.state}\n config={record.config}\n view={view2d ?? DEFAULT_VIEW}\n worldSpec={instrument.canvas?.worldSpec}\n hostRef={loupeHostRef}\n />\n ) : null;\n\n let body: ReactNode;\n if (instrument.canvas) {\n body = (\n <div ref={canvasContainerRef} className=\"lk-trial__canvas-host\">\n <CanvasStack\n layers={layersWithFeedback}\n view={view2d ?? DEFAULT_VIEW}\n onViewChange={setView}\n worldSpec={instrument.canvas.worldSpec}\n onResize={placeView}\n minZoom={instrument.canvas.minZoom}\n maxZoom={instrument.canvas.maxZoom}\n >\n {instrument.render(renderCtx)}\n {lens}\n </CanvasStack>\n <DragOverlay drag={dragDropResult.drag} />\n </div>\n );\n } else if (lens) {\n body = (\n <div ref={loupeHostRef} className=\"lk-trial__loupe-host\">\n {instrument.render(renderCtx)}\n {lens}\n </div>\n );\n } else {\n body = instrument.render(renderCtx);\n }\n\n const startDrag = dragDropResult.startDrag;\n const paletteNode = useMemo(\n () =>\n paletteItems.length > 0 ? <Palette items={paletteItems} onDragStart={startDrag} /> : null,\n [paletteItems, startDrag],\n );\n\n const layerListNode = useMemo(\n () =>\n instrument.layers && layerDescriptors.length > 0 ? (\n <LayerList\n layers={layerDescriptors}\n visibility={layerVisibility}\n onReorder={(next) => {\n setLayerOrder(next.map((l) => l.id));\n bus.emit('layers.reorder');\n }}\n onToggle={(lid, visible) => {\n setLayerVisibility((prev) => ({ ...prev, [lid]: visible }));\n bus.emit('layers.toggle');\n }}\n />\n ) : null,\n [instrument.layers, layerDescriptors, layerVisibility, bus],\n );\n\n const extraChrome = useMemo<TrialContribution[]>(() => {\n const out: TrialContribution[] = [];\n if (paletteNode) {\n out.push({\n id: 'dragdrop-palette',\n region: 'sidebar',\n item: { title: 'Parts', body: paletteNode },\n });\n }\n if (layerListNode) {\n out.push({\n id: 'layer-list',\n region: 'sidebar',\n item: { title: 'Layers', body: layerListNode },\n });\n }\n return out;\n }, [paletteNode, layerListNode]);\n\n // Rendered beside the body rather than inside it: an overlay portals itself\n // into the surface container, so where it sits in this tree decides only\n // when its effects run — after the instrument's refs have attached.\n const annotationOverlays = annotationsCap ? (\n <AnnotationTargets\n capability={annotationsCap}\n state={record.state}\n config={record.config}\n annotations={annotations}\n activeToolId={resolvedToolId}\n />\n ) : null;\n\n return (\n <TrialIdProvider trialId={record.id}>\n <AnnotationsContext.Provider value={annotationsCap ? annotations : null}>\n <TrialChrome\n job={jobCap ? job : undefined}\n loupe={loupeBindings}\n trialId={record.id}\n record={record}\n instrument={instrument}\n isLastTrial={isLast}\n undoBindings={undoBindings}\n trialChrome={extraChrome}\n chrome={chrome}\n suppress={suppress}\n activeToolId={resolvedToolId}\n setActiveTool={setActiveTool}\n >\n {body}\n {annotationOverlays}\n </TrialChrome>\n </AnnotationsContext.Provider>\n </TrialIdProvider>\n );\n}\n","import type { Instrument, InstrumentList } from '../instrument/types';\nimport type { TrialRecord } from '../state/types';\n\nconst DEFAULT_VIEW = { zoom: 1, pan: { x: 0, y: 0 } } as const;\n\nfunction findInstrument(instruments: InstrumentList, name: string): Instrument {\n const found = instruments.find((i) => i.name === name);\n if (!found) {\n throw new Error(`[labkit] Unknown instrument: \"${name}\"`);\n }\n return found;\n}\n\nfunction initialView(instrument: Instrument): TrialRecord['view'] {\n const declared = instrument.canvas?.initialView;\n // A function needs the canvas size, which no trial has at creation. `null`\n // is the unplaced marker; `Trial` resolves it on the first non-empty size.\n if (typeof declared === 'function') return null;\n return declared ? structuredClone(declared) : { ...DEFAULT_VIEW, pan: { ...DEFAULT_VIEW.pan } };\n}\n\n/** Append a new trial running `instrumentName`, at that instrument's\n * default config and initial state. */\nexport function addTrial(\n trials: TrialRecord[],\n instruments: InstrumentList,\n instrumentName: string,\n): TrialRecord[] {\n const instrument = findInstrument(instruments, instrumentName);\n const config = instrument.defaultConfig();\n const state = instrument.initialState(config);\n const record: TrialRecord = {\n id: crypto.randomUUID(),\n instrumentName,\n config,\n state,\n view: initialView(instrument),\n undoStack: { past: [], future: [] },\n };\n return [...trials, record];\n}\n\n/** Insert a deep copy of a trial directly after it. The copy starts with\n * an empty undo history — the original's is not shared. */\nexport function cloneTrial(trials: TrialRecord[], id: string): TrialRecord[] {\n const sourceIdx = trials.findIndex((w) => w.id === id);\n const source = trials[sourceIdx];\n if (!source) return trials;\n const clone: TrialRecord = {\n ...source,\n id: crypto.randomUUID(),\n config: structuredClone(source.config),\n state: structuredClone(source.state),\n view: structuredClone(source.view),\n undoStack: { past: [], future: [] },\n };\n return [...trials.slice(0, sourceIdx + 1), clone, ...trials.slice(sourceIdx + 1)];\n}\n\n/** Remove a trial, unless it is the last one — a lab always has at least\n * one. */\nexport function closeTrial(trials: TrialRecord[], id: string): TrialRecord[] {\n if (trials.length <= 1) return trials;\n const next = trials.filter((w) => w.id !== id);\n return next.length === trials.length ? trials : next;\n}\n\n/** Return a trial to its instrument's defaults, keeping its id and its\n * place in the list. */\nexport function resetTrial(\n trials: TrialRecord[],\n id: string,\n instruments: InstrumentList,\n): TrialRecord[] {\n const idx = trials.findIndex((w) => w.id === id);\n const current = trials[idx];\n if (!current) return trials;\n const instrument = findInstrument(instruments, current.instrumentName);\n const config = instrument.defaultConfig();\n const state = instrument.initialState(config);\n const reset: TrialRecord = {\n ...current,\n config,\n state,\n view: initialView(instrument),\n };\n return [...trials.slice(0, idx), reset, ...trials.slice(idx + 1)];\n}\n\n/**\n * Reorder to match `ids`. Ids the list doesn't mention keep their relative\n * order at the end, and ids it names that no longer exist are dropped — a\n * reorder that raced a close should not resurrect the closed trial.\n */\nexport function reorderTrials(trials: TrialRecord[], ids: readonly string[]): TrialRecord[] {\n const byId = new Map(trials.map((w) => [w.id, w]));\n const named = ids.map((id) => byId.get(id)).filter((w): w is TrialRecord => w !== undefined);\n const seen = new Set(named.map((w) => w.id));\n const rest = trials.filter((w) => !seen.has(w.id));\n return [...named, ...rest];\n}\n","import { AddIcon, ModeAutoIcon, ModeDarkIcon, ModeLightIcon } from '@weasel-js/ui';\nimport { Select, ToggleBar } from '../passthrough/weasel-ui';\nimport type { LabMode } from '../state/types';\nimport { useLabContext } from './LabContext';\n\n// The glyph is the segment's content and the word is its accessible name, so\n// the bar stays a three-way radiogroup announcing Auto / Light / Dark.\nconst MODES = [\n { value: 'auto' as LabMode, label: 'Auto', glyph: <ModeAutoIcon size={14} /> },\n { value: 'light' as LabMode, label: 'Light', glyph: <ModeLightIcon size={14} /> },\n { value: 'dark' as LabMode, label: 'Dark', glyph: <ModeDarkIcon size={14} /> },\n];\n\nconst MODE_ITEMS = MODES.map(({ value, label, glyph }) => ({\n value,\n label: glyph,\n ariaLabel: label,\n}));\n\n/** The controls `<Lab>` puts in its header: add a trial, and choose the color\n * mode. Both drive `LabContext`, which carried them with no UI at all — so\n * every consumer rebuilt these two. Rendered before a consumer's own header\n * content, which still lands beside them. */\nexport function LabHeader() {\n const lab = useLabContext();\n const only = lab.instruments.length === 1 ? lab.instruments[0] : null;\n\n return (\n <>\n {only ? (\n <button\n type=\"button\"\n className=\"lk-lab-header__add\"\n onClick={() => lab.addTrial(only.name)}\n >\n <AddIcon size={16} />\n <span>Add trial</span>\n </button>\n ) : (\n // Held at null so the control stays an \"add one\" action rather than\n // reading as the current instrument.\n <Select\n className=\"lk-lab-header__add-select\"\n aria-label=\"Add trial\"\n placeholder=\"Add trial…\"\n selectedKey={null}\n options={lab.instruments.map((i) => ({ value: i.name, label: i.name }))}\n onSelectionChange={(name) => {\n if (name != null) lab.addTrial(String(name));\n }}\n />\n )}\n\n <ToggleBar\n className=\"lk-lab-header__mode\"\n ariaLabel=\"Color mode\"\n size=\"sm\"\n variant=\"flat\"\n items={MODE_ITEMS}\n value={lab.mode}\n onChange={(next) => {\n if (next) lab.setMode(next);\n }}\n />\n </>\n );\n}\n","import { useContext } from 'react';\nimport { useStore } from 'zustand/react';\nimport { PaletteRegion } from '../chrome/regions/PaletteRegion';\nimport type { TrialChromeContext, TrialContribution } from '../chrome/types';\nimport { LabStoreContext } from '../state/context';\nimport type { TrialTool } from '../tools/types';\n\n/** Props for `<LabPalette>`. */\nexport interface LabPaletteProps {\n tools: readonly TrialTool[];\n}\n\n/** The lab's tool strip. Writes the lab's tool slot, which every trial whose\n * instrument declares no tools of its own resolves to. */\nexport function LabPalette({ tools }: LabPaletteProps) {\n const storeCtx = useContext(LabStoreContext);\n if (!storeCtx) throw new Error('[labkit] LabPalette requires <LabStoreProvider>');\n const activeToolId = useStore(storeCtx.store, (s) => s.activeToolId);\n const setLabTool = useStore(storeCtx.store, (s) => s.setLabTool);\n\n const contributions: TrialContribution[] = tools.map((t) => ({\n id: t.id,\n region: 'palette',\n group: t.group,\n item: { icon: t.icon, label: t.label, shortcut: t.shortcut },\n }));\n\n const ctx = {\n activeToolId,\n setActiveTool: setLabTool,\n } as unknown as TrialChromeContext;\n\n return <PaletteRegion contributions={contributions} ctx={ctx} />;\n}\n","import { useEffect, useState } from 'react';\nimport type { LabMode } from '../state/types';\n\nfunction query(): MediaQueryList | null {\n if (typeof window === 'undefined' || !window.matchMedia) return null;\n return window.matchMedia('(prefers-color-scheme: light)');\n}\n\n/**\n * Resolve a `LabMode` to the mode the theme resolver understands.\n *\n * `auto` is not a mode — it means \"read the OS\", live. An explicit choice\n * opts out of the subscription entirely.\n */\nexport function useResolvedMode(mode: LabMode): 'light' | 'dark' {\n const [system, setSystem] = useState<'light' | 'dark'>(() =>\n query()?.matches ? 'light' : 'dark',\n );\n\n useEffect(() => {\n if (mode !== 'auto') return;\n const mq = query();\n if (!mq) return;\n const onChange = (e: MediaQueryListEvent) => setSystem(e.matches ? 'light' : 'dark');\n mq.addEventListener('change', onChange);\n return () => mq.removeEventListener('change', onChange);\n }, [mode]);\n\n return mode === 'auto' ? system : mode;\n}\n","import { ThemeProvider, useThemeOptional } from '@weasel-js/theme/react';\nimport type { ReactNode } from 'react';\nimport type { LabMode } from '../state/types';\nimport { interstellarTheme } from '../theme/interstellar';\nimport { useResolvedMode } from './useSystemMode';\n\n/** Props for `<LabShell>`. */\nexport interface LabShellProps {\n title: string;\n children: ReactNode;\n /** Optional content rendered into the header (e.g., action buttons). */\n header?: ReactNode;\n /** Optional content rendered into the footer. */\n footer?: ReactNode;\n /** Color mode. \"auto\" (default) follows prefers-color-scheme. */\n mode?: LabMode;\n}\n\n/** Page frame for a lab: a titled header, a body, and an optional footer,\n * themed for the resolved color mode. Presentational only — use `<Lab>` when\n * the trial runtime is wanted too. */\nexport function LabShell({ title, children, header, footer, mode = 'auto' }: LabShellProps) {\n const resolved = useResolvedMode(mode);\n const outer = useThemeOptional();\n\n const shell = (\n <div className=\"lk-root lk-shell\">\n <header className=\"lk-shell-header\">\n <h1 className=\"lk-shell-title\">{title}</h1>\n {header && <div className=\"lk-shell-header-actions\">{header}</div>}\n </header>\n <main className=\"lk-shell-body\">{children}</main>\n {footer && <footer className=\"lk-shell-footer\">{footer}</footer>}\n </div>\n );\n\n // Inside <Lab> the theme is already applied on `.lk-lab`; wrapping again\n // would only add a div.\n return outer ? (\n shell\n ) : (\n <ThemeProvider theme={interstellarTheme} mode={resolved}>\n {shell}\n </ThemeProvider>\n );\n}\n","import {\n Children,\n type ReactNode,\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n} from 'react';\nimport { asNodeId, createNode, floatingStrategy, gridStrategy, type NodeId, Store } from 'windease';\nimport {\n type ChromeMap,\n Container,\n DragProvider,\n Provider,\n StrategyRegistryProvider,\n} from 'windease/react';\n\nimport { useSurfaceOptional } from '../surface/useSurfaceTile';\nimport { TrialDragContext } from '../trial/TrialDragContext';\nimport { usePanelHosts } from './panelHost';\n\nconst ZONE_ID = asNodeId('lk-workspace');\nconst STRATEGIES = { grid: gridStrategy as never, floating: floatingStrategy as never };\nconst FLOAT_ZONE_ID = asNodeId('lk-workspace-floating');\nconst PANEL_KIND = 'panel';\nconst KIND = 'trial';\n\n/** A tile's persisted extent, keyed by the id its caller gave it. Grid resizes\n * write `span`; `size` is here because a strategy swap would write that. */\nexport type TrialLayout = Record<\n string,\n { size?: { w?: number; h?: number }; span?: { cols?: number; rows?: number } }\n>;\n\nexport interface WorkspaceProps {\n children: ReactNode;\n /**\n * Stable id per child, positionally matched. Supply these whenever a tile\n * can be closed from the middle: without them a tile is identified by its\n * position, so closing one shifts every id after it and the panes inherit\n * each other's dragged extents. `layout` and `reorderable` both key off\n * these, so neither means much without them.\n */\n ids?: readonly string[];\n /** Draggable seams between tiles. Off by default — an even tiling is the\n * behavior every existing caller has. */\n resizable?: boolean;\n /** Let a tile be dragged to a new position. Off by default. The grid never\n * reorders `children` itself: it reports the order a drop would produce and\n * the caller commits it. */\n reorderable?: boolean;\n /** The full id list a drop would produce, in its new order. */\n onReorder?: (ids: string[]) => void;\n /** Extents from a previous session, applied to tiles as they register. */\n layout?: TrialLayout;\n /** Fires when a tile's extent changes. Persist it and hand it back as\n * `layout` to make a resize survive a reload. */\n onLayoutChange?: (layout: TrialLayout) => void;\n gap?: number;\n padding?: number;\n /** Undocked sidebar panels to render alongside the trials. A `'tile'` panel\n * joins the grid as a peer of the trials; a `'floating'` one goes into the\n * floating zone above it. The body is portalled in by the trial that owns\n * it, so all this renders is the frame and the host. */\n panels?: readonly PanelDescriptor[];\n /**\n * Fixed tiling extent. Omit in an app — the grid measures its own box. Supply\n * it where nothing measures, notably jsdom: at a zero measurement the grid\n * renders no tiles at all.\n */\n viewport?: { w: number; h: number };\n}\n\nfunction extentOf(store: Store, id: NodeId): TrialLayout[string] | null {\n const p = store.getNode(id)?.membership?.placement as TrialLayout[string] | undefined;\n if (!p) return null;\n const out: TrialLayout[string] = {};\n if (p.size) out.size = p.size;\n if (p.span) out.span = p.span;\n return Object.keys(out).length > 0 ? out : null;\n}\n\n/**\n * Auto-balanced tiling of trials, `ceil(sqrt(n))` columns wide.\n *\n * Tiles are absolutely positioned at the rects `gridStrategy` computes, not\n * laid out by CSS — `windease/styles.css` (folded into\n * `@weasel-js/labkit/styles.css`) carries the rules that positioning depends on.\n *\n * `panels` are undocked sidebar sections. A `'tile'` panel is registered as a\n * peer of the trials under `PANEL_KIND`, so the grid places and resizes it like\n * one; a `'floating'` panel goes in the overlay above. Either way this renders\n * only the frame and an empty host: the section's content is portalled in by\n * the trial that owns it, which is what keeps a torn-out section inside its\n * trial's React tree instead of rebuilding it as a sibling.\n */\n\n/** The frame an undocked panel gets: a box, and the host element its trial\n * portals into. The title and the dock control come through the portal with\n * the body — the workspace knows a panel's key, not what is in it. */\nfunction PanelFrame({ panel, floating = false }: { panel: PanelDescriptor; floating?: boolean }) {\n const hosts = usePanelHosts();\n return (\n <div className={floating ? 'lk-panel-tile lk-panel-tile--floating' : 'lk-panel-tile'}>\n <div className=\"lk-panel-tile__body\" ref={(el) => hosts?.set(panel.key, el)} />\n </div>\n );\n}\n\n/** One undocked panel, as the workspace needs to know it. */\nexport interface PanelDescriptor {\n /** Stable key; also the portal host key the owning trial writes into. */\n key: string;\n title: string;\n as: 'tile' | 'floating';\n}\n\nexport function Workspace({\n children,\n ids,\n panels,\n resizable = false,\n reorderable = false,\n onReorder,\n layout,\n onLayoutChange,\n gap = 12,\n padding = 0,\n viewport,\n}: WorkspaceProps) {\n const items = Children.toArray(children);\n const tilePanels = useMemo(() => (panels ?? []).filter((p) => p.as === 'tile'), [panels]);\n const floatPanels = useMemo(() => (panels ?? []).filter((p) => p.as === 'floating'), [panels]);\n // Identity has to be stable while the id *contents* are unchanged: the sync\n // effect below keys off it, and a fresh array every render would re-register\n // every tile forever. A ref keyed on the joined ids says that directly, where\n // a `useMemo` on the same key can only say it by suppressing both linters.\n const wantedIds = [\n ...items.map((_, i) => ids?.[i] ?? `lk-ws-${i}`),\n ...tilePanels.map((p) => `lk-panel-${p.key}`),\n ];\n const idKey = wantedIds.join(',');\n const idKeyRef = useRef<string | null>(null);\n const nodeIdsRef = useRef<NodeId[]>([]);\n if (idKeyRef.current !== idKey) {\n idKeyRef.current = idKey;\n nodeIdsRef.current = wantedIds.map(asNodeId);\n }\n const nodeIds = nodeIdsRef.current;\n\n // Held in refs rather than depended on: a fresh object each render would\n // re-run the sync effect, and only a newly registered tile reads `layout`.\n const layoutRef = useRef(layout);\n layoutRef.current = layout;\n const onLayoutChangeRef = useRef(onLayoutChange);\n onLayoutChangeRef.current = onLayoutChange;\n\n // One store for the component's lifetime: a tile's dragged extent lives in\n // its node, so rebuilding the store on every add or close would silently\n // reset every pane.\n const storeRef = useRef<Store | null>(null);\n if (storeRef.current === null) {\n const store = new Store();\n store.registerNode(\n createNode({\n kind: 'zone',\n id: ZONE_ID,\n container: { strategyId: 'grid', config: { resizable, gap, padding } },\n }),\n );\n store.registerNode(\n createNode({\n kind: 'zone',\n id: FLOAT_ZONE_ID,\n container: { strategyId: 'floating', config: {} },\n }),\n );\n storeRef.current = store;\n }\n const store = storeRef.current;\n\n // A tile that only moves reports nothing to a ResizeObserver, and only this\n // component knows the grid moved one. Optional: a lab may own no surface.\n const surface = useSurfaceOptional();\n\n useLayoutEffect(() => {\n store.updateContainerConfig(ZONE_ID, { resizable, gap, padding });\n }, [store, resizable, gap, padding]);\n\n useLayoutEffect(() => {\n const present = new Set(store.getContainerView(ZONE_ID)?.childOrder ?? []);\n const wanted = new Set(nodeIds);\n for (const id of present) {\n if (!wanted.has(id)) store.unregisterNode(id);\n }\n for (const id of nodeIds) {\n if (present.has(id)) continue;\n const kind = String(id).startsWith('lk-panel-') ? PANEL_KIND : KIND;\n store.registerNode(createNode({ kind, id, parentId: ZONE_ID, focus: true }));\n store.showNode(id);\n const saved = layoutRef.current?.[id];\n if (saved) store.patchPlacement(id, saved);\n }\n store.setChildOrder(ZONE_ID, [...nodeIds]);\n }, [store, nodeIds]);\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: nodeIds is the signal that the tile set changed — a re-tile moves tiles without resizing any — not a value this reads\n useEffect(() => {\n if (!surface) return;\n surface.invalidateRects();\n return store.events.on('node.placementChanged', () => surface.invalidateRects());\n }, [store, surface, nodeIds]); // eslint-disable-line react-hooks/exhaustive-deps\n\n useEffect(() => {\n if (!onLayoutChange) return;\n return store.events.on('node.placementChanged', () => {\n const next: TrialLayout = {};\n for (const child of store.getChildren(ZONE_ID)) {\n const extent = extentOf(store, child.id);\n if (extent) next[child.id] = extent;\n }\n onLayoutChangeRef.current?.(next);\n });\n }, [store, onLayoutChange]);\n\n const commitOrder = useCallback(\n (nextIds: NodeId[]) => onReorder?.(nextIds.map(String)),\n [onReorder],\n );\n\n const chrome = useMemo<ChromeMap>(() => {\n const byId = new Map<string, ReactNode>(nodeIds.map((id, i) => [id, items[i]]));\n const panelByNode = new Map<string, PanelDescriptor>(\n tilePanels.map((p) => [`lk-panel-${p.key}`, p]),\n );\n return {\n [PANEL_KIND]: ({ node }) => {\n const panel = panelByNode.get(String(node.id));\n if (!panel) return null;\n return <PanelFrame panel={panel} />;\n },\n [KIND]: ({ node }) => {\n const content = byId.get(node.id) ?? null;\n if (!reorderable) return content;\n return (\n // No grip strip: the trial's own title bar is the drag surface.\n <TrialDragContext.Provider value={{ nodeId: node.id }}>\n <div className=\"lk-trial-tile\">{content}</div>\n </TrialDragContext.Provider>\n );\n },\n };\n }, [nodeIds, items, reorderable, tilePanels]);\n\n const floatingLayer =\n floatPanels.length === 0 ? null : (\n <div className=\"lk-workspace__floating\">\n {floatPanels.map((p) => (\n <PanelFrame key={p.key} panel={p} floating />\n ))}\n </div>\n );\n\n const grid = (\n <Container\n parentId={ZONE_ID}\n chrome={chrome}\n className=\"lk-workspace windease-zone\"\n affordances={resizable}\n viewport={viewport}\n onChildOrderChange={reorderable ? commitOrder : undefined}\n />\n );\n\n return (\n <Provider store={store}>\n <StrategyRegistryProvider strategies={STRATEGIES}>\n {floatingLayer ? (\n // The floating layer insets against the workspace, so it needs a\n // positioned box around both. Without one it insets against the page\n // and lands over the lab header.\n <div className=\"lk-workspace-host\">\n {reorderable ? <DragProvider>{grid}</DragProvider> : grid}\n {floatingLayer}\n </div>\n ) : reorderable ? (\n <DragProvider>{grid}</DragProvider>\n ) : (\n grid\n )}\n </StrategyRegistryProvider>\n </Provider>\n );\n}\n","import { ThemeProvider } from '@weasel-js/theme/react';\nimport {\n type CSSProperties,\n type ReactNode,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { useStore } from 'zustand/react';\nimport type { TrialContribution } from '../chrome/types';\nimport type { ConfigRule, ControlRenderer } from '../config/types';\nimport type { InstrumentList } from '../instrument/types';\nimport { noneAdapter } from '../state/adapters';\nimport { LabStoreContext } from '../state/context';\nimport { createLabStore, type LabStore } from '../state/store';\nimport type { LabMode, StorageAdapter, TrialRecord } from '../state/types';\nimport { SurfaceCanvasContext, SurfaceContext } from '../surface/SurfaceContext';\nimport { useSurfaceCanvas, useSurfaceOptional } from '../surface/useSurfaceTile';\nimport { useTiledSurface } from '../surface/useTiledSurface';\nimport { interstellarTheme } from '../theme/interstellar';\nimport type { TrialTool } from '../tools/types';\nimport { Trial } from '../trial/Trial';\nimport {\n addTrial as addTrialOp,\n cloneTrial as cloneTrialOp,\n closeTrial as closeTrialOp,\n reorderTrials as reorderTrialsOp,\n resetTrial as resetTrialOp,\n} from '../trial/trialOps';\nimport { LabContext, type LabContextValue } from './LabContext';\nimport { LabHeader } from './LabHeader';\nimport { LabPalette } from './LabPalette';\nimport { LabShell } from './LabShell';\nimport { createPanelHostRegistry, PanelHostContext } from './panelHost';\nimport { useResolvedMode } from './useSystemMode';\nimport { type PanelDescriptor, type TrialLayout, Workspace } from './Workspace';\n\n/** Props for `<Lab>`. */\nexport interface LabProps {\n instruments: InstrumentList;\n defaultInstrument: string;\n storage?: StorageAdapter | null;\n storageKey?: string;\n mode?: LabMode;\n /**\n * Optional list of CSS colors used to compose the interstellar theme's\n * cosmic backdrop. Each color becomes one radial-gradient blob on the\n * dark void base. Order maps to a fixed spread of positions; extras wrap\n * around. Ignored unless the resolved mode is dark.\n */\n nebula?: readonly string[];\n title?: string;\n /** Rendered in the shell's footer, below the workspace. */\n footer?: ReactNode;\n /** Contributions added to every trial's chrome, after the instrument's own. */\n chrome?: readonly TrialContribution[];\n /** Built-in contribution ids to drop. Throws on an id that is not there. */\n suppress?: readonly string[];\n /** Tools offered lab-wide. A trial whose instrument declares none of its own\n * reflects and writes this slot. */\n tools?: readonly TrialTool[];\n /** Rules run over every instrument's config leaves, before labkit's own\n * inference — where a lab states a convention once instead of annotating\n * each field. Memoize or hoist. */\n configRules?: readonly ConfigRule[];\n /** Control overrides and app-defined kinds for every trial's settings panel.\n * Keys are config paths (checked first) or leaf kinds. Memoize or hoist. */\n controls?: Record<string, ControlRenderer>;\n children?: ReactNode;\n}\n\nfunction buildStore(\n instruments: InstrumentList,\n defaultInstrument: string,\n storage: StorageAdapter,\n storageKey: string,\n initialMode: LabMode,\n): LabStore {\n const store = createLabStore({ storageKey, storage, initialMode });\n if (store.getState().trials.length === 0) {\n const seeded = addTrialOp([], instruments, defaultInstrument);\n const record = seeded[0];\n if (record) {\n const { undoStack: _undoStack, ...rest } = record;\n store.getState().addTrial(rest);\n }\n }\n return store;\n}\n\n// Fixed spread of nebula blob positions / sizes / fall-off stops. Colors\n// supplied via the `nebula` prop are slotted into these slots in order;\n// callers passing more than 5 wrap around (intentional — keeps the look\n// readable and bounded).\nconst NEBULA_SLOTS = [\n { cx: '18%', cy: '30%', sx: '60%', sy: '80%', stop: '70%' },\n { cx: '78%', cy: '70%', sx: '55%', sy: '90%', stop: '65%' },\n { cx: '50%', cy: '50%', sx: '50%', sy: '70%', stop: '75%' },\n { cx: '12%', cy: '82%', sx: '50%', sy: '70%', stop: '70%' },\n { cx: '85%', cy: '18%', sx: '55%', sy: '80%', stop: '70%' },\n] as const;\n\nfunction buildNebula(colors: readonly string[]): string {\n const blobs = colors.map((c, i) => {\n const p = NEBULA_SLOTS[i % NEBULA_SLOTS.length];\n return `radial-gradient(ellipse ${p.sx} ${p.sy} at ${p.cx} ${p.cy}, color-mix(in srgb, ${c} 22%, transparent), transparent ${p.stop})`;\n });\n blobs.push('radial-gradient(ellipse at center, #0a0a18 0%, #02020a 100%)');\n return blobs.join(', ');\n}\n\n/** The lab runtime: creates the store, provides it, and renders one trial\n * per record in a grid. Each trial runs one of `instruments`. */\nexport function Lab({\n instruments,\n defaultInstrument,\n storage,\n storageKey,\n mode,\n nebula,\n title,\n footer,\n chrome,\n suppress,\n tools,\n configRules,\n controls,\n children,\n}: LabProps) {\n if (process.env.NODE_ENV !== 'production' && instruments.length === 0) {\n throw new Error('[labkit] <Lab> requires a non-empty `instruments` array');\n }\n\n const storeRef = useRef<LabStore | null>(null);\n if (storeRef.current === null) {\n storeRef.current = buildStore(\n instruments,\n defaultInstrument,\n storage ?? noneAdapter,\n storageKey ?? 'labkit',\n mode ?? 'auto',\n );\n }\n const store = storeRef.current;\n\n const trials = useStore(store, (s) => s.trials);\n const savedSnapshots = useStore(store, (s) => s.savedSnapshots);\n const modeValue = useStore(store, (s) => s.mode);\n const layout = useStore(store, (s) => s.layout);\n const undockedPanels = useStore(store, (s) => s.undockedPanels);\n\n // One registry for the lab's lifetime: a panel host is a DOM node the\n // workspace owns and the trial portals into, so it must outlive both ends of\n // a dock/undock without being rebuilt.\n const panelHostsRef = useRef<ReturnType<typeof createPanelHostRegistry> | null>(null);\n if (panelHostsRef.current === null) panelHostsRef.current = createPanelHostRegistry();\n\n // One shared drawing surface for the whole lab, anchored to the body — tile\n // rects compose against it, and every tile paints into the one buffer.\n // `Workspace` invalidates rects when the grid moves something a\n // ResizeObserver cannot see. A host that already owns a surface keeps it: a\n // lab embedded in a larger shared-surface app must not open a second GL\n // tenancy, and mounts no buffer of its own.\n const outerSurface = useSurfaceOptional();\n const outerCanvas = useSurfaceCanvas();\n const [ownCanvas, setOwnCanvas] = useState<HTMLCanvasElement | null>(null);\n const ownCanvasRef = useRef<HTMLCanvasElement | null>(null);\n const bufferRef = useRef({ w: 0, h: 0 });\n const surfaceRef = useRef<ReturnType<typeof useTiledSurface> | null>(null);\n\n // Sizing the buffer clears all of it, so every tile has to repaint — not\n // only the one whose move triggered the measurement.\n const onFrame = useCallback((frame: { size: { width: number; height: number }; dpr: number }) => {\n const c = ownCanvasRef.current;\n if (!c) return;\n const w = Math.round(frame.size.width * frame.dpr);\n const h = Math.round(frame.size.height * frame.dpr);\n if (bufferRef.current.w === w && bufferRef.current.h === h) return;\n bufferRef.current = { w, h };\n c.width = w;\n c.height = h;\n c.style.width = `${frame.size.width}px`;\n c.style.height = `${frame.size.height}px`;\n surfaceRef.current?.invalidateAll();\n }, []);\n\n const ownSurface = useTiledSurface({ onFrame });\n surfaceRef.current = ownSurface;\n const surface = outerSurface ?? ownSurface;\n const surfaceCanvas = outerSurface ? outerCanvas : ownCanvas;\n\n const workspacePanels = useMemo<PanelDescriptor[]>(\n () =>\n Object.entries(undockedPanels).map(([key, panel]) => ({\n key,\n title: panel.sectionId,\n as: panel.as,\n })),\n [undockedPanels],\n );\n const resolvedMode = useResolvedMode(modeValue);\n\n useEffect(() => {\n if (mode && mode !== store.getState().mode) {\n store.getState().setMode(mode);\n }\n }, [mode, store]);\n\n const contextValue = useMemo<LabContextValue>(() => {\n const replaceTrials = (next: TrialRecord[]): void => {\n const currentById = new Map(store.getState().trials.map((w) => [w.id, w]));\n const merged = next.map((w) => currentById.get(w.id) ?? w);\n store.setState({ trials: merged });\n // Trigger persistence flush via a tracked action.\n store.getState().setMode(store.getState().mode);\n };\n\n return {\n instruments,\n trials,\n addTrial: (instrumentName) => {\n const next = addTrialOp(store.getState().trials, instruments, instrumentName);\n replaceTrials(next);\n },\n cloneTrial: (id) => {\n const next = cloneTrialOp(store.getState().trials, id);\n replaceTrials(next);\n },\n closeTrial: (id) => {\n const next = closeTrialOp(store.getState().trials, id);\n replaceTrials(next);\n },\n reorderTrials: (ids) => {\n replaceTrials(reorderTrialsOp(store.getState().trials, ids));\n },\n resetTrial: (id) => {\n const next = resetTrialOp(store.getState().trials, id, instruments);\n const record = next.find((w) => w.id === id);\n if (!record) return;\n store.setState((s) => ({\n trials: s.trials.map((w) =>\n w.id === id\n ? { ...w, config: record.config, state: record.state, view: record.view }\n : w,\n ),\n }));\n store.getState().updateTrialView(id, record.view);\n },\n savedSnapshots,\n saveSnapshot: (trialId, name) => {\n const taken = store.getState().savedSnapshots.filter((s) => s.trialId === trialId).length;\n store.getState().saveSnapshot(trialId, name ?? `Snapshot ${taken + 1}`);\n },\n loadSnapshot: (trialId, snapshotId) => {\n store.getState().loadSnapshot(snapshotId, trialId);\n },\n deleteSnapshot: (snapshotId) => {\n store.getState().deleteSnapshot(snapshotId);\n },\n mode: modeValue,\n setMode: (m) => {\n store.getState().setMode(m);\n },\n configRules,\n controls,\n };\n }, [instruments, trials, savedSnapshots, modeValue, store, configRules, controls]);\n\n // Only override the backdrop in dark, where there is one to override.\n // Setting a CSS custom property is the sanctioned use of inline style.\n const backdropStyle =\n resolvedMode === 'dark' && nebula && nebula.length > 0\n ? ({ ['--wzl-backdrop' as string]: buildNebula(nebula) } as CSSProperties)\n : undefined;\n\n return (\n <LabStoreContext.Provider value={{ store }}>\n <LabContext.Provider value={contextValue}>\n <ThemeProvider\n theme={interstellarTheme}\n mode={resolvedMode}\n className=\"lk-lab\"\n style={backdropStyle}\n >\n <LabShell\n title={title ?? 'Labkit'}\n mode={modeValue}\n footer={footer}\n header={\n <>\n <LabHeader />\n {children}\n </>\n }\n >\n <PanelHostContext.Provider value={panelHostsRef.current}>\n <SurfaceContext.Provider value={surface}>\n <SurfaceCanvasContext.Provider value={surfaceCanvas}>\n <div\n className=\"lk-lab__body\"\n ref={outerSurface ? undefined : ownSurface.containerRef}\n >\n {outerSurface ? null : (\n // Above the trials and inert: the marks a tile paints have\n // to sit over the instrument's own DOM, and nothing on this\n // buffer takes input — each tile has its own input box.\n <canvas\n className=\"lk-lab__surface\"\n ref={(el) => {\n ownCanvasRef.current = el;\n setOwnCanvas(el);\n }}\n />\n )}\n {tools ? <LabPalette tools={tools} /> : null}\n <Workspace\n panels={workspacePanels}\n ids={trials.map((w) => w.id)}\n resizable\n reorderable\n onReorder={(ids) => contextValue.reorderTrials(ids)}\n layout={layout as TrialLayout}\n onLayoutChange={(next) => store.getState().setLayout(next)}\n >\n {trials.map((w) => (\n <Trial key={w.id} id={w.id} chrome={chrome} suppress={suppress} />\n ))}\n </Workspace>\n </div>\n </SurfaceCanvasContext.Provider>\n </SurfaceContext.Provider>\n </PanelHostContext.Provider>\n </LabShell>\n </ThemeProvider>\n </LabContext.Provider>\n </LabStoreContext.Provider>\n );\n}\n"]}
|