@weasel-js/svg 1.5.0 → 1.5.2

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/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/types.ts","../src/transform.ts","../src/shapes.ts","../src/textAnchor.ts","../src/color.ts","../src/elements.ts","../src/patterns.ts","../src/path-serializer.ts","../src/gradients.ts","../src/cascade.ts","../src/parse.ts","../src/serialize.ts","../src/unpack.ts"],"names":["PATH_M","PATH_L","PATH_C","PATH_Q","PATH_Z","opacity","meta","num","out","getMarker","XLINK_NS","escapeAttr","boundsOfPath","b","pose","resolveTextStyle","union"],"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 /** World units, or `{ px }` for a width that holds its rendered thickness\n * however the document is scaled — SVG's `vector-effect=\"non-scaling-stroke\"`,\n * and the same unit system as the kit's `Stroke.width`. */\n width: number | { px: 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 * 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 the width the kit's text layout\n * measures — an em-based estimate when no registered font can — and\n * `height = fontSize * lineHeight * (lineCount || 1)`.\n *\n * `x` here is always the box's left edge. In the SVG it is the\n * `text-anchor` point, and the parser and serializer convert between them.\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 * `null` is SVG's `fill=\"none\"`: outline-only text, painted by its stroke\n * alone. Absent takes the default black.\n */\n fill?: FillStyle | null;\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 { invert } from '@weasel-js/geom';\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/**\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.\n *\n * `null` when `@weasel-js/geom`'s `invert` finds `ctm` singular: the geometry\n * has collapsed through it, and the local transform has no frame to live in.\n */\nexport function rebaseTransform(ctm: Matrix, local: Matrix): Matrix | null {\n const inv = invert([...ctm]);\n if (!inv) return null;\n const [a, b, c, d, e, f] = inv;\n return multiply(multiply(ctm, local), [a, b, c, d, e, f]);\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 * Lower SVG primitive elements (`<rect>`, `<circle>`, `<ellipse>`,\n * `<line>`, `<polyline>`, `<polygon>`) to weasel `Path` values. Each\n * helper applies an optional 2x3 affine matrix to the resulting geometry\n * so the caller can collapse `<g transform=\"...\">` onto leaves.\n *\n * Ellipses and rounded rects use the standard 4-segment cubic Bezier\n * approximation with control offset `k = 4*(sqrt(2)-1)/3 ≈ 0.5523`.\n */\n\nimport {\n PATH_C, PATH_L, PATH_M, PATH_Q, PATH_Z,\n PathBuilder,\n type Path,\n type PolygonPath,\n type RectPath,\n} from '@weasel-js/core';\nimport type { Matrix } from './types';\nimport { IDENTITY_MATRIX } from './types';\nimport { applyMatrix, isIdentity } from './transform';\n\n/** Magic constant: cubic Bezier control offset for a quarter-circle of radius 1. */\nconst KAPPA = (4 * (Math.sqrt(2) - 1)) / 3;\n\n/** True when `m` represents a pure axis-aligned scale + translate. */\nfunction isAxisAlignedScale(m: Matrix, eps = 1e-9): boolean {\n return Math.abs(m[1]) < eps && Math.abs(m[2]) < eps;\n}\n\n/**\n * Apply a 2x3 affine to a `Path`. RectPaths whose matrix is identity or\n * an axis-aligned scale+translate stay as `RectPath`; anything else (any\n * rotation/skew, or any PolygonPath input) is promoted to a `PolygonPath`\n * via a coords-level remap.\n */\nexport function transformPath(path: Path, m: Matrix): Path {\n if (isIdentity(m)) return path;\n if (path.kind === 'rect') {\n if (isAxisAlignedScale(m)) {\n const a = m[0], d = m[3], e = m[4], f = m[5];\n let x = path.x * a + e;\n let y = path.y * d + f;\n let w = path.width * a;\n let h = path.height * d;\n if (w < 0) { x += w; w = -w; }\n if (h < 0) { y += h; h = -h; }\n return { kind: 'rect', x, y, width: w, height: h };\n }\n // Promote to polygon, then transform.\n return transformPath(rectToPolygon(path), m);\n }\n // PolygonPath: remap every coord pair. Step counts are command-dependent\n // and all the supported commands store coord pairs, so a flat stride-2\n // walk is correct.\n const xs = path.coords;\n const out = new Float32Array(xs.length);\n for (let i = 0; i < xs.length; i += 2) {\n const p = applyMatrix(m, xs[i], xs[i + 1]);\n out[i] = p.x;\n out[i + 1] = p.y;\n }\n return {\n kind: 'polygon',\n commands: new Uint8Array(path.commands),\n coords: out,\n fillRule: path.fillRule,\n };\n}\n\nfunction rectToPolygon(r: RectPath): PolygonPath {\n const b = new PathBuilder();\n b.moveTo(r.x, r.y);\n b.lineTo(r.x + r.width, r.y);\n b.lineTo(r.x + r.width, r.y + r.height);\n b.lineTo(r.x, r.y + r.height);\n b.close();\n return b.build();\n}\n\n/**\n * `<rect x y width height rx ry>` → Path. Returns a `RectPath` when there\n * are no corner radii (and matrix is benign); otherwise lowers to a\n * polygon with cubic-curve corners.\n */\nexport function rectElementToPath(\n x: number, y: number, width: number, height: number,\n rx: number, ry: number,\n m: Matrix = IDENTITY_MATRIX,\n): Path {\n if (rx <= 0 && ry <= 0) {\n return transformPath({ kind: 'rect', x, y, width, height }, m);\n }\n const r = Math.min(Math.max(rx, ry), Math.min(width, height) / 2);\n const r2 = Math.min(rx > 0 ? rx : r, ry > 0 ? ry : r, Math.min(width, height) / 2);\n // For simplicity treat rx === ry === r2. Independent rx/ry can be\n // added later; weasel doesn't have a rounded-rect primitive anyway.\n const rad = r2;\n const k = KAPPA * rad;\n const x2 = x + width;\n const y2 = y + height;\n const b = new PathBuilder();\n b.moveTo(x + rad, y);\n b.lineTo(x2 - rad, y);\n b.curveTo(x2 - rad + k, y, x2, y + rad - k, x2, y + rad);\n b.lineTo(x2, y2 - rad);\n b.curveTo(x2, y2 - rad + k, x2 - rad + k, y2, x2 - rad, y2);\n b.lineTo(x + rad, y2);\n b.curveTo(x + rad - k, y2, x, y2 - rad + k, x, y2 - rad);\n b.lineTo(x, y + rad);\n b.curveTo(x, y + rad - k, x + rad - k, y, x + rad, y);\n b.close();\n return transformPath(b.build(), m);\n}\n\n/** `<ellipse cx cy rx ry>` → PolygonPath (4 cubic segments). */\nexport function ellipseToPath(\n cx: number, cy: number, rx: number, ry: number,\n m: Matrix = IDENTITY_MATRIX,\n): Path {\n const kx = KAPPA * rx;\n const ky = KAPPA * ry;\n const b = new PathBuilder();\n b.moveTo(cx + rx, cy);\n b.curveTo(cx + rx, cy + ky, cx + kx, cy + ry, cx, cy + ry);\n b.curveTo(cx - kx, cy + ry, cx - rx, cy + ky, cx - rx, cy);\n b.curveTo(cx - rx, cy - ky, cx - kx, cy - ry, cx, cy - ry);\n b.curveTo(cx + kx, cy - ry, cx + rx, cy - ky, cx + rx, cy);\n b.close();\n return transformPath(b.build(), m);\n}\n\n/** `<circle cx cy r>` → ellipse with rx === ry. */\nexport function circleToPath(\n cx: number, cy: number, r: number, m: Matrix = IDENTITY_MATRIX,\n): Path {\n return ellipseToPath(cx, cy, r, r, m);\n}\n\n/** `<line x1 y1 x2 y2>` → open 2-anchor polygon. */\nexport function lineToPath(\n x1: number, y1: number, x2: number, y2: number,\n m: Matrix = IDENTITY_MATRIX,\n): Path {\n const b = new PathBuilder();\n b.moveTo(x1, y1);\n b.lineTo(x2, y2);\n return transformPath(b.build(), m);\n}\n\n/** Parse SVG `points=\"x1,y1 x2,y2 ...\"` to a flat list. */\nexport function parsePoints(raw: string): { x: number; y: number }[] {\n const out: { x: number; y: number }[] = [];\n const nums = raw.match(/[-+]?(?:\\d*\\.\\d+|\\d+\\.?)(?:[eE][-+]?\\d+)?/g);\n if (!nums) return out;\n for (let i = 0; i + 1 < nums.length; i += 2) {\n out.push({ x: parseFloat(nums[i]), y: parseFloat(nums[i + 1]) });\n }\n return out;\n}\n\n/** `<polyline points=\"...\">` → open polygon. */\nexport function polylineToPath(\n points: readonly { x: number; y: number }[],\n m: Matrix = IDENTITY_MATRIX,\n): Path {\n if (points.length === 0) {\n return { kind: 'polygon', commands: new Uint8Array(), coords: new Float32Array(), fillRule: 'nonzero' };\n }\n const b = new PathBuilder();\n b.moveTo(points[0].x, points[0].y);\n for (let i = 1; i < points.length; i++) b.lineTo(points[i].x, points[i].y);\n return transformPath(b.build(), m);\n}\n\n/** `<polygon points=\"...\">` → closed polygon. */\nexport function polygonToPath(\n points: readonly { x: number; y: number }[],\n m: Matrix = IDENTITY_MATRIX,\n): Path {\n if (points.length === 0) {\n return { kind: 'polygon', commands: new Uint8Array(), coords: new Float32Array(), fillRule: 'nonzero' };\n }\n const b = new PathBuilder();\n b.moveTo(points[0].x, points[0].y);\n for (let i = 1; i < points.length; i++) b.lineTo(points[i].x, points[i].y);\n b.close();\n return transformPath(b.build(), m);\n}\n\n// Re-export the path opcodes for any callers that want to introspect.\nexport { PATH_M, PATH_L, PATH_C, PATH_Q, PATH_Z };\n","import { resolveAlign, type TextStyle } from '@weasel-js/core';\n\n/**\n * Distance from a text box's left edge to its SVG anchor point: `x` on a\n * `<text>` is where `text-anchor` lands, which is the box's left edge, center\n * or right edge once `align` and `direction` resolve to an absolute edge.\n */\nexport function anchorOffset(style: TextStyle | undefined, width: number): number {\n const edge = resolveAlign(style?.align ?? 'left', style?.direction ?? 'ltr');\n return edge === 'center' ? width / 2 : edge === 'right' ? width : 0;\n}\n","/**\n * SVG color / paint parsing. Handles the SVG-specific paint surface — the\n * sentinel `none`, `url(#id)` paint-server references, and `currentColor` —\n * then delegates the actual color tokenization (hex, `rgb()`/`rgba()`,\n * `hsl()`, and the full CSS named-color table) to the kit's `parseColor`.\n * Output is normalized to `#rrggbb` plus a separate 0..1 alpha so the rest\n * of the pipeline doesn't have to know about the encoding variants.\n */\n\nimport { parseColor, rgbaToHex } from '@weasel-js/core';\n\n/** Result of parsing a `fill=` / `stroke=` attribute value. */\nexport type ParsedColor =\n | { kind: 'none' }\n | { kind: 'solid'; color: string; alpha: number }\n | { kind: 'ref'; id: string };\n\n/**\n * Parse an SVG paint string. Returns `null` for inputs we don't recognize\n * (so the caller can emit a warning and fall back). `currentColor` resolves\n * to black here as a last-resort default; callers that participate in the\n * cascade (`readPaint`, `readTextStyle`, `readTspanRun`) pre-resolve\n * `currentColor` against the inherited `color` via `resolveCurrentColor`\n * before this function ever sees it.\n */\nexport function parsePaintAttr(raw: string | null | undefined): ParsedColor | null {\n if (raw == null) return null;\n const s = raw.trim();\n if (s === '') return null;\n if (s === 'none') return { kind: 'none' };\n if (s === 'currentColor' || s === 'currentcolor') {\n return { kind: 'solid', color: '#000000', alpha: 1 };\n }\n // url(#id) reference.\n const urlMatch = /^url\\(\\s*#([^)\\s]+)\\s*\\)/.exec(s);\n if (urlMatch) return { kind: 'ref', id: urlMatch[1] };\n // Everything else — hex, rgb()/rgba(), hsl()/hsla(), and named colors —\n // goes through the kit's CSS parser. It throws on unrecognized input;\n // we translate that into the `null` the caller expects.\n try {\n const [r, g, b, a] = parseColor(s);\n // Split into the `#rrggbb` + 0..1 alpha contract the rest of the SVG\n // pipeline depends on. `rgbaToHex` of a 3-tuple always emits 6-char,\n // lowercase hex; the alpha is carried separately.\n return { kind: 'solid', color: rgbaToHex([r, g, b]), alpha: a };\n } catch {\n return null;\n }\n}\n","/**\n * Document-wide element index, keyed by `id`.\n *\n * Paint servers (`<linearGradient>`, `<radialGradient>`, `<pattern>`) are\n * referenced by id from anywhere in the document, and SVG places no\n * requirement on where they are *declared* — `<defs>` is a convention, not a\n * rule, and a gradient may also name another gradient it inherits from. Both\n * the gradient and the pattern collectors resolve those references against\n * this index.\n */\n\n/** Element-id → element, for one set of tag names. */\nexport type ElementTable = Map<string, Element>;\n\n/**\n * Index `root` and every descendant whose lowercased tag name is in `tags`\n * and that carries an `id`. First declaration of a duplicated id wins, which\n * is what a browser's `getElementById` does.\n */\nexport function collectElementsByTag(root: Element, tags: ReadonlySet<string>): ElementTable {\n const out: ElementTable = new Map();\n const consider = (el: Element): void => {\n if (!tags.has(el.tagName.toLowerCase())) return;\n const id = el.getAttribute('id');\n if (id && !out.has(id)) out.set(id, el);\n };\n consider(root);\n const all = root.getElementsByTagName('*');\n for (let i = 0; i < all.length; i++) consider(all[i]);\n return out;\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, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;');\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 * SVG presentation-attribute cascade.\n *\n * Most SVG paint/text properties inherit down the element tree. Rather than\n * re-walking the DOM parent chain per attribute at leaf-emit time, the parser\n * threads a resolved `StyleContext` down through the recursion (alongside the\n * transform matrix): at each element we fold the element's own attributes onto\n * the inherited cascade once, and leaves read resolved values directly.\n */\n\n/**\n * Raw resolved value of each inheritable presentation property in effect at a\n * point in the tree. An absent key means the property is unset all the way up,\n * and the consumer applies its own default (matching the pre-cascade\n * `readInheritedAttr` → null contract). Values are raw SVG strings; callers\n * parse them (color, number, keyword, …).\n */\nexport type StyleContext = Readonly<Record<string, string>>;\n\n/** The empty cascade — seeds the root. */\nexport const EMPTY_STYLE: StyleContext = {};\n\n/**\n * Inheritable presentation properties the leaf/text parsers consume. Extend\n * this list (and teach the consuming leaf to read the new key) to inherit a\n * new property — no per-attribute DOM walk required.\n */\nconst INHERITABLE = [\n 'fill', 'fill-opacity', 'fill-rule',\n 'stroke', 'stroke-width', 'stroke-opacity',\n 'stroke-linecap', 'stroke-linejoin', 'stroke-dasharray', 'stroke-miterlimit',\n 'marker-start', 'marker-mid', 'marker-end',\n 'color',\n 'font-size', 'font-family', 'font-weight', 'font-style', 'text-anchor',\n 'letter-spacing', 'text-decoration', 'direction',\n] as const;\n\n/**\n * Extract a single `style=\"prop:value\"` declaration. Returns the trimmed value\n * or null when absent. Regex scan — not a full CSS parser; no `!important`.\n */\nexport function readStyleProp(el: Element, prop: string): string | null {\n const style = el.getAttribute('style');\n if (!style) return null;\n const re = new RegExp(`(?:^|;)\\\\s*${prop}\\\\s*:\\\\s*([^;]+)`, 'i');\n const m = re.exec(style);\n if (!m) return null;\n return m[1].trim();\n}\n\n/**\n * Resolve an element's own value for a property: `style=\"\"` beats the\n * presentation attribute on the same element (SVG2 specificity).\n */\nexport function ownProp(el: Element, prop: string): string | null {\n return readStyleProp(el, prop) ?? el.getAttribute(prop);\n}\n\n/**\n * Fold an element's own presentation attributes onto the inherited cascade.\n * A property that is absent or literally `inherit` keeps the parent value;\n * any other own value overrides. Returns the parent unchanged (same object)\n * when the element sets no inheritable property, avoiding a needless clone.\n */\nexport function deriveStyle(parent: StyleContext, el: Element): StyleContext {\n let next: Record<string, string> | null = null;\n for (const prop of INHERITABLE) {\n const own = ownProp(el, prop);\n if (own == null || own === 'inherit') continue;\n if (!next) next = { ...parent };\n next[prop] = own;\n }\n return next ?? parent;\n}\n\n/**\n * Resolve a paint value that may be the `currentColor` keyword against the\n * cascade's `color`. Non-currentColor values pass through; null passes through.\n * `color`'s SVG initial value is black.\n */\nexport function resolveCurrentColor(raw: string | null, style: StyleContext): string | null {\n if (raw == null) return null;\n if (raw.trim().toLowerCase() === 'currentcolor') return style['color'] ?? '#000000';\n return raw;\n}\n","/**\n * Parse an SVG document string into a `SvgNode[]` tree. Walks the SVG\n * DOM (via the platform's `DOMParser` — jsdom in tests, the browser at\n * runtime) and lowers each supported element to weasel-native shapes.\n *\n * Transforms are pushed onto a matrix stack and collapsed into leaf\n * geometry at the moment a leaf is created, so the output tree never\n * carries `transform` data — even on `<g>` nodes.\n */\n\nimport type { Path, PolygonPath } from '@weasel-js/core';\nimport { PATH_L, PATH_M, PATH_Z, pathFromD, getMarker } from '@weasel-js/core';\nimport {\n rectElementToPath, circleToPath, ellipseToPath, lineToPath,\n parsePoints, polylineToPath, polygonToPath,\n} from './shapes';\nimport { transformPath } from './shapes';\nimport type {\n Matrix, NamespaceMeta, NamespacedElement, ParseOptions, ParseResult,\n SvgNode, SvgPaint, SvgPathNode, SvgStroke, SvgTextNode, SvgImageNode,\n} from './types';\nimport type { StyledRun, TextStyle, TextPaint, FillStyle, Stroke } from '@weasel-js/core';\nimport { multiply, parseTransform, decomposeRotation, rebaseTransform, rotationComponent, isIdentity } from './transform';\nimport { boundsOfPath, layoutRuns, resolveRuns, resolveTextStyle } from '@weasel-js/core';\nimport { IDENTITY_MATRIX } from './types';\nimport { anchorOffset } from './textAnchor';\nimport { parsePaintAttr } from './color';\nimport { collectGradients, type GradientTable } from './gradients';\nimport { collectPatterns } from './patterns';\nimport { deriveStyle, EMPTY_STYLE, ownProp, resolveCurrentColor, type StyleContext } from './cascade';\n\n// Every tag set here is compared against a lowercased `tagName`.\n/** Element tags we accept and lower; anything else triggers a warning. */\nconst SUPPORTED_LEAF_TAGS = new Set([\n 'rect', 'circle', 'ellipse', 'line', 'polyline', 'polygon', 'path',\n]);\n\nconst SUPPORTED_GROUP_TAGS = new Set(['g', 'svg']);\n\nconst IGNORED_TAGS = new Set([\n 'defs', 'lineargradient', 'radialgradient', 'pattern', 'marker',\n 'title', 'desc', 'metadata',\n]);\n\n/**\n * Public entry point: parse an SVG document string. Errors during DOM\n * parsing produce a `ParseResult` with an empty `nodes` array and a\n * warning describing the issue, rather than throwing.\n */\nexport function parseSvg(svg: string, opts: ParseOptions = {}): ParseResult {\n const warnings: string[] = [];\n const onWarn = (m: string): void => { warnings.push(m); };\n\n let doc: Document;\n try {\n doc = new DOMParser().parseFromString(svg, 'image/svg+xml');\n } catch (e) {\n return { nodes: [], warnings: [`failed to parse SVG: ${(e as Error).message}`] };\n }\n const errEl = doc.getElementsByTagName('parsererror')[0];\n if (errEl) {\n return { nodes: [], warnings: [`SVG parse error: ${errEl.textContent ?? 'unknown'}`] };\n }\n const root = doc.documentElement;\n if (!root || root.tagName.toLowerCase() !== 'svg') {\n return { nodes: [], warnings: ['root element is not <svg>'] };\n }\n\n const namespaces = opts.namespaces ?? {};\n // Build a URI → prefix index for fast lookup during traversal.\n const uriToPrefix = new Map<string, string>();\n for (const [prefix, uri] of Object.entries(namespaces)) {\n uriToPrefix.set(uri, prefix);\n }\n\n const documentMeta = collectDocumentMeta(root, uriToPrefix);\n\n // Both paint-server kinds resolve through one `url(#id)` table, so a\n // patterned fill needs no separate lookup path at every use site.\n const gradients = collectGradients(root, onWarn);\n for (const [id, paint] of collectPatterns(root, onWarn)) gradients.set(id, paint);\n const rootStyle = deriveStyle(EMPTY_STYLE, root);\n const nodes = parseChildren(root, IDENTITY_MATRIX, rootStyle, gradients, onWarn, uriToPrefix);\n\n const result: ParseResult = { nodes, warnings };\n if (documentMeta) result.documentMeta = documentMeta;\n const viewBox = parseViewBoxAttr(root.getAttribute('viewBox'));\n if (viewBox) result.viewBox = viewBox;\n const width = parseRootLength(root.getAttribute('width'), 'width', onWarn);\n if (width != null) result.width = width;\n const height = parseRootLength(root.getAttribute('height'), 'height', onWarn);\n if (height != null) result.height = height;\n // First direct-child <title> wins. Per SVG spec only one is meaningful.\n for (let i = 0; i < root.children.length; i++) {\n const c = root.children[i];\n if (c.tagName.toLowerCase() === 'title') {\n result.title = c.textContent ?? '';\n break;\n }\n }\n return result;\n}\n\n/**\n * Parse an SVG `viewBox=\"x y width height\"` attribute. Returns undefined\n * on null/empty/malformed input. Numbers may be separated by whitespace\n * and/or commas (SVG spec).\n */\nfunction parseViewBoxAttr(\n raw: string | null,\n): { x: number; y: number; width: number; height: number } | undefined {\n if (raw == null) return undefined;\n const parts = raw.trim().split(/[\\s,]+/).filter(Boolean);\n if (parts.length !== 4) return undefined;\n const nums = parts.map(parseFloat);\n if (nums.some((n) => !Number.isFinite(n))) return undefined;\n return { x: nums[0], y: nums[1], width: nums[2], height: nums[3] };\n}\n\n/**\n * Root `width` / `height` as a bare user-unit number. A CSS unit or a\n * percentage is not converted — there is no viewport to resolve it against —\n * so the number is taken as-is and the discarded unit is reported.\n */\nfunction parseRootLength(\n raw: string | null, name: string, onWarn: (m: string) => void,\n): number | undefined {\n if (raw == null) return undefined;\n const n = parseFloat(raw);\n if (!Number.isFinite(n)) return undefined;\n const unit = /^\\s*[-+]?[\\d.eE+-]+\\s*([a-z%]+)\\s*$/i.exec(raw)?.[1];\n if (unit) onWarn(`<svg ${name}=\"${raw}\"> unit \"${unit}\" is not converted; read as ${n}`);\n return n;\n}\n\nfunction collectDocumentMeta(\n root: Element,\n uriToPrefix: Map<string, string>,\n): NamespaceMeta | undefined {\n if (uriToPrefix.size === 0) return undefined;\n const meta: NamespaceMeta = {};\n\n // Root-level namespaced attributes.\n for (let i = 0; i < root.attributes.length; i++) {\n const a = root.attributes[i];\n if (!a.namespaceURI) continue;\n const prefix = uriToPrefix.get(a.namespaceURI);\n if (!prefix) continue;\n const bucket = (meta[prefix] ??= {});\n (bucket.attrs ??= {})[a.localName] = a.value;\n }\n\n // Root-level namespaced child elements. The body of these is collected\n // recursively as a generic XML-element tree; geometry inside them is NOT\n // promoted to SvgNodes (that's the consumer's job if they want it).\n for (let i = 0; i < root.children.length; i++) {\n const c = root.children[i];\n if (!c.namespaceURI) continue;\n const prefix = uriToPrefix.get(c.namespaceURI);\n if (!prefix) continue;\n const bucket = (meta[prefix] ??= {});\n const elements = (bucket.elements ??= {});\n const list = (elements[c.localName] ??= []);\n list.push(collectNamespacedElement(c, uriToPrefix));\n }\n\n return Object.keys(meta).length > 0 ? meta : undefined;\n}\n\nfunction collectNamespacedElement(\n el: Element,\n uriToPrefix: Map<string, string>,\n): NamespacedElement {\n const result: NamespacedElement = { attrs: {} };\n for (let i = 0; i < el.attributes.length; i++) {\n const a = el.attributes[i];\n // For namespaced *elements* we collect every attribute (namespaced or\n // not) under the element — unlike root attrs where we filter by NS.\n // Treat `xmlns:*` as structural and skip.\n if (a.name.startsWith('xmlns')) continue;\n result.attrs[a.localName] = a.value;\n }\n\n let hasChildElements = false;\n for (let i = 0; i < el.children.length; i++) {\n const c = el.children[i];\n if (!c.namespaceURI) continue;\n const prefix = uriToPrefix.get(c.namespaceURI);\n if (!prefix) continue; // child in undeclared NS: drop\n hasChildElements = true;\n const children = (result.children ??= {});\n const list = (children[c.localName] ??= []);\n list.push(collectNamespacedElement(c, uriToPrefix));\n }\n\n if (!hasChildElements && el.textContent != null && el.textContent.trim() !== '') {\n result.text = el.textContent;\n }\n\n return result;\n}\n\n/** Per-element namespace meta: walked at every parsed SVG element. */\nfunction collectElementMeta(\n el: Element,\n uriToPrefix: Map<string, string>,\n): NamespaceMeta | undefined {\n if (uriToPrefix.size === 0) return undefined;\n const meta: NamespaceMeta = {};\n for (let i = 0; i < el.attributes.length; i++) {\n const a = el.attributes[i];\n if (!a.namespaceURI) continue;\n const prefix = uriToPrefix.get(a.namespaceURI);\n if (!prefix) continue;\n const bucket = (meta[prefix] ??= {});\n (bucket.attrs ??= {})[a.localName] = a.value;\n }\n // Namespaced child elements on a *standard* SVG element (e.g. a <g>) are\n // also surfaced under elements[] in the same shape used at the root.\n for (let i = 0; i < el.children.length; i++) {\n const c = el.children[i];\n if (!c.namespaceURI) continue;\n const prefix = uriToPrefix.get(c.namespaceURI);\n if (!prefix) continue;\n const bucket = (meta[prefix] ??= {});\n const elements = (bucket.elements ??= {});\n const list = (elements[c.localName] ??= []);\n list.push(collectNamespacedElement(c, uriToPrefix));\n }\n return Object.keys(meta).length > 0 ? meta : undefined;\n}\n\nfunction parseChildren(\n parent: Element,\n ctm: Matrix,\n style: StyleContext,\n gradients: GradientTable,\n onWarn: (m: string) => void,\n uriToPrefix: Map<string, string>,\n): SvgNode[] {\n const out: SvgNode[] = [];\n for (let i = 0; i < parent.children.length; i++) {\n const el = parent.children[i];\n // Skip namespaced children — they belong to `meta.elements`, not nodes.\n // (DOM gives SVG-native elements `http://www.w3.org/2000/svg`.)\n const ns = el.namespaceURI;\n if (ns && ns !== 'http://www.w3.org/2000/svg') continue;\n const node = parseElement(el, ctm, style, gradients, onWarn, uriToPrefix);\n if (node) {\n if (Array.isArray(node)) out.push(...node);\n else out.push(node);\n }\n }\n return out;\n}\n\nfunction parseElement(\n el: Element,\n ctm: Matrix,\n style: StyleContext,\n gradients: GradientTable,\n onWarn: (m: string) => void,\n uriToPrefix: Map<string, string>,\n): SvgNode | SvgNode[] | null {\n const tag = el.tagName.toLowerCase();\n if (IGNORED_TAGS.has(tag)) return null;\n if (tag === 'g') {\n const local = parseTransform(el.getAttribute('transform'), onWarn);\n const childCtm = multiply(ctm, local);\n const childStyle = deriveStyle(style, el);\n const children = parseChildren(el, childCtm, childStyle, gradients, onWarn, uriToPrefix);\n const opacity = readOpacityAttr(el, 'opacity');\n const group: SvgNode = { kind: 'group', children };\n if (opacity != null) group.opacity = opacity;\n const meta = collectElementMeta(el, uriToPrefix);\n if (meta) group.meta = meta;\n return group;\n }\n if (SUPPORTED_GROUP_TAGS.has(tag)) {\n // Nested <svg> — a transparent group that establishes a viewport at\n // (x, y). Inheritance flows through it; clipping does not exist here.\n const childStyle = deriveStyle(style, el);\n const x = parseFloat(el.getAttribute('x') ?? '0');\n const y = parseFloat(el.getAttribute('y') ?? '0');\n const offset: Matrix = [1, 0, 0, 1, Number.isFinite(x) ? x : 0, Number.isFinite(y) ? y : 0];\n if (el.hasAttribute('viewBox')) {\n onWarn('nested <svg> viewBox is not modeled; its children are not rescaled');\n }\n return parseChildren(el, multiply(ctm, offset), childStyle, gradients, onWarn, uriToPrefix);\n }\n if (tag === 'text') {\n const textNode = parseTextElement(el, ctm, style, gradients, onWarn);\n if (textNode && !Array.isArray(textNode) && textNode.kind === 'text') {\n const meta = collectElementMeta(el, uriToPrefix);\n if (meta) textNode.meta = meta;\n }\n return textNode;\n }\n if (tag === 'image') {\n const imageNode = parseImageElement(el, ctm, onWarn);\n if (imageNode) {\n const meta = collectElementMeta(el, uriToPrefix);\n if (meta) imageNode.meta = meta;\n }\n return imageNode;\n }\n if (!SUPPORTED_LEAF_TAGS.has(tag)) {\n onWarn(`unsupported element: <${el.tagName}>`);\n return null;\n }\n const localTransform = parseTransform(el.getAttribute('transform'), onWarn);\n // First, lower the leaf into its UNROTATED form (using just the inherited\n // CTM). Then try to extract the LEAF's local transform as a pure rotation\n // about the leaf's AABB center. When that succeeds, store the angle on\n // node.rotation. When it fails AND the leaf transform is non-identity,\n // fall back to baking the full composed matrix into geometry (legacy\n // behavior) and warn if a rotation is present that we are about to lose.\n let path = lowerLeaf(el, tag, ctm, onWarn);\n if (!path) return null;\n let rotation: number | undefined;\n if (!isIdentity(localTransform)) {\n // `path` is already through `ctm`, so the element's own transform has to\n // be too before it is compared against these bounds.\n const worldLocal = rebaseTransform(ctm, localTransform);\n const bounds = pathAabb(path);\n const cx = bounds.x + bounds.width / 2;\n const cy = bounds.y + bounds.height / 2;\n const angle = worldLocal && decomposeRotation(worldLocal, cx, cy);\n if (!worldLocal) {\n onWarn('leaf transform sits under a singular parent transform; dropped');\n } else if (angle != null) {\n rotation = angle;\n } else {\n // Bake the matrix in — match legacy behavior.\n path = transformPath(path, worldLocal);\n const rotComp = rotationComponent(worldLocal);\n if (Math.abs(rotComp) > 1e-4) {\n onWarn(`leaf transform has a rotational component that can't be cleanly stored as rotation; baked into geometry (may not round-trip identically)`);\n }\n }\n }\n const leafStyle = deriveStyle(style, el);\n const fill = readPaint(leafStyle, 'fill', '#000000', gradients, onWarn);\n const stroke = readStroke(leafStyle, gradients, onWarn, isNonScalingStroke(el));\n const opacity = readOpacityAttr(el, 'opacity');\n // `fill-rule` defaults to `nonzero`; only stamp when explicitly `evenodd`\n // and the lowered geometry is a PolygonPath (RectPath has no fillRule slot).\n const fillRuleRaw = leafStyle['fill-rule'] ?? null;\n if (fillRuleRaw === 'evenodd' && path.kind === 'polygon') {\n path = { ...path, fillRule: 'evenodd' };\n }\n const node: SvgPathNode = { kind: 'path', path, fill };\n if (stroke) node.stroke = stroke;\n if (opacity != null) node.opacity = opacity;\n if (rotation != null) node.rotation = rotation;\n // Lines are stroke-only by SVG convention; force fill=none if neither the\n // line nor an ancestor group specifies a fill.\n if (tag === 'line' && (leafStyle['fill'] ?? null) == null) {\n node.fill = { kind: 'none' };\n }\n const meta = collectElementMeta(el, uriToPrefix);\n if (meta) node.meta = meta;\n return node;\n}\n\nfunction lowerLeaf(\n el: Element,\n tag: string,\n m: Matrix,\n onWarn: (msg: string) => void,\n): Path | null {\n const num = (name: string, fallback = 0): number => {\n const v = el.getAttribute(name);\n if (v == null) return fallback;\n const n = parseFloat(v);\n return Number.isFinite(n) ? n : fallback;\n };\n if (tag === 'rect') {\n const x = num('x', 0);\n const y = num('y', 0);\n const w = num('width', 0);\n const h = num('height', 0);\n const rx = num('rx', 0);\n const ry = num('ry', 0);\n return rectElementToPath(x, y, w, h, rx, ry, m);\n }\n if (tag === 'circle') return circleToPath(num('cx'), num('cy'), num('r'), m);\n if (tag === 'ellipse') return ellipseToPath(num('cx'), num('cy'), num('rx'), num('ry'), m);\n if (tag === 'line') return lineToPath(num('x1'), num('y1'), num('x2'), num('y2'), m);\n if (tag === 'polyline') return polylineToPath(parsePoints(el.getAttribute('points') ?? ''), m);\n if (tag === 'polygon') return polygonToPath(parsePoints(el.getAttribute('points') ?? ''), m);\n if (tag === 'path') {\n const d = el.getAttribute('d') ?? '';\n if (!d.trim()) {\n onWarn('<path> with empty d=');\n return null;\n }\n const raw = pathFromD(d, onWarn);\n const transformed = transformPath(raw, m);\n // Reconstitute axis-aligned rectangles so a `{ kind: 'rect' }` source\n // node round-trips back into a `{ kind: 'rect' }` parsed node.\n if (transformed.kind === 'polygon') {\n const rect = polygonToRectIfAxisAligned(transformed);\n if (rect) return rect;\n }\n return transformed;\n }\n return null;\n}\n\n/**\n * Detect a polygon whose 4 vertices form an axis-aligned rectangle (in\n * the canonical `M L L L Z` order produced by our serializer), and\n * reconstitute it as a `RectPath`. Returns null on any deviation.\n */\nfunction polygonToRectIfAxisAligned(p: PolygonPath): Path | null {\n const cmds = p.commands;\n if (cmds.length !== 5) return null;\n if (cmds[0] !== PATH_M) return null;\n if (cmds[1] !== PATH_L || cmds[2] !== PATH_L || cmds[3] !== PATH_L) return null;\n if (cmds[4] !== PATH_Z) return null;\n const c = p.coords;\n if (c.length !== 8) return null;\n const x0 = c[0], y0 = c[1];\n const x1 = c[2], y1 = c[3];\n const x2 = c[4], y2 = c[5];\n const x3 = c[6], y3 = c[7];\n // Axis-aligned rectangle: top edge horizontal, right edge vertical, etc.\n if (y0 !== y1 || x1 !== x2 || y2 !== y3 || x3 !== x0) return null;\n const x = Math.min(x0, x1);\n const y = Math.min(y0, y2);\n const width = Math.abs(x1 - x0);\n const height = Math.abs(y2 - y1);\n if (width === 0 || height === 0) return null;\n return { kind: 'rect', x, y, width, height };\n}\n\n/**\n * Compute a `Path`'s axis-aligned bounding box. Mirrors the helper used by\n * the serializer for rotation pivot resolution; keep the duplication local\n * to parse.ts for now — lift to a shared module if a third call site\n * appears.\n */\nfunction pathAabb(path: Path): { x: number; y: number; width: number; height: number } {\n if (path.kind === 'rect') {\n return { x: path.x, y: path.y, width: path.width, height: path.height };\n }\n return boundsOfPath(path);\n}\n\nfunction readPaint(\n style: StyleContext,\n attr: 'fill' | 'stroke',\n defaultColor: string,\n gradients: GradientTable,\n onWarn: (msg: string) => void,\n): SvgPaint {\n const raw = resolveCurrentColor(style[attr] ?? null, style);\n const opacityRaw = style[`${attr}-opacity`] ?? null;\n const opacity = opacityRaw != null ? clamp01(parseFloat(opacityRaw)) : undefined;\n if (raw == null) {\n if (attr === 'stroke') return { kind: 'none' };\n const out: SvgPaint = { kind: 'solid', color: defaultColor };\n if (opacity != null) (out as { opacity?: number }).opacity = opacity;\n return out;\n }\n const parsed = parsePaintAttr(raw);\n if (!parsed) {\n onWarn(`unrecognized ${attr} value: ${raw}`);\n return { kind: 'solid', color: defaultColor };\n }\n if (parsed.kind === 'none') return { kind: 'none' };\n if (parsed.kind === 'ref') {\n const paint = gradients.get(parsed.id);\n if (!paint) {\n onWarn(`${attr} references unknown gradient #${parsed.id}`);\n return { kind: 'solid', color: defaultColor };\n }\n return { kind: 'gradient', paint };\n }\n const out: SvgPaint = { kind: 'solid', color: parsed.color };\n const a = opacity ?? (parsed.alpha < 1 ? parsed.alpha : undefined);\n if (a != null) (out as { opacity?: number }).opacity = a;\n return out;\n}\n\nfunction readStroke(\n style: StyleContext,\n gradients: GradientTable,\n onWarn: (msg: string) => void,\n nonScaling = false,\n): SvgStroke | undefined {\n const inheritedStroke = style['stroke'] ?? null;\n const inheritedWidth = style['stroke-width'] ?? null;\n if (inheritedStroke == null && inheritedWidth == null) return undefined;\n const paint = readPaint(style, 'stroke', '#000000', gradients, onWarn);\n if (paint.kind === 'none') return undefined;\n const n = inheritedWidth != null ? parseFloat(inheritedWidth) : 1;\n const stroke: SvgStroke = { paint, width: nonScaling ? { px: n } : n };\n const opacityRaw = style['stroke-opacity'] ?? null;\n if (opacityRaw != null) {\n const a = clamp01(parseFloat(opacityRaw));\n if (Number.isFinite(a)) stroke.opacity = a;\n }\n const cap = style['stroke-linecap'] ?? null;\n if (cap === 'butt' || cap === 'round' || cap === 'square') {\n stroke.cap = cap;\n } else if (cap != null) {\n onWarn(`unsupported stroke-linecap: ${cap}`);\n }\n const join = style['stroke-linejoin'] ?? null;\n if (join === 'miter' || join === 'round' || join === 'bevel') {\n stroke.join = join;\n } else if (join === 'arcs' || join === 'miter-clip') {\n onWarn(`stroke-linejoin \"${join}\" not supported; falling back to miter`);\n stroke.join = 'miter';\n } else if (join != null) {\n onWarn(`unsupported stroke-linejoin: ${join}`);\n }\n const dashAttr = style['stroke-dasharray'] ?? null;\n if (dashAttr != null && dashAttr.trim() !== '' && dashAttr.trim() !== 'none') {\n const parsed = parseDashArray(dashAttr);\n if (parsed) stroke.dash = parsed;\n else onWarn(`unrecognized stroke-dasharray: ${dashAttr}`);\n }\n const miterAttr = style['stroke-miterlimit'] ?? null;\n if (miterAttr != null) {\n const m = parseFloat(miterAttr);\n if (Number.isFinite(m) && m >= 1) stroke.miterLimit = m;\n else onWarn(`unrecognized stroke-miterlimit: ${miterAttr}`);\n }\n for (const [attr, field] of [\n ['marker-start', 'markerStart'],\n ['marker-mid', 'markerMid'],\n ['marker-end', 'markerEnd'],\n ] as const) {\n const id = parseMarkerRef(style[attr] ?? null);\n if (id === undefined) continue;\n if (getMarker(id) === undefined) {\n onWarn(`${attr} references a marker this kit has no entry for: #${id}`);\n continue;\n }\n stroke[field] = id;\n }\n return stroke;\n}\n\n/** `url(#id)` -> `id`; `none`, an empty value, or anything else -> undefined. */\nfunction parseMarkerRef(raw: string | null): string | undefined {\n if (!raw) return undefined;\n const v = raw.trim();\n if (v === '' || v === 'none') return undefined;\n const m = /^url\\(\\s*#([^)\\s]+)\\s*\\)/.exec(v);\n return m ? m[1] : undefined;\n}\n\n/**\n * The stroke keys `readStroke` consults, collected off one element's own\n * attributes rather than the inherited cascade.\n *\n * A `<tspan>` inherits its parent `<text>`'s stroke per the SVG cascade, but\n * the runs model resolves a run's stroke against the node's already — so\n * lifting an inherited value onto the run would write the same paint twice\n * and make an unstyled run look deliberately styled.\n */\nconst STROKE_KEYS = [\n 'stroke', 'stroke-width', 'stroke-opacity', 'stroke-linecap',\n 'stroke-linejoin', 'stroke-dasharray', 'stroke-miterlimit',\n 'marker-start', 'marker-mid', 'marker-end',\n] as const;\n\n/** Whether this element pins its stroke width to rendered pixels.\n *\n * Read off the element rather than the cascade: `vector-effect` is one of the\n * few presentation attributes SVG does not inherit, so a `<g>` carrying it\n * must not hand it to its children. */\nfunction isNonScalingStroke(el: Element): boolean {\n return ownProp(el, 'vector-effect') === 'non-scaling-stroke';\n}\n\nfunction ownStrokeStyle(el: Element): StyleContext {\n const out: Record<string, string> = {};\n for (const k of STROKE_KEYS) {\n const v = ownProp(el, k);\n if (v != null) out[k] = v;\n }\n return out;\n}\n\n/**\n * Lower an {@link SvgStroke} to the kit's `Stroke`, whose paint is a\n * `FillStyle` rather than an `SvgPaint`. Returns `undefined` for a stroke\n * that paints nothing, so callers can leave the field absent.\n */\nfunction coreStroke(stroke: SvgStroke | undefined): Stroke | undefined {\n if (!stroke) return undefined;\n let paint: FillStyle;\n if (stroke.paint.kind === 'gradient') {\n paint = stroke.paint.paint;\n } else if (stroke.paint.kind === 'solid') {\n paint = stroke.paint.opacity != null\n ? { fill: 'solid', color: stroke.paint.color, opacity: stroke.paint.opacity }\n : { fill: 'solid', color: stroke.paint.color };\n } else {\n return undefined;\n }\n const out: Stroke = { paint, width: stroke.width };\n if (stroke.cap) out.cap = stroke.cap;\n if (stroke.join) out.join = stroke.join;\n if (stroke.dash) out.dash = stroke.dash;\n if (stroke.miterLimit != null) out.miterLimit = stroke.miterLimit;\n if (stroke.markerStart) out.markerStart = stroke.markerStart;\n if (stroke.markerMid) out.markerMid = stroke.markerMid;\n if (stroke.markerEnd) out.markerEnd = stroke.markerEnd;\n return out;\n}\n\n/**\n * Parse an SVG `stroke-dasharray` value into a non-negative number array.\n * Per spec, odd-length lists are duplicated to make the dash pattern even.\n * Returns null if any token fails to parse as a non-negative finite number.\n */\nfunction parseDashArray(s: string): number[] | null {\n const tokens = s.trim().split(/[\\s,]+/).filter(Boolean);\n if (tokens.length === 0) return null;\n const nums: number[] = [];\n for (const t of tokens) {\n const n = parseFloat(t);\n if (!Number.isFinite(n) || n < 0) return null;\n nums.push(n);\n }\n return nums.length % 2 === 1 ? [...nums, ...nums] : nums;\n}\n\nfunction readOpacityAttr(el: Element, name: string): number | undefined {\n const raw = ownProp(el, name);\n if (raw == null) return undefined;\n const n = parseFloat(raw);\n return Number.isFinite(n) ? clamp01(n) : undefined;\n}\n\nfunction clamp01(n: number): number {\n return n < 0 ? 0 : n > 1 ? 1 : n;\n}\n\n/**\n * Parse an SVG `letter-spacing` value into world units. Accepts a bare\n * number, a `px` suffix, or the `normal` keyword (→ `undefined`, via the\n * `NaN` from `parseFloat('normal')`). Any other unit suffix (`em`, `%`,\n * `pt`, …) is still numerically coerced — `parseFloat` reads the leading\n * digits — but flagged, since e.g. `0.1em` silently becomes `0.1` world\n * units, off by a factor of the font size.\n */\nfunction parseLetterSpacing(raw: string, onWarn: (m: string) => void): number | undefined {\n const n = parseFloat(raw);\n if (!Number.isFinite(n)) return undefined;\n const unit = /^-?[\\d.]+([a-z%]+)$/i.exec(raw.trim())?.[1]?.toLowerCase();\n if (unit && unit !== 'px') {\n onWarn(`letter-spacing \"${raw}\" uses unit \"${unit}\", which is not converted; treated as ${n} world units`);\n }\n return n;\n}\n\n/**\n * Parse an SVG `text-decoration` value into the boolean flags the runs model\n * uses. `text-decoration` is a space-separated list of line tokens\n * (`underline`, `line-through`, `overline`, `blink`, `none`), matched\n * case-insensitively per CSS keyword rules; we model `underline`,\n * `line-through` (→ `strikethrough`) and `overline` — any other token\n * (including `none`) is dropped without warning, since it's either the\n * explicit \"no decoration\" case or a decoration kind the runs model has no\n * key for.\n */\nfunction parseTextDecoration(\n raw: string | null,\n): { underline?: boolean; strikethrough?: boolean; overline?: boolean } {\n if (raw == null) return {};\n const tokens = raw.trim().toLowerCase().split(/\\s+/);\n const out: { underline?: boolean; strikethrough?: boolean; overline?: boolean } = {};\n if (tokens.includes('underline')) out.underline = true;\n if (tokens.includes('line-through')) out.strikethrough = true;\n if (tokens.includes('overline')) out.overline = true;\n return out;\n}\n\n/**\n * Parse an SVG `baseline-shift` value into the run keys it maps to. `super`\n * and `sub` are the presets `script` names; a percentage resolves against the\n * parent's font size, which is the unit `baselineShift` is already in; and\n * `baseline` (or a bare zero) is no shift at all. Any other value is read as\n * ems, with a unit suffix other than `em` flagged the way\n * `parseLetterSpacing` flags one.\n */\nfunction parseBaselineShift(\n raw: string,\n onWarn: (m: string) => void,\n): { script?: 'super' | 'sub'; baselineShift?: number } {\n const keyword = raw.trim().toLowerCase();\n if (keyword === 'super' || keyword === 'sub') return { script: keyword };\n const n = parseFloat(raw);\n if (!Number.isFinite(n)) return {};\n const unit = /^-?[\\d.]+([a-z%]+)$/i.exec(raw.trim())?.[1]?.toLowerCase();\n if (unit === '%') return { baselineShift: n / 100 };\n if (unit && unit !== 'em') {\n onWarn(`baseline-shift \"${raw}\" uses unit \"${unit}\", which is not converted; treated as ${n} em`);\n }\n return n === 0 ? {} : { baselineShift: n };\n}\n\n/**\n * Parse a run's `font-size` into the key it maps to: a percentage is relative\n * to the parent's size, which is `fontScale`, and a length is the absolute\n * `fontSize`. Units other than `px` are numerically coerced and flagged, as\n * in `parseLetterSpacing`.\n */\nfunction parseRunFontSize(\n raw: string,\n onWarn: (m: string) => void,\n): { fontSize?: number; fontScale?: number } {\n const n = parseFloat(raw);\n if (!Number.isFinite(n)) return {};\n const unit = /^-?[\\d.]+([a-z%]+)$/i.exec(raw.trim())?.[1]?.toLowerCase();\n if (unit === '%') return { fontScale: n / 100 };\n if (unit && unit !== 'px') {\n onWarn(`font-size \"${raw}\" uses unit \"${unit}\", which is not converted; treated as ${n} world units`);\n }\n return { fontSize: n };\n}\n\n/**\n * Parse an SVG `<text>` element into an `SvgTextNode`. Reads geometry\n * from x/y plus optional `data-weasel-width` / `data-weasel-height`\n * (preserved across weasel→SVG round-trips); falls back to font-metric\n * estimates when those attrs are absent (external SVG sources).\n *\n * Child `<tspan>` elements with their own font/fill attrs become\n * `StyledRun`s on the node. Plain text without `<tspan>` produces no\n * `runs` and the node's `text` is the raw text content.\n */\nconst XLINK_NS = 'http://www.w3.org/1999/xlink';\n\nfunction parseImageElement(\n el: Element,\n ctm: Matrix,\n onWarn: (m: string) => void,\n): SvgImageNode | null {\n const href = el.getAttribute('href')\n ?? el.getAttributeNS(XLINK_NS, 'href')\n ?? el.getAttribute('xlink:href');\n if (!href) {\n onWarn('<image> without href; dropped');\n return null;\n }\n const num = (raw: string | null, fallback: number): number => {\n if (raw == null) return fallback;\n const n = parseFloat(raw);\n return Number.isFinite(n) ? n : fallback;\n };\n const rawX = num(el.getAttribute('x'), 0);\n const rawY = num(el.getAttribute('y'), 0);\n const rawW = num(el.getAttribute('width'), 0);\n const rawH = num(el.getAttribute('height'), 0);\n // Map both corners through the inherited CTM and take their AABB, so\n // translate / scale / flip land on the box. A rotation in the *inherited*\n // transform inflates it; the element's own transform is decomposed below.\n const px = (x: number, y: number): [number, number] =>\n [ctm[0] * x + ctm[2] * y + ctm[4], ctm[1] * x + ctm[3] * y + ctm[5]];\n const [x0, y0] = px(rawX, rawY);\n const [x1, y1] = px(rawX + rawW, rawY + rawH);\n const node: SvgImageNode = {\n kind: 'image',\n href,\n x: Math.min(x0, x1),\n y: Math.min(y0, y1),\n width: Math.abs(x1 - x0),\n height: Math.abs(y1 - y0),\n };\n const opacity = readOpacityAttr(el, 'opacity');\n if (opacity != null) node.opacity = opacity;\n const localTransform = parseTransform(el.getAttribute('transform'), onWarn);\n if (!isIdentity(localTransform)) {\n const worldLocal = rebaseTransform(ctm, localTransform);\n const cx = node.x + node.width / 2;\n const cy = node.y + node.height / 2;\n const angle = worldLocal && decomposeRotation(worldLocal, cx, cy);\n if (!worldLocal) {\n onWarn('<image> transform sits under a singular parent transform; dropped');\n } else if (angle != null) {\n node.rotation = angle;\n } else {\n const rotComp = rotationComponent(worldLocal);\n if (Math.abs(rotComp) > 1e-4) {\n onWarn('<image> transform has a rotational component that can\\'t be cleanly stored as rotation; dropped (may not round-trip identically)');\n }\n }\n }\n if (el.hasAttribute('preserveAspectRatio')\n && el.getAttribute('preserveAspectRatio') !== 'none') {\n onWarn('<image> preserveAspectRatio is not modeled; the box is taken literally');\n }\n return node;\n}\n\nconst XML_NS = 'http://www.w3.org/XML/1998/namespace';\n\n/**\n * Does `xml:space=\"preserve\"` apply to this element? The attribute inherits,\n * so an ancestor can set it.\n *\n * weasel's own `<text>` output carries it, because the runs model stores real\n * line breaks and SVG's default whitespace handling would collapse them away.\n */\nfunction preservesSpace(el: Element): boolean {\n for (let e: Element | null = el; e; e = e.parentElement) {\n const v = e.getAttributeNS(XML_NS, 'space') ?? e.getAttribute('xml:space');\n if (v === 'preserve') return true;\n if (v === 'default') return false;\n }\n return false;\n}\n\n/**\n * Apply SVG's default whitespace handling to a `<text>` element's runs, in\n * place: newlines dropped, tabs folded to spaces, runs of spaces collapsed to\n * one, and leading / trailing space stripped across the element as a whole.\n *\n * Without this, importing any pretty-printed SVG drags the source file's\n * indentation into the document text — and, because the height estimate\n * counts newlines, reports a one-line label as four lines tall.\n */\nfunction collapseRunWhitespace(runs: StyledRun[]): void {\n let atStart = true;\n let lastWasSpace = false;\n for (const run of runs) {\n let out = '';\n for (const ch of run.text.replace(/\\n/g, '').replace(/[\\t\\r]/g, ' ')) {\n if (ch === ' ') {\n if (atStart || lastWasSpace) continue;\n out += ' ';\n lastWasSpace = true;\n continue;\n }\n out += ch;\n lastWasSpace = false;\n atStart = false;\n }\n run.text = out;\n }\n for (let i = runs.length - 1; i >= 0; i--) {\n if (runs[i].text === '') continue;\n if (runs[i].text.endsWith(' ')) runs[i].text = runs[i].text.slice(0, -1);\n break;\n }\n for (let i = runs.length - 1; i >= 0; i--) {\n if (runs[i].text === '') runs.splice(i, 1);\n }\n}\n\n/** Average glyph advance as a fraction of the em. Sans-serif Latin runs\n * 0.5–0.6; erring wide is the safer miss. */\nconst ESTIMATED_GLYPH_ADVANCE_EM = 0.6;\n\n/**\n * Width of an external `<text>`'s longest line, through the same layout\n * `kit:text` paints with. With no registered font able to measure it, the\n * layout reports nothing, and the width is estimated from the em instead.\n */\nfunction laidOutWidth(runs: readonly StyledRun[], style: TextStyle, plain: string): number {\n const resolved = resolveTextStyle(style);\n const { bounds } = layoutRuns(resolveRuns(runs.length > 0 ? runs : [{ text: plain }], resolved), {\n maxWidth: Infinity,\n lineHeight: resolved.lineHeight,\n align: resolved.align,\n direction: resolved.direction,\n });\n if (bounds.width > 0) return bounds.width;\n const longest = plain.split('\\n').reduce((max, line) => Math.max(max, line.length), 0);\n return longest * resolved.fontSize * ESTIMATED_GLYPH_ADVANCE_EM;\n}\n\nfunction parseTextElement(\n el: Element,\n ctm: Matrix,\n style: StyleContext,\n gradients: GradientTable,\n onWarn: (m: string) => void,\n): SvgNode | null {\n const num = (raw: string | null, fallback: number): number => {\n if (raw == null) return fallback;\n const n = parseFloat(raw);\n return Number.isFinite(n) ? n : fallback;\n };\n const localTransform = parseTransform(el.getAttribute('transform'), onWarn);\n // Use only the inherited CTM to position the text's anchor; the\n // element-local transform is decomposed below so a pure rotation about\n // the text box's center is surfaced as `node.rotation` rather than\n // baked into the anchor (and lost).\n const m = ctm;\n\n const rawX = num(el.getAttribute('x'), 0);\n const rawY = num(el.getAttribute('y'), 0);\n // Translate the anchor point through the accumulated transform. Skew /\n // non-uniform scale on the text node lower the round-trip honestly but\n // skew the box dimensions — the rare cases warn and lose styling.\n const ax = m[0] * rawX + m[2] * rawY + m[4];\n const ay = m[1] * rawX + m[3] * rawY + m[5];\n\n const leafStyle = deriveStyle(style, el);\n const textStyle = readTextStyle(leafStyle, onWarn);\n const textPaint = readTextPaint(leafStyle, gradients, onWarn, isNonScalingStroke(el));\n const fontSize = textStyle.fontSize ?? 16;\n const lineHeight = textStyle.lineHeight ?? 1.2;\n\n const dominantBaseline = el.getAttribute('dominant-baseline');\n const explicitTopAnchor = dominantBaseline === 'text-before-edge'\n || dominantBaseline === 'hanging';\n // If serialized by us, `y` is already the top edge. Otherwise SVG's\n // default is `y` = baseline of the first line — shift up by one\n // line of cap-height so weasel's box top approximates the cap-line.\n const topY = explicitTopAnchor ? ay : ay - fontSize;\n\n // `baseline-shift` is legal and inheritable on <text> itself, and unlike\n // every other run key it has no node-level home to be read into — so a bare\n // text child would drop it. Seed those children with it instead; a <tspan>\n // naming its own still wins, as the SVG cascade says.\n const ownShift = ownProp(el, 'baseline-shift');\n const inheritedShift = ownShift != null ? parseBaselineShift(ownShift, onWarn) : {};\n\n // Walk children: text nodes become plain run text; <tspan> elements\n // become StyledRuns with their attribute overrides applied.\n const runs: StyledRun[] = [];\n for (let i = 0; i < el.childNodes.length; i++) {\n const child = el.childNodes[i];\n if (child.nodeType === 3 /* TEXT_NODE */) {\n const t = child.textContent ?? '';\n if (!t) continue;\n runs.push({ text: t, ...inheritedShift });\n } else if (child.nodeType === 1 /* ELEMENT_NODE */) {\n const sp = child as Element;\n if (sp.tagName.toLowerCase() !== 'tspan') {\n onWarn(`<text> child <${sp.tagName}> not supported; flattening text content`);\n const t = sp.textContent ?? '';\n if (t) runs.push({ text: t, ...inheritedShift });\n continue;\n }\n const run = readTspanRun(sp, gradients, leafStyle, onWarn);\n runs.push(run);\n }\n }\n if (!preservesSpace(el)) collapseRunWhitespace(runs);\n const plain = runs.map((r) => r.text).join('');\n\n // data-weasel-* attrs win; otherwise the box is what the text lays out to.\n const dataW = num(el.getAttribute('data-weasel-width'), NaN);\n const dataH = num(el.getAttribute('data-weasel-height'), NaN);\n const width = Number.isFinite(dataW) ? dataW : laidOutWidth(runs, textStyle, plain);\n // Newlines in the text drive line count for height estimation.\n const lines = (plain.match(/\\n/g)?.length ?? 0) + 1;\n const height = Number.isFinite(dataH) ? dataH : fontSize * lineHeight * lines;\n\n const opacity = readOpacityAttr(el, 'opacity');\n const node: SvgTextNode = {\n kind: 'text',\n x: ax - anchorOffset(textStyle, width),\n y: topY,\n width,\n height,\n text: plain,\n };\n // Only attach `runs` when at least one run carries non-default styling —\n // single-run plain text is cleaner without it. `runsToPlainText(runs)`\n // must equal `text` per kit invariants, so the array must match exactly.\n //\n // \"Any key but `text`\" rather than an enumeration of the styling keys:\n // `readTspanRun` sets a field only when it parsed one, so the two are\n // equivalent, and the enumerated form silently dropped every run whose\n // only styling was a key added later — which is exactly how `stroke`\n // arrived and vanished.\n const hasStyling = runs.some(\n (r) => Object.entries(r).some(([k, v]) => k !== 'text' && v !== undefined),\n );\n if (hasStyling) node.runs = runs;\n if (el.getAttribute('data-weasel-wrap') === 'true') textStyle.wrap = true;\n if (Object.keys(textStyle).length > 0) node.style = textStyle;\n // `!== undefined`, not `!= null`: `null` is the document saying `fill=\"none\"`.\n if (textPaint.fill !== undefined) node.fill = textPaint.fill;\n if (textPaint.stroke != null) node.stroke = textPaint.stroke;\n if (opacity != null) node.opacity = opacity;\n // Try to extract the element-local transform as a pure rotation about\n // the text box's center. When it doesn't decompose cleanly but contains\n // a rotational component, warn — the legacy code path baked the matrix\n // into the anchor; here we drop it so the warning is mandatory.\n if (!isIdentity(localTransform)) {\n const worldLocal = rebaseTransform(ctm, localTransform);\n const cx = node.x + node.width / 2;\n const cy = node.y + node.height / 2;\n const angle = worldLocal && decomposeRotation(worldLocal, cx, cy);\n if (!worldLocal) {\n onWarn('<text> transform sits under a singular parent transform; dropped');\n } else if (angle != null) {\n node.rotation = angle;\n } else {\n const rotComp = rotationComponent(worldLocal);\n if (Math.abs(rotComp) > 1e-4) {\n onWarn(`<text> transform has a rotational component that can't be cleanly stored as rotation; dropped (may not round-trip identically)`);\n }\n }\n }\n return node;\n}\n\nfunction readTspanRun(\n el: Element,\n gradients: GradientTable,\n style: StyleContext,\n onWarn: (m: string) => void,\n): StyledRun {\n const text = el.textContent ?? '';\n const run: StyledRun = { text };\n const fw = ownProp(el, 'font-weight');\n if (fw === 'bold' || fw === '700' || fw === 'bolder') run.bold = true;\n const fs = ownProp(el, 'font-style');\n if (fs === 'italic' || fs === 'oblique') run.italic = true;\n const ff = ownProp(el, 'font-family');\n if (ff) run.fontFamily = ff;\n const sz = ownProp(el, 'font-size');\n if (sz != null) {\n const size = parseRunFontSize(sz, onWarn);\n if (size.fontSize != null) run.fontSize = size.fontSize;\n if (size.fontScale != null) run.fontScale = size.fontScale;\n }\n const ls = ownProp(el, 'letter-spacing');\n if (ls != null) {\n const n = parseLetterSpacing(ls, onWarn);\n if (n != null) run.letterSpacing = n;\n }\n const bs = ownProp(el, 'baseline-shift');\n if (bs != null) {\n const shift = parseBaselineShift(bs, onWarn);\n if (shift.script != null) run.script = shift.script;\n if (shift.baselineShift != null) run.baselineShift = shift.baselineShift;\n }\n const decoration = parseTextDecoration(ownProp(el, 'text-decoration'));\n if (decoration.underline) run.underline = true;\n if (decoration.strikethrough) run.strikethrough = true;\n if (decoration.overline) run.overline = true;\n const tspanStyle = deriveStyle(style, el);\n const fillAttr = resolveCurrentColor(ownProp(el, 'fill'), tspanStyle);\n if (fillAttr) {\n const parsed = parsePaintAttr(fillAttr);\n if (parsed?.kind === 'solid') {\n run.fill = { fill: 'solid', color: parsed.color };\n } else if (parsed?.kind === 'ref') {\n const paint = gradients.get(parsed.id);\n if (paint) run.fill = paint;\n }\n }\n // Own attributes only — see `ownStrokeStyle`.\n const stroke = coreStroke(readStroke(ownStrokeStyle(el), gradients, onWarn, isNonScalingStroke(el)));\n if (stroke) run.stroke = stroke;\n return run;\n}\n\nfunction readTextStyle(\n style: StyleContext,\n onWarn: (m: string) => void,\n): TextStyle {\n const out: TextStyle = {};\n const sz = style['font-size'];\n if (sz != null) {\n const n = parseFloat(sz);\n if (Number.isFinite(n)) out.fontSize = n;\n }\n const ff = style['font-family'];\n if (ff) out.fontFamily = ff;\n const fw = style['font-weight'];\n if (fw != null) {\n const n = parseFloat(fw);\n out.fontWeight = Number.isFinite(n) ? n : fw;\n }\n const fs = style['font-style'];\n if (fs === 'italic' || fs === 'normal') out.fontStyle = fs;\n if (style['direction'] === 'rtl') out.direction = 'rtl';\n // Read back as an absolute edge against the direction just parsed: SVG has\n // one relative pair where this model has a relative pair and an absolute\n // one, so the spelling cannot survive the trip — the rendered edge does.\n // SVG's initial `text-anchor` is `start`, which under `rtl` is the right\n // edge — while this model's default `align` is `left`. The two agree under\n // `ltr` and only there, so an absent anchor has to be written down when the\n // direction is what makes them disagree.\n const ltr = out.direction !== 'rtl';\n const anchor = style['text-anchor'] ?? (ltr ? undefined : 'start');\n if (anchor === 'start') out.align = ltr ? 'left' : 'right';\n else if (anchor === 'middle') out.align = 'center';\n else if (anchor === 'end') out.align = ltr ? 'right' : 'left';\n const ls = style['letter-spacing'];\n if (ls != null) {\n const n = parseLetterSpacing(ls, onWarn);\n if (n != null) out.letterSpacing = n;\n }\n const decoration = parseTextDecoration(style['text-decoration'] ?? null);\n if (decoration.underline) out.underline = true;\n if (decoration.strikethrough) out.strikethrough = true;\n if (decoration.overline) out.overline = true;\n // Note: `lineHeight` is no longer read from a `data-weasel-line-height`\n // attribute. WeaselDraw carries it through the generic namespace bag\n // as `meta.wd.attrs['line-height']`; svgInterop lifts it into / out of\n // `TextStyle.lineHeight` at the bridge layer. From weasel-svg's POV the\n // value is just an opaque string in `meta`.\n // Edit-overlay-only chrome (`caretColor`, `selectionBackground`,\n // `selectionColor`) is intentionally not persisted — those are UI state,\n // not document content.\n return out;\n}\n\n/** Read a `<text>` element's glyph paint — the node's own fill and stroke,\n * which are not typography and do not live in its `TextStyle`. */\nfunction readTextPaint(\n style: StyleContext,\n gradients: GradientTable,\n onWarn: (m: string) => void,\n nonScalingStroke = false,\n): TextPaint {\n const out: TextPaint = {};\n const fillRaw = resolveCurrentColor(style['fill'] ?? null, style);\n if (fillRaw) {\n const parsed = parsePaintAttr(fillRaw);\n if (parsed?.kind === 'solid') {\n out.fill = { fill: 'solid', color: parsed.color } as FillStyle;\n } else if (parsed?.kind === 'ref') {\n const paint = gradients.get(parsed.id);\n if (paint) out.fill = paint;\n } else if (parsed?.kind === 'none') {\n out.fill = null;\n }\n }\n // Text strokes used to be dropped here with a warning: an SDF glyph is a\n // sampled field, with no geometry to stroke. The outline tier gave large\n // text real contours, so a stroke is now a paint like any other — and one\n // that stays in the document even at sizes that render it unstroked.\n const stroke = coreStroke(readStroke(style, gradients, onWarn, nonScalingStroke));\n if (stroke) out.stroke = stroke;\n return out;\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, 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';\nimport { anchorOffset } from './textAnchor';\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 | null | 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, unpainted, or zero-width emits nothing at all: unstroked text should\n * not carry a `stroke` attribute, and SVG's own default (`none`) already says\n * so.\n */\n/**\n * `stroke-width`, plus `vector-effect` when the width is in screen pixels.\n *\n * A `{ px }` width means \"this thickness once rendered, whatever the view is\n * doing\", which is exactly what `non-scaling-stroke` says — so the number goes\n * out unresolved and the attribute carries the unit. There is no accumulated\n * transform scale here to resolve it against, and picking one would bake a\n * single zoom level into the document.\n */\nfunction strokeWidthAttrs(width: number | { px: number }): string[] {\n if (typeof width === 'number') return [`stroke-width=\"${trimNumber(width)}\"`];\n return [`stroke-width=\"${trimNumber(width.px)}\"`, 'vector-effect=\"non-scaling-stroke\"'];\n}\n\nfunction coreStrokeAttrs(stroke: Stroke | undefined, registry: PaintServerRegistry): string[] {\n const paint = stroke?.paint;\n if (!stroke || !paint) return [];\n const width = stroke.width ?? 1;\n if (!((typeof width === 'object' ? width.px : width) > 0)) return [];\n const attrs: string[] = [];\n if ('color' in paint) {\n attrs.push(`stroke=\"${paint.color}\"`);\n if (paint.opacity != null && paint.opacity !== 1) {\n attrs.push(`stroke-opacity=\"${trimNumber(paint.opacity)}\"`);\n }\n } else {\n attrs.push(`stroke=\"url(#${registry.register(paint)})\"`);\n }\n attrs.push(...strokeWidthAttrs(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(...strokeWidthAttrs(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. `x` is the `text-anchor` point, per the SVG spec:\n * the box's left edge, center or right edge as its alignment resolves. Uses\n * `dominant-baseline=\"text-before-edge\"` so `y` matches weasel's top-of-box\n * pose; stashes the explicit width/height (which native SVG text doesn't\n * model) in `data-weasel-*` attributes so they round-trip through the parser\n * losslessly.\n */\nfunction textXml(node: SvgTextNode, registry: PaintServerRegistry, namespaces: Record<string, string>): string {\n const attrs: string[] = [\n `x=\"${trimNumber(node.x + anchorOffset(node.style, node.width))}\"`,\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 // SVG text never wraps, so this is for weasel's own reader, beside the box\n // width it wraps at.\n if (style?.wrap) attrs.push('data-weasel-wrap=\"true\"');\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 === null) {\n attrs.push('fill=\"none\"');\n } else 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, '&amp;').replace(/\"/g, '&quot;').replace(/</g, '&lt;');\n}\n\nfunction escapeText(s: string): string {\n return s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\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","/**\n * The `unpack` half of the kit SVG handler (`svgHandler.ts`): parse an SVG\n * file into **native scene nodes** — path/text leaves under containers that\n * mirror the source `<g>` structure — instead of the default single\n * embedded-image node. Opted into via\n * `<SceneCanvas ingestion={{ svg: { unpack: unpackSvgFiles } }}>`.\n *\n * Leaf data targets the kit's built-in painters (`NodeShape.ts`): paths as\n * `{ path, fill?, stroke? }` (the `kit:path` contract), text\n * as `{ text, style?, runs?, fill?, stroke? }` (`kit:text`). Poses are absolute AABBs; the\n * renderer's `pathInPoseFrame` rebases stored geometry into the pose box,\n * so placement and fit-clamping operate on poses alone and never rewrite\n * path coordinates.\n *\n * Placement mirrors the image handler: the file's union AABB is fit-clamped\n * to 90% of the visible viewport and centered on the drop point (or the\n * viewport center), with multi-file batches cascading by a fixed offset.\n * Text takes the clamp through a scaled `fontSize` as well as its pose,\n * since glyph size is not derived from the pose the way path geometry is.\n * Multi-root files are wrapped in one synthesized container so a dropped\n * file arrives as a single selectable unit; a single-root file inserts\n * as-is. Each file commits as one `applyOps` batch, so the whole import is\n * a single undo step.\n *\n */\nimport { parseSvg } from './parse';\nimport type { SvgNode, SvgPaint, SvgStroke } from './types';\nimport {\n boundsOfPath,\n createInsertOp,\n dwarn,\n fillToBoundsFrame,\n resolveTextStyle,\n solid,\n type FillStyle,\n type IngestCtx,\n type Op,\n type Stroke,\n type StyledRun,\n type TextStyle,\n} from '@weasel-js/core';\n\nconst CASCADE_OFFSET_PX = 24;\nconst VIEWPORT_FIT = 0.9;\n\n/** Axis-aligned box, in the coordinate space of the SVG being unpacked. Used\n * for the bounds a draft occupies before it becomes a scene node. */\nexport interface SvgDraftBounds {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\ntype DraftPose = SvgDraftBounds & { rotation?: number };\n\n/**\n * One node the unpack wants the scene to materialize, in parent-before-child\n * order (a draft's `parentId` always names an earlier draft, or `null` for\n * roots). Leaf `data` is kit-painter-native (see module doc).\n */\nexport type SvgSceneDraft =\n | { kind: 'container'; id: string; parentId: string | null; pose: DraftPose }\n | { kind: 'leaf'; id: string; parentId: string | null; pose: DraftPose; data: Record<string, unknown> };\n\n/** `File.text()` via FileReader — same engine-compat choice as the image\n * handler's `readAsDataURL` (jsdom ships `FileReader` but not `Blob.text`). */\nfunction readFileText(file: File): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => resolve(String(reader.result ?? ''));\n reader.onerror = () => reject(reader.error);\n reader.readAsText(file);\n });\n}\n\n/** Mint a fresh node id. Mirrors the scene's default `n{counter}-{random}`\n * scheme (kept module-private by `core/scene/scene.ts`) — same approach as\n * `groupAction` / `cloneAction`. */\nlet svgIdCounter = 0;\nfunction freshSvgNodeId(): string {\n return `n${(svgIdCounter++).toString(36)}-${Math.random().toString(36).slice(2, 8)}`;\n}\n\n/** Lower an `SvgPaint` onto the `kit:path` painter's `data.fill` — a\n * `FillStyle`, or `null` for SVG's `fill=\"none\"` (the painter skips the\n * fill rather than falling back to its default).\n *\n * A gradient rides through as the `FillStyle` it already is, normalized to\n * the leaf's own box: `objectBoundingBox` gradients already are, and a\n * `userSpaceOnUse` one is rebased so it survives the fit-clamp and the\n * drop-point placement that move the geometry out from under it. */\nfunction fillFromPaint(\n paint: SvgPaint | undefined,\n box: SvgDraftBounds,\n): FillStyle | null | undefined {\n if (!paint) return undefined;\n if (paint.kind === 'none') return null;\n if (paint.kind === 'solid') return solid(paint.color);\n const g = paint.paint;\n const units = 'units' in g ? g.units : undefined;\n return units === 'world' ? fillToBoundsFrame(g, box) : g;\n}\n\n/** Lower an `SvgStroke` onto the leaf's `data.stroke`.\n *\n * Everything the SVG carried — paint, width, cap, join, dash, miter limit,\n * opacity — lands on the one `Stroke` `data.stroke` takes. The paint is\n * normalized to the leaf's own box the same way a fill is, so a\n * `userSpaceOnUse` gradient survives the fit-clamp and the drop-point\n * placement. */\nexport function strokeDataFromSvg(\n stroke: SvgStroke | undefined,\n box: SvgDraftBounds,\n): Stroke | undefined {\n if (!stroke || stroke.paint.kind === 'none') return undefined;\n const paint = fillFromPaint(stroke.paint, box);\n if (paint === undefined || paint === null) return undefined;\n return {\n paint: stroke.opacity !== undefined ? { ...paint, opacity: stroke.opacity } : paint,\n width: stroke.width,\n ...(stroke.cap !== undefined ? { cap: stroke.cap } : {}),\n ...(stroke.join !== undefined ? { join: stroke.join } : {}),\n ...(stroke.dash !== undefined ? { dash: stroke.dash } : {}),\n ...(stroke.miterLimit !== undefined ? { miterLimit: stroke.miterLimit } : {}),\n ...(stroke.markerStart !== undefined ? { markerStart: stroke.markerStart } : {}),\n ...(stroke.markerMid !== undefined ? { markerMid: stroke.markerMid } : {}),\n ...(stroke.markerEnd !== undefined ? { markerEnd: stroke.markerEnd } : {}),\n };\n}\n\n/** A text node's paint arrives already lowered to a kit `FillStyle`, not as\n * the `SvgPaint` a path carries, so it skips `fillFromPaint` — but a\n * `userSpaceOnUse` gradient still needs the same rebase onto the leaf's own\n * box, or it survives neither the fit-clamp nor the drop-point placement. */\nfunction fillInBoxFrame(fill: FillStyle, box: SvgDraftBounds): FillStyle {\n const units = 'units' in fill ? fill.units : undefined;\n return units === 'world' ? fillToBoundsFrame(fill, box) : fill;\n}\n\n/** The same rebase for a run's own overrides, which `<tspan fill=\"url(#g)\">`\n * puts on the run rather than on the node. */\nfunction runInBoxFrame(run: StyledRun, box: SvgDraftBounds): StyledRun {\n const fill = run.fill ? fillInBoxFrame(run.fill, box) : run.fill;\n const stroke = run.stroke ? strokeInBoxFrame(run.stroke, box) : run.stroke;\n if (fill === run.fill && stroke === run.stroke) return run;\n return { ...run, ...(fill ? { fill } : {}), ...(stroke ? { stroke } : {}) };\n}\n\n/** The same rebase for a `Stroke`'s paint. A stroke with no paint of its own\n * passes through — there is nothing to rebase. */\nfunction strokeInBoxFrame(stroke: Stroke, box: SvgDraftBounds): Stroke {\n if (!stroke.paint) return stroke;\n const paint = fillInBoxFrame(stroke.paint, box);\n return paint === stroke.paint ? stroke : { ...stroke, paint };\n}\n\n\n/**\n * Walk an `SvgNode[]` tree and emit a flat, parent-before-child list of\n * {@link SvgSceneDraft}s. Each `<g>` becomes a container whose pose is the\n * union AABB of its descendants (the kit `group` action's convention);\n * path/text leaves carry kit-painter-native data. Empty groups are dropped.\n */\nexport function svgNodesToKitDrafts(\n nodes: readonly SvgNode[],\n nextId: () => string,\n): SvgSceneDraft[] {\n const drafts: SvgSceneDraft[] = [];\n\n // Returns the union AABB of the leaves under `n` so a parent container can\n // compose its own pose; null for empty groups.\n const visit = (n: SvgNode, parentId: string | null): SvgDraftBounds | null => {\n if (n.kind === 'group') {\n const draft: Extract<SvgSceneDraft, { kind: 'container' }> = {\n kind: 'container',\n id: nextId(),\n parentId,\n pose: { x: 0, y: 0, width: 0, height: 0 },\n };\n drafts.push(draft);\n let acc: SvgDraftBounds | null = null;\n for (const c of n.children) {\n const b = visit(c, draft.id);\n if (b) acc = acc ? unionRect(acc, b) : b;\n }\n if (!acc) {\n drafts.splice(drafts.indexOf(draft), 1);\n return null;\n }\n draft.pose = acc;\n return acc;\n }\n\n if (n.kind === 'text') {\n const pose: DraftPose = {\n x: n.x, y: n.y, width: n.width, height: n.height,\n };\n if (n.rotation) pose.rotation = n.rotation;\n const box: SvgDraftBounds = {\n x: pose.x, y: pose.y, width: pose.width, height: pose.height,\n };\n drafts.push({\n kind: 'leaf',\n id: nextId(),\n parentId,\n pose,\n data: {\n text: n.text,\n ...(n.style ? { style: n.style } : {}),\n ...(n.runs ? { runs: n.runs.map((r) => runInBoxFrame(r, box)) } : {}),\n // `!== undefined`, not a truthiness test: `null` is the document\n // saying `fill=\"none\"`, and absent takes the painter's default.\n ...(n.fill !== undefined\n ? { fill: n.fill === null ? null : fillInBoxFrame(n.fill, box) }\n : {}),\n ...(n.stroke !== undefined ? { stroke: strokeInBoxFrame(n.stroke, box) } : {}),\n },\n });\n return pose;\n }\n\n if (n.kind === 'image') {\n const pose: DraftPose = { x: n.x, y: n.y, width: n.width, height: n.height };\n if (n.rotation) pose.rotation = n.rotation;\n drafts.push({\n kind: 'leaf',\n id: nextId(),\n parentId,\n pose,\n data: {\n image: {\n src: n.href,\n ...(n.opacity != null ? { opacity: n.opacity } : {}),\n },\n },\n });\n return pose;\n }\n\n // Path leaf. Bounds come from the geometry; `pathInPoseFrame` rebases\n // the stored path onto whatever pose box placement settles on.\n const b = n.path.kind === 'rect'\n ? { x: n.path.x, y: n.path.y, width: n.path.width, height: n.path.height }\n : boundsOfPath(n.path);\n const pose: DraftPose = { x: b.x, y: b.y, width: b.width, height: b.height };\n if (n.rotation) pose.rotation = n.rotation;\n const fill = fillFromPaint(n.fill, b);\n const strokeFromSvg = strokeDataFromSvg(n.stroke, b);\n drafts.push({\n kind: 'leaf',\n id: nextId(),\n parentId,\n pose,\n data: {\n path: n.path,\n ...(fill !== undefined ? { fill } : {}),\n ...(strokeFromSvg !== undefined ? { stroke: strokeFromSvg } : {}),\n },\n });\n return pose;\n };\n\n for (const n of nodes) visit(n, null);\n return drafts;\n}\n\n\n/**\n * Apply the fit-clamp scale to a text leaf's `fontSize`, which lives in data\n * rather than in the pose and so is untouched by `place`. Glyph size is not\n * derived from the pose box the way a path's geometry is (`pathInPoseFrame`\n * rebases that), so a shrunk file would otherwise arrive with its text at\n * source size, overflowing every box around it.\n *\n * Non-text data passes through, as does an unscaled import.\n */\nfunction scaleTextData(\n data: Record<string, unknown>,\n scale: number,\n): Record<string, unknown> {\n if (scale === 1 || typeof data.text !== 'string') return data;\n const style = (data.style ?? {}) as TextStyle;\n // A run's own `fontSize` is absolute and overrides the node's, so it needs\n // the same scale. `fontScale` is relative and rides the node's for free.\n const runs = data.runs as StyledRun[] | undefined;\n return {\n ...data,\n ...(runs\n ? {\n runs: runs.map((r) => (r.fontSize !== undefined\n ? { ...r, fontSize: r.fontSize * scale }\n : r)),\n }\n : {}),\n style: { ...style, fontSize: resolveTextStyle(style).fontSize * scale },\n };\n}\n\nfunction unionRect(a: SvgDraftBounds, b: SvgDraftBounds): SvgDraftBounds {\n const minX = Math.min(a.x, b.x);\n const minY = Math.min(a.y, b.y);\n const maxX = Math.max(a.x + a.width, b.x + b.width);\n const maxY = Math.max(a.y + a.height, b.y + b.height);\n return { x: minX, y: minY, width: maxX - minX, height: maxY - minY };\n}\n\n/**\n * Parse each file and insert its node tree — one undoable `applyOps` batch\n * per file. See the module doc for placement and wrapping policy. A file\n * that fails to parse (or parses to nothing) is skipped with a\n * `console.warn`; the rest proceed.\n */\nexport async function unpackSvgFiles(files: File[], ctx: IngestCtx): Promise<void> {\n const layer = ((ctx.scene.layers[0]?.id as string | undefined) ?? 'default');\n let index = 0;\n for (const file of files) {\n try {\n const text = await readFileText(file);\n const parsed = parseSvg(text);\n for (const w of parsed.warnings) dwarn('ingest', `svg \"${file.name}\":`, w);\n let drafts = svgNodesToKitDrafts(parsed.nodes, freshSvgNodeId);\n if (drafts.length === 0) {\n console.warn(`weasel ingest: svg \"${file.name}\" parsed to no drawable nodes`);\n continue;\n }\n\n // Wrap multi-root files in one synthesized container so the dropped\n // file arrives as a single selectable unit.\n const roots = drafts.filter((d) => d.parentId === null);\n if (roots.length > 1) {\n const wrapperId = freshSvgNodeId();\n const union = roots.map((d) => d.pose).reduce(unionRect);\n drafts = [\n { kind: 'container', id: wrapperId, parentId: null, pose: union },\n ...drafts.map((d) => (d.parentId === null ? { ...d, parentId: wrapperId } : d)),\n ];\n }\n\n // Fit-clamp + center, mirroring the image handler. Pose-only: the\n // painter rebases stored geometry into the pose box.\n const union = drafts\n .filter((d) => d.parentId === null)\n .map((d) => d.pose)\n .reduce(unionRect);\n const view = ctx.viewportWorldRect();\n const scale = Math.min(\n 1,\n union.width > 0 ? (view.width * VIEWPORT_FIT) / union.width : 1,\n union.height > 0 ? (view.height * VIEWPORT_FIT) / union.height : 1,\n );\n const target = ctx.point ?? {\n x: view.x + view.width / 2,\n y: view.y + view.height / 2,\n };\n const offset = index * CASCADE_OFFSET_PX;\n const cx = union.x + union.width / 2;\n const cy = union.y + union.height / 2;\n const place = (p: DraftPose): DraftPose => ({\n ...p,\n x: target.x + (p.x - cx) * scale + offset,\n y: target.y + (p.y - cy) * scale + offset,\n width: p.width * scale,\n height: p.height * scale,\n });\n\n const ops: Op[] = drafts.map((d) =>\n createInsertOp({\n node: {\n id: d.id,\n kind: d.kind,\n layer,\n pose: place(d.pose),\n data: d.kind === 'leaf' ? scaleTextData(d.data, scale) : {},\n parent: d.parentId,\n } as unknown as { id: string },\n label: 'Insert SVG',\n }),\n );\n ctx.applyOps(ops, 'Insert SVG');\n index++;\n } catch (err) {\n console.warn(`weasel ingest: svg \"${file.name}\" failed to parse`, err);\n }\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/types.ts","../src/transform.ts","../src/shapes.ts","../src/textAnchor.ts","../src/color.ts","../src/elements.ts","../src/patterns.ts","../src/path-serializer.ts","../src/gradients.ts","../src/cascade.ts","../src/parse.ts","../src/serialize.ts","../src/unpack.ts"],"names":["PATH_M","PATH_L","PATH_C","PATH_Q","PATH_Z","meta","opacity","num","out","a","XLINK_NS","getMarker","escapeAttr","localName","resolveScreenLength","boundsOfPath","solid","b","pose","resolveTextStyle","union"],"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 { identity, type Mat3 } from '@weasel-js/geom';\nimport type {\n Path, FillStyle, MarkerEntry, ScreenLength, Stroke, StrokeAlign, StyledRun, TextStyle,\n TextVerticalAlign,\n} 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 SVG's `matrix(a b c d e f)` order, mapping\n * `[x', y'] = [a*x + c*y + e, b*x + d*y + f]`.\n *\n * The same order the kernel's affine tier uses, so this is that type under\n * the name the SVG spec gives it — not a parallel one. An `SvgGroupNode`'s\n * transform and a geom `Mat3` are interchangeable without a conversion.\n */\nexport type Matrix = Mat3;\n\n/** Re-exported so this package's own stroke widths are namable beside the\n * rest of the SVG model. It is core's type; there is no second one. */\nexport type { ScreenLength };\n\n/** Identity matrix — useful as a default in tests / constructors. */\nexport const IDENTITY_MATRIX: Matrix = identity();\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 /** World units, or `{ px }` for a width that holds its rendered thickness\n * however the document is scaled — SVG's `vector-effect=\"non-scaling-stroke\"`.\n * Literally the kit's own unit, not a second spelling of it. */\n width: ScreenLength;\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 /** The kit stroke's `align`. SVG has no stroke alignment, so the serializer\n * writes the stroke centered and says so through `onWarn`; the parser\n * never sets it. */\n align?: StrokeAlign;\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 /** Clips the group's contents. Serializes to a `<clipPath>` def plus\n * `clip-path=\"url(#id)\"`, and lives in the same space as `children` —\n * SVG applies the group's own `transform` to the clip as well.\n * A `<clipPath>` of more than one shape parses back as no clip: SVG\n * unions them and a `Path` holds one outline. */\n clip?: Path;\n opacity?: number;\n /** Opaque per-element bag for declared namespaces. See `NamespaceMeta`. */\n meta?: NamespaceMeta;\n}\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 the width the kit's text layout\n * measures — an em-based estimate when no registered font can — and\n * `height = fontSize * lineHeight * (lineCount || 1)`.\n *\n * `x` here is always the box's left edge. In the SVG it is the\n * `text-anchor` point, and the parser and serializer convert between them.\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 /** Where the laid-out text sits inside the box — `kit:text`'s\n * `data.verticalAlign`. SVG text has no box to align in, so this rides in\n * `data-weasel-vertical-align` and other readers draw the text top-aligned. */\n verticalAlign?: TextVerticalAlign;\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 * `null` is SVG's `fill=\"none\"`: outline-only text, painted by its stroke\n * alone. Absent takes the default black.\n */\n fill?: FillStyle | null;\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 *\n * With a `source` rect or a flip, the element is written as a `<g\n * data-weasel-image>` holding a nested `<svg>` viewport at the box, whose\n * `viewBox` is the source window over a unit-square `<image>` — plain SVG 1.1,\n * which any reader crops and mirrors the same way, and which `parseSvg` reads\n * back as one image node.\n */\nexport interface SvgImageNode {\n kind: 'image';\n href: string;\n x: number;\n y: number;\n width: number;\n height: number;\n /** The part of the bitmap drawn into the box, as fractions of the bitmap's\n * width and height from its top-left. Omitted draws the whole bitmap.\n * Fractions rather than bitmap pixels because this package never decodes\n * the image, so it cannot know its size. */\n source?: { x: number; y: number; width: number; height: number };\n /** Mirror the drawn region within the box, as `ImageDrawCommand` does. The\n * box does not move. */\n flipX?: boolean;\n flipY?: boolean;\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 * An entry for each document `<marker>` a stroke references under a key the\n * marker registry does not know, keyed as the strokes in `nodes` now name\n * them. Nothing draws them until they are registered (`registerMarker`),\n * which `unpackSvgFiles` does.\n */\n markers?: MarkerEntry[];\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 what the document cannot carry the way weasel draws it: a\n * paint SVG cannot express (a pattern carrying a `TextureHandle` instead of\n * a `TilePatternSpec`), a stroke aligned off its edge, text that wraps or\n * sits lower than the top of its box. Each message is said once per call.\n * 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 { invert, multiply } from '@weasel-js/geom';\nimport type { Matrix } from './types';\nimport { IDENTITY_MATRIX } from './types';\n\n/** Compose two 2x3 affines, `a` then `b` applied to a column vector. The\n * kernel's own composition — `Matrix` is `Mat3`, so nothing converts. */\nexport { multiply };\n\n/** Apply a 2x3 affine to a 2D point. The `{x, y}` spelling the rest of this\n * package works in; geom's `applyToPoint` returns the same numbers as a\n * tuple. */\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/**\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.\n *\n * `null` when `@weasel-js/geom`'s `invert` finds `ctm` singular: the geometry\n * has collapsed through it, and the local transform has no frame to live in.\n */\nexport function rebaseTransform(ctm: Matrix, local: Matrix): Matrix | null {\n const inv = invert(ctm);\n if (!inv) return null;\n return multiply(multiply(ctm, local), inv);\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 * Lower SVG primitive elements (`<rect>`, `<circle>`, `<ellipse>`,\n * `<line>`, `<polyline>`, `<polygon>`) to weasel `Path` values. Each\n * helper applies an optional 2x3 affine matrix to the resulting geometry\n * so the caller can collapse `<g transform=\"...\">` onto leaves.\n *\n * Ellipses and rounded rects use the standard 4-segment cubic Bezier\n * approximation with control offset `k = 4*(sqrt(2)-1)/3 ≈ 0.5523`.\n */\n\nimport {\n PATH_C, PATH_L, PATH_M, PATH_Q, PATH_Z,\n PathBuilder,\n type Path,\n type PolygonPath,\n type RectPath,\n} from '@weasel-js/core';\nimport type { Matrix } from './types';\nimport { IDENTITY_MATRIX } from './types';\nimport { applyMatrix, isIdentity } from './transform';\n\n/** Magic constant: cubic Bezier control offset for a quarter-circle of radius 1. */\nconst KAPPA = (4 * (Math.sqrt(2) - 1)) / 3;\n\n/** True when `m` represents a pure axis-aligned scale + translate. */\nfunction isAxisAlignedScale(m: Matrix, eps = 1e-9): boolean {\n return Math.abs(m[1]) < eps && Math.abs(m[2]) < eps;\n}\n\n/**\n * Apply a 2x3 affine to a `Path`. RectPaths whose matrix is identity or\n * an axis-aligned scale+translate stay as `RectPath`; anything else (any\n * rotation/skew, or any PolygonPath input) is promoted to a `PolygonPath`\n * via a coords-level remap.\n */\nexport function transformPath(path: Path, m: Matrix): Path {\n if (isIdentity(m)) return path;\n if (path.kind === 'rect') {\n if (isAxisAlignedScale(m)) {\n const a = m[0], d = m[3], e = m[4], f = m[5];\n let x = path.x * a + e;\n let y = path.y * d + f;\n let w = path.width * a;\n let h = path.height * d;\n if (w < 0) { x += w; w = -w; }\n if (h < 0) { y += h; h = -h; }\n return { kind: 'rect', x, y, width: w, height: h };\n }\n // Promote to polygon, then transform.\n return transformPath(rectToPolygon(path), m);\n }\n // PolygonPath: remap every coord pair. Step counts are command-dependent\n // and all the supported commands store coord pairs, so a flat stride-2\n // walk is correct.\n const xs = path.coords;\n const out = new Float32Array(xs.length);\n for (let i = 0; i < xs.length; i += 2) {\n const p = applyMatrix(m, xs[i], xs[i + 1]);\n out[i] = p.x;\n out[i + 1] = p.y;\n }\n return {\n kind: 'polygon',\n commands: new Uint8Array(path.commands),\n coords: out,\n fillRule: path.fillRule,\n };\n}\n\nfunction rectToPolygon(r: RectPath): PolygonPath {\n const b = new PathBuilder();\n b.moveTo(r.x, r.y);\n b.lineTo(r.x + r.width, r.y);\n b.lineTo(r.x + r.width, r.y + r.height);\n b.lineTo(r.x, r.y + r.height);\n b.close();\n return b.build();\n}\n\n/**\n * `<rect x y width height rx ry>` → Path. Returns a `RectPath` when there\n * are no corner radii (and matrix is benign); otherwise lowers to a\n * polygon with cubic-curve corners.\n */\nexport function rectElementToPath(\n x: number, y: number, width: number, height: number,\n rx: number, ry: number,\n m: Matrix = IDENTITY_MATRIX,\n): Path {\n if (rx <= 0 && ry <= 0) {\n return transformPath({ kind: 'rect', x, y, width, height }, m);\n }\n const r = Math.min(Math.max(rx, ry), Math.min(width, height) / 2);\n const r2 = Math.min(rx > 0 ? rx : r, ry > 0 ? ry : r, Math.min(width, height) / 2);\n // For simplicity treat rx === ry === r2. Independent rx/ry can be\n // added later; weasel doesn't have a rounded-rect primitive anyway.\n const rad = r2;\n const k = KAPPA * rad;\n const x2 = x + width;\n const y2 = y + height;\n const b = new PathBuilder();\n b.moveTo(x + rad, y);\n b.lineTo(x2 - rad, y);\n b.curveTo(x2 - rad + k, y, x2, y + rad - k, x2, y + rad);\n b.lineTo(x2, y2 - rad);\n b.curveTo(x2, y2 - rad + k, x2 - rad + k, y2, x2 - rad, y2);\n b.lineTo(x + rad, y2);\n b.curveTo(x + rad - k, y2, x, y2 - rad + k, x, y2 - rad);\n b.lineTo(x, y + rad);\n b.curveTo(x, y + rad - k, x + rad - k, y, x + rad, y);\n b.close();\n return transformPath(b.build(), m);\n}\n\n/** `<ellipse cx cy rx ry>` → PolygonPath (4 cubic segments). */\nexport function ellipseToPath(\n cx: number, cy: number, rx: number, ry: number,\n m: Matrix = IDENTITY_MATRIX,\n): Path {\n const kx = KAPPA * rx;\n const ky = KAPPA * ry;\n const b = new PathBuilder();\n b.moveTo(cx + rx, cy);\n b.curveTo(cx + rx, cy + ky, cx + kx, cy + ry, cx, cy + ry);\n b.curveTo(cx - kx, cy + ry, cx - rx, cy + ky, cx - rx, cy);\n b.curveTo(cx - rx, cy - ky, cx - kx, cy - ry, cx, cy - ry);\n b.curveTo(cx + kx, cy - ry, cx + rx, cy - ky, cx + rx, cy);\n b.close();\n return transformPath(b.build(), m);\n}\n\n/** `<circle cx cy r>` → ellipse with rx === ry. */\nexport function circleToPath(\n cx: number, cy: number, r: number, m: Matrix = IDENTITY_MATRIX,\n): Path {\n return ellipseToPath(cx, cy, r, r, m);\n}\n\n/** `<line x1 y1 x2 y2>` → open 2-anchor polygon. */\nexport function lineToPath(\n x1: number, y1: number, x2: number, y2: number,\n m: Matrix = IDENTITY_MATRIX,\n): Path {\n const b = new PathBuilder();\n b.moveTo(x1, y1);\n b.lineTo(x2, y2);\n return transformPath(b.build(), m);\n}\n\n/** Parse SVG `points=\"x1,y1 x2,y2 ...\"` to a flat list. */\nexport function parsePoints(raw: string): { x: number; y: number }[] {\n const out: { x: number; y: number }[] = [];\n const nums = raw.match(/[-+]?(?:\\d*\\.\\d+|\\d+\\.?)(?:[eE][-+]?\\d+)?/g);\n if (!nums) return out;\n for (let i = 0; i + 1 < nums.length; i += 2) {\n out.push({ x: parseFloat(nums[i]), y: parseFloat(nums[i + 1]) });\n }\n return out;\n}\n\n/** `<polyline points=\"...\">` → open polygon. */\nexport function polylineToPath(\n points: readonly { x: number; y: number }[],\n m: Matrix = IDENTITY_MATRIX,\n): Path {\n if (points.length === 0) {\n return { kind: 'polygon', commands: new Uint8Array(), coords: new Float32Array(), fillRule: 'nonzero' };\n }\n const b = new PathBuilder();\n b.moveTo(points[0].x, points[0].y);\n for (let i = 1; i < points.length; i++) b.lineTo(points[i].x, points[i].y);\n return transformPath(b.build(), m);\n}\n\n/** `<polygon points=\"...\">` → closed polygon. */\nexport function polygonToPath(\n points: readonly { x: number; y: number }[],\n m: Matrix = IDENTITY_MATRIX,\n): Path {\n if (points.length === 0) {\n return { kind: 'polygon', commands: new Uint8Array(), coords: new Float32Array(), fillRule: 'nonzero' };\n }\n const b = new PathBuilder();\n b.moveTo(points[0].x, points[0].y);\n for (let i = 1; i < points.length; i++) b.lineTo(points[i].x, points[i].y);\n b.close();\n return transformPath(b.build(), m);\n}\n\n// Re-export the path opcodes for any callers that want to introspect.\nexport { PATH_M, PATH_L, PATH_C, PATH_Q, PATH_Z };\n","import { resolveAlign, type TextStyle } from '@weasel-js/core';\n\n/**\n * Distance from a text box's left edge to its SVG anchor point: `x` on a\n * `<text>` is where `text-anchor` lands, which is the box's left edge, center\n * or right edge once `align` and `direction` resolve to an absolute edge.\n */\nexport function anchorOffset(style: TextStyle | undefined, width: number): number {\n const edge = resolveAlign(style?.align ?? 'left', style?.direction ?? 'ltr');\n return edge === 'center' ? width / 2 : edge === 'right' ? width : 0;\n}\n","/**\n * SVG color / paint parsing. Handles the SVG-specific paint surface — the\n * sentinel `none`, `url(#id)` paint-server references, and `currentColor` —\n * then delegates the actual color tokenization (hex, `rgb()`/`rgba()`,\n * `hsl()`, and the full CSS named-color table) to the kit's `parseColor`.\n * Output is normalized to `#rrggbb` plus a separate 0..1 alpha so the rest\n * of the pipeline doesn't have to know about the encoding variants.\n */\n\nimport { parseColor, rgbaToHex } from '@weasel-js/core';\n\n/** Result of parsing a `fill=` / `stroke=` attribute value. */\nexport type ParsedColor =\n | { kind: 'none' }\n | { kind: 'solid'; color: string; alpha: number }\n | { kind: 'ref'; id: string; fallback?: { color: string; alpha: number } };\n\n/**\n * Parse an SVG paint string. Returns `null` for inputs we don't recognize\n * (so the caller can emit a warning and fall back). `currentColor` resolves\n * to black here as a last-resort default; callers that participate in the\n * cascade (`readPaint`, `readTextStyle`, `readTspanRun`) pre-resolve\n * `currentColor` against the inherited `color` via `resolveCurrentColor`\n * before this function ever sees it.\n */\nexport function parsePaintAttr(raw: string | null | undefined): ParsedColor | null {\n if (raw == null) return null;\n const s = raw.trim();\n if (s === '') return null;\n if (s === 'none') return { kind: 'none' };\n if (s === 'currentColor' || s === 'currentcolor') {\n return { kind: 'solid', color: '#000000', alpha: 1 };\n }\n // url(#id) reference, optionally followed by the fallback paint SVG's own\n // grammar allows — what a renderer takes when it cannot resolve the\n // reference. A mesh gradient or any other paint outside this package's\n // vocabulary arrives that way.\n const urlMatch = /^url\\(\\s*#([^)\\s]+)\\s*\\)(.*)$/.exec(s);\n if (urlMatch) {\n const out: ParsedColor = { kind: 'ref', id: urlMatch[1] };\n const rest = urlMatch[2].trim();\n if (rest !== '' && rest !== 'none') {\n const fallback = parsePaintAttr(rest);\n if (fallback?.kind === 'solid') {\n (out as { fallback?: { color: string; alpha: number } }).fallback =\n { color: fallback.color, alpha: fallback.alpha };\n }\n }\n return out;\n }\n // Everything else — hex, rgb()/rgba(), hsl()/hsla(), and named colors —\n // goes through the kit's CSS parser. It throws on unrecognized input;\n // we translate that into the `null` the caller expects.\n try {\n const [r, g, b, a] = parseColor(s);\n // Split into the `#rrggbb` + 0..1 alpha contract the rest of the SVG\n // pipeline depends on. `rgbaToHex` of a 3-tuple always emits 6-char,\n // lowercase hex; the alpha is carried separately.\n return { kind: 'solid', color: rgbaToHex([r, g, b]), alpha: a };\n } catch {\n return null;\n }\n}\n","/**\n * Document-wide element index, keyed by `id`.\n *\n * Paint servers (`<linearGradient>`, `<radialGradient>`, `<pattern>`) are\n * referenced by id from anywhere in the document, and SVG places no\n * requirement on where they are *declared* — `<defs>` is a convention, not a\n * rule, and a gradient may also name another gradient it inherits from. Both\n * the gradient and the pattern collectors resolve those references against\n * this index.\n */\n\n/** Element-id → element, for one set of tag names. */\nexport type ElementTable = Map<string, Element>;\n\n/**\n * Index `root` and every descendant whose lowercased tag name is in `tags`\n * and that carries an `id`. First declaration of a duplicated id wins, which\n * is what a browser's `getElementById` does.\n */\nexport function collectElementsByTag(root: Element, tags: ReadonlySet<string>): ElementTable {\n const out: ElementTable = new Map();\n const consider = (el: Element): void => {\n if (!tags.has(el.tagName.toLowerCase())) return;\n const id = el.getAttribute('id');\n if (id && !out.has(id)) out.set(id, el);\n };\n consider(root);\n const all = root.getElementsByTagName('*');\n for (let i = 0; i < all.length; i++) consider(all[i]);\n return out;\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, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;');\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, MarkerPaint, Path } 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\n/**\n * The namespace weasel's own paint servers are written in, and the prefix they\n * are written under. A conic gradient has no SVG element to target — SVG has\n * `linearGradient` and `radialGradient` and nothing else — so it goes out as a\n * foreign-namespaced def that this package reads back and every other renderer\n * skips in favor of the paint fallback color beside the reference.\n *\n * A registered paint kind's own `toSvg` may use this prefix too: the root\n * declares it whenever any paint in the document lacks a native SVG form.\n */\nexport const WEASEL_NS = 'urn:weasel-js:svg';\nexport const WEASEL_NS_PREFIX = 'wzl';\n\n/** `true` when SVG has a paint server for this kind, so the reference needs no\n * fallback color and the root needs no foreign namespace. */\nfunction hasNativeSvgForm(paint: FillStyle): boolean {\n const kind = paint.fill ?? 'solid';\n return kind === 'solid' || kind === 'linear-gradient' || kind === 'radial-gradient' || kind === 'pattern';\n}\n\n/**\n * The spaces `interpolate` can name, as SVG spells them. SVG's own\n * `color-interpolation` carries `sRGB` and `linearRGB` only, so anything\n * perceptual goes out as a namespaced attribute a foreign renderer ignores —\n * which leaves it interpolating in sRGB. That is a shifted midpoint rather\n * than a lost paint, so these gradients keep their native element and take no\n * fallback color.\n */\nconst INTERPOLATE_SPACES = new Set(['rgb', 'oklab', 'oklch']);\n\n/** The `wzl:interpolate` attribute a gradient needs, or `''` for the sRGB\n * default every other renderer already assumes. */\nfunction interpolateAttr(space: string | undefined): string {\n if (!space || space === 'rgb') return '';\n return ` ${WEASEL_NS_PREFIX}:interpolate=\"${space}\"`;\n}\n\n/** `interpolate` off a gradient element, or `undefined` — for the field's\n * absence and for a space this package does not model alike. */\nfunction readInterpolate(el: Element, elements: ElementTable): 'oklab' | 'oklch' | undefined {\n const raw = inheritedAttr(el, elements, `${WEASEL_NS_PREFIX}:interpolate`)\n ?? el.getAttributeNS(WEASEL_NS, 'interpolate');\n if (raw === 'oklab' || raw === 'oklch') return raw;\n return undefined;\n}\n\n/** Whether any gradient in the document names a space SVG cannot, so the root\n * has to declare the namespace the attribute is written in. */\nfunction usesInterpolateAttr(paint: FillStyle): boolean {\n const space = (paint as { interpolate?: string }).interpolate;\n return space != null && space !== 'rgb' && INTERPOLATE_SPACES.has(space);\n}\n\n/** The local name of a tag, prefix stripped. */\nfunction localName(tag: string): string {\n const i = tag.indexOf(':');\n return (i < 0 ? tag : tag.slice(i + 1)).toLowerCase();\n}\n\nconst GRADIENT_TAGS = new Set([\n 'lineargradient', 'radialgradient', 'conicgradient', `${WEASEL_NS_PREFIX}:conicgradient`,\n 'meshgradient', `${WEASEL_NS_PREFIX}:meshgradient`,\n]);\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 tag = localName(el.tagName);\n const paint = tag === 'lineargradient'\n ? readLinearGradient(el, elements, onWarn)\n : tag === 'conicgradient'\n ? readConicGradient(el, elements, onWarn)\n : tag === 'meshgradient'\n ? readMeshGradient(el, 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, `<marker>` and `<clipPath>` aside, a `<defs>` child is\n * something this package does not model (a `<use>` template, a `<filter>`).\n * 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) || GRADIENT_TAGS.has(localName(tag))) continue;\n if (tag === 'pattern' || tag === 'marker' || tag === 'clippath') 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 interpolate: readInterpolate(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 interpolate: readInterpolate(el, elements),\n };\n}\n\nfunction readConicGradient(\n el: Element, elements: ElementTable, onWarn?: (m: string) => void,\n): FillStyle | null {\n warnGradientTransform(el, elements, onWarn);\n return {\n fill: 'conic-gradient',\n center: {\n x: num(inheritedAttr(el, elements, 'cx'), 0.5),\n y: num(inheritedAttr(el, elements, 'cy'), 0.5),\n },\n angle: num(inheritedAttr(el, elements, 'angle'), 0),\n stops: inheritedStops(el, elements, onWarn),\n units: readGradientUnits(el, elements),\n interpolate: readInterpolate(el, elements),\n };\n}\n\n/**\n * A `<wzl:meshGradient>` back into the `mesh-gradient` paint core registers.\n *\n * Every patch carries all twelve (or sixteen) of its points, so nothing here\n * infers a shared edge — the trap that makes SVG's own abandoned\n * `<meshgradient>` hard to read correctly. A patch whose attributes do not\n * parse is dropped with a warning rather than guessed at: a mesh missing a\n * patch is visibly wrong, where a mesh holding an invented one is not.\n */\nfunction readMeshGradient(el: Element, onWarn?: (m: string) => void): FillStyle | null {\n const patches: { points: { x: number; y: number }[]; colors: string[] }[] = [];\n for (let i = 0; i < el.children.length; i++) {\n const child = el.children[i];\n if (localName(child.tagName) !== 'patch') continue;\n const points = (child.getAttribute('points') ?? '').trim().split(/\\s+/)\n .filter(Boolean)\n .map((pair) => {\n const [x, y] = pair.split(',').map(Number);\n return { x, y };\n });\n const colors = (child.getAttribute('colors') ?? '').trim().split(/\\s+/).filter(Boolean);\n const sane = (points.length === 12 || points.length === 16)\n && points.every((p) => Number.isFinite(p.x) && Number.isFinite(p.y))\n && colors.length === 4;\n if (!sane) {\n onWarn?.(`<${WEASEL_NS_PREFIX}:patch> with ${points.length} points and ${colors.length} colors — dropped`);\n continue;\n }\n patches.push({ points, colors });\n }\n if (patches.length === 0) return null;\n const space = el.getAttribute('interpolate') ?? el.getAttributeNS(WEASEL_NS, 'interpolate');\n return {\n fill: 'mesh-gradient',\n patches,\n units: el.getAttribute('gradientUnits') === 'objectBoundingBox' ? 'bounds' : 'world',\n ...(space === 'oklab' || space === 'oklch' ? { interpolate: space } : {}),\n } as unknown as FillStyle;\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 when the\n // registry knows it, so a synthetic id would come back as a stranger.\n private markerKeys: string[] = [];\n private markerKeySet = new Set<string>();\n\n // Clip paths, in first-use order. Identity, not value: two groups clipped by\n // equal outlines get a def each, which costs bytes and misleads nobody.\n private clips: Path[] = [];\n private clipIds = new Map<Path, 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 /**\n * The `fill` / `stroke` attribute value referencing this paint server: a\n * `url(#id)` reference, plus the fallback paint SVG's own grammar allows\n * after one for any kind SVG cannot express. A renderer that cannot resolve\n * the reference takes the fallback instead of dropping the fill, which is\n * the difference between a flat shape and a vanished one.\n */\n ref(paint: FillStyle): string {\n const id = this.register(paint);\n if (hasNativeSvgForm(paint)) return `url(#${id})`;\n return `url(#${id}) ${paintFallback(paint)}`;\n }\n\n /** Whether any registered paint serializes outside SVG's own vocabulary, so\n * the root has to declare {@link WEASEL_NS}. */\n usesPrivateNamespace(): boolean {\n return this.order.some((paint) => !hasNativeSvgForm(paint) || usesInterpolateAttr(paint));\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 /** Mint (or recall) the `<defs>` id for a clip outline. */\n clipId(path: Path): string {\n const existing = this.clipIds.get(path);\n if (existing) return existing;\n const id = `clip${this.clips.length}`;\n this.clipIds.set(path, id);\n this.clips.push(path);\n return id;\n }\n\n /** Emit `<defs>...</defs>` XML for every registered paint server, marker\n * and clip path. */\n toDefsXml(onWarn?: (m: string) => void): string {\n if (this.order.length === 0 && this.markerKeys.length === 0 && this.clips.length === 0) {\n return '';\n }\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, onWarn));\n }\n for (const path of this.clips) {\n parts.push(\n `<clipPath id=\"${this.clipIds.get(path)!}\">`\n + `<path d=\"${serializePathD(path)}\"/>`\n + '</clipPath>',\n );\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, onWarn?: (m: string) => void): string {\n const path = entry.path({ size: 1, stroke: { paint: { fill: 'solid', color: '#000' } } });\n const d = serializePathD(path);\n const fill = markerPaintAttrs('fill', entry.fill, id, onWarn);\n const outline = entry.outline\n ? ` ${markerPaintAttrs('stroke', entry.outline.paint, id, onWarn)} stroke-width=\"${trimNumber(entry.outline.width)}\"`\n + ' stroke-linecap=\"round\" stroke-linejoin=\"round\"'\n : '';\n // The kit turns every start marker around, which is what SVG 2 spells\n // `auto-start-reverse`; plain `auto` would point a start head into the line.\n const orient = typeof entry.orient === 'number'\n ? trimNumber((entry.orient * 180) / Math.PI)\n : 'auto-start-reverse';\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=\"${orient}\" overflow=\"visible\">` +\n `<path d=\"${d}\" ${fill}${outline}/></marker>`\n );\n}\n\n/** A marker paint as `fill` / `stroke` attributes. `'line'` is SVG 2's\n * `context-stroke`; a paint server has no `<defs>` slot from here, so it\n * falls back to the line's paint and says so. */\nfunction markerPaintAttrs(\n attr: 'fill' | 'stroke',\n paint: MarkerPaint | undefined,\n id: string,\n onWarn?: (m: string) => void,\n): string {\n if (paint === 'none') return `${attr}=\"none\"`;\n if (paint === undefined || paint === 'line') return `${attr}=\"context-stroke\"`;\n if ('color' in paint && (paint.fill === undefined || paint.fill === 'solid')) {\n return paint.opacity != null && paint.opacity !== 1\n ? `${attr}=\"${paint.color}\" ${attr}-opacity=\"${trimNumber(paint.opacity)}\"`\n : `${attr}=\"${paint.color}\"`;\n }\n onWarn?.(`marker \"${id}\" ${attr} is a paint server, which a <marker> def cannot reference here; written as the line's paint`);\n return `${attr}=\"context-stroke\"`;\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)}\"` +\n `${interpolateAttr(paint.interpolate)}>${stops}</linearGradient>`\n );\n }\n if (paint.fill === 'conic-gradient') {\n const stops = paint.stops.map(stopXml).join('');\n const P = WEASEL_NS_PREFIX;\n return (\n `<${P}:conicGradient id=\"${id}\" gradientUnits=\"${gradientUnitsAttr(paint.units)}\" ` +\n `cx=\"${trimNumber(paint.center.x)}\" cy=\"${trimNumber(paint.center.y)}\" ` +\n `angle=\"${trimNumber(paint.angle)}\"` +\n `${interpolateAttr(paint.interpolate)}>${stops}</${P}:conicGradient>`\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)}\"` +\n `${interpolateAttr(paint.interpolate)}>${stops}</radialGradient>`\n );\n }\n return '';\n}\n\n/**\n * The color a renderer that cannot resolve the reference should paint. `none`\n * when the paint has no single color to name — nothing painted is at least\n * honest, where an invented black is not.\n */\nfunction paintFallback(paint: FillStyle): string {\n const color = getPaintKind(paint.fill)?.colorOf(paint);\n if (!color) return 'none';\n // Whoever reads the fallback is by definition an older renderer, so the\n // packed alpha comes off rather than riding out as an 8-digit hex.\n const packed = /^#([0-9a-f]{6})[0-9a-f]{2}$/i.exec(color);\n return packed ? `#${packed[1].toLowerCase()}` : color;\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 * SVG presentation-attribute cascade.\n *\n * Most SVG paint/text properties inherit down the element tree. Rather than\n * re-walking the DOM parent chain per attribute at leaf-emit time, the parser\n * threads a resolved `StyleContext` down through the recursion (alongside the\n * transform matrix): at each element we fold the element's own attributes onto\n * the inherited cascade once, and leaves read resolved values directly.\n */\n\n/**\n * Raw resolved value of each inheritable presentation property in effect at a\n * point in the tree. An absent key means the property is unset all the way up,\n * and the consumer applies its own default (matching the pre-cascade\n * `readInheritedAttr` → null contract). Values are raw SVG strings; callers\n * parse them (color, number, keyword, …).\n */\nexport type StyleContext = Readonly<Record<string, string>>;\n\n/** The empty cascade — seeds the root. */\nexport const EMPTY_STYLE: StyleContext = {};\n\n/**\n * Inheritable presentation properties the leaf/text parsers consume. Extend\n * this list (and teach the consuming leaf to read the new key) to inherit a\n * new property — no per-attribute DOM walk required.\n */\nconst INHERITABLE = [\n 'fill', 'fill-opacity', 'fill-rule',\n 'stroke', 'stroke-width', 'stroke-opacity',\n 'stroke-linecap', 'stroke-linejoin', 'stroke-dasharray', 'stroke-miterlimit',\n 'marker-start', 'marker-mid', 'marker-end',\n 'color',\n 'font-size', 'font-family', 'font-weight', 'font-style', 'text-anchor',\n 'letter-spacing', 'text-decoration', 'direction',\n] as const;\n\n/**\n * Extract a single `style=\"prop:value\"` declaration. Returns the trimmed value\n * or null when absent. Regex scan — not a full CSS parser; no `!important`.\n */\nexport function readStyleProp(el: Element, prop: string): string | null {\n const style = el.getAttribute('style');\n if (!style) return null;\n const re = new RegExp(`(?:^|;)\\\\s*${prop}\\\\s*:\\\\s*([^;]+)`, 'i');\n const m = re.exec(style);\n if (!m) return null;\n return m[1].trim();\n}\n\n/**\n * Resolve an element's own value for a property: `style=\"\"` beats the\n * presentation attribute on the same element (SVG2 specificity).\n */\nexport function ownProp(el: Element, prop: string): string | null {\n return readStyleProp(el, prop) ?? el.getAttribute(prop);\n}\n\n/**\n * Fold an element's own presentation attributes onto the inherited cascade.\n * A property that is absent or literally `inherit` keeps the parent value;\n * any other own value overrides. Returns the parent unchanged (same object)\n * when the element sets no inheritable property, avoiding a needless clone.\n */\nexport function deriveStyle(parent: StyleContext, el: Element): StyleContext {\n let next: Record<string, string> | null = null;\n for (const prop of INHERITABLE) {\n const own = ownProp(el, prop);\n if (own == null || own === 'inherit') continue;\n if (!next) next = { ...parent };\n next[prop] = own;\n }\n return next ?? parent;\n}\n\n/**\n * Resolve a paint value that may be the `currentColor` keyword against the\n * cascade's `color`. Non-currentColor values pass through; null passes through.\n * `color`'s SVG initial value is black.\n */\nexport function resolveCurrentColor(raw: string | null, style: StyleContext): string | null {\n if (raw == null) return null;\n if (raw.trim().toLowerCase() === 'currentcolor') return style['color'] ?? '#000000';\n return raw;\n}\n","/**\n * Parse an SVG document string into a `SvgNode[]` tree. Walks the SVG\n * DOM (via the platform's `DOMParser` — jsdom in tests, the browser at\n * runtime) and lowers each supported element to weasel-native shapes.\n *\n * Transforms are pushed onto a matrix stack and collapsed into leaf\n * geometry at the moment a leaf is created, so the output tree never\n * carries `transform` data — even on `<g>` nodes.\n */\n\nimport type { Path, PolygonPath } from '@weasel-js/core';\nimport { PATH_L, PATH_M, PATH_Z, pathFromD, getMarker, solid } from '@weasel-js/core';\nimport type { MarkerEntry, MarkerPaint } from '@weasel-js/core';\nimport {\n rectElementToPath, circleToPath, ellipseToPath, lineToPath,\n parsePoints, polylineToPath, polygonToPath,\n} from './shapes';\nimport { transformPath } from './shapes';\nimport type {\n Matrix, NamespaceMeta, NamespacedElement, ParseOptions, ParseResult,\n SvgNode, SvgPaint, SvgPathNode, SvgStroke, SvgTextNode, SvgImageNode,\n ScreenLength,\n} from './types';\nimport type { StyledRun, TextStyle, TextPaint, FillStyle, Stroke } from '@weasel-js/core';\nimport { multiply, parseTransform, decomposeRotation, rebaseTransform, rotationComponent, isIdentity } from './transform';\nimport { boundsOfPath, layoutRuns, resolveRuns, resolveScreenLength, resolveTextStyle } from '@weasel-js/core';\nimport { IDENTITY_MATRIX } from './types';\nimport { anchorOffset } from './textAnchor';\nimport { parsePaintAttr } from './color';\nimport { collectGradients, type GradientTable } from './gradients';\nimport { collectPatterns } from './patterns';\nimport { collectElementsByTag } from './elements';\nimport { deriveStyle, EMPTY_STYLE, ownProp, resolveCurrentColor, type StyleContext } from './cascade';\n\n// Every tag set here is compared against a lowercased `tagName`.\n/** Element tags we accept and lower; anything else triggers a warning. */\nconst SUPPORTED_LEAF_TAGS = new Set([\n 'rect', 'circle', 'ellipse', 'line', 'polyline', 'polygon', 'path',\n]);\n\nconst SUPPORTED_GROUP_TAGS = new Set(['g', 'svg']);\n\nconst IGNORED_TAGS = new Set([\n 'defs', 'lineargradient', 'radialgradient', 'pattern', 'marker', 'clippath',\n 'title', 'desc', 'metadata',\n]);\n\n/**\n * Public entry point: parse an SVG document string. Errors during DOM\n * parsing produce a `ParseResult` with an empty `nodes` array and a\n * warning describing the issue, rather than throwing.\n */\nexport function parseSvg(svg: string, opts: ParseOptions = {}): ParseResult {\n const warnings: string[] = [];\n const onWarn = (m: string): void => { warnings.push(m); };\n\n let doc: Document;\n try {\n doc = new DOMParser().parseFromString(svg, 'image/svg+xml');\n } catch (e) {\n return { nodes: [], warnings: [`failed to parse SVG: ${(e as Error).message}`] };\n }\n const errEl = doc.getElementsByTagName('parsererror')[0];\n if (errEl) {\n return { nodes: [], warnings: [`SVG parse error: ${errEl.textContent ?? 'unknown'}`] };\n }\n const root = doc.documentElement;\n if (!root || root.tagName.toLowerCase() !== 'svg') {\n return { nodes: [], warnings: ['root element is not <svg>'] };\n }\n\n const namespaces = opts.namespaces ?? {};\n // Build a URI → prefix index for fast lookup during traversal.\n const uriToPrefix = new Map<string, string>();\n for (const [prefix, uri] of Object.entries(namespaces)) {\n uriToPrefix.set(uri, prefix);\n }\n\n const documentMeta = collectDocumentMeta(root, uriToPrefix);\n\n // Both paint-server kinds resolve through one `url(#id)` table, so a\n // patterned fill needs no separate lookup path at every use site.\n const gradients = collectGradients(root, onWarn);\n for (const [id, paint] of collectPatterns(root, onWarn)) gradients.set(id, paint);\n const rootStyle = deriveStyle(EMPTY_STYLE, root);\n const clips = collectClipPaths(root, onWarn);\n const nodes = parseChildren(root, IDENTITY_MATRIX, rootStyle, gradients, clips, onWarn, uriToPrefix);\n const markers = ingestMarkers(root, nodes, gradients, onWarn);\n\n const result: ParseResult = { nodes, warnings };\n if (markers.length > 0) result.markers = markers;\n if (documentMeta) result.documentMeta = documentMeta;\n const viewBox = parseViewBoxAttr(root.getAttribute('viewBox'));\n if (viewBox) result.viewBox = viewBox;\n const width = parseRootLength(root.getAttribute('width'), 'width', onWarn);\n if (width != null) result.width = width;\n const height = parseRootLength(root.getAttribute('height'), 'height', onWarn);\n if (height != null) result.height = height;\n // First direct-child <title> wins. Per SVG spec only one is meaningful.\n for (let i = 0; i < root.children.length; i++) {\n const c = root.children[i];\n if (c.tagName.toLowerCase() === 'title') {\n result.title = c.textContent ?? '';\n break;\n }\n }\n return result;\n}\n\n/**\n * Parse an SVG `viewBox=\"x y width height\"` attribute. Returns undefined\n * on null/empty/malformed input. Numbers may be separated by whitespace\n * and/or commas (SVG spec).\n */\nfunction parseViewBoxAttr(\n raw: string | null,\n): { x: number; y: number; width: number; height: number } | undefined {\n if (raw == null) return undefined;\n const parts = raw.trim().split(/[\\s,]+/).filter(Boolean);\n if (parts.length !== 4) return undefined;\n const nums = parts.map(parseFloat);\n if (nums.some((n) => !Number.isFinite(n))) return undefined;\n return { x: nums[0], y: nums[1], width: nums[2], height: nums[3] };\n}\n\n/**\n * Root `width` / `height` as a bare user-unit number. A CSS unit or a\n * percentage is not converted — there is no viewport to resolve it against —\n * so the number is taken as-is and the discarded unit is reported.\n */\nfunction parseRootLength(\n raw: string | null, name: string, onWarn: (m: string) => void,\n): number | undefined {\n if (raw == null) return undefined;\n const n = parseFloat(raw);\n if (!Number.isFinite(n)) return undefined;\n const unit = /^\\s*[-+]?[\\d.eE+-]+\\s*([a-z%]+)\\s*$/i.exec(raw)?.[1];\n if (unit) onWarn(`<svg ${name}=\"${raw}\"> unit \"${unit}\" is not converted; read as ${n}`);\n return n;\n}\n\nfunction collectDocumentMeta(\n root: Element,\n uriToPrefix: Map<string, string>,\n): NamespaceMeta | undefined {\n if (uriToPrefix.size === 0) return undefined;\n const meta: NamespaceMeta = {};\n\n // Root-level namespaced attributes.\n for (let i = 0; i < root.attributes.length; i++) {\n const a = root.attributes[i];\n if (!a.namespaceURI) continue;\n const prefix = uriToPrefix.get(a.namespaceURI);\n if (!prefix) continue;\n const bucket = (meta[prefix] ??= {});\n (bucket.attrs ??= {})[a.localName] = a.value;\n }\n\n // Root-level namespaced child elements. The body of these is collected\n // recursively as a generic XML-element tree; geometry inside them is NOT\n // promoted to SvgNodes (that's the consumer's job if they want it).\n for (let i = 0; i < root.children.length; i++) {\n const c = root.children[i];\n if (!c.namespaceURI) continue;\n const prefix = uriToPrefix.get(c.namespaceURI);\n if (!prefix) continue;\n const bucket = (meta[prefix] ??= {});\n const elements = (bucket.elements ??= {});\n const list = (elements[c.localName] ??= []);\n list.push(collectNamespacedElement(c, uriToPrefix));\n }\n\n return Object.keys(meta).length > 0 ? meta : undefined;\n}\n\nfunction collectNamespacedElement(\n el: Element,\n uriToPrefix: Map<string, string>,\n): NamespacedElement {\n const result: NamespacedElement = { attrs: {} };\n for (let i = 0; i < el.attributes.length; i++) {\n const a = el.attributes[i];\n // For namespaced *elements* we collect every attribute (namespaced or\n // not) under the element — unlike root attrs where we filter by NS.\n // Treat `xmlns:*` as structural and skip.\n if (a.name.startsWith('xmlns')) continue;\n result.attrs[a.localName] = a.value;\n }\n\n let hasChildElements = false;\n for (let i = 0; i < el.children.length; i++) {\n const c = el.children[i];\n if (!c.namespaceURI) continue;\n const prefix = uriToPrefix.get(c.namespaceURI);\n if (!prefix) continue; // child in undeclared NS: drop\n hasChildElements = true;\n const children = (result.children ??= {});\n const list = (children[c.localName] ??= []);\n list.push(collectNamespacedElement(c, uriToPrefix));\n }\n\n if (!hasChildElements && el.textContent != null && el.textContent.trim() !== '') {\n result.text = el.textContent;\n }\n\n return result;\n}\n\n/** Per-element namespace meta: walked at every parsed SVG element. */\nfunction collectElementMeta(\n el: Element,\n uriToPrefix: Map<string, string>,\n): NamespaceMeta | undefined {\n if (uriToPrefix.size === 0) return undefined;\n const meta: NamespaceMeta = {};\n for (let i = 0; i < el.attributes.length; i++) {\n const a = el.attributes[i];\n if (!a.namespaceURI) continue;\n const prefix = uriToPrefix.get(a.namespaceURI);\n if (!prefix) continue;\n const bucket = (meta[prefix] ??= {});\n (bucket.attrs ??= {})[a.localName] = a.value;\n }\n // Namespaced child elements on a *standard* SVG element (e.g. a <g>) are\n // also surfaced under elements[] in the same shape used at the root.\n for (let i = 0; i < el.children.length; i++) {\n const c = el.children[i];\n if (!c.namespaceURI) continue;\n const prefix = uriToPrefix.get(c.namespaceURI);\n if (!prefix) continue;\n const bucket = (meta[prefix] ??= {});\n const elements = (bucket.elements ??= {});\n const list = (elements[c.localName] ??= []);\n list.push(collectNamespacedElement(c, uriToPrefix));\n }\n return Object.keys(meta).length > 0 ? meta : undefined;\n}\n\n/** Element-id → the outline of a `<clipPath>` def, in the document's own\n * user space. */\ntype ClipTable = ReadonlyMap<string, Path>;\n\n/**\n * Lower every `<clipPath>` in the document to one outline.\n *\n * SVG unions a `<clipPath>`'s shapes and a `Path` carries a single outline,\n * so only a one-shape def is modeled; the rest warn and clip nothing, which\n * shows the whole group rather than hiding it.\n */\nfunction collectClipPaths(root: Element, onWarn: (m: string) => void): ClipTable {\n const out = new Map<string, Path>();\n for (const [id, el] of collectElementsByTag(root, new Set(['clippath']))) {\n const units = el.getAttribute('clipPathUnits');\n if (units && units !== 'userSpaceOnUse') {\n onWarn(`<clipPath id=\"${id}\"> uses clipPathUnits=\"${units}\", which is not modeled`);\n continue;\n }\n const shapes: Element[] = [];\n for (let i = 0; i < el.children.length; i++) {\n if (SUPPORTED_LEAF_TAGS.has(el.children[i].tagName.toLowerCase())) shapes.push(el.children[i]);\n }\n if (shapes.length !== 1) {\n onWarn(\n `<clipPath id=\"${id}\"> holds ${shapes.length} shapes the kit can lower;`\n + ' only a single-shape clip is modeled, so it clips nothing',\n );\n continue;\n }\n const shape = shapes[0];\n const local = parseTransform(shape.getAttribute('transform'), onWarn);\n const path = lowerLeaf(shape, shape.tagName.toLowerCase(), local, onWarn);\n if (path) out.set(id, path);\n }\n return out;\n}\n\n/** The outline a `clip-path` attribute names, in the element's own user space\n * — the space `ctm` maps into, which is also where its children's geometry\n * lands. */\nfunction clipFor(\n el: Element,\n ctm: Matrix,\n clips: ClipTable,\n onWarn: (m: string) => void,\n): Path | undefined {\n const attr = el.getAttribute('clip-path');\n if (!attr || attr === 'none') return undefined;\n const ref = /^url\\(\\s*#([^)\\s]+)\\s*\\)$/.exec(attr.trim());\n if (!ref) {\n onWarn(`clip-path=\"${attr}\" is not a url(#id) reference; the clip is dropped`);\n return undefined;\n }\n const path = clips.get(ref[1]);\n if (!path) {\n onWarn(`clip-path references #${ref[1]}, which no <clipPath> in the document defines`);\n return undefined;\n }\n return transformPath(path, ctm);\n}\n\nfunction parseChildren(\n parent: Element,\n ctm: Matrix,\n style: StyleContext,\n gradients: GradientTable,\n clips: ClipTable,\n onWarn: (m: string) => void,\n uriToPrefix: Map<string, string>,\n): SvgNode[] {\n const out: SvgNode[] = [];\n for (let i = 0; i < parent.children.length; i++) {\n const el = parent.children[i];\n // Skip namespaced children — they belong to `meta.elements`, not nodes.\n // (DOM gives SVG-native elements `http://www.w3.org/2000/svg`.)\n const ns = el.namespaceURI;\n if (ns && ns !== 'http://www.w3.org/2000/svg') continue;\n const node = parseElement(el, ctm, style, gradients, clips, onWarn, uriToPrefix);\n if (node) {\n if (Array.isArray(node)) out.push(...node);\n else out.push(node);\n }\n }\n return out;\n}\n\nfunction parseElement(\n el: Element,\n ctm: Matrix,\n style: StyleContext,\n gradients: GradientTable,\n clips: ClipTable,\n onWarn: (m: string) => void,\n uriToPrefix: Map<string, string>,\n): SvgNode | SvgNode[] | null {\n const tag = el.tagName.toLowerCase();\n if (IGNORED_TAGS.has(tag)) return null;\n if (tag === 'g' && el.hasAttribute('data-weasel-image')) {\n const image = parseCroppedImage(el, ctm, onWarn);\n if (image) {\n const meta = collectElementMeta(el, uriToPrefix);\n if (meta) image.meta = meta;\n return image;\n }\n }\n if (tag === 'g') {\n const local = parseTransform(el.getAttribute('transform'), onWarn);\n const childCtm = multiply(ctm, local);\n const childStyle = deriveStyle(style, el);\n const children = parseChildren(el, childCtm, childStyle, gradients, clips, onWarn, uriToPrefix);\n const opacity = readOpacityAttr(el, 'opacity');\n const group: SvgNode = { kind: 'group', children };\n const clip = clipFor(el, childCtm, clips, onWarn);\n if (clip) group.clip = clip;\n if (opacity != null) group.opacity = opacity;\n const meta = collectElementMeta(el, uriToPrefix);\n if (meta) group.meta = meta;\n return group;\n }\n if (SUPPORTED_GROUP_TAGS.has(tag)) {\n // Nested <svg> — a transparent group that establishes a viewport at\n // (x, y). Inheritance flows through it; clipping does not exist here.\n const childStyle = deriveStyle(style, el);\n const x = parseFloat(el.getAttribute('x') ?? '0');\n const y = parseFloat(el.getAttribute('y') ?? '0');\n const offset: Matrix = [1, 0, 0, 1, Number.isFinite(x) ? x : 0, Number.isFinite(y) ? y : 0];\n if (el.hasAttribute('viewBox')) {\n onWarn('nested <svg> viewBox is not modeled; its children are not rescaled');\n }\n return parseChildren(el, multiply(ctm, offset), childStyle, gradients, clips, onWarn, uriToPrefix);\n }\n if (tag === 'text') {\n const textNode = parseTextElement(el, ctm, style, gradients, onWarn);\n if (textNode && !Array.isArray(textNode) && textNode.kind === 'text') {\n const meta = collectElementMeta(el, uriToPrefix);\n if (meta) textNode.meta = meta;\n }\n return textNode;\n }\n if (tag === 'image') {\n const imageNode = parseImageElement(el, ctm, onWarn);\n if (imageNode) {\n const meta = collectElementMeta(el, uriToPrefix);\n if (meta) imageNode.meta = meta;\n }\n return imageNode;\n }\n if (!SUPPORTED_LEAF_TAGS.has(tag)) {\n onWarn(`unsupported element: <${el.tagName}>`);\n return null;\n }\n const localTransform = parseTransform(el.getAttribute('transform'), onWarn);\n // First, lower the leaf into its UNROTATED form (using just the inherited\n // CTM). Then try to extract the LEAF's local transform as a pure rotation\n // about the leaf's AABB center. When that succeeds, store the angle on\n // node.rotation. When it fails AND the leaf transform is non-identity,\n // fall back to baking the full composed matrix into geometry (legacy\n // behavior) and warn if a rotation is present that we are about to lose.\n let path = lowerLeaf(el, tag, ctm, onWarn);\n if (!path) return null;\n let rotation: number | undefined;\n if (!isIdentity(localTransform)) {\n // `path` is already through `ctm`, so the element's own transform has to\n // be too before it is compared against these bounds.\n const worldLocal = rebaseTransform(ctm, localTransform);\n const bounds = pathAabb(path);\n const cx = bounds.x + bounds.width / 2;\n const cy = bounds.y + bounds.height / 2;\n const angle = worldLocal && decomposeRotation(worldLocal, cx, cy);\n if (!worldLocal) {\n onWarn('leaf transform sits under a singular parent transform; dropped');\n } else if (angle != null) {\n rotation = angle;\n } else {\n // Bake the matrix in — match legacy behavior.\n path = transformPath(path, worldLocal);\n const rotComp = rotationComponent(worldLocal);\n if (Math.abs(rotComp) > 1e-4) {\n onWarn(`leaf transform has a rotational component that can't be cleanly stored as rotation; baked into geometry (may not round-trip identically)`);\n }\n }\n }\n const leafStyle = deriveStyle(style, el);\n const fill = readPaint(leafStyle, 'fill', '#000000', gradients, onWarn);\n const stroke = readStroke(leafStyle, gradients, onWarn, isNonScalingStroke(el));\n const opacity = readOpacityAttr(el, 'opacity');\n // `fill-rule` defaults to `nonzero`; only stamp when explicitly `evenodd`\n // and the lowered geometry is a PolygonPath (RectPath has no fillRule slot).\n const fillRuleRaw = leafStyle['fill-rule'] ?? null;\n if (fillRuleRaw === 'evenodd' && path.kind === 'polygon') {\n path = { ...path, fillRule: 'evenodd' };\n }\n const node: SvgPathNode = { kind: 'path', path, fill };\n if (stroke) node.stroke = stroke;\n if (opacity != null) node.opacity = opacity;\n if (rotation != null) node.rotation = rotation;\n // Lines are stroke-only by SVG convention; force fill=none if neither the\n // line nor an ancestor group specifies a fill.\n if (tag === 'line' && (leafStyle['fill'] ?? null) == null) {\n node.fill = { kind: 'none' };\n }\n const meta = collectElementMeta(el, uriToPrefix);\n if (meta) node.meta = meta;\n return node;\n}\n\nfunction lowerLeaf(\n el: Element,\n tag: string,\n m: Matrix,\n onWarn: (msg: string) => void,\n): Path | null {\n const num = (name: string, fallback = 0): number => {\n const v = el.getAttribute(name);\n if (v == null) return fallback;\n const n = parseFloat(v);\n return Number.isFinite(n) ? n : fallback;\n };\n if (tag === 'rect') {\n const x = num('x', 0);\n const y = num('y', 0);\n const w = num('width', 0);\n const h = num('height', 0);\n const rx = num('rx', 0);\n const ry = num('ry', 0);\n return rectElementToPath(x, y, w, h, rx, ry, m);\n }\n if (tag === 'circle') return circleToPath(num('cx'), num('cy'), num('r'), m);\n if (tag === 'ellipse') return ellipseToPath(num('cx'), num('cy'), num('rx'), num('ry'), m);\n if (tag === 'line') return lineToPath(num('x1'), num('y1'), num('x2'), num('y2'), m);\n if (tag === 'polyline') return polylineToPath(parsePoints(el.getAttribute('points') ?? ''), m);\n if (tag === 'polygon') return polygonToPath(parsePoints(el.getAttribute('points') ?? ''), m);\n if (tag === 'path') {\n const d = el.getAttribute('d') ?? '';\n if (!d.trim()) {\n onWarn('<path> with empty d=');\n return null;\n }\n const raw = pathFromD(d, onWarn);\n const transformed = transformPath(raw, m);\n // Reconstitute axis-aligned rectangles so a `{ kind: 'rect' }` source\n // node round-trips back into a `{ kind: 'rect' }` parsed node.\n if (transformed.kind === 'polygon') {\n const rect = polygonToRectIfAxisAligned(transformed);\n if (rect) return rect;\n }\n return transformed;\n }\n return null;\n}\n\n/**\n * Detect a polygon whose 4 vertices form an axis-aligned rectangle (in\n * the canonical `M L L L Z` order produced by our serializer), and\n * reconstitute it as a `RectPath`. Returns null on any deviation.\n */\nfunction polygonToRectIfAxisAligned(p: PolygonPath): Path | null {\n const cmds = p.commands;\n if (cmds.length !== 5) return null;\n if (cmds[0] !== PATH_M) return null;\n if (cmds[1] !== PATH_L || cmds[2] !== PATH_L || cmds[3] !== PATH_L) return null;\n if (cmds[4] !== PATH_Z) return null;\n const c = p.coords;\n if (c.length !== 8) return null;\n const x0 = c[0], y0 = c[1];\n const x1 = c[2], y1 = c[3];\n const x2 = c[4], y2 = c[5];\n const x3 = c[6], y3 = c[7];\n // Axis-aligned rectangle: top edge horizontal, right edge vertical, etc.\n if (y0 !== y1 || x1 !== x2 || y2 !== y3 || x3 !== x0) return null;\n const x = Math.min(x0, x1);\n const y = Math.min(y0, y2);\n const width = Math.abs(x1 - x0);\n const height = Math.abs(y2 - y1);\n if (width === 0 || height === 0) return null;\n return { kind: 'rect', x, y, width, height };\n}\n\n/**\n * Compute a `Path`'s axis-aligned bounding box. Mirrors the helper used by\n * the serializer for rotation pivot resolution; keep the duplication local\n * to parse.ts for now — lift to a shared module if a third call site\n * appears.\n */\nfunction pathAabb(path: Path): { x: number; y: number; width: number; height: number } {\n if (path.kind === 'rect') {\n return { x: path.x, y: path.y, width: path.width, height: path.height };\n }\n return boundsOfPath(path);\n}\n\nfunction readPaint(\n style: StyleContext,\n attr: 'fill' | 'stroke',\n defaultColor: string,\n gradients: GradientTable,\n onWarn: (msg: string) => void,\n): SvgPaint {\n const raw = resolveCurrentColor(style[attr] ?? null, style);\n const opacityRaw = style[`${attr}-opacity`] ?? null;\n const opacity = opacityRaw != null ? clamp01(parseFloat(opacityRaw)) : undefined;\n if (raw == null) {\n if (attr === 'stroke') return { kind: 'none' };\n const out: SvgPaint = { kind: 'solid', color: defaultColor };\n if (opacity != null) (out as { opacity?: number }).opacity = opacity;\n return out;\n }\n const parsed = parsePaintAttr(raw);\n if (!parsed) {\n onWarn(`unrecognized ${attr} value: ${raw}`);\n return { kind: 'solid', color: defaultColor };\n }\n if (parsed.kind === 'none') return { kind: 'none' };\n if (parsed.kind === 'ref') {\n const paint = gradients.get(parsed.id);\n if (!paint) {\n // A fallback color beside the reference is the author saying what to\n // paint when it cannot be resolved, so taking it is the documented\n // behavior rather than a recovery — nothing to warn about.\n if (parsed.fallback) {\n const flat: SvgPaint = { kind: 'solid', color: parsed.fallback.color };\n const a = opacity ?? (parsed.fallback.alpha < 1 ? parsed.fallback.alpha : undefined);\n if (a != null) (flat as { opacity?: number }).opacity = a;\n return flat;\n }\n onWarn(`${attr} references unknown gradient #${parsed.id}`);\n return { kind: 'solid', color: defaultColor };\n }\n return { kind: 'gradient', paint };\n }\n const out: SvgPaint = { kind: 'solid', color: parsed.color };\n const a = opacity ?? (parsed.alpha < 1 ? parsed.alpha : undefined);\n if (a != null) (out as { opacity?: number }).opacity = a;\n return out;\n}\n\nfunction readStroke(\n style: StyleContext,\n gradients: GradientTable,\n onWarn: (msg: string) => void,\n nonScaling = false,\n): SvgStroke | undefined {\n const inheritedStroke = style['stroke'] ?? null;\n const inheritedWidth = style['stroke-width'] ?? null;\n if (inheritedStroke == null && inheritedWidth == null) return undefined;\n const paint = readPaint(style, 'stroke', '#000000', gradients, onWarn);\n if (paint.kind === 'none') return undefined;\n const n = inheritedWidth != null ? parseFloat(inheritedWidth) : 1;\n const stroke: SvgStroke = { paint, width: nonScaling ? { px: n } : n };\n const opacityRaw = style['stroke-opacity'] ?? null;\n if (opacityRaw != null) {\n const a = clamp01(parseFloat(opacityRaw));\n if (Number.isFinite(a)) stroke.opacity = a;\n }\n const cap = style['stroke-linecap'] ?? null;\n if (cap === 'butt' || cap === 'round' || cap === 'square') {\n stroke.cap = cap;\n } else if (cap != null) {\n onWarn(`unsupported stroke-linecap: ${cap}`);\n }\n const join = style['stroke-linejoin'] ?? null;\n if (join === 'miter' || join === 'round' || join === 'bevel') {\n stroke.join = join;\n } else if (join === 'arcs' || join === 'miter-clip') {\n onWarn(`stroke-linejoin \"${join}\" not supported; falling back to miter`);\n stroke.join = 'miter';\n } else if (join != null) {\n onWarn(`unsupported stroke-linejoin: ${join}`);\n }\n const dashAttr = style['stroke-dasharray'] ?? null;\n if (dashAttr != null && dashAttr.trim() !== '' && dashAttr.trim() !== 'none') {\n const parsed = parseDashArray(dashAttr);\n if (parsed) stroke.dash = parsed;\n else onWarn(`unrecognized stroke-dasharray: ${dashAttr}`);\n }\n const miterAttr = style['stroke-miterlimit'] ?? null;\n if (miterAttr != null) {\n const m = parseFloat(miterAttr);\n if (Number.isFinite(m) && m >= 1) stroke.miterLimit = m;\n else onWarn(`unrecognized stroke-miterlimit: ${miterAttr}`);\n }\n for (const [attr, field] of [\n ['marker-start', 'markerStart'],\n ['marker-mid', 'markerMid'],\n ['marker-end', 'markerEnd'],\n ] as const) {\n // An id with no registered entry stays as-is for `ingestMarkers`, which\n // reads the document's own `<marker>` once the tree is built.\n const id = parseMarkerRef(style[attr] ?? null);\n if (id !== undefined) stroke[field] = id;\n }\n return stroke;\n}\n\n/** `url(#id)` -> `id`; `none`, an empty value, or anything else -> undefined. */\nfunction parseMarkerRef(raw: string | null): string | undefined {\n if (!raw) return undefined;\n const v = raw.trim();\n if (v === '' || v === 'none') return undefined;\n const m = /^url\\(\\s*#([^)\\s]+)\\s*\\)/.exec(v);\n return m ? m[1] : undefined;\n}\n\n/**\n * The stroke keys `readStroke` consults, collected off one element's own\n * attributes rather than the inherited cascade.\n *\n * A `<tspan>` inherits its parent `<text>`'s stroke per the SVG cascade, but\n * the runs model resolves a run's stroke against the node's already — so\n * lifting an inherited value onto the run would write the same paint twice\n * and make an unstyled run look deliberately styled.\n */\nconst STROKE_KEYS = [\n 'stroke', 'stroke-width', 'stroke-opacity', 'stroke-linecap',\n 'stroke-linejoin', 'stroke-dasharray', 'stroke-miterlimit',\n 'marker-start', 'marker-mid', 'marker-end',\n] as const;\n\n/** Whether this element pins its stroke width to rendered pixels.\n *\n * Read off the element rather than the cascade: `vector-effect` is one of the\n * few presentation attributes SVG does not inherit, so a `<g>` carrying it\n * must not hand it to its children. */\nfunction isNonScalingStroke(el: Element): boolean {\n return ownProp(el, 'vector-effect') === 'non-scaling-stroke';\n}\n\nfunction ownStrokeStyle(el: Element): StyleContext {\n const out: Record<string, string> = {};\n for (const k of STROKE_KEYS) {\n const v = ownProp(el, k);\n if (v != null) out[k] = v;\n }\n return out;\n}\n\n/**\n * Lower an {@link SvgStroke} to the kit's `Stroke`, whose paint is a\n * `FillStyle` rather than an `SvgPaint`. Returns `undefined` for a stroke\n * that paints nothing, so callers can leave the field absent.\n */\nfunction coreStroke(stroke: SvgStroke | undefined): Stroke | undefined {\n if (!stroke) return undefined;\n let paint: FillStyle;\n if (stroke.paint.kind === 'gradient') {\n paint = stroke.paint.paint;\n } else if (stroke.paint.kind === 'solid') {\n paint = stroke.paint.opacity != null\n ? { fill: 'solid', color: stroke.paint.color, opacity: stroke.paint.opacity }\n : { fill: 'solid', color: stroke.paint.color };\n } else {\n return undefined;\n }\n const out: Stroke = { paint, width: stroke.width };\n if (stroke.cap) out.cap = stroke.cap;\n if (stroke.join) out.join = stroke.join;\n if (stroke.dash) out.dash = stroke.dash;\n if (stroke.miterLimit != null) out.miterLimit = stroke.miterLimit;\n if (stroke.markerStart) out.markerStart = stroke.markerStart;\n if (stroke.markerMid) out.markerMid = stroke.markerMid;\n if (stroke.markerEnd) out.markerEnd = stroke.markerEnd;\n return out;\n}\n\n/**\n * Parse an SVG `stroke-dasharray` value into a non-negative number array.\n * Per spec, odd-length lists are duplicated to make the dash pattern even.\n * Returns null if any token fails to parse as a non-negative finite number.\n */\nfunction parseDashArray(s: string): number[] | null {\n const tokens = s.trim().split(/[\\s,]+/).filter(Boolean);\n if (tokens.length === 0) return null;\n const nums: number[] = [];\n for (const t of tokens) {\n const n = parseFloat(t);\n if (!Number.isFinite(n) || n < 0) return null;\n nums.push(n);\n }\n return nums.length % 2 === 1 ? [...nums, ...nums] : nums;\n}\n\nfunction readOpacityAttr(el: Element, name: string): number | undefined {\n const raw = ownProp(el, name);\n if (raw == null) return undefined;\n const n = parseFloat(raw);\n return Number.isFinite(n) ? clamp01(n) : undefined;\n}\n\nfunction clamp01(n: number): number {\n return n < 0 ? 0 : n > 1 ? 1 : n;\n}\n\n/**\n * Parse an SVG `letter-spacing` value into world units. Accepts a bare\n * number, a `px` suffix, or the `normal` keyword (→ `undefined`, via the\n * `NaN` from `parseFloat('normal')`). Any other unit suffix (`em`, `%`,\n * `pt`, …) is still numerically coerced — `parseFloat` reads the leading\n * digits — but flagged, since e.g. `0.1em` silently becomes `0.1` world\n * units, off by a factor of the font size.\n */\nfunction parseLetterSpacing(raw: string, onWarn: (m: string) => void): number | undefined {\n const n = parseFloat(raw);\n if (!Number.isFinite(n)) return undefined;\n const unit = /^-?[\\d.]+([a-z%]+)$/i.exec(raw.trim())?.[1]?.toLowerCase();\n if (unit && unit !== 'px') {\n onWarn(`letter-spacing \"${raw}\" uses unit \"${unit}\", which is not converted; treated as ${n} world units`);\n }\n return n;\n}\n\n/**\n * Parse an SVG `text-decoration` value into the boolean flags the runs model\n * uses. `text-decoration` is a space-separated list of line tokens\n * (`underline`, `line-through`, `overline`, `blink`, `none`), matched\n * case-insensitively per CSS keyword rules; we model `underline`,\n * `line-through` (→ `strikethrough`) and `overline` — any other token\n * (including `none`) is dropped without warning, since it's either the\n * explicit \"no decoration\" case or a decoration kind the runs model has no\n * key for.\n */\nfunction parseTextDecoration(\n raw: string | null,\n): { underline?: boolean; strikethrough?: boolean; overline?: boolean } {\n if (raw == null) return {};\n const tokens = raw.trim().toLowerCase().split(/\\s+/);\n const out: { underline?: boolean; strikethrough?: boolean; overline?: boolean } = {};\n if (tokens.includes('underline')) out.underline = true;\n if (tokens.includes('line-through')) out.strikethrough = true;\n if (tokens.includes('overline')) out.overline = true;\n return out;\n}\n\n/**\n * Parse an SVG `baseline-shift` value into the run keys it maps to. `super`\n * and `sub` are the presets `script` names; a percentage resolves against the\n * parent's font size, which is the unit `baselineShift` is already in; and\n * `baseline` (or a bare zero) is no shift at all. Any other value is read as\n * ems, with a unit suffix other than `em` flagged the way\n * `parseLetterSpacing` flags one.\n */\nfunction parseBaselineShift(\n raw: string,\n onWarn: (m: string) => void,\n): { script?: 'super' | 'sub'; baselineShift?: number } {\n const keyword = raw.trim().toLowerCase();\n if (keyword === 'super' || keyword === 'sub') return { script: keyword };\n const n = parseFloat(raw);\n if (!Number.isFinite(n)) return {};\n const unit = /^-?[\\d.]+([a-z%]+)$/i.exec(raw.trim())?.[1]?.toLowerCase();\n if (unit === '%') return { baselineShift: n / 100 };\n if (unit && unit !== 'em') {\n onWarn(`baseline-shift \"${raw}\" uses unit \"${unit}\", which is not converted; treated as ${n} em`);\n }\n return n === 0 ? {} : { baselineShift: n };\n}\n\n/**\n * Parse a run's `font-size` into the key it maps to: a percentage is relative\n * to the parent's size, which is `fontScale`, and a length is the absolute\n * `fontSize`. Units other than `px` are numerically coerced and flagged, as\n * in `parseLetterSpacing`.\n */\nfunction parseRunFontSize(\n raw: string,\n onWarn: (m: string) => void,\n): { fontSize?: number; fontScale?: number } {\n const n = parseFloat(raw);\n if (!Number.isFinite(n)) return {};\n const unit = /^-?[\\d.]+([a-z%]+)$/i.exec(raw.trim())?.[1]?.toLowerCase();\n if (unit === '%') return { fontScale: n / 100 };\n if (unit && unit !== 'px') {\n onWarn(`font-size \"${raw}\" uses unit \"${unit}\", which is not converted; treated as ${n} world units`);\n }\n return { fontSize: n };\n}\n\n/**\n * Parse an SVG `<text>` element into an `SvgTextNode`. Reads geometry\n * from x/y plus optional `data-weasel-width` / `data-weasel-height`\n * (preserved across weasel→SVG round-trips); falls back to font-metric\n * estimates when those attrs are absent (external SVG sources).\n *\n * Child `<tspan>` elements with their own font/fill attrs become\n * `StyledRun`s on the node. Plain text without `<tspan>` produces no\n * `runs` and the node's `text` is the raw text content.\n */\nconst XLINK_NS = 'http://www.w3.org/1999/xlink';\n\nfunction parseImageElement(\n el: Element,\n ctm: Matrix,\n onWarn: (m: string) => void,\n): SvgImageNode | null {\n const href = imageHref(el);\n if (!href) {\n onWarn('<image> without href; dropped');\n return null;\n }\n const node = imageNodeAt(el, el, href, ctm, onWarn);\n if (el.hasAttribute('preserveAspectRatio')\n && el.getAttribute('preserveAspectRatio') !== 'none') {\n onWarn('<image> preserveAspectRatio is not modeled; the box is taken literally');\n }\n return node;\n}\n\nfunction imageHref(el: Element): string | null {\n return el.getAttribute('href')\n ?? el.getAttributeNS(XLINK_NS, 'href')\n ?? el.getAttribute('xlink:href');\n}\n\n/**\n * The image node whose box is `boxEl`'s `x` / `y` / `width` / `height` and\n * whose rotation and opacity are `ownerEl`'s. The two are one element for a\n * plain `<image>`, and the viewport and its wrapping `<g>` for the cropped\n * form `serialize.ts` writes.\n */\nfunction imageNodeAt(\n boxEl: Element,\n ownerEl: Element,\n href: string,\n ctm: Matrix,\n onWarn: (m: string) => void,\n): SvgImageNode {\n const num = (raw: string | null, fallback: number): number => {\n if (raw == null) return fallback;\n const n = parseFloat(raw);\n return Number.isFinite(n) ? n : fallback;\n };\n const rawX = num(boxEl.getAttribute('x'), 0);\n const rawY = num(boxEl.getAttribute('y'), 0);\n const rawW = num(boxEl.getAttribute('width'), 0);\n const rawH = num(boxEl.getAttribute('height'), 0);\n // Map both corners through the inherited CTM and take their AABB, so\n // translate / scale / flip land on the box. A rotation in the *inherited*\n // transform inflates it; the element's own transform is decomposed below.\n const px = (x: number, y: number): [number, number] =>\n [ctm[0] * x + ctm[2] * y + ctm[4], ctm[1] * x + ctm[3] * y + ctm[5]];\n const [x0, y0] = px(rawX, rawY);\n const [x1, y1] = px(rawX + rawW, rawY + rawH);\n const node: SvgImageNode = {\n kind: 'image',\n href,\n x: Math.min(x0, x1),\n y: Math.min(y0, y1),\n width: Math.abs(x1 - x0),\n height: Math.abs(y1 - y0),\n };\n const opacity = readOpacityAttr(ownerEl, 'opacity');\n if (opacity != null) node.opacity = opacity;\n const localTransform = parseTransform(ownerEl.getAttribute('transform'), onWarn);\n if (!isIdentity(localTransform)) {\n const worldLocal = rebaseTransform(ctm, localTransform);\n const cx = node.x + node.width / 2;\n const cy = node.y + node.height / 2;\n const angle = worldLocal && decomposeRotation(worldLocal, cx, cy);\n if (!worldLocal) {\n onWarn('<image> transform sits under a singular parent transform; dropped');\n } else if (angle != null) {\n node.rotation = angle;\n } else {\n const rotComp = rotationComponent(worldLocal);\n if (Math.abs(rotComp) > 1e-4) {\n onWarn('<image> transform has a rotational component that can\\'t be cleanly stored as rotation; dropped (may not round-trip identically)');\n }\n }\n }\n return node;\n}\n\n/**\n * Read back the cropped image form `serialize.ts` writes for a source rect or\n * a flip: `<g data-weasel-image>` → `<svg viewBox>` → unit-square `<image>`.\n * `null` when the group does not have that shape, so the caller parses it as\n * an ordinary group.\n */\nfunction parseCroppedImage(\n g: Element,\n ctm: Matrix,\n onWarn: (m: string) => void,\n): SvgImageNode | null {\n const viewport = [...g.children].find((c) => c.tagName.toLowerCase() === 'svg');\n const img = viewport && [...viewport.children].find((c) => c.tagName.toLowerCase() === 'image');\n const href = img && imageHref(img);\n const source = viewport && parseViewBoxAttr(viewport.getAttribute('viewBox'));\n if (!img || !href || !source) return null;\n const node = imageNodeAt(viewport, g, href, ctm, onWarn);\n if (source.x !== 0 || source.y !== 0 || source.width !== 1 || source.height !== 1) {\n node.source = source;\n }\n const flip = parseTransform(img.getAttribute('transform'), onWarn);\n if (flip[0] < 0) node.flipX = true;\n if (flip[3] < 0) node.flipY = true;\n return node;\n}\n\nconst XML_NS = 'http://www.w3.org/XML/1998/namespace';\n\n/**\n * Does `xml:space=\"preserve\"` apply to this element? The attribute inherits,\n * so an ancestor can set it.\n *\n * weasel's own `<text>` output carries it, because the runs model stores real\n * line breaks and SVG's default whitespace handling would collapse them away.\n */\nfunction preservesSpace(el: Element): boolean {\n for (let e: Element | null = el; e; e = e.parentElement) {\n const v = e.getAttributeNS(XML_NS, 'space') ?? e.getAttribute('xml:space');\n if (v === 'preserve') return true;\n if (v === 'default') return false;\n }\n return false;\n}\n\n/**\n * Apply SVG's default whitespace handling to a `<text>` element's runs, in\n * place: newlines dropped, tabs folded to spaces, runs of spaces collapsed to\n * one, and leading / trailing space stripped across the element as a whole.\n *\n * Without this, importing any pretty-printed SVG drags the source file's\n * indentation into the document text — and, because the height estimate\n * counts newlines, reports a one-line label as four lines tall.\n */\nfunction collapseRunWhitespace(runs: StyledRun[]): void {\n let atStart = true;\n let lastWasSpace = false;\n for (const run of runs) {\n let out = '';\n for (const ch of run.text.replace(/\\n/g, '').replace(/[\\t\\r]/g, ' ')) {\n if (ch === ' ') {\n if (atStart || lastWasSpace) continue;\n out += ' ';\n lastWasSpace = true;\n continue;\n }\n out += ch;\n lastWasSpace = false;\n atStart = false;\n }\n run.text = out;\n }\n for (let i = runs.length - 1; i >= 0; i--) {\n if (runs[i].text === '') continue;\n if (runs[i].text.endsWith(' ')) runs[i].text = runs[i].text.slice(0, -1);\n break;\n }\n for (let i = runs.length - 1; i >= 0; i--) {\n if (runs[i].text === '') runs.splice(i, 1);\n }\n}\n\n/** Average glyph advance as a fraction of the em. Sans-serif Latin runs\n * 0.5–0.6; erring wide is the safer miss. */\nconst ESTIMATED_GLYPH_ADVANCE_EM = 0.6;\n\n/**\n * Width of an external `<text>`'s longest line, through the same layout\n * `kit:text` paints with. With no registered font able to measure it, the\n * layout reports nothing, and the width is estimated from the em instead.\n */\nfunction laidOutWidth(runs: readonly StyledRun[], style: TextStyle, plain: string): number {\n const resolved = resolveTextStyle(style);\n const { bounds } = layoutRuns(resolveRuns(runs.length > 0 ? runs : [{ text: plain }], resolved), {\n maxWidth: Infinity,\n lineHeight: resolved.lineHeight,\n align: resolved.align,\n direction: resolved.direction,\n });\n if (bounds.width > 0) return bounds.width;\n const longest = plain.split('\\n').reduce((max, line) => Math.max(max, line.length), 0);\n return longest * resolved.fontSize * ESTIMATED_GLYPH_ADVANCE_EM;\n}\n\nfunction parseTextElement(\n el: Element,\n ctm: Matrix,\n style: StyleContext,\n gradients: GradientTable,\n onWarn: (m: string) => void,\n): SvgNode | null {\n const num = (raw: string | null, fallback: number): number => {\n if (raw == null) return fallback;\n const n = parseFloat(raw);\n return Number.isFinite(n) ? n : fallback;\n };\n const localTransform = parseTransform(el.getAttribute('transform'), onWarn);\n // Use only the inherited CTM to position the text's anchor; the\n // element-local transform is decomposed below so a pure rotation about\n // the text box's center is surfaced as `node.rotation` rather than\n // baked into the anchor (and lost).\n const m = ctm;\n\n const rawX = num(el.getAttribute('x'), 0);\n const rawY = num(el.getAttribute('y'), 0);\n // Translate the anchor point through the accumulated transform. Skew /\n // non-uniform scale on the text node lower the round-trip honestly but\n // skew the box dimensions — the rare cases warn and lose styling.\n const ax = m[0] * rawX + m[2] * rawY + m[4];\n const ay = m[1] * rawX + m[3] * rawY + m[5];\n\n const leafStyle = deriveStyle(style, el);\n const textStyle = readTextStyle(leafStyle, onWarn);\n const textPaint = readTextPaint(leafStyle, gradients, onWarn, isNonScalingStroke(el));\n const fontSize = resolveScreenLength(textStyle.fontSize ?? 16, 1);\n const lineHeight = textStyle.lineHeight ?? 1.2;\n\n const dominantBaseline = el.getAttribute('dominant-baseline');\n const explicitTopAnchor = dominantBaseline === 'text-before-edge'\n || dominantBaseline === 'hanging';\n // If serialized by us, `y` is already the top edge. Otherwise SVG's\n // default is `y` = baseline of the first line — shift up by one\n // line of cap-height so weasel's box top approximates the cap-line.\n const topY = explicitTopAnchor ? ay : ay - fontSize;\n\n // `baseline-shift` is legal and inheritable on <text> itself, and unlike\n // every other run key it has no node-level home to be read into — so a bare\n // text child would drop it. Seed those children with it instead; a <tspan>\n // naming its own still wins, as the SVG cascade says.\n const ownShift = ownProp(el, 'baseline-shift');\n const inheritedShift = ownShift != null ? parseBaselineShift(ownShift, onWarn) : {};\n\n // Walk children: text nodes become plain run text; <tspan> elements\n // become StyledRuns with their attribute overrides applied.\n const runs: StyledRun[] = [];\n for (let i = 0; i < el.childNodes.length; i++) {\n const child = el.childNodes[i];\n if (child.nodeType === 3 /* TEXT_NODE */) {\n const t = child.textContent ?? '';\n if (!t) continue;\n runs.push({ text: t, ...inheritedShift });\n } else if (child.nodeType === 1 /* ELEMENT_NODE */) {\n const sp = child as Element;\n if (sp.tagName.toLowerCase() !== 'tspan') {\n onWarn(`<text> child <${sp.tagName}> not supported; flattening text content`);\n const t = sp.textContent ?? '';\n if (t) runs.push({ text: t, ...inheritedShift });\n continue;\n }\n const run = readTspanRun(sp, gradients, leafStyle, onWarn);\n runs.push(run);\n }\n }\n if (!preservesSpace(el)) collapseRunWhitespace(runs);\n const plain = runs.map((r) => r.text).join('');\n\n // data-weasel-* attrs win; otherwise the box is what the text lays out to.\n const dataW = num(el.getAttribute('data-weasel-width'), NaN);\n const dataH = num(el.getAttribute('data-weasel-height'), NaN);\n const width = Number.isFinite(dataW) ? dataW : laidOutWidth(runs, textStyle, plain);\n // Newlines in the text drive line count for height estimation.\n const lines = (plain.match(/\\n/g)?.length ?? 0) + 1;\n const height = Number.isFinite(dataH) ? dataH : fontSize * lineHeight * lines;\n\n const opacity = readOpacityAttr(el, 'opacity');\n const node: SvgTextNode = {\n kind: 'text',\n x: ax - anchorOffset(textStyle, width),\n y: topY,\n width,\n height,\n text: plain,\n };\n // Only attach `runs` when at least one run carries non-default styling —\n // single-run plain text is cleaner without it. `runsToPlainText(runs)`\n // must equal `text` per kit invariants, so the array must match exactly.\n //\n // \"Any key but `text`\" rather than an enumeration of the styling keys:\n // `readTspanRun` sets a field only when it parsed one, so the two are\n // equivalent, and the enumerated form silently dropped every run whose\n // only styling was a key added later — which is exactly how `stroke`\n // arrived and vanished.\n const hasStyling = runs.some(\n (r) => Object.entries(r).some(([k, v]) => k !== 'text' && v !== undefined),\n );\n if (hasStyling) node.runs = runs;\n if (el.getAttribute('data-weasel-wrap') === 'true') textStyle.wrap = true;\n const va = el.getAttribute('data-weasel-vertical-align');\n if (va === 'center' || va === 'bottom') node.verticalAlign = va;\n if (Object.keys(textStyle).length > 0) node.style = textStyle;\n // `!== undefined`, not `!= null`: `null` is the document saying `fill=\"none\"`.\n if (textPaint.fill !== undefined) node.fill = textPaint.fill;\n if (textPaint.stroke != null) node.stroke = textPaint.stroke;\n if (opacity != null) node.opacity = opacity;\n // Try to extract the element-local transform as a pure rotation about\n // the text box's center. When it doesn't decompose cleanly but contains\n // a rotational component, warn — the legacy code path baked the matrix\n // into the anchor; here we drop it so the warning is mandatory.\n if (!isIdentity(localTransform)) {\n const worldLocal = rebaseTransform(ctm, localTransform);\n const cx = node.x + node.width / 2;\n const cy = node.y + node.height / 2;\n const angle = worldLocal && decomposeRotation(worldLocal, cx, cy);\n if (!worldLocal) {\n onWarn('<text> transform sits under a singular parent transform; dropped');\n } else if (angle != null) {\n node.rotation = angle;\n } else {\n const rotComp = rotationComponent(worldLocal);\n if (Math.abs(rotComp) > 1e-4) {\n onWarn(`<text> transform has a rotational component that can't be cleanly stored as rotation; dropped (may not round-trip identically)`);\n }\n }\n }\n return node;\n}\n\nfunction readTspanRun(\n el: Element,\n gradients: GradientTable,\n style: StyleContext,\n onWarn: (m: string) => void,\n): StyledRun {\n const text = el.textContent ?? '';\n const run: StyledRun = { text };\n const fw = ownProp(el, 'font-weight');\n if (fw === 'bold' || fw === '700' || fw === 'bolder') run.bold = true;\n const fs = ownProp(el, 'font-style');\n if (fs === 'italic' || fs === 'oblique') run.italic = true;\n const ff = ownProp(el, 'font-family');\n if (ff) run.fontFamily = ff;\n const sz = ownProp(el, 'font-size');\n if (sz != null) {\n const size = parseRunFontSize(sz, onWarn);\n if (size.fontSize != null) run.fontSize = size.fontSize;\n if (size.fontScale != null) run.fontScale = size.fontScale;\n }\n const ls = ownProp(el, 'letter-spacing');\n if (ls != null) {\n const n = parseLetterSpacing(ls, onWarn);\n if (n != null) run.letterSpacing = n;\n }\n const bs = ownProp(el, 'baseline-shift');\n if (bs != null) {\n const shift = parseBaselineShift(bs, onWarn);\n if (shift.script != null) run.script = shift.script;\n if (shift.baselineShift != null) run.baselineShift = shift.baselineShift;\n }\n const decoration = parseTextDecoration(ownProp(el, 'text-decoration'));\n if (decoration.underline) run.underline = true;\n if (decoration.strikethrough) run.strikethrough = true;\n if (decoration.overline) run.overline = true;\n const tspanStyle = deriveStyle(style, el);\n const fillAttr = resolveCurrentColor(ownProp(el, 'fill'), tspanStyle);\n if (fillAttr) {\n const parsed = parsePaintAttr(fillAttr);\n if (parsed?.kind === 'solid') {\n run.fill = { fill: 'solid', color: parsed.color };\n } else if (parsed?.kind === 'ref') {\n const paint = gradients.get(parsed.id);\n if (paint) run.fill = paint;\n else if (parsed.fallback) run.fill = { fill: 'solid', color: parsed.fallback.color };\n }\n }\n // Own attributes only — see `ownStrokeStyle`.\n const stroke = coreStroke(readStroke(ownStrokeStyle(el), gradients, onWarn, isNonScalingStroke(el)));\n if (stroke) run.stroke = stroke;\n return run;\n}\n\nfunction readTextStyle(\n style: StyleContext,\n onWarn: (m: string) => void,\n): TextStyle {\n const out: TextStyle = {};\n const sz = style['font-size'];\n if (sz != null) {\n const n = parseFloat(sz);\n if (Number.isFinite(n)) out.fontSize = n;\n }\n const ff = style['font-family'];\n if (ff) out.fontFamily = ff;\n const fw = style['font-weight'];\n if (fw != null) {\n const n = parseFloat(fw);\n out.fontWeight = Number.isFinite(n) ? n : fw;\n }\n const fs = style['font-style'];\n if (fs === 'italic' || fs === 'normal') out.fontStyle = fs;\n if (style['direction'] === 'rtl') out.direction = 'rtl';\n // Read back as an absolute edge against the direction just parsed: SVG has\n // one relative pair where this model has a relative pair and an absolute\n // one, so the spelling cannot survive the trip — the rendered edge does.\n // SVG's initial `text-anchor` is `start`, which under `rtl` is the right\n // edge — while this model's default `align` is `left`. The two agree under\n // `ltr` and only there, so an absent anchor has to be written down when the\n // direction is what makes them disagree.\n const ltr = out.direction !== 'rtl';\n const anchor = style['text-anchor'] ?? (ltr ? undefined : 'start');\n if (anchor === 'start') out.align = ltr ? 'left' : 'right';\n else if (anchor === 'middle') out.align = 'center';\n else if (anchor === 'end') out.align = ltr ? 'right' : 'left';\n const ls = style['letter-spacing'];\n if (ls != null) {\n const n = parseLetterSpacing(ls, onWarn);\n if (n != null) out.letterSpacing = n;\n }\n const decoration = parseTextDecoration(style['text-decoration'] ?? null);\n if (decoration.underline) out.underline = true;\n if (decoration.strikethrough) out.strikethrough = true;\n if (decoration.overline) out.overline = true;\n // Note: `lineHeight` is no longer read from a `data-weasel-line-height`\n // attribute. WeaselDraw carries it through the generic namespace bag\n // as `meta.wd.attrs['line-height']`; svgInterop lifts it into / out of\n // `TextStyle.lineHeight` at the bridge layer. From weasel-svg's POV the\n // value is just an opaque string in `meta`.\n // Edit-overlay-only chrome (`caretColor`, `selectionBackground`,\n // `selectionColor`) is intentionally not persisted — those are UI state,\n // not document content.\n return out;\n}\n\n/** Read a `<text>` element's glyph paint — the node's own fill and stroke,\n * which are not typography and do not live in its `TextStyle`. */\nfunction readTextPaint(\n style: StyleContext,\n gradients: GradientTable,\n onWarn: (m: string) => void,\n nonScalingStroke = false,\n): TextPaint {\n const out: TextPaint = {};\n const fillRaw = resolveCurrentColor(style['fill'] ?? null, style);\n if (fillRaw) {\n const parsed = parsePaintAttr(fillRaw);\n if (parsed?.kind === 'solid') {\n out.fill = { fill: 'solid', color: parsed.color } as FillStyle;\n } else if (parsed?.kind === 'ref') {\n const paint = gradients.get(parsed.id);\n if (paint) out.fill = paint;\n else if (parsed.fallback) {\n out.fill = { fill: 'solid', color: parsed.fallback.color } as FillStyle;\n }\n } else if (parsed?.kind === 'none') {\n out.fill = null;\n }\n }\n // Text strokes used to be dropped here with a warning: an SDF glyph is a\n // sampled field, with no geometry to stroke. The outline tier gave large\n // text real contours, so a stroke is now a paint like any other — and one\n // that stays in the document even at sizes that render it unstroked.\n const stroke = coreStroke(readStroke(style, gradients, onWarn, nonScalingStroke));\n if (stroke) out.stroke = stroke;\n return out;\n}\n\n// ---------------------------------------------------------------------------\n// Ingesting `<marker>` defs the kit has no entry for.\n\ntype MarkerRole = 'start' | 'mid' | 'end';\nconst MARKER_FIELDS = [\n ['markerStart', 'start', 'marker-start'],\n ['markerMid', 'mid', 'marker-mid'],\n ['markerEnd', 'end', 'marker-end'],\n] as const;\n\n/**\n * Resolve every marker reference the tree holds that no registered entry\n * answers to, by reading the document's own `<marker>` into a `MarkerEntry`.\n * The reference is rewritten to the entry's key; one the document does not\n * define, or defines with nothing drawable, warns and is dropped.\n *\n * An entry is minted per reference rather than per `<marker>`, because two\n * things SVG decides at the use site are fixed in the kit's entry: a\n * `userSpaceOnUse` marker's size relative to the stroke referencing it, and\n * an `orient=\"auto\"` marker at a start, which the kit always reverses.\n */\nfunction ingestMarkers(\n root: Element,\n nodes: SvgNode[],\n gradients: GradientTable,\n onWarn: (m: string) => void,\n): MarkerEntry[] {\n const defs = new Map<string, Element>();\n const all = root.getElementsByTagName('marker');\n for (let i = 0; i < all.length; i++) {\n const id = all[i].getAttribute('id');\n if (id && !defs.has(id)) defs.set(id, all[i]);\n }\n const minted = new Map<string, MarkerEntry | null>();\n\n const resolve = (\n stroke: { markerStart?: unknown; markerMid?: unknown; markerEnd?: unknown },\n width: ScreenLength | undefined,\n ): void => {\n const w = width === undefined ? 1 : typeof width === 'number' ? width : width.px;\n for (const [field, role, attr] of MARKER_FIELDS) {\n const id = stroke[field];\n if (typeof id !== 'string' || getMarker(id) !== undefined) continue;\n const el = defs.get(id);\n if (!el) {\n onWarn(`${attr} references #${id}, which is neither a kit marker nor defined in the document`);\n delete stroke[field];\n continue;\n }\n const cacheKey = `${id}\\u0000${role}\\u0000${w}`;\n if (!minted.has(cacheKey)) minted.set(cacheKey, markerEntryFrom(el, id, role, w, gradients, onWarn));\n const entry = minted.get(cacheKey)!;\n if (entry) stroke[field] = entry.id;\n else delete stroke[field];\n }\n };\n\n const visit = (n: SvgNode): void => {\n if (n.kind === 'group') n.children.forEach(visit);\n else if (n.kind === 'path' && n.stroke) resolve(n.stroke, n.stroke.width);\n else if (n.kind === 'text') {\n if (n.stroke) resolve(n.stroke, n.stroke.width);\n for (const run of n.runs ?? []) {\n if (run.stroke) resolve(run.stroke, run.stroke.width ?? n.stroke?.width);\n }\n }\n };\n nodes.forEach(visit);\n\n const out = new Map<string, MarkerEntry>();\n for (const entry of minted.values()) if (entry) out.set(entry.id, entry);\n return [...out.values()];\n}\n\n/** The cascade as it stands on `el`, walked down from the root. A marker's\n * content inherits from the marker's own ancestors, never from the element\n * that references it. */\nfunction styleAt(el: Element): StyleContext {\n const chain: Element[] = [];\n for (let e: Element | null = el; e; e = e.parentElement) chain.unshift(e);\n return chain.reduce<StyleContext>((style, e) => deriveStyle(style, e), EMPTY_STYLE);\n}\n\n/** SVG 2's keyword forms of `refX` / `refY`, else a number. */\nfunction markerRef(raw: string | null, lo: number, span: number): number {\n const v = raw?.trim();\n if (v === 'left' || v === 'top') return lo;\n if (v === 'center') return lo + span / 2;\n if (v === 'right' || v === 'bottom') return lo + span;\n const n = v ? parseFloat(v) : 0;\n return Number.isFinite(n) ? n : 0;\n}\n\n/** `orient` as the kit's `'auto' | radians`, with whether a start reference\n * has to be turned around to match what SVG draws. Absent is SVG's `0`. */\nfunction markerOrient(raw: string | null): { orient: 'auto' | number; reverseAtStart: boolean } {\n const v = raw?.trim() ?? '';\n if (v === 'auto') return { orient: 'auto', reverseAtStart: true };\n if (v === 'auto-start-reverse') return { orient: 'auto', reverseAtStart: false };\n const m = /^(-?[\\d.]+(?:e-?\\d+)?)(deg|rad|grad|turn)?$/i.exec(v);\n if (!m) return { orient: 0, reverseAtStart: false };\n const n = parseFloat(m[1]);\n const unit = (m[2] ?? 'deg').toLowerCase();\n const rad = unit === 'rad' ? n\n : unit === 'grad' ? (n * Math.PI) / 200\n : unit === 'turn' ? n * 2 * Math.PI\n : (n * Math.PI) / 180;\n return { orient: rad, reverseAtStart: false };\n}\n\nfunction markerPaint(\n style: StyleContext,\n attr: 'fill' | 'stroke',\n gradients: GradientTable,\n onWarn: (m: string) => void,\n): MarkerPaint {\n const raw = style[attr]?.trim();\n if (raw === 'context-stroke') return 'line';\n if (raw === 'context-fill') {\n onWarn(`a marker's ${attr}=\"context-fill\" is read as the line's stroke paint`);\n return 'line';\n }\n const paint = readPaint(style, attr, '#000000', gradients, onWarn);\n if (paint.kind === 'none') return 'none';\n if (paint.kind === 'gradient') return paint.paint;\n return paint.opacity != null ? { ...solid(paint.color), opacity: paint.opacity } : solid(paint.color);\n}\n\nfunction asPolygon(path: Path): PolygonPath {\n if (path.kind === 'polygon') return path;\n const { x, y, width: w, height: h } = path as { x: number; y: number; width: number; height: number };\n return {\n kind: 'polygon',\n commands: new Uint8Array([PATH_M, PATH_L, PATH_L, PATH_L, PATH_Z]),\n coords: new Float32Array([x, y, x + w, y, x + w, y + h, x, y + h]),\n fillRule: 'nonzero',\n };\n}\n\n/** FNV-1a, for a key that tells apart two documents' same-named markers. */\nfunction shortHash(s: string): string {\n let h = 0x811c9dc5;\n for (let i = 0; i < s.length; i++) {\n h ^= s.charCodeAt(i);\n h = Math.imul(h, 0x01000193);\n }\n return (h >>> 0).toString(36);\n}\n\n/**\n * One `<marker>` as a `MarkerEntry` for a reference in `role` from a stroke\n * `strokeWidth` wide.\n *\n * The content is mapped into marker units — the viewBox scaled onto\n * `markerWidth` × `markerHeight` under `preserveAspectRatio`, with\n * `refX` / `refY` moved to the origin, which is where the kit anchors every\n * entry. The key is the id plus a hash of what the entry draws, so the same\n * id in two documents never collides in the global registry, and an entry\n * this package exported reads back under the key it went out with.\n *\n * All parts merge into one path painted with the first part's fill and\n * outline, since an entry has one of each. `overflow` clipping is not\n * modeled.\n */\nfunction markerEntryFrom(\n el: Element,\n id: string,\n role: MarkerRole,\n strokeWidth: number,\n gradients: GradientTable,\n onWarn: (m: string) => void,\n): MarkerEntry | null {\n const num = (name: string, fallback: number): number => {\n const n = parseFloat(el.getAttribute(name) ?? '');\n return Number.isFinite(n) ? n : fallback;\n };\n const vb = parseViewBoxAttr(el.getAttribute('viewBox'));\n let sx = 1, sy = 1;\n if (vb && vb.width > 0 && vb.height > 0) {\n sx = num('markerWidth', 3) / vb.width;\n sy = num('markerHeight', 3) / vb.height;\n const par = el.getAttribute('preserveAspectRatio')?.trim() ?? '';\n if (!par.startsWith('none')) {\n const s = par.endsWith('slice') ? Math.max(sx, sy) : Math.min(sx, sy);\n sx = s;\n sy = s;\n }\n }\n const refX = markerRef(el.getAttribute('refX'), vb?.x ?? 0, vb?.width ?? 0);\n const refY = markerRef(el.getAttribute('refY'), vb?.y ?? 0, vb?.height ?? 0);\n // Marker units are stroke widths already, unless the marker is sized in\n // user space; then this reference's width converts it.\n const k = el.getAttribute('markerUnits') === 'userSpaceOnUse' && strokeWidth > 0\n ? 1 / strokeWidth\n : 1;\n const { orient, reverseAtStart } = markerOrient(el.getAttribute('orient'));\n const turn = role === 'start' && reverseAtStart ? -1 : 1;\n const base: Matrix = [turn * sx * k, 0, 0, turn * sy * k, -turn * sx * k * refX, -turn * sy * k * refY];\n\n const parts: { path: PolygonPath; style: StyleContext }[] = [];\n const collect = (parent: Element, m: Matrix, style: StyleContext): void => {\n for (let i = 0; i < parent.children.length; i++) {\n const child = parent.children[i];\n const tag = child.tagName.toLowerCase();\n const cm = multiply(m, parseTransform(child.getAttribute('transform'), onWarn));\n const cs = deriveStyle(style, child);\n if (tag === 'g') collect(child, cm, cs);\n else if (SUPPORTED_LEAF_TAGS.has(tag)) {\n const path = lowerLeaf(child, tag, cm, onWarn);\n if (path) parts.push({ path: asPolygon(path), style: cs });\n } else if (!IGNORED_TAGS.has(tag)) {\n onWarn(`<marker id=\"${id}\"> child <${child.tagName}> is not supported; skipped`);\n }\n }\n };\n collect(el, base, styleAt(el));\n if (parts.length === 0) {\n onWarn(`<marker id=\"${id}\"> draws nothing this kit can read; dropped`);\n return null;\n }\n\n const first = parts[0].style;\n const fill = markerPaint(first, 'fill', gradients, onWarn);\n const outlinePaint = markerPaint(first, 'stroke', gradients, onWarn);\n const outlineWidth = parseFloat(first['stroke-width'] ?? '1') * Math.sqrt(sx * sy) * k;\n const outline = outlinePaint !== 'none' && outlineWidth > 0\n ? { width: outlineWidth, paint: outlinePaint }\n : false;\n if (parts.some((p) => JSON.stringify(p.style) !== JSON.stringify(first))) {\n onWarn(`<marker id=\"${id}\"> paints its parts differently; all take the first part's paint`);\n }\n\n let commandCount = 0, coordCount = 0;\n for (const p of parts) { commandCount += p.path.commands.length; coordCount += p.path.coords.length; }\n const commands = new Uint8Array(commandCount);\n const coords = new Float32Array(coordCount);\n let ci = 0, pi = 0;\n for (const p of parts) {\n commands.set(p.path.commands, ci); ci += p.path.commands.length;\n coords.set(p.path.coords, pi); pi += p.path.coords.length;\n }\n const fillRule = parts[0].path.fillRule ?? 'nonzero';\n\n const round = (v: number): number => Math.round(v * 1e4) / 1e4 + 0;\n const hash = shortHash(JSON.stringify([\n Array.from(commands), Array.from(coords, round), fillRule, fill, outline,\n typeof orient === 'number' ? round(orient) : orient,\n ]));\n const key = id.endsWith(`-${hash}`) ? id : `${id}-${hash}`;\n\n return {\n id: key,\n path: ({ size }) => {\n const scaled = new Float32Array(coords.length);\n for (let i = 0; i < coords.length; i++) scaled[i] = coords[i] * size;\n return { kind: 'polygon', commands, coords: scaled, fillRule };\n },\n fill,\n outline,\n orient,\n inset: 0,\n };\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, StrokeAlign } from '@weasel-js/core';\nimport { boundsOfPath, resolveScreenLength, SCRIPT_METRICS } from '@weasel-js/core';\nimport type {\n Matrix, NamespaceMeta, NamespacedElement, SerializeOptions, SvgGroupNode,\n SvgNode, SvgPaint, SvgPathNode, SvgStroke, SvgTextNode, SvgImageNode,\n ScreenLength,\n} from './types';\nimport { IDENTITY_MATRIX } from './types';\nimport { serializePathD } from './path-serializer';\nimport { formatMatrix, multiply, trimNumber } from './transform';\nimport { PaintServerRegistry, WEASEL_NS, WEASEL_NS_PREFIX } from './gradients';\nimport { anchorOffset } from './textAnchor';\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 // Declared before the caller's namespaces and only when something needs it,\n // so a document of ordinary paints carries no trace of it. The paint pre-pass\n // above has already seen every paint, so this answer is final.\n if (registry.usesPrivateNamespace() && namespaces[WEASEL_NS_PREFIX] == null) {\n rootAttrs.push(`xmlns:${WEASEL_NS_PREFIX}=\"${WEASEL_NS}\"`);\n }\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 // Once per message: a hundred inner-aligned strokes are one fact.\n const said = new Set<string>();\n const warn: Warn = (m) => {\n if (!opts.onWarn || said.has(m)) return;\n said.add(m);\n opts.onWarn(m);\n };\n const bodyXml = nodes.map((n) => nodeXml(n, registry, namespaces, warn)).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 if (n.clip) registry.clipId(n.clip);\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 | null | 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\ntype Warn = (message: string) => void;\n\nfunction nodeXml(\n node: SvgNode, registry: PaintServerRegistry, namespaces: Record<string, string>, warn: Warn,\n): string {\n if (node.kind === 'group') return groupXml(node, registry, namespaces, warn);\n if (node.kind === 'text') return textXml(node, registry, namespaces, warn);\n if (node.kind === 'image') return imageXml(node, namespaces);\n return pathXml(node, registry, namespaces, warn);\n}\n\n/** SVG 1.1 has no stroke alignment; SVG 2's `stroke-alignment` never shipped\n * in a browser. */\nfunction warnStrokeAlign(align: StrokeAlign | undefined, warn: Warn): void {\n if (align && align !== 'center') {\n warn(`a stroke aligned \"${align}\" of its edge is written centered: SVG has no stroke alignment`);\n }\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 *\n * A source rect or a flip takes the cropped form described on `SvgImageNode`.\n * The nested `<svg>` cannot carry the rotation itself — SVG 1.1 gives it no\n * `transform` — so the rotation, opacity and meta go on the wrapping `<g>`.\n */\nfunction imageXml(node: SvgImageNode, namespaces: Record<string, string>): string {\n const box = `x=\"${trimNumber(node.x)}\" y=\"${trimNumber(node.y)}\"`\n + ` width=\"${trimNumber(node.width)}\" height=\"${trimNumber(node.height)}\"`;\n const outer: string[] = [];\n if (node.opacity != null && node.opacity !== 1) {\n outer.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 outer.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 const href = `href=\"${escapeAttr(node.href)}\"`;\n\n if (!node.source && !node.flipX && !node.flipY) {\n const attrs = [href, box, 'preserveAspectRatio=\"none\"', ...outer].join(' ');\n if (metaEls) return `<image ${attrs}${metaAttrs}>${metaEls}</image>`;\n return `<image ${attrs}${metaAttrs}/>`;\n }\n\n const src = node.source ?? { x: 0, y: 0, width: 1, height: 1 };\n const viewBox = [src.x, src.y, src.width, src.height].map(trimNumber).join(' ');\n // A mirror about the source window's center, so the flipped image still\n // fills exactly the window the viewport shows.\n const flip = node.flipX || node.flipY\n ? ` transform=\"matrix(${node.flipX ? -1 : 1} 0 0 ${node.flipY ? -1 : 1}`\n + ` ${trimNumber(node.flipX ? 2 * src.x + src.width : 0)}`\n + ` ${trimNumber(node.flipY ? 2 * src.y + src.height : 0)})\"`\n : '';\n const head = ['<g data-weasel-image=\"true\"', ...outer].join(' ');\n return `${head}${metaAttrs}>`\n + `<svg ${box} viewBox=\"${viewBox}\" preserveAspectRatio=\"none\">`\n + `<image ${href} x=\"0\" y=\"0\" width=\"1\" height=\"1\" preserveAspectRatio=\"none\"${flip}/>`\n + `</svg>${metaEls}</g>`;\n}\n\nfunction groupXml(\n node: SvgGroupNode, registry: PaintServerRegistry, namespaces: Record<string, string>, warn: Warn,\n): 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.clip) {\n attrs.push(`clip-path=\"url(#${registry.clipId(node.clip)})\"`);\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, warn)).join('');\n return `${head}${body}${metaElementsXml(node.meta, namespaces)}</g>`;\n}\n\nfunction pathXml(\n node: SvgPathNode, registry: PaintServerRegistry, namespaces: Record<string, string>, warn: Warn,\n): 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, warn);\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 return [`${name}=\"${registry.ref(paint.paint)}\"`];\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, unpainted, or zero-width emits nothing at all: unstroked text should\n * not carry a `stroke` attribute, and SVG's own default (`none`) already says\n * so.\n */\n/**\n * `stroke-width`, plus `vector-effect` when the width is in screen pixels.\n *\n * A `{ px }` width means \"this thickness once rendered, whatever the view is\n * doing\", which is exactly what `non-scaling-stroke` says — so the number goes\n * out unresolved and the attribute carries the unit. There is no accumulated\n * transform scale here to resolve it against, and picking one would bake a\n * single zoom level into the document.\n */\nfunction strokeWidthAttrs(width: ScreenLength): string[] {\n if (typeof width === 'number') return [`stroke-width=\"${trimNumber(width)}\"`];\n return [`stroke-width=\"${trimNumber(width.px)}\"`, 'vector-effect=\"non-scaling-stroke\"'];\n}\n\nfunction coreStrokeAttrs(stroke: Stroke | undefined, registry: PaintServerRegistry, warn: Warn): string[] {\n const paint = stroke?.paint;\n if (!stroke || !paint) return [];\n const width = stroke.width ?? 1;\n if (!((typeof width === 'object' ? width.px : width) > 0)) return [];\n warnStrokeAlign(stroke.align, warn);\n const attrs: string[] = [];\n if ('color' in paint) {\n attrs.push(`stroke=\"${paint.color}\"`);\n if (paint.opacity != null && paint.opacity !== 1) {\n attrs.push(`stroke-opacity=\"${trimNumber(paint.opacity)}\"`);\n }\n } else {\n attrs.push(`stroke=\"${registry.ref(paint)}\"`);\n }\n attrs.push(...strokeWidthAttrs(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, warn: Warn): string[] {\n warnStrokeAlign(stroke.align, warn);\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(...strokeWidthAttrs(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. `x` is the `text-anchor` point, per the SVG spec:\n * the box's left edge, center or right edge as its alignment resolves. Uses\n * `dominant-baseline=\"text-before-edge\"` so `y` matches weasel's top-of-box\n * pose; stashes the explicit width/height (which native SVG text doesn't\n * model) in `data-weasel-*` attributes so they round-trip through the parser\n * losslessly.\n */\nfunction textXml(\n node: SvgTextNode, registry: PaintServerRegistry, namespaces: Record<string, string>, warn: Warn,\n): string {\n const attrs: string[] = [\n `x=\"${trimNumber(node.x + anchorOffset(node.style, node.width))}\"`,\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 // SVG user space has no camera, so a `{ px }` size writes as that many\n // user units — the reading it already has at scale 1.\n if (style?.fontSize != null) attrs.push(`font-size=\"${trimNumber(resolveScreenLength(style.fontSize, 1))}\"`);\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(resolveScreenLength(style.letterSpacing, 1))}\"`);\n }\n const decoration = textDecorationValue(style?.underline, style?.strikethrough, style?.overline);\n if (decoration) attrs.push(`text-decoration=\"${decoration}\"`);\n // SVG text never wraps, so this is for weasel's own reader, beside the box\n // width it wraps at.\n if (style?.wrap) {\n attrs.push('data-weasel-wrap=\"true\"');\n warn('text that wraps at its box width is written unwrapped: SVG text does not wrap, so other'\n + ' readers draw one line per hard break (weasel reads the wrap back)');\n }\n if (node.verticalAlign && node.verticalAlign !== 'top') {\n attrs.push(`data-weasel-vertical-align=\"${node.verticalAlign}\"`);\n warn(`text aligned to the ${node.verticalAlign} of its box is written top-aligned: SVG text has`\n + ' no box, so other readers draw it at the top (weasel reads the alignment back)');\n }\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 === null) {\n attrs.push('fill=\"none\"');\n } else 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 attrs.push(`fill=\"${registry.ref(node.fill)}\"`);\n }\n }\n for (const a of coreStrokeAttrs(node.stroke, registry, warn)) 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, warn)).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, warn: Warn): 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(resolveScreenLength(run.fontSize, 1))}\"`);\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(resolveScreenLength(run.letterSpacing, 1))}\"`);\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 attrs.push(`fill=\"${registry.ref(run.fill)}\"`);\n }\n }\n for (const a of coreStrokeAttrs(run.stroke, registry, warn)) 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, '&amp;').replace(/\"/g, '&quot;').replace(/</g, '&lt;');\n}\n\nfunction escapeText(s: string): string {\n return s.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\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","/**\n * The `unpack` half of the kit SVG handler (`svgHandler.ts`): parse an SVG\n * file into **native scene nodes** — path/text leaves under containers that\n * mirror the source `<g>` structure — instead of the default single\n * embedded-image node. Opted into via\n * `<SceneCanvas ingestion={{ svg: { unpack: unpackSvgFiles } }}>`.\n *\n * Leaf data targets the kit's built-in painters (`NodeShape.ts`): paths as\n * `{ path, fill?, stroke? }` (the `kit:path` contract), text\n * as `{ text, style?, runs?, fill?, stroke? }` (`kit:text`). Poses are absolute AABBs; the\n * renderer's `pathInPoseFrame` rebases stored geometry into the pose box,\n * so placement and fit-clamping operate on poses alone and never rewrite\n * path coordinates.\n *\n * Placement mirrors the image handler: the file's union AABB is fit-clamped\n * to 90% of the visible viewport and centered on the drop point (or the\n * viewport center), with multi-file batches cascading by a fixed offset.\n * Text takes the clamp through a scaled `fontSize` as well as its pose,\n * since glyph size is not derived from the pose the way path geometry is.\n * Multi-root files are wrapped in one synthesized container so a dropped\n * file arrives as a single selectable unit; a single-root file inserts\n * as-is. Each file commits as one `applyOps` batch, so the whole import is\n * a single undo step.\n *\n */\nimport { parseSvg } from './parse';\nimport type { SvgNode, SvgPaint, SvgStroke } from './types';\nimport {\n boundsOfPath,\n createInsertOp,\n dwarn,\n fillToBoundsFrame,\n getMarker,\n registerMarker,\n resolveTextStyle,\n solid,\n type FillStyle,\n type IngestCtx,\n type Op,\n type ScreenLength,\n type Stroke,\n type StyledRun,\n type TextStyle,\n} from '@weasel-js/core';\n\nconst CASCADE_OFFSET_PX = 24;\nconst VIEWPORT_FIT = 0.9;\n\n/** Axis-aligned box, in the coordinate space of the SVG being unpacked. Used\n * for the bounds a draft occupies before it becomes a scene node. */\nexport interface SvgDraftBounds {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\ntype DraftPose = SvgDraftBounds & { rotation?: number };\n\n/**\n * One node the unpack wants the scene to materialize, in parent-before-child\n * order (a draft's `parentId` always names an earlier draft, or `null` for\n * roots). Leaf `data` is kit-painter-native (see module doc).\n */\nexport type SvgSceneDraft =\n | { kind: 'container'; id: string; parentId: string | null; pose: DraftPose }\n | { kind: 'leaf'; id: string; parentId: string | null; pose: DraftPose; data: Record<string, unknown> };\n\n/** `File.text()` via FileReader — same engine-compat choice as the image\n * handler's `readAsDataURL` (jsdom ships `FileReader` but not `Blob.text`). */\nfunction readFileText(file: File): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => resolve(String(reader.result ?? ''));\n reader.onerror = () => reject(reader.error);\n reader.readAsText(file);\n });\n}\n\n/** Mint a fresh node id. Mirrors the scene's default `n{counter}-{random}`\n * scheme (kept module-private by `core/scene/scene.ts`) — same approach as\n * `groupAction` / `cloneAction`. */\nlet svgIdCounter = 0;\nfunction freshSvgNodeId(): string {\n return `n${(svgIdCounter++).toString(36)}-${Math.random().toString(36).slice(2, 8)}`;\n}\n\n/** Lower an `SvgPaint` onto the `kit:path` painter's `data.fill` — a\n * `FillStyle`, or `null` for SVG's `fill=\"none\"` (the painter skips the\n * fill rather than falling back to its default).\n *\n * A gradient rides through as the `FillStyle` it already is, normalized to\n * the leaf's own box: `objectBoundingBox` gradients already are, and a\n * `userSpaceOnUse` one is rebased so it survives the fit-clamp and the\n * drop-point placement that move the geometry out from under it. */\nfunction fillFromPaint(\n paint: SvgPaint | undefined,\n box: SvgDraftBounds,\n): FillStyle | null | undefined {\n if (!paint) return undefined;\n if (paint.kind === 'none') return null;\n if (paint.kind === 'solid') return solid(paint.color);\n const g = paint.paint;\n const units = 'units' in g ? g.units : undefined;\n return units === 'world' ? fillToBoundsFrame(g, box) : g;\n}\n\n/** Lower an `SvgStroke` onto the leaf's `data.stroke`.\n *\n * Everything the SVG carried — paint, width, cap, join, dash, miter limit,\n * opacity — lands on the one `Stroke` `data.stroke` takes. The paint is\n * normalized to the leaf's own box the same way a fill is, so a\n * `userSpaceOnUse` gradient survives the fit-clamp and the drop-point\n * placement. */\nexport function strokeDataFromSvg(\n stroke: SvgStroke | undefined,\n box: SvgDraftBounds,\n): Stroke | undefined {\n if (!stroke || stroke.paint.kind === 'none') return undefined;\n const paint = fillFromPaint(stroke.paint, box);\n if (paint === undefined || paint === null) return undefined;\n return {\n paint: stroke.opacity !== undefined ? { ...paint, opacity: stroke.opacity } : paint,\n width: stroke.width,\n ...(stroke.cap !== undefined ? { cap: stroke.cap } : {}),\n ...(stroke.join !== undefined ? { join: stroke.join } : {}),\n ...(stroke.dash !== undefined ? { dash: stroke.dash } : {}),\n ...(stroke.miterLimit !== undefined ? { miterLimit: stroke.miterLimit } : {}),\n ...(stroke.markerStart !== undefined ? { markerStart: stroke.markerStart } : {}),\n ...(stroke.markerMid !== undefined ? { markerMid: stroke.markerMid } : {}),\n ...(stroke.markerEnd !== undefined ? { markerEnd: stroke.markerEnd } : {}),\n };\n}\n\n/** A text node's paint arrives already lowered to a kit `FillStyle`, not as\n * the `SvgPaint` a path carries, so it skips `fillFromPaint` — but a\n * `userSpaceOnUse` gradient still needs the same rebase onto the leaf's own\n * box, or it survives neither the fit-clamp nor the drop-point placement. */\nfunction fillInBoxFrame(fill: FillStyle, box: SvgDraftBounds): FillStyle {\n const units = 'units' in fill ? fill.units : undefined;\n return units === 'world' ? fillToBoundsFrame(fill, box) : fill;\n}\n\n/** The same rebase for a run's own overrides, which `<tspan fill=\"url(#g)\">`\n * puts on the run rather than on the node. */\nfunction runInBoxFrame(run: StyledRun, box: SvgDraftBounds): StyledRun {\n const fill = run.fill ? fillInBoxFrame(run.fill, box) : run.fill;\n const stroke = run.stroke ? strokeInBoxFrame(run.stroke, box) : run.stroke;\n if (fill === run.fill && stroke === run.stroke) return run;\n return { ...run, ...(fill ? { fill } : {}), ...(stroke ? { stroke } : {}) };\n}\n\n/** The same rebase for a `Stroke`'s paint. A stroke with no paint of its own\n * passes through — there is nothing to rebase. */\nfunction strokeInBoxFrame(stroke: Stroke, box: SvgDraftBounds): Stroke {\n if (!stroke.paint) return stroke;\n const paint = fillInBoxFrame(stroke.paint, box);\n return paint === stroke.paint ? stroke : { ...stroke, paint };\n}\n\n\n/**\n * Walk an `SvgNode[]` tree and emit a flat, parent-before-child list of\n * {@link SvgSceneDraft}s. Each `<g>` becomes a container whose pose is the\n * union AABB of its descendants (the kit `group` action's convention);\n * path/text leaves carry kit-painter-native data. Empty groups are dropped.\n */\nexport function svgNodesToKitDrafts(\n nodes: readonly SvgNode[],\n nextId: () => string,\n): SvgSceneDraft[] {\n const drafts: SvgSceneDraft[] = [];\n\n // Returns the union AABB of the leaves under `n` so a parent container can\n // compose its own pose; null for empty groups.\n const visit = (n: SvgNode, parentId: string | null): SvgDraftBounds | null => {\n if (n.kind === 'group') {\n const draft: Extract<SvgSceneDraft, { kind: 'container' }> = {\n kind: 'container',\n id: nextId(),\n parentId,\n pose: { x: 0, y: 0, width: 0, height: 0 },\n };\n drafts.push(draft);\n let acc: SvgDraftBounds | null = null;\n for (const c of n.children) {\n const b = visit(c, draft.id);\n if (b) acc = acc ? unionRect(acc, b) : b;\n }\n if (!acc) {\n drafts.splice(drafts.indexOf(draft), 1);\n return null;\n }\n draft.pose = acc;\n return acc;\n }\n\n if (n.kind === 'text') {\n const pose: DraftPose = {\n x: n.x, y: n.y, width: n.width, height: n.height,\n };\n if (n.rotation) pose.rotation = n.rotation;\n const box: SvgDraftBounds = {\n x: pose.x, y: pose.y, width: pose.width, height: pose.height,\n };\n drafts.push({\n kind: 'leaf',\n id: nextId(),\n parentId,\n pose,\n data: {\n text: n.text,\n ...(n.style ? { style: n.style } : {}),\n ...(n.verticalAlign ? { verticalAlign: n.verticalAlign } : {}),\n ...(n.runs ? { runs: n.runs.map((r) => runInBoxFrame(r, box)) } : {}),\n // `!== undefined`, not a truthiness test: `null` is the document\n // saying `fill=\"none\"`, and absent takes the painter's default.\n ...(n.fill !== undefined\n ? { fill: n.fill === null ? null : fillInBoxFrame(n.fill, box) }\n : {}),\n ...(n.stroke !== undefined ? { stroke: strokeInBoxFrame(n.stroke, box) } : {}),\n },\n });\n return pose;\n }\n\n if (n.kind === 'image') {\n const pose: DraftPose = { x: n.x, y: n.y, width: n.width, height: n.height };\n if (n.rotation) pose.rotation = n.rotation;\n drafts.push({\n kind: 'leaf',\n id: nextId(),\n parentId,\n pose,\n data: {\n image: {\n src: n.href,\n ...(n.opacity != null ? { opacity: n.opacity } : {}),\n },\n },\n });\n return pose;\n }\n\n // Path leaf. Bounds come from the geometry; `pathInPoseFrame` rebases\n // the stored path onto whatever pose box placement settles on.\n const b = n.path.kind === 'rect'\n ? { x: n.path.x, y: n.path.y, width: n.path.width, height: n.path.height }\n : boundsOfPath(n.path);\n const pose: DraftPose = { x: b.x, y: b.y, width: b.width, height: b.height };\n if (n.rotation) pose.rotation = n.rotation;\n const fill = fillFromPaint(n.fill, b);\n const strokeFromSvg = strokeDataFromSvg(n.stroke, b);\n drafts.push({\n kind: 'leaf',\n id: nextId(),\n parentId,\n pose,\n data: {\n path: n.path,\n ...(fill !== undefined ? { fill } : {}),\n ...(strokeFromSvg !== undefined ? { stroke: strokeFromSvg } : {}),\n },\n });\n return pose;\n };\n\n for (const n of nodes) visit(n, null);\n return drafts;\n}\n\n\n/**\n * Apply the fit-clamp scale to a text leaf's `fontSize`, which lives in data\n * rather than in the pose and so is untouched by `place`. Glyph size is not\n * derived from the pose box the way a path's geometry is (`pathInPoseFrame`\n * rebases that), so a shrunk file would otherwise arrive with its text at\n * source size, overflowing every box around it.\n *\n * Non-text data passes through, as does an unscaled import.\n */\nfunction scaleTextData(\n data: Record<string, unknown>,\n scale: number,\n): Record<string, unknown> {\n if (scale === 1 || typeof data.text !== 'string') return data;\n const style = (data.style ?? {}) as TextStyle;\n // A run's own `fontSize` is absolute and overrides the node's, so it needs\n // the same scale. `fontScale` is relative and rides the node's for free, and\n // a `{ px }` size is pinned to the screen, so the fit clamp never touches it.\n const scaleSize = (v: ScreenLength): ScreenLength => (typeof v === 'number' ? v * scale : v);\n const runs = data.runs as StyledRun[] | undefined;\n return {\n ...data,\n ...(runs\n ? {\n runs: runs.map((r) => (r.fontSize !== undefined\n ? { ...r, fontSize: scaleSize(r.fontSize) }\n : r)),\n }\n : {}),\n style: { ...style, fontSize: scaleSize(style.fontSize ?? resolveTextStyle(style).fontSize) },\n };\n}\n\nfunction unionRect(a: SvgDraftBounds, b: SvgDraftBounds): SvgDraftBounds {\n const minX = Math.min(a.x, b.x);\n const minY = Math.min(a.y, b.y);\n const maxX = Math.max(a.x + a.width, b.x + b.width);\n const maxY = Math.max(a.y + a.height, b.y + b.height);\n return { x: minX, y: minY, width: maxX - minX, height: maxY - minY };\n}\n\n/**\n * Parse each file and insert its node tree — one undoable `applyOps` batch\n * per file. See the module doc for placement and wrapping policy. A file\n * that fails to parse (or parses to nothing) is skipped with a\n * `console.warn`; the rest proceed.\n */\nexport async function unpackSvgFiles(files: File[], ctx: IngestCtx): Promise<void> {\n const layer = ((ctx.scene.layers[0]?.id as string | undefined) ?? 'default');\n let index = 0;\n for (const file of files) {\n try {\n const text = await readFileText(file);\n const parsed = parseSvg(text);\n for (const w of parsed.warnings) dwarn('ingest', `svg \"${file.name}\":`, w);\n // Keyed by what they draw, so one already registered is this same\n // marker and re-registering it would only churn the paint memo.\n for (const m of parsed.markers ?? []) if (getMarker(m.id) === undefined) registerMarker(m);\n let drafts = svgNodesToKitDrafts(parsed.nodes, freshSvgNodeId);\n if (drafts.length === 0) {\n console.warn(`weasel ingest: svg \"${file.name}\" parsed to no drawable nodes`);\n continue;\n }\n\n // Wrap multi-root files in one synthesized container so the dropped\n // file arrives as a single selectable unit.\n const roots = drafts.filter((d) => d.parentId === null);\n if (roots.length > 1) {\n const wrapperId = freshSvgNodeId();\n const union = roots.map((d) => d.pose).reduce(unionRect);\n drafts = [\n { kind: 'container', id: wrapperId, parentId: null, pose: union },\n ...drafts.map((d) => (d.parentId === null ? { ...d, parentId: wrapperId } : d)),\n ];\n }\n\n // Fit-clamp + center, mirroring the image handler. Pose-only: the\n // painter rebases stored geometry into the pose box.\n const union = drafts\n .filter((d) => d.parentId === null)\n .map((d) => d.pose)\n .reduce(unionRect);\n const view = ctx.viewportWorldRect();\n const scale = Math.min(\n 1,\n union.width > 0 ? (view.width * VIEWPORT_FIT) / union.width : 1,\n union.height > 0 ? (view.height * VIEWPORT_FIT) / union.height : 1,\n );\n const target = ctx.point ?? {\n x: view.x + view.width / 2,\n y: view.y + view.height / 2,\n };\n const offset = index * CASCADE_OFFSET_PX;\n const cx = union.x + union.width / 2;\n const cy = union.y + union.height / 2;\n const place = (p: DraftPose): DraftPose => ({\n ...p,\n x: target.x + (p.x - cx) * scale + offset,\n y: target.y + (p.y - cy) * scale + offset,\n width: p.width * scale,\n height: p.height * scale,\n });\n\n const ops: Op[] = drafts.map((d) =>\n createInsertOp({\n node: {\n id: d.id,\n kind: d.kind,\n layer,\n pose: place(d.pose),\n data: d.kind === 'leaf' ? scaleTextData(d.data, scale) : {},\n parent: d.parentId,\n } as unknown as { id: string },\n label: 'Insert SVG',\n }),\n );\n ctx.applyOps(ops, 'Insert SVG');\n index++;\n } catch (err) {\n console.warn(`weasel ingest: svg \"${file.name}\" failed to parse`, err);\n }\n }\n}\n"]}