@pixerate/editor 0.115.0 → 0.116.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/THIRD_PARTY_NOTICES.md +3 -0
- package/dist/animation-editor/index.cjs +54 -54
- package/dist/animation-editor/index.d.cts +2 -2
- package/dist/animation-editor/index.d.ts +2 -2
- package/dist/animation-editor/index.js +2 -2
- package/dist/{chunk-DFQEX3AM.cjs → chunk-2UT4GXYA.cjs} +133 -8
- package/dist/chunk-2UT4GXYA.cjs.map +1 -0
- package/dist/{chunk-VXR7XWMF.js → chunk-7LNZAWSJ.js} +437 -41
- package/dist/chunk-7LNZAWSJ.js.map +1 -0
- package/dist/{chunk-LKCYANMW.js → chunk-ARQ7PQ6Q.js} +129 -4
- package/dist/chunk-ARQ7PQ6Q.js.map +1 -0
- package/dist/chunk-COAMRKVI.cjs +159 -0
- package/dist/chunk-COAMRKVI.cjs.map +1 -0
- package/dist/{chunk-C6C5PDKU.js → chunk-D53KSJUV.js} +3 -322
- package/dist/chunk-D53KSJUV.js.map +1 -0
- package/dist/chunk-D53VQGEJ.js +3262 -0
- package/dist/chunk-D53VQGEJ.js.map +1 -0
- package/dist/chunk-EJVDBITD.cjs +501 -0
- package/dist/chunk-EJVDBITD.cjs.map +1 -0
- package/dist/{chunk-LPLCWZTM.cjs → chunk-FODKPD44.cjs} +555 -159
- package/dist/chunk-FODKPD44.cjs.map +1 -0
- package/dist/chunk-HOCPSFGA.cjs +3262 -0
- package/dist/chunk-HOCPSFGA.cjs.map +1 -0
- package/dist/chunk-IPFRWILU.js +1908 -0
- package/dist/chunk-IPFRWILU.js.map +1 -0
- package/dist/{chunk-FV5AXTSF.cjs → chunk-JSSBHMMU.cjs} +36 -188
- package/dist/chunk-JSSBHMMU.cjs.map +1 -0
- package/dist/chunk-LF4WOZXZ.js +159 -0
- package/dist/chunk-LF4WOZXZ.js.map +1 -0
- package/dist/{chunk-26PGXHY7.cjs → chunk-M7O4BJRH.cjs} +36 -36
- package/dist/{chunk-26PGXHY7.cjs.map → chunk-M7O4BJRH.cjs.map} +1 -1
- package/dist/chunk-N3467VD6.js +501 -0
- package/dist/chunk-N3467VD6.js.map +1 -0
- package/dist/{chunk-ST7E3NEE.cjs → chunk-PAOWHJ5O.cjs} +18 -337
- package/dist/chunk-PAOWHJ5O.cjs.map +1 -0
- package/dist/{chunk-XICA4PVO.js → chunk-SEBYNBHW.js} +10 -10
- package/dist/chunk-SMJGE7HM.cjs +1908 -0
- package/dist/chunk-SMJGE7HM.cjs.map +1 -0
- package/dist/{chunk-MMVHBKMM.js → chunk-T2P5TIZ6.js} +2 -2
- package/dist/{chunk-FGW5OWJ4.js → chunk-VJUML33I.js} +4 -156
- package/dist/chunk-VJUML33I.js.map +1 -0
- package/dist/{chunk-I7FQBWMQ.cjs → chunk-ZYZGEILO.cjs} +239 -239
- package/dist/{chunk-I7FQBWMQ.cjs.map → chunk-ZYZGEILO.cjs.map} +1 -1
- package/dist/export/index.cjs +4 -2
- package/dist/export/index.cjs.map +1 -1
- package/dist/export/index.js +5 -3
- package/dist/{export-BJE8T0YA.d.cts → export-BXxSGBCq.d.cts} +2 -2
- package/dist/{export-Con3UKkm.d.ts → export-Dm44YUvS.d.ts} +2 -2
- package/dist/export-Dv0-ZVrV.d.cts +501 -0
- package/dist/export-Dv0-ZVrV.d.ts +501 -0
- package/dist/{retouch-Do6tBs2H.d.ts → flow-BMtHAmg4.d.ts} +561 -2
- package/dist/{retouch-Bxkuc0KH.d.cts → flow-COCB42TP.d.cts} +561 -2
- package/dist/image-editor/index.cjs +957 -795
- package/dist/image-editor/index.cjs.map +1 -1
- package/dist/image-editor/index.d.cts +6 -6
- package/dist/image-editor/index.d.ts +6 -6
- package/dist/image-editor/index.js +180 -18
- package/dist/image-editor/index.js.map +1 -1
- package/dist/index.cjs +4 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +5 -3
- package/dist/index.js.map +1 -1
- package/dist/kernel-wasm-WYCGNZR4.js +10 -0
- package/dist/kernel-wasm-WYCGNZR4.js.map +1 -0
- package/dist/kernel-wasm-YPVAEMVN.cjs +10 -0
- package/dist/kernel-wasm-YPVAEMVN.cjs.map +1 -0
- package/dist/paint/index.cjs +165 -3
- package/dist/paint/index.cjs.map +1 -1
- package/dist/paint/index.d.cts +225 -3
- package/dist/paint/index.d.ts +225 -3
- package/dist/paint/index.js +166 -4
- package/dist/paint-editor/index.cjs +4690 -845
- package/dist/paint-editor/index.cjs.map +1 -1
- package/dist/paint-editor/index.d.cts +1525 -277
- package/dist/paint-editor/index.d.ts +1525 -277
- package/dist/paint-editor/index.js +4560 -715
- package/dist/paint-editor/index.js.map +1 -1
- package/dist/raster/index.cjs +4 -3
- package/dist/raster/index.cjs.map +1 -1
- package/dist/raster/index.js +10 -9
- package/dist/{svg-BnRj0q8i.d.cts → svg-CVdFc80-.d.cts} +2 -2
- package/dist/{svg-CmmBFfGT.d.ts → svg-DlEuhwoX.d.ts} +2 -2
- package/dist/{types-1SUQKDAw.d.ts → types-CDLGhAZp.d.ts} +40 -2
- package/dist/{types-yINF17Ta.d.cts → types-Tfly4Aya.d.cts} +40 -2
- package/dist/vector/index.cjs +1897 -975
- package/dist/vector/index.cjs.map +1 -1
- package/dist/vector/index.d.cts +292 -32
- package/dist/vector/index.d.ts +292 -32
- package/dist/vector/index.js +928 -6
- package/dist/vector/index.js.map +1 -1
- package/dist/video-editor/index.cjs +502 -2165
- package/dist/video-editor/index.cjs.map +1 -1
- package/dist/video-editor/index.d.cts +3 -501
- package/dist/video-editor/index.d.ts +3 -501
- package/dist/video-editor/index.js +151 -1814
- package/dist/video-editor/index.js.map +1 -1
- package/package.json +1 -1
- package/skills/pixerate-image-editor/references/photoshop-files.md +7 -3
- package/skills/pixerate-vector/SKILL.md +3 -0
- package/dist/chunk-C6C5PDKU.js.map +0 -1
- package/dist/chunk-DFQEX3AM.cjs.map +0 -1
- package/dist/chunk-FGW5OWJ4.js.map +0 -1
- package/dist/chunk-FV5AXTSF.cjs.map +0 -1
- package/dist/chunk-GX332W2C.js +0 -181
- package/dist/chunk-GX332W2C.js.map +0 -1
- package/dist/chunk-LKCYANMW.js.map +0 -1
- package/dist/chunk-LPLCWZTM.cjs.map +0 -1
- package/dist/chunk-MUUXNRU4.cjs +0 -181
- package/dist/chunk-MUUXNRU4.cjs.map +0 -1
- package/dist/chunk-ST7E3NEE.cjs.map +0 -1
- package/dist/chunk-TCKIXI46.cjs +0 -1136
- package/dist/chunk-TCKIXI46.cjs.map +0 -1
- package/dist/chunk-UBIXVXPR.js +0 -1136
- package/dist/chunk-UBIXVXPR.js.map +0 -1
- package/dist/chunk-VXR7XWMF.js.map +0 -1
- /package/dist/{chunk-XICA4PVO.js.map → chunk-SEBYNBHW.js.map} +0 -0
- /package/dist/{chunk-MMVHBKMM.js.map → chunk-T2P5TIZ6.js.map} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/editor/editor/packages/core/dist/chunk-DFQEX3AM.cjs","../src/paint/heal.ts","../src/paint/retouch.ts"],"names":["w","t"],"mappings":"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","file":"/home/runner/work/editor/editor/packages/core/dist/chunk-DFQEX3AM.cjs","sourcesContent":[null,"// Portions ported from photocraft/crates/algo/src/poisson.rs and inpaint.rs (MIT OR Apache-2.0, © ArtCraft Team and contributors). See THIRD_PARTY_NOTICES.md.\n\n/**\n * Gradient-domain (\"Poisson\") blending for the Healing Brush and the Spot Healing Brush.\n *\n * Method: P. Pérez, M. Gangnet, A. Blake, *Poisson Image Editing*, SIGGRAPH 2003. Seamless cloning\n * looks for `f` over a region Ω with `f = f*` (the destination) on its boundary and `∇f` as close\n * as possible to the source's `∇g`. The answer is `f = g + h`, where `h` is the membrane: the\n * harmonic function (`Δh = 0`) that equals `f* − g` on the boundary. So healed pixels keep the\n * source's texture while their colour and lighting are pulled to the pixels around the stroke.\n *\n * The Laplace equation is solved on the 4-connected grid by successive over-relaxation, started\n * from a recursively solved half-resolution grid (cascadic multigrid). Harmonic functions are\n * smooth, so the coarse guess is close and a few sweeps per level remove the rest.\n *\n * Buffers are interleaved `w × h × ch` floats in any units (the callers use 0..255). Pure maths:\n * no DOM, no framework.\n */\n\n/** Largest per-sweep update below which a solve has converged. */\nconst TOL = 2e-3;\n/** Sweeps (cap) and relaxation on every level above the coarsest. */\nconst FINE_ITERS = 30;\nconst FINE_OMEGA = 1.7;\n\n/**\n * Solves `Δv = 0` on the `unknown` pixels, with the known pixels of `v` as Dirichlet values\n * (neighbours off the grid are ignored: a free boundary). `v` holds the known values on entry and\n * the solution on exit.\n */\nexport function solveMembrane(w: number, h: number, unknown: ArrayLike<boolean | number>, v: Float32Array): void {\n if (unknown.length !== w * h || v.length !== w * h) throw new RangeError(`solveMembrane: expected ${w * h} cells, got ${unknown.length} and ${v.length}.`);\n const u = new Uint8Array(w * h);\n for (let i = 0; i < u.length; i++) u[i] = unknown[i] ? 1 : 0;\n solveLevel(w, h, u, v, 0);\n}\n\nfunction solveLevel(w: number, h: number, unknown: Uint8Array, v: Float32Array, depth: number): void {\n let nUnknown = 0;\n let knownSum = 0;\n let nKnown = 0;\n for (let i = 0; i < unknown.length; i++) {\n if (unknown[i]) nUnknown++;\n else {\n knownSum += v[i];\n nKnown++;\n }\n }\n if (nUnknown === 0 || nKnown === 0) return;\n if (w >= 8 && h >= 8 && nUnknown > 64 && depth < 16) {\n // Restrict: a coarse cell is known when any of its children is (the mean of those).\n const cw = Math.ceil(w / 2);\n const chh = Math.ceil(h / 2);\n const cu = new Uint8Array(cw * chh).fill(1);\n const cv = new Float32Array(cw * chh);\n for (let cy = 0; cy < chh; cy++) {\n for (let cx = 0; cx < cw; cx++) {\n let s = 0;\n let n = 0;\n for (let k = 0; k < 4; k++) {\n const x = cx * 2 + (k & 1);\n const y = cy * 2 + (k >> 1);\n if (x < w && y < h && !unknown[y * w + x]) {\n s += v[y * w + x];\n n++;\n }\n }\n if (n > 0) {\n cu[cy * cw + cx] = 0;\n cv[cy * cw + cx] = s / n;\n }\n }\n }\n solveLevel(cw, chh, cu, cv, depth + 1);\n // Prolong: a bilinear sample of the coarse solution is the starting guess.\n for (let y = 0; y < h; y++) {\n const fy = Math.min(chh - 1, Math.max(0, (y + 0.5) / 2 - 0.5));\n const y0 = Math.floor(fy);\n const y1 = Math.min(chh - 1, y0 + 1);\n const ty = fy - y0;\n for (let x = 0; x < w; x++) {\n if (!unknown[y * w + x]) continue;\n const fx = Math.min(cw - 1, Math.max(0, (x + 0.5) / 2 - 0.5));\n const x0 = Math.floor(fx);\n const x1 = Math.min(cw - 1, x0 + 1);\n const tx = fx - x0;\n const a = cv[y0 * cw + x0] + (cv[y0 * cw + x1] - cv[y0 * cw + x0]) * tx;\n const b = cv[y1 * cw + x0] + (cv[y1 * cw + x1] - cv[y1 * cw + x0]) * tx;\n v[y * w + x] = a + (b - a) * ty;\n }\n }\n sor(w, h, unknown, v, FINE_ITERS, FINE_OMEGA);\n } else {\n const mean = knownSum / nKnown;\n for (let i = 0; i < v.length; i++) if (unknown[i]) v[i] = mean;\n sor(w, h, unknown, v, 2000, 1.85);\n }\n}\n\n/** Over-relaxed Gauss-Seidel sweeps over the unknown cells until the largest update is below `TOL`. */\nfunction sor(w: number, h: number, unknown: Uint8Array, v: Float32Array, maxIter: number, omega: number): void {\n let n = 0;\n for (let i = 0; i < unknown.length; i++) if (unknown[i]) n++;\n const cells = new Uint32Array(n);\n const masks = new Uint8Array(n);\n for (let i = 0, k = 0; i < unknown.length; i++) {\n if (!unknown[i]) continue;\n const x = i % w;\n const y = (i - x) / w;\n cells[k] = i;\n masks[k++] = (x > 0 ? 1 : 0) | (x + 1 < w ? 2 : 0) | (y > 0 ? 4 : 0) | (y + 1 < h ? 8 : 0);\n }\n for (let it = 0; it < maxIter; it++) {\n let maxD = 0;\n for (let k = 0; k < n; k++) {\n const i = cells[k];\n const m = masks[k];\n let s: number;\n let c: number;\n if (m === 15) {\n s = v[i - 1] + v[i + 1] + v[i - w] + v[i + w];\n c = 4;\n } else {\n s = 0;\n c = 0;\n if (m & 1) (s += v[i - 1]), c++;\n if (m & 2) (s += v[i + 1]), c++;\n if (m & 4) (s += v[i - w]), c++;\n if (m & 8) (s += v[i + w]), c++;\n if (c === 0) continue;\n }\n const d = omega * (s / c - v[i]);\n v[i] += d;\n const ad = d < 0 ? -d : d;\n if (ad > maxD) maxD = ad;\n }\n if (maxD < TOL) break;\n }\n}\n\n/**\n * Seamless cloning: `dst` outside `mask`; inside, `src` plus the membrane that removes the\n * mismatch at the mask's edge. So the result keeps the source's texture and takes the\n * destination's colour and light. `src` and `dst` are interleaved `w × h × ch`; leave a one-pixel\n * unmasked margin for a fully fixed boundary.\n */\nexport function seamlessClone(w: number, h: number, ch: number, src: ArrayLike<number>, dst: ArrayLike<number>, mask: ArrayLike<boolean | number>): Float32Array {\n const n = w * h;\n if (src.length !== n * ch || dst.length !== n * ch || mask.length !== n) throw new RangeError('seamlessClone: src, dst and mask must cover w × h pixels.');\n const out = new Float32Array(n * ch);\n const hv = new Float32Array(n);\n for (let c = 0; c < ch; c++) {\n for (let i = 0; i < n; i++) hv[i] = mask[i] ? 0 : dst[i * ch + c] - src[i * ch + c];\n solveMembrane(w, h, mask, hv);\n for (let i = 0; i < n; i++) out[i * ch + c] = mask[i] ? src[i * ch + c] + hv[i] : dst[i * ch + c];\n }\n return out;\n}\n\n/** Membrane fill (no source texture): the known pixels interpolated smoothly into `hole`. */\nexport function membraneFill(w: number, h: number, ch: number, img: ArrayLike<number>, hole: ArrayLike<boolean | number>): Float32Array {\n const n = w * h;\n const out = new Float32Array(n * ch);\n const v = new Float32Array(n);\n for (let c = 0; c < ch; c++) {\n for (let i = 0; i < n; i++) v[i] = hole[i] ? 0 : img[i * ch + c];\n solveMembrane(w, h, hole, v);\n for (let i = 0; i < n; i++) out[i * ch + c] = v[i];\n }\n return out;\n}\n\n/** A mask grown by `r` pixels (square structuring element). */\nexport function dilateMask(w: number, h: number, mask: ArrayLike<boolean | number>, r: number): Uint8Array {\n const tmp = new Uint8Array(w * h);\n for (let y = 0; y < h; y++) {\n for (let x = 0; x < w; x++) {\n if (!mask[y * w + x]) continue;\n for (let xx = Math.max(0, x - r); xx <= Math.min(w - 1, x + r); xx++) tmp[y * w + xx] = 1;\n }\n }\n const out = new Uint8Array(w * h);\n for (let y = 0; y < h; y++) {\n for (let x = 0; x < w; x++) {\n if (!tmp[y * w + x]) continue;\n for (let yy = Math.max(0, y - r); yy <= Math.min(h - 1, y + r); yy++) out[yy * w + x] = 1;\n }\n }\n return out;\n}\n\n/** A summed-area table over a mask, for \"how many masked cells in this window\". */\nclass MaskIntegral {\n private readonly s: Uint32Array;\n constructor(\n private readonly w: number,\n private readonly h: number,\n mask: ArrayLike<boolean | number>\n ) {\n const W = w + 1;\n this.s = new Uint32Array(W * (h + 1));\n for (let y = 0; y < h; y++) {\n let row = 0;\n for (let x = 0; x < w; x++) {\n row += mask[y * w + x] ? 1 : 0;\n this.s[(y + 1) * W + x + 1] = this.s[y * W + x + 1] + row;\n }\n }\n }\n /** Masked cells in [x0, x1) × [y0, y1) (clipped to the grid). */\n count(x0: number, y0: number, x1: number, y1: number): number {\n const W = this.w + 1;\n const a = Math.max(0, Math.min(this.w, x0));\n const b = Math.max(0, Math.min(this.h, y0));\n const c = Math.max(0, Math.min(this.w, x1));\n const d = Math.max(0, Math.min(this.h, y1));\n if (c <= a || d <= b) return 0;\n return this.s[d * W + c] - this.s[b * W + c] - this.s[d * W + a] + this.s[b * W + a];\n }\n}\n\n/** Bounding box [x0, y0, x1, y1) of the set cells, or null. */\nexport function maskBounds(w: number, h: number, mask: ArrayLike<boolean | number>): [number, number, number, number] | null {\n let x0 = w;\n let y0 = h;\n let x1 = -1;\n let y1 = -1;\n for (let y = 0; y < h; y++) {\n for (let x = 0; x < w; x++) {\n if (!mask[y * w + x]) continue;\n if (x < x0) x0 = x;\n if (x > x1) x1 = x;\n if (y < y0) y0 = y;\n if (y > y1) y1 = y;\n }\n }\n return x1 < 0 ? null : [x0, y0, x1 + 1, y1 + 1];\n}\n\n/**\n * Proximity match: the translation `(dx, dy)` (within `maxRadius`) whose pixels best match the\n * ring of `ring` pixels around the hole (sum of squared differences), so `img[p + (dx, dy)]` can\n * fill `p` in the hole. The source window must lie on the grid and hold no hole pixels. Nearer\n * sources win ties. Returns null when no translation fits.\n */\nexport function bestOffset(w: number, h: number, ch: number, img: ArrayLike<number>, hole: ArrayLike<boolean | number>, ring: number, maxRadius: number): [number, number] | null {\n const bb = maskBounds(w, h, hole);\n if (!bb) return null;\n const extent = Math.max(w, h);\n const R = Math.max(0, Math.min(extent, Math.floor(maxRadius)));\n if (R === 0) return null;\n const rg = Math.max(1, Math.min(extent, Math.floor(ring)));\n const hs = new MaskIntegral(w, h, hole);\n const x0 = bb[0] - rg;\n const y0 = bb[1] - rg;\n const x1 = bb[2] + rg;\n const y1 = bb[3] + rg;\n // Sample points: the ring around the hole, subsampled to about 2000.\n const pts: number[] = [];\n for (let y = Math.max(0, y0); y < Math.min(h, y1); y++) {\n for (let x = Math.max(0, x0); x < Math.min(w, x1); x++) {\n if (hole[y * w + x]) continue;\n if (hs.count(x - rg, y - rg, x + rg + 1, y + rg + 1) > 0) pts.push(x, y);\n }\n }\n const stride = Math.max(1, Math.floor(pts.length / 2 / 2000));\n const sx: number[] = [];\n const sy: number[] = [];\n for (let i = 0; i < pts.length; i += 2 * stride) {\n sx.push(pts[i]);\n sy.push(pts[i + 1]);\n }\n const n = Math.max(1, sx.length);\n const evalAt = (dx: number, dy: number, cutoff: number): number | null => {\n if (dx === 0 && dy === 0) return null;\n const hx0 = x0 + dx;\n const hy0 = y0 + dy;\n const hx1 = x1 + dx;\n const hy1 = y1 + dy;\n if (hx0 < 0 || hy0 < 0 || hx1 > w || hy1 > h) return null;\n if (hs.count(hx0, hy0, hx1, hy1) !== 0) return null;\n const penalty = 1 + 1e-3 * (Math.hypot(dx, dy) / R);\n let e = 0;\n for (let i = 0; i < sx.length; i++) {\n const a = (sy[i] * w + sx[i]) * ch;\n const b = ((sy[i] + dy) * w + sx[i] + dx) * ch;\n for (let c = 0; c < ch; c++) {\n const d = img[a + c] - img[b + c];\n e += d * d;\n }\n if ((i & 31) === 31 && (e / n) * penalty >= cutoff) return null;\n }\n return (e / n) * penalty;\n };\n const found: { best: [number, number] | null; e: number } = { best: null, e: Infinity };\n const consider = (dx: number, dy: number) => {\n const e = evalAt(dx, dy, found.e);\n if (e !== null && e < found.e) {\n found.e = e;\n found.best = [dx, dy];\n }\n };\n // A coarse grid over the search window, then every offset around the winner.\n const step = Math.max(1, Math.floor(R / 24));\n for (let dy = -R; dy <= R; dy += step) for (let dx = -R; dx <= R; dx += step) consider(dx, dy);\n if (step > 1 && found.best) {\n const [bx, by] = found.best;\n for (let dy = by - step; dy <= by + step; dy++) for (let dx = bx - step; dx <= bx + step; dx++) consider(dx, dy);\n }\n return found.best;\n}\n","// Portions ported from photocraft/crates/paint/src/retouch.rs, crates/algo/src/retouch.rs and crates/engine/src/retouch_cmds.rs (MIT OR Apache-2.0, © ArtCraft Team and contributors). See THIRD_PARTY_NOTICES.md.\n\n/**\n * The retouching tools on the shared brush engine: Clone Stamp, Healing Brush, Spot Healing\n * Brush, Smudge, Dodge, Burn and Sponge. Two stroke shapes cover them all:\n *\n * - **Accumulate, then composite** (Clone Stamp, Dodge, Burn; the Healing tools' result): the\n * stroke's dabs build up one `CoverageMap` (flow builds towards the dab's opacity ceiling), and\n * per-pixel paint taken from the pre-stroke state (a cloned source, a toned copy of the pixel,\n * a healed patch) is composited through it with `applyRetouchToTile`. Pixels painted earlier in\n * the stroke are never sampled again, and overlapping dabs never exceed the stroke's opacity.\n * - **Sequential dabs** (Smudge, Sponge): `RetouchDabStroke` runs each dab in order over live\n * tiles, so dab n sees what dab n − 1 did.\n *\n * The Healing Brush clones while it is drawn and, when the stroke ends, replaces the clone with a\n * seamless clone (`healPixels`, Poisson blending): the source's texture with the colour and light\n * of the pixels around the stroke. The Spot Healing Brush finds its own source (`spotHealPixels`).\n *\n * Tone curves (`dodgeBurnCurve`, `dodgeBurn`, `sponge`) are photocraft's, made to behave like\n * Photoshop's tools: the chosen range moves most, black and white stay put for midtones, and\n * Protect Tones works on luma so hue and saturation are kept. Data in, pixels out; no DOM.\n */\n\nimport { blendPixel, type BlendMode } from '../raster/blend';\nimport type { RasterRect } from '../raster/surface';\nimport { TILE, tileKey } from '../raster/surface';\nimport { DabWalker, dabRect, rasterizeDab, type BrushSettings, type CoverageMap, type Dab, type StrokePoint } from './brush';\nimport { SmudgeTip, type SmudgeSettings } from './blending';\nimport { TileMedium, type PaintTileTarget } from './exchange';\nimport { bestOffset, dilateMask, maskBounds, membraneFill, seamlessClone } from './heal';\n\n// ---------------------------------------------------------------------------\n// Tone kernels\n// ---------------------------------------------------------------------------\n\n/** The tonal range Dodge and Burn work on most. */\nexport type ToneRange = 'shadows' | 'midtones' | 'highlights';\n\nexport const TONE_RANGES: readonly ToneRange[] = ['shadows', 'midtones', 'highlights'];\n\n/** Rec. 601 luma of straight RGB (0..1). */\nexport function luma(r: number, g: number, b: number): number {\n return 0.299 * r + 0.587 * g + 0.114 * b;\n}\n\n/** The dodge (or burn) transfer of one value `v` (0..1) at exposure `e` (0..1). */\nexport function dodgeBurnCurve(v: number, e: number, range: ToneRange, burn: boolean): number {\n const x = Math.max(0, v);\n const k = Math.min(1, Math.max(0, e));\n const c = Math.min(1, x);\n if (range === 'midtones') {\n // A gamma bend weighted to peak at mid-grey: 0 and 1 stay where they are.\n const w = Math.min(1, Math.max(0, 4 * x * (1 - x)));\n return x + w * (Math.pow(c, burn ? 1 + k : 1 / (1 + k)) - x);\n }\n // Shadows / highlights: `v + e·w·(target − v)`, weighted (1 − v)² or v², so that end moves most.\n const w = range === 'shadows' ? (1 - c) * (1 - c) : c * c;\n return burn ? x - k * w * x : x + k * w * (1 - c);\n}\n\n/** Brings RGB back into 0..1 keeping its luma (mixing towards grey) rather than clipping each channel. */\nfunction compressGamut(c: number[], l: number): void {\n const L = Math.min(1, Math.max(0, l));\n const lo = Math.min(c[0], c[1], c[2]);\n const hi = Math.max(c[0], c[1], c[2]);\n let t = 1;\n if (hi > 1 && hi - L > 1e-9) t = Math.min(t, (1 - L) / (hi - L));\n if (lo < 0 && L - lo > 1e-9) t = Math.min(t, L / (L - lo));\n for (let i = 0; i < 3; i++) c[i] = L + (c[i] - L) * t;\n}\n\n/**\n * Dodge (or burn) straight RGB `c` (0..1, written in place) at exposure `e`. With `protectTones`\n * the curve moves luma and the colour is scaled to it (hue and saturation kept); otherwise each\n * channel goes through the curve.\n */\nexport function dodgeBurn(c: number[], e: number, range: ToneRange, burn: boolean, protectTones: boolean): number[] {\n if (!(e > 0)) return c;\n if (protectTones) {\n const l = luma(c[0], c[1], c[2]);\n const nl = dodgeBurnCurve(l, e, range, burn);\n if (l > 1e-6) for (let i = 0; i < 3; i++) c[i] *= nl / l;\n else c[0] = c[1] = c[2] = nl;\n compressGamut(c, nl);\n } else for (let i = 0; i < 3; i++) c[i] = dodgeBurnCurve(c[i], e, range, burn);\n return c;\n}\n\n/** HSV saturation (chroma / max) of straight RGB. */\nexport function saturationOf(r: number, g: number, b: number): number {\n const lo = Math.min(r, g, b);\n const hi = Math.max(r, g, b);\n return hi <= 1e-6 ? 0 : Math.min(1, Math.max(0, (hi - lo) / hi));\n}\n\n/**\n * Sponge: moves straight RGB `c` (written in place) away from (`saturate`) or towards its luma\n * grey by `amount` (0..1). `vibrance` damps it where it would clip: saturating touches already\n * saturated colours less, desaturating touches near-greys less. Gamut-compressed, never clipped.\n */\nexport function sponge(c: number[], amount: number, saturate: boolean, vibrance: boolean): number[] {\n let a = Math.min(1, Math.max(0, amount));\n if (!(a > 0)) return c;\n if (vibrance) {\n const s = saturationOf(c[0], c[1], c[2]);\n a *= saturate ? 1 - s : 0.25 + 0.75 * s;\n }\n const l = luma(c[0], c[1], c[2]);\n const k = saturate ? 1 + a : 1 - a;\n for (let i = 0; i < 3; i++) c[i] = l + (c[i] - l) * k;\n compressGamut(c, l);\n return c;\n}\n\n/** Per-dab strength so that one pass over a point totals about `e`, whatever the spacing. */\nexport function perDabStrength(e: number, spacing: number): number {\n return 1 - Math.pow(1 - Math.min(1, Math.max(0, e)), Math.min(1, Math.max(0.01, spacing)));\n}\n\n// ---------------------------------------------------------------------------\n// Settings\n// ---------------------------------------------------------------------------\n\n/** Which pixels the Clone Stamp and the Healing tools sample. */\nexport type RetouchSample = 'current' | 'current-below' | 'all';\n\nexport const RETOUCH_SAMPLES: readonly RetouchSample[] = ['current', 'current-below', 'all'];\n\n/** How the Spot Healing Brush finds its source. */\nexport type SpotHealType = 'proximity-match' | 'smooth';\n\nexport const SPOT_HEAL_TYPES: readonly SpotHealType[] = ['proximity-match', 'smooth'];\n\n/** The retouching tools' options. */\nexport interface RetouchSettings {\n /** Clone / heal: keep the source offset from stroke to stroke (default true); off, every stroke starts at the source point. */\n aligned: boolean;\n /** Clone / heal / spot heal: what is sampled (default `current`: the target layer). */\n sample: RetouchSample;\n /** Spot heal: `proximity-match` (default: the best matching patch nearby) or `smooth` (a smooth fill from the edges). */\n spotType: SpotHealType;\n /** Dodge / burn: the tonal range (default `midtones`). */\n range: ToneRange;\n /** Dodge / burn: exposure 0..1 (default 0.5). */\n exposure: number;\n /** Dodge / burn: tone luma only, keeping hue and saturation (default true). */\n protectTones: boolean;\n /** Sponge: `desaturate` (default) or `saturate`. */\n spongeMode: 'desaturate' | 'saturate';\n /** Sponge: damp the change where colours would clip (default true). */\n vibrance: boolean;\n /** Smudge: how strongly the finger carries and lays paint, 0..1 (default 0.5). */\n strength: number;\n}\n\nexport const DEFAULT_RETOUCH: Readonly<RetouchSettings> = {\n aligned: true,\n sample: 'current',\n spotType: 'proximity-match',\n range: 'midtones',\n exposure: 0.5,\n protectTones: true,\n spongeMode: 'desaturate',\n vibrance: true,\n strength: 0.5,\n};\n\n/** Retouch settings with every field valid (missing or invalid fields from `base`). */\nexport function normalizeRetouch(raw: Partial<RetouchSettings> = {}, base: RetouchSettings = DEFAULT_RETOUCH): RetouchSettings {\n const unit = (v: unknown, d: number) => (typeof v === 'number' && Number.isFinite(v) ? Math.min(1, Math.max(0, v)) : d);\n const bool = (v: unknown, d: boolean) => (typeof v === 'boolean' ? v : d);\n const pick = <T extends string>(v: unknown, all: readonly T[], d: T): T => (all.includes(v as T) ? (v as T) : d);\n return {\n aligned: bool(raw.aligned, base.aligned),\n sample: pick(raw.sample, RETOUCH_SAMPLES, base.sample),\n spotType: pick(raw.spotType, SPOT_HEAL_TYPES, base.spotType),\n range: pick(raw.range, TONE_RANGES, base.range),\n exposure: unit(raw.exposure, base.exposure),\n protectTones: bool(raw.protectTones, base.protectTones),\n spongeMode: pick(raw.spongeMode, ['desaturate', 'saturate'] as const, base.spongeMode),\n vibrance: bool(raw.vibrance, base.vibrance),\n strength: unit(raw.strength, base.strength),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Pixel sources\n// ---------------------------------------------------------------------------\n\n/** Pixels a retouching stroke samples, by document pixel. */\nexport interface PixelSource {\n /** Straight RGBA 0..255 of document pixel (x, y) into `out`; false (and `out` zeroed) where there is nothing. */\n sample(x: number, y: number, out: number[]): boolean;\n}\n\n/**\n * A source over raster tiles (layer pixels, a mask, or composite tiles): `readTile` gives tile\n * (tx, ty) in source space or `null` when it is empty; source pixel = document pixel − `offset`.\n * One-channel tiles read as grey (alpha 255). Tiles are cached, so make one per stroke.\n */\nexport class TilePixelSource implements PixelSource {\n private readonly cache = new Map<number, Uint8ClampedArray | null>();\n private lastKey = NaN;\n private last: Uint8ClampedArray | null = null;\n\n constructor(\n private readonly readTile: (tx: number, ty: number) => Uint8ClampedArray | null,\n readonly channels: 1 | 4,\n readonly offset: { x: number; y: number } = { x: 0, y: 0 }\n ) {}\n\n sample(x: number, y: number, out: number[]): boolean {\n const lx = x - this.offset.x;\n const ly = y - this.offset.y;\n const tx = Math.floor(lx / TILE);\n const ty = Math.floor(ly / TILE);\n const key = tileKey(tx, ty);\n if (key !== this.lastKey) {\n let t = this.cache.get(key);\n if (t === undefined) {\n t = this.readTile(tx, ty);\n this.cache.set(key, t);\n }\n this.last = t;\n this.lastKey = key;\n }\n const t = this.last;\n if (!t) {\n out[0] = out[1] = out[2] = out[3] = 0;\n return false;\n }\n const p = (ly - ty * TILE) * TILE + (lx - tx * TILE);\n if (this.channels === 1) {\n out[0] = out[1] = out[2] = t[p];\n out[3] = 255;\n return true;\n }\n const i = p * 4;\n out[0] = t[i];\n out[1] = t[i + 1];\n out[2] = t[i + 2];\n out[3] = t[i + 3];\n return out[3] > 0;\n }\n}\n\n/** A source over a region of float RGBA pixels (0..255), e.g. a healed patch. */\nexport class RegionPixelSource implements PixelSource {\n constructor(\n readonly rect: RasterRect,\n readonly data: Float32Array\n ) {}\n\n sample(x: number, y: number, out: number[]): boolean {\n const r = this.rect;\n const lx = x - r.x;\n const ly = y - r.y;\n if (lx < 0 || ly < 0 || lx >= r.width || ly >= r.height) {\n out[0] = out[1] = out[2] = out[3] = 0;\n return false;\n }\n const i = (ly * r.width + lx) * 4;\n out[0] = this.data[i];\n out[1] = this.data[i + 1];\n out[2] = this.data[i + 2];\n out[3] = this.data[i + 3];\n return out[3] > 0;\n }\n}\n\n/** `rect` of a source, shifted by (dx, dy), as float RGBA 0..255 (`rect.width × rect.height × 4`). */\nexport function readSourceRegion(source: PixelSource, rect: RasterRect, dx = 0, dy = 0): Float32Array {\n const out = new Float32Array(rect.width * rect.height * 4);\n const px = [0, 0, 0, 0];\n for (let y = 0; y < rect.height; y++) {\n for (let x = 0; x < rect.width; x++) {\n source.sample(rect.x + x + dx, rect.y + y + dy, px);\n const i = (y * rect.width + x) * 4;\n out[i] = px[0];\n out[i + 1] = px[1];\n out[i + 2] = px[2];\n out[i + 3] = px[3];\n }\n }\n return out;\n}\n\n// ---------------------------------------------------------------------------\n// Accumulate, then composite\n// ---------------------------------------------------------------------------\n\n/** What a coverage-based retouching stroke lays through its coverage. */\nexport type RetouchPaint =\n /** Source pixels at document pixel + (dx, dy) (Clone Stamp, a healed patch). */\n | { kind: 'source'; source: PixelSource; dx: number; dy: number }\n /** The target pixel itself, toned (Dodge, Burn): `tone` edits straight RGB 0..1 in place. */\n | { kind: 'tone'; tone: (rgb: number[]) => void }\n /** A flat colour (the Spot Healing Brush's trail while it is drawn), RGBA 0..255. */\n | { kind: 'color'; color: readonly [number, number, number, number] };\n\n/** How a coverage-based retouching stroke composites. */\nexport interface RetouchApply {\n /** Stroke opacity 0..1. */\n opacity: number;\n /** Blend mode for source paint (default normal). */\n blend?: BlendMode;\n lockTransparency: boolean;\n /** Selection coverage (document space, canvas-sized), or `null`. */\n selection: { width: number; height: number; data: ArrayLike<number> } | null;\n /** Layer offset (target pixels are in layer space). */\n offset: { x: number; y: number };\n}\n\n/**\n * Composites `paint` through the stroke's coverage over `tileData` (target tile (tx, ty) as it was\n * before the stroke, layer space; RGBA, or one byte per pixel for masks) and returns the new tile.\n * With `into` (the previous result) and `region` (document space), only `region` is recomputed.\n * Tone paint keeps alpha; source and colour paint composite with `blend` (source-over by\n * default), keeping alpha on a locked layer.\n */\nexport function applyRetouchToTile(\n coverage: CoverageMap,\n tileData: Uint8ClampedArray,\n channels: 1 | 4,\n tx: number,\n ty: number,\n paint: RetouchPaint,\n s: RetouchApply,\n options: { into?: Uint8ClampedArray; region?: RasterRect } = {}\n): Uint8ClampedArray {\n const out = options.into ? new Uint8ClampedArray(options.into) : new Uint8ClampedArray(tileData);\n const ox = tx * TILE + s.offset.x;\n const oy = ty * TILE + s.offset.y;\n let x0 = 0;\n let y0 = 0;\n let x1 = TILE;\n let y1 = TILE;\n if (options.region) {\n const r = options.region;\n x0 = Math.max(0, Math.floor(r.x) - ox);\n y0 = Math.max(0, Math.floor(r.y) - oy);\n x1 = Math.min(TILE, Math.ceil(r.x + r.width) - ox);\n y1 = Math.min(TILE, Math.ceil(r.y + r.height) - oy);\n if (x1 <= x0 || y1 <= y0) return out;\n if (options.into) {\n for (let y = y0; y < y1; y++) out.set(tileData.subarray((y * TILE + x0) * channels, (y * TILE + x1) * channels), (y * TILE + x0) * channels);\n }\n }\n const sel = s.selection;\n const blend = s.blend ?? 'normal';\n const src = [0, 0, 0, 0];\n const rgb = [0, 0, 0];\n const cb = [0, 0, 0, 0];\n const cs = [0, 0, 0, 0];\n // The coverage tile under the pixel, looked up once per tile it crosses.\n let covKey = NaN;\n let covTile: Float32Array | undefined;\n for (let y = y0; y < y1; y++) {\n const dy = oy + y;\n const cty = Math.floor(dy / TILE);\n for (let x = x0; x < x1; x++) {\n const dx = ox + x;\n const ctx = Math.floor(dx / TILE);\n const key = tileKey(ctx, cty);\n if (key !== covKey) {\n covKey = key;\n covTile = coverage.tiles.get(key);\n }\n if (!covTile) continue;\n const c = covTile[(dy - cty * TILE) * TILE + (dx - ctx * TILE)];\n if (c <= 0) continue;\n let k = c * s.opacity;\n if (sel) {\n if (dx < 0 || dy < 0 || dx >= sel.width || dy >= sel.height) continue;\n k *= sel.data[dy * sel.width + dx] / 255;\n }\n if (k > 1) k = 1;\n if (k <= 0) continue;\n const p = y * TILE + x;\n if (channels === 1) {\n // Masks: grey values; the source's grey is its red channel.\n const g = out[p];\n let t: number;\n if (paint.kind === 'tone') {\n rgb[0] = rgb[1] = rgb[2] = g / 255;\n paint.tone(rgb);\n t = luma(rgb[0], rgb[1], rgb[2]) * 255;\n } else if (paint.kind === 'color') t = paint.color[0];\n else {\n if (!paint.source.sample(dx + paint.dx, dy + paint.dy, src)) continue;\n t = src[0];\n k *= src[3] / 255;\n }\n out[p] = Math.round(g + (t - g) * k);\n continue;\n }\n const i = p * 4;\n const a = out[i + 3];\n if (paint.kind === 'tone') {\n if (a === 0) continue;\n rgb[0] = out[i] / 255;\n rgb[1] = out[i + 1] / 255;\n rgb[2] = out[i + 2] / 255;\n const r0 = rgb[0];\n const g0 = rgb[1];\n const b0 = rgb[2];\n paint.tone(rgb);\n out[i] = Math.round((r0 + (rgb[0] - r0) * k) * 255);\n out[i + 1] = Math.round((g0 + (rgb[1] - g0) * k) * 255);\n out[i + 2] = Math.round((b0 + (rgb[2] - b0) * k) * 255);\n continue;\n }\n if (s.lockTransparency && a === 0) continue;\n if (paint.kind === 'color') {\n src[0] = paint.color[0];\n src[1] = paint.color[1];\n src[2] = paint.color[2];\n src[3] = paint.color[3];\n } else if (!paint.source.sample(dx + paint.dx, dy + paint.dy, src)) continue;\n for (let ch = 0; ch < 4; ch++) {\n cb[ch] = out[i + ch] / 255;\n cs[ch] = src[ch] / 255;\n }\n // Source-over, as a brush lays paint: cloning transparency paints nothing.\n const o = blendPixel(blend, cb, cs, k);\n out[i] = Math.round(o[0] * 255);\n out[i + 1] = Math.round(o[1] * 255);\n out[i + 2] = Math.round(o[2] * 255);\n if (!s.lockTransparency) out[i + 3] = Math.round(o[3] * 255);\n }\n }\n return out;\n}\n\n/** The tone function of a Dodge or Burn stroke. */\nexport function toneOf(tool: 'dodge' | 'burn', settings: Pick<RetouchSettings, 'exposure' | 'range' | 'protectTones'>): (rgb: number[]) => void {\n const burn = tool === 'burn';\n return (rgb) => {\n dodgeBurn(rgb, settings.exposure, settings.range, burn, settings.protectTones);\n };\n}\n\n// ---------------------------------------------------------------------------\n// Healing\n// ---------------------------------------------------------------------------\n\n/**\n * Heals `src` into `dst` over `mask` (all `w × h`, RGBA floats 0..255): a seamless clone solved\n * only over the mask's bounds plus a one-pixel fixed ring; elsewhere the result is `dst`.\n */\nexport function healPixels(w: number, h: number, src: Float32Array, dst: Float32Array, mask: ArrayLike<boolean | number>): Float32Array {\n const out = new Float32Array(dst);\n const bb = maskBounds(w, h, mask);\n if (!bb) return out;\n const x0 = Math.max(0, bb[0] - 1);\n const y0 = Math.max(0, bb[1] - 1);\n const x1 = Math.min(w, bb[2] + 1);\n const y1 = Math.min(h, bb[3] + 1);\n const rw = x1 - x0;\n const rh = y1 - y0;\n const s = new Float32Array(rw * rh * 4);\n const d = new Float32Array(rw * rh * 4);\n const m = new Uint8Array(rw * rh);\n for (let y = 0; y < rh; y++) {\n for (let x = 0; x < rw; x++) {\n const gi = (y + y0) * w + x + x0;\n const li = y * rw + x;\n m[li] = mask[gi] ? 1 : 0;\n for (let c = 0; c < 4; c++) {\n s[li * 4 + c] = src[gi * 4 + c];\n d[li * 4 + c] = dst[gi * 4 + c];\n }\n }\n }\n const healed = seamlessClone(rw, rh, 4, s, d, m);\n for (let y = 0; y < rh; y++) {\n for (let x = 0; x < rw; x++) {\n const gi = ((y + y0) * w + x + x0) * 4;\n const li = (y * rw + x) * 4;\n for (let c = 0; c < 4; c++) out[gi + c] = Math.min(255, Math.max(0, healed[li + c]));\n }\n }\n return out;\n}\n\n/**\n * Spot healing: fills `hole` (`w × h`) of `img` (RGBA floats 0..255) with no given source, then\n * heals the fill into its surroundings. `proximity-match` copies the best matching nearby patch\n * (falling back to `smooth` when none fits); `smooth` interpolates the edges inwards. `size` is\n * the brush diameter in pixels. Returns the healed pixels over the whole grid.\n */\nexport function spotHealPixels(\n w: number,\n h: number,\n img: Float32Array,\n hole: ArrayLike<boolean | number>,\n size: number,\n type: SpotHealType,\n /** Told the patch offset it copied (`null`: a smooth fill). */\n onOffset?: (offset: [number, number] | null) => void\n): Float32Array {\n // Fill a slightly larger domain than the healed area, so the solve's boundary sees filled values\n // that differ from the untouched pixels: that mismatch is what the membrane corrects.\n const domain = dilateMask(w, h, hole, 2);\n const healMask = dilateMask(w, h, hole, 1);\n let filled: Float32Array | null = null;\n let bestFound: [number, number] | null = null;\n if (type === 'proximity-match') {\n const ring = Math.min(16, Math.max(3, Math.floor(size / 8)));\n const off = bestOffset(w, h, 4, img, domain, ring, Math.floor(Math.max(w, h) / 2));\n if (off) {\n bestFound = off;\n // Copy from the pre-healing pixels, never from what this loop already wrote.\n filled = new Float32Array(img);\n const [ddx, ddy] = off;\n for (let i = 0; i < w * h; i++) {\n if (!domain[i]) continue;\n const x = (i % w) + ddx;\n const y = Math.floor(i / w) + ddy;\n const j = (y * w + x) * 4;\n for (let c = 0; c < 4; c++) filled[i * 4 + c] = img[j + c];\n }\n }\n }\n onOffset?.(filled ? (bestFound as [number, number]) : null);\n if (!filled) filled = membraneFill(w, h, 4, img, domain);\n return healPixels(w, h, filled, img, healMask);\n}\n\n/** The window a Spot Healing stroke over `bounds` looks for texture in: the bounds grown by their size, on the canvas. */\nexport function spotHealWindow(bounds: RasterRect, canvas: { width: number; height: number }): RasterRect {\n const g = Math.max(8, Math.ceil(Math.max(bounds.width, bounds.height)));\n const x0 = Math.max(0, bounds.x - g);\n const y0 = Math.max(0, bounds.y - g);\n const x1 = Math.min(canvas.width, bounds.x + bounds.width + g);\n const y1 = Math.min(canvas.height, bounds.y + bounds.height + g);\n return { x: x0, y: y0, width: Math.max(0, x1 - x0), height: Math.max(0, y1 - y0) };\n}\n\n// ---------------------------------------------------------------------------\n// Sequential dabs\n// ---------------------------------------------------------------------------\n\n/**\n * One dab of a sequential retouching stroke: `cov` is the tip's pure coverage over `rect`\n * (document space, 0..1); `d.alpha` is the flow and `d.opacity` the pressure opacity.\n */\nexport type RetouchDabEffect = (medium: TileMedium, d: Dab, rect: RasterRect, cov: Float32Array) => void;\n\n/**\n * A stroke whose dabs edit live tiles in order (Smudge, Sponge). Feed points with `push` (any\n * chunks give the same dabs), end with `finish`; each returns the document rectangles it touched.\n */\nexport class RetouchDabStroke {\n dabCount = 0;\n bounds: RasterRect | null = null;\n private readonly walker: DabWalker;\n private readonly medium: TileMedium;\n private smoothPos: StrokePoint | null = null;\n private buf = new Float32Array(0);\n\n constructor(\n readonly brush: BrushSettings,\n target: PaintTileTarget,\n private readonly effect: RetouchDabEffect\n ) {\n this.walker = new DabWalker(brush);\n this.medium = new TileMedium(target);\n }\n\n push(points: readonly StrokePoint[]): RasterRect[] {\n const dabs: Dab[] = [];\n for (const p of points) this.walker.push(this.smooth(p), dabs);\n return this.paint(dabs);\n }\n\n finish(last?: StrokePoint): RasterRect[] {\n const dabs: Dab[] = [];\n if (last && this.smoothPos && (this.smoothPos.x !== last.x || this.smoothPos.y !== last.y)) this.walker.push(last, dabs);\n this.walker.finish(dabs);\n return this.paint(dabs);\n }\n\n private smooth(p: StrokePoint): StrokePoint {\n const a = 1 - Math.min(0.95, Math.max(0, this.brush.smoothing));\n const cur = this.smoothPos;\n const n = cur && a < 1 ? { ...p, x: cur.x + (p.x - cur.x) * a, y: cur.y + (p.y - cur.y) * a } : p;\n this.smoothPos = n;\n return n;\n }\n\n private paint(dabs: Dab[]): RasterRect[] {\n const rects: RasterRect[] = [];\n for (const d of dabs) {\n const rect = dabRect(d, this.brush.hardness);\n const n = rect.width * rect.height;\n if (this.buf.length < n) this.buf = new Float32Array(n);\n const cov = this.buf.subarray(0, n);\n rasterizeDab({ ...d, alpha: 1 }, this.brush.hardness, rect, cov);\n this.medium.reset();\n this.effect(this.medium, d, rect, cov);\n rects.push(rect);\n this.bounds = unionRect(this.bounds, rect);\n this.dabCount++;\n }\n return rects;\n }\n}\n\n/** The Smudge's per-dab effect: a `SmudgeTip` whose strength carries and lays the paint. */\nexport function smudgeEffect(brush: BrushSettings, strength: number, mixing: SmudgeSettings['mixing'] = 'rgb'): RetouchDabEffect {\n const s = Math.min(1, Math.max(0, strength));\n const tip = new SmudgeTip({ strength: s, length: s, mixing }, brush.size);\n return (medium, d, rect, cov) => tip.dab(medium, { x: d.x, y: d.y, radius: d.radius, opacity: d.opacity * d.alpha }, rect, cov);\n}\n\n/** The Sponge's per-dab effect: each dab moves saturation by about half its flow, compounding over passes. */\nexport function spongeEffect(brush: BrushSettings, saturate: boolean, vibrance: boolean): RetouchDabEffect {\n const rgb = [0, 0, 0];\n return (medium, d, rect, cov) => {\n const w = rect.width;\n for (let yy = 0; yy < rect.height; yy++) {\n for (let xx = 0; xx < w; xx++) {\n const cv = cov[yy * w + xx];\n if (cv <= 0) continue;\n const dx = rect.x + xx;\n const dy = rect.y + yy;\n const k = perDabStrength(cv * d.alpha * d.opacity * 0.5, brush.spacing) * medium.selectionAt(dx, dy);\n if (k <= 0) continue;\n const ri = medium.locate(dx, dy, false);\n if (ri < 0 || medium.pixels[ri + 3] === 0) continue;\n const i = medium.locate(dx, dy, true);\n const px = medium.pixels;\n rgb[0] = px[i] / 255;\n rgb[1] = px[i + 1] / 255;\n rgb[2] = px[i + 2] / 255;\n sponge(rgb, k, saturate, vibrance);\n px[i] = Math.round(rgb[0] * 255);\n px[i + 1] = Math.round(rgb[1] * 255);\n px[i + 2] = Math.round(rgb[2] * 255);\n }\n }\n };\n}\n\n/**\n * An RGBA view of one-channel tiles (masks), for the sequential-dab tools: reads expand grey to\n * opaque RGB, writes land in RGBA copies, and `flush` writes their red channel back through\n * `target.writeTile`. Alpha is locked, so a mask's values are all a dab changes.\n */\nexport function rgbaViewOfGrey(target: PaintTileTarget): { target: PaintTileTarget; flush(): void } {\n const views = new Map<number, Uint8ClampedArray>();\n const dirty = new Map<number, { tx: number; ty: number; data: Uint8ClampedArray }>();\n const expand = (g: Uint8ClampedArray) => {\n const out = new Uint8ClampedArray(g.length * 4);\n for (let i = 0; i < g.length; i++) {\n out[i * 4] = out[i * 4 + 1] = out[i * 4 + 2] = g[i];\n out[i * 4 + 3] = 255;\n }\n return out;\n };\n const view: PaintTileTarget = {\n offset: target.offset,\n lockTransparency: true,\n selection: target.selection,\n readTile: (tx, ty) => {\n const key = tileKey(tx, ty);\n let v = views.get(key);\n if (!v) {\n // An empty mask tile is still values (0), not transparency: always give a tile.\n v = expand(target.readTile(tx, ty) ?? new Uint8ClampedArray(TILE * TILE));\n views.set(key, v);\n }\n return v;\n },\n writeTile: (tx, ty) => {\n const key = tileKey(tx, ty);\n let v = views.get(key);\n if (!v) {\n v = expand(target.readTile(tx, ty) ?? new Uint8ClampedArray(TILE * TILE));\n views.set(key, v);\n }\n dirty.set(key, { tx, ty, data: v });\n return v;\n },\n };\n return {\n target: view,\n flush: () => {\n for (const { tx, ty, data } of dirty.values()) {\n const g = target.writeTile(tx, ty);\n for (let i = 0; i < g.length; i++) g[i] = data[i * 4];\n }\n dirty.clear();\n },\n };\n}\n\nfunction unionRect(a: RasterRect | null, b: RasterRect): RasterRect {\n if (!a) return { ...b };\n const x = Math.min(a.x, b.x);\n const y = Math.min(a.y, b.y);\n return { x, y, width: Math.max(a.x + a.width, b.x + b.width) - x, height: Math.max(a.y + a.height, b.y + b.height) - y };\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/export/images.ts","../src/export/units.ts","../src/export/xml.ts","../src/export/zip-writer.ts","../src/export/docx.ts","../src/export/controller.ts"],"sourcesContent":["/** Image types Word displays without a fallback, by MIME type → file extension. */\nexport const DOCX_IMAGE_TYPES: Record<string, string> = {\n \"image/png\": \"png\",\n \"image/jpeg\": \"jpeg\",\n \"image/jpg\": \"jpeg\",\n \"image/gif\": \"gif\",\n \"image/bmp\": \"bmp\",\n \"image/webp\": \"webp\",\n \"image/tiff\": \"tiff\",\n};\n\n/** Content types of the image extensions above. */\nexport const DOCX_IMAGE_CONTENT_TYPES: Record<string, string> = {\n png: \"image/png\",\n jpeg: \"image/jpeg\",\n gif: \"image/gif\",\n bmp: \"image/bmp\",\n webp: \"image/webp\",\n tiff: \"image/tiff\",\n};\n\nexport interface DecodedDataUrl {\n mime: string;\n bytes: Uint8Array;\n}\n\n/** Largest data URL decoded (characters), so a huge attribute cannot exhaust memory twice. */\nconst MAX_DATA_URL = 64 * 1024 * 1024;\n\n/** Decodes a base64 `data:` URL. Returns `null` for anything else or malformed input. */\nexport function decodeDataUrl(src: string): DecodedDataUrl | null {\n if (src.length > MAX_DATA_URL) return null;\n const comma = src.indexOf(\",\");\n if (comma === -1) return null;\n const header = /^data:([a-z0-9.+-]+\\/[a-z0-9.+-]+)((?:;[a-z0-9-]+=[^;,]*)*);base64$/i.exec(src.slice(0, comma));\n if (!header) return null;\n const payload = src.slice(comma + 1).replace(/\\s+/g, \"\");\n if (!/^[A-Za-z0-9+/]*={0,2}$/.test(payload)) return null;\n try {\n const binary = atob(payload);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);\n return { mime: header[1].toLowerCase(), bytes };\n } catch {\n return null;\n }\n}\n\nconst u16be = (b: Uint8Array, i: number) => (b[i] << 8) | b[i + 1];\nconst u16le = (b: Uint8Array, i: number) => b[i] | (b[i + 1] << 8);\nconst u32be = (b: Uint8Array, i: number) => ((b[i] << 24) | (b[i + 1] << 16) | (b[i + 2] << 8) | b[i + 3]) >>> 0;\nconst i32le = (b: Uint8Array, i: number) => b[i] | (b[i + 1] << 8) | (b[i + 2] << 16) | (b[i + 3] << 24);\n\n/** Pixel size read from a PNG, GIF, JPEG, BMP or WebP header, or `null`. */\nexport function imagePixelSize(b: Uint8Array): { width: number; height: number } | null {\n const ok = (width: number, height: number) =>\n width > 0 && height > 0 && width < 1e6 && height < 1e6 ? { width, height } : null;\n if (b.length >= 24 && b[0] === 0x89 && b[1] === 0x50 && b[2] === 0x4e && b[3] === 0x47) {\n return ok(u32be(b, 16), u32be(b, 20));\n }\n if (b.length >= 10 && b[0] === 0x47 && b[1] === 0x49 && b[2] === 0x46) return ok(u16le(b, 6), u16le(b, 8));\n if (b.length >= 26 && b[0] === 0x42 && b[1] === 0x4d) return ok(Math.abs(i32le(b, 18)), Math.abs(i32le(b, 22)));\n if (b.length >= 30 && b[0] === 0x52 && b[1] === 0x49 && b[8] === 0x57 && b[9] === 0x45) {\n const chunk = String.fromCharCode(b[12], b[13], b[14], b[15]);\n if (chunk === \"VP8 \") return ok(u16le(b, 26) & 0x3fff, u16le(b, 28) & 0x3fff);\n if (chunk === \"VP8L\") {\n const bits = b[21] | (b[22] << 8) | (b[23] << 16) | (b[24] << 24);\n return ok((bits & 0x3fff) + 1, ((bits >>> 14) & 0x3fff) + 1);\n }\n if (chunk === \"VP8X\") return ok((b[24] | (b[25] << 8) | (b[26] << 16)) + 1, (b[27] | (b[28] << 8) | (b[29] << 16)) + 1);\n return null;\n }\n if (b.length >= 4 && b[0] === 0xff && b[1] === 0xd8) {\n // Walk the JPEG segments to the first start-of-frame marker.\n let i = 2;\n while (i + 9 < b.length) {\n if (b[i] !== 0xff) return null;\n const marker = b[i + 1];\n if (marker === 0xd8 || marker === 0x01 || (marker >= 0xd0 && marker <= 0xd7)) {\n i += 2;\n continue;\n }\n const length = u16be(b, i + 2);\n if (marker >= 0xc0 && marker <= 0xcf && marker !== 0xc4 && marker !== 0xc8 && marker !== 0xcc) {\n return ok(u16be(b, i + 7), u16be(b, i + 5));\n }\n if (length < 2) return null;\n i += 2 + length;\n }\n }\n return null;\n}\n\n/** A CSS pixel size from a node attribute (`320`, `\"320\"`, `\"320px\"`), or `undefined`. */\nexport function pixelAttr(value: unknown): number | undefined {\n if (typeof value === \"number\") return Number.isFinite(value) && value > 0 ? value : undefined;\n if (typeof value !== \"string\") return undefined;\n const match = /^\\s*(\\d+(?:\\.\\d+)?)\\s*(px)?\\s*$/i.exec(value);\n return match ? Number(match[1]) || undefined : undefined;\n}\n","// Portions ported from wordcraft/crates/docx/src/units.rs (MIT OR Apache-2.0, © ArtCraft Team and contributors). See THIRD_PARTY_NOTICES.md.\n\n/** Base font size (points) that `em` / `rem` / `%` lengths are relative to: Word's default 11 pt. */\nexport const DOCX_BASE_FONT_PT = 11;\n/** Largest length accepted, in points (22 inches, Word's page limit). */\nconst MAX_LEN_PT = 1584;\n\nconst UNIT_PT: Record<string, number> = {\n pt: 1,\n px: 0.75,\n in: 72,\n cm: 72 / 2.54,\n mm: 72 / 25.4,\n pc: 12,\n};\n\n/**\n * Converts a CSS length (`12pt`, `16px`, `1.5em`, `120%`, `0.5in`) to points.\n * Unit-less numbers are pixels. Returns `undefined` for anything else\n * (`calc()`, `var()`, keywords) and clamps to ±1584 pt.\n */\nexport function cssLengthToPt(value: unknown, basePt = DOCX_BASE_FONT_PT): number | undefined {\n if (typeof value === \"number\") return Number.isFinite(value) ? clampPt(value * UNIT_PT.px) : undefined;\n if (typeof value !== \"string\") return undefined;\n const match = /^\\s*(-?\\d+(?:\\.\\d+)?|-?\\.\\d+)\\s*([a-z%]*)\\s*$/i.exec(value);\n if (!match) return undefined;\n const n = Number(match[1]);\n const unit = match[2].toLowerCase() || \"px\";\n let pt: number | undefined;\n if (unit === \"em\" || unit === \"rem\") pt = n * basePt;\n else if (unit === \"%\") pt = (n / 100) * basePt;\n else if (unit in UNIT_PT) pt = n * UNIT_PT[unit];\n return pt === undefined || !Number.isFinite(pt) ? undefined : clampPt(pt);\n}\n\nfunction clampPt(pt: number): number {\n return Math.max(-MAX_LEN_PT, Math.min(MAX_LEN_PT, pt));\n}\n\n/** Points → twentieths of a point (twips), as an integer. */\nexport const ptToTwips = (pt: number): number => Math.round(pt * 20);\n/** Points → half-points (`w:sz`), at least 1. */\nexport const ptToHalfPoints = (pt: number): number => Math.max(1, Math.min(3276, Math.round(pt * 2)));\n/** CSS pixels (96 dpi) → English Metric Units (images). */\nexport const pxToEmu = (px: number): number => Math.round(px * 9525);\n/** CSS pixels (96 dpi) → twips. */\nexport const pxToTwips = (px: number): number => Math.round(px * 15);\n\n/** Formats points for CSS, e.g. `12pt` or `10.5pt`. */\nexport function ptToCss(pt: number): string {\n return `${Math.round(pt * 100) / 100}pt`;\n}\n\nconst NAMED_COLORS: Record<string, string> = {\n black: \"000000\",\n white: \"FFFFFF\",\n red: \"FF0000\",\n green: \"008000\",\n lime: \"00FF00\",\n blue: \"0000FF\",\n yellow: \"FFFF00\",\n cyan: \"00FFFF\",\n aqua: \"00FFFF\",\n magenta: \"FF00FF\",\n fuchsia: \"FF00FF\",\n gray: \"808080\",\n grey: \"808080\",\n silver: \"C0C0C0\",\n maroon: \"800000\",\n navy: \"000080\",\n olive: \"808000\",\n purple: \"800080\",\n teal: \"008080\",\n orange: \"FFA500\",\n pink: \"FFC0CB\",\n};\n\n/**\n * A CSS colour (`#abc`, `#aabbcc`, `#aabbccdd`, `rgb()` / `rgba()`, a few\n * names) as six upper-case hex digits, or `undefined`.\n */\nexport function cssColorToHex(value: unknown): string | undefined {\n if (typeof value !== \"string\") return undefined;\n const color = value.trim().toLowerCase();\n if (color in NAMED_COLORS) return NAMED_COLORS[color];\n let match = /^#([0-9a-f]{3,4})$/.exec(color);\n if (match) return match[1].slice(0, 3).split(\"\").map((c) => c + c).join(\"\").toUpperCase();\n match = /^#([0-9a-f]{6})(?:[0-9a-f]{2})?$/.exec(color);\n if (match) return match[1].toUpperCase();\n match = /^rgba?\\(\\s*(\\d{1,3})\\s*[, ]\\s*(\\d{1,3})\\s*[, ]\\s*(\\d{1,3})\\s*(?:[,/]\\s*[\\d.]+%?\\s*)?\\)$/.exec(color);\n if (match) {\n return match\n .slice(1, 4)\n .map((n) => Math.min(255, Number(n)).toString(16).padStart(2, \"0\"))\n .join(\"\")\n .toUpperCase();\n }\n return undefined;\n}\n\n/** Word's highlight colours (`w:highlight`), by their RGB value. */\nexport const WORD_HIGHLIGHTS: Record<string, string> = {\n FFFF00: \"yellow\",\n \"00FF00\": \"green\",\n \"00FFFF\": \"cyan\",\n FF00FF: \"magenta\",\n \"0000FF\": \"blue\",\n FF0000: \"red\",\n \"000080\": \"darkBlue\",\n \"008080\": \"darkCyan\",\n \"008000\": \"darkGreen\",\n \"800080\": \"darkMagenta\",\n \"800000\": \"darkRed\",\n \"808000\": \"darkYellow\",\n \"808080\": \"darkGray\",\n C0C0C0: \"lightGray\",\n \"000000\": \"black\",\n FFFFFF: \"white\",\n};\n","// Portions ported from wordcraft/crates/docx/src/xml.rs (MIT OR Apache-2.0, © ArtCraft Team and contributors). See THIRD_PARTY_NOTICES.md.\n\n/**\n * Characters XML 1.0 cannot carry (C0 controls other than tab / LF / CR,\n * lone surrogates, U+FFFE / U+FFFF). They are dropped, never escaped:\n * `` is not well-formed XML 1.0 either.\n */\nconst INVALID_XML_CHARS = /[^\\t\\n\\r --�\\u{10000}-\\u{10FFFF}]/gu;\n\n/** Removes characters that are not allowed in XML 1.0 documents. */\nexport function stripInvalidXmlChars(value: string): string {\n return value.replace(INVALID_XML_CHARS, \"\");\n}\n\n/** Escapes text for XML element content (`&`, `<`, `>`), dropping invalid characters. */\nexport function escapeXmlText(value: string): string {\n return stripInvalidXmlChars(value).replace(/&/g, \"&\").replace(/</g, \"<\").replace(/>/g, \">\");\n}\n\n/**\n * Escapes a value for a double- or single-quoted XML attribute. White space\n * other than spaces is written as character references, because attribute\n * value normalisation would otherwise turn tabs and newlines into spaces.\n */\nexport function escapeXmlAttr(value: string): string {\n return escapeXmlText(value)\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\")\n .replace(/\\t/g, \"	\")\n .replace(/\\n/g, \" \")\n .replace(/\\r/g, \" \");\n}\n\nexport type XmlAttrs = Record<string, string | number | undefined | null | false>;\n\nfunction attrs(values: XmlAttrs | undefined): string {\n if (!values) return \"\";\n let out = \"\";\n for (const [name, value] of Object.entries(values)) {\n if (value === undefined || value === null || value === false) continue;\n out += ` ${name}=\"${escapeXmlAttr(String(value))}\"`;\n }\n return out;\n}\n\n/**\n * A small string-building XML writer; every attribute value and text node is\n * escaped. Element names are trusted (always literals in this codebase).\n */\nexport class XmlWriter {\n private parts: string[];\n\n /** `declaration: false` writes a fragment (e.g. one paragraph). */\n constructor(declaration = true) {\n this.parts = declaration ? ['<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n'] : [];\n }\n\n open(name: string, values?: XmlAttrs): this {\n this.parts.push(`<${name}${attrs(values)}>`);\n return this;\n }\n\n empty(name: string, values?: XmlAttrs): this {\n this.parts.push(`<${name}${attrs(values)}/>`);\n return this;\n }\n\n close(name: string): this {\n this.parts.push(`</${name}>`);\n return this;\n }\n\n text(value: string): this {\n this.parts.push(escapeXmlText(value));\n return this;\n }\n\n /** `<name attrs>text</name>`. */\n leaf(name: string, values: XmlAttrs | undefined, text: string): this {\n return this.open(name, values).text(text).close(name);\n }\n\n /** `<name w:val=\"value\"/>`. */\n val(name: string, value: string | number): this {\n return this.empty(name, { \"w:val\": value });\n }\n\n /** Appends markup produced by another writer. */\n raw(markup: string): this {\n this.parts.push(markup);\n return this;\n }\n\n toString(): string {\n return this.parts.join(\"\");\n }\n}\n","import { zipCrc32 } from \"../import/zip\";\n\n/**\n * Minimal, dependency-free ZIP writer (the counterpart of `readZip`), used by\n * the DOCX export. Entries are deflated with the platform\n * `CompressionStream(\"deflate-raw\")` when it exists (modern browsers,\n * Node ≥ 18) and stored otherwise, or when deflating does not make them\n * smaller. Names are written as UTF-8 (flag bit 11). No ZIP64: archives are\n * limited to 65 535 entries and 4 GiB.\n */\n\nexport interface ZipWriteEntry {\n /** Entry path with `/` separators; must be relative and free of `..`. */\n name: string;\n /** Strings are encoded as UTF-8. */\n data: Uint8Array | string;\n}\n\nexport interface ZipWriteOptions {\n /**\n * `\"auto\"` (default) deflates when `CompressionStream` is available,\n * `\"store\"` never compresses.\n */\n compression?: \"auto\" | \"store\";\n /**\n * Modification time written for every entry (default 1980-01-01, the DOS\n * epoch, so the output is deterministic).\n */\n modified?: Date;\n}\n\nconst encoder = new TextEncoder();\nconst MAX_SIZE = 0xffffffff;\n\nasync function readAll(readable: ReadableStream<Uint8Array>): Promise<Uint8Array> {\n const reader = readable.getReader();\n const chunks: Uint8Array[] = [];\n let length = 0;\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n length += value.length;\n }\n const out = new Uint8Array(length);\n let pos = 0;\n for (const chunk of chunks) {\n out.set(chunk, pos);\n pos += chunk.length;\n }\n return out;\n}\n\n/** Raw deflate with `CompressionStream`, or `null` when it is unavailable. */\nexport async function deflateRaw(data: Uint8Array): Promise<Uint8Array | null> {\n const Stream = (globalThis as { CompressionStream?: typeof CompressionStream }).CompressionStream;\n if (typeof Stream !== \"function\") return null;\n let stream: CompressionStream;\n try {\n stream = new Stream(\"deflate-raw\" as CompressionFormat);\n } catch {\n return null;\n }\n // Plain stream APIs only: jsdom's Blob has no `stream()` (see GOTCHAS).\n const writer = stream.writable.getWriter();\n const written = writer\n .write(data as unknown as BufferSource)\n .then(() => writer.close())\n .catch(() => {});\n const out = await readAll(stream.readable as ReadableStream<Uint8Array>);\n await written;\n return out;\n}\n\nfunction dosDateTime(date: Date): { time: number; date: number } {\n const year = Math.min(Math.max(date.getUTCFullYear(), 1980), 2107);\n return {\n time: (date.getUTCHours() << 11) | (date.getUTCMinutes() << 5) | Math.floor(date.getUTCSeconds() / 2),\n date: ((year - 1980) << 9) | ((date.getUTCMonth() + 1) << 5) | date.getUTCDate(),\n };\n}\n\nclass ByteSink {\n private chunks: Uint8Array[] = [];\n length = 0;\n\n bytes(data: Uint8Array): void {\n this.chunks.push(data);\n this.length += data.length;\n }\n\n header(fields: [number, 2 | 4][]): void {\n const size = fields.reduce((n, [, width]) => n + width, 0);\n const buffer = new Uint8Array(size);\n const view = new DataView(buffer.buffer);\n let pos = 0;\n for (const [value, width] of fields) {\n if (width === 2) view.setUint16(pos, value, true);\n else view.setUint32(pos, value >>> 0, true);\n pos += width;\n }\n this.bytes(buffer);\n }\n\n toUint8Array(): Uint8Array {\n const out = new Uint8Array(this.length);\n let pos = 0;\n for (const chunk of this.chunks) {\n out.set(chunk, pos);\n pos += chunk.length;\n }\n return out;\n }\n}\n\n/** Writes a ZIP archive. Throws on unsafe or duplicate names and oversized archives. */\nexport async function writeZip(entries: readonly ZipWriteEntry[], options: ZipWriteOptions = {}): Promise<Uint8Array> {\n if (entries.length > 0xffff) throw new RangeError(\"Too many ZIP entries (no ZIP64 support).\");\n const { time, date } = dosDateTime(options.modified ?? new Date(Date.UTC(1980, 0, 1)));\n const out = new ByteSink();\n const central = new ByteSink();\n const seen = new Set<string>();\n for (const entry of entries) {\n const name = entry.name;\n if (!name || name.startsWith(\"/\") || name.includes(\"\\\\\") || name.split(\"/\").includes(\"..\") || name.includes(\"\\0\")) {\n throw new Error(`Unsafe ZIP entry name: ${JSON.stringify(name)}`);\n }\n if (seen.has(name)) throw new Error(`Duplicate ZIP entry name: ${JSON.stringify(name)}`);\n seen.add(name);\n const raw = typeof entry.data === \"string\" ? encoder.encode(entry.data) : entry.data;\n const deflated = options.compression === \"store\" || raw.length === 0 ? null : await deflateRaw(raw);\n const useDeflate = !!deflated && deflated.length < raw.length;\n const body = useDeflate ? deflated! : raw;\n const method = useDeflate ? 8 : 0;\n const nameBytes = encoder.encode(name);\n const crc = zipCrc32(raw);\n const offset = out.length;\n if (body.length > MAX_SIZE || raw.length > MAX_SIZE || offset > MAX_SIZE) {\n throw new RangeError(\"ZIP archive too large (no ZIP64 support).\");\n }\n const flags = 0x0800;\n out.header([\n [0x04034b50, 4], [20, 2], [flags, 2], [method, 2], [time, 2], [date, 2],\n [crc, 4], [body.length, 4], [raw.length, 4], [nameBytes.length, 2], [0, 2],\n ]);\n out.bytes(nameBytes);\n out.bytes(body);\n central.header([\n [0x02014b50, 4], [20, 2], [20, 2], [flags, 2], [method, 2], [time, 2], [date, 2],\n [crc, 4], [body.length, 4], [raw.length, 4], [nameBytes.length, 2], [0, 2], [0, 2],\n [0, 2], [0, 2], [0, 4], [offset, 4],\n ]);\n central.bytes(nameBytes);\n }\n const cdOffset = out.length;\n const cd = central.toUint8Array();\n out.bytes(cd);\n out.header([\n [0x06054b50, 4], [0, 2], [0, 2], [entries.length, 2], [entries.length, 2],\n [cd.length, 4], [cdOffset, 4], [0, 2],\n ]);\n return out.toUint8Array();\n}\n","// Portions ported from wordcraft/crates/docx/src/write/mod.rs, wordcraft/crates/docx/src/write/story.rs, wordcraft/crates/docx/src/write/props.rs and wordcraft/crates/docx/src/package.rs (MIT OR Apache-2.0, © ArtCraft Team and contributors). See THIRD_PARTY_NOTICES.md.\nimport { CHART_OOXML_CONTENT_TYPE, CHART_OOXML_NS, CHART_OOXML_RELATIONSHIP, chartToOoxml } from \"../chart/ooxml\";\nimport { normalizeChartSpec } from \"../chart/spec\";\nimport type { CommentThread, ReviewAuthor, SerializedComments } from \"../extensions/comment-store\";\nimport {\n DEFAULT_STYLES,\n isValidStyleId,\n NORMAL_STYLE_ID,\n type CharacterFormat,\n type ParagraphFormat,\n type StyleDefaults,\n type StyleDefinition,\n type StyleRegistry,\n type StyleRegistryJSON,\n} from \"../extensions/paragraph-styles/registry\";\nimport { DOCX_IMAGE_CONTENT_TYPES, DOCX_IMAGE_TYPES, decodeDataUrl, imagePixelSize, pixelAttr } from \"./images\";\nimport {\n cssColorToHex,\n cssLengthToPt,\n ptToHalfPoints,\n ptToTwips,\n pxToEmu,\n pxToTwips,\n WORD_HIGHLIGHTS,\n} from \"./units\";\nimport { XmlWriter, type XmlAttrs } from \"./xml\";\nimport { writeZip, type ZipWriteEntry } from \"./zip-writer\";\n\n/**\n * Dependency-free DOCX (WordprocessingML) export of TipTap documents.\n *\n * Takes an editor (anything with `getJSON()`) or its JSON and writes a\n * minimal, valid package: `[Content_Types].xml`, `_rels/.rels`,\n * `word/document.xml` (+ relationships), `styles.xml` (from the paragraph\n * style registry, with `basedOn` / `next` / `link`), `numbering.xml` (one\n * `w:num` per list), `settings.xml`, `comments.xml` +\n * `commentsExtended.xml` (replies and resolved state) + `people.xml` (author\n * ids), `docProps/core.xml` and `docProps/app.xml`, plus embedded images and\n * charts (`chart` nodes become native Word charts in `word/charts/chartN.xml`;\n * inline `sparkline` nodes are written as text: their label, or ▁▃▇ bars).\n *\n * Tracked insertions, deletions, moves (`w:moveFrom` / `w:moveTo` with\n * named move ranges), formatting changes (`w:rPrChange`) and block changes\n * (`w:pPrChange`, paragraph-mark `w:ins` / `w:del`) keep their authors and\n * dates. Anything that cannot be written is listed in the returned report.\n */\n\nexport const DOCX_EXPORT_MIME_TYPE = \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\";\n\n/** A ProseMirror / TipTap JSON node (`editor.getJSON()`). */\nexport interface DocxJSONNode {\n type?: string;\n attrs?: Record<string, any>;\n content?: DocxJSONNode[];\n marks?: DocxJSONMark[];\n text?: string;\n}\n\nexport interface DocxJSONMark {\n type: string;\n attrs?: Record<string, any>;\n}\n\n/** Anything with `getJSON()`, e.g. a TipTap `Editor`. Its comment store and style registry are used by default. */\nexport interface DocxExportEditorLike {\n getJSON(): DocxJSONNode;\n storage?: unknown;\n}\n\n/** A comment store (`CommentStore`), its `toJSON()` output, or a thread list. */\nexport type DocxCommentSource =\n | { toJSON(): SerializedComments }\n | { getSnapshot(): { threads: readonly CommentThread[] } }\n | SerializedComments\n | readonly CommentThread[];\n\nexport interface DocxExportOptions {\n /**\n * Paragraph and character styles written to `styles.xml`. Defaults to the\n * editor's registry (`ParagraphStyles` extension), else the built-in styles.\n */\n styles?: StyleRegistry | StyleRegistryJSON | readonly StyleDefinition[];\n /** Comment threads. Defaults to the editor's comment store (`Comments` extension). */\n comments?: DocxCommentSource | null;\n /**\n * The document's author (`dc:creator`) and the author of tracked changes\n * and comments that name none.\n */\n author?: string | ReviewAuthor;\n /**\n * `\"strip-authors\"` writes every comment, reply and tracked change as\n * \"Author\" (initials \"A\"), leaves out `people.xml`, the creator and last\n * modified by, and sets `w:removePersonalInformation` so Word keeps doing\n * so. Default `\"keep\"`.\n */\n privacy?: \"keep\" | \"strip-authors\";\n /** `dc:title` of the document. */\n title?: string;\n /**\n * Images with `http(s)` URLs: `\"skip\"` (default, reported) or `\"link\"`\n * (an external relationship Word may load when the file is opened).\n */\n remoteImages?: \"skip\" | \"link\";\n /** Time written as created / modified (default: now). */\n now?: () => Date;\n /** ZIP compression (default `\"auto\"`: deflate when `CompressionStream` exists). */\n compression?: \"auto\" | \"store\";\n}\n\nexport type DocxExportIssueKind = \"node\" | \"mark\" | \"image\" | \"link\" | \"comment\" | \"style\";\n\n/** Something the export left out or simplified, counted per kind, name and reason. */\nexport interface DocxExportIssue {\n kind: DocxExportIssueKind;\n /** Node / mark type, style id, image or link URL (truncated), or comment thread id. */\n name: string;\n reason: string;\n count: number;\n}\n\nexport interface DocxExportReport {\n /** Content that was dropped or simplified. Empty when everything was written. */\n dropped: DocxExportIssue[];\n /** Counts of what was written. */\n written: {\n paragraphs: number;\n tables: number;\n images: number;\n /** `chart` nodes written as native Word charts. */\n charts: number;\n comments: number;\n replies: number;\n trackedChanges: number;\n };\n}\n\nexport interface DocxExportResult {\n /** The `.docx` file. */\n data: Uint8Array;\n report: DocxExportReport;\n}\n\nexport interface DocxPackagePart {\n name: string;\n data: Uint8Array | string;\n}\n\nconst NS = {\n w: \"http://schemas.openxmlformats.org/wordprocessingml/2006/main\",\n r: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships\",\n wp: \"http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing\",\n a: \"http://schemas.openxmlformats.org/drawingml/2006/main\",\n pic: \"http://schemas.openxmlformats.org/drawingml/2006/picture\",\n mc: \"http://schemas.openxmlformats.org/markup-compatibility/2006\",\n w14: \"http://schemas.microsoft.com/office/word/2010/wordml\",\n w15: \"http://schemas.microsoft.com/office/word/2012/wordml\",\n};\n\nconst BODY_NS: XmlAttrs = {\n \"xmlns:w\": NS.w,\n \"xmlns:r\": NS.r,\n \"xmlns:wp\": NS.wp,\n \"xmlns:a\": NS.a,\n \"xmlns:pic\": NS.pic,\n \"xmlns:mc\": NS.mc,\n \"xmlns:w14\": NS.w14,\n \"xmlns:w15\": NS.w15,\n \"mc:Ignorable\": \"w14 w15\",\n};\n\nconst REL = {\n officeDocument: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument\",\n core: \"http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties\",\n app: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties\",\n styles: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles\",\n numbering: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/numbering\",\n settings: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/settings\",\n comments: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments\",\n commentsExtended: \"http://schemas.microsoft.com/office/2011/relationships/commentsExtended\",\n people: \"http://schemas.microsoft.com/office/2011/relationships/people\",\n image: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image\",\n hyperlink: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink\",\n};\n\nconst CT_WML = \"application/vnd.openxmlformats-officedocument.wordprocessingml.\";\n\n/** Text width of a US Letter page with 1\" margins, in twips (6.5\"). */\nconst CONTENT_WIDTH_TWIPS = 9360;\n/** Widest image, in CSS pixels (6.5\" at 96 dpi). */\nconst MAX_IMAGE_WIDTH_PX = 624;\n/** Indent per list or quote level, in twips (0.5\"). */\nconst INDENT_STEP = 720;\n/** Name written for every author with `privacy: \"strip-authors\"` (as Word does). */\nexport const DOCX_ANONYMOUS_AUTHOR = \"Author\";\nconst ANONYMOUS_INITIALS = \"A\";\nconst MAX_DEPTH = 64;\n\n/** Bullet characters per list level. */\nconst BULLETS = [\"•\", \"◦\", \"▪\"];\nconst BULLET_FONTS = [\"Symbol\", \"Courier New\", \"Wingdings\"];\nconst TASK_UNCHECKED = \"☐\";\nconst TASK_CHECKED = \"☒\";\n\n/** Formatting marks whose `rPr` is written; the rest are reported. */\nconst FORMAT_MARKS = new Set([\n \"bold\",\n \"italic\",\n \"underline\",\n \"strike\",\n \"subscript\",\n \"superscript\",\n \"code\",\n \"textStyle\",\n \"highlight\",\n \"characterStyle\",\n]);\n/** Marks handled separately (links, review) or that carry no formatting. */\nconst STRUCTURAL_MARKS = new Set([\"link\", \"insertion\", \"deletion\", \"formatChange\", \"comment\", \"bookmark\"]);\n\ninterface RunFormat {\n charStyle?: string;\n font?: string;\n bold?: boolean;\n italic?: boolean;\n strike?: boolean;\n color?: string;\n halfPoints?: number;\n highlight?: string;\n shading?: string;\n underline?: boolean;\n vertAlign?: \"superscript\" | \"subscript\";\n}\n\ninterface Revision {\n kind: \"ins\" | \"del\";\n attrs: Record<string, any>;\n moveId?: string;\n}\n\ntype PieceKind = \"text\" | \"tab\" | \"br\" | \"image\";\n\ninterface Piece {\n kind: PieceKind;\n text?: string;\n node: DocxJSONNode;\n /** Last piece produced by `node` (comment range ends go after it). */\n last: boolean;\n marks: DocxJSONMark[];\n}\n\ninterface BlockContext {\n depth: number;\n quoteLevel: number;\n list?: { numId: number; level: number; task?: boolean; checked?: boolean };\n /** The list item's first paragraph gets the number; later ones are indented. */\n listItemFirst?: boolean;\n}\n\ninterface BlockChangeRecord {\n changeId?: string;\n authorId?: string;\n authorName?: string;\n createdAt?: number;\n previous?: { type?: string; attrs?: Record<string, any> };\n operation?: \"insert\" | \"delete\";\n}\n\nconst isEditorLike = (value: unknown): value is DocxExportEditorLike =>\n !!value && typeof (value as DocxExportEditorLike).getJSON === \"function\";\n\n/** Threads from any supported comment source. */\nfunction threadsOf(source: DocxCommentSource | null | undefined): CommentThread[] {\n if (!source) return [];\n if (Array.isArray(source)) return [...source];\n const value = source as any;\n if (typeof value.toJSON === \"function\") return [...(value.toJSON()?.threads ?? [])];\n if (typeof value.getSnapshot === \"function\") return [...(value.getSnapshot()?.threads ?? [])];\n return Array.isArray(value.threads) ? [...value.threads] : [];\n}\n\nfunction stylesOf(source: DocxExportOptions[\"styles\"]): { styles: StyleDefinition[]; defaults: StyleDefaults } {\n if (!source) return { styles: DEFAULT_STYLES.map((s) => ({ ...s })), defaults: {} };\n if (Array.isArray(source)) return { styles: [...source], defaults: {} };\n const value = source as any;\n const json: StyleRegistryJSON = typeof value.toJSON === \"function\" ? value.toJSON() : value;\n return { styles: [...(json.styles ?? [])], defaults: json.defaults ?? {} };\n}\n\nfunction authorOf(author: DocxExportOptions[\"author\"]): ReviewAuthor | undefined {\n if (!author) return undefined;\n return typeof author === \"string\" ? { id: author, name: author } : author;\n}\n\n/** W3CDTF date without milliseconds, or `undefined` for missing / invalid times. */\nfunction isoDate(ms: unknown): string | undefined {\n const n = typeof ms === \"number\" ? ms : Number(ms);\n if (!Number.isFinite(n) || n <= 0) return undefined;\n const date = new Date(n);\n return Number.isNaN(date.getTime()) ? undefined : date.toISOString().replace(/\\.\\d{3}Z$/, \"Z\");\n}\n\nfunction initialsOf(name: string): string {\n const letters = name\n .split(/\\s+/)\n .filter(Boolean)\n .map((word) => Array.from(word)[0] ?? \"\")\n .join(\"\")\n .slice(0, 3)\n .toUpperCase();\n return letters || ANONYMOUS_INITIALS;\n}\n\n/** Word keeps built-in style names in lower case (`heading 1`) in `styles.xml`. */\nfunction fileStyleName(name: string): string {\n const heading = /^Heading ([1-9])$/.exec(name);\n return heading ? `heading ${heading[1]}` : name;\n}\n\nconst truncate = (value: string, max = 80) => (value.length > max ? `${value.slice(0, max - 1)}…` : value);\n\n/** Converts a mark list to run formatting. */\nfunction runFormatOf(marks: readonly DocxJSONMark[] | undefined): RunFormat {\n const format: RunFormat = {};\n for (const mark of marks ?? []) {\n const attrs = mark.attrs ?? {};\n switch (mark.type) {\n case \"bold\":\n format.bold = true;\n break;\n case \"italic\":\n format.italic = true;\n break;\n case \"underline\":\n format.underline = true;\n break;\n case \"strike\":\n format.strike = true;\n break;\n case \"subscript\":\n format.vertAlign = \"subscript\";\n break;\n case \"superscript\":\n format.vertAlign = \"superscript\";\n break;\n case \"code\":\n format.font = \"Consolas\";\n break;\n case \"textStyle\": {\n const color = cssColorToHex(attrs.color);\n if (color) format.color = color;\n const pt = cssLengthToPt(attrs.fontSize);\n if (pt !== undefined && pt > 0) format.halfPoints = ptToHalfPoints(pt);\n if (typeof attrs.fontFamily === \"string\" && attrs.fontFamily.trim()) {\n format.font = attrs.fontFamily.split(\",\")[0].trim().replace(/^[\"']|[\"']$/g, \"\");\n }\n break;\n }\n case \"highlight\": {\n const color = attrs.color ? cssColorToHex(attrs.color) : \"FFFF00\";\n if (color && WORD_HIGHLIGHTS[color]) format.highlight = WORD_HIGHLIGHTS[color];\n else if (color) format.shading = color;\n break;\n }\n case \"characterStyle\":\n if (isValidStyleId(attrs.styleId)) format.charStyle = attrs.styleId;\n break;\n case \"link\":\n format.charStyle ??= \"Hyperlink\";\n break;\n default:\n break;\n }\n }\n return format;\n}\n\n/** `w:rPr` children in CT_RPr order. */\nfunction writeRunProps(w: XmlWriter, f: RunFormat): void {\n if (f.charStyle) w.val(\"w:rStyle\", f.charStyle);\n if (f.font) w.empty(\"w:rFonts\", { \"w:ascii\": f.font, \"w:hAnsi\": f.font, \"w:cs\": f.font, \"w:eastAsia\": f.font });\n if (f.bold) w.empty(\"w:b\");\n if (f.italic) w.empty(\"w:i\");\n if (f.strike) w.empty(\"w:strike\");\n if (f.color) w.val(\"w:color\", f.color);\n if (f.halfPoints) {\n w.val(\"w:sz\", f.halfPoints);\n w.val(\"w:szCs\", f.halfPoints);\n }\n if (f.highlight) w.val(\"w:highlight\", f.highlight);\n if (f.underline) w.val(\"w:u\", \"single\");\n if (f.shading) w.empty(\"w:shd\", { \"w:val\": \"clear\", \"w:color\": \"auto\", \"w:fill\": f.shading });\n if (f.vertAlign) w.val(\"w:vertAlign\", f.vertAlign);\n}\n\nconst hasRunProps = (f: RunFormat) => Object.values(f).some((v) => v !== undefined && v !== false);\n\nfunction characterFormatToRun(c: CharacterFormat | undefined): RunFormat {\n const f: RunFormat = {};\n if (!c) return f;\n if (c.fontFamily) f.font = c.fontFamily.split(\",\")[0].trim().replace(/^[\"']|[\"']$/g, \"\");\n if (c.bold) f.bold = true;\n if (c.italic) f.italic = true;\n if (c.underline) f.underline = true;\n if (c.strike) f.strike = true;\n const color = cssColorToHex(c.color);\n if (color) f.color = color;\n const pt = cssLengthToPt(c.fontSize);\n if (pt !== undefined && pt > 0) f.halfPoints = ptToHalfPoints(pt);\n const background = cssColorToHex(c.backgroundColor);\n if (background) f.shading = background;\n return f;\n}\n\n/** `w:pPr` content of a style's paragraph format (spacing, indentation, alignment). */\nfunction writeParagraphFormat(w: XmlWriter, p: ParagraphFormat | undefined, outline?: number): void {\n if (!p && outline === undefined) return;\n const before = cssLengthToPt(p?.spaceBefore);\n const after = cssLengthToPt(p?.spaceAfter);\n const lineValue = p?.lineHeight;\n let line: number | undefined;\n let lineRule: string | undefined;\n if (typeof lineValue === \"string\" && /^\\s*\\d+(\\.\\d+)?\\s*$/.test(lineValue)) {\n line = Math.round(Number(lineValue) * 240);\n lineRule = \"auto\";\n } else if (lineValue) {\n const pt = cssLengthToPt(lineValue);\n if (pt !== undefined && pt > 0) {\n line = ptToTwips(pt);\n lineRule = \"atLeast\";\n }\n }\n if (before !== undefined || after !== undefined || line !== undefined) {\n w.empty(\"w:spacing\", {\n \"w:before\": before !== undefined ? Math.max(0, ptToTwips(before)) : undefined,\n \"w:after\": after !== undefined ? Math.max(0, ptToTwips(after)) : undefined,\n \"w:line\": line,\n \"w:lineRule\": lineRule,\n });\n }\n const left = cssLengthToPt(p?.indentLeft);\n const right = cssLengthToPt(p?.indentRight);\n const first = cssLengthToPt(p?.indentFirstLine);\n if (left !== undefined || right !== undefined || first !== undefined) {\n w.empty(\"w:ind\", {\n \"w:left\": left !== undefined ? ptToTwips(left) : undefined,\n \"w:right\": right !== undefined ? ptToTwips(right) : undefined,\n \"w:firstLine\": first !== undefined && first >= 0 ? ptToTwips(first) : undefined,\n \"w:hanging\": first !== undefined && first < 0 ? ptToTwips(-first) : undefined,\n });\n }\n const jc = alignment(p?.textAlign);\n if (jc) w.val(\"w:jc\", jc);\n if (outline !== undefined) w.val(\"w:outlineLvl\", outline);\n}\n\nfunction alignment(value: unknown): string | undefined {\n switch (value) {\n case \"left\":\n return \"left\";\n case \"center\":\n return \"center\";\n case \"right\":\n return \"right\";\n case \"justify\":\n return \"both\";\n default:\n return undefined;\n }\n}\n\nclass Relationships {\n private list: { id: string; type: string; target: string; external: boolean }[] = [];\n private index = new Map<string, string>();\n\n add(type: string, target: string, external = false): string {\n const key = `${type}\\n${target}\\n${external}`;\n const existing = this.index.get(key);\n if (existing) return existing;\n const id = `rId${this.list.length + 1}`;\n this.list.push({ id, type, target, external });\n this.index.set(key, id);\n return id;\n }\n\n get size(): number {\n return this.list.length;\n }\n\n xml(): string {\n const w = new XmlWriter();\n w.open(\"Relationships\", { xmlns: \"http://schemas.openxmlformats.org/package/2006/relationships\" });\n for (const rel of this.list) {\n w.empty(\"Relationship\", {\n Id: rel.id,\n Type: rel.type,\n Target: rel.target,\n TargetMode: rel.external ? \"External\" : undefined,\n });\n }\n w.close(\"Relationships\");\n return w.toString();\n }\n}\n\ninterface CommentEntry {\n thread: CommentThread;\n /** File id of the thread's comment, then of each reply. */\n ids: number[];\n started: boolean;\n ended: boolean;\n}\n\nclass DocxBuilder {\n readonly report: DocxExportReport = {\n dropped: [],\n written: { paragraphs: 0, tables: 0, images: 0, charts: 0, comments: 0, replies: 0, trackedChanges: 0 },\n };\n private rels = new Relationships();\n private media: { name: string; bytes: Uint8Array }[] = [];\n private mediaTypes = new Set<string>();\n private charts: string[] = [];\n private nums: { numId: number; abstractId: number; start?: number; level: number }[] = [];\n private revisionId = 0;\n private docPrId = 0;\n private paraIdCounter = 0x10000000;\n private comments = new Map<string, CommentEntry>();\n /** Thread id → JSON node carrying its last comment mark. */\n private commentEnds = new Map<string, DocxJSONNode>();\n /** JSON node → threads whose range ends after it (so ends are found in O(1) per node). */\n private endsByNode = new Map<DocxJSONNode, string[]>();\n private people = new Map<string, string>();\n private styleIds: Set<string>;\n private extraStyles = new Set<string>();\n private readonly anonymous: boolean;\n private readonly defaultAuthor: ReviewAuthor | undefined;\n\n constructor(\n private readonly doc: DocxJSONNode,\n private readonly options: DocxExportOptions,\n private readonly threads: CommentThread[],\n private readonly styles: { styles: StyleDefinition[]; defaults: StyleDefaults },\n ) {\n this.anonymous = options.privacy === \"strip-authors\";\n this.defaultAuthor = authorOf(options.author);\n this.styleIds = new Set(styles.styles.filter((s) => isValidStyleId(s.id)).map((s) => s.id));\n }\n\n drop(kind: DocxExportIssueKind, name: string, reason: string): void {\n const issue = this.report.dropped.find((i) => i.kind === kind && i.name === name && i.reason === reason);\n if (issue) issue.count++;\n else this.report.dropped.push({ kind, name: truncate(name), reason, count: 1 });\n }\n\n // -- Authors and revisions ------------------------------------------------\n\n private authorName(name: unknown, id: unknown): string {\n if (this.anonymous) return DOCX_ANONYMOUS_AUTHOR;\n const author =\n (typeof name === \"string\" && name.trim()) ||\n (typeof id === \"string\" && id.trim()) ||\n this.defaultAuthor?.name ||\n \"Unknown\";\n const authorId = (typeof id === \"string\" && id.trim()) || this.defaultAuthor?.id;\n if (authorId && authorId !== author && !this.people.has(author)) this.people.set(author, authorId);\n return author;\n }\n\n private changeAttrs(attrs: Record<string, any>): XmlAttrs {\n return {\n \"w:id\": ++this.revisionId,\n \"w:author\": this.authorName(attrs.authorName, attrs.authorId),\n \"w:date\": isoDate(attrs.createdAt),\n };\n }\n\n // -- Comments ---------------------------------------------------------------\n\n private prepareComments(): void {\n const marked = new Set<string>();\n const visit = (node: DocxJSONNode, depth: number) => {\n if (depth > MAX_DEPTH) return;\n for (const mark of node.marks ?? []) {\n if (mark.type === \"comment\" && typeof mark.attrs?.commentId === \"string\") {\n marked.add(mark.attrs.commentId);\n this.commentEnds.set(mark.attrs.commentId, node);\n }\n }\n node.content?.forEach((child) => visit(child, depth + 1));\n };\n visit(this.doc, 0);\n let next = 0;\n for (const thread of this.threads) {\n if (!thread || typeof thread.id !== \"string\") continue;\n if (!marked.has(thread.id)) {\n this.drop(\"comment\", thread.id, \"comment text is not in the document\");\n continue;\n }\n if (!thread.body?.trim()) {\n this.drop(\"comment\", thread.id, \"draft comment without text\");\n this.commentEnds.delete(thread.id);\n continue;\n }\n const replies = (thread.replies ?? []).filter((reply) => reply && reply.body?.trim());\n const ids = [next++, ...replies.map(() => next++)];\n this.comments.set(thread.id, { thread: { ...thread, replies }, ids, started: false, ended: false });\n }\n for (const [threadId, node] of this.commentEnds) {\n if (!this.comments.has(threadId)) continue;\n const list = this.endsByNode.get(node) ?? [];\n list.push(threadId);\n this.endsByNode.set(node, list);\n }\n }\n\n // -- Document ---------------------------------------------------------------\n\n documentXml(): string {\n this.prepareComments();\n const body = new XmlWriter(false);\n const blocks = this.doc.type === \"doc\" || !this.doc.type ? (this.doc.content ?? []) : [this.doc];\n this.blocks(body, blocks, { depth: 0, quoteLevel: 0 });\n // Word wants a paragraph before the section properties.\n if (!blocks.length || blocks[blocks.length - 1].type === \"table\") body.empty(\"w:p\");\n // Ranges whose end was never written (e.g. text in a dropped node) are closed here.\n for (const [id, entry] of this.comments) if (entry.started && !entry.ended) this.endComment(body, id);\n const w = new XmlWriter();\n w.open(\"w:document\", BODY_NS).open(\"w:body\").raw(body.toString());\n w.open(\"w:sectPr\")\n .empty(\"w:pgSz\", { \"w:w\": 12240, \"w:h\": 15840 })\n .empty(\"w:pgMar\", {\n \"w:top\": 1440,\n \"w:right\": 1440,\n \"w:bottom\": 1440,\n \"w:left\": 1440,\n \"w:header\": 720,\n \"w:footer\": 720,\n \"w:gutter\": 0,\n })\n .close(\"w:sectPr\");\n w.close(\"w:body\").close(\"w:document\");\n return w.toString();\n }\n\n private blocks(w: XmlWriter, nodes: readonly DocxJSONNode[], ctx: BlockContext): void {\n if (ctx.depth > MAX_DEPTH) {\n this.drop(\"node\", \"nesting\", `content nested deeper than ${MAX_DEPTH} levels`);\n return;\n }\n let first = true;\n nodes.forEach((node, i) => {\n const itemCtx: BlockContext = { ...ctx, depth: ctx.depth + 1, listItemFirst: ctx.list ? first : undefined };\n this.block(w, node, itemCtx);\n if (node.type !== \"bulletList\" && node.type !== \"orderedList\" && node.type !== \"taskList\") first = false;\n // Two tables in a row would merge into one in Word, so a paragraph separates them.\n if (node.type === \"table\" && nodes[i + 1]?.type === \"table\") w.empty(\"w:p\");\n });\n }\n\n private block(w: XmlWriter, node: DocxJSONNode, ctx: BlockContext): void {\n const type = node.type ?? \"\";\n switch (type) {\n case \"paragraph\":\n this.paragraph(w, node, ctx);\n return;\n case \"heading\":\n this.paragraph(w, node, ctx, { heading: Math.max(1, Math.min(6, Number(node.attrs?.level) || 1)) });\n return;\n case \"codeBlock\":\n this.paragraph(w, node, ctx, { code: true });\n return;\n case \"blockquote\":\n this.blocks(w, node.content ?? [], { ...ctx, quoteLevel: ctx.quoteLevel + 1 });\n return;\n case \"bulletList\":\n case \"orderedList\":\n case \"taskList\":\n this.list(w, node, ctx);\n return;\n case \"table\":\n this.table(w, node, ctx);\n return;\n case \"horizontalRule\":\n w.open(\"w:p\").open(\"w:pPr\").open(\"w:pBdr\");\n w.empty(\"w:bottom\", { \"w:val\": \"single\", \"w:sz\": 6, \"w:space\": 1, \"w:color\": \"auto\" });\n w.close(\"w:pBdr\").close(\"w:pPr\").close(\"w:p\");\n this.report.written.paragraphs++;\n return;\n case \"pageBreak\":\n w.open(\"w:p\").open(\"w:r\").empty(\"w:br\", { \"w:type\": \"page\" }).close(\"w:r\").close(\"w:p\");\n return;\n case \"image\":\n this.paragraph(w, { type: \"paragraph\", content: [node] }, ctx);\n return;\n case \"chart\":\n this.chartParagraph(w, node, ctx);\n return;\n default:\n break;\n }\n // Unknown blocks: inline content becomes a paragraph, block content is flattened.\n const content = node.content ?? [];\n if (content.some((child) => child.type === \"text\" || isInlineType(child.type))) {\n this.drop(\"node\", type || \"unknown\", \"written as a plain paragraph\");\n this.paragraph(w, { type: \"paragraph\", content }, ctx);\n } else if (content.length) {\n this.drop(\"node\", type || \"unknown\", \"container flattened\");\n this.blocks(w, content, ctx);\n } else {\n this.drop(\"node\", type || \"unknown\", \"unsupported node\");\n }\n }\n\n // -- Lists --------------------------------------------------------------------\n\n private list(w: XmlWriter, node: DocxJSONNode, ctx: BlockContext): void {\n const level = Math.min(8, ctx.list ? ctx.list.level + 1 : 0);\n const abstractId = node.type === \"orderedList\" ? 2 : node.type === \"taskList\" ? 3 : 1;\n const numId = this.nums.length + 1;\n const start = node.type === \"orderedList\" ? Number(node.attrs?.start ?? 1) : undefined;\n this.nums.push({ numId, abstractId, level, start: start !== undefined && start !== 1 && Number.isFinite(start) ? start : undefined });\n for (const item of node.content ?? []) {\n const task = item.type === \"taskItem\";\n this.blocks(w, item.content ?? [], {\n ...ctx,\n list: { numId, level, task, checked: task ? !!item.attrs?.checked : undefined },\n });\n }\n }\n\n // -- Paragraphs -----------------------------------------------------------------\n\n private styleFor(node: DocxJSONNode, ctx: BlockContext, opts: { heading?: number; code?: boolean }): string | undefined {\n const own = node.attrs?.styleId;\n if (own) {\n if (isValidStyleId(own) && this.styleIds.has(own)) return own;\n this.drop(\"style\", String(own), \"style is not in the registry\");\n }\n if (opts.heading) return this.needStyle(`Heading${opts.heading}`);\n if (opts.code) return this.needStyle(\"Code\");\n if (ctx.quoteLevel > 0) return this.needStyle(\"BlockText\");\n if (ctx.list) return this.needStyle(\"ListParagraph\");\n return undefined;\n }\n\n /** Uses a style the registry may not define (it is then written with defaults). */\n private needStyle(id: string): string {\n if (!this.styleIds.has(id)) this.extraStyles.add(id);\n return id;\n }\n\n private previousStyle(previous: BlockChangeRecord[\"previous\"]): string | undefined {\n if (!previous) return undefined;\n const id = previous.attrs?.styleId;\n if (isValidStyleId(id) && this.styleIds.has(id)) return id;\n if (previous.type === \"heading\") return this.needStyle(`Heading${Math.max(1, Math.min(6, Number(previous.attrs?.level) || 1))}`);\n if (previous.type === \"codeBlock\") return this.needStyle(\"Code\");\n return undefined;\n }\n\n private paragraph(\n w: XmlWriter,\n node: DocxJSONNode,\n ctx: BlockContext,\n opts: { heading?: number; code?: boolean } = {},\n ): void {\n this.report.written.paragraphs++;\n const style = this.styleFor(node, ctx, opts);\n const change = (node.attrs?.blockChange ?? null) as BlockChangeRecord | null;\n const operation = change?.operation;\n const list = ctx.list;\n const numbered = list && ctx.listItemFirst;\n const indent = ctx.quoteLevel * INDENT_STEP + (list && !numbered ? (list.level + 1) * INDENT_STEP : 0);\n const jc = alignment(node.attrs?.textAlign);\n\n w.open(\"w:p\");\n const ppr = new XmlWriter(false);\n if (style) ppr.val(\"w:pStyle\", style);\n if (numbered) {\n ppr.open(\"w:numPr\").val(\"w:ilvl\", list!.level).val(\"w:numId\", list!.numId).close(\"w:numPr\");\n }\n if (indent && !(ctx.quoteLevel > 0 && !list && ctx.quoteLevel === 1)) ppr.empty(\"w:ind\", { \"w:left\": indent });\n if (jc) ppr.val(\"w:jc\", jc);\n if (change && operation) {\n ppr.open(\"w:rPr\").empty(operation === \"insert\" ? \"w:ins\" : \"w:del\", this.changeAttrs(change)).close(\"w:rPr\");\n this.report.written.trackedChanges++;\n } else if (change?.previous) {\n ppr.open(\"w:pPrChange\", this.changeAttrs(change)).open(\"w:pPr\");\n const old = this.previousStyle(change.previous);\n if (old) ppr.val(\"w:pStyle\", old);\n const oldJc = alignment(change.previous.attrs?.textAlign);\n if (oldJc) ppr.val(\"w:jc\", oldJc);\n ppr.close(\"w:pPr\").close(\"w:pPrChange\");\n this.report.written.trackedChanges++;\n }\n const pprXml = ppr.toString();\n if (pprXml) w.open(\"w:pPr\").raw(pprXml).close(\"w:pPr\");\n\n if (list?.task && numbered) {\n // Word has no checklist numbering: the box is the first character.\n w.open(\"w:r\").leaf(\"w:t\", { \"xml:space\": \"preserve\" }, `${list.checked ? TASK_CHECKED : TASK_UNCHECKED} `).close(\"w:r\");\n }\n const synthetic: Revision | undefined =\n change && operation ? { kind: operation === \"insert\" ? \"ins\" : \"del\", attrs: change } : undefined;\n this.inline(w, this.pieces(node.content ?? [], opts.code === true), synthetic);\n w.close(\"w:p\");\n }\n\n /** Flattens inline content into runs of text, tabs, breaks and images. */\n private pieces(nodes: readonly DocxJSONNode[], code: boolean, out: Piece[] = [], depth = 0): Piece[] {\n if (depth > MAX_DEPTH) return out;\n for (const node of nodes) {\n const marks = node.marks ?? [];\n switch (node.type) {\n case \"text\": {\n const text = node.text ?? \"\";\n const parts = text.split(/(\\t|\\r\\n|\\n|\\r)/);\n const pieces: Piece[] = [];\n for (const part of parts) {\n if (!part) continue;\n if (part === \"\\t\") pieces.push({ kind: \"tab\", node, last: false, marks });\n else if (part === \"\\n\" || part === \"\\r\\n\" || part === \"\\r\") pieces.push({ kind: \"br\", node, last: false, marks });\n else pieces.push({ kind: \"text\", text: part, node, last: false, marks });\n }\n if (!pieces.length) pieces.push({ kind: \"text\", text: \"\", node, last: false, marks });\n pieces[pieces.length - 1].last = true;\n out.push(...pieces);\n break;\n }\n case \"hardBreak\":\n out.push({ kind: \"br\", node, last: true, marks });\n break;\n case \"image\":\n out.push({ kind: \"image\", node, last: true, marks });\n break;\n case \"sparkline\": {\n const text = sparklineText(node.attrs);\n this.drop(\"node\", \"sparkline\", \"written as text (its label, or ▁▃▇ bars)\");\n out.push({ kind: \"text\", text, node, last: true, marks });\n break;\n }\n case \"mention\": {\n const label = node.attrs?.label ?? node.attrs?.id ?? \"\";\n out.push({ kind: \"text\", text: label ? `@${label}` : \"\", node, last: true, marks });\n break;\n }\n default:\n if (node.content?.length) {\n this.pieces(node.content, code, out, depth + 1);\n } else if (typeof node.attrs?.label === \"string\" || typeof node.attrs?.text === \"string\") {\n this.drop(\"node\", node.type ?? \"unknown\", \"written as text\");\n out.push({ kind: \"text\", text: String(node.attrs.label ?? node.attrs.text), node, last: true, marks });\n } else {\n this.drop(\"node\", node.type ?? \"unknown\", \"unsupported inline node\");\n }\n }\n }\n return out;\n }\n\n private revisionsOf(marks: readonly DocxJSONMark[], synthetic?: Revision): Revision[] {\n const out: Revision[] = [];\n const ins = marks.find((m) => m.type === \"insertion\");\n const del = marks.find((m) => m.type === \"deletion\");\n if (ins) out.push({ kind: \"ins\", attrs: ins.attrs ?? {}, moveId: ins.attrs?.moveId || undefined });\n if (del) out.push({ kind: \"del\", attrs: del.attrs ?? {}, moveId: del.attrs?.moveId || undefined });\n if (!out.length && synthetic) out.push(synthetic);\n return out;\n }\n\n private linkOf(marks: readonly DocxJSONMark[]): string | undefined {\n const link = marks.find((m) => m.type === \"link\");\n const href = typeof link?.attrs?.href === \"string\" ? link.attrs.href.trim() : \"\";\n if (!href) return undefined;\n if (href.startsWith(\"#\") || /^(https?|mailto|tel|ftp):/i.test(href) || !/^[a-z][a-z0-9+.-]*:/i.test(href)) return href;\n this.drop(\"link\", href, \"unsafe URL scheme\");\n return undefined;\n }\n\n /** Writes pieces grouped into hyperlinks (outer) and tracked-change wrappers (inner). */\n private inline(w: XmlWriter, pieces: Piece[], synthetic?: Revision): void {\n let openLink: string | undefined;\n type OpenRevisions = { key: string; tags: string[]; moveRanges: { tag: string; id: number }[] };\n let openRevs: OpenRevisions | null = null;\n const closeRevs = () => {\n const open = openRevs as OpenRevisions | null;\n if (!open) return;\n for (const tag of [...open.tags].reverse()) w.close(tag);\n for (const range of open.moveRanges) w.empty(range.tag, { \"w:id\": range.id });\n openRevs = null;\n };\n const closeLink = () => {\n closeRevs();\n if (openLink !== undefined) w.close(\"w:hyperlink\");\n openLink = undefined;\n };\n for (const piece of pieces) {\n const href = this.linkOf(piece.marks);\n if (href !== openLink) {\n closeLink();\n if (href !== undefined) {\n if (href.startsWith(\"#\")) w.open(\"w:hyperlink\", { \"w:anchor\": href.slice(1), \"w:history\": 1 });\n else w.open(\"w:hyperlink\", { \"r:id\": this.rels.add(REL.hyperlink, href, true), \"w:history\": 1 });\n openLink = href;\n }\n }\n const revs = this.revisionsOf(piece.marks, synthetic);\n const key = revs.map((r) => `${r.kind}:${r.attrs.changeId ?? \"\"}:${r.moveId ?? \"\"}:${r.attrs.authorName ?? \"\"}`).join(\"|\");\n if (key !== ((openRevs as OpenRevisions | null)?.key ?? \"\")) {\n closeRevs();\n if (revs.length) {\n const state: OpenRevisions = { key, tags: [], moveRanges: [] };\n for (const rev of revs) {\n const attrs = this.changeAttrs(rev.attrs);\n this.report.written.trackedChanges++;\n if (rev.moveId) {\n const rangeTag = rev.kind === \"ins\" ? \"w:moveToRange\" : \"w:moveFromRange\";\n const rangeId = ++this.revisionId;\n w.empty(`${rangeTag}Start`, { \"w:id\": rangeId, \"w:name\": rev.moveId, \"w:author\": attrs[\"w:author\"], \"w:date\": attrs[\"w:date\"] });\n state.moveRanges.push({ tag: `${rangeTag}End`, id: rangeId });\n }\n const tag = rev.moveId ? (rev.kind === \"ins\" ? \"w:moveTo\" : \"w:moveFrom\") : rev.kind === \"ins\" ? \"w:ins\" : \"w:del\";\n w.open(tag, attrs);\n state.tags.push(tag);\n }\n openRevs = state;\n }\n }\n this.commentStarts(w, piece.marks);\n this.run(w, piece, revs);\n if (piece.last) this.commentEndsAfter(w, piece.node);\n }\n closeLink();\n }\n\n private commentStarts(w: XmlWriter, marks: readonly DocxJSONMark[]): void {\n for (const mark of marks) {\n if (mark.type !== \"comment\") continue;\n const entry = this.comments.get(mark.attrs?.commentId);\n if (!entry || entry.started) continue;\n entry.started = true;\n for (const id of entry.ids) w.empty(\"w:commentRangeStart\", { \"w:id\": id });\n }\n }\n\n private commentEndsAfter(w: XmlWriter, node: DocxJSONNode): void {\n for (const threadId of this.endsByNode.get(node) ?? []) {\n const entry = this.comments.get(threadId);\n if (entry?.started && !entry.ended) this.endComment(w, threadId);\n }\n }\n\n private endComment(w: XmlWriter, threadId: string): void {\n const entry = this.comments.get(threadId)!;\n entry.ended = true;\n for (const id of entry.ids) {\n w.empty(\"w:commentRangeEnd\", { \"w:id\": id });\n w.open(\"w:r\").open(\"w:rPr\").val(\"w:rStyle\", \"CommentReference\").close(\"w:rPr\");\n w.empty(\"w:commentReference\", { \"w:id\": id }).close(\"w:r\");\n }\n this.needStyle(\"CommentReference\");\n this.needStyle(\"CommentText\");\n }\n\n private run(w: XmlWriter, piece: Piece, revs: Revision[]): void {\n for (const mark of piece.marks) {\n if (!FORMAT_MARKS.has(mark.type) && !STRUCTURAL_MARKS.has(mark.type)) this.drop(\"mark\", mark.type, \"formatting not supported\");\n if (mark.type === \"characterStyle\" && mark.attrs?.styleId && !this.styleIds.has(mark.attrs.styleId)) {\n this.drop(\"style\", String(mark.attrs.styleId), \"character style is not in the registry\");\n }\n }\n if (piece.kind === \"image\") {\n const drawing = this.image(piece.node);\n if (!drawing) return;\n w.open(\"w:r\");\n const format = runFormatOf(piece.marks);\n delete format.charStyle;\n if (hasRunProps(format)) {\n w.open(\"w:rPr\");\n writeRunProps(w, format);\n w.close(\"w:rPr\");\n }\n w.raw(drawing).close(\"w:r\");\n return;\n }\n const format = runFormatOf(piece.marks.filter((m) => m.type !== \"characterStyle\" || this.styleIds.has(m.attrs?.styleId)));\n if (format.charStyle === \"Hyperlink\") this.needStyle(\"Hyperlink\");\n const formatChange = piece.marks.find((m) => m.type === \"formatChange\");\n w.open(\"w:r\");\n if (hasRunProps(format) || formatChange) {\n w.open(\"w:rPr\");\n writeRunProps(w, format);\n if (formatChange) {\n const attrs = formatChange.attrs ?? {};\n w.open(\"w:rPrChange\", this.changeAttrs(attrs)).open(\"w:rPr\");\n writeRunProps(w, runFormatOf(Array.isArray(attrs.before) ? attrs.before : []));\n w.close(\"w:rPr\").close(\"w:rPrChange\");\n this.report.written.trackedChanges++;\n }\n w.close(\"w:rPr\");\n }\n // Deleted text is `w:delText`; text moved away stays `w:t` (ECMA-376 §17.13.5.22).\n const deleted = revs.some((r) => r.kind === \"del\" && !r.moveId);\n if (piece.kind === \"tab\") w.empty(\"w:tab\");\n else if (piece.kind === \"br\") w.empty(\"w:br\");\n else if (piece.text) w.leaf(deleted ? \"w:delText\" : \"w:t\", { \"xml:space\": \"preserve\" }, piece.text);\n w.close(\"w:r\");\n }\n\n // -- Images -----------------------------------------------------------------\n\n private image(node: DocxJSONNode): string | null {\n const src = typeof node.attrs?.src === \"string\" ? node.attrs.src.trim() : \"\";\n const alt = typeof node.attrs?.alt === \"string\" ? node.attrs.alt : \"\";\n const title = typeof node.attrs?.title === \"string\" ? node.attrs.title : \"\";\n let relId: string;\n let natural: { width: number; height: number } | null = null;\n let linked = false;\n if (src.startsWith(\"data:\")) {\n const decoded = decodeDataUrl(src);\n const ext = decoded ? DOCX_IMAGE_TYPES[decoded.mime] : undefined;\n if (!decoded || !ext) {\n this.drop(\"image\", decoded?.mime ?? \"data URL\", \"unsupported image type\");\n return null;\n }\n const name = `image${this.media.length + 1}.${ext}`;\n this.media.push({ name, bytes: decoded.bytes });\n this.mediaTypes.add(ext);\n relId = this.rels.add(REL.image, `media/${name}`);\n natural = imagePixelSize(decoded.bytes);\n } else if (/^https?:\\/\\//i.test(src)) {\n if (this.options.remoteImages !== \"link\") {\n this.drop(\"image\", src, \"remote image skipped (use remoteImages: \\\"link\\\")\");\n return null;\n }\n relId = this.rels.add(REL.image, src, true);\n linked = true;\n } else {\n this.drop(\"image\", src || \"image\", \"image source is neither a data URL nor http(s)\");\n return null;\n }\n let width = pixelAttr(node.attrs?.width) ?? natural?.width ?? 400;\n let height = pixelAttr(node.attrs?.height) ?? (natural ? (natural.height * width) / natural.width : 300);\n if (width > MAX_IMAGE_WIDTH_PX) {\n height = (height * MAX_IMAGE_WIDTH_PX) / width;\n width = MAX_IMAGE_WIDTH_PX;\n }\n const cx = pxToEmu(width);\n const cy = pxToEmu(height);\n const id = ++this.docPrId;\n this.report.written.images++;\n const w = new XmlWriter(false);\n w.open(\"w:drawing\").open(\"wp:inline\", { distT: 0, distB: 0, distL: 0, distR: 0 });\n w.empty(\"wp:extent\", { cx, cy }).empty(\"wp:effectExtent\", { l: 0, t: 0, r: 0, b: 0 });\n w.empty(\"wp:docPr\", { id, name: `Picture ${id}`, descr: alt || undefined, title: title || undefined });\n w.open(\"wp:cNvGraphicFramePr\").empty(\"a:graphicFrameLocks\", { noChangeAspect: 1 }).close(\"wp:cNvGraphicFramePr\");\n w.open(\"a:graphic\").open(\"a:graphicData\", { uri: \"http://schemas.openxmlformats.org/drawingml/2006/picture\" });\n w.open(\"pic:pic\").open(\"pic:nvPicPr\").empty(\"pic:cNvPr\", { id: 0, name: `Picture ${id}`, descr: alt || undefined });\n w.empty(\"pic:cNvPicPr\").close(\"pic:nvPicPr\");\n w.open(\"pic:blipFill\").empty(\"a:blip\", linked ? { \"r:link\": relId } : { \"r:embed\": relId });\n w.open(\"a:stretch\").empty(\"a:fillRect\").close(\"a:stretch\").close(\"pic:blipFill\");\n w.open(\"pic:spPr\").open(\"a:xfrm\").empty(\"a:off\", { x: 0, y: 0 }).empty(\"a:ext\", { cx, cy }).close(\"a:xfrm\");\n w.open(\"a:prstGeom\", { prst: \"rect\" }).empty(\"a:avLst\").close(\"a:prstGeom\").close(\"pic:spPr\");\n w.close(\"pic:pic\").close(\"a:graphicData\").close(\"a:graphic\").close(\"wp:inline\").close(\"w:drawing\");\n return w.toString();\n }\n\n // -- Charts -----------------------------------------------------------------\n\n /** A `chart` node as a paragraph holding a native Word chart (`c:chart` in `wp:inline`). */\n private chartParagraph(w: XmlWriter, node: DocxJSONNode, ctx: BlockContext): void {\n const raw = node.attrs?.spec;\n if (!raw || typeof raw !== \"object\" || Array.isArray(raw)) {\n this.drop(\"node\", \"chart\", \"chart has no spec\");\n return;\n }\n const spec = normalizeChartSpec(raw).spec;\n const written = chartToOoxml(spec);\n for (const issue of written.issues) this.drop(\"node\", \"chart\", issue);\n const name = `chart${this.charts.length + 1}.xml`;\n this.charts.push(written.xml);\n const relId = this.rels.add(CHART_OOXML_RELATIONSHIP, `charts/${name}`);\n // A chart without a width fills the line (the page's text width).\n let width = pixelAttr(node.attrs?.width) ?? MAX_IMAGE_WIDTH_PX;\n let height = pixelAttr(node.attrs?.height) ?? 320;\n if (width > MAX_IMAGE_WIDTH_PX) {\n height = (height * MAX_IMAGE_WIDTH_PX) / width;\n width = MAX_IMAGE_WIDTH_PX;\n }\n const cx = pxToEmu(width);\n const cy = pxToEmu(height);\n const id = ++this.docPrId;\n const title = spec.title || \"\";\n this.report.written.charts++;\n\n const drawing = new XmlWriter(false);\n drawing.open(\"w:r\").open(\"w:drawing\").open(\"wp:inline\", { distT: 0, distB: 0, distL: 0, distR: 0 });\n drawing.empty(\"wp:extent\", { cx, cy }).empty(\"wp:effectExtent\", { l: 0, t: 0, r: 0, b: 0 });\n drawing.empty(\"wp:docPr\", { id, name: `Chart ${id}`, descr: title || undefined, title: title || undefined });\n drawing.empty(\"wp:cNvGraphicFramePr\");\n drawing.open(\"a:graphic\").open(\"a:graphicData\", { uri: CHART_OOXML_NS });\n drawing.empty(\"c:chart\", { \"xmlns:c\": CHART_OOXML_NS, \"r:id\": relId });\n drawing.close(\"a:graphicData\").close(\"a:graphic\").close(\"wp:inline\").close(\"w:drawing\").close(\"w:r\");\n\n this.report.written.paragraphs++;\n w.open(\"w:p\");\n const indent = ctx.quoteLevel * INDENT_STEP;\n const jc = alignment(node.attrs?.textAlign);\n if (indent || jc) {\n w.open(\"w:pPr\");\n if (indent) w.empty(\"w:ind\", { \"w:left\": indent });\n if (jc) w.val(\"w:jc\", jc);\n w.close(\"w:pPr\");\n }\n // The chart carries the comment marks of an atom node, if any.\n this.commentStarts(w, node.marks ?? []);\n w.raw(drawing.toString());\n this.commentEndsAfter(w, node);\n w.close(\"w:p\");\n }\n\n // -- Tables -------------------------------------------------------------------\n\n private table(w: XmlWriter, node: DocxJSONNode, ctx: BlockContext): void {\n type Slot = { cell: DocxJSONNode; rowOffset: number; colOffset: number; colspan: number; rowspan: number } | null;\n const rows = (node.content ?? []).filter((row) => row.type === \"tableRow\" || row.content?.length);\n if (!rows.length) {\n this.drop(\"node\", \"table\", \"empty table\");\n return;\n }\n const grid: Slot[][] = rows.map(() => []);\n rows.forEach((row, r) => {\n let col = 0;\n for (const cell of row.content ?? []) {\n while (grid[r][col]) col++;\n const colspan = Math.max(1, Math.min(63, Number(cell.attrs?.colspan) || 1));\n const rowspan = Math.max(1, Math.min(rows.length - r, Number(cell.attrs?.rowspan) || 1));\n for (let i = 0; i < rowspan; i++) {\n for (let j = 0; j < colspan; j++) {\n grid[r + i][col + j] = { cell, rowOffset: i, colOffset: j, colspan, rowspan };\n }\n }\n col += colspan;\n }\n });\n const cols = Math.max(1, Math.min(63, ...grid.map((row) => row.length)));\n const widths: number[] = [];\n for (let c = 0; c < cols; c++) {\n const slot = grid[0][c];\n const colwidth = slot?.cell.attrs?.colwidth;\n const px = Array.isArray(colwidth) ? Number(colwidth[slot!.colOffset]) : NaN;\n widths.push(Number.isFinite(px) && px > 0 ? pxToTwips(px) : 0);\n }\n const known = widths.reduce((n, v) => n + v, 0);\n const unknown = widths.filter((v) => !v).length;\n const fill = unknown ? Math.max(360, Math.floor(Math.max(0, CONTENT_WIDTH_TWIPS - known) / unknown)) : 0;\n for (let c = 0; c < cols; c++) if (!widths[c]) widths[c] = fill;\n\n this.report.written.tables++;\n w.open(\"w:tbl\").open(\"w:tblPr\");\n w.empty(\"w:tblW\", { \"w:w\": 0, \"w:type\": \"auto\" });\n w.open(\"w:tblBorders\");\n for (const side of [\"top\", \"left\", \"bottom\", \"right\", \"insideH\", \"insideV\"]) {\n w.empty(`w:${side}`, { \"w:val\": \"single\", \"w:sz\": 4, \"w:space\": 0, \"w:color\": \"auto\" });\n }\n w.close(\"w:tblBorders\");\n w.empty(\"w:tblLook\", { \"w:val\": \"04A0\", \"w:firstRow\": 1, \"w:lastRow\": 0, \"w:firstColumn\": 1, \"w:lastColumn\": 0, \"w:noHBand\": 0, \"w:noVBand\": 1 });\n w.close(\"w:tblPr\");\n w.open(\"w:tblGrid\");\n widths.forEach((width) => w.empty(\"w:gridCol\", { \"w:w\": width }));\n w.close(\"w:tblGrid\");\n const cellCtx: BlockContext = { depth: ctx.depth + 1, quoteLevel: 0 };\n rows.forEach((row, r) => {\n w.open(\"w:tr\");\n const cells = row.content ?? [];\n if (cells.length && cells.every((cell) => cell.type === \"tableHeader\")) {\n w.open(\"w:trPr\").empty(\"w:tblHeader\").close(\"w:trPr\");\n }\n for (let c = 0; c < cols; c++) {\n const slot = grid[r][c];\n if (slot && slot.colOffset > 0) continue;\n const span = slot?.colspan ?? 1;\n const width = widths.slice(c, c + span).reduce((n, v) => n + v, 0);\n w.open(\"w:tc\").open(\"w:tcPr\").empty(\"w:tcW\", { \"w:w\": width, \"w:type\": \"dxa\" });\n if (span > 1) w.val(\"w:gridSpan\", span);\n if (slot && slot.rowspan > 1) {\n if (slot.rowOffset === 0) w.val(\"w:vMerge\", \"restart\");\n else w.empty(\"w:vMerge\");\n }\n w.close(\"w:tcPr\");\n const content = slot && slot.rowOffset === 0 ? (slot.cell.content ?? []) : [];\n if (content.length) this.blocks(w, content, cellCtx);\n // A cell must end with a paragraph.\n const lastType = content[content.length - 1]?.type;\n if (!content.length || lastType === \"table\") w.empty(\"w:p\");\n w.close(\"w:tc\");\n }\n w.close(\"w:tr\");\n });\n w.close(\"w:tbl\");\n }\n\n // -- Other parts --------------------------------------------------------------\n\n numberingXml(): string | null {\n if (!this.nums.length) return null;\n const w = new XmlWriter();\n w.open(\"w:numbering\", BODY_NS);\n const abstract = (id: number, kind: \"bullet\" | \"decimal\" | \"task\") => {\n w.open(\"w:abstractNum\", { \"w:abstractNumId\": id }).val(\"w:multiLevelType\", \"hybridMultilevel\");\n for (let level = 0; level < 9; level++) {\n w.open(\"w:lvl\", { \"w:ilvl\": level }).val(\"w:start\", 1);\n if (kind === \"decimal\") {\n const formats = [\"decimal\", \"lowerLetter\", \"lowerRoman\"];\n w.val(\"w:numFmt\", formats[level % 3]).val(\"w:lvlText\", `%${level + 1}.`);\n } else if (kind === \"bullet\") {\n w.val(\"w:numFmt\", \"bullet\").val(\"w:lvlText\", BULLETS[level % 3]);\n } else {\n w.val(\"w:numFmt\", \"none\").val(\"w:lvlText\", \"\");\n }\n w.val(\"w:lvlJc\", \"left\");\n w.open(\"w:pPr\").empty(\"w:ind\", { \"w:left\": (level + 1) * INDENT_STEP, \"w:hanging\": kind === \"task\" ? 0 : 360 }).close(\"w:pPr\");\n if (kind === \"bullet\") {\n const font = BULLET_FONTS[level % 3] === \"Symbol\" ? \"Arial\" : BULLET_FONTS[level % 3];\n w.open(\"w:rPr\").empty(\"w:rFonts\", { \"w:ascii\": font, \"w:hAnsi\": font, \"w:hint\": \"default\" }).close(\"w:rPr\");\n }\n w.close(\"w:lvl\");\n }\n w.close(\"w:abstractNum\");\n };\n abstract(1, \"bullet\");\n abstract(2, \"decimal\");\n abstract(3, \"task\");\n for (const num of this.nums) {\n w.open(\"w:num\", { \"w:numId\": num.numId }).val(\"w:abstractNumId\", num.abstractId);\n if (num.start !== undefined) {\n w.open(\"w:lvlOverride\", { \"w:ilvl\": num.level }).val(\"w:startOverride\", num.start).close(\"w:lvlOverride\");\n }\n w.close(\"w:num\");\n }\n w.close(\"w:numbering\");\n return w.toString();\n }\n\n stylesXml(): string {\n const w = new XmlWriter();\n w.open(\"w:styles\", BODY_NS);\n const defaults = this.styles.defaults;\n const defaultRun = characterFormatToRun(defaults.character);\n w.open(\"w:docDefaults\").open(\"w:rPrDefault\").open(\"w:rPr\");\n const font = defaultRun.font ?? \"Calibri\";\n w.empty(\"w:rFonts\", { \"w:ascii\": font, \"w:hAnsi\": font, \"w:eastAsia\": font, \"w:cs\": font });\n const size = defaultRun.halfPoints ?? 22;\n w.val(\"w:sz\", size).val(\"w:szCs\", size);\n w.val(\"w:lang\", \"en-US\");\n w.close(\"w:rPr\").close(\"w:rPrDefault\");\n w.open(\"w:pPrDefault\").open(\"w:pPr\");\n if (defaults.paragraph && Object.keys(defaults.paragraph).length) writeParagraphFormat(w, defaults.paragraph);\n else w.empty(\"w:spacing\", { \"w:after\": 160, \"w:line\": 259, \"w:lineRule\": \"auto\" });\n w.close(\"w:pPr\").close(\"w:pPrDefault\").close(\"w:docDefaults\");\n\n const byId = new Map(this.styles.styles.filter((s) => isValidStyleId(s.id)).map((s) => [s.id, s]));\n const written = new Set<string>();\n const blockOf = (style: StyleDefinition): StyleDefinition[\"block\"] => {\n let current: StyleDefinition | undefined = style;\n for (let i = 0; current && i < 32; i++) {\n if (current.block) return current.block;\n current = current.basedOn ? byId.get(current.basedOn) : undefined;\n }\n return null;\n };\n const writeStyle = (style: StyleDefinition) => {\n if (written.has(style.id)) return;\n written.add(style.id);\n const isNormal = style.kind === \"paragraph\" && style.id === NORMAL_STYLE_ID;\n w.open(\"w:style\", {\n \"w:type\": style.kind === \"character\" ? \"character\" : \"paragraph\",\n \"w:default\": isNormal ? 1 : undefined,\n \"w:customStyle\": style.builtin ? undefined : 1,\n \"w:styleId\": style.id,\n });\n w.val(\"w:name\", fileStyleName(style.name || style.id));\n const base = style.basedOn && byId.has(style.basedOn) && byId.get(style.basedOn)!.kind === style.kind ? style.basedOn : undefined;\n if (base) w.val(\"w:basedOn\", base);\n if (style.kind === \"paragraph\" && style.next && byId.get(style.next)?.kind === \"paragraph\") w.val(\"w:next\", style.next);\n if (style.linked && byId.has(style.linked)) w.val(\"w:link\", style.linked);\n if (style.priority !== undefined && Number.isFinite(style.priority)) w.val(\"w:uiPriority\", Math.max(0, Math.round(style.priority)));\n if (style.hidden) w.empty(\"w:semiHidden\").empty(\"w:unhideWhenUsed\");\n if (style.quick) w.empty(\"w:qFormat\");\n const block = style.kind === \"paragraph\" ? blockOf(style) : null;\n const ownBlock = style.kind === \"paragraph\" ? style.block : null;\n const outline = ownBlock?.type === \"heading\" ? Math.max(0, Math.min(8, (Number(ownBlock.attrs?.level) || 1) - 1)) : undefined;\n if (style.kind === \"paragraph\" && (style.paragraph || outline !== undefined)) {\n const p = new XmlWriter(false);\n writeParagraphFormat(p, style.paragraph, outline);\n const xml = p.toString();\n if (xml) w.open(\"w:pPr\").raw(xml).close(\"w:pPr\");\n }\n const run = characterFormatToRun(style.character);\n if (block?.type === \"codeBlock\" && !run.font) run.font = \"Consolas\";\n if (hasRunProps(run)) {\n w.open(\"w:rPr\");\n writeRunProps(w, run);\n w.close(\"w:rPr\");\n }\n w.close(\"w:style\");\n };\n // Base styles first, so Word never sees a `basedOn` before its target.\n const visit = (style: StyleDefinition, depth = 0) => {\n if (depth > 32 || written.has(style.id)) return;\n const base = style.basedOn ? byId.get(style.basedOn) : undefined;\n if (base) visit(base, depth + 1);\n writeStyle(style);\n };\n byId.forEach((style) => visit(style));\n for (const id of this.extraStyles) {\n if (written.has(id)) continue;\n const extra = EXTRA_STYLES[id] ?? { id, name: id, kind: \"paragraph\" as const, basedOn: NORMAL_STYLE_ID };\n byId.set(id, extra);\n writeStyle(extra);\n }\n w.close(\"w:styles\");\n return w.toString();\n }\n\n settingsXml(): string {\n const w = new XmlWriter();\n w.open(\"w:settings\", BODY_NS).empty(\"w:zoom\", { \"w:percent\": 100 });\n if (this.anonymous) w.empty(\"w:removePersonalInformation\");\n w.val(\"w:defaultTabStop\", 720);\n w.val(\"w:characterSpacingControl\", \"doNotCompress\");\n w.open(\"w:compat\").empty(\"w:compatSetting\", {\n \"w:name\": \"compatibilityMode\",\n \"w:uri\": \"http://schemas.microsoft.com/office/word\",\n \"w:val\": 15,\n });\n w.close(\"w:compat\").close(\"w:settings\");\n return w.toString();\n }\n\n commentParts(): { comments: string; extended: string } | null {\n if (!this.comments.size) return null;\n const w = new XmlWriter();\n const ext = new XmlWriter();\n w.open(\"w:comments\", BODY_NS);\n ext.open(\"w15:commentsEx\", { \"xmlns:w15\": NS.w15, \"xmlns:mc\": NS.mc, \"mc:Ignorable\": \"w15\" });\n for (const entry of this.comments.values()) {\n if (!entry.started) continue;\n const { thread } = entry;\n const parentPara = this.comment(w, entry.ids[0], thread.author, thread.createdAt, thread.body);\n ext.empty(\"w15:commentEx\", { \"w15:paraId\": parentPara, \"w15:done\": thread.resolved ? 1 : 0 });\n this.report.written.comments++;\n thread.replies.forEach((reply, i) => {\n const para = this.comment(w, entry.ids[i + 1], reply.author, reply.createdAt, reply.body);\n ext.empty(\"w15:commentEx\", { \"w15:paraId\": para, \"w15:paraIdParent\": parentPara, \"w15:done\": thread.resolved ? 1 : 0 });\n this.report.written.replies++;\n });\n }\n w.close(\"w:comments\");\n ext.close(\"w15:commentsEx\");\n return { comments: w.toString(), extended: ext.toString() };\n }\n\n private comment(w: XmlWriter, id: number, author: ReviewAuthor | undefined, createdAt: number, body: string): string {\n const name = this.authorName(author?.name, author?.id);\n w.open(\"w:comment\", {\n \"w:id\": id,\n \"w:author\": name,\n \"w:date\": isoDate(createdAt),\n \"w:initials\": this.anonymous ? ANONYMOUS_INITIALS : initialsOf(name),\n });\n const lines = String(body ?? \"\").replace(/\\r\\n?/g, \"\\n\").split(\"\\n\");\n let paraId = \"\";\n lines.forEach((line, i) => {\n const last = i === lines.length - 1;\n if (last) paraId = (this.paraIdCounter++).toString(16).toUpperCase().padStart(8, \"0\");\n w.open(\"w:p\", last ? { \"w14:paraId\": paraId, \"w14:textId\": \"77777777\" } : undefined);\n w.open(\"w:pPr\").val(\"w:pStyle\", \"CommentText\").close(\"w:pPr\");\n if (i === 0) {\n w.open(\"w:r\").open(\"w:rPr\").val(\"w:rStyle\", \"CommentReference\").close(\"w:rPr\").empty(\"w:annotationRef\").close(\"w:r\");\n }\n if (line) w.open(\"w:r\").leaf(\"w:t\", { \"xml:space\": \"preserve\" }, line).close(\"w:r\");\n w.close(\"w:p\");\n });\n w.close(\"w:comment\");\n return paraId;\n }\n\n peopleXml(): string | null {\n if (this.anonymous || !this.people.size) return null;\n const w = new XmlWriter();\n w.open(\"w15:people\", { \"xmlns:w15\": NS.w15, \"xmlns:mc\": NS.mc, \"mc:Ignorable\": \"w15\" });\n for (const [name, id] of this.people) {\n w.open(\"w15:person\", { \"w15:author\": name });\n w.empty(\"w15:presenceInfo\", { \"w15:providerId\": \"None\", \"w15:userId\": id });\n w.close(\"w15:person\");\n }\n w.close(\"w15:people\");\n return w.toString();\n }\n\n coreXml(now: Date): string {\n const w = new XmlWriter();\n w.open(\"cp:coreProperties\", {\n \"xmlns:cp\": \"http://schemas.openxmlformats.org/package/2006/metadata/core-properties\",\n \"xmlns:dc\": \"http://purl.org/dc/elements/1.1/\",\n \"xmlns:dcterms\": \"http://purl.org/dc/terms/\",\n \"xmlns:dcmitype\": \"http://purl.org/dc/dcmitype/\",\n \"xmlns:xsi\": \"http://www.w3.org/2001/XMLSchema-instance\",\n });\n if (this.options.title) w.leaf(\"dc:title\", undefined, this.options.title);\n const creator = this.anonymous ? undefined : this.defaultAuthor?.name;\n if (creator) w.leaf(\"dc:creator\", undefined, creator).leaf(\"cp:lastModifiedBy\", undefined, creator);\n const date = isoDate(now.getTime()) ?? \"2026-01-01T00:00:00Z\";\n w.leaf(\"dcterms:created\", { \"xsi:type\": \"dcterms:W3CDTF\" }, date);\n w.leaf(\"dcterms:modified\", { \"xsi:type\": \"dcterms:W3CDTF\" }, date);\n w.close(\"cp:coreProperties\");\n return w.toString();\n }\n\n /** Assembles every part; `[Content_Types].xml` first. */\n parts(now: Date): DocxPackagePart[] {\n const document = this.documentXml();\n const parts: DocxPackagePart[] = [];\n const overrides: [string, string][] = [];\n const add = (name: string, data: string, contentType: string) => {\n parts.push({ name, data });\n overrides.push([`/${name}`, contentType]);\n };\n this.rels.add(REL.styles, \"styles.xml\");\n this.rels.add(REL.settings, \"settings.xml\");\n const numbering = this.numberingXml();\n if (numbering) this.rels.add(REL.numbering, \"numbering.xml\");\n const comments = this.commentParts();\n if (comments) {\n this.rels.add(REL.comments, \"comments.xml\");\n this.rels.add(REL.commentsExtended, \"commentsExtended.xml\");\n }\n const people = this.peopleXml();\n if (people) this.rels.add(REL.people, \"people.xml\");\n // Styles last: the document and comments decide which extra styles are needed.\n const styles = this.stylesXml();\n\n add(\"word/document.xml\", document, `${CT_WML}document.main+xml`);\n add(\"word/styles.xml\", styles, `${CT_WML}styles+xml`);\n add(\"word/settings.xml\", this.settingsXml(), `${CT_WML}settings+xml`);\n if (numbering) add(\"word/numbering.xml\", numbering, `${CT_WML}numbering+xml`);\n if (comments) {\n add(\"word/comments.xml\", comments.comments, `${CT_WML}comments+xml`);\n add(\"word/commentsExtended.xml\", comments.extended, `${CT_WML}commentsExtended+xml`);\n }\n if (people) add(\"word/people.xml\", people, `${CT_WML}people+xml`);\n parts.push({ name: \"word/_rels/document.xml.rels\", data: this.rels.xml() });\n for (const file of this.media) parts.push({ name: `word/media/${file.name}`, data: file.bytes });\n this.charts.forEach((xml, i) => add(`word/charts/chart${i + 1}.xml`, xml, CHART_OOXML_CONTENT_TYPE));\n add(\"docProps/core.xml\", this.coreXml(now), \"application/vnd.openxmlformats-package.core-properties+xml\");\n const app = new XmlWriter();\n app.open(\"Properties\", { xmlns: \"http://schemas.openxmlformats.org/officeDocument/2006/extended-properties\" });\n app.leaf(\"Application\", undefined, \"@pixerate/editor\").close(\"Properties\");\n add(\"docProps/app.xml\", app.toString(), \"application/vnd.openxmlformats-officedocument.extended-properties+xml\");\n\n const root = new Relationships();\n root.add(REL.officeDocument, \"word/document.xml\");\n root.add(REL.core, \"docProps/core.xml\");\n root.add(REL.app, \"docProps/app.xml\");\n\n const types = new XmlWriter();\n types.open(\"Types\", { xmlns: \"http://schemas.openxmlformats.org/package/2006/content-types\" });\n types.empty(\"Default\", { Extension: \"rels\", ContentType: \"application/vnd.openxmlformats-package.relationships+xml\" });\n types.empty(\"Default\", { Extension: \"xml\", ContentType: \"application/xml\" });\n for (const ext of this.mediaTypes) types.empty(\"Default\", { Extension: ext, ContentType: DOCX_IMAGE_CONTENT_TYPES[ext] });\n for (const [name, contentType] of overrides) types.empty(\"Override\", { PartName: name, ContentType: contentType });\n types.close(\"Types\");\n return [\n { name: \"[Content_Types].xml\", data: types.toString() },\n { name: \"_rels/.rels\", data: root.xml() },\n ...parts,\n ];\n }\n}\n\nconst SPARK_BARS = \"▁▂▃▄▅▆▇█\";\n\n/** A sparkline as text: its label, else one block character per value (▁ lowest, █ highest). */\nfunction sparklineText(attrs: Record<string, any> | undefined): string {\n if (typeof attrs?.label === \"string\" && attrs.label.trim()) return attrs.label;\n const values: number[] = (Array.isArray(attrs?.values) ? attrs.values : []).filter(\n (v: unknown): v is number => typeof v === \"number\" && Number.isFinite(v),\n );\n if (!values.length) return \"\";\n const min = Math.min(...values);\n const span = Math.max(...values) - min;\n return values.map((v) => SPARK_BARS[span ? Math.round(((v - min) / span) * (SPARK_BARS.length - 1)) : 3]).join(\"\");\n}\n\nconst isInlineType = (type: string | undefined) =>\n type === \"hardBreak\" || type === \"image\" || type === \"mention\" || type === \"sparkline\" || type === \"text\";\n\n/** Styles written when the document uses them but the registry has no definition. */\nconst EXTRA_STYLES: Record<string, StyleDefinition> = {\n BlockText: {\n id: \"BlockText\",\n name: \"Block Text\",\n kind: \"paragraph\",\n basedOn: NORMAL_STYLE_ID,\n paragraph: { indentLeft: \"0.5in\", indentRight: \"0.5in\" },\n character: { italic: true },\n priority: 99,\n builtin: true,\n },\n ListParagraph: {\n id: \"ListParagraph\",\n name: \"List Paragraph\",\n kind: \"paragraph\",\n basedOn: NORMAL_STYLE_ID,\n paragraph: { indentLeft: \"0.5in\" },\n priority: 34,\n quick: true,\n builtin: true,\n },\n Code: {\n id: \"Code\",\n name: \"Code\",\n kind: \"paragraph\",\n basedOn: NORMAL_STYLE_ID,\n block: { type: \"codeBlock\" },\n character: { fontFamily: \"Consolas\", fontSize: \"10pt\" },\n paragraph: { spaceAfter: \"0pt\", lineHeight: \"1\" },\n priority: 30,\n },\n Hyperlink: {\n id: \"Hyperlink\",\n name: \"Hyperlink\",\n kind: \"character\",\n character: { color: \"#0563C1\", underline: true },\n priority: 99,\n hidden: true,\n builtin: true,\n },\n CommentReference: {\n id: \"CommentReference\",\n name: \"annotation reference\",\n kind: \"character\",\n character: { fontSize: \"8pt\" },\n priority: 99,\n hidden: true,\n builtin: true,\n },\n CommentText: {\n id: \"CommentText\",\n name: \"annotation text\",\n kind: \"paragraph\",\n basedOn: NORMAL_STYLE_ID,\n character: { fontSize: \"10pt\" },\n priority: 99,\n hidden: true,\n builtin: true,\n },\n};\nfor (let level = 1; level <= 6; level++) {\n EXTRA_STYLES[`Heading${level}`] = {\n id: `Heading${level}`,\n name: `Heading ${level}`,\n kind: \"paragraph\",\n basedOn: NORMAL_STYLE_ID,\n next: NORMAL_STYLE_ID,\n block: { type: \"heading\", attrs: { level } },\n character: { bold: true },\n priority: 9,\n quick: true,\n builtin: true,\n };\n}\n\nfunction resolveInput(\n input: DocxExportEditorLike | DocxJSONNode,\n options: DocxExportOptions,\n): { doc: DocxJSONNode; options: DocxExportOptions } {\n if (!isEditorLike(input)) return { doc: input, options };\n const storage = (input.storage ?? {}) as any;\n return {\n doc: input.getJSON(),\n options: {\n ...options,\n comments: options.comments !== undefined ? options.comments : (storage.comment?.store ?? null),\n styles: options.styles ?? storage.paragraphStyles?.registry ?? undefined,\n },\n };\n}\n\n/**\n * Builds the package parts of a DOCX file without zipping them (synchronous;\n * useful for inspection and tests). See {@link exportDocx}.\n */\nexport function createDocxParts(\n input: DocxExportEditorLike | DocxJSONNode,\n options: DocxExportOptions = {},\n): { parts: DocxPackagePart[]; report: DocxExportReport } {\n const resolved = resolveInput(input, options);\n const builder = new DocxBuilder(\n resolved.doc ?? { type: \"doc\", content: [] },\n resolved.options,\n threadsOf(resolved.options.comments),\n stylesOf(resolved.options.styles),\n );\n const parts = builder.parts(resolved.options.now?.() ?? new Date());\n return { parts, report: builder.report };\n}\n\n/**\n * Exports an editor (or its JSON) as a Word document. Resolves with the file\n * bytes and a report of what was dropped. Never fetches anything: remote\n * images are skipped (or linked with `remoteImages: \"link\"`).\n */\nexport async function exportDocx(\n input: DocxExportEditorLike | DocxJSONNode,\n options: DocxExportOptions = {},\n): Promise<DocxExportResult> {\n const { parts, report } = createDocxParts(input, options);\n const data = await writeZip(parts as ZipWriteEntry[], { compression: options.compression });\n return { data, report };\n}\n\n/** Like {@link exportDocx}, but resolves with a `Blob` of type {@link DOCX_EXPORT_MIME_TYPE}. */\nexport async function exportDocxBlob(\n input: DocxExportEditorLike | DocxJSONNode,\n options: DocxExportOptions = {},\n): Promise<{ blob: Blob; report: DocxExportReport }> {\n const { data, report } = await exportDocx(input, options);\n return { blob: new Blob([data as BlobPart], { type: DOCX_EXPORT_MIME_TYPE }), report };\n}\n","import {\n exportDocxBlob,\n type DocxExportEditorLike,\n type DocxExportOptions,\n type DocxExportReport,\n type DocxJSONNode,\n} from \"./docx\";\n\n/**\n * Saves a `Blob` as a file through a temporary `<a download>` link. Does\n * nothing (returns `false`) without a DOM.\n */\nexport function downloadBlob(blob: Blob, fileName: string): boolean {\n if (typeof document === \"undefined\" || typeof URL === \"undefined\" || typeof URL.createObjectURL !== \"function\") {\n return false;\n }\n const url = URL.createObjectURL(blob);\n const link = document.createElement(\"a\");\n link.href = url;\n link.download = fileName;\n link.rel = \"noopener\";\n link.style.display = \"none\";\n document.body.appendChild(link);\n link.click();\n link.remove();\n // Revoke after the click has been handled, or some browsers cancel the download.\n setTimeout(() => URL.revokeObjectURL(url), 0);\n return true;\n}\n\n/** `name.docx`, with characters that are invalid in file names replaced. */\nexport function docxFileName(name: string | undefined): string {\n const base = (name ?? \"\")\n .replace(/[\\u0000-\\u001f\\u007f<>:\"/\\\\|?*]+/g, \" \")\n .replace(/\\s+/g, \" \")\n .trim()\n .replace(/\\.docx$/i, \"\")\n .slice(0, 120);\n return `${base || \"document\"}.docx`;\n}\n\nexport interface DocxExportState {\n isExporting: boolean;\n /** Last export error (cleared when a new export starts). */\n error: Error | null;\n /** Report of the most recent successful export. */\n lastReport: DocxExportReport | null;\n}\n\nexport interface DocxExportControllerOptions extends DocxExportOptions {\n /** Download file name (default: `title`, else `document`, plus `.docx`). */\n fileName?: string;\n /** Called after each successful export with its report. */\n onExport?: (report: DocxExportReport, blob: Blob) => void;\n /** Called when an export fails (the error is also kept in the state). */\n onError?: (error: Error) => void;\n}\n\n/**\n * Framework-agnostic state for an \"Export to Word\" button: tracks\n * `isExporting` / `error` / `lastReport` and downloads the `.docx` of the\n * editor returned by `getSource`. React's `useDocxExport` and Svelte's\n * `createDocxExport` wrap it.\n */\nexport class DocxExportController {\n private state: DocxExportState = { isExporting: false, error: null, lastReport: null };\n private readonly listeners = new Set<(state: DocxExportState) => void>();\n private pending = 0;\n\n constructor(\n private readonly getSource: () => DocxExportEditorLike | DocxJSONNode | null | undefined,\n private options: DocxExportControllerOptions = {},\n ) {}\n\n setOptions(options: DocxExportControllerOptions): void {\n this.options = options;\n }\n\n getState = (): DocxExportState => this.state;\n\n subscribe = (listener: (state: DocxExportState) => void): (() => void) => {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n };\n\n private setState(patch: Partial<DocxExportState>): void {\n this.state = { ...this.state, ...patch };\n this.listeners.forEach((listener) => listener(this.state));\n }\n\n /** Builds the `.docx` without downloading it. Resolves with `null` when there is no editor or it fails. */\n async exportBlob(): Promise<{ blob: Blob; report: DocxExportReport } | null> {\n const source = this.getSource();\n if (!source) return null;\n this.pending++;\n this.setState({ isExporting: true, error: null });\n try {\n const { fileName: _fileName, onExport: _onExport, onError: _onError, ...exportOptions } = this.options;\n const result = await exportDocxBlob(source, exportOptions);\n this.setState({ lastReport: result.report });\n this.options.onExport?.(result.report, result.blob);\n return result;\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.setState({ error: err });\n if (this.options.onError) this.options.onError(err);\n else console.error(\"[Editor] DOCX export failed:\", err);\n return null;\n } finally {\n this.pending--;\n if (this.pending === 0) this.setState({ isExporting: false });\n }\n }\n\n /** Exports and downloads the document. Resolves with the report, or `null`. */\n async download(fileName?: string): Promise<DocxExportReport | null> {\n const result = await this.exportBlob();\n if (!result) return null;\n downloadBlob(result.blob, docxFileName(fileName ?? this.options.fileName ?? this.options.title));\n return result.report;\n }\n}\n\nexport function createDocxExportController(\n getSource: () => DocxExportEditorLike | DocxJSONNode | null | undefined,\n options?: DocxExportControllerOptions,\n): DocxExportController {\n return new DocxExportController(getSource, options);\n}\n"],"mappings":"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","names":["attrs","format","document"]}
|