@weasel-js/geom 1.9.4 → 1.10.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/view.ts","../src/mat3.ts","../src/nearest.ts","../src/portCurve2.ts","../src/paths/builder.ts","../src/paths/bounds.ts","../src/paths/unionBoundsPath.ts","../src/affine.ts","../src/paths/transformPath.ts","../src/paths/transform.ts","../src/paths/compose.ts","../src/paths/splitSubpaths.ts","../src/paths/winding.ts","../src/paths/pathFromD.ts","../src/paths/pathAt.ts","../src/paths/pathDistance.ts","../src/paths/schneiderFit.ts","../src/screenBand.ts","../src/pathHitTest.ts","../src/place.ts","../src/easings.ts","../src/easingSpec.ts"],"names":["x","y","portControls","portCurvePoints","sign","dot","last","fit","sub"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Viewport state. `(view.x, view.y)` is the world point currently rendered at\n * the canvas top-left; `view.scale.x` / `view.scale.y` is pixels per world\n * unit on each axis.\n *\n * A `View` names no orientation, so a kernel with a camera cannot express its\n * viewport as one.\n */\nexport interface View {\n x: number;\n y: number;\n scale: { x: number; y: number };\n}\n\n/**\n * The smallest zoom magnitude a view can hold, in `View.scale` units.\n *\n * A view's zoom is always finite and at least this far from 0. Nothing can be\n * drawn or picked through a zoom of 0, and every screen↔world conversion\n * divides by it, so it is ruled out where views are made rather than handled\n * by each conversion.\n */\nexport const ZOOM_FLOOR = 1e-9;\n\n/**\n * The one rule for a zoom magnitude: a finite number no smaller than\n * {@link ZOOM_FLOOR}. Anything else (0, negative, NaN, ±Infinity) becomes the\n * floor.\n */\nexport function normalizeZoom(zoom: number): number {\n return zoom >= ZOOM_FLOOR && zoom < Infinity ? zoom : ZOOM_FLOOR;\n}\n","/**\n * 2D affine transforms in canvas/DOMMatrix order: [a, b, c, d, e, f].\n * x' = a·x + c·y + e\n * y' = b·x + d·y + f\n * Represented as a readonly 6-tuple (f64). The affine tier of the kernel.\n *\n * Convention alignment: the renderer already has a `Mat3` in\n * `src/renderer/math/mat3.ts`. That one is a 9-element column-major\n * array (a full 3×3) laid out for `uniformMatrix3fv` — a deliberately\n * different *representation* for the WebGL upload path. Its *logical element\n * order* is identical to ours: `create(a, b, c, d, tx, ty)` maps\n * `x' = a·x + c·y + tx`, `y' = b·x + d·y + ty` (canvas/DOMMatrix a,b,c,d,e,f).\n * We keep the pure 6-tuple form here (the kernel form); the 9-element form\n * stays a render-layer concern. No second logical convention is created.\n */\nimport { SINGULAR_RATIO } from './scalar';\n\n/** `[a, b, c, d, e, f]`: `x' = a·x + c·y + e`, `y' = b·x + d·y + f`. */\nexport type Mat3 = readonly [number, number, number, number, number, number];\n\n/** The transform that leaves a point where it is. */\nexport function identity(): Mat3 {\n return [1, 0, 0, 1, 0, 0];\n}\n\n/** A pure translation by `(tx, ty)`. */\nexport function translate(tx: number, ty: number): Mat3 {\n return [1, 0, 0, 1, tx, ty];\n}\n\n/** A pure scale about the origin. Scale about another point by composing\n * translate → scale → inverse translate with `multiply`. */\nexport function scale(sx: number, sy: number): Mat3 {\n return [sx, 0, 0, sy, 0, 0];\n}\n\n/** A pure rotation about the origin, in radians, clockwise in canvas\n * coordinates (y down). */\nexport function rotate(rad: number): Mat3 {\n const c = Math.cos(rad);\n const s = Math.sin(rad);\n return [c, s, -s, c, 0, 0];\n}\n\n/** Compose: result applies `n` first, then `m` (m·n). */\nexport function multiply(m: Mat3, n: Mat3): Mat3 {\n return [\n m[0] * n[0] + m[2] * n[1],\n m[1] * n[0] + m[3] * n[1],\n m[0] * n[2] + m[2] * n[3],\n m[1] * n[2] + m[3] * n[3],\n m[0] * n[4] + m[2] * n[5] + m[4],\n m[1] * n[4] + m[3] * n[5] + m[5],\n ];\n}\n\n/** Inverse, or null when the matrix is singular, non-finite, or too\n * ill-conditioned to invert meaningfully at its own scale. */\nexport function invert(m: Mat3): Mat3 | null {\n const det = m[0] * m[3] - m[1] * m[2];\n // The determinant is an area, so it is judged against the squared column norms.\n const norm2 = Math.max(m[0] * m[0] + m[1] * m[1], m[2] * m[2] + m[3] * m[3]);\n // Negated so a non-finite determinant falls out as singular.\n if (!(Math.abs(det) > SINGULAR_RATIO * norm2)) return null;\n const id = 1 / det;\n const a = m[3] * id;\n const b = -m[1] * id;\n const c = -m[2] * id;\n const d = m[0] * id;\n return [a, b, c, d, -(m[4] * a + m[5] * c), -(m[4] * b + m[5] * d)];\n}\n\n/** Apply to a point, returning a tuple. Cold-path use; hot loops inline. */\nexport function applyToPoint(m: Mat3, x: number, y: number): [number, number] {\n return [m[0] * x + m[2] * y + m[4], m[1] * x + m[3] * y + m[5]];\n}\n\n/** Affine that maps source box (sx,sy,sw,sh) onto destination box (dx,dy,dw,dh). */\nexport function boxToBox(\n sx: number, sy: number, sw: number, sh: number,\n dx: number, dy: number, dw: number, dh: number,\n): Mat3 {\n const kx = sw === 0 ? 1 : dw / sw;\n const ky = sh === 0 ? 1 : dh / sh;\n // translate(dx,dy) · scale(kx,ky) · translate(-sx,-sy)\n return [kx, 0, 0, ky, dx - sx * kx, dy - sy * ky];\n}\n\n/** Rotation by `rad` about pivot (cx,cy): translate(c)·rotate·translate(-c). */\nexport function rotateAboutPoint(cx: number, cy: number, rad: number): Mat3 {\n return multiply(translate(cx, cy), multiply(rotate(rad), translate(-cx, -cy)));\n}\n","/**\n * Nearest point on a segment or a whole path to a probe point: where it is,\n * its curve parameter, and how far away it lies.\n */\nimport { cubicEvalAt, elevateQuadraticToCubic } from './curve';\nimport { forEachSegment, PATH_M, PATH_L, PATH_Q, PATH_C, PATH_Z } from './commands';\n\n/** The point on one segment nearest a probe. */\nexport interface CurveNearest {\n x: number;\n y: number;\n /** Curve parameter of the point, in [0, 1]. */\n t: number;\n /** Euclidean distance from the probe. */\n dist: number;\n}\n\n/** The point on a path nearest a probe, and the command whose segment holds it. */\nexport interface PathNearest extends CurveNearest {\n /** Index of the segment's command in the command stream (`L`, `Q`, `C` or `Z`). */\n commandIndex: number;\n /** Offset of that command's first coord; for a `Z`, where its coords would begin. */\n coordIndex: number;\n}\n\n/** Nearest point on segment (x0,y0)-(x1,y1) to (px,py). */\nexport function nearestOnLine(\n px: number, py: number, x0: number, y0: number, x1: number, y1: number,\n): CurveNearest {\n const vx = x1 - x0, vy = y1 - y0;\n const vv = vx * vx + vy * vy;\n let t = vv === 0 ? 0 : ((px - x0) * vx + (py - y0) * vy) / vv;\n t = t < 0 ? 0 : t > 1 ? 1 : t;\n const x = t === 1 ? x1 : x0 + t * vx;\n const y = t === 1 ? y1 : y0 + t * vy;\n return { x, y, t, dist: Math.hypot(px - x, py - y) };\n}\n\n/** Coarse samples per cubic. Each local minimum among them is refined, so this\n * only has to separate the distance function's minima (a cubic has at most\n * three), not locate them. */\nconst CUBIC_SAMPLES = 32;\nconst REFINE_ITERS = 40;\nconst T_EPS = 1e-14;\n\n/**\n * Nearest point on the cubic (x0,y0)…(x3,y3) to (px,py). Samples the curve,\n * then refines every sampled local minimum with bracketed Newton on the\n * distance derivative, so a loop or cusp cannot capture it in the wrong basin.\n */\nexport function nearestOnCubic(\n px: number, py: number,\n x0: number, y0: number, x1: number, y1: number,\n x2: number, y2: number, x3: number, y3: number,\n): CurveNearest {\n // Power basis B(t) = a t³ + b t² + c t + p0, for the derivatives.\n const ax = -x0 + 3 * x1 - 3 * x2 + x3, ay = -y0 + 3 * y1 - 3 * y2 + y3;\n const bx = 3 * x0 - 6 * x1 + 3 * x2, by = 3 * y0 - 6 * y1 + 3 * y2;\n const cx = 3 * (x1 - x0), cy = 3 * (y1 - y0);\n\n const d2At = (t: number): number => {\n const [x, y] = cubicEvalAt(x0, y0, x1, y1, x2, y2, x3, y3, t);\n return (x - px) ** 2 + (y - py) ** 2;\n };\n\n const d2s: number[] = [];\n for (let k = 0; k <= CUBIC_SAMPLES; k++) d2s.push(d2At(k / CUBIC_SAMPLES));\n\n let bestT = 0, bestD2 = d2s[0];\n for (let k = 0; k <= CUBIC_SAMPLES; k++) {\n const d = d2s[k];\n const prev = k > 0 ? d2s[k - 1] : Infinity;\n const next = k < CUBIC_SAMPLES ? d2s[k + 1] : Infinity;\n if (!(d <= prev && d <= next)) continue;\n\n let lo = Math.max(0, (k - 1) / CUBIC_SAMPLES);\n let hi = Math.min(1, (k + 1) / CUBIC_SAMPLES);\n let t = k / CUBIC_SAMPLES;\n for (let i = 0; i < REFINE_ITERS; i++) {\n const t2 = t * t;\n const ex = ax * t2 * t + bx * t2 + cx * t + x0 - px;\n const ey = ay * t2 * t + by * t2 + cy * t + y0 - py;\n const dx = 3 * ax * t2 + 2 * bx * t + cx, dy = 3 * ay * t2 + 2 * by * t + cy;\n const ddx = 6 * ax * t + 2 * bx, ddy = 6 * ay * t + 2 * by;\n // g = ½ d/dt |B - P|², zero at a critical point; its sign says which side the minimum is on.\n const g = ex * dx + ey * dy;\n const gp = dx * dx + dy * dy + ex * ddx + ey * ddy;\n if (g > 0) hi = t; else if (g < 0) lo = t; else break;\n let tn = gp > 0 ? t - g / gp : NaN;\n if (!(tn > lo && tn < hi)) tn = (lo + hi) / 2;\n const step = Math.abs(tn - t);\n t = tn;\n if (step < T_EPS || hi - lo < T_EPS) break;\n }\n const refined = d2At(t);\n const [tk, dk] = refined <= d ? [t, refined] : [k / CUBIC_SAMPLES, d];\n if (dk < bestD2) { bestD2 = dk; bestT = tk; }\n }\n\n const [x, y] = cubicEvalAt(x0, y0, x1, y1, x2, y2, x3, y3, bestT);\n return { x, y, t: bestT, dist: Math.hypot(x - px, y - py) };\n}\n\n/** Nearest point on the quadratic (x0,y0)(x1,y1)(x2,y2) to (px,py). */\nexport function nearestOnQuadratic(\n px: number, py: number,\n x0: number, y0: number, x1: number, y1: number, x2: number, y2: number,\n): CurveNearest {\n // Degree elevation keeps the parameterization, so t carries over unchanged.\n const [c1x, c1y, c2x, c2y] = elevateQuadraticToCubic(x0, y0, x1, y1, x2, y2);\n return nearestOnCubic(px, py, x0, y0, c1x, c1y, c2x, c2y, x2, y2);\n}\n\n/**\n * Nearest point on a command-stream path to (px,py), over every `L`, `Q`, `C`\n * and the closing edge each `Z` draws. The earliest segment wins a tie.\n * Returns `null` when the path has no segment, and throws on a command code\n * `PATH_COMMANDS` does not declare.\n */\nexport function nearestOnPath(\n commands: ArrayLike<number>,\n coords: ArrayLike<number>,\n px: number,\n py: number,\n): PathNearest | null {\n let best: PathNearest | null = null;\n let startX = 0, startY = 0;\n forEachSegment(commands, coords, (cmd, ci, x0, y0, commandIndex) => {\n let hit: CurveNearest;\n if (cmd === PATH_M) {\n startX = coords[ci]; startY = coords[ci + 1];\n return;\n } else if (cmd === PATH_L) {\n hit = nearestOnLine(px, py, x0, y0, coords[ci], coords[ci + 1]);\n } else if (cmd === PATH_Q) {\n hit = nearestOnQuadratic(px, py, x0, y0, coords[ci], coords[ci + 1], coords[ci + 2], coords[ci + 3]);\n } else if (cmd === PATH_C) {\n hit = nearestOnCubic(\n px, py, x0, y0,\n coords[ci], coords[ci + 1], coords[ci + 2], coords[ci + 3], coords[ci + 4], coords[ci + 5],\n );\n } else if (cmd === PATH_Z) {\n hit = nearestOnLine(px, py, x0, y0, startX, startY);\n } else {\n throw new Error(`nearestOnPath: unknown command code ${cmd}`);\n }\n if (best === null || hit.dist < best.dist) best = { ...hit, commandIndex, coordIndex: ci };\n });\n return best;\n}\n","/**\n * The port-curve rule in the 2D kernel's currency: loose scalars, the way\n * `cubicEvalAt` and `applyToPoint` take them. The rule itself lives in\n * `./portCurve`, stated once over components, so this and `./3d` cannot drift.\n */\n\nimport {\n PORT_REACH,\n portControls as portControlsN,\n portCurvePoints as portCurvePointsN,\n} from './portCurve';\n\nexport { PORT_REACH };\n\n/**\n * `[c1, c2]` for the cubic from `(ax, ay)` to `(bx, by)`.\n *\n * A null normal falls back to a lerp along the chord. See `./portCurve` for why\n * the two ends are not symmetric.\n */\nexport function portControls(\n ax: number,\n ay: number,\n bx: number,\n by: number,\n outNormal: readonly [number, number] | null | undefined,\n inNormal: readonly [number, number] | null | undefined,\n reach: number = PORT_REACH,\n): [[number, number], [number, number]] {\n const [c1, c2] = portControlsN([ax, ay], [bx, by], outNormal, inNormal, reach);\n return [\n [c1[0]!, c1[1]!],\n [c2[0]!, c2[1]!],\n ];\n}\n\n/** A port curve sampled into `samples` points, excluding its start. */\nexport function portCurvePoints(\n ax: number,\n ay: number,\n bx: number,\n by: number,\n outNormal: readonly [number, number] | null | undefined,\n inNormal: readonly [number, number] | null | undefined,\n samples: number,\n reach: number = PORT_REACH,\n): [number, number][] {\n return portCurvePointsN([ax, ay], [bx, by], outNormal, inNormal, samples, reach).map(\n (p) => [p[0]!, p[1]!],\n );\n}\n","/**\n * Fluent builder for `PolygonPath`. Hides the `Uint8Array` / `Float32Array`\n * encoding behind move/line/curve/close calls and a final `build()`. Use\n * this to construct paths in tests and demos; production callers that need\n * to mutate large paths in place should reach for the raw arrays directly.\n *\n * Numeric capacity grows by doubling — typical for amortized O(1) push.\n *\n * Also exposes `rectPath` / `polygonFromPoints` shortcuts for the common\n * cases. `rectPath` returns the lighter `RectPath` subtype, not a polygon.\n */\n\nimport { PATH_C, PATH_L, PATH_M, PATH_Q, PATH_Z } from '../commands';\nimport type { PathFillRule, PolygonPath, RectPath } from '../path';\n\n/** Fluent builder for `PolygonPath`; hides the `Uint8Array`/`Float32Array` encoding behind move/line/curve/close calls. */\nexport class PathBuilder {\n private cmds: number[] = [];\n private xs: number[] = [];\n private fillRule: PathFillRule = 'nonzero';\n\n /** Seed a builder with an existing `PolygonPath`. Useful for extending\n * an in-flight path with another segment (e.g. appending a cubic to\n * the end of a curve in response to a user action) without hand-\n * reaching into the `commands` / `coords` typed arrays.\n *\n * ```ts\n * const next = PathBuilder.fromPath(current).curveTo(...).build();\n * ```\n */\n static fromPath(path: PolygonPath): PathBuilder {\n const b = new PathBuilder();\n b.cmds = Array.from(path.commands);\n b.xs = Array.from(path.coords);\n b.fillRule = path.fillRule;\n return b;\n }\n\n setFillRule(rule: PathFillRule): this {\n this.fillRule = rule;\n return this;\n }\n\n moveTo(x: number, y: number): this {\n this.cmds.push(PATH_M);\n this.xs.push(x, y);\n return this;\n }\n\n lineTo(x: number, y: number): this {\n this.cmds.push(PATH_L);\n this.xs.push(x, y);\n return this;\n }\n\n /** Cubic bezier to (x, y) with control points (x1, y1) and (x2, y2). */\n curveTo(x1: number, y1: number, x2: number, y2: number, x: number, y: number): this {\n this.cmds.push(PATH_C);\n this.xs.push(x1, y1, x2, y2, x, y);\n return this;\n }\n\n /** Quadratic bezier to (x, y) with control point (x1, y1). */\n quadTo(x1: number, y1: number, x: number, y: number): this {\n this.cmds.push(PATH_Q);\n this.xs.push(x1, y1, x, y);\n return this;\n }\n\n close(): this {\n this.cmds.push(PATH_Z);\n return this;\n }\n\n build(): PolygonPath {\n return {\n kind: 'polygon',\n commands: new Uint8Array(this.cmds),\n coords: new Float32Array(this.xs),\n fillRule: this.fillRule,\n };\n }\n}\n\n/** Construct a `RectPath` (the fast-path subtype). */\nexport function rectPath(x: number, y: number, width: number, height: number): RectPath {\n return { kind: 'rect', x, y, width, height };\n}\n\n/** Build an open polyline from a flat list of points — the same geometry as\n * {@link polygonFromPoints} without the closing edge. A freehand stroke and a\n * measurement line want this; a region wants the closed one. */\nexport function polylineFromPoints(\n points: readonly { x: number; y: number }[],\n): PolygonPath | RectPath {\n const b = new PathBuilder();\n const first = points[0];\n if (!first) return rectPath(0, 0, 0, 0);\n b.moveTo(first.x, first.y);\n for (let i = 1; i < points.length; i++) {\n const p = points[i];\n if (p) b.lineTo(p.x, p.y);\n }\n return b.build();\n}\n\n/** Build a closed polygon from a flat list of points. */\nexport function polygonFromPoints(\n points: readonly { x: number; y: number }[],\n opts: { fillRule?: PathFillRule } = {},\n): PolygonPath {\n if (points.length === 0) {\n return {\n kind: 'polygon',\n commands: new Uint8Array(),\n coords: new Float32Array(),\n fillRule: opts.fillRule ?? 'nonzero',\n };\n }\n const b = new PathBuilder();\n if (opts.fillRule) b.setFillRule(opts.fillRule);\n b.moveTo(points[0].x, points[0].y);\n for (let i = 1; i < points.length; i++) b.lineTo(points[i].x, points[i].y);\n b.close();\n return b.build();\n}\n\n/** Cubic-Bezier kappa for circular-quadrant approximation (<1% max error). */\nconst ELLIPSE_KAPPA = 0.5522847498307936;\n\n/** Closed ellipse inscribed in `bounds`, as a 4-cubic-Bezier `PolygonPath`.\n * Matches the geometry `useEllipseTool`'s overlay paints. */\nexport function ellipsePath(\n bounds: { x: number; y: number; width: number; height: number },\n): PolygonPath {\n const cx = bounds.x + bounds.width / 2;\n const cy = bounds.y + bounds.height / 2;\n const rx = bounds.width / 2;\n const ry = bounds.height / 2;\n const ox = rx * ELLIPSE_KAPPA;\n const oy = ry * ELLIPSE_KAPPA;\n const b = new PathBuilder();\n b.moveTo(cx + rx, cy);\n b.curveTo(cx + rx, cy + oy, cx + ox, cy + ry, cx, cy + ry);\n b.curveTo(cx - ox, cy + ry, cx - rx, cy + oy, cx - rx, cy);\n b.curveTo(cx - rx, cy - oy, cx - ox, cy - ry, cx, cy - ry);\n b.curveTo(cx + ox, cy - ry, cx + rx, cy - oy, cx + rx, cy);\n b.close();\n return b.build();\n}\n\n/** Closed regular n-gon centered at `center`, circumscribed by `radius`.\n * `rotation` is in radians; default 0 puts the first vertex on the +x axis. */\nexport function regularPolygonPath(\n center: { x: number; y: number },\n radius: number,\n sides: number,\n rotation = 0,\n): PolygonPath {\n const b = new PathBuilder();\n for (let i = 0; i < sides; i++) {\n const a = rotation + (i / sides) * Math.PI * 2;\n const x = center.x + radius * Math.cos(a);\n const y = center.y + radius * Math.sin(a);\n if (i === 0) b.moveTo(x, y); else b.lineTo(x, y);\n }\n b.close();\n return b.build();\n}\n\n/** Closed n-pointed star centered at `center`, alternating `outerRadius` and\n * `innerRadius` (default `outerRadius / 2`). `rotation` is in radians. */\nexport function starPath(\n center: { x: number; y: number },\n outerRadius: number,\n points = 5,\n innerRadius: number = outerRadius / 2,\n rotation = 0,\n): PolygonPath {\n const b = new PathBuilder();\n const n = points * 2;\n for (let i = 0; i < n; i++) {\n const a = rotation + (i / n) * Math.PI * 2;\n const r = i % 2 === 0 ? outerRadius : innerRadius;\n const x = center.x + r * Math.cos(a);\n const y = center.y + r * Math.sin(a);\n if (i === 0) b.moveTo(x, y); else b.lineTo(x, y);\n }\n b.close();\n return b.build();\n}\n\n/** Open 2-vertex polyline from `a` to `b` — strokeable, not fillable. */\nexport function linePath(\n a: { x: number; y: number },\n b: { x: number; y: number },\n): PolygonPath {\n const pb = new PathBuilder();\n pb.moveTo(a.x, a.y);\n pb.lineTo(b.x, b.y);\n return pb.build();\n}\n","/**\n * AABB bounds of a `Path`. Returned as `RectPath` for direct reuse with the\n * rect fast path machinery (selection AABB, area-select intersection).\n *\n * `RectPath` is its own bounds — O(1). For `PolygonPath`, walk segment by\n * segment, computing the tight bound per segment:\n *\n * - `M` / `L`: just the endpoint.\n * - `Q`: quadratic Bezier — endpoints plus axis-aligned extrema (one\n * possible inflection per axis).\n * - `C`: cubic Bezier — endpoints plus axis-aligned extrema (up to two\n * possible inflections per axis, found via the quadratic formula on\n * the derivative).\n *\n * Control points are NOT included directly; they're used only to compute\n * extrema that actually lie on the curve. This avoids the classic \"AABB\n * extends past where the curve visibly reaches\" bug for curved paths whose\n * control points poke outside the visible extent.\n *\n * Empty paths (no commands) return a zero-size rect anchored at the\n * origin — the convention used elsewhere in the kit for missing geometry.\n */\n\nimport { cubicBounds, elevateQuadraticToCubic } from '../curve';\nimport { forEachSegment, PATH_C, PATH_L, PATH_M, PATH_Q, PATH_Z } from '../commands';\nimport type { Path, RectPath } from '../path';\n\n/** AABB of a `Path`, returned as a `RectPath` for direct reuse with rect-fast-path machinery. */\nexport function boundsOfPath(path: Path): RectPath {\n if (path.kind === 'rect') return path;\n\n const { commands, coords } = path;\n if (commands.length === 0) {\n return { kind: 'rect', x: 0, y: 0, width: 0, height: 0 };\n }\n\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n let seen = false;\n\n const include = (x: number, y: number) => {\n if (x < minX) minX = x;\n if (x > maxX) maxX = x;\n if (y < minY) minY = y;\n if (y > maxY) maxY = y;\n seen = true;\n };\n\n forEachSegment(commands, coords, (cmd, ci, px, py) => {\n switch (cmd) {\n case PATH_M:\n case PATH_L: {\n include(coords[ci], coords[ci + 1]);\n break;\n }\n case PATH_C: {\n const [bMinX, bMinY, bMaxX, bMaxY] = cubicBounds(\n px, py,\n coords[ci], coords[ci + 1],\n coords[ci + 2], coords[ci + 3],\n coords[ci + 4], coords[ci + 5],\n );\n include(bMinX, bMinY);\n include(bMaxX, bMaxY);\n break;\n }\n case PATH_Q: {\n const qx2 = coords[ci + 2], qy2 = coords[ci + 3];\n const [c1x, c1y, c2x, c2y] = elevateQuadraticToCubic(px, py, coords[ci], coords[ci + 1], qx2, qy2);\n const [bMinX, bMinY, bMaxX, bMaxY] = cubicBounds(px, py, c1x, c1y, c2x, c2y, qx2, qy2);\n include(bMinX, bMinY);\n include(bMaxX, bMaxY);\n break;\n }\n case PATH_Z:\n break;\n default:\n throw new Error(`boundsOfPath: unknown command ${cmd}`);\n }\n });\n\n if (!seen) return { kind: 'rect', x: 0, y: 0, width: 0, height: 0 };\n return { kind: 'rect', x: minX, y: minY, width: maxX - minX, height: maxY - minY };\n}\n\n","/**\n * AABB union over a heterogeneous set of `Path` poses. Returns the\n * envelope as a `RectPath`, or `null` for empty input — analog of\n * `unionBounds` for the rect-only model.\n */\n\nimport { boundsOfPath } from './bounds';\nimport type { Path, RectPath } from '../path';\n\n/** AABB envelope over a set of `Path` instances; returns `null` for empty input. */\nexport function unionBoundsPath(paths: Iterable<Path>): RectPath | null {\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n let any = false;\n for (const p of paths) {\n any = true;\n const b = boundsOfPath(p);\n if (b.x < minX) minX = b.x;\n if (b.y < minY) minY = b.y;\n const right = b.x + b.width;\n const bottom = b.y + b.height;\n if (right > maxX) maxX = right;\n if (bottom > maxY) maxY = bottom;\n }\n if (!any) return null;\n return { kind: 'rect', x: minX, y: minY, width: maxX - minX, height: maxY - minY };\n}\n","import type { Mat3 } from './mat3';\n\n/**\n * Apply an affine to an interleaved coord stream, returning a fresh f64\n * buffer. Command codes are unaffected — for a Bezier the transformed control\n * points define the transformed curve exactly (affine invariance), so callers\n * pass `path.coords` straight through and keep `path.commands` as-is.\n */\nexport function transformCoords(coords: ArrayLike<number>, m: Mat3): Float64Array {\n const out = new Float64Array(coords.length);\n const a = m[0], b = m[1], c = m[2], d = m[3], e = m[4], f = m[5];\n for (let i = 0; i + 1 < coords.length; i += 2) {\n const x = coords[i], y = coords[i + 1];\n out[i] = a * x + c * y + e;\n out[i + 1] = b * x + d * y + f;\n }\n return out;\n}\n","import type { Mat3 } from '../mat3';\nimport { transformCoords } from '../affine';\nimport { PathBuilder } from './builder';\nimport type { Path, PolygonPath } from '../path';\n\n/** Below this, a matrix's rotation and shear terms are rounding left by\n * composing transforms (a half turn's sine is 1.2e-16), not a slant. */\nconst AXIS_ALIGNED_EPSILON = 1e-9;\n\n/** Apply an affine `Mat3` to a path's geometry.\n *\n * Axis-aligned maps (no rotation/shear: `m[1]` and `m[2]` within 1e-9 of 0) keep a\n * `RectPath` a rect — the four corners stay axis-aligned, so we transform the\n * two diagonal corners and normalize negative extent (mirror). Rotation or\n * shear promotes the rect's four corners to a `PolygonPath`. Polygon paths map\n * every coord via the kernel's `transformCoords`, preserving the command stream\n * and `fillRule`. Never mutates the input.\n *\n * `Mat3` here is the 6-tuple `number[]` from `@weasel-js/geom` (DOMMatrix order:\n * `[a, b, c, d, e, f]` where `x' = a·x + c·y + e`, `y' = b·x + d·y + f`),\n * not the renderer's 9-element `Float32Array`. */\nexport function transformPath(path: Path, m: Mat3): Path {\n const [a, b, c, d, e, f] = m;\n if (path.kind === 'rect') {\n if (Math.abs(b) < AXIS_ALIGNED_EPSILON && Math.abs(c) < AXIS_ALIGNED_EPSILON) {\n // Pure scale + translate — corners remain axis-aligned.\n const x0 = a * path.x + e;\n const y0 = d * path.y + f;\n const x1 = a * (path.x + path.width) + e;\n const y1 = d * (path.y + path.height) + f;\n return {\n kind: 'rect',\n x: Math.min(x0, x1),\n y: Math.min(y0, y1),\n width: Math.abs(x1 - x0),\n height: Math.abs(y1 - y0),\n };\n }\n // Rotation / shear — promote to polygon with the four rect corners.\n const poly = new PathBuilder()\n .moveTo(path.x, path.y)\n .lineTo(path.x + path.width, path.y)\n .lineTo(path.x + path.width, path.y + path.height)\n .lineTo(path.x, path.y + path.height)\n .close()\n .build();\n return transformPolygon(poly, m);\n }\n return transformPolygon(path, m);\n}\n\nfunction transformPolygon(path: PolygonPath, m: Mat3): PolygonPath {\n // transformCoords returns Float64Array; PolygonPath.coords is Float32Array.\n const mapped = transformCoords(path.coords, m);\n return { ...path, coords: Float32Array.from(mapped) };\n}\n","/**\n * In-place and copy-out path transforms. Translation is the most common —\n * called every pointermove during a drag — so the polygon variant mutates\n * the float buffer directly to keep allocation pressure off the GC.\n *\n * `scalePathToBounds` is for the resize interaction: given the path's\n * current AABB and the desired new AABB, scales every coordinate\n * proportionally.\n */\n\nimport { boxToBox } from '../mat3';\nimport { forEachSegment, pathCommandCoordCount } from '../commands';\nimport { boundsOfPath } from './bounds';\nimport { transformPath } from './transformPath';\nimport type { Path, PolygonPath, RectPath } from '../path';\n\n/**\n * Translate a path by (dx, dy). Returns a new instance — the kit's pose\n * model treats poses as immutable to keep React state-update semantics\n * predictable. Polygon coords are copied into a fresh `Float32Array`.\n */\nexport function translatePath(path: Path, dx: number, dy: number): Path {\n if (path.kind === 'rect') {\n return { kind: 'rect', x: path.x + dx, y: path.y + dy, width: path.width, height: path.height };\n }\n return translatePolygonCopy(path, dx, dy);\n}\n\nfunction translatePolygonCopy(path: PolygonPath, dx: number, dy: number): PolygonPath {\n const next = new Float32Array(path.coords.length);\n const { commands, coords } = path;\n forEachSegment(commands, coords, (cmd, ci) => {\n for (let k = 0, len = pathCommandCoordCount(cmd); k < len; k += 2) {\n next[ci + k] = coords[ci + k] + dx;\n next[ci + k + 1] = coords[ci + k + 1] + dy;\n }\n });\n return { kind: 'polygon', commands: path.commands, coords: next, fillRule: path.fillRule };\n}\n\n/**\n * Scale a path's coords so its current AABB maps to `target`. Resize\n * interactions use this to make a polygon follow a corner-handle drag.\n *\n * A degenerate source axis (zero width or height) has no ratio to scale by,\n * so `boxToBox` translates that axis instead — a zero scale is not\n * invertible and would discard what is left on it.\n */\nexport function scalePathToBounds(path: Path, target: RectPath): Path {\n if (path.kind === 'rect') {\n return { kind: 'rect', x: target.x, y: target.y, width: target.width, height: target.height };\n }\n const src = boundsOfPath(path);\n return scalePolygon(path, src, target);\n}\n\nfunction scalePolygon(path: PolygonPath, src: RectPath, dst: RectPath): PolygonPath {\n const m = boxToBox(src.x, src.y, src.width, src.height, dst.x, dst.y, dst.width, dst.height);\n // src/dst are axis-aligned, so the polygon stays a polygon after this pure scale+translate.\n return transformPath(path, m) as PolygonPath;\n}\n","/**\n * Translation-only compose/decompose for `Path` poses, the analog of\n * `composeRectPose` / `decomposeRectPose` for the rect-only model. Pair\n * with `composeWorldPose` / `rebaseLocalPose` when an adapter uses `Path`\n * as its `TPose`.\n *\n * Only translation is folded — the kit's hierarchy contract is\n * translation-only, same as for rects. Parent rotation/scale would require\n * a richer compose; that's out of scope here.\n */\n\nimport { boundsOfPath } from './bounds';\nimport { translatePath } from './transform';\nimport type { Path } from '../path';\n\n/** Express `child` (in `parent`'s local frame) in the next frame up. */\nexport function composePath(parent: Path, child: Path): Path {\n const origin = pathOrigin(parent);\n return translatePath(child, origin.x, origin.y);\n}\n\n/** Inverse of `composePath` — undo `parent`'s translation from a world pose. */\nexport function decomposePath(parent: Path, world: Path): Path {\n const origin = pathOrigin(parent);\n return translatePath(world, -origin.x, -origin.y);\n}\n\nfunction pathOrigin(path: Path): { x: number; y: number } {\n const { x, y } = boundsOfPath(path);\n return { x, y };\n}\n","/**\n * Split a `PolygonPath` at each `M` command, returning one `PolygonPath` per\n * subpath. Inverse-ish of compound-path construction: a multi-region\n * (compound) path becomes N independent paths.\n *\n * `fillRule` is propagated unchanged to every output. Even-odd compound paths\n * with interior \"holes\" lose the hole semantics — each subpath becomes its\n * own filled region. (Same behavior as Illustrator's Release Compound Path.)\n *\n * If the input has zero `M` commands (which would already be malformed) the\n * input is returned wrapped in a single-element array. A path with exactly\n * one subpath is also returned as a single-element array — a trivial pass.\n */\n\nimport { forEachSegment, PATH_M } from '../commands';\nimport type { PolygonPath } from '../path';\n\n/** Split a path into one path per subpath, cutting at each `M`. A path with a\n * single subpath comes back as a one-element array. */\nexport function splitSubpaths(path: PolygonPath): PolygonPath[] {\n const { commands, coords, fillRule } = path;\n const out: PolygonPath[] = [];\n\n // Walk the command stream, tracking the (cmdStart, coordStart) of the\n // active subpath. On each subsequent `M`, slice out the previous subpath.\n let cmdStart = 0;\n let coordStart = 0;\n\n forEachSegment(commands, coords, (cmd, ci, _px, _py, i) => {\n if (cmd !== PATH_M || i <= cmdStart) return;\n out.push({\n kind: 'polygon',\n commands: commands.slice(cmdStart, i),\n coords: coords.slice(coordStart, ci),\n fillRule,\n });\n cmdStart = i;\n coordStart = ci;\n });\n\n out.push({\n kind: 'polygon',\n commands: commands.slice(cmdStart),\n coords: coords.slice(coordStart),\n fillRule,\n });\n\n return out;\n}\n","/**\n * Contour orientation: which way a path winds, and the same path wound the\n * other way. Under `'nonzero'` two overlapping contours fill their overlap\n * only when they wind the same way, so composing shapes from different\n * sources into one compound path first needs them to agree.\n */\n\nimport { PATH_C, PATH_L, PATH_M, PATH_Q, PATH_Z, forEachSegment } from '../commands';\nimport type { Path, PolygonPath } from '../path';\n\n// Three-point Gauss-Legendre: exact for polynomials up to degree 5, and the\n// Green's-theorem integrand of a cubic is degree 5.\nconst GL_T = [0.5 - Math.sqrt(15) / 10, 0.5, 0.5 + Math.sqrt(15) / 10];\nconst GL_W = [5 / 18, 8 / 18, 5 / 18];\n\n/**\n * Signed area enclosed by `path`, summed over its contours. Positive for a\n * contour that turns clockwise on a y-down screen (the shoelace sign), so a\n * hole wound against its outer contour subtracts. An open contour counts as\n * closed by a straight edge back to its start, the way a fill closes it.\n * Curved segments are integrated exactly, not through their control polygon.\n * A `RectPath` has no direction and counts as positive.\n */\nexport function pathSignedArea(path: Path): number {\n if (path.kind === 'rect') return path.width * path.height;\n const { commands, coords } = path;\n let twice = 0;\n let startX = 0, startY = 0;\n let open = false;\n let endX = 0, endY = 0;\n const close = () => {\n if (open) twice += endX * startY - startX * endY;\n open = false;\n };\n forEachSegment(commands, coords, (cmd, ci, px, py) => {\n if (cmd === PATH_M) {\n close();\n startX = endX = coords[ci];\n startY = endY = coords[ci + 1];\n open = true;\n return;\n }\n if (cmd === PATH_Z) { close(); endX = startX; endY = startY; return; }\n if (!open) { startX = px; startY = py; open = true; }\n if (cmd === PATH_L) {\n endX = coords[ci]; endY = coords[ci + 1];\n twice += px * endY - endX * py;\n return;\n }\n const cubic = cmd === PATH_C;\n const x1 = coords[ci], y1 = coords[ci + 1];\n const x2 = coords[ci + 2], y2 = coords[ci + 3];\n const x3 = cubic ? coords[ci + 4] : x2, y3 = cubic ? coords[ci + 5] : y2;\n for (let k = 0; k < 3; k++) {\n const t = GL_T[k], u = 1 - t;\n let x: number, y: number, dx: number, dy: number;\n if (cubic) {\n x = u * u * u * px + 3 * u * u * t * x1 + 3 * u * t * t * x2 + t * t * t * x3;\n y = u * u * u * py + 3 * u * u * t * y1 + 3 * u * t * t * y2 + t * t * t * y3;\n dx = 3 * (u * u * (x1 - px) + 2 * u * t * (x2 - x1) + t * t * (x3 - x2));\n dy = 3 * (u * u * (y1 - py) + 2 * u * t * (y2 - y1) + t * t * (y3 - y2));\n } else {\n x = u * u * px + 2 * u * t * x1 + t * t * x2;\n y = u * u * py + 2 * u * t * y1 + t * t * y2;\n dx = 2 * (u * (x1 - px) + t * (x2 - x1));\n dy = 2 * (u * (y1 - py) + t * (y2 - y1));\n }\n twice += GL_W[k] * (x * dy - y * dx);\n }\n endX = x3; endY = y3;\n });\n close();\n return twice / 2;\n}\n\ninterface Segment {\n cmd: number;\n /** Control points followed by the end point, as the command stores them. */\n args: number[];\n fromX: number;\n fromY: number;\n}\n\n/**\n * `path` with every contour traversed backwards: same region, same curves,\n * opposite winding. A closed contour keeps its starting point; an open one\n * starts from where it used to end.\n */\nexport function reversePath(path: PolygonPath): PolygonPath {\n const cmds: number[] = [];\n const out: number[] = [];\n let segs: Segment[] = [];\n let sx = 0, sy = 0;\n let started = false;\n\n const flush = (closed: boolean) => {\n if (!started) return;\n const last = segs[segs.length - 1];\n const ex = last ? last.args[last.args.length - 2] : sx;\n const ey = last ? last.args[last.args.length - 1] : sy;\n if (closed) {\n cmds.push(PATH_M); out.push(sx, sy);\n if (ex !== sx || ey !== sy) { cmds.push(PATH_L); out.push(ex, ey); }\n } else {\n cmds.push(PATH_M); out.push(ex, ey);\n }\n for (let i = segs.length - 1; i >= 0; i--) {\n const s = segs[i];\n cmds.push(s.cmd);\n if (s.cmd === PATH_C) out.push(s.args[2], s.args[3], s.args[0], s.args[1]);\n else if (s.cmd === PATH_Q) out.push(s.args[0], s.args[1]);\n out.push(s.fromX, s.fromY);\n }\n if (closed) cmds.push(PATH_Z);\n segs = [];\n started = false;\n };\n\n const { commands, coords } = path;\n forEachSegment(commands, coords, (cmd, ci, px, py) => {\n if (cmd === PATH_M) {\n flush(false);\n sx = coords[ci]; sy = coords[ci + 1];\n started = true;\n return;\n }\n if (cmd === PATH_Z) { flush(true); return; }\n if (!started) { sx = px; sy = py; started = true; }\n const n = cmd === PATH_C ? 6 : cmd === PATH_Q ? 4 : 2;\n segs.push({ cmd, args: Array.from(coords.subarray(ci, ci + n)), fromX: px, fromY: py });\n });\n flush(false);\n\n return {\n kind: 'polygon',\n commands: new Uint8Array(cmds),\n coords: new Float32Array(out),\n fillRule: path.fillRule,\n };\n}\n","/**\n * `pathFromD` — build a weasel `Path` from an **SVG path-data string** (the\n * value of SVG's `d` attribute, e.g. `\"M0 0 L100 0 Z\"`).\n *\n * This is the terse, declarative composition surface for geometry: a\n * consumer authors a shape as `d` and hands it straight to a scene/op API,\n * instead of chaining imperative builder calls. SVG `d` is deliberately the\n * language — it's a standard every consumer already knows, so the kit gets\n * path-language expressiveness without minting a new one. See\n * `docs/conventions.md` (\"Compose scenes in a terse path language\").\n *\n * Lowers every supported command (M/m L/l H/h V/v C/c S/s Q/q T/t A/a Z/z)\n * into weasel's `PathBuilder` primitives (move, line, cubic, quadratic,\n * close). Smooth (`S`/`s`/`T`/`t`) commands resolve their implicit reflected\n * control point from the previous cubic / quadratic. Arc commands (`A`/`a`)\n * convert to a series of cubic Bezier curves using the standard\n * endpoint-parameterization formulas (F.6.5 in the SVG spec): we reconstruct\n * the center, sweep angle, and a fixed number of (≤ 90°) cubic segments per\n * arc.\n *\n * No runtime dependency — a small hand-rolled parser. `@weasel-js/svg`'s\n * document parser (`parseSvg`) calls this for `<path d=…>` elements, so the\n * `d` grammar coverage is shared between the two entry points.\n */\n\nimport { PathBuilder } from './builder';\n\nconst NUM_RE = /[+-]?(?:\\d*\\.\\d+|\\d+\\.?)(?:[eE][+-]?\\d+)?/g;\n/** Same grammar, anchored — used where a number's position matters. */\nconst NUM_RE_AT = /[+-]?(?:\\d*\\.\\d+|\\d+\\.?)(?:[eE][+-]?\\d+)?/y;\n\n/**\n * Is `d[j]` a command letter, as opposed to the `e` of an exponent? `1e2` is\n * a legal coordinate, and treating its `e` as a command drops the number and\n * everything after it in that argument run.\n */\nfunction isCommandLetter(d: string, j: number): boolean {\n const c = d[j];\n if (!/[A-Za-z]/.test(c)) return false;\n if (c !== 'e' && c !== 'E') return true;\n if (!/[\\d.]/.test(d[j - 1] ?? '')) return true;\n const k = d[j + 1] === '+' || d[j + 1] === '-' ? j + 2 : j + 1;\n return !/\\d/.test(d[k] ?? '');\n}\n\n/** Tokenize the command stream from a `d` string. */\nfunction tokenize(d: string): { cmd: string; args: number[] }[] {\n const out: { cmd: string; args: number[] }[] = [];\n // Walk character by character so we can group command-letter + arg-run.\n let i = 0;\n while (i < d.length) {\n if (isCommandLetter(d, i)) {\n // Collect numeric args until the next command letter.\n let j = i + 1;\n while (j < d.length && !isCommandLetter(d, j)) j++;\n const argSlice = d.slice(i + 1, j);\n const cmd = d[i];\n out.push({\n cmd,\n args: cmd === 'A' || cmd === 'a' ? readArcArgs(argSlice) : readNumbers(argSlice),\n });\n i = j;\n } else {\n // Skip any whitespace / commas at the head.\n i++;\n }\n }\n return out;\n}\n\nfunction readNumbers(s: string): number[] {\n const out: number[] = [];\n let m: RegExpExecArray | null;\n NUM_RE.lastIndex = 0;\n while ((m = NUM_RE.exec(s)) !== null) {\n const n = Number(m[0]);\n if (Number.isFinite(n)) out.push(n);\n }\n return out;\n}\n\n/**\n * Read an `A`/`a` argument run. The two flags are single `0`/`1` digits that\n * need no separator after them, so `a25 25 -30 0 1 50 -25` may legally be\n * written `a25 25 -30 0150 -25` — which a plain number scan reads as two\n * arguments instead of four, leaving the whole arc short and dropped.\n */\nfunction readArcArgs(s: string): number[] {\n const out: number[] = [];\n let i = 0;\n while (i < s.length) {\n const c = s[i];\n if (c === ',' || c === ' ' || c === '\\t' || c === '\\n' || c === '\\r') { i++; continue; }\n const slot = out.length % 7;\n if (slot === 3 || slot === 4) {\n if (c !== '0' && c !== '1') return out;\n out.push(c === '1' ? 1 : 0);\n i++;\n continue;\n }\n NUM_RE_AT.lastIndex = i;\n const m = NUM_RE_AT.exec(s);\n if (!m) return out;\n out.push(Number(m[0]));\n i = NUM_RE_AT.lastIndex;\n }\n return out;\n}\n\n/**\n * Per-command argument counts (in floats). M/L/T = 2 coords; H/V = 1;\n * C = 6 (two controls + endpoint); S/Q = 4; A = 7 (rx ry x-axis-rotation\n * large-arc-flag sweep-flag x y).\n */\nconst ARG_COUNTS: Record<string, number> = {\n M: 2, L: 2, H: 1, V: 1, C: 6, S: 4, Q: 4, T: 2, A: 7, Z: 0,\n};\n\ninterface ParseState {\n x: number;\n y: number;\n startX: number;\n startY: number;\n /** Last cubic control point for S/s reflection (in absolute coords). */\n lastCubicCtrl: { x: number; y: number } | null;\n /** Last quadratic control point for T/t reflection (in absolute coords). */\n lastQuadCtrl: { x: number; y: number } | null;\n}\n\n/**\n * Build a weasel `PolygonPath` from an SVG path-data (`d`) string. Unknown\n * command letters are skipped (and reported via `onWarn` when provided); the\n * builder still returns whatever valid commands preceded them. Data that does\n * not begin with a moveto builds an empty path, and a command with the wrong\n * number of arguments ends the path before it, as SVG renders both.\n */\nexport function pathFromD(\n d: string,\n onWarn?: (message: string) => void,\n): ReturnType<PathBuilder['build']> {\n const tokens = tokenize(d);\n const b = new PathBuilder();\n const st: ParseState = {\n x: 0, y: 0, startX: 0, startY: 0,\n lastCubicCtrl: null, lastQuadCtrl: null,\n };\n\n let started = false;\n for (const { cmd, args } of tokens) {\n const upper = cmd.toUpperCase();\n const relative = cmd !== upper;\n const argCount = ARG_COUNTS[upper];\n if (argCount === undefined) {\n onWarn?.(`unknown path command: ${cmd}`);\n continue;\n }\n if (!started && upper !== 'M') {\n onWarn?.(`path data does not begin with a moveto (\"${cmd}\" comes first); nothing is drawn`);\n break;\n }\n if (upper === 'Z') {\n b.close();\n st.x = st.startX;\n st.y = st.startY;\n st.lastCubicCtrl = null;\n st.lastQuadCtrl = null;\n continue;\n }\n // M with multiple coord pairs implies subsequent pairs are L (per SVG spec).\n const groups = Math.floor(args.length / argCount);\n for (let g = 0; g < groups; g++) {\n const a = args.slice(g * argCount, (g + 1) * argCount);\n // For repeated 'M'/'m' coord pairs after the first, downgrade to L/l.\n const effectiveUpper = upper === 'M' && g > 0 ? 'L' : upper;\n runCommand(effectiveUpper, relative, a, st, b);\n started = true;\n }\n // SVG draws a path up to the command in error and no further: carrying on\n // would start every later relative command from the wrong point.\n if (groups === 0 || args.length % argCount !== 0) {\n onWarn?.(`path command \"${cmd}\" takes ${argCount} arguments at a time and has ${args.length}; the path ends before it`);\n break;\n }\n }\n\n return b.build();\n}\n\nfunction runCommand(\n upper: string,\n relative: boolean,\n a: number[],\n st: ParseState,\n b: PathBuilder,\n): void {\n const rx = relative ? st.x : 0;\n const ry = relative ? st.y : 0;\n switch (upper) {\n case 'M': {\n const x = a[0] + rx;\n const y = a[1] + ry;\n b.moveTo(x, y);\n st.x = x; st.y = y;\n st.startX = x; st.startY = y;\n st.lastCubicCtrl = null;\n st.lastQuadCtrl = null;\n return;\n }\n case 'L': {\n const x = a[0] + rx;\n const y = a[1] + ry;\n b.lineTo(x, y);\n st.x = x; st.y = y;\n st.lastCubicCtrl = null;\n st.lastQuadCtrl = null;\n return;\n }\n case 'H': {\n const x = a[0] + (relative ? st.x : 0);\n b.lineTo(x, st.y);\n st.x = x;\n st.lastCubicCtrl = null;\n st.lastQuadCtrl = null;\n return;\n }\n case 'V': {\n const y = a[0] + (relative ? st.y : 0);\n b.lineTo(st.x, y);\n st.y = y;\n st.lastCubicCtrl = null;\n st.lastQuadCtrl = null;\n return;\n }\n case 'C': {\n const x1 = a[0] + rx, y1 = a[1] + ry;\n const x2 = a[2] + rx, y2 = a[3] + ry;\n const x = a[4] + rx, y = a[5] + ry;\n b.curveTo(x1, y1, x2, y2, x, y);\n st.x = x; st.y = y;\n st.lastCubicCtrl = { x: x2, y: y2 };\n st.lastQuadCtrl = null;\n return;\n }\n case 'S': {\n // Reflect prior cubic ctrl about the current point; fall back to\n // current point when prior wasn't a cubic.\n const ref = st.lastCubicCtrl ?? { x: st.x, y: st.y };\n const x1 = 2 * st.x - ref.x;\n const y1 = 2 * st.y - ref.y;\n const x2 = a[0] + rx, y2 = a[1] + ry;\n const x = a[2] + rx, y = a[3] + ry;\n b.curveTo(x1, y1, x2, y2, x, y);\n st.x = x; st.y = y;\n st.lastCubicCtrl = { x: x2, y: y2 };\n st.lastQuadCtrl = null;\n return;\n }\n case 'Q': {\n const x1 = a[0] + rx, y1 = a[1] + ry;\n const x = a[2] + rx, y = a[3] + ry;\n b.quadTo(x1, y1, x, y);\n st.x = x; st.y = y;\n st.lastQuadCtrl = { x: x1, y: y1 };\n st.lastCubicCtrl = null;\n return;\n }\n case 'T': {\n const ref = st.lastQuadCtrl ?? { x: st.x, y: st.y };\n const x1 = 2 * st.x - ref.x;\n const y1 = 2 * st.y - ref.y;\n const x = a[0] + rx, y = a[1] + ry;\n b.quadTo(x1, y1, x, y);\n st.x = x; st.y = y;\n st.lastQuadCtrl = { x: x1, y: y1 };\n st.lastCubicCtrl = null;\n return;\n }\n case 'A': {\n const rxA = Math.abs(a[0]);\n const ryA = Math.abs(a[1]);\n const xRot = a[2];\n const largeArc = a[3] !== 0;\n const sweep = a[4] !== 0;\n const ex = a[5] + rx;\n const ey = a[6] + ry;\n arcToCubics(st.x, st.y, ex, ey, rxA, ryA, xRot, largeArc, sweep, b);\n st.x = ex; st.y = ey;\n st.lastCubicCtrl = null;\n st.lastQuadCtrl = null;\n return;\n }\n default:\n return;\n }\n}\n\n/**\n * Convert an SVG elliptical arc segment to a series of cubic Bezier\n * `curveTo` calls on the builder. Standard endpoint-parameterization\n * implementation (SVG spec appendix F.6.5):\n *\n * 1. Handle degenerate cases (zero radii → line; same endpoints → noop).\n * 2. Compute the implicit center, start/sweep angles.\n * 3. Split the sweep into ≤ 90° pieces; each piece becomes one cubic.\n */\nfunction arcToCubics(\n x1: number, y1: number,\n x2: number, y2: number,\n rx: number, ry: number,\n xAxisRotationDeg: number,\n largeArc: boolean,\n sweep: boolean,\n b: PathBuilder,\n): void {\n if (x1 === x2 && y1 === y2) return;\n if (rx === 0 || ry === 0) {\n b.lineTo(x2, y2);\n return;\n }\n const phi = (xAxisRotationDeg * Math.PI) / 180;\n const cosPhi = Math.cos(phi);\n const sinPhi = Math.sin(phi);\n\n // Step 1: compute (x1', y1') — rotate so x-axis aligns with ellipse axis.\n const dx = (x1 - x2) / 2;\n const dy = (y1 - y2) / 2;\n const x1p = cosPhi * dx + sinPhi * dy;\n const y1p = -sinPhi * dx + cosPhi * dy;\n\n // Correct radii if they're too small.\n let rxs = rx * rx;\n let rys = ry * ry;\n const x1ps = x1p * x1p;\n const y1ps = y1p * y1p;\n const lambda = x1ps / rxs + y1ps / rys;\n let rxFixed = rx;\n let ryFixed = ry;\n if (lambda > 1) {\n const sqrtLambda = Math.sqrt(lambda);\n rxFixed = sqrtLambda * rx;\n ryFixed = sqrtLambda * ry;\n rxs = rxFixed * rxFixed;\n rys = ryFixed * ryFixed;\n }\n\n // Step 2: center (cx', cy') in the rotated frame.\n const sign = largeArc === sweep ? -1 : 1;\n const num = rxs * rys - rxs * y1ps - rys * x1ps;\n const den = rxs * y1ps + rys * x1ps;\n const factor = sign * Math.sqrt(Math.max(0, num / den));\n const cxp = (factor * (rxFixed * y1p)) / ryFixed;\n const cyp = (factor * -(ryFixed * x1p)) / rxFixed;\n\n // Step 3: un-rotate the center back to user coords.\n const cx = cosPhi * cxp - sinPhi * cyp + (x1 + x2) / 2;\n const cy = sinPhi * cxp + cosPhi * cyp + (y1 + y2) / 2;\n\n // Step 4: start and sweep angles.\n const angle = (ux: number, uy: number, vx: number, vy: number): number => {\n const dot = ux * vx + uy * vy;\n const len = Math.sqrt((ux * ux + uy * uy) * (vx * vx + vy * vy));\n let a = Math.acos(Math.max(-1, Math.min(1, dot / len)));\n if (ux * vy - uy * vx < 0) a = -a;\n return a;\n };\n const theta1 = angle(1, 0, (x1p - cxp) / rxFixed, (y1p - cyp) / ryFixed);\n let dTheta = angle(\n (x1p - cxp) / rxFixed,\n (y1p - cyp) / ryFixed,\n (-x1p - cxp) / rxFixed,\n (-y1p - cyp) / ryFixed,\n );\n if (!sweep && dTheta > 0) dTheta -= 2 * Math.PI;\n else if (sweep && dTheta < 0) dTheta += 2 * Math.PI;\n\n // Step 5: split into ≤ 90° segments; emit a cubic per segment.\n const segCount = Math.max(1, Math.ceil(Math.abs(dTheta) / (Math.PI / 2)));\n const segAngle = dTheta / segCount;\n // Magic constant: cubic bezier handle length to approximate a circular\n // arc — for a segment of half-angle a, t = (4/3) * tan(a/2).\n const t = (4 / 3) * Math.tan(segAngle / 4);\n\n let prevX = x1;\n let prevY = y1;\n let prevDx = -Math.sin(theta1) * rxFixed;\n let prevDy = Math.cos(theta1) * ryFixed;\n\n for (let i = 1; i <= segCount; i++) {\n const theta = theta1 + i * segAngle;\n const cosT = Math.cos(theta);\n const sinT = Math.sin(theta);\n const px = cosPhi * (cosT * rxFixed) - sinPhi * (sinT * ryFixed) + cx;\n const py = sinPhi * (cosT * rxFixed) + cosPhi * (sinT * ryFixed) + cy;\n const dxNew = -sinT * rxFixed;\n const dyNew = cosT * ryFixed;\n const c1x = prevX + cosPhi * (t * prevDx) - sinPhi * (t * prevDy);\n const c1y = prevY + sinPhi * (t * prevDx) + cosPhi * (t * prevDy);\n const c2x = px - cosPhi * (t * dxNew) + sinPhi * (t * dyNew);\n const c2y = py - sinPhi * (t * dxNew) - cosPhi * (t * dyNew);\n b.curveTo(c1x, c1y, c2x, c2y, px, py);\n prevX = px;\n prevY = py;\n prevDx = dxNew;\n prevDy = dyNew;\n }\n}\n","/**\n * A station along a path: where it is at a fraction of its length, and which\n * way it is heading there.\n *\n * For anything positioned *along* geometry rather than beside it — a label on a\n * routed edge, a tick on a curve, a badge near an arrowhead. Curves are\n * flattened first, so the fraction is arc length along the drawn shape rather\n * than a curve parameter, which is what makes 0.5 look like the middle.\n */\nimport type { Point } from './cubicMath';\nimport type { Path } from '../path';\nimport { extractPolylines } from '../tessellate/polyline';\n\n/** The answer `pointAlongPath` gives: a point on the path and its heading there. */\nexport interface PathStation {\n point: Point;\n /** Unit vector along the path at `point`, pointing toward the end. */\n tangent: Point;\n}\n\n/** Options for `pointAlongPath`. */\nexport interface PointAlongPathOptions {\n /** Curve flattening tolerance, in world units. Default 0.5. */\n flattenTolerance?: number;\n}\n\n/**\n * Where `path` is at `t` of its total length, and its heading there.\n *\n * `t` is clamped to 0..1. Subpaths are measured in order and treated as one\n * run, the way a browser measures a whole `<path>`. Returns `null` for a path\n * with no points at all; a path of zero length answers at its single point,\n * heading along +X.\n */\nexport function pointAlongPath(\n path: Path,\n t: number,\n opts: PointAlongPathOptions = {},\n): PathStation | null {\n const polylines = extractPolylines(\n path,\n opts.flattenTolerance === undefined ? {} : { flattenTolerance: opts.flattenTolerance },\n );\n\n /** Every segment, in order, with the length it contributes. */\n const segments: { ax: number; ay: number; bx: number; by: number; len: number }[] = [];\n let total = 0;\n let first: Point | undefined;\n for (const pl of polylines) {\n const count = pl.points.length / 2;\n if (count === 0) continue;\n first ??= { x: pl.points[0]!, y: pl.points[1]! };\n const last = pl.closed ? count : count - 1;\n for (let i = 0; i < last; i++) {\n const j = (i + 1) % count;\n const ax = pl.points[i * 2]!;\n const ay = pl.points[i * 2 + 1]!;\n const bx = pl.points[j * 2]!;\n const by = pl.points[j * 2 + 1]!;\n const len = Math.hypot(bx - ax, by - ay);\n if (len === 0) continue;\n segments.push({ ax, ay, bx, by, len });\n total += len;\n }\n }\n\n if (first === undefined) return null;\n if (segments.length === 0) return { point: first, tangent: { x: 1, y: 0 } };\n\n const target = Math.min(Math.max(t, 0), 1) * total;\n let walked = 0;\n for (const seg of segments) {\n if (walked + seg.len < target) {\n walked += seg.len;\n continue;\n }\n const u = (target - walked) / seg.len;\n return {\n point: { x: seg.ax + (seg.bx - seg.ax) * u, y: seg.ay + (seg.by - seg.ay) * u },\n tangent: { x: (seg.bx - seg.ax) / seg.len, y: (seg.by - seg.ay) / seg.len },\n };\n }\n\n // Float drift can leave `target` a hair past the last segment.\n const last = segments[segments.length - 1]!;\n return {\n point: { x: last.bx, y: last.by },\n tangent: { x: (last.bx - last.ax) / last.len, y: (last.by - last.ay) / last.len },\n };\n}\n","/**\n * Pure-geometry distance from a point to a path's boundary (stroke), with\n * no fill-side logic. Used by pickers that want to know \"how close is this\n * click to the visible edge of the shape?\" Callers combine this with\n * `pathContainsPoint` from `pathHitTest.ts` to get a closed-region\n * pick distance (0 inside, stroke-distance outside).\n *\n * A polygon path defers to geom's `nearestOnPath`; a RectPath short-circuits\n * to AABB-perimeter math.\n */\n\nimport { nearestOnPath } from '../nearest';\nimport type { Path } from '../path';\n\n/** Distance from (px, py) to the perimeter of an axis-aligned rectangle.\n * Returns 0 if the point is on the perimeter; positive value outside or\n * inside (distance to the nearest edge). */\nfunction pointToRectPerimeterDist(\n px: number, py: number,\n rx: number, ry: number, rw: number, rh: number,\n): number {\n // Distance to the rect as a region: 0 if inside, else Euclidean distance\n // to the AABB. For interior points, return distance to the closest edge.\n const dx = Math.max(rx - px, px - (rx + rw), 0);\n const dy = Math.max(ry - py, py - (ry + rh), 0);\n if (dx > 0 || dy > 0) return Math.hypot(dx, dy);\n // Inside: distance to closest edge.\n const left = px - rx, right = rx + rw - px;\n const top = py - ry, bottom = ry + rh - py;\n return Math.min(left, right, top, bottom);\n}\n\n/** Closest Euclidean distance from (px, py) to the boundary of `path`.\n * Pure stroke distance — does *not* consult fill rule or interior. For\n * closed-region pick distance (\"0 inside, stroke-distance outside\"),\n * combine with `pathContainsPoint` at the call site. */\nexport function pathDistanceToPoint(path: Path, px: number, py: number): number {\n if (path.kind === 'rect') {\n return pointToRectPerimeterDist(px, py, path.x, path.y, path.width, path.height);\n }\n return nearestOnPath(path.commands, path.coords, px, py)?.dist ?? Infinity;\n}\n","import { PathBuilder } from './builder';\nimport { cubicPointAt, type Point } from './cubicMath';\nimport type { PolygonPath } from '../path';\n\n/**\n * Schneider (1990, Graphics Gems I) adaptive cubic-Bezier fitter.\n * Given a sequence of sample points, returns a `PolygonPath` whose `C`\n * segments approximate the samples within `errorTolerance` world units.\n *\n * Output shape: an initial `M` to the first sample, followed by N\n * `C` cubic segments. For colinear / two-point inputs, returns a single\n * degenerate cubic. For empty input, returns an empty polygon path.\n */\nexport function schneiderFit(\n samples: ReadonlyArray<Point>,\n errorTolerance: number,\n): PolygonPath {\n if (samples.length === 0) {\n return {\n kind: 'polygon',\n commands: new Uint8Array(),\n coords: new Float32Array(),\n fillRule: 'nonzero',\n };\n }\n\n const b = new PathBuilder();\n b.moveTo(samples[0].x, samples[0].y);\n\n if (samples.length === 1) {\n return b.build();\n }\n\n if (samples.length === 2) {\n emitStraightCubic(b, samples[0], samples[1]);\n return b.build();\n }\n\n fitRecursive(samples, errorTolerance, b);\n return b.build();\n}\n\nfunction fitRecursive(\n samples: ReadonlyArray<Point>,\n errorTolerance: number,\n b: PathBuilder,\n): void {\n if (samples.length === 2) {\n const fit = fitOneCubic(samples);\n b.curveTo(fit.cp1.x, fit.cp1.y, fit.cp2.x, fit.cp2.y, fit.end.x, fit.end.y);\n return;\n }\n const fit = fitOneCubic(samples);\n const { worstIndex, worstError } = measureError(samples, fit);\n if (worstError <= errorTolerance * errorTolerance) {\n b.curveTo(fit.cp1.x, fit.cp1.y, fit.cp2.x, fit.cp2.y, fit.end.x, fit.end.y);\n return;\n }\n // Split. Both halves include the split sample so endpoints meet.\n const left = samples.slice(0, worstIndex + 1);\n const right = samples.slice(worstIndex);\n fitRecursive(left, errorTolerance, b);\n fitRecursive(right, errorTolerance, b);\n}\n\nfunction measureError(\n samples: ReadonlyArray<Point>,\n fit: CubicFit,\n): { worstIndex: number; worstError: number } {\n let worstIndex = 1;\n let worstError = 0;\n const a = samples[0];\n for (let i = 1; i < samples.length - 1; i++) {\n const q = cubicPointAt(a, fit.cp1, fit.cp2, fit.end, fit.ts[i]);\n const dx = samples[i].x - q.x;\n const dy = samples[i].y - q.y;\n const sq = dx * dx + dy * dy;\n if (sq > worstError) {\n worstError = sq;\n worstIndex = i;\n }\n }\n return { worstIndex, worstError };\n}\n\ninterface CubicFit {\n cp1: Point;\n cp2: Point;\n end: Point;\n /** The curve parameter each sample was fitted at: where its error is measured. */\n ts: ReadonlyArray<number>;\n}\n\nfunction fitOneCubic(samples: ReadonlyArray<Point>): CubicFit {\n const n = samples.length;\n const a = samples[0];\n const e = samples[n - 1];\n const tStart = unit(sub(samples[1], a));\n const tEnd = unit(sub(samples[n - 2], e));\n\n const ts = chordLengthParam(samples);\n if (ts === null) return { cp1: { ...a }, cp2: { ...e }, end: e, ts: samples.map(() => 0) };\n\n let fit = solveLS(samples, ts, a, e, tStart, tEnd);\n for (let pass = 0; pass < 4; pass++) {\n reparameterize(samples, ts, a, e, fit);\n fit = solveLS(samples, ts, a, e, tStart, tEnd);\n }\n return fit;\n}\n\nfunction chordLengthParam(samples: ReadonlyArray<Point>): number[] | null {\n const n = samples.length;\n const ts = new Array<number>(n);\n ts[0] = 0;\n let total = 0;\n for (let i = 1; i < n; i++) {\n total += dist(samples[i - 1], samples[i]);\n ts[i] = total;\n }\n if (total === 0) return null;\n for (let i = 0; i < n; i++) ts[i] /= total;\n return ts;\n}\n\nfunction solveLS(\n samples: ReadonlyArray<Point>,\n ts: ReadonlyArray<number>,\n a: Point,\n e: Point,\n tStart: Point,\n tEnd: Point,\n): CubicFit {\n const n = samples.length;\n let c11 = 0, c12 = 0, c22 = 0, x1 = 0, x2 = 0;\n for (let i = 0; i < n; i++) {\n const t = ts[i];\n const u = 1 - t;\n const b0 = u * u * u;\n const b1 = 3 * u * u * t;\n const b2 = 3 * u * t * t;\n const b3 = t * t * t;\n const A1x = b1 * tStart.x;\n const A1y = b1 * tStart.y;\n const A2x = b2 * tEnd.x;\n const A2y = b2 * tEnd.y;\n c11 += A1x * A1x + A1y * A1y;\n c12 += A1x * A2x + A1y * A2y;\n c22 += A2x * A2x + A2y * A2y;\n const targetX = samples[i].x - (b0 + b1) * a.x - (b2 + b3) * e.x;\n const targetY = samples[i].y - (b0 + b1) * a.y - (b2 + b3) * e.y;\n x1 += A1x * targetX + A1y * targetY;\n x2 += A2x * targetX + A2y * targetY;\n }\n const det = c11 * c22 - c12 * c12;\n let alpha1: number;\n let alpha2: number;\n if (Math.abs(det) < 1e-12) {\n const chord = dist(a, e);\n alpha1 = alpha2 = chord / 3;\n } else {\n alpha1 = (c22 * x1 - c12 * x2) / det;\n alpha2 = (c11 * x2 - c12 * x1) / det;\n if (alpha1 < 1e-6 || alpha2 < 1e-6) {\n const chord = dist(a, e);\n alpha1 = alpha2 = chord / 3;\n }\n }\n return {\n cp1: { x: a.x + tStart.x * alpha1, y: a.y + tStart.y * alpha1 },\n cp2: { x: e.x + tEnd.x * alpha2, y: e.y + tEnd.y * alpha2 },\n end: e,\n ts,\n };\n}\n\nfunction reparameterize(\n samples: ReadonlyArray<Point>,\n ts: number[],\n a: Point,\n e: Point,\n fit: CubicFit,\n): void {\n void a; void e;\n for (let i = 1; i < samples.length - 1; i++) {\n ts[i] = newtonRefineT(samples[i], ts[i], samples[0], fit.cp1, fit.cp2, samples[samples.length - 1]);\n }\n}\n\nfunction newtonRefineT(\n p: Point,\n t: number,\n p0: Point,\n p1: Point,\n p2: Point,\n p3: Point,\n): number {\n // Q(t) - p, where Q is the cubic. Newton step uses Q'(t)·(Q(t)-p) and\n // a second-derivative correction.\n const u = 1 - t;\n const { x: qx, y: qy } = cubicPointAt(p0, p1, p2, p3, t);\n const qpx = 3*u*u*(p1.x - p0.x) + 6*u*t*(p2.x - p1.x) + 3*t*t*(p3.x - p2.x);\n const qpy = 3*u*u*(p1.y - p0.y) + 6*u*t*(p2.y - p1.y) + 3*t*t*(p3.y - p2.y);\n const qppx = 6*u*(p2.x - 2*p1.x + p0.x) + 6*t*(p3.x - 2*p2.x + p1.x);\n const qppy = 6*u*(p2.y - 2*p1.y + p0.y) + 6*t*(p3.y - 2*p2.y + p1.y);\n const dx = qx - p.x;\n const dy = qy - p.y;\n const numerator = dx * qpx + dy * qpy;\n const denominator = qpx * qpx + qpy * qpy + dx * qppx + dy * qppy;\n if (Math.abs(denominator) < 1e-12) return t;\n const next = t - numerator / denominator;\n if (next < 0) return 0;\n if (next > 1) return 1;\n return next;\n}\n\nfunction sub(a: Point, b: Point): Point {\n return { x: a.x - b.x, y: a.y - b.y };\n}\nfunction dist(a: Point, b: Point): number {\n return Math.hypot(a.x - b.x, a.y - b.y);\n}\nfunction unit(v: Point): Point {\n const m = Math.hypot(v.x, v.y);\n if (m === 0) return { x: 0, y: 0 };\n return { x: v.x / m, y: v.y / m };\n}\n\nfunction emitStraightCubic(\n b: PathBuilder,\n a: Point,\n c: Point,\n): void {\n // cp1 at 1/3 along chord, cp2 at 2/3 — the canonical straight cubic.\n const cp1x = a.x + (c.x - a.x) / 3;\n const cp1y = a.y + (c.y - a.y) / 3;\n const cp2x = a.x + (2 * (c.x - a.x)) / 3;\n const cp2y = a.y + (2 * (c.y - a.y)) / 3;\n b.curveTo(cp1x, cp1y, cp2x, cp2y, c.x, c.y);\n}\n","/**\n * Is a point within `px` screen pixels of a world-space stroke band?\n *\n * The band is a capsule of radius `r` around each segment, in the frame the\n * path lives in; `m` is the linear part of that frame's map to the screen.\n * Under a similarity the answer is a plain world distance, `r + px / scale`.\n * Under anything else the capsule lands on screen as a parallelogram capped by\n * two ellipses, and the pixel slop has to be measured against that shape:\n * neither a scalar nor a per-axis world tolerance describes it.\n */\nimport { pointSegmentDist2 } from './polyline';\n\n/** Linear part of a map to the screen: `x' = a·x + c·y`, `y' = b·x + d·y`. */\nexport interface Linear2 {\n a: number; b: number; c: number; d: number;\n}\n\n/** A linear map's singular decomposition, as much of it as the band test\n * needs: the two stretch factors, and the screen-space angle of the first. */\nexport interface Stretch {\n s1: number;\n s2: number;\n /** Angle of the first singular direction on screen. */\n phi: number;\n}\n\nexport function stretchOf(m: Linear2): Stretch {\n // Closed-form 2×2 SVD. M = R(phi) · diag(Q + R, Q − R) · R(theta).\n const e = (m.a + m.d) / 2;\n const f = (m.a - m.d) / 2;\n const g = (m.b + m.c) / 2;\n const h = (m.b - m.c) / 2;\n const q = Math.hypot(e, h);\n const r = Math.hypot(f, g);\n const phi = (Math.atan2(h, e) + Math.atan2(g, f)) / 2;\n return { s1: q + r, s2: Math.abs(q - r), phi };\n}\n\n/** True when the map scales every direction alike, so a screen length is one\n * world length. */\nexport function isSimilarity(s: Stretch): boolean {\n return s.s1 - s.s2 <= 1e-9 * s.s1;\n}\n\n/**\n * Screen point `(px0, py0)` against the image of one world capsule\n * `(ax, ay)–(bx, by)`, radius `r`, grown by `slop` pixels. `m`/`st` map world\n * to screen (linear part only — every point shares the translation).\n */\nexport function capsuleWithinPx(\n px0: number, py0: number,\n ax: number, ay: number, bx: number, by: number,\n r: number, slop: number,\n m: Linear2, st: Stretch,\n): boolean {\n const sax = m.a * ax + m.c * ay, say = m.b * ax + m.d * ay;\n const sbx = m.a * bx + m.c * by, sby = m.b * bx + m.d * by;\n const slop2 = slop * slop;\n const dCenter2 = pointSegmentDist2(px0, py0, sax, say, sbx, sby);\n if (dCenter2 <= slop2) return true;\n if (r <= 0) return false;\n // Nothing in the band is farther from the centerline than r·s1 on screen.\n const reach = slop + r * st.s1;\n if (dCenter2 > reach * reach) return false;\n\n // The parallelogram: the capsule's straight part, carried to the screen.\n const wx = bx - ax, wy = by - ay;\n const wl = Math.hypot(wx, wy);\n if (wl > 0) {\n const nx = (-wy / wl) * r, ny = (wx / wl) * r;\n const ox = m.a * nx + m.c * ny, oy = m.b * nx + m.d * ny;\n if (quadWithinPx(px0, py0, [\n sax + ox, say + oy, sbx + ox, sby + oy,\n sbx - ox, sby - oy, sax - ox, say - oy,\n ], slop2)) return true;\n }\n // The round caps: each end's disk lands on screen as an ellipse.\n return ellipseWithinPx(px0 - sax, py0 - say, r, slop, st)\n || ellipseWithinPx(px0 - sbx, py0 - sby, r, slop, st);\n}\n\n/** Inside a convex quad, or within `sqrt(slop2)` of one of its edges. */\nfunction quadWithinPx(x: number, y: number, q: readonly number[], slop2: number): boolean {\n let pos = 0, neg = 0;\n for (let i = 0; i < 8; i += 2) {\n const j = (i + 2) % 8;\n const cr = (q[j] - q[i]) * (y - q[i + 1]) - (q[j + 1] - q[i + 1]) * (x - q[i]);\n if (cr > 0) pos++;\n else if (cr < 0) neg++;\n }\n if (pos === 0 || neg === 0) return true;\n for (let i = 0; i < 8; i += 2) {\n const j = (i + 2) % 8;\n if (pointSegmentDist2(x, y, q[i], q[i + 1], q[j], q[j + 1]) <= slop2) return true;\n }\n return false;\n}\n\n/** `(dx, dy)` from the center of the filled ellipse `M(disk r)`, within `slop`? */\nfunction ellipseWithinPx(dx: number, dy: number, r: number, slop: number, st: Stretch): boolean {\n const cos = Math.cos(st.phi), sin = Math.sin(st.phi);\n const u = Math.abs(cos * dx + sin * dy);\n const v = Math.abs(-sin * dx + cos * dy);\n const e0 = r * st.s1, e1 = r * st.s2;\n if (e1 <= 0) {\n // Collapsed to a segment along the first axis.\n const over = Math.max(0, u - e0);\n return over * over + v * v <= slop * slop;\n }\n return distToEllipse(e0, e1, u, v) <= slop;\n}\n\n/**\n * Distance from `(y0, y1)`, first quadrant, to the filled axis-aligned ellipse\n * with semi-axes `e0 >= e1 > 0`. Eberly, \"Distance from a Point to an\n * Ellipse\" — bisection on the Lagrange root, robust near the axes.\n */\nfunction distToEllipse(e0: number, e1: number, y0: number, y1: number): number {\n const z0 = y0 / e0, z1 = y1 / e1;\n const g = z0 * z0 + z1 * z1 - 1;\n if (g <= 0) return 0;\n if (y1 > 0) {\n if (y0 > 0) {\n const r0 = (e0 / e1) * (e0 / e1);\n const n0 = r0 * z0;\n let s0 = z1 - 1;\n let s1 = Math.hypot(n0, z1) - 1;\n let s = 0;\n for (let i = 0; i < 100; i++) {\n s = (s0 + s1) / 2;\n if (s === s0 || s === s1) break;\n const a = n0 / (s + r0), b = z1 / (s + 1);\n const gs = a * a + b * b - 1;\n if (gs > 0) s0 = s;\n else if (gs < 0) s1 = s;\n else break;\n }\n const x0 = (r0 * y0) / (s + r0);\n const x1 = y1 / (s + 1);\n return Math.hypot(x0 - y0, x1 - y1);\n }\n return y1 - e1;\n }\n const numer = e0 * y0, denom = e0 * e0 - e1 * e1;\n if (numer < denom) {\n const t = numer / denom;\n const x0 = e0 * t, x1 = e1 * Math.sqrt(1 - t * t);\n return Math.hypot(x0 - y0, x1);\n }\n return y0 - e0;\n}\n","/**\n * Path hit-testing: path-vs-point (filled region and stroke distance),\n * path-vs-rect, and path-vs-polygon in both directions.\n *\n * A `rect` path short-circuits to AABB arithmetic. A `polygon` path is its\n * filled region: beziers are flattened, `fillRule` is honored (default\n * `nonzero`), and every closed subpath counts — the hole of a donut is not\n * part of the shape under `evenodd`. Open subpaths enclose no area, so the\n * filled-region tests ignore them.\n */\n\nimport { forEachSegment, PATH_C, PATH_L, PATH_M, PATH_Q, PATH_Z } from './commands';\nimport { DEFAULT_FLATTEN_TOLERANCE, flattenCubic, flattenQuadratic } from './flatten';\nimport { pointInPolygon, pointSegmentDist2, segmentsCross } from './polyline';\nimport type { Rect } from './box';\nimport type { Path, PolygonPath } from './path';\nimport type { Mat3 } from './mat3';\nimport { capsuleWithinPx, isSimilarity, stretchOf, type Linear2 } from './screenBand';\n\ntype XY = { x: number; y: number };\n\n/** Options for the path hit-tests. */\nexport interface PointInPathOptions {\n /** Bezier flattening tolerance in world units. Default 0.5. */\n tolerance?: number;\n}\n\n/** Options for {@link strokeHitTest}. */\nexport interface StrokeHitTestOptions {\n /** Bezier flattening tolerance in world units. Default 0.5. */\n tolerance?: number;\n /** Extra reach past the band measured in screen pixels rather than world\n * units: `px` pixels, after `transform` carries the path's frame to the\n * screen (only its linear part matters). A pointer's forgiveness is a\n * screen distance, and under a non-uniform or rotated-then-squished\n * transform no world distance equals it. */\n slop?: { px: number; transform: Mat3 };\n}\n\n// ─── Flattening ─────────────────────────────────────────────────────────────\n\n/**\n * `path` flattened to interleaved `[x, y, …]` runs, sorted by whether each\n * subpath encloses area. A `Z` closing fewer than three points yields an open\n * run, as does any subpath a `Z` never ends. The closing edge of a closed run\n * back to its first vertex is implicit.\n */\nfunction flatSubpaths(\n path: PolygonPath,\n tolerance: number,\n): { closed: number[][]; open: number[][] } {\n const { commands, coords } = path;\n const closed: number[][] = [];\n const open: number[][] = [];\n let sub: number[] = [];\n\n forEachSegment(commands, coords, (cmd, ci, curX, curY, _i, opensSubpath) => {\n if (opensSubpath) sub = [curX, curY];\n switch (cmd) {\n case PATH_M:\n if (sub.length >= 2) open.push(sub);\n sub = [coords[ci], coords[ci + 1]];\n break;\n case PATH_L:\n sub.push(coords[ci], coords[ci + 1]);\n break;\n case PATH_C:\n flattenCubic(\n curX, curY,\n coords[ci], coords[ci + 1],\n coords[ci + 2], coords[ci + 3],\n coords[ci + 4], coords[ci + 5],\n tolerance, sub,\n );\n break;\n case PATH_Q:\n flattenQuadratic(\n curX, curY,\n coords[ci], coords[ci + 1],\n coords[ci + 2], coords[ci + 3],\n tolerance, sub,\n );\n break;\n case PATH_Z:\n if (sub.length >= 6) closed.push(sub);\n else if (sub.length >= 2) open.push(sub);\n sub = [];\n break;\n default:\n throw new Error(`pathHitTest: unknown command ${cmd}`);\n }\n });\n if (sub.length >= 2) open.push(sub);\n return { closed, open };\n}\n\nfunction closedSubpaths(path: PolygonPath, opts: PointInPathOptions): number[][] {\n return flatSubpaths(path, opts.tolerance ?? DEFAULT_FLATTEN_TOLERANCE).closed;\n}\n\n// ─── Point vs path ──────────────────────────────────────────────────────────\n\n/** Filled-region hit-test for a path. Rect short-circuits to AABB; polygons run ray-cast / winding per `fillRule`. */\nexport function pointInPath(\n path: Path,\n x: number,\n y: number,\n opts: PointInPathOptions = {},\n): boolean {\n if (path.kind === 'rect') {\n return x >= path.x && x <= path.x + path.width && y >= path.y && y <= path.y + path.height;\n }\n let crossings = 0;\n let winding = 0;\n for (const sub of closedSubpaths(path, opts)) {\n const n = sub.length;\n for (let i = 0; i < n; i += 2) {\n const j = (i + 2) % n;\n const ay = sub[i + 1], by = sub[j + 1];\n if ((ay > y) === (by > y)) continue;\n const ax = sub[i], bx = sub[j];\n if (x >= ax + ((y - ay) / (by - ay)) * (bx - ax)) continue;\n crossings++;\n winding += ay <= y ? 1 : -1;\n }\n }\n return path.fillRule === 'evenodd' ? (crossings & 1) === 1 : winding !== 0;\n}\n\n/**\n * Stroke-distance hit-test. True when (x, y) lies within `threshold` world\n * units of the path's outline — when a stroke of total width `2 * threshold`\n * drawn along the path would cover the point. Works for open and closed\n * subpaths alike; OR it with {@link pointInPath} for fill-plus-stroke picking.\n * Every flattened segment is treated as a capsule of radius `threshold`.\n */\nexport function strokeHitTest(\n path: Path,\n x: number,\n y: number,\n threshold: number,\n opts: StrokeHitTestOptions = {},\n): boolean {\n const slop = opts.slop;\n if (slop && slop.px > 0) {\n const [a, b, c, d] = slop.transform;\n const m: Linear2 = { a, b, c, d };\n const st = stretchOf(m);\n // A view collapsed to a point shows nothing to hit, and a pixel there is no world length.\n if (st.s1 === 0) return false;\n if (isSimilarity(st)) {\n return strokeHitTest(path, x, y, threshold + slop.px / st.s1, { tolerance: opts.tolerance });\n }\n const sx = a * x + c * y, sy = b * x + d * y;\n return someSegment(path, opts.tolerance, (ax, ay, bx, by) =>\n capsuleWithinPx(sx, sy, ax, ay, bx, by, threshold, slop.px, m, st));\n }\n const t2 = threshold * threshold;\n return someSegment(path, opts.tolerance, (ax, ay, bx, by) =>\n pointSegmentDist2(x, y, ax, ay, bx, by) <= t2);\n}\n\n/** Does `visit` answer true for any outline segment — every edge of a rect,\n * closing edges of closed subpaths included? */\nfunction someSegment(\n path: Path,\n tolerance: number | undefined,\n visit: (ax: number, ay: number, bx: number, by: number) => boolean,\n): boolean {\n if (path.kind === 'rect') {\n const { x: rx, y: ry, width: w, height: h } = path;\n return visit(rx, ry, rx + w, ry) || visit(rx + w, ry, rx + w, ry + h)\n || visit(rx + w, ry + h, rx, ry + h) || visit(rx, ry + h, rx, ry);\n }\n const { closed, open } = flatSubpaths(path, tolerance ?? DEFAULT_FLATTEN_TOLERANCE);\n const run = (sub: readonly number[], wrap: boolean): boolean => {\n const n = sub.length;\n const last = wrap ? n : n - 2;\n for (let i = 0; i < last; i += 2) {\n const j = (i + 2) % n;\n if (visit(sub[i], sub[i + 1], sub[j], sub[j + 1])) return true;\n }\n return false;\n };\n return closed.some((sub) => run(sub, true)) || open.some((sub) => run(sub, false));\n}\n\n// ─── Region vs path ─────────────────────────────────────────────────────────\n\nfunction rectToVerts(r: Rect): XY[] {\n return [\n { x: r.x, y: r.y },\n { x: r.x + r.width, y: r.y },\n { x: r.x + r.width, y: r.y + r.height },\n { x: r.x, y: r.y + r.height },\n ];\n}\n\n/** Flatten a vertex array into an interleaved [x0,y0,x1,y1,...] array. */\nfunction flattenVerts(poly: readonly XY[]): number[] {\n const flat: number[] = new Array(poly.length * 2);\n for (let i = 0; i < poly.length; i++) {\n flat[i * 2] = poly[i].x;\n flat[i * 2 + 1] = poly[i].y;\n }\n return flat;\n}\n\n/** Edge-vs-edge segment intersection check between two closed polygons. */\nfunction polygonsIntersect(a: readonly XY[], b: readonly XY[]): boolean {\n if (a.length === 0 || b.length === 0) return false;\n if (pointInPolygon(flattenVerts(a), b[0].x, b[0].y)) return true;\n if (pointInPolygon(flattenVerts(b), a[0].x, a[0].y)) return true;\n for (let i = 0; i < a.length; i++) {\n const a0 = a[i], a1 = a[(i + 1) % a.length];\n for (let j = 0; j < b.length; j++) {\n const b0 = b[j], b1 = b[(j + 1) % b.length];\n if (segmentsCross(a0.x, a0.y, a1.x, a1.y, b0.x, b0.y, b1.x, b1.y)) return true;\n }\n }\n return false;\n}\n\n/** Run `visit` over every edge of every closed subpath until it answers true. */\nfunction anyEdge(\n subpaths: readonly number[][],\n visit: (ax: number, ay: number, bx: number, by: number) => boolean,\n): boolean {\n for (const sub of subpaths) {\n const n = sub.length;\n for (let i = 0; i < n; i += 2) {\n const j = (i + 2) % n;\n if (visit(sub[i], sub[i + 1], sub[j], sub[j + 1])) return true;\n }\n }\n return false;\n}\n\nfunction anyEdgeCrossesRect(subpaths: readonly number[][], r: Rect): boolean {\n const x0 = r.x, y0 = r.y, x1 = r.x + r.width, y1 = r.y + r.height;\n return anyEdge(subpaths, (ax, ay, bx, by) =>\n segmentsCross(ax, ay, bx, by, x0, y0, x1, y0) ||\n segmentsCross(ax, ay, bx, by, x1, y0, x1, y1) ||\n segmentsCross(ax, ay, bx, by, x1, y1, x0, y1) ||\n segmentsCross(ax, ay, bx, by, x0, y1, x0, y0),\n );\n}\n\nfunction anyEdgeCrossesPolygon(subpaths: readonly number[][], poly: readonly XY[]): boolean {\n if (poly.length === 0) return false;\n return anyEdge(subpaths, (ax, ay, bx, by) => {\n for (let i = 0; i < poly.length; i++) {\n const p0 = poly[i], p1 = poly[(i + 1) % poly.length];\n if (segmentsCross(ax, ay, bx, by, p0.x, p0.y, p1.x, p1.y)) return true;\n }\n return false;\n });\n}\n\n/** `anyEdgeCrossesPolygon` for open runs: no edge back to the first vertex. */\nfunction anyOpenEdgeCrossesPolygon(runs: readonly number[][], poly: readonly XY[]): boolean {\n for (const run of runs) {\n for (let i = 0; i + 3 < run.length; i += 2) {\n const ax = run[i], ay = run[i + 1], bx = run[i + 2], by = run[i + 3];\n for (let k = 0; k < poly.length; k++) {\n const p0 = poly[k], p1 = poly[(k + 1) % poly.length];\n if (segmentsCross(ax, ay, bx, by, p0.x, p0.y, p1.x, p1.y)) return true;\n }\n }\n }\n return false;\n}\n\nfunction anyVertexInRect(subpaths: readonly number[][], r: Rect): boolean {\n for (const sub of subpaths) {\n for (let i = 0; i < sub.length; i += 2) {\n const x = sub[i], y = sub[i + 1];\n if (x >= r.x && x <= r.x + r.width && y >= r.y && y <= r.y + r.height) return true;\n }\n }\n return false;\n}\n\nfunction anyVertexInPolygon(subpaths: readonly number[][], flatPoly: readonly number[]): boolean {\n for (const sub of subpaths) {\n for (let i = 0; i < sub.length; i += 2) {\n if (pointInPolygon(flatPoly, sub[i], sub[i + 1])) return true;\n }\n }\n return false;\n}\n\n/** Returns true if (x, y) lies within the filled region of `path`. */\nexport function pathContainsPoint(\n path: Path,\n x: number,\n y: number,\n opts: PointInPathOptions = {},\n): boolean {\n return pointInPath(path, x, y, opts);\n}\n\n/** Returns true if `rect` is entirely contained within `path`. */\nexport function pathContainsRect(path: Path, rect: Rect, opts: PointInPathOptions = {}): boolean {\n if (path.kind === 'rect') {\n return (\n rect.x >= path.x &&\n rect.y >= path.y &&\n rect.x + rect.width <= path.x + path.width &&\n rect.y + rect.height <= path.y + path.height\n );\n }\n const subpaths = closedSubpaths(path, opts);\n if (subpaths.length === 0) return false;\n for (const c of rectToVerts(rect)) {\n if (!pointInPath(path, c.x, c.y, opts)) return false;\n }\n // Every corner is filled, but any contour reaching into the rect — the\n // boundary of a hole, or a concave notch — leaves part of it unfilled.\n return !anyVertexInRect(subpaths, rect) && !anyEdgeCrossesRect(subpaths, rect);\n}\n\n/** Returns true if `rect` overlaps (intersects or contains) `path`. */\nexport function pathIntersectsRect(path: Path, rect: Rect, opts: PointInPathOptions = {}): boolean {\n if (path.kind === 'rect') {\n return (\n rect.x < path.x + path.width &&\n rect.x + rect.width > path.x &&\n rect.y < path.y + path.height &&\n rect.y + rect.height > path.y\n );\n }\n const subpaths = closedSubpaths(path, opts);\n if (subpaths.length === 0) return false;\n for (const c of rectToVerts(rect)) {\n if (pointInPath(path, c.x, c.y, opts)) return true;\n }\n if (anyVertexInRect(subpaths, rect)) return true;\n return anyEdgeCrossesRect(subpaths, rect);\n}\n\n/** Returns true if every vertex of `polygon` lies inside `path`. */\nexport function pathContainsPolygon(\n path: Path,\n polygon: readonly XY[],\n opts: PointInPathOptions = {},\n): boolean {\n if (polygon.length === 0) return false;\n if (path.kind === 'rect') {\n return polygon.every(\n (p) =>\n p.x >= path.x &&\n p.x <= path.x + path.width &&\n p.y >= path.y &&\n p.y <= path.y + path.height,\n );\n }\n const subpaths = closedSubpaths(path, opts);\n if (subpaths.length === 0) return false;\n for (const p of polygon) {\n if (!pointInPath(path, p.x, p.y, opts)) return false;\n }\n return !anyVertexInPolygon(subpaths, flattenVerts(polygon)) &&\n !anyEdgeCrossesPolygon(subpaths, polygon);\n}\n\n/** Returns true if `polygon` overlaps (intersects or is contained by) `path`. */\nexport function pathIntersectsPolygon(\n path: Path,\n polygon: readonly XY[],\n opts: PointInPathOptions = {},\n): boolean {\n if (polygon.length === 0) return false;\n if (path.kind === 'rect') {\n return polygonsIntersect(rectToVerts(path), polygon);\n }\n const subpaths = closedSubpaths(path, opts);\n if (subpaths.length === 0) return false;\n for (const p of polygon) {\n if (pointInPath(path, p.x, p.y, opts)) return true;\n }\n if (anyVertexInPolygon(subpaths, flattenVerts(polygon))) return true;\n return anyEdgeCrossesPolygon(subpaths, polygon);\n}\n\n/**\n * Returns true if all of `path` — every subpath, open ones included, beziers\n * flattened — lies inside the closed `polygon`: the inverse of\n * {@link pathContainsPolygon}. A lasso enclosing a shape asks this.\n */\nexport function polygonContainsPath(\n polygon: readonly XY[],\n path: Path,\n opts: PointInPathOptions = {},\n): boolean {\n if (polygon.length < 3) return false;\n let subpaths: number[][];\n if (path.kind === 'rect') {\n subpaths = [flattenVerts(rectToVerts(path))];\n } else {\n const { closed, open } = flatSubpaths(path, opts.tolerance ?? DEFAULT_FLATTEN_TOLERANCE);\n subpaths = [...closed, ...open];\n }\n if (subpaths.length === 0) return false;\n const flatPoly = flattenVerts(polygon);\n for (const sub of subpaths) {\n for (let i = 0; i < sub.length; i += 2) {\n if (!pointInPolygon(flatPoly, sub[i], sub[i + 1])) return false;\n }\n }\n // Every vertex is inside, but a concave polygon can still cut an edge. An\n // open subpath is checked as if closed, so this can only err toward false.\n return !anyEdgeCrossesPolygon(subpaths, polygon);\n}\n\n/**\n * Returns true if any of `path` meets the closed `polygon`: its filled region,\n * or the line of an open subpath, which encloses nothing. Beziers are\n * flattened, so a control point off the curve never counts. The companion of\n * {@link polygonContainsPath}; a lasso touching a shape asks this.\n */\nexport function polygonIntersectsPath(\n polygon: readonly XY[],\n path: Path,\n opts: PointInPathOptions = {},\n): boolean {\n if (polygon.length < 3) return false;\n if (path.kind === 'rect') return polygonsIntersect(rectToVerts(path), polygon);\n const { closed, open } = flatSubpaths(path, opts.tolerance ?? DEFAULT_FLATTEN_TOLERANCE);\n const flatPoly = flattenVerts(polygon);\n if (anyVertexInPolygon(closed, flatPoly) || anyVertexInPolygon(open, flatPoly)) return true;\n if (anyEdgeCrossesPolygon(closed, polygon) || anyOpenEdgeCrossesPolygon(open, polygon)) {\n return true;\n }\n // No vertex inside and no crossing: the polygon lies wholly in one region\n // of the path, so one of its vertices decides whether that region is filled.\n return closed.length > 0 && pointInPath(path, polygon[0].x, polygon[0].y, opts);\n}\n","import type { Rect } from './box';\n\n/** Which side of the anchor the overlay sits on. */\nexport type PlacementSide = 'top' | 'bottom' | 'left' | 'right';\n\n/** How the overlay lines up along the side it sits on. */\nexport type PlacementAlign = 'start' | 'center' | 'end';\n\n/** A side paired with an alignment along it. */\nexport interface Placement {\n side: PlacementSide;\n align: PlacementAlign;\n}\n\n/** Inputs to {@link placeRect}. All rects share one coordinate space. */\nexport interface PlaceRectOptions {\n anchor: Rect;\n overlay: { width: number; height: number };\n boundary: Rect;\n placement: Placement;\n /** Gap between anchor and overlay along the side axis. Default 0. */\n offset?: number;\n /** Shift along the alignment axis. Default 0. */\n crossOffset?: number;\n /** Minimum gap kept between the overlay and the boundary. Default 0. */\n padding?: number;\n /** Whether to try the opposite side when the preferred one lacks room. Default true. */\n flip?: boolean;\n}\n\n/** Where the overlay landed, and the placement that produced it. */\nexport interface PlacedRect {\n rect: Rect;\n placement: Placement;\n}\n\nfunction alignAlong(start: number, extent: number, size: number, align: PlacementAlign): number {\n if (align === 'start') return start;\n if (align === 'end') return start + extent - size;\n return start + (extent - size) / 2;\n}\n\nfunction positionOn(\n anchor: Rect,\n overlay: { width: number; height: number },\n placement: Placement,\n offset: number,\n crossOffset: number,\n): Rect {\n const { width, height } = overlay;\n const { side, align } = placement;\n if (side === 'top' || side === 'bottom') {\n const y = side === 'bottom' ? anchor.y + anchor.height + offset : anchor.y - offset - height;\n return { x: alignAlong(anchor.x, anchor.width, width, align) + crossOffset, y, width, height };\n }\n const x = side === 'right' ? anchor.x + anchor.width + offset : anchor.x - offset - width;\n return { x, y: alignAlong(anchor.y, anchor.height, height, align) + crossOffset, width, height };\n}\n\nfunction clampAxis(start: number, size: number, low: number, extent: number, padding: number): number {\n const min = low + padding;\n return Math.max(min, Math.min(start, min + extent - padding * 2 - size));\n}\n\n/**\n * Move `rect` the shortest distance that puts it inside `boundary`, keeping its\n * size. A rect too big to fit pins to the boundary's leading edge.\n */\nexport function clampRectWithin(rect: Rect, boundary: Rect, padding = 0): Rect {\n return {\n ...rect,\n x: clampAxis(rect.x, rect.width, boundary.x, boundary.width, padding),\n y: clampAxis(rect.y, rect.height, boundary.y, boundary.height, padding),\n };\n}\n\n/** Slide along the alignment axis until the overlay is inside. */\nfunction shiftAcross(rect: Rect, boundary: Rect, side: PlacementSide, padding: number): Rect {\n const vertical = side === 'top' || side === 'bottom';\n const size = vertical ? rect.width : rect.height;\n const low = (vertical ? boundary.x : boundary.y) + padding;\n const high = low + (vertical ? boundary.width : boundary.height) - padding * 2 - size;\n const placed = Math.max(low, Math.min(vertical ? rect.x : rect.y, high));\n return vertical ? { ...rect, x: placed } : { ...rect, y: placed };\n}\n\nconst OPPOSITE: Record<PlacementSide, PlacementSide> = {\n top: 'bottom',\n bottom: 'top',\n left: 'right',\n right: 'left',\n};\n\nfunction fitsAlongSide(rect: Rect, boundary: Rect, side: PlacementSide, padding: number): boolean {\n const vertical = side === 'top' || side === 'bottom';\n const start = vertical ? rect.y : rect.x;\n const end = start + (vertical ? rect.height : rect.width);\n const low = (vertical ? boundary.y : boundary.x) + padding;\n const high = low + (vertical ? boundary.height : boundary.width) - padding * 2;\n return start >= low && end <= high;\n}\n\n/**\n * Position an overlay beside `anchor` at the requested placement. With `flip`,\n * a side that overflows the boundary is swapped for the opposite one when that\n * fits. The result then slides along the alignment axis to stay inside the\n * boundary; along the side axis it is left where it is, even if it overflows.\n */\nexport function placeRect(options: PlaceRectOptions): PlacedRect {\n const { anchor, overlay, boundary, placement, offset = 0, crossOffset = 0 } = options;\n const { padding = 0, flip = true } = options;\n\n let resolved = placement;\n let rect = positionOn(anchor, overlay, resolved, offset, crossOffset);\n\n if (flip && !fitsAlongSide(rect, boundary, resolved.side, padding)) {\n const opposite = { side: OPPOSITE[resolved.side], align: resolved.align };\n const flipped = positionOn(anchor, overlay, opposite, offset, crossOffset);\n if (fitsAlongSide(flipped, boundary, opposite.side, padding)) {\n resolved = opposite;\n rect = flipped;\n }\n }\n\n return { rect: shiftAcross(rect, boundary, resolved.side, padding), placement: resolved };\n}\n","/** An easing curve: maps normalized progress `t ∈ [0, 1]` to eased progress.\n * Curves may leave the 0–1 range in the middle (back, elastic) but should\n * pass through 0 at 0 and 1 at 1. */\nexport type EasingFn = (t: number) => number;\n\n/** A spring's physical parameters. Higher stiffness settles faster, higher\n * damping overshoots less, higher mass makes both sluggish. */\nexport interface SpringPreset {\n stiffness: number;\n damping: number;\n mass: number;\n}\n\n/** One of the tunings in `SPRING_PRESETS`. */\nexport type SpringPresetName = 'gentle' | 'wobbly' | 'stiff' | 'slow';\n\n// --- Polynomial family (degree 1-5). The unsuffixed `easeIn`/`easeOut`/\n// `easeInOut` aliases mirror the `easeInQuad` curve (degree 2) for backwards\n// compatibility with existing call sites.\n\n/** No easing: constant rate from start to finish. */\nexport const linear: EasingFn = (t) => t;\n\n// Quadratic (degree 2)\n/** Accelerates from a standstill, gently. */\nexport const easeInQuad: EasingFn = (t) => t * t;\n/** Decelerates to a stop, gently. The safe default for UI motion. */\nexport const easeOutQuad: EasingFn = (t) => 1 - (1 - t) * (1 - t);\n/** Accelerates then decelerates, gently. */\nexport const easeInOutQuad: EasingFn = (t) =>\n t < 0.5 ? 2 * t * t : 1 - 2 * (1 - t) * (1 - t);\n\n// Cubic (degree 3)\n/** Accelerates from a standstill, moderately. */\nexport const easeInCubic: EasingFn = (t) => t * t * t;\n/** Decelerates to a stop, moderately. */\nexport const easeOutCubic: EasingFn = (t) => 1 - Math.pow(1 - t, 3);\n/** Accelerates then decelerates, moderately. */\nexport const easeInOutCubic: EasingFn = (t) =>\n t < 0.5 ? 4 * t * t * t : 1 - Math.pow(-2 * t + 2, 3) / 2;\n\n// Quartic (degree 4)\n/** Accelerates from a standstill, sharply. */\nexport const easeInQuart: EasingFn = (t) => t * t * t * t;\n/** Decelerates to a stop, sharply. */\nexport const easeOutQuart: EasingFn = (t) => 1 - Math.pow(1 - t, 4);\n/** Accelerates then decelerates, sharply. */\nexport const easeInOutQuart: EasingFn = (t) =>\n t < 0.5 ? 8 * t * t * t * t : 1 - Math.pow(-2 * t + 2, 4) / 2;\n\n// Quintic (degree 5)\n/** Accelerates from a standstill, very sharply. */\nexport const easeInQuint: EasingFn = (t) => t * t * t * t * t;\n/** Decelerates to a stop, very sharply. */\nexport const easeOutQuint: EasingFn = (t) => 1 - Math.pow(1 - t, 5);\n/** Accelerates then decelerates, very sharply. */\nexport const easeInOutQuint: EasingFn = (t) =>\n t < 0.5 ? 16 * t * t * t * t * t : 1 - Math.pow(-2 * t + 2, 5) / 2;\n\n// --- Trigonometric / transcendental\n\n/** Accelerates from a standstill along a sine curve — the mildest\n * acceleration of the built-ins. */\nexport const easeInSine: EasingFn = (t) => 1 - Math.cos((t * Math.PI) / 2);\n/** Decelerates to a stop along a sine curve — the mildest\n * deceleration of the built-ins. */\nexport const easeOutSine: EasingFn = (t) => Math.sin((t * Math.PI) / 2);\n/** Accelerates then decelerates along a sine curve. */\nexport const easeInOutSine: EasingFn = (t) => -(Math.cos(Math.PI * t) - 1) / 2;\n\n/** Accelerates exponentially: barely moves at first, then rushes. */\nexport const easeInExpo: EasingFn = (t) => (t === 0 ? 0 : Math.pow(2, 10 * t - 10));\n/** Decelerates exponentially: leaps away, then creeps in. */\nexport const easeOutExpo: EasingFn = (t) => (t === 1 ? 1 : 1 - Math.pow(2, -10 * t));\n/** Exponential at both ends — a very fast middle between two\n * near-still extremes. */\nexport const easeInOutExpo: EasingFn = (t) => {\n if (t === 0) return 0;\n if (t === 1) return 1;\n return t < 0.5\n ? Math.pow(2, 20 * t - 10) / 2\n : (2 - Math.pow(2, -20 * t + 10)) / 2;\n};\n\n/** Accelerates along a circular arc: slow start, abrupt arrival. */\nexport const easeInCirc: EasingFn = (t) => 1 - Math.sqrt(1 - t * t);\n/** Decelerates along a circular arc: abrupt start, slow arrival. */\nexport const easeOutCirc: EasingFn = (t) => Math.sqrt(1 - Math.pow(t - 1, 2));\n/** Circular arcs at both ends. */\nexport const easeInOutCirc: EasingFn = (t) =>\n t < 0.5\n ? (1 - Math.sqrt(1 - Math.pow(2 * t, 2))) / 2\n : (Math.sqrt(1 - Math.pow(-2 * t + 2, 2)) + 1) / 2;\n\n// --- Overshoot / oscillate / decay (Penner's named curves).\n// Constants are the well-known defaults; a future iteration could expose\n// per-call tuning (stiffness on back, amplitude/period on elastic).\n\nconst C1 = 1.70158; // back overshoot\nconst C2 = C1 * 1.525; // back inOut\nconst C3 = C1 + 1;\nconst C4 = (2 * Math.PI) / 3; // elastic in/out\nconst C5 = (2 * Math.PI) / 4.5;\n\n/** Pulls back past the start before moving forward. Overshoots below 0. */\nexport const easeInBack: EasingFn = (t) => C3 * t * t * t - C1 * t * t;\n/** Overshoots the target, then settles back onto it. Exceeds 1. */\nexport const easeOutBack: EasingFn = (t) =>\n 1 + C3 * Math.pow(t - 1, 3) + C1 * Math.pow(t - 1, 2);\n/** Overshoots at both ends. Leaves the 0–1 range on each side. */\nexport const easeInOutBack: EasingFn = (t) =>\n t < 0.5\n ? (Math.pow(2 * t, 2) * ((C2 + 1) * 2 * t - C2)) / 2\n : (Math.pow(2 * t - 2, 2) * ((C2 + 1) * (2 * t - 2) + C2) + 2) / 2;\n\n/** Oscillates around the start with growing amplitude, then snaps away. */\nexport const easeInElastic: EasingFn = (t) => {\n if (t === 0) return 0;\n if (t === 1) return 1;\n return -Math.pow(2, 10 * t - 10) * Math.sin((t * 10 - 10.75) * C4);\n};\n/** Springs past the target and wobbles into it. Exceeds 1. */\nexport const easeOutElastic: EasingFn = (t) => {\n if (t === 0) return 0;\n if (t === 1) return 1;\n return Math.pow(2, -10 * t) * Math.sin((t * 10 - 0.75) * C4) + 1;\n};\n/** Wobbles at both ends. Leaves the 0–1 range on each side. */\nexport const easeInOutElastic: EasingFn = (t) => {\n if (t === 0) return 0;\n if (t === 1) return 1;\n return t < 0.5\n ? -(Math.pow(2, 20 * t - 10) * Math.sin((20 * t - 11.125) * C5)) / 2\n : (Math.pow(2, -20 * t + 10) * Math.sin((20 * t - 11.125) * C5)) / 2 + 1;\n};\n\n/** Lands on the target and bounces, in hops of decreasing height. */\nexport const easeOutBounce: EasingFn = (t) => {\n const n1 = 7.5625;\n const d1 = 2.75;\n if (t < 1 / d1) return n1 * t * t;\n if (t < 2 / d1) { t -= 1.5 / d1; return n1 * t * t + 0.75; }\n if (t < 2.5 / d1) { t -= 2.25 / d1; return n1 * t * t + 0.9375; }\n t -= 2.625 / d1;\n return n1 * t * t + 0.984375;\n};\n/** Bounces up to the start before departing — `easeOutBounce` reversed. */\nexport const easeInBounce: EasingFn = (t) => 1 - easeOutBounce(1 - t);\n/** Bounces at both ends. */\nexport const easeInOutBounce: EasingFn = (t) =>\n t < 0.5\n ? (1 - easeOutBounce(1 - 2 * t)) / 2\n : (1 + easeOutBounce(2 * t - 1)) / 2;\n\n// --- Backwards-compat aliases. Pre-library callers asked for `easeIn`/\n// `easeOut`/`easeInOut`; those resolve to the quadratic curve.\n/** Alias for `easeInQuad`, kept for call sites that predate the\n * named-curve library. */\nexport const easeIn = easeInQuad;\n/** Alias for `easeOutQuad`, kept for call sites that predate the\n * named-curve library. */\nexport const easeOut = easeOutQuad;\n/** Alias for `easeInOutQuad`, kept for call sites that predate the\n * named-curve library. */\nexport const easeInOut = easeInOutQuad;\n\n/** All easings in one bag — useful for demos / pickers. */\nexport const EASINGS = {\n linear,\n easeInQuad, easeOutQuad, easeInOutQuad,\n easeInCubic, easeOutCubic, easeInOutCubic,\n easeInQuart, easeOutQuart, easeInOutQuart,\n easeInQuint, easeOutQuint, easeInOutQuint,\n easeInSine, easeOutSine, easeInOutSine,\n easeInExpo, easeOutExpo, easeInOutExpo,\n easeInCirc, easeOutCirc, easeInOutCirc,\n easeInBack, easeOutBack, easeInOutBack,\n easeInElastic, easeOutElastic, easeInOutElastic,\n easeInBounce, easeOutBounce, easeInOutBounce,\n} as const;\n\n/** The name of one of the built-in easing curves. */\nexport type EasingName = keyof typeof EASINGS;\n\n/** Named spring tunings, from softest to firmest. Springs settle on a target\n * rather than running for a fixed duration, so these are an alternative to an\n * easing curve, not a modifier on one. */\nexport const SPRING_PRESETS: Record<SpringPresetName, SpringPreset> = {\n gentle: { stiffness: 120, damping: 14, mass: 1 },\n wobbly: { stiffness: 180, damping: 12, mass: 1 },\n stiff: { stiffness: 210, damping: 20, mass: 1 },\n slow: { stiffness: 80, damping: 20, mass: 1 },\n};\n","import { EASINGS, type EasingFn, type EasingName } from './easings';\n\n/** Cubic-bezier control points, CSS `cubic-bezier()` order. The curve's two\n * endpoints are implicit at (0,0) and (1,1). */\nexport interface BezierEasing {\n /** `readonly` so an `as const` preset is assignable; nothing ever writes it. */\n bezier: readonly [number, number, number, number];\n}\n\n/** An easing curve as a value: a function, the name of a built-in, or control\n * points. Anything an editor has to name, show or serialize must not be a bare\n * function, which is why the union exists. */\nexport type EasingSpec = EasingFn | EasingName | BezierEasing;\n\nconst NEWTON_ITERATIONS = 8;\nconst NEWTON_MIN_SLOPE = 1e-3;\nconst SUBDIVISION_EPSILON = 1e-7;\nconst SUBDIVISION_MAX = 12;\n\nfunction bezierAt(t: number, a1: number, a2: number): number {\n const c = 3 * a1;\n const b = 3 * (a2 - a1) - c;\n const a = 1 - c - b;\n return ((a * t + b) * t + c) * t;\n}\n\nfunction bezierSlope(t: number, a1: number, a2: number): number {\n const c = 3 * a1;\n const b = 3 * (a2 - a1) - c;\n const a = 1 - c - b;\n return (3 * a * t + 2 * b) * t + c;\n}\n\n/** Solve for the bezier parameter that puts the curve at `x`. Newton-Raphson\n * where the slope allows it, bisection where it does not — the standard\n * approach, and the one browsers use for `cubic-bezier()`. */\nfunction solveForX(x: number, x1: number, x2: number): number {\n let t = x;\n for (let i = 0; i < NEWTON_ITERATIONS; i++) {\n const slope = bezierSlope(t, x1, x2);\n if (slope < NEWTON_MIN_SLOPE) break;\n t -= (bezierAt(t, x1, x2) - x) / slope;\n }\n let lo = 0;\n let hi = 1;\n t = Math.min(1, Math.max(0, t));\n for (let i = 0; i < SUBDIVISION_MAX; i++) {\n const err = bezierAt(t, x1, x2) - x;\n if (Math.abs(err) < SUBDIVISION_EPSILON) return t;\n if (err > 0) hi = t; else lo = t;\n t = (lo + hi) / 2;\n }\n return t;\n}\n\n/** Build the easing curve for four cubic-bezier control points. `x1`/`x2` are\n * clamped to [0,1] — CSS `cubic-bezier()`'s constraint for a monotone x(t),\n * which both `solveForX` root-finders assume. `y1`/`y2` are unclamped: an\n * overshoot easing (back, elastic) needs them outside 0..1. */\nexport function cubicBezierEasing(\n x1: number, y1: number, x2: number, y2: number,\n): EasingFn {\n const cx1 = Math.min(1, Math.max(0, x1));\n const cx2 = Math.min(1, Math.max(0, x2));\n return (t) => {\n if (t <= 0) return 0;\n if (t >= 1) return 1;\n return bezierAt(solveForX(t, cx1, cx2), y1, y2);\n };\n}\n\n/** Memoized so two equal specs resolve to one function, not a fresh solver per call. */\nconst bezierCache = new Map<string, EasingFn>();\nconst BEZIER_CACHE_LIMIT = 256;\n\nfunction isBezier(spec: EasingSpec): spec is BezierEasing {\n return typeof spec === 'object' && spec !== null && 'bezier' in spec;\n}\n\n/** Resolve a spec to the function that shapes progress. `undefined` is linear. */\nexport function resolveEasing(spec?: EasingSpec): EasingFn {\n if (spec === undefined) return EASINGS.linear;\n if (typeof spec === 'function') return spec;\n if (typeof spec === 'string') {\n const fn = EASINGS[spec];\n if (!fn) throw new Error(`resolveEasing: unknown easing name \"${spec}\"`);\n return fn;\n }\n if (isBezier(spec)) {\n const [x1, y1, x2, y2] = spec.bezier;\n const key = `${x1},${y1},${x2},${y2}`;\n let fn = bezierCache.get(key);\n if (!fn) {\n fn = cubicBezierEasing(x1, y1, x2, y2);\n // A handle being dragged resolves a new curve every pointer move.\n if (bezierCache.size >= BEZIER_CACHE_LIMIT) bezierCache.delete(bezierCache.keys().next().value!);\n bezierCache.set(key, fn);\n }\n return fn;\n }\n throw new Error('resolveEasing: unrecognized easing spec');\n}\n"]}
1
+ {"version":3,"sources":["../src/view.ts","../src/affine.ts","../src/nearest.ts","../src/portCurve2.ts","../src/paths/builder.ts","../src/paths/bounds.ts","../src/paths/unionBoundsPath.ts","../src/paths/transformPath.ts","../src/paths/transform.ts","../src/paths/compose.ts","../src/paths/splitSubpaths.ts","../src/paths/splitByClosure.ts","../src/paths/winding.ts","../src/paths/pathFromD.ts","../src/paths/pathAt.ts","../src/paths/pathDistance.ts","../src/paths/schneiderFit.ts","../src/paths/spanFit.ts","../src/paths/anchors.ts","../src/paths/simplifyPath.ts","../src/pxExtent.ts","../src/paths/anchorOrigins.ts","../src/paths/anchorEdits.ts","../src/paths/joinAnchors.ts","../src/pathSubpaths.ts","../src/screenBand.ts","../src/pathHitTest.ts","../src/paths/markers.ts","../src/glMat3.ts","../src/viewToMat3.ts","../src/place.ts","../src/easings.ts","../src/easingSpec.ts","../src/meanScale.ts","../src/poseRotation.ts","../src/poseFrame.ts","../src/paths/anchorSymmetry.ts","../src/paths/bendSegment.ts","../src/paths/handleEdits.ts","../src/paths/nearestAnchor.ts","../src/paths/pathInWorld.ts","../src/typedArrayJson.ts"],"names":["x","y","portControls","portCurvePoints","sub","sign","dot","last","fit","cross","CUBIC_SAMPLES","unit","sub2","a","b","fitRecursive","dist","scale","held","at","neg","identity","multiply","invert","offset","rotate","linear","apply","other","same"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Viewport state. `(view.x, view.y)` is the world point currently rendered at\n * the canvas top-left; `view.scale.x` / `view.scale.y` is pixels per world\n * unit on each axis.\n *\n * A `View` names no orientation, so a kernel with a camera cannot express its\n * viewport as one.\n */\nexport interface View {\n x: number;\n y: number;\n scale: { x: number; y: number };\n}\n\n/**\n * The smallest zoom magnitude a view can hold, in `View.scale` units.\n *\n * A view's zoom is always finite and at least this far from 0. Nothing can be\n * drawn or picked through a zoom of 0, and every screen↔world conversion\n * divides by it, so it is ruled out where views are made rather than handled\n * by each conversion.\n */\nexport const ZOOM_FLOOR = 1e-9;\n\n/**\n * The one rule for a zoom magnitude: a finite number no smaller than\n * {@link ZOOM_FLOOR}. Anything else (0, negative, NaN, ±Infinity) becomes the\n * floor.\n */\nexport function normalizeZoom(zoom: number): number {\n return zoom >= ZOOM_FLOOR && zoom < Infinity ? zoom : ZOOM_FLOOR;\n}\n","/**\n * 2D affine transforms in canvas/DOMMatrix order: [a, b, c, d, e, f].\n * x' = a·x + c·y + e\n * y' = b·x + d·y + f\n * Represented as a readonly 6-tuple (f64). The affine tier of the kernel.\n *\n * `glMat3.ts` beside this file holds the renderer's matrix: a 9-element\n * column-major array (a full 3×3) laid out for `uniformMatrix3fv`. Its\n * *logical element order* is identical to ours.\n */\nimport { SINGULAR_RATIO } from './scalar';\n\n/** `[a, b, c, d, e, f]`: `x' = a·x + c·y + e`, `y' = b·x + d·y + f`. */\nexport type Affine = readonly [number, number, number, number, number, number];\n\n/** The transform that leaves a point where it is. */\nexport function identity(): Affine {\n return [1, 0, 0, 1, 0, 0];\n}\n\n/** A pure translation by `(tx, ty)`. */\nexport function translate(tx: number, ty: number): Affine {\n return [1, 0, 0, 1, tx, ty];\n}\n\n/** A pure scale about the origin. Scale about another point by composing\n * translate → scale → inverse translate with `multiply`. */\nexport function scale(sx: number, sy: number): Affine {\n return [sx, 0, 0, sy, 0, 0];\n}\n\n/** A pure rotation about the origin, in radians, clockwise in canvas\n * coordinates (y down). */\nexport function rotate(rad: number): Affine {\n const c = Math.cos(rad);\n const s = Math.sin(rad);\n return [c, s, -s, c, 0, 0];\n}\n\n/** Compose: result applies `n` first, then `m` (m·n). */\nexport function multiply(m: Affine, n: Affine): Affine {\n return [\n m[0] * n[0] + m[2] * n[1],\n m[1] * n[0] + m[3] * n[1],\n m[0] * n[2] + m[2] * n[3],\n m[1] * n[2] + m[3] * n[3],\n m[0] * n[4] + m[2] * n[5] + m[4],\n m[1] * n[4] + m[3] * n[5] + m[5],\n ];\n}\n\n/** Inverse, or null when the matrix is singular, non-finite, or too\n * ill-conditioned to invert meaningfully at its own scale. */\nexport function invert(m: Affine): Affine | null {\n const det = m[0] * m[3] - m[1] * m[2];\n // The determinant is an area, so it is judged against the squared column norms.\n const norm2 = Math.max(m[0] * m[0] + m[1] * m[1], m[2] * m[2] + m[3] * m[3]);\n // Negated so a non-finite determinant falls out as singular.\n if (!(Math.abs(det) > SINGULAR_RATIO * norm2)) return null;\n const id = 1 / det;\n const a = m[3] * id;\n const b = -m[1] * id;\n const c = -m[2] * id;\n const d = m[0] * id;\n return [a, b, c, d, -(m[4] * a + m[5] * c), -(m[4] * b + m[5] * d)];\n}\n\n/** Apply to a point, returning a tuple. Cold-path use; hot loops inline. */\nexport function applyToPoint(m: Affine, x: number, y: number): [number, number] {\n return [m[0] * x + m[2] * y + m[4], m[1] * x + m[3] * y + m[5]];\n}\n\n/** Affine that maps source box (sx,sy,sw,sh) onto destination box (dx,dy,dw,dh). */\nexport function boxToBox(\n sx: number, sy: number, sw: number, sh: number,\n dx: number, dy: number, dw: number, dh: number,\n): Affine {\n const kx = sw === 0 ? 1 : dw / sw;\n const ky = sh === 0 ? 1 : dh / sh;\n // translate(dx,dy) · scale(kx,ky) · translate(-sx,-sy)\n return [kx, 0, 0, ky, dx - sx * kx, dy - sy * ky];\n}\n\n/** Rotation by `rad` about pivot (cx,cy): translate(c)·rotate·translate(-c). */\nexport function rotateAboutPoint(cx: number, cy: number, rad: number): Affine {\n return multiply(translate(cx, cy), multiply(rotate(rad), translate(-cx, -cy)));\n}\n\n/**\n * Apply an affine to an interleaved coord stream, returning a fresh f64\n * buffer. Command codes are unaffected — for a Bezier the transformed control\n * points define the transformed curve exactly (affine invariance), so callers\n * pass `path.coords` straight through and keep `path.commands` as-is.\n */\nexport function transformCoords(coords: ArrayLike<number>, m: Affine): Float64Array {\n const out = new Float64Array(coords.length);\n const a = m[0], b = m[1], c = m[2], d = m[3], e = m[4], f = m[5];\n for (let i = 0; i + 1 < coords.length; i += 2) {\n const x = coords[i], y = coords[i + 1];\n out[i] = a * x + c * y + e;\n out[i + 1] = b * x + d * y + f;\n }\n return out;\n}\n","/**\n * Nearest point on a segment or a whole path to a probe point: where it is,\n * its curve parameter, and how far away it lies.\n */\nimport { cubicEvalAt, elevateQuadraticToCubic } from './curve';\nimport { forEachSegment, PATH_M, PATH_L, PATH_Q, PATH_C, PATH_Z } from './commands';\n\n/** The point on one segment nearest a probe. */\nexport interface CurveNearest {\n x: number;\n y: number;\n /** Curve parameter of the point, in [0, 1]. */\n t: number;\n /** Euclidean distance from the probe. */\n dist: number;\n}\n\n/** The point on a path nearest a probe, and the command whose segment holds it. */\nexport interface PathNearest extends CurveNearest {\n /** Index of the segment's command in the command stream (`L`, `Q`, `C` or `Z`). */\n commandIndex: number;\n /** Offset of that command's first coord; for a `Z`, where its coords would begin. */\n coordIndex: number;\n}\n\n/** Nearest point on segment (x0,y0)-(x1,y1) to (px,py). */\nexport function nearestOnLine(\n px: number, py: number, x0: number, y0: number, x1: number, y1: number,\n): CurveNearest {\n const vx = x1 - x0, vy = y1 - y0;\n const vv = vx * vx + vy * vy;\n let t = vv === 0 ? 0 : ((px - x0) * vx + (py - y0) * vy) / vv;\n t = t < 0 ? 0 : t > 1 ? 1 : t;\n const x = t === 1 ? x1 : x0 + t * vx;\n const y = t === 1 ? y1 : y0 + t * vy;\n return { x, y, t, dist: Math.hypot(px - x, py - y) };\n}\n\n/** Coarse samples per cubic. Each local minimum among them is refined, so this\n * only has to separate the distance function's minima (a cubic has at most\n * three), not locate them. */\nconst CUBIC_SAMPLES = 32;\nconst REFINE_ITERS = 40;\nconst T_EPS = 1e-14;\n\n/**\n * Nearest point on the cubic (x0,y0)…(x3,y3) to (px,py). Samples the curve,\n * then refines every sampled local minimum with bracketed Newton on the\n * distance derivative, so a loop or cusp cannot capture it in the wrong basin.\n */\nexport function nearestOnCubic(\n px: number, py: number,\n x0: number, y0: number, x1: number, y1: number,\n x2: number, y2: number, x3: number, y3: number,\n): CurveNearest {\n // Power basis B(t) = a t³ + b t² + c t + p0, for the derivatives.\n const ax = -x0 + 3 * x1 - 3 * x2 + x3, ay = -y0 + 3 * y1 - 3 * y2 + y3;\n const bx = 3 * x0 - 6 * x1 + 3 * x2, by = 3 * y0 - 6 * y1 + 3 * y2;\n const cx = 3 * (x1 - x0), cy = 3 * (y1 - y0);\n\n const d2At = (t: number): number => {\n const [x, y] = cubicEvalAt(x0, y0, x1, y1, x2, y2, x3, y3, t);\n return (x - px) ** 2 + (y - py) ** 2;\n };\n\n const d2s: number[] = [];\n for (let k = 0; k <= CUBIC_SAMPLES; k++) d2s.push(d2At(k / CUBIC_SAMPLES));\n\n let bestT = 0, bestD2 = d2s[0];\n for (let k = 0; k <= CUBIC_SAMPLES; k++) {\n const d = d2s[k];\n const prev = k > 0 ? d2s[k - 1] : Infinity;\n const next = k < CUBIC_SAMPLES ? d2s[k + 1] : Infinity;\n if (!(d <= prev && d <= next)) continue;\n\n let lo = Math.max(0, (k - 1) / CUBIC_SAMPLES);\n let hi = Math.min(1, (k + 1) / CUBIC_SAMPLES);\n let t = k / CUBIC_SAMPLES;\n for (let i = 0; i < REFINE_ITERS; i++) {\n const t2 = t * t;\n const ex = ax * t2 * t + bx * t2 + cx * t + x0 - px;\n const ey = ay * t2 * t + by * t2 + cy * t + y0 - py;\n const dx = 3 * ax * t2 + 2 * bx * t + cx, dy = 3 * ay * t2 + 2 * by * t + cy;\n const ddx = 6 * ax * t + 2 * bx, ddy = 6 * ay * t + 2 * by;\n // g = ½ d/dt |B - P|², zero at a critical point; its sign says which side the minimum is on.\n const g = ex * dx + ey * dy;\n const gp = dx * dx + dy * dy + ex * ddx + ey * ddy;\n if (g > 0) hi = t; else if (g < 0) lo = t; else break;\n let tn = gp > 0 ? t - g / gp : NaN;\n if (!(tn > lo && tn < hi)) tn = (lo + hi) / 2;\n const step = Math.abs(tn - t);\n t = tn;\n if (step < T_EPS || hi - lo < T_EPS) break;\n }\n const refined = d2At(t);\n const [tk, dk] = refined <= d ? [t, refined] : [k / CUBIC_SAMPLES, d];\n if (dk < bestD2) { bestD2 = dk; bestT = tk; }\n }\n\n const [x, y] = cubicEvalAt(x0, y0, x1, y1, x2, y2, x3, y3, bestT);\n return { x, y, t: bestT, dist: Math.hypot(x - px, y - py) };\n}\n\n/** Nearest point on the quadratic (x0,y0)(x1,y1)(x2,y2) to (px,py). */\nexport function nearestOnQuadratic(\n px: number, py: number,\n x0: number, y0: number, x1: number, y1: number, x2: number, y2: number,\n): CurveNearest {\n // Degree elevation keeps the parameterization, so t carries over unchanged.\n const [c1x, c1y, c2x, c2y] = elevateQuadraticToCubic(x0, y0, x1, y1, x2, y2);\n return nearestOnCubic(px, py, x0, y0, c1x, c1y, c2x, c2y, x2, y2);\n}\n\n/**\n * Nearest point on a command-stream path to (px,py), over every `L`, `Q`, `C`\n * and the closing edge each `Z` draws. The earliest segment wins a tie.\n * Returns `null` when the path has no segment, and throws on a command code\n * `PATH_COMMANDS` does not declare.\n */\nexport function nearestOnPath(\n commands: ArrayLike<number>,\n coords: ArrayLike<number>,\n px: number,\n py: number,\n): PathNearest | null {\n let best: PathNearest | null = null;\n let startX = 0, startY = 0;\n forEachSegment(commands, coords, (cmd, ci, x0, y0, commandIndex) => {\n let hit: CurveNearest;\n if (cmd === PATH_M) {\n startX = coords[ci]; startY = coords[ci + 1];\n return;\n } else if (cmd === PATH_L) {\n hit = nearestOnLine(px, py, x0, y0, coords[ci], coords[ci + 1]);\n } else if (cmd === PATH_Q) {\n hit = nearestOnQuadratic(px, py, x0, y0, coords[ci], coords[ci + 1], coords[ci + 2], coords[ci + 3]);\n } else if (cmd === PATH_C) {\n hit = nearestOnCubic(\n px, py, x0, y0,\n coords[ci], coords[ci + 1], coords[ci + 2], coords[ci + 3], coords[ci + 4], coords[ci + 5],\n );\n } else if (cmd === PATH_Z) {\n hit = nearestOnLine(px, py, x0, y0, startX, startY);\n } else {\n throw new Error(`nearestOnPath: unknown command code ${cmd}`);\n }\n if (best === null || hit.dist < best.dist) best = { ...hit, commandIndex, coordIndex: ci };\n });\n return best;\n}\n","/**\n * The port-curve rule in the 2D kernel's currency: loose scalars, the way\n * `cubicEvalAt` and `applyToPoint` take them. The rule itself lives in\n * `./portCurve`, stated once over components, so this and `./3d` cannot drift.\n */\n\nimport {\n PORT_REACH,\n portControls as portControlsN,\n portCurvePoints as portCurvePointsN,\n} from './portCurve';\n\nexport { PORT_REACH };\n\n/**\n * `[c1, c2]` for the cubic from `(ax, ay)` to `(bx, by)`.\n *\n * A null normal falls back to a lerp along the chord. See `./portCurve` for why\n * the two ends are not symmetric.\n */\nexport function portControls(\n ax: number,\n ay: number,\n bx: number,\n by: number,\n outNormal: readonly [number, number] | null | undefined,\n inNormal: readonly [number, number] | null | undefined,\n reach: number = PORT_REACH,\n): [[number, number], [number, number]] {\n const [c1, c2] = portControlsN([ax, ay], [bx, by], outNormal, inNormal, reach);\n return [\n [c1[0]!, c1[1]!],\n [c2[0]!, c2[1]!],\n ];\n}\n\n/** A port curve sampled into `samples` points, excluding its start. */\nexport function portCurvePoints(\n ax: number,\n ay: number,\n bx: number,\n by: number,\n outNormal: readonly [number, number] | null | undefined,\n inNormal: readonly [number, number] | null | undefined,\n samples: number,\n reach: number = PORT_REACH,\n): [number, number][] {\n return portCurvePointsN([ax, ay], [bx, by], outNormal, inNormal, samples, reach).map(\n (p) => [p[0]!, p[1]!],\n );\n}\n","/**\n * Fluent builder for `PolygonPath`. Hides the `Uint8Array` / `Float32Array`\n * encoding behind move/line/curve/close calls and a final `build()`. Use\n * this to construct paths in tests and demos; production callers that need\n * to mutate large paths in place should reach for the raw arrays directly.\n *\n * Numeric capacity grows by doubling — typical for amortized O(1) push.\n *\n * Also exposes `rectPath` / `polygonFromPoints` shortcuts for the common\n * cases. `rectPath` returns the lighter `RectPath` subtype, not a polygon.\n */\n\nimport { PATH_C, PATH_L, PATH_M, PATH_Q, PATH_Z } from '../commands';\nimport type { PathFillRule, PolygonPath, RectPath } from '../path';\n\n/** Fluent builder for `PolygonPath`; hides the `Uint8Array`/`Float32Array` encoding behind move/line/curve/close calls. */\nexport class PathBuilder {\n private cmds: number[] = [];\n private xs: number[] = [];\n private fillRule: PathFillRule = 'nonzero';\n\n /** Seed a builder with an existing `PolygonPath`. Useful for extending\n * an in-flight path with another segment (e.g. appending a cubic to\n * the end of a curve in response to a user action) without hand-\n * reaching into the `commands` / `coords` typed arrays.\n *\n * ```ts\n * const next = PathBuilder.fromPath(current).curveTo(...).build();\n * ```\n */\n static fromPath(path: PolygonPath): PathBuilder {\n const b = new PathBuilder();\n b.cmds = Array.from(path.commands);\n b.xs = Array.from(path.coords);\n b.fillRule = path.fillRule;\n return b;\n }\n\n setFillRule(rule: PathFillRule): this {\n this.fillRule = rule;\n return this;\n }\n\n moveTo(x: number, y: number): this {\n this.cmds.push(PATH_M);\n this.xs.push(x, y);\n return this;\n }\n\n lineTo(x: number, y: number): this {\n this.cmds.push(PATH_L);\n this.xs.push(x, y);\n return this;\n }\n\n /** Cubic bezier to (x, y) with control points (x1, y1) and (x2, y2). */\n curveTo(x1: number, y1: number, x2: number, y2: number, x: number, y: number): this {\n this.cmds.push(PATH_C);\n this.xs.push(x1, y1, x2, y2, x, y);\n return this;\n }\n\n /** Quadratic bezier to (x, y) with control point (x1, y1). */\n quadTo(x1: number, y1: number, x: number, y: number): this {\n this.cmds.push(PATH_Q);\n this.xs.push(x1, y1, x, y);\n return this;\n }\n\n close(): this {\n this.cmds.push(PATH_Z);\n return this;\n }\n\n build(): PolygonPath {\n return {\n kind: 'polygon',\n commands: new Uint8Array(this.cmds),\n coords: new Float32Array(this.xs),\n fillRule: this.fillRule,\n };\n }\n}\n\n/** Construct a `RectPath` (the fast-path subtype). */\nexport function rectPath(x: number, y: number, width: number, height: number): RectPath {\n return { kind: 'rect', x, y, width, height };\n}\n\n/** Build an open polyline from a flat list of points — the same geometry as\n * {@link polygonFromPoints} without the closing edge. A freehand stroke and a\n * measurement line want this; a region wants the closed one. */\nexport function polylineFromPoints(\n points: readonly { x: number; y: number }[],\n): PolygonPath | RectPath {\n const b = new PathBuilder();\n const first = points[0];\n if (!first) return rectPath(0, 0, 0, 0);\n b.moveTo(first.x, first.y);\n for (let i = 1; i < points.length; i++) {\n const p = points[i];\n if (p) b.lineTo(p.x, p.y);\n }\n return b.build();\n}\n\n/** Build a closed polygon from a flat list of points. */\nexport function polygonFromPoints(\n points: readonly { x: number; y: number }[],\n opts: { fillRule?: PathFillRule } = {},\n): PolygonPath {\n if (points.length === 0) {\n return {\n kind: 'polygon',\n commands: new Uint8Array(),\n coords: new Float32Array(),\n fillRule: opts.fillRule ?? 'nonzero',\n };\n }\n const b = new PathBuilder();\n if (opts.fillRule) b.setFillRule(opts.fillRule);\n b.moveTo(points[0].x, points[0].y);\n for (let i = 1; i < points.length; i++) b.lineTo(points[i].x, points[i].y);\n b.close();\n return b.build();\n}\n\n/** Cubic-Bezier kappa for circular-quadrant approximation (<1% max error). */\nconst ELLIPSE_KAPPA = 0.5522847498307936;\n\n/** Closed ellipse inscribed in `bounds`, as a 4-cubic-Bezier `PolygonPath`.\n * Matches the geometry `useEllipseTool`'s overlay paints. */\nexport function ellipsePath(\n bounds: { x: number; y: number; width: number; height: number },\n): PolygonPath {\n const cx = bounds.x + bounds.width / 2;\n const cy = bounds.y + bounds.height / 2;\n const rx = bounds.width / 2;\n const ry = bounds.height / 2;\n const ox = rx * ELLIPSE_KAPPA;\n const oy = ry * ELLIPSE_KAPPA;\n const b = new PathBuilder();\n b.moveTo(cx + rx, cy);\n b.curveTo(cx + rx, cy + oy, cx + ox, cy + ry, cx, cy + ry);\n b.curveTo(cx - ox, cy + ry, cx - rx, cy + oy, cx - rx, cy);\n b.curveTo(cx - rx, cy - oy, cx - ox, cy - ry, cx, cy - ry);\n b.curveTo(cx + ox, cy - ry, cx + rx, cy - oy, cx + rx, cy);\n b.close();\n return b.build();\n}\n\n/** Closed regular n-gon centered at `center`, circumscribed by `radius`.\n * `rotation` is in radians; default 0 puts the first vertex on the +x axis. */\nexport function regularPolygonPath(\n center: { x: number; y: number },\n radius: number,\n sides: number,\n rotation = 0,\n): PolygonPath {\n const b = new PathBuilder();\n for (let i = 0; i < sides; i++) {\n const a = rotation + (i / sides) * Math.PI * 2;\n const x = center.x + radius * Math.cos(a);\n const y = center.y + radius * Math.sin(a);\n if (i === 0) b.moveTo(x, y); else b.lineTo(x, y);\n }\n b.close();\n return b.build();\n}\n\n/** Closed n-pointed star centered at `center`, alternating `outerRadius` and\n * `innerRadius` (default `outerRadius / 2`). `rotation` is in radians. */\nexport function starPath(\n center: { x: number; y: number },\n outerRadius: number,\n points = 5,\n innerRadius: number = outerRadius / 2,\n rotation = 0,\n): PolygonPath {\n const b = new PathBuilder();\n const n = points * 2;\n for (let i = 0; i < n; i++) {\n const a = rotation + (i / n) * Math.PI * 2;\n const r = i % 2 === 0 ? outerRadius : innerRadius;\n const x = center.x + r * Math.cos(a);\n const y = center.y + r * Math.sin(a);\n if (i === 0) b.moveTo(x, y); else b.lineTo(x, y);\n }\n b.close();\n return b.build();\n}\n\n/** Open 2-vertex polyline from `a` to `b` — strokeable, not fillable. */\nexport function linePath(\n a: { x: number; y: number },\n b: { x: number; y: number },\n): PolygonPath {\n const pb = new PathBuilder();\n pb.moveTo(a.x, a.y);\n pb.lineTo(b.x, b.y);\n return pb.build();\n}\n","import { cubicBounds, elevateQuadraticToCubic } from '../curve';\nimport { forEachSegment, PATH_C, PATH_L, PATH_M, PATH_Q, PATH_Z } from '../commands';\nimport type { Path, RectPath } from '../path';\n\n/**\n * AABB of a `Path`, returned as a `RectPath` for direct reuse with rect-fast-path machinery.\n * Control points are NOT included directly; they're used only to compute extrema that actually\n * lie on the curve. Empty paths (no commands) return a zero-size rect anchored at the origin.\n */\nexport function boundsOfPath(path: Path): RectPath {\n if (path.kind === 'rect') return path;\n\n const { commands, coords } = path;\n if (commands.length === 0) {\n return { kind: 'rect', x: 0, y: 0, width: 0, height: 0 };\n }\n\n let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;\n let seen = false;\n\n const include = (x: number, y: number) => {\n if (x < minX) minX = x;\n if (x > maxX) maxX = x;\n if (y < minY) minY = y;\n if (y > maxY) maxY = y;\n seen = true;\n };\n\n forEachSegment(commands, coords, (cmd, ci, px, py) => {\n switch (cmd) {\n case PATH_M:\n case PATH_L: {\n include(coords[ci], coords[ci + 1]);\n break;\n }\n case PATH_C: {\n const [bMinX, bMinY, bMaxX, bMaxY] = cubicBounds(\n px, py,\n coords[ci], coords[ci + 1],\n coords[ci + 2], coords[ci + 3],\n coords[ci + 4], coords[ci + 5],\n );\n include(bMinX, bMinY);\n include(bMaxX, bMaxY);\n break;\n }\n case PATH_Q: {\n const qx2 = coords[ci + 2], qy2 = coords[ci + 3];\n const [c1x, c1y, c2x, c2y] = elevateQuadraticToCubic(px, py, coords[ci], coords[ci + 1], qx2, qy2);\n const [bMinX, bMinY, bMaxX, bMaxY] = cubicBounds(px, py, c1x, c1y, c2x, c2y, qx2, qy2);\n include(bMinX, bMinY);\n include(bMaxX, bMaxY);\n break;\n }\n case PATH_Z:\n break;\n default:\n throw new Error(`boundsOfPath: unknown command ${cmd}`);\n }\n });\n\n if (!seen) return { kind: 'rect', x: 0, y: 0, width: 0, height: 0 };\n return { kind: 'rect', x: minX, y: minY, width: maxX - minX, height: maxY - minY };\n}\n\n","/**\n * AABB union over a heterogeneous set of `Path` poses. Returns the\n * envelope as a `RectPath`, or `null` for empty input — analog of\n * `unionBounds` for the rect-only model.\n */\n\nimport { boundsOfPath } from './bounds';\nimport type { Path, RectPath } from '../path';\n\n/** AABB envelope over a set of `Path` instances; returns `null` for empty input. */\nexport function unionBoundsPath(paths: Iterable<Path>): RectPath | null {\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n let any = false;\n for (const p of paths) {\n any = true;\n const b = boundsOfPath(p);\n if (b.x < minX) minX = b.x;\n if (b.y < minY) minY = b.y;\n const right = b.x + b.width;\n const bottom = b.y + b.height;\n if (right > maxX) maxX = right;\n if (bottom > maxY) maxY = bottom;\n }\n if (!any) return null;\n return { kind: 'rect', x: minX, y: minY, width: maxX - minX, height: maxY - minY };\n}\n","import type { Affine } from '../affine';\nimport { transformCoords } from '../affine';\nimport { PathBuilder } from './builder';\nimport type { Path, PolygonPath } from '../path';\n\n/** Below this, a matrix's rotation and shear terms are rounding left by\n * composing transforms (a half turn's sine is 1.2e-16), not a slant. */\nconst AXIS_ALIGNED_EPSILON = 1e-9;\n\n/** Apply an `Affine` to a path's geometry. Never mutates the input.\n *\n * Axis-aligned maps (no rotation/shear: `m[1]` and `m[2]` within 1e-9 of 0) keep a\n * `RectPath` a rect, normalizing negative extent (mirror). Rotation or\n * shear promotes the rect's four corners to a `PolygonPath`. */\nexport function transformPath(path: Path, m: Affine): Path {\n const [a, b, c, d, e, f] = m;\n if (path.kind === 'rect') {\n if (Math.abs(b) < AXIS_ALIGNED_EPSILON && Math.abs(c) < AXIS_ALIGNED_EPSILON) {\n // Pure scale + translate — corners remain axis-aligned.\n const x0 = a * path.x + e;\n const y0 = d * path.y + f;\n const x1 = a * (path.x + path.width) + e;\n const y1 = d * (path.y + path.height) + f;\n return {\n kind: 'rect',\n x: Math.min(x0, x1),\n y: Math.min(y0, y1),\n width: Math.abs(x1 - x0),\n height: Math.abs(y1 - y0),\n };\n }\n // Rotation / shear — promote to polygon with the four rect corners.\n const poly = new PathBuilder()\n .moveTo(path.x, path.y)\n .lineTo(path.x + path.width, path.y)\n .lineTo(path.x + path.width, path.y + path.height)\n .lineTo(path.x, path.y + path.height)\n .close()\n .build();\n return transformPolygon(poly, m);\n }\n return transformPolygon(path, m);\n}\n\nfunction transformPolygon(path: PolygonPath, m: Affine): PolygonPath {\n // transformCoords returns Float64Array; PolygonPath.coords is Float32Array.\n const mapped = transformCoords(path.coords, m);\n return { ...path, coords: Float32Array.from(mapped) };\n}\n","/**\n * In-place and copy-out path transforms. Translation is the most common —\n * called every pointermove during a drag — so the polygon variant mutates\n * the float buffer directly to keep allocation pressure off the GC.\n *\n * `scalePathToBounds` is for the resize interaction: given the path's\n * current AABB and the desired new AABB, scales every coordinate\n * proportionally.\n */\n\nimport { boxToBox } from '../affine';\nimport { forEachSegment, pathCommandCoordCount } from '../commands';\nimport { boundsOfPath } from './bounds';\nimport { transformPath } from './transformPath';\nimport type { Path, PolygonPath, RectPath } from '../path';\n\n/**\n * Translate a path by (dx, dy). Returns a new instance — the kit's pose\n * model treats poses as immutable to keep React state-update semantics\n * predictable. Polygon coords are copied into a fresh `Float32Array`.\n */\nexport function translatePath(path: Path, dx: number, dy: number): Path {\n if (path.kind === 'rect') {\n return { kind: 'rect', x: path.x + dx, y: path.y + dy, width: path.width, height: path.height };\n }\n return translatePolygonCopy(path, dx, dy);\n}\n\nfunction translatePolygonCopy(path: PolygonPath, dx: number, dy: number): PolygonPath {\n const next = new Float32Array(path.coords.length);\n const { commands, coords } = path;\n forEachSegment(commands, coords, (cmd, ci) => {\n for (let k = 0, len = pathCommandCoordCount(cmd); k < len; k += 2) {\n next[ci + k] = coords[ci + k] + dx;\n next[ci + k + 1] = coords[ci + k + 1] + dy;\n }\n });\n return { ...path, coords: next };\n}\n\n/**\n * Scale a path's coords so its current AABB maps to `target`. Resize\n * interactions use this to make a polygon follow a corner-handle drag.\n *\n * A degenerate source axis (zero width or height) has no ratio to scale by,\n * so `boxToBox` translates that axis instead — a zero scale is not\n * invertible and would discard what is left on it.\n */\nexport function scalePathToBounds(path: Path, target: RectPath): Path {\n if (path.kind === 'rect') {\n return { kind: 'rect', x: target.x, y: target.y, width: target.width, height: target.height };\n }\n const src = boundsOfPath(path);\n return scalePolygon(path, src, target);\n}\n\nfunction scalePolygon(path: PolygonPath, src: RectPath, dst: RectPath): PolygonPath {\n const m = boxToBox(src.x, src.y, src.width, src.height, dst.x, dst.y, dst.width, dst.height);\n // src/dst are axis-aligned, so the polygon stays a polygon after this pure scale+translate.\n return transformPath(path, m) as PolygonPath;\n}\n","/**\n * Translation-only compose/decompose for `Path` poses, the analog of\n * `composeRectPose` / `decomposeRectPose` for the rect-only model. Pair\n * with `composeWorldPose` / `rebaseLocalPose` when an adapter uses `Path`\n * as its `TPose`.\n *\n * Only translation is folded — the kit's hierarchy contract is\n * translation-only, same as for rects. Parent rotation/scale would require\n * a richer compose; that's out of scope here.\n */\n\nimport { boundsOfPath } from './bounds';\nimport { translatePath } from './transform';\nimport type { Path } from '../path';\n\n/** Express `child` (in `parent`'s local frame) in the next frame up. */\nexport function composePath(parent: Path, child: Path): Path {\n const origin = pathOrigin(parent);\n return translatePath(child, origin.x, origin.y);\n}\n\n/** Inverse of `composePath` — undo `parent`'s translation from a world pose. */\nexport function decomposePath(parent: Path, world: Path): Path {\n const origin = pathOrigin(parent);\n return translatePath(world, -origin.x, -origin.y);\n}\n\nfunction pathOrigin(path: Path): { x: number; y: number } {\n const { x, y } = boundsOfPath(path);\n return { x, y };\n}\n","import { forEachSegment, PATH_M } from '../commands';\nimport type { PolygonPath } from '../path';\n\n/** Split a path into one path per subpath, cutting at each `M`. A path with a\n * single subpath comes back as a one-element array. `fillRule` is propagated\n * unchanged, so even-odd compound paths with interior \"holes\" lose the hole\n * semantics — each subpath becomes its own filled region. */\nexport function splitSubpaths(path: PolygonPath): PolygonPath[] {\n const { commands, coords } = path;\n const out: PolygonPath[] = [];\n\n // Walk the command stream, tracking the (cmdStart, coordStart) of the\n // active subpath. On each subsequent `M`, slice out the previous subpath.\n let cmdStart = 0;\n let coordStart = 0;\n\n forEachSegment(commands, coords, (cmd, ci, _px, _py, i) => {\n if (cmd !== PATH_M || i <= cmdStart) return;\n out.push({ ...path, commands: commands.slice(cmdStart, i), coords: coords.slice(coordStart, ci) });\n cmdStart = i;\n coordStart = ci;\n });\n\n out.push({ ...path, commands: commands.slice(cmdStart), coords: coords.slice(coordStart) });\n\n return out;\n}\n","import { PATH_Z } from '../commands';\nimport type { Path, PolygonPath } from '../path';\nimport { splitSubpaths } from './splitSubpaths';\n\nconst endsInZ = (sub: PolygonPath): boolean => sub.commands[sub.commands.length - 1] === PATH_Z;\n\n/** Whether any subpath of `path` lacks the `Z` that closes it. */\nexport function hasOpenSubpath(path: Path): boolean {\n return path.kind === 'polygon' && path.commands.length > 0\n && splitSubpaths(path).some((sub) => !endsInZ(sub));\n}\n\n/**\n * `path` as two paths: the subpaths a `Z` closes, and those left open, each in\n * the order `path` holds them and with its fill rules. A side with no subpaths\n * is `null`. A fill that does not close an open subpath covers `closed` alone.\n */\nexport function splitByClosure(\n path: PolygonPath,\n): { closed: PolygonPath | null; open: PolygonPath | null } {\n const closed: PolygonPath[] = [];\n const open: PolygonPath[] = [];\n if (path.commands.length > 0) {\n for (const sub of splitSubpaths(path)) (endsInZ(sub) ? closed : open).push(sub);\n }\n const join = (subs: PolygonPath[]): PolygonPath | null => {\n if (subs.length === 0) return null;\n const commands = new Uint8Array(subs.reduce((n, s) => n + s.commands.length, 0));\n const coords = new Float32Array(subs.reduce((n, s) => n + s.coords.length, 0));\n let ci = 0, xi = 0;\n for (const s of subs) {\n commands.set(s.commands, ci);\n coords.set(s.coords, xi);\n ci += s.commands.length;\n xi += s.coords.length;\n }\n return { ...path, commands, coords };\n };\n return { closed: join(closed), open: join(open) };\n}\n","/**\n * Contour orientation: which way a path winds, and the same path wound the\n * other way. Under `'nonzero'` two overlapping contours fill their overlap\n * only when they wind the same way, so composing shapes from different\n * sources into one compound path first needs them to agree.\n */\n\nimport { PATH_C, PATH_L, PATH_M, PATH_Q, PATH_Z, forEachSegment } from '../commands';\nimport type { Path, PolygonPath } from '../path';\nimport { fillsOpenSubpaths } from '../openFill';\n\n// Three-point Gauss-Legendre: exact for polynomials up to degree 5, and the\n// Green's-theorem integrand of a cubic is degree 5.\nconst GL_T = [0.5 - Math.sqrt(15) / 10, 0.5, 0.5 + Math.sqrt(15) / 10];\nconst GL_W = [5 / 18, 8 / 18, 5 / 18];\n\n/**\n * Signed area enclosed by `path`, summed over its contours. Positive for a\n * contour that turns clockwise on a y-down screen (the shoelace sign), so a\n * hole wound against its outer contour subtracts. An open contour counts as\n * closed by a straight edge back to its start where a fill closes it, and as\n * nothing where one does not: see `fillsOpenSubpaths`.\n * Curved segments are integrated exactly, not through their control polygon.\n * A `RectPath` has no direction and counts as positive.\n */\nexport function pathSignedArea(path: Path): number {\n if (path.kind === 'rect') return path.width * path.height;\n const { commands, coords } = path;\n const fillsOpen = fillsOpenSubpaths(path);\n let total = 0;\n let twice = 0;\n let startX = 0, startY = 0;\n let open = false;\n let endX = 0, endY = 0;\n const close = (drawn: boolean) => {\n if (open && (drawn || fillsOpen)) total += twice + endX * startY - startX * endY;\n twice = 0;\n open = false;\n };\n forEachSegment(commands, coords, (cmd, ci, px, py) => {\n if (cmd === PATH_M) {\n close(false);\n startX = endX = coords[ci];\n startY = endY = coords[ci + 1];\n open = true;\n return;\n }\n if (cmd === PATH_Z) { close(true); endX = startX; endY = startY; return; }\n if (!open) { startX = px; startY = py; open = true; }\n if (cmd === PATH_L) {\n endX = coords[ci]; endY = coords[ci + 1];\n twice += px * endY - endX * py;\n return;\n }\n const cubic = cmd === PATH_C;\n const x1 = coords[ci], y1 = coords[ci + 1];\n const x2 = coords[ci + 2], y2 = coords[ci + 3];\n const x3 = cubic ? coords[ci + 4] : x2, y3 = cubic ? coords[ci + 5] : y2;\n for (let k = 0; k < 3; k++) {\n const t = GL_T[k], u = 1 - t;\n let x: number, y: number, dx: number, dy: number;\n if (cubic) {\n x = u * u * u * px + 3 * u * u * t * x1 + 3 * u * t * t * x2 + t * t * t * x3;\n y = u * u * u * py + 3 * u * u * t * y1 + 3 * u * t * t * y2 + t * t * t * y3;\n dx = 3 * (u * u * (x1 - px) + 2 * u * t * (x2 - x1) + t * t * (x3 - x2));\n dy = 3 * (u * u * (y1 - py) + 2 * u * t * (y2 - y1) + t * t * (y3 - y2));\n } else {\n x = u * u * px + 2 * u * t * x1 + t * t * x2;\n y = u * u * py + 2 * u * t * y1 + t * t * y2;\n dx = 2 * (u * (x1 - px) + t * (x2 - x1));\n dy = 2 * (u * (y1 - py) + t * (y2 - y1));\n }\n twice += GL_W[k] * (x * dy - y * dx);\n }\n endX = x3; endY = y3;\n });\n close(false);\n return total / 2;\n}\n\ninterface Segment {\n cmd: number;\n /** Control points followed by the end point, as the command stores them. */\n args: number[];\n fromX: number;\n fromY: number;\n}\n\n/**\n * `path` with every contour traversed backwards: same region, same curves,\n * opposite winding. A closed contour keeps its starting point; an open one\n * starts from where it used to end.\n */\nexport function reversePath(path: PolygonPath): PolygonPath {\n const cmds: number[] = [];\n const out: number[] = [];\n let segs: Segment[] = [];\n let sx = 0, sy = 0;\n let started = false;\n\n const flush = (closed: boolean) => {\n if (!started) return;\n const last = segs[segs.length - 1];\n const ex = last ? last.args[last.args.length - 2] : sx;\n const ey = last ? last.args[last.args.length - 1] : sy;\n if (closed) {\n cmds.push(PATH_M); out.push(sx, sy);\n if (ex !== sx || ey !== sy) { cmds.push(PATH_L); out.push(ex, ey); }\n } else {\n cmds.push(PATH_M); out.push(ex, ey);\n }\n for (let i = segs.length - 1; i >= 0; i--) {\n const s = segs[i];\n cmds.push(s.cmd);\n if (s.cmd === PATH_C) out.push(s.args[2], s.args[3], s.args[0], s.args[1]);\n else if (s.cmd === PATH_Q) out.push(s.args[0], s.args[1]);\n out.push(s.fromX, s.fromY);\n }\n if (closed) cmds.push(PATH_Z);\n segs = [];\n started = false;\n };\n\n const { commands, coords } = path;\n forEachSegment(commands, coords, (cmd, ci, px, py) => {\n if (cmd === PATH_M) {\n flush(false);\n sx = coords[ci]; sy = coords[ci + 1];\n started = true;\n return;\n }\n if (cmd === PATH_Z) { flush(true); return; }\n if (!started) { sx = px; sy = py; started = true; }\n const n = cmd === PATH_C ? 6 : cmd === PATH_Q ? 4 : 2;\n segs.push({ cmd, args: Array.from(coords.subarray(ci, ci + n)), fromX: px, fromY: py });\n });\n flush(false);\n\n return { ...path, commands: new Uint8Array(cmds), coords: new Float32Array(out) };\n}\n","/**\n * `pathFromD` — build a weasel `Path` from an **SVG path-data string** (the\n * value of SVG's `d` attribute, e.g. `\"M0 0 L100 0 Z\"`).\n *\n * Lowers every supported command (M/m L/l H/h V/v C/c S/s Q/q T/t A/a Z/z)\n * into weasel's `PathBuilder` primitives (move, line, cubic, quadratic,\n * close). Arc commands (`A`/`a`) convert to a series of cubic Bezier curves\n * using the standard endpoint-parameterization formulas (F.6.5 in the SVG\n * spec).\n */\n\nimport { PathBuilder } from './builder';\n\nconst NUM_RE = /[+-]?(?:\\d*\\.\\d+|\\d+\\.?)(?:[eE][+-]?\\d+)?/g;\n/** Same grammar, anchored — used where a number's position matters. */\nconst NUM_RE_AT = /[+-]?(?:\\d*\\.\\d+|\\d+\\.?)(?:[eE][+-]?\\d+)?/y;\n\n/**\n * Is `d[j]` a command letter, as opposed to the `e` of an exponent? `1e2` is\n * a legal coordinate, and treating its `e` as a command drops the number and\n * everything after it in that argument run.\n */\nfunction isCommandLetter(d: string, j: number): boolean {\n const c = d[j];\n if (!/[A-Za-z]/.test(c)) return false;\n if (c !== 'e' && c !== 'E') return true;\n if (!/[\\d.]/.test(d[j - 1] ?? '')) return true;\n const k = d[j + 1] === '+' || d[j + 1] === '-' ? j + 2 : j + 1;\n return !/\\d/.test(d[k] ?? '');\n}\n\n/** Tokenize the command stream from a `d` string. */\nfunction tokenize(d: string): { cmd: string; args: number[] }[] {\n const out: { cmd: string; args: number[] }[] = [];\n // Walk character by character so we can group command-letter + arg-run.\n let i = 0;\n while (i < d.length) {\n if (isCommandLetter(d, i)) {\n // Collect numeric args until the next command letter.\n let j = i + 1;\n while (j < d.length && !isCommandLetter(d, j)) j++;\n const argSlice = d.slice(i + 1, j);\n const cmd = d[i];\n out.push({\n cmd,\n args: cmd === 'A' || cmd === 'a' ? readArcArgs(argSlice) : readNumbers(argSlice),\n });\n i = j;\n } else {\n // Skip any whitespace / commas at the head.\n i++;\n }\n }\n return out;\n}\n\nfunction readNumbers(s: string): number[] {\n const out: number[] = [];\n let m: RegExpExecArray | null;\n NUM_RE.lastIndex = 0;\n while ((m = NUM_RE.exec(s)) !== null) {\n const n = Number(m[0]);\n if (Number.isFinite(n)) out.push(n);\n }\n return out;\n}\n\n/**\n * Read an `A`/`a` argument run. The two flags are single `0`/`1` digits that\n * need no separator after them, so `a25 25 -30 0 1 50 -25` may legally be\n * written `a25 25 -30 0150 -25` — which a plain number scan reads as two\n * arguments instead of four, leaving the whole arc short and dropped.\n */\nfunction readArcArgs(s: string): number[] {\n const out: number[] = [];\n let i = 0;\n while (i < s.length) {\n const c = s[i];\n if (c === ',' || c === ' ' || c === '\\t' || c === '\\n' || c === '\\r') { i++; continue; }\n const slot = out.length % 7;\n if (slot === 3 || slot === 4) {\n if (c !== '0' && c !== '1') return out;\n out.push(c === '1' ? 1 : 0);\n i++;\n continue;\n }\n NUM_RE_AT.lastIndex = i;\n const m = NUM_RE_AT.exec(s);\n if (!m) return out;\n out.push(Number(m[0]));\n i = NUM_RE_AT.lastIndex;\n }\n return out;\n}\n\n/** Per-command argument counts (in floats). A = 7: rx ry x-axis-rotation\n * large-arc-flag sweep-flag x y. */\nconst ARG_COUNTS: Record<string, number> = {\n M: 2, L: 2, H: 1, V: 1, C: 6, S: 4, Q: 4, T: 2, A: 7, Z: 0,\n};\n\ninterface ParseState {\n x: number;\n y: number;\n startX: number;\n startY: number;\n /** Last cubic control point for S/s reflection (in absolute coords). */\n lastCubicCtrl: { x: number; y: number } | null;\n /** Last quadratic control point for T/t reflection (in absolute coords). */\n lastQuadCtrl: { x: number; y: number } | null;\n}\n\n/**\n * Build a weasel `PolygonPath` from an SVG path-data (`d`) string. Unknown\n * command letters are skipped (and reported via `onWarn` when provided); the\n * builder still returns whatever valid commands preceded them. Data that does\n * not begin with a moveto builds an empty path, and a command with the wrong\n * number of arguments ends the path before it, as SVG renders both.\n */\nexport function pathFromD(\n d: string,\n onWarn?: (message: string) => void,\n): ReturnType<PathBuilder['build']> {\n const tokens = tokenize(d);\n const b = new PathBuilder();\n const st: ParseState = {\n x: 0, y: 0, startX: 0, startY: 0,\n lastCubicCtrl: null, lastQuadCtrl: null,\n };\n\n let started = false;\n for (const { cmd, args } of tokens) {\n const upper = cmd.toUpperCase();\n const relative = cmd !== upper;\n const argCount = ARG_COUNTS[upper];\n if (argCount === undefined) {\n onWarn?.(`unknown path command: ${cmd}`);\n continue;\n }\n if (!started && upper !== 'M') {\n onWarn?.(`path data does not begin with a moveto (\"${cmd}\" comes first); nothing is drawn`);\n break;\n }\n if (upper === 'Z') {\n b.close();\n st.x = st.startX;\n st.y = st.startY;\n st.lastCubicCtrl = null;\n st.lastQuadCtrl = null;\n continue;\n }\n // M with multiple coord pairs implies subsequent pairs are L (per SVG spec).\n const groups = Math.floor(args.length / argCount);\n for (let g = 0; g < groups; g++) {\n const a = args.slice(g * argCount, (g + 1) * argCount);\n // For repeated 'M'/'m' coord pairs after the first, downgrade to L/l.\n const effectiveUpper = upper === 'M' && g > 0 ? 'L' : upper;\n runCommand(effectiveUpper, relative, a, st, b);\n started = true;\n }\n // SVG draws a path up to the command in error and no further: carrying on\n // would start every later relative command from the wrong point.\n if (groups === 0 || args.length % argCount !== 0) {\n onWarn?.(`path command \"${cmd}\" takes ${argCount} arguments at a time and has ${args.length}; the path ends before it`);\n break;\n }\n }\n\n return b.build();\n}\n\nfunction runCommand(\n upper: string,\n relative: boolean,\n a: number[],\n st: ParseState,\n b: PathBuilder,\n): void {\n const rx = relative ? st.x : 0;\n const ry = relative ? st.y : 0;\n switch (upper) {\n case 'M': {\n const x = a[0] + rx;\n const y = a[1] + ry;\n b.moveTo(x, y);\n st.x = x; st.y = y;\n st.startX = x; st.startY = y;\n st.lastCubicCtrl = null;\n st.lastQuadCtrl = null;\n return;\n }\n case 'L': {\n const x = a[0] + rx;\n const y = a[1] + ry;\n b.lineTo(x, y);\n st.x = x; st.y = y;\n st.lastCubicCtrl = null;\n st.lastQuadCtrl = null;\n return;\n }\n case 'H': {\n const x = a[0] + (relative ? st.x : 0);\n b.lineTo(x, st.y);\n st.x = x;\n st.lastCubicCtrl = null;\n st.lastQuadCtrl = null;\n return;\n }\n case 'V': {\n const y = a[0] + (relative ? st.y : 0);\n b.lineTo(st.x, y);\n st.y = y;\n st.lastCubicCtrl = null;\n st.lastQuadCtrl = null;\n return;\n }\n case 'C': {\n const x1 = a[0] + rx, y1 = a[1] + ry;\n const x2 = a[2] + rx, y2 = a[3] + ry;\n const x = a[4] + rx, y = a[5] + ry;\n b.curveTo(x1, y1, x2, y2, x, y);\n st.x = x; st.y = y;\n st.lastCubicCtrl = { x: x2, y: y2 };\n st.lastQuadCtrl = null;\n return;\n }\n case 'S': {\n // Reflect prior cubic ctrl about the current point; fall back to\n // current point when prior wasn't a cubic.\n const ref = st.lastCubicCtrl ?? { x: st.x, y: st.y };\n const x1 = 2 * st.x - ref.x;\n const y1 = 2 * st.y - ref.y;\n const x2 = a[0] + rx, y2 = a[1] + ry;\n const x = a[2] + rx, y = a[3] + ry;\n b.curveTo(x1, y1, x2, y2, x, y);\n st.x = x; st.y = y;\n st.lastCubicCtrl = { x: x2, y: y2 };\n st.lastQuadCtrl = null;\n return;\n }\n case 'Q': {\n const x1 = a[0] + rx, y1 = a[1] + ry;\n const x = a[2] + rx, y = a[3] + ry;\n b.quadTo(x1, y1, x, y);\n st.x = x; st.y = y;\n st.lastQuadCtrl = { x: x1, y: y1 };\n st.lastCubicCtrl = null;\n return;\n }\n case 'T': {\n const ref = st.lastQuadCtrl ?? { x: st.x, y: st.y };\n const x1 = 2 * st.x - ref.x;\n const y1 = 2 * st.y - ref.y;\n const x = a[0] + rx, y = a[1] + ry;\n b.quadTo(x1, y1, x, y);\n st.x = x; st.y = y;\n st.lastQuadCtrl = { x: x1, y: y1 };\n st.lastCubicCtrl = null;\n return;\n }\n case 'A': {\n const rxA = Math.abs(a[0]);\n const ryA = Math.abs(a[1]);\n const xRot = a[2];\n const largeArc = a[3] !== 0;\n const sweep = a[4] !== 0;\n const ex = a[5] + rx;\n const ey = a[6] + ry;\n arcToCubics(st.x, st.y, ex, ey, rxA, ryA, xRot, largeArc, sweep, b);\n st.x = ex; st.y = ey;\n st.lastCubicCtrl = null;\n st.lastQuadCtrl = null;\n return;\n }\n default:\n return;\n }\n}\n\n/**\n * Convert an SVG elliptical arc segment to a series of cubic Bezier\n * `curveTo` calls on the builder. Standard endpoint-parameterization\n * implementation (SVG spec appendix F.6.5).\n */\nfunction arcToCubics(\n x1: number, y1: number,\n x2: number, y2: number,\n rx: number, ry: number,\n xAxisRotationDeg: number,\n largeArc: boolean,\n sweep: boolean,\n b: PathBuilder,\n): void {\n if (x1 === x2 && y1 === y2) return;\n if (rx === 0 || ry === 0) {\n b.lineTo(x2, y2);\n return;\n }\n const phi = (xAxisRotationDeg * Math.PI) / 180;\n const cosPhi = Math.cos(phi);\n const sinPhi = Math.sin(phi);\n\n // Step 1: compute (x1', y1') — rotate so x-axis aligns with ellipse axis.\n const dx = (x1 - x2) / 2;\n const dy = (y1 - y2) / 2;\n const x1p = cosPhi * dx + sinPhi * dy;\n const y1p = -sinPhi * dx + cosPhi * dy;\n\n // Correct radii if they're too small.\n let rxs = rx * rx;\n let rys = ry * ry;\n const x1ps = x1p * x1p;\n const y1ps = y1p * y1p;\n const lambda = x1ps / rxs + y1ps / rys;\n let rxFixed = rx;\n let ryFixed = ry;\n if (lambda > 1) {\n const sqrtLambda = Math.sqrt(lambda);\n rxFixed = sqrtLambda * rx;\n ryFixed = sqrtLambda * ry;\n rxs = rxFixed * rxFixed;\n rys = ryFixed * ryFixed;\n }\n\n // Step 2: center (cx', cy') in the rotated frame.\n const sign = largeArc === sweep ? -1 : 1;\n const num = rxs * rys - rxs * y1ps - rys * x1ps;\n const den = rxs * y1ps + rys * x1ps;\n const factor = sign * Math.sqrt(Math.max(0, num / den));\n const cxp = (factor * (rxFixed * y1p)) / ryFixed;\n const cyp = (factor * -(ryFixed * x1p)) / rxFixed;\n\n // Step 3: un-rotate the center back to user coords.\n const cx = cosPhi * cxp - sinPhi * cyp + (x1 + x2) / 2;\n const cy = sinPhi * cxp + cosPhi * cyp + (y1 + y2) / 2;\n\n // Step 4: start and sweep angles.\n const angle = (ux: number, uy: number, vx: number, vy: number): number => {\n const dot = ux * vx + uy * vy;\n const len = Math.sqrt((ux * ux + uy * uy) * (vx * vx + vy * vy));\n let a = Math.acos(Math.max(-1, Math.min(1, dot / len)));\n if (ux * vy - uy * vx < 0) a = -a;\n return a;\n };\n const theta1 = angle(1, 0, (x1p - cxp) / rxFixed, (y1p - cyp) / ryFixed);\n let dTheta = angle(\n (x1p - cxp) / rxFixed,\n (y1p - cyp) / ryFixed,\n (-x1p - cxp) / rxFixed,\n (-y1p - cyp) / ryFixed,\n );\n if (!sweep && dTheta > 0) dTheta -= 2 * Math.PI;\n else if (sweep && dTheta < 0) dTheta += 2 * Math.PI;\n\n // Step 5: split into ≤ 90° segments; emit a cubic per segment.\n const segCount = Math.max(1, Math.ceil(Math.abs(dTheta) / (Math.PI / 2)));\n const segAngle = dTheta / segCount;\n // Magic constant: cubic bezier handle length to approximate a circular\n // arc — for a segment of half-angle a, t = (4/3) * tan(a/2).\n const t = (4 / 3) * Math.tan(segAngle / 4);\n\n let prevX = x1;\n let prevY = y1;\n let prevDx = -Math.sin(theta1) * rxFixed;\n let prevDy = Math.cos(theta1) * ryFixed;\n\n for (let i = 1; i <= segCount; i++) {\n const theta = theta1 + i * segAngle;\n const cosT = Math.cos(theta);\n const sinT = Math.sin(theta);\n const px = cosPhi * (cosT * rxFixed) - sinPhi * (sinT * ryFixed) + cx;\n const py = sinPhi * (cosT * rxFixed) + cosPhi * (sinT * ryFixed) + cy;\n const dxNew = -sinT * rxFixed;\n const dyNew = cosT * ryFixed;\n const c1x = prevX + cosPhi * (t * prevDx) - sinPhi * (t * prevDy);\n const c1y = prevY + sinPhi * (t * prevDx) + cosPhi * (t * prevDy);\n const c2x = px - cosPhi * (t * dxNew) + sinPhi * (t * dyNew);\n const c2y = py - sinPhi * (t * dxNew) - cosPhi * (t * dyNew);\n b.curveTo(c1x, c1y, c2x, c2y, px, py);\n prevX = px;\n prevY = py;\n prevDx = dxNew;\n prevDy = dyNew;\n }\n}\n","/**\n * A station along a path: where it is at a fraction of its length, and which\n * way it is heading there.\n *\n * For anything positioned *along* geometry rather than beside it — a label on a\n * routed edge, a tick on a curve, a badge near an arrowhead. Curves are\n * flattened first, so the fraction is arc length along the drawn shape rather\n * than a curve parameter, which is what makes 0.5 look like the middle.\n */\nimport type { Point } from './cubicMath';\nimport type { Path } from '../path';\nimport { extractPolylines } from '../tessellate/polyline';\n\n/** The answer `pointAlongPath` gives: a point on the path and its heading there. */\nexport interface PathStation {\n point: Point;\n /** Unit vector along the path at `point`, pointing toward the end. */\n tangent: Point;\n}\n\n/** Options for `pointAlongPath`. */\nexport interface PointAlongPathOptions {\n /** Curve flattening tolerance, in world units. Default 0.5. */\n flattenTolerance?: number;\n}\n\n/**\n * Where `path` is at `t` of its total length, and its heading there.\n *\n * `t` is clamped to 0..1. Subpaths are measured in order and treated as one\n * run, the way a browser measures a whole `<path>`. Returns `null` for a path\n * with no points at all; a path of zero length answers at its single point,\n * heading along +X.\n */\nexport function pointAlongPath(\n path: Path,\n t: number,\n opts: PointAlongPathOptions = {},\n): PathStation | null {\n const polylines = extractPolylines(\n path,\n opts.flattenTolerance === undefined ? {} : { flattenTolerance: opts.flattenTolerance },\n );\n\n /** Every segment, in order, with the length it contributes. */\n const segments: { ax: number; ay: number; bx: number; by: number; len: number }[] = [];\n let total = 0;\n let first: Point | undefined;\n for (const pl of polylines) {\n const count = pl.points.length / 2;\n if (count === 0) continue;\n first ??= { x: pl.points[0]!, y: pl.points[1]! };\n const last = pl.closed ? count : count - 1;\n for (let i = 0; i < last; i++) {\n const j = (i + 1) % count;\n const ax = pl.points[i * 2]!;\n const ay = pl.points[i * 2 + 1]!;\n const bx = pl.points[j * 2]!;\n const by = pl.points[j * 2 + 1]!;\n const len = Math.hypot(bx - ax, by - ay);\n if (len === 0) continue;\n segments.push({ ax, ay, bx, by, len });\n total += len;\n }\n }\n\n if (first === undefined) return null;\n if (segments.length === 0) return { point: first, tangent: { x: 1, y: 0 } };\n\n const target = Math.min(Math.max(t, 0), 1) * total;\n let walked = 0;\n for (const seg of segments) {\n if (walked + seg.len < target) {\n walked += seg.len;\n continue;\n }\n const u = (target - walked) / seg.len;\n return {\n point: { x: seg.ax + (seg.bx - seg.ax) * u, y: seg.ay + (seg.by - seg.ay) * u },\n tangent: { x: (seg.bx - seg.ax) / seg.len, y: (seg.by - seg.ay) / seg.len },\n };\n }\n\n // Float drift can leave `target` a hair past the last segment.\n const last = segments[segments.length - 1]!;\n return {\n point: { x: last.bx, y: last.by },\n tangent: { x: (last.bx - last.ax) / last.len, y: (last.by - last.ay) / last.len },\n };\n}\n","/**\n * Pure-geometry distance from a point to a path's boundary (stroke), with\n * no fill-side logic. Used by pickers that want to know \"how close is this\n * click to the visible edge of the shape?\" Callers combine this with\n * `pathContainsPoint` from `pathHitTest.ts` to get a closed-region\n * pick distance (0 inside, stroke-distance outside).\n *\n * A polygon path defers to geom's `nearestOnPath`; a RectPath short-circuits\n * to AABB-perimeter math.\n */\n\nimport { nearestOnPath } from '../nearest';\nimport type { Path } from '../path';\n\n/** Distance from (px, py) to the perimeter of an axis-aligned rectangle.\n * Returns 0 if the point is on the perimeter; positive value outside or\n * inside (distance to the nearest edge). */\nfunction pointToRectPerimeterDist(\n px: number, py: number,\n rx: number, ry: number, rw: number, rh: number,\n): number {\n // Distance to the rect as a region: 0 if inside, else Euclidean distance\n // to the AABB. For interior points, return distance to the closest edge.\n const dx = Math.max(rx - px, px - (rx + rw), 0);\n const dy = Math.max(ry - py, py - (ry + rh), 0);\n if (dx > 0 || dy > 0) return Math.hypot(dx, dy);\n // Inside: distance to closest edge.\n const left = px - rx, right = rx + rw - px;\n const top = py - ry, bottom = ry + rh - py;\n return Math.min(left, right, top, bottom);\n}\n\n/** Closest Euclidean distance from (px, py) to the boundary of `path`.\n * Pure stroke distance — does *not* consult fill rule or interior. For\n * closed-region pick distance (\"0 inside, stroke-distance outside\"),\n * combine with `pathContainsPoint` at the call site. */\nexport function pathDistanceToPoint(path: Path, px: number, py: number): number {\n if (path.kind === 'rect') {\n return pointToRectPerimeterDist(px, py, path.x, path.y, path.width, path.height);\n }\n return nearestOnPath(path.commands, path.coords, px, py)?.dist ?? Infinity;\n}\n","import { PathBuilder } from './builder';\nimport { cubicPointAt, type Point } from './cubicMath';\nimport type { PolygonPath } from '../path';\n\n/**\n * Schneider (1990, Graphics Gems I) adaptive cubic-Bezier fitter.\n * Given a sequence of sample points, returns a `PolygonPath` whose `C`\n * segments approximate the samples within `errorTolerance` world units.\n *\n * Output shape: an initial `M` to the first sample, followed by N\n * `C` cubic segments. For colinear / two-point inputs, returns a single\n * degenerate cubic. For empty input, returns an empty polygon path.\n */\nexport function schneiderFit(\n samples: ReadonlyArray<Point>,\n errorTolerance: number,\n): PolygonPath {\n if (samples.length === 0) {\n return {\n kind: 'polygon',\n commands: new Uint8Array(),\n coords: new Float32Array(),\n fillRule: 'nonzero',\n };\n }\n\n const b = new PathBuilder();\n b.moveTo(samples[0].x, samples[0].y);\n\n if (samples.length === 1) {\n return b.build();\n }\n\n if (samples.length === 2) {\n emitStraightCubic(b, samples[0], samples[1]);\n return b.build();\n }\n\n fitRecursive(samples, errorTolerance, b);\n return b.build();\n}\n\nfunction fitRecursive(\n samples: ReadonlyArray<Point>,\n errorTolerance: number,\n b: PathBuilder,\n): void {\n if (samples.length === 2) {\n const fit = fitOneCubic(samples);\n b.curveTo(fit.cp1.x, fit.cp1.y, fit.cp2.x, fit.cp2.y, fit.end.x, fit.end.y);\n return;\n }\n const fit = fitOneCubic(samples);\n const { worstIndex, worstError } = measureError(samples, fit);\n if (worstError <= errorTolerance * errorTolerance) {\n b.curveTo(fit.cp1.x, fit.cp1.y, fit.cp2.x, fit.cp2.y, fit.end.x, fit.end.y);\n return;\n }\n // Split. Both halves include the split sample so endpoints meet.\n const left = samples.slice(0, worstIndex + 1);\n const right = samples.slice(worstIndex);\n fitRecursive(left, errorTolerance, b);\n fitRecursive(right, errorTolerance, b);\n}\n\nfunction measureError(\n samples: ReadonlyArray<Point>,\n fit: CubicFit,\n): { worstIndex: number; worstError: number } {\n let worstIndex = 1;\n let worstError = 0;\n const a = samples[0];\n for (let i = 1; i < samples.length - 1; i++) {\n const q = cubicPointAt(a, fit.cp1, fit.cp2, fit.end, fit.ts[i]);\n const dx = samples[i].x - q.x;\n const dy = samples[i].y - q.y;\n const sq = dx * dx + dy * dy;\n if (sq > worstError) {\n worstError = sq;\n worstIndex = i;\n }\n }\n return { worstIndex, worstError };\n}\n\ninterface CubicFit {\n cp1: Point;\n cp2: Point;\n end: Point;\n /** The curve parameter each sample was fitted at: where its error is measured. */\n ts: ReadonlyArray<number>;\n}\n\nfunction fitOneCubic(samples: ReadonlyArray<Point>): CubicFit {\n const n = samples.length;\n return fitWithTangents(\n samples,\n unit(sub(samples[1], samples[0])),\n unit(sub(samples[n - 2], samples[n - 1])),\n 4,\n );\n}\n\n/**\n * The single cubic from the first sample to the last that best fits the\n * samples between, with its control points held to the given unit tangents:\n * `tStart` leaving the first sample, `tEnd` leaving the last one backward.\n * Only the two handle lengths are solved for.\n *\n * `params` is the curve parameter each sample starts at, chord length when\n * omitted; `passes` is how many times those are refined and the lengths\n * solved again.\n */\nexport function fitCubicWithTangents(\n samples: ReadonlyArray<Point>,\n tStart: Point,\n tEnd: Point,\n opts: { params?: ReadonlyArray<number>; passes?: number } = {},\n): { cp1: Point; cp2: Point } {\n const { cp1, cp2 } = fitWithTangents(samples, tStart, tEnd, opts.passes ?? 4, opts.params);\n return { cp1, cp2 };\n}\n\nfunction fitWithTangents(\n samples: ReadonlyArray<Point>,\n tStart: Point,\n tEnd: Point,\n passes: number,\n params?: ReadonlyArray<number>,\n): CubicFit {\n const n = samples.length;\n const a = samples[0];\n const e = samples[n - 1];\n const ts = params ? [...params] : chordLengthParam(samples);\n if (ts === null) return { cp1: { ...a }, cp2: { ...e }, end: e, ts: samples.map(() => 0) };\n\n let fit = solveLS(samples, ts, a, e, tStart, tEnd);\n for (let pass = 0; pass < passes; pass++) {\n reparameterize(samples, ts, a, e, fit);\n fit = solveLS(samples, ts, a, e, tStart, tEnd);\n }\n return fit;\n}\n\nfunction chordLengthParam(samples: ReadonlyArray<Point>): number[] | null {\n const n = samples.length;\n const ts = new Array<number>(n);\n ts[0] = 0;\n let total = 0;\n for (let i = 1; i < n; i++) {\n total += dist(samples[i - 1], samples[i]);\n ts[i] = total;\n }\n if (total === 0) return null;\n for (let i = 0; i < n; i++) ts[i] /= total;\n return ts;\n}\n\nfunction solveLS(\n samples: ReadonlyArray<Point>,\n ts: ReadonlyArray<number>,\n a: Point,\n e: Point,\n tStart: Point,\n tEnd: Point,\n): CubicFit {\n const n = samples.length;\n let c11 = 0, c12 = 0, c22 = 0, x1 = 0, x2 = 0;\n for (let i = 0; i < n; i++) {\n const t = ts[i];\n const u = 1 - t;\n const b0 = u * u * u;\n const b1 = 3 * u * u * t;\n const b2 = 3 * u * t * t;\n const b3 = t * t * t;\n const A1x = b1 * tStart.x;\n const A1y = b1 * tStart.y;\n const A2x = b2 * tEnd.x;\n const A2y = b2 * tEnd.y;\n c11 += A1x * A1x + A1y * A1y;\n c12 += A1x * A2x + A1y * A2y;\n c22 += A2x * A2x + A2y * A2y;\n const targetX = samples[i].x - (b0 + b1) * a.x - (b2 + b3) * e.x;\n const targetY = samples[i].y - (b0 + b1) * a.y - (b2 + b3) * e.y;\n x1 += A1x * targetX + A1y * targetY;\n x2 += A2x * targetX + A2y * targetY;\n }\n const det = c11 * c22 - c12 * c12;\n let alpha1: number;\n let alpha2: number;\n if (Math.abs(det) < 1e-12) {\n const chord = dist(a, e);\n alpha1 = alpha2 = chord / 3;\n } else {\n alpha1 = (c22 * x1 - c12 * x2) / det;\n alpha2 = (c11 * x2 - c12 * x1) / det;\n if (alpha1 < 1e-6 || alpha2 < 1e-6) {\n const chord = dist(a, e);\n alpha1 = alpha2 = chord / 3;\n }\n }\n return {\n cp1: { x: a.x + tStart.x * alpha1, y: a.y + tStart.y * alpha1 },\n cp2: { x: e.x + tEnd.x * alpha2, y: e.y + tEnd.y * alpha2 },\n end: e,\n ts,\n };\n}\n\nfunction reparameterize(\n samples: ReadonlyArray<Point>,\n ts: number[],\n a: Point,\n e: Point,\n fit: CubicFit,\n): void {\n void a; void e;\n for (let i = 1; i < samples.length - 1; i++) {\n ts[i] = newtonRefineT(samples[i], ts[i], samples[0], fit.cp1, fit.cp2, samples[samples.length - 1]);\n }\n}\n\nfunction newtonRefineT(\n p: Point,\n t: number,\n p0: Point,\n p1: Point,\n p2: Point,\n p3: Point,\n): number {\n // Q(t) - p, where Q is the cubic. Newton step uses Q'(t)·(Q(t)-p) and\n // a second-derivative correction.\n const u = 1 - t;\n const { x: qx, y: qy } = cubicPointAt(p0, p1, p2, p3, t);\n const qpx = 3*u*u*(p1.x - p0.x) + 6*u*t*(p2.x - p1.x) + 3*t*t*(p3.x - p2.x);\n const qpy = 3*u*u*(p1.y - p0.y) + 6*u*t*(p2.y - p1.y) + 3*t*t*(p3.y - p2.y);\n const qppx = 6*u*(p2.x - 2*p1.x + p0.x) + 6*t*(p3.x - 2*p2.x + p1.x);\n const qppy = 6*u*(p2.y - 2*p1.y + p0.y) + 6*t*(p3.y - 2*p2.y + p1.y);\n const dx = qx - p.x;\n const dy = qy - p.y;\n const numerator = dx * qpx + dy * qpy;\n const denominator = qpx * qpx + qpy * qpy + dx * qppx + dy * qppy;\n if (Math.abs(denominator) < 1e-12) return t;\n const next = t - numerator / denominator;\n if (next < 0) return 0;\n if (next > 1) return 1;\n return next;\n}\n\nfunction sub(a: Point, b: Point): Point {\n return { x: a.x - b.x, y: a.y - b.y };\n}\nfunction dist(a: Point, b: Point): number {\n return Math.hypot(a.x - b.x, a.y - b.y);\n}\nfunction unit(v: Point): Point {\n const m = Math.hypot(v.x, v.y);\n if (m === 0) return { x: 0, y: 0 };\n return { x: v.x / m, y: v.y / m };\n}\n\nfunction emitStraightCubic(\n b: PathBuilder,\n a: Point,\n c: Point,\n): void {\n // cp1 at 1/3 along chord, cp2 at 2/3 — the canonical straight cubic.\n const cp1x = a.x + (c.x - a.x) / 3;\n const cp1y = a.y + (c.y - a.y) / 3;\n const cp2x = a.x + (2 * (c.x - a.x)) / 3;\n const cp2y = a.y + (2 * (c.y - a.y)) / 3;\n b.curveTo(cp1x, cp1y, cp2x, cp2y, c.x, c.y);\n}\n","import type { PenAnchor } from './anchors';\nimport { cubicPointAt, type Point } from './cubicMath';\nimport { fitCubicWithTangents } from './schneiderFit';\n\nconst SAMPLES_PER_SEGMENT = 16;\nconst SPLIT_SEARCH_STEPS = 40;\n\n/**\n * Controls for the one cubic that replaces `prev → removed → next` when\n * `removed` is deleted. The new controls keep the directions the curve leaves\n * `prev` and arrives at `next` with, and their lengths are least-squares fitted\n * to samples of the two segments being replaced, so the curve keeps its shape\n * as closely as one cubic can. Where `removed` was inserted by splitting a\n * cubic, the original cubic comes back.\n */\nexport function fitCubicThroughDeletion(\n prev: PenAnchor,\n removed: PenAnchor,\n next: PenAnchor,\n): { c1: Point; c2: Point } {\n const first = segmentControls(prev, removed);\n const second = segmentControls(removed, next);\n const samples = [...sampleCubic(first), ...sampleCubic(second).slice(1)];\n const tStart = startTangent(first);\n const tEnd = startTangent(reversed(second));\n\n // Each half is sampled evenly in its own parameter, so on the merged curve\n // the samples sit at a piecewise-linear parameter that breaks at the\n // removed anchor's `s`. Search for the `s` the samples fit best.\n const fitAt = (s: number) => {\n const params = splitParams(s);\n const fit = fitCubicWithTangents(samples, tStart, tEnd, { params, passes: 0 });\n return { fit, error: squaredError(samples, params, prev, fit.cp1, fit.cp2, next) };\n };\n let lo = 0.02;\n let hi = 0.98;\n const phi = (Math.sqrt(5) - 1) / 2;\n let m1 = hi - phi * (hi - lo);\n let m2 = lo + phi * (hi - lo);\n let e1 = fitAt(m1).error;\n let e2 = fitAt(m2).error;\n for (let i = 0; i < SPLIT_SEARCH_STEPS; i++) {\n if (e1 < e2) {\n hi = m2; m2 = m1; e2 = e1;\n m1 = hi - phi * (hi - lo); e1 = fitAt(m1).error;\n } else {\n lo = m1; m1 = m2; e1 = e2;\n m2 = lo + phi * (hi - lo); e2 = fitAt(m2).error;\n }\n }\n const { cp1, cp2 } = fitCubicWithTangents(samples, tStart, tEnd, {\n params: splitParams((lo + hi) / 2),\n });\n return { c1: cp1, c2: cp2 };\n}\n\ntype Cubic = [Point, Point, Point, Point];\n\nfunction splitParams(s: number): number[] {\n const out: number[] = [];\n for (let i = 0; i <= SAMPLES_PER_SEGMENT; i++) out.push((s * i) / SAMPLES_PER_SEGMENT);\n for (let i = 1; i <= SAMPLES_PER_SEGMENT; i++) out.push(s + ((1 - s) * i) / SAMPLES_PER_SEGMENT);\n return out;\n}\n\nfunction squaredError(\n samples: readonly Point[],\n params: readonly number[],\n p0: Point, p1: Point, p2: Point, p3: Point,\n): number {\n let sum = 0;\n for (let i = 0; i < samples.length; i++) {\n const q = cubicPointAt(p0, p1, p2, p3, params[i]);\n sum += (q.x - samples[i].x) ** 2 + (q.y - samples[i].y) ** 2;\n }\n return sum;\n}\n\nfunction segmentControls(a: PenAnchor, b: PenAnchor): Cubic {\n return [\n { x: a.x, y: a.y },\n a.outHandle ?? { x: a.x, y: a.y },\n b.inHandle ?? { x: b.x, y: b.y },\n { x: b.x, y: b.y },\n ];\n}\n\nfunction sampleCubic([p0, p1, p2, p3]: Cubic): Point[] {\n const out: Point[] = [];\n for (let i = 0; i <= SAMPLES_PER_SEGMENT; i++) {\n out.push(cubicPointAt(p0, p1, p2, p3, i / SAMPLES_PER_SEGMENT));\n }\n return out;\n}\n\nfunction reversed([p0, p1, p2, p3]: Cubic): Cubic {\n return [p3, p2, p1, p0];\n}\n\n/** Unit direction the cubic leaves `p0` in: toward the first control that is\n * not on top of it, the way a cubic's derivative degenerates. */\nfunction startTangent([p0, ...rest]: Cubic): Point {\n for (const p of rest) {\n const dx = p.x - p0.x;\n const dy = p.y - p0.y;\n const len = Math.hypot(dx, dy);\n if (len > 1e-9) return { x: dx / len, y: dy / len };\n }\n return { x: 0, y: 0 };\n}\n","/**\n * Counts the path anchors used by the per-anchor coloring surface. An\n * \"anchor\" is the destination point of a path command: M, L, C, Q each\n * contribute one (the (x, y) where the pen ends up); Z contributes none\n * (it closes back to the subpath's first M). RectPath has four implicit\n * anchors — the corners — matching its M/L/L/L/Z stroke tessellation.\n *\n * Consumers use this to size their per-anchor color array; the renderer\n * uses it to validate the array length in dev builds.\n */\n\nimport { PATH_C, PATH_L, PATH_M, PATH_Q, PATH_Z, forEachSegment } from '../commands';\nimport { nearestOnCubic, nearestOnLine } from '../nearest';\nimport type { Path, PolygonPath } from '../path';\nimport { PathBuilder } from './builder';\n\n/** One anchor of an editable path: its on-curve point plus the two control\n * handles that shape the segments either side of it. Handles are in the same\n * space as the point, and absent when the adjoining segment is straight. */\nexport interface PenAnchor {\n x: number;\n y: number;\n inHandle?: { x: number; y: number };\n outHandle?: { x: number; y: number };\n}\n\n/**\n * Derive a per-subpath anchor model from a PolygonPath. Subpaths split on\n * every `M` command; a subpath is closed iff it ends with `Z`.\n *\n * Cubic-segment control points become the outHandle of the previous anchor\n * and the inHandle of the next anchor. A closed subpath whose last curve ends\n * exactly on its first point holds that point twice; the two are one anchor,\n * and the curve's second control is that anchor's inHandle. Quadratic segments are upgraded to\n * cubics (each control reused for both adjacent handles) — this loses no\n * geometry. Linear segments produce anchors with no handles.\n */\nexport function pathToAnchors(\n path: PolygonPath,\n): { anchors: PenAnchor[][]; closed: boolean[] } {\n const { commands, coords } = path;\n const anchors: PenAnchor[][] = [];\n const closed: boolean[] = [];\n let current: PenAnchor[] | null = null;\n\n forEachSegment(commands, coords, (cmd, ci) => {\n switch (cmd) {\n case PATH_M: {\n if (current) { anchors.push(current); closed.push(false); }\n current = [{ x: coords[ci], y: coords[ci + 1] }];\n break;\n }\n case PATH_L: {\n if (!current) throw new Error('pathToAnchors: L without prior M');\n current.push({ x: coords[ci], y: coords[ci + 1] });\n break;\n }\n case PATH_C: {\n if (!current) throw new Error('pathToAnchors: C without prior M');\n const prev = current[current.length - 1];\n prev.outHandle = { x: coords[ci], y: coords[ci + 1] };\n current.push({\n x: coords[ci + 4], y: coords[ci + 5],\n inHandle: { x: coords[ci + 2], y: coords[ci + 3] },\n });\n break;\n }\n case PATH_Q: {\n if (!current) throw new Error('pathToAnchors: Q without prior M');\n // Quadratic → cubic: handle is the same control point on both sides.\n const handle = { x: coords[ci], y: coords[ci + 1] };\n const prev = current[current.length - 1];\n prev.outHandle = handle;\n current.push({ x: coords[ci + 2], y: coords[ci + 3], inHandle: { ...handle } });\n break;\n }\n case PATH_Z: {\n if (current) {\n foldClosingCurve(current);\n anchors.push(current);\n closed.push(true);\n current = null;\n }\n break;\n }\n default:\n throw new Error(`pathToAnchors: unknown command ${cmd}`);\n }\n });\n if (current) { anchors.push(current); closed.push(false); }\n return { anchors, closed };\n}\n\n/** Merge a closing curve's end anchor into the subpath's first anchor when\n * the two coincide. */\nfunction foldClosingCurve(sub: PenAnchor[]): void {\n if (sub.length < 2) return;\n const first = sub[0];\n const last = sub[sub.length - 1];\n if (!last.inHandle || last.x !== first.x || last.y !== first.y) return;\n sub.pop();\n first.inHandle = last.inHandle;\n}\n\n/**\n * Serialize the per-subpath anchor model back to a PolygonPath. Inverse of\n * `pathToAnchors`. Curve-vs-line decision per segment:\n * - Both adjacent handles absent → straight L segment.\n * - Either handle present → C segment, with missing handles defaulting to\n * the anchor point itself (degenerate but valid; renders as a near-line).\n * Given `like`, the path being reshaped, the result keeps its fill rules.\n */\nexport function anchorsToPath(\n anchors: PenAnchor[][],\n closed: boolean[],\n like?: PolygonPath,\n): PolygonPath {\n const b = new PathBuilder();\n for (let s = 0; s < anchors.length; s++) {\n const sub = anchors[s];\n if (sub.length === 0) continue;\n b.moveTo(sub[0].x, sub[0].y);\n for (let i = 1; i < sub.length; i++) {\n const prev = sub[i - 1];\n const cur = sub[i];\n const hasHandle = prev.outHandle != null || cur.inHandle != null;\n if (!hasHandle) {\n b.lineTo(cur.x, cur.y);\n } else {\n const c1 = prev.outHandle ?? { x: prev.x, y: prev.y };\n const c2 = cur.inHandle ?? { x: cur.x, y: cur.y };\n b.curveTo(c1.x, c1.y, c2.x, c2.y, cur.x, cur.y);\n }\n }\n if (closed[s]) {\n // Bridge last → first if they have curve handles; either way emit Z.\n const last = sub[sub.length - 1];\n const first = sub[0];\n const hasHandle = last.outHandle != null || first.inHandle != null;\n if (hasHandle) {\n const c1 = last.outHandle ?? { x: last.x, y: last.y };\n const c2 = first.inHandle ?? { x: first.x, y: first.y };\n b.curveTo(c1.x, c1.y, c2.x, c2.y, first.x, first.y);\n }\n b.close();\n }\n }\n const built = b.build();\n return like ? { ...like, commands: built.commands, coords: built.coords } : built;\n}\n\nconst SMOOTH_THRESHOLD = 0.001;\n\n/**\n * Returns true if the anchor's in-handle and out-handle are collinear with\n * the anchor point, indicating \"smooth\" (mirror-drag) behavior. Detected via\n * the magnitude of the normalized cross product of the two handle vectors.\n *\n * Edge cases:\n * - Missing in or out handle → false (corner by definition).\n * - Either handle at zero distance from anchor → false.\n */\nexport function isAnchorSmooth(a: PenAnchor): boolean {\n if (!a.inHandle || !a.outHandle) return false;\n const inDX = a.inHandle.x - a.x;\n const inDY = a.inHandle.y - a.y;\n const outDX = a.outHandle.x - a.x;\n const outDY = a.outHandle.y - a.y;\n const inLen = Math.hypot(inDX, inDY);\n const outLen = Math.hypot(outDX, outDY);\n if (inLen === 0 || outLen === 0) return false;\n // For collinear handles on opposite sides of the anchor, the cross product\n // of the two handle vectors should be zero. Normalize by both magnitudes.\n const cross = (inDX * outDY - inDY * outDX) / (inLen * outLen);\n return Math.abs(cross) < SMOOTH_THRESHOLD;\n}\n\n/** How many anchors a path has. Matches the per-anchor arrays the renderer\n * expects for `vertexColors`. */\nexport function countPathAnchors(path: Path): number {\n if (path.kind === 'rect') return 4;\n const cmds = path.commands;\n let n = 0;\n for (let i = 0; i < cmds.length; i++) {\n const c = cmds[i];\n if (c === PATH_M || c === PATH_L || c === PATH_C || c === PATH_Q) n++;\n }\n return n;\n}\n\n/** The segment `(sub, segIdx)` as its two end anchors, or null when it\n * doesn't exist. `segIdx === sub.length - 1` names a closed subpath's\n * closing segment, which runs from the last anchor back to the first. */\nexport function segmentEnds(\n anchors: readonly PenAnchor[][],\n closed: readonly boolean[] | undefined,\n sub: number,\n segIdx: number,\n): { a: PenAnchor; b: PenAnchor } | null {\n const s = anchors[sub];\n if (!s || segIdx < 0) return null;\n if (segIdx + 1 < s.length) return { a: s[segIdx], b: s[segIdx + 1] };\n if (closed?.[sub] && s.length > 1 && segIdx === s.length - 1) return { a: s[segIdx], b: s[0] };\n return null;\n}\n\n/** Whether the segment from `a` to `b` is a straight line (no handles). */\nexport function isStraightSegment(a: PenAnchor, b: PenAnchor): boolean {\n return a.outHandle == null && b.inHandle == null;\n}\n\n/** Nearest parameter on one segment to `(x, y)`, with its squared distance.\n * A straight segment is parameterized by arc length (`t` is the fraction of\n * the way from `a` to `b`), matching how {@link insertAnchorOnSegment}\n * splits one. */\nfunction nearestOnSegment(a: PenAnchor, b: PenAnchor, x: number, y: number): { t: number; d2: number } {\n const p1 = a.outHandle ?? a;\n const p2 = b.inHandle ?? b;\n const hit = isStraightSegment(a, b)\n ? nearestOnLine(x, y, a.x, a.y, b.x, b.y)\n : nearestOnCubic(x, y, a.x, a.y, p1.x, p1.y, p2.x, p2.y, b.x, b.y);\n return { t: hit.t, d2: hit.dist * hit.dist };\n}\n\n/** The segment of a decoded path nearest `(wx, wy)`, and the parameter `t`\n * on it closest to that point. Pass `closed` (from `pathToAnchors`) to\n * include each closed subpath's closing segment, reported as\n * `segIdx === sub.length - 1`. `t` spans `[0, 1]`, endpoints included.\n * Returns `null` only when there are no segments. */\nexport function nearestSegmentT(\n anchors: PenAnchor[][],\n wx: number,\n wy: number,\n closed?: readonly boolean[],\n): { sub: number; segIdx: number; t: number } | null {\n let bestD2 = Infinity;\n let best: { sub: number; segIdx: number; t: number } | null = null;\n for (let s = 0; s < anchors.length; s++) {\n const segCount = anchors[s].length - (closed?.[s] ? 0 : 1);\n for (let i = 0; i < segCount; i++) {\n const ends = segmentEnds(anchors, closed, s, i);\n if (!ends) continue;\n const hit = nearestOnSegment(ends.a, ends.b, wx, wy);\n if (hit.d2 < bestD2) {\n bestD2 = hit.d2;\n best = { sub: s, segIdx: i, t: hit.t };\n }\n }\n }\n return best;\n}\n","import type { PolygonPath } from '../path';\nimport { nearestOnCubic, nearestOnLine } from '../nearest';\nimport { anchorsToPath, pathToAnchors, type PenAnchor } from './anchors';\nimport { cubicPointAt, type Point } from './cubicMath';\nimport { fitCubicWithTangents } from './schneiderFit';\n\n/** Options for {@link simplifyPath}. */\nexport interface SimplifyPathOptions {\n /**\n * An anchor whose path turns by more than this many degrees is a corner:\n * it is kept, and the curve is refitted on either side of it. Default 40.\n */\n cornerAngle?: number;\n}\n\nconst CUBIC_SAMPLES = 12;\nconst MAX_LINE_SAMPLES = 8;\n/** How many times longer than both neighbors a straight segment must be to be\n * kept whole. */\nconst LONG_STRAIGHT = 4;\n\n/**\n * `path` refitted with as few anchors as hold it within `tolerance`: every\n * point sampled along the original lies within `tolerance` of the result.\n * Corners (see {@link SimplifyPathOptions.cornerAngle}) and the ends of open\n * subpaths stay where they are; the runs between them are refitted as smooth\n * cubics, Schneider-style, and a run that lies within `tolerance` of a line\n * becomes one straight segment. Fill rules carry over.\n */\nexport function simplifyPath(\n path: PolygonPath,\n tolerance: number,\n opts: SimplifyPathOptions = {},\n): PolygonPath {\n const tol = Math.max(tolerance, 1e-6);\n const cosCorner = Math.cos(((opts.cornerAngle ?? 40) * Math.PI) / 180);\n const { anchors, closed } = pathToAnchors(path);\n const out: PenAnchor[][] = [];\n const outClosed: boolean[] = [];\n anchors.forEach((sub, s) => {\n if (sub.length < 2) return;\n out.push(simplifySubpath(sub, closed[s], tol, cosCorner));\n outClosed.push(closed[s]);\n });\n return anchorsToPath(out, outClosed, path);\n}\n\nfunction simplifySubpath(sub: PenAnchor[], closed: boolean, tol: number, cosCorner: number): PenAnchor[] {\n const n = sub.length;\n const breaks = new Set<number>();\n for (let i = 0; i < n; i++) {\n if (isCorner(sub, i, closed, cosCorner)) breaks.add(i);\n if (isLongStraight(sub, i, closed)) {\n breaks.add(i);\n breaks.add((i + 1) % n);\n }\n }\n const corners = [...breaks].sort((a, b) => a - b);\n const result: PenAnchor[] = [];\n if (closed && corners.length === 0) {\n const pts = sampleRun(sub, 0, n, tol);\n const t = unit(sub2(pts[1], pts[pts.length - 2]));\n fitRun(pts, t, neg(t), tol, result, true);\n return result;\n }\n const stops = closed ? [...corners, corners[0] + n] : corners;\n for (let k = 0; k + 1 < stops.length; k++) {\n const pts = sampleRun(sub, stops[k], stops[k + 1], tol);\n const last = closed && k + 2 === stops.length;\n fitRun(pts, unit(sub2(pts[1], pts[0])), unit(sub2(pts[pts.length - 2], pts[pts.length - 1])), tol, result, last);\n }\n return result;\n}\n\n/** Whether the path turns at `sub[i]` by more than the corner angle. */\nfunction isCorner(sub: PenAnchor[], i: number, closed: boolean, cosCorner: number): boolean {\n const n = sub.length;\n const a = sub[i];\n const prev = sub[(i - 1 + n) % n];\n const next = sub[(i + 1) % n];\n if (!closed && (i === 0 || i === n - 1)) return true;\n const from = a.inHandle && !same(a.inHandle, a) ? a.inHandle : prev.outHandle && !same(prev.outHandle, a) ? prev.outHandle : prev;\n const to = a.outHandle && !same(a.outHandle, a) ? a.outHandle : next.inHandle && !same(next.inHandle, a) ? next.inHandle : next;\n const d1 = unit(sub2(a, from));\n const d2 = unit(sub2(to, a));\n return d1.x * d2.x + d1.y * d2.y < cosCorner;\n}\n\n/** Whether the segment leaving `sub[i]` is straight and far longer than the\n * segments either side: a flat between curves, kept whole rather than folded\n * into a curve fitted across it. */\nfunction isLongStraight(sub: PenAnchor[], i: number, closed: boolean): boolean {\n const n = sub.length;\n const len = (k: number): number => {\n if (!closed && (k < 0 || k >= n - 1)) return 0;\n const a = sub[(k + n) % n];\n const b = sub[(k + 1) % n];\n return Math.hypot(b.x - a.x, b.y - a.y);\n };\n if (!closed && i >= n - 1) return false;\n const a = sub[i];\n const b = sub[(i + 1) % n];\n if (a.outHandle || b.inHandle) return false;\n return len(i) >= LONG_STRAIGHT * Math.max(len(i - 1), len(i + 1));\n}\n\n/** Points along the anchors from index `from` to `to` (mod length), both\n * anchors included. */\nfunction sampleRun(sub: PenAnchor[], from: number, to: number, tol: number): Point[] {\n const n = sub.length;\n const pts: Point[] = [{ x: sub[from % n].x, y: sub[from % n].y }];\n for (let i = from; i < to; i++) {\n const a = sub[i % n];\n const b = sub[(i + 1) % n];\n if (!a.outHandle && !b.inHandle) {\n const len = Math.hypot(b.x - a.x, b.y - a.y);\n const steps = Math.min(MAX_LINE_SAMPLES, Math.max(1, Math.floor(len / (4 * tol))));\n for (let k = 1; k <= steps; k++) pts.push({ x: a.x + ((b.x - a.x) * k) / steps, y: a.y + ((b.y - a.y) * k) / steps });\n } else {\n const c1 = a.outHandle ?? a;\n const c2 = b.inHandle ?? b;\n for (let k = 1; k <= CUBIC_SAMPLES; k++) pts.push(cubicPointAt(a, c1, c2, b, k / CUBIC_SAMPLES));\n }\n }\n return dedupe(pts);\n}\n\n/**\n * Fit `pts` with cubics held to the end tangents, splitting at the worst\n * sample until every sample is within `tol`, and append the anchors after the\n * first to `out` (the first too when `out` is empty). `closing` folds the\n * final anchor, which lands on the subpath's first, into that first one.\n */\nfunction fitRun(pts: Point[], tStart: Point, tEnd: Point, tol: number, out: PenAnchor[], closing: boolean): void {\n if (out.length === 0) out.push({ x: pts[0].x, y: pts[0].y });\n const segs: Array<{ c1?: Point; c2?: Point; end: Point }> = [];\n fitRecursive(pts, tStart, tEnd, tol, segs);\n segs.forEach((seg, i) => {\n const prev = out[out.length - 1];\n if (seg.c1) prev.outHandle = seg.c1;\n const isLast = i === segs.length - 1;\n if (closing && isLast) {\n if (seg.c2) out[0].inHandle = seg.c2;\n return;\n }\n out.push(seg.c2 ? { x: seg.end.x, y: seg.end.y, inHandle: seg.c2 } : { x: seg.end.x, y: seg.end.y });\n });\n}\n\nfunction fitRecursive(\n pts: Point[], tStart: Point, tEnd: Point, tol: number,\n out: Array<{ c1?: Point; c2?: Point; end: Point }>,\n): void {\n const a = pts[0];\n const e = pts[pts.length - 1];\n if (pts.length <= 2 || worstFromLine(pts, a, e).dist <= tol) {\n out.push({ end: e });\n return;\n }\n const { cp1, cp2 } = fitCubicWithTangents(pts, tStart, tEnd);\n const worst = worstFromCubic(pts, a, cp1, cp2, e);\n if (worst.dist <= tol) {\n out.push({ c1: cp1, c2: cp2, end: e });\n return;\n }\n const k = worst.index;\n const center = unit(sub2(pts[k + 1], pts[k - 1]));\n fitRecursive(pts.slice(0, k + 1), tStart, neg(center), tol, out);\n fitRecursive(pts.slice(k), center, tEnd, tol, out);\n}\n\nfunction worstFromLine(pts: Point[], a: Point, e: Point): { index: number; dist: number } {\n let index = 1, dist = 0;\n for (let i = 1; i < pts.length - 1; i++) {\n const d = nearestOnLine(pts[i].x, pts[i].y, a.x, a.y, e.x, e.y).dist;\n if (d > dist) { dist = d; index = i; }\n }\n return { index, dist };\n}\n\nfunction worstFromCubic(pts: Point[], a: Point, c1: Point, c2: Point, e: Point): { index: number; dist: number } {\n let index = 1, dist = 0;\n for (let i = 1; i < pts.length - 1; i++) {\n const d = nearestOnCubic(pts[i].x, pts[i].y, a.x, a.y, c1.x, c1.y, c2.x, c2.y, e.x, e.y).dist;\n if (d > dist) { dist = d; index = i; }\n }\n return { index, dist };\n}\n\nfunction dedupe(pts: Point[]): Point[] {\n return pts.filter((p, i) => i === 0 || !same(p, pts[i - 1]));\n}\n\nconst same = (p: Point, q: Point): boolean => p.x === q.x && p.y === q.y;\nconst sub2 = (p: Point, q: Point): Point => ({ x: p.x - q.x, y: p.y - q.y });\nconst neg = (p: Point): Point => ({ x: -p.x, y: -p.y });\nfunction unit(p: Point): Point {\n const len = Math.hypot(p.x, p.y);\n return len === 0 ? { x: 0, y: 0 } : { x: p.x / len, y: p.y / len };\n}\n","/**\n * Screen-pixel lengths in world units, per axis.\n *\n * Chrome declares its hit zones in screen pixels — an 8px handle stays 8px at\n * every zoom, because it paints in screen space. Converting one such length to\n * world units with a single scalar (see `meanScale`) is exact only under\n * uniform zoom; per-axis it is too generous on one axis and too mean on the\n * other, so the pickable region stops matching the painted one.\n *\n * Prefer {@link withinPxBox} / {@link withinPxRadius}, which compare in screen\n * space and so can't drift from the paint at all. {@link pxExtent} is for the\n * cases that must stay in world units — a tolerance handed to geometry that\n * doesn't know about the view.\n */\n\nexport interface Scale2 {\n x: number;\n y: number;\n}\n\n/** One screen-pixel length as world-space extents, per axis. `scale` is a\n * view's, so neither axis is zero (see `View`).\n *\n * With `rotation`, the axes are a frame turned that far from world, and each\n * extent is how far along it an edge across it must move to move `px` on\n * screen — which, under non-uniform zoom, is not the extent along the screen\n * axis nearest to it. */\nexport function pxExtent(px: number, scale: Scale2, rotation = 0): { x: number; y: number } {\n if (!rotation) {\n return {\n x: px / Math.abs(scale.x),\n y: px / Math.abs(scale.y),\n };\n }\n const c = Math.cos(rotation), s = Math.sin(rotation);\n return {\n x: px * Math.hypot(c / scale.x, s / scale.y),\n y: px * Math.hypot(s / scale.x, c / scale.y),\n };\n}\n\n/** World delta → screen delta. Only the scale participates: translation\n * cancels in a difference, and the kit's views carry no skew. */\nexport function scaleDelta(dx: number, dy: number, scale: Scale2): { x: number; y: number } {\n return { x: dx * scale.x, y: dy * scale.y };\n}\n\n/**\n * Is a world-space delta inside a screen-space square of half-extent `px`?\n *\n * The square is axis-aligned **on screen**, which is what a handle painted in\n * screen space actually is — so this stays true under non-uniform zoom and\n * under a rotated target, where an axis-aligned world-space test is a rotated\n * rectangle on screen.\n */\nexport function withinPxBox(dx: number, dy: number, px: number, scale: Scale2): boolean {\n const s = scaleDelta(dx, dy, scale);\n return Math.abs(s.x) <= px && Math.abs(s.y) <= px;\n}\n\n/** Is a world-space delta inside a screen-space circle of radius `px`? */\nexport function withinPxRadius(dx: number, dy: number, px: number, scale: Scale2): boolean {\n const s = scaleDelta(dx, dy, scale);\n return s.x * s.x + s.y * s.y <= px * px;\n}\n\n/**\n * A world point pushed `px` screen pixels off an edge, along the edge's normal\n * as it lands on screen. `normal` is the edge's outward normal in world space.\n *\n * Scaling the world normal by the view is not the same thing: under\n * non-uniform zoom the image of a normal is no longer perpendicular to the\n * image of its edge, so chrome placed that way drifts sideways and sits closer\n * than `px`. Returns the point in world coords and the on-screen unit normal.\n */\nexport function standoff(\n anchor: { x: number; y: number },\n normal: { x: number; y: number },\n px: number,\n scale: Scale2,\n): { x: number; y: number; nx: number; ny: number } {\n // The edge's screen normal is S⁻ᵀn, here scaled by det S to stay finite.\n const k = Math.sign(scale.x * scale.y) || 1;\n let nx = normal.x * scale.y * k;\n let ny = normal.y * scale.x * k;\n const l = Math.hypot(nx, ny) || 1;\n nx /= l;\n ny /= l;\n return { x: anchor.x + (nx * px) / scale.x, y: anchor.y + (ny * px) / scale.y, nx, ny };\n}\n\n/** The screen angle a frame turned `rotation` from world lands its x axis at.\n * Equals `rotation` under uniform zoom; non-uniform zoom bends it. */\nexport function screenAngleOf(rotation: number, scale: Scale2): number {\n return Math.atan2(Math.sin(rotation) * scale.y, Math.cos(rotation) * scale.x);\n}\n","/**\n * Where each point of an edited path came from, so an array kept per point (a skin's\n * weights) can follow an edit that inserts, deletes, or reorders points.\n */\n\nimport type { PolygonPath } from '../path';\nimport { anchorsToPath, pathToAnchors, type PenAnchor } from './anchors';\n\n/** The anchor model `pathToAnchors` produces; `AnchorSet` in `anchorEdits`. */\ninterface Anchors {\n anchors: PenAnchor[][];\n closed: boolean[];\n}\n\n/**\n * Where a point of an edited path came from: point `a` of the path before the edit, or for a\n * point the edit made, a blend `t` of the way from point `a` to point `b`.\n */\nexport interface PointOrigin {\n a: number;\n b: number;\n t: number;\n}\n\n/** The points of the path before the edit that one anchor held. */\ninterface Held {\n point: number;\n in?: number;\n out?: number;\n}\n\ninterface Point { x: number; y: number }\n\nconst at = (x: number): Point => ({ x, y: x });\nconst keyOf = (p: Point): string => `${p.x},${p.y}`;\n\n/**\n * Which point of `path` each anchor of `set` was decoded from. `pathToAnchors` runs again\n * over a path whose every point holds its own index, so the two walks cannot disagree.\n */\nfunction heldBy(path: PolygonPath, set: Anchors): Held[][] {\n const coords = new Float32Array(path.coords.length);\n for (let i = 0; i < coords.length; i++) coords[i] = i >> 1;\n const indexed = pathToAnchors({ ...path, coords }).anchors;\n return indexed.map((sub, s) => {\n // No two index points coincide, so a closing curve the real walk folded is unfolded here.\n if (sub.length === set.anchors[s].length + 1) sub[0].inHandle = sub.pop()!.inHandle;\n return sub.map((a) => ({ point: a.x, in: a.inHandle?.x, out: a.outHandle?.x }));\n });\n}\n\n/** For each point `anchorsToPath` writes for `set`: the flat index of the anchor it belongs to,\n * times 3, plus 0 for the anchor's own point, 1 for its in handle, and 2 for its out handle. */\nfunction writtenFrom(set: Anchors): Float32Array {\n let flat = 0;\n const coded = set.anchors.map((sub) => sub.map((a) => {\n const k = 3 * flat++;\n return {\n ...at(k),\n ...(a.inHandle ? { inHandle: at(k + 1) } : {}),\n ...(a.outHandle ? { outHandle: at(k + 2) } : {}),\n };\n }));\n return anchorsToPath(coded, set.closed).coords;\n}\n\n/** The nearest anchor of `sub` from `i`, stepping by `step`, that the path before the edit\n * held; around the seam when the subpath is closed. */\nfunction neighbor(sub: readonly (Held | undefined)[], closed: boolean, i: number, step: 1 | -1): number {\n for (let n = 1; n < sub.length; n++) {\n let j = i + step * n;\n if (j < 0 || j >= sub.length) {\n if (!closed) return -1;\n j = (j + sub.length) % sub.length;\n }\n if (sub[j]) return j;\n }\n return -1;\n}\n\n/** The origin of an anchor the edit made: its held neighbors, blended by its distance to each. */\nfunction blended(\n anchors: readonly PenAnchor[],\n held: readonly (Held | undefined)[],\n closed: boolean,\n i: number,\n): PointOrigin | null {\n const p = neighbor(held, closed, i, -1);\n const n = neighbor(held, closed, i, 1);\n if (p === -1 && n === -1) return null;\n const a = held[p === -1 ? n : p]!.point;\n const b = held[n === -1 ? p : n]!.point;\n if (p === -1 || n === -1 || a === b) return { a, b: a, t: 0 };\n const dp = Math.hypot(anchors[i].x - anchors[p].x, anchors[i].y - anchors[p].y);\n const dn = Math.hypot(anchors[i].x - anchors[n].x, anchors[i].y - anchors[n].y);\n return { a, b, t: dp + dn > 0 ? dp / (dp + dn) : 0 };\n}\n\n/** What an anchor the edit put exactly where one was holds: that anchor's point, and each\n * handle that is where one of its handles was. */\nfunction copied(anchor: PenAnchor, byPlace: ReadonlyMap<string, Held>): Held | undefined {\n const was = byPlace.get(keyOf(anchor));\n if (!was) return undefined;\n const handle = (h: Point | undefined) => (h ? byPlace.get(`${keyOf(anchor)}:${keyOf(h)}`)?.point : undefined);\n return { point: was.point, in: handle(anchor.inHandle), out: handle(anchor.outHandle) };\n}\n\n/**\n * `editAnchorSet`, answering also where each point of the new path came from.\n *\n * An anchor the edit kept, moved or not, keeps its points. One the edit put exactly where an\n * anchor was takes that anchor's, each handle by where it is, so a subpath turned around\n * keeps its weights. A handle an edit gave an anchor that had none takes the anchor's point. An anchor the edit made is a blend of the nearest kept anchors either side\n * of it in its subpath, by its distance to each, or a copy of the one it has; its origin is\n * `null` when its subpath has none.\n */\nexport function editAnchorSetTracked(\n path: PolygonPath,\n edit: (set: Anchors) => boolean | void,\n): { path: PolygonPath; origins: (PointOrigin | null)[] } | null {\n const set = pathToAnchors(path);\n const byAnchor = new Map<PenAnchor, Held>();\n const byPlace = new Map<string, Held>();\n heldBy(path, set).forEach((sub, s) => sub.forEach((held, i) => {\n const anchor = set.anchors[s][i];\n byAnchor.set(anchor, held);\n if (byPlace.has(keyOf(anchor))) return;\n // Handles are filed under where they are, for an anchor that comes back as a copy.\n if (anchor.inHandle) byPlace.set(`${keyOf(anchor)}:${keyOf(anchor.inHandle)}`, { point: held.in! });\n if (anchor.outHandle) byPlace.set(`${keyOf(anchor)}:${keyOf(anchor.outHandle)}`, { point: held.out! });\n byPlace.set(keyOf(anchor), { point: held.point });\n }));\n\n if (edit(set) === false) return null;\n\n const held: (Held | undefined)[] = [];\n const own: (PointOrigin | null)[] = [];\n set.anchors.forEach((sub, s) => {\n const subHeld = sub.map((a) => byAnchor.get(a) ?? copied(a, byPlace));\n sub.forEach((_, i) => {\n const h = subHeld[i];\n held.push(h);\n own.push(h ? { a: h.point, b: h.point, t: 0 } : blended(sub, subHeld, set.closed[s], i));\n });\n });\n\n const origins = Array.from(writtenFrom(set).filter((_, i) => i % 2 === 0), (code) => {\n const anchor = Math.floor(code / 3);\n const handle = code % 3 === 1 ? held[anchor]?.in : code % 3 === 2 ? held[anchor]?.out : undefined;\n return handle === undefined ? own[anchor] : { a: handle, b: handle, t: 0 };\n });\n return { path: anchorsToPath(set.anchors, set.closed, path), origins };\n}\n\n/**\n * An array kept per point of a path, carried through an edit: `origins` is what\n * {@link editAnchorSetTracked} answered. A point with no origin, and an origin past the\n * array's end, read 0.\n */\nexport function remapPointValues(\n values: ArrayLike<number>,\n origins: readonly (PointOrigin | null)[],\n): number[] {\n return origins.map((o) => {\n if (!o) return 0;\n const a = values[o.a] ?? 0;\n return o.t === 0 ? a : a + ((values[o.b] ?? 0) - a) * o.t;\n });\n}\n","/**\n * Pure anchor-set edits on the model `pathToAnchors` produces: subpath-major\n * `PenAnchor[][]` plus a parallel `closed: boolean[]`. Every function here\n * mutates that structure in place; callers decode with `pathToAnchors`,\n * apply, and re-encode with `anchorsToPath` (see {@link editAnchorSet}).\n *\n * Callers address anchors by flat index — the sequential position in walk\n * order across all subpaths, which is what `enumerateAnchors` reports.\n * {@link locateAnchor} and {@link flatAnchorIndex} convert to and from the\n * `(sub, idx)` pair.\n *\n * The two orders agree because `pathToAnchors` and `enumerateAnchors`\n * walk the same command stream and emit one anchor per M/L/C/Q, less the\n * end of a closing curve that lands on its subpath's first point.\n * `countPathAnchors`, which sizes the renderer's per-anchor arrays, counts\n * that end too and so can be one higher per closed subpath.\n */\n\nimport type { PolygonPath } from '../path';\nimport { withinPxRadius, type Scale2 } from '../pxExtent';\nimport {\n isAnchorSmooth,\n isStraightSegment,\n nearestSegmentT,\n segmentEnds,\n type PenAnchor,\n} from './anchors';\nimport { editAnchorSetTracked } from './anchorOrigins';\nimport { cubicPointAt, splitCubicAtT } from './cubicMath';\nimport { fitCubicThroughDeletion } from './spanFit';\n\n/** Subpath-major anchor model — the decoded form of a `PolygonPath`. */\nexport interface AnchorSet {\n anchors: PenAnchor[][];\n closed: boolean[];\n}\n\n/** A world-space rectangle, as produced by a drag-rect gesture. */\nexport interface AnchorRect {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\n/** Total anchors across every subpath. */\nexport function anchorCount(set: AnchorSet): number {\n let n = 0;\n for (const sub of set.anchors) n += sub.length;\n return n;\n}\n\n/** Flat index → `(sub, idx)`. Returns null when out of range. */\nexport function locateAnchor(\n set: AnchorSet,\n flatIndex: number,\n): { sub: number; idx: number } | null {\n if (flatIndex < 0) return null;\n let remaining = flatIndex;\n for (let sub = 0; sub < set.anchors.length; sub++) {\n const len = set.anchors[sub].length;\n if (remaining < len) return { sub, idx: remaining };\n remaining -= len;\n }\n return null;\n}\n\n/** `(sub, idx)` → flat index. Returns -1 when out of range. */\nexport function flatAnchorIndex(set: AnchorSet, sub: number, idx: number): number {\n if (sub < 0 || sub >= set.anchors.length) return -1;\n if (idx < 0 || idx >= set.anchors[sub].length) return -1;\n let base = 0;\n for (let s = 0; s < sub; s++) base += set.anchors[s].length;\n return base + idx;\n}\n\n/** Resolve a flat index to the anchor itself. Null when out of range. */\nexport function anchorAt(set: AnchorSet, flatIndex: number): PenAnchor | null {\n const loc = locateAnchor(set, flatIndex);\n if (!loc) return null;\n return set.anchors[loc.sub][loc.idx] ?? null;\n}\n\n/**\n * Decode `path`, hand the mutable anchor set to `edit`, and re-encode.\n * Returns null when `edit` returns `false` (it changed nothing), so callers\n * can skip a no-op commit.\n */\nexport function editAnchorSet(\n path: PolygonPath,\n edit: (set: AnchorSet) => boolean | void,\n): PolygonPath | null {\n return editAnchorSetTracked(path, edit)?.path ?? null;\n}\n\n/** Translate an anchor and both of its handles by `(dx, dy)`. */\nexport function translateAnchorBy(\n set: AnchorSet,\n flatIndex: number,\n dx: number,\n dy: number,\n): boolean {\n const a = anchorAt(set, flatIndex);\n if (!a) return false;\n a.x += dx;\n a.y += dy;\n if (a.inHandle) {\n a.inHandle.x += dx;\n a.inHandle.y += dy;\n }\n if (a.outHandle) {\n a.outHandle.x += dx;\n a.outHandle.y += dy;\n }\n return true;\n}\n\n/**\n * Move one control handle to an absolute world position. When the anchor was\n * smooth (handles collinear through the anchor) and `breakSmoothness` is\n * false, the opposite handle is mirrored so the curve stays smooth.\n */\nexport function moveHandleTo(\n set: AnchorSet,\n flatIndex: number,\n side: 'in' | 'out',\n toX: number,\n toY: number,\n breakSmoothness: boolean,\n): boolean {\n const a = anchorAt(set, flatIndex);\n if (!a) return false;\n const wasSmooth = isAnchorSmooth(a);\n const target = { x: toX, y: toY };\n if (side === 'out') a.outHandle = target;\n else a.inHandle = target;\n const oppositeSide = side === 'out' ? 'in' : 'out';\n const opposite = oppositeSide === 'in' ? a.inHandle : a.outHandle;\n if (!breakSmoothness && wasSmooth && opposite) {\n const mirrored = { x: 2 * a.x - target.x, y: 2 * a.y - target.y };\n if (oppositeSide === 'in') a.inHandle = mirrored;\n else a.outHandle = mirrored;\n }\n return true;\n}\n\n/**\n * Split the segment `(sub, segIdx) → (sub, segIdx + 1)` at parameter `t`,\n * inserting a new anchor there. On a closed subpath `segIdx` may also name\n * the closing segment (`sub.length - 1`); its new anchor is appended.\n *\n * A straight segment stays straight — the new anchor has no handles. A curved\n * one splits by de Casteljau, so the two halves trace the original path.\n *\n * Returns the new anchor's flat index, or -1 when the segment doesn't\n * exist.\n */\nexport function insertAnchorOnSegment(\n set: AnchorSet,\n args: { sub: number; segIdx: number; t: number },\n): number {\n const ends = segmentEnds(set.anchors, set.closed, args.sub, args.segIdx);\n if (!ends) return -1;\n const { a, b } = ends;\n const at = args.segIdx + 1;\n if (isStraightSegment(a, b)) {\n set.anchors[args.sub].splice(at, 0, {\n x: a.x + (b.x - a.x) * args.t,\n y: a.y + (b.y - a.y) * args.t,\n });\n return flatAnchorIndex(set, args.sub, at);\n }\n const p0 = a, p1 = a.outHandle ?? a, p2 = b.inHandle ?? b, p3 = b;\n const { left, right } = splitCubicAtT(p0, p1, p2, p3, args.t);\n a.outHandle = { x: left[1].x, y: left[1].y };\n b.inHandle = { x: right[2].x, y: right[2].y };\n set.anchors[args.sub].splice(at, 0, {\n x: left[3].x,\n y: left[3].y,\n inHandle: { x: left[2].x, y: left[2].y },\n outHandle: { x: right[1].x, y: right[1].y },\n });\n return flatAnchorIndex(set, args.sub, at);\n}\n\n/** A point on a segment, as {@link segmentAt} reports it. */\nexport interface SegmentHit {\n sub: number;\n segIdx: number;\n /** Parameter on the segment — what {@link insertAnchorOnSegment} takes. */\n t: number;\n /** The point on the path at `t`, in the set's own space. */\n x: number;\n y: number;\n}\n\n/**\n * The segment point under `(x, y)`, when it lies within `tolerancePx` of\n * the path on screen and no nearer than that to either of the segment's\n * own anchors — a press on an anchor is about the anchor, not the segment\n * beside it.\n *\n * `scale` is the view's, so the tolerance holds per axis under\n * non-uniform zoom. The search runs in screen-scaled space: scaling is\n * affine, so the curve's parameterization, and therefore `t`, carries\n * straight back to world space.\n */\nexport function segmentAt(\n set: AnchorSet,\n x: number,\n y: number,\n opts: { tolerancePx: number; scale?: Scale2 },\n): SegmentHit | null {\n const scale = opts.scale ?? { x: 1, y: 1 };\n const onScreen = (p: { x: number; y: number }) => ({ x: p.x * scale.x, y: p.y * scale.y });\n const screenAnchors = set.anchors.map((sub) => sub.map((a) => ({\n ...onScreen(a),\n ...(a.inHandle ? { inHandle: onScreen(a.inHandle) } : {}),\n ...(a.outHandle ? { outHandle: onScreen(a.outHandle) } : {}),\n })));\n const hit = nearestSegmentT(screenAnchors, x * scale.x, y * scale.y, set.closed);\n if (!hit) return null;\n const ends = segmentEnds(set.anchors, set.closed, hit.sub, hit.segIdx)!;\n const point = pointOnSegment(ends.a, ends.b, hit.t);\n const tol = opts.tolerancePx;\n if (!withinPxRadius(point.x - x, point.y - y, tol, scale)) return null;\n if (withinPxRadius(point.x - ends.a.x, point.y - ends.a.y, tol, scale)) return null;\n if (withinPxRadius(point.x - ends.b.x, point.y - ends.b.y, tol, scale)) return null;\n return { sub: hit.sub, segIdx: hit.segIdx, t: hit.t, x: point.x, y: point.y };\n}\n\nfunction pointOnSegment(a: PenAnchor, b: PenAnchor, t: number): { x: number; y: number } {\n if (isStraightSegment(a, b)) return { x: a.x + (b.x - a.x) * t, y: a.y + (b.y - a.y) * t };\n return cubicPointAt(a, a.outHandle ?? a, b.inHandle ?? b, b, t);\n}\n\n/**\n * Delete the anchors at `flatIndexes`. Where a deleted anchor had\n * neighbors on both sides — across the seam too, on a closed subpath — the\n * surviving segment is refitted to the two it replaces (`fitCubicThroughDeletion`)\n * so the path keeps its shape; a gap between two straight segments closes straight.\n *\n * Subpaths left with fewer than two anchors are dropped entirely. If that\n * would leave the path with no subpaths at all, the whole deletion is refused\n * (returns false, `set` untouched): an empty path leaves the node selected\n * and in the scene with nothing on screen and no anchors to grab it by.\n */\nexport function deleteAnchorsAt(set: AnchorSet, flatIndexes: Iterable<number>): boolean {\n const bySub = new Map<number, number[]>();\n for (const flat of new Set(flatIndexes)) {\n const loc = locateAnchor(set, flat);\n if (!loc) continue;\n const list = bySub.get(loc.sub);\n if (list) list.push(loc.idx);\n else bySub.set(loc.sub, [loc.idx]);\n }\n if (bySub.size === 0) return false;\n\n // Refuse up front if this would wipe the path out — cheaper and safer\n // than mutating and rolling back.\n let survivors = 0;\n for (let s = 0; s < set.anchors.length; s++) {\n const doomed = bySub.get(s)?.length ?? 0;\n if (set.anchors[s].length - doomed >= 2) survivors++;\n }\n if (survivors === 0) return false;\n\n for (const [s, indices] of bySub) {\n const sub = set.anchors[s];\n if (!sub) continue;\n // Descending so each splice leaves the not-yet-processed indices valid.\n indices.sort((a, b) => b - a);\n for (const i of indices) {\n const wraps = set.closed[s] && sub.length > 2;\n const prev = wraps ? sub[(i - 1 + sub.length) % sub.length] : sub[i - 1];\n const next = wraps ? sub[(i + 1) % sub.length] : sub[i + 1];\n if (prev && next && !(isStraightSegment(prev, sub[i]) && isStraightSegment(sub[i], next))) {\n const { c1, c2 } = fitCubicThroughDeletion(prev, sub[i], next);\n prev.outHandle = c1;\n next.inHandle = c2;\n }\n sub.splice(i, 1);\n }\n }\n\n // Drop degenerate subpaths, back to front so indices stay valid.\n for (let s = set.anchors.length - 1; s >= 0; s--) {\n if (set.anchors[s].length < 2) {\n set.anchors.splice(s, 1);\n set.closed.splice(s, 1);\n }\n }\n return true;\n}\n\n/**\n * Scissors: open a closed subpath at the given anchor. The anchor list is\n * rotated to start there and a second anchor at the same point ends it, so\n * every segment survives and the two ends can be pulled apart. No-ops on an\n * already-open subpath — there's nothing to cut.\n */\nexport function openSubpathAt(set: AnchorSet, flatIndex: number): boolean {\n const loc = locateAnchor(set, flatIndex);\n if (!loc) return false;\n if (!set.closed[loc.sub]) return false;\n const sub = set.anchors[loc.sub];\n if (!sub) return false;\n const { inHandle, ...start } = sub[loc.idx];\n const end: PenAnchor = { x: start.x, y: start.y, ...(inHandle ? { inHandle } : {}) };\n set.anchors[loc.sub] = [start, ...sub.slice(loc.idx + 1), ...sub.slice(0, loc.idx), end];\n set.closed[loc.sub] = false;\n return true;\n}\n\n/** Flat indices of every anchor whose on-curve point falls inside `rect`. */\nexport function anchorsInRect(set: AnchorSet, rect: AnchorRect): number[] {\n const x2 = rect.x + rect.width;\n const y2 = rect.y + rect.height;\n const hits: number[] = [];\n let flat = 0;\n for (const sub of set.anchors) {\n for (const a of sub) {\n if (a.x >= rect.x && a.x <= x2 && a.y >= rect.y && a.y <= y2) hits.push(flat);\n flat++;\n }\n }\n return hits;\n}\n","/**\n * Average and Join: anchor-set edits that bring anchors together. Both mutate\n * the model `pathToAnchors` produces in place, like the edits in\n * `anchorEdits`, and address anchors by flat index.\n */\n\nimport type { PenAnchor } from './anchors';\nimport { locateAnchor, translateAnchorBy, type AnchorSet } from './anchorEdits';\n\n/** Which coordinates {@link averageAnchorsAt} averages: `'x'` lines the\n * anchors up on one vertical, `'y'` on one horizontal, `'both'` stacks them\n * on one point. */\nexport type AverageAxis = 'x' | 'y' | 'both';\n\n/** One end of an open subpath. */\nexport interface SubpathEnd {\n sub: number;\n end: 'first' | 'last';\n}\n\n/** Endpoints closer than this are one point, and joining them merges them. */\nconst COINCIDENT = 1e-6;\n\n/**\n * Move each anchor in `flatIndexes` to their mean position, along `axis`.\n * Each anchor carries its handles with it. Returns false, changing nothing,\n * when fewer than two of the indexes name anchors.\n */\nexport function averageAnchorsAt(set: AnchorSet, flatIndexes: Iterable<number>, axis: AverageAxis = 'both'): boolean {\n const picked: { flat: number; a: PenAnchor }[] = [];\n for (const flat of new Set(flatIndexes)) {\n const loc = locateAnchor(set, flat);\n if (loc) picked.push({ flat, a: set.anchors[loc.sub][loc.idx] });\n }\n if (picked.length < 2) return false;\n const mx = picked.reduce((s, p) => s + p.a.x, 0) / picked.length;\n const my = picked.reduce((s, p) => s + p.a.y, 0) / picked.length;\n for (const { flat, a } of picked) {\n translateAnchorBy(set, flat, axis === 'y' ? 0 : mx - a.x, axis === 'x' ? 0 : my - a.y);\n }\n return true;\n}\n\n/** The open-subpath end anchor `flatIndex` names, or null for an interior\n * anchor or one on a closed subpath. A lone anchor reads as `'last'`. */\nexport function subpathEndAt(set: AnchorSet, flatIndex: number): SubpathEnd | null {\n const loc = locateAnchor(set, flatIndex);\n if (!loc || set.closed[loc.sub]) return null;\n const len = set.anchors[loc.sub].length;\n if (loc.idx === len - 1) return { sub: loc.sub, end: 'last' };\n if (loc.idx === 0) return { sub: loc.sub, end: 'first' };\n return null;\n}\n\n/**\n * Join the two open-subpath ends `a` and `b`. The two ends of one subpath\n * close it; ends of two subpaths make one subpath, `a`'s run followed by\n * `b`'s, in the slot of whichever came first. Ends that coincide merge into\n * one anchor, keeping the handle on either side; ends apart are bridged by a\n * straight segment. Returns false, changing nothing, when the ends are not\n * two distinct ends of open subpaths.\n */\nexport function joinSubpathEnds(set: AnchorSet, a: SubpathEnd, b: SubpathEnd): boolean {\n const subA = set.anchors[a.sub];\n const subB = set.anchors[b.sub];\n if (!subA || !subB || set.closed[a.sub] || set.closed[b.sub]) return false;\n if (a.sub === b.sub) {\n if (a.end === b.end || subA.length < 2) return false;\n const first = subA[0];\n const last = subA[subA.length - 1];\n if (coincide(first, last) && subA.length > 2) {\n if (last.inHandle) first.inHandle = last.inHandle;\n subA.pop();\n }\n set.closed[a.sub] = true;\n return true;\n }\n if (a.end === 'first') reverseInPlace(subA);\n if (b.end === 'last') reverseInPlace(subB);\n const tail = subA[subA.length - 1];\n const head = subB[0];\n let joined: PenAnchor[];\n if (coincide(tail, head)) {\n if (head.outHandle) tail.outHandle = head.outHandle;\n joined = [...subA, ...subB.slice(1)];\n } else {\n joined = [...subA, ...subB];\n }\n const keep = Math.min(a.sub, b.sub);\n const drop = Math.max(a.sub, b.sub);\n set.anchors[keep] = joined;\n set.anchors.splice(drop, 1);\n set.closed.splice(drop, 1);\n return true;\n}\n\n/** {@link joinSubpathEnds} for two anchors named by flat index, each the end\n * of an open subpath. */\nexport function joinAnchorsAt(set: AnchorSet, flatA: number, flatB: number): boolean {\n if (flatA === flatB) return false;\n const a = subpathEndAt(set, flatA);\n const b = subpathEndAt(set, flatB);\n if (!a || !b) return false;\n return joinSubpathEnds(set, a, b);\n}\n\n/**\n * The two open-subpath ends nearest each other that `accept` allows, on two\n * different subpaths. Null when there are no two such subpaths.\n */\nexport function closestOpenEnds(\n set: AnchorSet,\n accept: (a: SubpathEnd, b: SubpathEnd) => boolean = () => true,\n): [SubpathEnd, SubpathEnd] | null {\n const ends: { end: SubpathEnd; at: PenAnchor }[] = [];\n set.anchors.forEach((sub, s) => {\n if (set.closed[s] || sub.length < 2) return;\n ends.push({ end: { sub: s, end: 'first' }, at: sub[0] });\n ends.push({ end: { sub: s, end: 'last' }, at: sub[sub.length - 1] });\n });\n let best: [SubpathEnd, SubpathEnd] | null = null;\n let bestD = Infinity;\n for (let i = 0; i < ends.length; i++) {\n for (let j = i + 1; j < ends.length; j++) {\n const p = ends[i], q = ends[j];\n if (p.end.sub === q.end.sub || !accept(p.end, q.end)) continue;\n const d = Math.hypot(p.at.x - q.at.x, p.at.y - q.at.y);\n if (d < bestD) { bestD = d; best = [p.end, q.end]; }\n }\n }\n return best;\n}\n\nconst coincide = (p: PenAnchor, q: PenAnchor): boolean => Math.hypot(p.x - q.x, p.y - q.y) <= COINCIDENT;\n\n/** Reverse `sub`'s direction keeping each anchor object, so origin tracking\n * (`editAnchorSetTracked`) still recognizes them. */\nfunction reverseInPlace(sub: PenAnchor[]): void {\n sub.reverse();\n for (const a of sub) {\n const { inHandle, outHandle } = a;\n delete a.inHandle;\n delete a.outHandle;\n if (outHandle) a.inHandle = outHandle;\n if (inHandle) a.outHandle = inHandle;\n }\n}\n","/**\n * A path flattened into runs of points, sorted by whether each subpath\n * encloses area: what the hit tests in `pathHitTest.ts` walk.\n */\nimport { forEachSegment, PATH_C, PATH_L, PATH_M, PATH_Q, PATH_Z } from './commands';\nimport { DEFAULT_FLATTEN_TOLERANCE, flattenCubic, flattenQuadratic } from './flatten';\nimport { fillsOpenSubpaths } from './openFill';\nimport type { PolygonPath } from './path';\n\n/**\n * `path` flattened to interleaved `[x, y, …]` runs, sorted by whether each\n * subpath encloses area. A `Z` closing fewer than three points yields an open\n * run, as does any subpath a `Z` never ends. The closing edge of a closed run\n * back to its first vertex is implicit.\n */\nexport function flatSubpaths(\n path: PolygonPath,\n tolerance: number,\n): { closed: number[][]; open: number[][] } {\n const { commands, coords } = path;\n const closed: number[][] = [];\n const open: number[][] = [];\n let sub: number[] = [];\n\n forEachSegment(commands, coords, (cmd, ci, curX, curY, _i, opensSubpath) => {\n if (opensSubpath) sub = [curX, curY];\n switch (cmd) {\n case PATH_M:\n if (sub.length >= 2) open.push(sub);\n sub = [coords[ci], coords[ci + 1]];\n break;\n case PATH_L:\n sub.push(coords[ci], coords[ci + 1]);\n break;\n case PATH_C:\n flattenCubic(\n curX, curY,\n coords[ci], coords[ci + 1],\n coords[ci + 2], coords[ci + 3],\n coords[ci + 4], coords[ci + 5],\n tolerance, sub,\n );\n break;\n case PATH_Q:\n flattenQuadratic(\n curX, curY,\n coords[ci], coords[ci + 1],\n coords[ci + 2], coords[ci + 3],\n tolerance, sub,\n );\n break;\n case PATH_Z:\n if (sub.length >= 6) closed.push(sub);\n else if (sub.length >= 2) open.push(sub);\n sub = [];\n break;\n default:\n throw new Error(`pathHitTest: unknown command ${cmd}`);\n }\n });\n if (sub.length >= 2) open.push(sub);\n return { closed, open };\n}\n\n/** `flatSubpaths`, with each open run a fill closes moved among the closed. */\nexport function regionSubpaths(\n path: PolygonPath,\n opts: { tolerance?: number },\n): { closed: number[][]; open: number[][] } {\n const flat = flatSubpaths(path, opts.tolerance ?? DEFAULT_FLATTEN_TOLERANCE);\n if (!fillsOpenSubpaths(path)) return flat;\n return {\n closed: [...flat.closed, ...flat.open.filter((sub) => sub.length >= 6)],\n open: flat.open.filter((sub) => sub.length < 6),\n };\n}\n\nexport function closedSubpaths(path: PolygonPath, opts: { tolerance?: number }): number[][] {\n return regionSubpaths(path, opts).closed;\n}\n","/**\n * Is a point within `px` screen pixels of a world-space stroke band?\n *\n * The band is a capsule of radius `r` around each segment, in the frame the\n * path lives in; `m` is the linear part of that frame's map to the screen.\n * Under a similarity the answer is a plain world distance, `r + px / scale`.\n * Under anything else the capsule lands on screen as a parallelogram capped by\n * two ellipses, and the pixel slop has to be measured against that shape:\n * neither a scalar nor a per-axis world tolerance describes it.\n */\nimport { pointSegmentDist2 } from './polyline';\n\n/** Linear part of a map to the screen: `x' = a·x + c·y`, `y' = b·x + d·y`. */\nexport interface Linear2 {\n a: number; b: number; c: number; d: number;\n}\n\n/** A linear map's singular decomposition, as much of it as the band test\n * needs: the two stretch factors, and the screen-space angle of the first. */\nexport interface Stretch {\n s1: number;\n s2: number;\n /** Angle of the first singular direction on screen. */\n phi: number;\n}\n\nexport function stretchOf(m: Linear2): Stretch {\n // Closed-form 2×2 SVD. M = R(phi) · diag(Q + R, Q − R) · R(theta).\n const e = (m.a + m.d) / 2;\n const f = (m.a - m.d) / 2;\n const g = (m.b + m.c) / 2;\n const h = (m.b - m.c) / 2;\n const q = Math.hypot(e, h);\n const r = Math.hypot(f, g);\n const phi = (Math.atan2(h, e) + Math.atan2(g, f)) / 2;\n return { s1: q + r, s2: Math.abs(q - r), phi };\n}\n\n/** True when the map scales every direction alike, so a screen length is one\n * world length. */\nexport function isSimilarity(s: Stretch): boolean {\n return s.s1 - s.s2 <= 1e-9 * s.s1;\n}\n\n/**\n * Screen point `(px0, py0)` against the image of one world capsule\n * `(ax, ay)–(bx, by)`, radius `r`, grown by `slop` pixels. `m`/`st` map world\n * to screen (linear part only — every point shares the translation).\n */\nexport function capsuleWithinPx(\n px0: number, py0: number,\n ax: number, ay: number, bx: number, by: number,\n r: number, slop: number,\n m: Linear2, st: Stretch,\n): boolean {\n const sax = m.a * ax + m.c * ay, say = m.b * ax + m.d * ay;\n const sbx = m.a * bx + m.c * by, sby = m.b * bx + m.d * by;\n const slop2 = slop * slop;\n const dCenter2 = pointSegmentDist2(px0, py0, sax, say, sbx, sby);\n if (dCenter2 <= slop2) return true;\n if (r <= 0) return false;\n // Nothing in the band is farther from the centerline than r·s1 on screen.\n const reach = slop + r * st.s1;\n if (dCenter2 > reach * reach) return false;\n\n // The parallelogram: the capsule's straight part, carried to the screen.\n const wx = bx - ax, wy = by - ay;\n const wl = Math.hypot(wx, wy);\n if (wl > 0) {\n const nx = (-wy / wl) * r, ny = (wx / wl) * r;\n const ox = m.a * nx + m.c * ny, oy = m.b * nx + m.d * ny;\n if (quadWithinPx(px0, py0, [\n sax + ox, say + oy, sbx + ox, sby + oy,\n sbx - ox, sby - oy, sax - ox, say - oy,\n ], slop2)) return true;\n }\n // The round caps: each end's disk lands on screen as an ellipse.\n return ellipseWithinPx(px0 - sax, py0 - say, r, slop, st)\n || ellipseWithinPx(px0 - sbx, py0 - sby, r, slop, st);\n}\n\n/** Inside a convex quad, or within `sqrt(slop2)` of one of its edges. */\nfunction quadWithinPx(x: number, y: number, q: readonly number[], slop2: number): boolean {\n let pos = 0, neg = 0;\n for (let i = 0; i < 8; i += 2) {\n const j = (i + 2) % 8;\n const cr = (q[j] - q[i]) * (y - q[i + 1]) - (q[j + 1] - q[i + 1]) * (x - q[i]);\n if (cr > 0) pos++;\n else if (cr < 0) neg++;\n }\n if (pos === 0 || neg === 0) return true;\n for (let i = 0; i < 8; i += 2) {\n const j = (i + 2) % 8;\n if (pointSegmentDist2(x, y, q[i], q[i + 1], q[j], q[j + 1]) <= slop2) return true;\n }\n return false;\n}\n\n/** `(dx, dy)` from the center of the filled ellipse `M(disk r)`, within `slop`? */\nfunction ellipseWithinPx(dx: number, dy: number, r: number, slop: number, st: Stretch): boolean {\n const cos = Math.cos(st.phi), sin = Math.sin(st.phi);\n const u = Math.abs(cos * dx + sin * dy);\n const v = Math.abs(-sin * dx + cos * dy);\n const e0 = r * st.s1, e1 = r * st.s2;\n if (e1 <= 0) {\n // Collapsed to a segment along the first axis.\n const over = Math.max(0, u - e0);\n return over * over + v * v <= slop * slop;\n }\n return distToEllipse(e0, e1, u, v) <= slop;\n}\n\n/**\n * Distance from `(y0, y1)`, first quadrant, to the filled axis-aligned ellipse\n * with semi-axes `e0 >= e1 > 0`. Eberly, \"Distance from a Point to an\n * Ellipse\" — bisection on the Lagrange root, robust near the axes.\n */\nfunction distToEllipse(e0: number, e1: number, y0: number, y1: number): number {\n const z0 = y0 / e0, z1 = y1 / e1;\n const g = z0 * z0 + z1 * z1 - 1;\n if (g <= 0) return 0;\n if (y1 > 0) {\n if (y0 > 0) {\n const r0 = (e0 / e1) * (e0 / e1);\n const n0 = r0 * z0;\n let s0 = z1 - 1;\n let s1 = Math.hypot(n0, z1) - 1;\n let s = 0;\n for (let i = 0; i < 100; i++) {\n s = (s0 + s1) / 2;\n if (s === s0 || s === s1) break;\n const a = n0 / (s + r0), b = z1 / (s + 1);\n const gs = a * a + b * b - 1;\n if (gs > 0) s0 = s;\n else if (gs < 0) s1 = s;\n else break;\n }\n const x0 = (r0 * y0) / (s + r0);\n const x1 = y1 / (s + 1);\n return Math.hypot(x0 - y0, x1 - y1);\n }\n return y1 - e1;\n }\n const numer = e0 * y0, denom = e0 * e0 - e1 * e1;\n if (numer < denom) {\n const t = numer / denom;\n const x0 = e0 * t, x1 = e1 * Math.sqrt(1 - t * t);\n return Math.hypot(x0 - y0, x1);\n }\n return y0 - e0;\n}\n","/**\n * Path hit-testing: path-vs-point (filled region and stroke distance),\n * path-vs-rect, and path-vs-polygon in both directions.\n *\n * A `rect` path short-circuits to AABB arithmetic. A `polygon` path is its\n * filled region: beziers are flattened, `fillRule` is honored (default\n * `nonzero`), and every closed subpath counts — the hole of a donut is not\n * part of the shape under `evenodd`. An open subpath counts as closed where a\n * fill closes it and encloses nothing where one does not: see\n * `fillsOpenSubpaths`.\n */\n\nimport { DEFAULT_FLATTEN_TOLERANCE } from './flatten';\nimport { pointInPolygon, pointSegmentDist2, segmentsCross } from './polyline';\nimport type { Rect } from './box';\nimport type { Path } from './path';\nimport { closedSubpaths, flatSubpaths, regionSubpaths } from './pathSubpaths';\nimport type { Affine } from './affine';\nimport type { Point } from './paths/cubicMath';\nimport { capsuleWithinPx, isSimilarity, stretchOf, type Linear2 } from './screenBand';\n\n\n/** Options for the path hit-tests. */\nexport interface PointInPathOptions {\n /** Bezier flattening tolerance in world units. Default 0.5. */\n tolerance?: number;\n}\n\n/** Options for {@link polygonIntersectsPath}. */\nexport interface PolygonIntersectsPathOptions extends PointInPathOptions {\n /** False when nothing paints the path's interior: only its outline can meet\n * the polygon, and a polygon lying wholly inside meets nothing. Default true. */\n filled?: boolean;\n}\n\n/** Options for {@link strokeHitTest}. */\nexport interface StrokeHitTestOptions {\n /** Bezier flattening tolerance in world units. Default 0.5. */\n tolerance?: number;\n /** Extra reach past the band measured in screen pixels rather than world\n * units: `px` pixels, after `transform` carries the path's frame to the\n * screen (only its linear part matters). A pointer's forgiveness is a\n * screen distance, and under a non-uniform or rotated-then-squished\n * transform no world distance equals it. */\n slop?: { px: number; transform: Affine };\n}\n\n// ─── Point vs path ──────────────────────────────────────────────────────────\n\n/** Filled-region hit-test for a path. Rect short-circuits to AABB; polygons run ray-cast / winding per `fillRule`. */\nexport function pointInPath(\n path: Path,\n x: number,\n y: number,\n opts: PointInPathOptions = {},\n): boolean {\n if (path.kind === 'rect') {\n return x >= path.x && x <= path.x + path.width && y >= path.y && y <= path.y + path.height;\n }\n let crossings = 0;\n let winding = 0;\n for (const sub of closedSubpaths(path, opts)) {\n const n = sub.length;\n for (let i = 0; i < n; i += 2) {\n const j = (i + 2) % n;\n const ay = sub[i + 1], by = sub[j + 1];\n if ((ay > y) === (by > y)) continue;\n const ax = sub[i], bx = sub[j];\n if (x >= ax + ((y - ay) / (by - ay)) * (bx - ax)) continue;\n crossings++;\n winding += ay <= y ? 1 : -1;\n }\n }\n return path.fillRule === 'evenodd' ? (crossings & 1) === 1 : winding !== 0;\n}\n\n/**\n * Stroke-distance hit-test. True when (x, y) lies within `threshold` world\n * units of the path's outline — when a stroke of total width `2 * threshold`\n * drawn along the path would cover the point. Works for open and closed\n * subpaths alike; OR it with {@link pointInPath} for fill-plus-stroke picking.\n * Every flattened segment is treated as a capsule of radius `threshold`.\n */\nexport function strokeHitTest(\n path: Path,\n x: number,\n y: number,\n threshold: number,\n opts: StrokeHitTestOptions = {},\n): boolean {\n const slop = opts.slop;\n if (slop && slop.px > 0) {\n const [a, b, c, d] = slop.transform;\n const m: Linear2 = { a, b, c, d };\n const st = stretchOf(m);\n // A view collapsed to a point shows nothing to hit, and a pixel there is no world length.\n if (st.s1 === 0) return false;\n if (isSimilarity(st)) {\n return strokeHitTest(path, x, y, threshold + slop.px / st.s1, { tolerance: opts.tolerance });\n }\n const sx = a * x + c * y, sy = b * x + d * y;\n return someSegment(path, opts.tolerance, (ax, ay, bx, by) =>\n capsuleWithinPx(sx, sy, ax, ay, bx, by, threshold, slop.px, m, st));\n }\n const t2 = threshold * threshold;\n return someSegment(path, opts.tolerance, (ax, ay, bx, by) =>\n pointSegmentDist2(x, y, ax, ay, bx, by) <= t2);\n}\n\n/** Does `visit` answer true for any outline segment — every edge of a rect,\n * closing edges of closed subpaths included? */\nfunction someSegment(\n path: Path,\n tolerance: number | undefined,\n visit: (ax: number, ay: number, bx: number, by: number) => boolean,\n): boolean {\n if (path.kind === 'rect') {\n const { x: rx, y: ry, width: w, height: h } = path;\n return visit(rx, ry, rx + w, ry) || visit(rx + w, ry, rx + w, ry + h)\n || visit(rx + w, ry + h, rx, ry + h) || visit(rx, ry + h, rx, ry);\n }\n const { closed, open } = flatSubpaths(path, tolerance ?? DEFAULT_FLATTEN_TOLERANCE);\n const run = (sub: readonly number[], wrap: boolean): boolean => {\n const n = sub.length;\n const last = wrap ? n : n - 2;\n for (let i = 0; i < last; i += 2) {\n const j = (i + 2) % n;\n if (visit(sub[i], sub[i + 1], sub[j], sub[j + 1])) return true;\n }\n return false;\n };\n return closed.some((sub) => run(sub, true)) || open.some((sub) => run(sub, false));\n}\n\n// ─── Region vs path ─────────────────────────────────────────────────────────\n\nfunction rectToVerts(r: Rect): Point[] {\n return [\n { x: r.x, y: r.y },\n { x: r.x + r.width, y: r.y },\n { x: r.x + r.width, y: r.y + r.height },\n { x: r.x, y: r.y + r.height },\n ];\n}\n\n/** Flatten a vertex array into an interleaved [x0,y0,x1,y1,...] array. */\nfunction flattenVerts(poly: readonly Point[]): number[] {\n const flat: number[] = new Array(poly.length * 2);\n for (let i = 0; i < poly.length; i++) {\n flat[i * 2] = poly[i].x;\n flat[i * 2 + 1] = poly[i].y;\n }\n return flat;\n}\n\n/** Edge-vs-edge segment intersection check between two closed polygons. */\nfunction polygonsIntersect(a: readonly Point[], b: readonly Point[]): boolean {\n if (a.length === 0 || b.length === 0) return false;\n if (pointInPolygon(flattenVerts(a), b[0].x, b[0].y)) return true;\n if (pointInPolygon(flattenVerts(b), a[0].x, a[0].y)) return true;\n for (let i = 0; i < a.length; i++) {\n const a0 = a[i], a1 = a[(i + 1) % a.length];\n for (let j = 0; j < b.length; j++) {\n const b0 = b[j], b1 = b[(j + 1) % b.length];\n if (segmentsCross(a0.x, a0.y, a1.x, a1.y, b0.x, b0.y, b1.x, b1.y)) return true;\n }\n }\n return false;\n}\n\n/** Run `visit` over every edge of every closed subpath until it answers true. */\nfunction anyEdge(\n subpaths: readonly number[][],\n visit: (ax: number, ay: number, bx: number, by: number) => boolean,\n): boolean {\n for (const sub of subpaths) {\n const n = sub.length;\n for (let i = 0; i < n; i += 2) {\n const j = (i + 2) % n;\n if (visit(sub[i], sub[i + 1], sub[j], sub[j + 1])) return true;\n }\n }\n return false;\n}\n\nfunction anyEdgeCrossesRect(subpaths: readonly number[][], r: Rect): boolean {\n const x0 = r.x, y0 = r.y, x1 = r.x + r.width, y1 = r.y + r.height;\n return anyEdge(subpaths, (ax, ay, bx, by) =>\n segmentsCross(ax, ay, bx, by, x0, y0, x1, y0) ||\n segmentsCross(ax, ay, bx, by, x1, y0, x1, y1) ||\n segmentsCross(ax, ay, bx, by, x1, y1, x0, y1) ||\n segmentsCross(ax, ay, bx, by, x0, y1, x0, y0),\n );\n}\n\nfunction anyEdgeCrossesPolygon(subpaths: readonly number[][], poly: readonly Point[]): boolean {\n if (poly.length === 0) return false;\n return anyEdge(subpaths, (ax, ay, bx, by) => {\n for (let i = 0; i < poly.length; i++) {\n const p0 = poly[i], p1 = poly[(i + 1) % poly.length];\n if (segmentsCross(ax, ay, bx, by, p0.x, p0.y, p1.x, p1.y)) return true;\n }\n return false;\n });\n}\n\n/** `anyEdgeCrossesPolygon` for open runs: no edge back to the first vertex. */\nfunction anyOpenEdgeCrossesPolygon(runs: readonly number[][], poly: readonly Point[]): boolean {\n for (const run of runs) {\n for (let i = 0; i + 3 < run.length; i += 2) {\n const ax = run[i], ay = run[i + 1], bx = run[i + 2], by = run[i + 3];\n for (let k = 0; k < poly.length; k++) {\n const p0 = poly[k], p1 = poly[(k + 1) % poly.length];\n if (segmentsCross(ax, ay, bx, by, p0.x, p0.y, p1.x, p1.y)) return true;\n }\n }\n }\n return false;\n}\n\nfunction anyVertexInRect(subpaths: readonly number[][], r: Rect): boolean {\n for (const sub of subpaths) {\n for (let i = 0; i < sub.length; i += 2) {\n const x = sub[i], y = sub[i + 1];\n if (x >= r.x && x <= r.x + r.width && y >= r.y && y <= r.y + r.height) return true;\n }\n }\n return false;\n}\n\nfunction anyVertexInPolygon(subpaths: readonly number[][], flatPoly: readonly number[]): boolean {\n for (const sub of subpaths) {\n for (let i = 0; i < sub.length; i += 2) {\n if (pointInPolygon(flatPoly, sub[i], sub[i + 1])) return true;\n }\n }\n return false;\n}\n\n/** Returns true if (x, y) lies within the filled region of `path`. */\nexport function pathContainsPoint(\n path: Path,\n x: number,\n y: number,\n opts: PointInPathOptions = {},\n): boolean {\n return pointInPath(path, x, y, opts);\n}\n\n/** Returns true if `rect` is entirely contained within `path`. */\nexport function pathContainsRect(path: Path, rect: Rect, opts: PointInPathOptions = {}): boolean {\n if (path.kind === 'rect') {\n return (\n rect.x >= path.x &&\n rect.y >= path.y &&\n rect.x + rect.width <= path.x + path.width &&\n rect.y + rect.height <= path.y + path.height\n );\n }\n const subpaths = closedSubpaths(path, opts);\n if (subpaths.length === 0) return false;\n for (const c of rectToVerts(rect)) {\n if (!pointInPath(path, c.x, c.y, opts)) return false;\n }\n // Every corner is filled, but any contour reaching into the rect — the\n // boundary of a hole, or a concave notch — leaves part of it unfilled.\n return !anyVertexInRect(subpaths, rect) && !anyEdgeCrossesRect(subpaths, rect);\n}\n\n/** Returns true if `rect` overlaps (intersects or contains) `path`. */\nexport function pathIntersectsRect(path: Path, rect: Rect, opts: PointInPathOptions = {}): boolean {\n if (path.kind === 'rect') {\n return (\n rect.x < path.x + path.width &&\n rect.x + rect.width > path.x &&\n rect.y < path.y + path.height &&\n rect.y + rect.height > path.y\n );\n }\n const subpaths = closedSubpaths(path, opts);\n if (subpaths.length === 0) return false;\n for (const c of rectToVerts(rect)) {\n if (pointInPath(path, c.x, c.y, opts)) return true;\n }\n if (anyVertexInRect(subpaths, rect)) return true;\n return anyEdgeCrossesRect(subpaths, rect);\n}\n\n/** Returns true if every vertex of `polygon` lies inside `path`. */\nexport function pathContainsPolygon(\n path: Path,\n polygon: readonly Point[],\n opts: PointInPathOptions = {},\n): boolean {\n if (polygon.length === 0) return false;\n if (path.kind === 'rect') {\n return polygon.every(\n (p) =>\n p.x >= path.x &&\n p.x <= path.x + path.width &&\n p.y >= path.y &&\n p.y <= path.y + path.height,\n );\n }\n const subpaths = closedSubpaths(path, opts);\n if (subpaths.length === 0) return false;\n for (const p of polygon) {\n if (!pointInPath(path, p.x, p.y, opts)) return false;\n }\n return !anyVertexInPolygon(subpaths, flattenVerts(polygon)) &&\n !anyEdgeCrossesPolygon(subpaths, polygon);\n}\n\n/** Returns true if `polygon` overlaps (intersects or is contained by) `path`. */\nexport function pathIntersectsPolygon(\n path: Path,\n polygon: readonly Point[],\n opts: PointInPathOptions = {},\n): boolean {\n if (polygon.length === 0) return false;\n if (path.kind === 'rect') {\n return polygonsIntersect(rectToVerts(path), polygon);\n }\n const subpaths = closedSubpaths(path, opts);\n if (subpaths.length === 0) return false;\n for (const p of polygon) {\n if (pointInPath(path, p.x, p.y, opts)) return true;\n }\n if (anyVertexInPolygon(subpaths, flattenVerts(polygon))) return true;\n return anyEdgeCrossesPolygon(subpaths, polygon);\n}\n\n/**\n * Returns true if all of `path` — every subpath, open ones included, beziers\n * flattened — lies inside the closed `polygon`: the inverse of\n * {@link pathContainsPolygon}. A lasso enclosing a shape asks this.\n */\nexport function polygonContainsPath(\n polygon: readonly Point[],\n path: Path,\n opts: PointInPathOptions = {},\n): boolean {\n if (polygon.length < 3) return false;\n let subpaths: number[][];\n if (path.kind === 'rect') {\n subpaths = [flattenVerts(rectToVerts(path))];\n } else {\n const { closed, open } = regionSubpaths(path, opts);\n subpaths = [...closed, ...open];\n }\n if (subpaths.length === 0) return false;\n const flatPoly = flattenVerts(polygon);\n for (const sub of subpaths) {\n for (let i = 0; i < sub.length; i += 2) {\n if (!pointInPolygon(flatPoly, sub[i], sub[i + 1])) return false;\n }\n }\n // Every vertex is inside, but a concave polygon can still cut an edge. An\n // open subpath is checked as if closed, so this can only err toward false.\n return !anyEdgeCrossesPolygon(subpaths, polygon);\n}\n\n/**\n * Returns true if any of `path` meets the closed `polygon`: its filled region,\n * or the line of an open subpath, which encloses nothing. With `filled: false`\n * a closed subpath is a line too. Beziers are\n * flattened, so a control point off the curve never counts. The companion of\n * {@link polygonContainsPath}; a lasso touching a shape asks this.\n */\nexport function polygonIntersectsPath(\n polygon: readonly Point[],\n path: Path,\n opts: PolygonIntersectsPathOptions = {},\n): boolean {\n if (polygon.length < 3) return false;\n const filled = opts.filled !== false;\n if (path.kind === 'rect' && filled) return polygonsIntersect(rectToVerts(path), polygon);\n const { closed, open } = path.kind === 'rect'\n ? { closed: [flattenVerts(rectToVerts(path))], open: [] }\n : regionSubpaths(path, opts);\n const flatPoly = flattenVerts(polygon);\n if (anyVertexInPolygon(closed, flatPoly) || anyVertexInPolygon(open, flatPoly)) return true;\n if (anyEdgeCrossesPolygon(closed, polygon) || anyOpenEdgeCrossesPolygon(open, polygon)) {\n return true;\n }\n // No vertex inside and no crossing: the polygon lies wholly in one region\n // of the path, so one of its vertices decides whether that region is filled.\n return filled && closed.length > 0 && pointInPath(path, polygon[0].x, polygon[0].y, opts);\n}\n","/**\n * Ergonomic builders for tiny shape paths used by chrome / overlays / markers.\n * They all return `PolygonPath`.\n *\n * Not appropriate for *user-drawn* shapes (those have a pose and live in the\n * scene).\n */\n\nimport { rectToContour } from '../box';\nimport { PATH_L, PATH_M, PATH_Z } from '../commands';\nimport type { PolygonPath } from '../path';\n\n/**\n * N-segment polygon approximation of a circle. Default 32 segments → max\n * radial deviation of ≈0.005·r (≈0.05 px at r=10). Bump higher for large\n * filled circles where the facets become visible.\n */\nexport function circlePath(cx: number, cy: number, r: number, segments = 32): PolygonPath {\n const cmds = new Uint8Array(segments + 1);\n const coords = new Float32Array(segments * 2);\n cmds[0] = PATH_M;\n coords[0] = cx + r;\n coords[1] = cy;\n for (let i = 1; i < segments; i++) {\n cmds[i] = PATH_L;\n const theta = (i / segments) * Math.PI * 2;\n coords[i * 2] = cx + r * Math.cos(theta);\n coords[i * 2 + 1] = cy + r * Math.sin(theta);\n }\n cmds[segments] = PATH_Z;\n return { kind: 'polygon', commands: cmds, coords, fillRule: 'nonzero' };\n}\n\n/** Axis-aligned square centred at (cx, cy) with side length `size`. */\nexport function squarePath(cx: number, cy: number, size: number): PolygonPath {\n const half = size / 2;\n const x0 = cx - half, y0 = cy - half;\n const x1 = cx + half, y1 = cy + half;\n return {\n kind: 'polygon',\n commands: new Uint8Array([PATH_M, PATH_L, PATH_L, PATH_L, PATH_Z]),\n coords: new Float32Array([x0, y0, x1, y0, x1, y1, x0, y1]),\n fillRule: 'nonzero',\n };\n}\n\n/** Axis-aligned rectangle. Top-left at (x, y), width/height as given. */\nexport function rectMarkerPath(x: number, y: number, width: number, height: number): PolygonPath {\n return {\n kind: 'polygon',\n commands: new Uint8Array([PATH_M, PATH_L, PATH_L, PATH_L, PATH_Z]),\n coords: Float32Array.from(rectToContour(x, y, width, height)),\n fillRule: 'nonzero',\n };\n}\n\n/**\n * Axis-aligned rounded rectangle. Top-left at (x, y); `r` is clamped to half\n * the shorter side. Each corner is `cornerSamples` line segments — the\n * default 8 gives the same angular resolution as `circlePath`'s 32.\n */\nexport function roundRectPath(\n x: number,\n y: number,\n width: number,\n height: number,\n r: number,\n cornerSamples = 8,\n): PolygonPath {\n const radius = Math.max(0, Math.min(r, Math.min(width, height) / 2));\n if (radius === 0) return rectMarkerPath(x, y, width, height);\n\n const HALF_PI = Math.PI / 2;\n // Corner centers paired with the arc's start angle, walked clockwise in\n // screen space from the top-left.\n const corners: Array<[number, number, number]> = [\n [x + radius, y + radius, Math.PI],\n [x + width - radius, y + radius, -HALF_PI],\n [x + width - radius, y + height - radius, 0],\n [x + radius, y + height - radius, HALF_PI],\n ];\n\n const perCorner = cornerSamples + 1;\n const count = corners.length * perCorner;\n const cmds = new Uint8Array(count + 1);\n const coords = new Float32Array(count * 2);\n let i = 0;\n for (const [cx, cy, start] of corners) {\n for (let s = 0; s <= cornerSamples; s++) {\n const theta = start + (s / cornerSamples) * HALF_PI;\n cmds[i] = i === 0 ? PATH_M : PATH_L;\n coords[i * 2] = cx + radius * Math.cos(theta);\n coords[i * 2 + 1] = cy + radius * Math.sin(theta);\n i++;\n }\n }\n cmds[count] = PATH_Z;\n return { kind: 'polygon', commands: cmds, coords, fillRule: 'nonzero' };\n}\n","/**\n * 2D affine matrix utilities. Column-major 9 elements, matching\n * `WebGL2RenderingContext.uniformMatrix3fv` element order so an upload needs\n * no transpose flag.\n *\n * Layout (column-major):\n * [m00, m10, 0,\n * m01, m11, 0,\n * tx, ty, 1]\n */\n\nimport { invert as invertAffine, type Affine } from './affine';\n\n/**\n * A 2D affine transform as a column-major 9-element array, laid out as above.\n *\n * Every matrix the kit builds is a `Float64Array`: a view translation far\n * from the origin at high zoom needs more than a float32's 24 bits to hold a\n * fraction of a pixel. A `Float32Array` is accepted wherever one is read.\n * `mat3.toUniform` makes the float32 copy a GL uniform upload wants.\n */\nexport type GlMat3 = Float32Array | Float64Array;\n\nfunction create(a: number, b: number, c: number, d: number, tx: number, ty: number): GlMat3 {\n // Column-major:\n // col 0: (a, b, 0)\n // col 1: (c, d, 0)\n // col 2: (tx, ty, 1)\n return new Float64Array([a, b, 0, c, d, 0, tx, ty, 1]);\n}\n\nfunction identity(): GlMat3 {\n return create(1, 0, 0, 1, 0, 0);\n}\n\nfunction multiply(out: GlMat3, m: GlMat3): GlMat3 {\n // out := out · m (right-multiply by m).\n const a = out[0], b = out[1];\n const c = out[3], d = out[4];\n const tx = out[6], ty = out[7];\n const ma = m[0], mb = m[1];\n const mc = m[3], md = m[4];\n const mtx = m[6], mty = m[7];\n\n return create(\n a * ma + c * mb, // new a\n b * ma + d * mb, // new b\n a * mc + c * md, // new c\n b * mc + d * md, // new d\n a * mtx + c * mty + tx, // new tx\n b * mtx + d * mty + ty, // new ty\n );\n}\n\n/** `m · T(tx, ty)`: composes onto `m`, where `@weasel-js/geom`'s `translate`\n * constructs a fresh matrix. */\nfunction translated(m: GlMat3, tx: number, ty: number): GlMat3 {\n const t = create(1, 0, 0, 1, tx, ty);\n return multiply(m, t);\n}\n\n/** `m · S(sx, sy)`: composes onto `m`, where geom's `scale` constructs one. */\nfunction scaled(m: GlMat3, sx: number, sy: number): GlMat3 {\n const s = create(sx, 0, 0, sy, 0, 0);\n return multiply(m, s);\n}\n\n/** This layout read as the kernel's 6-element affine. The two carry the same\n * logical order, so the conversion is a repack and nothing else. */\nfunction toAffine(m: GlMat3): Affine {\n return [m[0], m[1], m[3], m[4], m[6], m[7]];\n}\n\n/** The kernel's affine in this layout. The inverse of {@link toAffine}. */\nfunction fromAffine(a: Affine): GlMat3 {\n return create(a[0], a[1], a[2], a[3], a[4], a[5]);\n}\n\n/** Inverse of an affine matrix, or `null` when `@weasel-js/geom`'s `invert`\n * finds it singular — the same rule, read through this layout. */\nfunction invert(m: GlMat3): GlMat3 | null {\n const inv = invertAffine(toAffine(m));\n return inv && fromAffine(inv);\n}\n\n/** A float32 copy of `m`, for `uniformMatrix3fv` or a shader uniform value. */\nfunction toUniform(m: GlMat3): Float32Array {\n return Float32Array.from(m);\n}\n\nfunction apply(m: GlMat3, x: number, y: number): [number, number] {\n const a = m[0], b = m[1];\n const c = m[3], d = m[4];\n const tx = m[6], ty = m[7];\n return [a * x + c * y + tx, b * x + d * y + ty];\n}\n\n/**\n * Map screen pixel coords (0..width on X, 0..height on Y, top-left origin)\n * into clip space (-1..1 on X, 1..-1 on Y — note Y flip so screen-down\n * matches clip-down).\n */\nfunction screenToClip(width: number, height: number): GlMat3 {\n return create(\n 2 / width, // a\n 0, // b\n 0, // c\n -2 / height, // d\n -1, // tx\n 1, // ty\n );\n}\n\n/**\n * Uniform-equivalent scale factor: the square root of the absolute\n * determinant of the linear part, i.e. the geometric mean of the two axis\n * scales. Rotation-invariant. Under non-uniform scale it is between the two\n * axes and exact on neither — the same compromise `meanScale` documents.\n */\nfunction meanScaleOf(m: GlMat3): number {\n return Math.sqrt(Math.abs(m[0] * m[4] - m[1] * m[3]));\n}\n\n/** The least any direction is scaled by the linear part — its smaller singular\n * value. What a screen length is worth in world units, at most. */\nfunction minScaleOf(m: GlMat3): number {\n const sum = m[0] * m[0] + m[1] * m[1] + m[3] * m[3] + m[4] * m[4];\n const det = m[0] * m[4] - m[1] * m[3];\n return Math.sqrt(Math.max(0, (sum - Math.sqrt(Math.max(0, sum * sum - 4 * det * det))) / 2));\n}\n\n/** The renderer's 3x3 matrix operations, as one namespace. These work on the\n * 9-element form the GL uniform upload wants — distinct from the 6-element\n * `Affine`, though the logical element order is the same. */\nexport const mat3 = {\n identity,\n toAffine,\n fromAffine,\n multiply,\n translated,\n scaled,\n invert,\n toUniform,\n apply,\n screenToClip,\n meanScaleOf,\n minScaleOf,\n};\n","import type { GlMat3 } from './glMat3';\nimport type { View } from './view';\n\n/**\n * Build the world→screen transform matrix for a `View`.\n * Use as the `transform` field of a `kind: 'group'` DrawCommand to wrap\n * world-space content emitted from a layer `draw` implementation.\n *\n * Mapping: `screen = (world − {view.x, view.y}) × {view.scale.x, view.scale.y}`.\n *\n * Column-major layout (matches `mat3.identity()`):\n * `[scale.x, 0, 0, 0, scale.y, 0, -view.x*scale.x, -view.y*scale.y, 1]`.\n */\nexport function viewToMat3(view: View): GlMat3 {\n const sx = view.scale.x;\n const sy = view.scale.y;\n // Add 0 to coerce -0 → 0, matching `mat3.identity()` for the {0,0,1} case.\n const tx = -view.x * sx + 0;\n const ty = -view.y * sy + 0;\n return new Float64Array([\n sx, 0, 0,\n 0, sy, 0,\n tx, ty, 1,\n ]);\n}\n","import type { Rect } from './box';\n\n/** Which side of the anchor the overlay sits on. */\nexport type PlacementSide = 'top' | 'bottom' | 'left' | 'right';\n\n/** How the overlay lines up along the side it sits on. */\nexport type PlacementAlign = 'start' | 'center' | 'end';\n\n/** A side paired with an alignment along it. */\nexport interface Placement {\n side: PlacementSide;\n align: PlacementAlign;\n}\n\n/** Inputs to {@link placeRect}. All rects share one coordinate space. */\nexport interface PlaceRectOptions {\n anchor: Rect;\n overlay: { width: number; height: number };\n boundary: Rect;\n placement: Placement;\n /** Gap between anchor and overlay along the side axis. Default 0. */\n offset?: number;\n /** Shift along the alignment axis. Default 0. */\n crossOffset?: number;\n /** Minimum gap kept between the overlay and the boundary. Default 0. */\n padding?: number;\n /** Whether to try the opposite side when the preferred one lacks room. Default true. */\n flip?: boolean;\n}\n\n/** Where the overlay landed, and the placement that produced it. */\nexport interface PlacedRect {\n rect: Rect;\n placement: Placement;\n}\n\nfunction alignAlong(start: number, extent: number, size: number, align: PlacementAlign): number {\n if (align === 'start') return start;\n if (align === 'end') return start + extent - size;\n return start + (extent - size) / 2;\n}\n\nfunction positionOn(\n anchor: Rect,\n overlay: { width: number; height: number },\n placement: Placement,\n offset: number,\n crossOffset: number,\n): Rect {\n const { width, height } = overlay;\n const { side, align } = placement;\n if (side === 'top' || side === 'bottom') {\n const y = side === 'bottom' ? anchor.y + anchor.height + offset : anchor.y - offset - height;\n return { x: alignAlong(anchor.x, anchor.width, width, align) + crossOffset, y, width, height };\n }\n const x = side === 'right' ? anchor.x + anchor.width + offset : anchor.x - offset - width;\n return { x, y: alignAlong(anchor.y, anchor.height, height, align) + crossOffset, width, height };\n}\n\nfunction clampAxis(start: number, size: number, low: number, extent: number, padding: number): number {\n const min = low + padding;\n return Math.max(min, Math.min(start, min + extent - padding * 2 - size));\n}\n\n/**\n * Move `rect` the shortest distance that puts it inside `boundary`, keeping its\n * size. A rect too big to fit pins to the boundary's leading edge.\n */\nexport function clampRectWithin(rect: Rect, boundary: Rect, padding = 0): Rect {\n return {\n ...rect,\n x: clampAxis(rect.x, rect.width, boundary.x, boundary.width, padding),\n y: clampAxis(rect.y, rect.height, boundary.y, boundary.height, padding),\n };\n}\n\n/** Slide along the alignment axis until the overlay is inside. */\nfunction shiftAcross(rect: Rect, boundary: Rect, side: PlacementSide, padding: number): Rect {\n const vertical = side === 'top' || side === 'bottom';\n const size = vertical ? rect.width : rect.height;\n const low = (vertical ? boundary.x : boundary.y) + padding;\n const high = low + (vertical ? boundary.width : boundary.height) - padding * 2 - size;\n const placed = Math.max(low, Math.min(vertical ? rect.x : rect.y, high));\n return vertical ? { ...rect, x: placed } : { ...rect, y: placed };\n}\n\nconst OPPOSITE: Record<PlacementSide, PlacementSide> = {\n top: 'bottom',\n bottom: 'top',\n left: 'right',\n right: 'left',\n};\n\nfunction fitsAlongSide(rect: Rect, boundary: Rect, side: PlacementSide, padding: number): boolean {\n const vertical = side === 'top' || side === 'bottom';\n const start = vertical ? rect.y : rect.x;\n const end = start + (vertical ? rect.height : rect.width);\n const low = (vertical ? boundary.y : boundary.x) + padding;\n const high = low + (vertical ? boundary.height : boundary.width) - padding * 2;\n return start >= low && end <= high;\n}\n\n/**\n * Position an overlay beside `anchor` at the requested placement. With `flip`,\n * a side that overflows the boundary is swapped for the opposite one when that\n * fits. The result then slides along the alignment axis to stay inside the\n * boundary; along the side axis it is left where it is, even if it overflows.\n */\nexport function placeRect(options: PlaceRectOptions): PlacedRect {\n const { anchor, overlay, boundary, placement, offset = 0, crossOffset = 0 } = options;\n const { padding = 0, flip = true } = options;\n\n let resolved = placement;\n let rect = positionOn(anchor, overlay, resolved, offset, crossOffset);\n\n if (flip && !fitsAlongSide(rect, boundary, resolved.side, padding)) {\n const opposite = { side: OPPOSITE[resolved.side], align: resolved.align };\n const flipped = positionOn(anchor, overlay, opposite, offset, crossOffset);\n if (fitsAlongSide(flipped, boundary, opposite.side, padding)) {\n resolved = opposite;\n rect = flipped;\n }\n }\n\n return { rect: shiftAcross(rect, boundary, resolved.side, padding), placement: resolved };\n}\n","/** An easing curve: maps normalized progress `t ∈ [0, 1]` to eased progress.\n * Curves may leave the 0–1 range in the middle (back, elastic) but should\n * pass through 0 at 0 and 1 at 1. */\nexport type EasingFn = (t: number) => number;\n\n/** A spring's physical parameters. Higher stiffness settles faster, higher\n * damping overshoots less, higher mass makes both sluggish. */\nexport interface SpringPreset {\n stiffness: number;\n damping: number;\n mass: number;\n}\n\n/** One of the tunings in `SPRING_PRESETS`. */\nexport type SpringPresetName = 'gentle' | 'wobbly' | 'stiff' | 'slow';\n\n// --- Polynomial family (degree 1-5). The unsuffixed `easeIn`/`easeOut`/\n// `easeInOut` aliases mirror the `easeInQuad` curve (degree 2) for backwards\n// compatibility with existing call sites.\n\n/** No easing: constant rate from start to finish. */\nexport const linear: EasingFn = (t) => t;\n\n// Quadratic (degree 2)\n/** Accelerates from a standstill, gently. */\nexport const easeInQuad: EasingFn = (t) => t * t;\n/** Decelerates to a stop, gently. The safe default for UI motion. */\nexport const easeOutQuad: EasingFn = (t) => 1 - (1 - t) * (1 - t);\n/** Accelerates then decelerates, gently. */\nexport const easeInOutQuad: EasingFn = (t) =>\n t < 0.5 ? 2 * t * t : 1 - 2 * (1 - t) * (1 - t);\n\n// Cubic (degree 3)\n/** Accelerates from a standstill, moderately. */\nexport const easeInCubic: EasingFn = (t) => t * t * t;\n/** Decelerates to a stop, moderately. */\nexport const easeOutCubic: EasingFn = (t) => 1 - Math.pow(1 - t, 3);\n/** Accelerates then decelerates, moderately. */\nexport const easeInOutCubic: EasingFn = (t) =>\n t < 0.5 ? 4 * t * t * t : 1 - Math.pow(-2 * t + 2, 3) / 2;\n\n// Quartic (degree 4)\n/** Accelerates from a standstill, sharply. */\nexport const easeInQuart: EasingFn = (t) => t * t * t * t;\n/** Decelerates to a stop, sharply. */\nexport const easeOutQuart: EasingFn = (t) => 1 - Math.pow(1 - t, 4);\n/** Accelerates then decelerates, sharply. */\nexport const easeInOutQuart: EasingFn = (t) =>\n t < 0.5 ? 8 * t * t * t * t : 1 - Math.pow(-2 * t + 2, 4) / 2;\n\n// Quintic (degree 5)\n/** Accelerates from a standstill, very sharply. */\nexport const easeInQuint: EasingFn = (t) => t * t * t * t * t;\n/** Decelerates to a stop, very sharply. */\nexport const easeOutQuint: EasingFn = (t) => 1 - Math.pow(1 - t, 5);\n/** Accelerates then decelerates, very sharply. */\nexport const easeInOutQuint: EasingFn = (t) =>\n t < 0.5 ? 16 * t * t * t * t * t : 1 - Math.pow(-2 * t + 2, 5) / 2;\n\n// --- Trigonometric / transcendental\n\n/** Accelerates from a standstill along a sine curve — the mildest\n * acceleration of the built-ins. */\nexport const easeInSine: EasingFn = (t) => 1 - Math.cos((t * Math.PI) / 2);\n/** Decelerates to a stop along a sine curve — the mildest\n * deceleration of the built-ins. */\nexport const easeOutSine: EasingFn = (t) => Math.sin((t * Math.PI) / 2);\n/** Accelerates then decelerates along a sine curve. */\nexport const easeInOutSine: EasingFn = (t) => -(Math.cos(Math.PI * t) - 1) / 2;\n\n/** Accelerates exponentially: barely moves at first, then rushes. */\nexport const easeInExpo: EasingFn = (t) => (t === 0 ? 0 : Math.pow(2, 10 * t - 10));\n/** Decelerates exponentially: leaps away, then creeps in. */\nexport const easeOutExpo: EasingFn = (t) => (t === 1 ? 1 : 1 - Math.pow(2, -10 * t));\n/** Exponential at both ends — a very fast middle between two\n * near-still extremes. */\nexport const easeInOutExpo: EasingFn = (t) => {\n if (t === 0) return 0;\n if (t === 1) return 1;\n return t < 0.5\n ? Math.pow(2, 20 * t - 10) / 2\n : (2 - Math.pow(2, -20 * t + 10)) / 2;\n};\n\n/** Accelerates along a circular arc: slow start, abrupt arrival. */\nexport const easeInCirc: EasingFn = (t) => 1 - Math.sqrt(1 - t * t);\n/** Decelerates along a circular arc: abrupt start, slow arrival. */\nexport const easeOutCirc: EasingFn = (t) => Math.sqrt(1 - Math.pow(t - 1, 2));\n/** Circular arcs at both ends. */\nexport const easeInOutCirc: EasingFn = (t) =>\n t < 0.5\n ? (1 - Math.sqrt(1 - Math.pow(2 * t, 2))) / 2\n : (Math.sqrt(1 - Math.pow(-2 * t + 2, 2)) + 1) / 2;\n\n// --- Overshoot / oscillate / decay (Penner's named curves).\n// Constants are the well-known defaults; a future iteration could expose\n// per-call tuning (stiffness on back, amplitude/period on elastic).\n\nconst C1 = 1.70158; // back overshoot\nconst C2 = C1 * 1.525; // back inOut\nconst C3 = C1 + 1;\nconst C4 = (2 * Math.PI) / 3; // elastic in/out\nconst C5 = (2 * Math.PI) / 4.5;\n\n/** Pulls back past the start before moving forward. Overshoots below 0. */\nexport const easeInBack: EasingFn = (t) => C3 * t * t * t - C1 * t * t;\n/** Overshoots the target, then settles back onto it. Exceeds 1. */\nexport const easeOutBack: EasingFn = (t) =>\n 1 + C3 * Math.pow(t - 1, 3) + C1 * Math.pow(t - 1, 2);\n/** Overshoots at both ends. Leaves the 0–1 range on each side. */\nexport const easeInOutBack: EasingFn = (t) =>\n t < 0.5\n ? (Math.pow(2 * t, 2) * ((C2 + 1) * 2 * t - C2)) / 2\n : (Math.pow(2 * t - 2, 2) * ((C2 + 1) * (2 * t - 2) + C2) + 2) / 2;\n\n/** Oscillates around the start with growing amplitude, then snaps away. */\nexport const easeInElastic: EasingFn = (t) => {\n if (t === 0) return 0;\n if (t === 1) return 1;\n return -Math.pow(2, 10 * t - 10) * Math.sin((t * 10 - 10.75) * C4);\n};\n/** Springs past the target and wobbles into it. Exceeds 1. */\nexport const easeOutElastic: EasingFn = (t) => {\n if (t === 0) return 0;\n if (t === 1) return 1;\n return Math.pow(2, -10 * t) * Math.sin((t * 10 - 0.75) * C4) + 1;\n};\n/** Wobbles at both ends. Leaves the 0–1 range on each side. */\nexport const easeInOutElastic: EasingFn = (t) => {\n if (t === 0) return 0;\n if (t === 1) return 1;\n return t < 0.5\n ? -(Math.pow(2, 20 * t - 10) * Math.sin((20 * t - 11.125) * C5)) / 2\n : (Math.pow(2, -20 * t + 10) * Math.sin((20 * t - 11.125) * C5)) / 2 + 1;\n};\n\n/** Lands on the target and bounces, in hops of decreasing height. */\nexport const easeOutBounce: EasingFn = (t) => {\n const n1 = 7.5625;\n const d1 = 2.75;\n if (t < 1 / d1) return n1 * t * t;\n if (t < 2 / d1) { t -= 1.5 / d1; return n1 * t * t + 0.75; }\n if (t < 2.5 / d1) { t -= 2.25 / d1; return n1 * t * t + 0.9375; }\n t -= 2.625 / d1;\n return n1 * t * t + 0.984375;\n};\n/** Bounces up to the start before departing — `easeOutBounce` reversed. */\nexport const easeInBounce: EasingFn = (t) => 1 - easeOutBounce(1 - t);\n/** Bounces at both ends. */\nexport const easeInOutBounce: EasingFn = (t) =>\n t < 0.5\n ? (1 - easeOutBounce(1 - 2 * t)) / 2\n : (1 + easeOutBounce(2 * t - 1)) / 2;\n\n// --- Backwards-compat aliases. Pre-library callers asked for `easeIn`/\n// `easeOut`/`easeInOut`; those resolve to the quadratic curve.\n/** Alias for `easeInQuad`, kept for call sites that predate the\n * named-curve library. */\nexport const easeIn = easeInQuad;\n/** Alias for `easeOutQuad`, kept for call sites that predate the\n * named-curve library. */\nexport const easeOut = easeOutQuad;\n/** Alias for `easeInOutQuad`, kept for call sites that predate the\n * named-curve library. */\nexport const easeInOut = easeInOutQuad;\n\n/** All easings in one bag — useful for demos / pickers. */\nexport const EASINGS = {\n linear,\n easeInQuad, easeOutQuad, easeInOutQuad,\n easeInCubic, easeOutCubic, easeInOutCubic,\n easeInQuart, easeOutQuart, easeInOutQuart,\n easeInQuint, easeOutQuint, easeInOutQuint,\n easeInSine, easeOutSine, easeInOutSine,\n easeInExpo, easeOutExpo, easeInOutExpo,\n easeInCirc, easeOutCirc, easeInOutCirc,\n easeInBack, easeOutBack, easeInOutBack,\n easeInElastic, easeOutElastic, easeInOutElastic,\n easeInBounce, easeOutBounce, easeInOutBounce,\n} as const;\n\n/** The name of one of the built-in easing curves. */\nexport type EasingName = keyof typeof EASINGS;\n\n/** Named spring tunings, from softest to firmest. Springs settle on a target\n * rather than running for a fixed duration, so these are an alternative to an\n * easing curve, not a modifier on one. */\nexport const SPRING_PRESETS: Record<SpringPresetName, SpringPreset> = {\n gentle: { stiffness: 120, damping: 14, mass: 1 },\n wobbly: { stiffness: 180, damping: 12, mass: 1 },\n stiff: { stiffness: 210, damping: 20, mass: 1 },\n slow: { stiffness: 80, damping: 20, mass: 1 },\n};\n","import { EASINGS, type EasingFn, type EasingName } from './easings';\n\n/** Cubic-bezier control points, CSS `cubic-bezier()` order. The curve's two\n * endpoints are implicit at (0,0) and (1,1). */\nexport interface BezierEasing {\n /** `readonly` so an `as const` preset is assignable; nothing ever writes it. */\n bezier: readonly [number, number, number, number];\n}\n\n/** An easing curve as a value: a function, the name of a built-in, or control\n * points. Anything an editor has to name, show or serialize must not be a bare\n * function, which is why the union exists. */\nexport type EasingSpec = EasingFn | EasingName | BezierEasing;\n\nconst NEWTON_ITERATIONS = 8;\nconst NEWTON_MIN_SLOPE = 1e-3;\nconst SUBDIVISION_EPSILON = 1e-7;\nconst SUBDIVISION_MAX = 12;\n\nfunction bezierAt(t: number, a1: number, a2: number): number {\n const c = 3 * a1;\n const b = 3 * (a2 - a1) - c;\n const a = 1 - c - b;\n return ((a * t + b) * t + c) * t;\n}\n\nfunction bezierSlope(t: number, a1: number, a2: number): number {\n const c = 3 * a1;\n const b = 3 * (a2 - a1) - c;\n const a = 1 - c - b;\n return (3 * a * t + 2 * b) * t + c;\n}\n\n/** Solve for the bezier parameter that puts the curve at `x`. Newton-Raphson\n * where the slope allows it, bisection where it does not — the standard\n * approach, and the one browsers use for `cubic-bezier()`. */\nfunction solveForX(x: number, x1: number, x2: number): number {\n let t = x;\n for (let i = 0; i < NEWTON_ITERATIONS; i++) {\n const slope = bezierSlope(t, x1, x2);\n if (slope < NEWTON_MIN_SLOPE) break;\n t -= (bezierAt(t, x1, x2) - x) / slope;\n }\n let lo = 0;\n let hi = 1;\n t = Math.min(1, Math.max(0, t));\n for (let i = 0; i < SUBDIVISION_MAX; i++) {\n const err = bezierAt(t, x1, x2) - x;\n if (Math.abs(err) < SUBDIVISION_EPSILON) return t;\n if (err > 0) hi = t; else lo = t;\n t = (lo + hi) / 2;\n }\n return t;\n}\n\n/** Build the easing curve for four cubic-bezier control points. `x1`/`x2` are\n * clamped to [0,1] — CSS `cubic-bezier()`'s constraint for a monotone x(t),\n * which both `solveForX` root-finders assume. `y1`/`y2` are unclamped: an\n * overshoot easing (back, elastic) needs them outside 0..1. */\nexport function cubicBezierEasing(\n x1: number, y1: number, x2: number, y2: number,\n): EasingFn {\n const cx1 = Math.min(1, Math.max(0, x1));\n const cx2 = Math.min(1, Math.max(0, x2));\n return (t) => {\n if (t <= 0) return 0;\n if (t >= 1) return 1;\n return bezierAt(solveForX(t, cx1, cx2), y1, y2);\n };\n}\n\n/** Memoized so two equal specs resolve to one function, not a fresh solver per call. */\nconst bezierCache = new Map<string, EasingFn>();\nconst BEZIER_CACHE_LIMIT = 256;\n\nfunction isBezier(spec: EasingSpec): spec is BezierEasing {\n return typeof spec === 'object' && spec !== null && 'bezier' in spec;\n}\n\n/** Resolve a spec to the function that shapes progress. `undefined` is linear. */\nexport function resolveEasing(spec?: EasingSpec): EasingFn {\n if (spec === undefined) return EASINGS.linear;\n if (typeof spec === 'function') return spec;\n if (typeof spec === 'string') {\n const fn = EASINGS[spec];\n if (!fn) throw new Error(`resolveEasing: unknown easing name \"${spec}\"`);\n return fn;\n }\n if (isBezier(spec)) {\n const [x1, y1, x2, y2] = spec.bezier;\n const key = `${x1},${y1},${x2},${y2}`;\n let fn = bezierCache.get(key);\n if (!fn) {\n fn = cubicBezierEasing(x1, y1, x2, y2);\n // A handle being dragged resolves a new curve every pointer move.\n if (bezierCache.size >= BEZIER_CACHE_LIMIT) bezierCache.delete(bezierCache.keys().next().value!);\n bezierCache.set(key, fn);\n }\n return fn;\n }\n throw new Error('resolveEasing: unrecognized easing spec');\n}\n","/**\n * Geometric mean of a per-axis scale's magnitudes, so a flipped (negative)\n * axis counts by its size.\n *\n * **Not for hit-testing.** A screen-pixel length is not one world distance\n * under non-uniform zoom, and collapsing it to a scalar makes a pickable\n * region too generous on one axis and too mean on the other. Use `pxExtent`\n * for a per-axis world length, or `withinPxBox` / `withinPxRadius` to compare\n * in screen space directly. Nor for placing chrome or measuring a pick slop:\n * `standoff` and `strokeHitTest`'s `slop` work on screen.\n *\n * What legitimately remains is a stroke width for a line that is not\n * axis-aligned: the renderer resolves a `{ px }` width through this same\n * mean, so a picker reading ink widths must too.\n */\nexport function meanScale(s: { x: number; y: number }): number {\n return Math.sqrt(Math.abs(s.x * s.y));\n}\n","/**\n * The kit's single encoding of the pose-rotation convention: \"rotate about the\n * pose's unrotated AABB center by `pose.rotation` (radians).\"\n *\n * A pose may also carry a `transform` inside the rotation. `poseFrameOf`\n * (`./poseFrame`) composes the two, and is what a reader that draws, bounds,\n * or picks the node wants; this module is the angle and pivot alone.\n */\nimport { forEachSegment, pathCommandCoordCount, PATH_L, PATH_M, PATH_Z } from './commands';\nimport type { Path, PolygonPath } from './path';\n\n/** Pivot (`cx`, `cy`) and angle resolved from a pose's rotation convention. */\nexport interface PoseRotation {\n cx: number;\n cy: number;\n rotation: number;\n}\n\n/**\n * Resolve a pose's rotation transform, or `null` when the pose carries no\n * effective rotation. Non-null requires a nonzero `rotation` **and** all four\n * AABB fields (`x`, `y`, `width`, `height`) — the pivot is the unrotated AABB\n * center.\n */\nexport function poseRotationOf(pose: unknown): PoseRotation | null {\n const p = pose as Partial<{ x: number; y: number; width: number; height: number; rotation: number }>;\n if (p.rotation && p.x != null && p.y != null && p.width != null && p.height != null) {\n return { cx: p.x + p.width / 2, cy: p.y + p.height / 2, rotation: p.rotation };\n }\n return null;\n}\n\n/**\n * Rotate every coordinate of `path` about `(cx, cy)` by `rotation` radians.\n * A `rect` promotes to a four-corner polygon (axis-aligned rects can't encode\n * rotation). Returns a fresh `PolygonPath`; never mutates the input.\n */\nexport function rotatePathAround(path: Path, cx: number, cy: number, rotation: number): PolygonPath {\n if (path.kind === 'rect') {\n return rotateRectCorners(path.x, path.y, path.width, path.height, cx, cy, rotation);\n }\n return rotatePolygon(path, cx, cy, rotation);\n}\n\nfunction rotatePolygon(path: PolygonPath, cx: number, cy: number, rotation: number): PolygonPath {\n const cos = Math.cos(rotation);\n const sin = Math.sin(rotation);\n const { commands, coords } = path;\n const next = new Float32Array(coords.length);\n forEachSegment(commands, coords, (cmd, ci) => {\n for (let k = 0, len = pathCommandCoordCount(cmd); k < len; k += 2) {\n const dx = coords[ci + k] - cx;\n const dy = coords[ci + k + 1] - cy;\n next[ci + k] = cx + dx * cos - dy * sin;\n next[ci + k + 1] = cy + dx * sin + dy * cos;\n }\n });\n return { ...path, coords: next };\n}\n\nfunction rotateRectCorners(\n x: number, y: number, w: number, h: number,\n cx: number, cy: number, rotation: number,\n): PolygonPath {\n const cos = Math.cos(rotation);\n const sin = Math.sin(rotation);\n const rotate = (px: number, py: number): [number, number] => {\n const dx = px - cx;\n const dy = py - cy;\n return [cx + dx * cos - dy * sin, cy + dx * sin + dy * cos];\n };\n const [x0, y0] = rotate(x, y);\n const [x1, y1] = rotate(x + w, y);\n const [x2, y2] = rotate(x + w, y + h);\n const [x3, y3] = rotate(x, y + h);\n const commands = new Uint8Array([PATH_M, PATH_L, PATH_L, PATH_L, PATH_Z]);\n const coords = new Float32Array([x0, y0, x1, y1, x2, y2, x3, y3]);\n return { kind: 'polygon', commands, coords, fillRule: 'nonzero' };\n}\n","/**\n * The one composition of a box pose into the matrix that carries its own\n * frame to its parent's: the rotation convention of `poseRotationOf`, and the\n * pose's residual `transform` inside it. Painting, culling, silhouettes, and\n * picking all read a pose through `poseFrameOf` so they agree on where the\n * node is.\n */\nimport { invert, multiply, rotateAboutPoint, type Affine } from './affine';\nimport type { Path } from './path';\nimport { transformPath } from './paths/transformPath';\nimport { poseRotationOf, rotatePathAround } from './poseRotation';\n\n/**\n * The linear part of a box pose that its box, rotation, and flips cannot\n * hold: a skew, or a scale that differs by axis. `[a, b, c, d]` in\n * `Affine` order (`x' = a·x + c·y`, `y' = b·x + d·y`), applied about the\n * box center to what the node draws in its unrotated box, before the\n * rotation. Absent is the identity.\n */\nexport type PoseLinear = readonly [a: number, b: number, c: number, d: number];\n\ninterface FramedBox {\n x: number;\n y: number;\n width: number;\n height: number;\n rotation?: number;\n transform?: PoseLinear;\n}\n\n/** `transform` when it changes anything, `null` for absent or the identity. */\nexport function poseLinearOf(pose: unknown): PoseLinear | null {\n const t = (pose as { transform?: unknown } | null | undefined)?.transform;\n if (!Array.isArray(t) || t.length !== 4) return null;\n if (t[0] === 1 && t[1] === 0 && t[2] === 0 && t[3] === 1) return null;\n return t as unknown as PoseLinear;\n}\n\n/**\n * The matrix taking a point in the pose's own unrotated box frame to where\n * the node draws it: `rotate(rotation) · transform`, about the box center.\n * `null` when the pose has neither, or is not a box, so a caller can skip\n * the step.\n */\nexport function poseFrameOf(pose: unknown): Affine | null {\n const p = pose as Partial<FramedBox> | null | undefined;\n if (!p || p.x == null || p.y == null || p.width == null || p.height == null) return null;\n const linear = poseLinearOf(p);\n if (!p.rotation && !linear) return null;\n const cx = p.x + p.width / 2;\n const cy = p.y + p.height / 2;\n if (!linear) return rotateAboutPoint(cx, cy, p.rotation as number);\n const [a, b, c, d] = linear;\n const about: Affine = [a, b, c, d, cx - (a * cx + c * cy), cy - (b * cx + d * cy)];\n return p.rotation ? multiply(rotateAboutPoint(cx, cy, p.rotation), about) : about;\n}\n\n/**\n * The inverse of {@link poseFrameOf}: where a parent-frame point falls in the\n * pose's unrotated box frame. `null` when there is no frame to undo, or when\n * the `transform` is singular and nothing maps back.\n */\nexport function poseFrameInverseOf(pose: unknown): Affine | null {\n if (!poseLinearOf(pose)) {\n // The same pivot turned back: exact, where inverting the matrix is not.\n const r = poseRotationOf(pose);\n return r && rotateAboutPoint(r.cx, r.cy, -r.rotation);\n }\n const frame = poseFrameOf(pose);\n return frame && invert(frame);\n}\n\n/** `path`, given in the pose's unrotated box frame, as the node draws it. */\nexport function pathThroughPoseFrame(path: Path, pose: unknown): Path {\n if (poseLinearOf(pose)) {\n const frame = poseFrameOf(pose);\n return frame ? transformPath(path, frame) : path;\n }\n const r = poseRotationOf(pose);\n return r ? rotatePathAround(path, r.cx, r.cy, r.rotation) : path;\n}\n","import { applyToPoint, type Affine } from '../affine';\nimport { anchorAt, anchorCount, translateAnchorBy, type AnchorSet } from './anchorEdits';\nimport { isAnchorSmooth, type PenAnchor } from './anchors';\n\ntype Pt = { x: number; y: number };\ntype Side = 'in' | 'out';\n\n/**\n * How a path maps onto itself under one transform `m`: `partners[i]` is the\n * flat index of the anchor that anchor `i` lands on, and `flips[i]` whether\n * its in-handle lands on that anchor's out-handle — a mirror reverses which\n * way a path runs, a rotation does not. An anchor `m` fixes is its own\n * partner.\n */\nexport interface AnchorSymmetry {\n readonly m: Affine;\n readonly partners: readonly number[];\n readonly flips: readonly boolean[];\n}\n\nfunction near(a: Pt | undefined, b: Pt | undefined, tol: number): boolean {\n if (!a || !b) return a === b;\n return Math.abs(a.x - b.x) <= tol && Math.abs(a.y - b.y) <= tol;\n}\n\nfunction image(m: Affine, p: Pt): Pt;\nfunction image(m: Affine, p: Pt | undefined): Pt | undefined;\nfunction image(m: Affine, p: Pt | undefined): Pt | undefined {\n if (!p) return undefined;\n const [x, y] = applyToPoint(m, p.x, p.y);\n return { x, y };\n}\n\nfunction linear(m: Affine, d: Pt): Pt {\n return { x: m[0] * d.x + m[2] * d.y, y: m[1] * d.x + m[3] * d.y };\n}\n\n/** How `a` lands on `b` under `m`: `false` with the handles side for side,\n * `true` with them swapped, `null` when it is not `b`'s image. Side for side\n * is tried first, so an anchor with no handles is never a flip. */\nfunction landing(m: Affine, a: PenAnchor, b: PenAnchor, tol: number): boolean | null {\n if (!near(image(m, a), b, tol)) return null;\n const i = image(m, a.inHandle);\n const o = image(m, a.outHandle);\n if (near(i, b.inHandle, tol) && near(o, b.outHandle, tol)) return false;\n if (near(i, b.outHandle, tol) && near(o, b.inHandle, tol)) return true;\n return null;\n}\n\n/**\n * The pairing that makes `set` its own image under `m`, or `null` when it is\n * not one: every anchor, handles included, must land on a distinct anchor\n * within `tolerance` on each axis.\n */\nexport function anchorSymmetry(set: AnchorSet, m: Affine, tolerance = 1e-6): AnchorSymmetry | null {\n const n = anchorCount(set);\n const partners: number[] = [];\n const flips: boolean[] = [];\n const taken = new Set<number>();\n for (let i = 0; i < n; i++) {\n const a = anchorAt(set, i)!;\n let found = -1;\n let flip = false;\n for (let j = 0; j < n && found < 0; j++) {\n if (taken.has(j)) continue;\n const how = landing(m, a, anchorAt(set, j)!, tolerance);\n if (how === null) continue;\n found = j;\n flip = how;\n }\n if (found < 0) return null;\n taken.add(found);\n partners.push(found);\n flips.push(flip);\n }\n return { m, partners, flips };\n}\n\n/** Every transform in `group` that `set` is its own image under, paired. */\nexport function anchorSymmetries(set: AnchorSet, group: readonly Affine[], tolerance = 1e-6): AnchorSymmetry[] {\n return group\n .map((m) => anchorSymmetry(set, m, tolerance))\n .filter((s): s is AnchorSymmetry => s !== null);\n}\n\n/**\n * `d` averaged over every transform in `syms` that fixes what `fixes` names,\n * and the identity: the part of the move that keeps it where those transforms\n * hold it. Exact when `syms` is a group less its identity — an anchor on a\n * mirror axis slides along it, an anchor at a center of rotation stays put.\n */\nfunction averaged(d: Pt, syms: readonly AnchorSymmetry[], fixes: (s: AnchorSymmetry) => boolean, apply: (m: Affine, p: Pt) => Pt): Pt {\n let x = d.x;\n let y = d.y;\n let k = 1;\n for (const s of syms) {\n if (!fixes(s)) continue;\n const p = apply(s.m, d);\n x += p.x;\n y += p.y;\n k++;\n }\n return { x: x / k, y: y / k };\n}\n\n/**\n * Translate the anchors `flats` by `(dx, dy)` the way `translateAnchorBy`\n * does, and every image of each under `syms` by the transformed delta, so a\n * path that was its own image under each of them still is. `syms` should be\n * the whole symmetry group less its identity, as `anchorSymmetries` gives it\n * for a group; with a part of one, the anchors it fixes are only partly held.\n * An anchor that is itself being dragged moves as dragged.\n */\nexport function translateAnchorsSymmetric(\n set: AnchorSet,\n flats: readonly number[],\n dx: number,\n dy: number,\n syms: readonly AnchorSymmetry[],\n): boolean {\n const dragged = new Set(flats);\n const moves = new Map<number, Pt>();\n for (const flat of flats) {\n const d = averaged({ x: dx, y: dy }, syms, (s) => s.partners[flat] === flat, linear);\n moves.set(flat, d);\n for (const s of syms) {\n const j = s.partners[flat];\n if (j === undefined || dragged.has(j) || moves.has(j)) continue;\n moves.set(j, linear(s.m, d));\n }\n }\n let changed = false;\n for (const [flat, d] of moves) changed = translateAnchorBy(set, flat, d.x, d.y) || changed;\n return changed;\n}\n\nconst other = (side: Side): Side => (side === 'in' ? 'out' : 'in');\n\n/**\n * Move one handle to `(toX, toY)` and every image of it under `syms` to the\n * image of that point, so a path that was its own image under each of them\n * still is. A handle a transform maps onto itself keeps to where that\n * transform allows; one mapped onto its own anchor's opposite handle drives\n * that handle.\n *\n * Otherwise a smooth anchor keeps the opposite handle opposite, as\n * `moveHandleTo` does, unless `breakSmoothness`, and that handle's images\n * follow it. Every handle is written once, from its target, so no anchor\n * re-aims a handle another image already placed.\n */\nexport function moveHandleSymmetric(\n set: AnchorSet,\n flat: number,\n side: Side,\n toX: number,\n toY: number,\n breakSmoothness: boolean,\n syms: readonly AnchorSymmetry[],\n): boolean {\n const a = anchorAt(set, flat);\n if (!a || !(side === 'in' ? a.inHandle : a.outHandle)) return false;\n const sideUnder = (s: AnchorSymmetry, sd: Side): Side => (s.flips[flat] ? other(sd) : sd);\n const fixesHandle = (s: AnchorSymmetry) => s.partners[flat] === flat && sideUnder(s, side) === side;\n const to = averaged({ x: toX, y: toY }, syms, fixesHandle, image);\n\n const targets = new Map<string, { flat: number; side: Side; to: Pt }>();\n const put = (f: number, sd: Side, p: Pt): void => {\n const key = `${f}:${sd}`;\n if (!targets.has(key)) targets.set(key, { flat: f, side: sd, to: p });\n };\n put(flat, side, to);\n for (const s of syms) put(s.partners[flat], sideUnder(s, side), image(s.m, to));\n\n const opposite = side === 'in' ? a.outHandle : a.inHandle;\n const drivenBySymmetry = targets.has(`${flat}:${other(side)}`);\n if (!drivenBySymmetry && !breakSmoothness && opposite && isAnchorSmooth(a)) {\n const opp = { x: 2 * a.x - to.x, y: 2 * a.y - to.y };\n put(flat, other(side), opp);\n for (const s of syms) put(s.partners[flat], sideUnder(s, other(side)), image(s.m, opp));\n }\n\n for (const t of targets.values()) {\n const b = anchorAt(set, t.flat);\n if (!b) continue;\n if (t.side === 'in') b.inHandle = t.to;\n else b.outHandle = t.to;\n }\n return true;\n}\n","import type { AnchorSet } from './anchorEdits';\nimport { isAnchorSmooth, isStraightSegment, segmentEnds, type PenAnchor } from './anchors';\n\n/** Where on a segment a bend is held, as `segmentAt` reports it. */\nexport interface BendGrip {\n sub: number;\n segIdx: number;\n /** Curve parameter of the held point. */\n t: number;\n}\n\n/** The held point's parameter is kept this far from either end, where moving\n * it by a pixel would throw a handle out by hundreds. */\nconst T_MARGIN = 0.05;\n\n/**\n * Bend one segment so the point held at `grip.t` moves by `(dx, dy)`, by\n * moving its two control handles: each by an amount weighted toward the end it\n * belongs to, together exactly enough to carry the held point along. A straight\n * segment becomes a curve. Where an end anchor was smooth, its other handle\n * turns to stay in line, keeping its length, so the neighboring segment bends\n * with it rather than kinking.\n *\n * Returns false when the segment doesn't exist.\n */\nexport function bendSegment(set: AnchorSet, grip: BendGrip, dx: number, dy: number): boolean {\n const ends = segmentEnds(set.anchors, set.closed, grip.sub, grip.segIdx);\n if (!ends) return false;\n const { a, b } = ends;\n const aSmooth = isAnchorSmooth(a);\n const bSmooth = isAnchorSmooth(b);\n const straight = isStraightSegment(a, b);\n const p1 = a.outHandle ?? (straight ? lerp(a, b, 1 / 3) : { x: a.x, y: a.y });\n const p2 = b.inHandle ?? (straight ? lerp(a, b, 2 / 3) : { x: b.x, y: b.y });\n\n const t = Math.min(1 - T_MARGIN, Math.max(T_MARGIN, grip.t));\n const u = 1 - t;\n // Moving p1 by w1·d and p2 by w2·d moves the point at t by\n // (3u²t·w1 + 3ut²·w2)·d. With w1 = k·u and w2 = k·t, this k makes it exactly d.\n const k = 1 / (3 * t * u * (u * u + t * t));\n a.outHandle = { x: p1.x + k * u * dx, y: p1.y + k * u * dy };\n b.inHandle = { x: p2.x + k * t * dx, y: p2.y + k * t * dy };\n\n if (aSmooth) a.inHandle = alignedOpposite(a, a.outHandle, a.inHandle!);\n if (bSmooth) b.outHandle = alignedOpposite(b, b.inHandle, b.outHandle!);\n return true;\n}\n\nfunction lerp(a: PenAnchor, b: PenAnchor, f: number): { x: number; y: number } {\n return { x: a.x + (b.x - a.x) * f, y: a.y + (b.y - a.y) * f };\n}\n\n/** `other` turned to point directly away from `moved` through the anchor, at\n * its own length. */\nfunction alignedOpposite(\n anchor: PenAnchor,\n moved: { x: number; y: number },\n other: { x: number; y: number },\n): { x: number; y: number } {\n const mx = moved.x - anchor.x;\n const my = moved.y - anchor.y;\n const len = Math.hypot(mx, my);\n if (len === 0) return other;\n const keep = Math.hypot(other.x - anchor.x, other.y - anchor.y);\n return { x: anchor.x - (mx / len) * keep, y: anchor.y - (my / len) * keep };\n}\n","import { anchorAt, locateAnchor, type AnchorSet } from './anchorEdits';\nimport type { PenAnchor } from './anchors';\n\ntype Point = { x: number; y: number };\n\n/**\n * Collapse the handles of the anchors at `flatIndexes` onto their anchors,\n * leaving sharp corners. A segment whose ends both lose their handles turns\n * straight.\n *\n * Returns false when every handle was already on its anchor. A segment that\n * stays curved because its far end keeps a handle still encodes a control at\n * this end, so it decodes as a handle sitting on the anchor: retracted.\n */\nexport function retractHandles(set: AnchorSet, flatIndexes: Iterable<number>): boolean {\n let changed = false;\n for (const flat of new Set(flatIndexes)) {\n const a = anchorAt(set, flat);\n if (!a) continue;\n if (a.inHandle) { changed = changed || !same(a.inHandle, a); delete a.inHandle; }\n if (a.outHandle) { changed = changed || !same(a.outHandle, a); delete a.outHandle; }\n }\n return changed;\n}\n\n/**\n * Give each anchor at `flatIndexes` two handles of equal length pointing in\n * opposite directions, so the curve passes through it smoothly. The shared\n * direction splits the difference between the two handles' own directions,\n * and the shared length is their mean; an anchor with one handle mirrors it.\n *\n * Skipped: an anchor with no handles, and the ends of an open subpath, which\n * have only one segment to shape. Returns false when nothing changed.\n */\nexport function makeHandlesSymmetric(set: AnchorSet, flatIndexes: Iterable<number>): boolean {\n let changed = false;\n for (const flat of new Set(flatIndexes)) {\n const loc = locateAnchor(set, flat);\n if (!loc) continue;\n const sub = set.anchors[loc.sub];\n const isEnd = !set.closed[loc.sub] && (loc.idx === 0 || loc.idx === sub.length - 1);\n if (isEnd) continue;\n changed = symmetrize(sub[loc.idx]) || changed;\n }\n return changed;\n}\n\nfunction symmetrize(a: PenAnchor): boolean {\n const out = a.outHandle ? offset(a, a.outHandle) : null;\n // The in-handle turned around, so both vectors point along the outgoing side.\n const inFlipped = a.inHandle ? scale(offset(a, a.inHandle), -1) : null;\n const outLen = out ? Math.hypot(out.x, out.y) : 0;\n const inLen = inFlipped ? Math.hypot(inFlipped.x, inFlipped.y) : 0;\n if (outLen === 0 && inLen === 0) return false;\n\n let dir: Point;\n let len: number;\n if (outLen > 0 && inLen > 0) {\n const sum = { x: out!.x / outLen + inFlipped!.x / inLen, y: out!.y / outLen + inFlipped!.y / inLen };\n const sumLen = Math.hypot(sum.x, sum.y);\n // Handles pointing the same way leave no bisector; keep the out-handle's line.\n dir = sumLen > 1e-9 ? scale(sum, 1 / sumLen) : scale(out!, 1 / outLen);\n len = (outLen + inLen) / 2;\n } else if (outLen > 0) {\n dir = scale(out!, 1 / outLen);\n len = outLen;\n } else {\n dir = scale(inFlipped!, 1 / inLen);\n len = inLen;\n }\n const nextOut = { x: a.x + dir.x * len, y: a.y + dir.y * len };\n const nextIn = { x: a.x - dir.x * len, y: a.y - dir.y * len };\n if (same(a.outHandle, nextOut) && same(a.inHandle, nextIn)) return false;\n a.outHandle = nextOut;\n a.inHandle = nextIn;\n return true;\n}\n\n/**\n * Where a handle lands when dragged toward `to` but held to its current\n * direction from `anchor`: `to` projected onto that ray. The length never\n * goes below zero, so the handle can shrink onto the anchor but not flip\n * through it. A handle already sitting on its anchor has no direction to\n * keep and follows `to` freely.\n */\nexport function handleAlongItsAngle(anchor: Point, handle: Point, to: Point): Point {\n const d = offset(anchor, handle);\n const len = Math.hypot(d.x, d.y);\n if (len === 0) return { x: to.x, y: to.y };\n const ux = d.x / len;\n const uy = d.y / len;\n const along = Math.max(0, (to.x - anchor.x) * ux + (to.y - anchor.y) * uy);\n return { x: anchor.x + ux * along, y: anchor.y + uy * along };\n}\n\nfunction offset(from: Point, to: Point): Point {\n return { x: to.x - from.x, y: to.y - from.y };\n}\n\nfunction scale(p: Point, k: number): Point {\n return { x: p.x * k, y: p.y * k };\n}\n\nfunction same(p: Point | undefined, q: Point): boolean {\n return !!p && Math.abs(p.x - q.x) < 1e-9 && Math.abs(p.y - q.y) < 1e-9;\n}\n","/**\n * Anchor lookup across several paths, measured on screen: which existing\n * anchor is nearest a point, and whether it ends an open subpath. Feeds the\n * pen's anchor snapping and its pick-up of an open path's endpoint.\n */\n\nimport type { PolygonPath } from '../path';\nimport { scaleDelta, type Scale2 } from '../pxExtent';\nimport { pathToAnchors, type PenAnchor } from './anchors';\n\n/** An existing anchor found near a point. */\nexport interface PathAnchorHit {\n /** The id the path was supplied under. */\n id: string;\n /** Subpath index, then anchor index within that subpath. */\n sub: number;\n idx: number;\n x: number;\n y: number;\n /** Which end of an open subpath this anchor is, or null when it is an\n * interior anchor or its subpath is closed. A lone anchor reads `'last'`. */\n end: 'first' | 'last' | null;\n}\n\n/**\n * The anchor nearest `point` within a screen-space circle of radius `px`,\n * across every subpath of every path in `paths`. Paths and `point` share one\n * world frame; `scale` is the view's, so the radius stays round under\n * non-uniform zoom. `accept` narrows the candidates (endpoints only, say).\n * Ties go to the earlier path, so pass paths front-to-back.\n */\nexport function nearestPathAnchor(\n paths: Iterable<{ id: string; path: PolygonPath }>,\n point: { x: number; y: number },\n px: number,\n scale: Scale2,\n accept?: (hit: PathAnchorHit) => boolean,\n): PathAnchorHit | null {\n let best: PathAnchorHit | null = null;\n let bestD2 = px * px;\n for (const { id, path } of paths) {\n const { anchors, closed } = pathToAnchors(path);\n for (let sub = 0; sub < anchors.length; sub++) {\n const list = anchors[sub];\n for (let idx = 0; idx < list.length; idx++) {\n const a = list[idx];\n const s = scaleDelta(a.x - point.x, a.y - point.y, scale);\n const d2 = s.x * s.x + s.y * s.y;\n if (d2 > bestD2 || (best !== null && d2 === bestD2)) continue;\n const end = closed[sub]\n ? null\n : idx === list.length - 1 ? 'last' : idx === 0 ? 'first' : null;\n const hit: PathAnchorHit = { id, sub, idx, x: a.x, y: a.y, end };\n if (accept && !accept(hit)) continue;\n best = hit;\n bestD2 = d2;\n }\n }\n }\n return best;\n}\n\n/** Reverse a subpath's direction without changing its shape: the anchor\n * order flips and each anchor's in and out handles trade places. */\nexport function reverseAnchors<A extends PenAnchor>(anchors: readonly A[]): A[] {\n return anchors.map((a) => {\n const { inHandle, outHandle, ...rest } = a;\n const r = { ...rest } as A;\n if (outHandle) r.inHandle = { ...outHandle };\n if (inHandle) r.outHandle = { ...inHandle };\n return r;\n }).reverse();\n}\n","/**\n * Project a leaf path from its source frame into world coordinates given a\n * `{x, y, width, height, rotation?}` pose.\n *\n * RectPaths can't carry rotation as-is (they're axis-aligned by definition);\n * a non-zero `pose.rotation` on a rect promotes the result to a polygon so\n * the four corners are baked into world coords.\n */\n\nimport { applyToPoint, boxToBox } from '../affine';\nimport type { Path, PolygonPath } from '../path';\nimport { poseFrameInverseOf, poseFrameOf, type PoseLinear } from '../poseFrame';\nimport { boundsOfPath } from './bounds';\nimport { translatePath } from './transform';\nimport { transformPath } from './transformPath';\n\n/** Subset of pose fields this helper consumes: `x/y/width/height` define an\n * AABB whose unrotated center is the rotation pivot. */\nexport interface PathInWorldPose {\n x: number;\n y: number;\n width: number;\n height: number;\n rotation?: number;\n transform?: PoseLinear;\n}\n\n/**\n * Project a stored path into the pose's **local frame**: rebase its AABB onto\n * the pose box. It does NOT apply `pose.rotation`; `pathInWorld` composes\n * this with the rotation wrap.\n *\n * Rects rebase onto the pose's `width`/`height` because resize updates the pose,\n * not the stored `RectPath` — so the live size lives on the pose.\n */\nexport function pathInPoseFrame(path: Path, pose: PathInWorldPose): Path {\n if (path.kind === 'rect') {\n if (\n path.x === pose.x && path.y === pose.y\n && path.width === pose.width && path.height === pose.height\n ) return path;\n return { kind: 'rect', x: pose.x, y: pose.y, width: pose.width, height: pose.height };\n }\n // Polygon: rebase the path's own AABB into the pose box. For geometry-in-data\n // nodes whose pose box was resized independently, it scales the contents to fill the box.\n const b = boundsOfPath(path);\n if (b.x === pose.x && b.y === pose.y && b.width === pose.width && b.height === pose.height) {\n return path;\n }\n const m = boxToBox(b.x, b.y, b.width, b.height, pose.x, pose.y, pose.width, pose.height);\n return transformPath(path, m);\n}\n\n/**\n * Bake `pose` into `path`'s coordinates so the returned path is positioned\n * in world space. Returns a fresh `Path` instance; never mutates inputs.\n */\nexport function pathInWorld(path: Path, pose: PathInWorldPose): Path {\n // Shares `pathInPoseFrame` with the renderer so world geometry never diverges\n // from what's painted.\n const local = pathInPoseFrame(path, pose);\n\n // The pose's rotation and its `transform` about its AABB center, composed by\n // `poseFrameOf` as the renderer's wrap composes them.\n const frame = poseFrameOf(pose);\n if (!frame) return local;\n return transformPath(local, frame) as PolygonPath;\n}\n\n/**\n * Inverse of `pathInWorld` for a path in **world** space: the stored path\n * in the pose's own frame plus the pose that draws it there. The pose's\n * `rotation` and `transform` are preserved, and its AABB fields are fit to\n * the result. The new box's center is placed where the old frame carries it,\n * since the pivot moves with the box: `pathInWorld(result.path, result.pose)`\n * reproduces `worldPath` whether or not its bounds changed.\n */\nexport function worldEditToStorage<P extends PathInWorldPose>(\n pose: P,\n worldPath: PolygonPath,\n): { pose: P; path: PolygonPath };\nexport function worldEditToStorage<P extends PathInWorldPose>(pose: P, worldPath: Path): { pose: P; path: Path };\nexport function worldEditToStorage<P extends PathInWorldPose>(\n pose: P,\n worldPath: Path,\n): { pose: P; path: Path } {\n // A singular `transform` has no way back, and the path is stored as drawn.\n const back = poseFrameInverseOf(pose);\n const frame = back && poseFrameOf(pose);\n const unrotated = back ? transformPath(worldPath, back) : worldPath;\n const b = boundsOfPath(unrotated);\n const aligned = translatePath(unrotated, -b.x, -b.y);\n let x = b.x, y = b.y;\n if (frame) {\n const [cx, cy] = applyToPoint(frame, b.x + b.width / 2, b.y + b.height / 2);\n x = cx - b.width / 2;\n y = cy - b.height / 2;\n }\n return {\n pose: { ...pose, x, y, width: b.width, height: b.height },\n path: aligned,\n };\n}\n","/** The constructor of each typed array of numbers, under the tag its type is written by. */\nexport const TYPED_ARRAY_CONSTRUCTORS = {\n i8: Int8Array,\n u8: Uint8Array,\n u8c: Uint8ClampedArray,\n i16: Int16Array,\n u16: Uint16Array,\n i32: Int32Array,\n u32: Uint32Array,\n f32: Float32Array,\n f64: Float64Array,\n} as const;\n\n/** The name a typed array's type is written under. */\nexport type TypedArrayTag = keyof typeof TYPED_ARRAY_CONSTRUCTORS;\n\n/** A typed array of numbers: what a `Path` keeps its commands and coords in. */\nexport type NumberTypedArray = InstanceType<(typeof TYPED_ARRAY_CONSTRUCTORS)[TypedArrayTag]>;\n\n/** A typed array as JSON holds it: its type's tag and its numbers. */\nexport interface TaggedTypedArray {\n __ta: TypedArrayTag;\n data: number[];\n}\n\nconst TAGS = new Map<string, TypedArrayTag>(\n (Object.keys(TYPED_ARRAY_CONSTRUCTORS) as TypedArrayTag[]).map((tag) => [TYPED_ARRAY_CONSTRUCTORS[tag].name, tag]),\n);\n\n// By its string tag rather than `instanceof`, which is false for an array made in another realm.\nconst classOf = (value: unknown): string => Object.prototype.toString.call(value).slice(8, -1);\n\n/** `value` as a tag and its numbers where it is a typed array of numbers, else `undefined`. */\nexport function tagTypedArray(value: unknown): TaggedTypedArray | undefined {\n if (!ArrayBuffer.isView(value)) return undefined;\n const tag = TAGS.get(classOf(value));\n return tag && { __ta: tag, data: Array.from(value as NumberTypedArray) };\n}\n\n/** The typed array a `TaggedTypedArray` describes, or `undefined` for anything else. */\nexport function untagTypedArray(value: unknown): NumberTypedArray | undefined {\n if (value === null || typeof value !== 'object') return undefined;\n const { __ta: tag, data } = value as Partial<TaggedTypedArray>;\n if (typeof tag !== 'string' || !Object.hasOwn(TYPED_ARRAY_CONSTRUCTORS, tag) || !Array.isArray(data)) return undefined;\n return TYPED_ARRAY_CONSTRUCTORS[tag].from(data);\n}\n\nconst isPlain = (value: unknown): value is Record<string, unknown> => classOf(value) === 'Object';\n\nfunction mapDeep(value: unknown, leaf: (v: unknown) => unknown): unknown {\n const swapped = leaf(value);\n if (swapped !== undefined) return swapped;\n if (Array.isArray(value)) return value.map((v) => mapDeep(v, leaf));\n if (!isPlain(value)) return value;\n const out: Record<string, unknown> = {};\n for (const key of Object.keys(value)) out[key] = mapDeep(value[key], leaf);\n return out;\n}\n\n/**\n * A copy of `value` that `JSON.stringify` writes whole: every typed array in it, at any\n * depth of arrays and plain objects, becomes a `TaggedTypedArray`. A `Path` goes through it\n * to be saved, and `reviveTypedArrays` reads it back.\n */\nexport function tagTypedArrays(value: unknown): unknown {\n return mapDeep(value, tagTypedArray);\n}\n\n/** A copy of `value` with every `TaggedTypedArray` in it a typed array again: what\n * `JSON.parse` answered for something `tagTypedArrays` or `typedArrayReplacer` wrote. */\nexport function reviveTypedArrays(value: unknown): unknown {\n return mapDeep(value, untagTypedArray);\n}\n\n/** `tagTypedArrays` as a `JSON.stringify` replacer. */\nexport function typedArrayReplacer(_key: string, value: unknown): unknown {\n return tagTypedArray(value) ?? value;\n}\n"]}