@weasel-js/svg 0.8.0 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +35 -2
- package/dist/index.js +115 -19
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Path, FillStyle, StyledRun, TextStyle, IngestCtx } from '@weasel-js/core';
|
|
1
|
+
import { Path, FillStyle, StyledRun, TextStyle, TilePatternSpec, IngestCtx } from '@weasel-js/core';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* Public types for `@weasel-js/svg`. The package exposes a flat,
|
|
@@ -206,6 +206,12 @@ interface SerializeOptions {
|
|
|
206
206
|
width: number;
|
|
207
207
|
height: number;
|
|
208
208
|
};
|
|
209
|
+
/**
|
|
210
|
+
* Called for paint that can't be expressed in SVG and is dropped — a
|
|
211
|
+
* conic gradient, or a pattern carrying a `TextureHandle` instead of a
|
|
212
|
+
* `TilePatternSpec`. Without this the loss is silent.
|
|
213
|
+
*/
|
|
214
|
+
onWarn?: (message: string) => void;
|
|
209
215
|
/** Emit `width="..."` on the root `<svg>`. */
|
|
210
216
|
width?: number;
|
|
211
217
|
/** Emit `height="..."` on the root `<svg>`. */
|
|
@@ -263,6 +269,33 @@ declare function parseSvg(svg: string, opts?: ParseOptions): ParseResult;
|
|
|
263
269
|
*/
|
|
264
270
|
declare function serializeSvg(nodes: SvgNode[], opts?: SerializeOptions): string;
|
|
265
271
|
|
|
272
|
+
/**
|
|
273
|
+
* Map between SVG `<pattern>` elements and weasel's `pattern` `FillStyle`.
|
|
274
|
+
* The counterpart to `gradients.ts` for the other paint-server kind.
|
|
275
|
+
*
|
|
276
|
+
* The tile's shapes come from `tileGeometry` in core, so the vector form a
|
|
277
|
+
* viewer sees is generated from the same description that rasterizes the GL
|
|
278
|
+
* texture. Alongside them we write the spec itself onto a `data-weasel-tile`
|
|
279
|
+
* attribute: any SVG consumer renders the shapes, and weasel reads the
|
|
280
|
+
* attribute back to recover the exact spec rather than reverse-engineering
|
|
281
|
+
* it from geometry.
|
|
282
|
+
*
|
|
283
|
+
* A pattern whose payload is a `TextureHandle` has no vector form — the
|
|
284
|
+
* handle is a session-scoped registry key with no tile description behind
|
|
285
|
+
* it — and exports as nothing, with a warning. Same treatment conic
|
|
286
|
+
* gradients get.
|
|
287
|
+
*/
|
|
288
|
+
|
|
289
|
+
/**
|
|
290
|
+
* A single tile as a standalone `<svg>` document, sized to its own extent.
|
|
291
|
+
* For UI that needs to show a tile outside a document — a picker swatch,
|
|
292
|
+
* set as a repeating CSS `background-image` via a data URI. Shares the shape
|
|
293
|
+
* mapper with `patternXml`, so a preview can't drift from what paints.
|
|
294
|
+
*/
|
|
295
|
+
declare function tilePreviewSvg(spec: TilePatternSpec, background?: string): string;
|
|
296
|
+
/** `tilePreviewSvg` packed as a `url(...)` value for CSS `background-image`. */
|
|
297
|
+
declare function tilePreviewCssUrl(spec: TilePatternSpec, background?: string): string;
|
|
298
|
+
|
|
266
299
|
interface SvgDraftBounds {
|
|
267
300
|
x: number;
|
|
268
301
|
y: number;
|
|
@@ -304,4 +337,4 @@ declare function svgNodesToKitDrafts(nodes: readonly SvgNode[], nextId: () => st
|
|
|
304
337
|
*/
|
|
305
338
|
declare function unpackSvgFiles(files: File[], ctx: IngestCtx): Promise<void>;
|
|
306
339
|
|
|
307
|
-
export { IDENTITY_MATRIX, type Matrix, type NamespaceMeta, type NamespacedElement, type ParseOptions, type ParseResult, type SerializeOptions, type SvgDraftBounds, type SvgGroupNode, type SvgNode, type SvgPaint, type SvgPathNode, type SvgSceneDraft, type SvgStroke, type SvgTextNode, parseSvg, serializeSvg, svgNodesToKitDrafts, unpackSvgFiles };
|
|
340
|
+
export { IDENTITY_MATRIX, type Matrix, type NamespaceMeta, type NamespacedElement, type ParseOptions, type ParseResult, type SerializeOptions, type SvgDraftBounds, type SvgGroupNode, type SvgNode, type SvgPaint, type SvgPathNode, type SvgSceneDraft, type SvgStroke, type SvgTextNode, parseSvg, serializeSvg, svgNodesToKitDrafts, tilePreviewCssUrl, tilePreviewSvg, unpackSvgFiles };
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { pathFromD, PATH_M, PATH_L, PATH_Z, boundsOfPath, dwarn, createInsertOp, PathBuilder, parseColor, rgbaToHex, PATH_C, PATH_Q } from '@weasel-js/core';
|
|
2
|
+
import { tileGeometry } from '@weasel-js/core/patterns-builtin';
|
|
2
3
|
|
|
3
4
|
// src/parse.ts
|
|
4
5
|
|
|
@@ -241,6 +242,98 @@ function parsePaintAttr(raw) {
|
|
|
241
242
|
return null;
|
|
242
243
|
}
|
|
243
244
|
}
|
|
245
|
+
function patternSpecOf(paint) {
|
|
246
|
+
return "tile" in paint.pattern ? paint.pattern : null;
|
|
247
|
+
}
|
|
248
|
+
function patternXml(id, paint, onWarn) {
|
|
249
|
+
const spec = patternSpecOf(paint);
|
|
250
|
+
if (!spec) {
|
|
251
|
+
onWarn?.("pattern fill carries a TextureHandle, which has no vector form \u2014 omitted from <defs>");
|
|
252
|
+
return "";
|
|
253
|
+
}
|
|
254
|
+
const geometry = tileGeometry(spec);
|
|
255
|
+
const body = geometry.shapes.map(shapeXml).join("");
|
|
256
|
+
const origin = paint.origin ?? { x: 0, y: 0 };
|
|
257
|
+
const attrs = [
|
|
258
|
+
`id="${id}"`,
|
|
259
|
+
'patternUnits="userSpaceOnUse"',
|
|
260
|
+
`width="${trimNumber(geometry.size)}"`,
|
|
261
|
+
`height="${trimNumber(geometry.size)}"`
|
|
262
|
+
];
|
|
263
|
+
if (origin.x !== 0 || origin.y !== 0) {
|
|
264
|
+
attrs.push(`x="${trimNumber(origin.x)}"`, `y="${trimNumber(origin.y)}"`);
|
|
265
|
+
}
|
|
266
|
+
attrs.push(`data-weasel-tile="${escapeAttr(JSON.stringify(spec))}"`);
|
|
267
|
+
return `<pattern ${attrs.join(" ")}>${body}</pattern>`;
|
|
268
|
+
}
|
|
269
|
+
function tilePreviewSvg(spec, background) {
|
|
270
|
+
const geometry = tileGeometry(spec);
|
|
271
|
+
const s = trimNumber(geometry.size);
|
|
272
|
+
const bg = background ? `<rect width="${s}" height="${s}" fill="${background}"/>` : "";
|
|
273
|
+
return `<svg xmlns="http://www.w3.org/2000/svg" width="${s}" height="${s}" viewBox="0 0 ${s} ${s}">${bg}${geometry.shapes.map(shapeXml).join("")}</svg>`;
|
|
274
|
+
}
|
|
275
|
+
function tilePreviewCssUrl(spec, background) {
|
|
276
|
+
return `url("data:image/svg+xml,${encodeURIComponent(tilePreviewSvg(spec, background))}")`;
|
|
277
|
+
}
|
|
278
|
+
function shapeXml(shape) {
|
|
279
|
+
switch (shape.kind) {
|
|
280
|
+
case "line":
|
|
281
|
+
return `<line x1="${trimNumber(shape.x1)}" y1="${trimNumber(shape.y1)}" x2="${trimNumber(shape.x2)}" y2="${trimNumber(shape.y2)}" stroke="${shape.color}" stroke-width="${trimNumber(shape.width)}"/>`;
|
|
282
|
+
case "circle":
|
|
283
|
+
return `<circle cx="${trimNumber(shape.cx)}" cy="${trimNumber(shape.cy)}" r="${trimNumber(shape.r)}" fill="${shape.color}"/>`;
|
|
284
|
+
case "ellipse": {
|
|
285
|
+
const deg = shape.rotation * 180 / Math.PI;
|
|
286
|
+
const transform = deg === 0 ? "" : ` transform="rotate(${trimNumber(deg)} ${trimNumber(shape.cx)} ${trimNumber(shape.cy)})"`;
|
|
287
|
+
return `<ellipse cx="${trimNumber(shape.cx)}" cy="${trimNumber(shape.cy)}" rx="${trimNumber(shape.rx)}" ry="${trimNumber(shape.ry)}" fill="${shape.color}"${transform}/>`;
|
|
288
|
+
}
|
|
289
|
+
case "rect":
|
|
290
|
+
return `<rect x="${trimNumber(shape.x)}" y="${trimNumber(shape.y)}" width="${trimNumber(shape.width)}" height="${trimNumber(shape.height)}" fill="${shape.color}"/>`;
|
|
291
|
+
default:
|
|
292
|
+
return "";
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
function collectPatterns(svg, onWarn) {
|
|
296
|
+
const out = /* @__PURE__ */ new Map();
|
|
297
|
+
const defs = svg.getElementsByTagName("defs");
|
|
298
|
+
for (let d = 0; d < defs.length; d++) {
|
|
299
|
+
const root = defs[d];
|
|
300
|
+
for (let i = 0; i < root.children.length; i++) {
|
|
301
|
+
const child = root.children[i];
|
|
302
|
+
if (child.tagName.toLowerCase() !== "pattern") continue;
|
|
303
|
+
const id = child.getAttribute("id");
|
|
304
|
+
if (!id) continue;
|
|
305
|
+
const paint = readPattern(child, onWarn);
|
|
306
|
+
if (paint) out.set(id, paint);
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
return out;
|
|
310
|
+
}
|
|
311
|
+
function readPattern(el, onWarn) {
|
|
312
|
+
const raw = el.getAttribute("data-weasel-tile");
|
|
313
|
+
if (!raw) {
|
|
314
|
+
onWarn?.(`<pattern id="${el.getAttribute("id")}"> has no data-weasel-tile \u2014 unsupported pattern, dropped`);
|
|
315
|
+
return null;
|
|
316
|
+
}
|
|
317
|
+
let spec;
|
|
318
|
+
try {
|
|
319
|
+
spec = JSON.parse(raw);
|
|
320
|
+
} catch {
|
|
321
|
+
onWarn?.(`<pattern id="${el.getAttribute("id")}"> has malformed data-weasel-tile \u2014 dropped`);
|
|
322
|
+
return null;
|
|
323
|
+
}
|
|
324
|
+
if (typeof spec?.tile !== "string" || typeof spec?.color !== "string") {
|
|
325
|
+
onWarn?.(`<pattern id="${el.getAttribute("id")}"> data-weasel-tile is not a tile spec \u2014 dropped`);
|
|
326
|
+
return null;
|
|
327
|
+
}
|
|
328
|
+
const x = parseFloat(el.getAttribute("x") ?? "0");
|
|
329
|
+
const y = parseFloat(el.getAttribute("y") ?? "0");
|
|
330
|
+
const paint = { fill: "pattern", pattern: spec };
|
|
331
|
+
if (x !== 0 || y !== 0) paint.origin = { x, y };
|
|
332
|
+
return paint;
|
|
333
|
+
}
|
|
334
|
+
function escapeAttr(s) {
|
|
335
|
+
return s.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """);
|
|
336
|
+
}
|
|
244
337
|
|
|
245
338
|
// src/gradients.ts
|
|
246
339
|
function collectGradients(svg, onWarn) {
|
|
@@ -259,7 +352,7 @@ function collectGradients(svg, onWarn) {
|
|
|
259
352
|
} else if (tag === "radialgradient") {
|
|
260
353
|
const paint = readRadialGradient(child, onWarn);
|
|
261
354
|
if (paint) out.set(id, paint);
|
|
262
|
-
} else if (tag !== "
|
|
355
|
+
} else if (tag !== "pattern") {
|
|
263
356
|
onWarn?.(`unsupported <defs> child: <${child.tagName}>`);
|
|
264
357
|
}
|
|
265
358
|
}
|
|
@@ -315,25 +408,27 @@ function readRadialGradient(el, onWarn) {
|
|
|
315
408
|
stops
|
|
316
409
|
};
|
|
317
410
|
}
|
|
318
|
-
var
|
|
411
|
+
var PaintServerRegistry = class {
|
|
319
412
|
byPaint = /* @__PURE__ */ new Map();
|
|
320
413
|
order = [];
|
|
321
414
|
counter = 0;
|
|
322
415
|
register(paint) {
|
|
323
416
|
const existing = this.byPaint.get(paint);
|
|
324
417
|
if (existing) return existing;
|
|
325
|
-
const id = `grad${this.counter++}`;
|
|
418
|
+
const id = paint.fill === "pattern" ? `pat${this.counter++}` : `grad${this.counter++}`;
|
|
326
419
|
this.byPaint.set(paint, id);
|
|
327
420
|
this.order.push(paint);
|
|
328
421
|
return id;
|
|
329
422
|
}
|
|
330
|
-
/** Emit `<defs>...</defs>` XML for
|
|
331
|
-
toDefsXml() {
|
|
423
|
+
/** Emit `<defs>...</defs>` XML for every registered paint server. */
|
|
424
|
+
toDefsXml(onWarn) {
|
|
332
425
|
if (this.order.length === 0) return "";
|
|
333
426
|
const parts = ["<defs>"];
|
|
334
427
|
for (const paint of this.order) {
|
|
335
428
|
const id = this.byPaint.get(paint);
|
|
336
|
-
parts.push(
|
|
429
|
+
parts.push(
|
|
430
|
+
paint.fill === "pattern" ? patternXml(id, paint, onWarn) : gradientXml(id, paint)
|
|
431
|
+
);
|
|
337
432
|
}
|
|
338
433
|
parts.push("</defs>");
|
|
339
434
|
return parts.join("");
|
|
@@ -446,6 +541,7 @@ function parseSvg(svg, opts = {}) {
|
|
|
446
541
|
}
|
|
447
542
|
const documentMeta = collectDocumentMeta(root, uriToPrefix);
|
|
448
543
|
const gradients = collectGradients(root, onWarn);
|
|
544
|
+
for (const [id, paint] of collectPatterns(root, onWarn)) gradients.set(id, paint);
|
|
449
545
|
const rootStyle = deriveStyle(EMPTY_STYLE, root);
|
|
450
546
|
const nodes = parseChildren(root, IDENTITY_MATRIX, rootStyle, gradients, onWarn, uriToPrefix);
|
|
451
547
|
const result = { nodes, warnings };
|
|
@@ -1032,14 +1128,14 @@ function serializePathD(path) {
|
|
|
1032
1128
|
|
|
1033
1129
|
// src/serialize.ts
|
|
1034
1130
|
function serializeSvg(nodes, opts = {}) {
|
|
1035
|
-
const registry = new
|
|
1036
|
-
|
|
1131
|
+
const registry = new PaintServerRegistry();
|
|
1132
|
+
registerPaintServers(nodes, registry);
|
|
1037
1133
|
const bounds = opts.viewBox ?? computeBounds(nodes);
|
|
1038
1134
|
const vb = `${trimNumber(bounds.x)} ${trimNumber(bounds.y)} ${trimNumber(bounds.width)} ${trimNumber(bounds.height)}`;
|
|
1039
1135
|
const namespaces = opts.namespaces ?? {};
|
|
1040
1136
|
const rootAttrs = [`xmlns="http://www.w3.org/2000/svg"`];
|
|
1041
1137
|
for (const [prefix, uri] of Object.entries(namespaces)) {
|
|
1042
|
-
rootAttrs.push(`xmlns:${prefix}="${
|
|
1138
|
+
rootAttrs.push(`xmlns:${prefix}="${escapeAttr2(uri)}"`);
|
|
1043
1139
|
}
|
|
1044
1140
|
rootAttrs.push(`viewBox="${vb}"`);
|
|
1045
1141
|
if (opts.width != null) rootAttrs.push(`width="${trimNumber(opts.width)}"`);
|
|
@@ -1049,7 +1145,7 @@ function serializeSvg(nodes, opts = {}) {
|
|
|
1049
1145
|
const bucket = opts.documentMeta[prefix];
|
|
1050
1146
|
if (!bucket?.attrs) continue;
|
|
1051
1147
|
for (const [name, value] of Object.entries(bucket.attrs)) {
|
|
1052
|
-
rootAttrs.push(`${prefix}:${name}="${
|
|
1148
|
+
rootAttrs.push(`${prefix}:${name}="${escapeAttr2(value)}"`);
|
|
1053
1149
|
}
|
|
1054
1150
|
}
|
|
1055
1151
|
}
|
|
@@ -1063,7 +1159,7 @@ function serializeSvg(nodes, opts = {}) {
|
|
|
1063
1159
|
}
|
|
1064
1160
|
}
|
|
1065
1161
|
}
|
|
1066
|
-
const defsXml = registry.toDefsXml();
|
|
1162
|
+
const defsXml = registry.toDefsXml(opts.onWarn);
|
|
1067
1163
|
const bodyXml = nodes.map((n) => nodeXml(n, registry, namespaces)).join("");
|
|
1068
1164
|
const titleXml = opts.title && opts.title.length > 0 ? `<title>${escapeText(opts.title)}</title>` : "";
|
|
1069
1165
|
return `<svg ${rootAttrs.join(" ")}>${titleXml}${defsXml}${docMetaXml}${bodyXml}</svg>`;
|
|
@@ -1071,7 +1167,7 @@ function serializeSvg(nodes, opts = {}) {
|
|
|
1071
1167
|
function namespacedElementXml(prefix, localName, el) {
|
|
1072
1168
|
const attrs = [];
|
|
1073
1169
|
for (const [name, value] of Object.entries(el.attrs)) {
|
|
1074
|
-
attrs.push(`${name}="${
|
|
1170
|
+
attrs.push(`${name}="${escapeAttr2(value)}"`);
|
|
1075
1171
|
}
|
|
1076
1172
|
const head = attrs.length > 0 ? `<${prefix}:${localName} ${attrs.join(" ")}>` : `<${prefix}:${localName}>`;
|
|
1077
1173
|
let body = "";
|
|
@@ -1091,7 +1187,7 @@ function metaAttrsXml(meta, namespaces) {
|
|
|
1091
1187
|
const bucket = meta[prefix];
|
|
1092
1188
|
if (!bucket?.attrs) continue;
|
|
1093
1189
|
for (const [name, value] of Object.entries(bucket.attrs)) {
|
|
1094
|
-
parts.push(`${prefix}:${name}="${
|
|
1190
|
+
parts.push(`${prefix}:${name}="${escapeAttr2(value)}"`);
|
|
1095
1191
|
}
|
|
1096
1192
|
}
|
|
1097
1193
|
return parts.length > 0 ? ` ${parts.join(" ")}` : "";
|
|
@@ -1108,10 +1204,10 @@ function metaElementsXml(meta, namespaces) {
|
|
|
1108
1204
|
}
|
|
1109
1205
|
return out;
|
|
1110
1206
|
}
|
|
1111
|
-
function
|
|
1207
|
+
function registerPaintServers(nodes, registry) {
|
|
1112
1208
|
for (const n of nodes) {
|
|
1113
1209
|
if (n.kind === "group") {
|
|
1114
|
-
|
|
1210
|
+
registerPaintServers(n.children, registry);
|
|
1115
1211
|
} else if (n.kind === "path") {
|
|
1116
1212
|
if (n.fill.kind === "gradient") registry.register(n.fill.paint);
|
|
1117
1213
|
if (n.stroke && n.stroke.paint.kind === "gradient") registry.register(n.stroke.paint.paint);
|
|
@@ -1260,7 +1356,7 @@ function textXml(node, registry, namespaces) {
|
|
|
1260
1356
|
];
|
|
1261
1357
|
const style = node.style;
|
|
1262
1358
|
if (style?.fontSize != null) attrs.push(`font-size="${trimNumber(style.fontSize)}"`);
|
|
1263
|
-
if (style?.fontFamily) attrs.push(`font-family="${
|
|
1359
|
+
if (style?.fontFamily) attrs.push(`font-family="${escapeAttr2(style.fontFamily)}"`);
|
|
1264
1360
|
if (style?.fontWeight != null) attrs.push(`font-weight="${String(style.fontWeight)}"`);
|
|
1265
1361
|
if (style?.fontStyle && style.fontStyle !== "normal") attrs.push(`font-style="${style.fontStyle}"`);
|
|
1266
1362
|
if (style?.align && style.align !== "left") {
|
|
@@ -1302,7 +1398,7 @@ function runXml(run, registry) {
|
|
|
1302
1398
|
const attrs = [];
|
|
1303
1399
|
if (run.bold) attrs.push(`font-weight="700"`);
|
|
1304
1400
|
if (run.italic) attrs.push(`font-style="italic"`);
|
|
1305
|
-
if (run.fontFamily) attrs.push(`font-family="${
|
|
1401
|
+
if (run.fontFamily) attrs.push(`font-family="${escapeAttr2(run.fontFamily)}"`);
|
|
1306
1402
|
if (run.fontSize != null) attrs.push(`font-size="${trimNumber(run.fontSize)}"`);
|
|
1307
1403
|
if (run.letterSpacing != null) {
|
|
1308
1404
|
attrs.push(`letter-spacing="${trimNumber(run.letterSpacing)}"`);
|
|
@@ -1327,7 +1423,7 @@ function textDecorationValue(underline, strikethrough) {
|
|
|
1327
1423
|
if (strikethrough) tokens.push("line-through");
|
|
1328
1424
|
return tokens.length > 0 ? tokens.join(" ") : null;
|
|
1329
1425
|
}
|
|
1330
|
-
function
|
|
1426
|
+
function escapeAttr2(s) {
|
|
1331
1427
|
return s.replace(/&/g, "&").replace(/"/g, """).replace(/</g, "<");
|
|
1332
1428
|
}
|
|
1333
1429
|
function escapeText(s) {
|
|
@@ -1494,6 +1590,6 @@ async function unpackSvgFiles(files, ctx) {
|
|
|
1494
1590
|
}
|
|
1495
1591
|
}
|
|
1496
1592
|
|
|
1497
|
-
export { IDENTITY_MATRIX, parseSvg, serializeSvg, svgNodesToKitDrafts, unpackSvgFiles };
|
|
1593
|
+
export { IDENTITY_MATRIX, parseSvg, serializeSvg, svgNodesToKitDrafts, tilePreviewCssUrl, tilePreviewSvg, unpackSvgFiles };
|
|
1498
1594
|
//# sourceMappingURL=index.js.map
|
|
1499
1595
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types.ts","../src/transform.ts","../src/shapes.ts","../src/color.ts","../src/gradients.ts","../src/cascade.ts","../src/parse.ts","../src/path-serializer.ts","../src/serialize.ts","../src/unpack.ts"],"names":["opacity","meta","PATH_M","PATH_L","PATH_Z","out","PATH_C","PATH_Q","boundsOfPath","b","pose","union"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Public types for `@weasel-js/svg`. The package exposes a flat,\n * discriminated-union node model (`SvgNode`) that mirrors the SVG element\n * tree but uses weasel-native leaf data (`Path`, `FillStyle`) for geometry and\n * paint.\n *\n * Parsing collapses every `transform=\"...\"` onto its descendants' geometry,\n * so the `SvgNode` tree returned from `parseSvg` never has a non-identity\n * group transform. Consumers may still construct groups with explicit\n * transforms before serializing, in which case the serializer emits a\n * single `matrix(a b c d e f)` on the `<g>`.\n */\n\nimport type { Path, FillStyle, StyledRun, TextStyle } from '@weasel-js/core';\n\n/**\n * Opaque pass-through bag for namespaced XML content.\n *\n * weasel-svg does not interpret the contents — it only ensures that any\n * attributes or child elements in a *declared* XML namespace round-trip\n * losslessly through parse → serialize. Consumers (e.g. an app-specific\n * bridge layer) hang their domain semantics off this structure.\n *\n * Keyed by namespace prefix (the prefix is a write-time choice; the URI\n * is the canonical identifier and is supplied via `ParseOptions.namespaces`\n * / `SerializeOptions.namespaces`).\n */\nexport interface NamespaceMeta {\n [prefix: string]: {\n /** Local-name → string-value map for attributes in this namespace. */\n attrs?: Record<string, string>;\n /**\n * Child elements in this namespace, keyed by local name. Each entry\n * is an array because a namespace can host multiple sibling elements\n * with the same tag (e.g. `<wd:layer/><wd:layer/>`).\n */\n elements?: Record<string, NamespacedElement[]>;\n };\n}\n\n/** Opaque structured representation of a namespaced element. */\nexport interface NamespacedElement {\n /** Attribute local-name → string-value. */\n attrs: Record<string, string>;\n /** Text content, when the element contains only text (no child elements). */\n text?: string;\n /** Nested namespaced children, keyed by local name (recursive). */\n children?: Record<string, NamespacedElement[]>;\n}\n\n/**\n * 2x3 affine matrix in column-major form (SVG's `matrix(a b c d e f)`\n * order). Maps `[x', y'] = [a*x + c*y + e, b*x + d*y + f]`.\n */\nexport type Matrix = readonly [number, number, number, number, number, number];\n\n/** Identity matrix — useful as a default in tests / constructors. */\nexport const IDENTITY_MATRIX: Matrix = [1, 0, 0, 1, 0, 0];\n\n/**\n * FillStyle description in the SVG sense — either explicit `none`, a solid\n * color, or a reference to a weasel-native gradient `FillStyle`. Solid colors\n * are normalized to `#rrggbb` strings; opacity is carried separately so\n * `fill-opacity` and `stroke-opacity` round-trip cleanly.\n */\nexport type SvgPaint =\n | { kind: 'none' }\n | { kind: 'solid'; color: string; opacity?: number }\n | { kind: 'gradient'; paint: FillStyle };\n\n/** Stroke description: a paint plus structural line parameters. */\nexport interface SvgStroke {\n paint: SvgPaint;\n width: number;\n opacity?: number;\n /** `stroke-linecap`. Default per SVG spec is `'butt'`. */\n cap?: 'butt' | 'round' | 'square';\n /** `stroke-linejoin`. Default per SVG spec is `'miter'`. SVG's `arcs` / `miter-clip` map to `'miter'` with a warning. */\n join?: 'miter' | 'round' | 'bevel';\n /** `stroke-dasharray` as a flat number array. Odd-length inputs are doubled per SVG spec. */\n dash?: number[];\n /**\n * `stroke-miterlimit`. SVG's default is 4. Weasel's renderer defaults to\n * 10 (Canvas2D) when unset, so parsed strokes without an explicit\n * attribute may render with longer miters than the source SVG intended.\n */\n miterLimit?: number;\n}\n\n/**\n * Leaf node: a path geometry plus fill/stroke. All other v1 shapes\n * (`<rect>`, `<ellipse>`, etc.) are lowered to this representation on\n * parse — `<rect>` uses weasel's `RectPath` fast-path subtype when\n * possible, everything else becomes a `PolygonPath`.\n */\nexport interface SvgPathNode {\n kind: 'path';\n path: Path;\n fill: SvgPaint;\n stroke?: SvgStroke;\n /** Element-level opacity (`opacity=\"...\"`), 0..1. */\n opacity?: number;\n /** Element-level rotation in **radians**, pivoting around the AABB\n * center of the underlying `path` geometry. Emitted as SVG\n * `transform=\"rotate(angleDegrees cx cy)\"`. */\n rotation?: number;\n /** Opaque per-element bag for declared namespaces. See `NamespaceMeta`. */\n meta?: NamespaceMeta;\n}\n\n/**\n * Group node: an SVG `<g>`. On parse, `transform` is always omitted (any\n * `transform` attribute is collapsed onto descendants' geometry). On\n * serialize, a non-identity `transform` is emitted as\n * `matrix(a b c d e f)`.\n */\nexport interface SvgGroupNode {\n kind: 'group';\n children: SvgNode[];\n transform?: Matrix;\n opacity?: number;\n /** Opaque per-element bag for declared namespaces. See `NamespaceMeta`. */\n meta?: NamespaceMeta;\n}\n\n/**\n * Text leaf node. Mirrors the kit's `TextPose` shape — a bounding box plus\n * text content, optional rich-text `runs` (per-range styling), and an\n * optional `TextStyle` for the node-wide defaults.\n *\n * Note on SVG text geometry: native `<text>` flows from a baseline; it\n * doesn't have width/height attributes. The serializer emits\n * `dominant-baseline=\"text-before-edge\"` so `y` is the top of the text\n * box, plus `data-weasel-width` / `data-weasel-height` so weasel's\n * explicit box dimensions round-trip losslessly. External SVG text\n * (lacking the data-* attrs) imports with estimated dimensions —\n * `width = 99999` (effectively unbounded so wrap doesn't fire) and\n * `height = fontSize * lineHeight * (lineCount || 1)`.\n */\nexport interface SvgTextNode {\n kind: 'text';\n x: number;\n y: number;\n width: number;\n height: number;\n /** Plain text. When `runs` is set, `runsToPlainText(runs)` must equal `text`. */\n text: string;\n /** Optional per-range styling — same shape as `TextPose.runs`. */\n runs?: StyledRun[];\n /** Node-wide style. Defaults applied at render time via `resolveTextStyle`. */\n style?: TextStyle;\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;\n\n/** Options for {@link parseSvg}. */\nexport interface ParseOptions {\n /**\n * Map of prefix → URI for XML namespaces the caller wants surfaced.\n * Attributes / child elements in any declared namespace are collected\n * into `SvgNode.meta` (per element) or `ParseResult.documentMeta` (root).\n * Undeclared namespaces are preserved in the DOM but not promoted into\n * the structured `meta` bag; they are silently dropped at serialize time.\n */\n namespaces?: Record<string, string>;\n}\n\n/** Output of {@link parseSvg}. */\nexport interface ParseResult {\n nodes: SvgNode[];\n /** Non-fatal notices (unsupported elements, unrecognized attributes). */\n warnings: string[];\n /**\n * Opaque per-document bag for declared namespaces. Holds root-level\n * namespaced attributes (`documentMeta.<prefix>.attrs`) and namespaced\n * root children (`documentMeta.<prefix>.elements`).\n */\n documentMeta?: NamespaceMeta;\n /** Root `viewBox` attribute, parsed from `\"x y width height\"`. */\n viewBox?: { x: number; y: number; width: number; height: number };\n /** Root `width` attribute, parsed as a unitless number when present. */\n width?: number;\n /** Root `height` attribute, parsed as a unitless number when present. */\n height?: number;\n /** Text content of the first `<title>` child of `<svg>`, when present. */\n title?: string;\n}\n\n/** Options for {@link serializeSvg}. */\nexport interface SerializeOptions {\n /**\n * Override the root `viewBox`. When omitted, the serializer computes\n * a tight bounding box from the supplied nodes.\n */\n viewBox?: { x: number; y: number; width: number; height: number };\n /** Emit `width=\"...\"` on the root `<svg>`. */\n width?: number;\n /** Emit `height=\"...\"` on the root `<svg>`. */\n height?: number;\n /**\n * Emit `<title>...</title>` as the first child of the root `<svg>`. The\n * value is XML-escaped on output. Empty strings are skipped.\n */\n title?: string;\n /**\n * Map of prefix → URI for XML namespaces to declare on the root\n * `<svg>`. The serializer reads `documentMeta[prefix]` and\n * `node.meta[prefix]` to write the actual attributes and elements.\n */\n namespaces?: Record<string, string>;\n /**\n * Opaque per-document namespaced extras. Each `<prefix>.attrs` becomes\n * `<prefix>:<name>=\"...\"` attributes on the root `<svg>`. Each\n * `<prefix>.elements[localName]` becomes `<prefix>:<localName>...>`\n * children placed immediately before any geometry.\n */\n documentMeta?: NamespaceMeta;\n /** Pretty-print with newlines + indentation. Default `false`. */\n pretty?: boolean;\n}\n","/**\n * SVG transform attribute helpers. Parses the four primitive transform\n * functions weasel-svg supports (`matrix`, `translate`, `scale`, `rotate`)\n * into a single 2x3 affine matrix, and exposes the point/path mappers we\n * need to collapse `transform=` onto leaf geometry at parse time.\n */\n\nimport type { Matrix } from './types';\nimport { IDENTITY_MATRIX } from './types';\n\n/** Multiply two 2x3 affine matrices (a then b applied to a column vector). */\nexport function multiply(a: Matrix, b: Matrix): Matrix {\n // [a0 a2 a4] [b0 b2 b4]\n // [a1 a3 a5] [b1 b3 b5]\n return [\n a[0] * b[0] + a[2] * b[1],\n a[1] * b[0] + a[3] * b[1],\n a[0] * b[2] + a[2] * b[3],\n a[1] * b[2] + a[3] * b[3],\n a[0] * b[4] + a[2] * b[5] + a[4],\n a[1] * b[4] + a[3] * b[5] + a[5],\n ];\n}\n\n/** Apply a 2x3 affine to a 2D point. */\nexport function applyMatrix(m: Matrix, x: number, y: number): { x: number; y: number } {\n return { x: m[0] * x + m[2] * y + m[4], y: m[1] * x + m[3] * y + m[5] };\n}\n\n/** True if `m` is the identity within a small epsilon. */\nexport function isIdentity(m: Matrix, eps = 1e-9): boolean {\n return (\n Math.abs(m[0] - 1) < eps &&\n Math.abs(m[1]) < eps &&\n Math.abs(m[2]) < eps &&\n Math.abs(m[3] - 1) < eps &&\n Math.abs(m[4]) < eps &&\n Math.abs(m[5]) < eps\n );\n}\n\nconst NUM_RE = /[-+]?(?:\\d*\\.\\d+|\\d+\\.?)(?:[eE][-+]?\\d+)?/g;\n\nfunction readNumbers(s: string): number[] {\n const out: number[] = [];\n const matches = s.match(NUM_RE);\n if (!matches) return out;\n for (const m of matches) {\n const n = Number(m);\n if (Number.isFinite(n)) out.push(n);\n }\n return out;\n}\n\n/**\n * Parse an SVG `transform=\"...\"` string into a single 2x3 matrix.\n * Functions compose right-to-left in SVG's coordinate model: in\n * `transform=\"A B\"`, the rightmost function is applied first to a point's\n * local coordinates. We accumulate accordingly: `result = result * fn`.\n *\n * Unrecognized functions emit a warning via the optional callback and are\n * skipped (the rest of the transform list still applies).\n */\nexport function parseTransform(\n attr: string | null | undefined,\n onWarn?: (message: string) => void,\n): Matrix {\n if (!attr) return IDENTITY_MATRIX;\n let result: Matrix = IDENTITY_MATRIX;\n // Split into \"name(args)\" chunks.\n const fnRe = /([A-Za-z]+)\\s*\\(([^)]*)\\)/g;\n let match: RegExpExecArray | null;\n while ((match = fnRe.exec(attr)) !== null) {\n const name = match[1].toLowerCase();\n const nums = readNumbers(match[2]);\n let local: Matrix | null = null;\n if (name === 'matrix' && nums.length >= 6) {\n local = [nums[0], nums[1], nums[2], nums[3], nums[4], nums[5]];\n } else if (name === 'translate') {\n const tx = nums[0] ?? 0;\n const ty = nums[1] ?? 0;\n local = [1, 0, 0, 1, tx, ty];\n } else if (name === 'scale') {\n const sx = nums[0] ?? 1;\n const sy = nums.length >= 2 ? nums[1] : sx;\n local = [sx, 0, 0, sy, 0, 0];\n } else if (name === 'rotate') {\n const ang = ((nums[0] ?? 0) * Math.PI) / 180;\n const c = Math.cos(ang);\n const s = Math.sin(ang);\n const rot: Matrix = [c, s, -s, c, 0, 0];\n if (nums.length >= 3) {\n // rotate(angle, cx, cy) = translate(cx,cy) * rotate * translate(-cx,-cy)\n const cx = nums[1];\n const cy = nums[2];\n local = multiply(multiply([1, 0, 0, 1, cx, cy], rot), [1, 0, 0, 1, -cx, -cy]);\n } else {\n local = rot;\n }\n } else if (name === 'skewx' || name === 'skewy') {\n const ang = ((nums[0] ?? 0) * Math.PI) / 180;\n const t = Math.tan(ang);\n local = name === 'skewx' ? [1, 0, t, 1, 0, 0] : [1, t, 0, 1, 0, 0];\n } else {\n onWarn?.(`unsupported transform function: ${name}`);\n continue;\n }\n result = multiply(result, local);\n }\n return result;\n}\n\n/** Try to factor `m` as \"rotation by theta about (cx, cy)\". Returns the\n * angle in radians when `m` is (within `eps`) a pure rotation about the\n * given pivot. Returns `null` otherwise.\n *\n * Pure rotation about (cx, cy) has the matrix form:\n * [ cos -sin cx - cx*cos + cy*sin ]\n * [ sin cos cy - cx*sin - cy*cos ]\n * i.e. m[0] = m[3] = cos, m[1] = -m[2] = sin, with a translation that\n * equals the pivot's \"rotate-then-translate-back\" residue. We reconstruct\n * theta from atan2(m[1], m[0]) and verify the rest.\n */\nexport function decomposeRotation(\n m: Matrix,\n cx: number,\n cy: number,\n eps = 1e-4,\n): number | null {\n const [a, b, c, d, e, f] = m;\n // Pure rotation requires a == d and b == -c.\n if (Math.abs(a - d) > eps) return null;\n if (Math.abs(b + c) > eps) return null;\n // Determinant must be 1 (no scale, no flip).\n const det = a * d - b * c;\n if (Math.abs(det - 1) > eps) return null;\n const theta = Math.atan2(b, a);\n // Verify translation = (cx - cx*cos + cy*sin, cy - cx*sin - cy*cos).\n const expectedE = cx - cx * a + cy * b;\n const expectedF = cy - cx * b - cy * a;\n if (Math.abs(e - expectedE) > eps) return null;\n if (Math.abs(f - expectedF) > eps) return null;\n return theta;\n}\n\n/** Best-effort rotational-component extraction for a general matrix (any\n * scale + rotation, ignoring translation). Used for parse-time warnings\n * on un-decomposable matrices: we can detect \"there is a rotation here\"\n * even if we won't preserve it as `node.rotation`. For a non-uniform\n * matrix the \"rotation\" is ambiguous; we report atan2(b, a) which\n * corresponds to where the +x basis vector points.\n */\nexport function rotationComponent(m: Matrix): number {\n return Math.atan2(m[1], m[0]);\n}\n\n/**\n * Format a matrix as an SVG `matrix(a b c d e f)` value. Returns `null`\n * when `m` is (effectively) the identity, so the caller can omit the\n * attribute entirely.\n */\nexport function formatMatrix(m: Matrix): string | null {\n if (isIdentity(m)) return null;\n return `matrix(${m.map((n) => trimNumber(n)).join(' ')})`;\n}\n\n/** Trim trailing zeros from a numeric value for compact SVG output. */\nexport function trimNumber(n: number): string {\n if (!Number.isFinite(n)) return '0';\n // Round to ~6 decimal places to avoid floating-point cruft.\n const r = Math.round(n * 1e6) / 1e6;\n if (Number.isInteger(r)) return String(r);\n return String(r);\n}\n","/**\n * Lower SVG primitive elements (`<rect>`, `<circle>`, `<ellipse>`,\n * `<line>`, `<polyline>`, `<polygon>`) to weasel `Path` values. Each\n * helper applies an optional 2x3 affine matrix to the resulting geometry\n * so the caller can collapse `<g transform=\"...\">` onto leaves.\n *\n * Ellipses and rounded rects use the standard 4-segment cubic Bezier\n * approximation with control offset `k = 4*(sqrt(2)-1)/3 ≈ 0.5523`.\n */\n\nimport {\n PATH_C, PATH_L, PATH_M, PATH_Q, PATH_Z,\n PathBuilder,\n type Path,\n type PolygonPath,\n type RectPath,\n} from '@weasel-js/core';\nimport type { Matrix } from './types';\nimport { IDENTITY_MATRIX } from './types';\nimport { applyMatrix, isIdentity } from './transform';\n\n/** Magic constant: cubic Bezier control offset for a quarter-circle of radius 1. */\nconst KAPPA = (4 * (Math.sqrt(2) - 1)) / 3;\n\n/** True when `m` represents a pure axis-aligned scale + translate. */\nfunction isAxisAlignedScale(m: Matrix, eps = 1e-9): boolean {\n return Math.abs(m[1]) < eps && Math.abs(m[2]) < eps;\n}\n\n/**\n * Apply a 2x3 affine to a `Path`. RectPaths whose matrix is identity or\n * an axis-aligned scale+translate stay as `RectPath`; anything else (any\n * rotation/skew, or any PolygonPath input) is promoted to a `PolygonPath`\n * via a coords-level remap.\n */\nexport function transformPath(path: Path, m: Matrix): Path {\n if (isIdentity(m)) return path;\n if (path.kind === 'rect') {\n if (isAxisAlignedScale(m)) {\n const a = m[0], d = m[3], e = m[4], f = m[5];\n let x = path.x * a + e;\n let y = path.y * d + f;\n let w = path.width * a;\n let h = path.height * d;\n if (w < 0) { x += w; w = -w; }\n if (h < 0) { y += h; h = -h; }\n return { kind: 'rect', x, y, width: w, height: h };\n }\n // Promote to polygon, then transform.\n return transformPath(rectToPolygon(path), m);\n }\n // PolygonPath: remap every coord pair. Step counts are command-dependent\n // and all the supported commands store coord pairs, so a flat stride-2\n // walk is correct.\n const xs = path.coords;\n const out = new Float32Array(xs.length);\n for (let i = 0; i < xs.length; i += 2) {\n const p = applyMatrix(m, xs[i], xs[i + 1]);\n out[i] = p.x;\n out[i + 1] = p.y;\n }\n return {\n kind: 'polygon',\n commands: new Uint8Array(path.commands),\n coords: out,\n fillRule: path.fillRule,\n };\n}\n\nfunction rectToPolygon(r: RectPath): PolygonPath {\n const b = new PathBuilder();\n b.moveTo(r.x, r.y);\n b.lineTo(r.x + r.width, r.y);\n b.lineTo(r.x + r.width, r.y + r.height);\n b.lineTo(r.x, r.y + r.height);\n b.close();\n return b.build();\n}\n\n/**\n * `<rect x y width height rx ry>` → Path. Returns a `RectPath` when there\n * are no corner radii (and matrix is benign); otherwise lowers to a\n * polygon with cubic-curve corners.\n */\nexport function rectElementToPath(\n x: number, y: number, width: number, height: number,\n rx: number, ry: number,\n m: Matrix = IDENTITY_MATRIX,\n): Path {\n if (rx <= 0 && ry <= 0) {\n return transformPath({ kind: 'rect', x, y, width, height }, m);\n }\n const r = Math.min(Math.max(rx, ry), Math.min(width, height) / 2);\n const r2 = Math.min(rx > 0 ? rx : r, ry > 0 ? ry : r, Math.min(width, height) / 2);\n // For simplicity treat rx === ry === r2. Independent rx/ry can be\n // added later; weasel doesn't have a rounded-rect primitive anyway.\n const rad = r2;\n const k = KAPPA * rad;\n const x2 = x + width;\n const y2 = y + height;\n const b = new PathBuilder();\n b.moveTo(x + rad, y);\n b.lineTo(x2 - rad, y);\n b.curveTo(x2 - rad + k, y, x2, y + rad - k, x2, y + rad);\n b.lineTo(x2, y2 - rad);\n b.curveTo(x2, y2 - rad + k, x2 - rad + k, y2, x2 - rad, y2);\n b.lineTo(x + rad, y2);\n b.curveTo(x + rad - k, y2, x, y2 - rad + k, x, y2 - rad);\n b.lineTo(x, y + rad);\n b.curveTo(x, y + rad - k, x + rad - k, y, x + rad, y);\n b.close();\n return transformPath(b.build(), m);\n}\n\n/** `<ellipse cx cy rx ry>` → PolygonPath (4 cubic segments). */\nexport function ellipseToPath(\n cx: number, cy: number, rx: number, ry: number,\n m: Matrix = IDENTITY_MATRIX,\n): Path {\n const kx = KAPPA * rx;\n const ky = KAPPA * ry;\n const b = new PathBuilder();\n b.moveTo(cx + rx, cy);\n b.curveTo(cx + rx, cy + ky, cx + kx, cy + ry, cx, cy + ry);\n b.curveTo(cx - kx, cy + ry, cx - rx, cy + ky, cx - rx, cy);\n b.curveTo(cx - rx, cy - ky, cx - kx, cy - ry, cx, cy - ry);\n b.curveTo(cx + kx, cy - ry, cx + rx, cy - ky, cx + rx, cy);\n b.close();\n return transformPath(b.build(), m);\n}\n\n/** `<circle cx cy r>` → ellipse with rx === ry. */\nexport function circleToPath(\n cx: number, cy: number, r: number, m: Matrix = IDENTITY_MATRIX,\n): Path {\n return ellipseToPath(cx, cy, r, r, m);\n}\n\n/** `<line x1 y1 x2 y2>` → open 2-anchor polygon. */\nexport function lineToPath(\n x1: number, y1: number, x2: number, y2: number,\n m: Matrix = IDENTITY_MATRIX,\n): Path {\n const b = new PathBuilder();\n b.moveTo(x1, y1);\n b.lineTo(x2, y2);\n return transformPath(b.build(), m);\n}\n\n/** Parse SVG `points=\"x1,y1 x2,y2 ...\"` to a flat list. */\nexport function parsePoints(raw: string): { x: number; y: number }[] {\n const out: { x: number; y: number }[] = [];\n const nums = raw.match(/[-+]?(?:\\d*\\.\\d+|\\d+\\.?)(?:[eE][-+]?\\d+)?/g);\n if (!nums) return out;\n for (let i = 0; i + 1 < nums.length; i += 2) {\n out.push({ x: parseFloat(nums[i]), y: parseFloat(nums[i + 1]) });\n }\n return out;\n}\n\n/** `<polyline points=\"...\">` → open polygon. */\nexport function polylineToPath(\n points: readonly { x: number; y: number }[],\n m: Matrix = IDENTITY_MATRIX,\n): Path {\n if (points.length === 0) {\n return { kind: 'polygon', commands: new Uint8Array(), coords: new Float32Array(), fillRule: 'nonzero' };\n }\n const b = new PathBuilder();\n b.moveTo(points[0].x, points[0].y);\n for (let i = 1; i < points.length; i++) b.lineTo(points[i].x, points[i].y);\n return transformPath(b.build(), m);\n}\n\n/** `<polygon points=\"...\">` → closed polygon. */\nexport function polygonToPath(\n points: readonly { x: number; y: number }[],\n m: Matrix = IDENTITY_MATRIX,\n): Path {\n if (points.length === 0) {\n return { kind: 'polygon', commands: new Uint8Array(), coords: new Float32Array(), fillRule: 'nonzero' };\n }\n const b = new PathBuilder();\n b.moveTo(points[0].x, points[0].y);\n for (let i = 1; i < points.length; i++) b.lineTo(points[i].x, points[i].y);\n b.close();\n return transformPath(b.build(), m);\n}\n\n// Re-export the path opcodes for any callers that want to introspect.\nexport { PATH_M, PATH_L, PATH_C, PATH_Q, PATH_Z };\n","/**\n * SVG color / paint parsing. Handles the SVG-specific paint surface — the\n * sentinel `none`, `url(#id)` paint-server references, and `currentColor` —\n * then delegates the actual color tokenization (hex, `rgb()`/`rgba()`,\n * `hsl()`, and the full CSS named-color table) to the kit's `parseColor`.\n * Output is normalized to `#rrggbb` plus a separate 0..1 alpha so the rest\n * of the pipeline doesn't have to know about the encoding variants.\n */\n\nimport { parseColor, rgbaToHex } from '@weasel-js/core';\n\n/** Result of parsing a `fill=` / `stroke=` attribute value. */\nexport type ParsedColor =\n | { kind: 'none' }\n | { kind: 'solid'; color: string; alpha: number }\n | { kind: 'ref'; id: string };\n\n/**\n * Parse an SVG paint string. Returns `null` for inputs we don't recognize\n * (so the caller can emit a warning and fall back). `currentColor` resolves\n * to black here as a last-resort default; callers that participate in the\n * cascade (`readPaint`, `readTextStyle`, `readTspanRun`) pre-resolve\n * `currentColor` against the inherited `color` via `resolveCurrentColor`\n * before this function ever sees it.\n */\nexport function parsePaintAttr(raw: string | null | undefined): ParsedColor | null {\n if (raw == null) return null;\n const s = raw.trim();\n if (s === '') return null;\n if (s === 'none') return { kind: 'none' };\n if (s === 'currentColor' || s === 'currentcolor') {\n return { kind: 'solid', color: '#000000', alpha: 1 };\n }\n // url(#id) reference.\n const urlMatch = /^url\\(\\s*#([^)\\s]+)\\s*\\)/.exec(s);\n if (urlMatch) return { kind: 'ref', id: urlMatch[1] };\n // Everything else — hex, rgb()/rgba(), hsl()/hsla(), and named colors —\n // goes through the kit's CSS parser. It throws on unrecognized input;\n // we translate that into the `null` the caller expects.\n try {\n const [r, g, b, a] = parseColor(s);\n // Split into the `#rrggbb` + 0..1 alpha contract the rest of the SVG\n // pipeline depends on. `rgbaToHex` of a 3-tuple always emits 6-char,\n // lowercase hex; the alpha is carried separately.\n return { kind: 'solid', color: rgbaToHex([r, g, b]), alpha: a };\n } catch {\n return null;\n }\n}\n","/**\n * Map between SVG `<linearGradient>` / `<radialGradient>` elements and\n * weasel's `FillStyle` gradient variants. We collect gradients from\n * `<defs>` during parse and look them up by id 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 type { FillStyle, GradStop } from '@weasel-js/core';\nimport { parsePaintAttr } from './color';\nimport { trimNumber } from './transform';\n\n/** Collected gradient definitions, keyed by element id. */\nexport type GradientTable = Map<string, FillStyle>;\n\n/** Read the children of `<defs>` and extract supported gradient nodes. */\nexport function collectGradients(svg: Element, onWarn?: (m: string) => void): GradientTable {\n const out: GradientTable = new Map();\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 const id = child.getAttribute('id');\n if (!id) continue;\n if (tag === 'lineargradient') {\n const paint = readLinearGradient(child, onWarn);\n if (paint) out.set(id, paint);\n } else if (tag === 'radialgradient') {\n const paint = readRadialGradient(child, onWarn);\n if (paint) out.set(id, paint);\n } else if (tag !== 'lineargradient' && tag !== 'radialgradient') {\n onWarn?.(`unsupported <defs> child: <${child.tagName}>`);\n }\n }\n }\n return out;\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 = c.getAttribute('offset') ?? '0';\n const offset = offsetRaw.endsWith('%')\n ? parseFloat(offsetRaw) / 100\n : parseFloat(offsetRaw);\n const colorAttr = c.getAttribute('stop-color') ?? '#000000';\n const parsed = parsePaintAttr(colorAttr);\n if (parsed && parsed.kind === 'solid') {\n const opacityAttr = c.getAttribute('stop-opacity');\n const alpha = opacityAttr != null ? parseFloat(opacityAttr) : 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\nfunction readLinearGradient(el: Element, onWarn?: (m: string) => void): FillStyle | null {\n const x1 = parseFloat(el.getAttribute('x1') ?? '0');\n const y1 = parseFloat(el.getAttribute('y1') ?? '0');\n const x2 = parseFloat(el.getAttribute('x2') ?? '1');\n const y2 = parseFloat(el.getAttribute('y2') ?? '0');\n const stops = readStops(el, onWarn);\n return {\n fill: 'linear-gradient',\n from: { x: x1, y: y1 },\n to: { x: x2, y: y2 },\n stops,\n };\n}\n\nfunction readRadialGradient(el: Element, onWarn?: (m: string) => void): FillStyle | null {\n const cx = parseFloat(el.getAttribute('cx') ?? '0.5');\n const cy = parseFloat(el.getAttribute('cy') ?? '0.5');\n const r = parseFloat(el.getAttribute('r') ?? '0.5');\n const stops = readStops(el, onWarn);\n return {\n fill: 'radial-gradient',\n center: { x: cx, y: cy },\n radius: r,\n stops,\n };\n}\n\n/**\n * Pre-pass that assigns stable serialization ids to gradients used by\n * any leaf in the tree. We key on object identity so two leaves sharing\n * the exact same `FillStyle` reference reuse one `<defs>` entry; structurally\n * equal but distinct objects get separate ids.\n */\nexport class GradientRegistry {\n private byPaint = new Map<FillStyle, string>();\n private order: FillStyle[] = [];\n private counter = 0;\n\n register(paint: FillStyle): string {\n const existing = this.byPaint.get(paint);\n if (existing) return existing;\n const id = `grad${this.counter++}`;\n this.byPaint.set(paint, id);\n this.order.push(paint);\n return id;\n }\n\n /** Emit `<defs>...</defs>` XML for all registered gradients. */\n toDefsXml(): string {\n if (this.order.length === 0) return '';\n const parts: string[] = ['<defs>'];\n for (const paint of this.order) {\n const id = this.byPaint.get(paint)!;\n parts.push(gradientXml(id, paint));\n }\n parts.push('</defs>');\n return parts.join('');\n }\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=\"userSpaceOnUse\" ` +\n `x1=\"${trimNumber(paint.from.x)}\" y1=\"${trimNumber(paint.from.y)}\" ` +\n `x2=\"${trimNumber(paint.to.x)}\" y2=\"${trimNumber(paint.to.y)}\">${stops}</linearGradient>`\n );\n }\n if (paint.fill === 'radial-gradient') {\n const stops = paint.stops.map(stopXml).join('');\n return (\n `<radialGradient id=\"${id}\" gradientUnits=\"userSpaceOnUse\" ` +\n `cx=\"${trimNumber(paint.center.x)}\" cy=\"${trimNumber(paint.center.y)}\" ` +\n `r=\"${trimNumber(paint.radius)}\">${stops}</radialGradient>`\n );\n }\n return '';\n}\n\nfunction stopXml(s: GradStop): string {\n // Detect packed-alpha hex (#rrggbbaa) and split out stop-opacity.\n const m = /^#([0-9a-f]{6})([0-9a-f]{2})$/i.exec(s.color);\n if (m) {\n const alpha = parseInt(m[2], 16) / 255;\n return `<stop offset=\"${trimNumber(s.offset)}\" stop-color=\"#${m[1].toLowerCase()}\" stop-opacity=\"${trimNumber(alpha)}\"/>`;\n }\n return `<stop offset=\"${trimNumber(s.offset)}\" stop-color=\"${s.color}\"/>`;\n}\n","/**\n * SVG presentation-attribute cascade.\n *\n * Most SVG paint/text properties inherit down the element tree. Rather than\n * re-walking the DOM parent chain per attribute at leaf-emit time, the parser\n * threads a resolved `StyleContext` down through the recursion (alongside the\n * transform matrix): at each element we fold the element's own attributes onto\n * the inherited cascade once, and leaves read resolved values directly.\n */\n\n/**\n * Raw resolved value of each inheritable presentation property in effect at a\n * point in the tree. An absent key means the property is unset all the way up,\n * and the consumer applies its own default (matching the pre-cascade\n * `readInheritedAttr` → null contract). Values are raw SVG strings; callers\n * parse them (color, number, keyword, …).\n */\nexport type StyleContext = Readonly<Record<string, string>>;\n\n/** The empty cascade — seeds the root. */\nexport const EMPTY_STYLE: StyleContext = {};\n\n/**\n * Inheritable presentation properties the leaf/text parsers consume. Extend\n * this list (and teach the consuming leaf to read the new key) to inherit a\n * new property — no per-attribute DOM walk required.\n */\nconst INHERITABLE = [\n 'fill', 'fill-opacity', 'fill-rule',\n 'stroke', 'stroke-width', 'stroke-opacity',\n 'stroke-linecap', 'stroke-linejoin', 'stroke-dasharray', 'stroke-miterlimit',\n 'color',\n 'font-size', 'font-family', 'font-weight', 'font-style', 'text-anchor',\n 'letter-spacing', 'text-decoration',\n] as const;\n\n/**\n * Extract a single `style=\"prop:value\"` declaration. Returns the trimmed value\n * or null when absent. Regex scan — not a full CSS parser; no `!important`.\n */\nexport function readStyleProp(el: Element, prop: string): string | null {\n const style = el.getAttribute('style');\n if (!style) return null;\n const re = new RegExp(`(?:^|;)\\\\s*${prop}\\\\s*:\\\\s*([^;]+)`, 'i');\n const m = re.exec(style);\n if (!m) return null;\n return m[1].trim();\n}\n\n/**\n * Resolve an element's own value for a property: `style=\"\"` beats the\n * presentation attribute on the same element (SVG2 specificity).\n */\nexport function ownProp(el: Element, prop: string): string | null {\n return readStyleProp(el, prop) ?? el.getAttribute(prop);\n}\n\n/**\n * Fold an element's own presentation attributes onto the inherited cascade.\n * A property that is absent or literally `inherit` keeps the parent value;\n * any other own value overrides. Returns the parent unchanged (same object)\n * when the element sets no inheritable property, avoiding a needless clone.\n */\nexport function deriveStyle(parent: StyleContext, el: Element): StyleContext {\n let next: Record<string, string> | null = null;\n for (const prop of INHERITABLE) {\n const own = ownProp(el, prop);\n if (own == null || own === 'inherit') continue;\n if (!next) next = { ...parent };\n next[prop] = own;\n }\n return next ?? parent;\n}\n\n/**\n * Resolve a paint value that may be the `currentColor` keyword against the\n * cascade's `color`. Non-currentColor values pass through; null passes through.\n * `color`'s SVG initial value is black.\n */\nexport function resolveCurrentColor(raw: string | null, style: StyleContext): string | null {\n if (raw == null) return null;\n if (raw.trim().toLowerCase() === 'currentcolor') return style['color'] ?? '#000000';\n return raw;\n}\n","/**\n * Parse an SVG document string into a `SvgNode[]` tree. Walks the SVG\n * DOM (via the platform's `DOMParser` — jsdom in tests, the browser at\n * runtime) and lowers each supported element to weasel-native shapes.\n *\n * Transforms are pushed onto a matrix stack and collapsed into leaf\n * geometry at the moment a leaf is created, so the output tree never\n * carries `transform` data — even on `<g>` nodes.\n */\n\nimport type { Path, PolygonPath } from '@weasel-js/core';\nimport { PATH_L, PATH_M, PATH_Z, pathFromD } 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,\n} from './types';\nimport type { StyledRun, TextStyle, FillStyle, Stroke } from '@weasel-js/core';\nimport { multiply, parseTransform, decomposeRotation, rotationComponent, isIdentity } from './transform';\nimport { boundsOfPath } from '@weasel-js/core';\nimport { IDENTITY_MATRIX } from './types';\nimport { parsePaintAttr } from './color';\nimport { collectGradients, type GradientTable } from './gradients';\nimport { deriveStyle, EMPTY_STYLE, ownProp, resolveCurrentColor, type StyleContext } from './cascade';\n\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(['defs', 'linearGradient', 'radialGradient', 'title', 'desc', 'metadata']);\n\n/**\n * Public entry point: parse an SVG document string. Errors during DOM\n * parsing produce a `ParseResult` with an empty `nodes` array and a\n * warning describing the issue, rather than throwing.\n */\nexport function parseSvg(svg: string, opts: ParseOptions = {}): ParseResult {\n const warnings: string[] = [];\n const onWarn = (m: string): void => { warnings.push(m); };\n\n let doc: Document;\n try {\n doc = new DOMParser().parseFromString(svg, 'image/svg+xml');\n } catch (e) {\n return { nodes: [], warnings: [`failed to parse SVG: ${(e as Error).message}`] };\n }\n const errEl = doc.getElementsByTagName('parsererror')[0];\n if (errEl) {\n return { nodes: [], warnings: [`SVG parse error: ${errEl.textContent ?? 'unknown'}`] };\n }\n const root = doc.documentElement;\n if (!root || root.tagName.toLowerCase() !== 'svg') {\n return { nodes: [], warnings: ['root element is not <svg>'] };\n }\n\n const namespaces = opts.namespaces ?? {};\n // Build a URI → prefix index for fast lookup during traversal.\n const uriToPrefix = new Map<string, string>();\n for (const [prefix, uri] of Object.entries(namespaces)) {\n uriToPrefix.set(uri, prefix);\n }\n\n const documentMeta = collectDocumentMeta(root, uriToPrefix);\n\n const gradients = collectGradients(root, onWarn);\n const rootStyle = deriveStyle(EMPTY_STYLE, root);\n const nodes = parseChildren(root, IDENTITY_MATRIX, rootStyle, gradients, onWarn, uriToPrefix);\n\n const result: ParseResult = { nodes, warnings };\n if (documentMeta) result.documentMeta = documentMeta;\n const viewBox = parseViewBoxAttr(root.getAttribute('viewBox'));\n if (viewBox) result.viewBox = viewBox;\n const widthAttr = root.getAttribute('width');\n if (widthAttr != null) {\n const n = parseFloat(widthAttr);\n if (Number.isFinite(n)) result.width = n;\n }\n const heightAttr = root.getAttribute('height');\n if (heightAttr != null) {\n const n = parseFloat(heightAttr);\n if (Number.isFinite(n)) result.height = n;\n }\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\nfunction collectDocumentMeta(\n root: Element,\n uriToPrefix: Map<string, string>,\n): NamespaceMeta | undefined {\n if (uriToPrefix.size === 0) return undefined;\n const meta: NamespaceMeta = {};\n\n // Root-level namespaced attributes.\n for (let i = 0; i < root.attributes.length; i++) {\n const a = root.attributes[i];\n if (!a.namespaceURI) continue;\n const prefix = uriToPrefix.get(a.namespaceURI);\n if (!prefix) continue;\n const bucket = (meta[prefix] ??= {});\n (bucket.attrs ??= {})[a.localName] = a.value;\n }\n\n // Root-level namespaced child elements. The body of these is collected\n // recursively as a generic XML-element tree; geometry inside them is NOT\n // promoted to SvgNodes (that's the consumer's job if they want it).\n for (let i = 0; i < root.children.length; i++) {\n const c = root.children[i];\n if (!c.namespaceURI) continue;\n const prefix = uriToPrefix.get(c.namespaceURI);\n if (!prefix) continue;\n const bucket = (meta[prefix] ??= {});\n const elements = (bucket.elements ??= {});\n const list = (elements[c.localName] ??= []);\n list.push(collectNamespacedElement(c, uriToPrefix));\n }\n\n return Object.keys(meta).length > 0 ? meta : undefined;\n}\n\nfunction collectNamespacedElement(\n el: Element,\n uriToPrefix: Map<string, string>,\n): NamespacedElement {\n const result: NamespacedElement = { attrs: {} };\n for (let i = 0; i < el.attributes.length; i++) {\n const a = el.attributes[i];\n // For namespaced *elements* we collect every attribute (namespaced or\n // not) under the element — unlike root attrs where we filter by NS.\n // Treat `xmlns:*` as structural and skip.\n if (a.name.startsWith('xmlns')) continue;\n result.attrs[a.localName] = a.value;\n }\n\n let hasChildElements = false;\n for (let i = 0; i < el.children.length; i++) {\n const c = el.children[i];\n if (!c.namespaceURI) continue;\n const prefix = uriToPrefix.get(c.namespaceURI);\n if (!prefix) continue; // child in undeclared NS: drop\n hasChildElements = true;\n const children = (result.children ??= {});\n const list = (children[c.localName] ??= []);\n list.push(collectNamespacedElement(c, uriToPrefix));\n }\n\n if (!hasChildElements && el.textContent != null && el.textContent.trim() !== '') {\n result.text = el.textContent;\n }\n\n return result;\n}\n\n/** Per-element namespace meta: walked at every parsed SVG element. */\nfunction collectElementMeta(\n el: Element,\n uriToPrefix: Map<string, string>,\n): NamespaceMeta | undefined {\n if (uriToPrefix.size === 0) return undefined;\n const meta: NamespaceMeta = {};\n for (let i = 0; i < el.attributes.length; i++) {\n const a = el.attributes[i];\n if (!a.namespaceURI) continue;\n const prefix = uriToPrefix.get(a.namespaceURI);\n if (!prefix) continue;\n const bucket = (meta[prefix] ??= {});\n (bucket.attrs ??= {})[a.localName] = a.value;\n }\n // Namespaced child elements on a *standard* SVG element (e.g. a <g>) are\n // also surfaced under elements[] in the same shape used at the root.\n for (let i = 0; i < el.children.length; i++) {\n const c = el.children[i];\n if (!c.namespaceURI) continue;\n const prefix = uriToPrefix.get(c.namespaceURI);\n if (!prefix) continue;\n const bucket = (meta[prefix] ??= {});\n const elements = (bucket.elements ??= {});\n const list = (elements[c.localName] ??= []);\n list.push(collectNamespacedElement(c, uriToPrefix));\n }\n return Object.keys(meta).length > 0 ? meta : undefined;\n}\n\nfunction parseChildren(\n parent: Element,\n ctm: Matrix,\n style: StyleContext,\n gradients: GradientTable,\n onWarn: (m: string) => void,\n uriToPrefix: Map<string, string>,\n): SvgNode[] {\n const out: SvgNode[] = [];\n for (let i = 0; i < parent.children.length; i++) {\n const el = parent.children[i];\n // Skip namespaced children — they belong to `meta.elements`, not nodes.\n // (DOM gives SVG-native elements `http://www.w3.org/2000/svg`.)\n const ns = el.namespaceURI;\n if (ns && ns !== 'http://www.w3.org/2000/svg') continue;\n const node = parseElement(el, ctm, style, gradients, onWarn, uriToPrefix);\n if (node) {\n if (Array.isArray(node)) out.push(...node);\n else out.push(node);\n }\n }\n return out;\n}\n\nfunction parseElement(\n el: Element,\n ctm: Matrix,\n style: StyleContext,\n gradients: GradientTable,\n onWarn: (m: string) => void,\n uriToPrefix: Map<string, string>,\n): SvgNode | SvgNode[] | null {\n const tag = el.tagName.toLowerCase();\n if (IGNORED_TAGS.has(tag)) return null;\n if (tag === 'g') {\n const local = parseTransform(el.getAttribute('transform'), onWarn);\n const childCtm = multiply(ctm, local);\n const childStyle = deriveStyle(style, el);\n const children = parseChildren(el, childCtm, childStyle, gradients, onWarn, uriToPrefix);\n const opacity = readOpacityAttr(el, 'opacity');\n const group: SvgNode = { kind: 'group', children };\n if (opacity != null) group.opacity = opacity;\n const meta = collectElementMeta(el, uriToPrefix);\n if (meta) group.meta = meta;\n return group;\n }\n if (SUPPORTED_GROUP_TAGS.has(tag)) {\n // Nested <svg> — transparent group; inheritance flows through it.\n const childStyle = deriveStyle(style, el);\n return parseChildren(el, ctm, childStyle, gradients, onWarn, uriToPrefix);\n }\n if (tag === 'text') {\n const textNode = parseTextElement(el, ctm, style, gradients, onWarn);\n if (textNode && !Array.isArray(textNode) && textNode.kind === 'text') {\n const meta = collectElementMeta(el, uriToPrefix);\n if (meta) textNode.meta = meta;\n }\n return textNode;\n }\n if (!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 const bounds = pathAabb(path);\n const cx = bounds.x + bounds.width / 2;\n const cy = bounds.y + bounds.height / 2;\n const angle = decomposeRotation(localTransform, cx, cy);\n if (angle != null) {\n rotation = angle;\n } else {\n // Bake the matrix in — match legacy behavior.\n path = transformPath(path, localTransform);\n const rotComp = rotationComponent(localTransform);\n if (Math.abs(rotComp) > 1e-4) {\n onWarn(`leaf transform has a rotational component that can't be cleanly stored as rotation; baked into geometry (may not round-trip identically)`);\n }\n }\n }\n const leafStyle = deriveStyle(style, el);\n const fill = readPaint(leafStyle, 'fill', '#000000', gradients, onWarn);\n const stroke = readStroke(leafStyle, gradients, onWarn);\n const opacity = readOpacityAttr(el, 'opacity');\n // `fill-rule` defaults to `nonzero`; only stamp when explicitly `evenodd`\n // and the lowered geometry is a PolygonPath (RectPath has no fillRule slot).\n const fillRuleRaw = leafStyle['fill-rule'] ?? null;\n if (fillRuleRaw === 'evenodd' && path.kind === 'polygon') {\n path = { ...path, fillRule: 'evenodd' };\n }\n const node: SvgPathNode = { kind: 'path', path, fill };\n if (stroke) node.stroke = stroke;\n if (opacity != null) node.opacity = opacity;\n if (rotation != null) node.rotation = rotation;\n // Lines are stroke-only by SVG convention; force fill=none if neither the\n // line nor an ancestor group specifies a fill.\n if (tag === 'line' && (leafStyle['fill'] ?? null) == null) {\n node.fill = { kind: 'none' };\n }\n if (tag === 'polyline' && !el.hasAttribute('fill')) {\n // <polyline> defaults to fill=black per spec but the common-case\n // intent is stroke-only. Match the spec default to preserve\n // round-trip honesty; callers can override.\n }\n const meta = collectElementMeta(el, uriToPrefix);\n if (meta) node.meta = meta;\n return node;\n}\n\nfunction lowerLeaf(\n el: Element,\n tag: string,\n m: Matrix,\n onWarn: (msg: string) => void,\n): Path | null {\n const num = (name: string, fallback = 0): number => {\n const v = el.getAttribute(name);\n if (v == null) return fallback;\n const n = parseFloat(v);\n return Number.isFinite(n) ? n : fallback;\n };\n if (tag === 'rect') {\n const x = num('x', 0);\n const y = num('y', 0);\n const w = num('width', 0);\n const h = num('height', 0);\n const rx = num('rx', 0);\n const ry = num('ry', 0);\n return rectElementToPath(x, y, w, h, rx, ry, m);\n }\n if (tag === 'circle') return circleToPath(num('cx'), num('cy'), num('r'), m);\n if (tag === 'ellipse') return ellipseToPath(num('cx'), num('cy'), num('rx'), num('ry'), m);\n if (tag === 'line') return lineToPath(num('x1'), num('y1'), num('x2'), num('y2'), m);\n if (tag === 'polyline') return polylineToPath(parsePoints(el.getAttribute('points') ?? ''), m);\n if (tag === 'polygon') return polygonToPath(parsePoints(el.getAttribute('points') ?? ''), m);\n if (tag === 'path') {\n const d = el.getAttribute('d') ?? '';\n if (!d.trim()) {\n onWarn('<path> with empty d=');\n return null;\n }\n const raw = pathFromD(d, onWarn);\n const transformed = transformPath(raw, m);\n // Reconstitute axis-aligned rectangles so a `{ kind: 'rect' }` source\n // node round-trips back into a `{ kind: 'rect' }` parsed node.\n if (transformed.kind === 'polygon') {\n const rect = polygonToRectIfAxisAligned(transformed);\n if (rect) return rect;\n }\n return transformed;\n }\n return null;\n}\n\n/**\n * Detect a polygon whose 4 vertices form an axis-aligned rectangle (in\n * the canonical `M L L L Z` order produced by our serializer), and\n * reconstitute it as a `RectPath`. Returns null on any deviation.\n */\nfunction polygonToRectIfAxisAligned(p: PolygonPath): Path | null {\n const cmds = p.commands;\n if (cmds.length !== 5) return null;\n if (cmds[0] !== PATH_M) return null;\n if (cmds[1] !== PATH_L || cmds[2] !== PATH_L || cmds[3] !== PATH_L) return null;\n if (cmds[4] !== PATH_Z) return null;\n const c = p.coords;\n if (c.length !== 8) return null;\n const x0 = c[0], y0 = c[1];\n const x1 = c[2], y1 = c[3];\n const x2 = c[4], y2 = c[5];\n const x3 = c[6], y3 = c[7];\n // Axis-aligned rectangle: top edge horizontal, right edge vertical, etc.\n if (y0 !== y1 || x1 !== x2 || y2 !== y3 || x3 !== x0) return null;\n const x = Math.min(x0, x1);\n const y = Math.min(y0, y2);\n const width = Math.abs(x1 - x0);\n const height = Math.abs(y2 - y1);\n if (width === 0 || height === 0) return null;\n return { kind: 'rect', x, y, width, height };\n}\n\n/**\n * Compute a `Path`'s axis-aligned bounding box. Mirrors the helper used by\n * the serializer for rotation pivot resolution; keep the duplication local\n * to parse.ts for now — lift to a shared module if a third call site\n * appears.\n */\nfunction pathAabb(path: Path): { x: number; y: number; width: number; height: number } {\n if (path.kind === 'rect') {\n return { x: path.x, y: path.y, width: path.width, height: path.height };\n }\n return boundsOfPath(path);\n}\n\nfunction readPaint(\n style: StyleContext,\n attr: 'fill' | 'stroke',\n defaultColor: string,\n gradients: GradientTable,\n onWarn: (msg: string) => void,\n): SvgPaint {\n const raw = resolveCurrentColor(style[attr] ?? null, style);\n const opacityRaw = style[`${attr}-opacity`] ?? null;\n const opacity = opacityRaw != null ? clamp01(parseFloat(opacityRaw)) : undefined;\n if (raw == null) {\n if (attr === 'stroke') return { kind: 'none' };\n const out: SvgPaint = { kind: 'solid', color: defaultColor };\n if (opacity != null) (out as { opacity?: number }).opacity = opacity;\n return out;\n }\n const parsed = parsePaintAttr(raw);\n if (!parsed) {\n onWarn(`unrecognized ${attr} value: ${raw}`);\n return { kind: 'solid', color: defaultColor };\n }\n if (parsed.kind === 'none') return { kind: 'none' };\n if (parsed.kind === 'ref') {\n const paint = gradients.get(parsed.id);\n if (!paint) {\n onWarn(`${attr} references unknown gradient #${parsed.id}`);\n return { kind: 'solid', color: defaultColor };\n }\n return { kind: 'gradient', paint };\n }\n const out: SvgPaint = { kind: 'solid', color: parsed.color };\n const a = opacity ?? (parsed.alpha < 1 ? parsed.alpha : undefined);\n if (a != null) (out as { opacity?: number }).opacity = a;\n return out;\n}\n\nfunction readStroke(\n style: StyleContext,\n gradients: GradientTable,\n onWarn: (msg: string) => void,\n): SvgStroke | undefined {\n const inheritedStroke = style['stroke'] ?? null;\n const inheritedWidth = style['stroke-width'] ?? null;\n if (inheritedStroke == null && inheritedWidth == null) return undefined;\n const paint = readPaint(style, 'stroke', '#000000', gradients, onWarn);\n if (paint.kind === 'none') return undefined;\n const width = inheritedWidth != null ? parseFloat(inheritedWidth) : 1;\n const stroke: SvgStroke = { paint, width };\n const opacityRaw = style['stroke-opacity'] ?? null;\n if (opacityRaw != null) {\n const a = clamp01(parseFloat(opacityRaw));\n if (Number.isFinite(a)) stroke.opacity = a;\n }\n const cap = style['stroke-linecap'] ?? null;\n if (cap === 'butt' || cap === 'round' || cap === 'square') {\n stroke.cap = cap;\n } else if (cap != null) {\n onWarn(`unsupported stroke-linecap: ${cap}`);\n }\n const join = style['stroke-linejoin'] ?? null;\n if (join === 'miter' || join === 'round' || join === 'bevel') {\n stroke.join = join;\n } else if (join === 'arcs' || join === 'miter-clip') {\n onWarn(`stroke-linejoin \"${join}\" not supported; falling back to miter`);\n stroke.join = 'miter';\n } else if (join != null) {\n onWarn(`unsupported stroke-linejoin: ${join}`);\n }\n const dashAttr = style['stroke-dasharray'] ?? null;\n if (dashAttr != null && dashAttr.trim() !== '' && dashAttr.trim() !== 'none') {\n const parsed = parseDashArray(dashAttr);\n if (parsed) stroke.dash = parsed;\n else onWarn(`unrecognized stroke-dasharray: ${dashAttr}`);\n }\n const miterAttr = style['stroke-miterlimit'] ?? null;\n if (miterAttr != null) {\n const m = parseFloat(miterAttr);\n if (Number.isFinite(m) && m >= 1) stroke.miterLimit = m;\n else onWarn(`unrecognized stroke-miterlimit: ${miterAttr}`);\n }\n 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 = [\n 'stroke', 'stroke-width', 'stroke-opacity', 'stroke-linecap',\n 'stroke-linejoin', 'stroke-dasharray', 'stroke-miterlimit',\n] as const;\n\nfunction ownStrokeStyle(el: Element): StyleContext {\n const out: Record<string, string> = {};\n for (const k of STROKE_KEYS) {\n const v = ownProp(el, k);\n if (v != null) out[k] = v;\n }\n return out;\n}\n\n/**\n * Lower an {@link SvgStroke} to the kit's `Stroke`, whose paint is a\n * `FillStyle` rather than an `SvgPaint`. Returns `undefined` for a stroke\n * that paints nothing, so callers can leave the field absent.\n */\nfunction coreStroke(stroke: SvgStroke | undefined): Stroke | undefined {\n if (!stroke) return undefined;\n let paint: FillStyle;\n if (stroke.paint.kind === 'gradient') {\n paint = stroke.paint.paint;\n } else if (stroke.paint.kind === 'solid') {\n paint = stroke.paint.opacity != null\n ? { fill: 'solid', color: stroke.paint.color, opacity: stroke.paint.opacity }\n : { fill: 'solid', color: stroke.paint.color };\n } else {\n return undefined;\n }\n const out: Stroke = { paint, width: stroke.width };\n if (stroke.cap) out.cap = stroke.cap;\n if (stroke.join) out.join = stroke.join;\n if (stroke.dash) out.dash = stroke.dash;\n if (stroke.miterLimit != null) out.miterLimit = stroke.miterLimit;\n return out;\n}\n\n/**\n * Parse an SVG `stroke-dasharray` value into a non-negative number array.\n * Per spec, odd-length lists are duplicated to make the dash pattern even.\n * Returns null if any token fails to parse as a non-negative finite number.\n */\nfunction parseDashArray(s: string): number[] | null {\n const tokens = s.trim().split(/[\\s,]+/).filter(Boolean);\n if (tokens.length === 0) return null;\n const nums: number[] = [];\n for (const t of tokens) {\n const n = parseFloat(t);\n if (!Number.isFinite(n) || n < 0) return null;\n nums.push(n);\n }\n return nums.length % 2 === 1 ? [...nums, ...nums] : nums;\n}\n\nfunction readOpacityAttr(el: Element, name: string): number | undefined {\n const raw = el.getAttribute(name);\n if (raw == null) return undefined;\n const n = parseFloat(raw);\n return Number.isFinite(n) ? clamp01(n) : undefined;\n}\n\nfunction clamp01(n: number): number {\n return n < 0 ? 0 : n > 1 ? 1 : n;\n}\n\n/**\n * Parse an SVG `letter-spacing` value into world units. Accepts a bare\n * number, a `px` suffix, or the `normal` keyword (→ `undefined`, via the\n * `NaN` from `parseFloat('normal')`). Any other unit suffix (`em`, `%`,\n * `pt`, …) is still numerically coerced — `parseFloat` reads the leading\n * digits — but flagged, since e.g. `0.1em` silently becomes `0.1` world\n * units, off by a factor of the font size.\n */\nfunction parseLetterSpacing(raw: string, onWarn: (m: string) => void): number | undefined {\n const n = parseFloat(raw);\n if (!Number.isFinite(n)) return undefined;\n const unit = /^-?[\\d.]+([a-z%]+)$/i.exec(raw.trim())?.[1]?.toLowerCase();\n if (unit && unit !== 'px') {\n onWarn(`letter-spacing \"${raw}\" uses unit \"${unit}\", which is not converted; treated as ${n} world units`);\n }\n return n;\n}\n\n/**\n * Parse an SVG `text-decoration` value into the two boolean flags the runs\n * model uses. `text-decoration` is a space-separated list of line tokens\n * (`underline`, `line-through`, `overline`, `blink`, `none`), matched\n * case-insensitively per CSS keyword rules; we only model `underline` and\n * `line-through` (→ `strikethrough`) — any other token (including `none`,\n * and unrecognized values like `overline`) is dropped without warning,\n * since it's either the explicit \"no decoration\" case or a decoration kind\n * the runs model has no key for.\n */\nfunction parseTextDecoration(raw: string | null): { underline?: boolean; strikethrough?: boolean } {\n if (raw == null) return {};\n const tokens = raw.trim().toLowerCase().split(/\\s+/);\n const out: { underline?: boolean; strikethrough?: boolean } = {};\n if (tokens.includes('underline')) out.underline = true;\n if (tokens.includes('line-through')) out.strikethrough = true;\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 */\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, gradients, onWarn);\n const fontSize = textStyle.fontSize ?? 16;\n const lineHeight = textStyle.lineHeight ?? 1.2;\n\n const dominantBaseline = el.getAttribute('dominant-baseline');\n const explicitTopAnchor = dominantBaseline === 'text-before-edge'\n || dominantBaseline === 'hanging';\n // If serialized by us, `y` is already the top edge. Otherwise SVG's\n // default is `y` = baseline of the first line — shift up by one\n // line of cap-height so weasel's box top approximates the cap-line.\n const topY = explicitTopAnchor ? ay : ay - fontSize;\n\n // Walk children: text nodes become plain run text; <tspan> elements\n // become StyledRuns with their attribute overrides applied.\n const runs: StyledRun[] = [];\n let plain = '';\n for (let i = 0; i < el.childNodes.length; i++) {\n const child = el.childNodes[i];\n if (child.nodeType === 3 /* TEXT_NODE */) {\n const t = child.textContent ?? '';\n if (!t) continue;\n runs.push({ text: t });\n plain += t;\n } else if (child.nodeType === 1 /* ELEMENT_NODE */) {\n const sp = child as Element;\n if (sp.tagName.toLowerCase() !== 'tspan') {\n onWarn(`<text> child <${sp.tagName}> not supported; flattening text content`);\n const t = sp.textContent ?? '';\n if (t) { runs.push({ text: t }); plain += t; }\n continue;\n }\n const run = readTspanRun(sp, gradients, leafStyle, onWarn);\n runs.push(run);\n plain += run.text;\n }\n }\n\n // Estimate dimensions: data-weasel-* attrs win, else heuristic.\n const dataW = num(el.getAttribute('data-weasel-width'), NaN);\n const dataH = num(el.getAttribute('data-weasel-height'), NaN);\n const width = Number.isFinite(dataW) ? dataW : 99999;\n // Newlines in the text drive line count for height estimation.\n const lines = (plain.match(/\\n/g)?.length ?? 0) + 1;\n const height = Number.isFinite(dataH) ? dataH : fontSize * lineHeight * lines;\n\n const opacity = readOpacityAttr(el, 'opacity');\n const node: SvgTextNode = {\n kind: 'text',\n x: topY === ay ? ax : ax, // x is unchanged by the baseline shift\n y: topY,\n width,\n height,\n text: plain,\n };\n // Only attach `runs` when at least one run carries non-default styling —\n // single-run plain text is cleaner without it. `runsToPlainText(runs)`\n // must equal `text` per kit invariants, so the array must match exactly.\n //\n // \"Any key but `text`\" rather than an enumeration of the styling keys:\n // `readTspanRun` sets a field only when it parsed one, so the two are\n // equivalent, and the enumerated form silently dropped every run whose\n // only styling was a key added later — which is exactly how `stroke`\n // arrived and vanished.\n const hasStyling = runs.some(\n (r) => Object.entries(r).some(([k, v]) => k !== 'text' && v !== undefined),\n );\n if (hasStyling) node.runs = runs;\n if (Object.keys(textStyle).length > 0) node.style = textStyle;\n if (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 cx = node.x + node.width / 2;\n const cy = node.y + node.height / 2;\n const angle = decomposeRotation(localTransform, cx, cy);\n if (angle != null) {\n node.rotation = angle;\n } else {\n const rotComp = rotationComponent(localTransform);\n if (Math.abs(rotComp) > 1e-4) {\n onWarn(`<text> transform has a rotational component that can't be cleanly stored as rotation; dropped (may not round-trip identically)`);\n }\n }\n }\n return node;\n}\n\nfunction readTspanRun(\n el: Element,\n gradients: GradientTable,\n style: StyleContext,\n onWarn: (m: string) => void,\n): StyledRun {\n const text = el.textContent ?? '';\n const run: StyledRun = { text };\n const fw = ownProp(el, 'font-weight');\n if (fw === 'bold' || fw === '700' || fw === 'bolder') run.bold = true;\n const fs = ownProp(el, 'font-style');\n if (fs === 'italic' || fs === 'oblique') run.italic = true;\n const ff = ownProp(el, 'font-family');\n if (ff) run.fontFamily = ff;\n const sz = ownProp(el, 'font-size');\n if (sz != null) {\n const n = parseFloat(sz);\n if (Number.isFinite(n)) run.fontSize = n;\n }\n const ls = ownProp(el, 'letter-spacing');\n if (ls != null) {\n const n = parseLetterSpacing(ls, onWarn);\n if (n != null) run.letterSpacing = n;\n }\n const decoration = parseTextDecoration(ownProp(el, 'text-decoration'));\n if (decoration.underline) run.underline = true;\n if (decoration.strikethrough) run.strikethrough = true;\n const tspanStyle = deriveStyle(style, el);\n const fillAttr = resolveCurrentColor(ownProp(el, 'fill'), tspanStyle);\n if (fillAttr) {\n const parsed = parsePaintAttr(fillAttr);\n if (parsed?.kind === 'solid') {\n run.fill = { fill: 'solid', color: parsed.color };\n } else if (parsed?.kind === 'ref') {\n const paint = gradients.get(parsed.id);\n if (paint) run.fill = paint;\n }\n }\n // Own attributes only — see `ownStrokeStyle`.\n const stroke = coreStroke(readStroke(ownStrokeStyle(el), gradients, onWarn));\n if (stroke) run.stroke = stroke;\n return run;\n}\n\nfunction readTextStyle(\n style: StyleContext,\n gradients: GradientTable,\n onWarn: (m: string) => void,\n): TextStyle {\n const out: TextStyle = {};\n const sz = style['font-size'];\n if (sz != null) {\n const n = parseFloat(sz);\n if (Number.isFinite(n)) out.fontSize = n;\n }\n const ff = style['font-family'];\n if (ff) out.fontFamily = ff;\n const fw = style['font-weight'];\n if (fw != null) {\n const n = parseFloat(fw);\n out.fontWeight = Number.isFinite(n) ? n : fw;\n }\n const fs = style['font-style'];\n if (fs === 'italic' || fs === 'normal') out.fontStyle = fs;\n const anchor = style['text-anchor'];\n if (anchor === 'start') out.align = 'left';\n else if (anchor === 'middle') out.align = 'center';\n else if (anchor === 'end') out.align = 'right';\n const ls = style['letter-spacing'];\n if (ls != null) {\n const n = parseLetterSpacing(ls, onWarn);\n if (n != null) out.letterSpacing = n;\n }\n const decoration = parseTextDecoration(style['text-decoration'] ?? null);\n if (decoration.underline) out.underline = true;\n if (decoration.strikethrough) out.strikethrough = true;\n // 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 const fillRaw = resolveCurrentColor(style['fill'] ?? null, style);\n if (fillRaw) {\n const parsed = parsePaintAttr(fillRaw);\n if (parsed?.kind === 'solid') {\n out.fill = { fill: 'solid', color: parsed.color } as FillStyle;\n } else if (parsed?.kind === 'ref') {\n const paint = gradients.get(parsed.id);\n if (paint) out.fill = paint;\n }\n // parsed.kind === 'none' → leave fill undefined (defaults to black downstream).\n }\n // Text strokes used to be dropped here with a warning: an SDF glyph is a\n // sampled field, with no geometry to stroke. The outline tier gave large\n // text real contours, so a stroke is now a paint like any other — and one\n // that stays in the document even at sizes that render it unstroked.\n const stroke = coreStroke(readStroke(style, gradients, onWarn));\n if (stroke) out.stroke = stroke;\n return out;\n}\n","/**\n * Serialize a 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 * Serialize a `SvgNode[]` tree to an SVG document string. Every leaf is\n * emitted as a `<path>` (even shapes that started as `<rect>` etc.) —\n * lossless geometry round-trip beats round-tripping the element-kind\n * label. Gradient paints are gathered into a single `<defs>` block.\n */\n\nimport type { Path, Stroke } from '@weasel-js/core';\nimport { boundsOfPath } from '@weasel-js/core';\nimport type {\n NamespaceMeta, NamespacedElement, SerializeOptions, SvgGroupNode, SvgNode,\n SvgPaint, SvgPathNode, SvgStroke, SvgTextNode,\n} from './types';\nimport { runsToPlainText } from '@weasel-js/core';\nimport { serializePathD } from './path-serializer';\nimport { formatMatrix, trimNumber } from './transform';\nimport { GradientRegistry } from './gradients';\n\n/**\n * Walk the tree and produce an SVG document string. The root `<svg>`'s\n * `viewBox` is taken from `opts.viewBox` if supplied, otherwise computed\n * as a tight bounding box around every leaf.\n */\nexport function serializeSvg(nodes: SvgNode[], opts: SerializeOptions = {}): string {\n const registry = new GradientRegistry();\n registerGradients(nodes, registry);\n\n const bounds = opts.viewBox ?? computeBounds(nodes);\n const vb = `${trimNumber(bounds.x)} ${trimNumber(bounds.y)} ${trimNumber(bounds.width)} ${trimNumber(bounds.height)}`;\n const namespaces = opts.namespaces ?? {};\n\n const rootAttrs: string[] = [`xmlns=\"http://www.w3.org/2000/svg\"`];\n for (const [prefix, uri] of Object.entries(namespaces)) {\n rootAttrs.push(`xmlns:${prefix}=\"${escapeAttr(uri)}\"`);\n }\n rootAttrs.push(`viewBox=\"${vb}\"`);\n if (opts.width != null) rootAttrs.push(`width=\"${trimNumber(opts.width)}\"`);\n if (opts.height != null) rootAttrs.push(`height=\"${trimNumber(opts.height)}\"`);\n // documentMeta attrs onto the root, in declared-namespace order.\n if (opts.documentMeta) {\n for (const prefix of Object.keys(namespaces)) {\n const bucket = opts.documentMeta[prefix];\n if (!bucket?.attrs) continue;\n for (const [name, value] of Object.entries(bucket.attrs)) {\n rootAttrs.push(`${prefix}:${name}=\"${escapeAttr(value)}\"`);\n }\n }\n }\n\n // documentMeta elements after <defs>, before geometry body.\n let docMetaXml = '';\n if (opts.documentMeta) {\n for (const prefix of Object.keys(namespaces)) {\n const bucket = opts.documentMeta[prefix];\n if (!bucket?.elements) continue;\n for (const [localName, list] of Object.entries(bucket.elements)) {\n for (const el of list) docMetaXml += namespacedElementXml(prefix, localName, el);\n }\n }\n }\n\n const defsXml = registry.toDefsXml();\n const bodyXml = nodes.map((n) => nodeXml(n, registry, namespaces)).join('');\n\n // `<title>` goes immediately inside `<svg>` per SVG-spec convention; it's\n // an accessibility hook and (for our purposes) a stable place to round-trip\n // the user-visible document title.\n const titleXml = opts.title && opts.title.length > 0\n ? `<title>${escapeText(opts.title)}</title>`\n : '';\n\n return `<svg ${rootAttrs.join(' ')}>${titleXml}${defsXml}${docMetaXml}${bodyXml}</svg>`;\n}\n\nfunction namespacedElementXml(prefix: string, localName: string, el: NamespacedElement): string {\n const attrs: string[] = [];\n for (const [name, value] of Object.entries(el.attrs)) {\n attrs.push(`${name}=\"${escapeAttr(value)}\"`);\n }\n const head = attrs.length > 0 ? `<${prefix}:${localName} ${attrs.join(' ')}>` : `<${prefix}:${localName}>`;\n let body = '';\n if (el.children) {\n for (const [childName, list] of Object.entries(el.children)) {\n for (const child of list) body += namespacedElementXml(prefix, childName, child);\n }\n } else if (el.text != null) {\n body = escapeText(el.text);\n }\n return `${head}${body}</${prefix}:${localName}>`;\n}\n\nfunction metaAttrsXml(meta: NamespaceMeta | undefined, namespaces: Record<string, string>): string {\n if (!meta) return '';\n const parts: string[] = [];\n for (const prefix of Object.keys(namespaces)) {\n const bucket = meta[prefix];\n if (!bucket?.attrs) continue;\n for (const [name, value] of Object.entries(bucket.attrs)) {\n parts.push(`${prefix}:${name}=\"${escapeAttr(value)}\"`);\n }\n }\n return parts.length > 0 ? ` ${parts.join(' ')}` : '';\n}\n\nfunction metaElementsXml(meta: NamespaceMeta | undefined, namespaces: Record<string, string>): string {\n if (!meta) return '';\n let out = '';\n for (const prefix of Object.keys(namespaces)) {\n const bucket = meta[prefix];\n if (!bucket?.elements) continue;\n for (const [localName, list] of Object.entries(bucket.elements)) {\n for (const el of list) out += namespacedElementXml(prefix, localName, el);\n }\n }\n return out;\n}\n\nfunction registerGradients(nodes: SvgNode[], registry: GradientRegistry): void {\n for (const n of nodes) {\n if (n.kind === 'group') {\n registerGradients(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 } 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.style?.fill, registry);\n registerTextPaint(n.style?.stroke?.paint, 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 gradient/pattern rather than a colour. */\nfunction registerTextPaint(\n paint: import('@weasel-js/core').FillStyle | undefined,\n registry: GradientRegistry,\n): void {\n if (paint && !('color' in paint)) registry.register(paint);\n}\n\nfunction nodeXml(node: SvgNode, registry: GradientRegistry, namespaces: Record<string, string>): string {\n if (node.kind === 'group') return groupXml(node, registry, namespaces);\n if (node.kind === 'text') return textXml(node, registry, namespaces);\n return pathXml(node, registry, namespaces);\n}\n\nfunction groupXml(node: SvgGroupNode, registry: GradientRegistry, namespaces: Record<string, string>): string {\n const attrs: string[] = [];\n if (node.transform) {\n const m = formatMatrix(node.transform);\n if (m) attrs.push(`transform=\"${m}\"`);\n }\n if (node.opacity != null && node.opacity !== 1) {\n attrs.push(`opacity=\"${trimNumber(node.opacity)}\"`);\n }\n const metaAttrs = metaAttrsXml(node.meta, namespaces);\n // `metaAttrs` already starts with a leading space (or is empty), so we\n // can splice it after the existing attr list without extra logic.\n const head = attrs.length > 0\n ? `<g ${attrs.join(' ')}${metaAttrs}>`\n : `<g${metaAttrs}>`;\n const body = node.children.map((c) => nodeXml(c, registry, namespaces)).join('');\n return `${head}${body}${metaElementsXml(node.meta, namespaces)}</g>`;\n}\n\nfunction pathXml(node: SvgPathNode, registry: GradientRegistry, namespaces: Record<string, string>): string {\n const attrs: string[] = [`d=\"${serializePathD(node.path)}\"`];\n const fillAttrs = paintAttrs(node.fill, 'fill', registry);\n for (const a of fillAttrs) attrs.push(a);\n // Emit fill-rule only when it diverges from SVG's default ('nonzero').\n // RectPath has no fillRule field — only PolygonPath carries one.\n if (node.path.kind === 'polygon' && node.path.fillRule === 'evenodd') {\n attrs.push(`fill-rule=\"evenodd\"`);\n }\n if (node.stroke) {\n const strokeAttrs = strokeAttrsFor(node.stroke, registry);\n for (const a of strokeAttrs) attrs.push(a);\n } else {\n attrs.push('stroke=\"none\"');\n }\n if (node.opacity != null && node.opacity !== 1) {\n attrs.push(`opacity=\"${trimNumber(node.opacity)}\"`);\n }\n if (node.rotation != null && node.rotation !== 0) {\n const b = pathBounds(node.path);\n const cx = b.minX + (b.maxX - b.minX) / 2;\n const cy = b.minY + (b.maxY - b.minY) / 2;\n const deg = (node.rotation * 180) / Math.PI;\n attrs.push(`transform=\"rotate(${trimNumber(deg)} ${trimNumber(cx)} ${trimNumber(cy)})\"`);\n }\n const metaAttrs = metaAttrsXml(node.meta, namespaces);\n const metaEls = metaElementsXml(node.meta, namespaces);\n if (metaEls) {\n return `<path ${attrs.join(' ')}${metaAttrs}>${metaEls}</path>`;\n }\n return `<path ${attrs.join(' ')}${metaAttrs}/>`;\n}\n\nfunction paintAttrs(\n paint: SvgPaint,\n name: 'fill' | 'stroke',\n registry: GradientRegistry,\n): string[] {\n if (paint.kind === 'none') return [`${name}=\"none\"`];\n if (paint.kind === 'solid') {\n const out = [`${name}=\"${paint.color}\"`];\n if (paint.opacity != null && paint.opacity !== 1) {\n out.push(`${name}-opacity=\"${trimNumber(paint.opacity)}\"`);\n }\n return out;\n }\n // gradient\n const id = registry.register(paint.paint);\n return [`${name}=\"url(#${id})\"`];\n}\n\n/**\n * Attributes for a kit `Stroke` — the shape text carries, whose `paint` is a\n * `FillStyle` rather than an `SvgPaint`. Text strokes ride inside\n * `TextStyle` / `StyledRun` rather than as a node-level `SvgStroke`, because\n * that is where the kit's text model puts them.\n *\n * Absent, or zero-width, emits nothing at all: unstroked text should not\n * carry a `stroke` attribute, and SVG's own default (`none`) already says so.\n */\nfunction coreStrokeAttrs(stroke: Stroke | undefined, registry: GradientRegistry): string[] {\n if (!stroke) return [];\n const width = stroke.width ?? 1;\n if (!(width > 0)) return [];\n const attrs: string[] = [];\n if ('color' in stroke.paint) {\n attrs.push(`stroke=\"${stroke.paint.color}\"`);\n if (stroke.paint.opacity != null && stroke.paint.opacity !== 1) {\n attrs.push(`stroke-opacity=\"${trimNumber(stroke.paint.opacity)}\"`);\n }\n } else {\n attrs.push(`stroke=\"url(#${registry.register(stroke.paint)})\"`);\n }\n attrs.push(`stroke-width=\"${trimNumber(width)}\"`);\n if (stroke.cap) attrs.push(`stroke-linecap=\"${stroke.cap}\"`);\n if (stroke.join) attrs.push(`stroke-linejoin=\"${stroke.join}\"`);\n if (stroke.dash && stroke.dash.length > 0) {\n attrs.push(`stroke-dasharray=\"${stroke.dash.map(trimNumber).join(' ')}\"`);\n }\n if (stroke.miterLimit != null) attrs.push(`stroke-miterlimit=\"${trimNumber(stroke.miterLimit)}\"`);\n return attrs;\n}\n\nfunction strokeAttrsFor(stroke: SvgStroke, registry: GradientRegistry): string[] {\n const attrs = paintAttrs(stroke.paint, 'stroke', registry);\n attrs.push(`stroke-width=\"${trimNumber(stroke.width)}\"`);\n if (stroke.opacity != null && stroke.opacity !== 1) {\n attrs.push(`stroke-opacity=\"${trimNumber(stroke.opacity)}\"`);\n }\n if (stroke.cap) {\n attrs.push(`stroke-linecap=\"${stroke.cap}\"`);\n }\n if (stroke.join) {\n attrs.push(`stroke-linejoin=\"${stroke.join}\"`);\n }\n if (stroke.dash && stroke.dash.length > 0) {\n attrs.push(`stroke-dasharray=\"${stroke.dash.map(trimNumber).join(' ')}\"`);\n }\n if (stroke.miterLimit != null) {\n attrs.push(`stroke-miterlimit=\"${trimNumber(stroke.miterLimit)}\"`);\n }\n return attrs;\n}\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): void => {\n if (n.kind === 'group') {\n n.children.forEach(visit);\n return;\n }\n const b = n.kind === 'text'\n ? { minX: n.x, minY: n.y, maxX: n.x + n.width, maxY: n.y + n.height }\n : pathBounds(n.path);\n if (b.minX < minX) minX = b.minX;\n if (b.minY < minY) minY = b.minY;\n if (b.maxX > maxX) maxX = b.maxX;\n if (b.maxY > maxY) maxY = b.maxY;\n };\n nodes.forEach(visit);\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\n/**\n * Emit a `<text>` element. Uses `dominant-baseline=\"text-before-edge\"` so\n * the `y` attribute matches weasel's top-of-box pose; stashes the explicit\n * width/height (which native SVG text doesn't model) in `data-weasel-*`\n * attributes so they round-trip through the parser losslessly.\n */\nfunction textXml(node: SvgTextNode, registry: GradientRegistry, namespaces: Record<string, string>): string {\n const attrs: string[] = [\n `x=\"${trimNumber(node.x)}\"`,\n `y=\"${trimNumber(node.y)}\"`,\n `dominant-baseline=\"text-before-edge\"`,\n `data-weasel-width=\"${trimNumber(node.width)}\"`,\n `data-weasel-height=\"${trimNumber(node.height)}\"`,\n ];\n\n const style = node.style;\n if (style?.fontSize != null) attrs.push(`font-size=\"${trimNumber(style.fontSize)}\"`);\n if (style?.fontFamily) attrs.push(`font-family=\"${escapeAttr(style.fontFamily)}\"`);\n if (style?.fontWeight != null) attrs.push(`font-weight=\"${String(style.fontWeight)}\"`);\n if (style?.fontStyle && style.fontStyle !== 'normal') attrs.push(`font-style=\"${style.fontStyle}\"`);\n if (style?.align && style.align !== 'left') {\n const anchor = style.align === 'center' ? 'middle' : 'end';\n attrs.push(`text-anchor=\"${anchor}\"`);\n }\n if (style?.letterSpacing != null && style.letterSpacing !== 0) {\n attrs.push(`letter-spacing=\"${trimNumber(style.letterSpacing)}\"`);\n }\n const decoration = textDecorationValue(style?.underline, style?.strikethrough);\n if (decoration) attrs.push(`text-decoration=\"${decoration}\"`);\n // Note: `lineHeight` is NOT emitted here. The bridge layer (svgInterop)\n // lifts it into `meta.wd.attrs['line-height']`, which `metaAttrsXml`\n // below emits as `wd:line-height=\"...\"`. There is no compat write of\n // `data-weasel-line-height` — per the SVG-native plan's Migration section,\n // no installed base exists to compat against.\n if (style?.fill) {\n if ('color' in style.fill) {\n attrs.push(`fill=\"${style.fill.color}\"`);\n if (style.fill.opacity != null && style.fill.opacity !== 1) {\n attrs.push(`fill-opacity=\"${trimNumber(style.fill.opacity)}\"`);\n }\n } else {\n const id = registry.register(style.fill);\n attrs.push(`fill=\"url(#${id})\"`);\n }\n }\n for (const a of coreStrokeAttrs(style?.stroke, registry)) attrs.push(a);\n if (node.opacity != null && node.opacity !== 1) {\n attrs.push(`opacity=\"${trimNumber(node.opacity)}\"`);\n }\n if (node.rotation != null && node.rotation !== 0) {\n const cx = node.x + node.width / 2;\n const cy = node.y + node.height / 2;\n const deg = (node.rotation * 180) / Math.PI;\n attrs.push(`transform=\"rotate(${trimNumber(deg)} ${trimNumber(cx)} ${trimNumber(cy)})\"`);\n }\n\n const body = node.runs && node.runs.length > 0\n ? node.runs.map((r) => runXml(r, registry)).join('')\n : escapeText(node.text);\n const metaAttrs = metaAttrsXml(node.meta, namespaces);\n const metaEls = metaElementsXml(node.meta, namespaces);\n return `<text ${attrs.join(' ')}${metaAttrs}>${body}${metaEls}</text>`;\n}\n\nfunction runXml(run: import('@weasel-js/core').StyledRun, registry: GradientRegistry): string {\n const attrs: string[] = [];\n if (run.bold) attrs.push(`font-weight=\"700\"`);\n if (run.italic) attrs.push(`font-style=\"italic\"`);\n if (run.fontFamily) attrs.push(`font-family=\"${escapeAttr(run.fontFamily)}\"`);\n if (run.fontSize != null) attrs.push(`font-size=\"${trimNumber(run.fontSize)}\"`);\n // Unlike the node-level style guard above, a run-level `0` is a meaningful\n // *override* (distinct from \"inherit the node's letterSpacing\") per the\n // runs model's additive-flags contract — emit it whenever it's set.\n if (run.letterSpacing != null) {\n attrs.push(`letter-spacing=\"${trimNumber(run.letterSpacing)}\"`);\n }\n const runDecoration = textDecorationValue(run.underline, run.strikethrough);\n if (runDecoration) attrs.push(`text-decoration=\"${runDecoration}\"`);\n if (run.fill) {\n if ('color' in run.fill) {\n attrs.push(`fill=\"${run.fill.color}\"`);\n } else {\n const id = registry.register(run.fill);\n attrs.push(`fill=\"url(#${id})\"`);\n }\n }\n for (const a of coreStrokeAttrs(run.stroke, registry)) attrs.push(a);\n const head = attrs.length > 0 ? `<tspan ${attrs.join(' ')}>` : '<tspan>';\n return `${head}${escapeText(run.text)}</tspan>`;\n}\n\n/**\n * Combine the two 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 neither is set.\n */\nfunction textDecorationValue(underline: boolean | undefined, strikethrough: boolean | undefined): string | null {\n const tokens: string[] = [];\n if (underline) tokens.push('underline');\n if (strikethrough) tokens.push('line-through');\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\n// Silence unused-import warnings when the runs export gets tree-shaken.\nvoid runsToPlainText;\n\nfunction pathBounds(path: Path): { minX: number; minY: number; maxX: number; maxY: number } {\n if (path.kind === 'rect') {\n return {\n minX: path.x, minY: path.y,\n maxX: path.x + path.width, maxY: path.y + path.height,\n };\n }\n const b = boundsOfPath(path);\n return { minX: b.x, minY: b.y, maxX: b.x + b.width, maxY: b.y + b.height };\n}\n\n","/**\n * The `unpack` half of the kit SVG handler (`svgHandler.ts`): parse an SVG\n * file into **native scene nodes** — path/text leaves under containers that\n * mirror the source `<g>` structure — instead of the default single\n * embedded-image node. Opted into via\n * `<SceneCanvas ingestion={{ svg: { unpack: unpackSvgFiles } }}>`.\n *\n * Leaf data targets the kit's built-in painters (`NodeShape.ts`): paths as\n * `{ path, fill?, stroke?, strokeWidth? }` (the `kit:path` contract), text\n * as `{ text, style? }` (`kit:text`). Poses are absolute AABBs; the\n * renderer's `pathInPoseFrame` rebases stored geometry into the pose box,\n * so placement and fit-clamping operate on poses alone and never rewrite\n * path coordinates.\n *\n * Placement mirrors the image handler: the file's union AABB is fit-clamped\n * to 90% of the visible viewport and centered on the drop point (or the\n * viewport center), with multi-file batches cascading by a fixed offset.\n * 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 * Known flattenings (dwarn'd, not fatal): gradient paints collapse to a\n * fallback solid color (the `kit:path` painter takes color strings only),\n * and text `fontSize` does not participate in the fit-clamp scale.\n */\nimport { parseSvg } from './parse';\nimport type { SvgNode, SvgPaint } from './types';\nimport {\n boundsOfPath,\n createInsertOp,\n dwarn,\n type IngestCtx,\n type Op,\n} from '@weasel-js/core';\n\nconst CASCADE_OFFSET_PX = 24;\nconst VIEWPORT_FIT = 0.9;\nconst GRADIENT_FALLBACK = '#888888';\n\nexport interface SvgDraftBounds {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\ntype DraftPose = SvgDraftBounds & { rotation?: number };\n\n/**\n * One node the unpack wants the scene to materialize, in parent-before-child\n * order (a draft's `parentId` always names an earlier draft, or `null` for\n * roots). Leaf `data` is kit-painter-native (see module doc).\n */\nexport type SvgSceneDraft =\n | { kind: 'container'; id: string; parentId: string | null; pose: DraftPose }\n | { kind: 'leaf'; id: string; parentId: string | null; pose: DraftPose; data: Record<string, unknown> };\n\n/** `File.text()` via FileReader — same engine-compat choice as the image\n * handler's `readAsDataURL` (jsdom ships `FileReader` but not `Blob.text`). */\nfunction readFileText(file: File): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => resolve(String(reader.result ?? ''));\n reader.onerror = () => reject(reader.error);\n reader.readAsText(file);\n });\n}\n\n/** Mint a fresh node id. Mirrors the scene's default `n{counter}-{random}`\n * scheme (kept module-private by `core/scene/scene.ts`) — same approach as\n * `groupAction` / `cloneAction`. */\nlet svgIdCounter = 0;\nfunction freshSvgNodeId(): string {\n return `n${(svgIdCounter++).toString(36)}-${Math.random().toString(36).slice(2, 8)}`;\n}\n\n/** Flatten an `SvgPaint` to the `kit:path` painter's color-string contract.\n * `'none'` is meaningful (painter skips the fill); gradients collapse to a\n * fallback solid — the painter's data contract has no gradient slot yet. */\nfunction colorFromPaint(paint: SvgPaint | undefined, context: string): string | undefined {\n if (!paint) return undefined;\n if (paint.kind === 'none') return 'none';\n if (paint.kind === 'solid') return paint.color;\n dwarn('ingest', `svg unpack: gradient ${context} flattened to ${GRADIENT_FALLBACK}`);\n return GRADIENT_FALLBACK;\n}\n\n/**\n * Walk an `SvgNode[]` tree and emit a flat, parent-before-child list of\n * {@link SvgSceneDraft}s. Each `<g>` becomes a container whose pose is the\n * union AABB of its descendants (the kit `group` action's convention);\n * path/text leaves carry kit-painter-native data. Empty groups are dropped.\n */\nexport function svgNodesToKitDrafts(\n nodes: readonly SvgNode[],\n nextId: () => string,\n): SvgSceneDraft[] {\n const drafts: SvgSceneDraft[] = [];\n\n // Returns the union AABB of the leaves under `n` so a parent container can\n // compose its own pose; null for empty groups.\n const visit = (n: SvgNode, parentId: string | null): SvgDraftBounds | null => {\n if (n.kind === 'group') {\n const draft: Extract<SvgSceneDraft, { kind: 'container' }> = {\n kind: 'container',\n id: nextId(),\n parentId,\n pose: { x: 0, y: 0, width: 0, height: 0 },\n };\n drafts.push(draft);\n let acc: SvgDraftBounds | null = null;\n for (const c of n.children) {\n const b = visit(c, draft.id);\n if (b) acc = acc ? unionRect(acc, b) : b;\n }\n if (!acc) {\n drafts.splice(drafts.indexOf(draft), 1);\n return null;\n }\n draft.pose = acc;\n return acc;\n }\n\n if (n.kind === 'text') {\n const pose: DraftPose = { x: n.x, y: n.y, width: n.width, height: n.height };\n if (n.rotation) pose.rotation = n.rotation;\n drafts.push({\n kind: 'leaf',\n id: nextId(),\n parentId,\n pose,\n data: { text: n.text, ...(n.style ? { style: n.style } : {}) },\n });\n return pose;\n }\n\n // Path leaf. Bounds come from the geometry; `pathInPoseFrame` rebases\n // the stored path onto whatever pose box placement settles on.\n const b = n.path.kind === 'rect'\n ? { x: n.path.x, y: n.path.y, width: n.path.width, height: n.path.height }\n : boundsOfPath(n.path);\n const pose: DraftPose = { x: b.x, y: b.y, width: b.width, height: b.height };\n if (n.rotation) pose.rotation = n.rotation;\n const fill = colorFromPaint(n.fill, 'fill');\n const stroke = n.stroke ? colorFromPaint(n.stroke.paint, 'stroke') : undefined;\n drafts.push({\n kind: 'leaf',\n id: nextId(),\n parentId,\n pose,\n data: {\n path: n.path,\n ...(fill !== undefined ? { fill } : {}),\n ...(stroke !== undefined && stroke !== 'none'\n ? { stroke, strokeWidth: n.stroke!.width }\n : {}),\n },\n });\n return pose;\n };\n\n for (const n of nodes) visit(n, null);\n return drafts;\n}\n\nfunction unionRect(a: SvgDraftBounds, b: SvgDraftBounds): SvgDraftBounds {\n const minX = Math.min(a.x, b.x);\n const minY = Math.min(a.y, b.y);\n const maxX = Math.max(a.x + a.width, b.x + b.width);\n const maxY = Math.max(a.y + a.height, b.y + b.height);\n return { x: minX, y: minY, width: maxX - minX, height: maxY - minY };\n}\n\n/**\n * Parse each file and insert its node tree — one undoable `applyOps` batch\n * per file. See the module doc for placement and wrapping policy. A file\n * that fails to parse (or parses to nothing) is skipped with a\n * `console.warn`; the rest proceed.\n */\nexport async function unpackSvgFiles(files: File[], ctx: IngestCtx): Promise<void> {\n const layer = ((ctx.scene.layers[0]?.id as string | undefined) ?? 'default');\n let index = 0;\n for (const file of files) {\n try {\n const text = await readFileText(file);\n const parsed = parseSvg(text);\n for (const w of parsed.warnings) dwarn('ingest', `svg \"${file.name}\":`, w);\n let drafts = svgNodesToKitDrafts(parsed.nodes, freshSvgNodeId);\n if (drafts.length === 0) {\n console.warn(`weasel ingest: svg \"${file.name}\" parsed to no drawable nodes`);\n continue;\n }\n\n // Wrap multi-root files in one synthesized container so the dropped\n // file arrives as a single selectable unit.\n const roots = drafts.filter((d) => d.parentId === null);\n if (roots.length > 1) {\n const wrapperId = freshSvgNodeId();\n const union = roots.map((d) => d.pose).reduce(unionRect);\n drafts = [\n { kind: 'container', id: wrapperId, parentId: null, pose: union },\n ...drafts.map((d) => (d.parentId === null ? { ...d, parentId: wrapperId } : d)),\n ];\n }\n\n // Fit-clamp + center, mirroring the image handler. Pose-only: the\n // painter rebases stored geometry into the pose box.\n const union = drafts\n .filter((d) => d.parentId === null)\n .map((d) => d.pose)\n .reduce(unionRect);\n const view = ctx.viewportWorldRect();\n const scale = Math.min(\n 1,\n union.width > 0 ? (view.width * VIEWPORT_FIT) / union.width : 1,\n union.height > 0 ? (view.height * VIEWPORT_FIT) / union.height : 1,\n );\n const target = ctx.point ?? {\n x: view.x + view.width / 2,\n y: view.y + view.height / 2,\n };\n const offset = index * CASCADE_OFFSET_PX;\n const cx = union.x + union.width / 2;\n const cy = union.y + union.height / 2;\n const place = (p: DraftPose): DraftPose => ({\n ...p,\n x: target.x + (p.x - cx) * scale + offset,\n y: target.y + (p.y - cy) * scale + offset,\n width: p.width * scale,\n height: p.height * scale,\n });\n\n const ops: Op[] = drafts.map((d) =>\n createInsertOp({\n node: {\n id: d.id,\n kind: d.kind,\n layer,\n pose: place(d.pose),\n data: d.kind === 'leaf' ? d.data : {},\n parent: d.parentId,\n } as unknown as { id: string },\n label: 'Insert SVG',\n }),\n );\n ctx.applyOps(ops, 'Insert SVG');\n index++;\n } catch (err) {\n console.warn(`weasel ingest: svg \"${file.name}\" failed to parse`, err);\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/types.ts","../src/transform.ts","../src/shapes.ts","../src/color.ts","../src/patterns.ts","../src/gradients.ts","../src/cascade.ts","../src/parse.ts","../src/path-serializer.ts","../src/serialize.ts","../src/unpack.ts"],"names":["opacity","meta","PATH_M","PATH_L","PATH_Z","out","PATH_C","PATH_Q","escapeAttr","boundsOfPath","b","pose","union"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Public types for `@weasel-js/svg`. The package exposes a flat,\n * discriminated-union node model (`SvgNode`) that mirrors the SVG element\n * tree but uses weasel-native leaf data (`Path`, `FillStyle`) for geometry and\n * paint.\n *\n * Parsing collapses every `transform=\"...\"` onto its descendants' geometry,\n * so the `SvgNode` tree returned from `parseSvg` never has a non-identity\n * group transform. Consumers may still construct groups with explicit\n * transforms before serializing, in which case the serializer emits a\n * single `matrix(a b c d e f)` on the `<g>`.\n */\n\nimport type { Path, FillStyle, StyledRun, TextStyle } from '@weasel-js/core';\n\n/**\n * Opaque pass-through bag for namespaced XML content.\n *\n * weasel-svg does not interpret the contents — it only ensures that any\n * attributes or child elements in a *declared* XML namespace round-trip\n * losslessly through parse → serialize. Consumers (e.g. an app-specific\n * bridge layer) hang their domain semantics off this structure.\n *\n * Keyed by namespace prefix (the prefix is a write-time choice; the URI\n * is the canonical identifier and is supplied via `ParseOptions.namespaces`\n * / `SerializeOptions.namespaces`).\n */\nexport interface NamespaceMeta {\n [prefix: string]: {\n /** Local-name → string-value map for attributes in this namespace. */\n attrs?: Record<string, string>;\n /**\n * Child elements in this namespace, keyed by local name. Each entry\n * is an array because a namespace can host multiple sibling elements\n * with the same tag (e.g. `<wd:layer/><wd:layer/>`).\n */\n elements?: Record<string, NamespacedElement[]>;\n };\n}\n\n/** Opaque structured representation of a namespaced element. */\nexport interface NamespacedElement {\n /** Attribute local-name → string-value. */\n attrs: Record<string, string>;\n /** Text content, when the element contains only text (no child elements). */\n text?: string;\n /** Nested namespaced children, keyed by local name (recursive). */\n children?: Record<string, NamespacedElement[]>;\n}\n\n/**\n * 2x3 affine matrix in column-major form (SVG's `matrix(a b c d e f)`\n * order). Maps `[x', y'] = [a*x + c*y + e, b*x + d*y + f]`.\n */\nexport type Matrix = readonly [number, number, number, number, number, number];\n\n/** Identity matrix — useful as a default in tests / constructors. */\nexport const IDENTITY_MATRIX: Matrix = [1, 0, 0, 1, 0, 0];\n\n/**\n * FillStyle description in the SVG sense — either explicit `none`, a solid\n * color, or a reference to a weasel-native gradient `FillStyle`. Solid colors\n * are normalized to `#rrggbb` strings; opacity is carried separately so\n * `fill-opacity` and `stroke-opacity` round-trip cleanly.\n */\nexport type SvgPaint =\n | { kind: 'none' }\n | { kind: 'solid'; color: string; opacity?: number }\n | { kind: 'gradient'; paint: FillStyle };\n\n/** Stroke description: a paint plus structural line parameters. */\nexport interface SvgStroke {\n paint: SvgPaint;\n width: number;\n opacity?: number;\n /** `stroke-linecap`. Default per SVG spec is `'butt'`. */\n cap?: 'butt' | 'round' | 'square';\n /** `stroke-linejoin`. Default per SVG spec is `'miter'`. SVG's `arcs` / `miter-clip` map to `'miter'` with a warning. */\n join?: 'miter' | 'round' | 'bevel';\n /** `stroke-dasharray` as a flat number array. Odd-length inputs are doubled per SVG spec. */\n dash?: number[];\n /**\n * `stroke-miterlimit`. SVG's default is 4. Weasel's renderer defaults to\n * 10 (Canvas2D) when unset, so parsed strokes without an explicit\n * attribute may render with longer miters than the source SVG intended.\n */\n miterLimit?: number;\n}\n\n/**\n * Leaf node: a path geometry plus fill/stroke. All other v1 shapes\n * (`<rect>`, `<ellipse>`, etc.) are lowered to this representation on\n * parse — `<rect>` uses weasel's `RectPath` fast-path subtype when\n * possible, everything else becomes a `PolygonPath`.\n */\nexport interface SvgPathNode {\n kind: 'path';\n path: Path;\n fill: SvgPaint;\n stroke?: SvgStroke;\n /** Element-level opacity (`opacity=\"...\"`), 0..1. */\n opacity?: number;\n /** Element-level rotation in **radians**, pivoting around the AABB\n * center of the underlying `path` geometry. Emitted as SVG\n * `transform=\"rotate(angleDegrees cx cy)\"`. */\n rotation?: number;\n /** Opaque per-element bag for declared namespaces. See `NamespaceMeta`. */\n meta?: NamespaceMeta;\n}\n\n/**\n * Group node: an SVG `<g>`. On parse, `transform` is always omitted (any\n * `transform` attribute is collapsed onto descendants' geometry). On\n * serialize, a non-identity `transform` is emitted as\n * `matrix(a b c d e f)`.\n */\nexport interface SvgGroupNode {\n kind: 'group';\n children: SvgNode[];\n transform?: Matrix;\n opacity?: number;\n /** Opaque per-element bag for declared namespaces. See `NamespaceMeta`. */\n meta?: NamespaceMeta;\n}\n\n/**\n * Text leaf node. Mirrors the kit's `TextPose` shape — a bounding box plus\n * text content, optional rich-text `runs` (per-range styling), and an\n * optional `TextStyle` for the node-wide defaults.\n *\n * Note on SVG text geometry: native `<text>` flows from a baseline; it\n * doesn't have width/height attributes. The serializer emits\n * `dominant-baseline=\"text-before-edge\"` so `y` is the top of the text\n * box, plus `data-weasel-width` / `data-weasel-height` so weasel's\n * explicit box dimensions round-trip losslessly. External SVG text\n * (lacking the data-* attrs) imports with estimated dimensions —\n * `width = 99999` (effectively unbounded so wrap doesn't fire) and\n * `height = fontSize * lineHeight * (lineCount || 1)`.\n */\nexport interface SvgTextNode {\n kind: 'text';\n x: number;\n y: number;\n width: number;\n height: number;\n /** Plain text. When `runs` is set, `runsToPlainText(runs)` must equal `text`. */\n text: string;\n /** Optional per-range styling — same shape as `TextPose.runs`. */\n runs?: StyledRun[];\n /** Node-wide style. Defaults applied at render time via `resolveTextStyle`. */\n style?: TextStyle;\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;\n\n/** Options for {@link parseSvg}. */\nexport interface ParseOptions {\n /**\n * Map of prefix → URI for XML namespaces the caller wants surfaced.\n * Attributes / child elements in any declared namespace are collected\n * into `SvgNode.meta` (per element) or `ParseResult.documentMeta` (root).\n * Undeclared namespaces are preserved in the DOM but not promoted into\n * the structured `meta` bag; they are silently dropped at serialize time.\n */\n namespaces?: Record<string, string>;\n}\n\n/** Output of {@link parseSvg}. */\nexport interface ParseResult {\n nodes: SvgNode[];\n /** Non-fatal notices (unsupported elements, unrecognized attributes). */\n warnings: string[];\n /**\n * Opaque per-document bag for declared namespaces. Holds root-level\n * namespaced attributes (`documentMeta.<prefix>.attrs`) and namespaced\n * root children (`documentMeta.<prefix>.elements`).\n */\n documentMeta?: NamespaceMeta;\n /** Root `viewBox` attribute, parsed from `\"x y width height\"`. */\n viewBox?: { x: number; y: number; width: number; height: number };\n /** Root `width` attribute, parsed as a unitless number when present. */\n width?: number;\n /** Root `height` attribute, parsed as a unitless number when present. */\n height?: number;\n /** Text content of the first `<title>` child of `<svg>`, when present. */\n title?: string;\n}\n\n/** Options for {@link serializeSvg}. */\nexport interface SerializeOptions {\n /**\n * Override the root `viewBox`. When omitted, the serializer computes\n * a tight bounding box from the supplied nodes.\n */\n viewBox?: { x: number; y: number; width: number; height: number };\n /**\n * Called for paint that can't be expressed in SVG and is dropped — a\n * conic gradient, or a pattern carrying a `TextureHandle` instead of a\n * `TilePatternSpec`. Without this the loss is silent.\n */\n onWarn?: (message: string) => void;\n /** Emit `width=\"...\"` on the root `<svg>`. */\n width?: number;\n /** Emit `height=\"...\"` on the root `<svg>`. */\n height?: number;\n /**\n * Emit `<title>...</title>` as the first child of the root `<svg>`. The\n * value is XML-escaped on output. Empty strings are skipped.\n */\n title?: string;\n /**\n * Map of prefix → URI for XML namespaces to declare on the root\n * `<svg>`. The serializer reads `documentMeta[prefix]` and\n * `node.meta[prefix]` to write the actual attributes and elements.\n */\n namespaces?: Record<string, string>;\n /**\n * Opaque per-document namespaced extras. Each `<prefix>.attrs` becomes\n * `<prefix>:<name>=\"...\"` attributes on the root `<svg>`. Each\n * `<prefix>.elements[localName]` becomes `<prefix>:<localName>...>`\n * children placed immediately before any geometry.\n */\n documentMeta?: NamespaceMeta;\n /** Pretty-print with newlines + indentation. Default `false`. */\n pretty?: boolean;\n}\n","/**\n * SVG transform attribute helpers. Parses the four primitive transform\n * functions weasel-svg supports (`matrix`, `translate`, `scale`, `rotate`)\n * into a single 2x3 affine matrix, and exposes the point/path mappers we\n * need to collapse `transform=` onto leaf geometry at parse time.\n */\n\nimport type { Matrix } from './types';\nimport { IDENTITY_MATRIX } from './types';\n\n/** Multiply two 2x3 affine matrices (a then b applied to a column vector). */\nexport function multiply(a: Matrix, b: Matrix): Matrix {\n // [a0 a2 a4] [b0 b2 b4]\n // [a1 a3 a5] [b1 b3 b5]\n return [\n a[0] * b[0] + a[2] * b[1],\n a[1] * b[0] + a[3] * b[1],\n a[0] * b[2] + a[2] * b[3],\n a[1] * b[2] + a[3] * b[3],\n a[0] * b[4] + a[2] * b[5] + a[4],\n a[1] * b[4] + a[3] * b[5] + a[5],\n ];\n}\n\n/** Apply a 2x3 affine to a 2D point. */\nexport function applyMatrix(m: Matrix, x: number, y: number): { x: number; y: number } {\n return { x: m[0] * x + m[2] * y + m[4], y: m[1] * x + m[3] * y + m[5] };\n}\n\n/** True if `m` is the identity within a small epsilon. */\nexport function isIdentity(m: Matrix, eps = 1e-9): boolean {\n return (\n Math.abs(m[0] - 1) < eps &&\n Math.abs(m[1]) < eps &&\n Math.abs(m[2]) < eps &&\n Math.abs(m[3] - 1) < eps &&\n Math.abs(m[4]) < eps &&\n Math.abs(m[5]) < eps\n );\n}\n\nconst NUM_RE = /[-+]?(?:\\d*\\.\\d+|\\d+\\.?)(?:[eE][-+]?\\d+)?/g;\n\nfunction readNumbers(s: string): number[] {\n const out: number[] = [];\n const matches = s.match(NUM_RE);\n if (!matches) return out;\n for (const m of matches) {\n const n = Number(m);\n if (Number.isFinite(n)) out.push(n);\n }\n return out;\n}\n\n/**\n * Parse an SVG `transform=\"...\"` string into a single 2x3 matrix.\n * Functions compose right-to-left in SVG's coordinate model: in\n * `transform=\"A B\"`, the rightmost function is applied first to a point's\n * local coordinates. We accumulate accordingly: `result = result * fn`.\n *\n * Unrecognized functions emit a warning via the optional callback and are\n * skipped (the rest of the transform list still applies).\n */\nexport function parseTransform(\n attr: string | null | undefined,\n onWarn?: (message: string) => void,\n): Matrix {\n if (!attr) return IDENTITY_MATRIX;\n let result: Matrix = IDENTITY_MATRIX;\n // Split into \"name(args)\" chunks.\n const fnRe = /([A-Za-z]+)\\s*\\(([^)]*)\\)/g;\n let match: RegExpExecArray | null;\n while ((match = fnRe.exec(attr)) !== null) {\n const name = match[1].toLowerCase();\n const nums = readNumbers(match[2]);\n let local: Matrix | null = null;\n if (name === 'matrix' && nums.length >= 6) {\n local = [nums[0], nums[1], nums[2], nums[3], nums[4], nums[5]];\n } else if (name === 'translate') {\n const tx = nums[0] ?? 0;\n const ty = nums[1] ?? 0;\n local = [1, 0, 0, 1, tx, ty];\n } else if (name === 'scale') {\n const sx = nums[0] ?? 1;\n const sy = nums.length >= 2 ? nums[1] : sx;\n local = [sx, 0, 0, sy, 0, 0];\n } else if (name === 'rotate') {\n const ang = ((nums[0] ?? 0) * Math.PI) / 180;\n const c = Math.cos(ang);\n const s = Math.sin(ang);\n const rot: Matrix = [c, s, -s, c, 0, 0];\n if (nums.length >= 3) {\n // rotate(angle, cx, cy) = translate(cx,cy) * rotate * translate(-cx,-cy)\n const cx = nums[1];\n const cy = nums[2];\n local = multiply(multiply([1, 0, 0, 1, cx, cy], rot), [1, 0, 0, 1, -cx, -cy]);\n } else {\n local = rot;\n }\n } else if (name === 'skewx' || name === 'skewy') {\n const ang = ((nums[0] ?? 0) * Math.PI) / 180;\n const t = Math.tan(ang);\n local = name === 'skewx' ? [1, 0, t, 1, 0, 0] : [1, t, 0, 1, 0, 0];\n } else {\n onWarn?.(`unsupported transform function: ${name}`);\n continue;\n }\n result = multiply(result, local);\n }\n return result;\n}\n\n/** Try to factor `m` as \"rotation by theta about (cx, cy)\". Returns the\n * angle in radians when `m` is (within `eps`) a pure rotation about the\n * given pivot. Returns `null` otherwise.\n *\n * Pure rotation about (cx, cy) has the matrix form:\n * [ cos -sin cx - cx*cos + cy*sin ]\n * [ sin cos cy - cx*sin - cy*cos ]\n * i.e. m[0] = m[3] = cos, m[1] = -m[2] = sin, with a translation that\n * equals the pivot's \"rotate-then-translate-back\" residue. We reconstruct\n * theta from atan2(m[1], m[0]) and verify the rest.\n */\nexport function decomposeRotation(\n m: Matrix,\n cx: number,\n cy: number,\n eps = 1e-4,\n): number | null {\n const [a, b, c, d, e, f] = m;\n // Pure rotation requires a == d and b == -c.\n if (Math.abs(a - d) > eps) return null;\n if (Math.abs(b + c) > eps) return null;\n // Determinant must be 1 (no scale, no flip).\n const det = a * d - b * c;\n if (Math.abs(det - 1) > eps) return null;\n const theta = Math.atan2(b, a);\n // Verify translation = (cx - cx*cos + cy*sin, cy - cx*sin - cy*cos).\n const expectedE = cx - cx * a + cy * b;\n const expectedF = cy - cx * b - cy * a;\n if (Math.abs(e - expectedE) > eps) return null;\n if (Math.abs(f - expectedF) > eps) return null;\n return theta;\n}\n\n/** Best-effort rotational-component extraction for a general matrix (any\n * scale + rotation, ignoring translation). Used for parse-time warnings\n * on un-decomposable matrices: we can detect \"there is a rotation here\"\n * even if we won't preserve it as `node.rotation`. For a non-uniform\n * matrix the \"rotation\" is ambiguous; we report atan2(b, a) which\n * corresponds to where the +x basis vector points.\n */\nexport function rotationComponent(m: Matrix): number {\n return Math.atan2(m[1], m[0]);\n}\n\n/**\n * Format a matrix as an SVG `matrix(a b c d e f)` value. Returns `null`\n * when `m` is (effectively) the identity, so the caller can omit the\n * attribute entirely.\n */\nexport function formatMatrix(m: Matrix): string | null {\n if (isIdentity(m)) return null;\n return `matrix(${m.map((n) => trimNumber(n)).join(' ')})`;\n}\n\n/** Trim trailing zeros from a numeric value for compact SVG output. */\nexport function trimNumber(n: number): string {\n if (!Number.isFinite(n)) return '0';\n // Round to ~6 decimal places to avoid floating-point cruft.\n const r = Math.round(n * 1e6) / 1e6;\n if (Number.isInteger(r)) return String(r);\n return String(r);\n}\n","/**\n * Lower SVG primitive elements (`<rect>`, `<circle>`, `<ellipse>`,\n * `<line>`, `<polyline>`, `<polygon>`) to weasel `Path` values. Each\n * helper applies an optional 2x3 affine matrix to the resulting geometry\n * so the caller can collapse `<g transform=\"...\">` onto leaves.\n *\n * Ellipses and rounded rects use the standard 4-segment cubic Bezier\n * approximation with control offset `k = 4*(sqrt(2)-1)/3 ≈ 0.5523`.\n */\n\nimport {\n PATH_C, PATH_L, PATH_M, PATH_Q, PATH_Z,\n PathBuilder,\n type Path,\n type PolygonPath,\n type RectPath,\n} from '@weasel-js/core';\nimport type { Matrix } from './types';\nimport { IDENTITY_MATRIX } from './types';\nimport { applyMatrix, isIdentity } from './transform';\n\n/** Magic constant: cubic Bezier control offset for a quarter-circle of radius 1. */\nconst KAPPA = (4 * (Math.sqrt(2) - 1)) / 3;\n\n/** True when `m` represents a pure axis-aligned scale + translate. */\nfunction isAxisAlignedScale(m: Matrix, eps = 1e-9): boolean {\n return Math.abs(m[1]) < eps && Math.abs(m[2]) < eps;\n}\n\n/**\n * Apply a 2x3 affine to a `Path`. RectPaths whose matrix is identity or\n * an axis-aligned scale+translate stay as `RectPath`; anything else (any\n * rotation/skew, or any PolygonPath input) is promoted to a `PolygonPath`\n * via a coords-level remap.\n */\nexport function transformPath(path: Path, m: Matrix): Path {\n if (isIdentity(m)) return path;\n if (path.kind === 'rect') {\n if (isAxisAlignedScale(m)) {\n const a = m[0], d = m[3], e = m[4], f = m[5];\n let x = path.x * a + e;\n let y = path.y * d + f;\n let w = path.width * a;\n let h = path.height * d;\n if (w < 0) { x += w; w = -w; }\n if (h < 0) { y += h; h = -h; }\n return { kind: 'rect', x, y, width: w, height: h };\n }\n // Promote to polygon, then transform.\n return transformPath(rectToPolygon(path), m);\n }\n // PolygonPath: remap every coord pair. Step counts are command-dependent\n // and all the supported commands store coord pairs, so a flat stride-2\n // walk is correct.\n const xs = path.coords;\n const out = new Float32Array(xs.length);\n for (let i = 0; i < xs.length; i += 2) {\n const p = applyMatrix(m, xs[i], xs[i + 1]);\n out[i] = p.x;\n out[i + 1] = p.y;\n }\n return {\n kind: 'polygon',\n commands: new Uint8Array(path.commands),\n coords: out,\n fillRule: path.fillRule,\n };\n}\n\nfunction rectToPolygon(r: RectPath): PolygonPath {\n const b = new PathBuilder();\n b.moveTo(r.x, r.y);\n b.lineTo(r.x + r.width, r.y);\n b.lineTo(r.x + r.width, r.y + r.height);\n b.lineTo(r.x, r.y + r.height);\n b.close();\n return b.build();\n}\n\n/**\n * `<rect x y width height rx ry>` → Path. Returns a `RectPath` when there\n * are no corner radii (and matrix is benign); otherwise lowers to a\n * polygon with cubic-curve corners.\n */\nexport function rectElementToPath(\n x: number, y: number, width: number, height: number,\n rx: number, ry: number,\n m: Matrix = IDENTITY_MATRIX,\n): Path {\n if (rx <= 0 && ry <= 0) {\n return transformPath({ kind: 'rect', x, y, width, height }, m);\n }\n const r = Math.min(Math.max(rx, ry), Math.min(width, height) / 2);\n const r2 = Math.min(rx > 0 ? rx : r, ry > 0 ? ry : r, Math.min(width, height) / 2);\n // For simplicity treat rx === ry === r2. Independent rx/ry can be\n // added later; weasel doesn't have a rounded-rect primitive anyway.\n const rad = r2;\n const k = KAPPA * rad;\n const x2 = x + width;\n const y2 = y + height;\n const b = new PathBuilder();\n b.moveTo(x + rad, y);\n b.lineTo(x2 - rad, y);\n b.curveTo(x2 - rad + k, y, x2, y + rad - k, x2, y + rad);\n b.lineTo(x2, y2 - rad);\n b.curveTo(x2, y2 - rad + k, x2 - rad + k, y2, x2 - rad, y2);\n b.lineTo(x + rad, y2);\n b.curveTo(x + rad - k, y2, x, y2 - rad + k, x, y2 - rad);\n b.lineTo(x, y + rad);\n b.curveTo(x, y + rad - k, x + rad - k, y, x + rad, y);\n b.close();\n return transformPath(b.build(), m);\n}\n\n/** `<ellipse cx cy rx ry>` → PolygonPath (4 cubic segments). */\nexport function ellipseToPath(\n cx: number, cy: number, rx: number, ry: number,\n m: Matrix = IDENTITY_MATRIX,\n): Path {\n const kx = KAPPA * rx;\n const ky = KAPPA * ry;\n const b = new PathBuilder();\n b.moveTo(cx + rx, cy);\n b.curveTo(cx + rx, cy + ky, cx + kx, cy + ry, cx, cy + ry);\n b.curveTo(cx - kx, cy + ry, cx - rx, cy + ky, cx - rx, cy);\n b.curveTo(cx - rx, cy - ky, cx - kx, cy - ry, cx, cy - ry);\n b.curveTo(cx + kx, cy - ry, cx + rx, cy - ky, cx + rx, cy);\n b.close();\n return transformPath(b.build(), m);\n}\n\n/** `<circle cx cy r>` → ellipse with rx === ry. */\nexport function circleToPath(\n cx: number, cy: number, r: number, m: Matrix = IDENTITY_MATRIX,\n): Path {\n return ellipseToPath(cx, cy, r, r, m);\n}\n\n/** `<line x1 y1 x2 y2>` → open 2-anchor polygon. */\nexport function lineToPath(\n x1: number, y1: number, x2: number, y2: number,\n m: Matrix = IDENTITY_MATRIX,\n): Path {\n const b = new PathBuilder();\n b.moveTo(x1, y1);\n b.lineTo(x2, y2);\n return transformPath(b.build(), m);\n}\n\n/** Parse SVG `points=\"x1,y1 x2,y2 ...\"` to a flat list. */\nexport function parsePoints(raw: string): { x: number; y: number }[] {\n const out: { x: number; y: number }[] = [];\n const nums = raw.match(/[-+]?(?:\\d*\\.\\d+|\\d+\\.?)(?:[eE][-+]?\\d+)?/g);\n if (!nums) return out;\n for (let i = 0; i + 1 < nums.length; i += 2) {\n out.push({ x: parseFloat(nums[i]), y: parseFloat(nums[i + 1]) });\n }\n return out;\n}\n\n/** `<polyline points=\"...\">` → open polygon. */\nexport function polylineToPath(\n points: readonly { x: number; y: number }[],\n m: Matrix = IDENTITY_MATRIX,\n): Path {\n if (points.length === 0) {\n return { kind: 'polygon', commands: new Uint8Array(), coords: new Float32Array(), fillRule: 'nonzero' };\n }\n const b = new PathBuilder();\n b.moveTo(points[0].x, points[0].y);\n for (let i = 1; i < points.length; i++) b.lineTo(points[i].x, points[i].y);\n return transformPath(b.build(), m);\n}\n\n/** `<polygon points=\"...\">` → closed polygon. */\nexport function polygonToPath(\n points: readonly { x: number; y: number }[],\n m: Matrix = IDENTITY_MATRIX,\n): Path {\n if (points.length === 0) {\n return { kind: 'polygon', commands: new Uint8Array(), coords: new Float32Array(), fillRule: 'nonzero' };\n }\n const b = new PathBuilder();\n b.moveTo(points[0].x, points[0].y);\n for (let i = 1; i < points.length; i++) b.lineTo(points[i].x, points[i].y);\n b.close();\n return transformPath(b.build(), m);\n}\n\n// Re-export the path opcodes for any callers that want to introspect.\nexport { PATH_M, PATH_L, PATH_C, PATH_Q, PATH_Z };\n","/**\n * SVG color / paint parsing. Handles the SVG-specific paint surface — the\n * sentinel `none`, `url(#id)` paint-server references, and `currentColor` —\n * then delegates the actual color tokenization (hex, `rgb()`/`rgba()`,\n * `hsl()`, and the full CSS named-color table) to the kit's `parseColor`.\n * Output is normalized to `#rrggbb` plus a separate 0..1 alpha so the rest\n * of the pipeline doesn't have to know about the encoding variants.\n */\n\nimport { parseColor, rgbaToHex } from '@weasel-js/core';\n\n/** Result of parsing a `fill=` / `stroke=` attribute value. */\nexport type ParsedColor =\n | { kind: 'none' }\n | { kind: 'solid'; color: string; alpha: number }\n | { kind: 'ref'; id: string };\n\n/**\n * Parse an SVG paint string. Returns `null` for inputs we don't recognize\n * (so the caller can emit a warning and fall back). `currentColor` resolves\n * to black here as a last-resort default; callers that participate in the\n * cascade (`readPaint`, `readTextStyle`, `readTspanRun`) pre-resolve\n * `currentColor` against the inherited `color` via `resolveCurrentColor`\n * before this function ever sees it.\n */\nexport function parsePaintAttr(raw: string | null | undefined): ParsedColor | null {\n if (raw == null) return null;\n const s = raw.trim();\n if (s === '') return null;\n if (s === 'none') return { kind: 'none' };\n if (s === 'currentColor' || s === 'currentcolor') {\n return { kind: 'solid', color: '#000000', alpha: 1 };\n }\n // url(#id) reference.\n const urlMatch = /^url\\(\\s*#([^)\\s]+)\\s*\\)/.exec(s);\n if (urlMatch) return { kind: 'ref', id: urlMatch[1] };\n // Everything else — hex, rgb()/rgba(), hsl()/hsla(), and named colors —\n // goes through the kit's CSS parser. It throws on unrecognized input;\n // we translate that into the `null` the caller expects.\n try {\n const [r, g, b, a] = parseColor(s);\n // Split into the `#rrggbb` + 0..1 alpha contract the rest of the SVG\n // pipeline depends on. `rgbaToHex` of a 3-tuple always emits 6-char,\n // lowercase hex; the alpha is carried separately.\n return { kind: 'solid', color: rgbaToHex([r, g, b]), alpha: a };\n } catch {\n return null;\n }\n}\n","/**\n * 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 { trimNumber } from './transform';\n\ntype PatternFill = Extract<FillStyle, { fill: 'pattern' }>;\n\n/** Collected pattern definitions, keyed by element id. */\nexport type PatternTable = Map<string, FillStyle>;\n\n/** Whether a pattern paint carries a serializable spec. */\nexport function patternSpecOf(paint: PatternFill): TilePatternSpec | null {\n return 'tile' in paint.pattern ? paint.pattern : null;\n}\n\nexport function patternXml(id: string, paint: PatternFill, onWarn?: (m: string) => void): string {\n const spec = patternSpecOf(paint);\n if (!spec) {\n onWarn?.('pattern fill carries a TextureHandle, which has no vector form — omitted from <defs>');\n return '';\n }\n const geometry = tileGeometry(spec);\n const body = geometry.shapes.map(shapeXml).join('');\n const origin = paint.origin ?? { x: 0, y: 0 };\n const attrs = [\n `id=\"${id}\"`,\n 'patternUnits=\"userSpaceOnUse\"',\n `width=\"${trimNumber(geometry.size)}\"`,\n `height=\"${trimNumber(geometry.size)}\"`,\n ];\n if (origin.x !== 0 || origin.y !== 0) {\n attrs.push(`x=\"${trimNumber(origin.x)}\"`, `y=\"${trimNumber(origin.y)}\"`);\n }\n attrs.push(`data-weasel-tile=\"${escapeAttr(JSON.stringify(spec))}\"`);\n return `<pattern ${attrs.join(' ')}>${body}</pattern>`;\n}\n\n/**\n * A single tile as a standalone `<svg>` document, sized to its own extent.\n * For UI that needs to show a tile outside a document — a picker swatch,\n * set as a repeating CSS `background-image` via a data URI. Shares the shape\n * mapper with `patternXml`, so a preview can't drift from what paints.\n */\nexport function tilePreviewSvg(spec: TilePatternSpec, background?: string): string {\n const geometry = tileGeometry(spec);\n const s = trimNumber(geometry.size);\n const bg = background\n ? `<rect width=\"${s}\" height=\"${s}\" fill=\"${background}\"/>`\n : '';\n return `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${s}\" height=\"${s}\" `\n + `viewBox=\"0 0 ${s} ${s}\">${bg}${geometry.shapes.map(shapeXml).join('')}</svg>`;\n}\n\n/** `tilePreviewSvg` packed as a `url(...)` value for CSS `background-image`. */\nexport function tilePreviewCssUrl(spec: TilePatternSpec, background?: string): string {\n return `url(\"data:image/svg+xml,${encodeURIComponent(tilePreviewSvg(spec, background))}\")`;\n}\n\nfunction shapeXml(shape: TileShape): string {\n switch (shape.kind) {\n case 'line':\n return `<line x1=\"${trimNumber(shape.x1)}\" y1=\"${trimNumber(shape.y1)}\" `\n + `x2=\"${trimNumber(shape.x2)}\" y2=\"${trimNumber(shape.y2)}\" `\n + `stroke=\"${shape.color}\" stroke-width=\"${trimNumber(shape.width)}\"/>`;\n case 'circle':\n return `<circle cx=\"${trimNumber(shape.cx)}\" cy=\"${trimNumber(shape.cy)}\" `\n + `r=\"${trimNumber(shape.r)}\" fill=\"${shape.color}\"/>`;\n case 'ellipse': {\n const deg = (shape.rotation * 180) / Math.PI;\n const transform = deg === 0\n ? ''\n : ` transform=\"rotate(${trimNumber(deg)} ${trimNumber(shape.cx)} ${trimNumber(shape.cy)})\"`;\n return `<ellipse cx=\"${trimNumber(shape.cx)}\" cy=\"${trimNumber(shape.cy)}\" `\n + `rx=\"${trimNumber(shape.rx)}\" ry=\"${trimNumber(shape.ry)}\" `\n + `fill=\"${shape.color}\"${transform}/>`;\n }\n case 'rect':\n return `<rect x=\"${trimNumber(shape.x)}\" y=\"${trimNumber(shape.y)}\" `\n + `width=\"${trimNumber(shape.width)}\" height=\"${trimNumber(shape.height)}\" `\n + `fill=\"${shape.color}\"/>`;\n default:\n return '';\n }\n}\n\n/** Read `<pattern>` children of `<defs>` back into pattern paints. */\nexport function collectPatterns(svg: Element, onWarn?: (m: string) => void): PatternTable {\n const out: PatternTable = new Map();\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 if (child.tagName.toLowerCase() !== 'pattern') continue;\n const id = child.getAttribute('id');\n if (!id) continue;\n const paint = readPattern(child, onWarn);\n if (paint) out.set(id, paint);\n }\n }\n return out;\n}\n\nfunction readPattern(el: Element, onWarn?: (m: string) => void): FillStyle | null {\n const raw = el.getAttribute('data-weasel-tile');\n if (!raw) {\n // A hand-authored pattern (Illustrator, Inkscape) holds arbitrary\n // geometry no `TilePatternSpec` can express. Recognizing it would mean\n // reverse-engineering a tile from its children; dropping it with a\n // warning is honest, and the element survives in the source file.\n onWarn?.(`<pattern id=\"${el.getAttribute('id')}\"> has no data-weasel-tile — unsupported pattern, dropped`);\n return null;\n }\n let spec: TilePatternSpec;\n try {\n spec = JSON.parse(raw) as TilePatternSpec;\n } catch {\n onWarn?.(`<pattern id=\"${el.getAttribute('id')}\"> has malformed data-weasel-tile — dropped`);\n return null;\n }\n if (typeof spec?.tile !== 'string' || typeof spec?.color !== 'string') {\n onWarn?.(`<pattern id=\"${el.getAttribute('id')}\"> data-weasel-tile is not a tile spec — dropped`);\n return null;\n }\n const x = parseFloat(el.getAttribute('x') ?? '0');\n const y = parseFloat(el.getAttribute('y') ?? '0');\n const paint: PatternFill = { fill: 'pattern', pattern: spec };\n if (x !== 0 || y !== 0) paint.origin = { x, y };\n return paint;\n}\n\nfunction escapeAttr(s: string): string {\n return s\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"');\n}\n","/**\n * Map between SVG `<linearGradient>` / `<radialGradient>` elements and\n * weasel's `FillStyle` gradient variants. We collect gradients from\n * `<defs>` during parse and look them up by id 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 type { FillStyle, GradStop } from '@weasel-js/core';\nimport { parsePaintAttr } from './color';\nimport { trimNumber } from './transform';\nimport { patternXml } from './patterns';\n\n/** Collected gradient definitions, keyed by element id. */\nexport type GradientTable = Map<string, FillStyle>;\n\n/** Read the children of `<defs>` and extract supported gradient nodes. */\nexport function collectGradients(svg: Element, onWarn?: (m: string) => void): GradientTable {\n const out: GradientTable = new Map();\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 const id = child.getAttribute('id');\n if (!id) continue;\n if (tag === 'lineargradient') {\n const paint = readLinearGradient(child, onWarn);\n if (paint) out.set(id, paint);\n } else if (tag === 'radialgradient') {\n const paint = readRadialGradient(child, onWarn);\n if (paint) out.set(id, paint);\n } else if (tag !== 'pattern') {\n // `<pattern>` is collected separately by `collectPatterns`.\n onWarn?.(`unsupported <defs> child: <${child.tagName}>`);\n }\n }\n }\n return out;\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 = c.getAttribute('offset') ?? '0';\n const offset = offsetRaw.endsWith('%')\n ? parseFloat(offsetRaw) / 100\n : parseFloat(offsetRaw);\n const colorAttr = c.getAttribute('stop-color') ?? '#000000';\n const parsed = parsePaintAttr(colorAttr);\n if (parsed && parsed.kind === 'solid') {\n const opacityAttr = c.getAttribute('stop-opacity');\n const alpha = opacityAttr != null ? parseFloat(opacityAttr) : 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\nfunction readLinearGradient(el: Element, onWarn?: (m: string) => void): FillStyle | null {\n const x1 = parseFloat(el.getAttribute('x1') ?? '0');\n const y1 = parseFloat(el.getAttribute('y1') ?? '0');\n const x2 = parseFloat(el.getAttribute('x2') ?? '1');\n const y2 = parseFloat(el.getAttribute('y2') ?? '0');\n const stops = readStops(el, onWarn);\n return {\n fill: 'linear-gradient',\n from: { x: x1, y: y1 },\n to: { x: x2, y: y2 },\n stops,\n };\n}\n\nfunction readRadialGradient(el: Element, onWarn?: (m: string) => void): FillStyle | null {\n const cx = parseFloat(el.getAttribute('cx') ?? '0.5');\n const cy = parseFloat(el.getAttribute('cy') ?? '0.5');\n const r = parseFloat(el.getAttribute('r') ?? '0.5');\n const stops = readStops(el, onWarn);\n return {\n fill: 'radial-gradient',\n center: { x: cx, y: cy },\n radius: r,\n stops,\n };\n}\n\n/**\n * Pre-pass that assigns stable serialization ids to the paint servers —\n * gradients and patterns — used by any leaf in the tree. We key on object\n * identity so two leaves sharing the exact same `FillStyle` reference reuse\n * one `<defs>` entry; structurally equal but distinct objects get separate\n * ids.\n */\nexport class PaintServerRegistry {\n private byPaint = new Map<FillStyle, string>();\n private order: FillStyle[] = [];\n private counter = 0;\n\n 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 /** Emit `<defs>...</defs>` XML for every registered paint server. */\n toDefsXml(onWarn?: (m: string) => void): string {\n if (this.order.length === 0) return '';\n const parts: string[] = ['<defs>'];\n for (const paint of this.order) {\n const id = this.byPaint.get(paint)!;\n parts.push(\n paint.fill === 'pattern'\n ? patternXml(id, paint, onWarn)\n : gradientXml(id, paint),\n );\n }\n parts.push('</defs>');\n return parts.join('');\n }\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=\"userSpaceOnUse\" ` +\n `x1=\"${trimNumber(paint.from.x)}\" y1=\"${trimNumber(paint.from.y)}\" ` +\n `x2=\"${trimNumber(paint.to.x)}\" y2=\"${trimNumber(paint.to.y)}\">${stops}</linearGradient>`\n );\n }\n if (paint.fill === 'radial-gradient') {\n const stops = paint.stops.map(stopXml).join('');\n return (\n `<radialGradient id=\"${id}\" gradientUnits=\"userSpaceOnUse\" ` +\n `cx=\"${trimNumber(paint.center.x)}\" cy=\"${trimNumber(paint.center.y)}\" ` +\n `r=\"${trimNumber(paint.radius)}\">${stops}</radialGradient>`\n );\n }\n return '';\n}\n\nfunction stopXml(s: GradStop): string {\n // Detect packed-alpha hex (#rrggbbaa) and split out stop-opacity.\n const m = /^#([0-9a-f]{6})([0-9a-f]{2})$/i.exec(s.color);\n if (m) {\n const alpha = parseInt(m[2], 16) / 255;\n return `<stop offset=\"${trimNumber(s.offset)}\" stop-color=\"#${m[1].toLowerCase()}\" stop-opacity=\"${trimNumber(alpha)}\"/>`;\n }\n return `<stop offset=\"${trimNumber(s.offset)}\" stop-color=\"${s.color}\"/>`;\n}\n","/**\n * SVG presentation-attribute cascade.\n *\n * Most SVG paint/text properties inherit down the element tree. Rather than\n * re-walking the DOM parent chain per attribute at leaf-emit time, the parser\n * threads a resolved `StyleContext` down through the recursion (alongside the\n * transform matrix): at each element we fold the element's own attributes onto\n * the inherited cascade once, and leaves read resolved values directly.\n */\n\n/**\n * Raw resolved value of each inheritable presentation property in effect at a\n * point in the tree. An absent key means the property is unset all the way up,\n * and the consumer applies its own default (matching the pre-cascade\n * `readInheritedAttr` → null contract). Values are raw SVG strings; callers\n * parse them (color, number, keyword, …).\n */\nexport type StyleContext = Readonly<Record<string, string>>;\n\n/** The empty cascade — seeds the root. */\nexport const EMPTY_STYLE: StyleContext = {};\n\n/**\n * Inheritable presentation properties the leaf/text parsers consume. Extend\n * this list (and teach the consuming leaf to read the new key) to inherit a\n * new property — no per-attribute DOM walk required.\n */\nconst INHERITABLE = [\n 'fill', 'fill-opacity', 'fill-rule',\n 'stroke', 'stroke-width', 'stroke-opacity',\n 'stroke-linecap', 'stroke-linejoin', 'stroke-dasharray', 'stroke-miterlimit',\n 'color',\n 'font-size', 'font-family', 'font-weight', 'font-style', 'text-anchor',\n 'letter-spacing', 'text-decoration',\n] as const;\n\n/**\n * Extract a single `style=\"prop:value\"` declaration. Returns the trimmed value\n * or null when absent. Regex scan — not a full CSS parser; no `!important`.\n */\nexport function readStyleProp(el: Element, prop: string): string | null {\n const style = el.getAttribute('style');\n if (!style) return null;\n const re = new RegExp(`(?:^|;)\\\\s*${prop}\\\\s*:\\\\s*([^;]+)`, 'i');\n const m = re.exec(style);\n if (!m) return null;\n return m[1].trim();\n}\n\n/**\n * Resolve an element's own value for a property: `style=\"\"` beats the\n * presentation attribute on the same element (SVG2 specificity).\n */\nexport function ownProp(el: Element, prop: string): string | null {\n return readStyleProp(el, prop) ?? el.getAttribute(prop);\n}\n\n/**\n * Fold an element's own presentation attributes onto the inherited cascade.\n * A property that is absent or literally `inherit` keeps the parent value;\n * any other own value overrides. Returns the parent unchanged (same object)\n * when the element sets no inheritable property, avoiding a needless clone.\n */\nexport function deriveStyle(parent: StyleContext, el: Element): StyleContext {\n let next: Record<string, string> | null = null;\n for (const prop of INHERITABLE) {\n const own = ownProp(el, prop);\n if (own == null || own === 'inherit') continue;\n if (!next) next = { ...parent };\n next[prop] = own;\n }\n return next ?? parent;\n}\n\n/**\n * Resolve a paint value that may be the `currentColor` keyword against the\n * cascade's `color`. Non-currentColor values pass through; null passes through.\n * `color`'s SVG initial value is black.\n */\nexport function resolveCurrentColor(raw: string | null, style: StyleContext): string | null {\n if (raw == null) return null;\n if (raw.trim().toLowerCase() === 'currentcolor') return style['color'] ?? '#000000';\n return raw;\n}\n","/**\n * Parse an SVG document string into a `SvgNode[]` tree. Walks the SVG\n * DOM (via the platform's `DOMParser` — jsdom in tests, the browser at\n * runtime) and lowers each supported element to weasel-native shapes.\n *\n * Transforms are pushed onto a matrix stack and collapsed into leaf\n * geometry at the moment a leaf is created, so the output tree never\n * carries `transform` data — even on `<g>` nodes.\n */\n\nimport type { Path, PolygonPath } from '@weasel-js/core';\nimport { PATH_L, PATH_M, PATH_Z, pathFromD } 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,\n} from './types';\nimport type { StyledRun, TextStyle, FillStyle, Stroke } from '@weasel-js/core';\nimport { multiply, parseTransform, decomposeRotation, rotationComponent, isIdentity } from './transform';\nimport { boundsOfPath } from '@weasel-js/core';\nimport { IDENTITY_MATRIX } from './types';\nimport { parsePaintAttr } from './color';\nimport { collectGradients, type GradientTable } from './gradients';\nimport { collectPatterns } from './patterns';\nimport { deriveStyle, EMPTY_STYLE, ownProp, resolveCurrentColor, type StyleContext } from './cascade';\n\n/** 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(['defs', 'linearGradient', 'radialGradient', 'title', 'desc', 'metadata']);\n\n/**\n * Public entry point: parse an SVG document string. Errors during DOM\n * parsing produce a `ParseResult` with an empty `nodes` array and a\n * warning describing the issue, rather than throwing.\n */\nexport function parseSvg(svg: string, opts: ParseOptions = {}): ParseResult {\n const warnings: string[] = [];\n const onWarn = (m: string): void => { warnings.push(m); };\n\n let doc: Document;\n try {\n doc = new DOMParser().parseFromString(svg, 'image/svg+xml');\n } catch (e) {\n return { nodes: [], warnings: [`failed to parse SVG: ${(e as Error).message}`] };\n }\n const errEl = doc.getElementsByTagName('parsererror')[0];\n if (errEl) {\n return { nodes: [], warnings: [`SVG parse error: ${errEl.textContent ?? 'unknown'}`] };\n }\n const root = doc.documentElement;\n if (!root || root.tagName.toLowerCase() !== 'svg') {\n return { nodes: [], warnings: ['root element is not <svg>'] };\n }\n\n const namespaces = opts.namespaces ?? {};\n // Build a URI → prefix index for fast lookup during traversal.\n const uriToPrefix = new Map<string, string>();\n for (const [prefix, uri] of Object.entries(namespaces)) {\n uriToPrefix.set(uri, prefix);\n }\n\n const documentMeta = collectDocumentMeta(root, uriToPrefix);\n\n // Both paint-server kinds resolve through one `url(#id)` table, so a\n // patterned fill needs no separate lookup path at every use site.\n const gradients = collectGradients(root, onWarn);\n for (const [id, paint] of collectPatterns(root, onWarn)) gradients.set(id, paint);\n const rootStyle = deriveStyle(EMPTY_STYLE, root);\n const nodes = parseChildren(root, IDENTITY_MATRIX, rootStyle, gradients, onWarn, uriToPrefix);\n\n const result: ParseResult = { nodes, warnings };\n if (documentMeta) result.documentMeta = documentMeta;\n const viewBox = parseViewBoxAttr(root.getAttribute('viewBox'));\n if (viewBox) result.viewBox = viewBox;\n const widthAttr = root.getAttribute('width');\n if (widthAttr != null) {\n const n = parseFloat(widthAttr);\n if (Number.isFinite(n)) result.width = n;\n }\n const heightAttr = root.getAttribute('height');\n if (heightAttr != null) {\n const n = parseFloat(heightAttr);\n if (Number.isFinite(n)) result.height = n;\n }\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\nfunction collectDocumentMeta(\n root: Element,\n uriToPrefix: Map<string, string>,\n): NamespaceMeta | undefined {\n if (uriToPrefix.size === 0) return undefined;\n const meta: NamespaceMeta = {};\n\n // Root-level namespaced attributes.\n for (let i = 0; i < root.attributes.length; i++) {\n const a = root.attributes[i];\n if (!a.namespaceURI) continue;\n const prefix = uriToPrefix.get(a.namespaceURI);\n if (!prefix) continue;\n const bucket = (meta[prefix] ??= {});\n (bucket.attrs ??= {})[a.localName] = a.value;\n }\n\n // Root-level namespaced child elements. The body of these is collected\n // recursively as a generic XML-element tree; geometry inside them is NOT\n // promoted to SvgNodes (that's the consumer's job if they want it).\n for (let i = 0; i < root.children.length; i++) {\n const c = root.children[i];\n if (!c.namespaceURI) continue;\n const prefix = uriToPrefix.get(c.namespaceURI);\n if (!prefix) continue;\n const bucket = (meta[prefix] ??= {});\n const elements = (bucket.elements ??= {});\n const list = (elements[c.localName] ??= []);\n list.push(collectNamespacedElement(c, uriToPrefix));\n }\n\n return Object.keys(meta).length > 0 ? meta : undefined;\n}\n\nfunction collectNamespacedElement(\n el: Element,\n uriToPrefix: Map<string, string>,\n): NamespacedElement {\n const result: NamespacedElement = { attrs: {} };\n for (let i = 0; i < el.attributes.length; i++) {\n const a = el.attributes[i];\n // For namespaced *elements* we collect every attribute (namespaced or\n // not) under the element — unlike root attrs where we filter by NS.\n // Treat `xmlns:*` as structural and skip.\n if (a.name.startsWith('xmlns')) continue;\n result.attrs[a.localName] = a.value;\n }\n\n let hasChildElements = false;\n for (let i = 0; i < el.children.length; i++) {\n const c = el.children[i];\n if (!c.namespaceURI) continue;\n const prefix = uriToPrefix.get(c.namespaceURI);\n if (!prefix) continue; // child in undeclared NS: drop\n hasChildElements = true;\n const children = (result.children ??= {});\n const list = (children[c.localName] ??= []);\n list.push(collectNamespacedElement(c, uriToPrefix));\n }\n\n if (!hasChildElements && el.textContent != null && el.textContent.trim() !== '') {\n result.text = el.textContent;\n }\n\n return result;\n}\n\n/** Per-element namespace meta: walked at every parsed SVG element. */\nfunction collectElementMeta(\n el: Element,\n uriToPrefix: Map<string, string>,\n): NamespaceMeta | undefined {\n if (uriToPrefix.size === 0) return undefined;\n const meta: NamespaceMeta = {};\n for (let i = 0; i < el.attributes.length; i++) {\n const a = el.attributes[i];\n if (!a.namespaceURI) continue;\n const prefix = uriToPrefix.get(a.namespaceURI);\n if (!prefix) continue;\n const bucket = (meta[prefix] ??= {});\n (bucket.attrs ??= {})[a.localName] = a.value;\n }\n // Namespaced child elements on a *standard* SVG element (e.g. a <g>) are\n // also surfaced under elements[] in the same shape used at the root.\n for (let i = 0; i < el.children.length; i++) {\n const c = el.children[i];\n if (!c.namespaceURI) continue;\n const prefix = uriToPrefix.get(c.namespaceURI);\n if (!prefix) continue;\n const bucket = (meta[prefix] ??= {});\n const elements = (bucket.elements ??= {});\n const list = (elements[c.localName] ??= []);\n list.push(collectNamespacedElement(c, uriToPrefix));\n }\n return Object.keys(meta).length > 0 ? meta : undefined;\n}\n\nfunction parseChildren(\n parent: Element,\n ctm: Matrix,\n style: StyleContext,\n gradients: GradientTable,\n onWarn: (m: string) => void,\n uriToPrefix: Map<string, string>,\n): SvgNode[] {\n const out: SvgNode[] = [];\n for (let i = 0; i < parent.children.length; i++) {\n const el = parent.children[i];\n // Skip namespaced children — they belong to `meta.elements`, not nodes.\n // (DOM gives SVG-native elements `http://www.w3.org/2000/svg`.)\n const ns = el.namespaceURI;\n if (ns && ns !== 'http://www.w3.org/2000/svg') continue;\n const node = parseElement(el, ctm, style, gradients, onWarn, uriToPrefix);\n if (node) {\n if (Array.isArray(node)) out.push(...node);\n else out.push(node);\n }\n }\n return out;\n}\n\nfunction parseElement(\n el: Element,\n ctm: Matrix,\n style: StyleContext,\n gradients: GradientTable,\n onWarn: (m: string) => void,\n uriToPrefix: Map<string, string>,\n): SvgNode | SvgNode[] | null {\n const tag = el.tagName.toLowerCase();\n if (IGNORED_TAGS.has(tag)) return null;\n if (tag === 'g') {\n const local = parseTransform(el.getAttribute('transform'), onWarn);\n const childCtm = multiply(ctm, local);\n const childStyle = deriveStyle(style, el);\n const children = parseChildren(el, childCtm, childStyle, gradients, onWarn, uriToPrefix);\n const opacity = readOpacityAttr(el, 'opacity');\n const group: SvgNode = { kind: 'group', children };\n if (opacity != null) group.opacity = opacity;\n const meta = collectElementMeta(el, uriToPrefix);\n if (meta) group.meta = meta;\n return group;\n }\n if (SUPPORTED_GROUP_TAGS.has(tag)) {\n // Nested <svg> — transparent group; inheritance flows through it.\n const childStyle = deriveStyle(style, el);\n return parseChildren(el, ctm, childStyle, gradients, onWarn, uriToPrefix);\n }\n if (tag === 'text') {\n const textNode = parseTextElement(el, ctm, style, gradients, onWarn);\n if (textNode && !Array.isArray(textNode) && textNode.kind === 'text') {\n const meta = collectElementMeta(el, uriToPrefix);\n if (meta) textNode.meta = meta;\n }\n return textNode;\n }\n if (!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 const bounds = pathAabb(path);\n const cx = bounds.x + bounds.width / 2;\n const cy = bounds.y + bounds.height / 2;\n const angle = decomposeRotation(localTransform, cx, cy);\n if (angle != null) {\n rotation = angle;\n } else {\n // Bake the matrix in — match legacy behavior.\n path = transformPath(path, localTransform);\n const rotComp = rotationComponent(localTransform);\n if (Math.abs(rotComp) > 1e-4) {\n onWarn(`leaf transform has a rotational component that can't be cleanly stored as rotation; baked into geometry (may not round-trip identically)`);\n }\n }\n }\n const leafStyle = deriveStyle(style, el);\n const fill = readPaint(leafStyle, 'fill', '#000000', gradients, onWarn);\n const stroke = readStroke(leafStyle, gradients, onWarn);\n const opacity = readOpacityAttr(el, 'opacity');\n // `fill-rule` defaults to `nonzero`; only stamp when explicitly `evenodd`\n // and the lowered geometry is a PolygonPath (RectPath has no fillRule slot).\n const fillRuleRaw = leafStyle['fill-rule'] ?? null;\n if (fillRuleRaw === 'evenodd' && path.kind === 'polygon') {\n path = { ...path, fillRule: 'evenodd' };\n }\n const node: SvgPathNode = { kind: 'path', path, fill };\n if (stroke) node.stroke = stroke;\n if (opacity != null) node.opacity = opacity;\n if (rotation != null) node.rotation = rotation;\n // Lines are stroke-only by SVG convention; force fill=none if neither the\n // line nor an ancestor group specifies a fill.\n if (tag === 'line' && (leafStyle['fill'] ?? null) == null) {\n node.fill = { kind: 'none' };\n }\n if (tag === 'polyline' && !el.hasAttribute('fill')) {\n // <polyline> defaults to fill=black per spec but the common-case\n // intent is stroke-only. Match the spec default to preserve\n // round-trip honesty; callers can override.\n }\n const meta = collectElementMeta(el, uriToPrefix);\n if (meta) node.meta = meta;\n return node;\n}\n\nfunction lowerLeaf(\n el: Element,\n tag: string,\n m: Matrix,\n onWarn: (msg: string) => void,\n): Path | null {\n const num = (name: string, fallback = 0): number => {\n const v = el.getAttribute(name);\n if (v == null) return fallback;\n const n = parseFloat(v);\n return Number.isFinite(n) ? n : fallback;\n };\n if (tag === 'rect') {\n const x = num('x', 0);\n const y = num('y', 0);\n const w = num('width', 0);\n const h = num('height', 0);\n const rx = num('rx', 0);\n const ry = num('ry', 0);\n return rectElementToPath(x, y, w, h, rx, ry, m);\n }\n if (tag === 'circle') return circleToPath(num('cx'), num('cy'), num('r'), m);\n if (tag === 'ellipse') return ellipseToPath(num('cx'), num('cy'), num('rx'), num('ry'), m);\n if (tag === 'line') return lineToPath(num('x1'), num('y1'), num('x2'), num('y2'), m);\n if (tag === 'polyline') return polylineToPath(parsePoints(el.getAttribute('points') ?? ''), m);\n if (tag === 'polygon') return polygonToPath(parsePoints(el.getAttribute('points') ?? ''), m);\n if (tag === 'path') {\n const d = el.getAttribute('d') ?? '';\n if (!d.trim()) {\n onWarn('<path> with empty d=');\n return null;\n }\n const raw = pathFromD(d, onWarn);\n const transformed = transformPath(raw, m);\n // Reconstitute axis-aligned rectangles so a `{ kind: 'rect' }` source\n // node round-trips back into a `{ kind: 'rect' }` parsed node.\n if (transformed.kind === 'polygon') {\n const rect = polygonToRectIfAxisAligned(transformed);\n if (rect) return rect;\n }\n return transformed;\n }\n return null;\n}\n\n/**\n * Detect a polygon whose 4 vertices form an axis-aligned rectangle (in\n * the canonical `M L L L Z` order produced by our serializer), and\n * reconstitute it as a `RectPath`. Returns null on any deviation.\n */\nfunction polygonToRectIfAxisAligned(p: PolygonPath): Path | null {\n const cmds = p.commands;\n if (cmds.length !== 5) return null;\n if (cmds[0] !== PATH_M) return null;\n if (cmds[1] !== PATH_L || cmds[2] !== PATH_L || cmds[3] !== PATH_L) return null;\n if (cmds[4] !== PATH_Z) return null;\n const c = p.coords;\n if (c.length !== 8) return null;\n const x0 = c[0], y0 = c[1];\n const x1 = c[2], y1 = c[3];\n const x2 = c[4], y2 = c[5];\n const x3 = c[6], y3 = c[7];\n // Axis-aligned rectangle: top edge horizontal, right edge vertical, etc.\n if (y0 !== y1 || x1 !== x2 || y2 !== y3 || x3 !== x0) return null;\n const x = Math.min(x0, x1);\n const y = Math.min(y0, y2);\n const width = Math.abs(x1 - x0);\n const height = Math.abs(y2 - y1);\n if (width === 0 || height === 0) return null;\n return { kind: 'rect', x, y, width, height };\n}\n\n/**\n * Compute a `Path`'s axis-aligned bounding box. Mirrors the helper used by\n * the serializer for rotation pivot resolution; keep the duplication local\n * to parse.ts for now — lift to a shared module if a third call site\n * appears.\n */\nfunction pathAabb(path: Path): { x: number; y: number; width: number; height: number } {\n if (path.kind === 'rect') {\n return { x: path.x, y: path.y, width: path.width, height: path.height };\n }\n return boundsOfPath(path);\n}\n\nfunction readPaint(\n style: StyleContext,\n attr: 'fill' | 'stroke',\n defaultColor: string,\n gradients: GradientTable,\n onWarn: (msg: string) => void,\n): SvgPaint {\n const raw = resolveCurrentColor(style[attr] ?? null, style);\n const opacityRaw = style[`${attr}-opacity`] ?? null;\n const opacity = opacityRaw != null ? clamp01(parseFloat(opacityRaw)) : undefined;\n if (raw == null) {\n if (attr === 'stroke') return { kind: 'none' };\n const out: SvgPaint = { kind: 'solid', color: defaultColor };\n if (opacity != null) (out as { opacity?: number }).opacity = opacity;\n return out;\n }\n const parsed = parsePaintAttr(raw);\n if (!parsed) {\n onWarn(`unrecognized ${attr} value: ${raw}`);\n return { kind: 'solid', color: defaultColor };\n }\n if (parsed.kind === 'none') return { kind: 'none' };\n if (parsed.kind === 'ref') {\n const paint = gradients.get(parsed.id);\n if (!paint) {\n onWarn(`${attr} references unknown gradient #${parsed.id}`);\n return { kind: 'solid', color: defaultColor };\n }\n return { kind: 'gradient', paint };\n }\n const out: SvgPaint = { kind: 'solid', color: parsed.color };\n const a = opacity ?? (parsed.alpha < 1 ? parsed.alpha : undefined);\n if (a != null) (out as { opacity?: number }).opacity = a;\n return out;\n}\n\nfunction readStroke(\n style: StyleContext,\n gradients: GradientTable,\n onWarn: (msg: string) => void,\n): SvgStroke | undefined {\n const inheritedStroke = style['stroke'] ?? null;\n const inheritedWidth = style['stroke-width'] ?? null;\n if (inheritedStroke == null && inheritedWidth == null) return undefined;\n const paint = readPaint(style, 'stroke', '#000000', gradients, onWarn);\n if (paint.kind === 'none') return undefined;\n const width = inheritedWidth != null ? parseFloat(inheritedWidth) : 1;\n const stroke: SvgStroke = { paint, width };\n const opacityRaw = style['stroke-opacity'] ?? null;\n if (opacityRaw != null) {\n const a = clamp01(parseFloat(opacityRaw));\n if (Number.isFinite(a)) stroke.opacity = a;\n }\n const cap = style['stroke-linecap'] ?? null;\n if (cap === 'butt' || cap === 'round' || cap === 'square') {\n stroke.cap = cap;\n } else if (cap != null) {\n onWarn(`unsupported stroke-linecap: ${cap}`);\n }\n const join = style['stroke-linejoin'] ?? null;\n if (join === 'miter' || join === 'round' || join === 'bevel') {\n stroke.join = join;\n } else if (join === 'arcs' || join === 'miter-clip') {\n onWarn(`stroke-linejoin \"${join}\" not supported; falling back to miter`);\n stroke.join = 'miter';\n } else if (join != null) {\n onWarn(`unsupported stroke-linejoin: ${join}`);\n }\n const dashAttr = style['stroke-dasharray'] ?? null;\n if (dashAttr != null && dashAttr.trim() !== '' && dashAttr.trim() !== 'none') {\n const parsed = parseDashArray(dashAttr);\n if (parsed) stroke.dash = parsed;\n else onWarn(`unrecognized stroke-dasharray: ${dashAttr}`);\n }\n const miterAttr = style['stroke-miterlimit'] ?? null;\n if (miterAttr != null) {\n const m = parseFloat(miterAttr);\n if (Number.isFinite(m) && m >= 1) stroke.miterLimit = m;\n else onWarn(`unrecognized stroke-miterlimit: ${miterAttr}`);\n }\n 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 = [\n 'stroke', 'stroke-width', 'stroke-opacity', 'stroke-linecap',\n 'stroke-linejoin', 'stroke-dasharray', 'stroke-miterlimit',\n] as const;\n\nfunction ownStrokeStyle(el: Element): StyleContext {\n const out: Record<string, string> = {};\n for (const k of STROKE_KEYS) {\n const v = ownProp(el, k);\n if (v != null) out[k] = v;\n }\n return out;\n}\n\n/**\n * Lower an {@link SvgStroke} to the kit's `Stroke`, whose paint is a\n * `FillStyle` rather than an `SvgPaint`. Returns `undefined` for a stroke\n * that paints nothing, so callers can leave the field absent.\n */\nfunction coreStroke(stroke: SvgStroke | undefined): Stroke | undefined {\n if (!stroke) return undefined;\n let paint: FillStyle;\n if (stroke.paint.kind === 'gradient') {\n paint = stroke.paint.paint;\n } else if (stroke.paint.kind === 'solid') {\n paint = stroke.paint.opacity != null\n ? { fill: 'solid', color: stroke.paint.color, opacity: stroke.paint.opacity }\n : { fill: 'solid', color: stroke.paint.color };\n } else {\n return undefined;\n }\n const out: Stroke = { paint, width: stroke.width };\n if (stroke.cap) out.cap = stroke.cap;\n if (stroke.join) out.join = stroke.join;\n if (stroke.dash) out.dash = stroke.dash;\n if (stroke.miterLimit != null) out.miterLimit = stroke.miterLimit;\n return out;\n}\n\n/**\n * Parse an SVG `stroke-dasharray` value into a non-negative number array.\n * Per spec, odd-length lists are duplicated to make the dash pattern even.\n * Returns null if any token fails to parse as a non-negative finite number.\n */\nfunction parseDashArray(s: string): number[] | null {\n const tokens = s.trim().split(/[\\s,]+/).filter(Boolean);\n if (tokens.length === 0) return null;\n const nums: number[] = [];\n for (const t of tokens) {\n const n = parseFloat(t);\n if (!Number.isFinite(n) || n < 0) return null;\n nums.push(n);\n }\n return nums.length % 2 === 1 ? [...nums, ...nums] : nums;\n}\n\nfunction readOpacityAttr(el: Element, name: string): number | undefined {\n const raw = el.getAttribute(name);\n if (raw == null) return undefined;\n const n = parseFloat(raw);\n return Number.isFinite(n) ? clamp01(n) : undefined;\n}\n\nfunction clamp01(n: number): number {\n return n < 0 ? 0 : n > 1 ? 1 : n;\n}\n\n/**\n * Parse an SVG `letter-spacing` value into world units. Accepts a bare\n * number, a `px` suffix, or the `normal` keyword (→ `undefined`, via the\n * `NaN` from `parseFloat('normal')`). Any other unit suffix (`em`, `%`,\n * `pt`, …) is still numerically coerced — `parseFloat` reads the leading\n * digits — but flagged, since e.g. `0.1em` silently becomes `0.1` world\n * units, off by a factor of the font size.\n */\nfunction parseLetterSpacing(raw: string, onWarn: (m: string) => void): number | undefined {\n const n = parseFloat(raw);\n if (!Number.isFinite(n)) return undefined;\n const unit = /^-?[\\d.]+([a-z%]+)$/i.exec(raw.trim())?.[1]?.toLowerCase();\n if (unit && unit !== 'px') {\n onWarn(`letter-spacing \"${raw}\" uses unit \"${unit}\", which is not converted; treated as ${n} world units`);\n }\n return n;\n}\n\n/**\n * Parse an SVG `text-decoration` value into the two boolean flags the runs\n * model uses. `text-decoration` is a space-separated list of line tokens\n * (`underline`, `line-through`, `overline`, `blink`, `none`), matched\n * case-insensitively per CSS keyword rules; we only model `underline` and\n * `line-through` (→ `strikethrough`) — any other token (including `none`,\n * and unrecognized values like `overline`) is dropped without warning,\n * since it's either the explicit \"no decoration\" case or a decoration kind\n * the runs model has no key for.\n */\nfunction parseTextDecoration(raw: string | null): { underline?: boolean; strikethrough?: boolean } {\n if (raw == null) return {};\n const tokens = raw.trim().toLowerCase().split(/\\s+/);\n const out: { underline?: boolean; strikethrough?: boolean } = {};\n if (tokens.includes('underline')) out.underline = true;\n if (tokens.includes('line-through')) out.strikethrough = true;\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 */\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, gradients, onWarn);\n const fontSize = textStyle.fontSize ?? 16;\n const lineHeight = textStyle.lineHeight ?? 1.2;\n\n const dominantBaseline = el.getAttribute('dominant-baseline');\n const explicitTopAnchor = dominantBaseline === 'text-before-edge'\n || dominantBaseline === 'hanging';\n // If serialized by us, `y` is already the top edge. Otherwise SVG's\n // default is `y` = baseline of the first line — shift up by one\n // line of cap-height so weasel's box top approximates the cap-line.\n const topY = explicitTopAnchor ? ay : ay - fontSize;\n\n // Walk children: text nodes become plain run text; <tspan> elements\n // become StyledRuns with their attribute overrides applied.\n const runs: StyledRun[] = [];\n let plain = '';\n for (let i = 0; i < el.childNodes.length; i++) {\n const child = el.childNodes[i];\n if (child.nodeType === 3 /* TEXT_NODE */) {\n const t = child.textContent ?? '';\n if (!t) continue;\n runs.push({ text: t });\n plain += t;\n } else if (child.nodeType === 1 /* ELEMENT_NODE */) {\n const sp = child as Element;\n if (sp.tagName.toLowerCase() !== 'tspan') {\n onWarn(`<text> child <${sp.tagName}> not supported; flattening text content`);\n const t = sp.textContent ?? '';\n if (t) { runs.push({ text: t }); plain += t; }\n continue;\n }\n const run = readTspanRun(sp, gradients, leafStyle, onWarn);\n runs.push(run);\n plain += run.text;\n }\n }\n\n // Estimate dimensions: data-weasel-* attrs win, else heuristic.\n const dataW = num(el.getAttribute('data-weasel-width'), NaN);\n const dataH = num(el.getAttribute('data-weasel-height'), NaN);\n const width = Number.isFinite(dataW) ? dataW : 99999;\n // Newlines in the text drive line count for height estimation.\n const lines = (plain.match(/\\n/g)?.length ?? 0) + 1;\n const height = Number.isFinite(dataH) ? dataH : fontSize * lineHeight * lines;\n\n const opacity = readOpacityAttr(el, 'opacity');\n const node: SvgTextNode = {\n kind: 'text',\n x: topY === ay ? ax : ax, // x is unchanged by the baseline shift\n y: topY,\n width,\n height,\n text: plain,\n };\n // Only attach `runs` when at least one run carries non-default styling —\n // single-run plain text is cleaner without it. `runsToPlainText(runs)`\n // must equal `text` per kit invariants, so the array must match exactly.\n //\n // \"Any key but `text`\" rather than an enumeration of the styling keys:\n // `readTspanRun` sets a field only when it parsed one, so the two are\n // equivalent, and the enumerated form silently dropped every run whose\n // only styling was a key added later — which is exactly how `stroke`\n // arrived and vanished.\n const hasStyling = runs.some(\n (r) => Object.entries(r).some(([k, v]) => k !== 'text' && v !== undefined),\n );\n if (hasStyling) node.runs = runs;\n if (Object.keys(textStyle).length > 0) node.style = textStyle;\n if (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 cx = node.x + node.width / 2;\n const cy = node.y + node.height / 2;\n const angle = decomposeRotation(localTransform, cx, cy);\n if (angle != null) {\n node.rotation = angle;\n } else {\n const rotComp = rotationComponent(localTransform);\n if (Math.abs(rotComp) > 1e-4) {\n onWarn(`<text> transform has a rotational component that can't be cleanly stored as rotation; dropped (may not round-trip identically)`);\n }\n }\n }\n return node;\n}\n\nfunction readTspanRun(\n el: Element,\n gradients: GradientTable,\n style: StyleContext,\n onWarn: (m: string) => void,\n): StyledRun {\n const text = el.textContent ?? '';\n const run: StyledRun = { text };\n const fw = ownProp(el, 'font-weight');\n if (fw === 'bold' || fw === '700' || fw === 'bolder') run.bold = true;\n const fs = ownProp(el, 'font-style');\n if (fs === 'italic' || fs === 'oblique') run.italic = true;\n const ff = ownProp(el, 'font-family');\n if (ff) run.fontFamily = ff;\n const sz = ownProp(el, 'font-size');\n if (sz != null) {\n const n = parseFloat(sz);\n if (Number.isFinite(n)) run.fontSize = n;\n }\n const ls = ownProp(el, 'letter-spacing');\n if (ls != null) {\n const n = parseLetterSpacing(ls, onWarn);\n if (n != null) run.letterSpacing = n;\n }\n const decoration = parseTextDecoration(ownProp(el, 'text-decoration'));\n if (decoration.underline) run.underline = true;\n if (decoration.strikethrough) run.strikethrough = true;\n const tspanStyle = deriveStyle(style, el);\n const fillAttr = resolveCurrentColor(ownProp(el, 'fill'), tspanStyle);\n if (fillAttr) {\n const parsed = parsePaintAttr(fillAttr);\n if (parsed?.kind === 'solid') {\n run.fill = { fill: 'solid', color: parsed.color };\n } else if (parsed?.kind === 'ref') {\n const paint = gradients.get(parsed.id);\n if (paint) run.fill = paint;\n }\n }\n // Own attributes only — see `ownStrokeStyle`.\n const stroke = coreStroke(readStroke(ownStrokeStyle(el), gradients, onWarn));\n if (stroke) run.stroke = stroke;\n return run;\n}\n\nfunction readTextStyle(\n style: StyleContext,\n gradients: GradientTable,\n onWarn: (m: string) => void,\n): TextStyle {\n const out: TextStyle = {};\n const sz = style['font-size'];\n if (sz != null) {\n const n = parseFloat(sz);\n if (Number.isFinite(n)) out.fontSize = n;\n }\n const ff = style['font-family'];\n if (ff) out.fontFamily = ff;\n const fw = style['font-weight'];\n if (fw != null) {\n const n = parseFloat(fw);\n out.fontWeight = Number.isFinite(n) ? n : fw;\n }\n const fs = style['font-style'];\n if (fs === 'italic' || fs === 'normal') out.fontStyle = fs;\n const anchor = style['text-anchor'];\n if (anchor === 'start') out.align = 'left';\n else if (anchor === 'middle') out.align = 'center';\n else if (anchor === 'end') out.align = 'right';\n const ls = style['letter-spacing'];\n if (ls != null) {\n const n = parseLetterSpacing(ls, onWarn);\n if (n != null) out.letterSpacing = n;\n }\n const decoration = parseTextDecoration(style['text-decoration'] ?? null);\n if (decoration.underline) out.underline = true;\n if (decoration.strikethrough) out.strikethrough = true;\n // 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 const fillRaw = resolveCurrentColor(style['fill'] ?? null, style);\n if (fillRaw) {\n const parsed = parsePaintAttr(fillRaw);\n if (parsed?.kind === 'solid') {\n out.fill = { fill: 'solid', color: parsed.color } as FillStyle;\n } else if (parsed?.kind === 'ref') {\n const paint = gradients.get(parsed.id);\n if (paint) out.fill = paint;\n }\n // parsed.kind === 'none' → leave fill undefined (defaults to black downstream).\n }\n // Text strokes used to be dropped here with a warning: an SDF glyph is a\n // sampled field, with no geometry to stroke. The outline tier gave large\n // text real contours, so a stroke is now a paint like any other — and one\n // that stays in the document even at sizes that render it unstroked.\n const stroke = coreStroke(readStroke(style, gradients, onWarn));\n if (stroke) out.stroke = stroke;\n return out;\n}\n","/**\n * Serialize a 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 * Serialize a `SvgNode[]` tree to an SVG document string. Every leaf is\n * emitted as a `<path>` (even shapes that started as `<rect>` etc.) —\n * lossless geometry round-trip beats round-tripping the element-kind\n * label. Gradient paints are gathered into a single `<defs>` block.\n */\n\nimport type { Path, Stroke } from '@weasel-js/core';\nimport { boundsOfPath } from '@weasel-js/core';\nimport type {\n NamespaceMeta, NamespacedElement, SerializeOptions, SvgGroupNode, SvgNode,\n SvgPaint, SvgPathNode, SvgStroke, SvgTextNode,\n} from './types';\nimport { runsToPlainText } from '@weasel-js/core';\nimport { serializePathD } from './path-serializer';\nimport { formatMatrix, trimNumber } from './transform';\nimport { PaintServerRegistry } from './gradients';\n\n/**\n * Walk the tree and produce an SVG document string. The root `<svg>`'s\n * `viewBox` is taken from `opts.viewBox` if supplied, otherwise computed\n * as a tight bounding box around every leaf.\n */\nexport function serializeSvg(nodes: SvgNode[], opts: SerializeOptions = {}): string {\n const registry = new PaintServerRegistry();\n registerPaintServers(nodes, registry);\n\n const bounds = opts.viewBox ?? computeBounds(nodes);\n const vb = `${trimNumber(bounds.x)} ${trimNumber(bounds.y)} ${trimNumber(bounds.width)} ${trimNumber(bounds.height)}`;\n const namespaces = opts.namespaces ?? {};\n\n const rootAttrs: string[] = [`xmlns=\"http://www.w3.org/2000/svg\"`];\n for (const [prefix, uri] of Object.entries(namespaces)) {\n rootAttrs.push(`xmlns:${prefix}=\"${escapeAttr(uri)}\"`);\n }\n rootAttrs.push(`viewBox=\"${vb}\"`);\n if (opts.width != null) rootAttrs.push(`width=\"${trimNumber(opts.width)}\"`);\n if (opts.height != null) rootAttrs.push(`height=\"${trimNumber(opts.height)}\"`);\n // documentMeta attrs onto the root, in declared-namespace order.\n if (opts.documentMeta) {\n for (const prefix of Object.keys(namespaces)) {\n const bucket = opts.documentMeta[prefix];\n if (!bucket?.attrs) continue;\n for (const [name, value] of Object.entries(bucket.attrs)) {\n rootAttrs.push(`${prefix}:${name}=\"${escapeAttr(value)}\"`);\n }\n }\n }\n\n // documentMeta elements after <defs>, before geometry body.\n let docMetaXml = '';\n if (opts.documentMeta) {\n for (const prefix of Object.keys(namespaces)) {\n const bucket = opts.documentMeta[prefix];\n if (!bucket?.elements) continue;\n for (const [localName, list] of Object.entries(bucket.elements)) {\n for (const el of list) docMetaXml += namespacedElementXml(prefix, localName, el);\n }\n }\n }\n\n const defsXml = registry.toDefsXml(opts.onWarn);\n const bodyXml = nodes.map((n) => nodeXml(n, registry, namespaces)).join('');\n\n // `<title>` goes immediately inside `<svg>` per SVG-spec convention; it's\n // an accessibility hook and (for our purposes) a stable place to round-trip\n // the user-visible document title.\n const titleXml = opts.title && opts.title.length > 0\n ? `<title>${escapeText(opts.title)}</title>`\n : '';\n\n return `<svg ${rootAttrs.join(' ')}>${titleXml}${defsXml}${docMetaXml}${bodyXml}</svg>`;\n}\n\nfunction namespacedElementXml(prefix: string, localName: string, el: NamespacedElement): string {\n const attrs: string[] = [];\n for (const [name, value] of Object.entries(el.attrs)) {\n attrs.push(`${name}=\"${escapeAttr(value)}\"`);\n }\n const head = attrs.length > 0 ? `<${prefix}:${localName} ${attrs.join(' ')}>` : `<${prefix}:${localName}>`;\n let body = '';\n if (el.children) {\n for (const [childName, list] of Object.entries(el.children)) {\n for (const child of list) body += namespacedElementXml(prefix, childName, child);\n }\n } else if (el.text != null) {\n body = escapeText(el.text);\n }\n return `${head}${body}</${prefix}:${localName}>`;\n}\n\nfunction metaAttrsXml(meta: NamespaceMeta | undefined, namespaces: Record<string, string>): string {\n if (!meta) return '';\n const parts: string[] = [];\n for (const prefix of Object.keys(namespaces)) {\n const bucket = meta[prefix];\n if (!bucket?.attrs) continue;\n for (const [name, value] of Object.entries(bucket.attrs)) {\n parts.push(`${prefix}:${name}=\"${escapeAttr(value)}\"`);\n }\n }\n return parts.length > 0 ? ` ${parts.join(' ')}` : '';\n}\n\nfunction metaElementsXml(meta: NamespaceMeta | undefined, namespaces: Record<string, string>): string {\n if (!meta) return '';\n let out = '';\n for (const prefix of Object.keys(namespaces)) {\n const bucket = meta[prefix];\n if (!bucket?.elements) continue;\n for (const [localName, list] of Object.entries(bucket.elements)) {\n for (const el of list) out += namespacedElementXml(prefix, localName, el);\n }\n }\n return out;\n}\n\nfunction registerPaintServers(nodes: SvgNode[], registry: PaintServerRegistry): void {\n for (const n of nodes) {\n if (n.kind === 'group') {\n registerPaintServers(n.children, registry);\n } else if (n.kind === 'path') {\n if (n.fill.kind === 'gradient') registry.register(n.fill.paint);\n if (n.stroke && n.stroke.paint.kind === 'gradient') registry.register(n.stroke.paint.paint);\n } 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.style?.fill, registry);\n registerTextPaint(n.style?.stroke?.paint, registry);\n for (const run of n.runs ?? []) {\n registerTextPaint(run.fill, registry);\n registerTextPaint(run.stroke?.paint, registry);\n }\n }\n }\n}\n\n/** Register one text paint if it is a paint server rather than a colour. */\nfunction registerTextPaint(\n paint: import('@weasel-js/core').FillStyle | undefined,\n registry: PaintServerRegistry,\n): void {\n if (paint && !('color' in paint)) registry.register(paint);\n}\n\nfunction nodeXml(node: SvgNode, registry: PaintServerRegistry, namespaces: Record<string, string>): string {\n if (node.kind === 'group') return groupXml(node, registry, namespaces);\n if (node.kind === 'text') return textXml(node, registry, namespaces);\n return pathXml(node, registry, namespaces);\n}\n\nfunction groupXml(node: SvgGroupNode, registry: PaintServerRegistry, namespaces: Record<string, string>): string {\n const attrs: string[] = [];\n if (node.transform) {\n const m = formatMatrix(node.transform);\n if (m) attrs.push(`transform=\"${m}\"`);\n }\n if (node.opacity != null && node.opacity !== 1) {\n attrs.push(`opacity=\"${trimNumber(node.opacity)}\"`);\n }\n const metaAttrs = metaAttrsXml(node.meta, namespaces);\n // `metaAttrs` already starts with a leading space (or is empty), so we\n // can splice it after the existing attr list without extra logic.\n const head = attrs.length > 0\n ? `<g ${attrs.join(' ')}${metaAttrs}>`\n : `<g${metaAttrs}>`;\n const body = node.children.map((c) => nodeXml(c, registry, namespaces)).join('');\n return `${head}${body}${metaElementsXml(node.meta, namespaces)}</g>`;\n}\n\nfunction pathXml(node: SvgPathNode, registry: PaintServerRegistry, namespaces: Record<string, string>): string {\n const attrs: string[] = [`d=\"${serializePathD(node.path)}\"`];\n const fillAttrs = paintAttrs(node.fill, 'fill', registry);\n for (const a of fillAttrs) attrs.push(a);\n // Emit fill-rule only when it diverges from SVG's default ('nonzero').\n // RectPath has no fillRule field — only PolygonPath carries one.\n if (node.path.kind === 'polygon' && node.path.fillRule === 'evenodd') {\n attrs.push(`fill-rule=\"evenodd\"`);\n }\n if (node.stroke) {\n const strokeAttrs = strokeAttrsFor(node.stroke, registry);\n for (const a of strokeAttrs) attrs.push(a);\n } else {\n attrs.push('stroke=\"none\"');\n }\n if (node.opacity != null && node.opacity !== 1) {\n attrs.push(`opacity=\"${trimNumber(node.opacity)}\"`);\n }\n if (node.rotation != null && node.rotation !== 0) {\n const b = pathBounds(node.path);\n const cx = b.minX + (b.maxX - b.minX) / 2;\n const cy = b.minY + (b.maxY - b.minY) / 2;\n const deg = (node.rotation * 180) / Math.PI;\n attrs.push(`transform=\"rotate(${trimNumber(deg)} ${trimNumber(cx)} ${trimNumber(cy)})\"`);\n }\n const metaAttrs = metaAttrsXml(node.meta, namespaces);\n const metaEls = metaElementsXml(node.meta, namespaces);\n if (metaEls) {\n return `<path ${attrs.join(' ')}${metaAttrs}>${metaEls}</path>`;\n }\n return `<path ${attrs.join(' ')}${metaAttrs}/>`;\n}\n\nfunction paintAttrs(\n paint: SvgPaint,\n name: 'fill' | 'stroke',\n registry: PaintServerRegistry,\n): string[] {\n if (paint.kind === 'none') return [`${name}=\"none\"`];\n if (paint.kind === 'solid') {\n const out = [`${name}=\"${paint.color}\"`];\n if (paint.opacity != null && paint.opacity !== 1) {\n out.push(`${name}-opacity=\"${trimNumber(paint.opacity)}\"`);\n }\n return out;\n }\n // gradient\n const id = registry.register(paint.paint);\n return [`${name}=\"url(#${id})\"`];\n}\n\n/**\n * Attributes for a kit `Stroke` — the shape text carries, whose `paint` is a\n * `FillStyle` rather than an `SvgPaint`. Text strokes ride inside\n * `TextStyle` / `StyledRun` rather than as a node-level `SvgStroke`, because\n * that is where the kit's text model puts them.\n *\n * Absent, or zero-width, emits nothing at all: unstroked text should not\n * carry a `stroke` attribute, and SVG's own default (`none`) already says so.\n */\nfunction coreStrokeAttrs(stroke: Stroke | undefined, registry: PaintServerRegistry): string[] {\n if (!stroke) return [];\n const width = stroke.width ?? 1;\n if (!(width > 0)) return [];\n const attrs: string[] = [];\n if ('color' in stroke.paint) {\n attrs.push(`stroke=\"${stroke.paint.color}\"`);\n if (stroke.paint.opacity != null && stroke.paint.opacity !== 1) {\n attrs.push(`stroke-opacity=\"${trimNumber(stroke.paint.opacity)}\"`);\n }\n } else {\n attrs.push(`stroke=\"url(#${registry.register(stroke.paint)})\"`);\n }\n attrs.push(`stroke-width=\"${trimNumber(width)}\"`);\n if (stroke.cap) attrs.push(`stroke-linecap=\"${stroke.cap}\"`);\n if (stroke.join) attrs.push(`stroke-linejoin=\"${stroke.join}\"`);\n if (stroke.dash && stroke.dash.length > 0) {\n attrs.push(`stroke-dasharray=\"${stroke.dash.map(trimNumber).join(' ')}\"`);\n }\n if (stroke.miterLimit != null) attrs.push(`stroke-miterlimit=\"${trimNumber(stroke.miterLimit)}\"`);\n return attrs;\n}\n\nfunction strokeAttrsFor(stroke: SvgStroke, registry: PaintServerRegistry): string[] {\n const attrs = paintAttrs(stroke.paint, 'stroke', registry);\n attrs.push(`stroke-width=\"${trimNumber(stroke.width)}\"`);\n if (stroke.opacity != null && stroke.opacity !== 1) {\n attrs.push(`stroke-opacity=\"${trimNumber(stroke.opacity)}\"`);\n }\n if (stroke.cap) {\n attrs.push(`stroke-linecap=\"${stroke.cap}\"`);\n }\n if (stroke.join) {\n attrs.push(`stroke-linejoin=\"${stroke.join}\"`);\n }\n if (stroke.dash && stroke.dash.length > 0) {\n attrs.push(`stroke-dasharray=\"${stroke.dash.map(trimNumber).join(' ')}\"`);\n }\n if (stroke.miterLimit != null) {\n attrs.push(`stroke-miterlimit=\"${trimNumber(stroke.miterLimit)}\"`);\n }\n return attrs;\n}\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): void => {\n if (n.kind === 'group') {\n n.children.forEach(visit);\n return;\n }\n const b = n.kind === 'text'\n ? { minX: n.x, minY: n.y, maxX: n.x + n.width, maxY: n.y + n.height }\n : pathBounds(n.path);\n if (b.minX < minX) minX = b.minX;\n if (b.minY < minY) minY = b.minY;\n if (b.maxX > maxX) maxX = b.maxX;\n if (b.maxY > maxY) maxY = b.maxY;\n };\n nodes.forEach(visit);\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\n/**\n * Emit a `<text>` element. Uses `dominant-baseline=\"text-before-edge\"` so\n * the `y` attribute matches weasel's top-of-box pose; stashes the explicit\n * width/height (which native SVG text doesn't model) in `data-weasel-*`\n * attributes so they round-trip through the parser losslessly.\n */\nfunction textXml(node: SvgTextNode, registry: PaintServerRegistry, namespaces: Record<string, string>): string {\n const attrs: string[] = [\n `x=\"${trimNumber(node.x)}\"`,\n `y=\"${trimNumber(node.y)}\"`,\n `dominant-baseline=\"text-before-edge\"`,\n `data-weasel-width=\"${trimNumber(node.width)}\"`,\n `data-weasel-height=\"${trimNumber(node.height)}\"`,\n ];\n\n const style = node.style;\n if (style?.fontSize != null) attrs.push(`font-size=\"${trimNumber(style.fontSize)}\"`);\n if (style?.fontFamily) attrs.push(`font-family=\"${escapeAttr(style.fontFamily)}\"`);\n if (style?.fontWeight != null) attrs.push(`font-weight=\"${String(style.fontWeight)}\"`);\n if (style?.fontStyle && style.fontStyle !== 'normal') attrs.push(`font-style=\"${style.fontStyle}\"`);\n if (style?.align && style.align !== 'left') {\n const anchor = style.align === 'center' ? 'middle' : 'end';\n attrs.push(`text-anchor=\"${anchor}\"`);\n }\n if (style?.letterSpacing != null && style.letterSpacing !== 0) {\n attrs.push(`letter-spacing=\"${trimNumber(style.letterSpacing)}\"`);\n }\n const decoration = textDecorationValue(style?.underline, style?.strikethrough);\n if (decoration) attrs.push(`text-decoration=\"${decoration}\"`);\n // Note: `lineHeight` is NOT emitted here. The bridge layer (svgInterop)\n // lifts it into `meta.wd.attrs['line-height']`, which `metaAttrsXml`\n // below emits as `wd:line-height=\"...\"`. There is no compat write of\n // `data-weasel-line-height` — per the SVG-native plan's Migration section,\n // no installed base exists to compat against.\n if (style?.fill) {\n if ('color' in style.fill) {\n attrs.push(`fill=\"${style.fill.color}\"`);\n if (style.fill.opacity != null && style.fill.opacity !== 1) {\n attrs.push(`fill-opacity=\"${trimNumber(style.fill.opacity)}\"`);\n }\n } else {\n const id = registry.register(style.fill);\n attrs.push(`fill=\"url(#${id})\"`);\n }\n }\n for (const a of coreStrokeAttrs(style?.stroke, registry)) attrs.push(a);\n if (node.opacity != null && node.opacity !== 1) {\n attrs.push(`opacity=\"${trimNumber(node.opacity)}\"`);\n }\n if (node.rotation != null && node.rotation !== 0) {\n const cx = node.x + node.width / 2;\n const cy = node.y + node.height / 2;\n const deg = (node.rotation * 180) / Math.PI;\n attrs.push(`transform=\"rotate(${trimNumber(deg)} ${trimNumber(cx)} ${trimNumber(cy)})\"`);\n }\n\n const body = node.runs && node.runs.length > 0\n ? node.runs.map((r) => runXml(r, registry)).join('')\n : escapeText(node.text);\n const metaAttrs = metaAttrsXml(node.meta, namespaces);\n const metaEls = metaElementsXml(node.meta, namespaces);\n return `<text ${attrs.join(' ')}${metaAttrs}>${body}${metaEls}</text>`;\n}\n\nfunction runXml(run: import('@weasel-js/core').StyledRun, registry: PaintServerRegistry): string {\n const attrs: string[] = [];\n if (run.bold) attrs.push(`font-weight=\"700\"`);\n if (run.italic) attrs.push(`font-style=\"italic\"`);\n if (run.fontFamily) attrs.push(`font-family=\"${escapeAttr(run.fontFamily)}\"`);\n if (run.fontSize != null) attrs.push(`font-size=\"${trimNumber(run.fontSize)}\"`);\n // Unlike the node-level style guard above, a run-level `0` is a meaningful\n // *override* (distinct from \"inherit the node's letterSpacing\") per the\n // runs model's additive-flags contract — emit it whenever it's set.\n if (run.letterSpacing != null) {\n attrs.push(`letter-spacing=\"${trimNumber(run.letterSpacing)}\"`);\n }\n const runDecoration = textDecorationValue(run.underline, run.strikethrough);\n if (runDecoration) attrs.push(`text-decoration=\"${runDecoration}\"`);\n if (run.fill) {\n if ('color' in run.fill) {\n attrs.push(`fill=\"${run.fill.color}\"`);\n } else {\n const id = registry.register(run.fill);\n attrs.push(`fill=\"url(#${id})\"`);\n }\n }\n for (const a of coreStrokeAttrs(run.stroke, registry)) attrs.push(a);\n const head = attrs.length > 0 ? `<tspan ${attrs.join(' ')}>` : '<tspan>';\n return `${head}${escapeText(run.text)}</tspan>`;\n}\n\n/**\n * Combine the two 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 neither is set.\n */\nfunction textDecorationValue(underline: boolean | undefined, strikethrough: boolean | undefined): string | null {\n const tokens: string[] = [];\n if (underline) tokens.push('underline');\n if (strikethrough) tokens.push('line-through');\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\n// Silence unused-import warnings when the runs export gets tree-shaken.\nvoid runsToPlainText;\n\nfunction pathBounds(path: Path): { minX: number; minY: number; maxX: number; maxY: number } {\n if (path.kind === 'rect') {\n return {\n minX: path.x, minY: path.y,\n maxX: path.x + path.width, maxY: path.y + path.height,\n };\n }\n const b = boundsOfPath(path);\n return { minX: b.x, minY: b.y, maxX: b.x + b.width, maxY: b.y + b.height };\n}\n\n","/**\n * The `unpack` half of the kit SVG handler (`svgHandler.ts`): parse an SVG\n * file into **native scene nodes** — path/text leaves under containers that\n * mirror the source `<g>` structure — instead of the default single\n * embedded-image node. Opted into via\n * `<SceneCanvas ingestion={{ svg: { unpack: unpackSvgFiles } }}>`.\n *\n * Leaf data targets the kit's built-in painters (`NodeShape.ts`): paths as\n * `{ path, fill?, stroke?, strokeWidth? }` (the `kit:path` contract), text\n * as `{ text, style? }` (`kit:text`). Poses are absolute AABBs; the\n * renderer's `pathInPoseFrame` rebases stored geometry into the pose box,\n * so placement and fit-clamping operate on poses alone and never rewrite\n * path coordinates.\n *\n * Placement mirrors the image handler: the file's union AABB is fit-clamped\n * to 90% of the visible viewport and centered on the drop point (or the\n * viewport center), with multi-file batches cascading by a fixed offset.\n * 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 * Known flattenings (dwarn'd, not fatal): gradient paints collapse to a\n * fallback solid color (the `kit:path` painter takes color strings only),\n * and text `fontSize` does not participate in the fit-clamp scale.\n */\nimport { parseSvg } from './parse';\nimport type { SvgNode, SvgPaint } from './types';\nimport {\n boundsOfPath,\n createInsertOp,\n dwarn,\n type IngestCtx,\n type Op,\n} from '@weasel-js/core';\n\nconst CASCADE_OFFSET_PX = 24;\nconst VIEWPORT_FIT = 0.9;\nconst GRADIENT_FALLBACK = '#888888';\n\nexport interface SvgDraftBounds {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\ntype DraftPose = SvgDraftBounds & { rotation?: number };\n\n/**\n * One node the unpack wants the scene to materialize, in parent-before-child\n * order (a draft's `parentId` always names an earlier draft, or `null` for\n * roots). Leaf `data` is kit-painter-native (see module doc).\n */\nexport type SvgSceneDraft =\n | { kind: 'container'; id: string; parentId: string | null; pose: DraftPose }\n | { kind: 'leaf'; id: string; parentId: string | null; pose: DraftPose; data: Record<string, unknown> };\n\n/** `File.text()` via FileReader — same engine-compat choice as the image\n * handler's `readAsDataURL` (jsdom ships `FileReader` but not `Blob.text`). */\nfunction readFileText(file: File): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => resolve(String(reader.result ?? ''));\n reader.onerror = () => reject(reader.error);\n reader.readAsText(file);\n });\n}\n\n/** Mint a fresh node id. Mirrors the scene's default `n{counter}-{random}`\n * scheme (kept module-private by `core/scene/scene.ts`) — same approach as\n * `groupAction` / `cloneAction`. */\nlet svgIdCounter = 0;\nfunction freshSvgNodeId(): string {\n return `n${(svgIdCounter++).toString(36)}-${Math.random().toString(36).slice(2, 8)}`;\n}\n\n/** Flatten an `SvgPaint` to the `kit:path` painter's color-string contract.\n * `'none'` is meaningful (painter skips the fill); gradients collapse to a\n * fallback solid — the painter's data contract has no gradient slot yet. */\nfunction colorFromPaint(paint: SvgPaint | undefined, context: string): string | undefined {\n if (!paint) return undefined;\n if (paint.kind === 'none') return 'none';\n if (paint.kind === 'solid') return paint.color;\n dwarn('ingest', `svg unpack: gradient ${context} flattened to ${GRADIENT_FALLBACK}`);\n return GRADIENT_FALLBACK;\n}\n\n/**\n * Walk an `SvgNode[]` tree and emit a flat, parent-before-child list of\n * {@link SvgSceneDraft}s. Each `<g>` becomes a container whose pose is the\n * union AABB of its descendants (the kit `group` action's convention);\n * path/text leaves carry kit-painter-native data. Empty groups are dropped.\n */\nexport function svgNodesToKitDrafts(\n nodes: readonly SvgNode[],\n nextId: () => string,\n): SvgSceneDraft[] {\n const drafts: SvgSceneDraft[] = [];\n\n // Returns the union AABB of the leaves under `n` so a parent container can\n // compose its own pose; null for empty groups.\n const visit = (n: SvgNode, parentId: string | null): SvgDraftBounds | null => {\n if (n.kind === 'group') {\n const draft: Extract<SvgSceneDraft, { kind: 'container' }> = {\n kind: 'container',\n id: nextId(),\n parentId,\n pose: { x: 0, y: 0, width: 0, height: 0 },\n };\n drafts.push(draft);\n let acc: SvgDraftBounds | null = null;\n for (const c of n.children) {\n const b = visit(c, draft.id);\n if (b) acc = acc ? unionRect(acc, b) : b;\n }\n if (!acc) {\n drafts.splice(drafts.indexOf(draft), 1);\n return null;\n }\n draft.pose = acc;\n return acc;\n }\n\n if (n.kind === 'text') {\n const pose: DraftPose = { x: n.x, y: n.y, width: n.width, height: n.height };\n if (n.rotation) pose.rotation = n.rotation;\n drafts.push({\n kind: 'leaf',\n id: nextId(),\n parentId,\n pose,\n data: { text: n.text, ...(n.style ? { style: n.style } : {}) },\n });\n return pose;\n }\n\n // Path leaf. Bounds come from the geometry; `pathInPoseFrame` rebases\n // the stored path onto whatever pose box placement settles on.\n const b = n.path.kind === 'rect'\n ? { x: n.path.x, y: n.path.y, width: n.path.width, height: n.path.height }\n : boundsOfPath(n.path);\n const pose: DraftPose = { x: b.x, y: b.y, width: b.width, height: b.height };\n if (n.rotation) pose.rotation = n.rotation;\n const fill = colorFromPaint(n.fill, 'fill');\n const stroke = n.stroke ? colorFromPaint(n.stroke.paint, 'stroke') : undefined;\n drafts.push({\n kind: 'leaf',\n id: nextId(),\n parentId,\n pose,\n data: {\n path: n.path,\n ...(fill !== undefined ? { fill } : {}),\n ...(stroke !== undefined && stroke !== 'none'\n ? { stroke, strokeWidth: n.stroke!.width }\n : {}),\n },\n });\n return pose;\n };\n\n for (const n of nodes) visit(n, null);\n return drafts;\n}\n\nfunction unionRect(a: SvgDraftBounds, b: SvgDraftBounds): SvgDraftBounds {\n const minX = Math.min(a.x, b.x);\n const minY = Math.min(a.y, b.y);\n const maxX = Math.max(a.x + a.width, b.x + b.width);\n const maxY = Math.max(a.y + a.height, b.y + b.height);\n return { x: minX, y: minY, width: maxX - minX, height: maxY - minY };\n}\n\n/**\n * Parse each file and insert its node tree — one undoable `applyOps` batch\n * per file. See the module doc for placement and wrapping policy. A file\n * that fails to parse (or parses to nothing) is skipped with a\n * `console.warn`; the rest proceed.\n */\nexport async function unpackSvgFiles(files: File[], ctx: IngestCtx): Promise<void> {\n const layer = ((ctx.scene.layers[0]?.id as string | undefined) ?? 'default');\n let index = 0;\n for (const file of files) {\n try {\n const text = await readFileText(file);\n const parsed = parseSvg(text);\n for (const w of parsed.warnings) dwarn('ingest', `svg \"${file.name}\":`, w);\n let drafts = svgNodesToKitDrafts(parsed.nodes, freshSvgNodeId);\n if (drafts.length === 0) {\n console.warn(`weasel ingest: svg \"${file.name}\" parsed to no drawable nodes`);\n continue;\n }\n\n // Wrap multi-root files in one synthesized container so the dropped\n // file arrives as a single selectable unit.\n const roots = drafts.filter((d) => d.parentId === null);\n if (roots.length > 1) {\n const wrapperId = freshSvgNodeId();\n const union = roots.map((d) => d.pose).reduce(unionRect);\n drafts = [\n { kind: 'container', id: wrapperId, parentId: null, pose: union },\n ...drafts.map((d) => (d.parentId === null ? { ...d, parentId: wrapperId } : d)),\n ];\n }\n\n // Fit-clamp + center, mirroring the image handler. Pose-only: the\n // painter rebases stored geometry into the pose box.\n const union = drafts\n .filter((d) => d.parentId === null)\n .map((d) => d.pose)\n .reduce(unionRect);\n const view = ctx.viewportWorldRect();\n const scale = Math.min(\n 1,\n union.width > 0 ? (view.width * VIEWPORT_FIT) / union.width : 1,\n union.height > 0 ? (view.height * VIEWPORT_FIT) / union.height : 1,\n );\n const target = ctx.point ?? {\n x: view.x + view.width / 2,\n y: view.y + view.height / 2,\n };\n const offset = index * CASCADE_OFFSET_PX;\n const cx = union.x + union.width / 2;\n const cy = union.y + union.height / 2;\n const place = (p: DraftPose): DraftPose => ({\n ...p,\n x: target.x + (p.x - cx) * scale + offset,\n y: target.y + (p.y - cy) * scale + offset,\n width: p.width * scale,\n height: p.height * scale,\n });\n\n const ops: Op[] = drafts.map((d) =>\n createInsertOp({\n node: {\n id: d.id,\n kind: d.kind,\n layer,\n pose: place(d.pose),\n data: d.kind === 'leaf' ? d.data : {},\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"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@weasel-js/svg",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "1.0.1",
|
|
4
4
|
"description": "SVG import/export for @weasel-js/core: parse SVG strings into weasel-native shapes and serialize them back.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
"LICENSE"
|
|
39
39
|
],
|
|
40
40
|
"dependencies": {
|
|
41
|
-
"@weasel-js/core": "0.
|
|
41
|
+
"@weasel-js/core": "1.0.1"
|
|
42
42
|
},
|
|
43
43
|
"publishConfig": {
|
|
44
44
|
"access": "public",
|