@weasel-js/svg 1.9.3 → 1.9.4
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.d.ts +17 -3
- package/dist/index.js +916 -623
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types.ts","../src/transform.ts","../src/shapes.ts","../src/textAnchor.ts","../src/cssScan.ts","../src/condition.ts","../src/media.ts","../src/color.ts","../src/properties.ts","../src/supports.ts","../src/cascade.ts","../src/elements.ts","../src/patterns.ts","../src/path-serializer.ts","../src/gradients.ts","../src/parse.ts","../src/serialize.ts","../src/warm.ts","../src/unpack.ts","../src/fromKit.ts"],"names":["matches","width","height","keyword","condition","IDENT","own","PATH_M","PATH_L","PATH_C","PATH_Q","PATH_Z","meta","opacity","readPaint","num","out","a","XLINK_NS","getMarker","entry","resolveMarkerSize","escapeAttr","localName","resolveScreenLength","resolveTextStyle","boundsOfPath","solid","inherited","pose","fill","union","node"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Public types for `@weasel-js/svg`. The package exposes a flat,\n * discriminated-union node model (`SvgNode`) that mirrors the SVG element\n * tree but uses weasel-native leaf data (`Path`, `FillStyle`) for geometry and\n * paint.\n *\n * Parsing collapses every `transform=\"...\"` onto its descendants' geometry,\n * so the `SvgNode` tree returned from `parseSvg` never has a non-identity\n * group transform. Consumers may still construct groups with explicit\n * transforms before serializing, in which case the serializer emits a\n * single `matrix(a b c d e f)` on the `<g>`.\n */\n\nimport { identity, type Mat3 } from '@weasel-js/geom';\nimport type { SvgMediaEnvironment } from './media';\nimport type {\n Path, FillStyle, MarkerEntry, MarkerRef, ScreenLength, Stroke, StrokeAlign, StyledRun, TextStyle,\n TextVerticalAlign,\n} from '@weasel-js/core';\n\n/**\n * Opaque pass-through bag for namespaced XML content.\n *\n * weasel-svg does not interpret the contents — it only ensures that any\n * attributes or child elements in a *declared* XML namespace round-trip\n * losslessly through parse → serialize. Consumers (e.g. an app-specific\n * bridge layer) hang their domain semantics off this structure.\n *\n * Keyed by namespace prefix (the prefix is a write-time choice; the URI\n * is the canonical identifier and is supplied via `ParseOptions.namespaces`\n * / `SerializeOptions.namespaces`).\n */\nexport interface NamespaceMeta {\n [prefix: string]: {\n /** Local-name → string-value map for attributes in this namespace. */\n attrs?: Record<string, string>;\n /**\n * Child elements in this namespace, keyed by local name. Each entry\n * is an array because a namespace can host multiple sibling elements\n * with the same tag (e.g. `<wd:layer/><wd:layer/>`).\n */\n elements?: Record<string, NamespacedElement[]>;\n };\n}\n\n/** Opaque structured representation of a namespaced element. */\nexport interface NamespacedElement {\n /** Attribute local-name → string-value. */\n attrs: Record<string, string>;\n /** Text content, when the element contains only text (no child elements). */\n text?: string;\n /** Nested namespaced children, keyed by local name (recursive). */\n children?: Record<string, NamespacedElement[]>;\n}\n\n/**\n * 2x3 affine matrix in SVG's `matrix(a b c d e f)` order, mapping\n * `[x', y'] = [a*x + c*y + e, b*x + d*y + f]`.\n *\n * The same order the kernel's affine tier uses, so this is that type under\n * the name the SVG spec gives it — not a parallel one. An `SvgGroupNode`'s\n * transform and a geom `Mat3` are interchangeable without a conversion.\n */\nexport type Matrix = Mat3;\n\n/** Re-exported so this package's own stroke widths are namable beside the\n * rest of the SVG model. It is core's type; there is no second one. */\nexport type { ScreenLength };\n\n/** Identity matrix — useful as a default in tests / constructors. */\nexport const IDENTITY_MATRIX: Matrix = identity();\n\n/**\n * FillStyle description in the SVG sense — either explicit `none`, a solid\n * color, or a reference to a weasel-native gradient `FillStyle`. Solid colors\n * are normalized to `#rrggbb` strings; opacity is carried separately so\n * `fill-opacity` and `stroke-opacity` round-trip cleanly.\n */\nexport type SvgPaint =\n | { kind: 'none' }\n | { kind: 'solid'; color: string; opacity?: number }\n | { kind: 'gradient'; paint: FillStyle };\n\n/** Stroke description: a paint plus structural line parameters. */\nexport interface SvgStroke {\n paint: SvgPaint;\n /** World units, or `{ px }` for a width that holds its rendered thickness\n * however the document is scaled — SVG's `vector-effect=\"non-scaling-stroke\"`.\n * Literally the kit's own unit, not a second spelling of it. */\n width: ScreenLength;\n opacity?: number;\n /** `stroke-linecap`. Default per SVG spec is `'butt'`. */\n cap?: 'butt' | 'round' | 'square';\n /** `stroke-linejoin`. Default per SVG spec is `'miter'`. SVG's `arcs` / `miter-clip` map to `'miter'` with a warning. */\n join?: 'miter' | 'round' | 'bevel';\n /** `stroke-dasharray` as a flat number array. Odd-length inputs are doubled per SVG spec. */\n dash?: number[];\n /**\n * `stroke-miterlimit`. SVG's default is 4. Weasel's renderer defaults to\n * 10 (Canvas2D) when unset, so parsed strokes without an explicit\n * attribute may render with longer miters than the source SVG intended.\n */\n miterLimit?: number;\n /** The kit stroke's `align`. SVG has no stroke alignment, so the serializer\n * writes the stroke centered and says so through `onWarn`; the parser\n * never sets it. */\n align?: StrokeAlign;\n /** `marker-start` / `marker-mid` / `marker-end` as the kit's `MarkerRef`: the\n * bare `url(#id)` key, or a key with the `size` the serializer writes into a\n * def of its own. */\n markerStart?: MarkerRef;\n markerMid?: MarkerRef;\n markerEnd?: MarkerRef;\n}\n\n/**\n * Leaf node: a path geometry plus fill/stroke. All other v1 shapes\n * (`<rect>`, `<ellipse>`, etc.) are lowered to this representation on\n * parse — `<rect>` uses weasel's `RectPath` fast-path subtype when\n * possible, everything else becomes a `PolygonPath`.\n */\nexport interface SvgPathNode {\n kind: 'path';\n path: Path;\n fill: SvgPaint;\n stroke?: SvgStroke;\n /** Element-level opacity (`opacity=\"...\"`), 0..1. */\n opacity?: number;\n /** Element-level rotation in **radians**, pivoting around the AABB\n * center of the underlying `path` geometry. Emitted as SVG\n * `transform=\"rotate(angleDegrees cx cy)\"`. */\n rotation?: number;\n /** Opaque per-element bag for declared namespaces. See `NamespaceMeta`. */\n meta?: NamespaceMeta;\n}\n\n/**\n * Group node: an SVG `<g>`. On parse, `transform` is always omitted (any\n * `transform` attribute is collapsed onto descendants' geometry). On\n * serialize, a non-identity `transform` is emitted as\n * `matrix(a b c d e f)`.\n */\nexport interface SvgGroupNode {\n kind: 'group';\n children: SvgNode[];\n transform?: Matrix;\n /** Clips the group's contents. Serializes to a `<clipPath>` def plus\n * `clip-path=\"url(#id)\"`, and lives in the same space as `children` —\n * SVG applies the group's own `transform` to the clip as well.\n * A `<clipPath>` of more than one shape parses back as no clip: SVG\n * unions them and a `Path` holds one outline. */\n clip?: Path;\n opacity?: number;\n /** Opaque per-element bag for declared namespaces. See `NamespaceMeta`. */\n meta?: NamespaceMeta;\n}\n\n/**\n * Text leaf node. Mirrors the kit's `TextPose` shape — a bounding box plus\n * text content, optional rich-text `runs` (per-range styling), and an\n * optional `TextStyle` for the node-wide defaults.\n *\n * Note on SVG text geometry: native `<text>` flows from a baseline; it\n * doesn't have width/height attributes. The serializer emits\n * `dominant-baseline=\"text-before-edge\"` so `y` is the top of the text\n * box, plus `data-weasel-width` / `data-weasel-height` so weasel's\n * explicit box dimensions round-trip losslessly. External SVG text\n * (lacking the data-* attrs) imports with the width the kit's text layout\n * measures — an em-based estimate when no registered font can — and\n * `height = fontSize * lineHeight * (lineCount || 1)`.\n *\n * `x` here is always the box's left edge. In the SVG it is the\n * `text-anchor` point, and the parser and serializer convert between them.\n */\nexport interface SvgTextNode {\n kind: 'text';\n x: number;\n y: number;\n width: number;\n height: number;\n /** Plain text. When `runs` is set, `runsToPlainText(runs)` must equal `text`. */\n text: string;\n /** Optional per-range styling — same shape as `TextPose.runs`. */\n runs?: StyledRun[];\n /** Node-wide typography. Defaults applied at render time via `resolveTextStyle`. */\n style?: TextStyle;\n /** Where the laid-out text sits inside the box — `kit:text`'s\n * `data.verticalAlign`. SVG text has no box to align in, so this rides in\n * `data-weasel-vertical-align` and other readers draw the text top-aligned. */\n verticalAlign?: TextVerticalAlign;\n /**\n * Node-wide glyph paint, the `FillStyle` / `Stroke` a kit text node holds\n * in `data.fill` / `data.stroke`. Not `SvgPaint`, which is the path\n * nodes' shape — a text paint reaches the renderer through the runs, and\n * `StyledRun.fill` / `.stroke` override these per range.\n *\n * `null` is SVG's `fill=\"none\"`: outline-only text, painted by its stroke\n * alone. Absent takes the default black.\n */\n fill?: FillStyle | null;\n stroke?: Stroke;\n /** Element-level opacity (`opacity=\"...\"`), 0..1. */\n opacity?: number;\n /** Element-level rotation in **radians**, pivoting around the unrotated\n * AABB center `(x + width/2, y + height/2)`. Emitted as SVG\n * `transform=\"rotate(angleDegrees cx cy)\"`. */\n rotation?: number;\n /** Opaque per-element bag for declared namespaces. See `NamespaceMeta`. */\n meta?: NamespaceMeta;\n}\n\n/**\n * Raster-image leaf — an SVG `<image>`. `href` is the element's `href` (or\n * legacy `xlink:href`) verbatim: an external URL or a `data:` URI. The\n * package neither fetches nor decodes it, so an external URL round-trips as\n * a reference and only resolves when something downstream loads it.\n *\n * SVG's `preserveAspectRatio` is not modeled; the box is taken literally.\n *\n * With a `source` rect or a flip, the element is written as a `<g\n * data-weasel-image>` holding a nested `<svg>` viewport at the box, whose\n * `viewBox` is the source window over a unit-square `<image>` — plain SVG 1.1,\n * which any reader crops and mirrors the same way, and which `parseSvg` reads\n * back as one image node.\n */\nexport interface SvgImageNode {\n kind: 'image';\n href: string;\n x: number;\n y: number;\n width: number;\n height: number;\n /** The part of the bitmap drawn into the box, as fractions of the bitmap's\n * width and height from its top-left. Omitted draws the whole bitmap.\n * Fractions rather than bitmap pixels because this package never decodes\n * the image, so it cannot know its size. */\n source?: { x: number; y: number; width: number; height: number };\n /** Mirror the drawn region within the box, as `ImageDrawCommand` does. The\n * box does not move. */\n flipX?: boolean;\n flipY?: boolean;\n /** Element-level opacity (`opacity=\"...\"`), 0..1. */\n opacity?: number;\n /** Element-level rotation in **radians**, pivoting around the unrotated\n * AABB center `(x + width/2, y + height/2)`. Emitted as SVG\n * `transform=\"rotate(angleDegrees cx cy)\"`. */\n rotation?: number;\n /** Opaque per-element bag for declared namespaces. See `NamespaceMeta`. */\n meta?: NamespaceMeta;\n}\n\n/** Discriminated-union node — the leaf of the public tree. */\nexport type SvgNode = SvgPathNode | SvgGroupNode | SvgTextNode | SvgImageNode;\n\n/** Options for {@link parseSvg}. */\nexport interface ParseOptions {\n /**\n * Map of prefix → URI for XML namespaces the caller wants surfaced.\n * Attributes / child elements in any declared namespace are collected\n * into `SvgNode.meta` (per element) or `ParseResult.documentMeta` (root).\n * Undeclared namespaces are preserved in the DOM but not promoted into\n * the structured `meta` bag; they are silently dropped at serialize time.\n */\n namespaces?: Record<string, string>;\n /**\n * The media `@media` rules and `<style media>` are evaluated against. A\n * parse is one static render: by default a `screen` whose viewport is the\n * root's `width` / `height` (else its `viewBox`, else 300 × 150), with a\n * light color scheme and no hover or pointer. Fields given here replace\n * those defaults.\n */\n media?: Partial<SvgMediaEnvironment>;\n}\n\n/** Output of {@link parseSvg}. */\nexport interface ParseResult {\n nodes: SvgNode[];\n /** Non-fatal notices (unsupported elements, unrecognized attributes). */\n warnings: string[];\n /**\n * Opaque per-document bag for declared namespaces. Holds root-level\n * namespaced attributes (`documentMeta.<prefix>.attrs`) and namespaced\n * root children (`documentMeta.<prefix>.elements`).\n */\n documentMeta?: NamespaceMeta;\n /** Root `viewBox` attribute, parsed from `\"x y width height\"`. */\n viewBox?: { x: number; y: number; width: number; height: number };\n /** Root `width` attribute, parsed as a unitless number when present. */\n width?: number;\n /** Root `height` attribute, parsed as a unitless number when present. */\n height?: number;\n /** Text content of the first `<title>` child of `<svg>`, when present. */\n title?: string;\n /**\n * An entry for each document `<marker>` a stroke references under a key the\n * marker registry does not know, keyed as the strokes in `nodes` now name\n * them. Nothing draws them until they are registered (`registerMarker`),\n * which `unpackSvgFiles` does.\n */\n markers?: MarkerEntry[];\n}\n\n/** Options for {@link serializeSvg}. */\nexport interface SerializeOptions {\n /**\n * Override the root `viewBox`. When omitted, the serializer computes\n * a tight bounding box from the supplied nodes.\n */\n viewBox?: { x: number; y: number; width: number; height: number };\n /**\n * Called for what the document cannot carry the way weasel draws it: a\n * paint SVG cannot express (a pattern carrying a `TextureHandle` instead of\n * a `TilePatternSpec`), a stroke aligned off its edge, text that wraps or\n * sits lower than the top of its box. Each message is said once per call.\n * Without this the loss is silent.\n */\n onWarn?: (message: string) => void;\n /** Emit `width=\"...\"` on the root `<svg>`. */\n width?: number;\n /** Emit `height=\"...\"` on the root `<svg>`. */\n height?: number;\n /**\n * Emit `<title>...</title>` as the first child of the root `<svg>`. The\n * value is XML-escaped on output. Empty strings are skipped.\n */\n title?: string;\n /**\n * Map of prefix → URI for XML namespaces to declare on the root\n * `<svg>`. The serializer reads `documentMeta[prefix]` and\n * `node.meta[prefix]` to write the actual attributes and elements.\n */\n namespaces?: Record<string, string>;\n /**\n * Opaque per-document namespaced extras. Each `<prefix>.attrs` becomes\n * `<prefix>:<name>=\"...\"` attributes on the root `<svg>`. Each\n * `<prefix>.elements[localName]` becomes `<prefix>:<localName>...>`\n * children placed immediately before any geometry.\n */\n documentMeta?: NamespaceMeta;\n /** Pretty-print with newlines + indentation. Default `false`. */\n pretty?: boolean;\n}\n","/**\n * SVG transform attribute helpers. Parses the four primitive transform\n * functions weasel-svg supports (`matrix`, `translate`, `scale`, `rotate`)\n * into a single 2x3 affine matrix, and exposes the point/path mappers we\n * need to collapse `transform=` onto leaf geometry at parse time.\n */\n\nimport { invert, multiply } from '@weasel-js/geom';\nimport type { Matrix } from './types';\nimport { IDENTITY_MATRIX } from './types';\n\n/** Compose two 2x3 affines, `a` then `b` applied to a column vector. The\n * kernel's own composition — `Matrix` is `Mat3`, so nothing converts. */\nexport { multiply };\n\n/** Apply a 2x3 affine to a 2D point. The `{x, y}` spelling the rest of this\n * package works in; geom's `applyToPoint` returns the same numbers as a\n * tuple. */\nexport function applyMatrix(m: Matrix, x: number, y: number): { x: number; y: number } {\n return { x: m[0] * x + m[2] * y + m[4], y: m[1] * x + m[3] * y + m[5] };\n}\n\n/** True if `m` is the identity within a small epsilon. */\nexport function isIdentity(m: Matrix, eps = 1e-9): boolean {\n return (\n Math.abs(m[0] - 1) < eps &&\n Math.abs(m[1]) < eps &&\n Math.abs(m[2]) < eps &&\n Math.abs(m[3] - 1) < eps &&\n Math.abs(m[4]) < eps &&\n Math.abs(m[5]) < eps\n );\n}\n\nconst NUM_RE = /[-+]?(?:\\d*\\.\\d+|\\d+\\.?)(?:[eE][-+]?\\d+)?/g;\n\nfunction readNumbers(s: string): number[] {\n const out: number[] = [];\n const matches = s.match(NUM_RE);\n if (!matches) return out;\n for (const m of matches) {\n const n = Number(m);\n if (Number.isFinite(n)) out.push(n);\n }\n return out;\n}\n\n/**\n * Parse an SVG `transform=\"...\"` string into a single 2x3 matrix.\n * Functions compose right-to-left in SVG's coordinate model: in\n * `transform=\"A B\"`, the rightmost function is applied first to a point's\n * local coordinates. We accumulate accordingly: `result = result * fn`.\n *\n * Unrecognized functions emit a warning via the optional callback and are\n * skipped (the rest of the transform list still applies).\n */\nexport function parseTransform(\n attr: string | null | undefined,\n onWarn?: (message: string) => void,\n): Matrix {\n if (!attr) return IDENTITY_MATRIX;\n let result: Matrix = IDENTITY_MATRIX;\n // Split into \"name(args)\" chunks.\n const fnRe = /([A-Za-z]+)\\s*\\(([^)]*)\\)/g;\n let match: RegExpExecArray | null;\n while ((match = fnRe.exec(attr)) !== null) {\n const name = match[1].toLowerCase();\n const nums = readNumbers(match[2]);\n let local: Matrix | null = null;\n if (name === 'matrix' && nums.length >= 6) {\n local = [nums[0], nums[1], nums[2], nums[3], nums[4], nums[5]];\n } else if (name === 'translate') {\n const tx = nums[0] ?? 0;\n const ty = nums[1] ?? 0;\n local = [1, 0, 0, 1, tx, ty];\n } else if (name === 'scale') {\n const sx = nums[0] ?? 1;\n const sy = nums.length >= 2 ? nums[1] : sx;\n local = [sx, 0, 0, sy, 0, 0];\n } else if (name === 'rotate') {\n const ang = ((nums[0] ?? 0) * Math.PI) / 180;\n const c = Math.cos(ang);\n const s = Math.sin(ang);\n const rot: Matrix = [c, s, -s, c, 0, 0];\n if (nums.length >= 3) {\n // rotate(angle, cx, cy) = translate(cx,cy) * rotate * translate(-cx,-cy)\n const cx = nums[1];\n const cy = nums[2];\n local = multiply(multiply([1, 0, 0, 1, cx, cy], rot), [1, 0, 0, 1, -cx, -cy]);\n } else {\n local = rot;\n }\n } else if (name === 'skewx' || name === 'skewy') {\n const ang = ((nums[0] ?? 0) * Math.PI) / 180;\n const t = Math.tan(ang);\n local = name === 'skewx' ? [1, 0, t, 1, 0, 0] : [1, t, 0, 1, 0, 0];\n } else {\n onWarn?.(`unsupported transform function: ${name}`);\n continue;\n }\n result = multiply(result, local);\n }\n return result;\n}\n\n/**\n * Re-express an element's own `transform` in the frame its inherited `ctm`\n * maps into: `ctm * local * ctm⁻¹`.\n *\n * A leaf's geometry is baked through `ctm` at parse time, so its own\n * transform has to move with it. Decomposing the raw local matrix against\n * bounds that have already been through `ctm` compares two different\n * coordinate spaces, and a rotation inside a translated `<g>` fails to\n * decompose for no reason but the offset.\n *\n * `null` when `@weasel-js/geom`'s `invert` finds `ctm` singular: the geometry\n * has collapsed through it, and the local transform has no frame to live in.\n */\nexport function rebaseTransform(ctm: Matrix, local: Matrix): Matrix | null {\n const inv = invert(ctm);\n if (!inv) return null;\n return multiply(multiply(ctm, local), inv);\n}\n\n/** Try to factor `m` as \"rotation by theta about (cx, cy)\". Returns the\n * angle in radians when `m` is (within `eps`) a pure rotation about the\n * given pivot. Returns `null` otherwise.\n *\n * Pure rotation about (cx, cy) has the matrix form:\n * [ cos -sin cx - cx*cos + cy*sin ]\n * [ sin cos cy - cx*sin - cy*cos ]\n * i.e. m[0] = m[3] = cos, m[1] = -m[2] = sin, with a translation that\n * equals the pivot's \"rotate-then-translate-back\" residue. We reconstruct\n * theta from atan2(m[1], m[0]) and verify the rest.\n */\nexport function decomposeRotation(\n m: Matrix,\n cx: number,\n cy: number,\n eps = 1e-4,\n): number | null {\n const [a, b, c, d, e, f] = m;\n // Pure rotation requires a == d and b == -c.\n if (Math.abs(a - d) > eps) return null;\n if (Math.abs(b + c) > eps) return null;\n // Determinant must be 1 (no scale, no flip).\n const det = a * d - b * c;\n if (Math.abs(det - 1) > eps) return null;\n const theta = Math.atan2(b, a);\n // Verify translation = (cx - cx*cos + cy*sin, cy - cx*sin - cy*cos).\n const expectedE = cx - cx * a + cy * b;\n const expectedF = cy - cx * b - cy * a;\n if (Math.abs(e - expectedE) > eps) return null;\n if (Math.abs(f - expectedF) > eps) return null;\n return theta;\n}\n\n/** Best-effort rotational-component extraction for a general matrix (any\n * scale + rotation, ignoring translation). Used for parse-time warnings\n * on un-decomposable matrices: we can detect \"there is a rotation here\"\n * even if we won't preserve it as `node.rotation`. For a non-uniform\n * matrix the \"rotation\" is ambiguous; we report atan2(b, a) which\n * corresponds to where the +x basis vector points.\n */\nexport function rotationComponent(m: Matrix): number {\n return Math.atan2(m[1], m[0]);\n}\n\n/**\n * Format a matrix as an SVG `matrix(a b c d e f)` value. Returns `null`\n * when `m` is (effectively) the identity, so the caller can omit the\n * attribute entirely.\n */\nexport function formatMatrix(m: Matrix): string | null {\n if (isIdentity(m)) return null;\n return `matrix(${m.map((n) => trimNumber(n)).join(' ')})`;\n}\n\n/** Trim trailing zeros from a numeric value for compact SVG output. */\nexport function trimNumber(n: number): string {\n if (!Number.isFinite(n)) return '0';\n // Round to ~6 decimal places to avoid floating-point cruft.\n const r = Math.round(n * 1e6) / 1e6;\n if (Number.isInteger(r)) return String(r);\n return String(r);\n}\n","/**\n * Lower SVG primitive elements (`<rect>`, `<circle>`, `<ellipse>`,\n * `<line>`, `<polyline>`, `<polygon>`) to weasel `Path` values. Each\n * helper applies an optional 2x3 affine matrix to the resulting geometry\n * so the caller can collapse `<g transform=\"...\">` onto leaves.\n *\n * Ellipses and rounded rects use the standard 4-segment cubic Bezier\n * approximation with control offset `k = 4*(sqrt(2)-1)/3 ≈ 0.5523`.\n */\n\nimport {\n PATH_C, PATH_L, PATH_M, PATH_Q, PATH_Z,\n PathBuilder,\n type Path,\n type PolygonPath,\n type RectPath,\n} from '@weasel-js/core';\nimport type { Matrix } from './types';\nimport { IDENTITY_MATRIX } from './types';\nimport { applyMatrix, isIdentity } from './transform';\n\n/** Magic constant: cubic Bezier control offset for a quarter-circle of radius 1. */\nconst KAPPA = (4 * (Math.sqrt(2) - 1)) / 3;\n\n/** True when `m` represents a pure axis-aligned scale + translate. */\nfunction isAxisAlignedScale(m: Matrix, eps = 1e-9): boolean {\n return Math.abs(m[1]) < eps && Math.abs(m[2]) < eps;\n}\n\n/**\n * Apply a 2x3 affine to a `Path`. RectPaths whose matrix is identity or\n * an axis-aligned scale+translate stay as `RectPath`; anything else (any\n * rotation/skew, or any PolygonPath input) is promoted to a `PolygonPath`\n * via a coords-level remap.\n */\nexport function transformPath(path: Path, m: Matrix): Path {\n if (isIdentity(m)) return path;\n if (path.kind === 'rect') {\n if (isAxisAlignedScale(m)) {\n const a = m[0], d = m[3], e = m[4], f = m[5];\n let x = path.x * a + e;\n let y = path.y * d + f;\n let w = path.width * a;\n let h = path.height * d;\n if (w < 0) { x += w; w = -w; }\n if (h < 0) { y += h; h = -h; }\n return { kind: 'rect', x, y, width: w, height: h };\n }\n // Promote to polygon, then transform.\n return transformPath(rectToPolygon(path), m);\n }\n // PolygonPath: remap every coord pair. Step counts are command-dependent\n // and all the supported commands store coord pairs, so a flat stride-2\n // walk is correct.\n const xs = path.coords;\n const out = new Float32Array(xs.length);\n for (let i = 0; i < xs.length; i += 2) {\n const p = applyMatrix(m, xs[i], xs[i + 1]);\n out[i] = p.x;\n out[i + 1] = p.y;\n }\n return {\n kind: 'polygon',\n commands: new Uint8Array(path.commands),\n coords: out,\n fillRule: path.fillRule,\n };\n}\n\nfunction rectToPolygon(r: RectPath): PolygonPath {\n const b = new PathBuilder();\n b.moveTo(r.x, r.y);\n b.lineTo(r.x + r.width, r.y);\n b.lineTo(r.x + r.width, r.y + r.height);\n b.lineTo(r.x, r.y + r.height);\n b.close();\n return b.build();\n}\n\n/**\n * `<rect x y width height rx ry>` → Path. Returns a `RectPath` when there\n * are no corner radii (and matrix is benign); otherwise lowers to a\n * polygon with cubic-curve corners.\n */\nexport function rectElementToPath(\n x: number, y: number, width: number, height: number,\n rx: number, ry: number,\n m: Matrix = IDENTITY_MATRIX,\n): Path {\n if (rx <= 0 && ry <= 0) {\n return transformPath({ kind: 'rect', x, y, width, height }, m);\n }\n const r = Math.min(Math.max(rx, ry), Math.min(width, height) / 2);\n const r2 = Math.min(rx > 0 ? rx : r, ry > 0 ? ry : r, Math.min(width, height) / 2);\n // For simplicity treat rx === ry === r2. Independent rx/ry can be\n // added later; weasel doesn't have a rounded-rect primitive anyway.\n const rad = r2;\n const k = KAPPA * rad;\n const x2 = x + width;\n const y2 = y + height;\n const b = new PathBuilder();\n b.moveTo(x + rad, y);\n b.lineTo(x2 - rad, y);\n b.curveTo(x2 - rad + k, y, x2, y + rad - k, x2, y + rad);\n b.lineTo(x2, y2 - rad);\n b.curveTo(x2, y2 - rad + k, x2 - rad + k, y2, x2 - rad, y2);\n b.lineTo(x + rad, y2);\n b.curveTo(x + rad - k, y2, x, y2 - rad + k, x, y2 - rad);\n b.lineTo(x, y + rad);\n b.curveTo(x, y + rad - k, x + rad - k, y, x + rad, y);\n b.close();\n return transformPath(b.build(), m);\n}\n\n/** `<ellipse cx cy rx ry>` → PolygonPath (4 cubic segments). */\nexport function ellipseToPath(\n cx: number, cy: number, rx: number, ry: number,\n m: Matrix = IDENTITY_MATRIX,\n): Path {\n const kx = KAPPA * rx;\n const ky = KAPPA * ry;\n const b = new PathBuilder();\n b.moveTo(cx + rx, cy);\n b.curveTo(cx + rx, cy + ky, cx + kx, cy + ry, cx, cy + ry);\n b.curveTo(cx - kx, cy + ry, cx - rx, cy + ky, cx - rx, cy);\n b.curveTo(cx - rx, cy - ky, cx - kx, cy - ry, cx, cy - ry);\n b.curveTo(cx + kx, cy - ry, cx + rx, cy - ky, cx + rx, cy);\n b.close();\n return transformPath(b.build(), m);\n}\n\n/** `<circle cx cy r>` → ellipse with rx === ry. */\nexport function circleToPath(\n cx: number, cy: number, r: number, m: Matrix = IDENTITY_MATRIX,\n): Path {\n return ellipseToPath(cx, cy, r, r, m);\n}\n\n/** `<line x1 y1 x2 y2>` → open 2-anchor polygon. */\nexport function lineToPath(\n x1: number, y1: number, x2: number, y2: number,\n m: Matrix = IDENTITY_MATRIX,\n): Path {\n const b = new PathBuilder();\n b.moveTo(x1, y1);\n b.lineTo(x2, y2);\n return transformPath(b.build(), m);\n}\n\n/** Parse SVG `points=\"x1,y1 x2,y2 ...\"` to a flat list. */\nexport function parsePoints(raw: string): { x: number; y: number }[] {\n const out: { x: number; y: number }[] = [];\n const nums = raw.match(/[-+]?(?:\\d*\\.\\d+|\\d+\\.?)(?:[eE][-+]?\\d+)?/g);\n if (!nums) return out;\n for (let i = 0; i + 1 < nums.length; i += 2) {\n out.push({ x: parseFloat(nums[i]), y: parseFloat(nums[i + 1]) });\n }\n return out;\n}\n\n/** `<polyline points=\"...\">` → open polygon. */\nexport function polylineToPath(\n points: readonly { x: number; y: number }[],\n m: Matrix = IDENTITY_MATRIX,\n): Path {\n if (points.length === 0) {\n return { kind: 'polygon', commands: new Uint8Array(), coords: new Float32Array(), fillRule: 'nonzero' };\n }\n const b = new PathBuilder();\n b.moveTo(points[0].x, points[0].y);\n for (let i = 1; i < points.length; i++) b.lineTo(points[i].x, points[i].y);\n return transformPath(b.build(), m);\n}\n\n/** `<polygon points=\"...\">` → closed polygon. */\nexport function polygonToPath(\n points: readonly { x: number; y: number }[],\n m: Matrix = IDENTITY_MATRIX,\n): Path {\n if (points.length === 0) {\n return { kind: 'polygon', commands: new Uint8Array(), coords: new Float32Array(), fillRule: 'nonzero' };\n }\n const b = new PathBuilder();\n b.moveTo(points[0].x, points[0].y);\n for (let i = 1; i < points.length; i++) b.lineTo(points[i].x, points[i].y);\n b.close();\n return transformPath(b.build(), m);\n}\n\n// Re-export the path opcodes for any callers that want to introspect.\nexport { PATH_M, PATH_L, PATH_C, PATH_Q, PATH_Z };\n","import { resolveAlign, type TextStyle } from '@weasel-js/core';\n\n/**\n * Distance from a text box's left edge to its SVG anchor point: `x` on a\n * `<text>` is where `text-anchor` lands, which is the box's left edge, center\n * or right edge once `align` and `direction` resolve to an absolute edge.\n */\nexport function anchorOffset(style: TextStyle | undefined, width: number): number {\n const edge = resolveAlign(style?.align ?? 'left', style?.direction ?? 'ltr');\n return edge === 'center' ? width / 2 : edge === 'right' ? width : 0;\n}\n","/**\n * Lexical scanning shared by the stylesheet parser and the at-rule condition\n * evaluators: strings, comments, balanced blocks, top-level splitting, and\n * single declarations.\n */\n\n/** One `prop: value [!important]` declaration. */\nexport interface Declaration {\n readonly prop: string;\n readonly value: string;\n readonly important: boolean;\n}\n\n/**\n * Advance past a quoted string starting at `i` (which holds the quote).\n * Returns the index just after the closing quote, or the end of input.\n */\nexport function skipString(s: string, i: number): number {\n const q = s[i];\n for (let j = i + 1; j < s.length; j++) {\n if (s[j] === '\\\\') j++;\n else if (s[j] === q) return j + 1;\n }\n return s.length;\n}\n\n/** Remove `/* … *\\/` comments, leaving quoted strings intact. */\nexport function stripComments(s: string): string {\n if (!s.includes('/*')) return s;\n let out = '';\n let i = 0;\n while (i < s.length) {\n const ch = s[i];\n if (ch === '\"' || ch === \"'\") {\n const end = skipString(s, i);\n out += s.slice(i, end);\n i = end;\n } else if (ch === '/' && s[i + 1] === '*') {\n const end = s.indexOf('*/', i + 2);\n i = end < 0 ? s.length : end + 2;\n out += ' ';\n } else {\n out += ch;\n i++;\n }\n }\n return out;\n}\n\n/**\n * Split `s` on `sep` wherever it sits outside strings and (), [] nesting.\n * With `dropBlocks`, a `{…}` block at depth zero is discarded along with the\n * prelude before it, back to the previous separator.\n */\nexport function splitTopLevel(s: string, sep: string, dropBlocks = false): string[] {\n const parts: string[] = [];\n let depth = 0;\n let start = 0;\n let i = 0;\n while (i < s.length) {\n const ch = s[i];\n if (ch === '\"' || ch === \"'\") { i = skipString(s, i); continue; }\n if (ch === '(' || ch === '[') depth++;\n else if ((ch === ')' || ch === ']') && depth > 0) depth--;\n else if (depth === 0 && ch === sep) {\n parts.push(s.slice(start, i));\n start = i + 1;\n } else if (depth === 0 && dropBlocks && ch === '{') {\n i = skipBlock(s, i);\n start = i;\n continue;\n }\n i++;\n }\n parts.push(s.slice(start));\n return parts;\n}\n\n/** Given `s[i] === '{'`, return the index just after its matching `}`. */\nexport function skipBlock(s: string, i: number): number {\n let depth = 0;\n while (i < s.length) {\n const ch = s[i];\n if (ch === '\"' || ch === \"'\") { i = skipString(s, i); continue; }\n if (ch === '{') depth++;\n else if (ch === '}' && --depth === 0) return i + 1;\n i++;\n }\n return s.length;\n}\n\nconst PROP_NAME = /^-?[a-z_][a-z0-9_-]*$/;\nconst IMPORTANT = /!\\s*important\\s*$/i;\n\n/**\n * Parse a CSS declaration block — a `style=\"\"` value or a rule body — in\n * source order. Malformed declarations are dropped, as CSS does.\n */\nexport function parseDeclarations(block: string): Declaration[] {\n const out: Declaration[] = [];\n for (const part of splitTopLevel(stripComments(block), ';', true)) {\n const d = parseDeclaration(part);\n if (d) out.push(d);\n }\n return out;\n}\n\n/** Parse one `prop: value [!important]`, or null when it is malformed. */\nexport function parseDeclaration(text: string): Declaration | null {\n const colon = text.indexOf(':');\n if (colon < 0) return null;\n const prop = text.slice(0, colon).trim().toLowerCase();\n if (!PROP_NAME.test(prop)) return null;\n let value = text.slice(colon + 1).trim();\n const important = IMPORTANT.test(value);\n if (important) value = value.replace(IMPORTANT, '').trim();\n if (!value) return null;\n return { prop, value, important };\n}\n\n/** Given `s[i] === '('`, return the index just after its matching `)`. */\nexport function parenEnd(s: string, i: number): number {\n let depth = 0;\n while (i < s.length) {\n const ch = s[i];\n if (ch === '\"' || ch === \"'\") { i = skipString(s, i); continue; }\n if (ch === '(') depth++;\n else if (ch === ')' && --depth === 0) return i + 1;\n i++;\n }\n return s.length;\n}\n\n","/**\n * The boolean grammar `@media` and `@supports` share: `not`, `and`, `or` and\n * parenthesized nesting, with `and` and `or` never mixed at one level. The\n * leaves differ, so each caller supplies its own.\n *\n * Values are three-valued (Kleene): `null` is \"unknown\", which Media Queries 4\n * gives to anything it cannot parse as a feature, and which stays unknown\n * under `not`. A syntax error throws {@link ConditionSyntaxError}.\n */\n\nimport { parenEnd } from './cssScan';\n\nexport type Tri = boolean | null;\n\nexport class ConditionSyntaxError extends Error {}\n\nexport interface ConditionLeaves {\n /** A parenthesized leaf whose contents are not themselves a condition. */\n paren(inner: string): Tri;\n /** A function-notation leaf, `name(args)`; `name` is lowercased. */\n fn(name: string, args: string): Tri;\n}\n\nexport const triNot = (a: Tri): Tri => (a == null ? null : !a);\nexport const triAnd = (a: Tri, b: Tri): Tri => (a === false || b === false ? false : a == null || b == null ? null : true);\nconst triOr = (a: Tri, b: Tri): Tri => (a === true || b === true ? true : a == null || b == null ? null : false);\n\ninterface Cursor {\n readonly s: string;\n i: number;\n}\n\nconst WS = /\\s/;\nconst IDENT = /^-?[a-zA-Z_][\\w-]*/;\n\nfunction skipWs(p: Cursor): void {\n while (p.i < p.s.length && WS.test(p.s[p.i])) p.i++;\n}\n\n/** Consume `word` when it stands alone as a keyword followed by whitespace. */\nfunction keyword(p: Cursor, word: string): boolean {\n const end = p.i + word.length;\n if (p.s.slice(p.i, end).toLowerCase() !== word) return false;\n if (end >= p.s.length || !WS.test(p.s[end])) return false;\n p.i = end;\n return true;\n}\n\n/**\n * Evaluate a whole condition. `allowOr: false` is the\n * `<media-condition-without-or>` that follows `<media-type> and`.\n */\nexport function evaluateCondition(s: string, leaves: ConditionLeaves, allowOr = true): Tri {\n const p: Cursor = { s, i: 0 };\n const r = condition(p, leaves, allowOr);\n skipWs(p);\n if (p.i < s.length) throw new ConditionSyntaxError(`unexpected \"${s.slice(p.i)}\"`);\n return r;\n}\n\nfunction condition(p: Cursor, leaves: ConditionLeaves, allowOr: boolean): Tri {\n skipWs(p);\n if (keyword(p, 'not')) return triNot(inParens(p, leaves));\n let r = inParens(p, leaves);\n let op: 'and' | 'or' | null = null;\n for (;;) {\n const save = p.i;\n skipWs(p);\n if (p.i >= p.s.length) { p.i = save; return r; }\n const next = keyword(p, 'and') ? 'and' : keyword(p, 'or') ? 'or' : null;\n if (!next || (op && next !== op) || (next === 'or' && !allowOr)) {\n throw new ConditionSyntaxError(`unexpected \"${p.s.slice(p.i)}\"`);\n }\n op = next;\n const rhs = inParens(p, leaves);\n r = op === 'and' ? triAnd(r, rhs) : triOr(r, rhs);\n }\n}\n\nfunction looksLikeCondition(inner: string): boolean {\n const t = inner.trimStart();\n return t.startsWith('(') || /^not\\s/i.test(t) || /^-?[a-zA-Z_][\\w-]*\\(/.test(t);\n}\n\nfunction inParens(p: Cursor, leaves: ConditionLeaves): Tri {\n skipWs(p);\n const start = p.i;\n let name: string | null = null;\n if (p.s[p.i] !== '(') {\n const m = IDENT.exec(p.s.slice(p.i));\n if (!m || p.s[p.i + m[0].length] !== '(') throw new ConditionSyntaxError(`expected \"(\" at \"${p.s.slice(p.i)}\"`);\n name = m[0].toLowerCase();\n p.i += m[0].length;\n }\n const end = parenEnd(p.s, p.i);\n if (p.s[end - 1] !== ')') throw new ConditionSyntaxError(`unbalanced \"${p.s.slice(start)}\"`);\n const inner = p.s.slice(p.i + 1, end - 1);\n p.i = end;\n if (name != null) return leaves.fn(name, inner);\n if (looksLikeCondition(inner)) {\n try {\n return evaluateCondition(inner, leaves);\n } catch (e) {\n if (!(e instanceof ConditionSyntaxError)) throw e;\n }\n }\n return leaves.paren(inner);\n}\n","/**\n * Media Queries 4 evaluation against a fixed environment.\n *\n * A parse represents one static render, so `@media` and `<style media>` are\n * answered once, against an {@link SvgMediaEnvironment}, rather than tracked\n * as live conditions.\n */\n\nimport { ConditionSyntaxError, evaluateCondition, triAnd, triNot, type Tri } from './condition';\nimport { splitTopLevel } from './cssScan';\n\n/** The media a parse is taken to be rendered on. */\nexport interface SvgMediaEnvironment {\n /** Media type; `all` always matches as well. */\n readonly type: string;\n /** Viewport width in CSS px. */\n readonly width: number;\n /** Viewport height in CSS px. */\n readonly height: number;\n /** Device pixels per CSS px. */\n readonly resolution: number;\n readonly prefersColorScheme: 'light' | 'dark';\n readonly prefersReducedMotion: 'no-preference' | 'reduce';\n /** Answers both `hover` and `any-hover`. */\n readonly hover: 'none' | 'hover';\n /** Answers both `pointer` and `any-pointer`. */\n readonly pointer: 'none' | 'coarse' | 'fine';\n /** How often the output can change once rendered. */\n readonly update: 'none' | 'slow' | 'fast';\n /** Bits per color component; 0 on a monochrome device. */\n readonly color: number;\n /** Bits per pixel of a monochrome device; 0 otherwise. */\n readonly monochrome: number;\n}\n\n/** A static, light-scheme screen render with no pointer. Width and height are the replaced-element default. */\nexport const DEFAULT_MEDIA_ENVIRONMENT: SvgMediaEnvironment = {\n type: 'screen',\n width: 300,\n height: 150,\n resolution: 1,\n prefersColorScheme: 'light',\n prefersReducedMotion: 'no-preference',\n hover: 'none',\n pointer: 'none',\n update: 'none',\n color: 8,\n monochrome: 0,\n};\n\nconst ABSOLUTE_PX: Readonly<Record<string, number>> = {\n px: 1, in: 96, cm: 96 / 2.54, mm: 96 / 25.4, q: 96 / 101.6, pt: 96 / 72, pc: 16,\n};\n\n/** An absolute SVG length in px, or undefined for a percentage, a relative unit, or garbage. */\nfunction absoluteLength(raw: string | null): number | undefined {\n const m = raw == null ? null : /^\\s*([+-]?(?:\\d+\\.?\\d*|\\.\\d+)(?:e[+-]?\\d+)?)\\s*([a-z]*)\\s*$/i.exec(raw);\n if (!m) return undefined;\n const scale = ABSOLUTE_PX[m[2].toLowerCase() || 'px'];\n const n = parseFloat(m[1]) * (scale ?? NaN);\n return Number.isFinite(n) && n >= 0 ? n : undefined;\n}\n\n/**\n * The environment a parse of this `<svg>` evaluates media against: the\n * defaults, with the viewport taken from the root's `width` / `height`, then\n * its `viewBox` (keeping its aspect ratio when only one side is given), then\n * the 300 × 150 replaced-element default. `overrides` win over all of it.\n */\nexport function mediaEnvironmentFor(\n root: Element,\n overrides: Partial<SvgMediaEnvironment> = {},\n): SvgMediaEnvironment {\n let width = absoluteLength(root.getAttribute('width'));\n let height = absoluteLength(root.getAttribute('height'));\n const vb = (root.getAttribute('viewBox') ?? '').trim().split(/[\\s,]+/).map(Number);\n if (vb.length === 4 && vb.every(Number.isFinite) && vb[2] > 0 && vb[3] > 0) {\n const [, , w, h] = vb;\n if (width == null && height == null) { width = w; height = h; }\n else if (width == null) width = (height as number) * (w / h);\n else if (height == null) height = width * (h / w);\n }\n return {\n ...DEFAULT_MEDIA_ENVIRONMENT,\n width: width ?? DEFAULT_MEDIA_ENVIRONMENT.width,\n height: height ?? DEFAULT_MEDIA_ENVIRONMENT.height,\n ...overrides,\n };\n}\n\ntype Tok =\n | { readonly k: 'ident'; readonly v: string }\n | { readonly k: 'num'; readonly v: number; readonly unit: string }\n | { readonly k: 'op'; readonly v: '<' | '<=' | '>' | '>=' | '=' }\n | { readonly k: ':' }\n | { readonly k: '/' };\n\nconst TOKEN = /\\s*(?:([+-]?(?:\\d+\\.?\\d*|\\.\\d+)(?:e[+-]?\\d+)?)([a-z%]*)|(-?[a-z_][\\w-]*)|(<=|>=|<|>|=)|(:)|(\\/))/iy;\n\nfunction tokenize(s: string): Tok[] | null {\n const out: Tok[] = [];\n TOKEN.lastIndex = 0;\n while (TOKEN.lastIndex < s.length) {\n if (/^\\s*$/.test(s.slice(TOKEN.lastIndex))) break;\n const m = TOKEN.exec(s);\n if (!m) return null;\n if (m[1] != null) out.push({ k: 'num', v: parseFloat(m[1]), unit: m[2].toLowerCase() });\n else if (m[3] != null) out.push({ k: 'ident', v: m[3].toLowerCase() });\n else if (m[4] != null) out.push({ k: 'op', v: m[4] as '<' | '<=' | '>' | '>=' | '=' });\n else if (m[5] != null) out.push({ k: ':' });\n else out.push({ k: '/' });\n }\n return out;\n}\n\ntype RangeType = 'length' | 'ratio' | 'resolution' | 'integer';\ntype Feature =\n | { readonly kind: 'range'; readonly type: RangeType; readonly get: (e: SvgMediaEnvironment) => number }\n | {\n readonly kind: 'discrete';\n readonly values: readonly string[];\n /** The value that is false in a boolean context, if any. */\n readonly off?: string;\n readonly get: (e: SvgMediaEnvironment) => string;\n };\n\nconst width = (e: SvgMediaEnvironment): number => e.width;\nconst height = (e: SvgMediaEnvironment): number => e.height;\nconst aspect = (e: SvgMediaEnvironment): number => e.width / e.height;\nconst hover: Feature = { kind: 'discrete', values: ['none', 'hover'], off: 'none', get: (e) => e.hover };\nconst pointer: Feature = { kind: 'discrete', values: ['none', 'coarse', 'fine'], off: 'none', get: (e) => e.pointer };\n\nconst FEATURES: Readonly<Record<string, Feature>> = {\n 'width': { kind: 'range', type: 'length', get: width },\n 'height': { kind: 'range', type: 'length', get: height },\n 'device-width': { kind: 'range', type: 'length', get: width },\n 'device-height': { kind: 'range', type: 'length', get: height },\n 'aspect-ratio': { kind: 'range', type: 'ratio', get: aspect },\n 'device-aspect-ratio': { kind: 'range', type: 'ratio', get: aspect },\n 'resolution': { kind: 'range', type: 'resolution', get: (e) => e.resolution },\n 'color': { kind: 'range', type: 'integer', get: (e) => e.color },\n 'monochrome': { kind: 'range', type: 'integer', get: (e) => e.monochrome },\n 'orientation': {\n kind: 'discrete', values: ['portrait', 'landscape'],\n get: (e) => (e.height >= e.width ? 'portrait' : 'landscape'),\n },\n 'prefers-color-scheme': { kind: 'discrete', values: ['light', 'dark'], get: (e) => e.prefersColorScheme },\n 'prefers-reduced-motion': {\n kind: 'discrete', values: ['no-preference', 'reduce'], off: 'no-preference', get: (e) => e.prefersReducedMotion,\n },\n 'update': { kind: 'discrete', values: ['none', 'slow', 'fast'], off: 'none', get: (e) => e.update },\n 'hover': hover,\n 'any-hover': hover,\n 'pointer': pointer,\n 'any-pointer': pointer,\n};\n\nconst FONT_PX = 16;\n\nfunction lengthPx(v: number, unit: string, env: SvgMediaEnvironment): number | null {\n if (unit === '') return v === 0 ? 0 : null;\n const abs = ABSOLUTE_PX[unit];\n if (abs != null) return v * abs;\n switch (unit) {\n case 'em': case 'rem': return v * FONT_PX;\n case 'ex': case 'ch': return v * FONT_PX / 2;\n case 'vw': return v * env.width / 100;\n case 'vh': return v * env.height / 100;\n case 'vmin': return v * Math.min(env.width, env.height) / 100;\n case 'vmax': return v * Math.max(env.width, env.height) / 100;\n default: return null;\n }\n}\n\nconst DPPX: Readonly<Record<string, number>> = { dppx: 1, x: 1, dpi: 1 / 96, dpcm: 2.54 / 96 };\n\n/** A range feature's value written as `toks`, in the feature's canonical unit. */\nfunction rangeValue(toks: readonly Tok[], type: RangeType, env: SvgMediaEnvironment): number | null {\n const [a, b, c] = toks;\n if (type === 'ratio') {\n if (toks.length === 1 && a.k === 'num' && a.unit === '' && a.v >= 0) return a.v;\n if (toks.length === 3 && a.k === 'num' && b.k === '/' && c.k === 'num' && a.unit === '' && c.unit === '' &&\n a.v >= 0 && c.v > 0) return a.v / c.v;\n return null;\n }\n if (toks.length !== 1 || a.k !== 'num') return null;\n if (type === 'length') return lengthPx(a.v, a.unit, env);\n if (type === 'resolution') return DPPX[a.unit] != null ? a.v * DPPX[a.unit] : null;\n return a.unit === '' && Number.isInteger(a.v) ? a.v : null;\n}\n\nfunction close(a: number, b: number): boolean {\n return Math.abs(a - b) <= 1e-9 * Math.max(1, Math.abs(a), Math.abs(b));\n}\n\nfunction compare(a: number, op: string, b: number): boolean {\n switch (op) {\n case '=': return close(a, b);\n case '<': return a < b && !close(a, b);\n case '<=': return a < b || close(a, b);\n case '>': return a > b && !close(a, b);\n default: return a > b || close(a, b);\n }\n}\n\nconst FLIP: Readonly<Record<string, string>> = { '<': '>', '<=': '>=', '>': '<', '>=': '<=', '=': '=' };\n\n/** One `( … )` feature test. Anything that does not parse as a known feature is unknown. */\nfunction evaluateFeature(inner: string, env: SvgMediaEnvironment): Tri {\n const toks = tokenize(inner);\n if (!toks || toks.length === 0) return null;\n const first = toks[0];\n\n if (toks.length === 1) {\n if (first.k !== 'ident') return null;\n const f = FEATURES[first.v];\n if (!f) return null;\n return f.kind === 'range' ? f.get(env) !== 0 : f.get(env) !== f.off;\n }\n\n if (first.k === 'ident' && toks[1].k === ':') {\n const prefix = /^(min|max)-/.exec(first.v)?.[1];\n const f = FEATURES[prefix ? first.v.slice(4) : first.v];\n if (!f) return null;\n const rest = toks.slice(2);\n if (f.kind === 'discrete') {\n if (prefix || rest.length !== 1 || rest[0].k !== 'ident' || !f.values.includes(rest[0].v)) return null;\n return f.get(env) === rest[0].v;\n }\n const v = rangeValue(rest, f.type, env);\n if (v == null) return null;\n return compare(f.get(env), prefix === 'min' ? '>=' : prefix === 'max' ? '<=' : '=', v);\n }\n\n // Level-4 range syntax: `name op v`, `v op name`, or `v1 op name op v2`.\n const segments: Tok[][] = [[]];\n const ops: string[] = [];\n for (const t of toks) {\n if (t.k === 'op') { ops.push(t.v); segments.push([]); }\n else segments[segments.length - 1].push(t);\n }\n if (segments.some((s) => s.length === 0)) return null;\n const featureAt = (s: Tok[]): Feature | undefined =>\n (s.length === 1 && s[0].k === 'ident' ? FEATURES[s[0].v] : undefined);\n\n if (ops.length === 1) {\n const [lhs, rhs] = segments;\n const named = featureAt(lhs) ?? featureAt(rhs);\n if (!named) return null;\n if (named.kind !== 'range') return null;\n const nameFirst = featureAt(lhs) != null;\n const v = rangeValue(nameFirst ? rhs : lhs, named.type, env);\n if (v == null) return null;\n return nameFirst ? compare(named.get(env), ops[0], v) : compare(named.get(env), FLIP[ops[0]], v);\n }\n if (ops.length === 2) {\n const f = featureAt(segments[1]);\n if (!f || f.kind !== 'range') return null;\n const lt = ops.every((o) => o === '<' || o === '<=');\n const gt = ops.every((o) => o === '>' || o === '>=');\n if (!lt && !gt) return null;\n const lo = rangeValue(segments[0], f.type, env);\n const hi = rangeValue(segments[2], f.type, env);\n if (lo == null || hi == null) return null;\n const x = f.get(env);\n return compare(lo, ops[0], x) && compare(x, ops[1], hi);\n }\n return null;\n}\n\nconst RESERVED_TYPES = new Set(['not', 'and', 'or', 'only', 'layer']);\nconst TYPED_QUERY = /^(?:(not|only)\\s+)?(-?[a-z_][\\w-]*)(?:\\s+and\\s+([\\s\\S]+))?$/;\n\nfunction evaluateQuery(query: string, env: SvgMediaEnvironment): Tri {\n const leaves = {\n paren: (inner: string): Tri => evaluateFeature(inner, env),\n fn: (): Tri => null,\n };\n if (/^(?:\\(|not\\s+\\(|-?[a-z_][\\w-]*\\()/.test(query)) return evaluateCondition(query, leaves);\n const m = TYPED_QUERY.exec(query);\n if (!m || RESERVED_TYPES.has(m[2])) throw new ConditionSyntaxError(`invalid media query \"${query}\"`);\n const typed = triAnd(m[2] === 'all' || m[2] === env.type, m[3] ? evaluateCondition(m[3], leaves, false) : true);\n return m[1] === 'not' ? triNot(typed) : typed;\n}\n\n/**\n * Whether a media query list matches `env`. An empty list matches; a\n * malformed query in the list is `not all`, leaving its neighbors intact; an\n * unknown feature or value is unknown, which never matches, even under `not`.\n */\nexport function evaluateMediaQuery(list: string, env: SvgMediaEnvironment): boolean {\n const src = list.trim().toLowerCase();\n if (src === '') return true;\n return splitTopLevel(src, ',').some((raw) => {\n const query = raw.trim();\n if (query === '') return false;\n try {\n return evaluateQuery(query, env) === true;\n } catch (e) {\n if (e instanceof ConditionSyntaxError) return false;\n throw e;\n }\n });\n}\n","/**\n * SVG color / paint parsing. Handles the SVG-specific paint surface — the\n * sentinel `none`, `url(#id)` paint-server references, and `currentColor` —\n * then delegates the actual color tokenization (hex, `rgb()`/`rgba()`,\n * `hsl()`, and the full CSS named-color table) to the kit's `parseColor`.\n * Output is normalized to `#rrggbb` plus a separate 0..1 alpha so the rest\n * of the pipeline doesn't have to know about the encoding variants.\n */\n\nimport { parseColor, rgbaToHex } from '@weasel-js/core';\n\n/** Result of parsing a `fill=` / `stroke=` attribute value. */\nexport type ParsedColor =\n | { kind: 'none' }\n | { kind: 'solid'; color: string; alpha: number }\n | { kind: 'ref'; id: string; fallback?: { color: string; alpha: number } };\n\n/**\n * Parse an SVG paint string. Returns `null` for inputs we don't recognize\n * (so the caller can emit a warning and fall back). `currentColor` resolves\n * to black here as a last-resort default; callers that participate in the\n * cascade (`readPaint`, `readTextStyle`, `readTspanRun`) pre-resolve\n * `currentColor` against the inherited `color` via `resolveCurrentColor`\n * before this function ever sees it.\n */\nexport function parsePaintAttr(raw: string | null | undefined): ParsedColor | null {\n if (raw == null) return null;\n const s = raw.trim();\n if (s === '') return null;\n if (s === 'none') return { kind: 'none' };\n if (s.toLowerCase() === 'currentcolor') {\n return { kind: 'solid', color: '#000000', alpha: 1 };\n }\n // url(#id) reference, optionally followed by the fallback paint SVG's own\n // grammar allows — what a renderer takes when it cannot resolve the\n // reference. A mesh gradient or any other paint outside this package's\n // vocabulary arrives that way.\n const urlMatch = /^url\\(\\s*#([^)\\s]+)\\s*\\)(.*)$/.exec(s);\n if (urlMatch) {\n const out: ParsedColor = { kind: 'ref', id: urlMatch[1] };\n const rest = urlMatch[2].trim();\n if (rest !== '' && rest !== 'none') {\n const fallback = parsePaintAttr(rest);\n if (fallback?.kind === 'solid') {\n (out as { fallback?: { color: string; alpha: number } }).fallback =\n { color: fallback.color, alpha: fallback.alpha };\n }\n }\n return out;\n }\n // Everything else — hex, rgb()/rgba(), hsl()/hsla(), and named colors —\n // goes through the kit's CSS parser. It throws on unrecognized input;\n // we translate that into the `null` the caller expects.\n try {\n const [r, g, b, a] = parseColor(s);\n // Split into the `#rrggbb` + 0..1 alpha contract the rest of the SVG\n // pipeline depends on. `rgbaToHex` of a 3-tuple always emits 6-char,\n // lowercase hex; the alpha is carried separately.\n return { kind: 'solid', color: rgbaToHex([r, g, b]), alpha: a };\n } catch {\n return null;\n }\n}\n","/**\n * The presentation properties this parser reads through the cascade: whether\n * each inherits, and the one reader that turns its value into what the parser\n * produces. The parser reads every property through {@link readProperty}, and\n * `@supports` answers from the same readers ({@link isDeclarationHonored}), so\n * \"is this value honored\" and \"what is done with it\" cannot disagree.\n *\n * A reader returns `undefined` for a value it cannot read, and calls `warn`\n * when it reads one only approximately — a unit it does not convert, a keyword\n * it substitutes. A value is honored when it is read and nothing is warned.\n */\n\nimport type { FontVariantCaps, TextTransform } from '@weasel-js/core';\nimport { parsePaintAttr, type ParsedColor } from './color';\n\nexport type Warn = (message: string) => void;\n\ninterface PropertyDef<T> {\n /** Folded into the inherited `StyleContext` rather than read off the element. */\n readonly inherits: boolean;\n /** `value` arrives trimmed and never `inherit`. Keywords compare case-sensitively unless a reader folds case. */\n readonly read: (value: string, warn: Warn, prop: string) => T | undefined;\n}\n\n/** `text-transform` keywords the runs model carries. */\nconst TEXT_TRANSFORMS: ReadonlySet<string> = new Set(['none', 'uppercase', 'lowercase', 'capitalize']);\n\nconst DIMENSION = /^([+-]?(?:\\d+\\.?\\d*|\\.\\d+)(?:e[+-]?\\d+)?)([a-z%]*)$/i;\n\nfunction dimension(v: string): { n: number; unit: string } | undefined {\n const m = DIMENSION.exec(v);\n return m ? { n: Number(m[1]), unit: m[2].toLowerCase() } : undefined;\n}\n\nconst clamp01 = (n: number): number => (n < 0 ? 0 : n > 1 ? 1 : n);\n\n/** A bare number, or a length in one of `native` units; any other unit is read as its number and flagged. */\nconst length = (native: readonly string[], coercedAs: string) =>\n (v: string, warn: Warn, prop: string): number | undefined => {\n const d = dimension(v);\n if (!d) return undefined;\n if (d.unit && !native.includes(d.unit)) {\n warn(`${prop} \"${v}\" uses unit \"${d.unit}\", which is not converted; treated as ${d.n} ${coercedAs}`);\n }\n return d.n;\n };\n\nconst worldLength = length(['px'], 'world units');\n\nconst keyword = <W extends string>(...words: W[]) => (v: string): W | undefined =>\n (words as string[]).includes(v) ? (v as W) : undefined;\n\nconst isCurrentColor = (v: string): boolean => v.toLowerCase() === 'currentcolor';\n\n/** A paint as written: `currentColor` has been resolved by the caller, `context-*` has not. */\nexport type PaintValue = ParsedColor | { kind: 'context'; of: 'fill' | 'stroke' };\n\nfunction readPaint(v: string): PaintValue | undefined {\n if (v === 'context-fill') return { kind: 'context', of: 'fill' };\n if (v === 'context-stroke') return { kind: 'context', of: 'stroke' };\n return parsePaintAttr(v) ?? undefined;\n}\n\n/** `0..1` from a number or a percentage, clamped. */\nfunction readRatio(v: string): number | undefined {\n const d = dimension(v);\n if (!d || (d.unit !== '' && d.unit !== '%')) return undefined;\n return clamp01(d.unit === '%' ? d.n / 100 : d.n);\n}\n\nfunction readSolidColor(v: string, warn: Warn, prop: string): { color: string; alpha: number } | undefined {\n const parsed = parsePaintAttr(v);\n if (parsed?.kind !== 'solid') return undefined;\n if (isCurrentColor(v)) warn(`${prop}=\"${v}\" is read as black; it is not resolved against color`);\n return parsed;\n}\n\n/** `null` is `none`. */\nfunction readMarkerRef(v: string): string | null | undefined {\n if (v === 'none') return null;\n return /^url\\(\\s*#([^)\\s]+)\\s*\\)$/.exec(v)?.[1];\n}\n\nfunction readLinecap(v: string, warn: Warn): 'butt' | 'round' | 'square' | undefined {\n const cap = keyword('butt', 'round', 'square')(v);\n if (!cap) warn(`unsupported stroke-linecap: ${v}`);\n return cap;\n}\n\nfunction readLinejoin(v: string, warn: Warn): 'miter' | 'round' | 'bevel' | undefined {\n const join = keyword('miter', 'round', 'bevel')(v);\n if (join) return join;\n if (v === 'arcs' || v === 'miter-clip') {\n warn(`stroke-linejoin \"${v}\" not supported; falling back to miter`);\n return 'miter';\n }\n warn(`unsupported stroke-linejoin: ${v}`);\n return undefined;\n}\n\n/** `null` is `none`; an odd-length list is repeated to make the pattern even, as SVG says. */\nfunction readDashArray(v: string, warn: Warn): number[] | null | undefined {\n if (v === 'none' || v === '') return null;\n const nums: number[] = [];\n for (const t of v.split(/[\\s,]+/).filter(Boolean)) {\n const d = dimension(t);\n if (!d || (d.unit !== '' && d.unit !== 'px') || d.n < 0) {\n warn(`unrecognized stroke-dasharray: ${v}`);\n return undefined;\n }\n nums.push(d.n);\n }\n return nums.length % 2 === 1 ? [...nums, ...nums] : nums;\n}\n\nfunction readMiterLimit(v: string, warn: Warn): number | undefined {\n const d = dimension(v);\n if (d && d.unit === '' && d.n >= 1) return d.n;\n warn(`unrecognized stroke-miterlimit: ${v}`);\n return undefined;\n}\n\n/** The raw value, once it is known to be a color or `currentColor`. */\nfunction readColor(v: string): string | undefined {\n return isCurrentColor(v) || parsePaintAttr(v)?.kind === 'solid' ? v : undefined;\n}\n\n/** A percentage is relative to the parent's size (`fontScale`); anything else is an absolute `fontSize`. */\nfunction readFontSize(v: string, warn: Warn, prop: string): { fontSize?: number; fontScale?: number } | undefined {\n const d = dimension(v);\n if (d?.unit === '%') return { fontScale: d.n / 100 };\n const n = worldLength(v, warn, prop);\n return n == null ? undefined : { fontSize: n };\n}\n\nfunction readFontWeight(v: string): 'normal' | 'bold' | 'bolder' | number | undefined {\n if (v === 'normal' || v === 'bold' || v === 'bolder') return v;\n const d = dimension(v);\n return d && d.unit === '' && d.n >= 1 && d.n <= 1000 ? d.n : undefined;\n}\n\nfunction readFontStyle(v: string, warn: Warn): 'normal' | 'italic' | undefined {\n if (v === 'normal' || v === 'italic') return v;\n if (v === 'oblique') {\n warn('font-style \"oblique\" is read as italic');\n return 'italic';\n }\n return undefined;\n}\n\n/** `null` is `normal`. */\nfunction readLetterSpacing(v: string, warn: Warn, prop: string): number | null | undefined {\n return v === 'normal' ? null : worldLength(v, warn, prop);\n}\n\nexport interface Decoration { underline?: boolean; strikethrough?: boolean; overline?: boolean }\n\nfunction readDecoration(v: string, warn: Warn): Decoration {\n const out: Decoration = {};\n for (const t of v.toLowerCase().split(/\\s+/)) {\n if (t === 'underline') out.underline = true;\n else if (t === 'line-through') out.strikethrough = true;\n else if (t === 'overline') out.overline = true;\n // CSS lets a renderer decline to blink, so dropping it honors it.\n else if (t !== 'none' && t !== 'blink') warn(`text-decoration \"${v}\": \"${t}\" is not modeled; dropped`);\n }\n return out;\n}\n\n/** `small-caps` or `normal`, out of what may be a CSS 3 shorthand; any other\n * variant is one the run model does not carry. */\nfunction readFontVariant(v: string, warn: Warn): FontVariantCaps | undefined {\n let out: FontVariantCaps | undefined;\n for (const t of v.toLowerCase().split(/\\s+/)) {\n if (t === 'small-caps' || t === 'normal') out = t;\n else if (t) warn(`font-variant \"${v}\": \"${t}\" is not modeled; dropped`);\n }\n return out;\n}\n\nfunction readTextTransform(v: string): TextTransform | undefined {\n const t = v.toLowerCase();\n return TEXT_TRANSFORMS.has(t) ? (t as TextTransform) : undefined;\n}\n\nconst emLength = length(['em'], 'em');\n\n/**\n * `super` and `sub` are the presets `script` names; a percentage resolves\n * against the parent's font size, the unit `baselineShift` is already in; a\n * bare number is ems; `baseline` or zero is no shift.\n */\nfunction readBaselineShift(\n v: string, warn: Warn, prop: string,\n): { script?: 'super' | 'sub'; baselineShift?: number } | undefined {\n const k = v.toLowerCase();\n if (k === 'super' || k === 'sub') return { script: k };\n if (k === 'baseline') return {};\n const d = dimension(v);\n if (d?.unit === '%') return d.n === 0 ? {} : { baselineShift: d.n / 100 };\n const n = emLength(v, warn, prop);\n if (n == null) return undefined;\n return n === 0 ? {} : { baselineShift: n };\n}\n\nconst inherited = <T>(read: PropertyDef<T>['read']): PropertyDef<T> & { inherits: true } => ({ inherits: true, read });\nconst own = <T>(read: PropertyDef<T>['read']): PropertyDef<T> & { inherits: false } => ({ inherits: false, read });\n\nexport const PROPERTIES = {\n 'fill': inherited(readPaint),\n 'fill-opacity': inherited(readRatio),\n 'fill-rule': inherited(keyword('nonzero', 'evenodd')),\n 'stroke': inherited(readPaint),\n 'stroke-width': inherited(worldLength),\n 'stroke-opacity': inherited(readRatio),\n 'stroke-linecap': inherited(readLinecap),\n 'stroke-linejoin': inherited(readLinejoin),\n 'stroke-dasharray': inherited(readDashArray),\n 'stroke-miterlimit': inherited(readMiterLimit),\n 'marker-start': inherited(readMarkerRef),\n 'marker-mid': inherited(readMarkerRef),\n 'marker-end': inherited(readMarkerRef),\n 'color': inherited(readColor),\n 'font-size': inherited(readFontSize),\n 'font-family': inherited((v) => (v.length > 0 ? v : undefined)),\n 'font-weight': inherited(readFontWeight),\n 'font-style': inherited(readFontStyle),\n 'text-anchor': inherited(keyword('start', 'middle', 'end')),\n 'letter-spacing': inherited(readLetterSpacing),\n 'text-decoration': inherited(readDecoration),\n 'direction': inherited(keyword('ltr', 'rtl')),\n 'text-transform': inherited(readTextTransform),\n 'font-variant': inherited(readFontVariant),\n 'opacity': own(readRatio),\n 'stop-color': own(readSolidColor),\n 'stop-opacity': own(readRatio),\n 'baseline-shift': own(readBaselineShift),\n 'vector-effect': own(keyword('none', 'non-scaling-stroke')),\n} as const satisfies Record<string, PropertyDef<unknown>>;\n\nexport type PropertyName = keyof typeof PROPERTIES;\nexport type InheritedPropertyName = {\n [K in PropertyName]: (typeof PROPERTIES)[K]['inherits'] extends true ? K : never\n}[PropertyName];\nexport type PropertyValue<K extends PropertyName> =\n (typeof PROPERTIES)[K] extends PropertyDef<infer T> ? T : never;\n\nexport const INHERITED_PROPERTIES = (Object.keys(PROPERTIES) as PropertyName[])\n .filter((p): p is InheritedPropertyName => PROPERTIES[p].inherits);\n\nconst silent: Warn = () => {};\n\n/** Read a raw cascaded value of `prop`; `undefined` when absent or unreadable. */\nexport function readProperty<K extends PropertyName>(\n prop: K, raw: string | null | undefined, warn: Warn = silent,\n): PropertyValue<K> | undefined {\n if (raw == null) return undefined;\n const v = raw.trim();\n if (v === 'inherit') return undefined;\n return PROPERTIES[prop].read(v, warn, prop) as PropertyValue<K> | undefined;\n}\n\nfunction isPropertyName(prop: string): prop is PropertyName {\n return Object.prototype.hasOwnProperty.call(PROPERTIES, prop);\n}\n\n/**\n * Whether a declaration of `prop: value` would change what this parser\n * produces, exactly as asked. `inherit` is honored for inherited properties\n * only, since only the inheritance fold reads it.\n */\nexport function isDeclarationHonored(prop: string, value: string): boolean {\n const name = prop.toLowerCase();\n if (!isPropertyName(name)) return false;\n const v = value.trim();\n if (v === 'inherit') return PROPERTIES[name].inherits;\n let warned = false;\n return readProperty(name, v, () => { warned = true; }) !== undefined && !warned;\n}\n","/**\n * `@supports` evaluation. A declaration test asks whether this parser would\n * honor the declaration ({@link isDeclarationHonored}), not whether a browser\n * could parse it — the answer decides whether the guarded rules apply here.\n */\n\nimport { ConditionSyntaxError, evaluateCondition } from './condition';\nimport { parseDeclaration } from './cssScan';\nimport { isDeclarationHonored } from './properties';\n\nexport interface SupportsOptions {\n /** Answers `selector(…)`; without it every selector test is false. */\n readonly selector?: (selector: string) => boolean;\n}\n\n/**\n * Whether a `@supports` condition holds. `selector()` defers to\n * `opts.selector`; any other function and any unrecognized parenthesized\n * content is false, so `not` of one is true. A malformed condition is false.\n */\nexport function evaluateSupports(condition: string, opts: SupportsOptions = {}): boolean {\n try {\n return evaluateCondition(condition, {\n paren: (inner) => {\n const d = parseDeclaration(inner);\n return d != null && isDeclarationHonored(d.prop, d.value);\n },\n fn: (name, args) => name === 'selector' && (opts.selector?.(args) ?? false),\n }) === true;\n } catch (e) {\n if (e instanceof ConditionSyntaxError) return false;\n throw e;\n }\n}\n","/**\n * SVG style cascade: presentation attributes, `<style>` rules, `style=\"\"`, inheritance.\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 cascaded values onto\n * the inherited cascade once, and leaves read resolved values directly.\n */\n\nimport {\n parenEnd, parseDeclarations, skipBlock, skipString, splitTopLevel, stripComments, type Declaration,\n} from './cssScan';\nimport {\n DEFAULT_MEDIA_ENVIRONMENT, evaluateMediaQuery, mediaEnvironmentFor, type SvgMediaEnvironment,\n} from './media';\nimport {\n INHERITED_PROPERTIES, readProperty, type InheritedPropertyName, type PropertyName, type PropertyValue, type Warn,\n} from './properties';\nimport { evaluateSupports } from './supports';\n\nexport { parseDeclarations, type Declaration };\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<Partial<Record<InheritedPropertyName, string>>>;\n\n/** The empty cascade — seeds the root. */\nexport const EMPTY_STYLE: StyleContext = {};\n\n/** One selector from a style rule; a comma list becomes one rule per selector. */\nexport interface StyleRule {\n readonly selector: string;\n readonly declarations: readonly Declaration[];\n /** `[ids, classes/attributes/pseudo-classes, types/pseudo-elements]`. */\n readonly specificity: Specificity;\n /** Source position across every `<style>` in the document. */\n readonly order: number;\n /** The cascade layer's full dotted name; `''` is unlayered. An anonymous layer's segment starts with U+0000. */\n readonly layer: string;\n}\n\nexport type Specificity = readonly [number, number, number];\n\n/** Read an identifier (with escapes) starting at `i`; returns its end index. */\nfunction identEnd(s: string, i: number): number {\n while (i < s.length) {\n const ch = s[i];\n if (ch === '\\\\') i += 2;\n else if (/[\\w-]/.test(ch) || ch.charCodeAt(0) > 0x7f) i++;\n else break;\n }\n return i;\n}\n\nconst LEGACY_PSEUDO_ELEMENTS = new Set(['before', 'after', 'first-line', 'first-letter']);\nconst MAX_ARG_PSEUDOS = new Set(['not', 'is', 'matches', '-webkit-any', 'has']);\n\nfunction compareSpecificity(a: Specificity, b: Specificity): number {\n return a[0] - b[0] || a[1] - b[1] || a[2] - b[2];\n}\n\nfunction maxSpecificity(list: string): Specificity {\n let best: Specificity = [0, 0, 0];\n for (const sel of splitTopLevel(list, ',')) {\n const s = specificity(sel);\n if (compareSpecificity(s, best) > 0) best = s;\n }\n return best;\n}\n\n/** CSS Selectors 4 specificity of one complex selector (no comma list). */\nexport function specificity(selector: string): Specificity {\n let a = 0, b = 0, c = 0;\n const s = selector;\n let i = 0;\n while (i < s.length) {\n const ch = s[i];\n if (ch === '#') {\n a++;\n i = identEnd(s, i + 1);\n } else if (ch === '.') {\n b++;\n i = identEnd(s, i + 1);\n } else if (ch === '[') {\n b++;\n while (i < s.length && s[i] !== ']') {\n i = s[i] === '\"' || s[i] === \"'\" ? skipString(s, i) : i + 1;\n }\n i++;\n } else if (ch === ':') {\n const element = s[i + 1] === ':';\n const nameStart = i + (element ? 2 : 1);\n const nameEnd = identEnd(s, nameStart);\n const name = s.slice(nameStart, nameEnd).toLowerCase();\n let arg: string | null = null;\n i = nameEnd;\n if (s[i] === '(') {\n const end = parenEnd(s, i);\n arg = s.slice(i + 1, end - 1);\n i = end;\n }\n if (element || LEGACY_PSEUDO_ELEMENTS.has(name)) c++;\n else if (name === 'where') { /* contributes nothing */ }\n else if (MAX_ARG_PSEUDOS.has(name) && arg != null) {\n const m = maxSpecificity(arg);\n a += m[0]; b += m[1]; c += m[2];\n } else b++;\n } else if (/[a-zA-Z_\\\\-]/.test(ch) || ch.charCodeAt(0) > 0x7f) {\n c++;\n i = identEnd(s, i);\n } else {\n i++;\n }\n }\n return [a, b, c];\n}\n\n/** What a stylesheet's conditional at-rules are evaluated against. */\nexport interface StylesheetContext {\n /** The environment `@media` answers to; {@link DEFAULT_MEDIA_ENVIRONMENT} when omitted. */\n readonly media?: SvgMediaEnvironment;\n /** Answers `@supports selector(…)`; every selector test is false without it. */\n readonly selector?: (selector: string) => boolean;\n /** Receives a notice for each `@import`, which is never fetched. */\n readonly onWarn?: (message: string) => void;\n}\n\n/**\n * The cascade layers a document declares, in the order CSS Cascade 5 ranks\n * them. Several sheets share one, since a layer's position is fixed by its\n * first declaration anywhere in the document.\n */\nexport class CascadeLayers {\n private readonly children = new Map<string, string[]>();\n private anonymous = 0;\n\n /** Declare `name` (possibly dotted) inside `parent`, keeping any earlier position; returns its full name. */\n declare(parent: string, name: string): string {\n let full = parent;\n for (const segment of name.split('.')) {\n const child = full ? `${full}.${segment}` : segment;\n const siblings = this.children.get(full) ?? [];\n if (!siblings.includes(child)) {\n siblings.push(child);\n this.children.set(full, siblings);\n }\n full = child;\n }\n return full;\n }\n\n /** A fresh layer inside `parent` that nothing can reopen. */\n declareAnonymous(parent: string): string {\n return this.declare(parent, `\\u0000${this.anonymous++}`);\n }\n\n /**\n * Each layer's rank for normal declarations, higher winning: a layer's\n * sublayers rank below its own rules, in declaration order, and unlayered\n * rules (`''`) rank above every layer.\n */\n ranks(): ReadonlyMap<string, number> {\n const out = new Map<string, number>();\n const visit = (name: string): void => {\n for (const child of this.children.get(name) ?? []) visit(child);\n out.set(name, out.size);\n };\n visit('');\n return out;\n }\n}\n\n/**\n * Parse stylesheet text into rules. `@media` and `@supports` blocks\n * contribute their rules when their condition holds against `ctx`, nested to\n * any depth, and `@layer` blocks contribute theirs tagged with the layer,\n * which is declared into `layers`. `@import` is reported and not fetched;\n * every other at-rule (`@font-face`, `@container`, `@keyframes`, …) is\n * skipped whole, as are nested blocks inside a rule body. `order` continues\n * from `firstOrder` so several sheets share one source order.\n */\nexport function parseStylesheet(\n text: string, firstOrder = 0, ctx: StylesheetContext = {}, layers = new CascadeLayers(),\n): StyleRule[] {\n const src = stripComments(text).replace(/<!\\[CDATA\\[|\\]\\]>|<!--|-->/g, ' ');\n const rules: StyleRule[] = [];\n parseRuleList(src, 0, src.length, '', ctx, rules, { order: firstOrder, importsAllowed: true, layers });\n return rules;\n}\n\nconst IDENT = '-?[a-zA-Z_\\\\u0080-\\\\uffff][\\\\w\\\\u0080-\\\\uffff-]*';\nconst LAYER_NAME = new RegExp(`^${IDENT}(?:\\\\.${IDENT})*$`);\n\n/** The names in a `@layer` prelude, or null when any is malformed. */\nfunction layerNames(prelude: string): string[] | null {\n if (!prelude.trim()) return [];\n const names = splitTopLevel(prelude, ',').map((n) => n.trim());\n return names.every((n) => LAYER_NAME.test(n)) ? names : null;\n}\n\nconst AT_RULE = /^@([\\w-]+)\\s*([\\s\\S]*)$/;\n\ninterface ListState {\n order: number;\n /** `@import` is valid only at the top of a sheet, ahead of every rule but `@charset` and `@layer`. */\n importsAllowed: boolean;\n readonly layers: CascadeLayers;\n}\n\nfunction parseRuleList(\n src: string, from: number, to: number, layer: string, ctx: StylesheetContext, rules: StyleRule[], state: ListState,\n): void {\n let i = from;\n let preludeStart = from;\n while (i < to) {\n const ch = src[i];\n if (ch === '\"' || ch === \"'\") { i = skipString(src, i); continue; }\n if (ch === ';') {\n const text = src.slice(preludeStart, i).trim();\n const statement = AT_RULE.exec(text);\n const name = statement?.[1].toLowerCase();\n if (name === 'import' && state.importsAllowed) {\n ctx.onWarn?.(`@import ${statement?.[2]} is not fetched; its rules do not apply`);\n } else if (name === 'layer') {\n for (const n of layerNames(statement?.[2] ?? '') ?? []) state.layers.declare(layer, n);\n } else if (text && name !== 'charset') {\n state.importsAllowed = false;\n }\n i++;\n preludeStart = i;\n continue;\n }\n if (ch !== '{') { i++; continue; }\n const prelude = src.slice(preludeStart, i).trim();\n const end = Math.min(skipBlock(src, i), to);\n const at = AT_RULE.exec(prelude);\n state.importsAllowed = false;\n if (at) {\n const name = at[1].toLowerCase();\n const names = name === 'layer' ? layerNames(at[2]) : null;\n if (names && names.length <= 1) {\n const inner = names.length ? state.layers.declare(layer, names[0]) : state.layers.declareAnonymous(layer);\n parseRuleList(src, i + 1, end - 1, inner, ctx, rules, state);\n } else if (conditionHolds(name, at[2], ctx)) {\n parseRuleList(src, i + 1, end - 1, layer, ctx, rules, state);\n }\n } else if (prelude) {\n const declarations = parseDeclarations(src.slice(i + 1, end - 1));\n for (const raw of splitTopLevel(prelude, ',')) {\n const selector = raw.trim();\n if (selector) {\n rules.push({ selector, declarations, specificity: specificity(selector), order: state.order++, layer });\n }\n }\n }\n i = end;\n preludeStart = end;\n }\n}\n\nfunction conditionHolds(name: string, condition: string, ctx: StylesheetContext): boolean {\n if (name === 'media') return evaluateMediaQuery(condition, ctx.media ?? DEFAULT_MEDIA_ENVIRONMENT);\n if (name === 'supports') return evaluateSupports(condition, { selector: ctx.selector });\n return false;\n}\n\nfunction appliesAsCss(style: Element, ctx: StylesheetContext): boolean {\n const type = style.getAttribute('type')?.trim().toLowerCase();\n if (type && type !== 'text/css') return false;\n return evaluateMediaQuery(style.getAttribute('media') ?? '', ctx.media ?? DEFAULT_MEDIA_ENVIRONMENT);\n}\n\n/** A rule with its layer's rank for normal declarations; `!important` reverses it. */\ninterface RankedRule extends StyleRule {\n readonly rank: number;\n}\n\n/** Rules sorted ascending by (layer rank, specificity, source order): the cascade's order for normal declarations. */\nconst sheetCache = new WeakMap<Document, readonly RankedRule[]>();\n\n/**\n * Evaluate `doc`'s stylesheets against `media` now, reporting to `onWarn`.\n * A document never bound is read on first use against the environment its\n * root implies, with nothing reported.\n */\nexport function bindStylesheets(\n doc: Document, media: SvgMediaEnvironment, onWarn?: (message: string) => void,\n): void {\n sheetCache.set(doc, collectRules(doc, media, onWarn));\n}\n\nfunction documentRules(doc: Document): readonly RankedRule[] {\n const cached = sheetCache.get(doc);\n if (cached) return cached;\n const root = doc.documentElement;\n const rules = collectRules(doc, root ? mediaEnvironmentFor(root) : DEFAULT_MEDIA_ENVIRONMENT);\n sheetCache.set(doc, rules);\n return rules;\n}\n\nfunction collectRules(\n doc: Document, media: SvgMediaEnvironment, onWarn?: (message: string) => void,\n): readonly RankedRule[] {\n const ctx: StylesheetContext = { media, onWarn, selector: (s) => isValidSelector(doc, s) };\n const layers = new CascadeLayers();\n const rules: StyleRule[] = [];\n const styles = doc.getElementsByTagNameNS('*', 'style');\n for (let i = 0; i < styles.length; i++) {\n if (!appliesAsCss(styles[i], ctx)) continue;\n rules.push(...parseStylesheet(styles[i].textContent ?? '', rules.length, ctx, layers));\n }\n const ranks = layers.ranks();\n return rules\n .map((r) => ({ ...r, rank: ranks.get(r.layer) ?? 0 }))\n .sort((x, y) => x.rank - y.rank || compareCascade(x, y));\n}\n\nfunction compareCascade(x: StyleRule, y: StyleRule): number {\n return compareSpecificity(x.specificity, y.specificity) || x.order - y.order;\n}\n\nfunction isValidSelector(doc: Document, selector: string): boolean {\n const root = doc.documentElement;\n if (!root || !selector.trim()) return false;\n try {\n root.matches(selector);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction matches(el: Element, selector: string): boolean {\n try {\n return el.matches(selector);\n } catch {\n return false;\n }\n}\n\nconst elementCache = new WeakMap<Element, ReadonlyMap<string, string>>();\n\n/**\n * The cascaded value of every property an author rule or `style=\"\"` sets on\n * `el`. Lowest to highest: normal rules, normal inline, `!important` rules,\n * `!important` inline (CSS Cascade 5). Layers order the rules within each\n * importance, reversed for `!important`. Presentation attributes sit below\n * all of these and are left to {@link ownProp}.\n */\nfunction authorDeclarations(el: Element): ReadonlyMap<string, string> {\n const cached = elementCache.get(el);\n if (cached) return cached;\n const rules = el.ownerDocument ? documentRules(el.ownerDocument) : [];\n const matched = rules.filter((r) => matches(el, r.selector));\n const inline = parseDeclarations(el.getAttribute('style') ?? '');\n const out = new Map<string, string>();\n const importantOrder = [...matched].sort((x, y) => y.rank - x.rank || compareCascade(x, y));\n for (const [important, ordered] of [[false, matched], [true, importantOrder]] as const) {\n for (const r of ordered) {\n for (const d of r.declarations) if (d.important === important) out.set(d.prop, d.value);\n }\n for (const d of inline) if (d.important === important) out.set(d.prop, d.value);\n }\n elementCache.set(el, out);\n return out;\n}\n\n/**\n * Resolve an element's own (cascaded, pre-inheritance) value for a property:\n * stylesheet rules and `style=\"\"` by CSS precedence, then the presentation\n * attribute, which ranks below any author rule (SVG2).\n */\nexport function ownProp(el: Element, prop: PropertyName): string | null {\n return authorDeclarations(el).get(prop) ?? el.getAttribute(prop);\n}\n\n/**\n * Fold an element's own cascaded values ({@link ownProp}) 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: Partial<Record<InheritedPropertyName, string>> | null = null;\n for (const prop of INHERITED_PROPERTIES) {\n const own = ownProp(el, prop);\n // `color: currentColor` is `inherit` by another name (CSS Color 4).\n if (own == null || own === 'inherit' || (prop === 'color' && own.trim().toLowerCase() === 'currentcolor')) 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 raw;\n const color = readProperty('color', style['color']);\n return color == null || color.toLowerCase() === 'currentcolor' ? '#000000' : color;\n}\n\n/** An element's own value of `prop`, read by the property's one reader. */\nexport function ownValue<K extends PropertyName>(el: Element, prop: K, warn?: Warn): PropertyValue<K> | undefined {\n return readProperty(prop, ownProp(el, prop), warn);\n}\n\n/** The inherited value of `prop` in effect at `style`, read by the property's one reader. */\nexport function styleValue<K extends InheritedPropertyName>(\n style: StyleContext, prop: K, warn?: Warn,\n): PropertyValue<K> | undefined {\n return readProperty(prop, style[prop], warn);\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 { applyMatrix, formatMatrix, isIdentity, parseTransform, 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 // A transform carries the origin as its translation, since SVG applies\n // patternTransform to x/y as well; without one, x/y is the plainer form.\n const [a, b, c, d] = paint.transform ?? [1, 0, 0, 1];\n const placement = formatMatrix([a, b, c, d, origin.x, origin.y]);\n if (paint.transform && !isIdentity([a, b, c, d, 0, 0]) && placement) {\n attrs.push(`patternTransform=\"${placement}\"`);\n } else 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 m = parseTransform(el.getAttribute('patternTransform'), onWarn);\n const origin = applyMatrix(m, x, y);\n const paint: PatternFill = { fill: 'pattern', pattern: spec };\n if (origin.x !== 0 || origin.y !== 0) paint.origin = origin;\n if (!isIdentity([m[0], m[1], m[2], m[3], 0, 0])) paint.transform = [m[0], m[1], m[2], m[3]];\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, resolveMarkerSize } from '@weasel-js/core';\nimport type {\n FillStyle, GradStop, GradientUnits, MarkerEntry, MarkerPaint, MarkerRef, Path, ScreenLength,\n} from '@weasel-js/core';\nimport { ownProp, ownValue } from './cascade';\nimport { readProperty } from './properties';\nimport { trimNumber } from './transform';\nimport { patternXml } from './patterns';\nimport { collectElementsByTag, type ElementTable } from './elements';\nimport { serializePathD } from './path-serializer';\n\n/** Collected gradient definitions, keyed by element id. */\nexport type GradientTable = Map<string, FillStyle>;\n\n/**\n * The namespace weasel's own paint servers are written in, and the prefix they\n * are written under. A conic gradient has no SVG element to target — SVG has\n * `linearGradient` and `radialGradient` and nothing else — so it goes out as a\n * foreign-namespaced def that this package reads back and every other renderer\n * skips in favor of the paint fallback color beside the reference.\n *\n * A registered paint kind's own `toSvg` may use this prefix too: the root\n * declares it whenever any paint in the document lacks a native SVG form.\n */\nexport const WEASEL_NS = 'urn:weasel-js:svg';\nexport const WEASEL_NS_PREFIX = 'wzl';\n\n/** `true` when SVG has a paint server for this kind, so the reference needs no\n * fallback color and the root needs no foreign namespace. */\n/** Whether SVG has its own paint server for paint kind `kind`: solids, the\n * linear and radial gradients, and patterns. Any other kind is written in\n * weasel's namespace with a fallback color, which other renderers paint flat. */\nexport function nativeSvgKind(kind: string): boolean {\n return kind === 'solid' || kind === 'linear-gradient' || kind === 'radial-gradient' || kind === 'pattern';\n}\n\nfunction hasNativeSvgForm(paint: FillStyle): boolean {\n return nativeSvgKind(paint.fill ?? 'solid');\n}\n\n/**\n * The spaces `interpolate` can name, as SVG spells them. SVG's own\n * `color-interpolation` carries `sRGB` and `linearRGB` only, so anything\n * perceptual goes out as a namespaced attribute a foreign renderer ignores —\n * which leaves it interpolating in sRGB. That is a shifted midpoint rather\n * than a lost paint, so these gradients keep their native element and take no\n * fallback color.\n */\nconst INTERPOLATE_SPACES = new Set(['rgb', 'oklab', 'oklch']);\n\n/** Whether a gradient interpolating through `space` blends the same in every\n * SVG renderer — only sRGB, the default. A perceptual space still exports,\n * but renderers other than weasel blend it in sRGB. */\nexport function nativeSvgSpace(space: string | null | undefined): boolean {\n return !space || space === 'rgb';\n}\n\n/** The `wzl:interpolate` attribute a gradient needs, or `''` for the sRGB\n * default every other renderer already assumes. */\nfunction interpolateAttr(space: string | undefined): string {\n if (nativeSvgSpace(space)) return '';\n return ` ${WEASEL_NS_PREFIX}:interpolate=\"${space}\"`;\n}\n\n/** `interpolate` off a gradient element, or `undefined` — for the field's\n * absence and for a space this package does not model alike. */\nfunction readInterpolate(el: Element, elements: ElementTable): 'oklab' | 'oklch' | undefined {\n const raw = inheritedAttr(el, elements, `${WEASEL_NS_PREFIX}:interpolate`)\n ?? el.getAttributeNS(WEASEL_NS, 'interpolate');\n if (raw === 'oklab' || raw === 'oklch') return raw;\n return undefined;\n}\n\n/** Whether any gradient in the document names a space SVG cannot, so the root\n * has to declare the namespace the attribute is written in. */\nfunction usesInterpolateAttr(paint: FillStyle): boolean {\n const space = (paint as { interpolate?: string }).interpolate;\n return !nativeSvgSpace(space) && INTERPOLATE_SPACES.has(space!);\n}\n\n/** The local name of a tag, prefix stripped. */\nfunction localName(tag: string): string {\n const i = tag.indexOf(':');\n return (i < 0 ? tag : tag.slice(i + 1)).toLowerCase();\n}\n\nconst GRADIENT_TAGS = new Set([\n 'lineargradient', 'radialgradient', 'conicgradient', `${WEASEL_NS_PREFIX}:conicgradient`,\n 'meshgradient', `${WEASEL_NS_PREFIX}:meshgradient`,\n]);\n\nconst XLINK_NS = 'http://www.w3.org/1999/xlink';\n\n/** Read every gradient definition in the document, keyed by element id. */\nexport function collectGradients(svg: Element, onWarn?: (m: string) => void): GradientTable {\n const out: GradientTable = new Map();\n const elements = collectElementsByTag(svg, GRADIENT_TAGS);\n for (const [id, el] of elements) {\n const tag = localName(el.tagName);\n const paint = tag === 'lineargradient'\n ? readLinearGradient(el, elements, onWarn)\n : tag === 'conicgradient'\n ? readConicGradient(el, elements, onWarn)\n : tag === 'meshgradient'\n ? readMeshGradient(el, onWarn)\n : readRadialGradient(el, elements, onWarn);\n if (paint) out.set(id, paint);\n }\n warnUnsupportedDefsChildren(svg, onWarn);\n return out;\n}\n\n/** Paint servers, `<marker>`, `<clipPath>` and `<style>` aside, a `<defs>` child is\n * something this package does not model (a `<use>` template, a `<filter>`).\n * Say so once here. */\nfunction warnUnsupportedDefsChildren(svg: Element, onWarn?: (m: string) => void): void {\n if (!onWarn) return;\n const defs = svg.getElementsByTagName('defs');\n for (let d = 0; d < defs.length; d++) {\n const root = defs[d];\n for (let i = 0; i < root.children.length; i++) {\n const child = root.children[i];\n const tag = child.tagName.toLowerCase();\n if (GRADIENT_TAGS.has(tag) || GRADIENT_TAGS.has(localName(tag))) continue;\n if (tag === 'pattern' || tag === 'marker' || tag === 'clippath' || tag === 'style') 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 = ownProp(c, 'stop-color') ?? '#000000';\n const parsed = readProperty('stop-color', colorAttr, onWarn);\n if (parsed) {\n const alpha = ownValue(c, 'stop-opacity') ?? parsed.alpha;\n stops.push({ offset, color: alpha < 1 ? applyAlpha(parsed.color, alpha) : parsed.color });\n } else {\n onWarn?.(`gradient stop has unrecognized stop-color: ${colorAttr}`);\n stops.push({ offset, color: '#000000' });\n }\n }\n return stops;\n}\n\nfunction applyAlpha(hex: string, alpha: number): string {\n // Pack alpha into an 8-digit hex so it round-trips through weasel's\n // string-color storage. This is non-standard CSS hex but parses cleanly\n // back via our color.ts parser.\n const a = Math.max(0, Math.min(255, Math.round(alpha * 255)));\n return `${hex}${a.toString(16).padStart(2, '0')}`;\n}\n\n/** SVG `gradientUnits` → the kit's `GradientUnits`. SVG's default is\n * `objectBoundingBox`, which is what the attribute defaults above assume\n * (`x2=\"1\"`, `r=\"0.5\"`), so the two have to be read together. */\nfunction readGradientUnits(el: Element, elements: ElementTable): 'bounds' | 'world' {\n return inheritedAttr(el, elements, 'gradientUnits') === 'userSpaceOnUse' ? 'world' : 'bounds';\n}\n\n/** `gradientTransform` has no slot in the kit's gradient model, so a gradient\n * carrying one paints in the wrong place rather than not at all. */\nfunction warnGradientTransform(\n el: Element, elements: ElementTable, onWarn?: (m: string) => void,\n): void {\n const t = inheritedAttr(el, elements, 'gradientTransform');\n if (t != null && t.trim() !== '') {\n onWarn?.(`gradientTransform=\"${t}\" is not modeled; the gradient paints untransformed`);\n }\n}\n\nfunction num(raw: string | null, fallback: number): number {\n if (raw == null) return fallback;\n const n = parseRatio(raw);\n return Number.isFinite(n) ? n : fallback;\n}\n\nfunction readLinearGradient(\n el: Element, elements: ElementTable, onWarn?: (m: string) => void,\n): FillStyle | null {\n warnGradientTransform(el, elements, onWarn);\n return {\n fill: 'linear-gradient',\n from: {\n x: num(inheritedAttr(el, elements, 'x1'), 0),\n y: num(inheritedAttr(el, elements, 'y1'), 0),\n },\n to: {\n x: num(inheritedAttr(el, elements, 'x2'), 1),\n y: num(inheritedAttr(el, elements, 'y2'), 0),\n },\n stops: inheritedStops(el, elements, onWarn),\n units: readGradientUnits(el, elements),\n interpolate: readInterpolate(el, elements),\n };\n}\n\nfunction readRadialGradient(\n el: Element, elements: ElementTable, onWarn?: (m: string) => void,\n): FillStyle | null {\n warnGradientTransform(el, elements, onWarn);\n return {\n fill: 'radial-gradient',\n center: {\n x: num(inheritedAttr(el, elements, 'cx'), 0.5),\n y: num(inheritedAttr(el, elements, 'cy'), 0.5),\n },\n radius: num(inheritedAttr(el, elements, 'r'), 0.5),\n stops: inheritedStops(el, elements, onWarn),\n units: readGradientUnits(el, elements),\n interpolate: readInterpolate(el, elements),\n };\n}\n\nfunction readConicGradient(\n el: Element, elements: ElementTable, onWarn?: (m: string) => void,\n): FillStyle | null {\n warnGradientTransform(el, elements, onWarn);\n return {\n fill: 'conic-gradient',\n center: {\n x: num(inheritedAttr(el, elements, 'cx'), 0.5),\n y: num(inheritedAttr(el, elements, 'cy'), 0.5),\n },\n angle: num(inheritedAttr(el, elements, 'angle'), 0),\n stops: inheritedStops(el, elements, onWarn),\n units: readGradientUnits(el, elements),\n interpolate: readInterpolate(el, elements),\n };\n}\n\n/**\n * A `<wzl:meshGradient>` back into the `mesh-gradient` paint core registers.\n *\n * Every patch carries all twelve (or sixteen) of its points, so nothing here\n * infers a shared edge — the trap that makes SVG's own abandoned\n * `<meshgradient>` hard to read correctly. A patch whose attributes do not\n * parse is dropped with a warning rather than guessed at: a mesh missing a\n * patch is visibly wrong, where a mesh holding an invented one is not.\n */\nfunction readMeshGradient(el: Element, onWarn?: (m: string) => void): FillStyle | null {\n const patches: { points: { x: number; y: number }[]; colors: string[] }[] = [];\n for (let i = 0; i < el.children.length; i++) {\n const child = el.children[i];\n if (localName(child.tagName) !== 'patch') continue;\n const points = (child.getAttribute('points') ?? '').trim().split(/\\s+/)\n .filter(Boolean)\n .map((pair) => {\n const [x, y] = pair.split(',').map(Number);\n return { x, y };\n });\n const colors = (child.getAttribute('colors') ?? '').trim().split(/\\s+/).filter(Boolean);\n const sane = (points.length === 12 || points.length === 16)\n && points.every((p) => Number.isFinite(p.x) && Number.isFinite(p.y))\n && colors.length === 4;\n if (!sane) {\n onWarn?.(`<${WEASEL_NS_PREFIX}:patch> with ${points.length} points and ${colors.length} colors — dropped`);\n continue;\n }\n patches.push({ points, colors });\n }\n if (patches.length === 0) return null;\n const space = el.getAttribute('interpolate') ?? el.getAttributeNS(WEASEL_NS, 'interpolate');\n return {\n fill: 'mesh-gradient',\n patches,\n units: el.getAttribute('gradientUnits') === 'objectBoundingBox' ? 'bounds' : 'world',\n ...(space === 'oklab' || space === 'oklch' ? { interpolate: space } : {}),\n } as unknown as FillStyle;\n}\n\n/**\n * Pre-pass that assigns stable serialization ids to the paint servers —\n * gradients and patterns — used by any leaf in the tree. We key on object\n * identity so two leaves sharing the exact same `FillStyle` reference reuse\n * one `<defs>` entry; structurally equal but distinct objects get separate\n * ids.\n */\nexport class PaintServerRegistry {\n private byPaint = new Map<FillStyle, string>();\n private order: FillStyle[] = [];\n private counter = 0;\n\n // Marker defs referenced by any stroke, by `<defs>` id in first-use order.\n // An unsized reference's id is the marker key itself, not a minted counter\n // id: `parseSvg` reads a `marker-end=\"url(#id)\"` fragment back as the marker\n // key directly when the registry knows it, so a synthetic id would come\n // back as a stranger. A sized one gets a def of its own, stamped with its\n // key and size so the parser can read the reference back whole.\n private markers = new Map<string, { key: string; size?: ScreenLength }>();\n\n // Clip paths, in first-use order. Identity, not value: two groups clipped by\n // equal outlines get a def each, which costs bytes and misleads nobody.\n private clips: Path[] = [];\n private clipIds = new Map<Path, string>();\n\n register(paint: FillStyle): string {\n const existing = this.byPaint.get(paint);\n if (existing) return existing;\n const id = paint.fill === 'pattern' ? `pat${this.counter++}` : `grad${this.counter++}`;\n this.byPaint.set(paint, id);\n this.order.push(paint);\n return id;\n }\n\n /**\n * The `fill` / `stroke` attribute value referencing this paint server: a\n * `url(#id)` reference, plus the fallback paint SVG's own grammar allows\n * after one for any kind SVG cannot express. A renderer that cannot resolve\n * the reference takes the fallback instead of dropping the fill, which is\n * the difference between a flat shape and a vanished one.\n */\n ref(paint: FillStyle): string {\n const id = this.register(paint);\n if (hasNativeSvgForm(paint)) return `url(#${id})`;\n return `url(#${id}) ${paintFallback(paint)}`;\n }\n\n /** The paint kind of each registered paint, once, in first-use order. */\n paintKinds(): string[] {\n return [...new Set(this.order.map((paint) => paint.fill ?? 'solid'))];\n }\n\n /** Whether any registered paint serializes outside SVG's own vocabulary, so\n * the root has to declare {@link WEASEL_NS}. */\n usesPrivateNamespace(): boolean {\n return this.order.some((paint) => !hasNativeSvgForm(paint) || usesInterpolateAttr(paint))\n || [...this.markers.values()].some((m) => m.size !== undefined || writesInset(getMarker(m.key)));\n }\n\n /** The `<defs>` id for a marker reference — the key itself when it has no\n * size, else the key suffixed with the size. `undefined` when nothing is\n * registered under the key, so a caller emits no attribute at all rather\n * than a `url(#…)` pointing at a def that will never be written. */\n markerId(ref: MarkerRef): string | undefined {\n const key = typeof ref === 'string' ? ref : ref.key;\n const size = typeof ref === 'string' ? undefined : ref.size;\n if (getMarker(key) === undefined) return undefined;\n const id = size === undefined\n ? key\n : `${key}-s${typeof size === 'number' ? trimNumber(size) : `${trimNumber(size.px)}px`}`;\n if (!this.markers.has(id)) this.markers.set(id, size === undefined ? { key } : { key, size });\n return id;\n }\n\n /** Mint (or recall) the `<defs>` id for a clip outline. */\n clipId(path: Path): string {\n const existing = this.clipIds.get(path);\n if (existing) return existing;\n const id = `clip${this.clips.length}`;\n this.clipIds.set(path, id);\n this.clips.push(path);\n return id;\n }\n\n /** Emit `<defs>...</defs>` XML for every registered paint server, marker\n * and clip path. */\n toDefsXml(onWarn?: (m: string) => void): string {\n if (this.order.length === 0 && this.markers.size === 0 && this.clips.length === 0) {\n return '';\n }\n const parts: string[] = ['<defs>'];\n for (const paint of this.order) {\n parts.push(paintServerXml(this.byPaint.get(paint)!, paint, onWarn));\n }\n for (const [id, { key, size }] of this.markers) {\n const entry = getMarker(key);\n if (!entry) continue;\n if (entry.toSvg) {\n if (size !== undefined) onWarn?.(`marker \"${key}\" writes its own <marker> def, which cannot carry a reference's size; written at its own size`);\n parts.push(entry.toSvg(id, entry));\n } else {\n parts.push(defaultMarkerXml(id, entry, onWarn, key, size));\n }\n }\n for (const path of this.clips) {\n parts.push(\n `<clipPath id=\"${this.clipIds.get(path)!}\">`\n + `<path d=\"${serializePathD(path)}\"/>`\n + '</clipPath>',\n );\n }\n parts.push('</defs>');\n return parts.join('');\n }\n}\n\n/** Whether `entry`'s def carries `wzl:inset`: SVG has no way to say how far\n * a line stops short of its marker, so the parser needs it spelled out. */\nfunction writesInset(entry: MarkerEntry | undefined): boolean {\n return entry !== undefined && !entry.toSvg && (entry.inset ?? 0) !== 0;\n}\n\n/** The `<marker>` def for an entry with no `toSvg` of its own. Unsized, one\n * marker unit is one stroke width, as the kit draws it. A sized reference is\n * drawn in user space at `resolveMarkerSize`'s reading of its size, and\n * records its key and size in the private namespace for the parser. The\n * inset goes there too, in marker units either way. */\nfunction defaultMarkerXml(\n id: string, entry: MarkerEntry, onWarn?: (m: string) => void, key?: string, size?: ScreenLength,\n): string {\n const unit = size === undefined ? 1 : resolveMarkerSize({ key: key ?? id, size }, 1);\n const path = entry.path({ size: unit, stroke: { paint: { fill: 'solid', color: '#000' } } });\n const d = serializePathD(path);\n const fill = markerPaintAttrs('fill', entry.fill, id, onWarn);\n const outline = entry.outline\n ? ` ${markerPaintAttrs('stroke', entry.outline.paint, id, onWarn)} stroke-width=\"${trimNumber(entry.outline.width * unit)}\"`\n + ' stroke-linecap=\"round\" stroke-linejoin=\"round\"'\n : '';\n // The kit turns every start marker around, which is what SVG 2 spells\n // `auto-start-reverse`; plain `auto` would point a start head into the line.\n const orient = typeof entry.orient === 'number'\n ? trimNumber((entry.orient * 180) / Math.PI)\n : 'auto-start-reverse';\n const units = size === undefined\n ? 'markerUnits=\"strokeWidth\" markerWidth=\"8\" markerHeight=\"8\"'\n : `markerUnits=\"userSpaceOnUse\" markerWidth=\"${trimNumber(8 * unit)}\" markerHeight=\"${trimNumber(8 * unit)}\"`\n + ` ${WEASEL_NS_PREFIX}:key=\"${key}\" ${WEASEL_NS_PREFIX}:size=\"${\n typeof size === 'number' ? trimNumber(size) : `${trimNumber(size.px)}px`}\"`;\n const inset = writesInset(entry) ? ` ${WEASEL_NS_PREFIX}:inset=\"${trimNumber(entry.inset!)}\"` : '';\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}\" ${units}${inset}` +\n ` refX=\"0\" refY=\"0\" orient=\"${orient}\" overflow=\"visible\">` +\n `<path d=\"${d}\" ${fill}${outline}/></marker>`\n );\n}\n\n/** A marker paint as `fill` / `stroke` attributes. `'line'` is SVG 2's\n * `context-stroke`; a paint server has no `<defs>` slot from here, so it\n * falls back to the line's paint and says so. */\nfunction markerPaintAttrs(\n attr: 'fill' | 'stroke',\n paint: MarkerPaint | undefined,\n id: string,\n onWarn?: (m: string) => void,\n): string {\n if (paint === 'none') return `${attr}=\"none\"`;\n if (paint === undefined || paint === 'line') return `${attr}=\"context-stroke\"`;\n if ('color' in paint && (paint.fill === undefined || paint.fill === 'solid')) {\n return paint.opacity != null && paint.opacity !== 1\n ? `${attr}=\"${paint.color}\" ${attr}-opacity=\"${trimNumber(paint.opacity)}\"`\n : `${attr}=\"${paint.color}\"`;\n }\n onWarn?.(`marker \"${id}\" ${attr} is a paint server, which a <marker> def cannot reference here; written as the line's paint`);\n return `${attr}=\"context-stroke\"`;\n}\n\n/** One paint server's `<defs>` entry: the built-in mapping, else the kind's\n * own `toSvg`, else nothing plus a warning. The referencing element already\n * carries `fill=\"url(#id)\"`, so a silent omission is a dangling reference and\n * the shape vanishes in a viewer. */\nfunction paintServerXml(id: string, paint: FillStyle, onWarn?: (m: string) => void): string {\n if (paint.fill === 'pattern') return patternXml(id, paint, onWarn);\n const builtin = gradientXml(id, paint);\n if (builtin) return builtin;\n const kind = getPaintKind(paint.fill);\n const custom = kind?.toSvg?.(id, paint);\n if (custom) return custom;\n onWarn?.(kind\n ? `${paint.fill} fill has no vector form — omitted from <defs>`\n : `${paint.fill} fill is not registered — omitted from <defs>; a kind loaded on demand needs \\`await warmSvg(nodes)\\` before a synchronous export`);\n return '';\n}\n\n/** `GradientUnits` → SVG `gradientUnits`. `'screen'` (the kit's default, and\n * a viewport-fixed wash) has no SVG analog at all; it lowers to user space,\n * which at least puts the paint somewhere the geometry is. */\nfunction gradientUnitsAttr(units: GradientUnits | undefined): string {\n return units === 'bounds' ? 'objectBoundingBox' : 'userSpaceOnUse';\n}\n\nfunction gradientXml(id: string, paint: FillStyle): string {\n if (paint.fill === 'linear-gradient') {\n const stops = paint.stops.map(stopXml).join('');\n return (\n `<linearGradient id=\"${id}\" gradientUnits=\"${gradientUnitsAttr(paint.units)}\" ` +\n `x1=\"${trimNumber(paint.from.x)}\" y1=\"${trimNumber(paint.from.y)}\" ` +\n `x2=\"${trimNumber(paint.to.x)}\" y2=\"${trimNumber(paint.to.y)}\"` +\n `${interpolateAttr(paint.interpolate)}>${stops}</linearGradient>`\n );\n }\n if (paint.fill === 'conic-gradient') {\n const stops = paint.stops.map(stopXml).join('');\n const P = WEASEL_NS_PREFIX;\n return (\n `<${P}:conicGradient id=\"${id}\" gradientUnits=\"${gradientUnitsAttr(paint.units)}\" ` +\n `cx=\"${trimNumber(paint.center.x)}\" cy=\"${trimNumber(paint.center.y)}\" ` +\n `angle=\"${trimNumber(paint.angle)}\"` +\n `${interpolateAttr(paint.interpolate)}>${stops}</${P}:conicGradient>`\n );\n }\n if (paint.fill === 'radial-gradient') {\n const stops = paint.stops.map(stopXml).join('');\n return (\n `<radialGradient id=\"${id}\" gradientUnits=\"${gradientUnitsAttr(paint.units)}\" ` +\n `cx=\"${trimNumber(paint.center.x)}\" cy=\"${trimNumber(paint.center.y)}\" ` +\n `r=\"${trimNumber(paint.radius)}\"` +\n `${interpolateAttr(paint.interpolate)}>${stops}</radialGradient>`\n );\n }\n return '';\n}\n\n/**\n * The color a renderer that cannot resolve the reference should paint. `none`\n * when the paint has no single color to name — nothing painted is at least\n * honest, where an invented black is not.\n */\nfunction paintFallback(paint: FillStyle): string {\n const color = getPaintKind(paint.fill)?.colorOf(paint);\n if (!color) return 'none';\n // Whoever reads the fallback is by definition an older renderer, so the\n // packed alpha comes off rather than riding out as an 8-digit hex.\n const packed = /^#([0-9a-f]{6})[0-9a-f]{2}$/i.exec(color);\n return packed ? `#${packed[1].toLowerCase()}` : color;\n}\n\nfunction stopXml(s: GradStop): string {\n // Detect packed-alpha hex (#rrggbbaa) and split out stop-opacity.\n const m = /^#([0-9a-f]{6})([0-9a-f]{2})$/i.exec(s.color);\n if (m) {\n const alpha = parseInt(m[2], 16) / 255;\n return `<stop offset=\"${trimNumber(s.offset)}\" stop-color=\"#${m[1].toLowerCase()}\" stop-opacity=\"${trimNumber(alpha)}\"/>`;\n }\n return `<stop offset=\"${trimNumber(s.offset)}\" stop-color=\"${s.color}\"/>`;\n}\n","/**\n * 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, resolveMarkerSize, solid } from '@weasel-js/core';\nimport type { MarkerEntry, MarkerPaint } from '@weasel-js/core';\nimport {\n rectElementToPath, circleToPath, ellipseToPath, lineToPath,\n parsePoints, polylineToPath, polygonToPath,\n} from './shapes';\nimport { transformPath } from './shapes';\nimport type {\n Matrix, NamespaceMeta, NamespacedElement, ParseOptions, ParseResult,\n SvgNode, SvgPaint, SvgPathNode, SvgStroke, SvgTextNode, SvgImageNode,\n ScreenLength,\n} from './types';\nimport type { StyledRun, TextStyle, TextPaint, FillStyle, Stroke } from '@weasel-js/core';\nimport { multiply, parseTransform, decomposeRotation, rebaseTransform, rotationComponent, isIdentity } from './transform';\nimport { boundsOfPath, layoutRuns, resolveRuns, resolveScreenLength, resolveTextStyle } from '@weasel-js/core';\nimport { IDENTITY_MATRIX } from './types';\nimport { anchorOffset } from './textAnchor';\nimport { collectGradients, WEASEL_NS, WEASEL_NS_PREFIX, type GradientTable } from './gradients';\nimport { collectPatterns } from './patterns';\nimport { collectElementsByTag } from './elements';\nimport {\n bindStylesheets, deriveStyle, EMPTY_STYLE, ownProp, ownValue, resolveCurrentColor, styleValue, type StyleContext,\n} from './cascade';\nimport { mediaEnvironmentFor } from './media';\nimport { readProperty, type InheritedPropertyName } from './properties';\n\n// Every tag set here is compared against a lowercased `tagName`.\n/** Element tags we accept and lower; anything else triggers a warning. */\nconst SUPPORTED_LEAF_TAGS = new Set([\n 'rect', 'circle', 'ellipse', 'line', 'polyline', 'polygon', 'path',\n]);\n\nconst SUPPORTED_GROUP_TAGS = new Set(['g', 'svg']);\n\nconst IGNORED_TAGS = new Set([\n 'defs', 'lineargradient', 'radialgradient', 'pattern', 'marker', 'clippath',\n 'title', 'desc', 'metadata', 'style',\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 bindStylesheets(doc, mediaEnvironmentFor(root, opts.media), onWarn);\n\n const namespaces = opts.namespaces ?? {};\n // Build a URI → prefix index for fast lookup during traversal.\n const uriToPrefix = new Map<string, string>();\n for (const [prefix, uri] of Object.entries(namespaces)) {\n uriToPrefix.set(uri, prefix);\n }\n\n const documentMeta = collectDocumentMeta(root, uriToPrefix);\n\n // Both paint-server kinds resolve through one `url(#id)` table, so a\n // patterned fill needs no separate lookup path at every use site.\n const gradients = collectGradients(root, onWarn);\n for (const [id, paint] of collectPatterns(root, onWarn)) gradients.set(id, paint);\n const rootStyle = deriveStyle(EMPTY_STYLE, root);\n const clips = collectClipPaths(root, onWarn);\n const nodes = parseChildren(root, IDENTITY_MATRIX, rootStyle, gradients, clips, onWarn, uriToPrefix);\n const markers = ingestMarkers(root, nodes, gradients, onWarn);\n\n const result: ParseResult = { nodes, warnings };\n if (markers.length > 0) result.markers = markers;\n if (documentMeta) result.documentMeta = documentMeta;\n const viewBox = parseViewBoxAttr(root.getAttribute('viewBox'));\n if (viewBox) result.viewBox = viewBox;\n const width = parseRootLength(root.getAttribute('width'), 'width', onWarn);\n if (width != null) result.width = width;\n const height = parseRootLength(root.getAttribute('height'), 'height', onWarn);\n if (height != null) result.height = height;\n // First direct-child <title> wins. Per SVG spec only one is meaningful.\n for (let i = 0; i < root.children.length; i++) {\n const c = root.children[i];\n if (c.tagName.toLowerCase() === 'title') {\n result.title = c.textContent ?? '';\n break;\n }\n }\n return result;\n}\n\n/**\n * Parse an SVG `viewBox=\"x y width height\"` attribute. Returns undefined\n * on null/empty/malformed input. Numbers may be separated by whitespace\n * and/or commas (SVG spec).\n */\nfunction parseViewBoxAttr(\n raw: string | null,\n): { x: number; y: number; width: number; height: number } | undefined {\n if (raw == null) return undefined;\n const parts = raw.trim().split(/[\\s,]+/).filter(Boolean);\n if (parts.length !== 4) return undefined;\n const nums = parts.map(parseFloat);\n if (nums.some((n) => !Number.isFinite(n))) return undefined;\n return { x: nums[0], y: nums[1], width: nums[2], height: nums[3] };\n}\n\n/**\n * Root `width` / `height` as a bare user-unit number. A CSS unit or a\n * percentage is not converted — there is no viewport to resolve it against —\n * so the number is taken as-is and the discarded unit is reported.\n */\nfunction parseRootLength(\n raw: string | null, name: string, onWarn: (m: string) => void,\n): number | undefined {\n if (raw == null) return undefined;\n const n = parseFloat(raw);\n if (!Number.isFinite(n)) return undefined;\n const unit = /^\\s*[-+]?[\\d.eE+-]+\\s*([a-z%]+)\\s*$/i.exec(raw)?.[1];\n if (unit) onWarn(`<svg ${name}=\"${raw}\"> unit \"${unit}\" is not converted; read as ${n}`);\n return n;\n}\n\nfunction collectDocumentMeta(\n root: Element,\n uriToPrefix: Map<string, string>,\n): NamespaceMeta | undefined {\n if (uriToPrefix.size === 0) return undefined;\n const meta: NamespaceMeta = {};\n\n // Root-level namespaced attributes.\n for (let i = 0; i < root.attributes.length; i++) {\n const a = root.attributes[i];\n if (!a.namespaceURI) continue;\n const prefix = uriToPrefix.get(a.namespaceURI);\n if (!prefix) continue;\n const bucket = (meta[prefix] ??= {});\n (bucket.attrs ??= {})[a.localName] = a.value;\n }\n\n // Root-level namespaced child elements. The body of these is collected\n // recursively as a generic XML-element tree; geometry inside them is NOT\n // promoted to SvgNodes (that's the consumer's job if they want it).\n for (let i = 0; i < root.children.length; i++) {\n const c = root.children[i];\n if (!c.namespaceURI) continue;\n const prefix = uriToPrefix.get(c.namespaceURI);\n if (!prefix) continue;\n const bucket = (meta[prefix] ??= {});\n const elements = (bucket.elements ??= {});\n const list = (elements[c.localName] ??= []);\n list.push(collectNamespacedElement(c, uriToPrefix));\n }\n\n return Object.keys(meta).length > 0 ? meta : undefined;\n}\n\nfunction collectNamespacedElement(\n el: Element,\n uriToPrefix: Map<string, string>,\n): NamespacedElement {\n const result: NamespacedElement = { attrs: {} };\n for (let i = 0; i < el.attributes.length; i++) {\n const a = el.attributes[i];\n // For namespaced *elements* we collect every attribute (namespaced or\n // not) under the element — unlike root attrs where we filter by NS.\n // Treat `xmlns:*` as structural and skip.\n if (a.name.startsWith('xmlns')) continue;\n result.attrs[a.localName] = a.value;\n }\n\n let hasChildElements = false;\n for (let i = 0; i < el.children.length; i++) {\n const c = el.children[i];\n if (!c.namespaceURI) continue;\n const prefix = uriToPrefix.get(c.namespaceURI);\n if (!prefix) continue; // child in undeclared NS: drop\n hasChildElements = true;\n const children = (result.children ??= {});\n const list = (children[c.localName] ??= []);\n list.push(collectNamespacedElement(c, uriToPrefix));\n }\n\n if (!hasChildElements && el.textContent != null && el.textContent.trim() !== '') {\n result.text = el.textContent;\n }\n\n return result;\n}\n\n/** Per-element namespace meta: walked at every parsed SVG element. */\nfunction collectElementMeta(\n el: Element,\n uriToPrefix: Map<string, string>,\n): NamespaceMeta | undefined {\n if (uriToPrefix.size === 0) return undefined;\n const meta: NamespaceMeta = {};\n for (let i = 0; i < el.attributes.length; i++) {\n const a = el.attributes[i];\n if (!a.namespaceURI) continue;\n const prefix = uriToPrefix.get(a.namespaceURI);\n if (!prefix) continue;\n const bucket = (meta[prefix] ??= {});\n (bucket.attrs ??= {})[a.localName] = a.value;\n }\n // Namespaced child elements on a *standard* SVG element (e.g. a <g>) are\n // also surfaced under elements[] in the same shape used at the root.\n for (let i = 0; i < el.children.length; i++) {\n const c = el.children[i];\n if (!c.namespaceURI) continue;\n const prefix = uriToPrefix.get(c.namespaceURI);\n if (!prefix) continue;\n const bucket = (meta[prefix] ??= {});\n const elements = (bucket.elements ??= {});\n const list = (elements[c.localName] ??= []);\n list.push(collectNamespacedElement(c, uriToPrefix));\n }\n return Object.keys(meta).length > 0 ? meta : undefined;\n}\n\n/** Element-id → the outline of a `<clipPath>` def, in the document's own\n * user space. */\ntype ClipTable = ReadonlyMap<string, Path>;\n\n/**\n * Lower every `<clipPath>` in the document to one outline.\n *\n * SVG unions a `<clipPath>`'s shapes and a `Path` carries a single outline,\n * so only a one-shape def is modeled; the rest warn and clip nothing, which\n * shows the whole group rather than hiding it.\n */\nfunction collectClipPaths(root: Element, onWarn: (m: string) => void): ClipTable {\n const out = new Map<string, Path>();\n for (const [id, el] of collectElementsByTag(root, new Set(['clippath']))) {\n const units = el.getAttribute('clipPathUnits');\n if (units && units !== 'userSpaceOnUse') {\n onWarn(`<clipPath id=\"${id}\"> uses clipPathUnits=\"${units}\", which is not modeled`);\n continue;\n }\n const shapes: Element[] = [];\n for (let i = 0; i < el.children.length; i++) {\n if (SUPPORTED_LEAF_TAGS.has(el.children[i].tagName.toLowerCase())) shapes.push(el.children[i]);\n }\n if (shapes.length !== 1) {\n onWarn(\n `<clipPath id=\"${id}\"> holds ${shapes.length} shapes the kit can lower;`\n + ' only a single-shape clip is modeled, so it clips nothing',\n );\n continue;\n }\n const shape = shapes[0];\n const local = parseTransform(shape.getAttribute('transform'), onWarn);\n const path = lowerLeaf(shape, shape.tagName.toLowerCase(), local, onWarn);\n if (path) out.set(id, path);\n }\n return out;\n}\n\n/** The outline a `clip-path` attribute names, in the element's own user space\n * — the space `ctm` maps into, which is also where its children's geometry\n * lands. */\nfunction clipFor(\n el: Element,\n ctm: Matrix,\n clips: ClipTable,\n onWarn: (m: string) => void,\n): Path | undefined {\n const attr = el.getAttribute('clip-path');\n if (!attr || attr === 'none') return undefined;\n const ref = /^url\\(\\s*#([^)\\s]+)\\s*\\)$/.exec(attr.trim());\n if (!ref) {\n onWarn(`clip-path=\"${attr}\" is not a url(#id) reference; the clip is dropped`);\n return undefined;\n }\n const path = clips.get(ref[1]);\n if (!path) {\n onWarn(`clip-path references #${ref[1]}, which no <clipPath> in the document defines`);\n return undefined;\n }\n return transformPath(path, ctm);\n}\n\nfunction parseChildren(\n parent: Element,\n ctm: Matrix,\n style: StyleContext,\n gradients: GradientTable,\n clips: ClipTable,\n onWarn: (m: string) => void,\n uriToPrefix: Map<string, string>,\n): SvgNode[] {\n const out: SvgNode[] = [];\n for (let i = 0; i < parent.children.length; i++) {\n const el = parent.children[i];\n // Skip namespaced children — they belong to `meta.elements`, not nodes.\n // (DOM gives SVG-native elements `http://www.w3.org/2000/svg`.)\n const ns = el.namespaceURI;\n if (ns && ns !== 'http://www.w3.org/2000/svg') continue;\n const node = parseElement(el, ctm, style, gradients, clips, onWarn, uriToPrefix);\n if (node) {\n if (Array.isArray(node)) out.push(...node);\n else out.push(node);\n }\n }\n return out;\n}\n\nfunction parseElement(\n el: Element,\n ctm: Matrix,\n style: StyleContext,\n gradients: GradientTable,\n clips: ClipTable,\n onWarn: (m: string) => void,\n uriToPrefix: Map<string, string>,\n): SvgNode | SvgNode[] | null {\n const tag = el.tagName.toLowerCase();\n if (IGNORED_TAGS.has(tag)) return null;\n if (tag === 'g' && el.hasAttribute('data-weasel-image')) {\n const image = parseCroppedImage(el, ctm, onWarn);\n if (image) {\n const meta = collectElementMeta(el, uriToPrefix);\n if (meta) image.meta = meta;\n return image;\n }\n }\n if (tag === 'g') {\n const local = parseTransform(el.getAttribute('transform'), onWarn);\n const childCtm = multiply(ctm, local);\n const childStyle = deriveStyle(style, el);\n const children = parseChildren(el, childCtm, childStyle, gradients, clips, onWarn, uriToPrefix);\n const opacity = ownValue(el, 'opacity');\n const group: SvgNode = { kind: 'group', children };\n const clip = clipFor(el, childCtm, clips, onWarn);\n if (clip) group.clip = clip;\n if (opacity != null) group.opacity = opacity;\n const meta = collectElementMeta(el, uriToPrefix);\n if (meta) group.meta = meta;\n return group;\n }\n if (SUPPORTED_GROUP_TAGS.has(tag)) {\n // Nested <svg> — a transparent group that establishes a viewport at\n // (x, y). Inheritance flows through it; clipping does not exist here.\n const childStyle = deriveStyle(style, el);\n const x = parseFloat(el.getAttribute('x') ?? '0');\n const y = parseFloat(el.getAttribute('y') ?? '0');\n const offset: Matrix = [1, 0, 0, 1, Number.isFinite(x) ? x : 0, Number.isFinite(y) ? y : 0];\n if (el.hasAttribute('viewBox')) {\n onWarn('nested <svg> viewBox is not modeled; its children are not rescaled');\n }\n return parseChildren(el, multiply(ctm, offset), childStyle, gradients, clips, onWarn, uriToPrefix);\n }\n if (tag === 'text') {\n const textNode = parseTextElement(el, ctm, style, gradients, onWarn);\n if (textNode && !Array.isArray(textNode) && textNode.kind === 'text') {\n const meta = collectElementMeta(el, uriToPrefix);\n if (meta) textNode.meta = meta;\n }\n return textNode;\n }\n if (tag === 'image') {\n const imageNode = parseImageElement(el, ctm, onWarn);\n if (imageNode) {\n const meta = collectElementMeta(el, uriToPrefix);\n if (meta) imageNode.meta = meta;\n }\n return imageNode;\n }\n if (!SUPPORTED_LEAF_TAGS.has(tag)) {\n onWarn(`unsupported element: <${el.tagName}>`);\n return null;\n }\n const localTransform = parseTransform(el.getAttribute('transform'), onWarn);\n // First, lower the leaf into its UNROTATED form (using just the inherited\n // CTM). Then try to extract the LEAF's local transform as a pure rotation\n // about the leaf's AABB center. When that succeeds, store the angle on\n // node.rotation. When it fails AND the leaf transform is non-identity,\n // fall back to baking the full composed matrix into geometry (legacy\n // behavior) and warn if a rotation is present that we are about to lose.\n let path = lowerLeaf(el, tag, ctm, onWarn);\n if (!path) return null;\n let rotation: number | undefined;\n if (!isIdentity(localTransform)) {\n // `path` is already through `ctm`, so the element's own transform has to\n // be too before it is compared against these bounds.\n const worldLocal = rebaseTransform(ctm, localTransform);\n const bounds = pathAabb(path);\n const cx = bounds.x + bounds.width / 2;\n const cy = bounds.y + bounds.height / 2;\n const angle = worldLocal && decomposeRotation(worldLocal, cx, cy);\n if (!worldLocal) {\n onWarn('leaf transform sits under a singular parent transform; dropped');\n } else if (angle != null) {\n rotation = angle;\n } else {\n // Bake the matrix in — match legacy behavior.\n path = transformPath(path, worldLocal);\n const rotComp = rotationComponent(worldLocal);\n if (Math.abs(rotComp) > 1e-4) {\n onWarn(`leaf transform has a rotational component that can't be cleanly stored as rotation; baked into geometry (may not round-trip identically)`);\n }\n }\n }\n const leafStyle = deriveStyle(style, el);\n const fill = readPaint(leafStyle, 'fill', '#000000', gradients, onWarn);\n const stroke = readStroke(leafStyle, gradients, onWarn, isNonScalingStroke(el));\n const opacity = ownValue(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 if (styleValue(leafStyle, 'fill-rule') === '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 opacity = styleValue(style, `${attr}-opacity`, onWarn);\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 = readProperty(attr, raw, onWarn);\n if (!parsed) {\n onWarn(`unrecognized ${attr} value: ${raw}`);\n return { kind: 'solid', color: defaultColor };\n }\n // Outside a marker there is no context element, and SVG paints `none`.\n if (parsed.kind === 'none' || parsed.kind === 'context') return { kind: 'none' };\n if (parsed.kind === 'ref') {\n const paint = gradients.get(parsed.id);\n if (!paint) {\n // A fallback color beside the reference is the author saying what to\n // paint when it cannot be resolved, so taking it is the documented\n // behavior rather than a recovery — nothing to warn about.\n if (parsed.fallback) {\n const flat: SvgPaint = { kind: 'solid', color: parsed.fallback.color };\n const a = opacity ?? (parsed.fallback.alpha < 1 ? parsed.fallback.alpha : undefined);\n if (a != null) (flat as { opacity?: number }).opacity = a;\n return flat;\n }\n onWarn(`${attr} references unknown gradient #${parsed.id}`);\n return { kind: 'solid', color: defaultColor };\n }\n return { kind: 'gradient', paint: opacity != null ? { ...paint, opacity } : paint };\n }\n const out: SvgPaint = { kind: 'solid', color: parsed.color };\n const a = opacity ?? (parsed.alpha < 1 ? parsed.alpha : undefined);\n if (a != null) (out as { opacity?: number }).opacity = a;\n return out;\n}\n\nfunction readStroke(\n style: StyleContext,\n gradients: GradientTable,\n onWarn: (msg: string) => void,\n nonScaling = false,\n): SvgStroke | undefined {\n const inheritedStroke = style['stroke'] ?? null;\n const inheritedWidth = style['stroke-width'] ?? null;\n if (inheritedStroke == null && inheritedWidth == null) return undefined;\n const paint = readPaint(style, 'stroke', '#000000', gradients, onWarn);\n if (paint.kind === 'none') return undefined;\n const n = styleValue(style, 'stroke-width', onWarn) ?? 1;\n const stroke: SvgStroke = { paint, width: nonScaling ? { px: n } : n };\n const opacity = styleValue(style, 'stroke-opacity', onWarn);\n if (opacity != null) stroke.opacity = opacity;\n const cap = styleValue(style, 'stroke-linecap', onWarn);\n if (cap) stroke.cap = cap;\n const join = styleValue(style, 'stroke-linejoin', onWarn);\n if (join) stroke.join = join;\n const dash = styleValue(style, 'stroke-dasharray', onWarn);\n if (dash) stroke.dash = dash;\n const miterLimit = styleValue(style, 'stroke-miterlimit', onWarn);\n if (miterLimit != null) stroke.miterLimit = miterLimit;\n for (const [attr, field] of [\n ['marker-start', 'markerStart'],\n ['marker-mid', 'markerMid'],\n ['marker-end', 'markerEnd'],\n ] as const) {\n // An id with no registered entry stays as-is for `ingestMarkers`, which\n // reads the document's own `<marker>` once the tree is built.\n const id = styleValue(style, attr, onWarn);\n if (id) stroke[field] = id;\n }\n return stroke;\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: readonly InheritedPropertyName[] = [\n 'stroke', 'stroke-width', 'stroke-opacity', 'stroke-linecap',\n 'stroke-linejoin', 'stroke-dasharray', 'stroke-miterlimit',\n 'marker-start', 'marker-mid', 'marker-end',\n];\n\n/** Whether this element pins its stroke width to rendered pixels.\n *\n * Read off the element rather than the cascade: `vector-effect` is one of the\n * few presentation attributes SVG does not inherit, so a `<g>` carrying it\n * must not hand it to its children. */\nfunction isNonScalingStroke(el: Element): boolean {\n return ownValue(el, 'vector-effect') === 'non-scaling-stroke';\n}\n\nfunction ownStrokeStyle(el: Element): StyleContext {\n const out: Partial<Record<InheritedPropertyName, 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 `<text>` element into an `SvgTextNode`. Reads geometry\n * from x/y plus optional `data-weasel-width` / `data-weasel-height`\n * (preserved across weasel→SVG round-trips); falls back to font-metric\n * estimates when those attrs are absent (external SVG sources).\n *\n * Child `<tspan>` elements with their own font/fill attrs become\n * `StyledRun`s on the node. Plain text without `<tspan>` produces no\n * `runs` and the node's `text` is the raw text content.\n */\nconst XLINK_NS = 'http://www.w3.org/1999/xlink';\n\nfunction parseImageElement(\n el: Element,\n ctm: Matrix,\n onWarn: (m: string) => void,\n): SvgImageNode | null {\n const href = imageHref(el);\n if (!href) {\n onWarn('<image> without href; dropped');\n return null;\n }\n const node = imageNodeAt(el, el, href, ctm, onWarn);\n if (el.hasAttribute('preserveAspectRatio')\n && el.getAttribute('preserveAspectRatio') !== 'none') {\n onWarn('<image> preserveAspectRatio is not modeled; the box is taken literally');\n }\n return node;\n}\n\nfunction imageHref(el: Element): string | null {\n return el.getAttribute('href')\n ?? el.getAttributeNS(XLINK_NS, 'href')\n ?? el.getAttribute('xlink:href');\n}\n\n/**\n * The image node whose box is `boxEl`'s `x` / `y` / `width` / `height` and\n * whose rotation and opacity are `ownerEl`'s. The two are one element for a\n * plain `<image>`, and the viewport and its wrapping `<g>` for the cropped\n * form `serialize.ts` writes.\n */\nfunction imageNodeAt(\n boxEl: Element,\n ownerEl: Element,\n href: string,\n ctm: Matrix,\n onWarn: (m: string) => void,\n): SvgImageNode {\n const num = (raw: string | null, fallback: number): number => {\n if (raw == null) return fallback;\n const n = parseFloat(raw);\n return Number.isFinite(n) ? n : fallback;\n };\n const rawX = num(boxEl.getAttribute('x'), 0);\n const rawY = num(boxEl.getAttribute('y'), 0);\n const rawW = num(boxEl.getAttribute('width'), 0);\n const rawH = num(boxEl.getAttribute('height'), 0);\n // Map both corners through the inherited CTM and take their AABB, so\n // translate / scale / flip land on the box. A rotation in the *inherited*\n // transform inflates it; the element's own transform is decomposed below.\n const px = (x: number, y: number): [number, number] =>\n [ctm[0] * x + ctm[2] * y + ctm[4], ctm[1] * x + ctm[3] * y + ctm[5]];\n const [x0, y0] = px(rawX, rawY);\n const [x1, y1] = px(rawX + rawW, rawY + rawH);\n const node: SvgImageNode = {\n kind: 'image',\n href,\n x: Math.min(x0, x1),\n y: Math.min(y0, y1),\n width: Math.abs(x1 - x0),\n height: Math.abs(y1 - y0),\n };\n const opacity = ownValue(ownerEl, 'opacity');\n if (opacity != null) node.opacity = opacity;\n const localTransform = parseTransform(ownerEl.getAttribute('transform'), onWarn);\n if (!isIdentity(localTransform)) {\n const worldLocal = rebaseTransform(ctm, localTransform);\n const cx = node.x + node.width / 2;\n const cy = node.y + node.height / 2;\n const angle = worldLocal && decomposeRotation(worldLocal, cx, cy);\n if (!worldLocal) {\n onWarn('<image> transform sits under a singular parent transform; dropped');\n } else if (angle != null) {\n node.rotation = angle;\n } else {\n const rotComp = rotationComponent(worldLocal);\n if (Math.abs(rotComp) > 1e-4) {\n onWarn('<image> transform has a rotational component that can\\'t be cleanly stored as rotation; dropped (may not round-trip identically)');\n }\n }\n }\n return node;\n}\n\n/**\n * Read back the cropped image form `serialize.ts` writes for a source rect or\n * a flip: `<g data-weasel-image>` → `<svg viewBox>` → unit-square `<image>`.\n * `null` when the group does not have that shape, so the caller parses it as\n * an ordinary group.\n */\nfunction parseCroppedImage(\n g: Element,\n ctm: Matrix,\n onWarn: (m: string) => void,\n): SvgImageNode | null {\n const viewport = [...g.children].find((c) => c.tagName.toLowerCase() === 'svg');\n const img = viewport && [...viewport.children].find((c) => c.tagName.toLowerCase() === 'image');\n const href = img && imageHref(img);\n const source = viewport && parseViewBoxAttr(viewport.getAttribute('viewBox'));\n if (!img || !href || !source) return null;\n const node = imageNodeAt(viewport, g, href, ctm, onWarn);\n if (source.x !== 0 || source.y !== 0 || source.width !== 1 || source.height !== 1) {\n node.source = source;\n }\n const flip = parseTransform(img.getAttribute('transform'), onWarn);\n if (flip[0] < 0) node.flipX = true;\n if (flip[3] < 0) node.flipY = true;\n return node;\n}\n\nconst XML_NS = 'http://www.w3.org/XML/1998/namespace';\n\n/**\n * Does `xml:space=\"preserve\"` apply to this element? The attribute inherits,\n * so an ancestor can set it.\n *\n * weasel's own `<text>` output carries it, because the runs model stores real\n * line breaks and SVG's default whitespace handling would collapse them away.\n */\nfunction preservesSpace(el: Element): boolean {\n for (let e: Element | null = el; e; e = e.parentElement) {\n const v = e.getAttributeNS(XML_NS, 'space') ?? e.getAttribute('xml:space');\n if (v === 'preserve') return true;\n if (v === 'default') return false;\n }\n return false;\n}\n\n/**\n * Apply SVG's default whitespace handling to a `<text>` element's runs, in\n * place: newlines dropped, tabs folded to spaces, runs of spaces collapsed to\n * one, and leading / trailing space stripped across the element as a whole.\n *\n * Without this, importing any pretty-printed SVG drags the source file's\n * indentation into the document text — and, because the height estimate\n * counts newlines, reports a one-line label as four lines tall.\n */\nfunction collapseRunWhitespace(runs: StyledRun[]): void {\n let atStart = true;\n let lastWasSpace = false;\n for (const run of runs) {\n let out = '';\n for (const ch of run.text.replace(/\\n/g, '').replace(/[\\t\\r]/g, ' ')) {\n if (ch === ' ') {\n if (atStart || lastWasSpace) continue;\n out += ' ';\n lastWasSpace = true;\n continue;\n }\n out += ch;\n lastWasSpace = false;\n atStart = false;\n }\n run.text = out;\n }\n for (let i = runs.length - 1; i >= 0; i--) {\n if (runs[i].text === '') continue;\n if (runs[i].text.endsWith(' ')) runs[i].text = runs[i].text.slice(0, -1);\n break;\n }\n for (let i = runs.length - 1; i >= 0; i--) {\n if (runs[i].text === '') runs.splice(i, 1);\n }\n}\n\n/** Average glyph advance as a fraction of the em. Sans-serif Latin runs\n * 0.5–0.6; erring wide is the safer miss. */\nconst ESTIMATED_GLYPH_ADVANCE_EM = 0.6;\n\n/**\n * Width of an external `<text>`'s longest line, through the same layout\n * `kit:text` paints with. With no registered font able to measure it, the\n * layout reports nothing, and the width is estimated from the em instead.\n */\nfunction laidOutWidth(runs: readonly StyledRun[], style: TextStyle, plain: string): number {\n const resolved = resolveTextStyle(style);\n const { bounds } = layoutRuns(resolveRuns(runs.length > 0 ? runs : [{ text: plain }], resolved), {\n maxWidth: Infinity,\n lineHeight: resolved.lineHeight,\n align: resolved.align,\n direction: resolved.direction,\n });\n if (bounds.width > 0) return bounds.width;\n const longest = plain.split('\\n').reduce((max, line) => Math.max(max, line.length), 0);\n return longest * resolved.fontSize * ESTIMATED_GLYPH_ADVANCE_EM;\n}\n\nfunction parseTextElement(\n el: Element,\n ctm: Matrix,\n style: StyleContext,\n gradients: GradientTable,\n onWarn: (m: string) => void,\n): SvgNode | null {\n const num = (raw: string | null, fallback: number): number => {\n if (raw == null) return fallback;\n const n = parseFloat(raw);\n return Number.isFinite(n) ? n : fallback;\n };\n const localTransform = parseTransform(el.getAttribute('transform'), onWarn);\n // Use only the inherited CTM to position the text's anchor; the\n // element-local transform is decomposed below so a pure rotation about\n // the text box's center is surfaced as `node.rotation` rather than\n // baked into the anchor (and lost).\n const m = ctm;\n\n const rawX = num(el.getAttribute('x'), 0);\n const rawY = num(el.getAttribute('y'), 0);\n // Translate the anchor point through the accumulated transform. Skew /\n // non-uniform scale on the text node lower the round-trip honestly but\n // skew the box dimensions — the rare cases warn and lose styling.\n const ax = m[0] * rawX + m[2] * rawY + m[4];\n const ay = m[1] * rawX + m[3] * rawY + m[5];\n\n const leafStyle = deriveStyle(style, el);\n const textStyle = readTextStyle(leafStyle, onWarn);\n const textPaint = readTextPaint(leafStyle, gradients, onWarn, isNonScalingStroke(el));\n const fontSize = resolveScreenLength(textStyle.fontSize ?? 16, 1);\n const lineHeight = textStyle.lineHeight ?? 1.2;\n\n const dominantBaseline = el.getAttribute('dominant-baseline');\n const explicitTopAnchor = dominantBaseline === 'text-before-edge'\n || dominantBaseline === 'hanging';\n // If serialized by us, `y` is already the top edge. Otherwise SVG's\n // default is `y` = baseline of the first line — shift up by one\n // line of cap-height so weasel's box top approximates the cap-line.\n const topY = explicitTopAnchor ? ay : ay - fontSize;\n\n // `baseline-shift` is legal and inheritable on <text> itself, and unlike\n // every other run key it has no node-level home to be read into — so a bare\n // text child would drop it. Seed those children with it instead; a <tspan>\n // naming its own still wins, as the SVG cascade says.\n const inheritedShift = ownValue(el, 'baseline-shift', onWarn) ?? {};\n\n // Walk children: text nodes become plain run text; <tspan> elements\n // become StyledRuns with their attribute overrides applied.\n const runs: StyledRun[] = [];\n for (let i = 0; i < el.childNodes.length; i++) {\n const child = el.childNodes[i];\n if (child.nodeType === 3 /* TEXT_NODE */) {\n const t = child.textContent ?? '';\n if (!t) continue;\n runs.push({ text: t, ...inheritedShift });\n } else if (child.nodeType === 1 /* ELEMENT_NODE */) {\n const sp = child as Element;\n if (sp.tagName.toLowerCase() !== 'tspan') {\n onWarn(`<text> child <${sp.tagName}> not supported; flattening text content`);\n const t = sp.textContent ?? '';\n if (t) runs.push({ text: t, ...inheritedShift });\n continue;\n }\n const run = readTspanRun(sp, gradients, leafStyle, onWarn);\n runs.push(run);\n }\n }\n if (!preservesSpace(el)) collapseRunWhitespace(runs);\n const plain = runs.map((r) => r.text).join('');\n\n // data-weasel-* attrs win; otherwise the box is what the text lays out to.\n const dataW = num(el.getAttribute('data-weasel-width'), NaN);\n const dataH = num(el.getAttribute('data-weasel-height'), NaN);\n const width = Number.isFinite(dataW) ? dataW : laidOutWidth(runs, textStyle, plain);\n // Newlines in the text drive line count for height estimation.\n const lines = (plain.match(/\\n/g)?.length ?? 0) + 1;\n const height = Number.isFinite(dataH) ? dataH : fontSize * lineHeight * lines;\n\n const opacity = ownValue(el, 'opacity');\n const node: SvgTextNode = {\n kind: 'text',\n x: ax - anchorOffset(textStyle, width),\n y: topY,\n width,\n height,\n text: plain,\n };\n // Only attach `runs` when at least one run carries non-default styling —\n // single-run plain text is cleaner without it. `runsToPlainText(runs)`\n // must equal `text` per kit invariants, so the array must match exactly.\n //\n // \"Any key but `text`\" rather than an enumeration of the styling keys:\n // `readTspanRun` sets a field only when it parsed one, so the two are\n // equivalent, and the enumerated form silently dropped every run whose\n // only styling was a key added later — which is exactly how `stroke`\n // arrived and vanished.\n const hasStyling = runs.some(\n (r) => Object.entries(r).some(([k, v]) => k !== 'text' && v !== undefined),\n );\n if (hasStyling) node.runs = runs;\n if (el.getAttribute('data-weasel-wrap') === 'true') textStyle.wrap = true;\n if (el.getAttribute('data-weasel-align') === 'justify') textStyle.align = 'justify';\n const va = el.getAttribute('data-weasel-vertical-align');\n if (va === 'center' || va === 'bottom') node.verticalAlign = va;\n if (Object.keys(textStyle).length > 0) node.style = textStyle;\n // `!== undefined`, not `!= null`: `null` is the document saying `fill=\"none\"`.\n if (textPaint.fill !== undefined) node.fill = textPaint.fill;\n if (textPaint.stroke != null) node.stroke = textPaint.stroke;\n if (opacity != null) node.opacity = opacity;\n // Try to extract the element-local transform as a pure rotation about\n // the text box's center. When it doesn't decompose cleanly but contains\n // a rotational component, warn — the legacy code path baked the matrix\n // into the anchor; here we drop it so the warning is mandatory.\n if (!isIdentity(localTransform)) {\n const worldLocal = rebaseTransform(ctm, localTransform);\n const cx = node.x + node.width / 2;\n const cy = node.y + node.height / 2;\n const angle = worldLocal && decomposeRotation(worldLocal, cx, cy);\n if (!worldLocal) {\n onWarn('<text> transform sits under a singular parent transform; dropped');\n } else if (angle != null) {\n node.rotation = angle;\n } else {\n const rotComp = rotationComponent(worldLocal);\n if (Math.abs(rotComp) > 1e-4) {\n onWarn(`<text> transform has a rotational component that can't be cleanly stored as rotation; dropped (may not round-trip identically)`);\n }\n }\n }\n return node;\n}\n\nfunction readTspanRun(\n el: Element,\n gradients: GradientTable,\n style: StyleContext,\n onWarn: (m: string) => void,\n): StyledRun {\n const text = el.textContent ?? '';\n const run: StyledRun = { text };\n const fw = ownValue(el, 'font-weight', onWarn);\n // 700 is the bold flag's own spelling; any other weight is the run's.\n if (fw === 'bold' || fw === 'bolder' || fw === 700) run.bold = true;\n else if (fw === 'normal') run.fontWeight = 400;\n else if (typeof fw === 'number') run.fontWeight = fw;\n if (ownValue(el, 'font-style', onWarn) === 'italic') run.italic = true;\n const ff = ownValue(el, 'font-family', onWarn);\n if (ff) run.fontFamily = ff;\n const size = ownValue(el, 'font-size', onWarn);\n if (size?.fontSize != null) run.fontSize = size.fontSize;\n if (size?.fontScale != null) run.fontScale = size.fontScale;\n const ls = ownValue(el, 'letter-spacing', onWarn);\n if (ls != null) run.letterSpacing = ls;\n const shift = ownValue(el, 'baseline-shift', onWarn);\n if (shift?.script != null) run.script = shift.script;\n if (shift?.baselineShift != null) run.baselineShift = shift.baselineShift;\n const decoration = ownValue(el, 'text-decoration', onWarn);\n if (decoration?.underline) run.underline = true;\n if (decoration?.strikethrough) run.strikethrough = true;\n if (decoration?.overline) run.overline = true;\n const transform = ownValue(el, 'text-transform', onWarn);\n if (transform) run.textTransform = transform;\n const variant = ownValue(el, 'font-variant', onWarn);\n if (variant) run.fontVariantCaps = variant;\n const tspanStyle = deriveStyle(style, el);\n const fillAttr = resolveCurrentColor(ownProp(el, 'fill'), tspanStyle);\n if (fillAttr) {\n const parsed = readProperty('fill', fillAttr);\n if (parsed?.kind === 'solid') {\n run.fill = { fill: 'solid', color: parsed.color };\n } else if (parsed?.kind === 'ref') {\n const paint = gradients.get(parsed.id);\n if (paint) run.fill = paint;\n else if (parsed.fallback) run.fill = { fill: 'solid', color: parsed.fallback.color };\n }\n }\n // Own attributes only — see `ownStrokeStyle`.\n const stroke = coreStroke(readStroke(ownStrokeStyle(el), gradients, onWarn, isNonScalingStroke(el)));\n if (stroke) run.stroke = stroke;\n return run;\n}\n\nfunction readTextStyle(\n style: StyleContext,\n onWarn: (m: string) => void,\n): TextStyle {\n const out: TextStyle = {};\n const size = styleValue(style, 'font-size', onWarn);\n if (size?.fontSize != null) out.fontSize = size.fontSize;\n else if (size?.fontScale != null) {\n // The cascade carries raw values, so the parent size a percentage is\n // relative to has already been overwritten by the time it is read here.\n onWarn(`font-size \"${style['font-size']}\" on <text> is resolved against the 16px default`);\n out.fontSize = 16 * size.fontScale;\n }\n const ff = styleValue(style, 'font-family', onWarn);\n if (ff) out.fontFamily = ff;\n const fw = styleValue(style, 'font-weight', onWarn);\n if (fw != null) out.fontWeight = fw;\n const fs = styleValue(style, 'font-style', onWarn);\n if (fs) out.fontStyle = fs;\n if (styleValue(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 = styleValue(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 = styleValue(style, 'letter-spacing', onWarn);\n if (ls != null) out.letterSpacing = ls;\n const decoration = styleValue(style, 'text-decoration', onWarn);\n if (decoration?.underline) out.underline = true;\n if (decoration?.strikethrough) out.strikethrough = true;\n if (decoration?.overline) out.overline = true;\n const transform = styleValue(style, 'text-transform', onWarn);\n if (transform && transform !== 'none') out.textTransform = transform;\n const variant = styleValue(style, 'font-variant', onWarn);\n if (variant === 'small-caps') out.fontVariantCaps = variant;\n // Note: `lineHeight` is no longer read from a `data-weasel-line-height`\n // attribute. WeaselDraw carries it through the generic namespace bag\n // as `meta.wd.attrs['line-height']`; svgInterop lifts it into / out of\n // `TextStyle.lineHeight` at the bridge layer. From weasel-svg's POV the\n // value is just an opaque string in `meta`.\n // Edit-overlay-only chrome (`caretColor`, `selectionBackground`,\n // `selectionColor`) is intentionally not persisted — those are UI state,\n // not document content.\n return out;\n}\n\n/** Read a `<text>` element's glyph paint — the node's own fill and stroke,\n * which are not typography and do not live in its `TextStyle`. */\nfunction readTextPaint(\n style: StyleContext,\n gradients: GradientTable,\n onWarn: (m: string) => void,\n nonScalingStroke = false,\n): TextPaint {\n const out: TextPaint = {};\n const fillRaw = resolveCurrentColor(style['fill'] ?? null, style);\n if (fillRaw) {\n const parsed = readProperty('fill', fillRaw);\n if (parsed?.kind === 'solid') {\n out.fill = { fill: 'solid', color: parsed.color } as FillStyle;\n } else if (parsed?.kind === 'ref') {\n const paint = gradients.get(parsed.id);\n if (paint) out.fill = paint;\n else if (parsed.fallback) {\n out.fill = { fill: 'solid', color: parsed.fallback.color } as FillStyle;\n }\n } else if (parsed?.kind === 'none') {\n out.fill = null;\n }\n }\n // Text strokes used to be dropped here with a warning: an SDF glyph is a\n // sampled field, with no geometry to stroke. The outline tier gave large\n // text real contours, so a stroke is now a paint like any other — and one\n // that stays in the document even at sizes that render it unstroked.\n const stroke = coreStroke(readStroke(style, gradients, onWarn, nonScalingStroke));\n if (stroke) out.stroke = stroke;\n return out;\n}\n\n// ---------------------------------------------------------------------------\n// Ingesting `<marker>` defs the kit has no entry for.\n\ntype MarkerRole = 'start' | 'mid' | 'end';\nconst MARKER_FIELDS = [\n ['markerStart', 'start', 'marker-start'],\n ['markerMid', 'mid', 'marker-mid'],\n ['markerEnd', 'end', 'marker-end'],\n] as const;\n\n/**\n * Resolve every marker reference the tree holds that no registered entry\n * answers to, by reading the document's own `<marker>` into a `MarkerEntry`.\n * The reference is rewritten to the entry's key; one the document does not\n * define, or defines with nothing drawable, warns and is dropped.\n *\n * An entry is minted per reference rather than per `<marker>`, because two\n * things SVG decides at the use site are fixed in the kit's entry: a\n * `userSpaceOnUse` marker's size relative to the stroke referencing it, and\n * an `orient=\"auto\"` marker at a start, which the kit always reverses.\n */\nfunction ingestMarkers(\n root: Element,\n nodes: SvgNode[],\n gradients: GradientTable,\n onWarn: (m: string) => void,\n): MarkerEntry[] {\n const defs = new Map<string, Element>();\n const all = root.getElementsByTagName('marker');\n for (let i = 0; i < all.length; i++) {\n const id = all[i].getAttribute('id');\n if (id && !defs.has(id)) defs.set(id, all[i]);\n }\n const minted = new Map<string, MarkerEntry | null>();\n\n const resolve = (\n stroke: { markerStart?: unknown; markerMid?: unknown; markerEnd?: unknown },\n width: ScreenLength | undefined,\n ): void => {\n const w = width === undefined ? 1 : typeof width === 'number' ? width : width.px;\n for (const [field, role, attr] of MARKER_FIELDS) {\n const id = stroke[field];\n if (typeof id !== 'string' || getMarker(id) !== undefined) continue;\n const el = defs.get(id);\n if (!el) {\n onWarn(`${attr} references #${id}, which is neither a kit marker nor defined in the document`);\n delete stroke[field];\n continue;\n }\n const sized = sizedMarkerRef(el);\n if (sized) {\n // An unregistered key comes along as the def's geometry in marker\n // units: the def is drawn in user space at one unit per resolved size.\n if (getMarker(sized.key) === undefined && !minted.has(sized.key)) {\n const entry = markerEntryFrom(el, id, role, resolveMarkerSize(sized, 1), gradients, onWarn);\n minted.set(sized.key, entry && { ...entry, id: sized.key });\n }\n if (minted.get(sized.key) === null) delete stroke[field];\n else stroke[field] = sized;\n continue;\n }\n const cacheKey = `${id}\\u0000${role}\\u0000${w}`;\n if (!minted.has(cacheKey)) minted.set(cacheKey, markerEntryFrom(el, id, role, w, gradients, onWarn));\n const entry = minted.get(cacheKey)!;\n if (entry) stroke[field] = entry.id;\n else delete stroke[field];\n }\n };\n\n const visit = (n: SvgNode): void => {\n if (n.kind === 'group') n.children.forEach(visit);\n else if (n.kind === 'path' && n.stroke) resolve(n.stroke, n.stroke.width);\n else if (n.kind === 'text') {\n if (n.stroke) resolve(n.stroke, n.stroke.width);\n for (const run of n.runs ?? []) {\n if (run.stroke) resolve(run.stroke, run.stroke.width ?? n.stroke?.width);\n }\n }\n };\n nodes.forEach(visit);\n\n const out = new Map<string, MarkerEntry>();\n for (const entry of minted.values()) if (entry) out.set(entry.id, entry);\n return [...out.values()];\n}\n\nfunction weaselAttr(el: Element, name: string): string | null {\n return el.getAttributeNS(WEASEL_NS, name) ?? el.getAttribute(`${WEASEL_NS_PREFIX}:${name}`);\n}\n\n/** The reference a sized-marker def this package wrote stands for: its key\n * and size, read off the private namespace. */\nfunction sizedMarkerRef(el: Element): { key: string; size: ScreenLength } | undefined {\n const key = weaselAttr(el, 'key');\n const raw = weaselAttr(el, 'size')?.trim();\n if (!key || !raw) return undefined;\n const px = raw.endsWith('px');\n const n = parseFloat(px ? raw.slice(0, -2) : raw);\n if (!Number.isFinite(n) || n <= 0) return undefined;\n return { key, size: px ? { px: n } : n };\n}\n\n/** How far a line stops short of the marker, in marker units — written by\n * this package's serializer, and 0 for any other document's marker. */\nfunction markerInsetAttr(el: Element): number {\n const n = parseFloat(weaselAttr(el, 'inset') ?? '');\n return Number.isFinite(n) && n > 0 ? n : 0;\n}\n\n/** The cascade as it stands on `el`, walked down from the root. A marker's\n * content inherits from the marker's own ancestors, never from the element\n * that references it. */\nfunction styleAt(el: Element): StyleContext {\n const chain: Element[] = [];\n for (let e: Element | null = el; e; e = e.parentElement) chain.unshift(e);\n return chain.reduce<StyleContext>((style, e) => deriveStyle(style, e), EMPTY_STYLE);\n}\n\n/** SVG 2's keyword forms of `refX` / `refY`, else a number. */\nfunction markerRef(raw: string | null, lo: number, span: number): number {\n const v = raw?.trim();\n if (v === 'left' || v === 'top') return lo;\n if (v === 'center') return lo + span / 2;\n if (v === 'right' || v === 'bottom') return lo + span;\n const n = v ? parseFloat(v) : 0;\n return Number.isFinite(n) ? n : 0;\n}\n\n/** `orient` as the kit's `'auto' | radians`, with whether a start reference\n * has to be turned around to match what SVG draws. Absent is SVG's `0`. */\nfunction markerOrient(raw: string | null): { orient: 'auto' | number; reverseAtStart: boolean } {\n const v = raw?.trim() ?? '';\n if (v === 'auto') return { orient: 'auto', reverseAtStart: true };\n if (v === 'auto-start-reverse') return { orient: 'auto', reverseAtStart: false };\n const m = /^(-?[\\d.]+(?:e-?\\d+)?)(deg|rad|grad|turn)?$/i.exec(v);\n if (!m) return { orient: 0, reverseAtStart: false };\n const n = parseFloat(m[1]);\n const unit = (m[2] ?? 'deg').toLowerCase();\n const rad = unit === 'rad' ? n\n : unit === 'grad' ? (n * Math.PI) / 200\n : unit === 'turn' ? n * 2 * Math.PI\n : (n * Math.PI) / 180;\n return { orient: rad, reverseAtStart: false };\n}\n\nfunction markerPaint(\n style: StyleContext,\n attr: 'fill' | 'stroke',\n gradients: GradientTable,\n onWarn: (m: string) => void,\n): MarkerPaint {\n const context = readProperty(attr, style[attr]);\n if (context?.kind === 'context') {\n if (context.of === 'fill') onWarn(`a marker's ${attr}=\"context-fill\" is read as the line's stroke paint`);\n return 'line';\n }\n const paint = readPaint(style, attr, '#000000', gradients, onWarn);\n if (paint.kind === 'none') return 'none';\n if (paint.kind === 'gradient') return paint.paint;\n return paint.opacity != null ? { ...solid(paint.color), opacity: paint.opacity } : solid(paint.color);\n}\n\nfunction asPolygon(path: Path): PolygonPath {\n if (path.kind === 'polygon') return path;\n const { x, y, width: w, height: h } = path as { x: number; y: number; width: number; height: number };\n return {\n kind: 'polygon',\n commands: new Uint8Array([PATH_M, PATH_L, PATH_L, PATH_L, PATH_Z]),\n coords: new Float32Array([x, y, x + w, y, x + w, y + h, x, y + h]),\n fillRule: 'nonzero',\n };\n}\n\n/** FNV-1a, for a key that tells apart two documents' same-named markers. */\nfunction shortHash(s: string): string {\n let h = 0x811c9dc5;\n for (let i = 0; i < s.length; i++) {\n h ^= s.charCodeAt(i);\n h = Math.imul(h, 0x01000193);\n }\n return (h >>> 0).toString(36);\n}\n\n/**\n * One `<marker>` as a `MarkerEntry` for a reference in `role` from a stroke\n * `strokeWidth` wide.\n *\n * The content is mapped into marker units — the viewBox scaled onto\n * `markerWidth` × `markerHeight` under `preserveAspectRatio`, with\n * `refX` / `refY` moved to the origin, which is where the kit anchors every\n * entry. The key is the id plus a hash of what the entry draws, so the same\n * id in two documents never collides in the global registry, and an entry\n * this package exported reads back under the key it went out with.\n *\n * All parts merge into one path painted with the first part's fill and\n * outline, since an entry has one of each. `overflow` clipping is not\n * modeled.\n */\nfunction markerEntryFrom(\n el: Element,\n id: string,\n role: MarkerRole,\n strokeWidth: number,\n gradients: GradientTable,\n onWarn: (m: string) => void,\n): MarkerEntry | null {\n const num = (name: string, fallback: number): number => {\n const n = parseFloat(el.getAttribute(name) ?? '');\n return Number.isFinite(n) ? n : fallback;\n };\n const vb = parseViewBoxAttr(el.getAttribute('viewBox'));\n let sx = 1, sy = 1;\n if (vb && vb.width > 0 && vb.height > 0) {\n sx = num('markerWidth', 3) / vb.width;\n sy = num('markerHeight', 3) / vb.height;\n const par = el.getAttribute('preserveAspectRatio')?.trim() ?? '';\n if (!par.startsWith('none')) {\n const s = par.endsWith('slice') ? Math.max(sx, sy) : Math.min(sx, sy);\n sx = s;\n sy = s;\n }\n }\n const refX = markerRef(el.getAttribute('refX'), vb?.x ?? 0, vb?.width ?? 0);\n const refY = markerRef(el.getAttribute('refY'), vb?.y ?? 0, vb?.height ?? 0);\n // Marker units are stroke widths already, unless the marker is sized in\n // user space; then this reference's width converts it.\n const k = el.getAttribute('markerUnits') === 'userSpaceOnUse' && strokeWidth > 0\n ? 1 / strokeWidth\n : 1;\n const { orient, reverseAtStart } = markerOrient(el.getAttribute('orient'));\n const turn = role === 'start' && reverseAtStart ? -1 : 1;\n const base: Matrix = [turn * sx * k, 0, 0, turn * sy * k, -turn * sx * k * refX, -turn * sy * k * refY];\n\n const parts: { path: PolygonPath; style: StyleContext }[] = [];\n const collect = (parent: Element, m: Matrix, style: StyleContext): void => {\n for (let i = 0; i < parent.children.length; i++) {\n const child = parent.children[i];\n const tag = child.tagName.toLowerCase();\n const cm = multiply(m, parseTransform(child.getAttribute('transform'), onWarn));\n const cs = deriveStyle(style, child);\n if (tag === 'g') collect(child, cm, cs);\n else if (SUPPORTED_LEAF_TAGS.has(tag)) {\n const path = lowerLeaf(child, tag, cm, onWarn);\n if (path) parts.push({ path: asPolygon(path), style: cs });\n } else if (!IGNORED_TAGS.has(tag)) {\n onWarn(`<marker id=\"${id}\"> child <${child.tagName}> is not supported; skipped`);\n }\n }\n };\n collect(el, base, styleAt(el));\n if (parts.length === 0) {\n onWarn(`<marker id=\"${id}\"> draws nothing this kit can read; dropped`);\n return null;\n }\n\n const first = parts[0].style;\n const fill = markerPaint(first, 'fill', gradients, onWarn);\n const outlinePaint = markerPaint(first, 'stroke', gradients, onWarn);\n const outlineWidth = parseFloat(first['stroke-width'] ?? '1') * Math.sqrt(sx * sy) * k;\n const outline = outlinePaint !== 'none' && outlineWidth > 0\n ? { width: outlineWidth, paint: outlinePaint }\n : false;\n if (parts.some((p) => JSON.stringify(p.style) !== JSON.stringify(first))) {\n onWarn(`<marker id=\"${id}\"> paints its parts differently; all take the first part's paint`);\n }\n\n let commandCount = 0, coordCount = 0;\n for (const p of parts) { commandCount += p.path.commands.length; coordCount += p.path.coords.length; }\n const commands = new Uint8Array(commandCount);\n const coords = new Float32Array(coordCount);\n let ci = 0, pi = 0;\n for (const p of parts) {\n commands.set(p.path.commands, ci); ci += p.path.commands.length;\n coords.set(p.path.coords, pi); pi += p.path.coords.length;\n }\n const fillRule = parts[0].path.fillRule ?? 'nonzero';\n\n const inset = markerInsetAttr(el);\n const round = (v: number): number => Math.round(v * 1e4) / 1e4 + 0;\n const hash = shortHash(JSON.stringify([\n Array.from(commands), Array.from(coords, round), fillRule, fill, outline,\n typeof orient === 'number' ? round(orient) : orient,\n ...(inset !== 0 ? [round(inset)] : []),\n ]));\n const key = id.endsWith(`-${hash}`) ? id : `${id}-${hash}`;\n\n return {\n id: key,\n reads: [],\n path: ({ size }) => {\n const scaled = new Float32Array(coords.length);\n for (let i = 0; i < coords.length; i++) scaled[i] = coords[i] * size;\n return { kind: 'polygon', commands, coords: scaled, fillRule };\n },\n fill,\n outline,\n orient,\n inset,\n };\n}\n","/**\n * Serialize a `SvgNode[]` tree to an SVG document string. Every leaf is\n * emitted as a `<path>` (even shapes that started as `<rect>` etc.) —\n * lossless geometry round-trip beats round-tripping the element-kind\n * label. Gradient paints are gathered into a single `<defs>` block.\n */\n\nimport type { FontRequest, Path, Stroke, StrokeAlign } from '@weasel-js/core';\nimport {\n boundsOfPath, resolveRunFace, resolveScreenLength, resolveTextStyle, scriptMetricsFor,\n} from '@weasel-js/core';\nimport type {\n Matrix, NamespaceMeta, NamespacedElement, SerializeOptions, SvgGroupNode,\n SvgNode, SvgPaint, SvgPathNode, SvgStroke, SvgTextNode, SvgImageNode,\n ScreenLength,\n} from './types';\nimport { IDENTITY_MATRIX } from './types';\nimport { serializePathD } from './path-serializer';\nimport { formatMatrix, multiply, trimNumber } from './transform';\nimport { PaintServerRegistry, WEASEL_NS, WEASEL_NS_PREFIX } from './gradients';\nimport { anchorOffset } from './textAnchor';\n\n/**\n * Walk the tree and produce an SVG document string. The root `<svg>`'s\n * `viewBox` is taken from `opts.viewBox` if supplied, otherwise computed\n * as a tight bounding box around every leaf.\n */\nexport function serializeSvg(nodes: SvgNode[], opts: SerializeOptions = {}): string {\n const registry = new PaintServerRegistry();\n registerPaintServers(nodes, registry);\n\n const bounds = opts.viewBox ?? computeBounds(nodes);\n const vb = `${trimNumber(bounds.x)} ${trimNumber(bounds.y)} ${trimNumber(bounds.width)} ${trimNumber(bounds.height)}`;\n const namespaces = opts.namespaces ?? {};\n\n const rootAttrs: string[] = [`xmlns=\"http://www.w3.org/2000/svg\"`];\n // Declared before the caller's namespaces and only when something needs it,\n // so a document of ordinary paints carries no trace of it. The paint pre-pass\n // above has already seen every paint, so this answer is final.\n if (registry.usesPrivateNamespace() && namespaces[WEASEL_NS_PREFIX] == null) {\n rootAttrs.push(`xmlns:${WEASEL_NS_PREFIX}=\"${WEASEL_NS}\"`);\n }\n for (const [prefix, uri] of Object.entries(namespaces)) {\n rootAttrs.push(`xmlns:${prefix}=\"${escapeAttr(uri)}\"`);\n }\n rootAttrs.push(`viewBox=\"${vb}\"`);\n if (opts.width != null) rootAttrs.push(`width=\"${trimNumber(opts.width)}\"`);\n if (opts.height != null) rootAttrs.push(`height=\"${trimNumber(opts.height)}\"`);\n // documentMeta attrs onto the root, in declared-namespace order.\n if (opts.documentMeta) {\n for (const prefix of Object.keys(namespaces)) {\n const bucket = opts.documentMeta[prefix];\n if (!bucket?.attrs) continue;\n for (const [name, value] of Object.entries(bucket.attrs)) {\n rootAttrs.push(`${prefix}:${name}=\"${escapeAttr(value)}\"`);\n }\n }\n }\n\n // documentMeta elements after <defs>, before geometry body.\n let docMetaXml = '';\n if (opts.documentMeta) {\n for (const prefix of Object.keys(namespaces)) {\n const bucket = opts.documentMeta[prefix];\n if (!bucket?.elements) continue;\n for (const [localName, list] of Object.entries(bucket.elements)) {\n for (const el of list) docMetaXml += namespacedElementXml(prefix, localName, el);\n }\n }\n }\n\n const defsXml = registry.toDefsXml(opts.onWarn);\n // Once per message: a hundred inner-aligned strokes are one fact.\n const said = new Set<string>();\n const warn: Warn = (m) => {\n if (!opts.onWarn || said.has(m)) return;\n said.add(m);\n opts.onWarn(m);\n };\n const bodyXml = nodes.map((n) => nodeXml(n, registry, namespaces, warn)).join('');\n\n // `<title>` goes immediately inside `<svg>` per SVG-spec convention; it's\n // an accessibility hook and (for our purposes) a stable place to round-trip\n // the user-visible document title.\n const titleXml = opts.title && opts.title.length > 0\n ? `<title>${escapeText(opts.title)}</title>`\n : '';\n\n return `<svg ${rootAttrs.join(' ')}>${titleXml}${defsXml}${docMetaXml}${bodyXml}</svg>`;\n}\n\nfunction namespacedElementXml(prefix: string, localName: string, el: NamespacedElement): string {\n const attrs: string[] = [];\n for (const [name, value] of Object.entries(el.attrs)) {\n attrs.push(`${name}=\"${escapeAttr(value)}\"`);\n }\n const head = attrs.length > 0 ? `<${prefix}:${localName} ${attrs.join(' ')}>` : `<${prefix}:${localName}>`;\n let body = '';\n if (el.children) {\n for (const [childName, list] of Object.entries(el.children)) {\n for (const child of list) body += namespacedElementXml(prefix, childName, child);\n }\n } else if (el.text != null) {\n body = escapeText(el.text);\n }\n return `${head}${body}</${prefix}:${localName}>`;\n}\n\nfunction metaAttrsXml(meta: NamespaceMeta | undefined, namespaces: Record<string, string>): string {\n if (!meta) return '';\n const parts: string[] = [];\n for (const prefix of Object.keys(namespaces)) {\n const bucket = meta[prefix];\n if (!bucket?.attrs) continue;\n for (const [name, value] of Object.entries(bucket.attrs)) {\n parts.push(`${prefix}:${name}=\"${escapeAttr(value)}\"`);\n }\n }\n return parts.length > 0 ? ` ${parts.join(' ')}` : '';\n}\n\nfunction metaElementsXml(meta: NamespaceMeta | undefined, namespaces: Record<string, string>): string {\n if (!meta) return '';\n let out = '';\n for (const prefix of Object.keys(namespaces)) {\n const bucket = meta[prefix];\n if (!bucket?.elements) continue;\n for (const [localName, list] of Object.entries(bucket.elements)) {\n for (const el of list) out += namespacedElementXml(prefix, localName, el);\n }\n }\n return out;\n}\n\nexport function registerPaintServers(nodes: readonly SvgNode[], registry: PaintServerRegistry): void {\n for (const n of nodes) {\n if (n.kind === 'group') {\n if (n.clip) registry.clipId(n.clip);\n registerPaintServers(n.children, registry);\n } else if (n.kind === 'path') {\n if (n.fill.kind === 'gradient') registry.register(n.fill.paint);\n if (n.stroke && n.stroke.paint.kind === 'gradient') registry.register(n.stroke.paint.paint);\n registerMarkers(n.stroke, registry);\n } else if (n.kind === 'text') {\n // Text paints flow through `style` / `runs` rather than a top-level\n // SvgPaint, so register direct FillStyle references when present. This\n // pre-pass is load-bearing: `<defs>` is emitted before the body, so a\n // paint first seen while writing an element would be referenced by an\n // id that no definition backs.\n registerTextPaint(n.fill, registry);\n registerTextPaint(n.stroke?.paint, registry);\n registerMarkers(n.stroke, registry);\n for (const run of n.runs ?? []) {\n registerTextPaint(run.fill, registry);\n registerTextPaint(run.stroke?.paint, registry);\n }\n }\n }\n}\n\n/** Register one text paint if it is a paint server rather than a colour. */\nfunction registerTextPaint(\n paint: import('@weasel-js/core').FillStyle | null | undefined,\n registry: PaintServerRegistry,\n): void {\n if (paint && !('color' in paint)) registry.register(paint);\n}\n\n/** 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(stroke: Pick<Stroke, 'markerStart' | 'markerMid' | 'markerEnd'> | undefined, registry: PaintServerRegistry): void {\n if (!stroke) return;\n for (const ref of [stroke.markerStart, stroke.markerMid, stroke.markerEnd]) {\n if (ref !== undefined) registry.markerId(ref);\n }\n}\n\ntype Warn = (message: string) => void;\n\nfunction nodeXml(\n node: SvgNode, registry: PaintServerRegistry, namespaces: Record<string, string>, warn: Warn,\n): string {\n if (node.kind === 'group') return groupXml(node, registry, namespaces, warn);\n if (node.kind === 'text') return textXml(node, registry, namespaces, warn);\n if (node.kind === 'image') return imageXml(node, namespaces);\n return pathXml(node, registry, namespaces, warn);\n}\n\n/** SVG 1.1 has no stroke alignment; SVG 2's `stroke-alignment` never shipped\n * in a browser. */\nfunction warnStrokeAlign(align: StrokeAlign | undefined, warn: Warn): void {\n if (align && align !== 'center') {\n warn(`a stroke aligned \"${align}\" of its edge is written centered: SVG has no stroke alignment`);\n }\n}\n\n/**\n * Emit an `<image>`. `preserveAspectRatio=\"none\"` is unconditional: the node\n * carries a literal box and nothing else, so letting a viewer letterbox it\n * would place the pixels somewhere the model never said.\n *\n * A source rect or a flip takes the cropped form described on `SvgImageNode`.\n * The nested `<svg>` cannot carry the rotation itself — SVG 1.1 gives it no\n * `transform` — so the rotation, opacity and meta go on the wrapping `<g>`.\n */\nfunction imageXml(node: SvgImageNode, namespaces: Record<string, string>): string {\n const box = `x=\"${trimNumber(node.x)}\" y=\"${trimNumber(node.y)}\"`\n + ` width=\"${trimNumber(node.width)}\" height=\"${trimNumber(node.height)}\"`;\n const outer: string[] = [];\n if (node.opacity != null && node.opacity !== 1) {\n outer.push(`opacity=\"${trimNumber(node.opacity)}\"`);\n }\n if (node.rotation != null && node.rotation !== 0) {\n const cx = node.x + node.width / 2;\n const cy = node.y + node.height / 2;\n const deg = (node.rotation * 180) / Math.PI;\n outer.push(`transform=\"rotate(${trimNumber(deg)} ${trimNumber(cx)} ${trimNumber(cy)})\"`);\n }\n const metaAttrs = metaAttrsXml(node.meta, namespaces);\n const metaEls = metaElementsXml(node.meta, namespaces);\n const href = `href=\"${escapeAttr(node.href)}\"`;\n\n if (!node.source && !node.flipX && !node.flipY) {\n const attrs = [href, box, 'preserveAspectRatio=\"none\"', ...outer].join(' ');\n if (metaEls) return `<image ${attrs}${metaAttrs}>${metaEls}</image>`;\n return `<image ${attrs}${metaAttrs}/>`;\n }\n\n const src = node.source ?? { x: 0, y: 0, width: 1, height: 1 };\n const viewBox = [src.x, src.y, src.width, src.height].map(trimNumber).join(' ');\n // A mirror about the source window's center, so the flipped image still\n // fills exactly the window the viewport shows.\n const flip = node.flipX || node.flipY\n ? ` transform=\"matrix(${node.flipX ? -1 : 1} 0 0 ${node.flipY ? -1 : 1}`\n + ` ${trimNumber(node.flipX ? 2 * src.x + src.width : 0)}`\n + ` ${trimNumber(node.flipY ? 2 * src.y + src.height : 0)})\"`\n : '';\n const head = ['<g data-weasel-image=\"true\"', ...outer].join(' ');\n return `${head}${metaAttrs}>`\n + `<svg ${box} viewBox=\"${viewBox}\" preserveAspectRatio=\"none\">`\n + `<image ${href} x=\"0\" y=\"0\" width=\"1\" height=\"1\" preserveAspectRatio=\"none\"${flip}/>`\n + `</svg>${metaEls}</g>`;\n}\n\nfunction groupXml(\n node: SvgGroupNode, registry: PaintServerRegistry, namespaces: Record<string, string>, warn: Warn,\n): string {\n const attrs: string[] = [];\n if (node.transform) {\n const m = formatMatrix(node.transform);\n if (m) attrs.push(`transform=\"${m}\"`);\n }\n if (node.clip) {\n attrs.push(`clip-path=\"url(#${registry.clipId(node.clip)})\"`);\n }\n if (node.opacity != null && node.opacity !== 1) {\n attrs.push(`opacity=\"${trimNumber(node.opacity)}\"`);\n }\n const metaAttrs = metaAttrsXml(node.meta, namespaces);\n // `metaAttrs` already starts with a leading space (or is empty), so we\n // can splice it after the existing attr list without extra logic.\n const head = attrs.length > 0\n ? `<g ${attrs.join(' ')}${metaAttrs}>`\n : `<g${metaAttrs}>`;\n const body = node.children.map((c) => nodeXml(c, registry, namespaces, warn)).join('');\n return `${head}${body}${metaElementsXml(node.meta, namespaces)}</g>`;\n}\n\nfunction pathXml(\n node: SvgPathNode, registry: PaintServerRegistry, namespaces: Record<string, string>, warn: Warn,\n): string {\n const attrs: string[] = [`d=\"${serializePathD(node.path)}\"`];\n const fillAttrs = paintAttrs(node.fill, 'fill', registry);\n for (const a of fillAttrs) attrs.push(a);\n // Emit fill-rule only when it diverges from SVG's default ('nonzero').\n // RectPath has no fillRule field — only PolygonPath carries one.\n if (node.path.kind === 'polygon' && node.path.fillRule === 'evenodd') {\n attrs.push(`fill-rule=\"evenodd\"`);\n }\n if (node.stroke) {\n const strokeAttrs = strokeAttrsFor(node.stroke, registry, warn);\n for (const a of strokeAttrs) attrs.push(a);\n } else {\n attrs.push('stroke=\"none\"');\n }\n if (node.opacity != null && node.opacity !== 1) {\n attrs.push(`opacity=\"${trimNumber(node.opacity)}\"`);\n }\n if (node.rotation != null && node.rotation !== 0) {\n const b = pathBounds(node.path);\n const cx = b.minX + (b.maxX - b.minX) / 2;\n const cy = b.minY + (b.maxY - b.minY) / 2;\n const deg = (node.rotation * 180) / Math.PI;\n attrs.push(`transform=\"rotate(${trimNumber(deg)} ${trimNumber(cx)} ${trimNumber(cy)})\"`);\n }\n const metaAttrs = metaAttrsXml(node.meta, namespaces);\n const metaEls = metaElementsXml(node.meta, namespaces);\n if (metaEls) {\n return `<path ${attrs.join(' ')}${metaAttrs}>${metaEls}</path>`;\n }\n return `<path ${attrs.join(' ')}${metaAttrs}/>`;\n}\n\nfunction paintAttrs(\n paint: SvgPaint,\n name: 'fill' | 'stroke',\n registry: PaintServerRegistry,\n includeOpacity = true,\n): string[] {\n if (paint.kind === 'none') return [`${name}=\"none\"`];\n const out = [`${name}=\"${paint.kind === 'solid' ? paint.color : registry.ref(paint.paint)}\"`];\n if (includeOpacity) out.push(...opacityAttr(`${name}-opacity`, svgPaintOpacity(paint)));\n return out;\n}\n\n/** The opacity an `SvgPaint` carries, whichever kind holds it. */\nfunction svgPaintOpacity(paint: SvgPaint): number | undefined {\n if (paint.kind === 'solid') return paint.opacity;\n return paint.kind === 'gradient' ? paint.paint.opacity : undefined;\n}\n\n/** `name=\"v\"`, or nothing when `v` is absent or fully opaque. */\nfunction opacityAttr(name: string, v: number | undefined): string[] {\n return v != null && v !== 1 ? [`${name}=\"${trimNumber(v)}\"`] : [];\n}\n\n/**\n * Attributes for a kit `Stroke` — the shape text carries, whose `paint` is a\n * `FillStyle` rather than an `SvgPaint`. Text strokes ride inside\n * `TextStyle` / `StyledRun` rather than as a node-level `SvgStroke`, because\n * that is where the kit's text model puts them.\n *\n * Absent, unpainted, or zero-width emits nothing at all: unstroked text should\n * not carry a `stroke` attribute, and SVG's own default (`none`) already says\n * so.\n */\n/**\n * `stroke-width`, plus `vector-effect` when the width is in screen pixels.\n *\n * A `{ px }` width means \"this thickness once rendered, whatever the view is\n * doing\", which is exactly what `non-scaling-stroke` says — so the number goes\n * out unresolved and the attribute carries the unit. There is no accumulated\n * transform scale here to resolve it against, and picking one would bake a\n * single zoom level into the document.\n */\nfunction strokeWidthAttrs(width: ScreenLength): string[] {\n if (typeof width === 'number') return [`stroke-width=\"${trimNumber(width)}\"`];\n return [`stroke-width=\"${trimNumber(width.px)}\"`, 'vector-effect=\"non-scaling-stroke\"'];\n}\n\nfunction coreStrokeAttrs(stroke: Stroke | undefined, registry: PaintServerRegistry, warn: Warn): string[] {\n const paint = stroke?.paint;\n if (!stroke || !paint) return [];\n const width = stroke.width ?? 1;\n if (!((typeof width === 'object' ? width.px : width) > 0)) return [];\n warnStrokeAlign(stroke.align, warn);\n const attrs: string[] = [`stroke=\"${'color' in paint ? paint.color : registry.ref(paint)}\"`];\n attrs.push(...opacityAttr('stroke-opacity', paint.opacity));\n attrs.push(...strokeWidthAttrs(width));\n if (stroke.cap) attrs.push(`stroke-linecap=\"${stroke.cap}\"`);\n if (stroke.join) attrs.push(`stroke-linejoin=\"${stroke.join}\"`);\n if (stroke.dash && stroke.dash.length > 0) {\n attrs.push(`stroke-dasharray=\"${stroke.dash.map(trimNumber).join(' ')}\"`);\n }\n if (stroke.miterLimit != null) attrs.push(`stroke-miterlimit=\"${trimNumber(stroke.miterLimit)}\"`);\n for (const [field, attr] of [\n ['markerStart', 'marker-start'],\n ['markerMid', 'marker-mid'],\n ['markerEnd', 'marker-end'],\n ] as const) {\n const ref = stroke[field];\n if (ref === undefined) continue;\n const id = registry.markerId(ref);\n if (id === undefined) continue;\n attrs.push(`${attr}=\"url(#${id})\"`);\n }\n return attrs;\n}\n\nfunction strokeAttrsFor(stroke: SvgStroke, registry: PaintServerRegistry, warn: Warn): string[] {\n warnStrokeAlign(stroke.align, warn);\n // `SvgStroke.opacity` and the paint's own `opacity` are two models of one\n // SVG attribute, and parse fills in both. Emitting each would write\n // `stroke-opacity` twice, which is not well-formed XML at all.\n const attrs = paintAttrs(stroke.paint, 'stroke', registry, false);\n attrs.push(...strokeWidthAttrs(stroke.width));\n attrs.push(...opacityAttr('stroke-opacity', stroke.opacity ?? svgPaintOpacity(stroke.paint)));\n if (stroke.cap) {\n attrs.push(`stroke-linecap=\"${stroke.cap}\"`);\n }\n if (stroke.join) {\n attrs.push(`stroke-linejoin=\"${stroke.join}\"`);\n }\n if (stroke.dash && stroke.dash.length > 0) {\n attrs.push(`stroke-dasharray=\"${stroke.dash.map(trimNumber).join(' ')}\"`);\n }\n if (stroke.miterLimit != null) {\n attrs.push(`stroke-miterlimit=\"${trimNumber(stroke.miterLimit)}\"`);\n }\n for (const [field, attr] of [\n ['markerStart', 'marker-start'],\n ['markerMid', 'marker-mid'],\n ['markerEnd', 'marker-end'],\n ] as const) {\n const ref = stroke[field];\n if (ref === undefined) continue;\n const id = registry.markerId(ref);\n if (id === undefined) continue;\n attrs.push(`${attr}=\"url(#${id})\"`);\n }\n return attrs;\n}\n\n/**\n * Tight bounding box around everything the tree draws, in the root's\n * coordinates — the fallback `viewBox` when the caller supplies none. A\n * node's `rotation` and a group's `transform` both move ink, so both are\n * applied here; a box taken from unrotated geometry crops the document.\n */\nfunction computeBounds(nodes: SvgNode[]): { x: number; y: number; width: number; height: number } {\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n const visit = (n: SvgNode, ctm: Matrix): void => {\n if (n.kind === 'group') {\n const childCtm = n.transform ? multiply(ctm, n.transform) : ctm;\n n.children.forEach((c) => visit(c, childCtm));\n return;\n }\n const b = n.kind === 'text' || n.kind === 'image'\n ? { minX: n.x, minY: n.y, maxX: n.x + n.width, maxY: n.y + n.height }\n : pathBounds(n.path);\n const local = n.rotation ? rotateAboutCenter(ctm, b, n.rotation) : ctm;\n for (const [x, y] of corners(b)) {\n const px = local[0] * x + local[2] * y + local[4];\n const py = local[1] * x + local[3] * y + local[5];\n if (px < minX) minX = px;\n if (py < minY) minY = py;\n if (px > maxX) maxX = px;\n if (py > maxY) maxY = py;\n }\n };\n nodes.forEach((n) => visit(n, IDENTITY_MATRIX));\n if (!Number.isFinite(minX)) {\n return { x: 0, y: 0, width: 0, height: 0 };\n }\n return { x: minX, y: minY, width: maxX - minX, height: maxY - minY };\n}\n\nfunction corners(b: { minX: number; minY: number; maxX: number; maxY: number }): [number, number][] {\n return [[b.minX, b.minY], [b.maxX, b.minY], [b.maxX, b.maxY], [b.minX, b.maxY]];\n}\n\n/** `ctm` composed with the same `rotate(angle cx cy)` the element emits. */\nfunction rotateAboutCenter(\n ctm: Matrix,\n b: { minX: number; minY: number; maxX: number; maxY: number },\n angle: number,\n): Matrix {\n const cx = (b.minX + b.maxX) / 2;\n const cy = (b.minY + b.maxY) / 2;\n const c = Math.cos(angle);\n const s = Math.sin(angle);\n return multiply(ctm, [c, s, -s, c, cx - cx * c + cy * s, cy - cx * s - cy * c]);\n}\n\n/**\n * Emit a `<text>` element. `x` is the `text-anchor` point, per the SVG spec:\n * the box's left edge, center or right edge as its alignment resolves. Uses\n * `dominant-baseline=\"text-before-edge\"` so `y` matches weasel's top-of-box\n * pose; stashes the explicit width/height (which native SVG text doesn't\n * model) in `data-weasel-*` attributes so they round-trip through the parser\n * losslessly.\n */\nfunction textXml(\n node: SvgTextNode, registry: PaintServerRegistry, namespaces: Record<string, string>, warn: Warn,\n): string {\n const attrs: string[] = [\n `x=\"${trimNumber(node.x + anchorOffset(node.style, node.width))}\"`,\n `y=\"${trimNumber(node.y)}\"`,\n `dominant-baseline=\"text-before-edge\"`,\n // The runs model stores real line breaks; SVG's default whitespace\n // handling would collapse them (and any indentation) away on re-import.\n `xml:space=\"preserve\"`,\n `data-weasel-width=\"${trimNumber(node.width)}\"`,\n `data-weasel-height=\"${trimNumber(node.height)}\"`,\n ];\n\n const style = node.style;\n // SVG user space has no camera, so a `{ px }` size writes as that many\n // user units — the reading it already has at scale 1.\n if (style?.fontSize != null) attrs.push(`font-size=\"${trimNumber(resolveScreenLength(style.fontSize, 1))}\"`);\n if (style?.fontFamily) attrs.push(`font-family=\"${escapeAttr(style.fontFamily)}\"`);\n if (style?.fontWeight != null) attrs.push(`font-weight=\"${String(style.fontWeight)}\"`);\n if (style?.fontStyle && style.fontStyle !== 'normal') attrs.push(`font-style=\"${style.fontStyle}\"`);\n if (style?.fontVariantCaps === 'small-caps') attrs.push('font-variant=\"small-caps\"');\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 // SVG text does not wrap, so every line written closes its paragraph and\n // a justified node draws at its start edge. `data-weasel-align` keeps the\n // justification for weasel's own reader.\n const anchor = align === 'center' ? 'middle'\n : align === 'start' || align === 'justify' ? 'start'\n : align === 'end' ? 'end'\n : (align === 'left') === (direction === 'ltr') ? 'start' : 'end';\n if (anchor !== 'start') attrs.push(`text-anchor=\"${anchor}\"`);\n if (align === 'justify') attrs.push('data-weasel-align=\"justify\"');\n }\n if (style?.letterSpacing != null && style.letterSpacing !== 0) {\n attrs.push(`letter-spacing=\"${trimNumber(resolveScreenLength(style.letterSpacing, 1))}\"`);\n }\n const decoration = textDecorationValue(style?.underline, style?.strikethrough, style?.overline);\n if (decoration) attrs.push(`text-decoration=\"${decoration}\"`);\n if (style?.script) attrs.push(`baseline-shift=\"${style.script}\"`);\n // A CSS property rather than an SVG 1.1 presentation attribute, so it goes\n // where every CSS-aware reader looks for it.\n if (style?.textTransform && style.textTransform !== 'none') {\n attrs.push(`style=\"text-transform:${style.textTransform}\"`);\n }\n // SVG text never wraps, so this is for weasel's own reader, beside the box\n // width it wraps at.\n if (style?.wrap) {\n attrs.push('data-weasel-wrap=\"true\"');\n warn('text that wraps at its box width is written unwrapped: SVG text does not wrap, so other'\n + ' readers draw one line per hard break (weasel reads the wrap back)');\n }\n if (node.verticalAlign && node.verticalAlign !== 'top') {\n attrs.push(`data-weasel-vertical-align=\"${node.verticalAlign}\"`);\n warn(`text aligned to the ${node.verticalAlign} of its box is written top-aligned: SVG text has`\n + ' no box, so other readers draw it at the top (weasel reads the alignment back)');\n }\n // Note: `lineHeight` is NOT emitted here. The bridge layer (svgInterop)\n // lifts it into `meta.wd.attrs['line-height']`, which `metaAttrsXml`\n // below emits as `wd:line-height=\"...\"`. There is no compat write of\n // `data-weasel-line-height` — per the SVG-native plan's Migration section,\n // no installed base exists to compat against.\n if (node.fill === null) {\n attrs.push('fill=\"none\"');\n } else if (node.fill) {\n attrs.push(`fill=\"${'color' in node.fill ? node.fill.color : registry.ref(node.fill)}\"`);\n attrs.push(...opacityAttr('fill-opacity', node.fill.opacity));\n }\n for (const a of coreStrokeAttrs(node.stroke, registry, warn)) attrs.push(a);\n if (node.opacity != null && node.opacity !== 1) {\n attrs.push(`opacity=\"${trimNumber(node.opacity)}\"`);\n }\n if (node.rotation != null && node.rotation !== 0) {\n const cx = node.x + node.width / 2;\n const cy = node.y + node.height / 2;\n const deg = (node.rotation * 180) / Math.PI;\n attrs.push(`transform=\"rotate(${trimNumber(deg)} ${trimNumber(cx)} ${trimNumber(cy)})\"`);\n }\n\n const body = node.runs && node.runs.length > 0\n ? node.runs.map((r) => runXml(r, style, registry, warn)).join('')\n : escapeText(node.text);\n const metaAttrs = metaAttrsXml(node.meta, namespaces);\n const metaEls = metaElementsXml(node.meta, namespaces);\n return `<text ${attrs.join(' ')}${metaAttrs}>${body}${metaEls}</text>`;\n}\n\n/**\n * The face whose metrics size `run`'s script, when the writer reads them: a\n * run that overrode only the rise has no `baseline-shift` keyword left to\n * carry the preset's size, so the size is spelled out from the face it\n * renders in. `undefined` for every other run.\n */\nexport function scriptSizeFace(\n run: import('@weasel-js/core').StyledRun, style: SvgTextNode['style'],\n): Required<FontRequest> | undefined {\n if (run.script == null || run.baselineShift == null) return undefined;\n const face = resolveRunFace(run, resolveTextStyle(style));\n return { family: face.fontFamily, weight: face.fontWeight, style: face.fontStyle };\n}\n\nfunction runXml(\n run: import('@weasel-js/core').StyledRun,\n style: SvgTextNode['style'],\n registry: PaintServerRegistry,\n warn: Warn,\n): string {\n const attrs: string[] = [];\n if (run.fontWeight != null) attrs.push(`font-weight=\"${run.fontWeight}\"`);\n else if (run.bold) attrs.push(`font-weight=\"700\"`);\n if (run.italic) attrs.push(`font-style=\"italic\"`);\n // `normal` included: on a run it overrides small caps the node passes down.\n if (run.fontVariantCaps) attrs.push(`font-variant=\"${run.fontVariantCaps}\"`);\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 face = scriptSizeFace(run, style);\n const presetScale = face && run.script\n ? scriptMetricsFor(face.family, face.weight, face.style)[run.script].size\n : undefined;\n const scale = run.fontScale ?? presetScale;\n if (run.fontSize != null) attrs.push(`font-size=\"${trimNumber(resolveScreenLength(run.fontSize, 1))}\"`);\n else if (scale != null) attrs.push(`font-size=\"${trimNumber(scale * 100)}%\"`);\n // Same story for `baseline-shift`: an SVG percentage resolves against the\n // parent's font size, which is the unit `baselineShift` is already in.\n if (run.baselineShift != null) {\n attrs.push(`baseline-shift=\"${trimNumber(run.baselineShift * 100)}%\"`);\n } else if (run.script) {\n attrs.push(`baseline-shift=\"${run.script}\"`);\n }\n // Unlike the node-level style guard above, a run-level `0` is a meaningful\n // *override* (distinct from \"inherit the node's letterSpacing\") per the\n // runs model's additive-flags contract — emit it whenever it's set.\n if (run.letterSpacing != null) {\n attrs.push(`letter-spacing=\"${trimNumber(resolveScreenLength(run.letterSpacing, 1))}\"`);\n }\n const runDecoration = textDecorationValue(run.underline, run.strikethrough, run.overline);\n if (runDecoration) attrs.push(`text-decoration=\"${runDecoration}\"`);\n if (run.fill) {\n if ('color' in run.fill) {\n attrs.push(`fill=\"${run.fill.color}\"`);\n } else {\n attrs.push(`fill=\"${registry.ref(run.fill)}\"`);\n }\n }\n for (const a of coreStrokeAttrs(run.stroke, registry, warn)) attrs.push(a);\n // `none` included: on a run it overrides a transform the node would pass down.\n if (run.textTransform) attrs.push(`style=\"text-transform:${run.textTransform}\"`);\n const head = attrs.length > 0 ? `<tspan ${attrs.join(' ')}>` : '<tspan>';\n return `${head}${escapeText(run.text)}</tspan>`;\n}\n\n/**\n * Combine the decoration flags into an SVG `text-decoration` value —\n * `\"underline line-through\"` when both are set, a single token when only\n * one is, or `null` (omit the attribute) when none is set.\n */\nfunction textDecorationValue(\n underline: boolean | undefined,\n strikethrough: boolean | undefined,\n overline: boolean | undefined,\n): string | null {\n const tokens: string[] = [];\n if (underline) tokens.push('underline');\n if (strikethrough) tokens.push('line-through');\n if (overline) tokens.push('overline');\n return tokens.length > 0 ? tokens.join(' ') : null;\n}\n\nfunction escapeAttr(s: string): string {\n return s.replace(/&/g, '&').replace(/\"/g, '"').replace(/</g, '<');\n}\n\nfunction escapeText(s: string): string {\n return s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');\n}\n\nfunction pathBounds(path: Path): { minX: number; minY: number; maxX: number; maxY: number } {\n if (path.kind === 'rect') {\n return {\n minX: path.x, minY: path.y,\n maxX: path.x + path.width, maxY: path.y + path.height,\n };\n }\n const b = boundsOfPath(path);\n return { minX: b.x, minY: b.y, maxX: b.x + b.width, maxY: b.y + b.height };\n}\n\n","import {\n isPaintKindKnown, warmFonts, warmPaintKinds, type FontRequest, type RenderNeeds,\n} from '@weasel-js/core';\nimport type { SvgNode } from './types';\nimport { PaintServerRegistry } from './gradients';\nimport { registerPaintServers, scriptSizeFace } from './serialize';\n\n/**\n * What `serializeSvg(nodes)` reads that loads on demand: the paint kind of\n * every fill and stroke it writes as a paint server, and the face of every\n * run whose script size it takes from font metrics. The kinds come from the\n * serializer's own paint pre-pass, so the two cannot disagree. Registered\n * kinds are included.\n */\nexport function svgNeeds(nodes: readonly SvgNode[]): RenderNeeds {\n const registry = new PaintServerRegistry();\n registerPaintServers(nodes, registry);\n const fonts = new Map<string, FontRequest>();\n const walk = (list: readonly SvgNode[]) => {\n for (const n of list) {\n if (n.kind === 'group') walk(n.children);\n else if (n.kind === 'text') {\n for (const run of n.runs ?? []) {\n const face = scriptSizeFace(run, n.style);\n if (face) fonts.set(`${face.family}|${face.weight}|${face.style}`, face);\n }\n }\n }\n };\n walk(nodes);\n return { fonts: [...fonts.values()], paintKinds: registry.paintKinds() };\n}\n\n/**\n * Load what {@link svgNeeds} lists, so a `serializeSvg(nodes)` issued after it\n * resolves writes every paint server's def and every script size from the\n * face it renders in. Only those load: a lazily registered kind or font the\n * nodes do not use is never fetched, and cannot fail the export. A kind\n * nothing registered is passed over; the export warns about it instead.\n */\nexport function warmSvg(nodes: readonly SvgNode[]): Promise<void> {\n const needs = svgNeeds(nodes);\n return Promise.all([\n warmFonts(needs.fonts),\n warmPaintKinds(needs.paintKinds.filter(isPaintKindKnown)),\n ]).then(() => undefined);\n}\n","/**\n * The `unpack` half of the kit SVG handler (`svgHandler.ts`): parse an SVG\n * file into **native scene nodes** — path/text leaves under containers that\n * mirror the source `<g>` structure — instead of the default single\n * embedded-image node. Opted into via\n * `<SceneCanvas ingestion={{ svg: { unpack: unpackSvgFiles } }}>`.\n *\n * Leaf data targets the kit's built-in painters (`NodeShape.ts`): paths as\n * `{ path, fill?, stroke? }` (the `kit:path` contract), text\n * as `{ text, style?, runs?, fill?, stroke? }` (`kit:text`). Poses are absolute AABBs; the\n * renderer's `pathInPoseFrame` rebases stored geometry into the pose box,\n * so placement and fit-clamping operate on poses alone and never rewrite\n * path coordinates.\n *\n * Placement mirrors the image handler: the file's union AABB is fit-clamped\n * to 90% of the visible viewport and centered on the drop point (or the\n * viewport center), with multi-file batches cascading by a fixed offset.\n * Text takes the clamp through a scaled `fontSize` as well as its pose,\n * since glyph size is not derived from the pose the way path geometry is.\n * Multi-root files are wrapped in one synthesized container so a dropped\n * file arrives as a single selectable unit; a single-root file inserts\n * as-is. Each file commits as one `applyOps` batch, so the whole import is\n * a single undo step.\n *\n */\nimport { parseSvg } from './parse';\nimport type { ParseResult, SvgGroupNode, SvgNode, SvgPaint, SvgStroke } from './types';\nimport type { SvgKitLeafData } from './fromKit';\nimport {\n boundsOfPath,\n createInsertOp,\n DEFAULT_TEXT_STYLE,\n dwarn,\n fillToBoundsFrame,\n getMarker,\n registerMarker,\n resolveTextStyle,\n solid,\n unionAABB,\n type FillStyle,\n type ImageNodeData,\n type IngestCtx,\n type Op,\n type ScreenLength,\n type Stroke,\n type StyledRun,\n type TextStyle,\n} from '@weasel-js/core';\n\nconst CASCADE_OFFSET_PX = 24;\nconst VIEWPORT_FIT = 0.9;\n\n/** Axis-aligned box, in the coordinate space of the SVG being unpacked. Used\n * for the bounds a draft occupies before it becomes a scene node. */\nexport interface SvgDraftBounds {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\ntype DraftPose = SvgDraftBounds & { rotation?: number };\n\n/**\n * One node the unpack wants the scene to materialize, in parent-before-child\n * order (a draft's `parentId` always names an earlier draft, or `null` for\n * roots). Leaf `data` is kit-painter-native (see module doc).\n */\nexport type SvgSceneDraft<TData = Record<string, unknown>> =\n | { kind: 'container'; id: string; parentId: string | null; pose: DraftPose }\n | { kind: 'leaf'; id: string; parentId: string | null; pose: DraftPose; data: TData };\n\n/** A leaf `SvgNode`: everything but a group. */\nexport type SvgLeafNode = Exclude<SvgNode, SvgGroupNode>;\n\n/** Options for {@link svgNodesToKitDrafts}. */\nexport interface SvgNodesToKitDraftsOptions<TData> {\n /** Lower a leaf yourself, from the kit data the default writes for it and\n * the node it came from — for data shaped other than the kit painters', or\n * metadata the document carries. `null` leaves it out. */\n leaf?(id: string, draft: { pose: DraftPose; data: SvgKitLeafData }, source: SvgLeafNode): TData | null;\n}\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). A solid paint keeps its\n * `fill-opacity`.\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. */\nexport function fillDataFromSvg(\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') {\n return paint.opacity != null ? { ...solid(paint.color), opacity: paint.opacity } : solid(paint.color);\n }\n return fillInBoxFrame(paint.paint, box);\n}\n\n/** Scale a paint's opacity by `k` — how an element or group `opacity` reaches\n * leaves whose data has no opacity of its own. Where a fill and a stroke\n * overlap this is not SVG's group compositing, which flattens first. */\nfunction fadeFill(fill: FillStyle, k: number): FillStyle {\n return k === 1 ? fill : { ...fill, opacity: (fill.opacity ?? 1) * k };\n}\n\nfunction fadeStroke(stroke: Stroke, k: number): Stroke {\n return k === 1 || !stroke.paint ? stroke : { ...stroke, paint: fadeFill(stroke.paint, k) };\n}\n\nfunction fadeRun(run: StyledRun, k: number): StyledRun {\n if (k === 1 || (!run.fill && !run.stroke)) return run;\n return {\n ...run,\n ...(run.fill ? { fill: fadeFill(run.fill, k) } : {}),\n ...(run.stroke ? { stroke: fadeStroke(run.stroke, k) } : {}),\n };\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 = fillDataFromSvg(stroke.paint, box);\n if (paint === undefined || paint === null) return undefined;\n return {\n paint: stroke.opacity !== undefined ? { ...paint, opacity: stroke.opacity } : paint,\n width: stroke.width,\n ...(stroke.cap !== undefined ? { cap: stroke.cap } : {}),\n ...(stroke.join !== undefined ? { join: stroke.join } : {}),\n ...(stroke.dash !== undefined ? { dash: stroke.dash } : {}),\n ...(stroke.miterLimit !== undefined ? { miterLimit: stroke.miterLimit } : {}),\n ...(stroke.markerStart !== undefined ? { markerStart: stroke.markerStart } : {}),\n ...(stroke.markerMid !== undefined ? { markerMid: stroke.markerMid } : {}),\n ...(stroke.markerEnd !== undefined ? { markerEnd: stroke.markerEnd } : {}),\n };\n}\n\n/** A text node's paint arrives already lowered to a kit `FillStyle`, not as\n * the `SvgPaint` a path carries, so it skips `fillDataFromSvg` — but a\n * `userSpaceOnUse` gradient still needs the same rebase onto the leaf's own\n * box, or it survives neither the fit-clamp nor the drop-point placement. */\nfunction fillInBoxFrame(fill: FillStyle, box: SvgDraftBounds): FillStyle {\n const units = 'units' in fill ? fill.units : undefined;\n return units === 'world' ? fillToBoundsFrame(fill, box) : fill;\n}\n\n/** The same rebase for a run's own overrides, which `<tspan fill=\"url(#g)\">`\n * puts on the run rather than on the node. */\nfunction runInBoxFrame(run: StyledRun, box: SvgDraftBounds): StyledRun {\n const fill = run.fill ? fillInBoxFrame(run.fill, box) : run.fill;\n const stroke = run.stroke ? strokeInBoxFrame(run.stroke, box) : run.stroke;\n if (fill === run.fill && stroke === run.stroke) return run;\n return { ...run, ...(fill ? { fill } : {}), ...(stroke ? { stroke } : {}) };\n}\n\n/** The same rebase for a `Stroke`'s paint. A stroke with no paint of its own\n * passes through — there is nothing to rebase. */\nfunction strokeInBoxFrame(stroke: Stroke, box: SvgDraftBounds): Stroke {\n if (!stroke.paint) return stroke;\n const paint = fillInBoxFrame(stroke.paint, box);\n return paint === stroke.paint ? stroke : { ...stroke, paint };\n}\n\n\n/**\n * Walk an `SvgNode[]` tree and emit a flat, parent-before-child list of\n * {@link SvgSceneDraft}s. Each `<g>` becomes a container whose pose is the\n * union AABB of its descendants (the kit `group` action's convention);\n * path/text leaves carry kit-painter-native data. Empty groups are dropped.\n *\n * Handed a whole `ParseResult`, it also registers the document's markers\n * (`parsed.markers`), without which the strokes naming them draw bare.\n * Containers carry no opacity, so an element or group `opacity` is multiplied\n * into the paints of every leaf under it.\n *\n * `nextId` is handed the node each id is for. `options.leaf` replaces a leaf's\n * data; a group whose leaves it all leaves out is dropped like an empty one.\n */\nexport function svgNodesToKitDrafts<TData = Record<string, unknown>>(\n input: ParseResult | readonly SvgNode[],\n nextId: (source: SvgNode) => string,\n options: SvgNodesToKitDraftsOptions<TData> = {},\n): SvgSceneDraft<TData>[] {\n const nodes = isNodeList(input) ? input : input.nodes;\n // Keyed by what they draw, so one already registered is this same marker\n // and re-registering it would only churn the paint memo.\n if (!isNodeList(input)) {\n for (const m of input.markers ?? []) if (getMarker(m.id) === undefined) registerMarker(m);\n }\n const drafts: SvgSceneDraft<TData>[] = [];\n const pushLeaf = (source: SvgLeafNode, parentId: string | null, pose: DraftPose, data: SvgKitLeafData): DraftPose | null => {\n const id = nextId(source);\n const out = options.leaf ? options.leaf(id, { pose, data }, source) : (data as TData);\n if (out === null) return null;\n drafts.push({ kind: 'leaf', id, parentId, pose, data: out });\n return pose;\n };\n\n // Returns the pose `n` was drafted with, so a parent container can union\n // its children's axis-aligned boxes; null for empty groups. `inherited` is\n // the product of the enclosing groups' opacities.\n const visit = (n: SvgNode, parentId: string | null, inherited: number): DraftPose | null => {\n const k = inherited * (n.opacity ?? 1);\n if (n.kind === 'group') {\n const draft: Extract<SvgSceneDraft<TData>, { kind: 'container' }> = {\n kind: 'container',\n id: nextId(n),\n parentId,\n pose: { x: 0, y: 0, width: 0, height: 0 },\n };\n drafts.push(draft);\n const acc = unionAABB(n.children.map((c) => visit(c, draft.id, k)));\n if (!acc) {\n drafts.splice(drafts.indexOf(draft), 1);\n return null;\n }\n draft.pose = acc;\n return draft.pose;\n }\n\n if (n.kind === 'text') {\n const pose: DraftPose = {\n x: n.x, y: n.y, width: n.width, height: n.height,\n };\n if (n.rotation) pose.rotation = n.rotation;\n const box: SvgDraftBounds = {\n x: pose.x, y: pose.y, width: pose.width, height: pose.height,\n };\n // Absent takes the painter's default, which has to be spelled out once\n // there is an opacity to carry.\n const fill = n.fill === undefined && k !== 1 ? DEFAULT_TEXT_STYLE.fill : n.fill;\n return pushLeaf(n, parentId, pose, {\n text: n.text,\n ...(n.style ? { style: n.style } : {}),\n ...(n.verticalAlign ? { verticalAlign: n.verticalAlign } : {}),\n ...(n.runs ? { runs: n.runs.map((r) => fadeRun(runInBoxFrame(r, box), k)) } : {}),\n // `!== undefined`, not a truthiness test: `null` is the document\n // saying `fill=\"none\"`, and absent takes the painter's default.\n ...(fill !== undefined\n ? { fill: fill === null ? null : fadeFill(fillInBoxFrame(fill, box), k) }\n : {}),\n ...(n.stroke !== undefined ? { stroke: fadeStroke(strokeInBoxFrame(n.stroke, box), k) } : {}),\n });\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 return pushLeaf(n, parentId, pose, {\n image: {\n src: n.href,\n ...(k !== 1 ? { opacity: k } : {}),\n ...(n.source ? { source: { ...n.source } } : {}),\n ...(n.flipX ? { flipX: true } : {}),\n ...(n.flipY ? { flipY: true } : {}),\n } satisfies ImageNodeData['image'],\n });\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 = fillDataFromSvg(n.fill, b);\n const strokeFromSvg = strokeDataFromSvg(n.stroke, b);\n return pushLeaf(n, parentId, pose, {\n path: n.path,\n ...(fill !== undefined ? { fill: fill && fadeFill(fill, k) } : {}),\n ...(strokeFromSvg !== undefined ? { stroke: fadeStroke(strokeFromSvg, k) } : {}),\n });\n };\n\n for (const n of nodes) visit(n, null, 1);\n return drafts;\n}\n\nfunction isNodeList(input: ParseResult | readonly SvgNode[]): input is readonly SvgNode[] {\n return Array.isArray(input);\n}\n\n\n/**\n * Apply the fit-clamp scale to a text leaf's `fontSize`, which lives in data\n * rather than in the pose and so is untouched by `place`. Glyph size is not\n * derived from the pose box the way a path's geometry is (`pathInPoseFrame`\n * rebases that), so a shrunk file would otherwise arrive with its text at\n * source size, overflowing every box around it.\n *\n * Non-text data passes through, as does an unscaled import.\n */\nfunction scaleTextData(\n data: Record<string, unknown>,\n scale: number,\n): Record<string, unknown> {\n if (scale === 1 || typeof data.text !== 'string') return data;\n const style = (data.style ?? {}) as TextStyle;\n // A run's own `fontSize` is absolute and overrides the node's, so it needs\n // the same scale. `fontScale` is relative and rides the node's for free, and\n // a `{ px }` size is pinned to the screen, so the fit clamp never touches it.\n const scaleSize = (v: ScreenLength): ScreenLength => (typeof v === 'number' ? v * scale : v);\n const runs = data.runs as StyledRun[] | undefined;\n return {\n ...data,\n ...(runs\n ? {\n runs: runs.map((r) => (r.fontSize !== undefined\n ? { ...r, fontSize: scaleSize(r.fontSize) }\n : r)),\n }\n : {}),\n style: { ...style, fontSize: scaleSize(style.fontSize ?? resolveTextStyle(style).fontSize) },\n };\n}\n\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, 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 = unionAABB(roots.map((d) => d.pose))!;\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 = unionAABB(drafts.filter((d) => d.parentId === null).map((d) => d.pose))!;\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","/**\n * The kit-to-SVG direction: scene leaves back to `SvgNode`s, the inverse of\n * `svgNodesToKitDrafts`. Each leaf is written as the built-in painter that\n * draws it would draw it — the pose baked into the geometry, box-relative\n * paints resolved into that box — so `serializeSvg` over the result shows what\n * the canvas shows.\n */\nimport {\n DEFAULT_SHAPE_FILL,\n fillInPoseFrame,\n pathInPoseFrame,\n type FillStyle,\n type ImageNodeData,\n type Path,\n type Stroke,\n type StyledRun,\n type TextStyle,\n type TextVerticalAlign,\n} from '@weasel-js/core';\nimport type {\n SvgGroupNode, SvgImageNode, SvgNode, SvgPaint, SvgPathNode, SvgStroke, SvgTextNode,\n} from './types';\n\n/** A leaf's box: where it is drawn, and the frame its box-relative paints\n * resolve against. */\nexport interface SvgKitPose {\n x: number;\n y: number;\n width: number;\n height: number;\n rotation?: number;\n}\n\n/** The leaf data the kit's path, text and image painters read — what\n * `svgNodesToKitDrafts` writes. */\nexport interface SvgKitLeafData {\n path?: Path;\n fill?: FillStyle | null;\n stroke?: Stroke | null;\n text?: string;\n style?: TextStyle;\n runs?: readonly StyledRun[];\n verticalAlign?: TextVerticalAlign;\n image?: ImageNodeData['image'];\n}\n\n/** A kit paint as an `SvgPaint`. `null` is `fill=\"none\"`; a box-relative\n * gradient or pattern is resolved into `box`, since the geometry it paints\n * is written already placed there. */\nexport function svgPaintFromKit(fill: FillStyle | null, box: SvgKitPose): SvgPaint {\n if (fill === null) return { kind: 'none' };\n if (fill.fill === undefined || fill.fill === 'solid') {\n return { kind: 'solid', color: fill.color, ...(fill.opacity != null ? { opacity: fill.opacity } : {}) };\n }\n return { kind: 'gradient', paint: fillInPoseFrame(fill, box) };\n}\n\n/** A kit `Stroke` as an `SvgStroke` — the inverse of `strokeDataFromSvg`.\n * One with no paint or no width draws nothing and is written as no stroke. */\nexport function svgStrokeFromKit(stroke: Stroke | null | undefined, box: SvgKitPose): SvgStroke | undefined {\n if (!stroke?.paint) return undefined;\n const width = stroke.width ?? 1;\n if (!((typeof width === 'object' ? width.px : width) > 0)) return undefined;\n const opacity = stroke.paint.opacity;\n return {\n paint: svgPaintFromKit(stroke.paint, box),\n width,\n ...(opacity != null ? { opacity } : {}),\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.align !== undefined ? { align: stroke.align } : {}),\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/** Write a `kit:image` leaf as an `SvgImageNode` — the inverse of the image\n * arm of `svgNodesToKitDrafts`. The pose is the image's box. */\nexport function svgImageFromKit(image: ImageNodeData['image'], pose: SvgKitPose): SvgImageNode {\n const node: SvgImageNode = {\n kind: 'image', href: image.src,\n x: pose.x, y: pose.y, width: pose.width, height: pose.height,\n };\n if (image.source) node.source = { ...image.source };\n if (image.flipX) node.flipX = true;\n if (image.flipY) node.flipY = true;\n if (image.opacity != null) node.opacity = image.opacity;\n if (pose.rotation) node.rotation = pose.rotation;\n return node;\n}\n\n/** A kit `Stroke` kept as one, with its paint resolved into `box` — text\n * carries the kit's own stroke shape rather than an `SvgStroke`. */\nfunction strokeInPoseFrame(stroke: Stroke, box: SvgKitPose): Stroke {\n return stroke.paint ? { ...stroke, paint: fillInPoseFrame(stroke.paint, box) } : stroke;\n}\n\nfunction runInPoseFrame(run: StyledRun, box: SvgKitPose): StyledRun {\n if (!run.fill && !run.stroke) return run;\n return {\n ...run,\n ...(run.fill ? { fill: fillInPoseFrame(run.fill, box) } : {}),\n ...(run.stroke ? { stroke: strokeInPoseFrame(run.stroke, box) } : {}),\n };\n}\n\n/**\n * Write one leaf as the `SvgNode` its built-in painter draws — image, text or\n * path, in the order the painters claim a node. `null` for data none of them\n * draws.\n *\n * A path with no `fill` takes `kit:path`'s fallback: the default shape fill\n * when it has no stroke, and no fill when it has one.\n */\nexport function svgLeafFromKit(\n data: SvgKitLeafData,\n pose: SvgKitPose,\n): SvgPathNode | SvgTextNode | SvgImageNode | null {\n if (data.image) return svgImageFromKit(data.image, pose);\n if (data.text != null) {\n const node: SvgTextNode = {\n kind: 'text', x: pose.x, y: pose.y, width: pose.width, height: pose.height, text: data.text,\n };\n if (data.style) node.style = data.style;\n if (data.runs) node.runs = data.runs.map((r) => runInPoseFrame(r, pose));\n if (data.verticalAlign) node.verticalAlign = data.verticalAlign;\n if (data.fill !== undefined) node.fill = data.fill && fillInPoseFrame(data.fill, pose);\n if (data.stroke) node.stroke = strokeInPoseFrame(data.stroke, pose);\n if (pose.rotation) node.rotation = pose.rotation;\n return node;\n }\n if (!data.path) return null;\n const stroke = svgStrokeFromKit(data.stroke, pose);\n const fill = data.fill !== undefined ? data.fill : stroke ? null : DEFAULT_SHAPE_FILL;\n const node: SvgPathNode = {\n kind: 'path',\n path: pathInPoseFrame(data.path, pose),\n fill: svgPaintFromKit(fill, pose),\n };\n if (stroke) node.stroke = stroke;\n if (pose.rotation) node.rotation = pose.rotation;\n return node;\n}\n\n/** One node as {@link svgNodesFromKit} reads it. */\nexport interface SvgKitTreeNode {\n kind: string;\n data: unknown;\n pose: SvgKitPose;\n}\n\n/** The read side of a scene that {@link svgNodesFromKit} walks. A kit\n * `Scene` is one as it stands. */\nexport interface SvgKitTree<TId extends string = string> {\n readonly roots: readonly TId[];\n childrenOf(id: TId): readonly TId[];\n get(id: TId): SvgKitTreeNode | undefined;\n}\n\n/** Options for {@link svgNodesFromKit}. */\nexport interface SvgNodesFromKitOptions<TId extends string = string> {\n /** Walk these ids, in this order, instead of the tree's roots. */\n roots?: readonly TId[];\n /** `false` leaves a node out, with everything under it — a hidden layer. */\n include?(id: TId): boolean;\n /** Lower a leaf yourself; `null` leaves it out. Defaults to {@link svgLeafFromKit}. */\n leaf?(id: TId, node: SvgKitTreeNode): SvgNode | null;\n /** Decorate the group written for a container, e.g. with `meta`. */\n group?(id: TId, group: SvgGroupNode): SvgGroupNode;\n}\n\n/**\n * Walk a scene's container tree into `SvgNode`s ready for `serializeSvg`:\n * every `container` becomes a group of its children, in z-order, and every\n * leaf goes through {@link svgLeafFromKit} unless `options.leaf` says\n * otherwise.\n */\nexport function svgNodesFromKit<TId extends string>(\n tree: SvgKitTree<TId>,\n options: SvgNodesFromKitOptions<TId> = {},\n): SvgNode[] {\n const { include, leaf, group } = options;\n const emit = (id: TId): SvgNode | null => {\n if (include && !include(id)) return null;\n const node = tree.get(id);\n if (!node) return null;\n if (node.kind === 'container') {\n const children: SvgNode[] = [];\n for (const c of tree.childrenOf(id)) {\n const child = emit(c);\n if (child) children.push(child);\n }\n const g: SvgGroupNode = { kind: 'group', children };\n return group ? group(id, g) : g;\n }\n return leaf ? leaf(id, node) : svgLeafFromKit(node.data as SvgKitLeafData, node.pose);\n };\n const out: SvgNode[] = [];\n for (const id of options.roots ?? tree.roots) {\n const n = emit(id);\n if (n) out.push(n);\n }\n return out;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/types.ts","../src/transform.ts","../src/absoluteUnits.ts","../src/fontSize.ts","../src/metricScale.ts","../src/paintThroughMatrix.ts","../src/cssScan.ts","../src/condition.ts","../src/media.ts","../src/color.ts","../src/properties.ts","../src/supports.ts","../src/cascade.ts","../src/xmlEscape.ts","../src/styleAt.ts","../src/lengths.ts","../src/elements.ts","../src/patterns.ts","../src/path-serializer.ts","../src/gradients.ts","../src/shapes.ts","../src/lowerLeaf.ts","../src/viewBox.ts","../src/readClips.ts","../src/readPaint.ts","../src/placeBox.ts","../src/readImage.ts","../src/textAnchor.ts","../src/tspanLines.ts","../src/readText.ts","../src/readMarkers.ts","../src/parse.ts","../src/serialize.ts","../src/warm.ts","../src/unpack.ts","../src/fromKit.ts"],"names":["matches","size","width","height","DIMENSION","keyword","condition","IDENT","own","n","transformPath","PATH_M","PATH_L","PATH_Z","readPaint","out","a","invert","XLINK_NS","resolveTextStyle","num","getMarker","entry","resolveMarkerSize","meta","opacity","localName","poseFrameOf","resolveScreenLength","boundsOfPath","solid","inherited","pose","fill","union","node"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Public types for `@weasel-js/svg`. The package exposes a flat,\n * discriminated-union node model (`SvgNode`) that mirrors the SVG element\n * tree but uses weasel-native leaf data (`Path`, `FillStyle`) for geometry and\n * paint.\n *\n * Parsing collapses every `transform=\"...\"` onto its descendants' geometry,\n * so the `SvgNode` tree returned from `parseSvg` never has a non-identity\n * group transform. Consumers may still construct groups with explicit\n * transforms before serializing, in which case the serializer emits a\n * single `matrix(a b c d e f)` on the `<g>`.\n */\n\nimport { identity, type Mat3 } from '@weasel-js/geom';\nimport type { SvgMediaEnvironment } from './media';\nimport type {\n Path, FillStyle, MarkerEntry, MarkerRef, PoseLinear, ScreenLength, Stroke, StrokeAlign, StyledRun, TextStyle,\n TextVerticalAlign,\n} from '@weasel-js/core';\n\n/**\n * Opaque pass-through bag for namespaced XML content.\n *\n * weasel-svg does not interpret the contents — it only ensures that any\n * attributes or child elements in a *declared* XML namespace round-trip\n * losslessly through parse → serialize. Consumers (e.g. an app-specific\n * bridge layer) hang their domain semantics off this structure.\n *\n * Keyed by namespace prefix (the prefix is a write-time choice; the URI\n * is the canonical identifier and is supplied via `ParseOptions.namespaces`\n * / `SerializeOptions.namespaces`).\n */\nexport interface NamespaceMeta {\n [prefix: string]: {\n /** Local-name → string-value map for attributes in this namespace. */\n attrs?: Record<string, string>;\n /**\n * Child elements in this namespace, keyed by local name. Each entry\n * is an array because a namespace can host multiple sibling elements\n * with the same tag (e.g. `<wd:layer/><wd:layer/>`).\n */\n elements?: Record<string, NamespacedElement[]>;\n };\n}\n\n/** Opaque structured representation of a namespaced element. */\nexport interface NamespacedElement {\n /** Attribute local-name → string-value. */\n attrs: Record<string, string>;\n /** Text content, when the element contains only text (no child elements). */\n text?: string;\n /** Nested namespaced children, keyed by local name (recursive). */\n children?: Record<string, NamespacedElement[]>;\n}\n\n/**\n * 2x3 affine matrix in SVG's `matrix(a b c d e f)` order, mapping\n * `[x', y'] = [a*x + c*y + e, b*x + d*y + f]`.\n *\n * The same order the kernel's affine tier uses, so this is that type under\n * the name the SVG spec gives it — not a parallel one. An `SvgGroupNode`'s\n * transform and a geom `Mat3` are interchangeable without a conversion.\n */\nexport type Matrix = Mat3;\n\n/** Re-exported so this package's own stroke widths are namable beside the\n * rest of the SVG model. It is core's type; there is no second one. */\nexport type { ScreenLength };\n\n/** Identity matrix — useful as a default in tests / constructors. */\nexport const IDENTITY_MATRIX: Matrix = identity();\n\n/**\n * FillStyle description in the SVG sense — either explicit `none`, a solid\n * color, or a reference to a weasel-native gradient `FillStyle`. Solid colors\n * are normalized to `#rrggbb` strings; opacity is carried separately so\n * `fill-opacity` and `stroke-opacity` round-trip cleanly.\n */\nexport type SvgPaint =\n | { kind: 'none' }\n | { kind: 'solid'; color: string; opacity?: number }\n | { kind: 'gradient'; paint: FillStyle };\n\n/** Stroke description: a paint plus structural line parameters. */\nexport interface SvgStroke {\n paint: SvgPaint;\n /** World units, or `{ px }` for a width that holds its rendered thickness\n * however the document is scaled — SVG's `vector-effect=\"non-scaling-stroke\"`.\n * Literally the kit's own unit, not a second spelling of it. */\n width: ScreenLength;\n opacity?: number;\n /** `stroke-linecap`. Default per SVG spec is `'butt'`. */\n cap?: 'butt' | 'round' | 'square';\n /** `stroke-linejoin`. Default per SVG spec is `'miter'`. SVG's `arcs` / `miter-clip` map to `'miter'` with a warning. */\n join?: 'miter' | 'round' | 'bevel';\n /** `stroke-dasharray` as a flat number array. Odd-length inputs are doubled per SVG spec. */\n dash?: number[];\n /**\n * `stroke-miterlimit`. SVG's default is 4. Weasel's renderer defaults to\n * 10 (Canvas2D) when unset, so parsed strokes without an explicit\n * attribute may render with longer miters than the source SVG intended.\n */\n miterLimit?: number;\n /** The kit stroke's `align`. SVG has no stroke alignment, so the serializer\n * writes the stroke centered and says so through `onWarn`; the parser\n * never sets it. */\n align?: StrokeAlign;\n /** `marker-start` / `marker-mid` / `marker-end` as the kit's `MarkerRef`: the\n * bare `url(#id)` key, or a key with the `size` the serializer writes into a\n * def of its own. */\n markerStart?: MarkerRef;\n markerMid?: MarkerRef;\n markerEnd?: MarkerRef;\n}\n\n/**\n * Leaf node: a path geometry plus fill/stroke. All other v1 shapes\n * (`<rect>`, `<ellipse>`, etc.) are lowered to this representation on\n * parse — `<rect>` uses weasel's `RectPath` fast-path subtype when\n * possible, everything else becomes a `PolygonPath`.\n */\nexport interface SvgPathNode {\n kind: 'path';\n path: Path;\n fill: SvgPaint;\n stroke?: SvgStroke;\n /** Element-level opacity (`opacity=\"...\"`), 0..1. */\n opacity?: number;\n /** Element-level rotation in **radians**, pivoting around the AABB\n * center of the underlying `path` geometry. Emitted as SVG\n * `transform=\"rotate(angleDegrees cx cy)\"`. */\n rotation?: number;\n /** Opaque per-element bag for declared namespaces. See `NamespaceMeta`. */\n meta?: NamespaceMeta;\n}\n\n/**\n * Group node: an SVG `<g>`. On parse, `transform` is always omitted (any\n * `transform` attribute is collapsed onto descendants' geometry). On\n * serialize, a non-identity `transform` is emitted as\n * `matrix(a b c d e f)`.\n */\nexport interface SvgGroupNode {\n kind: 'group';\n children: SvgNode[];\n transform?: Matrix;\n /** Clips the group's contents. Serializes to a `<clipPath>` def plus\n * `clip-path=\"url(#id)\"`, and lives in the same space as `children` —\n * SVG applies the group's own `transform` to the clip as well.\n * A `<clipPath>` of more than one shape parses back as no clip: SVG\n * unions them and a `Path` holds one outline. */\n clip?: Path;\n opacity?: number;\n /** Opaque per-element bag for declared namespaces. See `NamespaceMeta`. */\n meta?: NamespaceMeta;\n}\n\n/**\n * Text leaf node. Mirrors the kit's `TextPose` shape — a bounding box plus\n * text content, optional rich-text `runs` (per-range styling), and an\n * optional `TextStyle` for the node-wide defaults.\n *\n * Note on SVG text geometry: native `<text>` flows from a baseline; it\n * doesn't have width/height attributes. The serializer emits\n * `dominant-baseline=\"text-before-edge\"` so `y` is the top of the text\n * box, plus `data-weasel-width` / `data-weasel-height` so weasel's\n * explicit box dimensions round-trip losslessly. External SVG text\n * (lacking the data-* attrs) imports with the width the kit's text layout\n * measures — an em-based estimate when no registered font can — and\n * `height = fontSize * lineHeight * (lineCount || 1)`.\n *\n * `x` here is always the box's left edge. In the SVG it is the\n * `text-anchor` point, and the parser and serializer convert between them.\n */\nexport interface SvgTextNode {\n kind: 'text';\n x: number;\n y: number;\n width: number;\n height: number;\n /** Plain text. When `runs` is set, `runsToPlainText(runs)` must equal `text`. */\n text: string;\n /** Optional per-range styling — same shape as `TextPose.runs`. */\n runs?: StyledRun[];\n /** Node-wide typography. Defaults applied at render time via `resolveTextStyle`. */\n style?: TextStyle;\n /** Where the laid-out text sits inside the box — `kit:text`'s\n * `data.verticalAlign`. SVG text has no box to align in, so this rides in\n * `data-weasel-vertical-align` and other readers draw the text top-aligned. */\n verticalAlign?: TextVerticalAlign;\n /**\n * Node-wide glyph paint, the `FillStyle` / `Stroke` a kit text node holds\n * in `data.fill` / `data.stroke`. Not `SvgPaint`, which is the path\n * nodes' shape — a text paint reaches the renderer through the runs, and\n * `StyledRun.fill` / `.stroke` override these per range.\n *\n * `null` is SVG's `fill=\"none\"`: outline-only text, painted by its stroke\n * alone. Absent takes the default black.\n */\n fill?: FillStyle | null;\n stroke?: Stroke;\n /** Element-level opacity (`opacity=\"...\"`), 0..1. */\n opacity?: number;\n /** Element-level rotation in **radians**, pivoting around the unrotated\n * AABB center `(x + width/2, y + height/2)`. Emitted as SVG\n * `transform=\"rotate(angleDegrees cx cy)\"`. */\n rotation?: number;\n /** The skew or per-axis scale the box, `rotation`, and flips cannot hold,\n * applied about the box center inside the rotation; see `PoseLinear`.\n * With one, the element is written with its whole frame as a\n * `transform=\"matrix(...)\"`. */\n transform?: PoseLinear;\n /** Opaque per-element bag for declared namespaces. See `NamespaceMeta`. */\n meta?: NamespaceMeta;\n}\n\n/**\n * Raster-image leaf — an SVG `<image>`. `href` is the element's `href` (or\n * legacy `xlink:href`) verbatim: an external URL or a `data:` URI. The\n * package neither fetches nor decodes it, so an external URL round-trips as\n * a reference and only resolves when something downstream loads it.\n *\n * SVG's `preserveAspectRatio` is not modeled; the box is taken literally.\n *\n * With a `source` rect or a flip, the element is written as a `<g\n * data-weasel-image>` holding a nested `<svg>` viewport at the box, whose\n * `viewBox` is the source window over a unit-square `<image>` — plain SVG 1.1,\n * which any reader crops and mirrors the same way, and which `parseSvg` reads\n * back as one image node.\n */\nexport interface SvgImageNode {\n kind: 'image';\n href: string;\n x: number;\n y: number;\n width: number;\n height: number;\n /** The part of the bitmap drawn into the box, as fractions of the bitmap's\n * width and height from its top-left. Omitted draws the whole bitmap.\n * Fractions rather than bitmap pixels because this package never decodes\n * the image, so it cannot know its size. */\n source?: { x: number; y: number; width: number; height: number };\n /** Mirror the drawn region within the box, as `ImageDrawCommand` does. The\n * box does not move. */\n flipX?: boolean;\n flipY?: boolean;\n /** Element-level opacity (`opacity=\"...\"`), 0..1. */\n opacity?: number;\n /** Element-level rotation in **radians**, pivoting around the unrotated\n * AABB center `(x + width/2, y + height/2)`. Emitted as SVG\n * `transform=\"rotate(angleDegrees cx cy)\"`. */\n rotation?: number;\n /** The skew or per-axis scale the box, `rotation`, and flips cannot hold,\n * applied about the box center inside the rotation; see `PoseLinear`.\n * With one, the element is written with its whole frame as a\n * `transform=\"matrix(...)\"`. */\n transform?: PoseLinear;\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 * The media `@media` rules and `<style media>` are evaluated against. A\n * parse is one static render: by default a `screen` whose viewport is the\n * root's `width` / `height` (else its `viewBox`, else 300 × 150), with a\n * light color scheme and no hover or pointer. Fields given here replace\n * those defaults.\n */\n media?: Partial<SvgMediaEnvironment>;\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 in user units when present, an absolute CSS unit converted at 96 per inch. */\n width?: number;\n /** Root `height` attribute in user units when present, converted as `width` is. */\n height?: number;\n /** Text content of the first `<title>` child of `<svg>`, when present. */\n title?: string;\n /**\n * An entry for each document `<marker>` a stroke references under a key the\n * marker registry does not know, keyed as the strokes in `nodes` now name\n * them. Nothing draws them until they are registered (`registerMarker`),\n * which `unpackSvgFiles` does.\n */\n markers?: MarkerEntry[];\n}\n\n/** Options for {@link serializeSvg}. */\nexport interface SerializeOptions {\n /**\n * Override the root `viewBox`. When omitted, the serializer computes\n * a tight bounding box from the supplied nodes.\n */\n viewBox?: { x: number; y: number; width: number; height: number };\n /**\n * Called for what the document cannot carry the way weasel draws it: a\n * paint SVG cannot express (a pattern carrying a `TextureHandle` instead of\n * a `TilePatternSpec`), a stroke aligned off its edge, text that wraps or\n * sits lower than the top of its box. Each message is said once per call.\n * Without this the loss is silent.\n */\n onWarn?: (message: string) => void;\n /** Emit `width=\"...\"` on the root `<svg>`. */\n width?: number;\n /** Emit `height=\"...\"` on the root `<svg>`. */\n height?: number;\n /**\n * Emit `<title>...</title>` as the first child of the root `<svg>`. The\n * value is XML-escaped on output. Empty strings are skipped.\n */\n title?: string;\n /**\n * Map of prefix → URI for XML namespaces to declare on the root\n * `<svg>`. The serializer reads `documentMeta[prefix]` and\n * `node.meta[prefix]` to write the actual attributes and elements.\n */\n namespaces?: Record<string, string>;\n /**\n * Opaque per-document namespaced extras. Each `<prefix>.attrs` becomes\n * `<prefix>:<name>=\"...\"` attributes on the root `<svg>`. Each\n * `<prefix>.elements[localName]` becomes `<prefix>:<localName>...>`\n * children placed immediately before any geometry.\n */\n documentMeta?: NamespaceMeta;\n /** Pretty-print with newlines + indentation. Default `false`. */\n pretty?: boolean;\n}\n","/**\n * SVG transform attribute helpers. Parses a `transform` list (`matrix`,\n * `translate`, `scale`, `rotate`, `skewX`, `skewY`) into a single 2x3 affine\n * matrix, and exposes the point/path mappers we need to collapse `transform=`\n * onto leaf geometry at parse time.\n */\n\nimport { invert, multiply } from '@weasel-js/geom';\nimport type { Matrix } from './types';\nimport { IDENTITY_MATRIX } from './types';\n\n/** Compose two 2x3 affines, `a` then `b` applied to a column vector. The\n * kernel's own composition — `Matrix` is `Mat3`, so nothing converts. */\nexport { multiply };\n\n/** Apply a 2x3 affine to a 2D point. The `{x, y}` spelling the rest of this\n * package works in; geom's `applyToPoint` returns the same numbers as a\n * tuple. */\nexport function applyMatrix(m: Matrix, x: number, y: number): { x: number; y: number } {\n return { x: m[0] * x + m[2] * y + m[4], y: m[1] * x + m[3] * y + m[5] };\n}\n\n/** True if `m` is the identity within a small epsilon. */\nexport function isIdentity(m: Matrix, eps = 1e-9): boolean {\n return (\n Math.abs(m[0] - 1) < eps &&\n Math.abs(m[1]) < eps &&\n Math.abs(m[2]) < eps &&\n Math.abs(m[3] - 1) < eps &&\n Math.abs(m[4]) < eps &&\n Math.abs(m[5]) < eps\n );\n}\n\nconst NUM_RE = /[-+]?(?:\\d*\\.\\d+|\\d+\\.?)(?:[eE][-+]?\\d+)?/g;\n\nfunction readNumbers(s: string): number[] {\n const out: number[] = [];\n const matches = s.match(NUM_RE);\n if (!matches) return out;\n for (const m of matches) {\n const n = Number(m);\n if (Number.isFinite(n)) out.push(n);\n }\n return out;\n}\n\n/**\n * Parse an SVG `transform=\"...\"` string into a single 2x3 matrix.\n * Functions compose right-to-left in SVG's coordinate model: in\n * `transform=\"A B\"`, the rightmost function is applied first to a point's\n * local coordinates. We accumulate accordingly: `result = result * fn`.\n *\n * Unrecognized functions emit a warning via the optional callback and are\n * skipped (the rest of the transform list still applies).\n */\nexport function parseTransform(\n attr: string | null | undefined,\n onWarn?: (message: string) => void,\n): Matrix {\n if (!attr) return IDENTITY_MATRIX;\n let result: Matrix = IDENTITY_MATRIX;\n // Split into \"name(args)\" chunks.\n const fnRe = /([A-Za-z]+)\\s*\\(([^)]*)\\)/g;\n let match: RegExpExecArray | null;\n while ((match = fnRe.exec(attr)) !== null) {\n const name = match[1].toLowerCase();\n const nums = readNumbers(match[2]);\n let local: Matrix | null = null;\n if (name === 'matrix' && nums.length >= 6) {\n local = [nums[0], nums[1], nums[2], nums[3], nums[4], nums[5]];\n } else if (name === 'translate') {\n const tx = nums[0] ?? 0;\n const ty = nums[1] ?? 0;\n local = [1, 0, 0, 1, tx, ty];\n } else if (name === 'scale') {\n const sx = nums[0] ?? 1;\n const sy = nums.length >= 2 ? nums[1] : sx;\n local = [sx, 0, 0, sy, 0, 0];\n } else if (name === 'rotate') {\n const ang = ((nums[0] ?? 0) * Math.PI) / 180;\n const c = Math.cos(ang);\n const s = Math.sin(ang);\n const rot: Matrix = [c, s, -s, c, 0, 0];\n if (nums.length >= 3) {\n // rotate(angle, cx, cy) = translate(cx,cy) * rotate * translate(-cx,-cy)\n const cx = nums[1];\n const cy = nums[2];\n local = multiply(multiply([1, 0, 0, 1, cx, cy], rot), [1, 0, 0, 1, -cx, -cy]);\n } else {\n local = rot;\n }\n } else if (name === 'skewx' || name === 'skewy') {\n const ang = ((nums[0] ?? 0) * Math.PI) / 180;\n const t = Math.tan(ang);\n local = name === 'skewx' ? [1, 0, t, 1, 0, 0] : [1, t, 0, 1, 0, 0];\n } else {\n onWarn?.(`unsupported transform function: ${name}`);\n continue;\n }\n result = multiply(result, local);\n }\n return result;\n}\n\n/**\n * Re-express an element's own `transform` in the frame its inherited `ctm`\n * maps into: `ctm * local * ctm⁻¹`.\n *\n * A leaf's geometry is baked through `ctm` at parse time, so its own\n * transform has to move with it. Decomposing the raw local matrix against\n * bounds that have already been through `ctm` compares two different\n * coordinate spaces, and a rotation inside a translated `<g>` fails to\n * decompose for no reason but the offset.\n *\n * `null` when `@weasel-js/geom`'s `invert` finds `ctm` singular: the geometry\n * has collapsed through it, and the local transform has no frame to live in.\n */\nexport function rebaseTransform(ctm: Matrix, local: Matrix): Matrix | null {\n const inv = invert(ctm);\n if (!inv) return null;\n return multiply(multiply(ctm, local), inv);\n}\n\n/** Try to factor `m` as \"rotation by theta about (cx, cy)\". Returns the\n * angle in radians when `m` is (within `eps`) a pure rotation about the\n * given pivot. Returns `null` otherwise.\n *\n * Pure rotation about (cx, cy) has the matrix form:\n * [ cos -sin cx - cx*cos + cy*sin ]\n * [ sin cos cy - cx*sin - cy*cos ]\n * i.e. m[0] = m[3] = cos, m[1] = -m[2] = sin, with a translation that\n * equals the pivot's \"rotate-then-translate-back\" residue. We reconstruct\n * theta from atan2(m[1], m[0]) and verify the rest.\n */\nexport function decomposeRotation(\n m: Matrix,\n cx: number,\n cy: number,\n eps = 1e-4,\n): number | null {\n const [a, b, c, d, e, f] = m;\n // Pure rotation requires a == d and b == -c.\n if (Math.abs(a - d) > eps) return null;\n if (Math.abs(b + c) > eps) return null;\n // Determinant must be 1 (no scale, no flip).\n const det = a * d - b * c;\n if (Math.abs(det - 1) > eps) return null;\n const theta = Math.atan2(b, a);\n // Verify translation = (cx - cx*cos + cy*sin, cy - cx*sin - cy*cos).\n const expectedE = cx - cx * a + cy * b;\n const expectedF = cy - cx * b - cy * a;\n if (Math.abs(e - expectedE) > eps) return null;\n if (Math.abs(f - expectedF) > eps) return null;\n return theta;\n}\n\n/** Best-effort rotational-component extraction for a general matrix (any\n * scale + rotation, ignoring translation). Used for parse-time warnings\n * on un-decomposable matrices: we can detect \"there is a rotation here\"\n * even if we won't preserve it as `node.rotation`. For a non-uniform\n * matrix the \"rotation\" is ambiguous; we report atan2(b, a) which\n * corresponds to where the +x basis vector points.\n */\nexport function rotationComponent(m: Matrix): number {\n return Math.atan2(m[1], m[0]);\n}\n\n/**\n * Format a matrix as an SVG `matrix(a b c d e f)` value. Returns `null`\n * when `m` is (effectively) the identity, so the caller can omit the\n * attribute entirely.\n */\nexport function formatMatrix(m: Matrix): string | null {\n if (isIdentity(m)) return null;\n return `matrix(${m.map((n) => trimNumber(n)).join(' ')})`;\n}\n\n/** Trim trailing zeros from a numeric value for compact SVG output. */\nexport function trimNumber(n: number): string {\n if (!Number.isFinite(n)) return '0';\n // Round to ~6 decimal places to avoid floating-point cruft.\n const r = Math.round(n * 1e6) / 1e6;\n if (Number.isInteger(r)) return String(r);\n return String(r);\n}\n","/** CSS absolute length units in px, at CSS's fixed 96 px per inch. Keys are lowercase. */\nexport const ABSOLUTE_PX: Readonly<Record<string, number>> = Object.assign(Object.create(null), {\n px: 1, in: 96, cm: 96 / 2.54, mm: 96 / 25.4, q: 96 / 101.6, pt: 96 / 72, pc: 16,\n});\n","/**\n * The font size `em` and `ex` are of. The cascade computes it once per element\n * ({@link computeFontRelative}, called from `deriveStyle`), and every length\n * reader converts with {@link emsPer} against {@link fontSizeOf}.\n */\n\nimport { ABSOLUTE_PX } from './absoluteUnits';\n\n/** CSS's `medium`, the size in effect where nothing sets one. */\nexport const DEFAULT_FONT_SIZE = 16;\n\n// No font metrics are at hand here, so `ex` takes CSS's fallback of half an em.\nconst EMS: Readonly<Record<string, number>> = Object.assign(Object.create(null), { em: 1, ex: 0.5 });\n\n/** How many ems one of `unit` is; `undefined` for a unit that is not font-relative. */\nexport function emsPer(unit: string): number | undefined {\n return EMS[unit.toLowerCase()];\n}\n\n// CSS Fonts 4's table for a 16px `medium`, and its suggested step for the two relative keywords.\nconst KEYWORD_PX: Readonly<Record<string, number>> = Object.assign(Object.create(null), {\n 'xx-small': 9, 'x-small': 10, small: 13, medium: DEFAULT_FONT_SIZE,\n large: 18, 'x-large': 24, 'xx-large': 32, 'xxx-large': 48,\n});\nconst KEYWORD_SCALE: Readonly<Record<string, number>> = Object.assign(Object.create(null), {\n larger: 1.2, smaller: 1 / 1.2,\n});\n\n/** What a `font-size` keyword stands for: a size in user units, or a multiple\n * of the parent's size; `undefined` for anything else. */\nexport function fontSizeKeyword(raw: string): { size: number } | { scale: number } | undefined {\n const word = raw.trim().toLowerCase();\n const size = KEYWORD_PX[word];\n if (size != null) return { size };\n const scale = KEYWORD_SCALE[word];\n return scale == null ? undefined : { scale };\n}\n\nconst NUMBER = '[-+]?(?:\\\\d+\\\\.?\\\\d*|\\\\.\\\\d+)(?:e[-+]?\\\\d+)?';\nconst DIMENSION = new RegExp(`^\\\\s*(${NUMBER})\\\\s*([a-z%]*)\\\\s*$`, 'i');\nconst FONT_RELATIVE = new RegExp(`(?<![\\\\w.])(${NUMBER})(em|ex)(?![\\\\w%])`, 'gi');\n\n/** Property names whose values are lengths, and so may be written in `em` or `ex`. */\nconst LENGTH_PROPERTIES = ['stroke-width', 'stroke-dasharray', 'letter-spacing'] as const;\n\ntype FontRelativeStyle = { [K in 'font-size' | (typeof LENGTH_PROPERTIES)[number]]?: string };\n\n/** A `font-size` value in user units, a relative one taken against\n * `parentSize`; `undefined` for a unit that is not converted. */\nfunction computedFontSize(raw: string, parentSize: number): number | undefined {\n const word = fontSizeKeyword(raw);\n if (word) return 'size' in word ? word.size : word.scale * parentSize;\n const m = DIMENSION.exec(raw);\n if (!m) return undefined;\n const n = Number(m[1]);\n const unit = m[2].toLowerCase();\n if (unit === '') return n;\n if (unit === '%') return (n / 100) * parentSize;\n const ems = emsPer(unit);\n if (ems != null) return n * ems * parentSize;\n const scale = ABSOLUTE_PX[unit];\n return scale == null ? undefined : n * scale;\n}\n\n/** The font size in effect at `style`, in user units. */\nexport function fontSizeOf(style: { readonly 'font-size'?: string }): number {\n const raw = style['font-size'];\n if (raw == null) return DEFAULT_FONT_SIZE;\n const size = computedFontSize(raw, DEFAULT_FONT_SIZE);\n if (size != null) return size;\n const n = parseFloat(raw);\n return Number.isFinite(n) ? n : DEFAULT_FONT_SIZE;\n}\n\n/**\n * Rewrite, in place, the font-relative values an element just set as the user\n * units they compute to: its `font-size` against `parentSize`, then its lengths\n * against that size. A child then inherits the computed length, as CSS has it,\n * and not a multiple of its own font size.\n */\nexport function computeFontRelative(style: FontRelativeStyle, parentSize: number): void {\n const raw = style['font-size'];\n if (raw != null && (/(?:%|em|ex)\\s*$/i.test(raw) || fontSizeKeyword(raw))) {\n const size = computedFontSize(raw, parentSize);\n if (size != null) style['font-size'] = String(size);\n }\n const size = fontSizeOf(style);\n for (const prop of LENGTH_PROPERTIES) {\n const value = style[prop];\n if (value == null) continue;\n style[prop] = value.replace(FONT_RELATIVE, (_, n: string, unit: string) => String(Number(n) * EMS[unit.toLowerCase()] * size));\n }\n}\n","/**\n * Uniform scaling of the lengths a node holds in its data instead of its\n * geometry: stroke width and dashes, font size, and letter spacing. A scale\n * applied to coordinates alone (a baked transform, a fit-to-viewport import)\n * leaves these at source size unless they are taken through it too.\n *\n * A `{ px }` length is pinned to the screen and never scaled.\n */\nimport type { ScreenLength, StyledRun, TextStyle } from '@weasel-js/core';\nimport { resolveTextStyle } from '@weasel-js/core';\n\nexport function scaleLength(v: ScreenLength, scale: number): ScreenLength {\n return typeof v === 'number' ? v * scale : v;\n}\n\ninterface StrokeMetrics {\n width?: ScreenLength;\n dash?: number[];\n}\n\nexport function scaleStroke<T extends StrokeMetrics>(stroke: T, scale: number): T {\n // A screen-pinned width takes its dashes with it.\n const { width } = stroke;\n if (scale === 1 || typeof width === 'object') return stroke;\n const out = { ...stroke };\n if (width !== undefined) out.width = width * scale;\n if (out.dash) out.dash = out.dash.map((n) => n * scale);\n return out;\n}\n\nexport function scaleRuns(runs: readonly StyledRun[], scale: number): StyledRun[] {\n return runs.map((r) => {\n const out = { ...r };\n // `fontScale` and `baselineShift` are relative to the node's size and ride it.\n if (out.fontSize !== undefined) out.fontSize = scaleLength(out.fontSize, scale);\n if (out.letterSpacing !== undefined) out.letterSpacing = scaleLength(out.letterSpacing, scale);\n if (out.stroke) out.stroke = scaleStroke(out.stroke, scale);\n return out;\n });\n}\n\n/** `style` with its size stated, since an absent one means the unscaled default. */\nexport function scaleTextStyle(style: TextStyle | undefined, scale: number): TextStyle {\n const out: TextStyle = { ...style };\n out.fontSize = scaleLength(out.fontSize ?? resolveTextStyle(out).fontSize, scale);\n if (out.letterSpacing !== undefined) out.letterSpacing = scaleLength(out.letterSpacing, scale);\n return out;\n}\n","/**\n * Take a paint or stroke that SVG states in user space through the matrix its\n * element's geometry was baked with, so the two stay registered.\n */\nimport type { FillStyle } from '@weasel-js/core';\nimport type { Matrix, SvgPaint, SvgStroke } from './types';\nimport { applyMatrix } from './transform';\nimport { scaleStroke } from './metricScale';\n\n/** `sqrt(|det|)`: the factor a length takes under `m`, exact when `m` scales\n * both axes alike. */\nexport function uniformScaleOf(m: Matrix): number {\n return Math.sqrt(Math.abs(m[0] * m[3] - m[1] * m[2]));\n}\n\n/** Does `m` scale one axis more than the other, or skew? */\nexport function isNonUniform(m: Matrix): boolean {\n const [a, b, c, d] = m;\n const n = Math.hypot(a, b, c, d);\n // A similarity's columns are perpendicular and equally long.\n return Math.abs(a * c + b * d) > 1e-4 * n * n\n || Math.abs(Math.hypot(a, b) - Math.hypot(c, d)) > 1e-4 * n;\n}\n\n/** A `units: 'world'` gradient with its geometry mapped through `m`. A\n * `'bounds'` one follows the box by itself and passes through. */\nexport function fillThroughMatrix(fill: FillStyle, m: Matrix): FillStyle {\n if (!('units' in fill) || fill.units !== 'world') return fill;\n const at = (p: { x: number; y: number }): { x: number; y: number } => applyMatrix(m, p.x, p.y);\n if (fill.fill === 'linear-gradient') return { ...fill, from: at(fill.from), to: at(fill.to) };\n if (fill.fill === 'radial-gradient') {\n return { ...fill, center: at(fill.center), radius: fill.radius * uniformScaleOf(m) };\n }\n if (fill.fill === 'conic-gradient') return { ...fill, center: at(fill.center) };\n return fill;\n}\n\nexport function paintThroughMatrix(paint: SvgPaint, m: Matrix): SvgPaint {\n return paint.kind === 'gradient' ? { ...paint, paint: fillThroughMatrix(paint.paint, m) } : paint;\n}\n\nexport function strokeThroughMatrix(stroke: SvgStroke, m: Matrix): SvgStroke {\n return { ...scaleStroke(stroke, uniformScaleOf(m)), paint: paintThroughMatrix(stroke.paint, m) };\n}\n","/**\n * Lexical scanning shared by the stylesheet parser and the at-rule condition\n * evaluators: strings, comments, balanced blocks, top-level splitting, and\n * single declarations.\n */\n\n/** One `prop: value [!important]` declaration. */\nexport interface Declaration {\n readonly prop: string;\n readonly value: string;\n readonly important: boolean;\n}\n\n/**\n * Advance past a quoted string starting at `i` (which holds the quote).\n * Returns the index just after the closing quote, or the end of input.\n */\nexport function skipString(s: string, i: number): number {\n const q = s[i];\n for (let j = i + 1; j < s.length; j++) {\n if (s[j] === '\\\\') j++;\n else if (s[j] === q) return j + 1;\n }\n return s.length;\n}\n\n/** Remove `/* … *\\/` comments, leaving quoted strings intact. */\nexport function stripComments(s: string): string {\n if (!s.includes('/*')) return s;\n let out = '';\n let i = 0;\n while (i < s.length) {\n const ch = s[i];\n if (ch === '\"' || ch === \"'\") {\n const end = skipString(s, i);\n out += s.slice(i, end);\n i = end;\n } else if (ch === '/' && s[i + 1] === '*') {\n const end = s.indexOf('*/', i + 2);\n i = end < 0 ? s.length : end + 2;\n out += ' ';\n } else {\n out += ch;\n i++;\n }\n }\n return out;\n}\n\n/**\n * Split `s` on `sep` wherever it sits outside strings and (), [] nesting.\n * With `dropBlocks`, a `{…}` block at depth zero is discarded along with the\n * prelude before it, back to the previous separator.\n */\nexport function splitTopLevel(s: string, sep: string, dropBlocks = false): string[] {\n const parts: string[] = [];\n let depth = 0;\n let start = 0;\n let i = 0;\n while (i < s.length) {\n const ch = s[i];\n if (ch === '\"' || ch === \"'\") { i = skipString(s, i); continue; }\n if (ch === '(' || ch === '[') depth++;\n else if ((ch === ')' || ch === ']') && depth > 0) depth--;\n else if (depth === 0 && ch === sep) {\n parts.push(s.slice(start, i));\n start = i + 1;\n } else if (depth === 0 && dropBlocks && ch === '{') {\n i = skipBlock(s, i);\n start = i;\n continue;\n }\n i++;\n }\n parts.push(s.slice(start));\n return parts;\n}\n\n/** Given `s[i] === '{'`, return the index just after its matching `}`. */\nexport function skipBlock(s: string, i: number): number {\n let depth = 0;\n while (i < s.length) {\n const ch = s[i];\n if (ch === '\"' || ch === \"'\") { i = skipString(s, i); continue; }\n if (ch === '{') depth++;\n else if (ch === '}' && --depth === 0) return i + 1;\n i++;\n }\n return s.length;\n}\n\nconst PROP_NAME = /^-?[a-z_][a-z0-9_-]*$/;\nconst IMPORTANT = /!\\s*important\\s*$/i;\n\n/**\n * Parse a CSS declaration block — a `style=\"\"` value or a rule body — in\n * source order. Malformed declarations are dropped, as CSS does.\n */\nexport function parseDeclarations(block: string): Declaration[] {\n const out: Declaration[] = [];\n for (const part of splitTopLevel(stripComments(block), ';', true)) {\n const d = parseDeclaration(part);\n if (d) out.push(d);\n }\n return out;\n}\n\n/** Parse one `prop: value [!important]`, or null when it is malformed. */\nexport function parseDeclaration(text: string): Declaration | null {\n const colon = text.indexOf(':');\n if (colon < 0) return null;\n const prop = text.slice(0, colon).trim().toLowerCase();\n if (!PROP_NAME.test(prop)) return null;\n let value = text.slice(colon + 1).trim();\n const important = IMPORTANT.test(value);\n if (important) value = value.replace(IMPORTANT, '').trim();\n if (!value) return null;\n return { prop, value, important };\n}\n\n/** Given `s[i] === '('`, return the index just after its matching `)`. */\nexport function parenEnd(s: string, i: number): number {\n let depth = 0;\n while (i < s.length) {\n const ch = s[i];\n if (ch === '\"' || ch === \"'\") { i = skipString(s, i); continue; }\n if (ch === '(') depth++;\n else if (ch === ')' && --depth === 0) return i + 1;\n i++;\n }\n return s.length;\n}\n\n","/**\n * The boolean grammar `@media` and `@supports` share: `not`, `and`, `or` and\n * parenthesized nesting, with `and` and `or` never mixed at one level. The\n * leaves differ, so each caller supplies its own.\n *\n * Values are three-valued (Kleene): `null` is \"unknown\", which Media Queries 4\n * gives to anything it cannot parse as a feature, and which stays unknown\n * under `not`. A syntax error throws {@link ConditionSyntaxError}.\n */\n\nimport { parenEnd } from './cssScan';\n\nexport type Tri = boolean | null;\n\nexport class ConditionSyntaxError extends Error {}\n\nexport interface ConditionLeaves {\n /** A parenthesized leaf whose contents are not themselves a condition. */\n paren(inner: string): Tri;\n /** A function-notation leaf, `name(args)`; `name` is lowercased. */\n fn(name: string, args: string): Tri;\n}\n\nexport const triNot = (a: Tri): Tri => (a == null ? null : !a);\nexport const triAnd = (a: Tri, b: Tri): Tri => (a === false || b === false ? false : a == null || b == null ? null : true);\nconst triOr = (a: Tri, b: Tri): Tri => (a === true || b === true ? true : a == null || b == null ? null : false);\n\ninterface Cursor {\n readonly s: string;\n i: number;\n}\n\nconst WS = /\\s/;\nconst IDENT = /^-?[a-zA-Z_][\\w-]*/;\n\nfunction skipWs(p: Cursor): void {\n while (p.i < p.s.length && WS.test(p.s[p.i])) p.i++;\n}\n\n/** Consume `word` when it stands alone as a keyword followed by whitespace. */\nfunction keyword(p: Cursor, word: string): boolean {\n const end = p.i + word.length;\n if (p.s.slice(p.i, end).toLowerCase() !== word) return false;\n if (end >= p.s.length || !WS.test(p.s[end])) return false;\n p.i = end;\n return true;\n}\n\n/**\n * Evaluate a whole condition. `allowOr: false` is the\n * `<media-condition-without-or>` that follows `<media-type> and`.\n */\nexport function evaluateCondition(s: string, leaves: ConditionLeaves, allowOr = true): Tri {\n const p: Cursor = { s, i: 0 };\n const r = condition(p, leaves, allowOr);\n skipWs(p);\n if (p.i < s.length) throw new ConditionSyntaxError(`unexpected \"${s.slice(p.i)}\"`);\n return r;\n}\n\nfunction condition(p: Cursor, leaves: ConditionLeaves, allowOr: boolean): Tri {\n skipWs(p);\n if (keyword(p, 'not')) return triNot(inParens(p, leaves));\n let r = inParens(p, leaves);\n let op: 'and' | 'or' | null = null;\n for (;;) {\n const save = p.i;\n skipWs(p);\n if (p.i >= p.s.length) { p.i = save; return r; }\n const next = keyword(p, 'and') ? 'and' : keyword(p, 'or') ? 'or' : null;\n if (!next || (op && next !== op) || (next === 'or' && !allowOr)) {\n throw new ConditionSyntaxError(`unexpected \"${p.s.slice(p.i)}\"`);\n }\n op = next;\n const rhs = inParens(p, leaves);\n r = op === 'and' ? triAnd(r, rhs) : triOr(r, rhs);\n }\n}\n\nfunction looksLikeCondition(inner: string): boolean {\n const t = inner.trimStart();\n return t.startsWith('(') || /^not\\s/i.test(t) || /^-?[a-zA-Z_][\\w-]*\\(/.test(t);\n}\n\nfunction inParens(p: Cursor, leaves: ConditionLeaves): Tri {\n skipWs(p);\n const start = p.i;\n let name: string | null = null;\n if (p.s[p.i] !== '(') {\n const m = IDENT.exec(p.s.slice(p.i));\n if (!m || p.s[p.i + m[0].length] !== '(') throw new ConditionSyntaxError(`expected \"(\" at \"${p.s.slice(p.i)}\"`);\n name = m[0].toLowerCase();\n p.i += m[0].length;\n }\n const end = parenEnd(p.s, p.i);\n if (p.s[end - 1] !== ')') throw new ConditionSyntaxError(`unbalanced \"${p.s.slice(start)}\"`);\n const inner = p.s.slice(p.i + 1, end - 1);\n p.i = end;\n if (name != null) return leaves.fn(name, inner);\n if (looksLikeCondition(inner)) {\n try {\n return evaluateCondition(inner, leaves);\n } catch (e) {\n if (!(e instanceof ConditionSyntaxError)) throw e;\n }\n }\n return leaves.paren(inner);\n}\n","/**\n * Media Queries 4 evaluation against a fixed environment.\n *\n * A parse represents one static render, so `@media` and `<style media>` are\n * answered once, against an {@link SvgMediaEnvironment}, rather than tracked\n * as live conditions.\n */\n\nimport { ABSOLUTE_PX } from './absoluteUnits';\nimport { ConditionSyntaxError, evaluateCondition, triAnd, triNot, type Tri } from './condition';\nimport { splitTopLevel } from './cssScan';\n\n/** The media a parse is taken to be rendered on. */\nexport interface SvgMediaEnvironment {\n /** Media type; `all` always matches as well. */\n readonly type: string;\n /** Viewport width in CSS px. */\n readonly width: number;\n /** Viewport height in CSS px. */\n readonly height: number;\n /** Device pixels per CSS px. */\n readonly resolution: number;\n readonly prefersColorScheme: 'light' | 'dark';\n readonly prefersReducedMotion: 'no-preference' | 'reduce';\n /** Answers both `hover` and `any-hover`. */\n readonly hover: 'none' | 'hover';\n /** Answers both `pointer` and `any-pointer`. */\n readonly pointer: 'none' | 'coarse' | 'fine';\n /** How often the output can change once rendered. */\n readonly update: 'none' | 'slow' | 'fast';\n /** Bits per color component; 0 on a monochrome device. */\n readonly color: number;\n /** Bits per pixel of a monochrome device; 0 otherwise. */\n readonly monochrome: number;\n}\n\n/** A static, light-scheme screen render with no pointer. Width and height are the replaced-element default. */\nexport const DEFAULT_MEDIA_ENVIRONMENT: SvgMediaEnvironment = {\n type: 'screen',\n width: 300,\n height: 150,\n resolution: 1,\n prefersColorScheme: 'light',\n prefersReducedMotion: 'no-preference',\n hover: 'none',\n pointer: 'none',\n update: 'none',\n color: 8,\n monochrome: 0,\n};\n\n/** An absolute SVG length in px, or undefined for a percentage, a relative unit, or garbage. */\nfunction absoluteLength(raw: string | null): number | undefined {\n const m = raw == null ? null : /^\\s*([+-]?(?:\\d+\\.?\\d*|\\.\\d+)(?:e[+-]?\\d+)?)\\s*([a-z]*)\\s*$/i.exec(raw);\n if (!m) return undefined;\n const scale = ABSOLUTE_PX[m[2].toLowerCase() || 'px'];\n const n = parseFloat(m[1]) * (scale ?? NaN);\n return Number.isFinite(n) && n >= 0 ? n : undefined;\n}\n\n/**\n * The environment a parse of this `<svg>` evaluates media against: the\n * defaults, with the viewport taken from the root's `width` / `height`, then\n * its `viewBox` (keeping its aspect ratio when only one side is given), then\n * the 300 × 150 replaced-element default. `overrides` win over all of it.\n */\nexport function mediaEnvironmentFor(\n root: Element,\n overrides: Partial<SvgMediaEnvironment> = {},\n): SvgMediaEnvironment {\n let width = absoluteLength(root.getAttribute('width'));\n let height = absoluteLength(root.getAttribute('height'));\n const vb = (root.getAttribute('viewBox') ?? '').trim().split(/[\\s,]+/).map(Number);\n if (vb.length === 4 && vb.every(Number.isFinite) && vb[2] > 0 && vb[3] > 0) {\n const [, , w, h] = vb;\n if (width == null && height == null) { width = w; height = h; }\n else if (width == null) width = (height as number) * (w / h);\n else if (height == null) height = width * (h / w);\n }\n return {\n ...DEFAULT_MEDIA_ENVIRONMENT,\n width: width ?? DEFAULT_MEDIA_ENVIRONMENT.width,\n height: height ?? DEFAULT_MEDIA_ENVIRONMENT.height,\n ...overrides,\n };\n}\n\ntype Tok =\n | { readonly k: 'ident'; readonly v: string }\n | { readonly k: 'num'; readonly v: number; readonly unit: string }\n | { readonly k: 'op'; readonly v: '<' | '<=' | '>' | '>=' | '=' }\n | { readonly k: ':' }\n | { readonly k: '/' };\n\nconst TOKEN = /\\s*(?:([+-]?(?:\\d+\\.?\\d*|\\.\\d+)(?:e[+-]?\\d+)?)([a-z%]*)|(-?[a-z_][\\w-]*)|(<=|>=|<|>|=)|(:)|(\\/))/iy;\n\nfunction tokenize(s: string): Tok[] | null {\n const out: Tok[] = [];\n TOKEN.lastIndex = 0;\n while (TOKEN.lastIndex < s.length) {\n if (/^\\s*$/.test(s.slice(TOKEN.lastIndex))) break;\n const m = TOKEN.exec(s);\n if (!m) return null;\n if (m[1] != null) out.push({ k: 'num', v: parseFloat(m[1]), unit: m[2].toLowerCase() });\n else if (m[3] != null) out.push({ k: 'ident', v: m[3].toLowerCase() });\n else if (m[4] != null) out.push({ k: 'op', v: m[4] as '<' | '<=' | '>' | '>=' | '=' });\n else if (m[5] != null) out.push({ k: ':' });\n else out.push({ k: '/' });\n }\n return out;\n}\n\ntype RangeType = 'length' | 'ratio' | 'resolution' | 'integer';\ntype Feature =\n | { readonly kind: 'range'; readonly type: RangeType; readonly get: (e: SvgMediaEnvironment) => number }\n | {\n readonly kind: 'discrete';\n readonly values: readonly string[];\n /** The value that is false in a boolean context, if any. */\n readonly off?: string;\n readonly get: (e: SvgMediaEnvironment) => string;\n };\n\nconst width = (e: SvgMediaEnvironment): number => e.width;\nconst height = (e: SvgMediaEnvironment): number => e.height;\nconst aspect = (e: SvgMediaEnvironment): number => e.width / e.height;\nconst hover: Feature = { kind: 'discrete', values: ['none', 'hover'], off: 'none', get: (e) => e.hover };\nconst pointer: Feature = { kind: 'discrete', values: ['none', 'coarse', 'fine'], off: 'none', get: (e) => e.pointer };\n\nconst FEATURES: Readonly<Record<string, Feature>> = {\n 'width': { kind: 'range', type: 'length', get: width },\n 'height': { kind: 'range', type: 'length', get: height },\n 'device-width': { kind: 'range', type: 'length', get: width },\n 'device-height': { kind: 'range', type: 'length', get: height },\n 'aspect-ratio': { kind: 'range', type: 'ratio', get: aspect },\n 'device-aspect-ratio': { kind: 'range', type: 'ratio', get: aspect },\n 'resolution': { kind: 'range', type: 'resolution', get: (e) => e.resolution },\n 'color': { kind: 'range', type: 'integer', get: (e) => e.color },\n 'monochrome': { kind: 'range', type: 'integer', get: (e) => e.monochrome },\n 'orientation': {\n kind: 'discrete', values: ['portrait', 'landscape'],\n get: (e) => (e.height >= e.width ? 'portrait' : 'landscape'),\n },\n 'prefers-color-scheme': { kind: 'discrete', values: ['light', 'dark'], get: (e) => e.prefersColorScheme },\n 'prefers-reduced-motion': {\n kind: 'discrete', values: ['no-preference', 'reduce'], off: 'no-preference', get: (e) => e.prefersReducedMotion,\n },\n 'update': { kind: 'discrete', values: ['none', 'slow', 'fast'], off: 'none', get: (e) => e.update },\n 'hover': hover,\n 'any-hover': hover,\n 'pointer': pointer,\n 'any-pointer': pointer,\n};\n\nconst FONT_PX = 16;\n\nfunction lengthPx(v: number, unit: string, env: SvgMediaEnvironment): number | null {\n if (unit === '') return v === 0 ? 0 : null;\n const abs = ABSOLUTE_PX[unit];\n if (abs != null) return v * abs;\n switch (unit) {\n case 'em': case 'rem': return v * FONT_PX;\n case 'ex': case 'ch': return v * FONT_PX / 2;\n case 'vw': return v * env.width / 100;\n case 'vh': return v * env.height / 100;\n case 'vmin': return v * Math.min(env.width, env.height) / 100;\n case 'vmax': return v * Math.max(env.width, env.height) / 100;\n default: return null;\n }\n}\n\nconst DPPX: Readonly<Record<string, number>> = { dppx: 1, x: 1, dpi: 1 / 96, dpcm: 2.54 / 96 };\n\n/** A range feature's value written as `toks`, in the feature's canonical unit. */\nfunction rangeValue(toks: readonly Tok[], type: RangeType, env: SvgMediaEnvironment): number | null {\n const [a, b, c] = toks;\n if (type === 'ratio') {\n if (toks.length === 1 && a.k === 'num' && a.unit === '' && a.v >= 0) return a.v;\n if (toks.length === 3 && a.k === 'num' && b.k === '/' && c.k === 'num' && a.unit === '' && c.unit === '' &&\n a.v >= 0 && c.v > 0) return a.v / c.v;\n return null;\n }\n if (toks.length !== 1 || a.k !== 'num') return null;\n if (type === 'length') return lengthPx(a.v, a.unit, env);\n if (type === 'resolution') return DPPX[a.unit] != null ? a.v * DPPX[a.unit] : null;\n return a.unit === '' && Number.isInteger(a.v) ? a.v : null;\n}\n\nfunction close(a: number, b: number): boolean {\n return Math.abs(a - b) <= 1e-9 * Math.max(1, Math.abs(a), Math.abs(b));\n}\n\nfunction compare(a: number, op: string, b: number): boolean {\n switch (op) {\n case '=': return close(a, b);\n case '<': return a < b && !close(a, b);\n case '<=': return a < b || close(a, b);\n case '>': return a > b && !close(a, b);\n default: return a > b || close(a, b);\n }\n}\n\nconst FLIP: Readonly<Record<string, string>> = { '<': '>', '<=': '>=', '>': '<', '>=': '<=', '=': '=' };\n\n/** One `( … )` feature test. Anything that does not parse as a known feature is unknown. */\nfunction evaluateFeature(inner: string, env: SvgMediaEnvironment): Tri {\n const toks = tokenize(inner);\n if (!toks || toks.length === 0) return null;\n const first = toks[0];\n\n if (toks.length === 1) {\n if (first.k !== 'ident') return null;\n const f = FEATURES[first.v];\n if (!f) return null;\n return f.kind === 'range' ? f.get(env) !== 0 : f.get(env) !== f.off;\n }\n\n if (first.k === 'ident' && toks[1].k === ':') {\n const prefix = /^(min|max)-/.exec(first.v)?.[1];\n const f = FEATURES[prefix ? first.v.slice(4) : first.v];\n if (!f) return null;\n const rest = toks.slice(2);\n if (f.kind === 'discrete') {\n if (prefix || rest.length !== 1 || rest[0].k !== 'ident' || !f.values.includes(rest[0].v)) return null;\n return f.get(env) === rest[0].v;\n }\n const v = rangeValue(rest, f.type, env);\n if (v == null) return null;\n return compare(f.get(env), prefix === 'min' ? '>=' : prefix === 'max' ? '<=' : '=', v);\n }\n\n // Level-4 range syntax: `name op v`, `v op name`, or `v1 op name op v2`.\n const segments: Tok[][] = [[]];\n const ops: string[] = [];\n for (const t of toks) {\n if (t.k === 'op') { ops.push(t.v); segments.push([]); }\n else segments[segments.length - 1].push(t);\n }\n if (segments.some((s) => s.length === 0)) return null;\n const featureAt = (s: Tok[]): Feature | undefined =>\n (s.length === 1 && s[0].k === 'ident' ? FEATURES[s[0].v] : undefined);\n\n if (ops.length === 1) {\n const [lhs, rhs] = segments;\n const named = featureAt(lhs) ?? featureAt(rhs);\n if (!named) return null;\n if (named.kind !== 'range') return null;\n const nameFirst = featureAt(lhs) != null;\n const v = rangeValue(nameFirst ? rhs : lhs, named.type, env);\n if (v == null) return null;\n return nameFirst ? compare(named.get(env), ops[0], v) : compare(named.get(env), FLIP[ops[0]], v);\n }\n if (ops.length === 2) {\n const f = featureAt(segments[1]);\n if (!f || f.kind !== 'range') return null;\n const lt = ops.every((o) => o === '<' || o === '<=');\n const gt = ops.every((o) => o === '>' || o === '>=');\n if (!lt && !gt) return null;\n const lo = rangeValue(segments[0], f.type, env);\n const hi = rangeValue(segments[2], f.type, env);\n if (lo == null || hi == null) return null;\n const x = f.get(env);\n return compare(lo, ops[0], x) && compare(x, ops[1], hi);\n }\n return null;\n}\n\nconst RESERVED_TYPES = new Set(['not', 'and', 'or', 'only', 'layer']);\nconst TYPED_QUERY = /^(?:(not|only)\\s+)?(-?[a-z_][\\w-]*)(?:\\s+and\\s+([\\s\\S]+))?$/;\n\nfunction evaluateQuery(query: string, env: SvgMediaEnvironment): Tri {\n const leaves = {\n paren: (inner: string): Tri => evaluateFeature(inner, env),\n fn: (): Tri => null,\n };\n if (/^(?:\\(|not\\s+\\(|-?[a-z_][\\w-]*\\()/.test(query)) return evaluateCondition(query, leaves);\n const m = TYPED_QUERY.exec(query);\n if (!m || RESERVED_TYPES.has(m[2])) throw new ConditionSyntaxError(`invalid media query \"${query}\"`);\n const typed = triAnd(m[2] === 'all' || m[2] === env.type, m[3] ? evaluateCondition(m[3], leaves, false) : true);\n return m[1] === 'not' ? triNot(typed) : typed;\n}\n\n/**\n * Whether a media query list matches `env`. An empty list matches; a\n * malformed query in the list is `not all`, leaving its neighbors intact; an\n * unknown feature or value is unknown, which never matches, even under `not`.\n */\nexport function evaluateMediaQuery(list: string, env: SvgMediaEnvironment): boolean {\n const src = list.trim().toLowerCase();\n if (src === '') return true;\n return splitTopLevel(src, ',').some((raw) => {\n const query = raw.trim();\n if (query === '') return false;\n try {\n return evaluateQuery(query, env) === true;\n } catch (e) {\n if (e instanceof ConditionSyntaxError) return false;\n throw e;\n }\n });\n}\n","/**\n * SVG color / paint parsing. Handles the SVG-specific paint surface — the\n * sentinel `none`, `url(#id)` paint-server references, and `currentColor` —\n * then delegates the actual color tokenization (hex, `rgb()`/`rgba()`,\n * `hsl()`, and the full CSS named-color table) to the kit's `parseColor`.\n * Output is normalized to `#rrggbb` plus a separate 0..1 alpha so the rest\n * of the pipeline doesn't have to know about the encoding variants.\n */\n\nimport { parseColor, rgbaToHex } from '@weasel-js/core';\n\n/** Result of parsing a `fill=` / `stroke=` attribute value. */\nexport type ParsedColor =\n | { kind: 'none' }\n | { kind: 'solid'; color: string; alpha: number }\n | { kind: 'ref'; id: string; fallback?: { color: string; alpha: number } };\n\n/**\n * Parse an SVG paint string. Returns `null` for inputs we don't recognize\n * (so the caller can emit a warning and fall back). `currentColor` resolves\n * to black here as a last-resort default; callers that participate in the\n * cascade (`readPaint`, `readTextStyle`, `readTspanRun`) pre-resolve\n * `currentColor` against the inherited `color` via `resolveCurrentColor`\n * before this function ever sees it.\n */\nexport function parsePaintAttr(raw: string | null | undefined): ParsedColor | null {\n if (raw == null) return null;\n const s = raw.trim();\n if (s === '') return null;\n if (s === 'none') return { kind: 'none' };\n if (s.toLowerCase() === 'currentcolor') {\n return { kind: 'solid', color: '#000000', alpha: 1 };\n }\n // url(#id) reference, optionally followed by the fallback paint SVG's own\n // grammar allows — what a renderer takes when it cannot resolve the\n // reference. A mesh gradient or any other paint outside this package's\n // vocabulary arrives that way.\n const urlMatch = /^url\\(\\s*#([^)\\s]+)\\s*\\)(.*)$/.exec(s);\n if (urlMatch) {\n const out: ParsedColor = { kind: 'ref', id: urlMatch[1] };\n const rest = urlMatch[2].trim();\n if (rest !== '' && rest !== 'none') {\n const fallback = parsePaintAttr(rest);\n if (fallback?.kind === 'solid') {\n (out as { fallback?: { color: string; alpha: number } }).fallback =\n { color: fallback.color, alpha: fallback.alpha };\n }\n }\n return out;\n }\n // Everything else — hex, rgb()/rgba(), hsl()/hsla(), and named colors —\n // goes through the kit's CSS parser. It throws on unrecognized input;\n // we translate that into the `null` the caller expects.\n try {\n const [r, g, b, a] = parseColor(s);\n // Split into the `#rrggbb` + 0..1 alpha contract the rest of the SVG\n // pipeline depends on. `rgbaToHex` of a 3-tuple always emits 6-char,\n // lowercase hex; the alpha is carried separately.\n return { kind: 'solid', color: rgbaToHex([r, g, b]), alpha: a };\n } catch {\n return null;\n }\n}\n","/**\n * The presentation properties this parser reads through the cascade: whether\n * each inherits, and the one reader that turns its value into what the parser\n * produces. The parser reads every property through {@link readProperty}, and\n * `@supports` answers from the same readers ({@link isDeclarationHonored}), so\n * \"is this value honored\" and \"what is done with it\" cannot disagree.\n *\n * A reader returns `undefined` for a value it cannot read, and calls `warn`\n * when it reads one only approximately — a unit it does not convert, a keyword\n * it substitutes. A value is honored when it is read and nothing is warned.\n */\n\nimport type { FontVariantCaps, TextTransform } from '@weasel-js/core';\nimport { ABSOLUTE_PX } from './absoluteUnits';\nimport { parsePaintAttr, type ParsedColor } from './color';\nimport { DEFAULT_FONT_SIZE, emsPer, fontSizeKeyword } from './fontSize';\n\nexport type Warn = (message: string) => void;\n\ninterface PropertyDef<T> {\n /** Folded into the inherited `StyleContext` rather than read off the element. */\n readonly inherits: boolean;\n /** `value` arrives trimmed and never `inherit`. Keywords compare case-sensitively unless a reader folds case.\n * `fontSize` is what an `em` or `ex` in it is of. */\n readonly read: (value: string, warn: Warn, prop: string, fontSize: number) => T | undefined;\n}\n\n/** `text-transform` keywords the runs model carries. */\nconst TEXT_TRANSFORMS: ReadonlySet<string> = new Set(['none', 'uppercase', 'lowercase', 'capitalize']);\n\nconst DIMENSION = /^([+-]?(?:\\d+\\.?\\d*|\\.\\d+)(?:e[+-]?\\d+)?)([a-z%]*)$/i;\n\nfunction dimension(v: string): { n: number; unit: string } | undefined {\n const m = DIMENSION.exec(v);\n return m ? { n: Number(m[1]), unit: m[2].toLowerCase() } : undefined;\n}\n\nconst clamp01 = (n: number): number => (n < 0 ? 0 : n > 1 ? 1 : n);\n\n/** What one of `unit` is in px, a font-relative unit taken against `fontSize`. */\nfunction pxPer(unit: string, fontSize: number): number | undefined {\n if (unit === '') return 1;\n const ems = emsPer(unit);\n return ems != null ? ems * fontSize : ABSOLUTE_PX[unit];\n}\n\n/**\n * A bare number, or a length in the `native` unit. An absolute or font-relative\n * CSS unit converts to px, and `ex` converts to em; any other unit is read as\n * its number and flagged.\n */\nconst length = (native: 'px' | 'em', coercedAs: string) =>\n (v: string, warn: Warn, prop: string, fontSize: number): number | undefined => {\n const d = dimension(v);\n if (!d) return undefined;\n const scale = native === 'px' ? pxPer(d.unit, fontSize) : emsPer(d.unit);\n if (scale != null) return d.n * scale;\n if (d.unit) {\n warn(`${prop} \"${v}\" uses unit \"${d.unit}\", which is not converted; treated as ${d.n} ${coercedAs}`);\n }\n return d.n;\n };\n\nconst worldLength = length('px', 'world units');\n\nconst keyword = <W extends string>(...words: W[]) => (v: string): W | undefined =>\n (words as string[]).includes(v) ? (v as W) : undefined;\n\nconst isCurrentColor = (v: string): boolean => v.toLowerCase() === 'currentcolor';\n\n/** A paint as written: `currentColor` has been resolved by the caller, `context-*` has not. */\nexport type PaintValue = ParsedColor | { kind: 'context'; of: 'fill' | 'stroke' };\n\nfunction readPaint(v: string): PaintValue | undefined {\n if (v === 'context-fill') return { kind: 'context', of: 'fill' };\n if (v === 'context-stroke') return { kind: 'context', of: 'stroke' };\n return parsePaintAttr(v) ?? undefined;\n}\n\n/** `0..1` from a number or a percentage, clamped. */\nfunction readRatio(v: string): number | undefined {\n const d = dimension(v);\n if (!d || (d.unit !== '' && d.unit !== '%')) return undefined;\n return clamp01(d.unit === '%' ? d.n / 100 : d.n);\n}\n\nfunction readSolidColor(v: string, warn: Warn, prop: string): { color: string; alpha: number } | undefined {\n const parsed = parsePaintAttr(v);\n if (parsed?.kind !== 'solid') return undefined;\n if (isCurrentColor(v)) warn(`${prop}=\"${v}\" is read as black; it is not resolved against color`);\n return parsed;\n}\n\n/** `null` is `none`. */\nfunction readMarkerRef(v: string): string | null | undefined {\n if (v === 'none') return null;\n return /^url\\(\\s*#([^)\\s]+)\\s*\\)$/.exec(v)?.[1];\n}\n\nfunction readLinecap(v: string, warn: Warn): 'butt' | 'round' | 'square' | undefined {\n const cap = keyword('butt', 'round', 'square')(v);\n if (!cap) warn(`unsupported stroke-linecap: ${v}`);\n return cap;\n}\n\nfunction readLinejoin(v: string, warn: Warn): 'miter' | 'round' | 'bevel' | undefined {\n const join = keyword('miter', 'round', 'bevel')(v);\n if (join) return join;\n if (v === 'arcs' || v === 'miter-clip') {\n warn(`stroke-linejoin \"${v}\" not supported; falling back to miter`);\n return 'miter';\n }\n warn(`unsupported stroke-linejoin: ${v}`);\n return undefined;\n}\n\n/** `null` is `none`; an odd-length list is repeated to make the pattern even, as SVG says. */\nfunction readDashArray(v: string, warn: Warn, _prop: string, fontSize: number): number[] | null | undefined {\n if (v === 'none' || v === '') return null;\n const nums: number[] = [];\n for (const t of v.split(/[\\s,]+/).filter(Boolean)) {\n const d = dimension(t);\n const scale = d && pxPer(d.unit, fontSize);\n if (!d || scale == null || d.n < 0) {\n warn(`unrecognized stroke-dasharray: ${v}`);\n return undefined;\n }\n nums.push(d.n * scale);\n }\n return nums.length % 2 === 1 ? [...nums, ...nums] : nums;\n}\n\nfunction readMiterLimit(v: string, warn: Warn): number | undefined {\n const d = dimension(v);\n if (d && d.unit === '' && d.n >= 1) return d.n;\n warn(`unrecognized stroke-miterlimit: ${v}`);\n return undefined;\n}\n\n/** The raw value, once it is known to be a color or `currentColor`. */\nfunction readColor(v: string): string | undefined {\n return isCurrentColor(v) || parsePaintAttr(v)?.kind === 'solid' ? v : undefined;\n}\n\n/** A percentage, `em`, `ex`, `larger`, or `smaller` is relative to the parent's size (`fontScale`); anything else is an absolute `fontSize`. */\nfunction readFontSize(\n v: string, warn: Warn, prop: string, fontSize: number,\n): { fontSize?: number; fontScale?: number } | undefined {\n const word = fontSizeKeyword(v);\n if (word) return 'size' in word ? { fontSize: word.size } : { fontScale: word.scale };\n const d = dimension(v);\n if (d?.unit === '%') return { fontScale: d.n / 100 };\n const ems = d && emsPer(d.unit);\n if (d && ems != null) return { fontScale: d.n * ems };\n const n = worldLength(v, warn, prop, fontSize);\n return n == null ? undefined : { fontSize: n };\n}\n\nfunction readFontWeight(v: string): 'normal' | 'bold' | 'bolder' | number | undefined {\n if (v === 'normal' || v === 'bold' || v === 'bolder') return v;\n const d = dimension(v);\n return d && d.unit === '' && d.n >= 1 && d.n <= 1000 ? d.n : undefined;\n}\n\nfunction readFontStyle(v: string, warn: Warn): 'normal' | 'italic' | undefined {\n if (v === 'normal' || v === 'italic') return v;\n if (v === 'oblique') {\n warn('font-style \"oblique\" is read as italic');\n return 'italic';\n }\n return undefined;\n}\n\n/** `null` is `normal`. */\nfunction readLetterSpacing(v: string, warn: Warn, prop: string, fontSize: number): number | null | undefined {\n return v === 'normal' ? null : worldLength(v, warn, prop, fontSize);\n}\n\nexport interface Decoration { underline?: boolean; strikethrough?: boolean; overline?: boolean }\n\nfunction readDecoration(v: string, warn: Warn): Decoration {\n const out: Decoration = {};\n for (const t of v.toLowerCase().split(/\\s+/)) {\n if (t === 'underline') out.underline = true;\n else if (t === 'line-through') out.strikethrough = true;\n else if (t === 'overline') out.overline = true;\n // CSS lets a renderer decline to blink, so dropping it honors it.\n else if (t !== 'none' && t !== 'blink') warn(`text-decoration \"${v}\": \"${t}\" is not modeled; dropped`);\n }\n return out;\n}\n\n/** `small-caps` or `normal`, out of what may be a CSS 3 shorthand; any other\n * variant is one the run model does not carry. */\nfunction readFontVariant(v: string, warn: Warn): FontVariantCaps | undefined {\n let out: FontVariantCaps | undefined;\n for (const t of v.toLowerCase().split(/\\s+/)) {\n if (t === 'small-caps' || t === 'normal') out = t;\n else if (t) warn(`font-variant \"${v}\": \"${t}\" is not modeled; dropped`);\n }\n return out;\n}\n\nfunction readTextTransform(v: string): TextTransform | undefined {\n const t = v.toLowerCase();\n return TEXT_TRANSFORMS.has(t) ? (t as TextTransform) : undefined;\n}\n\nconst emLength = length('em', 'em');\n\n/**\n * `super` and `sub` are the presets `script` names; a percentage resolves\n * against the parent's font size, the unit `baselineShift` is already in; a\n * bare number is ems; `baseline` or zero is no shift.\n */\nfunction readBaselineShift(\n v: string, warn: Warn, prop: string,\n): { script?: 'super' | 'sub'; baselineShift?: number } | undefined {\n const k = v.toLowerCase();\n if (k === 'super' || k === 'sub') return { script: k };\n if (k === 'baseline') return {};\n const d = dimension(v);\n if (d?.unit === '%') return d.n === 0 ? {} : { baselineShift: d.n / 100 };\n const n = emLength(v, warn, prop, DEFAULT_FONT_SIZE);\n if (n == null) return undefined;\n return n === 0 ? {} : { baselineShift: n };\n}\n\n/** `none`, or the id a `url(#id)` names. Any other clip (a basic shape, a\n * reference into another file) is not one this parser can resolve. */\nfunction readClipRef(v: string): { id: string } | 'none' | undefined {\n if (v === 'none') return 'none';\n const ref = /^url\\(\\s*[\"']?#([^)\\s\"']+)[\"']?\\s*\\)$/.exec(v);\n return ref ? { id: ref[1] } : undefined;\n}\n\nconst inherited = <T>(read: PropertyDef<T>['read']): PropertyDef<T> & { inherits: true } => ({ inherits: true, read });\nconst own = <T>(read: PropertyDef<T>['read']): PropertyDef<T> & { inherits: false } => ({ inherits: false, read });\n\nexport const PROPERTIES = {\n 'fill': inherited(readPaint),\n 'fill-opacity': inherited(readRatio),\n 'fill-rule': inherited(keyword('nonzero', 'evenodd')),\n 'stroke': inherited(readPaint),\n 'stroke-width': inherited(worldLength),\n 'stroke-opacity': inherited(readRatio),\n 'stroke-linecap': inherited(readLinecap),\n 'stroke-linejoin': inherited(readLinejoin),\n 'stroke-dasharray': inherited(readDashArray),\n 'stroke-miterlimit': inherited(readMiterLimit),\n 'marker-start': inherited(readMarkerRef),\n 'marker-mid': inherited(readMarkerRef),\n 'marker-end': inherited(readMarkerRef),\n 'color': inherited(readColor),\n 'font-size': inherited(readFontSize),\n 'font-family': inherited((v) => (v.length > 0 ? v : undefined)),\n 'font-weight': inherited(readFontWeight),\n 'font-style': inherited(readFontStyle),\n 'text-anchor': inherited(keyword('start', 'middle', 'end')),\n 'letter-spacing': inherited(readLetterSpacing),\n 'text-decoration': inherited(readDecoration),\n 'direction': inherited(keyword('ltr', 'rtl')),\n 'text-transform': inherited(readTextTransform),\n 'font-variant': inherited(readFontVariant),\n 'opacity': own(readRatio),\n 'stop-color': own(readSolidColor),\n 'stop-opacity': own(readRatio),\n 'baseline-shift': own(readBaselineShift),\n 'vector-effect': own(keyword('none', 'non-scaling-stroke')),\n 'clip-path': own(readClipRef),\n 'display': own(keyword('none', 'inline')),\n 'visibility': inherited(keyword('visible', 'hidden', 'collapse')),\n} as const satisfies Record<string, PropertyDef<unknown>>;\n\nexport type PropertyName = keyof typeof PROPERTIES;\nexport type InheritedPropertyName = {\n [K in PropertyName]: (typeof PROPERTIES)[K]['inherits'] extends true ? K : never\n}[PropertyName];\nexport type PropertyValue<K extends PropertyName> =\n (typeof PROPERTIES)[K] extends PropertyDef<infer T> ? T : never;\n\nexport const INHERITED_PROPERTIES = (Object.keys(PROPERTIES) as PropertyName[])\n .filter((p): p is InheritedPropertyName => PROPERTIES[p].inherits);\n\nconst silent: Warn = () => {};\n\n/** Read a raw cascaded value of `prop`; `undefined` when absent or unreadable.\n * `fontSize` is the size an `em` or `ex` in it is of. */\nexport function readProperty<K extends PropertyName>(\n prop: K, raw: string | null | undefined, warn: Warn = silent, fontSize = DEFAULT_FONT_SIZE,\n): PropertyValue<K> | undefined {\n if (raw == null) return undefined;\n const v = raw.trim();\n if (v === 'inherit') return undefined;\n return PROPERTIES[prop].read(v, warn, prop, fontSize) as PropertyValue<K> | undefined;\n}\n\nfunction isPropertyName(prop: string): prop is PropertyName {\n return Object.prototype.hasOwnProperty.call(PROPERTIES, prop);\n}\n\n/**\n * Whether a declaration of `prop: value` would change what this parser\n * produces, exactly as asked. `inherit` is honored for inherited properties\n * only, since only the inheritance fold reads it.\n */\nexport function isDeclarationHonored(prop: string, value: string): boolean {\n const name = prop.toLowerCase();\n if (!isPropertyName(name)) return false;\n const v = value.trim();\n if (v === 'inherit') return PROPERTIES[name].inherits;\n let warned = false;\n return readProperty(name, v, () => { warned = true; }) !== undefined && !warned;\n}\n","/**\n * `@supports` evaluation. A declaration test asks whether this parser would\n * honor the declaration ({@link isDeclarationHonored}), not whether a browser\n * could parse it — the answer decides whether the guarded rules apply here.\n */\n\nimport { ConditionSyntaxError, evaluateCondition } from './condition';\nimport { parseDeclaration } from './cssScan';\nimport { isDeclarationHonored } from './properties';\n\n/** Options for evaluating a `@supports` condition. */\nexport interface SupportsOptions {\n /** Answers `selector(…)`; without it every selector test is false. */\n readonly selector?: (selector: string) => boolean;\n}\n\n/**\n * Whether a `@supports` condition holds. `selector()` defers to\n * `opts.selector`; any other function and any unrecognized parenthesized\n * content is false, so `not` of one is true. A malformed condition is false.\n */\nexport function evaluateSupports(condition: string, opts: SupportsOptions = {}): boolean {\n try {\n return evaluateCondition(condition, {\n paren: (inner) => {\n const d = parseDeclaration(inner);\n return d != null && isDeclarationHonored(d.prop, d.value);\n },\n fn: (name, args) => name === 'selector' && (opts.selector?.(args) ?? false),\n }) === true;\n } catch (e) {\n if (e instanceof ConditionSyntaxError) return false;\n throw e;\n }\n}\n","/**\n * SVG style cascade: presentation attributes, `<style>` rules, `style=\"\"`, inheritance.\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 cascaded values onto\n * the inherited cascade once, and leaves read resolved values directly.\n */\n\nimport {\n parenEnd, parseDeclarations, skipBlock, skipString, splitTopLevel, stripComments, type Declaration,\n} from './cssScan';\nimport {\n DEFAULT_MEDIA_ENVIRONMENT, evaluateMediaQuery, mediaEnvironmentFor, type SvgMediaEnvironment,\n} from './media';\nimport {\n INHERITED_PROPERTIES, readProperty, type InheritedPropertyName, type PropertyName, type PropertyValue, type Warn,\n} from './properties';\nimport { evaluateSupports } from './supports';\nimport { computeFontRelative, fontSizeOf } from './fontSize';\n\nexport { parseDeclarations, type Declaration };\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<Partial<Record<InheritedPropertyName, string>>>;\n\n/** The empty cascade — seeds the root. */\nexport const EMPTY_STYLE: StyleContext = {};\n\n/** One selector from a style rule; a comma list becomes one rule per selector. */\nexport interface StyleRule {\n readonly selector: string;\n readonly declarations: readonly Declaration[];\n /** `[ids, classes/attributes/pseudo-classes, types/pseudo-elements]`. */\n readonly specificity: Specificity;\n /** Source position across every `<style>` in the document. */\n readonly order: number;\n /** The cascade layer's full dotted name; `''` is unlayered. An anonymous layer's segment starts with U+0000. */\n readonly layer: string;\n}\n\nexport type Specificity = readonly [number, number, number];\n\n/** Read an identifier (with escapes) starting at `i`; returns its end index. */\nfunction identEnd(s: string, i: number): number {\n while (i < s.length) {\n const ch = s[i];\n if (ch === '\\\\') i += 2;\n else if (/[\\w-]/.test(ch) || ch.charCodeAt(0) > 0x7f) i++;\n else break;\n }\n return i;\n}\n\nconst LEGACY_PSEUDO_ELEMENTS = new Set(['before', 'after', 'first-line', 'first-letter']);\nconst MAX_ARG_PSEUDOS = new Set(['not', 'is', 'matches', '-webkit-any', 'has']);\n\nfunction compareSpecificity(a: Specificity, b: Specificity): number {\n return a[0] - b[0] || a[1] - b[1] || a[2] - b[2];\n}\n\nfunction maxSpecificity(list: string): Specificity {\n let best: Specificity = [0, 0, 0];\n for (const sel of splitTopLevel(list, ',')) {\n const s = specificity(sel);\n if (compareSpecificity(s, best) > 0) best = s;\n }\n return best;\n}\n\n/** CSS Selectors 4 specificity of one complex selector (no comma list). */\nexport function specificity(selector: string): Specificity {\n let a = 0, b = 0, c = 0;\n const s = selector;\n let i = 0;\n while (i < s.length) {\n const ch = s[i];\n if (ch === '#') {\n a++;\n i = identEnd(s, i + 1);\n } else if (ch === '.') {\n b++;\n i = identEnd(s, i + 1);\n } else if (ch === '[') {\n b++;\n while (i < s.length && s[i] !== ']') {\n i = s[i] === '\"' || s[i] === \"'\" ? skipString(s, i) : i + 1;\n }\n i++;\n } else if (ch === ':') {\n const element = s[i + 1] === ':';\n const nameStart = i + (element ? 2 : 1);\n const nameEnd = identEnd(s, nameStart);\n const name = s.slice(nameStart, nameEnd).toLowerCase();\n let arg: string | null = null;\n i = nameEnd;\n if (s[i] === '(') {\n const end = parenEnd(s, i);\n arg = s.slice(i + 1, end - 1);\n i = end;\n }\n if (element || LEGACY_PSEUDO_ELEMENTS.has(name)) c++;\n else if (name === 'where') { /* contributes nothing */ }\n else if (MAX_ARG_PSEUDOS.has(name) && arg != null) {\n const m = maxSpecificity(arg);\n a += m[0]; b += m[1]; c += m[2];\n } else b++;\n } else if (/[a-zA-Z_\\\\-]/.test(ch) || ch.charCodeAt(0) > 0x7f) {\n c++;\n i = identEnd(s, i);\n } else {\n i++;\n }\n }\n return [a, b, c];\n}\n\n/** What a stylesheet's conditional at-rules are evaluated against. */\nexport interface StylesheetContext {\n /** The environment `@media` answers to; {@link DEFAULT_MEDIA_ENVIRONMENT} when omitted. */\n readonly media?: SvgMediaEnvironment;\n /** Answers `@supports selector(…)`; every selector test is false without it. */\n readonly selector?: (selector: string) => boolean;\n /** Receives a notice for each `@import`, which is never fetched. */\n readonly onWarn?: (message: string) => void;\n}\n\n/**\n * The cascade layers a document declares, in the order CSS Cascade 5 ranks\n * them. Several sheets share one, since a layer's position is fixed by its\n * first declaration anywhere in the document.\n */\nexport class CascadeLayers {\n private readonly children = new Map<string, string[]>();\n private anonymous = 0;\n\n /** Declare `name` (possibly dotted) inside `parent`, keeping any earlier position; returns its full name. */\n declare(parent: string, name: string): string {\n let full = parent;\n for (const segment of name.split('.')) {\n const child = full ? `${full}.${segment}` : segment;\n const siblings = this.children.get(full) ?? [];\n if (!siblings.includes(child)) {\n siblings.push(child);\n this.children.set(full, siblings);\n }\n full = child;\n }\n return full;\n }\n\n /** A fresh layer inside `parent` that nothing can reopen. */\n declareAnonymous(parent: string): string {\n return this.declare(parent, `\\u0000${this.anonymous++}`);\n }\n\n /**\n * Each layer's rank for normal declarations, higher winning: a layer's\n * sublayers rank below its own rules, in declaration order, and unlayered\n * rules (`''`) rank above every layer.\n */\n ranks(): ReadonlyMap<string, number> {\n const out = new Map<string, number>();\n const visit = (name: string): void => {\n for (const child of this.children.get(name) ?? []) visit(child);\n out.set(name, out.size);\n };\n visit('');\n return out;\n }\n}\n\n/**\n * Parse stylesheet text into rules. `@media` and `@supports` blocks\n * contribute their rules when their condition holds against `ctx`, nested to\n * any depth, and `@layer` blocks contribute theirs tagged with the layer,\n * which is declared into `layers`. `@import` is reported and not fetched;\n * every other at-rule (`@font-face`, `@container`, `@keyframes`, …) is\n * skipped whole, as are nested blocks inside a rule body. `order` continues\n * from `firstOrder` so several sheets share one source order.\n */\nexport function parseStylesheet(\n text: string, firstOrder = 0, ctx: StylesheetContext = {}, layers = new CascadeLayers(),\n): StyleRule[] {\n const src = stripComments(text).replace(/<!\\[CDATA\\[|\\]\\]>|<!--|-->/g, ' ');\n const rules: StyleRule[] = [];\n parseRuleList(src, 0, src.length, '', ctx, rules, { order: firstOrder, importsAllowed: true, layers });\n return rules;\n}\n\nconst IDENT = '-?[a-zA-Z_\\\\u0080-\\\\uffff][\\\\w\\\\u0080-\\\\uffff-]*';\nconst LAYER_NAME = new RegExp(`^${IDENT}(?:\\\\.${IDENT})*$`);\n\n/** The names in a `@layer` prelude, or null when any is malformed. */\nfunction layerNames(prelude: string): string[] | null {\n if (!prelude.trim()) return [];\n const names = splitTopLevel(prelude, ',').map((n) => n.trim());\n return names.every((n) => LAYER_NAME.test(n)) ? names : null;\n}\n\nconst AT_RULE = /^@([\\w-]+)\\s*([\\s\\S]*)$/;\n\ninterface ListState {\n order: number;\n /** `@import` is valid only at the top of a sheet, ahead of every rule but `@charset` and `@layer`. */\n importsAllowed: boolean;\n readonly layers: CascadeLayers;\n}\n\nfunction parseRuleList(\n src: string, from: number, to: number, layer: string, ctx: StylesheetContext, rules: StyleRule[], state: ListState,\n): void {\n let i = from;\n let preludeStart = from;\n while (i < to) {\n const ch = src[i];\n if (ch === '\"' || ch === \"'\") { i = skipString(src, i); continue; }\n if (ch === ';') {\n const text = src.slice(preludeStart, i).trim();\n const statement = AT_RULE.exec(text);\n const name = statement?.[1].toLowerCase();\n if (name === 'import' && state.importsAllowed) {\n ctx.onWarn?.(`@import ${statement?.[2]} is not fetched; its rules do not apply`);\n } else if (name === 'layer') {\n for (const n of layerNames(statement?.[2] ?? '') ?? []) state.layers.declare(layer, n);\n } else if (text && name !== 'charset') {\n state.importsAllowed = false;\n }\n i++;\n preludeStart = i;\n continue;\n }\n if (ch !== '{') { i++; continue; }\n const prelude = src.slice(preludeStart, i).trim();\n const end = Math.min(skipBlock(src, i), to);\n const at = AT_RULE.exec(prelude);\n state.importsAllowed = false;\n if (at) {\n const name = at[1].toLowerCase();\n const names = name === 'layer' ? layerNames(at[2]) : null;\n if (names && names.length <= 1) {\n const inner = names.length ? state.layers.declare(layer, names[0]) : state.layers.declareAnonymous(layer);\n parseRuleList(src, i + 1, end - 1, inner, ctx, rules, state);\n } else if (conditionHolds(name, at[2], ctx)) {\n parseRuleList(src, i + 1, end - 1, layer, ctx, rules, state);\n }\n } else if (prelude) {\n const declarations = parseDeclarations(src.slice(i + 1, end - 1));\n for (const raw of splitTopLevel(prelude, ',')) {\n const selector = raw.trim();\n if (selector) {\n rules.push({ selector, declarations, specificity: specificity(selector), order: state.order++, layer });\n }\n }\n }\n i = end;\n preludeStart = end;\n }\n}\n\nfunction conditionHolds(name: string, condition: string, ctx: StylesheetContext): boolean {\n if (name === 'media') return evaluateMediaQuery(condition, ctx.media ?? DEFAULT_MEDIA_ENVIRONMENT);\n if (name === 'supports') return evaluateSupports(condition, { selector: ctx.selector });\n return false;\n}\n\nfunction appliesAsCss(style: Element, ctx: StylesheetContext): boolean {\n const type = style.getAttribute('type')?.trim().toLowerCase();\n if (type && type !== 'text/css') return false;\n return evaluateMediaQuery(style.getAttribute('media') ?? '', ctx.media ?? DEFAULT_MEDIA_ENVIRONMENT);\n}\n\n/** A rule with its layer's rank for normal declarations; `!important` reverses it. */\ninterface RankedRule extends StyleRule {\n readonly rank: number;\n}\n\n/** Rules sorted ascending by (layer rank, specificity, source order): the cascade's order for normal declarations. */\nconst sheetCache = new WeakMap<Document, readonly RankedRule[]>();\n\n/**\n * Evaluate `doc`'s stylesheets against `media` now, reporting to `onWarn`.\n * A document never bound is read on first use against the environment its\n * root implies, with nothing reported.\n */\nexport function bindStylesheets(\n doc: Document, media: SvgMediaEnvironment, onWarn?: (message: string) => void,\n): void {\n sheetCache.set(doc, collectRules(doc, media, onWarn));\n}\n\nfunction documentRules(doc: Document): readonly RankedRule[] {\n const cached = sheetCache.get(doc);\n if (cached) return cached;\n const root = doc.documentElement;\n const rules = collectRules(doc, root ? mediaEnvironmentFor(root) : DEFAULT_MEDIA_ENVIRONMENT);\n sheetCache.set(doc, rules);\n return rules;\n}\n\nfunction collectRules(\n doc: Document, media: SvgMediaEnvironment, onWarn?: (message: string) => void,\n): readonly RankedRule[] {\n const ctx: StylesheetContext = { media, onWarn, selector: (s) => isValidSelector(doc, s) };\n const layers = new CascadeLayers();\n const rules: StyleRule[] = [];\n const styles = doc.getElementsByTagNameNS('*', 'style');\n for (let i = 0; i < styles.length; i++) {\n if (!appliesAsCss(styles[i], ctx)) continue;\n rules.push(...parseStylesheet(styles[i].textContent ?? '', rules.length, ctx, layers));\n }\n const ranks = layers.ranks();\n return rules\n .map((r) => ({ ...r, rank: ranks.get(r.layer) ?? 0 }))\n .sort((x, y) => x.rank - y.rank || compareCascade(x, y));\n}\n\nfunction compareCascade(x: StyleRule, y: StyleRule): number {\n return compareSpecificity(x.specificity, y.specificity) || x.order - y.order;\n}\n\nfunction isValidSelector(doc: Document, selector: string): boolean {\n const root = doc.documentElement;\n if (!root || !selector.trim()) return false;\n try {\n root.matches(selector);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction matches(el: Element, selector: string): boolean {\n try {\n return el.matches(selector);\n } catch {\n return false;\n }\n}\n\nconst elementCache = new WeakMap<Element, ReadonlyMap<string, string>>();\n\n/**\n * The cascaded value of every property an author rule or `style=\"\"` sets on\n * `el`. Lowest to highest: normal rules, normal inline, `!important` rules,\n * `!important` inline (CSS Cascade 5). Layers order the rules within each\n * importance, reversed for `!important`. Presentation attributes sit below\n * all of these and are left to {@link ownProp}.\n */\nfunction authorDeclarations(el: Element): ReadonlyMap<string, string> {\n const cached = elementCache.get(el);\n if (cached) return cached;\n const rules = el.ownerDocument ? documentRules(el.ownerDocument) : [];\n const matched = rules.filter((r) => matches(el, r.selector));\n const inline = parseDeclarations(el.getAttribute('style') ?? '');\n const out = new Map<string, string>();\n const importantOrder = [...matched].sort((x, y) => y.rank - x.rank || compareCascade(x, y));\n for (const [important, ordered] of [[false, matched], [true, importantOrder]] as const) {\n for (const r of ordered) {\n for (const d of r.declarations) if (d.important === important) out.set(d.prop, d.value);\n }\n for (const d of inline) if (d.important === important) out.set(d.prop, d.value);\n }\n elementCache.set(el, out);\n return out;\n}\n\n/**\n * Resolve an element's own (cascaded, pre-inheritance) value for a property:\n * stylesheet rules and `style=\"\"` by CSS precedence, then the presentation\n * attribute, which ranks below any author rule (SVG2).\n */\nexport function ownProp(el: Element, prop: PropertyName): string | null {\n return authorDeclarations(el).get(prop) ?? el.getAttribute(prop);\n}\n\n/**\n * Fold an element's own cascaded values ({@link ownProp}) onto the inherited cascade.\n * A property that is absent or literally `inherit` keeps the parent value;\n * any other own value overrides, and an `em` or `ex` in it is computed to user\n * units here, where its font size is known. 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: Partial<Record<InheritedPropertyName, string>> | null = null;\n for (const prop of INHERITED_PROPERTIES) {\n const own = ownProp(el, prop);\n // `color: currentColor` is `inherit` by another name (CSS Color 4).\n if (own == null || own === 'inherit' || (prop === 'color' && own.trim().toLowerCase() === 'currentcolor')) continue;\n if (!next) next = { ...parent };\n next[prop] = own;\n }\n if (next) computeFontRelative(next, fontSizeOf(parent));\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 raw;\n const color = readProperty('color', style['color']);\n return color == null || color.toLowerCase() === 'currentcolor' ? '#000000' : color;\n}\n\n/** An element's own value of `prop`, read by the property's one reader. */\nexport function ownValue<K extends PropertyName>(\n el: Element, prop: K, warn?: Warn, fontSize?: number,\n): PropertyValue<K> | undefined {\n return readProperty(prop, ownProp(el, prop), warn, fontSize);\n}\n\n/** The inherited value of `prop` in effect at `style`, read by the property's one reader. */\nexport function styleValue<K extends InheritedPropertyName>(\n style: StyleContext, prop: K, warn?: Warn,\n): PropertyValue<K> | undefined {\n return readProperty(prop, style[prop], warn);\n}\n","/**\n * Escaping for the XML this package writes by hand.\n *\n * XML 1.0 cannot hold most C0 controls, U+FFFE, U+FFFF, or half a surrogate\n * pair, even as character references, and a parser rejects the whole\n * document over one. A vertical tab or form feed is a line break where text\n * comes from (a word processor's clipboard), so those become `\\n`; the rest\n * are dropped.\n */\n\nconst LINE_BREAK_CONTROLS = /[\\u000B\\u000C]/g;\nconst NOT_XML_CHAR = /[\\u0000-\\u0008\\u000E-\\u001F]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?<![\\uD800-\\uDBFF])[\\uDC00-\\uDFFF]/g;\n\nfunction xmlChars(s: string): string {\n return s.replace(LINE_BREAK_CONTROLS, '\\n').replace(NOT_XML_CHAR, '');\n}\n\n/** A parser turns a literal tab or line break in an attribute value into a\n * space, so those are written as character references. */\nexport function escapeAttr(s: string): string {\n return xmlChars(s)\n .replace(/&/g, '&').replace(/\"/g, '"').replace(/</g, '<')\n .replace(/\\t/g, '	').replace(/\\n/g, ' ').replace(/\\r/g, ' ');\n}\n\n/** A literal carriage return in content is read back as a newline. */\nexport function escapeText(s: string): string {\n return xmlChars(s)\n .replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>')\n .replace(/\\r/g, ' ');\n}\n","import { deriveStyle, EMPTY_STYLE, type StyleContext } from './cascade';\n\n/** The cascade as it stands on `el`, walked down from the root. */\nexport function styleAt(el: Element): StyleContext {\n const chain: Element[] = [];\n for (let e: Element | null = el; e; e = e.parentElement) chain.unshift(e);\n return chain.reduce<StyleContext>((style, e) => deriveStyle(style, e), EMPTY_STYLE);\n}\n","/**\n * The one reader for a geometry attribute's length (`x`, `width`, `r`, …).\n *\n * A percentage resolves against the nearest `<svg>` ancestor's viewport, as\n * SVG has it, and an absolute CSS unit (`mm`, `pt`, …) converts at 96 per\n * inch. An `em` or `ex` is of the element's computed font size.\n */\n\nimport { ABSOLUTE_PX } from './absoluteUnits';\nimport { emsPer, fontSizeOf } from './fontSize';\nimport { styleAt } from './styleAt';\n\nconst LENGTH = /^\\s*([-+]?(?:\\d*\\.\\d+|\\d+\\.?)(?:[eE][-+]?\\d+)?)\\s*([a-z%]*)\\s*$/i;\n\n/** Which viewport dimension a percentage is of. `'other'` is a length with no\n * axis, like a radius: SVG's normalized diagonal, `sqrt((w² + h²) / 2)`. */\nexport type LengthAxis = 'x' | 'y' | 'other';\n\nfunction viewportOf(el: Element): { width: number; height: number } | undefined {\n for (let e = el.parentElement; e; e = e.parentElement) {\n if (e.tagName.toLowerCase() !== 'svg') continue;\n const box = (e.getAttribute('viewBox') ?? '').trim().split(/[\\s,]+/).map(Number);\n if (box.length === 4 && box.every(Number.isFinite)) return { width: box[2], height: box[3] };\n const w = LENGTH.exec(e.getAttribute('width') ?? '');\n const h = LENGTH.exec(e.getAttribute('height') ?? '');\n if (w && h && w[2] !== '%' && h[2] !== '%') return { width: userUnits(w), height: userUnits(h) };\n return undefined;\n }\n return undefined;\n}\n\nfunction userUnits(m: RegExpExecArray): number {\n return Number(m[1]) * (ABSOLUTE_PX[m[2].toLowerCase()] ?? 1);\n}\n\nexport function readLength(\n el: Element,\n name: string,\n axis: LengthAxis,\n fallback: number,\n onWarn: (m: string) => void,\n): number {\n return resolveLength(el.getAttribute(name), el, name, axis, fallback, onWarn);\n}\n\n/** {@link readLength} for a value already in hand: one inherited from another\n * element, or a default. `el` is where a percentage is resolved from. */\nexport function resolveLength(\n raw: string | null,\n el: Element,\n name: string,\n axis: LengthAxis,\n fallback: number,\n onWarn: (m: string) => void,\n): number {\n if (raw == null) return fallback;\n const m = LENGTH.exec(raw);\n if (!m) {\n const n = parseFloat(raw);\n return Number.isFinite(n) ? n : fallback;\n }\n const n = Number(m[1]);\n const unit = m[2].toLowerCase();\n if (unit === '') return n;\n const scale = ABSOLUTE_PX[unit];\n if (scale != null) return n * scale;\n const ems = emsPer(unit);\n if (ems != null) return n * ems * fontSizeOf(styleAt(el));\n const tag = el.tagName.toLowerCase();\n if (unit !== '%') {\n onWarn(`<${tag} ${name}=\"${raw}\"> unit \"${unit}\" is not converted; read as ${n}`);\n return n;\n }\n const view = viewportOf(el);\n if (!view) {\n onWarn(`<${tag} ${name}=\"${raw}\"> has no viewport to be a percentage of; read as ${n}`);\n return n;\n }\n const of = axis === 'x' ? view.width\n : axis === 'y' ? view.height\n : Math.sqrt((view.width * view.width + view.height * view.height) / 2);\n return (n / 100) * of;\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 { escapeAttr } from './xmlEscape';\nimport { tileGeometry, type TileShape } from '@weasel-js/core/patterns-builtin';\nimport type { FillStyle, TilePatternSpec } from '@weasel-js/core';\nimport { collectElementsByTag } from './elements';\nimport { applyMatrix, formatMatrix, isIdentity, parseTransform, 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 // A transform carries the origin as its translation, since SVG applies\n // patternTransform to x/y as well; without one, x/y is the plainer form.\n const [a, b, c, d] = paint.transform ?? [1, 0, 0, 1];\n const placement = formatMatrix([a, b, c, d, origin.x, origin.y]);\n if (paint.transform && !isIdentity([a, b, c, d, 0, 0]) && placement) {\n attrs.push(`patternTransform=\"${placement}\"`);\n } else 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=\"${escapeAttr(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=\"${escapeAttr(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=\"${escapeAttr(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=\"${escapeAttr(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 m = parseTransform(el.getAttribute('patternTransform'), onWarn);\n const origin = applyMatrix(m, x, y);\n const paint: PatternFill = { fill: 'pattern', pattern: spec };\n if (origin.x !== 0 || origin.y !== 0) paint.origin = origin;\n if (!isIdentity([m[0], m[1], m[2], m[3], 0, 0])) paint.transform = [m[0], m[1], m[2], m[3]];\n return paint;\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, resolveMarkerSize } from '@weasel-js/core';\nimport type {\n FillStyle, GradStop, GradientUnits, MarkerEntry, MarkerPaint, MarkerRef, Path, ScreenLength,\n} from '@weasel-js/core';\nimport { ownProp, ownValue } from './cascade';\nimport { readProperty } from './properties';\nimport { trimNumber } from './transform';\nimport { escapeAttr } from './xmlEscape';\nimport { resolveLength, type LengthAxis } from './lengths';\nimport { patternXml } from './patterns';\nimport { collectElementsByTag, type ElementTable } from './elements';\nimport { serializePathD } from './path-serializer';\n\n/** Collected gradient definitions, keyed by element id. */\nexport type GradientTable = Map<string, FillStyle>;\n\n/**\n * The namespace weasel's own paint servers are written in, and the prefix they\n * are written under. A conic gradient has no SVG element to target — SVG has\n * `linearGradient` and `radialGradient` and nothing else — so it goes out as a\n * foreign-namespaced def that this package reads back and every other renderer\n * skips in favor of the paint fallback color beside the reference.\n *\n * A registered paint kind's own `toSvg` may use this prefix too: the root\n * declares it whenever any paint in the document lacks a native SVG form.\n */\nexport const WEASEL_NS = 'urn:weasel-js:svg';\nexport const WEASEL_NS_PREFIX = 'wzl';\n\n/** `true` when SVG has a paint server for this kind, so the reference needs no\n * fallback color and the root needs no foreign namespace. */\n/** Whether SVG has its own paint server for paint kind `kind`: solids, the\n * linear and radial gradients, and patterns. Any other kind is written in\n * weasel's namespace with a fallback color, which other renderers paint flat. */\nexport function nativeSvgKind(kind: string): boolean {\n return kind === 'solid' || kind === 'linear-gradient' || kind === 'radial-gradient' || kind === 'pattern';\n}\n\nfunction hasNativeSvgForm(paint: FillStyle): boolean {\n return nativeSvgKind(paint.fill ?? 'solid');\n}\n\n/**\n * The spaces `interpolate` can name, as SVG spells them. SVG's own\n * `color-interpolation` carries `sRGB` and `linearRGB` only, so anything\n * perceptual goes out as a namespaced attribute a foreign renderer ignores —\n * which leaves it interpolating in sRGB. That is a shifted midpoint rather\n * than a lost paint, so these gradients keep their native element and take no\n * fallback color.\n */\nconst INTERPOLATE_SPACES = new Set(['rgb', 'oklab', 'oklch']);\n\n/** Whether a gradient interpolating through `space` blends the same in every\n * SVG renderer — only sRGB, the default. A perceptual space still exports,\n * but renderers other than weasel blend it in sRGB. */\nexport function nativeSvgSpace(space: string | null | undefined): boolean {\n return !space || space === 'rgb';\n}\n\n/** The `wzl:interpolate` attribute a gradient needs, or `''` for the sRGB\n * default every other renderer already assumes. */\nfunction interpolateAttr(space: string | undefined): string {\n if (nativeSvgSpace(space)) return '';\n return ` ${WEASEL_NS_PREFIX}:interpolate=\"${space}\"`;\n}\n\n/** `interpolate` off a gradient element, or `undefined` — for the field's\n * absence and for a space this package does not model alike. */\nfunction readInterpolate(el: Element, elements: ElementTable): 'oklab' | 'oklch' | undefined {\n const raw = inheritedAttr(el, elements, `${WEASEL_NS_PREFIX}:interpolate`)\n ?? el.getAttributeNS(WEASEL_NS, 'interpolate');\n if (raw === 'oklab' || raw === 'oklch') return raw;\n return undefined;\n}\n\n/** Whether any gradient in the document names a space SVG cannot, so the root\n * has to declare the namespace the attribute is written in. */\nfunction usesInterpolateAttr(paint: FillStyle): boolean {\n const space = (paint as { interpolate?: string }).interpolate;\n return !nativeSvgSpace(space) && INTERPOLATE_SPACES.has(space!);\n}\n\n/** The local name of a tag, prefix stripped. */\nfunction localName(tag: string): string {\n const i = tag.indexOf(':');\n return (i < 0 ? tag : tag.slice(i + 1)).toLowerCase();\n}\n\nconst GRADIENT_TAGS = new Set([\n 'lineargradient', 'radialgradient', 'conicgradient', `${WEASEL_NS_PREFIX}:conicgradient`,\n 'meshgradient', `${WEASEL_NS_PREFIX}:meshgradient`,\n]);\n\nconst XLINK_NS = 'http://www.w3.org/1999/xlink';\n\n/** Read every gradient definition in the document, keyed by element id. */\nexport function collectGradients(svg: Element, onWarn?: (m: string) => void): GradientTable {\n const out: GradientTable = new Map();\n const elements = collectElementsByTag(svg, GRADIENT_TAGS);\n for (const [id, el] of elements) {\n const tag = localName(el.tagName);\n const paint = tag === 'lineargradient'\n ? readLinearGradient(el, elements, onWarn)\n : tag === 'conicgradient'\n ? readConicGradient(el, elements, onWarn)\n : tag === 'meshgradient'\n ? readMeshGradient(el, onWarn)\n : readRadialGradient(el, elements, onWarn);\n if (paint) out.set(id, paint);\n }\n warnUnsupportedDefsChildren(svg, onWarn);\n return out;\n}\n\n/** Paint servers, `<marker>`, `<clipPath>` and `<style>` aside, a `<defs>` child is\n * something this package does not model (a `<use>` template, a `<filter>`).\n * Say so once here. */\nfunction warnUnsupportedDefsChildren(svg: Element, onWarn?: (m: string) => void): void {\n if (!onWarn) return;\n const defs = svg.getElementsByTagName('defs');\n for (let d = 0; d < defs.length; d++) {\n const root = defs[d];\n for (let i = 0; i < root.children.length; i++) {\n const child = root.children[i];\n const tag = child.tagName.toLowerCase();\n if (GRADIENT_TAGS.has(tag) || GRADIENT_TAGS.has(localName(tag))) continue;\n if (tag === 'pattern' || tag === 'marker' || tag === 'clippath' || tag === 'style') 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 = ownProp(c, 'stop-color') ?? '#000000';\n const parsed = readProperty('stop-color', colorAttr, onWarn);\n if (parsed) {\n const alpha = (ownValue(c, 'stop-opacity') ?? 1) * 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\n/** What SVG paints with and this model does not hold: a radial gradient's\n * focal point, and any spread but the default `pad`. */\nfunction warnUnmodeled(el: Element, elements: ElementTable, onWarn?: (m: string) => void): void {\n for (const name of ['fx', 'fy', 'fr']) {\n if (inheritedAttr(el, elements, name) != null) {\n onWarn?.(`gradient ${name} is not modeled; the gradient is centered on its cx, cy`);\n break;\n }\n }\n const spread = inheritedAttr(el, elements, 'spreadMethod');\n if (spread === 'reflect' || spread === 'repeat') {\n onWarn?.(`spreadMethod=\"${spread}\" is not modeled; the gradient pads`);\n }\n}\n\n/**\n * One gradient coordinate. In `objectBoundingBox` units a percentage is a\n * fraction of the box and `fraction` is the default; in `userSpaceOnUse` it\n * is a length like any other, of the viewport, and SVG's default is the\n * percentage `fraction` spells.\n */\nfunction coord(\n el: Element, elements: ElementTable, name: string, axis: LengthAxis, fraction: number,\n units: 'bounds' | 'world', onWarn?: (m: string) => void,\n): number {\n const raw = inheritedAttr(el, elements, name);\n if (units === 'bounds') return num(raw, fraction);\n if (raw != null) return resolveLength(raw, el, name, axis, fraction, onWarn ?? (() => {}));\n // A default with no viewport to be a percentage of stays the bare fraction,\n // unreported: the author wrote nothing wrong.\n let unresolved = false;\n const v = resolveLength(`${fraction * 100}%`, el, name, axis, fraction, () => { unresolved = true; });\n return unresolved ? fraction : v;\n}\n\nfunction readLinearGradient(\n el: Element, elements: ElementTable, onWarn?: (m: string) => void,\n): FillStyle | null {\n warnGradientTransform(el, elements, onWarn);\n warnUnmodeled(el, elements, onWarn);\n const units = readGradientUnits(el, elements);\n const at = (name: string, axis: LengthAxis, fraction: number): number =>\n coord(el, elements, name, axis, fraction, units, onWarn);\n return {\n fill: 'linear-gradient',\n from: { x: at('x1', 'x', 0), y: at('y1', 'y', 0) },\n to: { x: at('x2', 'x', 1), y: at('y2', 'y', 0) },\n stops: inheritedStops(el, elements, onWarn),\n units,\n interpolate: readInterpolate(el, elements),\n };\n}\n\nfunction readRadialGradient(\n el: Element, elements: ElementTable, onWarn?: (m: string) => void,\n): FillStyle | null {\n warnGradientTransform(el, elements, onWarn);\n warnUnmodeled(el, elements, onWarn);\n const units = readGradientUnits(el, elements);\n const at = (name: string, axis: LengthAxis, fraction: number): number =>\n coord(el, elements, name, axis, fraction, units, onWarn);\n return {\n fill: 'radial-gradient',\n center: { x: at('cx', 'x', 0.5), y: at('cy', 'y', 0.5) },\n radius: at('r', 'other', 0.5),\n stops: inheritedStops(el, elements, onWarn),\n units,\n interpolate: readInterpolate(el, elements),\n };\n}\n\nfunction readConicGradient(\n el: Element, elements: ElementTable, onWarn?: (m: string) => void,\n): FillStyle | null {\n warnGradientTransform(el, elements, onWarn);\n return {\n fill: 'conic-gradient',\n center: {\n x: num(inheritedAttr(el, elements, 'cx'), 0.5),\n y: num(inheritedAttr(el, elements, 'cy'), 0.5),\n },\n angle: num(inheritedAttr(el, elements, 'angle'), 0),\n stops: inheritedStops(el, elements, onWarn),\n units: readGradientUnits(el, elements),\n interpolate: readInterpolate(el, elements),\n };\n}\n\n/**\n * A `<wzl:meshGradient>` back into the `mesh-gradient` paint core registers.\n *\n * Every patch carries all twelve (or sixteen) of its points, so nothing here\n * infers a shared edge — the trap that makes SVG's own abandoned\n * `<meshgradient>` hard to read correctly. A patch whose attributes do not\n * parse is dropped with a warning rather than guessed at: a mesh missing a\n * patch is visibly wrong, where a mesh holding an invented one is not.\n */\nfunction readMeshGradient(el: Element, onWarn?: (m: string) => void): FillStyle | null {\n const patches: { points: { x: number; y: number }[]; colors: string[] }[] = [];\n for (let i = 0; i < el.children.length; i++) {\n const child = el.children[i];\n if (localName(child.tagName) !== 'patch') continue;\n const points = (child.getAttribute('points') ?? '').trim().split(/\\s+/)\n .filter(Boolean)\n .map((pair) => {\n const [x, y] = pair.split(',').map(Number);\n return { x, y };\n });\n const colors = (child.getAttribute('colors') ?? '').trim().split(/\\s+/).filter(Boolean);\n const sane = (points.length === 12 || points.length === 16)\n && points.every((p) => Number.isFinite(p.x) && Number.isFinite(p.y))\n && colors.length === 4;\n if (!sane) {\n onWarn?.(`<${WEASEL_NS_PREFIX}:patch> with ${points.length} points and ${colors.length} colors — dropped`);\n continue;\n }\n patches.push({ points, colors });\n }\n if (patches.length === 0) return null;\n const space = el.getAttribute('interpolate') ?? el.getAttributeNS(WEASEL_NS, 'interpolate');\n return {\n fill: 'mesh-gradient',\n patches,\n units: el.getAttribute('gradientUnits') === 'objectBoundingBox' ? 'bounds' : 'world',\n ...(space === 'oklab' || space === 'oklch' ? { interpolate: space } : {}),\n } as unknown as FillStyle;\n}\n\n/**\n * Pre-pass that assigns stable serialization ids to the paint servers —\n * gradients and patterns — used by any leaf in the tree. We key on object\n * identity so two leaves sharing the exact same `FillStyle` reference reuse\n * one `<defs>` entry; structurally equal but distinct objects get separate\n * ids.\n */\nexport class PaintServerRegistry {\n private byPaint = new Map<FillStyle, string>();\n private order: FillStyle[] = [];\n private counter = 0;\n\n // Marker defs referenced by any stroke, by `<defs>` id in first-use order.\n // An unsized reference's id is the marker key itself, not a minted counter\n // id: `parseSvg` reads a `marker-end=\"url(#id)\"` fragment back as the marker\n // key directly when the registry knows it, so a synthetic id would come\n // back as a stranger. A sized one gets a def of its own, stamped with its\n // key and size so the parser can read the reference back whole.\n private markers = new Map<string, { key: string; size?: ScreenLength }>();\n\n // Clip paths, in first-use order. Identity, not value: two groups clipped by\n // equal outlines get a def each, which costs bytes and misleads nobody.\n private clips: Path[] = [];\n private clipIds = new Map<Path, string>();\n\n register(paint: FillStyle): string {\n const existing = this.byPaint.get(paint);\n if (existing) return existing;\n const id = paint.fill === 'pattern' ? `pat${this.counter++}` : `grad${this.counter++}`;\n this.byPaint.set(paint, id);\n this.order.push(paint);\n return id;\n }\n\n /**\n * The `fill` / `stroke` attribute value referencing this paint server: a\n * `url(#id)` reference, plus the fallback paint SVG's own grammar allows\n * after one for any kind SVG cannot express. A renderer that cannot resolve\n * the reference takes the fallback instead of dropping the fill, which is\n * the difference between a flat shape and a vanished one.\n */\n ref(paint: FillStyle): string {\n const id = this.register(paint);\n if (hasNativeSvgForm(paint)) return `url(#${id})`;\n return `url(#${id}) ${paintFallback(paint)}`;\n }\n\n /** The paint kind of each registered paint, once, in first-use order. */\n paintKinds(): string[] {\n return [...new Set(this.order.map((paint) => paint.fill ?? 'solid'))];\n }\n\n /** Whether any registered paint serializes outside SVG's own vocabulary, so\n * the root has to declare {@link WEASEL_NS}. */\n usesPrivateNamespace(): boolean {\n return this.order.some((paint) => !hasNativeSvgForm(paint) || usesInterpolateAttr(paint))\n || [...this.markers.values()].some((m) => m.size !== undefined || writesInset(getMarker(m.key)));\n }\n\n /** The `<defs>` id for a marker reference — the key itself when it has no\n * size, else the key suffixed with the size. `undefined` when nothing is\n * registered under the key, so a caller emits no attribute at all rather\n * than a `url(#…)` pointing at a def that will never be written. */\n markerId(ref: MarkerRef): string | undefined {\n const key = typeof ref === 'string' ? ref : ref.key;\n const size = typeof ref === 'string' ? undefined : ref.size;\n if (getMarker(key) === undefined) return undefined;\n const id = size === undefined\n ? key\n : `${key}-s${typeof size === 'number' ? trimNumber(size) : `${trimNumber(size.px)}px`}`;\n if (!this.markers.has(id)) this.markers.set(id, size === undefined ? { key } : { key, size });\n return id;\n }\n\n /** Mint (or recall) the `<defs>` id for a clip outline. */\n clipId(path: Path): string {\n const existing = this.clipIds.get(path);\n if (existing) return existing;\n const id = `clip${this.clips.length}`;\n this.clipIds.set(path, id);\n this.clips.push(path);\n return id;\n }\n\n /** Emit `<defs>...</defs>` XML for every registered paint server, marker\n * and clip path. */\n toDefsXml(onWarn?: (m: string) => void): string {\n if (this.order.length === 0 && this.markers.size === 0 && this.clips.length === 0) {\n return '';\n }\n const parts: string[] = ['<defs>'];\n for (const paint of this.order) {\n parts.push(paintServerXml(this.byPaint.get(paint)!, paint, onWarn));\n }\n for (const [id, { key, size }] of this.markers) {\n const entry = getMarker(key);\n if (!entry) continue;\n if (entry.toSvg) {\n if (size !== undefined) onWarn?.(`marker \"${key}\" writes its own <marker> def, which cannot carry a reference's size; written at its own size`);\n parts.push(entry.toSvg(id, entry));\n } else {\n parts.push(defaultMarkerXml(id, entry, onWarn, key, size));\n }\n }\n for (const path of this.clips) {\n parts.push(\n `<clipPath id=\"${this.clipIds.get(path)!}\">`\n + `<path d=\"${serializePathD(path)}\"/>`\n + '</clipPath>',\n );\n }\n parts.push('</defs>');\n return parts.join('');\n }\n}\n\n/** Whether `entry`'s def carries `wzl:inset`: SVG has no way to say how far\n * a line stops short of its marker, so the parser needs it spelled out. */\nfunction writesInset(entry: MarkerEntry | undefined): boolean {\n return entry !== undefined && !entry.toSvg && (entry.inset ?? 0) !== 0;\n}\n\n/** The `<marker>` def for an entry with no `toSvg` of its own. Unsized, one\n * marker unit is one stroke width, as the kit draws it. A sized reference is\n * drawn in user space at `resolveMarkerSize`'s reading of its size, and\n * records its key and size in the private namespace for the parser. The\n * inset goes there too, in marker units either way. */\nfunction defaultMarkerXml(\n id: string, entry: MarkerEntry, onWarn?: (m: string) => void, key?: string, size?: ScreenLength,\n): string {\n const name = key ?? id;\n const unit = size === undefined ? 1 : resolveMarkerSize({ key: name, size }, 1);\n const path = entry.path({ size: unit, stroke: { paint: { fill: 'solid', color: '#000' } } });\n const d = serializePathD(path);\n const fill = markerPaintAttrs('fill', entry.fill, id, onWarn);\n const outline = entry.outline\n ? ` ${markerPaintAttrs('stroke', entry.outline.paint, id, onWarn)} stroke-width=\"${trimNumber(entry.outline.width * unit)}\"`\n + ' stroke-linecap=\"round\" stroke-linejoin=\"round\"'\n : '';\n // The kit turns every start marker around, which is what SVG 2 spells\n // `auto-start-reverse`; plain `auto` would point a start head into the line.\n const orient = typeof entry.orient === 'number'\n ? trimNumber((entry.orient * 180) / Math.PI)\n : 'auto-start-reverse';\n const units = size === undefined\n ? 'markerUnits=\"strokeWidth\" markerWidth=\"8\" markerHeight=\"8\"'\n : `markerUnits=\"userSpaceOnUse\" markerWidth=\"${trimNumber(8 * unit)}\" markerHeight=\"${trimNumber(8 * unit)}\"`\n + ` ${WEASEL_NS_PREFIX}:key=\"${escapeAttr(name)}\" ${WEASEL_NS_PREFIX}:size=\"${\n typeof size === 'number' ? trimNumber(size) : `${trimNumber(size.px)}px`}\"`;\n const inset = writesInset(entry) ? ` ${WEASEL_NS_PREFIX}:inset=\"${trimNumber(entry.inset!)}\"` : '';\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}\" ${units}${inset}` +\n ` refX=\"0\" refY=\"0\" orient=\"${orient}\" overflow=\"visible\">` +\n `<path d=\"${d}\" ${fill}${outline}/></marker>`\n );\n}\n\n/** A marker paint as `fill` / `stroke` attributes. `'line'` is SVG 2's\n * `context-stroke`; a paint server has no `<defs>` slot from here, so it\n * falls back to the line's paint and says so. */\nfunction markerPaintAttrs(\n attr: 'fill' | 'stroke',\n paint: MarkerPaint | undefined,\n id: string,\n onWarn?: (m: string) => void,\n): string {\n if (paint === 'none') return `${attr}=\"none\"`;\n if (paint === undefined || paint === 'line') return `${attr}=\"context-stroke\"`;\n if ('color' in paint && (paint.fill === undefined || paint.fill === 'solid')) {\n return paint.opacity != null && paint.opacity !== 1\n ? `${attr}=\"${paint.color}\" ${attr}-opacity=\"${trimNumber(paint.opacity)}\"`\n : `${attr}=\"${paint.color}\"`;\n }\n onWarn?.(`marker \"${id}\" ${attr} is a paint server, which a <marker> def cannot reference here; written as the line's paint`);\n return `${attr}=\"context-stroke\"`;\n}\n\n/** One paint server's `<defs>` entry: the built-in mapping, else the kind's\n * own `toSvg`, else nothing plus a warning. The referencing element already\n * carries `fill=\"url(#id)\"`, so a silent omission is a dangling reference and\n * the shape vanishes in a viewer. */\nfunction paintServerXml(id: string, paint: FillStyle, onWarn?: (m: string) => void): string {\n if (paint.fill === 'pattern') return patternXml(id, paint, onWarn);\n const builtin = gradientXml(id, paint);\n if (builtin) return builtin;\n const kind = getPaintKind(paint.fill);\n const custom = kind?.toSvg?.(id, paint);\n if (custom) return custom;\n onWarn?.(kind\n ? `${paint.fill} fill has no vector form — omitted from <defs>`\n : `${paint.fill} fill is not registered — omitted from <defs>; a kind loaded on demand needs \\`await warmSvg(nodes)\\` before a synchronous export`);\n return '';\n}\n\n/** `GradientUnits` → SVG `gradientUnits`. `'screen'` (the kit's default, and\n * a viewport-fixed wash) has no SVG analog at all; it lowers to user space,\n * which at least puts the paint somewhere the geometry is. */\nfunction gradientUnitsAttr(units: GradientUnits | undefined): string {\n return units === 'bounds' ? 'objectBoundingBox' : 'userSpaceOnUse';\n}\n\nfunction gradientXml(id: string, paint: FillStyle): string {\n if (paint.fill === 'linear-gradient') {\n const stops = paint.stops.map(stopXml).join('');\n return (\n `<linearGradient id=\"${id}\" gradientUnits=\"${gradientUnitsAttr(paint.units)}\" ` +\n `x1=\"${trimNumber(paint.from.x)}\" y1=\"${trimNumber(paint.from.y)}\" ` +\n `x2=\"${trimNumber(paint.to.x)}\" y2=\"${trimNumber(paint.to.y)}\"` +\n `${interpolateAttr(paint.interpolate)}>${stops}</linearGradient>`\n );\n }\n if (paint.fill === 'conic-gradient') {\n const stops = paint.stops.map(stopXml).join('');\n const P = WEASEL_NS_PREFIX;\n return (\n `<${P}:conicGradient id=\"${id}\" gradientUnits=\"${gradientUnitsAttr(paint.units)}\" ` +\n `cx=\"${trimNumber(paint.center.x)}\" cy=\"${trimNumber(paint.center.y)}\" ` +\n `angle=\"${trimNumber(paint.angle)}\"` +\n `${interpolateAttr(paint.interpolate)}>${stops}</${P}:conicGradient>`\n );\n }\n if (paint.fill === 'radial-gradient') {\n const stops = paint.stops.map(stopXml).join('');\n return (\n `<radialGradient id=\"${id}\" gradientUnits=\"${gradientUnitsAttr(paint.units)}\" ` +\n `cx=\"${trimNumber(paint.center.x)}\" cy=\"${trimNumber(paint.center.y)}\" ` +\n `r=\"${trimNumber(paint.radius)}\"` +\n `${interpolateAttr(paint.interpolate)}>${stops}</radialGradient>`\n );\n }\n return '';\n}\n\n/**\n * The color a renderer that cannot resolve the reference should paint. `none`\n * when the paint has no single color to name — nothing painted is at least\n * honest, where an invented black is not.\n */\nfunction paintFallback(paint: FillStyle): string {\n const color = getPaintKind(paint.fill)?.colorOf(paint);\n if (!color) return 'none';\n // Whoever reads the fallback is by definition an older renderer, so the\n // packed alpha comes off rather than riding out as an 8-digit hex.\n const packed = /^#([0-9a-f]{6})[0-9a-f]{2}$/i.exec(color);\n return packed ? `#${packed[1].toLowerCase()}` : color;\n}\n\nfunction stopXml(s: GradStop): string {\n // Detect packed-alpha hex (#rrggbbaa) and split out stop-opacity.\n const m = /^#([0-9a-f]{6})([0-9a-f]{2})$/i.exec(s.color);\n if (m) {\n const alpha = parseInt(m[2], 16) / 255;\n return `<stop offset=\"${trimNumber(s.offset)}\" stop-color=\"#${m[1].toLowerCase()}\" stop-opacity=\"${trimNumber(alpha)}\"/>`;\n }\n return `<stop offset=\"${trimNumber(s.offset)}\" stop-color=\"${escapeAttr(s.color)}\"/>`;\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 transformPath,\n type Path,\n} from '@weasel-js/core';\nimport type { Matrix } from './types';\nimport { IDENTITY_MATRIX } from './types';\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/**\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","/** Lowering a basic shape element (`<rect>`, `<path>`, …) to a kit path. */\n\nimport {\n type Path, type PolygonPath, PATH_L, PATH_M, PATH_Z, pathFromD, transformPath,\n} from '@weasel-js/core';\nimport {\n rectElementToPath, circleToPath, ellipseToPath, lineToPath, parsePoints, polylineToPath,\n polygonToPath,\n} from './shapes';\nimport type { Matrix } from './types';\nimport { readLength } from './lengths';\n\n// Every tag set here is compared against a lowercased `tagName`.\n/** Element tags we accept and lower; anything else triggers a warning. */\nexport const SUPPORTED_LEAF_TAGS = new Set([\n 'rect', 'circle', 'ellipse', 'line', 'polyline', 'polygon', 'path',\n]);\n\nexport const IGNORED_TAGS = new Set([\n 'defs', 'lineargradient', 'radialgradient', 'pattern', 'marker', 'clippath',\n 'title', 'desc', 'metadata', 'style',\n]);\n\nexport function lowerLeaf(\n el: Element,\n tag: string,\n m: Matrix,\n onWarn: (msg: string) => void,\n): Path | null {\n const x = (name: string): number => readLength(el, name, 'x', 0, onWarn);\n const y = (name: string): number => readLength(el, name, 'y', 0, onWarn);\n const r = (name: string): number => readLength(el, name, 'other', 0, onWarn);\n if (tag === 'rect') {\n return rectElementToPath(x('x'), y('y'), x('width'), y('height'), x('rx'), y('ry'), m);\n }\n if (tag === 'circle') return circleToPath(x('cx'), y('cy'), r('r'), m);\n if (tag === 'ellipse') return ellipseToPath(x('cx'), y('cy'), x('rx'), y('ry'), m);\n if (tag === 'line') return lineToPath(x('x1'), y('y1'), x('x2'), y('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 * 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 */\nexport function 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","/** `<clipPath>` definitions, and the clip an element's `clip-path` names. */\n\nimport { type Path, transformPath } from '@weasel-js/core';\nimport type { Matrix } from './types';\nimport { parseTransform } from './transform';\nimport { collectElementsByTag } from './elements';\nimport { ownProp } from './cascade';\nimport { readProperty } from './properties';\nimport { SUPPORTED_LEAF_TAGS, lowerLeaf } from './lowerLeaf';\n\n/** Element-id → the outline of a `<clipPath>` def, in the document's own\n * user space. */\nexport type ClipTable = ReadonlyMap<string, Path>;\n\n/**\n * Lower every `<clipPath>` in the document to one outline.\n *\n * SVG unions a `<clipPath>`'s shapes and a `Path` carries a single outline,\n * so only a one-shape def is modeled; the rest warn and clip nothing, which\n * shows the whole group rather than hiding it.\n */\nexport function collectClipPaths(root: Element, onWarn: (m: string) => void): ClipTable {\n const out = new Map<string, Path>();\n for (const [id, el] of collectElementsByTag(root, new Set(['clippath']))) {\n const units = el.getAttribute('clipPathUnits');\n if (units && units !== 'userSpaceOnUse') {\n onWarn(`<clipPath id=\"${id}\"> uses clipPathUnits=\"${units}\", which is not modeled`);\n continue;\n }\n const shapes: Element[] = [];\n for (let i = 0; i < el.children.length; i++) {\n if (SUPPORTED_LEAF_TAGS.has(el.children[i].tagName.toLowerCase())) shapes.push(el.children[i]);\n }\n if (shapes.length !== 1) {\n onWarn(\n `<clipPath id=\"${id}\"> holds ${shapes.length} shapes the kit can lower;`\n + ' only a single-shape clip is modeled, so it clips nothing',\n );\n continue;\n }\n const shape = shapes[0];\n const local = parseTransform(shape.getAttribute('transform'), onWarn);\n const path = lowerLeaf(shape, shape.tagName.toLowerCase(), local, onWarn);\n if (path) out.set(id, path);\n }\n return out;\n}\n\n/** The outline a `clip-path` attribute names, in the element's own user space\n * — the space `ctm` maps into, which is also where its children's geometry\n * lands. */\nexport function clipFor(\n el: Element,\n ctm: Matrix,\n clips: ClipTable,\n onWarn: (m: string) => void,\n): Path | undefined {\n const raw = ownProp(el, 'clip-path');\n if (raw == null) return undefined;\n const ref = readProperty('clip-path', raw);\n if (ref === 'none') return undefined;\n if (!ref) {\n onWarn(`clip-path=\"${raw}\" is not a url(#id) reference; the clip is dropped`);\n return undefined;\n }\n const path = clips.get(ref.id);\n if (!path) {\n onWarn(`clip-path references #${ref.id}, which no <clipPath> in the document defines`);\n return undefined;\n }\n return transformPath(path, ctm);\n}\n","/** Reading an element's fill and stroke off the cascade. */\n\nimport type { SvgPaint, SvgStroke } from './types';\nimport type { FillStyle, Stroke } from '@weasel-js/core';\nimport type { GradientTable } from './gradients';\nimport { ownProp, ownValue, resolveCurrentColor, styleValue, type StyleContext } from './cascade';\nimport { readProperty, type InheritedPropertyName } from './properties';\n\nexport function 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 opacity = styleValue(style, `${attr}-opacity`, onWarn);\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 = readProperty(attr, raw, onWarn);\n if (!parsed) {\n onWarn(`unrecognized ${attr} value: ${raw}`);\n return { kind: 'solid', color: defaultColor };\n }\n // Outside a marker there is no context element, and SVG paints `none`.\n if (parsed.kind === 'none' || parsed.kind === 'context') return { kind: 'none' };\n if (parsed.kind === 'ref') {\n const paint = gradients.get(parsed.id);\n if (!paint) {\n // A fallback color beside the reference is the author saying what to\n // paint when it cannot be resolved, so taking it is the documented\n // behavior rather than a recovery — nothing to warn about.\n if (parsed.fallback) {\n const flat: SvgPaint = { kind: 'solid', color: parsed.fallback.color };\n const a = opacity ?? (parsed.fallback.alpha < 1 ? parsed.fallback.alpha : undefined);\n if (a != null) (flat as { opacity?: number }).opacity = a;\n return flat;\n }\n onWarn(`${attr} references unknown gradient #${parsed.id}`);\n return { kind: 'solid', color: defaultColor };\n }\n return { kind: 'gradient', paint: opacity != null ? { ...paint, opacity } : 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\nexport function readStroke(\n style: StyleContext,\n gradients: GradientTable,\n onWarn: (msg: string) => void,\n nonScaling = false,\n): SvgStroke | undefined {\n const inheritedStroke = style['stroke'] ?? null;\n const inheritedWidth = style['stroke-width'] ?? null;\n if (inheritedStroke == null && inheritedWidth == null) return undefined;\n const paint = readPaint(style, 'stroke', '#000000', gradients, onWarn);\n if (paint.kind === 'none') return undefined;\n const n = styleValue(style, 'stroke-width', onWarn) ?? 1;\n const stroke: SvgStroke = { paint, width: nonScaling ? { px: n } : n };\n const opacity = styleValue(style, 'stroke-opacity', onWarn);\n if (opacity != null) stroke.opacity = opacity;\n const cap = styleValue(style, 'stroke-linecap', onWarn);\n if (cap) stroke.cap = cap;\n const join = styleValue(style, 'stroke-linejoin', onWarn);\n if (join) stroke.join = join;\n const dash = styleValue(style, 'stroke-dasharray', onWarn);\n if (dash) stroke.dash = dash;\n const miterLimit = styleValue(style, 'stroke-miterlimit', onWarn);\n if (miterLimit != null) stroke.miterLimit = miterLimit;\n for (const [attr, field] of [\n ['marker-start', 'markerStart'],\n ['marker-mid', 'markerMid'],\n ['marker-end', 'markerEnd'],\n ] as const) {\n // An id with no registered entry stays as-is for `ingestMarkers`, which\n // reads the document's own `<marker>` once the tree is built.\n const id = styleValue(style, attr, onWarn);\n if (id) stroke[field] = id;\n }\n return stroke;\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: readonly InheritedPropertyName[] = [\n 'stroke', 'stroke-width', 'stroke-opacity', 'stroke-linecap',\n 'stroke-linejoin', 'stroke-dasharray', 'stroke-miterlimit',\n 'marker-start', 'marker-mid', 'marker-end',\n];\n\n/** Whether this element pins its stroke width to rendered pixels.\n *\n * Read off the element rather than the cascade: `vector-effect` is one of the\n * few presentation attributes SVG does not inherit, so a `<g>` carrying it\n * must not hand it to its children. */\nexport function isNonScalingStroke(el: Element): boolean {\n return ownValue(el, 'vector-effect') === 'non-scaling-stroke';\n}\n\nexport function ownStrokeStyle(el: Element, computed: StyleContext): StyleContext {\n const out: Partial<Record<InheritedPropertyName, string>> = {};\n for (const k of STROKE_KEYS) {\n const v = ownProp(el, k);\n if (v != null) out[k] = v === 'inherit' ? v : computed[k];\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 */\nexport function 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 * Carry an axis-aligned box through an affine matrix and back, for the nodes\n * that are a box in a frame of their own (`<text>`, `<image>`) and so cannot\n * have a matrix baked into their geometry the way a path can.\n */\nimport type { Matrix } from './types';\nimport { invert } from '@weasel-js/geom';\nimport { poseFrameOf, poseLinearOf, type PoseLinear } from '@weasel-js/core';\nimport { applyMatrix, decomposeRotation, formatMatrix, isIdentity, trimNumber } from './transform';\n\nexport interface Box {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport interface BoxPlacement extends Box {\n /** Radians, about the placed box's center. */\n rotation: number;\n /** The matrix's uniform scale, `sqrt(|det|)`: what a font size or stroke\n * width inside the box is multiplied by. */\n scale: number;\n flipX: boolean;\n flipY: boolean;\n /** What the matrix holds beyond the box, rotation, and flips, in the\n * `PoseLinear` convention; absent when they hold all of it. */\n transform?: PoseLinear;\n}\n\nconst near = (v: number, target: number): boolean => Math.abs(v - target) <= 1e-9;\n\n/**\n * Split a non-singular `m` into the box it makes of `box`, a rotation, flips,\n * and the residual `transform` that none of them hold.\n *\n * `stretch` says the node can scale its two axes independently and mirror\n * (an image), which leaves only a skew for the residual; without it the box\n * takes the uniform scale alone (text).\n */\nexport function placeBox(box: Box, m: Matrix, stretch: boolean): BoxPlacement {\n const [a, b, c, d] = m;\n const scale = Math.sqrt(Math.abs(a * d - b * c));\n const eps = 1e-4 * Math.hypot(a, b, c, d);\n const uniform = Math.abs(a - d) <= eps;\n if (Math.abs(b) <= eps && Math.abs(c) <= eps && (stretch || (uniform && a > 0))) {\n const p0 = applyMatrix(m, box.x, box.y);\n const p1 = applyMatrix(m, box.x + box.width, box.y + box.height);\n return {\n x: Math.min(p0.x, p1.x),\n y: Math.min(p0.y, p1.y),\n width: Math.abs(p1.x - p0.x),\n height: Math.abs(p1.y - p0.y),\n rotation: 0,\n scale,\n flipX: a < 0,\n flipY: d < 0,\n };\n }\n // Turned back by the x axis's angle, the linear part is `[[p, q], [0, r]]`.\n const p = Math.hypot(a, b);\n const q = (a * c + b * d) / p;\n const r = (a * d - b * c) / p;\n // A scale within the rounding of a written `matrix(...)` is no scale, or a\n // font size would drift a little on every export and import.\n const settle = (v: number): number => (Math.abs(v - 1) <= 1e-5 ? 1 : v);\n const sx = settle(stretch ? p : scale);\n const sy = settle(stretch ? Math.abs(r) : scale);\n const flipY = stretch && r < 0;\n const ry = flipY ? -sy : sy;\n const linear: PoseLinear = [p / sx, 0, q / ry, r / ry];\n const center = applyMatrix(m, box.x + box.width / 2, box.y + box.height / 2);\n const width = box.width * sx;\n const height = box.height * sy;\n const placed: BoxPlacement = {\n x: center.x - width / 2,\n y: center.y - height / 2,\n width,\n height,\n rotation: Math.atan2(b, a),\n scale: settle(scale),\n flipX: false,\n flipY,\n };\n if (!near(linear[0], 1) || !near(linear[2], 0) || !near(linear[3], 1)) placed.transform = linear;\n return placed;\n}\n\n/**\n * Take the box `node` holds in its element's own coordinates through `m`,\n * the element's whole transform (inherited and own): the box moves and\n * scales, a rotation lands on `node.rotation`, and a skew or a scale the\n * box cannot take lands on `node.transform`.\n *\n * Returns the uniform scale the caller owes the lengths inside the box.\n */\nexport function placeNode(\n node: Box & { rotation?: number; flipX?: boolean; flipY?: boolean; transform?: PoseLinear },\n tag: string,\n m: Matrix,\n stretch: boolean,\n onWarn: (m: string) => void,\n): number {\n if (isIdentity(m)) return 1;\n const cx = node.x + node.width / 2;\n const cy = node.y + node.height / 2;\n if (!invert(m)) {\n onWarn(`<${tag}> sits under a singular transform; kept its size`);\n const center = applyMatrix(m, cx, cy);\n node.x = center.x - node.width / 2;\n node.y = center.y - node.height / 2;\n return 1;\n }\n // The form `boxTransformAttr` writes for a rotation: the box stays put, to the last bit.\n const turn = decomposeRotation(m, cx, cy);\n if (turn != null) {\n node.rotation = turn;\n return 1;\n }\n const placed = placeBox(node, m, stretch);\n node.x = placed.x;\n node.y = placed.y;\n node.width = placed.width;\n node.height = placed.height;\n if (Math.abs(placed.rotation) > 1e-9) node.rotation = placed.rotation;\n if (placed.flipX) node.flipX = !node.flipX;\n if (placed.flipY) node.flipY = !node.flipY;\n if (placed.transform) node.transform = placed.transform;\n return placed.scale;\n}\n\n/**\n * The `transform` attribute a text or image node's own frame is written as,\n * or `null` when it has none. A rotation alone is `rotate(deg cx cy)`; with a\n * `transform` it is the whole frame as a `matrix(...)`, which `placeNode`\n * splits back into the same parts.\n */\nexport function boxTransformAttr(\n node: Box & { rotation?: number; transform?: PoseLinear },\n): string | null {\n if (poseLinearOf(node)) {\n const frame = poseFrameOf(node);\n const m = frame && formatMatrix(frame);\n return m ? `transform=\"${m}\"` : null;\n }\n if (!node.rotation) return null;\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 return `transform=\"rotate(${trimNumber(deg)} ${trimNumber(cx)} ${trimNumber(cy)})\"`;\n}\n","/** Reading `<image>`, bare or cropped by a nested `<svg>`. */\n\nimport type { Matrix, SvgImageNode } from './types';\nimport { multiply, parseTransform } from './transform';\nimport { placeNode } from './placeBox';\nimport { readLength } from './lengths';\nimport { ownValue } from './cascade';\nimport { parseViewBoxAttr } from './viewBox';\n\nconst XLINK_NS = 'http://www.w3.org/1999/xlink';\n\nexport function parseImageElement(\n el: Element,\n ctm: Matrix,\n onWarn: (m: string) => void,\n): SvgImageNode | null {\n const href = imageHref(el);\n if (!href) {\n onWarn('<image> without href; dropped');\n return null;\n }\n const node = imageNodeAt(el, el, href, ctm, onWarn);\n if (el.hasAttribute('preserveAspectRatio')\n && el.getAttribute('preserveAspectRatio') !== 'none') {\n onWarn('<image> preserveAspectRatio is not modeled; the box is taken literally');\n }\n return node;\n}\n\nfunction imageHref(el: Element): string | null {\n return el.getAttribute('href')\n ?? el.getAttributeNS(XLINK_NS, 'href')\n ?? el.getAttribute('xlink:href');\n}\n\n/**\n * The image node whose box is `boxEl`'s `x` / `y` / `width` / `height` and\n * whose rotation and opacity are `ownerEl`'s. The two are one element for a\n * plain `<image>`, and the viewport and its wrapping `<g>` for the cropped\n * form `serialize.ts` writes.\n */\nfunction imageNodeAt(\n boxEl: Element,\n ownerEl: Element,\n href: string,\n ctm: Matrix,\n onWarn: (m: string) => void,\n): SvgImageNode {\n const rawX = readLength(boxEl, 'x', 'x', 0, onWarn);\n const rawY = readLength(boxEl, 'y', 'y', 0, onWarn);\n const rawW = readLength(boxEl, 'width', 'x', 0, onWarn);\n const rawH = readLength(boxEl, 'height', 'y', 0, onWarn);\n const node: SvgImageNode = { kind: 'image', href, x: rawX, y: rawY, width: rawW, height: rawH };\n const opacity = ownValue(ownerEl, 'opacity');\n if (opacity != null) node.opacity = opacity;\n const localTransform = parseTransform(ownerEl.getAttribute('transform'), onWarn);\n placeNode(node, 'image', multiply(ctm, localTransform), true, onWarn);\n return node;\n}\n\n/**\n * Read back the cropped image form `serialize.ts` writes for a source rect or\n * a flip: `<g data-weasel-image>` → `<svg viewBox>` → unit-square `<image>`.\n * `null` when the group does not have that shape, so the caller parses it as\n * an ordinary group.\n */\nexport function parseCroppedImage(\n g: Element,\n ctm: Matrix,\n onWarn: (m: string) => void,\n): SvgImageNode | null {\n const viewport = [...g.children].find((c) => c.tagName.toLowerCase() === 'svg');\n const img = viewport && [...viewport.children].find((c) => c.tagName.toLowerCase() === 'image');\n const href = img && imageHref(img);\n const source = viewport && parseViewBoxAttr(viewport.getAttribute('viewBox'));\n if (!img || !href || !source) return null;\n const node = imageNodeAt(viewport, g, href, ctm, onWarn);\n if (source.x !== 0 || source.y !== 0 || source.width !== 1 || source.height !== 1) {\n node.source = source;\n }\n const flip = parseTransform(img.getAttribute('transform'), onWarn);\n // Toggled, not set: the group's own transform may already have mirrored it.\n if (flip[0] < 0) toggle(node, 'flipX');\n if (flip[3] < 0) toggle(node, 'flipY');\n return node;\n}\n\nfunction toggle(node: SvgImageNode, key: 'flipX' | 'flipY'): void {\n if (node[key]) delete node[key];\n else node[key] = true;\n}\n","import { paragraphDirection, resolveAlign, type TextDirection, type TextStyle } from '@weasel-js/core';\n\n/**\n * The direction a text node reads in for SVG, which has no `auto`: the style's\n * own when it states one, otherwise its text's.\n */\nexport function svgDirection(style: TextStyle | undefined, text: string): TextDirection {\n return paragraphDirection(text, style?.direction ?? 'auto');\n}\n\n/**\n * Distance from a text box's left edge to its SVG anchor point: `x` on a\n * `<text>` is where `text-anchor` lands, which is the box's left edge, center\n * or right edge once `align` and the direction resolve to an absolute edge.\n */\nexport function anchorOffset(style: TextStyle | undefined, width: number, text: string): number {\n const edge = resolveAlign(style?.align ?? 'left', svgDirection(style, text));\n return edge === 'center' ? width / 2 : edge === 'right' ? width : 0;\n}\n","/**\n * SVG has no line break: wrapped text is written as one `<tspan>` per line,\n * each sent back to the left edge by its own `x` and down by a `dy` or a new\n * `y`. This reads that shape back into the `\\n` the runs model stores.\n */\nimport type { StyledRun } from '@weasel-js/core';\n\n/** Tracks the `y` the current line was placed at, to tell a tspan that moves\n * down from one that only moves sideways along the same line. */\nexport class LineTracker {\n private y: string | null;\n\n constructor(text: Element) {\n this.y = text.getAttribute('y');\n }\n\n /** Whether `tspan` opens a new line. Call once per tspan, in order. */\n startsLine(tspan: Element): boolean {\n const y = tspan.getAttribute('y');\n const movedY = y != null && y !== this.y;\n if (y != null) this.y = y;\n if (!tspan.hasAttribute('x')) return false;\n const dy = parseFloat(tspan.getAttribute('dy') ?? '');\n return movedY || (Number.isFinite(dy) && dy !== 0);\n }\n}\n\n/** Report the glyph positioning on a `<text>` or `<tspan>` that import does\n * not read: every value after the first in an `x` or `y` list, and any `dx`\n * or `rotate` that is not all zeros. */\nexport function warnUnreadPositions(el: Element, onWarn: (message: string) => void): void {\n const tag = el.tagName.toLowerCase();\n for (const name of ['x', 'y']) {\n const raw = el.getAttribute(name)?.trim() ?? '';\n if (/[\\s,]/.test(raw)) onWarn(`<${tag} ${name}=\"${raw}\"> positions each glyph; only the first value is read`);\n }\n for (const name of ['dx', 'rotate']) {\n const raw = el.getAttribute(name)?.trim() ?? '';\n if (raw.split(/[\\s,]+/).some((v) => parseFloat(v) !== 0 && v !== '')) {\n onWarn(`<${tag} ${name}=\"${raw}\"> is not read; the glyphs keep their own advance and angle`);\n }\n }\n}\n\n/** The lines' runs as one list, each line after the first opening with `\\n`.\n * A line left with no runs still counts: it is a blank line. */\nexport function joinLines(lines: StyledRun[][]): StyledRun[] {\n const out: StyledRun[] = [];\n let breaks = 0;\n for (const line of lines) {\n if (line.length > 0) {\n if (breaks > 0) line[0] = { ...line[0], text: '\\n'.repeat(breaks) + line[0].text };\n out.push(...line);\n breaks = 0;\n }\n if (out.length > 0) breaks++;\n }\n return out;\n}\n","/** Reading `<text>` and its `<tspan>` runs. */\n\nimport type { Matrix, SvgNode, SvgTextNode } from './types';\nimport {\n type StyledRun, type TextStyle, type TextPaint, type FillStyle, layoutRuns, resolveRuns,\n resolveScreenLength, resolveTextStyle,\n} from '@weasel-js/core';\nimport { multiply, parseTransform, isIdentity } from './transform';\nimport { anchorOffset } from './textAnchor';\nimport { placeNode } from './placeBox';\nimport { readLength } from './lengths';\nimport { fontSizeOf } from './fontSize';\nimport { joinLines, LineTracker, warnUnreadPositions } from './tspanLines';\nimport { fillThroughMatrix } from './paintThroughMatrix';\nimport { scaleRuns, scaleStroke, scaleTextStyle } from './metricScale';\nimport type { GradientTable } from './gradients';\nimport {\n deriveStyle, ownProp, ownValue, resolveCurrentColor, styleValue, type StyleContext,\n} from './cascade';\nimport { readProperty } from './properties';\nimport { readStroke, isNonScalingStroke, ownStrokeStyle, coreStroke } from './readPaint';\n\nconst XML_NS = 'http://www.w3.org/XML/1998/namespace';\n\n/**\n * Does `xml:space=\"preserve\"` apply to this element? The attribute inherits,\n * so an ancestor can set it.\n *\n * weasel's own `<text>` output carries it, because the runs model stores real\n * line breaks and SVG's default whitespace handling would collapse them away.\n */\nfunction preservesSpace(el: Element): boolean {\n for (let e: Element | null = el; e; e = e.parentElement) {\n const v = e.getAttributeNS(XML_NS, 'space') ?? e.getAttribute('xml:space');\n if (v === 'preserve') return true;\n if (v === 'default') return false;\n }\n return false;\n}\n\n/**\n * Apply SVG's default whitespace handling to a `<text>` element's runs, in\n * place: newlines dropped, tabs folded to spaces, runs of spaces collapsed to\n * one, and leading / trailing space stripped across the element as a whole.\n *\n * Without this, importing any pretty-printed SVG drags the source file's\n * indentation into the document text — and, because the height estimate\n * counts newlines, reports a one-line label as four lines tall.\n */\nfunction collapseRunWhitespace(runs: StyledRun[]): void {\n let atStart = true;\n let lastWasSpace = false;\n for (const run of runs) {\n let out = '';\n for (const ch of run.text.replace(/\\n/g, '').replace(/[\\t\\r]/g, ' ')) {\n if (ch === ' ') {\n if (atStart || lastWasSpace) continue;\n out += ' ';\n lastWasSpace = true;\n continue;\n }\n out += ch;\n lastWasSpace = false;\n atStart = false;\n }\n run.text = out;\n }\n for (let i = runs.length - 1; i >= 0; i--) {\n if (runs[i].text === '') continue;\n if (runs[i].text.endsWith(' ')) runs[i].text = runs[i].text.slice(0, -1);\n break;\n }\n for (let i = runs.length - 1; i >= 0; i--) {\n if (runs[i].text === '') runs.splice(i, 1);\n }\n}\n\n/** Average glyph advance as a fraction of the em. Sans-serif Latin runs\n * 0.5–0.6; erring wide is the safer miss. */\nconst ESTIMATED_GLYPH_ADVANCE_EM = 0.6;\n\n/**\n * Width of an external `<text>`'s longest line, through the same layout\n * `kit:text` paints with. With no registered font able to measure it, the\n * layout reports nothing, and the width is estimated from the em instead.\n */\nfunction laidOutWidth(runs: readonly StyledRun[], style: TextStyle, plain: string): number {\n const resolved = resolveTextStyle(style);\n const { bounds } = layoutRuns(resolveRuns(runs.length > 0 ? runs : [{ text: plain }], resolved), {\n maxWidth: Infinity,\n lineHeight: resolved.lineHeight,\n align: resolved.align,\n direction: resolved.direction,\n tabSize: resolved.tabSize,\n });\n if (bounds.width > 0) return bounds.width;\n const longest = plain.split('\\n').reduce((max, line) => Math.max(max, line.length), 0);\n return longest * resolved.fontSize * ESTIMATED_GLYPH_ADVANCE_EM;\n}\n\n/** Take a text node built in its element's own coordinates through `m`,\n * along with the lengths and user-space paints inside its box. */\nfunction placeTextNode(node: SvgTextNode, m: Matrix, onWarn: (m: string) => void): void {\n const cx = node.x + node.width / 2;\n const cy = node.y + node.height / 2;\n const scale = placeNode(node, 'text', m, false, onWarn);\n // Where the box's own contents went: the rotation rides `node.rotation`.\n const inBox: Matrix = [\n scale, 0, 0, scale,\n node.x + node.width / 2 - scale * cx, node.y + node.height / 2 - scale * cy,\n ];\n if (isIdentity(inBox)) return;\n if (Math.abs(scale - 1) > 1e-9) {\n node.style = scaleTextStyle(node.style, scale);\n if (node.runs) node.runs = scaleRuns(node.runs, scale);\n if (node.stroke) node.stroke = scaleStroke(node.stroke, scale);\n }\n if (node.fill) node.fill = fillThroughMatrix(node.fill, inBox);\n if (node.stroke?.paint) {\n node.stroke = { ...node.stroke, paint: fillThroughMatrix(node.stroke.paint, inBox) };\n }\n if (node.runs) {\n node.runs = node.runs.map((r) => (r.fill ? { ...r, fill: fillThroughMatrix(r.fill, inBox) } : r));\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 */\nexport function 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 // The box is built in the element's own coordinates and then taken through\n // the whole transform at once, by `placeNode`.\n warnUnreadPositions(el, onWarn);\n const ax = readLength(el, 'x', 'x', 0, onWarn);\n const ay = readLength(el, 'y', 'y', 0, onWarn);\n\n const leafStyle = deriveStyle(style, el);\n const textStyle = readTextStyle(leafStyle, onWarn);\n const textPaint = readTextPaint(leafStyle, gradients, onWarn, isNonScalingStroke(el));\n const fontSize = resolveScreenLength(textStyle.fontSize ?? 16, 1);\n const lineHeight = textStyle.lineHeight ?? 1.2;\n\n const dominantBaseline = el.getAttribute('dominant-baseline');\n const explicitTopAnchor = dominantBaseline === 'text-before-edge'\n || dominantBaseline === 'hanging';\n // If serialized by us, `y` is already the top edge. Otherwise SVG's\n // default is `y` = baseline of the first line — shift up by one\n // line of cap-height so weasel's box top approximates the cap-line.\n const topY = explicitTopAnchor ? ay : ay - fontSize;\n\n // `baseline-shift` is legal and inheritable on <text> itself, and unlike\n // every other run key it has no node-level home to be read into — so a bare\n // text child would drop it. Seed those children with it instead; a <tspan>\n // naming its own still wins, as the SVG cascade says.\n const inheritedShift = ownValue(el, 'baseline-shift', onWarn) ?? {};\n\n // Walk children: text nodes become plain run text; <tspan> elements\n // become StyledRuns with their attribute overrides applied.\n const runLines: StyledRun[][] = [[]];\n const tracker = new LineTracker(el);\n const push = (run: StyledRun): void => { runLines[runLines.length - 1].push(run); };\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 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) push({ text: t, ...inheritedShift });\n continue;\n }\n warnUnreadPositions(sp, onWarn);\n if (tracker.startsLine(sp)) runLines.push([]);\n push(readTspanRun(sp, gradients, leafStyle, onWarn));\n }\n }\n if (!preservesSpace(el)) for (const line of runLines) collapseRunWhitespace(line);\n const runs = joinLines(runLines);\n const plain = runs.map((r) => r.text).join('');\n\n // data-weasel-* attrs win; otherwise the box is what the text lays out to.\n const dataW = num(el.getAttribute('data-weasel-width'), NaN);\n const dataH = num(el.getAttribute('data-weasel-height'), NaN);\n const width = Number.isFinite(dataW) ? dataW : laidOutWidth(runs, textStyle, plain);\n // Newlines in the text drive line count for height estimation.\n const lines = (plain.match(/\\n/g)?.length ?? 0) + 1;\n const height = Number.isFinite(dataH) ? dataH : fontSize * lineHeight * lines;\n\n const opacity = ownValue(el, 'opacity');\n const node: SvgTextNode = {\n kind: 'text',\n x: ax - anchorOffset(textStyle, width, plain),\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 // An absent `direction` is `ltr` in SVG and the text's own in this model, so\n // only text weasel wrote, which says `ltr` when it means it, keeps it absent.\n if (textStyle.direction === undefined && !el.hasAttribute('data-weasel-width')) {\n textStyle.direction = 'ltr';\n }\n if (el.getAttribute('data-weasel-wrap') === 'true') textStyle.wrap = true;\n if (el.getAttribute('data-weasel-align') === 'justify') textStyle.align = 'justify';\n const tabSize = Number(el.getAttribute('data-weasel-tab-size') ?? NaN);\n if (Number.isFinite(tabSize)) textStyle.tabSize = tabSize;\n const va = el.getAttribute('data-weasel-vertical-align');\n if (va === 'center' || va === 'bottom') node.verticalAlign = va;\n if (Object.keys(textStyle).length > 0) node.style = textStyle;\n // `!== undefined`, not `!= null`: `null` is the document saying `fill=\"none\"`.\n if (textPaint.fill !== undefined) node.fill = textPaint.fill;\n if (textPaint.stroke != null) node.stroke = textPaint.stroke;\n if (opacity != null) node.opacity = opacity;\n placeTextNode(node, multiply(ctm, localTransform), onWarn);\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 = ownValue(el, 'font-weight', onWarn);\n // 700 is the bold flag's own spelling; any other weight is the run's.\n if (fw === 'bold' || fw === 'bolder' || fw === 700) run.bold = true;\n else if (fw === 'normal') run.fontWeight = 400;\n else if (typeof fw === 'number') run.fontWeight = fw;\n if (ownValue(el, 'font-style', onWarn) === 'italic') run.italic = true;\n const ff = ownValue(el, 'font-family', onWarn);\n if (ff) run.fontFamily = ff;\n const size = ownValue(el, 'font-size', onWarn);\n if (size?.fontSize != null) run.fontSize = size.fontSize;\n if (size?.fontScale != null) run.fontScale = size.fontScale;\n const tspanStyle = deriveStyle(style, el);\n const ls = ownValue(el, 'letter-spacing', onWarn, fontSizeOf(tspanStyle));\n if (ls != null) run.letterSpacing = ls;\n const shift = ownValue(el, 'baseline-shift', onWarn);\n if (shift?.script != null) run.script = shift.script;\n if (shift?.baselineShift != null) run.baselineShift = shift.baselineShift;\n const decoration = ownValue(el, 'text-decoration', onWarn);\n if (decoration?.underline) run.underline = true;\n if (decoration?.strikethrough) run.strikethrough = true;\n if (decoration?.overline) run.overline = true;\n const transform = ownValue(el, 'text-transform', onWarn);\n if (transform) run.textTransform = transform;\n const variant = ownValue(el, 'font-variant', onWarn);\n if (variant) run.fontVariantCaps = variant;\n const fillAttr = resolveCurrentColor(ownProp(el, 'fill'), tspanStyle);\n if (fillAttr) {\n const parsed = readProperty('fill', fillAttr);\n if (parsed?.kind === 'none') {\n run.fill = null;\n } else if (parsed?.kind === 'solid') {\n run.fill = { fill: 'solid', color: parsed.color };\n } else if (parsed?.kind === 'ref') {\n const paint = gradients.get(parsed.id);\n if (paint) run.fill = paint;\n else if (parsed.fallback) run.fill = { fill: 'solid', color: parsed.fallback.color };\n }\n }\n // Own attributes only — see `ownStrokeStyle`.\n const stroke = coreStroke(readStroke(ownStrokeStyle(el, tspanStyle), gradients, onWarn, isNonScalingStroke(el)));\n if (stroke) run.stroke = stroke;\n return run;\n}\n\nfunction readTextStyle(\n style: StyleContext,\n onWarn: (m: string) => void,\n): TextStyle {\n const out: TextStyle = {};\n const size = styleValue(style, 'font-size', onWarn);\n if (size?.fontSize != null) out.fontSize = size.fontSize;\n const ff = styleValue(style, 'font-family', onWarn);\n if (ff) out.fontFamily = ff;\n const fw = styleValue(style, 'font-weight', onWarn);\n if (fw != null) out.fontWeight = fw;\n const fs = styleValue(style, 'font-style', onWarn);\n if (fs) out.fontStyle = fs;\n const direction = styleValue(style, 'direction');\n if (direction === 'rtl' || direction === 'ltr') out.direction = direction;\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 = styleValue(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 = styleValue(style, 'letter-spacing', onWarn);\n if (ls != null) out.letterSpacing = ls;\n const decoration = styleValue(style, 'text-decoration', onWarn);\n if (decoration?.underline) out.underline = true;\n if (decoration?.strikethrough) out.strikethrough = true;\n if (decoration?.overline) out.overline = true;\n const transform = styleValue(style, 'text-transform', onWarn);\n if (transform && transform !== 'none') out.textTransform = transform;\n const variant = styleValue(style, 'font-variant', onWarn);\n if (variant === 'small-caps') out.fontVariantCaps = variant;\n // Note: `lineHeight` is no longer read from a `data-weasel-line-height`\n // attribute. WeaselDraw carries it through the generic namespace bag\n // as `meta.wd.attrs['line-height']`; svgInterop lifts it into / out of\n // `TextStyle.lineHeight` at the bridge layer. From weasel-svg's POV the\n // value is just an opaque string in `meta`.\n // Edit-overlay-only chrome (`caretColor`, `selectionBackground`,\n // `selectionColor`) is intentionally not persisted — those are UI state,\n // not document content.\n return out;\n}\n\n/** Read a `<text>` element's glyph paint — the node's own fill and stroke,\n * which are not typography and do not live in its `TextStyle`. */\nfunction readTextPaint(\n style: StyleContext,\n gradients: GradientTable,\n onWarn: (m: string) => void,\n nonScalingStroke = false,\n): TextPaint {\n const out: TextPaint = {};\n const fillRaw = resolveCurrentColor(style['fill'] ?? null, style);\n if (fillRaw) {\n const parsed = readProperty('fill', fillRaw);\n if (parsed?.kind === 'solid') {\n out.fill = { fill: 'solid', color: parsed.color } as FillStyle;\n } else if (parsed?.kind === 'ref') {\n const paint = gradients.get(parsed.id);\n if (paint) out.fill = paint;\n else if (parsed.fallback) {\n out.fill = { fill: 'solid', color: parsed.fallback.color } as FillStyle;\n }\n } else if (parsed?.kind === 'none') {\n out.fill = null;\n }\n }\n // Text strokes used to be dropped here with a warning: an SDF glyph is a\n // sampled field, with no geometry to stroke. The outline tier gave large\n // text real contours, so a stroke is now a paint like any other — and one\n // that stays in the document even at sizes that render it unstroked.\n const stroke = coreStroke(readStroke(style, gradients, onWarn, nonScalingStroke));\n if (stroke) out.stroke = stroke;\n return out;\n}\n","/** Ingesting `<marker>` defs the kit has no entry for. */\n\nimport {\n type Path, type PolygonPath, PATH_L, PATH_M, PATH_Z, getMarker, resolveMarkerSize, solid,\n type MarkerEntry, type MarkerPaint,\n} from '@weasel-js/core';\nimport type { Matrix, SvgNode, ScreenLength } from './types';\nimport { multiply, parseTransform } from './transform';\nimport { styleAt } from './styleAt';\nimport { WEASEL_NS, WEASEL_NS_PREFIX, type GradientTable } from './gradients';\nimport { deriveStyle, type StyleContext } from './cascade';\nimport { readProperty } from './properties';\nimport { SUPPORTED_LEAF_TAGS, IGNORED_TAGS, lowerLeaf } from './lowerLeaf';\nimport { parseViewBoxAttr } from './viewBox';\nimport { readPaint } from './readPaint';\n\ntype MarkerRole = 'start' | 'mid' | 'end';\nconst MARKER_FIELDS = [\n ['markerStart', 'start', 'marker-start'],\n ['markerMid', 'mid', 'marker-mid'],\n ['markerEnd', 'end', 'marker-end'],\n] as const;\n\n/**\n * Resolve every marker reference the tree holds that no registered entry\n * answers to, by reading the document's own `<marker>` into a `MarkerEntry`.\n * The reference is rewritten to the entry's key; one the document does not\n * define, or defines with nothing drawable, warns and is dropped.\n *\n * An entry is minted per reference rather than per `<marker>`, because two\n * things SVG decides at the use site are fixed in the kit's entry: a\n * `userSpaceOnUse` marker's size relative to the stroke referencing it, and\n * an `orient=\"auto\"` marker at a start, which the kit always reverses.\n */\nexport function ingestMarkers(\n root: Element,\n nodes: SvgNode[],\n gradients: GradientTable,\n onWarn: (m: string) => void,\n): MarkerEntry[] {\n const defs = new Map<string, Element>();\n const all = root.getElementsByTagName('marker');\n for (let i = 0; i < all.length; i++) {\n const id = all[i].getAttribute('id');\n if (id && !defs.has(id)) defs.set(id, all[i]);\n }\n const minted = new Map<string, MarkerEntry | null>();\n\n const resolve = (\n stroke: { markerStart?: unknown; markerMid?: unknown; markerEnd?: unknown },\n width: ScreenLength | undefined,\n ): void => {\n const w = width === undefined ? 1 : typeof width === 'number' ? width : width.px;\n for (const [field, role, attr] of MARKER_FIELDS) {\n const id = stroke[field];\n if (typeof id !== 'string' || getMarker(id) !== undefined) continue;\n const el = defs.get(id);\n if (!el) {\n onWarn(`${attr} references #${id}, which is neither a kit marker nor defined in the document`);\n delete stroke[field];\n continue;\n }\n const sized = sizedMarkerRef(el);\n if (sized) {\n // An unregistered key comes along as the def's geometry in marker\n // units: the def is drawn in user space at one unit per resolved size.\n if (getMarker(sized.key) === undefined && !minted.has(sized.key)) {\n const entry = markerEntryFrom(el, id, role, resolveMarkerSize(sized, 1), gradients, onWarn);\n minted.set(sized.key, entry && { ...entry, id: sized.key });\n }\n if (minted.get(sized.key) === null) delete stroke[field];\n else stroke[field] = sized;\n continue;\n }\n const cacheKey = `${id}\\u0000${role}\\u0000${w}`;\n if (!minted.has(cacheKey)) minted.set(cacheKey, markerEntryFrom(el, id, role, w, gradients, onWarn));\n const entry = minted.get(cacheKey)!;\n if (entry) stroke[field] = entry.id;\n else delete stroke[field];\n }\n };\n\n const visit = (n: SvgNode): void => {\n if (n.kind === 'group') n.children.forEach(visit);\n else if (n.kind === 'path' && n.stroke) resolve(n.stroke, n.stroke.width);\n else if (n.kind === 'text') {\n if (n.stroke) resolve(n.stroke, n.stroke.width);\n for (const run of n.runs ?? []) {\n if (run.stroke) resolve(run.stroke, run.stroke.width ?? n.stroke?.width);\n }\n }\n };\n nodes.forEach(visit);\n\n const out = new Map<string, MarkerEntry>();\n for (const entry of minted.values()) if (entry) out.set(entry.id, entry);\n return [...out.values()];\n}\n\nfunction weaselAttr(el: Element, name: string): string | null {\n return el.getAttributeNS(WEASEL_NS, name) ?? el.getAttribute(`${WEASEL_NS_PREFIX}:${name}`);\n}\n\n/** The reference a sized-marker def this package wrote stands for: its key\n * and size, read off the private namespace. */\nfunction sizedMarkerRef(el: Element): { key: string; size: ScreenLength } | undefined {\n const key = weaselAttr(el, 'key');\n const raw = weaselAttr(el, 'size')?.trim();\n if (!key || !raw) return undefined;\n const px = raw.endsWith('px');\n const n = parseFloat(px ? raw.slice(0, -2) : raw);\n if (!Number.isFinite(n) || n <= 0) return undefined;\n return { key, size: px ? { px: n } : n };\n}\n\n/** How far a line stops short of the marker, in marker units — written by\n * this package's serializer, and 0 for any other document's marker. */\nfunction markerInsetAttr(el: Element): number {\n const n = parseFloat(weaselAttr(el, 'inset') ?? '');\n return Number.isFinite(n) && n > 0 ? n : 0;\n}\n\n\n/** SVG 2's keyword forms of `refX` / `refY`, else a number. */\nfunction markerRef(raw: string | null, lo: number, span: number): number {\n const v = raw?.trim();\n if (v === 'left' || v === 'top') return lo;\n if (v === 'center') return lo + span / 2;\n if (v === 'right' || v === 'bottom') return lo + span;\n const n = v ? parseFloat(v) : 0;\n return Number.isFinite(n) ? n : 0;\n}\n\n/** `orient` as the kit's `'auto' | radians`, with whether a start reference\n * has to be turned around to match what SVG draws. Absent is SVG's `0`. */\nfunction markerOrient(raw: string | null): { orient: 'auto' | number; reverseAtStart: boolean } {\n const v = raw?.trim() ?? '';\n if (v === 'auto') return { orient: 'auto', reverseAtStart: true };\n if (v === 'auto-start-reverse') return { orient: 'auto', reverseAtStart: false };\n const m = /^(-?[\\d.]+(?:e-?\\d+)?)(deg|rad|grad|turn)?$/i.exec(v);\n if (!m) return { orient: 0, reverseAtStart: false };\n const n = parseFloat(m[1]);\n const unit = (m[2] ?? 'deg').toLowerCase();\n const rad = unit === 'rad' ? n\n : unit === 'grad' ? (n * Math.PI) / 200\n : unit === 'turn' ? n * 2 * Math.PI\n : (n * Math.PI) / 180;\n return { orient: rad, reverseAtStart: false };\n}\n\nfunction markerPaint(\n style: StyleContext,\n attr: 'fill' | 'stroke',\n gradients: GradientTable,\n onWarn: (m: string) => void,\n): MarkerPaint {\n const context = readProperty(attr, style[attr]);\n if (context?.kind === 'context') {\n if (context.of === 'fill') onWarn(`a marker's ${attr}=\"context-fill\" is read as the line's stroke paint`);\n return 'line';\n }\n const paint = readPaint(style, attr, '#000000', gradients, onWarn);\n if (paint.kind === 'none') return 'none';\n if (paint.kind === 'gradient') return paint.paint;\n return paint.opacity != null ? { ...solid(paint.color), opacity: paint.opacity } : solid(paint.color);\n}\n\nfunction asPolygon(path: Path): PolygonPath {\n if (path.kind === 'polygon') return path;\n const { x, y, width: w, height: h } = path as { x: number; y: number; width: number; height: number };\n return {\n kind: 'polygon',\n commands: new Uint8Array([PATH_M, PATH_L, PATH_L, PATH_L, PATH_Z]),\n coords: new Float32Array([x, y, x + w, y, x + w, y + h, x, y + h]),\n fillRule: 'nonzero',\n };\n}\n\n/** FNV-1a, for a key that tells apart two documents' same-named markers. */\nfunction shortHash(s: string): string {\n let h = 0x811c9dc5;\n for (let i = 0; i < s.length; i++) {\n h ^= s.charCodeAt(i);\n h = Math.imul(h, 0x01000193);\n }\n return (h >>> 0).toString(36);\n}\n\n/**\n * One `<marker>` as a `MarkerEntry` for a reference in `role` from a stroke\n * `strokeWidth` wide.\n *\n * The content is mapped into marker units — the viewBox scaled onto\n * `markerWidth` × `markerHeight` under `preserveAspectRatio`, with\n * `refX` / `refY` moved to the origin, which is where the kit anchors every\n * entry. The key is the id plus a hash of what the entry draws, so the same\n * id in two documents never collides in the global registry, and an entry\n * this package exported reads back under the key it went out with.\n *\n * All parts merge into one path painted with the first part's fill and\n * outline, since an entry has one of each. `overflow` clipping is not\n * modeled.\n */\nfunction markerEntryFrom(\n el: Element,\n id: string,\n role: MarkerRole,\n strokeWidth: number,\n gradients: GradientTable,\n onWarn: (m: string) => void,\n): MarkerEntry | null {\n const num = (name: string, fallback: number): number => {\n const n = parseFloat(el.getAttribute(name) ?? '');\n return Number.isFinite(n) ? n : fallback;\n };\n const vb = parseViewBoxAttr(el.getAttribute('viewBox'));\n let sx = 1, sy = 1;\n if (vb && vb.width > 0 && vb.height > 0) {\n sx = num('markerWidth', 3) / vb.width;\n sy = num('markerHeight', 3) / vb.height;\n const par = el.getAttribute('preserveAspectRatio')?.trim() ?? '';\n if (!par.startsWith('none')) {\n const s = par.endsWith('slice') ? Math.max(sx, sy) : Math.min(sx, sy);\n sx = s;\n sy = s;\n }\n }\n const refX = markerRef(el.getAttribute('refX'), vb?.x ?? 0, vb?.width ?? 0);\n const refY = markerRef(el.getAttribute('refY'), vb?.y ?? 0, vb?.height ?? 0);\n // Marker units are stroke widths already, unless the marker is sized in\n // user space; then this reference's width converts it.\n const k = el.getAttribute('markerUnits') === 'userSpaceOnUse' && strokeWidth > 0\n ? 1 / strokeWidth\n : 1;\n const { orient, reverseAtStart } = markerOrient(el.getAttribute('orient'));\n const turn = role === 'start' && reverseAtStart ? -1 : 1;\n const base: Matrix = [turn * sx * k, 0, 0, turn * sy * k, -turn * sx * k * refX, -turn * sy * k * refY];\n\n const parts: { path: PolygonPath; style: StyleContext }[] = [];\n const collect = (parent: Element, m: Matrix, style: StyleContext): void => {\n for (let i = 0; i < parent.children.length; i++) {\n const child = parent.children[i];\n const tag = child.tagName.toLowerCase();\n const cm = multiply(m, parseTransform(child.getAttribute('transform'), onWarn));\n const cs = deriveStyle(style, child);\n if (tag === 'g') collect(child, cm, cs);\n else if (SUPPORTED_LEAF_TAGS.has(tag)) {\n const path = lowerLeaf(child, tag, cm, onWarn);\n if (path) parts.push({ path: asPolygon(path), style: cs });\n } else if (!IGNORED_TAGS.has(tag)) {\n onWarn(`<marker id=\"${id}\"> child <${child.tagName}> is not supported; skipped`);\n }\n }\n };\n // The content inherits from the marker's own ancestors, never from the\n // element that references it.\n collect(el, base, styleAt(el));\n if (parts.length === 0) {\n onWarn(`<marker id=\"${id}\"> draws nothing this kit can read; dropped`);\n return null;\n }\n\n const first = parts[0].style;\n const fill = markerPaint(first, 'fill', gradients, onWarn);\n const outlinePaint = markerPaint(first, 'stroke', gradients, onWarn);\n const outlineWidth = parseFloat(first['stroke-width'] ?? '1') * Math.sqrt(sx * sy) * k;\n const outline = outlinePaint !== 'none' && outlineWidth > 0\n ? { width: outlineWidth, paint: outlinePaint }\n : false;\n if (parts.some((p) => JSON.stringify(p.style) !== JSON.stringify(first))) {\n onWarn(`<marker id=\"${id}\"> paints its parts differently; all take the first part's paint`);\n }\n\n let commandCount = 0, coordCount = 0;\n for (const p of parts) { commandCount += p.path.commands.length; coordCount += p.path.coords.length; }\n const commands = new Uint8Array(commandCount);\n const coords = new Float32Array(coordCount);\n let ci = 0, pi = 0;\n for (const p of parts) {\n commands.set(p.path.commands, ci); ci += p.path.commands.length;\n coords.set(p.path.coords, pi); pi += p.path.coords.length;\n }\n const fillRule = parts[0].path.fillRule ?? 'nonzero';\n\n const inset = markerInsetAttr(el);\n const round = (v: number): number => Math.round(v * 1e4) / 1e4 + 0;\n const hash = shortHash(JSON.stringify([\n Array.from(commands), Array.from(coords, round), fillRule, fill, outline,\n typeof orient === 'number' ? round(orient) : orient,\n ...(inset !== 0 ? [round(inset)] : []),\n ]));\n const key = id.endsWith(`-${hash}`) ? id : `${id}-${hash}`;\n\n return {\n id: key,\n reads: [],\n path: ({ size }) => {\n const scaled = new Float32Array(coords.length);\n for (let i = 0; i < coords.length; i++) scaled[i] = coords[i] * size;\n return { kind: 'polygon', commands, coords: scaled, fillRule };\n },\n fill,\n outline,\n orient,\n inset,\n };\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 {\n type Matrix, type NamespaceMeta, type NamespacedElement, type ParseOptions, type ParseResult,\n type SvgNode, type SvgPathNode, IDENTITY_MATRIX,\n} from './types';\nimport {\n multiply, parseTransform, decomposeRotation, rebaseTransform, rotationComponent, isIdentity,\n} from './transform';\nimport { boundsOfPath, transformPath } from '@weasel-js/core';\nimport { ABSOLUTE_PX } from './absoluteUnits';\nimport { emsPer, fontSizeOf } from './fontSize';\nimport { isNonUniform, paintThroughMatrix, strokeThroughMatrix } from './paintThroughMatrix';\nimport { collectGradients, type GradientTable } from './gradients';\nimport { collectPatterns } from './patterns';\nimport {\n bindStylesheets, deriveStyle, EMPTY_STYLE, ownProp, ownValue, styleValue, type StyleContext,\n} from './cascade';\nimport { mediaEnvironmentFor } from './media';\nimport { readProperty } from './properties';\nimport { SUPPORTED_LEAF_TAGS, IGNORED_TAGS, lowerLeaf } from './lowerLeaf';\nimport { parseViewBoxAttr } from './viewBox';\nimport { type ClipTable, collectClipPaths, clipFor } from './readClips';\nimport { readPaint, readStroke, isNonScalingStroke } from './readPaint';\nimport { parseImageElement, parseCroppedImage } from './readImage';\nimport { parseTextElement } from './readText';\nimport { ingestMarkers } from './readMarkers';\n\nconst SUPPORTED_GROUP_TAGS = new Set(['g', 'svg']);\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 bindStylesheets(doc, mediaEnvironmentFor(root, opts.media), onWarn);\n\n const namespaces = opts.namespaces ?? {};\n // Build a URI → prefix index for fast lookup during traversal.\n const uriToPrefix = new Map<string, string>();\n for (const [prefix, uri] of Object.entries(namespaces)) {\n uriToPrefix.set(uri, prefix);\n }\n\n const documentMeta = collectDocumentMeta(root, uriToPrefix);\n\n // Both paint-server kinds resolve through one `url(#id)` table, so a\n // patterned fill needs no separate lookup path at every use site.\n const gradients = collectGradients(root, onWarn);\n for (const [id, paint] of collectPatterns(root, onWarn)) gradients.set(id, paint);\n const rootStyle = deriveStyle(EMPTY_STYLE, root);\n const clips = collectClipPaths(root, onWarn);\n const nodes = parseChildren(root, IDENTITY_MATRIX, rootStyle, gradients, clips, onWarn, uriToPrefix);\n const markers = ingestMarkers(root, nodes, gradients, onWarn);\n\n const result: ParseResult = { nodes, warnings };\n if (markers.length > 0) result.markers = markers;\n if (documentMeta) result.documentMeta = documentMeta;\n const viewBox = parseViewBoxAttr(root.getAttribute('viewBox'));\n if (viewBox) result.viewBox = viewBox;\n const width = parseRootLength(root.getAttribute('width'), 'width', fontSizeOf(rootStyle), onWarn);\n if (width != null) result.width = width;\n const height = parseRootLength(root.getAttribute('height'), 'height', fontSizeOf(rootStyle), 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 * Root `width` / `height` in user units, an absolute CSS unit converted at 96\n * per inch and an `em` or `ex` by the root's `fontSize`. A percentage is not\n * converted — there is no viewport to resolve it against — so the number is\n * taken as-is and the discarded unit is reported.\n */\nfunction parseRootLength(\n raw: string | null, name: string, fontSize: number, 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*\\.\\d+|\\d+\\.?)(?:[eE][-+]?\\d+)?\\s*([a-z%]+)\\s*$/i.exec(raw)?.[1];\n const scale = unit && ABSOLUTE_PX[unit.toLowerCase()];\n if (scale) return n * scale;\n const ems = unit && emsPer(unit);\n if (ems) return n * ems * fontSize;\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 clips: ClipTable,\n onWarn: (m: string) => void,\n uriToPrefix: Map<string, string>,\n): SvgNode[] {\n const out: SvgNode[] = [];\n for (let i = 0; i < parent.children.length; i++) {\n const el = parent.children[i];\n // Skip namespaced children — they belong to `meta.elements`, not nodes.\n // (DOM gives SVG-native elements `http://www.w3.org/2000/svg`.)\n const ns = el.namespaceURI;\n if (ns && ns !== 'http://www.w3.org/2000/svg') continue;\n const node = parseElement(el, ctm, style, gradients, clips, onWarn, uriToPrefix);\n if (node) {\n if (Array.isArray(node)) out.push(...node);\n else out.push(node);\n }\n }\n return out;\n}\n\nfunction parseElement(\n el: Element,\n ctm: Matrix,\n style: StyleContext,\n gradients: GradientTable,\n clips: ClipTable,\n onWarn: (m: string) => void,\n uriToPrefix: Map<string, string>,\n): SvgNode | SvgNode[] | null {\n const tag = el.tagName.toLowerCase();\n if (IGNORED_TAGS.has(tag)) return null;\n if (ownValue(el, 'display') === 'none') return null;\n // Inherited, and a descendant may turn itself back on, so only a leaf can\n // answer it: a hidden `<g>` still has to be walked.\n const containers = tag === 'g' || SUPPORTED_GROUP_TAGS.has(tag);\n if (!containers && isHidden(deriveStyle(style, el))) return null;\n if (tag === 'g' && el.hasAttribute('data-weasel-image')) {\n const image = parseCroppedImage(el, ctm, onWarn);\n if (image) {\n const meta = collectElementMeta(el, uriToPrefix);\n if (meta) image.meta = meta;\n return image;\n }\n }\n const clipRaw = tag === 'g' ? null : ownProp(el, 'clip-path');\n if (clipRaw != null && readProperty('clip-path', clipRaw) !== 'none') {\n onWarn(`clip-path on <${tag}> is not modeled; only a <g> clips, so it is drawn unclipped`);\n }\n if (tag === 'g') {\n const local = parseTransform(el.getAttribute('transform'), onWarn);\n const childCtm = multiply(ctm, local);\n const childStyle = deriveStyle(style, el);\n const children = parseChildren(el, childCtm, childStyle, gradients, clips, onWarn, uriToPrefix);\n const opacity = ownValue(el, 'opacity');\n const group: SvgNode = { kind: 'group', children };\n const clip = clipFor(el, childCtm, clips, onWarn);\n if (clip) group.clip = clip;\n if (opacity != null) group.opacity = opacity;\n const meta = collectElementMeta(el, uriToPrefix);\n if (meta) group.meta = meta;\n return group;\n }\n if (SUPPORTED_GROUP_TAGS.has(tag)) {\n // Nested <svg> — a transparent group that establishes a viewport at\n // (x, y). Inheritance flows through it; clipping does not exist here.\n const childStyle = deriveStyle(style, el);\n const x = parseFloat(el.getAttribute('x') ?? '0');\n const y = parseFloat(el.getAttribute('y') ?? '0');\n const offset: Matrix = [1, 0, 0, 1, Number.isFinite(x) ? x : 0, Number.isFinite(y) ? y : 0];\n if (el.hasAttribute('viewBox')) {\n onWarn('nested <svg> viewBox is not modeled; its children are not rescaled');\n }\n return parseChildren(el, multiply(ctm, offset), childStyle, gradients, clips, onWarn, uriToPrefix);\n }\n if (tag === 'text') {\n const textNode = parseTextElement(el, ctm, style, gradients, onWarn);\n if (textNode && !Array.isArray(textNode) && textNode.kind === 'text') {\n const meta = collectElementMeta(el, uriToPrefix);\n if (meta) textNode.meta = meta;\n }\n return textNode;\n }\n if (tag === 'image') {\n const imageNode = parseImageElement(el, ctm, onWarn);\n if (imageNode) {\n const meta = collectElementMeta(el, uriToPrefix);\n if (meta) imageNode.meta = meta;\n }\n return imageNode;\n }\n if (!SUPPORTED_LEAF_TAGS.has(tag)) {\n onWarn(`unsupported element: <${el.tagName}>`);\n return null;\n }\n const localTransform = parseTransform(el.getAttribute('transform'), onWarn);\n // First, lower the leaf into its UNROTATED form (using just the inherited\n // CTM). Then try to extract the LEAF's local transform as a pure rotation\n // about the leaf's AABB center. When that succeeds, store the angle on\n // node.rotation. When it fails AND the leaf transform is non-identity,\n // fall back to baking the full composed matrix into geometry (legacy\n // behavior) and warn if a rotation is present that we are about to lose.\n let path = lowerLeaf(el, tag, ctm, onWarn);\n if (!path) return null;\n let rotation: number | undefined;\n let baked = ctm;\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 = boundsOfPath(path);\n const cx = bounds.x + bounds.width / 2;\n const cy = bounds.y + bounds.height / 2;\n const angle = worldLocal && decomposeRotation(worldLocal, cx, cy);\n if (!worldLocal) {\n onWarn('leaf transform sits under a singular parent transform; dropped');\n } else if (angle != null) {\n rotation = angle;\n } else {\n // Bake the matrix in — match legacy behavior.\n path = transformPath(path, worldLocal);\n baked = multiply(ctm, localTransform);\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 = paintThroughMatrix(readPaint(leafStyle, 'fill', '#000000', gradients, onWarn), baked);\n const ownStroke = readStroke(leafStyle, gradients, onWarn, isNonScalingStroke(el));\n const stroke = ownStroke && strokeThroughMatrix(ownStroke, baked);\n if (stroke && typeof stroke.width === 'number' && isNonUniform(baked)) {\n onWarn(`<${tag}> stroke sits under a skew or non-uniform scale; its width takes the uniform part only`);\n }\n const opacity = ownValue(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 if (styleValue(leafStyle, 'fill-rule') === '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 isHidden(style: StyleContext): boolean {\n const v = styleValue(style, 'visibility');\n return v === 'hidden' || v === 'collapse';\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 { escapeAttr, escapeText } from './xmlEscape';\nimport type { FontRequest, Path, Stroke, StrokeAlign } from '@weasel-js/core';\nimport {\n boundsOfPath, poseFrameOf, resolveRunFace, resolveScreenLength, resolveTextStyle, scriptMetricsFor,\n} from '@weasel-js/core';\nimport type {\n Matrix, NamespaceMeta, NamespacedElement, SerializeOptions, SvgGroupNode,\n SvgNode, SvgPaint, SvgPathNode, SvgStroke, SvgTextNode, SvgImageNode,\n ScreenLength,\n} from './types';\nimport { IDENTITY_MATRIX } from './types';\nimport { serializePathD } from './path-serializer';\nimport { formatMatrix, multiply, trimNumber } from './transform';\nimport { PaintServerRegistry, WEASEL_NS, WEASEL_NS_PREFIX } from './gradients';\nimport { anchorOffset, svgDirection } from './textAnchor';\nimport { boxTransformAttr } from './placeBox';\n\n/**\n * Walk the tree and produce an SVG document string. The root `<svg>`'s\n * `viewBox` is taken from `opts.viewBox` if supplied, otherwise computed\n * as a tight bounding box around every leaf.\n */\nexport function serializeSvg(nodes: SvgNode[], opts: SerializeOptions = {}): string {\n const registry = new PaintServerRegistry();\n registerPaintServers(nodes, registry);\n\n const bounds = opts.viewBox ?? computeBounds(nodes);\n const vb = `${trimNumber(bounds.x)} ${trimNumber(bounds.y)} ${trimNumber(bounds.width)} ${trimNumber(bounds.height)}`;\n const namespaces = opts.namespaces ?? {};\n\n const rootAttrs: string[] = [`xmlns=\"http://www.w3.org/2000/svg\"`];\n // Declared before the caller's namespaces and only when something needs it,\n // so a document of ordinary paints carries no trace of it. The paint pre-pass\n // above has already seen every paint, so this answer is final.\n if (registry.usesPrivateNamespace() && namespaces[WEASEL_NS_PREFIX] == null) {\n rootAttrs.push(`xmlns:${WEASEL_NS_PREFIX}=\"${WEASEL_NS}\"`);\n }\n for (const [prefix, uri] of Object.entries(namespaces)) {\n rootAttrs.push(`xmlns:${prefix}=\"${escapeAttr(uri)}\"`);\n }\n rootAttrs.push(`viewBox=\"${vb}\"`);\n if (opts.width != null) rootAttrs.push(`width=\"${trimNumber(opts.width)}\"`);\n if (opts.height != null) rootAttrs.push(`height=\"${trimNumber(opts.height)}\"`);\n // documentMeta attrs onto the root, in declared-namespace order.\n if (opts.documentMeta) {\n for (const prefix of Object.keys(namespaces)) {\n const bucket = opts.documentMeta[prefix];\n if (!bucket?.attrs) continue;\n for (const [name, value] of Object.entries(bucket.attrs)) {\n rootAttrs.push(`${prefix}:${name}=\"${escapeAttr(value)}\"`);\n }\n }\n }\n\n // documentMeta elements after <defs>, before geometry body.\n let docMetaXml = '';\n if (opts.documentMeta) {\n for (const prefix of Object.keys(namespaces)) {\n const bucket = opts.documentMeta[prefix];\n if (!bucket?.elements) continue;\n for (const [localName, list] of Object.entries(bucket.elements)) {\n for (const el of list) docMetaXml += namespacedElementXml(prefix, localName, el);\n }\n }\n }\n\n const defsXml = registry.toDefsXml(opts.onWarn);\n // Once per message: a hundred inner-aligned strokes are one fact.\n const said = new Set<string>();\n const warn: Warn = (m) => {\n if (!opts.onWarn || said.has(m)) return;\n said.add(m);\n opts.onWarn(m);\n };\n const bodyXml = nodes.map((n) => nodeXml(n, registry, namespaces, warn)).join('');\n\n // `<title>` goes immediately inside `<svg>` per SVG-spec convention; it's\n // an accessibility hook and (for our purposes) a stable place to round-trip\n // the user-visible document title.\n const titleXml = opts.title && opts.title.length > 0\n ? `<title>${escapeText(opts.title)}</title>`\n : '';\n\n return `<svg ${rootAttrs.join(' ')}>${titleXml}${defsXml}${docMetaXml}${bodyXml}</svg>`;\n}\n\nfunction namespacedElementXml(prefix: string, localName: string, el: NamespacedElement): string {\n const attrs: string[] = [];\n for (const [name, value] of Object.entries(el.attrs)) {\n attrs.push(`${name}=\"${escapeAttr(value)}\"`);\n }\n const head = attrs.length > 0 ? `<${prefix}:${localName} ${attrs.join(' ')}>` : `<${prefix}:${localName}>`;\n let body = '';\n if (el.children) {\n for (const [childName, list] of Object.entries(el.children)) {\n for (const child of list) body += namespacedElementXml(prefix, childName, child);\n }\n } else if (el.text != null) {\n body = escapeText(el.text);\n }\n return `${head}${body}</${prefix}:${localName}>`;\n}\n\nfunction metaAttrsXml(meta: NamespaceMeta | undefined, namespaces: Record<string, string>): string {\n if (!meta) return '';\n const parts: string[] = [];\n for (const prefix of Object.keys(namespaces)) {\n const bucket = meta[prefix];\n if (!bucket?.attrs) continue;\n for (const [name, value] of Object.entries(bucket.attrs)) {\n parts.push(`${prefix}:${name}=\"${escapeAttr(value)}\"`);\n }\n }\n return parts.length > 0 ? ` ${parts.join(' ')}` : '';\n}\n\nfunction metaElementsXml(meta: NamespaceMeta | undefined, namespaces: Record<string, string>): string {\n if (!meta) return '';\n let out = '';\n for (const prefix of Object.keys(namespaces)) {\n const bucket = meta[prefix];\n if (!bucket?.elements) continue;\n for (const [localName, list] of Object.entries(bucket.elements)) {\n for (const el of list) out += namespacedElementXml(prefix, localName, el);\n }\n }\n return out;\n}\n\nexport function registerPaintServers(nodes: readonly SvgNode[], registry: PaintServerRegistry): void {\n for (const n of nodes) {\n if (n.kind === 'group') {\n if (n.clip) registry.clipId(n.clip);\n registerPaintServers(n.children, registry);\n } else if (n.kind === 'path') {\n if (n.fill.kind === 'gradient') registry.register(n.fill.paint);\n if (n.stroke && n.stroke.paint.kind === 'gradient') registry.register(n.stroke.paint.paint);\n registerMarkers(n.stroke, registry);\n } else if (n.kind === 'text') {\n // Text paints flow through `style` / `runs` rather than a top-level\n // SvgPaint, so register direct FillStyle references when present. This\n // pre-pass is load-bearing: `<defs>` is emitted before the body, so a\n // paint first seen while writing an element would be referenced by an\n // id that no definition backs.\n registerTextPaint(n.fill, registry);\n registerTextPaint(n.stroke?.paint, registry);\n registerMarkers(n.stroke, registry);\n for (const run of n.runs ?? []) {\n registerTextPaint(run.fill, registry);\n registerTextPaint(run.stroke?.paint, registry);\n }\n }\n }\n}\n\n/** Register one text paint if it is a paint server rather than a colour. */\nfunction registerTextPaint(\n paint: import('@weasel-js/core').FillStyle | null | undefined,\n registry: PaintServerRegistry,\n): void {\n if (paint && !('color' in paint)) registry.register(paint);\n}\n\n/** 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(stroke: Pick<Stroke, 'markerStart' | 'markerMid' | 'markerEnd'> | undefined, registry: PaintServerRegistry): void {\n if (!stroke) return;\n for (const ref of [stroke.markerStart, stroke.markerMid, stroke.markerEnd]) {\n if (ref !== undefined) registry.markerId(ref);\n }\n}\n\ntype Warn = (message: string) => void;\n\nfunction nodeXml(\n node: SvgNode, registry: PaintServerRegistry, namespaces: Record<string, string>, warn: Warn,\n): string {\n if (node.kind === 'group') return groupXml(node, registry, namespaces, warn);\n if (node.kind === 'text') return textXml(node, registry, namespaces, warn);\n if (node.kind === 'image') return imageXml(node, namespaces);\n return pathXml(node, registry, namespaces, warn);\n}\n\n/** SVG 1.1 has no stroke alignment; SVG 2's `stroke-alignment` never shipped\n * in a browser. */\nfunction warnStrokeAlign(align: StrokeAlign | undefined, warn: Warn): void {\n if (align && align !== 'center') {\n warn(`a stroke aligned \"${align}\" of its edge is written centered: SVG has no stroke alignment`);\n }\n}\n\n/**\n * Emit an `<image>`. `preserveAspectRatio=\"none\"` is unconditional: the node\n * carries a literal box and nothing else, so letting a viewer letterbox it\n * would place the pixels somewhere the model never said.\n *\n * A source rect or a flip takes the cropped form described on `SvgImageNode`.\n * The nested `<svg>` cannot carry the rotation itself — SVG 1.1 gives it no\n * `transform` — so the rotation, opacity and meta go on the wrapping `<g>`.\n */\nfunction imageXml(node: SvgImageNode, namespaces: Record<string, string>): string {\n const box = `x=\"${trimNumber(node.x)}\" y=\"${trimNumber(node.y)}\"`\n + ` width=\"${trimNumber(node.width)}\" height=\"${trimNumber(node.height)}\"`;\n const outer: string[] = [];\n if (node.opacity != null && node.opacity !== 1) {\n outer.push(`opacity=\"${trimNumber(node.opacity)}\"`);\n }\n const frame = boxTransformAttr(node);\n if (frame) outer.push(frame);\n const metaAttrs = metaAttrsXml(node.meta, namespaces);\n const metaEls = metaElementsXml(node.meta, namespaces);\n const href = `href=\"${escapeAttr(node.href)}\"`;\n\n if (!node.source && !node.flipX && !node.flipY) {\n const attrs = [href, box, 'preserveAspectRatio=\"none\"', ...outer].join(' ');\n if (metaEls) return `<image ${attrs}${metaAttrs}>${metaEls}</image>`;\n return `<image ${attrs}${metaAttrs}/>`;\n }\n\n const src = node.source ?? { x: 0, y: 0, width: 1, height: 1 };\n const viewBox = [src.x, src.y, src.width, src.height].map(trimNumber).join(' ');\n // A mirror about the source window's center, so the flipped image still\n // fills exactly the window the viewport shows.\n const flip = node.flipX || node.flipY\n ? ` transform=\"matrix(${node.flipX ? -1 : 1} 0 0 ${node.flipY ? -1 : 1}`\n + ` ${trimNumber(node.flipX ? 2 * src.x + src.width : 0)}`\n + ` ${trimNumber(node.flipY ? 2 * src.y + src.height : 0)})\"`\n : '';\n const head = ['<g data-weasel-image=\"true\"', ...outer].join(' ');\n return `${head}${metaAttrs}>`\n + `<svg ${box} viewBox=\"${viewBox}\" preserveAspectRatio=\"none\">`\n + `<image ${href} x=\"0\" y=\"0\" width=\"1\" height=\"1\" preserveAspectRatio=\"none\"${flip}/>`\n + `</svg>${metaEls}</g>`;\n}\n\nfunction groupXml(\n node: SvgGroupNode, registry: PaintServerRegistry, namespaces: Record<string, string>, warn: Warn,\n): string {\n const attrs: string[] = [];\n if (node.transform) {\n const m = formatMatrix(node.transform);\n if (m) attrs.push(`transform=\"${m}\"`);\n }\n if (node.clip) {\n attrs.push(`clip-path=\"url(#${registry.clipId(node.clip)})\"`);\n }\n if (node.opacity != null && node.opacity !== 1) {\n attrs.push(`opacity=\"${trimNumber(node.opacity)}\"`);\n }\n const metaAttrs = metaAttrsXml(node.meta, namespaces);\n // `metaAttrs` already starts with a leading space (or is empty), so we\n // can splice it after the existing attr list without extra logic.\n const head = attrs.length > 0\n ? `<g ${attrs.join(' ')}${metaAttrs}>`\n : `<g${metaAttrs}>`;\n const body = node.children.map((c) => nodeXml(c, registry, namespaces, warn)).join('');\n return `${head}${body}${metaElementsXml(node.meta, namespaces)}</g>`;\n}\n\nfunction pathXml(\n node: SvgPathNode, registry: PaintServerRegistry, namespaces: Record<string, string>, warn: Warn,\n): string {\n const attrs: string[] = [`d=\"${serializePathD(node.path)}\"`];\n const fillAttrs = paintAttrs(node.fill, 'fill', registry);\n for (const a of fillAttrs) attrs.push(a);\n // Emit fill-rule only when it diverges from SVG's default ('nonzero').\n // RectPath has no fillRule field — only PolygonPath carries one.\n if (node.path.kind === 'polygon' && node.path.fillRule === 'evenodd') {\n attrs.push(`fill-rule=\"evenodd\"`);\n }\n if (node.stroke) {\n const strokeAttrs = strokeAttrsFor(node.stroke, registry, warn);\n for (const a of strokeAttrs) attrs.push(a);\n } else {\n attrs.push('stroke=\"none\"');\n }\n if (node.opacity != null && node.opacity !== 1) {\n attrs.push(`opacity=\"${trimNumber(node.opacity)}\"`);\n }\n if (node.rotation != null && node.rotation !== 0) {\n const b = pathBounds(node.path);\n const cx = b.minX + (b.maxX - b.minX) / 2;\n const cy = b.minY + (b.maxY - b.minY) / 2;\n const deg = (node.rotation * 180) / Math.PI;\n attrs.push(`transform=\"rotate(${trimNumber(deg)} ${trimNumber(cx)} ${trimNumber(cy)})\"`);\n }\n const metaAttrs = metaAttrsXml(node.meta, namespaces);\n const metaEls = metaElementsXml(node.meta, namespaces);\n if (metaEls) {\n return `<path ${attrs.join(' ')}${metaAttrs}>${metaEls}</path>`;\n }\n return `<path ${attrs.join(' ')}${metaAttrs}/>`;\n}\n\nfunction paintAttrs(\n paint: SvgPaint,\n name: 'fill' | 'stroke',\n registry: PaintServerRegistry,\n includeOpacity = true,\n): string[] {\n if (paint.kind === 'none') return [`${name}=\"none\"`];\n const out = [`${name}=\"${paint.kind === 'solid' ? escapeAttr(paint.color) : registry.ref(paint.paint)}\"`];\n if (includeOpacity) out.push(...opacityAttr(`${name}-opacity`, svgPaintOpacity(paint)));\n return out;\n}\n\n/** The opacity an `SvgPaint` carries, whichever kind holds it. */\nfunction svgPaintOpacity(paint: SvgPaint): number | undefined {\n if (paint.kind === 'solid') return paint.opacity;\n return paint.kind === 'gradient' ? paint.paint.opacity : undefined;\n}\n\n/** `name=\"v\"`, or nothing when `v` is absent or fully opaque. */\nfunction opacityAttr(name: string, v: number | undefined): string[] {\n return v != null && v !== 1 ? [`${name}=\"${trimNumber(v)}\"`] : [];\n}\n\n/**\n * Attributes for a kit `Stroke` — the shape text carries, whose `paint` is a\n * `FillStyle` rather than an `SvgPaint`. Text strokes ride inside\n * `TextStyle` / `StyledRun` rather than as a node-level `SvgStroke`, because\n * that is where the kit's text model puts them.\n *\n * Absent, unpainted, or zero-width emits nothing at all: unstroked text should\n * not carry a `stroke` attribute, and SVG's own default (`none`) already says\n * so.\n */\n/**\n * `stroke-width`, plus `vector-effect` when the width is in screen pixels.\n *\n * A `{ px }` width means \"this thickness once rendered, whatever the view is\n * doing\", which is exactly what `non-scaling-stroke` says — so the number goes\n * out unresolved and the attribute carries the unit. There is no accumulated\n * transform scale here to resolve it against, and picking one would bake a\n * single zoom level into the document.\n */\nfunction strokeWidthAttrs(width: ScreenLength): string[] {\n if (typeof width === 'number') return [`stroke-width=\"${trimNumber(width)}\"`];\n return [`stroke-width=\"${trimNumber(width.px)}\"`, 'vector-effect=\"non-scaling-stroke\"'];\n}\n\nfunction coreStrokeAttrs(stroke: Stroke | undefined, registry: PaintServerRegistry, warn: Warn): string[] {\n const paint = stroke?.paint;\n if (!stroke || !paint) return [];\n const width = stroke.width ?? 1;\n if (!((typeof width === 'object' ? width.px : width) > 0)) return [];\n warnStrokeAlign(stroke.align, warn);\n const attrs: string[] = [`stroke=\"${'color' in paint ? escapeAttr(paint.color) : registry.ref(paint)}\"`];\n attrs.push(...opacityAttr('stroke-opacity', paint.opacity));\n attrs.push(...strokeWidthAttrs(width));\n if (stroke.cap) attrs.push(`stroke-linecap=\"${stroke.cap}\"`);\n if (stroke.join) attrs.push(`stroke-linejoin=\"${stroke.join}\"`);\n if (stroke.dash && stroke.dash.length > 0) {\n attrs.push(`stroke-dasharray=\"${stroke.dash.map(trimNumber).join(' ')}\"`);\n }\n if (stroke.miterLimit != null) attrs.push(`stroke-miterlimit=\"${trimNumber(stroke.miterLimit)}\"`);\n for (const [field, attr] of [\n ['markerStart', 'marker-start'],\n ['markerMid', 'marker-mid'],\n ['markerEnd', 'marker-end'],\n ] as const) {\n const ref = stroke[field];\n if (ref === undefined) continue;\n const id = registry.markerId(ref);\n if (id === undefined) continue;\n attrs.push(`${attr}=\"url(#${id})\"`);\n }\n return attrs;\n}\n\nfunction strokeAttrsFor(stroke: SvgStroke, registry: PaintServerRegistry, warn: Warn): string[] {\n warnStrokeAlign(stroke.align, warn);\n // `SvgStroke.opacity` and the paint's own `opacity` are two models of one\n // SVG attribute, and parse fills in both. Emitting each would write\n // `stroke-opacity` twice, which is not well-formed XML at all.\n const attrs = paintAttrs(stroke.paint, 'stroke', registry, false);\n attrs.push(...strokeWidthAttrs(stroke.width));\n attrs.push(...opacityAttr('stroke-opacity', stroke.opacity ?? svgPaintOpacity(stroke.paint)));\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 frame = n.kind === 'path' ? null : poseFrameOf(n);\n const local = frame ? multiply(ctm, frame)\n : n.rotation ? rotateAboutCenter(ctm, b, n.rotation) : ctm;\n for (const [x, y] of corners(b)) {\n const px = local[0] * x + local[2] * y + local[4];\n const py = local[1] * x + local[3] * y + local[5];\n if (px < minX) minX = px;\n if (py < minY) minY = py;\n if (px > maxX) maxX = px;\n if (py > maxY) maxY = py;\n }\n };\n nodes.forEach((n) => visit(n, IDENTITY_MATRIX));\n if (!Number.isFinite(minX)) {\n return { x: 0, y: 0, width: 0, height: 0 };\n }\n return { x: minX, y: minY, width: maxX - minX, height: maxY - minY };\n}\n\nfunction corners(b: { minX: number; minY: number; maxX: number; maxY: number }): [number, number][] {\n return [[b.minX, b.minY], [b.maxX, b.minY], [b.maxX, b.maxY], [b.minX, b.maxY]];\n}\n\n/** `ctm` composed with the same `rotate(angle cx cy)` the element emits. */\nfunction rotateAboutCenter(\n ctm: Matrix,\n b: { minX: number; minY: number; maxX: number; maxY: number },\n angle: number,\n): Matrix {\n const cx = (b.minX + b.maxX) / 2;\n const cy = (b.minY + b.maxY) / 2;\n const c = Math.cos(angle);\n const s = Math.sin(angle);\n return multiply(ctm, [c, s, -s, c, cx - cx * c + cy * s, cy - cx * s - cy * c]);\n}\n\n/**\n * Emit a `<text>` element. `x` is the `text-anchor` point, per the SVG spec:\n * the box's left edge, center or right edge as its alignment resolves. Uses\n * `dominant-baseline=\"text-before-edge\"` so `y` matches weasel's top-of-box\n * pose; stashes the explicit width/height (which native SVG text doesn't\n * model) in `data-weasel-*` attributes so they round-trip through the parser\n * losslessly.\n */\nfunction textXml(\n node: SvgTextNode, registry: PaintServerRegistry, namespaces: Record<string, string>, warn: Warn,\n): string {\n const attrs: string[] = [\n `x=\"${trimNumber(node.x + anchorOffset(node.style, node.width, node.text))}\"`,\n `y=\"${trimNumber(node.y)}\"`,\n `dominant-baseline=\"text-before-edge\"`,\n // The runs model stores real line breaks; SVG's default whitespace\n // handling would collapse them (and any indentation) away on re-import.\n `xml:space=\"preserve\"`,\n `data-weasel-width=\"${trimNumber(node.width)}\"`,\n `data-weasel-height=\"${trimNumber(node.height)}\"`,\n ];\n\n const style = node.style;\n // SVG user space has no camera, so a `{ px }` size writes as that many\n // user units — the reading it already has at scale 1.\n if (style?.fontSize != null) attrs.push(`font-size=\"${trimNumber(resolveScreenLength(style.fontSize, 1))}\"`);\n if (style?.fontFamily) attrs.push(`font-family=\"${escapeAttr(style.fontFamily)}\"`);\n if (style?.fontWeight != null) attrs.push(`font-weight=\"${escapeAttr(String(style.fontWeight))}\"`);\n if (style?.fontStyle && style.fontStyle !== 'normal') attrs.push(`font-style=\"${style.fontStyle}\"`);\n if (style?.fontVariantCaps === 'small-caps') attrs.push('font-variant=\"small-caps\"');\n const direction = svgDirection(style, node.text);\n // A stated `ltr` is written too: absent reads back as the text's own direction.\n if (direction === 'rtl' || style?.direction === 'ltr') attrs.push(`direction=\"${direction}\"`);\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 // SVG text does not wrap, so every line written closes its paragraph and\n // a justified node draws at its start edge. `data-weasel-align` keeps the\n // justification for weasel's own reader.\n const anchor = align === 'center' ? 'middle'\n : align === 'start' || align === 'justify' ? 'start'\n : align === 'end' ? 'end'\n : (align === 'left') === (direction === 'ltr') ? 'start' : 'end';\n if (anchor !== 'start') attrs.push(`text-anchor=\"${anchor}\"`);\n if (align === 'justify') attrs.push('data-weasel-align=\"justify\"');\n }\n if (style?.letterSpacing != null && style.letterSpacing !== 0) {\n attrs.push(`letter-spacing=\"${trimNumber(resolveScreenLength(style.letterSpacing, 1))}\"`);\n }\n const decoration = textDecorationValue(style?.underline, style?.strikethrough, style?.overline);\n if (decoration) attrs.push(`text-decoration=\"${decoration}\"`);\n if (style?.script) attrs.push(`baseline-shift=\"${style.script}\"`);\n // A CSS property rather than an SVG 1.1 presentation attribute, so it goes\n // where every CSS-aware reader looks for it.\n if (style?.textTransform && style.textTransform !== 'none') {\n attrs.push(`style=\"text-transform:${style.textTransform}\"`);\n }\n // SVG text never wraps, so this is for weasel's own reader, beside the box\n // width it wraps at.\n if (style?.wrap) {\n attrs.push('data-weasel-wrap=\"true\"');\n warn('text that wraps at its box width is written unwrapped: SVG text does not wrap, so other'\n + ' readers draw one line per hard break (weasel reads the wrap back)');\n }\n if (style?.tabSize != null) attrs.push(`data-weasel-tab-size=\"${trimNumber(style.tabSize)}\"`);\n if (node.verticalAlign && node.verticalAlign !== 'top') {\n attrs.push(`data-weasel-vertical-align=\"${node.verticalAlign}\"`);\n warn(`text aligned to the ${node.verticalAlign} of its box is written top-aligned: SVG text has`\n + ' no box, so other readers draw it at the top (weasel reads the alignment back)');\n }\n // Note: `lineHeight` is NOT emitted here. The bridge layer (svgInterop)\n // lifts it into `meta.wd.attrs['line-height']`, which `metaAttrsXml`\n // below emits as `wd:line-height=\"...\"`. There is no compat write of\n // `data-weasel-line-height` — per the SVG-native plan's Migration section,\n // no installed base exists to compat against.\n if (node.fill === null) {\n attrs.push('fill=\"none\"');\n } else if (node.fill) {\n attrs.push(`fill=\"${'color' in node.fill ? escapeAttr(node.fill.color) : registry.ref(node.fill)}\"`);\n attrs.push(...opacityAttr('fill-opacity', node.fill.opacity));\n }\n for (const a of coreStrokeAttrs(node.stroke, registry, warn)) attrs.push(a);\n if (node.opacity != null && node.opacity !== 1) {\n attrs.push(`opacity=\"${trimNumber(node.opacity)}\"`);\n }\n const frame = boxTransformAttr(node);\n if (frame) attrs.push(frame);\n\n const body = node.runs && node.runs.length > 0\n ? node.runs.map((r) => runXml(r, style, registry, warn)).join('')\n : escapeText(node.text);\n const metaAttrs = metaAttrsXml(node.meta, namespaces);\n const metaEls = metaElementsXml(node.meta, namespaces);\n return `<text ${attrs.join(' ')}${metaAttrs}>${body}${metaEls}</text>`;\n}\n\n/**\n * The face whose metrics size `run`'s script, when the writer reads them: a\n * run that overrode only the rise has no `baseline-shift` keyword left to\n * carry the preset's size, so the size is spelled out from the face it\n * renders in. `undefined` for every other run.\n */\nexport function scriptSizeFace(\n run: import('@weasel-js/core').StyledRun, style: SvgTextNode['style'],\n): Required<FontRequest> | undefined {\n if (run.script == null || run.baselineShift == null) return undefined;\n const face = resolveRunFace(run, resolveTextStyle(style));\n return { family: face.fontFamily, weight: face.fontWeight, style: face.fontStyle };\n}\n\nfunction runXml(\n run: import('@weasel-js/core').StyledRun,\n style: SvgTextNode['style'],\n registry: PaintServerRegistry,\n warn: Warn,\n): string {\n const attrs: string[] = [];\n if (run.fontWeight != null) attrs.push(`font-weight=\"${run.fontWeight}\"`);\n else if (run.bold) attrs.push(`font-weight=\"700\"`);\n if (run.italic) attrs.push(`font-style=\"italic\"`);\n // `normal` included: on a run it overrides small caps the node passes down.\n if (run.fontVariantCaps) attrs.push(`font-variant=\"${run.fontVariantCaps}\"`);\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 face = scriptSizeFace(run, style);\n const presetScale = face && run.script\n ? scriptMetricsFor(face.family, face.weight, face.style)[run.script].size\n : undefined;\n const scale = run.fontScale ?? presetScale;\n if (run.fontSize != null) attrs.push(`font-size=\"${trimNumber(resolveScreenLength(run.fontSize, 1))}\"`);\n else if (scale != null) attrs.push(`font-size=\"${trimNumber(scale * 100)}%\"`);\n // Same story for `baseline-shift`: an SVG percentage resolves against the\n // parent's font size, which is the unit `baselineShift` is already in.\n if (run.baselineShift != null) {\n attrs.push(`baseline-shift=\"${trimNumber(run.baselineShift * 100)}%\"`);\n } else if (run.script) {\n attrs.push(`baseline-shift=\"${run.script}\"`);\n }\n // Unlike the node-level style guard above, a run-level `0` is a meaningful\n // *override* (distinct from \"inherit the node's letterSpacing\") per the\n // runs model's additive-flags contract — emit it whenever it's set.\n if (run.letterSpacing != null) {\n attrs.push(`letter-spacing=\"${trimNumber(resolveScreenLength(run.letterSpacing, 1))}\"`);\n }\n const runDecoration = textDecorationValue(run.underline, run.strikethrough, run.overline);\n if (runDecoration) attrs.push(`text-decoration=\"${runDecoration}\"`);\n if (run.fill === null) attrs.push('fill=\"none\"');\n else if (run.fill) {\n if ('color' in run.fill) {\n attrs.push(`fill=\"${escapeAttr(run.fill.color)}\"`);\n } else {\n attrs.push(`fill=\"${registry.ref(run.fill)}\"`);\n }\n }\n for (const a of coreStrokeAttrs(run.stroke, registry, warn)) attrs.push(a);\n // `none` included: on a run it overrides a transform the node would pass down.\n if (run.textTransform) attrs.push(`style=\"text-transform:${run.textTransform}\"`);\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 pathBounds(path: Path): { minX: number; minY: number; maxX: number; maxY: number } {\n const b = boundsOfPath(path);\n return { minX: b.x, minY: b.y, maxX: b.x + b.width, maxY: b.y + b.height };\n}\n\n","import {\n isPaintKindKnown, warmFonts, warmPaintKinds, type FontRequest, type RenderNeeds,\n} from '@weasel-js/core';\nimport type { SvgNode } from './types';\nimport { PaintServerRegistry } from './gradients';\nimport { registerPaintServers, scriptSizeFace } from './serialize';\n\n/**\n * What `serializeSvg(nodes)` reads that loads on demand: the paint kind of\n * every fill and stroke it writes as a paint server, and the face of every\n * run whose script size it takes from font metrics. The kinds come from the\n * serializer's own paint pre-pass, so the two cannot disagree. Registered\n * kinds are included.\n */\nexport function svgNeeds(nodes: readonly SvgNode[]): RenderNeeds {\n const registry = new PaintServerRegistry();\n registerPaintServers(nodes, registry);\n const fonts = new Map<string, FontRequest>();\n const walk = (list: readonly SvgNode[]) => {\n for (const n of list) {\n if (n.kind === 'group') walk(n.children);\n else if (n.kind === 'text') {\n for (const run of n.runs ?? []) {\n const face = scriptSizeFace(run, n.style);\n if (face) fonts.set(`${face.family}|${face.weight}|${face.style}`, face);\n }\n }\n }\n };\n walk(nodes);\n return { fonts: [...fonts.values()], paintKinds: registry.paintKinds() };\n}\n\n/**\n * Load what {@link svgNeeds} lists, so a `serializeSvg(nodes)` issued after it\n * resolves writes every paint server's def and every script size from the\n * face it renders in. Only those load: a lazily registered kind or font the\n * nodes do not use is never fetched, and cannot fail the export. A kind\n * nothing registered is passed over; the export warns about it instead.\n */\nexport function warmSvg(nodes: readonly SvgNode[]): Promise<void> {\n const needs = svgNeeds(nodes);\n return Promise.all([\n warmFonts(needs.fonts),\n warmPaintKinds(needs.paintKinds.filter(isPaintKindKnown)),\n ]).then(() => undefined);\n}\n","/**\n * The `unpack` half of the kit SVG handler (`svgHandler.ts`): parse an SVG\n * file into **native scene nodes** — path/text leaves under containers that\n * mirror the source `<g>` structure — instead of the default single\n * embedded-image node. Opted into via\n * `<SceneCanvas ingestion={{ svg: { unpack: unpackSvgFiles } }}>`.\n *\n * Leaf data targets the kit's built-in painters (`NodeShape.ts`): paths as\n * `{ path, fill?, stroke? }` (the `kit:path` contract), text\n * as `{ text, style?, runs?, fill?, stroke? }` (`kit:text`). Poses are absolute AABBs; the\n * renderer's `pathInPoseFrame` rebases stored geometry into the pose box,\n * so placement and fit-clamping operate on poses alone and never rewrite\n * path coordinates.\n *\n * Placement mirrors the image handler: the file's union AABB is fit-clamped\n * to 90% of the visible viewport and centered on the drop point (or the\n * viewport center), with multi-file batches cascading by a fixed offset.\n * Stroke widths, dashes, font sizes, and letter spacing take the clamp too:\n * they live in data, and only geometry is derived from the pose.\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 { ParseResult, SvgGroupNode, SvgNode, SvgPaint, SvgStroke } from './types';\nimport type { SvgKitLeafData } from './fromKit';\nimport { scaleRuns, scaleStroke, scaleTextStyle } from './metricScale';\nimport {\n boundsOfPath,\n createInsertOp,\n DEFAULT_TEXT_STYLE,\n dwarn,\n fillToBoundsFrame,\n getMarker,\n registerMarker,\n solid,\n unionAABB,\n type FillStyle,\n type ImageNodeData,\n type IngestCtx,\n type Op,\n type PoseLinear,\n type Stroke,\n type StyledRun,\n type TextStyle,\n} from '@weasel-js/core';\n\nconst CASCADE_OFFSET_PX = 24;\nconst VIEWPORT_FIT = 0.9;\n\n/** Axis-aligned box, in the coordinate space of the SVG being unpacked. Used\n * for the bounds a draft occupies before it becomes a scene node. */\nexport interface SvgDraftBounds {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\ntype DraftPose = SvgDraftBounds & { rotation?: number; transform?: PoseLinear };\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<TData = Record<string, unknown>> =\n | { kind: 'container'; id: string; parentId: string | null; pose: DraftPose }\n | { kind: 'leaf'; id: string; parentId: string | null; pose: DraftPose; data: TData };\n\n/** A leaf `SvgNode`: everything but a group. */\nexport type SvgLeafNode = Exclude<SvgNode, SvgGroupNode>;\n\n/** Options for {@link svgNodesToKitDrafts}. */\nexport interface SvgNodesToKitDraftsOptions<TData> {\n /** Lower a leaf yourself, from the kit data the default writes for it and\n * the node it came from — for data shaped other than the kit painters', or\n * metadata the document carries. `null` leaves it out. */\n leaf?(id: string, draft: { pose: DraftPose; data: SvgKitLeafData }, source: SvgLeafNode): TData | null;\n}\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/** 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). A solid paint keeps its\n * `fill-opacity`.\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. */\nexport function fillDataFromSvg(\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') {\n return paint.opacity != null ? { ...solid(paint.color), opacity: paint.opacity } : solid(paint.color);\n }\n return fillInBoxFrame(paint.paint, box);\n}\n\n/** Scale a paint's opacity by `k` — how an element or group `opacity` reaches\n * leaves whose data has no opacity of its own. Where a fill and a stroke\n * overlap this is not SVG's group compositing, which flattens first. */\nfunction fadeFill(fill: FillStyle, k: number): FillStyle {\n return k === 1 ? fill : { ...fill, opacity: (fill.opacity ?? 1) * k };\n}\n\nfunction fadeStroke(stroke: Stroke, k: number): Stroke {\n return k === 1 || !stroke.paint ? stroke : { ...stroke, paint: fadeFill(stroke.paint, k) };\n}\n\nfunction fadeRun(run: StyledRun, k: number): StyledRun {\n if (k === 1 || (!run.fill && !run.stroke)) return run;\n return {\n ...run,\n ...(run.fill ? { fill: fadeFill(run.fill, k) } : {}),\n ...(run.stroke ? { stroke: fadeStroke(run.stroke, k) } : {}),\n };\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 = fillDataFromSvg(stroke.paint, box);\n if (paint === undefined || paint === null) return undefined;\n return {\n paint: stroke.opacity !== undefined ? { ...paint, opacity: stroke.opacity } : paint,\n width: stroke.width,\n ...(stroke.cap !== undefined ? { cap: stroke.cap } : {}),\n ...(stroke.join !== undefined ? { join: stroke.join } : {}),\n ...(stroke.dash !== undefined ? { dash: stroke.dash } : {}),\n ...(stroke.miterLimit !== undefined ? { miterLimit: stroke.miterLimit } : {}),\n ...(stroke.markerStart !== undefined ? { markerStart: stroke.markerStart } : {}),\n ...(stroke.markerMid !== undefined ? { markerMid: stroke.markerMid } : {}),\n ...(stroke.markerEnd !== undefined ? { markerEnd: stroke.markerEnd } : {}),\n };\n}\n\n/** A text node's paint arrives already lowered to a kit `FillStyle`, not as\n * the `SvgPaint` a path carries, so it skips `fillDataFromSvg` — but a\n * `userSpaceOnUse` gradient still needs the same rebase onto the leaf's own\n * box, or it survives neither the fit-clamp nor the drop-point placement. */\nfunction fillInBoxFrame(fill: FillStyle, box: SvgDraftBounds): FillStyle {\n const units = 'units' in fill ? fill.units : undefined;\n return units === 'world' ? fillToBoundsFrame(fill, box) : fill;\n}\n\n/** The same rebase for a run's own overrides, which `<tspan fill=\"url(#g)\">`\n * puts on the run rather than on the node. */\nfunction runInBoxFrame(run: StyledRun, box: SvgDraftBounds): StyledRun {\n const fill = run.fill ? fillInBoxFrame(run.fill, box) : run.fill;\n const stroke = run.stroke ? strokeInBoxFrame(run.stroke, box) : run.stroke;\n if (fill === run.fill && stroke === run.stroke) return run;\n return { ...run, ...(fill ? { fill } : {}), ...(stroke ? { stroke } : {}) };\n}\n\n/** The same rebase for a `Stroke`'s paint. A stroke with no paint of its own\n * passes through — there is nothing to rebase. */\nfunction strokeInBoxFrame(stroke: Stroke, box: SvgDraftBounds): Stroke {\n if (!stroke.paint) return stroke;\n const paint = fillInBoxFrame(stroke.paint, box);\n return paint === stroke.paint ? stroke : { ...stroke, paint };\n}\n\n\n/**\n * Walk an `SvgNode[]` tree and emit a flat, parent-before-child list of\n * {@link SvgSceneDraft}s. Each `<g>` becomes a container whose pose is the\n * union AABB of its descendants (the kit `group` action's convention);\n * path/text leaves carry kit-painter-native data. Empty groups are dropped.\n *\n * Handed a whole `ParseResult`, it also registers the document's markers\n * (`parsed.markers`), without which the strokes naming them draw bare.\n * Containers carry no opacity, so an element or group `opacity` is multiplied\n * into the paints of every leaf under it.\n *\n * `nextId` is handed the node each id is for. `options.leaf` replaces a leaf's\n * data; a group whose leaves it all leaves out is dropped like an empty one.\n */\nexport function svgNodesToKitDrafts<TData = Record<string, unknown>>(\n input: ParseResult | readonly SvgNode[],\n nextId: (source: SvgNode) => string,\n options: SvgNodesToKitDraftsOptions<TData> = {},\n): SvgSceneDraft<TData>[] {\n const nodes = isNodeList(input) ? input : input.nodes;\n // Keyed by what they draw, so one already registered is this same marker\n // and re-registering it would only churn the paint memo.\n if (!isNodeList(input)) {\n for (const m of input.markers ?? []) if (getMarker(m.id) === undefined) registerMarker(m);\n }\n const drafts: SvgSceneDraft<TData>[] = [];\n const pushLeaf = (source: SvgLeafNode, parentId: string | null, pose: DraftPose, data: SvgKitLeafData): DraftPose | null => {\n const id = nextId(source);\n const out = options.leaf ? options.leaf(id, { pose, data }, source) : (data as TData);\n if (out === null) return null;\n drafts.push({ kind: 'leaf', id, parentId, pose, data: out });\n return pose;\n };\n\n // Returns the pose `n` was drafted with, so a parent container can union\n // its children's axis-aligned boxes; null for empty groups. `inherited` is\n // the product of the enclosing groups' opacities.\n const visit = (n: SvgNode, parentId: string | null, inherited: number): DraftPose | null => {\n const k = inherited * (n.opacity ?? 1);\n if (n.kind === 'group') {\n const draft: Extract<SvgSceneDraft<TData>, { kind: 'container' }> = {\n kind: 'container',\n id: nextId(n),\n parentId,\n pose: { x: 0, y: 0, width: 0, height: 0 },\n };\n drafts.push(draft);\n const acc = unionAABB(n.children.map((c) => visit(c, draft.id, k)));\n if (!acc) {\n drafts.splice(drafts.indexOf(draft), 1);\n return null;\n }\n draft.pose = acc;\n return draft.pose;\n }\n\n if (n.kind === 'text') {\n const pose: DraftPose = {\n x: n.x, y: n.y, width: n.width, height: n.height,\n };\n if (n.rotation) pose.rotation = n.rotation;\n if (n.transform) pose.transform = n.transform;\n const box: SvgDraftBounds = {\n x: pose.x, y: pose.y, width: pose.width, height: pose.height,\n };\n // Absent takes the painter's default, which has to be spelled out once\n // there is an opacity to carry.\n const fill = n.fill === undefined && k !== 1 ? DEFAULT_TEXT_STYLE.fill : n.fill;\n return pushLeaf(n, parentId, pose, {\n text: n.text,\n ...(n.style ? { style: n.style } : {}),\n ...(n.verticalAlign ? { verticalAlign: n.verticalAlign } : {}),\n ...(n.runs ? { runs: n.runs.map((r) => fadeRun(runInBoxFrame(r, box), k)) } : {}),\n // `!== undefined`, not a truthiness test: `null` is the document\n // saying `fill=\"none\"`, and absent takes the painter's default.\n ...(fill !== undefined\n ? { fill: fill === null ? null : fadeFill(fillInBoxFrame(fill, box), k) }\n : {}),\n ...(n.stroke !== undefined ? { stroke: fadeStroke(strokeInBoxFrame(n.stroke, box), k) } : {}),\n });\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 if (n.transform) pose.transform = n.transform;\n return pushLeaf(n, parentId, pose, {\n image: {\n src: n.href,\n ...(k !== 1 ? { opacity: k } : {}),\n ...(n.source ? { source: { ...n.source } } : {}),\n ...(n.flipX ? { flipX: true } : {}),\n ...(n.flipY ? { flipY: true } : {}),\n } satisfies ImageNodeData['image'],\n });\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 = fillDataFromSvg(n.fill, b);\n const strokeFromSvg = strokeDataFromSvg(n.stroke, b);\n return pushLeaf(n, parentId, pose, {\n path: n.path,\n ...(fill !== undefined ? { fill: fill && fadeFill(fill, k) } : {}),\n ...(strokeFromSvg !== undefined ? { stroke: fadeStroke(strokeFromSvg, k) } : {}),\n });\n };\n\n for (const n of nodes) visit(n, null, 1);\n return drafts;\n}\n\nfunction isNodeList(input: ParseResult | readonly SvgNode[]): input is readonly SvgNode[] {\n return Array.isArray(input);\n}\n\n\n/**\n * Apply the fit-clamp scale to the lengths a leaf holds in data rather than\n * in its pose, which `place` does not reach: stroke width and dashes on any\n * leaf, and a text leaf's font size and letter spacing. `pathInPoseFrame`\n * rebases a path's geometry into the shrunk pose but nothing else, so a\n * shrunk file would otherwise arrive with source-size strokes and text.\n *\n * An unscaled import passes through.\n */\nfunction scaleLeafData(\n data: Record<string, unknown>,\n scale: number,\n): Record<string, unknown> {\n if (scale === 1) return data;\n const out = { ...data };\n if (out.stroke) out.stroke = scaleStroke(out.stroke as Stroke, scale);\n if (typeof out.text === 'string') {\n out.style = scaleTextStyle(out.style as TextStyle | undefined, scale);\n if (out.runs) out.runs = scaleRuns(out.runs as StyledRun[], scale);\n }\n return out;\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, () => ctx.scene.mintId());\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 = ctx.scene.mintId();\n const union = unionAABB(roots.map((d) => d.pose))!;\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 = unionAABB(drafts.filter((d) => d.parentId === null).map((d) => d.pose))!;\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' ? scaleLeafData(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","/**\n * The kit-to-SVG direction: scene leaves back to `SvgNode`s, the inverse of\n * `svgNodesToKitDrafts`. Each leaf is written as the built-in painter that\n * draws it would draw it — the pose baked into the geometry, box-relative\n * paints resolved into that box — so `serializeSvg` over the result shows what\n * the canvas shows.\n */\nimport {\n DEFAULT_SHAPE_FILL,\n fillInPoseFrame,\n pathInPoseFrame,\n type FillStyle,\n type ImageNodeData,\n type Path,\n type PoseLinear,\n type Stroke,\n type StyledRun,\n type TextStyle,\n type TextVerticalAlign,\n} from '@weasel-js/core';\nimport type {\n SvgGroupNode, SvgImageNode, SvgNode, SvgPaint, SvgPathNode, SvgStroke, SvgTextNode,\n} from './types';\n\n/** A leaf's box: where it is drawn, and the frame its box-relative paints\n * resolve against. */\nexport interface SvgKitPose {\n x: number;\n y: number;\n width: number;\n height: number;\n rotation?: number;\n /** Read for text and image leaves only; a path leaf's is not written. */\n transform?: PoseLinear;\n}\n\n/** The leaf data the kit's path, text and image painters read — what\n * `svgNodesToKitDrafts` writes. */\nexport interface SvgKitLeafData {\n path?: Path;\n fill?: FillStyle | null;\n stroke?: Stroke | null;\n text?: string;\n style?: TextStyle;\n runs?: readonly StyledRun[];\n verticalAlign?: TextVerticalAlign;\n image?: ImageNodeData['image'];\n}\n\n/** A kit paint as an `SvgPaint`. `null` is `fill=\"none\"`; a box-relative\n * gradient or pattern is resolved into `box`, since the geometry it paints\n * is written already placed there. */\nexport function svgPaintFromKit(fill: FillStyle | null, box: SvgKitPose): SvgPaint {\n if (fill === null) return { kind: 'none' };\n if (fill.fill === undefined || fill.fill === 'solid') {\n return { kind: 'solid', color: fill.color, ...(fill.opacity != null ? { opacity: fill.opacity } : {}) };\n }\n return { kind: 'gradient', paint: fillInPoseFrame(fill, box) };\n}\n\n/** A kit `Stroke` as an `SvgStroke` — the inverse of `strokeDataFromSvg`.\n * One with no paint or no width draws nothing and is written as no stroke. */\nexport function svgStrokeFromKit(stroke: Stroke | null | undefined, box: SvgKitPose): SvgStroke | undefined {\n if (!stroke?.paint) return undefined;\n const width = stroke.width ?? 1;\n if (!((typeof width === 'object' ? width.px : width) > 0)) return undefined;\n const opacity = stroke.paint.opacity;\n return {\n paint: svgPaintFromKit(stroke.paint, box),\n width,\n ...(opacity != null ? { opacity } : {}),\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.align !== undefined ? { align: stroke.align } : {}),\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/** Write a `kit:image` leaf as an `SvgImageNode` — the inverse of the image\n * arm of `svgNodesToKitDrafts`. The pose is the image's box. */\nexport function svgImageFromKit(image: ImageNodeData['image'], pose: SvgKitPose): SvgImageNode {\n const node: SvgImageNode = {\n kind: 'image', href: image.src,\n x: pose.x, y: pose.y, width: pose.width, height: pose.height,\n };\n if (image.source) node.source = { ...image.source };\n if (image.flipX) node.flipX = true;\n if (image.flipY) node.flipY = true;\n if (image.opacity != null) node.opacity = image.opacity;\n if (pose.rotation) node.rotation = pose.rotation;\n if (pose.transform) node.transform = pose.transform;\n return node;\n}\n\n/** A kit `Stroke` kept as one, with its paint resolved into `box` — text\n * carries the kit's own stroke shape rather than an `SvgStroke`. */\nfunction strokeInPoseFrame(stroke: Stroke, box: SvgKitPose): Stroke {\n return stroke.paint ? { ...stroke, paint: fillInPoseFrame(stroke.paint, box) } : stroke;\n}\n\nfunction runInPoseFrame(run: StyledRun, box: SvgKitPose): StyledRun {\n if (!run.fill && !run.stroke) return run;\n return {\n ...run,\n ...(run.fill ? { fill: fillInPoseFrame(run.fill, box) } : {}),\n ...(run.stroke ? { stroke: strokeInPoseFrame(run.stroke, box) } : {}),\n };\n}\n\n/**\n * Write one leaf as the `SvgNode` its built-in painter draws — image, text or\n * path, in the order the painters claim a node. `null` for data none of them\n * draws.\n *\n * A path with no `fill` takes `kit:path`'s fallback: the default shape fill\n * when it has no stroke, and no fill when it has one.\n */\nexport function svgLeafFromKit(\n data: SvgKitLeafData,\n pose: SvgKitPose,\n): SvgPathNode | SvgTextNode | SvgImageNode | null {\n if (data.image) return svgImageFromKit(data.image, pose);\n if (data.text != null) {\n const node: SvgTextNode = {\n kind: 'text', x: pose.x, y: pose.y, width: pose.width, height: pose.height, text: data.text,\n };\n if (data.style) node.style = data.style;\n if (data.runs) node.runs = data.runs.map((r) => runInPoseFrame(r, pose));\n if (data.verticalAlign) node.verticalAlign = data.verticalAlign;\n if (data.fill !== undefined) node.fill = data.fill && fillInPoseFrame(data.fill, pose);\n if (data.stroke) node.stroke = strokeInPoseFrame(data.stroke, pose);\n if (pose.rotation) node.rotation = pose.rotation;\n if (pose.transform) node.transform = pose.transform;\n return node;\n }\n if (!data.path) return null;\n const stroke = svgStrokeFromKit(data.stroke, pose);\n const fill = data.fill !== undefined ? data.fill : stroke ? null : DEFAULT_SHAPE_FILL;\n const node: SvgPathNode = {\n kind: 'path',\n path: pathInPoseFrame(data.path, pose),\n fill: svgPaintFromKit(fill, pose),\n };\n if (stroke) node.stroke = stroke;\n if (pose.rotation) node.rotation = pose.rotation;\n return node;\n}\n\n/** One node as {@link svgNodesFromKit} reads it. */\nexport interface SvgKitTreeNode {\n kind: string;\n data: unknown;\n pose: SvgKitPose;\n}\n\n/** The read side of a scene that {@link svgNodesFromKit} walks. A kit\n * `Scene` is one as it stands. */\nexport interface SvgKitTree<TId extends string = string> {\n readonly roots: readonly TId[];\n childrenOf(id: TId): readonly TId[];\n get(id: TId): SvgKitTreeNode | undefined;\n}\n\n/** Options for {@link svgNodesFromKit}. */\nexport interface SvgNodesFromKitOptions<TId extends string = string> {\n /** Walk these ids, in this order, instead of the tree's roots. */\n roots?: readonly TId[];\n /** `false` leaves a node out, with everything under it — a hidden layer. */\n include?(id: TId): boolean;\n /** Lower a leaf yourself; `null` leaves it out. Defaults to {@link svgLeafFromKit}. */\n leaf?(id: TId, node: SvgKitTreeNode): SvgNode | null;\n /** Decorate the group written for a container, e.g. with `meta`. */\n group?(id: TId, group: SvgGroupNode): SvgGroupNode;\n}\n\n/**\n * Walk a scene's container tree into `SvgNode`s ready for `serializeSvg`:\n * every `container` becomes a group of its children, in z-order, and every\n * leaf goes through {@link svgLeafFromKit} unless `options.leaf` says\n * otherwise.\n */\nexport function svgNodesFromKit<TId extends string>(\n tree: SvgKitTree<TId>,\n options: SvgNodesFromKitOptions<TId> = {},\n): SvgNode[] {\n const { include, leaf, group } = options;\n const emit = (id: TId): SvgNode | null => {\n if (include && !include(id)) return null;\n const node = tree.get(id);\n if (!node) return null;\n if (node.kind === 'container') {\n const children: SvgNode[] = [];\n for (const c of tree.childrenOf(id)) {\n const child = emit(c);\n if (child) children.push(child);\n }\n const g: SvgGroupNode = { kind: 'group', children };\n return group ? group(id, g) : g;\n }\n return leaf ? leaf(id, node) : svgLeafFromKit(node.data as SvgKitLeafData, node.pose);\n };\n const out: SvgNode[] = [];\n for (const id of options.roots ?? tree.roots) {\n const n = emit(id);\n if (n) out.push(n);\n }\n return out;\n}\n"]}
|