@weasel-js/svg 1.3.0 → 1.4.0-pre.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types.ts","../src/transform.ts","../src/shapes.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","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 width: number;\n opacity?: number;\n /** `stroke-linecap`. Default per SVG spec is `'butt'`. */\n cap?: 'butt' | 'round' | 'square';\n /** `stroke-linejoin`. Default per SVG spec is `'miter'`. SVG's `arcs` / `miter-clip` map to `'miter'` with a warning. */\n join?: 'miter' | 'round' | 'bevel';\n /** `stroke-dasharray` as a flat number array. Odd-length inputs are doubled per SVG spec. */\n dash?: number[];\n /**\n * `stroke-miterlimit`. SVG's default is 4. Weasel's renderer defaults to\n * 10 (Canvas2D) when unset, so parsed strokes without an explicit\n * attribute may render with longer miters than the source SVG intended.\n */\n miterLimit?: number;\n /** `marker-start` / `marker-mid` / `marker-end`, as the bare `url(#id)` key. */\n markerStart?: string;\n markerMid?: string;\n markerEnd?: string;\n}\n\n/**\n * Leaf node: a path geometry plus fill/stroke. All other v1 shapes\n * (`<rect>`, `<ellipse>`, etc.) are lowered to this representation on\n * parse — `<rect>` uses weasel's `RectPath` fast-path subtype when\n * possible, everything else becomes a `PolygonPath`.\n */\nexport interface SvgPathNode {\n kind: 'path';\n path: Path;\n fill: SvgPaint;\n stroke?: SvgStroke;\n /** Element-level opacity (`opacity=\"...\"`), 0..1. */\n opacity?: number;\n /** Element-level rotation in **radians**, pivoting around the AABB\n * center of the underlying `path` geometry. Emitted as SVG\n * `transform=\"rotate(angleDegrees cx cy)\"`. */\n rotation?: number;\n /** Opaque per-element bag for declared namespaces. See `NamespaceMeta`. */\n meta?: NamespaceMeta;\n}\n\n/**\n * Group node: an SVG `<g>`. On parse, `transform` is always omitted (any\n * `transform` attribute is collapsed onto descendants' geometry). On\n * serialize, a non-identity `transform` is emitted as\n * `matrix(a b c d e f)`.\n */\nexport interface SvgGroupNode {\n kind: 'group';\n children: SvgNode[];\n transform?: Matrix;\n opacity?: number;\n /** Opaque per-element bag for declared namespaces. See `NamespaceMeta`. */\n meta?: NamespaceMeta;\n}\n\n/**\n * Width given to an external `<text>` that carries no `data-weasel-width`:\n * large enough that line wrapping never fires, since SVG text flows from a\n * baseline and the source says nothing about a box.\n *\n * It is a wrap sentinel, not a measurement. Anything that treats a text\n * node's width as geometry — a union AABB, a fit-clamp — has to recognize it\n * and substitute an estimate, or one text node swamps the whole file.\n */\nexport const UNBOUNDED_TEXT_WIDTH = 99999;\n\n/**\n * Text leaf node. Mirrors the kit's `TextPose` shape — a bounding box plus\n * text content, optional rich-text `runs` (per-range styling), and an\n * optional `TextStyle` for the node-wide defaults.\n *\n * Note on SVG text geometry: native `<text>` flows from a baseline; it\n * doesn't have width/height attributes. The serializer emits\n * `dominant-baseline=\"text-before-edge\"` so `y` is the top of the text\n * box, plus `data-weasel-width` / `data-weasel-height` so weasel's\n * explicit box dimensions round-trip losslessly. External SVG text\n * (lacking the data-* attrs) imports with estimated dimensions —\n * {@link UNBOUNDED_TEXT_WIDTH} and\n * `height = fontSize * lineHeight * (lineCount || 1)`.\n */\nexport interface SvgTextNode {\n kind: 'text';\n x: number;\n y: number;\n width: number;\n height: number;\n /** Plain text. When `runs` is set, `runsToPlainText(runs)` must equal `text`. */\n text: string;\n /** Optional per-range styling — same shape as `TextPose.runs`. */\n runs?: StyledRun[];\n /** Node-wide typography. Defaults applied at render time via `resolveTextStyle`. */\n style?: TextStyle;\n /**\n * Node-wide glyph paint, the `FillStyle` / `Stroke` a kit text node holds\n * in `data.fill` / `data.stroke`. Not `SvgPaint`, which is the path\n * nodes' shape — a text paint reaches the renderer through the runs, and\n * `StyledRun.fill` / `.stroke` override these per range.\n */\n fill?: FillStyle;\n stroke?: Stroke;\n /** Element-level opacity (`opacity=\"...\"`), 0..1. */\n opacity?: number;\n /** Element-level rotation in **radians**, pivoting around the unrotated\n * AABB center `(x + width/2, y + height/2)`. Emitted as SVG\n * `transform=\"rotate(angleDegrees cx cy)\"`. */\n rotation?: number;\n /** Opaque per-element bag for declared namespaces. See `NamespaceMeta`. */\n meta?: NamespaceMeta;\n}\n\n/**\n * Raster-image leaf — an SVG `<image>`. `href` is the element's `href` (or\n * legacy `xlink:href`) verbatim: an external URL or a `data:` URI. The\n * package neither fetches nor decodes it, so an external URL round-trips as\n * a reference and only resolves when something downstream loads it.\n *\n * SVG's `preserveAspectRatio` is not modeled; the box is taken literally.\n */\nexport interface SvgImageNode {\n kind: 'image';\n href: string;\n x: number;\n y: number;\n width: number;\n height: number;\n /** Element-level opacity (`opacity=\"...\"`), 0..1. */\n opacity?: number;\n /** Element-level rotation in **radians**, pivoting around the unrotated\n * AABB center `(x + width/2, y + height/2)`. Emitted as SVG\n * `transform=\"rotate(angleDegrees cx cy)\"`. */\n rotation?: number;\n /** Opaque per-element bag for declared namespaces. See `NamespaceMeta`. */\n meta?: NamespaceMeta;\n}\n\n/** Discriminated-union node — the leaf of the public tree. */\nexport type SvgNode = SvgPathNode | SvgGroupNode | SvgTextNode | SvgImageNode;\n\n/** Options for {@link parseSvg}. */\nexport interface ParseOptions {\n /**\n * Map of prefix → URI for XML namespaces the caller wants surfaced.\n * Attributes / child elements in any declared namespace are collected\n * into `SvgNode.meta` (per element) or `ParseResult.documentMeta` (root).\n * Undeclared namespaces are preserved in the DOM but not promoted into\n * the structured `meta` bag; they are silently dropped at serialize time.\n */\n namespaces?: Record<string, string>;\n}\n\n/** Output of {@link parseSvg}. */\nexport interface ParseResult {\n nodes: SvgNode[];\n /** Non-fatal notices (unsupported elements, unrecognized attributes). */\n warnings: string[];\n /**\n * Opaque per-document bag for declared namespaces. Holds root-level\n * namespaced attributes (`documentMeta.<prefix>.attrs`) and namespaced\n * root children (`documentMeta.<prefix>.elements`).\n */\n documentMeta?: NamespaceMeta;\n /** Root `viewBox` attribute, parsed from `\"x y width height\"`. */\n viewBox?: { x: number; y: number; width: number; height: number };\n /** Root `width` attribute, parsed as a unitless number when present. */\n width?: number;\n /** Root `height` attribute, parsed as a unitless number when present. */\n height?: number;\n /** Text content of the first `<title>` child of `<svg>`, when present. */\n title?: string;\n}\n\n/** Options for {@link serializeSvg}. */\nexport interface SerializeOptions {\n /**\n * Override the root `viewBox`. When omitted, the serializer computes\n * a tight bounding box from the supplied nodes.\n */\n viewBox?: { x: number; y: number; width: number; height: number };\n /**\n * Called for paint that can't be expressed in SVG and is dropped — a\n * conic gradient, or a pattern carrying a `TextureHandle` instead of a\n * `TilePatternSpec`. Without this the loss is silent.\n */\n onWarn?: (message: string) => void;\n /** Emit `width=\"...\"` on the root `<svg>`. */\n width?: number;\n /** Emit `height=\"...\"` on the root `<svg>`. */\n height?: number;\n /**\n * Emit `<title>...</title>` as the first child of the root `<svg>`. The\n * value is XML-escaped on output. Empty strings are skipped.\n */\n title?: string;\n /**\n * Map of prefix → URI for XML namespaces to declare on the root\n * `<svg>`. The serializer reads `documentMeta[prefix]` and\n * `node.meta[prefix]` to write the actual attributes and elements.\n */\n namespaces?: Record<string, string>;\n /**\n * Opaque per-document namespaced extras. Each `<prefix>.attrs` becomes\n * `<prefix>:<name>=\"...\"` attributes on the root `<svg>`. Each\n * `<prefix>.elements[localName]` becomes `<prefix>:<localName>...>`\n * children placed immediately before any geometry.\n */\n documentMeta?: NamespaceMeta;\n /** Pretty-print with newlines + indentation. Default `false`. */\n pretty?: boolean;\n}\n","/**\n * SVG transform attribute helpers. Parses the four primitive transform\n * functions weasel-svg supports (`matrix`, `translate`, `scale`, `rotate`)\n * into a single 2x3 affine matrix, and exposes the point/path mappers we\n * need to collapse `transform=` onto leaf geometry at parse time.\n */\n\nimport type { Matrix } from './types';\nimport { IDENTITY_MATRIX } from './types';\n\n/** Multiply two 2x3 affine matrices (a then b applied to a column vector). */\nexport function multiply(a: Matrix, b: Matrix): Matrix {\n // [a0 a2 a4] [b0 b2 b4]\n // [a1 a3 a5] [b1 b3 b5]\n return [\n a[0] * b[0] + a[2] * b[1],\n a[1] * b[0] + a[3] * b[1],\n a[0] * b[2] + a[2] * b[3],\n a[1] * b[2] + a[3] * b[3],\n a[0] * b[4] + a[2] * b[5] + a[4],\n a[1] * b[4] + a[3] * b[5] + a[5],\n ];\n}\n\n/** Apply a 2x3 affine to a 2D point. */\nexport function applyMatrix(m: Matrix, x: number, y: number): { x: number; y: number } {\n return { x: m[0] * x + m[2] * y + m[4], y: m[1] * x + m[3] * y + m[5] };\n}\n\n/** True if `m` is the identity within a small epsilon. */\nexport function isIdentity(m: Matrix, eps = 1e-9): boolean {\n return (\n Math.abs(m[0] - 1) < eps &&\n Math.abs(m[1]) < eps &&\n Math.abs(m[2]) < eps &&\n Math.abs(m[3] - 1) < eps &&\n Math.abs(m[4]) < eps &&\n Math.abs(m[5]) < eps\n );\n}\n\nconst NUM_RE = /[-+]?(?:\\d*\\.\\d+|\\d+\\.?)(?:[eE][-+]?\\d+)?/g;\n\nfunction readNumbers(s: string): number[] {\n const out: number[] = [];\n const matches = s.match(NUM_RE);\n if (!matches) return out;\n for (const m of matches) {\n const n = Number(m);\n if (Number.isFinite(n)) out.push(n);\n }\n return out;\n}\n\n/**\n * Parse an SVG `transform=\"...\"` string into a single 2x3 matrix.\n * Functions compose right-to-left in SVG's coordinate model: in\n * `transform=\"A B\"`, the rightmost function is applied first to a point's\n * local coordinates. We accumulate accordingly: `result = result * fn`.\n *\n * Unrecognized functions emit a warning via the optional callback and are\n * skipped (the rest of the transform list still applies).\n */\nexport function parseTransform(\n attr: string | null | undefined,\n onWarn?: (message: string) => void,\n): Matrix {\n if (!attr) return IDENTITY_MATRIX;\n let result: Matrix = IDENTITY_MATRIX;\n // Split into \"name(args)\" chunks.\n const fnRe = /([A-Za-z]+)\\s*\\(([^)]*)\\)/g;\n let match: RegExpExecArray | null;\n while ((match = fnRe.exec(attr)) !== null) {\n const name = match[1].toLowerCase();\n const nums = readNumbers(match[2]);\n let local: Matrix | null = null;\n if (name === 'matrix' && nums.length >= 6) {\n local = [nums[0], nums[1], nums[2], nums[3], nums[4], nums[5]];\n } else if (name === 'translate') {\n const tx = nums[0] ?? 0;\n const ty = nums[1] ?? 0;\n local = [1, 0, 0, 1, tx, ty];\n } else if (name === 'scale') {\n const sx = nums[0] ?? 1;\n const sy = nums.length >= 2 ? nums[1] : sx;\n local = [sx, 0, 0, sy, 0, 0];\n } else if (name === 'rotate') {\n const ang = ((nums[0] ?? 0) * Math.PI) / 180;\n const c = Math.cos(ang);\n const s = Math.sin(ang);\n const rot: Matrix = [c, s, -s, c, 0, 0];\n if (nums.length >= 3) {\n // rotate(angle, cx, cy) = translate(cx,cy) * rotate * translate(-cx,-cy)\n const cx = nums[1];\n const cy = nums[2];\n local = multiply(multiply([1, 0, 0, 1, cx, cy], rot), [1, 0, 0, 1, -cx, -cy]);\n } else {\n local = rot;\n }\n } else if (name === 'skewx' || name === 'skewy') {\n const ang = ((nums[0] ?? 0) * Math.PI) / 180;\n const t = Math.tan(ang);\n local = name === 'skewx' ? [1, 0, t, 1, 0, 0] : [1, t, 0, 1, 0, 0];\n } else {\n onWarn?.(`unsupported transform function: ${name}`);\n continue;\n }\n result = multiply(result, local);\n }\n return result;\n}\n\n/** Inverse of a 2x3 affine, or null when it is singular. */\nexport function invertMatrix(m: Matrix): Matrix | null {\n const det = m[0] * m[3] - m[1] * m[2];\n if (!Number.isFinite(det) || Math.abs(det) < 1e-12) return null;\n const a = m[3] / det, b = -m[1] / det, c = -m[2] / det, d = m[0] / det;\n return [a, b, c, d, -(a * m[4] + c * m[5]), -(b * m[4] + d * m[5])];\n}\n\n/**\n * Re-express an element's own `transform` in the frame its inherited `ctm`\n * maps into: `ctm * local * ctm⁻¹`.\n *\n * A leaf's geometry is baked through `ctm` at parse time, so its own\n * transform has to move with it. Decomposing the raw local matrix against\n * bounds that have already been through `ctm` compares two different\n * coordinate spaces, and a rotation inside a translated `<g>` fails to\n * decompose for no reason but the offset. A singular `ctm` has no inverse\n * and collapses the geometry anyway; the local matrix passes through.\n */\nexport function rebaseTransform(ctm: Matrix, local: Matrix): Matrix {\n const inv = invertMatrix(ctm);\n return inv ? multiply(multiply(ctm, local), inv) : local;\n}\n\n/** Try to factor `m` as \"rotation by theta about (cx, cy)\". Returns the\n * angle in radians when `m` is (within `eps`) a pure rotation about the\n * given pivot. Returns `null` otherwise.\n *\n * Pure rotation about (cx, cy) has the matrix form:\n * [ cos -sin cx - cx*cos + cy*sin ]\n * [ sin cos cy - cx*sin - cy*cos ]\n * i.e. m[0] = m[3] = cos, m[1] = -m[2] = sin, with a translation that\n * equals the pivot's \"rotate-then-translate-back\" residue. We reconstruct\n * theta from atan2(m[1], m[0]) and verify the rest.\n */\nexport function decomposeRotation(\n m: Matrix,\n cx: number,\n cy: number,\n eps = 1e-4,\n): number | null {\n const [a, b, c, d, e, f] = m;\n // Pure rotation requires a == d and b == -c.\n if (Math.abs(a - d) > eps) return null;\n if (Math.abs(b + c) > eps) return null;\n // Determinant must be 1 (no scale, no flip).\n const det = a * d - b * c;\n if (Math.abs(det - 1) > eps) return null;\n const theta = Math.atan2(b, a);\n // Verify translation = (cx - cx*cos + cy*sin, cy - cx*sin - cy*cos).\n const expectedE = cx - cx * a + cy * b;\n const expectedF = cy - cx * b - cy * a;\n if (Math.abs(e - expectedE) > eps) return null;\n if (Math.abs(f - expectedF) > eps) return null;\n return theta;\n}\n\n/** Best-effort rotational-component extraction for a general matrix (any\n * scale + rotation, ignoring translation). Used for parse-time warnings\n * on un-decomposable matrices: we can detect \"there is a rotation here\"\n * even if we won't preserve it as `node.rotation`. For a non-uniform\n * matrix the \"rotation\" is ambiguous; we report atan2(b, a) which\n * corresponds to where the +x basis vector points.\n */\nexport function rotationComponent(m: Matrix): number {\n return Math.atan2(m[1], m[0]);\n}\n\n/**\n * Format a matrix as an SVG `matrix(a b c d e f)` value. Returns `null`\n * when `m` is (effectively) the identity, so the caller can omit the\n * attribute entirely.\n */\nexport function formatMatrix(m: Matrix): string | null {\n if (isIdentity(m)) return null;\n return `matrix(${m.map((n) => trimNumber(n)).join(' ')})`;\n}\n\n/** Trim trailing zeros from a numeric value for compact SVG output. */\nexport function trimNumber(n: number): string {\n if (!Number.isFinite(n)) return '0';\n // Round to ~6 decimal places to avoid floating-point cruft.\n const r = Math.round(n * 1e6) / 1e6;\n if (Number.isInteger(r)) return String(r);\n return String(r);\n}\n","/**\n * 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","/**\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, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"');\n}\n","/**\n * Serialize a weasel `Path` to an SVG `d=` attribute string. `RectPath`\n * lowers to `M h v h Z`; `PolygonPath` walks the (commands, coords)\n * arrays, emitting one SVG command per kit command.\n *\n * Output uses absolute commands only and a small amount of whitespace\n * compression (no leading zeros stripped beyond what `Number.toString`\n * already does). Numbers are rounded to ~6 decimals via `trimNumber`.\n */\n\nimport {\n PATH_C, PATH_L, PATH_M, PATH_Q, PATH_Z,\n type Path,\n} from '@weasel-js/core';\nimport { trimNumber } from './transform';\n\n/** Serialize a weasel `Path` to an SVG `d=` attribute string. */\nexport function serializePathD(path: Path): string {\n if (path.kind === 'rect') {\n const { x, y, width, height } = path;\n return `M${trimNumber(x)} ${trimNumber(y)}h${trimNumber(width)}v${trimNumber(height)}h${trimNumber(-width)}Z`;\n }\n const cmds = path.commands;\n const xs = path.coords;\n const out: string[] = [];\n let ci = 0;\n for (let i = 0; i < cmds.length; i++) {\n const c = cmds[i];\n if (c === PATH_M) {\n out.push(`M${trimNumber(xs[ci])} ${trimNumber(xs[ci + 1])}`);\n ci += 2;\n } else if (c === PATH_L) {\n out.push(`L${trimNumber(xs[ci])} ${trimNumber(xs[ci + 1])}`);\n ci += 2;\n } else if (c === PATH_C) {\n out.push(\n `C${trimNumber(xs[ci])} ${trimNumber(xs[ci + 1])} ` +\n `${trimNumber(xs[ci + 2])} ${trimNumber(xs[ci + 3])} ` +\n `${trimNumber(xs[ci + 4])} ${trimNumber(xs[ci + 5])}`,\n );\n ci += 6;\n } else if (c === PATH_Q) {\n out.push(\n `Q${trimNumber(xs[ci])} ${trimNumber(xs[ci + 1])} ` +\n `${trimNumber(xs[ci + 2])} ${trimNumber(xs[ci + 3])}`,\n );\n ci += 4;\n } else if (c === PATH_Z) {\n out.push('Z');\n }\n }\n return out.join('');\n}\n","/**\n * Map between SVG `<linearGradient>` / `<radialGradient>` elements and\n * weasel's `FillStyle` gradient variants. Definitions are indexed by id\n * wherever in the document they appear, and looked up when a `fill` /\n * `stroke` attribute references one as `url(#id)`. On serialize, we\n * emit a fresh `<defs>` block with stable generated ids.\n */\n\nimport { getPaintKind, getMarker } from '@weasel-js/core';\nimport type { FillStyle, GradStop, GradientUnits, MarkerEntry } from '@weasel-js/core';\nimport { parsePaintAttr } from './color';\nimport { trimNumber } from './transform';\nimport { patternXml } from './patterns';\nimport { collectElementsByTag, type ElementTable } from './elements';\nimport { serializePathD } from './path-serializer';\n\n/** Collected gradient definitions, keyed by element id. */\nexport type GradientTable = Map<string, FillStyle>;\n\nconst GRADIENT_TAGS = new Set(['lineargradient', 'radialgradient']);\n\nconst XLINK_NS = 'http://www.w3.org/1999/xlink';\n\n/** Read every gradient definition in the document, keyed by element id. */\nexport function collectGradients(svg: Element, onWarn?: (m: string) => void): GradientTable {\n const out: GradientTable = new Map();\n const elements = collectElementsByTag(svg, GRADIENT_TAGS);\n for (const [id, el] of elements) {\n const paint = el.tagName.toLowerCase() === 'lineargradient'\n ? readLinearGradient(el, elements, onWarn)\n : readRadialGradient(el, elements, onWarn);\n if (paint) out.set(id, paint);\n }\n warnUnsupportedDefsChildren(svg, onWarn);\n return out;\n}\n\n/** Paint servers and `<marker>` aside, a `<defs>` child is something this\n * package does not model (`<clipPath>`, a `<use>` template). Say so once here. */\nfunction warnUnsupportedDefsChildren(svg: Element, onWarn?: (m: string) => void): void {\n if (!onWarn) return;\n const defs = svg.getElementsByTagName('defs');\n for (let d = 0; d < defs.length; d++) {\n const root = defs[d];\n for (let i = 0; i < root.children.length; i++) {\n const child = root.children[i];\n const tag = child.tagName.toLowerCase();\n if (GRADIENT_TAGS.has(tag) || tag === 'pattern' || tag === 'marker') continue;\n onWarn(`unsupported <defs> child: <${child.tagName}>`);\n }\n }\n}\n\n/**\n * The gradient a `href` / `xlink:href` attribute points at, or null. SVG lets\n * one gradient inherit another's stops and attributes this way, and authoring\n * tools lean on it heavily — a chain that isn't followed resolves to a\n * gradient with no stops, which paints nothing.\n */\nfunction hrefTarget(el: Element, elements: ElementTable): Element | null {\n const raw = el.getAttribute('href')\n ?? el.getAttributeNS(XLINK_NS, 'href')\n ?? el.getAttribute('xlink:href');\n if (!raw || !raw.startsWith('#')) return null;\n return elements.get(raw.slice(1)) ?? null;\n}\n\n/** An attribute's value on `el` or, when absent, on the gradient it inherits\n * from. `seen` breaks a reference cycle. */\nfunction inheritedAttr(\n el: Element, elements: ElementTable, name: string, seen: Set<Element> = new Set(),\n): string | null {\n if (el.hasAttribute(name)) return el.getAttribute(name);\n seen.add(el);\n const ref = hrefTarget(el, elements);\n if (!ref || seen.has(ref)) return null;\n return inheritedAttr(ref, elements, name, seen);\n}\n\n/** `el`'s own stops or, when it declares none, the stops it inherits. */\nfunction inheritedStops(\n el: Element, elements: ElementTable, onWarn?: (m: string) => void,\n seen: Set<Element> = new Set(),\n): GradStop[] {\n const own = readStops(el, onWarn);\n if (own.length > 0) return own;\n seen.add(el);\n const ref = hrefTarget(el, elements);\n if (!ref || seen.has(ref)) return own;\n return inheritedStops(ref, elements, onWarn, seen);\n}\n\n/** Parse a `stop-opacity` / offset value that may carry a `%` suffix. */\nfunction parseRatio(raw: string): number {\n const n = parseFloat(raw);\n if (!Number.isFinite(n)) return NaN;\n return raw.trimEnd().endsWith('%') ? n / 100 : n;\n}\n\nfunction readStops(el: Element, onWarn?: (m: string) => void): GradStop[] {\n const stops: GradStop[] = [];\n for (let i = 0; i < el.children.length; i++) {\n const c = el.children[i];\n if (c.tagName.toLowerCase() !== 'stop') continue;\n const offsetRaw = parseRatio(c.getAttribute('offset') ?? '0');\n const offset = Number.isFinite(offsetRaw) ? offsetRaw : 0;\n const colorAttr = c.getAttribute('stop-color') ?? '#000000';\n const parsed = parsePaintAttr(colorAttr);\n if (parsed && parsed.kind === 'solid') {\n const opacityAttr = c.getAttribute('stop-opacity');\n const own = opacityAttr != null ? parseRatio(opacityAttr) : NaN;\n const alpha = Number.isFinite(own) ? own : parsed.alpha;\n stops.push({ offset, color: alpha < 1 ? applyAlpha(parsed.color, alpha) : parsed.color });\n } else {\n onWarn?.(`gradient stop has unrecognized stop-color: ${colorAttr}`);\n stops.push({ offset, color: '#000000' });\n }\n }\n return stops;\n}\n\nfunction applyAlpha(hex: string, alpha: number): string {\n // Pack alpha into an 8-digit hex so it round-trips through weasel's\n // string-color storage. This is non-standard CSS hex but parses cleanly\n // back via our color.ts parser.\n const a = Math.max(0, Math.min(255, Math.round(alpha * 255)));\n return `${hex}${a.toString(16).padStart(2, '0')}`;\n}\n\n/** SVG `gradientUnits` → the kit's `GradientUnits`. SVG's default is\n * `objectBoundingBox`, which is what the attribute defaults above assume\n * (`x2=\"1\"`, `r=\"0.5\"`), so the two have to be read together. */\nfunction readGradientUnits(el: Element, elements: ElementTable): 'bounds' | 'world' {\n return inheritedAttr(el, elements, 'gradientUnits') === 'userSpaceOnUse' ? 'world' : 'bounds';\n}\n\n/** `gradientTransform` has no slot in the kit's gradient model, so a gradient\n * carrying one paints in the wrong place rather than not at all. */\nfunction warnGradientTransform(\n el: Element, elements: ElementTable, onWarn?: (m: string) => void,\n): void {\n const t = inheritedAttr(el, elements, 'gradientTransform');\n if (t != null && t.trim() !== '') {\n onWarn?.(`gradientTransform=\"${t}\" is not modeled; the gradient paints untransformed`);\n }\n}\n\nfunction num(raw: string | null, fallback: number): number {\n if (raw == null) return fallback;\n const n = parseRatio(raw);\n return Number.isFinite(n) ? n : fallback;\n}\n\nfunction readLinearGradient(\n el: Element, elements: ElementTable, onWarn?: (m: string) => void,\n): FillStyle | null {\n warnGradientTransform(el, elements, onWarn);\n return {\n fill: 'linear-gradient',\n from: {\n x: num(inheritedAttr(el, elements, 'x1'), 0),\n y: num(inheritedAttr(el, elements, 'y1'), 0),\n },\n to: {\n x: num(inheritedAttr(el, elements, 'x2'), 1),\n y: num(inheritedAttr(el, elements, 'y2'), 0),\n },\n stops: inheritedStops(el, elements, onWarn),\n units: readGradientUnits(el, elements),\n };\n}\n\nfunction readRadialGradient(\n el: Element, elements: ElementTable, onWarn?: (m: string) => void,\n): FillStyle | null {\n warnGradientTransform(el, elements, onWarn);\n return {\n fill: 'radial-gradient',\n center: {\n x: num(inheritedAttr(el, elements, 'cx'), 0.5),\n y: num(inheritedAttr(el, elements, 'cy'), 0.5),\n },\n radius: num(inheritedAttr(el, elements, 'r'), 0.5),\n stops: inheritedStops(el, elements, onWarn),\n units: readGradientUnits(el, elements),\n };\n}\n\n/**\n * Pre-pass that assigns stable serialization ids to the paint servers —\n * gradients and patterns — used by any leaf in the tree. We key on object\n * identity so two leaves sharing the exact same `FillStyle` reference reuse\n * one `<defs>` entry; structurally equal but distinct objects get separate\n * ids.\n */\nexport class PaintServerRegistry {\n private byPaint = new Map<FillStyle, string>();\n private order: FillStyle[] = [];\n private counter = 0;\n\n // Marker keys referenced by any stroke, in first-use order. The `<defs>`\n // id is the marker key itself, not a minted counter id: `parseSvg` reads a\n // `marker-end=\"url(#id)\"` fragment back as the marker key directly (it\n // never inspects the `<marker>` element), so a synthetic id would come\n // back unresolvable and warn on round-trip.\n private markerKeys: string[] = [];\n private markerKeySet = new Set<string>();\n\n register(paint: FillStyle): string {\n const existing = this.byPaint.get(paint);\n if (existing) return existing;\n const id = paint.fill === 'pattern' ? `pat${this.counter++}` : `grad${this.counter++}`;\n this.byPaint.set(paint, id);\n this.order.push(paint);\n return id;\n }\n\n /** The `<defs>` id for a marker key — the key itself, minting nothing.\n * `undefined` when nothing is registered under `key`, so a caller emits no\n * attribute at all rather than a `url(#…)` pointing at a def that will\n * never be written. */\n markerId(key: string): string | undefined {\n if (getMarker(key) === undefined) return undefined;\n if (!this.markerKeySet.has(key)) {\n this.markerKeySet.add(key);\n this.markerKeys.push(key);\n }\n return key;\n }\n\n /** Emit `<defs>...</defs>` XML for every registered paint server and marker. */\n toDefsXml(onWarn?: (m: string) => void): string {\n if (this.order.length === 0 && this.markerKeys.length === 0) return '';\n const parts: string[] = ['<defs>'];\n for (const paint of this.order) {\n parts.push(paintServerXml(this.byPaint.get(paint)!, paint, onWarn));\n }\n for (const key of this.markerKeys) {\n const entry = getMarker(key);\n if (!entry) continue;\n parts.push(entry.toSvg ? entry.toSvg(key, entry) : defaultMarkerXml(key, entry));\n }\n parts.push('</defs>');\n return parts.join('');\n }\n}\n\n/** The `<marker>` def for an entry with no `toSvg` of its own. */\nfunction defaultMarkerXml(id: string, entry: MarkerEntry): string {\n const path = entry.path({ size: 1, stroke: { paint: { fill: 'solid', color: '#000' } } });\n const d = serializePathD(path);\n const fill = entry.fill === 'none' ? 'none' : 'context-stroke';\n const outline = entry.outline\n ? ` stroke=\"context-stroke\" stroke-width=\"${entry.outline.width}\" stroke-linecap=\"round\" stroke-linejoin=\"round\"`\n : '';\n // `overflow=\"visible\"` overrides the UA default of `hidden`, which would\n // otherwise clip the arrowhead to the marker's viewport.\n return (\n `<marker id=\"${id}\" markerUnits=\"strokeWidth\" markerWidth=\"8\" markerHeight=\"8\"` +\n ` refX=\"0\" refY=\"0\" orient=\"auto\" overflow=\"visible\">` +\n `<path d=\"${d}\" fill=\"${fill}\"${outline}/></marker>`\n );\n}\n\n/** One paint server's `<defs>` entry: the built-in mapping, else the kind's\n * own `toSvg`, else nothing plus a warning. The referencing element already\n * carries `fill=\"url(#id)\"`, so a silent omission is a dangling reference and\n * the shape vanishes in a viewer. */\nfunction paintServerXml(id: string, paint: FillStyle, onWarn?: (m: string) => void): string {\n if (paint.fill === 'pattern') return patternXml(id, paint, onWarn);\n const builtin = gradientXml(id, paint);\n if (builtin) return builtin;\n const custom = getPaintKind(paint.fill)?.toSvg?.(id, paint);\n if (custom) return custom;\n onWarn?.(`${paint.fill} fill has no vector form — omitted from <defs>`);\n return '';\n}\n\n/** `GradientUnits` → SVG `gradientUnits`. `'screen'` (the kit's default, and\n * a viewport-fixed wash) has no SVG analog at all; it lowers to user space,\n * which at least puts the paint somewhere the geometry is. */\nfunction gradientUnitsAttr(units: GradientUnits | undefined): string {\n return units === 'bounds' ? 'objectBoundingBox' : 'userSpaceOnUse';\n}\n\nfunction gradientXml(id: string, paint: FillStyle): string {\n if (paint.fill === 'linear-gradient') {\n const stops = paint.stops.map(stopXml).join('');\n return (\n `<linearGradient id=\"${id}\" gradientUnits=\"${gradientUnitsAttr(paint.units)}\" ` +\n `x1=\"${trimNumber(paint.from.x)}\" y1=\"${trimNumber(paint.from.y)}\" ` +\n `x2=\"${trimNumber(paint.to.x)}\" y2=\"${trimNumber(paint.to.y)}\">${stops}</linearGradient>`\n );\n }\n if (paint.fill === 'radial-gradient') {\n const stops = paint.stops.map(stopXml).join('');\n return (\n `<radialGradient id=\"${id}\" gradientUnits=\"${gradientUnitsAttr(paint.units)}\" ` +\n `cx=\"${trimNumber(paint.center.x)}\" cy=\"${trimNumber(paint.center.y)}\" ` +\n `r=\"${trimNumber(paint.radius)}\">${stops}</radialGradient>`\n );\n }\n return '';\n}\n\nfunction stopXml(s: GradStop): string {\n // Detect packed-alpha hex (#rrggbbaa) and split out stop-opacity.\n const m = /^#([0-9a-f]{6})([0-9a-f]{2})$/i.exec(s.color);\n if (m) {\n const alpha = parseInt(m[2], 16) / 255;\n return `<stop offset=\"${trimNumber(s.offset)}\" stop-color=\"#${m[1].toLowerCase()}\" stop-opacity=\"${trimNumber(alpha)}\"/>`;\n }\n return `<stop offset=\"${trimNumber(s.offset)}\" stop-color=\"${s.color}\"/>`;\n}\n","/**\n * 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 } from '@weasel-js/core';\nimport { IDENTITY_MATRIX, UNBOUNDED_TEXT_WIDTH } from './types';\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 = decomposeRotation(worldLocal, cx, cy);\n 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);\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): 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 width = inheritedWidth != null ? parseFloat(inheritedWidth) : 1;\n const stroke: SvgStroke = { paint, width };\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\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 = decomposeRotation(worldLocal, cx, cy);\n 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\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);\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 // 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 });\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 });\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 // Estimate dimensions: data-weasel-* attrs win, else heuristic.\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 : UNBOUNDED_TEXT_WIDTH;\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,\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 (Object.keys(textStyle).length > 0) node.style = textStyle;\n if (textPaint.fill != null) 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 = decomposeRotation(worldLocal, cx, cy);\n 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));\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): 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 }\n // parsed.kind === 'none' → leave fill undefined (defaults to black downstream).\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));\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, resolveStrokeWidth, SCRIPT_METRICS } from '@weasel-js/core';\nimport type {\n Matrix, NamespaceMeta, NamespacedElement, SerializeOptions, SvgGroupNode,\n SvgNode, SvgPaint, SvgPathNode, SvgStroke, SvgTextNode, SvgImageNode,\n} from './types';\nimport { IDENTITY_MATRIX } from './types';\nimport { serializePathD } from './path-serializer';\nimport { formatMatrix, multiply, trimNumber } from './transform';\nimport { PaintServerRegistry } from './gradients';\n\n/**\n * Walk the tree and produce an SVG document string. The root `<svg>`'s\n * `viewBox` is taken from `opts.viewBox` if supplied, otherwise computed\n * as a tight bounding box around every leaf.\n */\nexport function serializeSvg(nodes: SvgNode[], opts: SerializeOptions = {}): string {\n const registry = new PaintServerRegistry();\n registerPaintServers(nodes, registry);\n\n const bounds = opts.viewBox ?? computeBounds(nodes);\n const vb = `${trimNumber(bounds.x)} ${trimNumber(bounds.y)} ${trimNumber(bounds.width)} ${trimNumber(bounds.height)}`;\n const namespaces = opts.namespaces ?? {};\n\n const rootAttrs: string[] = [`xmlns=\"http://www.w3.org/2000/svg\"`];\n for (const [prefix, uri] of Object.entries(namespaces)) {\n rootAttrs.push(`xmlns:${prefix}=\"${escapeAttr(uri)}\"`);\n }\n rootAttrs.push(`viewBox=\"${vb}\"`);\n if (opts.width != null) rootAttrs.push(`width=\"${trimNumber(opts.width)}\"`);\n if (opts.height != null) rootAttrs.push(`height=\"${trimNumber(opts.height)}\"`);\n // documentMeta attrs onto the root, in declared-namespace order.\n if (opts.documentMeta) {\n for (const prefix of Object.keys(namespaces)) {\n const bucket = opts.documentMeta[prefix];\n if (!bucket?.attrs) continue;\n for (const [name, value] of Object.entries(bucket.attrs)) {\n rootAttrs.push(`${prefix}:${name}=\"${escapeAttr(value)}\"`);\n }\n }\n }\n\n // documentMeta elements after <defs>, before geometry body.\n let docMetaXml = '';\n if (opts.documentMeta) {\n for (const prefix of Object.keys(namespaces)) {\n const bucket = opts.documentMeta[prefix];\n if (!bucket?.elements) continue;\n for (const [localName, list] of Object.entries(bucket.elements)) {\n for (const el of list) docMetaXml += namespacedElementXml(prefix, localName, el);\n }\n }\n }\n\n const defsXml = registry.toDefsXml(opts.onWarn);\n const bodyXml = nodes.map((n) => nodeXml(n, registry, namespaces)).join('');\n\n // `<title>` goes immediately inside `<svg>` per SVG-spec convention; it's\n // an accessibility hook and (for our purposes) a stable place to round-trip\n // the user-visible document title.\n const titleXml = opts.title && opts.title.length > 0\n ? `<title>${escapeText(opts.title)}</title>`\n : '';\n\n return `<svg ${rootAttrs.join(' ')}>${titleXml}${defsXml}${docMetaXml}${bodyXml}</svg>`;\n}\n\nfunction namespacedElementXml(prefix: string, localName: string, el: NamespacedElement): string {\n const attrs: string[] = [];\n for (const [name, value] of Object.entries(el.attrs)) {\n attrs.push(`${name}=\"${escapeAttr(value)}\"`);\n }\n const head = attrs.length > 0 ? `<${prefix}:${localName} ${attrs.join(' ')}>` : `<${prefix}:${localName}>`;\n let body = '';\n if (el.children) {\n for (const [childName, list] of Object.entries(el.children)) {\n for (const child of list) body += namespacedElementXml(prefix, childName, child);\n }\n } else if (el.text != null) {\n body = escapeText(el.text);\n }\n return `${head}${body}</${prefix}:${localName}>`;\n}\n\nfunction metaAttrsXml(meta: NamespaceMeta | undefined, namespaces: Record<string, string>): string {\n if (!meta) return '';\n const parts: string[] = [];\n for (const prefix of Object.keys(namespaces)) {\n const bucket = meta[prefix];\n if (!bucket?.attrs) continue;\n for (const [name, value] of Object.entries(bucket.attrs)) {\n parts.push(`${prefix}:${name}=\"${escapeAttr(value)}\"`);\n }\n }\n return parts.length > 0 ? ` ${parts.join(' ')}` : '';\n}\n\nfunction metaElementsXml(meta: NamespaceMeta | undefined, namespaces: Record<string, string>): string {\n if (!meta) return '';\n let out = '';\n for (const prefix of Object.keys(namespaces)) {\n const bucket = meta[prefix];\n if (!bucket?.elements) continue;\n for (const [localName, list] of Object.entries(bucket.elements)) {\n for (const el of list) out += namespacedElementXml(prefix, localName, el);\n }\n }\n return out;\n}\n\nfunction registerPaintServers(nodes: SvgNode[], registry: PaintServerRegistry): void {\n for (const n of nodes) {\n if (n.kind === 'group') {\n registerPaintServers(n.children, registry);\n } else if (n.kind === 'path') {\n if (n.fill.kind === 'gradient') registry.register(n.fill.paint);\n if (n.stroke && n.stroke.paint.kind === 'gradient') registry.register(n.stroke.paint.paint);\n registerMarkers(n.stroke, registry);\n } else if (n.kind === 'text') {\n // Text paints flow through `style` / `runs` rather than a top-level\n // SvgPaint, so register direct FillStyle references when present. This\n // pre-pass is load-bearing: `<defs>` is emitted before the body, so a\n // paint first seen while writing an element would be referenced by an\n // id that no definition backs.\n registerTextPaint(n.fill, registry);\n registerTextPaint(n.stroke?.paint, registry);\n registerMarkers(n.stroke, registry);\n for (const run of n.runs ?? []) {\n registerTextPaint(run.fill, registry);\n registerTextPaint(run.stroke?.paint, registry);\n }\n }\n }\n}\n\n/** Register one text paint if it is a paint server rather than a colour. */\nfunction registerTextPaint(\n paint: import('@weasel-js/core').FillStyle | undefined,\n registry: PaintServerRegistry,\n): void {\n if (paint && !('color' in paint)) registry.register(paint);\n}\n\n/** A marker reference in either shape — `SvgStroke` stores a bare key, the kit\n * `Stroke` stores a `MarkerRef`. */\nfunction markerKeyOfRef(ref: unknown): string | undefined {\n if (typeof ref === 'string') return ref;\n if (ref && typeof ref === 'object' && 'key' in ref) return String((ref as { key: string }).key);\n return undefined;\n}\n\n/** Mint a `<defs>` id for every marker a stroke names, before the body is\n * written — same reason as the paint pre-pass above. */\nfunction registerMarkers(\n stroke: { markerStart?: unknown; markerMid?: unknown; markerEnd?: unknown } | undefined,\n registry: PaintServerRegistry,\n): void {\n if (!stroke) return;\n for (const ref of [stroke.markerStart, stroke.markerMid, stroke.markerEnd]) {\n const key = markerKeyOfRef(ref);\n if (key) registry.markerId(key);\n }\n}\n\nfunction nodeXml(node: SvgNode, registry: PaintServerRegistry, namespaces: Record<string, string>): string {\n if (node.kind === 'group') return groupXml(node, registry, namespaces);\n if (node.kind === 'text') return textXml(node, registry, namespaces);\n if (node.kind === 'image') return imageXml(node, namespaces);\n return pathXml(node, registry, namespaces);\n}\n\n/**\n * Emit an `<image>`. `preserveAspectRatio=\"none\"` is unconditional: the node\n * carries a literal box and nothing else, so letting a viewer letterbox it\n * would place the pixels somewhere the model never said.\n */\nfunction imageXml(node: SvgImageNode, namespaces: Record<string, string>): string {\n const attrs: string[] = [\n `href=\"${escapeAttr(node.href)}\"`,\n `x=\"${trimNumber(node.x)}\"`,\n `y=\"${trimNumber(node.y)}\"`,\n `width=\"${trimNumber(node.width)}\"`,\n `height=\"${trimNumber(node.height)}\"`,\n `preserveAspectRatio=\"none\"`,\n ];\n if (node.opacity != null && node.opacity !== 1) {\n attrs.push(`opacity=\"${trimNumber(node.opacity)}\"`);\n }\n if (node.rotation != null && node.rotation !== 0) {\n const cx = node.x + node.width / 2;\n const cy = node.y + node.height / 2;\n const deg = (node.rotation * 180) / Math.PI;\n attrs.push(`transform=\"rotate(${trimNumber(deg)} ${trimNumber(cx)} ${trimNumber(cy)})\"`);\n }\n const metaAttrs = metaAttrsXml(node.meta, namespaces);\n const metaEls = metaElementsXml(node.meta, namespaces);\n if (metaEls) return `<image ${attrs.join(' ')}${metaAttrs}>${metaEls}</image>`;\n return `<image ${attrs.join(' ')}${metaAttrs}/>`;\n}\n\nfunction groupXml(node: SvgGroupNode, registry: PaintServerRegistry, namespaces: Record<string, string>): string {\n const attrs: string[] = [];\n if (node.transform) {\n const m = formatMatrix(node.transform);\n if (m) attrs.push(`transform=\"${m}\"`);\n }\n if (node.opacity != null && node.opacity !== 1) {\n attrs.push(`opacity=\"${trimNumber(node.opacity)}\"`);\n }\n const metaAttrs = metaAttrsXml(node.meta, namespaces);\n // `metaAttrs` already starts with a leading space (or is empty), so we\n // can splice it after the existing attr list without extra logic.\n const head = attrs.length > 0\n ? `<g ${attrs.join(' ')}${metaAttrs}>`\n : `<g${metaAttrs}>`;\n const body = node.children.map((c) => nodeXml(c, registry, namespaces)).join('');\n return `${head}${body}${metaElementsXml(node.meta, namespaces)}</g>`;\n}\n\nfunction pathXml(node: SvgPathNode, registry: PaintServerRegistry, namespaces: Record<string, string>): string {\n const attrs: string[] = [`d=\"${serializePathD(node.path)}\"`];\n const fillAttrs = paintAttrs(node.fill, 'fill', registry);\n for (const a of fillAttrs) attrs.push(a);\n // Emit fill-rule only when it diverges from SVG's default ('nonzero').\n // RectPath has no fillRule field — only PolygonPath carries one.\n if (node.path.kind === 'polygon' && node.path.fillRule === 'evenodd') {\n attrs.push(`fill-rule=\"evenodd\"`);\n }\n if (node.stroke) {\n const strokeAttrs = strokeAttrsFor(node.stroke, registry);\n for (const a of strokeAttrs) attrs.push(a);\n } else {\n attrs.push('stroke=\"none\"');\n }\n if (node.opacity != null && node.opacity !== 1) {\n attrs.push(`opacity=\"${trimNumber(node.opacity)}\"`);\n }\n if (node.rotation != null && node.rotation !== 0) {\n const b = pathBounds(node.path);\n const cx = b.minX + (b.maxX - b.minX) / 2;\n const cy = b.minY + (b.maxY - b.minY) / 2;\n const deg = (node.rotation * 180) / Math.PI;\n attrs.push(`transform=\"rotate(${trimNumber(deg)} ${trimNumber(cx)} ${trimNumber(cy)})\"`);\n }\n const metaAttrs = metaAttrsXml(node.meta, namespaces);\n const metaEls = metaElementsXml(node.meta, namespaces);\n if (metaEls) {\n return `<path ${attrs.join(' ')}${metaAttrs}>${metaEls}</path>`;\n }\n return `<path ${attrs.join(' ')}${metaAttrs}/>`;\n}\n\nfunction paintAttrs(\n paint: SvgPaint,\n name: 'fill' | 'stroke',\n registry: PaintServerRegistry,\n includeOpacity = true,\n): string[] {\n if (paint.kind === 'none') return [`${name}=\"none\"`];\n if (paint.kind === 'solid') {\n const out = [`${name}=\"${paint.color}\"`];\n if (includeOpacity && paint.opacity != null && paint.opacity !== 1) {\n out.push(`${name}-opacity=\"${trimNumber(paint.opacity)}\"`);\n }\n return out;\n }\n // gradient\n const id = registry.register(paint.paint);\n return [`${name}=\"url(#${id})\"`];\n}\n\n/**\n * Attributes for a kit `Stroke` — the shape text carries, whose `paint` is a\n * `FillStyle` rather than an `SvgPaint`. Text strokes ride inside\n * `TextStyle` / `StyledRun` rather than as a node-level `SvgStroke`, because\n * that is where the kit's text model puts them.\n *\n * Absent, or zero-width, emits nothing at all: unstroked text should not\n * carry a `stroke` attribute, and SVG's own default (`none`) already says so.\n */\nfunction coreStrokeAttrs(stroke: Stroke | undefined, registry: PaintServerRegistry): string[] {\n if (!stroke) return [];\n // SVG has no accumulated-transform scale to resolve a `{ px }` width\n // against; its number is emitted as-is.\n const width = resolveStrokeWidth(stroke.width ?? 1, 1);\n if (!(width > 0)) return [];\n const attrs: string[] = [];\n if ('color' in stroke.paint) {\n attrs.push(`stroke=\"${stroke.paint.color}\"`);\n if (stroke.paint.opacity != null && stroke.paint.opacity !== 1) {\n attrs.push(`stroke-opacity=\"${trimNumber(stroke.paint.opacity)}\"`);\n }\n } else {\n attrs.push(`stroke=\"url(#${registry.register(stroke.paint)})\"`);\n }\n attrs.push(`stroke-width=\"${trimNumber(width)}\"`);\n if (stroke.cap) attrs.push(`stroke-linecap=\"${stroke.cap}\"`);\n if (stroke.join) attrs.push(`stroke-linejoin=\"${stroke.join}\"`);\n if (stroke.dash && stroke.dash.length > 0) {\n attrs.push(`stroke-dasharray=\"${stroke.dash.map(trimNumber).join(' ')}\"`);\n }\n if (stroke.miterLimit != null) attrs.push(`stroke-miterlimit=\"${trimNumber(stroke.miterLimit)}\"`);\n for (const [field, attr] of [\n ['markerStart', 'marker-start'],\n ['markerMid', 'marker-mid'],\n ['markerEnd', 'marker-end'],\n ] as const) {\n const ref = stroke[field];\n if (ref === undefined) continue;\n const key = typeof ref === 'string' ? ref : ref.key;\n const id = registry.markerId(key);\n if (id === undefined) continue;\n attrs.push(`${attr}=\"url(#${id})\"`);\n }\n return attrs;\n}\n\nfunction strokeAttrsFor(stroke: SvgStroke, registry: PaintServerRegistry): string[] {\n // `SvgStroke.opacity` and the paint's own `opacity` are two models of one\n // SVG attribute, and parse fills in both. Emitting each would write\n // `stroke-opacity` twice, which is not well-formed XML at all.\n const attrs = paintAttrs(stroke.paint, 'stroke', registry, false);\n attrs.push(`stroke-width=\"${trimNumber(stroke.width)}\"`);\n const opacity = stroke.opacity\n ?? (stroke.paint.kind === 'solid' ? stroke.paint.opacity : undefined);\n if (opacity != null && opacity !== 1) {\n attrs.push(`stroke-opacity=\"${trimNumber(opacity)}\"`);\n }\n if (stroke.cap) {\n attrs.push(`stroke-linecap=\"${stroke.cap}\"`);\n }\n if (stroke.join) {\n attrs.push(`stroke-linejoin=\"${stroke.join}\"`);\n }\n if (stroke.dash && stroke.dash.length > 0) {\n attrs.push(`stroke-dasharray=\"${stroke.dash.map(trimNumber).join(' ')}\"`);\n }\n if (stroke.miterLimit != null) {\n attrs.push(`stroke-miterlimit=\"${trimNumber(stroke.miterLimit)}\"`);\n }\n for (const [field, attr] of [\n ['markerStart', 'marker-start'],\n ['markerMid', 'marker-mid'],\n ['markerEnd', 'marker-end'],\n ] as const) {\n const ref = stroke[field];\n if (ref === undefined) continue;\n const id = registry.markerId(ref);\n if (id === undefined) continue;\n attrs.push(`${attr}=\"url(#${id})\"`);\n }\n return attrs;\n}\n\n/**\n * Tight bounding box around everything the tree draws, in the root's\n * coordinates — the fallback `viewBox` when the caller supplies none. A\n * node's `rotation` and a group's `transform` both move ink, so both are\n * applied here; a box taken from unrotated geometry crops the document.\n */\nfunction computeBounds(nodes: SvgNode[]): { x: number; y: number; width: number; height: number } {\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n const visit = (n: SvgNode, ctm: Matrix): void => {\n if (n.kind === 'group') {\n const childCtm = n.transform ? multiply(ctm, n.transform) : ctm;\n n.children.forEach((c) => visit(c, childCtm));\n return;\n }\n const b = n.kind === 'text' || n.kind === 'image'\n ? { minX: n.x, minY: n.y, maxX: n.x + n.width, maxY: n.y + n.height }\n : pathBounds(n.path);\n const local = n.rotation ? rotateAboutCenter(ctm, b, n.rotation) : ctm;\n for (const [x, y] of corners(b)) {\n const px = local[0] * x + local[2] * y + local[4];\n const py = local[1] * x + local[3] * y + local[5];\n if (px < minX) minX = px;\n if (py < minY) minY = py;\n if (px > maxX) maxX = px;\n if (py > maxY) maxY = py;\n }\n };\n nodes.forEach((n) => visit(n, IDENTITY_MATRIX));\n if (!Number.isFinite(minX)) {\n return { x: 0, y: 0, width: 0, height: 0 };\n }\n return { x: minX, y: minY, width: maxX - minX, height: maxY - minY };\n}\n\nfunction corners(b: { minX: number; minY: number; maxX: number; maxY: number }): [number, number][] {\n return [[b.minX, b.minY], [b.maxX, b.minY], [b.maxX, b.maxY], [b.minX, b.maxY]];\n}\n\n/** `ctm` composed with the same `rotate(angle cx cy)` the element emits. */\nfunction rotateAboutCenter(\n ctm: Matrix,\n b: { minX: number; minY: number; maxX: number; maxY: number },\n angle: number,\n): Matrix {\n const cx = (b.minX + b.maxX) / 2;\n const cy = (b.minY + b.maxY) / 2;\n const c = Math.cos(angle);\n const s = Math.sin(angle);\n return multiply(ctm, [c, s, -s, c, cx - cx * c + cy * s, cy - cx * s - cy * c]);\n}\n\n/**\n * Emit a `<text>` element. Uses `dominant-baseline=\"text-before-edge\"` so\n * the `y` attribute matches weasel's top-of-box pose; stashes the explicit\n * width/height (which native SVG text doesn't model) in `data-weasel-*`\n * attributes so they round-trip through the parser losslessly.\n */\nfunction textXml(node: SvgTextNode, registry: PaintServerRegistry, namespaces: Record<string, string>): string {\n const attrs: string[] = [\n `x=\"${trimNumber(node.x)}\"`,\n `y=\"${trimNumber(node.y)}\"`,\n `dominant-baseline=\"text-before-edge\"`,\n // The runs model stores real line breaks; SVG's default whitespace\n // handling would collapse them (and any indentation) away on re-import.\n `xml:space=\"preserve\"`,\n `data-weasel-width=\"${trimNumber(node.width)}\"`,\n `data-weasel-height=\"${trimNumber(node.height)}\"`,\n ];\n\n const style = node.style;\n if (style?.fontSize != null) attrs.push(`font-size=\"${trimNumber(style.fontSize)}\"`);\n if (style?.fontFamily) attrs.push(`font-family=\"${escapeAttr(style.fontFamily)}\"`);\n if (style?.fontWeight != null) attrs.push(`font-weight=\"${String(style.fontWeight)}\"`);\n if (style?.fontStyle && style.fontStyle !== 'normal') attrs.push(`font-style=\"${style.fontStyle}\"`);\n const direction = style?.direction ?? 'ltr';\n if (direction === 'rtl') attrs.push('direction=\"rtl\"');\n if (style?.align != null || direction === 'rtl') {\n // `text-anchor` is reading-order relative in SVG exactly as `start` / `end`\n // are here, so the two relative values pass straight through and only the\n // absolute pair has to be turned into an edge the reader resolves the same\n // way. Under `ltr` this collapses to what it always wrote.\n const align = style?.align ?? 'left';\n const anchor = align === 'center' ? 'middle'\n : align === 'start' ? 'start'\n : align === 'end' ? 'end'\n : (align === 'left') === (direction === 'ltr') ? 'start' : 'end';\n if (anchor !== 'start') attrs.push(`text-anchor=\"${anchor}\"`);\n }\n if (style?.letterSpacing != null && style.letterSpacing !== 0) {\n attrs.push(`letter-spacing=\"${trimNumber(style.letterSpacing)}\"`);\n }\n const decoration = textDecorationValue(style?.underline, style?.strikethrough, style?.overline);\n if (decoration) attrs.push(`text-decoration=\"${decoration}\"`);\n // Note: `lineHeight` is NOT emitted here. The bridge layer (svgInterop)\n // lifts it into `meta.wd.attrs['line-height']`, which `metaAttrsXml`\n // below emits as `wd:line-height=\"...\"`. There is no compat write of\n // `data-weasel-line-height` — per the SVG-native plan's Migration section,\n // no installed base exists to compat against.\n if (node.fill) {\n if ('color' in node.fill) {\n attrs.push(`fill=\"${node.fill.color}\"`);\n if (node.fill.opacity != null && node.fill.opacity !== 1) {\n attrs.push(`fill-opacity=\"${trimNumber(node.fill.opacity)}\"`);\n }\n } else {\n const id = registry.register(node.fill);\n attrs.push(`fill=\"url(#${id})\"`);\n }\n }\n for (const a of coreStrokeAttrs(node.stroke, registry)) attrs.push(a);\n if (node.opacity != null && node.opacity !== 1) {\n attrs.push(`opacity=\"${trimNumber(node.opacity)}\"`);\n }\n if (node.rotation != null && node.rotation !== 0) {\n const cx = node.x + node.width / 2;\n const cy = node.y + node.height / 2;\n const deg = (node.rotation * 180) / Math.PI;\n attrs.push(`transform=\"rotate(${trimNumber(deg)} ${trimNumber(cx)} ${trimNumber(cy)})\"`);\n }\n\n const body = node.runs && node.runs.length > 0\n ? node.runs.map((r) => runXml(r, registry)).join('')\n : escapeText(node.text);\n const metaAttrs = metaAttrsXml(node.meta, namespaces);\n const metaEls = metaElementsXml(node.meta, namespaces);\n return `<text ${attrs.join(' ')}${metaAttrs}>${body}${metaEls}</text>`;\n}\n\nfunction runXml(run: import('@weasel-js/core').StyledRun, registry: PaintServerRegistry): string {\n const attrs: string[] = [];\n if (run.bold) attrs.push(`font-weight=\"700\"`);\n if (run.italic) attrs.push(`font-style=\"italic\"`);\n if (run.fontFamily) attrs.push(`font-family=\"${escapeAttr(run.fontFamily)}\"`);\n // A percentage `font-size` is relative to the parent's, which is what\n // `fontScale` means; an absolute `fontSize` wins over it here as it does in\n // the runs model.\n //\n // `baseline-shift=\"super\"` carries the preset's *size* as well as its rise,\n // so a run that overrode only the rise has no keyword left to say the size\n // with and must spell it out — without this the superscript comes back\n // full-size at a raised baseline.\n const presetScale = run.script != null && run.baselineShift != null\n ? SCRIPT_METRICS[run.script].size\n : undefined;\n const scale = run.fontScale ?? presetScale;\n if (run.fontSize != null) attrs.push(`font-size=\"${trimNumber(run.fontSize)}\"`);\n else if (scale != null) attrs.push(`font-size=\"${trimNumber(scale * 100)}%\"`);\n // Same story for `baseline-shift`: an SVG percentage resolves against the\n // parent's font size, which is the unit `baselineShift` is already in.\n if (run.baselineShift != null) {\n attrs.push(`baseline-shift=\"${trimNumber(run.baselineShift * 100)}%\"`);\n } else if (run.script) {\n attrs.push(`baseline-shift=\"${run.script}\"`);\n }\n // Unlike the node-level style guard above, a run-level `0` is a meaningful\n // *override* (distinct from \"inherit the node's letterSpacing\") per the\n // runs model's additive-flags contract — emit it whenever it's set.\n if (run.letterSpacing != null) {\n attrs.push(`letter-spacing=\"${trimNumber(run.letterSpacing)}\"`);\n }\n const runDecoration = textDecorationValue(run.underline, run.strikethrough, run.overline);\n if (runDecoration) attrs.push(`text-decoration=\"${runDecoration}\"`);\n if (run.fill) {\n if ('color' in run.fill) {\n attrs.push(`fill=\"${run.fill.color}\"`);\n } else {\n const id = registry.register(run.fill);\n attrs.push(`fill=\"url(#${id})\"`);\n }\n }\n for (const a of coreStrokeAttrs(run.stroke, registry)) attrs.push(a);\n const head = attrs.length > 0 ? `<tspan ${attrs.join(' ')}>` : '<tspan>';\n return `${head}${escapeText(run.text)}</tspan>`;\n}\n\n/**\n * Combine the decoration flags into an SVG `text-decoration` value —\n * `\"underline line-through\"` when both are set, a single token when only\n * one is, or `null` (omit the attribute) when none is set.\n */\nfunction textDecorationValue(\n underline: boolean | undefined,\n strikethrough: boolean | undefined,\n overline: boolean | undefined,\n): string | null {\n const tokens: string[] = [];\n if (underline) tokens.push('underline');\n if (strikethrough) tokens.push('line-through');\n if (overline) tokens.push('overline');\n return tokens.length > 0 ? tokens.join(' ') : null;\n}\n\nfunction escapeAttr(s: string): string {\n return s.replace(/&/g, '&').replace(/\"/g, '"').replace(/</g, '<');\n}\n\nfunction escapeText(s: string): string {\n return s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');\n}\n\nfunction pathBounds(path: Path): { minX: number; minY: number; maxX: number; maxY: number } {\n if (path.kind === 'rect') {\n return {\n minX: path.x, minY: path.y,\n maxX: path.x + path.width, maxY: path.y + path.height,\n };\n }\n const b = boundsOfPath(path);\n return { minX: b.x, minY: b.y, maxX: b.x + b.width, maxY: b.y + b.height };\n}\n\n","/**\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? }` (`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 on both axes — an estimated box width in place of\n * the parser's wrap sentinel, and a scaled `fontSize`, since neither is\n * 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 { UNBOUNDED_TEXT_WIDTH } 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 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\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: textBoxWidth(n), height: n.height,\n };\n if (n.rotation) pose.rotation = n.rotation;\n drafts.push({\n kind: 'leaf',\n id: nextId(),\n parentId,\n pose,\n data: { text: n.text, ...(n.style ? { style: n.style } : {}) },\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/** Average glyph advance as a fraction of the em, for the width estimate\n * below. Sans-serif Latin runs 0.5–0.6; erring wide is the safer miss,\n * since a too-narrow box is the one that clips. */\nconst ESTIMATED_GLYPH_ADVANCE_EM = 0.6;\n\n/**\n * A finite box width for a text node. External SVG text carries\n * `UNBOUNDED_TEXT_WIDTH` — a wrap sentinel rather than a measurement — and\n * unpack has no text-measure context to replace it with a real one, so it\n * estimates from the longest line. Left alone, the sentinel would swamp the\n * file's union AABB and fit-clamp everything else to a speck.\n */\nfunction textBoxWidth(n: Extract<SvgNode, { kind: 'text' }>): number {\n if (n.width !== UNBOUNDED_TEXT_WIDTH) return n.width;\n const fontSize = resolveTextStyle(n.style).fontSize;\n const longest = n.text.split('\\n')\n .reduce((max, line) => Math.max(max, line.length), 0);\n return longest * fontSize * ESTIMATED_GLYPH_ADVANCE_EM;\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 return {\n ...data,\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/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","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 width: number;\n opacity?: number;\n /** `stroke-linecap`. Default per SVG spec is `'butt'`. */\n cap?: 'butt' | 'round' | 'square';\n /** `stroke-linejoin`. Default per SVG spec is `'miter'`. SVG's `arcs` / `miter-clip` map to `'miter'` with a warning. */\n join?: 'miter' | 'round' | 'bevel';\n /** `stroke-dasharray` as a flat number array. Odd-length inputs are doubled per SVG spec. */\n dash?: number[];\n /**\n * `stroke-miterlimit`. SVG's default is 4. Weasel's renderer defaults to\n * 10 (Canvas2D) when unset, so parsed strokes without an explicit\n * attribute may render with longer miters than the source SVG intended.\n */\n miterLimit?: number;\n /** `marker-start` / `marker-mid` / `marker-end`, as the bare `url(#id)` key. */\n markerStart?: string;\n markerMid?: string;\n markerEnd?: string;\n}\n\n/**\n * Leaf node: a path geometry plus fill/stroke. All other v1 shapes\n * (`<rect>`, `<ellipse>`, etc.) are lowered to this representation on\n * parse — `<rect>` uses weasel's `RectPath` fast-path subtype when\n * possible, everything else becomes a `PolygonPath`.\n */\nexport interface SvgPathNode {\n kind: 'path';\n path: Path;\n fill: SvgPaint;\n stroke?: SvgStroke;\n /** Element-level opacity (`opacity=\"...\"`), 0..1. */\n opacity?: number;\n /** Element-level rotation in **radians**, pivoting around the AABB\n * center of the underlying `path` geometry. Emitted as SVG\n * `transform=\"rotate(angleDegrees cx cy)\"`. */\n rotation?: number;\n /** Opaque per-element bag for declared namespaces. See `NamespaceMeta`. */\n meta?: NamespaceMeta;\n}\n\n/**\n * Group node: an SVG `<g>`. On parse, `transform` is always omitted (any\n * `transform` attribute is collapsed onto descendants' geometry). On\n * serialize, a non-identity `transform` is emitted as\n * `matrix(a b c d e f)`.\n */\nexport interface SvgGroupNode {\n kind: 'group';\n children: SvgNode[];\n transform?: Matrix;\n opacity?: number;\n /** Opaque per-element bag for declared namespaces. See `NamespaceMeta`. */\n meta?: NamespaceMeta;\n}\n\n/**\n * Width given to an external `<text>` that carries no `data-weasel-width`:\n * large enough that line wrapping never fires, since SVG text flows from a\n * baseline and the source says nothing about a box.\n *\n * It is a wrap sentinel, not a measurement. Anything that treats a text\n * node's width as geometry — a union AABB, a fit-clamp — has to recognize it\n * and substitute an estimate, or one text node swamps the whole file.\n */\nexport const UNBOUNDED_TEXT_WIDTH = 99999;\n\n/**\n * Text leaf node. Mirrors the kit's `TextPose` shape — a bounding box plus\n * text content, optional rich-text `runs` (per-range styling), and an\n * optional `TextStyle` for the node-wide defaults.\n *\n * Note on SVG text geometry: native `<text>` flows from a baseline; it\n * doesn't have width/height attributes. The serializer emits\n * `dominant-baseline=\"text-before-edge\"` so `y` is the top of the text\n * box, plus `data-weasel-width` / `data-weasel-height` so weasel's\n * explicit box dimensions round-trip losslessly. External SVG text\n * (lacking the data-* attrs) imports with estimated dimensions —\n * {@link UNBOUNDED_TEXT_WIDTH} and\n * `height = fontSize * lineHeight * (lineCount || 1)`.\n */\nexport interface SvgTextNode {\n kind: 'text';\n x: number;\n y: number;\n width: number;\n height: number;\n /** Plain text. When `runs` is set, `runsToPlainText(runs)` must equal `text`. */\n text: string;\n /** Optional per-range styling — same shape as `TextPose.runs`. */\n runs?: StyledRun[];\n /** Node-wide typography. Defaults applied at render time via `resolveTextStyle`. */\n style?: TextStyle;\n /**\n * Node-wide glyph paint, the `FillStyle` / `Stroke` a kit text node holds\n * in `data.fill` / `data.stroke`. Not `SvgPaint`, which is the path\n * nodes' shape — a text paint reaches the renderer through the runs, and\n * `StyledRun.fill` / `.stroke` override these per range.\n */\n fill?: FillStyle;\n stroke?: Stroke;\n /** Element-level opacity (`opacity=\"...\"`), 0..1. */\n opacity?: number;\n /** Element-level rotation in **radians**, pivoting around the unrotated\n * AABB center `(x + width/2, y + height/2)`. Emitted as SVG\n * `transform=\"rotate(angleDegrees cx cy)\"`. */\n rotation?: number;\n /** Opaque per-element bag for declared namespaces. See `NamespaceMeta`. */\n meta?: NamespaceMeta;\n}\n\n/**\n * Raster-image leaf — an SVG `<image>`. `href` is the element's `href` (or\n * legacy `xlink:href`) verbatim: an external URL or a `data:` URI. The\n * package neither fetches nor decodes it, so an external URL round-trips as\n * a reference and only resolves when something downstream loads it.\n *\n * SVG's `preserveAspectRatio` is not modeled; the box is taken literally.\n */\nexport interface SvgImageNode {\n kind: 'image';\n href: string;\n x: number;\n y: number;\n width: number;\n height: number;\n /** Element-level opacity (`opacity=\"...\"`), 0..1. */\n opacity?: number;\n /** Element-level rotation in **radians**, pivoting around the unrotated\n * AABB center `(x + width/2, y + height/2)`. Emitted as SVG\n * `transform=\"rotate(angleDegrees cx cy)\"`. */\n rotation?: number;\n /** Opaque per-element bag for declared namespaces. See `NamespaceMeta`. */\n meta?: NamespaceMeta;\n}\n\n/** Discriminated-union node — the leaf of the public tree. */\nexport type SvgNode = SvgPathNode | SvgGroupNode | SvgTextNode | SvgImageNode;\n\n/** Options for {@link parseSvg}. */\nexport interface ParseOptions {\n /**\n * Map of prefix → URI for XML namespaces the caller wants surfaced.\n * Attributes / child elements in any declared namespace are collected\n * into `SvgNode.meta` (per element) or `ParseResult.documentMeta` (root).\n * Undeclared namespaces are preserved in the DOM but not promoted into\n * the structured `meta` bag; they are silently dropped at serialize time.\n */\n namespaces?: Record<string, string>;\n}\n\n/** Output of {@link parseSvg}. */\nexport interface ParseResult {\n nodes: SvgNode[];\n /** Non-fatal notices (unsupported elements, unrecognized attributes). */\n warnings: string[];\n /**\n * Opaque per-document bag for declared namespaces. Holds root-level\n * namespaced attributes (`documentMeta.<prefix>.attrs`) and namespaced\n * root children (`documentMeta.<prefix>.elements`).\n */\n documentMeta?: NamespaceMeta;\n /** Root `viewBox` attribute, parsed from `\"x y width height\"`. */\n viewBox?: { x: number; y: number; width: number; height: number };\n /** Root `width` attribute, parsed as a unitless number when present. */\n width?: number;\n /** Root `height` attribute, parsed as a unitless number when present. */\n height?: number;\n /** Text content of the first `<title>` child of `<svg>`, when present. */\n title?: string;\n}\n\n/** Options for {@link serializeSvg}. */\nexport interface SerializeOptions {\n /**\n * Override the root `viewBox`. When omitted, the serializer computes\n * a tight bounding box from the supplied nodes.\n */\n viewBox?: { x: number; y: number; width: number; height: number };\n /**\n * Called for paint that can't be expressed in SVG and is dropped — a\n * conic gradient, or a pattern carrying a `TextureHandle` instead of a\n * `TilePatternSpec`. Without this the loss is silent.\n */\n onWarn?: (message: string) => void;\n /** Emit `width=\"...\"` on the root `<svg>`. */\n width?: number;\n /** Emit `height=\"...\"` on the root `<svg>`. */\n height?: number;\n /**\n * Emit `<title>...</title>` as the first child of the root `<svg>`. The\n * value is XML-escaped on output. Empty strings are skipped.\n */\n title?: string;\n /**\n * Map of prefix → URI for XML namespaces to declare on the root\n * `<svg>`. The serializer reads `documentMeta[prefix]` and\n * `node.meta[prefix]` to write the actual attributes and elements.\n */\n namespaces?: Record<string, string>;\n /**\n * Opaque per-document namespaced extras. Each `<prefix>.attrs` becomes\n * `<prefix>:<name>=\"...\"` attributes on the root `<svg>`. Each\n * `<prefix>.elements[localName]` becomes `<prefix>:<localName>...>`\n * children placed immediately before any geometry.\n */\n documentMeta?: NamespaceMeta;\n /** Pretty-print with newlines + indentation. Default `false`. */\n pretty?: boolean;\n}\n","/**\n * SVG transform attribute helpers. Parses the four primitive transform\n * functions weasel-svg supports (`matrix`, `translate`, `scale`, `rotate`)\n * into a single 2x3 affine matrix, and exposes the point/path mappers we\n * need to collapse `transform=` onto leaf geometry at parse time.\n */\n\nimport type { Matrix } from './types';\nimport { IDENTITY_MATRIX } from './types';\n\n/** Multiply two 2x3 affine matrices (a then b applied to a column vector). */\nexport function multiply(a: Matrix, b: Matrix): Matrix {\n // [a0 a2 a4] [b0 b2 b4]\n // [a1 a3 a5] [b1 b3 b5]\n return [\n a[0] * b[0] + a[2] * b[1],\n a[1] * b[0] + a[3] * b[1],\n a[0] * b[2] + a[2] * b[3],\n a[1] * b[2] + a[3] * b[3],\n a[0] * b[4] + a[2] * b[5] + a[4],\n a[1] * b[4] + a[3] * b[5] + a[5],\n ];\n}\n\n/** Apply a 2x3 affine to a 2D point. */\nexport function applyMatrix(m: Matrix, x: number, y: number): { x: number; y: number } {\n return { x: m[0] * x + m[2] * y + m[4], y: m[1] * x + m[3] * y + m[5] };\n}\n\n/** True if `m` is the identity within a small epsilon. */\nexport function isIdentity(m: Matrix, eps = 1e-9): boolean {\n return (\n Math.abs(m[0] - 1) < eps &&\n Math.abs(m[1]) < eps &&\n Math.abs(m[2]) < eps &&\n Math.abs(m[3] - 1) < eps &&\n Math.abs(m[4]) < eps &&\n Math.abs(m[5]) < eps\n );\n}\n\nconst NUM_RE = /[-+]?(?:\\d*\\.\\d+|\\d+\\.?)(?:[eE][-+]?\\d+)?/g;\n\nfunction readNumbers(s: string): number[] {\n const out: number[] = [];\n const matches = s.match(NUM_RE);\n if (!matches) return out;\n for (const m of matches) {\n const n = Number(m);\n if (Number.isFinite(n)) out.push(n);\n }\n return out;\n}\n\n/**\n * Parse an SVG `transform=\"...\"` string into a single 2x3 matrix.\n * Functions compose right-to-left in SVG's coordinate model: in\n * `transform=\"A B\"`, the rightmost function is applied first to a point's\n * local coordinates. We accumulate accordingly: `result = result * fn`.\n *\n * Unrecognized functions emit a warning via the optional callback and are\n * skipped (the rest of the transform list still applies).\n */\nexport function parseTransform(\n attr: string | null | undefined,\n onWarn?: (message: string) => void,\n): Matrix {\n if (!attr) return IDENTITY_MATRIX;\n let result: Matrix = IDENTITY_MATRIX;\n // Split into \"name(args)\" chunks.\n const fnRe = /([A-Za-z]+)\\s*\\(([^)]*)\\)/g;\n let match: RegExpExecArray | null;\n while ((match = fnRe.exec(attr)) !== null) {\n const name = match[1].toLowerCase();\n const nums = readNumbers(match[2]);\n let local: Matrix | null = null;\n if (name === 'matrix' && nums.length >= 6) {\n local = [nums[0], nums[1], nums[2], nums[3], nums[4], nums[5]];\n } else if (name === 'translate') {\n const tx = nums[0] ?? 0;\n const ty = nums[1] ?? 0;\n local = [1, 0, 0, 1, tx, ty];\n } else if (name === 'scale') {\n const sx = nums[0] ?? 1;\n const sy = nums.length >= 2 ? nums[1] : sx;\n local = [sx, 0, 0, sy, 0, 0];\n } else if (name === 'rotate') {\n const ang = ((nums[0] ?? 0) * Math.PI) / 180;\n const c = Math.cos(ang);\n const s = Math.sin(ang);\n const rot: Matrix = [c, s, -s, c, 0, 0];\n if (nums.length >= 3) {\n // rotate(angle, cx, cy) = translate(cx,cy) * rotate * translate(-cx,-cy)\n const cx = nums[1];\n const cy = nums[2];\n local = multiply(multiply([1, 0, 0, 1, cx, cy], rot), [1, 0, 0, 1, -cx, -cy]);\n } else {\n local = rot;\n }\n } else if (name === 'skewx' || name === 'skewy') {\n const ang = ((nums[0] ?? 0) * Math.PI) / 180;\n const t = Math.tan(ang);\n local = name === 'skewx' ? [1, 0, t, 1, 0, 0] : [1, t, 0, 1, 0, 0];\n } else {\n onWarn?.(`unsupported transform function: ${name}`);\n continue;\n }\n result = multiply(result, local);\n }\n return result;\n}\n\n/** Inverse of a 2x3 affine, or null when it is singular. */\nexport function invertMatrix(m: Matrix): Matrix | null {\n const det = m[0] * m[3] - m[1] * m[2];\n if (!Number.isFinite(det) || Math.abs(det) < 1e-12) return null;\n const a = m[3] / det, b = -m[1] / det, c = -m[2] / det, d = m[0] / det;\n return [a, b, c, d, -(a * m[4] + c * m[5]), -(b * m[4] + d * m[5])];\n}\n\n/**\n * Re-express an element's own `transform` in the frame its inherited `ctm`\n * maps into: `ctm * local * ctm⁻¹`.\n *\n * A leaf's geometry is baked through `ctm` at parse time, so its own\n * transform has to move with it. Decomposing the raw local matrix against\n * bounds that have already been through `ctm` compares two different\n * coordinate spaces, and a rotation inside a translated `<g>` fails to\n * decompose for no reason but the offset. A singular `ctm` has no inverse\n * and collapses the geometry anyway; the local matrix passes through.\n */\nexport function rebaseTransform(ctm: Matrix, local: Matrix): Matrix {\n const inv = invertMatrix(ctm);\n return inv ? multiply(multiply(ctm, local), inv) : local;\n}\n\n/** Try to factor `m` as \"rotation by theta about (cx, cy)\". Returns the\n * angle in radians when `m` is (within `eps`) a pure rotation about the\n * given pivot. Returns `null` otherwise.\n *\n * Pure rotation about (cx, cy) has the matrix form:\n * [ cos -sin cx - cx*cos + cy*sin ]\n * [ sin cos cy - cx*sin - cy*cos ]\n * i.e. m[0] = m[3] = cos, m[1] = -m[2] = sin, with a translation that\n * equals the pivot's \"rotate-then-translate-back\" residue. We reconstruct\n * theta from atan2(m[1], m[0]) and verify the rest.\n */\nexport function decomposeRotation(\n m: Matrix,\n cx: number,\n cy: number,\n eps = 1e-4,\n): number | null {\n const [a, b, c, d, e, f] = m;\n // Pure rotation requires a == d and b == -c.\n if (Math.abs(a - d) > eps) return null;\n if (Math.abs(b + c) > eps) return null;\n // Determinant must be 1 (no scale, no flip).\n const det = a * d - b * c;\n if (Math.abs(det - 1) > eps) return null;\n const theta = Math.atan2(b, a);\n // Verify translation = (cx - cx*cos + cy*sin, cy - cx*sin - cy*cos).\n const expectedE = cx - cx * a + cy * b;\n const expectedF = cy - cx * b - cy * a;\n if (Math.abs(e - expectedE) > eps) return null;\n if (Math.abs(f - expectedF) > eps) return null;\n return theta;\n}\n\n/** Best-effort rotational-component extraction for a general matrix (any\n * scale + rotation, ignoring translation). Used for parse-time warnings\n * on un-decomposable matrices: we can detect \"there is a rotation here\"\n * even if we won't preserve it as `node.rotation`. For a non-uniform\n * matrix the \"rotation\" is ambiguous; we report atan2(b, a) which\n * corresponds to where the +x basis vector points.\n */\nexport function rotationComponent(m: Matrix): number {\n return Math.atan2(m[1], m[0]);\n}\n\n/**\n * Format a matrix as an SVG `matrix(a b c d e f)` value. Returns `null`\n * when `m` is (effectively) the identity, so the caller can omit the\n * attribute entirely.\n */\nexport function formatMatrix(m: Matrix): string | null {\n if (isIdentity(m)) return null;\n return `matrix(${m.map((n) => trimNumber(n)).join(' ')})`;\n}\n\n/** Trim trailing zeros from a numeric value for compact SVG output. */\nexport function trimNumber(n: number): string {\n if (!Number.isFinite(n)) return '0';\n // Round to ~6 decimal places to avoid floating-point cruft.\n const r = Math.round(n * 1e6) / 1e6;\n if (Number.isInteger(r)) return String(r);\n return String(r);\n}\n","/**\n * 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","/**\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, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"');\n}\n","/**\n * Serialize a weasel `Path` to an SVG `d=` attribute string. `RectPath`\n * lowers to `M h v h Z`; `PolygonPath` walks the (commands, coords)\n * arrays, emitting one SVG command per kit command.\n *\n * Output uses absolute commands only and a small amount of whitespace\n * compression (no leading zeros stripped beyond what `Number.toString`\n * already does). Numbers are rounded to ~6 decimals via `trimNumber`.\n */\n\nimport {\n PATH_C, PATH_L, PATH_M, PATH_Q, PATH_Z,\n type Path,\n} from '@weasel-js/core';\nimport { trimNumber } from './transform';\n\n/** Serialize a weasel `Path` to an SVG `d=` attribute string. */\nexport function serializePathD(path: Path): string {\n if (path.kind === 'rect') {\n const { x, y, width, height } = path;\n return `M${trimNumber(x)} ${trimNumber(y)}h${trimNumber(width)}v${trimNumber(height)}h${trimNumber(-width)}Z`;\n }\n const cmds = path.commands;\n const xs = path.coords;\n const out: string[] = [];\n let ci = 0;\n for (let i = 0; i < cmds.length; i++) {\n const c = cmds[i];\n if (c === PATH_M) {\n out.push(`M${trimNumber(xs[ci])} ${trimNumber(xs[ci + 1])}`);\n ci += 2;\n } else if (c === PATH_L) {\n out.push(`L${trimNumber(xs[ci])} ${trimNumber(xs[ci + 1])}`);\n ci += 2;\n } else if (c === PATH_C) {\n out.push(\n `C${trimNumber(xs[ci])} ${trimNumber(xs[ci + 1])} ` +\n `${trimNumber(xs[ci + 2])} ${trimNumber(xs[ci + 3])} ` +\n `${trimNumber(xs[ci + 4])} ${trimNumber(xs[ci + 5])}`,\n );\n ci += 6;\n } else if (c === PATH_Q) {\n out.push(\n `Q${trimNumber(xs[ci])} ${trimNumber(xs[ci + 1])} ` +\n `${trimNumber(xs[ci + 2])} ${trimNumber(xs[ci + 3])}`,\n );\n ci += 4;\n } else if (c === PATH_Z) {\n out.push('Z');\n }\n }\n return out.join('');\n}\n","/**\n * Map between SVG `<linearGradient>` / `<radialGradient>` elements and\n * weasel's `FillStyle` gradient variants. Definitions are indexed by id\n * wherever in the document they appear, and looked up when a `fill` /\n * `stroke` attribute references one as `url(#id)`. On serialize, we\n * emit a fresh `<defs>` block with stable generated ids.\n */\n\nimport { getPaintKind, getMarker } from '@weasel-js/core';\nimport type { FillStyle, GradStop, GradientUnits, MarkerEntry } from '@weasel-js/core';\nimport { parsePaintAttr } from './color';\nimport { trimNumber } from './transform';\nimport { patternXml } from './patterns';\nimport { collectElementsByTag, type ElementTable } from './elements';\nimport { serializePathD } from './path-serializer';\n\n/** Collected gradient definitions, keyed by element id. */\nexport type GradientTable = Map<string, FillStyle>;\n\nconst GRADIENT_TAGS = new Set(['lineargradient', 'radialgradient']);\n\nconst XLINK_NS = 'http://www.w3.org/1999/xlink';\n\n/** Read every gradient definition in the document, keyed by element id. */\nexport function collectGradients(svg: Element, onWarn?: (m: string) => void): GradientTable {\n const out: GradientTable = new Map();\n const elements = collectElementsByTag(svg, GRADIENT_TAGS);\n for (const [id, el] of elements) {\n const paint = el.tagName.toLowerCase() === 'lineargradient'\n ? readLinearGradient(el, elements, onWarn)\n : readRadialGradient(el, elements, onWarn);\n if (paint) out.set(id, paint);\n }\n warnUnsupportedDefsChildren(svg, onWarn);\n return out;\n}\n\n/** Paint servers and `<marker>` aside, a `<defs>` child is something this\n * package does not model (`<clipPath>`, a `<use>` template). Say so once here. */\nfunction warnUnsupportedDefsChildren(svg: Element, onWarn?: (m: string) => void): void {\n if (!onWarn) return;\n const defs = svg.getElementsByTagName('defs');\n for (let d = 0; d < defs.length; d++) {\n const root = defs[d];\n for (let i = 0; i < root.children.length; i++) {\n const child = root.children[i];\n const tag = child.tagName.toLowerCase();\n if (GRADIENT_TAGS.has(tag) || tag === 'pattern' || tag === 'marker') continue;\n onWarn(`unsupported <defs> child: <${child.tagName}>`);\n }\n }\n}\n\n/**\n * The gradient a `href` / `xlink:href` attribute points at, or null. SVG lets\n * one gradient inherit another's stops and attributes this way, and authoring\n * tools lean on it heavily — a chain that isn't followed resolves to a\n * gradient with no stops, which paints nothing.\n */\nfunction hrefTarget(el: Element, elements: ElementTable): Element | null {\n const raw = el.getAttribute('href')\n ?? el.getAttributeNS(XLINK_NS, 'href')\n ?? el.getAttribute('xlink:href');\n if (!raw || !raw.startsWith('#')) return null;\n return elements.get(raw.slice(1)) ?? null;\n}\n\n/** An attribute's value on `el` or, when absent, on the gradient it inherits\n * from. `seen` breaks a reference cycle. */\nfunction inheritedAttr(\n el: Element, elements: ElementTable, name: string, seen: Set<Element> = new Set(),\n): string | null {\n if (el.hasAttribute(name)) return el.getAttribute(name);\n seen.add(el);\n const ref = hrefTarget(el, elements);\n if (!ref || seen.has(ref)) return null;\n return inheritedAttr(ref, elements, name, seen);\n}\n\n/** `el`'s own stops or, when it declares none, the stops it inherits. */\nfunction inheritedStops(\n el: Element, elements: ElementTable, onWarn?: (m: string) => void,\n seen: Set<Element> = new Set(),\n): GradStop[] {\n const own = readStops(el, onWarn);\n if (own.length > 0) return own;\n seen.add(el);\n const ref = hrefTarget(el, elements);\n if (!ref || seen.has(ref)) return own;\n return inheritedStops(ref, elements, onWarn, seen);\n}\n\n/** Parse a `stop-opacity` / offset value that may carry a `%` suffix. */\nfunction parseRatio(raw: string): number {\n const n = parseFloat(raw);\n if (!Number.isFinite(n)) return NaN;\n return raw.trimEnd().endsWith('%') ? n / 100 : n;\n}\n\nfunction readStops(el: Element, onWarn?: (m: string) => void): GradStop[] {\n const stops: GradStop[] = [];\n for (let i = 0; i < el.children.length; i++) {\n const c = el.children[i];\n if (c.tagName.toLowerCase() !== 'stop') continue;\n const offsetRaw = parseRatio(c.getAttribute('offset') ?? '0');\n const offset = Number.isFinite(offsetRaw) ? offsetRaw : 0;\n const colorAttr = c.getAttribute('stop-color') ?? '#000000';\n const parsed = parsePaintAttr(colorAttr);\n if (parsed && parsed.kind === 'solid') {\n const opacityAttr = c.getAttribute('stop-opacity');\n const own = opacityAttr != null ? parseRatio(opacityAttr) : NaN;\n const alpha = Number.isFinite(own) ? own : parsed.alpha;\n stops.push({ offset, color: alpha < 1 ? applyAlpha(parsed.color, alpha) : parsed.color });\n } else {\n onWarn?.(`gradient stop has unrecognized stop-color: ${colorAttr}`);\n stops.push({ offset, color: '#000000' });\n }\n }\n return stops;\n}\n\nfunction applyAlpha(hex: string, alpha: number): string {\n // Pack alpha into an 8-digit hex so it round-trips through weasel's\n // string-color storage. This is non-standard CSS hex but parses cleanly\n // back via our color.ts parser.\n const a = Math.max(0, Math.min(255, Math.round(alpha * 255)));\n return `${hex}${a.toString(16).padStart(2, '0')}`;\n}\n\n/** SVG `gradientUnits` → the kit's `GradientUnits`. SVG's default is\n * `objectBoundingBox`, which is what the attribute defaults above assume\n * (`x2=\"1\"`, `r=\"0.5\"`), so the two have to be read together. */\nfunction readGradientUnits(el: Element, elements: ElementTable): 'bounds' | 'world' {\n return inheritedAttr(el, elements, 'gradientUnits') === 'userSpaceOnUse' ? 'world' : 'bounds';\n}\n\n/** `gradientTransform` has no slot in the kit's gradient model, so a gradient\n * carrying one paints in the wrong place rather than not at all. */\nfunction warnGradientTransform(\n el: Element, elements: ElementTable, onWarn?: (m: string) => void,\n): void {\n const t = inheritedAttr(el, elements, 'gradientTransform');\n if (t != null && t.trim() !== '') {\n onWarn?.(`gradientTransform=\"${t}\" is not modeled; the gradient paints untransformed`);\n }\n}\n\nfunction num(raw: string | null, fallback: number): number {\n if (raw == null) return fallback;\n const n = parseRatio(raw);\n return Number.isFinite(n) ? n : fallback;\n}\n\nfunction readLinearGradient(\n el: Element, elements: ElementTable, onWarn?: (m: string) => void,\n): FillStyle | null {\n warnGradientTransform(el, elements, onWarn);\n return {\n fill: 'linear-gradient',\n from: {\n x: num(inheritedAttr(el, elements, 'x1'), 0),\n y: num(inheritedAttr(el, elements, 'y1'), 0),\n },\n to: {\n x: num(inheritedAttr(el, elements, 'x2'), 1),\n y: num(inheritedAttr(el, elements, 'y2'), 0),\n },\n stops: inheritedStops(el, elements, onWarn),\n units: readGradientUnits(el, elements),\n };\n}\n\nfunction readRadialGradient(\n el: Element, elements: ElementTable, onWarn?: (m: string) => void,\n): FillStyle | null {\n warnGradientTransform(el, elements, onWarn);\n return {\n fill: 'radial-gradient',\n center: {\n x: num(inheritedAttr(el, elements, 'cx'), 0.5),\n y: num(inheritedAttr(el, elements, 'cy'), 0.5),\n },\n radius: num(inheritedAttr(el, elements, 'r'), 0.5),\n stops: inheritedStops(el, elements, onWarn),\n units: readGradientUnits(el, elements),\n };\n}\n\n/**\n * Pre-pass that assigns stable serialization ids to the paint servers —\n * gradients and patterns — used by any leaf in the tree. We key on object\n * identity so two leaves sharing the exact same `FillStyle` reference reuse\n * one `<defs>` entry; structurally equal but distinct objects get separate\n * ids.\n */\nexport class PaintServerRegistry {\n private byPaint = new Map<FillStyle, string>();\n private order: FillStyle[] = [];\n private counter = 0;\n\n // Marker keys referenced by any stroke, in first-use order. The `<defs>`\n // id is the marker key itself, not a minted counter id: `parseSvg` reads a\n // `marker-end=\"url(#id)\"` fragment back as the marker key directly (it\n // never inspects the `<marker>` element), so a synthetic id would come\n // back unresolvable and warn on round-trip.\n private markerKeys: string[] = [];\n private markerKeySet = new Set<string>();\n\n register(paint: FillStyle): string {\n const existing = this.byPaint.get(paint);\n if (existing) return existing;\n const id = paint.fill === 'pattern' ? `pat${this.counter++}` : `grad${this.counter++}`;\n this.byPaint.set(paint, id);\n this.order.push(paint);\n return id;\n }\n\n /** The `<defs>` id for a marker key — the key itself, minting nothing.\n * `undefined` when nothing is registered under `key`, so a caller emits no\n * attribute at all rather than a `url(#…)` pointing at a def that will\n * never be written. */\n markerId(key: string): string | undefined {\n if (getMarker(key) === undefined) return undefined;\n if (!this.markerKeySet.has(key)) {\n this.markerKeySet.add(key);\n this.markerKeys.push(key);\n }\n return key;\n }\n\n /** Emit `<defs>...</defs>` XML for every registered paint server and marker. */\n toDefsXml(onWarn?: (m: string) => void): string {\n if (this.order.length === 0 && this.markerKeys.length === 0) return '';\n const parts: string[] = ['<defs>'];\n for (const paint of this.order) {\n parts.push(paintServerXml(this.byPaint.get(paint)!, paint, onWarn));\n }\n for (const key of this.markerKeys) {\n const entry = getMarker(key);\n if (!entry) continue;\n parts.push(entry.toSvg ? entry.toSvg(key, entry) : defaultMarkerXml(key, entry));\n }\n parts.push('</defs>');\n return parts.join('');\n }\n}\n\n/** The `<marker>` def for an entry with no `toSvg` of its own. */\nfunction defaultMarkerXml(id: string, entry: MarkerEntry): string {\n const path = entry.path({ size: 1, stroke: { paint: { fill: 'solid', color: '#000' } } });\n const d = serializePathD(path);\n const fill = entry.fill === 'none' ? 'none' : 'context-stroke';\n const outline = entry.outline\n ? ` stroke=\"context-stroke\" stroke-width=\"${entry.outline.width}\" stroke-linecap=\"round\" stroke-linejoin=\"round\"`\n : '';\n // `overflow=\"visible\"` overrides the UA default of `hidden`, which would\n // otherwise clip the arrowhead to the marker's viewport.\n return (\n `<marker id=\"${id}\" markerUnits=\"strokeWidth\" markerWidth=\"8\" markerHeight=\"8\"` +\n ` refX=\"0\" refY=\"0\" orient=\"auto\" overflow=\"visible\">` +\n `<path d=\"${d}\" fill=\"${fill}\"${outline}/></marker>`\n );\n}\n\n/** One paint server's `<defs>` entry: the built-in mapping, else the kind's\n * own `toSvg`, else nothing plus a warning. The referencing element already\n * carries `fill=\"url(#id)\"`, so a silent omission is a dangling reference and\n * the shape vanishes in a viewer. */\nfunction paintServerXml(id: string, paint: FillStyle, onWarn?: (m: string) => void): string {\n if (paint.fill === 'pattern') return patternXml(id, paint, onWarn);\n const builtin = gradientXml(id, paint);\n if (builtin) return builtin;\n const custom = getPaintKind(paint.fill)?.toSvg?.(id, paint);\n if (custom) return custom;\n onWarn?.(`${paint.fill} fill has no vector form — omitted from <defs>`);\n return '';\n}\n\n/** `GradientUnits` → SVG `gradientUnits`. `'screen'` (the kit's default, and\n * a viewport-fixed wash) has no SVG analog at all; it lowers to user space,\n * which at least puts the paint somewhere the geometry is. */\nfunction gradientUnitsAttr(units: GradientUnits | undefined): string {\n return units === 'bounds' ? 'objectBoundingBox' : 'userSpaceOnUse';\n}\n\nfunction gradientXml(id: string, paint: FillStyle): string {\n if (paint.fill === 'linear-gradient') {\n const stops = paint.stops.map(stopXml).join('');\n return (\n `<linearGradient id=\"${id}\" gradientUnits=\"${gradientUnitsAttr(paint.units)}\" ` +\n `x1=\"${trimNumber(paint.from.x)}\" y1=\"${trimNumber(paint.from.y)}\" ` +\n `x2=\"${trimNumber(paint.to.x)}\" y2=\"${trimNumber(paint.to.y)}\">${stops}</linearGradient>`\n );\n }\n if (paint.fill === 'radial-gradient') {\n const stops = paint.stops.map(stopXml).join('');\n return (\n `<radialGradient id=\"${id}\" gradientUnits=\"${gradientUnitsAttr(paint.units)}\" ` +\n `cx=\"${trimNumber(paint.center.x)}\" cy=\"${trimNumber(paint.center.y)}\" ` +\n `r=\"${trimNumber(paint.radius)}\">${stops}</radialGradient>`\n );\n }\n return '';\n}\n\nfunction stopXml(s: GradStop): string {\n // Detect packed-alpha hex (#rrggbbaa) and split out stop-opacity.\n const m = /^#([0-9a-f]{6})([0-9a-f]{2})$/i.exec(s.color);\n if (m) {\n const alpha = parseInt(m[2], 16) / 255;\n return `<stop offset=\"${trimNumber(s.offset)}\" stop-color=\"#${m[1].toLowerCase()}\" stop-opacity=\"${trimNumber(alpha)}\"/>`;\n }\n return `<stop offset=\"${trimNumber(s.offset)}\" stop-color=\"${s.color}\"/>`;\n}\n","/**\n * 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 } from '@weasel-js/core';\nimport { IDENTITY_MATRIX, UNBOUNDED_TEXT_WIDTH } from './types';\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 = decomposeRotation(worldLocal, cx, cy);\n 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);\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): 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 width = inheritedWidth != null ? parseFloat(inheritedWidth) : 1;\n const stroke: SvgStroke = { paint, width };\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\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 = decomposeRotation(worldLocal, cx, cy);\n 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\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);\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 // Estimate dimensions: data-weasel-* attrs win, else heuristic.\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 : UNBOUNDED_TEXT_WIDTH;\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,\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 (Object.keys(textStyle).length > 0) node.style = textStyle;\n if (textPaint.fill != null) 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 = decomposeRotation(worldLocal, cx, cy);\n 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));\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): 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 }\n // parsed.kind === 'none' → leave fill undefined (defaults to black downstream).\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));\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, resolveStrokeWidth, SCRIPT_METRICS } from '@weasel-js/core';\nimport type {\n Matrix, NamespaceMeta, NamespacedElement, SerializeOptions, SvgGroupNode,\n SvgNode, SvgPaint, SvgPathNode, SvgStroke, SvgTextNode, SvgImageNode,\n} from './types';\nimport { IDENTITY_MATRIX } from './types';\nimport { serializePathD } from './path-serializer';\nimport { formatMatrix, multiply, trimNumber } from './transform';\nimport { PaintServerRegistry } from './gradients';\n\n/**\n * Walk the tree and produce an SVG document string. The root `<svg>`'s\n * `viewBox` is taken from `opts.viewBox` if supplied, otherwise computed\n * as a tight bounding box around every leaf.\n */\nexport function serializeSvg(nodes: SvgNode[], opts: SerializeOptions = {}): string {\n const registry = new PaintServerRegistry();\n registerPaintServers(nodes, registry);\n\n const bounds = opts.viewBox ?? computeBounds(nodes);\n const vb = `${trimNumber(bounds.x)} ${trimNumber(bounds.y)} ${trimNumber(bounds.width)} ${trimNumber(bounds.height)}`;\n const namespaces = opts.namespaces ?? {};\n\n const rootAttrs: string[] = [`xmlns=\"http://www.w3.org/2000/svg\"`];\n for (const [prefix, uri] of Object.entries(namespaces)) {\n rootAttrs.push(`xmlns:${prefix}=\"${escapeAttr(uri)}\"`);\n }\n rootAttrs.push(`viewBox=\"${vb}\"`);\n if (opts.width != null) rootAttrs.push(`width=\"${trimNumber(opts.width)}\"`);\n if (opts.height != null) rootAttrs.push(`height=\"${trimNumber(opts.height)}\"`);\n // documentMeta attrs onto the root, in declared-namespace order.\n if (opts.documentMeta) {\n for (const prefix of Object.keys(namespaces)) {\n const bucket = opts.documentMeta[prefix];\n if (!bucket?.attrs) continue;\n for (const [name, value] of Object.entries(bucket.attrs)) {\n rootAttrs.push(`${prefix}:${name}=\"${escapeAttr(value)}\"`);\n }\n }\n }\n\n // documentMeta elements after <defs>, before geometry body.\n let docMetaXml = '';\n if (opts.documentMeta) {\n for (const prefix of Object.keys(namespaces)) {\n const bucket = opts.documentMeta[prefix];\n if (!bucket?.elements) continue;\n for (const [localName, list] of Object.entries(bucket.elements)) {\n for (const el of list) docMetaXml += namespacedElementXml(prefix, localName, el);\n }\n }\n }\n\n const defsXml = registry.toDefsXml(opts.onWarn);\n const bodyXml = nodes.map((n) => nodeXml(n, registry, namespaces)).join('');\n\n // `<title>` goes immediately inside `<svg>` per SVG-spec convention; it's\n // an accessibility hook and (for our purposes) a stable place to round-trip\n // the user-visible document title.\n const titleXml = opts.title && opts.title.length > 0\n ? `<title>${escapeText(opts.title)}</title>`\n : '';\n\n return `<svg ${rootAttrs.join(' ')}>${titleXml}${defsXml}${docMetaXml}${bodyXml}</svg>`;\n}\n\nfunction namespacedElementXml(prefix: string, localName: string, el: NamespacedElement): string {\n const attrs: string[] = [];\n for (const [name, value] of Object.entries(el.attrs)) {\n attrs.push(`${name}=\"${escapeAttr(value)}\"`);\n }\n const head = attrs.length > 0 ? `<${prefix}:${localName} ${attrs.join(' ')}>` : `<${prefix}:${localName}>`;\n let body = '';\n if (el.children) {\n for (const [childName, list] of Object.entries(el.children)) {\n for (const child of list) body += namespacedElementXml(prefix, childName, child);\n }\n } else if (el.text != null) {\n body = escapeText(el.text);\n }\n return `${head}${body}</${prefix}:${localName}>`;\n}\n\nfunction metaAttrsXml(meta: NamespaceMeta | undefined, namespaces: Record<string, string>): string {\n if (!meta) return '';\n const parts: string[] = [];\n for (const prefix of Object.keys(namespaces)) {\n const bucket = meta[prefix];\n if (!bucket?.attrs) continue;\n for (const [name, value] of Object.entries(bucket.attrs)) {\n parts.push(`${prefix}:${name}=\"${escapeAttr(value)}\"`);\n }\n }\n return parts.length > 0 ? ` ${parts.join(' ')}` : '';\n}\n\nfunction metaElementsXml(meta: NamespaceMeta | undefined, namespaces: Record<string, string>): string {\n if (!meta) return '';\n let out = '';\n for (const prefix of Object.keys(namespaces)) {\n const bucket = meta[prefix];\n if (!bucket?.elements) continue;\n for (const [localName, list] of Object.entries(bucket.elements)) {\n for (const el of list) out += namespacedElementXml(prefix, localName, el);\n }\n }\n return out;\n}\n\nfunction registerPaintServers(nodes: SvgNode[], registry: PaintServerRegistry): void {\n for (const n of nodes) {\n if (n.kind === 'group') {\n registerPaintServers(n.children, registry);\n } else if (n.kind === 'path') {\n if (n.fill.kind === 'gradient') registry.register(n.fill.paint);\n if (n.stroke && n.stroke.paint.kind === 'gradient') registry.register(n.stroke.paint.paint);\n registerMarkers(n.stroke, registry);\n } else if (n.kind === 'text') {\n // Text paints flow through `style` / `runs` rather than a top-level\n // SvgPaint, so register direct FillStyle references when present. This\n // pre-pass is load-bearing: `<defs>` is emitted before the body, so a\n // paint first seen while writing an element would be referenced by an\n // id that no definition backs.\n registerTextPaint(n.fill, registry);\n registerTextPaint(n.stroke?.paint, registry);\n registerMarkers(n.stroke, registry);\n for (const run of n.runs ?? []) {\n registerTextPaint(run.fill, registry);\n registerTextPaint(run.stroke?.paint, registry);\n }\n }\n }\n}\n\n/** Register one text paint if it is a paint server rather than a colour. */\nfunction registerTextPaint(\n paint: import('@weasel-js/core').FillStyle | undefined,\n registry: PaintServerRegistry,\n): void {\n if (paint && !('color' in paint)) registry.register(paint);\n}\n\n/** A marker reference in either shape — `SvgStroke` stores a bare key, the kit\n * `Stroke` stores a `MarkerRef`. */\nfunction markerKeyOfRef(ref: unknown): string | undefined {\n if (typeof ref === 'string') return ref;\n if (ref && typeof ref === 'object' && 'key' in ref) return String((ref as { key: string }).key);\n return undefined;\n}\n\n/** Mint a `<defs>` id for every marker a stroke names, before the body is\n * written — same reason as the paint pre-pass above. */\nfunction registerMarkers(\n stroke: { markerStart?: unknown; markerMid?: unknown; markerEnd?: unknown } | undefined,\n registry: PaintServerRegistry,\n): void {\n if (!stroke) return;\n for (const ref of [stroke.markerStart, stroke.markerMid, stroke.markerEnd]) {\n const key = markerKeyOfRef(ref);\n if (key) registry.markerId(key);\n }\n}\n\nfunction nodeXml(node: SvgNode, registry: PaintServerRegistry, namespaces: Record<string, string>): string {\n if (node.kind === 'group') return groupXml(node, registry, namespaces);\n if (node.kind === 'text') return textXml(node, registry, namespaces);\n if (node.kind === 'image') return imageXml(node, namespaces);\n return pathXml(node, registry, namespaces);\n}\n\n/**\n * Emit an `<image>`. `preserveAspectRatio=\"none\"` is unconditional: the node\n * carries a literal box and nothing else, so letting a viewer letterbox it\n * would place the pixels somewhere the model never said.\n */\nfunction imageXml(node: SvgImageNode, namespaces: Record<string, string>): string {\n const attrs: string[] = [\n `href=\"${escapeAttr(node.href)}\"`,\n `x=\"${trimNumber(node.x)}\"`,\n `y=\"${trimNumber(node.y)}\"`,\n `width=\"${trimNumber(node.width)}\"`,\n `height=\"${trimNumber(node.height)}\"`,\n `preserveAspectRatio=\"none\"`,\n ];\n if (node.opacity != null && node.opacity !== 1) {\n attrs.push(`opacity=\"${trimNumber(node.opacity)}\"`);\n }\n if (node.rotation != null && node.rotation !== 0) {\n const cx = node.x + node.width / 2;\n const cy = node.y + node.height / 2;\n const deg = (node.rotation * 180) / Math.PI;\n attrs.push(`transform=\"rotate(${trimNumber(deg)} ${trimNumber(cx)} ${trimNumber(cy)})\"`);\n }\n const metaAttrs = metaAttrsXml(node.meta, namespaces);\n const metaEls = metaElementsXml(node.meta, namespaces);\n if (metaEls) return `<image ${attrs.join(' ')}${metaAttrs}>${metaEls}</image>`;\n return `<image ${attrs.join(' ')}${metaAttrs}/>`;\n}\n\nfunction groupXml(node: SvgGroupNode, registry: PaintServerRegistry, namespaces: Record<string, string>): string {\n const attrs: string[] = [];\n if (node.transform) {\n const m = formatMatrix(node.transform);\n if (m) attrs.push(`transform=\"${m}\"`);\n }\n if (node.opacity != null && node.opacity !== 1) {\n attrs.push(`opacity=\"${trimNumber(node.opacity)}\"`);\n }\n const metaAttrs = metaAttrsXml(node.meta, namespaces);\n // `metaAttrs` already starts with a leading space (or is empty), so we\n // can splice it after the existing attr list without extra logic.\n const head = attrs.length > 0\n ? `<g ${attrs.join(' ')}${metaAttrs}>`\n : `<g${metaAttrs}>`;\n const body = node.children.map((c) => nodeXml(c, registry, namespaces)).join('');\n return `${head}${body}${metaElementsXml(node.meta, namespaces)}</g>`;\n}\n\nfunction pathXml(node: SvgPathNode, registry: PaintServerRegistry, namespaces: Record<string, string>): string {\n const attrs: string[] = [`d=\"${serializePathD(node.path)}\"`];\n const fillAttrs = paintAttrs(node.fill, 'fill', registry);\n for (const a of fillAttrs) attrs.push(a);\n // Emit fill-rule only when it diverges from SVG's default ('nonzero').\n // RectPath has no fillRule field — only PolygonPath carries one.\n if (node.path.kind === 'polygon' && node.path.fillRule === 'evenodd') {\n attrs.push(`fill-rule=\"evenodd\"`);\n }\n if (node.stroke) {\n const strokeAttrs = strokeAttrsFor(node.stroke, registry);\n for (const a of strokeAttrs) attrs.push(a);\n } else {\n attrs.push('stroke=\"none\"');\n }\n if (node.opacity != null && node.opacity !== 1) {\n attrs.push(`opacity=\"${trimNumber(node.opacity)}\"`);\n }\n if (node.rotation != null && node.rotation !== 0) {\n const b = pathBounds(node.path);\n const cx = b.minX + (b.maxX - b.minX) / 2;\n const cy = b.minY + (b.maxY - b.minY) / 2;\n const deg = (node.rotation * 180) / Math.PI;\n attrs.push(`transform=\"rotate(${trimNumber(deg)} ${trimNumber(cx)} ${trimNumber(cy)})\"`);\n }\n const metaAttrs = metaAttrsXml(node.meta, namespaces);\n const metaEls = metaElementsXml(node.meta, namespaces);\n if (metaEls) {\n return `<path ${attrs.join(' ')}${metaAttrs}>${metaEls}</path>`;\n }\n return `<path ${attrs.join(' ')}${metaAttrs}/>`;\n}\n\nfunction paintAttrs(\n paint: SvgPaint,\n name: 'fill' | 'stroke',\n registry: PaintServerRegistry,\n includeOpacity = true,\n): string[] {\n if (paint.kind === 'none') return [`${name}=\"none\"`];\n if (paint.kind === 'solid') {\n const out = [`${name}=\"${paint.color}\"`];\n if (includeOpacity && paint.opacity != null && paint.opacity !== 1) {\n out.push(`${name}-opacity=\"${trimNumber(paint.opacity)}\"`);\n }\n return out;\n }\n // gradient\n const id = registry.register(paint.paint);\n return [`${name}=\"url(#${id})\"`];\n}\n\n/**\n * Attributes for a kit `Stroke` — the shape text carries, whose `paint` is a\n * `FillStyle` rather than an `SvgPaint`. Text strokes ride inside\n * `TextStyle` / `StyledRun` rather than as a node-level `SvgStroke`, because\n * that is where the kit's text model puts them.\n *\n * Absent, or zero-width, emits nothing at all: unstroked text should not\n * carry a `stroke` attribute, and SVG's own default (`none`) already says so.\n */\nfunction coreStrokeAttrs(stroke: Stroke | undefined, registry: PaintServerRegistry): string[] {\n if (!stroke) return [];\n // SVG has no accumulated-transform scale to resolve a `{ px }` width\n // against; its number is emitted as-is.\n const width = resolveStrokeWidth(stroke.width ?? 1, 1);\n if (!(width > 0)) return [];\n const attrs: string[] = [];\n if ('color' in stroke.paint) {\n attrs.push(`stroke=\"${stroke.paint.color}\"`);\n if (stroke.paint.opacity != null && stroke.paint.opacity !== 1) {\n attrs.push(`stroke-opacity=\"${trimNumber(stroke.paint.opacity)}\"`);\n }\n } else {\n attrs.push(`stroke=\"url(#${registry.register(stroke.paint)})\"`);\n }\n attrs.push(`stroke-width=\"${trimNumber(width)}\"`);\n if (stroke.cap) attrs.push(`stroke-linecap=\"${stroke.cap}\"`);\n if (stroke.join) attrs.push(`stroke-linejoin=\"${stroke.join}\"`);\n if (stroke.dash && stroke.dash.length > 0) {\n attrs.push(`stroke-dasharray=\"${stroke.dash.map(trimNumber).join(' ')}\"`);\n }\n if (stroke.miterLimit != null) attrs.push(`stroke-miterlimit=\"${trimNumber(stroke.miterLimit)}\"`);\n for (const [field, attr] of [\n ['markerStart', 'marker-start'],\n ['markerMid', 'marker-mid'],\n ['markerEnd', 'marker-end'],\n ] as const) {\n const ref = stroke[field];\n if (ref === undefined) continue;\n const key = typeof ref === 'string' ? ref : ref.key;\n const id = registry.markerId(key);\n if (id === undefined) continue;\n attrs.push(`${attr}=\"url(#${id})\"`);\n }\n return attrs;\n}\n\nfunction strokeAttrsFor(stroke: SvgStroke, registry: PaintServerRegistry): string[] {\n // `SvgStroke.opacity` and the paint's own `opacity` are two models of one\n // SVG attribute, and parse fills in both. Emitting each would write\n // `stroke-opacity` twice, which is not well-formed XML at all.\n const attrs = paintAttrs(stroke.paint, 'stroke', registry, false);\n attrs.push(`stroke-width=\"${trimNumber(stroke.width)}\"`);\n const opacity = stroke.opacity\n ?? (stroke.paint.kind === 'solid' ? stroke.paint.opacity : undefined);\n if (opacity != null && opacity !== 1) {\n attrs.push(`stroke-opacity=\"${trimNumber(opacity)}\"`);\n }\n if (stroke.cap) {\n attrs.push(`stroke-linecap=\"${stroke.cap}\"`);\n }\n if (stroke.join) {\n attrs.push(`stroke-linejoin=\"${stroke.join}\"`);\n }\n if (stroke.dash && stroke.dash.length > 0) {\n attrs.push(`stroke-dasharray=\"${stroke.dash.map(trimNumber).join(' ')}\"`);\n }\n if (stroke.miterLimit != null) {\n attrs.push(`stroke-miterlimit=\"${trimNumber(stroke.miterLimit)}\"`);\n }\n for (const [field, attr] of [\n ['markerStart', 'marker-start'],\n ['markerMid', 'marker-mid'],\n ['markerEnd', 'marker-end'],\n ] as const) {\n const ref = stroke[field];\n if (ref === undefined) continue;\n const id = registry.markerId(ref);\n if (id === undefined) continue;\n attrs.push(`${attr}=\"url(#${id})\"`);\n }\n return attrs;\n}\n\n/**\n * Tight bounding box around everything the tree draws, in the root's\n * coordinates — the fallback `viewBox` when the caller supplies none. A\n * node's `rotation` and a group's `transform` both move ink, so both are\n * applied here; a box taken from unrotated geometry crops the document.\n */\nfunction computeBounds(nodes: SvgNode[]): { x: number; y: number; width: number; height: number } {\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n const visit = (n: SvgNode, ctm: Matrix): void => {\n if (n.kind === 'group') {\n const childCtm = n.transform ? multiply(ctm, n.transform) : ctm;\n n.children.forEach((c) => visit(c, childCtm));\n return;\n }\n const b = n.kind === 'text' || n.kind === 'image'\n ? { minX: n.x, minY: n.y, maxX: n.x + n.width, maxY: n.y + n.height }\n : pathBounds(n.path);\n const local = n.rotation ? rotateAboutCenter(ctm, b, n.rotation) : ctm;\n for (const [x, y] of corners(b)) {\n const px = local[0] * x + local[2] * y + local[4];\n const py = local[1] * x + local[3] * y + local[5];\n if (px < minX) minX = px;\n if (py < minY) minY = py;\n if (px > maxX) maxX = px;\n if (py > maxY) maxY = py;\n }\n };\n nodes.forEach((n) => visit(n, IDENTITY_MATRIX));\n if (!Number.isFinite(minX)) {\n return { x: 0, y: 0, width: 0, height: 0 };\n }\n return { x: minX, y: minY, width: maxX - minX, height: maxY - minY };\n}\n\nfunction corners(b: { minX: number; minY: number; maxX: number; maxY: number }): [number, number][] {\n return [[b.minX, b.minY], [b.maxX, b.minY], [b.maxX, b.maxY], [b.minX, b.maxY]];\n}\n\n/** `ctm` composed with the same `rotate(angle cx cy)` the element emits. */\nfunction rotateAboutCenter(\n ctm: Matrix,\n b: { minX: number; minY: number; maxX: number; maxY: number },\n angle: number,\n): Matrix {\n const cx = (b.minX + b.maxX) / 2;\n const cy = (b.minY + b.maxY) / 2;\n const c = Math.cos(angle);\n const s = Math.sin(angle);\n return multiply(ctm, [c, s, -s, c, cx - cx * c + cy * s, cy - cx * s - cy * c]);\n}\n\n/**\n * Emit a `<text>` element. Uses `dominant-baseline=\"text-before-edge\"` so\n * the `y` attribute matches weasel's top-of-box pose; stashes the explicit\n * width/height (which native SVG text doesn't model) in `data-weasel-*`\n * attributes so they round-trip through the parser losslessly.\n */\nfunction textXml(node: SvgTextNode, registry: PaintServerRegistry, namespaces: Record<string, string>): string {\n const attrs: string[] = [\n `x=\"${trimNumber(node.x)}\"`,\n `y=\"${trimNumber(node.y)}\"`,\n `dominant-baseline=\"text-before-edge\"`,\n // The runs model stores real line breaks; SVG's default whitespace\n // handling would collapse them (and any indentation) away on re-import.\n `xml:space=\"preserve\"`,\n `data-weasel-width=\"${trimNumber(node.width)}\"`,\n `data-weasel-height=\"${trimNumber(node.height)}\"`,\n ];\n\n const style = node.style;\n if (style?.fontSize != null) attrs.push(`font-size=\"${trimNumber(style.fontSize)}\"`);\n if (style?.fontFamily) attrs.push(`font-family=\"${escapeAttr(style.fontFamily)}\"`);\n if (style?.fontWeight != null) attrs.push(`font-weight=\"${String(style.fontWeight)}\"`);\n if (style?.fontStyle && style.fontStyle !== 'normal') attrs.push(`font-style=\"${style.fontStyle}\"`);\n const direction = style?.direction ?? 'ltr';\n if (direction === 'rtl') attrs.push('direction=\"rtl\"');\n if (style?.align != null || direction === 'rtl') {\n // `text-anchor` is reading-order relative in SVG exactly as `start` / `end`\n // are here, so the two relative values pass straight through and only the\n // absolute pair has to be turned into an edge the reader resolves the same\n // way. Under `ltr` this collapses to what it always wrote.\n const align = style?.align ?? 'left';\n const anchor = align === 'center' ? 'middle'\n : align === 'start' ? 'start'\n : align === 'end' ? 'end'\n : (align === 'left') === (direction === 'ltr') ? 'start' : 'end';\n if (anchor !== 'start') attrs.push(`text-anchor=\"${anchor}\"`);\n }\n if (style?.letterSpacing != null && style.letterSpacing !== 0) {\n attrs.push(`letter-spacing=\"${trimNumber(style.letterSpacing)}\"`);\n }\n const decoration = textDecorationValue(style?.underline, style?.strikethrough, style?.overline);\n if (decoration) attrs.push(`text-decoration=\"${decoration}\"`);\n // Note: `lineHeight` is NOT emitted here. The bridge layer (svgInterop)\n // lifts it into `meta.wd.attrs['line-height']`, which `metaAttrsXml`\n // below emits as `wd:line-height=\"...\"`. There is no compat write of\n // `data-weasel-line-height` — per the SVG-native plan's Migration section,\n // no installed base exists to compat against.\n if (node.fill) {\n if ('color' in node.fill) {\n attrs.push(`fill=\"${node.fill.color}\"`);\n if (node.fill.opacity != null && node.fill.opacity !== 1) {\n attrs.push(`fill-opacity=\"${trimNumber(node.fill.opacity)}\"`);\n }\n } else {\n const id = registry.register(node.fill);\n attrs.push(`fill=\"url(#${id})\"`);\n }\n }\n for (const a of coreStrokeAttrs(node.stroke, registry)) attrs.push(a);\n if (node.opacity != null && node.opacity !== 1) {\n attrs.push(`opacity=\"${trimNumber(node.opacity)}\"`);\n }\n if (node.rotation != null && node.rotation !== 0) {\n const cx = node.x + node.width / 2;\n const cy = node.y + node.height / 2;\n const deg = (node.rotation * 180) / Math.PI;\n attrs.push(`transform=\"rotate(${trimNumber(deg)} ${trimNumber(cx)} ${trimNumber(cy)})\"`);\n }\n\n const body = node.runs && node.runs.length > 0\n ? node.runs.map((r) => runXml(r, registry)).join('')\n : escapeText(node.text);\n const metaAttrs = metaAttrsXml(node.meta, namespaces);\n const metaEls = metaElementsXml(node.meta, namespaces);\n return `<text ${attrs.join(' ')}${metaAttrs}>${body}${metaEls}</text>`;\n}\n\nfunction runXml(run: import('@weasel-js/core').StyledRun, registry: PaintServerRegistry): string {\n const attrs: string[] = [];\n if (run.bold) attrs.push(`font-weight=\"700\"`);\n if (run.italic) attrs.push(`font-style=\"italic\"`);\n if (run.fontFamily) attrs.push(`font-family=\"${escapeAttr(run.fontFamily)}\"`);\n // A percentage `font-size` is relative to the parent's, which is what\n // `fontScale` means; an absolute `fontSize` wins over it here as it does in\n // the runs model.\n //\n // `baseline-shift=\"super\"` carries the preset's *size* as well as its rise,\n // so a run that overrode only the rise has no keyword left to say the size\n // with and must spell it out — without this the superscript comes back\n // full-size at a raised baseline.\n const presetScale = run.script != null && run.baselineShift != null\n ? SCRIPT_METRICS[run.script].size\n : undefined;\n const scale = run.fontScale ?? presetScale;\n if (run.fontSize != null) attrs.push(`font-size=\"${trimNumber(run.fontSize)}\"`);\n else if (scale != null) attrs.push(`font-size=\"${trimNumber(scale * 100)}%\"`);\n // Same story for `baseline-shift`: an SVG percentage resolves against the\n // parent's font size, which is the unit `baselineShift` is already in.\n if (run.baselineShift != null) {\n attrs.push(`baseline-shift=\"${trimNumber(run.baselineShift * 100)}%\"`);\n } else if (run.script) {\n attrs.push(`baseline-shift=\"${run.script}\"`);\n }\n // Unlike the node-level style guard above, a run-level `0` is a meaningful\n // *override* (distinct from \"inherit the node's letterSpacing\") per the\n // runs model's additive-flags contract — emit it whenever it's set.\n if (run.letterSpacing != null) {\n attrs.push(`letter-spacing=\"${trimNumber(run.letterSpacing)}\"`);\n }\n const runDecoration = textDecorationValue(run.underline, run.strikethrough, run.overline);\n if (runDecoration) attrs.push(`text-decoration=\"${runDecoration}\"`);\n if (run.fill) {\n if ('color' in run.fill) {\n attrs.push(`fill=\"${run.fill.color}\"`);\n } else {\n const id = registry.register(run.fill);\n attrs.push(`fill=\"url(#${id})\"`);\n }\n }\n for (const a of coreStrokeAttrs(run.stroke, registry)) attrs.push(a);\n const head = attrs.length > 0 ? `<tspan ${attrs.join(' ')}>` : '<tspan>';\n return `${head}${escapeText(run.text)}</tspan>`;\n}\n\n/**\n * Combine the decoration flags into an SVG `text-decoration` value —\n * `\"underline line-through\"` when both are set, a single token when only\n * one is, or `null` (omit the attribute) when none is set.\n */\nfunction textDecorationValue(\n underline: boolean | undefined,\n strikethrough: boolean | undefined,\n overline: boolean | undefined,\n): string | null {\n const tokens: string[] = [];\n if (underline) tokens.push('underline');\n if (strikethrough) tokens.push('line-through');\n if (overline) tokens.push('overline');\n return tokens.length > 0 ? tokens.join(' ') : null;\n}\n\nfunction escapeAttr(s: string): string {\n return s.replace(/&/g, '&').replace(/\"/g, '"').replace(/</g, '<');\n}\n\nfunction escapeText(s: string): string {\n return s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');\n}\n\nfunction pathBounds(path: Path): { minX: number; minY: number; maxX: number; maxY: number } {\n if (path.kind === 'rect') {\n return {\n minX: path.x, minY: path.y,\n maxX: path.x + path.width, maxY: path.y + path.height,\n };\n }\n const b = boundsOfPath(path);\n return { minX: b.x, minY: b.y, maxX: b.x + b.width, maxY: b.y + b.height };\n}\n\n","/**\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? }` (`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 on both axes — an estimated box width in place of\n * the parser's wrap sentinel, and a scaled `fontSize`, since neither is\n * 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 { UNBOUNDED_TEXT_WIDTH } 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 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\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: textBoxWidth(n), height: n.height,\n };\n if (n.rotation) pose.rotation = n.rotation;\n drafts.push({\n kind: 'leaf',\n id: nextId(),\n parentId,\n pose,\n data: { text: n.text, ...(n.style ? { style: n.style } : {}) },\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/** Average glyph advance as a fraction of the em, for the width estimate\n * below. Sans-serif Latin runs 0.5–0.6; erring wide is the safer miss,\n * since a too-narrow box is the one that clips. */\nconst ESTIMATED_GLYPH_ADVANCE_EM = 0.6;\n\n/**\n * A finite box width for a text node. External SVG text carries\n * `UNBOUNDED_TEXT_WIDTH` — a wrap sentinel rather than a measurement — and\n * unpack has no text-measure context to replace it with a real one, so it\n * estimates from the longest line. Left alone, the sentinel would swamp the\n * file's union AABB and fit-clamp everything else to a speck.\n */\nfunction textBoxWidth(n: Extract<SvgNode, { kind: 'text' }>): number {\n if (n.width !== UNBOUNDED_TEXT_WIDTH) return n.width;\n const fontSize = resolveTextStyle(n.style).fontSize;\n const longest = n.text.split('\\n')\n .reduce((max, line) => Math.max(max, line.length), 0);\n return longest * fontSize * ESTIMATED_GLYPH_ADVANCE_EM;\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 return {\n ...data,\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"]}
|