@weasel-js/geom 1.9.3 → 1.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../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 * 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 * `Float32Array` (a full 3×3) shaped 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 f64 form here (the kernel form); the 9-element f32\n * form 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/** Apply an affine `Mat3` to a path's geometry.\n *\n * Axis-aligned maps (no rotation/shear, i.e. `m[1] === 0 && m[2] === 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 (b === 0 && c === 0) {\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 { 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 if (path.kind === 'rect') return { x: path.x, y: path.y };\n // Polygon origin is its AABB top-left, so children compose under the\n // same anchor convention as rects. Cheap walk; if this becomes a hot\n // path we cache bounds on the polygon at build time.\n let minX = Infinity;\n let minY = Infinity;\n const { coords } = path;\n for (let i = 0; i < coords.length; i += 2) {\n if (coords[i] < minX) minX = coords[i];\n if (coords[i + 1] < minY) minY = coords[i + 1];\n }\n if (minX === Infinity) return { x: 0, y: 0 };\n return { x: minX, y: minY };\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.\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 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 (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 = argCount === 0 ? 1 : 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 }\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 t = i / (samples.length - 1);\n const q = cubicPointAt(a, fit.cp1, fit.cp2, fit.end, t);\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}\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 };\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 };\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) => {\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 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>();\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 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/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/splitByClosure.ts","../src/paths/winding.ts","../src/paths/pathFromD.ts","../src/paths/pathAt.ts","../src/paths/pathDistance.ts","../src/paths/schneiderFit.ts","../src/pathSubpaths.ts","../src/screenBand.ts","../src/pathHitTest.ts","../src/paths/markers.ts","../src/paths/anchors.ts","../src/glMat3.ts","../src/viewToMat3.ts","../src/place.ts","../src/easings.ts","../src/easingSpec.ts","../src/meanScale.ts","../src/pxExtent.ts","../src/poseRotation.ts","../src/poseFrame.ts","../src/paths/anchorEdits.ts","../src/paths/nearestAnchor.ts","../src/paths/pathInWorld.ts","../src/typedArrayJson.ts"],"names":["x","y","portControls","portCurvePoints","sub","sign","dot","last","fit","cross","identity","multiply","invert","scale","rotate","linear"],"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 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","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 { 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. 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: 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 { ...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 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 * 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 { Mat3 } from './mat3';\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: Mat3 };\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 * 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","/**\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 Mat3 as Affine } from './mat3';\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 `Mat3`, 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 * 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 * 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 Mat3 } from './mat3';\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 * `Mat3` 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): Mat3 | 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: Mat3 = [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): Mat3 | 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","/**\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 pathToAnchors,\n anchorsToPath,\n isAnchorSmooth,\n isStraightSegment,\n nearestSegmentT,\n segmentEnds,\n type PenAnchor,\n} from './anchors';\nimport { cubicPointAt, fitCubicThroughDeletion, splitCubicAtT } from './cubicMath';\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 const set = pathToAnchors(path) as AnchorSet;\n const changed = edit(set);\n if (changed === false) return null;\n return anchorsToPath(set.anchors, set.closed, path);\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 through the gap (`fitCubicThroughDeletion`)\n * so the path keeps its shape instead of snapping to a straight line.\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) {\n const { c1, c2 } = fitCubicThroughDeletion(prev, 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 * 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 '../mat3';\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"]}