@weasel-js/path-tools 0.0.0-stage → 1.10.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +47 -2
- package/dist/index.d.ts +713 -0
- package/dist/index.js +1730 -0
- package/dist/index.js.map +1 -0
- package/package.json +53 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/balance/handleBalance.ts","../src/balance/balanceMarks.ts","../src/bridge/bridge.ts","../src/comb/comb.ts","../src/constraints/pathConstraints.ts","../src/constraints/constraintGlyphs.ts","../src/constraints/constraintsExtension.ts","../src/constraints/anchorConstraints.ts","../src/shared/scenePaths.ts","../src/extend/extendToMeet.ts","../src/handleLocks/handleLocks.tsx","../src/harmonize/harmonize.tsx","../src/pathEffects/params.ts","../src/pathEffects/actions.ts","../src/simplifyBrush/simplifyBrush.ts","../src/smudge/smudgeBrush.ts","../src/trim/trimSegment.ts","../src/warp/pathWarp.ts","../src/warp/warpTargets.ts","../src/warp/warpActions.ts","../src/presets.ts","../src/shared/strokeClickTool.ts","../src/trim/piecePreview.ts","../src/trim/useTrimTool.ts","../src/extend/useExtendTool.ts","../src/smudge/useSmudgeBrushTool.ts","../src/warp/warpHandles.ts","../src/warp/useWarpTool.ts"],"names":["at","line","pathOperationTags","commitAnchorEdit","ActionDisabledReason","linePath","pathAnchorPoints","unsatisfiedConstraints","depOf","resolveEditablePathOf","pathToAnchors","locateAnchor","jsx","commitOps","inPlane","editAnchorSetTracked","pathEditPreview","editingLayer","num","radiusOf","selectedPathNodes","resolveParams","reshapeOps","deleteNode","classifyPathStorage","toWorld","boundsOfPath","identity","withPath","transformPath","invert","createSetDataOp","createEmitter","useMemo","SliceIcon","defineTool","applyToPoint","viewToTransform","pathWarpMap","warpControls","polylineFromPoints"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * The balance grip on each curved segment of the path being edited, midway\n * along the line joining its two handle tips:\n *\n * - `balanceHandles` — drag the grip to scale both handles together, each\n * along its own direction, so the segment fills out toward its corner or\n * flattens toward its chord without turning at either end.\n * - `equalizeHandles` — double-click the grip to give both handles the same\n * proportion of the way to that corner.\n *\n * The grips are the `balance:N` affordances path edit lays out, shown and\n * hit-tested only while chrome-caps shows `path-edit.balance`. N is the flat\n * index of the anchor the segment starts at.\n *\n * Under a `pathSymmetry` dep a grip drag moves every image of both handles,\n * as `editAnchors` moves a dragged handle's. Both keep each handle's angle, so an angle lock holds through them. A length\n * lock in force for handle drags (the `editAnchors` dep's `handleLocks`, or Mod)\n * holds the drag still, as it would a handle drag with the angle held too.\n */\n\nimport {\n type Action, type ActionDeps, ActionDisabledReason, type ImmediateInvoker, type InvocationCtx, isBalanceGrip, type OngoingHandle,\n} from '@weasel-js/routing';\nimport {\n balanceFactorToward,\n editAnchorSetTracked,\n equalizeSegmentHandles,\n locateAnchor,\n pathToAnchors,\n scaleSegmentHandles,\n type AnchorSet,\n type PointOrigin,\n type PolygonPath,\n} from '@weasel-js/geom';\nimport {\n commitAnchorEdit, type EditAnchorsDep, editedPathSymmetries, editingLayer, inPlane, locksInForce, pathEditPreview, pathEditToolActive, pathOperationTags,\n} from '@weasel-js/core';\n\n/** The segment a `balance:N` affordance names, on the path being edited. */\nfunction gripTarget(\n dep: EditAnchorsDep | undefined,\n kind: string | undefined,\n): { dep: EditAnchorsDep; path: PolygonPath; sub: number; segIdx: number } | null {\n if (!dep?.editingId || !kind) return null;\n const m = kind.match(/^balance:(\\d+)$/);\n if (!m) return null;\n const path = dep.getEditablePath(dep.editingId) as PolygonPath | null | undefined;\n if (!path || path.kind !== 'polygon') return null;\n const loc = locateAnchor(pathToAnchors(path) as AnchorSet, parseInt(m[1], 10));\n return loc ? { dep, path, sub: loc.sub, segIdx: loc.idx } : null;\n}\n\nconst NO_LOCKS = { angle: false, length: false };\n\n/** Enabled while a path is open and no path-edit tool has the pointer. */\nfunction gripEnabled(deps: ActionDeps | undefined): true | ActionDisabledReason {\n if (!deps?.editAnchors?.editingId || pathEditToolActive(deps)) return ActionDisabledReason.NotApplicable;\n return true;\n}\n\n/** Drag a segment's balance grip to scale both its handles together. */\nexport const balanceHandlesAction: Action & { requires: string[] } = inPlane({\n id: 'balanceHandles',\n label: 'Balance handles',\n tags: pathOperationTags('drag'),\n // Ties the marquee's `empty` and move's `selected-body` on specificity and\n // registers ahead of the marquee; move turns path-edit presses down itself.\n defaultBinding: { kind: 'drag', target: { kindOf: isBalanceGrip } },\n cursor: 'grab',\n eligible: { capability: 'edits-anchors' },\n requires: ['editAnchors', 'pathSymmetry'],\n invoker: {\n timing: 'ongoing',\n start(ctx: InvocationCtx): OngoingHandle {\n const target = gripTarget(ctx.deps.editAnchors, ctx.drag?.affordance?.kind);\n if (!target) return {};\n const { dep, path: originPath, sub, segIdx } = target;\n const id = dep.editingId;\n const origin = pathToAnchors(originPath) as AnchorSet;\n const symmetries = editedPathSymmetries(ctx.deps.pathSymmetry, id, origin);\n // The grip is wherever the press landed within its radius; measure the\n // drag from there so the grab doesn't jump.\n const press = { x: ctx.world.x, y: ctx.world.y };\n const pressFactor = balanceFactorToward(origin, sub, segIdx, press);\n let current: { path: PolygonPath; origins?: readonly (PointOrigin | null)[] } | null = null;\n const preview = pathEditPreview(dep, id, () => current?.path ?? null);\n if (!preview) return {};\n\n return {\n kind: 'balance-handles',\n onMove(moveCtx: InvocationCtx): void {\n // Read live, like a handle drag's, so a lock can change mid-drag.\n const held = (moveCtx.deps.editAnchors ?? dep).handleLocks ?? NO_LOCKS;\n if (locksInForce(held, moveCtx.modifiers).length) {\n current = null;\n return;\n }\n const at = balanceFactorToward(origin, sub, segIdx, moveCtx.world);\n const factor = pressFactor > 0 ? at / pressFactor : at;\n current = editAnchorSetTracked(originPath, (set) => scaleSegmentHandles(set, sub, segIdx, factor, symmetries)) ?? current;\n },\n onEnd(_endCtx: InvocationCtx, reason: 'commit' | 'cancel'): void {\n const done = current;\n current = null;\n if (reason === 'cancel' || !done) return;\n dep.applyEdit(id, done.path, 'Balance handles', done.origins);\n },\n previewIds: preview.previewIds,\n previewPose: preview.previewPose,\n previewData: preview.previewData,\n };\n },\n },\n enabled: gripEnabled,\n}, editingLayer);\n\n/** Double-click a segment's balance grip to even out its handles' proportions. */\nexport const equalizeHandlesAction: Action & { requires: string[] } = {\n id: 'equalizeHandles',\n label: 'Equalize handles',\n tags: pathOperationTags('click'),\n defaultBinding: { kind: 'doubleClick', target: { kindOf: isBalanceGrip } },\n eligible: { capability: 'edits-anchors' },\n requires: ['editAnchors'],\n invoker: {\n timing: 'immediate',\n run: (deps, params) => {\n const kind = (params?.affordance as { kind?: string } | undefined)?.kind;\n const target = gripTarget(deps.editAnchors, kind);\n if (!target) return;\n const { dep, sub, segIdx } = target;\n commitAnchorEdit(dep, 'Equalize handles', (set) => equalizeSegmentHandles(set, sub, segIdx));\n },\n } as ImmediateInvoker,\n enabled: gripEnabled,\n};\n","/**\n * The balance lines path edit can draw over the open path: one per curved\n * segment, from its first handle's tip to its second's, with the grip\n * `balanceHandles` drags at the middle, pressed as `balance:N`.\n */\n\nimport type { DrawCommand } from '@weasel-js/renderer';\nimport { circlePath, handleBalances, linePath, type AnchorSet } from '@weasel-js/geom';\nimport type { PathEditExtension } from '@weasel-js/core';\n\n/** Chrome-caps id the balance lines and their grips are drawn and hit-tested\n * under. Off by default. */\nexport const PATH_BALANCE_CHROME_ID = 'path-edit.balance';\n\n/** How the balance lines are drawn. */\nexport interface PathEditBalanceStyle {\n /** Color of the line between a segment's handle tips and of its grip's rim. */\n color?: string;\n /** Fill of the grip. */\n gripFill?: string;\n /** Radius of the grip, in screen px. Default 4. */\n gripRadiusPx?: number;\n}\n\nconst BALANCE_DEFAULTS: Required<PathEditBalanceStyle> = {\n color: '#9b6bd6',\n gripFill: '#ffffff',\n gripRadiusPx: 4,\n};\n\ntype ToScreen = (p: { x: number; y: number }) => { x: number; y: number };\n\n/** Draw commands for `set`'s balance lines and their grips, in screen space. */\nexport function balanceCommands(set: AnchorSet, toScreen: ToScreen, style: PathEditBalanceStyle = {}): DrawCommand[] {\n const { color, gripFill, gripRadiusPx } = { ...BALANCE_DEFAULTS, ...style };\n const paint = { kind: 'solid' as const, color };\n const out: DrawCommand[] = [];\n for (const line of handleBalances(set)) {\n const grip = toScreen(line.grip);\n out.push({\n kind: 'path',\n path: linePath(toScreen(line.from), toScreen(line.to)),\n stroke: { paint, width: 1 },\n });\n out.push({\n kind: 'path',\n path: circlePath(grip.x, grip.y, gripRadiusPx),\n fill: { paint: { kind: 'solid', color: gripFill } },\n stroke: { paint, width: 1.5 },\n });\n }\n return out;\n}\n\n/** The balance lines as a path-edit extension: drawn, and their grips\n * pressed, while chrome-caps shows {@link PATH_BALANCE_CHROME_ID}. */\nexport function createBalanceExtension(style: PathEditBalanceStyle = {}): PathEditExtension {\n return {\n id: 'balance',\n marks: (ctx) => (ctx.isVisible(PATH_BALANCE_CHROME_ID) ? balanceCommands(ctx.anchors, ctx.toScreen, style) : []),\n parts: (target) => handleBalances(target.anchors).map((line) => ({\n x: line.grip.x,\n y: line.grip.y,\n hitKind: `balance:${line.flat}`,\n chromeId: PATH_BALANCE_CHROME_ID,\n })),\n };\n}\n","/**\n * Bridge: join open path ends with a curve that leaves each end along the\n * direction its path was heading, on whole paths or on the two anchors\n * selected in path edit.\n */\nimport { type Action, ActionDisabledReason, type ImmediateInvoker } from '@weasel-js/routing';\nimport {\n anchorEditWouldChange, BridgeIcon, commitAnchorEdit, depOf, joinPathsCommand, joinSelectedAnchors, pathOperationTags,\n} from '@weasel-js/core';\n\n/** How long Bridge makes each handle, as a fraction of the gap, when its\n * params name no `tension`. */\nexport const DEFAULT_BRIDGE_TENSION = 0.4;\n\n/** A bridge's `params.tension`, or the default. Negative reads as `0`. */\nexport function bridgeTensionOf(params: Record<string, unknown> | undefined): number {\n const t = params?.tension;\n return typeof t === 'number' && Number.isFinite(t) ? Math.max(0, t) : DEFAULT_BRIDGE_TENSION;\n}\n\n/**\n * @experimental Bridge open paths: as `joinPaths`, but the gap is spanned by\n * a curve leaving each end along the direction its path was heading, each\n * handle `params.tension` times the gap long (default\n * {@link DEFAULT_BRIDGE_TENSION}). Two paths become one. In path edit,\n * `bridgeAnchors` bridges the two selected anchors instead.\n */\nexport const bridgePathsAction = joinPathsCommand(\n {\n id: 'bridgePaths',\n label: 'Bridge',\n icon: BridgeIcon,\n // `code` too: with Shift held the key reads as `J`.\n defaultBinding: { kind: 'key', key: 'j', code: 'KeyJ', mods: { mod: true, shift: true } },\n },\n (params) => ({ tension: bridgeTensionOf(params) }),\n);\n\nconst join = joinSelectedAnchors({});\n\n/**\n * @experimental Bridge the two selected anchors, each the end of an open\n * subpath, as `joinAnchors` does, but with a curve leaving each end along the\n * direction its path was heading, each handle `params.tension` times the gap\n * long (`bridgePaths`'s default when absent). The anchor selection is\n * cleared.\n */\nexport const bridgeAnchorsAction: Action & { requires: string[] } = {\n id: 'bridgeAnchors',\n label: 'Bridge anchors',\n tags: pathOperationTags('command'),\n icon: BridgeIcon,\n group: 'anchors',\n defaultBinding: { kind: 'key', key: 'j', code: 'KeyJ', mods: { mod: true, shift: true } },\n eligible: { capability: 'edits-anchors' },\n requires: ['editAnchors'],\n invoker: {\n timing: 'immediate',\n run: (deps, params) => {\n const dep = depOf(deps);\n if (!dep || dep.selectedAnchors.size !== 2) return;\n const selected = [...dep.selectedAnchors];\n const bridge = joinSelectedAnchors({ tension: bridgeTensionOf(params) });\n if (commitAnchorEdit(dep, 'Bridge anchors', (set) => bridge(set, selected))) dep.setSelectedAnchors([]);\n },\n } as ImmediateInvoker,\n enabled: (deps) => {\n const dep = depOf(deps);\n if (!dep || dep.selectedAnchors.size !== 2) return ActionDisabledReason.SelectionRequired;\n const selected = [...dep.selectedAnchors];\n return anchorEditWouldChange(deps, (set) => join(set, selected)) ? true : ActionDisabledReason.NotApplicable;\n },\n};\n","/**\n * The curvature comb path edit can draw over the open path.\n */\n\nimport type { DrawCommand } from '@weasel-js/renderer';\nimport { curvatureComb, linePath, polylineFromPoints, type AnchorSet } from '@weasel-js/geom';\nimport type { PathEditExtension } from '@weasel-js/core';\n\n/** Chrome-caps id the curvature comb is drawn under. Off by default. */\nexport const PATH_COMB_CHROME_ID = 'path-edit.comb';\n\n/** How the curvature comb is drawn. */\nexport interface PathEditCombOptions {\n /** Tooth length per unit of curvature, in world units: a tooth over a\n * stretch of radius r is `scale / r` long. Default 2000. */\n scale?: number;\n /** Teeth per segment, ends included. Default 24. */\n samplesPerSegment?: number;\n /** Color of the teeth and of the line through their tips. */\n color?: string;\n}\n\nconst COMB_DEFAULTS = { scale: 2000, samplesPerSegment: 24, color: 'rgba(224, 102, 58, 0.75)' };\n\ntype ToScreen = (p: { x: number; y: number }) => { x: number; y: number };\n\n/** Draw commands for `set`'s curvature comb, in screen space. */\nexport function combCommands(set: AnchorSet, toScreen: ToScreen, opts: PathEditCombOptions = {}): DrawCommand[] {\n const { scale, samplesPerSegment, color } = { ...COMB_DEFAULTS, ...opts };\n const paint = { kind: 'solid' as const, color };\n const out: DrawCommand[] = [];\n for (const { teeth } of curvatureComb(set, { scale, samplesPerSegment })) {\n const tips = teeth.map((t) => toScreen({ x: t.tipX, y: t.tipY }));\n teeth.forEach((t, i) => {\n out.push({ kind: 'path', path: linePath(toScreen(t), tips[i]), stroke: { paint, width: 1 } });\n });\n out.push({ kind: 'path', path: polylineFromPoints(tips), stroke: { paint, width: 1.5 } });\n }\n return out;\n}\n\n/** The comb as a path-edit extension, drawn while chrome-caps shows\n * {@link PATH_COMB_CHROME_ID}. `options` is read every frame. */\nexport function createCombExtension(options: () => PathEditCombOptions | undefined = () => undefined): PathEditExtension {\n return {\n id: 'curvatureComb',\n marks: (ctx) => (ctx.isVisible(PATH_COMB_CHROME_ID) ? combCommands(ctx.anchors, ctx.toScreen, options()) : []),\n };\n}\n","/**\n * A node's path constraints: kept as `data.constraints`, numbered by the\n * anchors of its editable polygon, and solved in the frame that polygon is\n * drawn in, so `horizontal` on a rotated `data.path` node turns with it.\n */\nimport {\n constrainPathEdit,\n pathAnchorPoints,\n solvePathConstraints,\n unsatisfiedConstraints,\n type PathConstraint,\n type PointOrigin,\n type PolygonPath,\n} from '@weasel-js/geom';\nimport { classifyPathStorage, resolveEditablePathOf, type EditableShape } from '@weasel-js/core';\n\nconst NONE: readonly PathConstraint[] = [];\n\n/** The constraints a node's data holds, or none. */\nexport function constraintsOf(data: unknown): readonly PathConstraint[] {\n const list = (data as { constraints?: unknown } | null | undefined)?.constraints;\n return Array.isArray(list) ? (list as PathConstraint[]) : NONE;\n}\n\n/** Radians the frame `horizontal` and `vertical` read is turned from the world's: a `data.path` node's rotation. */\nexport function constraintAxisOf(node: EditableShape | null | undefined): number {\n const storage = classifyPathStorage(node);\n return storage?.kind === 'data' ? (storage.pose as { rotation?: number }).rotation ?? 0 : 0;\n}\n\n/**\n * Indices of `node`'s constraints that do not hold in its committed path:\n * the ones that conflict with the rest. Edits leave them out of the solve,\n * and so does a whole-shape transform — resize, rotate, flip — which carries\n * the list unchanged: a constraint the transform breaks, such as a set\n * length under a scale or an equal length under a non-uniform one, is\n * reported here rather than solved back.\n */\nexport function constraintConflictsOf(node: EditableShape | null | undefined): number[] {\n const constraints = constraintsOf(node?.data);\n const path = constraints.length > 0 ? resolveEditablePathOf(node) : null;\n if (!path) return [];\n return unsatisfiedConstraints(pathAnchorPoints(path), constraints, { axisAngle: constraintAxisOf(node) });\n}\n\n/** What an edit of a constrained node commits: its path, and its constraints renumbered for it. */\nexport interface ConstrainedNodeEdit {\n path: PolygonPath;\n constraints: readonly PathConstraint[];\n}\n\n/**\n * `worldPath`, an edit of `node`'s committed path, finished so the node's\n * constraints hold. Null when they cannot. A node with no constraints gets\n * `worldPath` back as it is.\n */\nexport function constrainNodeEdit(\n node: EditableShape | null | undefined,\n worldPath: PolygonPath,\n origins?: readonly (PointOrigin | null)[],\n): ConstrainedNodeEdit | null {\n const constraints = constraintsOf(node?.data);\n const before = constraints.length > 0 ? resolveEditablePathOf(node) : null;\n if (!before) return { path: worldPath, constraints };\n const edit = constrainPathEdit(before, worldPath, constraints, { origins, axisAngle: constraintAxisOf(node) });\n if (!edit.converged) return null;\n const same = edit.constraints.length === constraints.length\n && edit.constraints.every((c, i) => JSON.stringify(c) === JSON.stringify(constraints[i]));\n return { path: edit.path, constraints: same ? constraints : edit.constraints };\n}\n\n/**\n * `node`'s path moved the least that makes `constraints` hold, and the\n * indices of those that do not hold in the path it answers. When they cannot\n * all hold the path is the node's own, unmoved.\n */\nexport function solveNodeConstraints(\n node: EditableShape | null | undefined,\n constraints: readonly PathConstraint[],\n): { path: PolygonPath; unsatisfied: number[] } | null {\n const path = resolveEditablePathOf(node);\n if (!path) return null;\n const axisAngle = constraintAxisOf(node);\n const solved = solvePathConstraints(path, constraints, { axisAngle });\n if (solved.converged) return { path: solved.path, unsatisfied: [] };\n return { path, unsatisfied: unsatisfiedConstraints(pathAnchorPoints(path), constraints, { axisAngle }) };\n}\n","/**\n * The small marks the path-edit overlay draws for a path's constraints, in\n * screen pixels, and where a click finds them: a letter beside a horizontal\n * or vertical segment, paired strokes beside parallel ones, a foot beside\n * perpendicular ones, ticks across equal ones, a dimension bar beside a fixed\n * length, a pin by a fixed anchor, and a ring by coincident ones. Marks sit\n * on the inside of the shape, toward the centroid of its anchors, so a click\n * on one lands on the shape rather than on empty canvas.\n */\n\nimport type { DrawCommand } from '@weasel-js/renderer';\nimport { constraintFits, PathBuilder, type AnchorPair, type PathConstraint } from '@weasel-js/geom';\n\ninterface Pt {\n x: number;\n y: number;\n}\n\n/** How far a mark sits off its segment or anchor. */\nconst OFFSET = 12;\n\n/** Colors for the constraint marks. */\nexport interface ConstraintGlyphStyle {\n /** A constraint that holds. */\n stroke: string;\n /** One that does not: it conflicts with the others. */\n conflictStroke: string;\n}\n\nconst at = (p: Pt, d: Pt, k: number): Pt => ({ x: p.x + d.x * k, y: p.y + d.y * k });\n\nfunction line(b: PathBuilder, p: Pt, q: Pt): void {\n b.moveTo(p.x, p.y).lineTo(q.x, q.y);\n}\n\nfunction centroidOf(points: readonly Pt[]): Pt {\n const n = points.length || 1;\n return { x: points.reduce((s, p) => s + p.x, 0) / n, y: points.reduce((s, p) => s + p.y, 0) / n };\n}\n\n/** The unit vector from `p` toward `to`, or straight down when they meet. */\nfunction toward(p: Pt, to: Pt): Pt {\n const len = Math.hypot(to.x - p.x, to.y - p.y);\n return len > 1e-9 ? { x: (to.x - p.x) / len, y: (to.y - p.y) / len } : { x: 0, y: 1 };\n}\n\n/** The segment's midpoint, direction, the inward normal its marks sit along, and where its mark sits. */\nfunction frameOf(points: readonly Pt[], [i, j]: AnchorPair, inside: Pt) {\n const a = points[i];\n const c = points[j];\n const len = Math.hypot(c.x - a.x, c.y - a.y);\n const u = len > 1e-9 ? { x: (c.x - a.x) / len, y: (c.y - a.y) / len } : { x: 1, y: 0 };\n const m = { x: (a.x + c.x) / 2, y: (a.y + c.y) / 2 };\n const left = { x: -u.y, y: u.x };\n const n = left.x * (inside.x - m.x) + left.y * (inside.y - m.y) < 0 ? { x: u.y, y: -u.x } : left;\n return { m, u, n, o: at(m, n, OFFSET) };\n}\n\nfunction segmentsOf(c: PathConstraint): readonly AnchorPair[] {\n switch (c.kind) {\n case 'fixed':\n case 'coincident': return [];\n case 'horizontal':\n case 'vertical':\n case 'length': return [c.segment];\n default: return c.segments;\n }\n}\n\n/** Where `c`'s marks sit, one point per mark. */\nfunction markCenters(points: readonly Pt[], c: PathConstraint, inside: Pt): Pt[] {\n if (c.kind === 'fixed' || c.kind === 'coincident') {\n const p = points[c.kind === 'fixed' ? c.anchor : c.anchors[0]];\n return [at(p, toward(p, inside), c.kind === 'fixed' ? 11 : 13)];\n }\n return segmentsOf(c).map((s) => {\n const f = frameOf(points, s, inside);\n return c.kind === 'equalLength' ? f.m : f.o;\n });\n}\n\nfunction letter(b: PathBuilder, o: Pt, which: 'H' | 'V'): void {\n if (which === 'H') {\n line(b, { x: o.x - 3, y: o.y - 4 }, { x: o.x - 3, y: o.y + 4 });\n line(b, { x: o.x + 3, y: o.y - 4 }, { x: o.x + 3, y: o.y + 4 });\n line(b, { x: o.x - 3, y: o.y }, { x: o.x + 3, y: o.y });\n } else {\n b.moveTo(o.x - 3, o.y - 4).lineTo(o.x, o.y + 4).lineTo(o.x + 3, o.y - 4);\n }\n}\n\nfunction segmentMark(b: PathBuilder, points: readonly Pt[], kind: PathConstraint['kind'], s: AnchorPair, inside: Pt): void {\n const { m, u, n, o } = frameOf(points, s, inside);\n switch (kind) {\n case 'parallel':\n for (const k of [-2, 2]) line(b, at(at(o, n, k), u, -4), at(at(o, n, k), u, 4));\n return;\n case 'perpendicular':\n line(b, at(o, u, -4), at(o, u, 4));\n line(b, o, at(o, n, 7));\n return;\n case 'equalLength':\n for (const k of [-2, 2]) line(b, at(at(m, u, k), n, -4), at(at(m, u, k), n, 4));\n return;\n case 'length':\n line(b, at(o, u, -8), at(o, u, 8));\n for (const k of [-8, 8]) line(b, at(at(o, u, k), n, -3), at(at(o, u, k), n, 3));\n return;\n default:\n letter(b, o, kind === 'vertical' ? 'V' : 'H');\n }\n}\n\nfunction glyphOf(b: PathBuilder, points: readonly Pt[], c: PathConstraint, inside: Pt): void {\n switch (c.kind) {\n case 'fixed': {\n // A pin standing on the anchor, pointing at it from inside the shape.\n const p = points[c.anchor];\n const d = toward(p, inside);\n const side = { x: -d.y, y: d.x };\n b.moveTo(...xy(at(p, d, 6))).lineTo(...xy(at(at(p, d, 14), side, -5)))\n .lineTo(...xy(at(at(p, d, 14), side, 5))).close();\n line(b, at(at(p, d, 17), side, -7), at(at(p, d, 17), side, 7));\n return;\n }\n case 'coincident': {\n // A ring inside the shape, tied to the anchor by a short stem.\n const p = points[c.anchors[0]];\n const d = toward(p, inside);\n const ring = at(p, d, 13);\n line(b, at(p, d, 6), at(p, d, 9));\n b.moveTo(ring.x + 4, ring.y);\n for (let k = 1; k <= 12; k++) b.lineTo(ring.x + 4 * Math.cos((k * Math.PI) / 6), ring.y + 4 * Math.sin((k * Math.PI) / 6));\n return;\n }\n default:\n for (const s of segmentsOf(c)) segmentMark(b, points, c.kind, s, inside);\n }\n}\n\nconst xy = (p: Pt): [number, number] => [p.x, p.y];\n\n/**\n * Draw commands marking `constraints` on anchors at the screen positions\n * `points`, one per constraint, in `style.conflictStroke` for those listed\n * in `unsatisfied` and `style.stroke` for the rest; the one at `selected` is\n * drawn heavier. A constraint naming an anchor `points` does not have draws\n * nothing.\n */\nexport function constraintGlyphs(\n points: readonly Pt[],\n constraints: readonly PathConstraint[],\n unsatisfied: ReadonlySet<number>,\n style: ConstraintGlyphStyle,\n selected: number | null = null,\n): DrawCommand[] {\n const inside = centroidOf(points);\n const out: DrawCommand[] = [];\n constraints.forEach((c, i) => {\n if (!constraintFits(c, points.length)) return;\n const b = new PathBuilder();\n glyphOf(b, points, c, inside);\n const color = unsatisfied.has(i) ? style.conflictStroke : style.stroke;\n out.push({ kind: 'path', path: b.build(), stroke: { paint: { kind: 'solid', color }, width: i === selected ? 3 : 1.5 } });\n });\n return out;\n}\n\n/**\n * The index of the constraint whose mark is nearest `p`, within `radius`,\n * for marks drawn on anchors at the screen positions `points`; -1 for none.\n */\nexport function constraintMarkAt(\n points: readonly Pt[],\n constraints: readonly PathConstraint[],\n p: Pt,\n radius: number,\n): number {\n const inside = centroidOf(points);\n let best = -1;\n let bestD = radius;\n constraints.forEach((c, i) => {\n if (!constraintFits(c, points.length)) return;\n for (const m of markCenters(points, c, inside)) {\n const d = Math.hypot(m.x - p.x, m.y - p.y);\n if (d <= bestD) {\n bestD = d;\n best = i;\n }\n }\n });\n return best;\n}\n","/**\n * Path constraints in path edit: their marks on the open path, a click\n * selecting one, Delete removing it, and every edit finished so they hold.\n */\nimport { pathAnchorPoints, unsatisfiedConstraints, type PathConstraint, type PolygonPath } from '@weasel-js/geom';\nimport type { EditAnchorsDep, PathEditExtension, PathEditTarget } from '@weasel-js/core';\nimport { constraintGlyphs, constraintMarkAt, type ConstraintGlyphStyle } from './constraintGlyphs';\nimport { constrainNodeEdit, constraintAxisOf, constraintsOf, solveNodeConstraints } from './pathConstraints';\n\n/** Owner id of the constraint marks, as `EditAnchorsDep.selectedMark` names them. */\nexport const CONSTRAINTS_EXTENSION_ID = 'constraints';\n\n/** Screen-pixel radius for \"this click landed on a constraint mark\". */\nconst MARK_CLICK_PX = 8;\n\nconst DEFAULT_STYLE: ConstraintGlyphStyle = { stroke: '#0e9f8e', conflictStroke: '#e5484d' };\n\n/** The edited node's world-space polygon, or null when it has none. */\nexport function editedPath(dep: EditAnchorsDep): PolygonPath | null {\n const p = dep.getEditablePath(dep.editingId) as PolygonPath | undefined;\n return p?.kind === 'polygon' ? p : null;\n}\n\n/**\n * Replace the open path's constraints with `constraints` as one history\n * entry, moving it the least that makes them all hold. When they cannot all\n * hold the path stays as it is and the list is stored all the same, the\n * conflict left for the marks to show. Clears the selected mark, since the\n * list is renumbered. False when the dep cannot store.\n */\nexport function setConstraints(dep: EditAnchorsDep, constraints: readonly PathConstraint[], label: string): boolean {\n const node = dep.getNodeShape(dep.editingId);\n const solved = node && dep.store ? solveNodeConstraints(node, constraints) : null;\n if (!solved) return false;\n dep.setSelectedMark?.(null);\n dep.store!(dep.editingId, solved.path, label, { constraints: [...constraints] });\n return true;\n}\n\n/** The constraint selected in path edit, as an index into the open path's list, or null. */\nexport function selectedConstraintOf(dep: EditAnchorsDep): number | null {\n const mark = dep.selectedMark;\n return mark?.owner === CONSTRAINTS_EXTENSION_ID ? mark.index : null;\n}\n\nconst screenPoints = (target: PathEditTarget, toScreen: (p: { x: number; y: number }) => { x: number; y: number }) =>\n pathAnchorPoints(target.path).map(toScreen);\n\n/** The constraints extension, its marks drawn in `style`'s colors. */\nexport function createConstraintsExtension(style: Partial<ConstraintGlyphStyle> = {}): PathEditExtension {\n const colors = { ...DEFAULT_STYLE, ...style };\n return {\n id: CONSTRAINTS_EXTENSION_ID,\n marks(ctx) {\n const constraints = constraintsOf(ctx.node.data);\n if (constraints.length === 0) return [];\n const world = pathAnchorPoints(ctx.path);\n const axisAngle = constraintAxisOf(ctx.node);\n const unsatisfied = new Set(unsatisfiedConstraints(world, constraints, { axisAngle }));\n return constraintGlyphs(world.map(ctx.toScreen), constraints, unsatisfied, colors, ctx.selected);\n },\n markAt(target, toScreen, screen) {\n const constraints = constraintsOf(target.node.data);\n if (constraints.length === 0) return -1;\n return constraintMarkAt(screenPoints(target, toScreen), constraints, screen, MARK_CLICK_PX);\n },\n deleteMark(target, index, store) {\n const current = constraintsOf(target.node.data);\n if (index >= current.length) return;\n const kept = current.filter((_, i) => i !== index);\n const solved = solveNodeConstraints(target.node, kept);\n if (solved) store(target.id, solved.path, 'Delete constraint', { constraints: kept });\n },\n finishEdit(node, worldPath, origins) {\n const done = constrainNodeEdit(node, worldPath, origins);\n if (!done) return null;\n return done.constraints === constraintsOf(node.data)\n ? { path: done.path }\n : { path: done.path, data: { constraints: done.constraints } };\n },\n };\n}\n","/**\n * Add and remove geometric constraints on the anchors selected in path edit.\n * Neither has a default binding: a consumer binds each kind it offers, with\n * the kind as a param (see `<SceneCanvas tune>`).\n */\n\nimport { type Action, type ActionDeps, ActionDisabledReason, type ImmediateInvoker } from '@weasel-js/routing';\nimport {\n constraintAnchors,\n pathAnchorPoints,\n type AnchorPair,\n type PathConstraint,\n type PathConstraintKind,\n type PolygonPath,\n} from '@weasel-js/geom';\nimport { depOf, deleteSelectedMark, type EditAnchorsDep, pathOperationTags } from '@weasel-js/core';\nimport { constraintsOf } from './pathConstraints';\nimport { editedPath, selectedConstraintOf, setConstraints } from './constraintsExtension';\n\n/** Params for `constrainAnchors`. */\nexport interface ConstrainAnchorsParams {\n kind: PathConstraintKind;\n /** For `length`: the length to hold. Default: each pair's length now. */\n length?: number;\n}\n\nconst pairsOf = (anchors: readonly number[]): AnchorPair[] =>\n anchors.slice(1).map((b, i) => [anchors[i], b] as const);\n\n/** Two segments from three anchors, meeting at the middle one, or from four, as two pairs. */\nfunction segmentPair(anchors: readonly number[]): readonly [AnchorPair, AnchorPair] | null {\n if (anchors.length === 3) return [[anchors[0], anchors[1]], [anchors[1], anchors[2]]];\n if (anchors.length === 4) return [[anchors[0], anchors[1]], [anchors[2], anchors[3]]];\n return null;\n}\n\n/**\n * The constraints of `kind` that `anchors`, in the order they were selected,\n * ask for: each anchor for `fixed`; each consecutive pair for `horizontal`,\n * `vertical`, `length`, and `coincident`; and for the kinds relating two\n * segments, three anchors as two segments sharing the middle one or four as\n * two pairs. Empty when the anchors cannot make that kind.\n */\nexport function constraintsForAnchors(\n kind: PathConstraintKind,\n anchors: readonly number[],\n path: PolygonPath,\n length?: number,\n): PathConstraint[] {\n switch (kind) {\n case 'fixed': return anchors.map((anchor) => ({ kind, anchor }));\n case 'horizontal':\n case 'vertical': return pairsOf(anchors).map((segment) => ({ kind, segment }));\n case 'coincident': return pairsOf(anchors).map((pair) => ({ kind, anchors: pair }));\n case 'length': {\n const points = pathAnchorPoints(path);\n return pairsOf(anchors).map((segment) => ({\n kind,\n segment,\n length: length ?? Math.hypot(points[segment[1]].x - points[segment[0]].x, points[segment[1]].y - points[segment[0]].y),\n }));\n }\n default: {\n const segments = segmentPair(anchors);\n return segments ? [{ kind, segments }] : [];\n }\n }\n}\n\nconst sameConstraint = (a: PathConstraint, b: PathConstraint) => JSON.stringify(a) === JSON.stringify(b);\n\n/** The constraints adding `params` to the edited path's would leave it with, or null for no change. */\nfunction withAdded(dep: EditAnchorsDep, params: Partial<ConstrainAnchorsParams> | undefined): PathConstraint[] | null {\n const path = editedPath(dep);\n if (!path || !params?.kind) return null;\n const current = constraintsOf(dep.getNodeShape(dep.editingId)?.data);\n const added = constraintsForAnchors(params.kind, [...dep.selectedAnchors], path, params.length)\n .filter((c) => !current.some((had) => sameConstraint(had, c)));\n return added.length > 0 ? [...current, ...added] : null;\n}\n\n/** The constraints left once those on only selected anchors, of `kind` when given, are gone; null for no change. */\nfunction withRemoved(dep: EditAnchorsDep, kind: PathConstraintKind | undefined): PathConstraint[] | null {\n const current = constraintsOf(dep.getNodeShape(dep.editingId)?.data);\n const kept = current.filter((c) =>\n (kind !== undefined && c.kind !== kind) || !constraintAnchors(c).every((a) => dep.selectedAnchors.has(a)));\n return kept.length < current.length ? kept : null;\n}\n\nfunction constraintCommand(\n id: string,\n label: string,\n next: (dep: EditAnchorsDep, params: Record<string, unknown> | undefined) => PathConstraint[] | null,\n): Action & { requires: string[] } {\n const ready = (deps: ActionDeps | undefined) => {\n const dep = depOf(deps);\n return dep?.store && dep.selectedAnchors.size > 0 ? dep : null;\n };\n return {\n id,\n label,\n group: 'anchors',\n tags: pathOperationTags('drag'),\n eligible: { capability: 'edits-anchors' },\n requires: ['editAnchors'],\n invoker: {\n timing: 'immediate',\n run: (deps, params) => {\n const dep = ready(deps);\n const list = dep && next(dep, params);\n if (dep && list) setConstraints(dep, list, label);\n },\n } as ImmediateInvoker,\n enabled: (deps) => (ready(deps) ? true : ActionDisabledReason.SelectionRequired),\n };\n}\n\n/**\n * Delete the constraint selected in path edit, as a command. Delete and\n * Backspace reach it through `deleteAnchors`, which deletes whichever of the\n * two is selected, so the keys have one binding.\n */\nexport const deleteConstraintAction: Action & { requires: string[] } = {\n id: 'deleteConstraint',\n label: 'Delete constraint',\n eligible: { capability: 'edits-anchors' },\n requires: ['editAnchors'],\n invoker: {\n timing: 'immediate',\n run: (deps) => {\n const dep = depOf(deps);\n if (dep && selectedConstraintOf(dep) !== null) deleteSelectedMark(dep);\n },\n } as ImmediateInvoker,\n enabled: (deps) => {\n const dep = depOf(deps);\n return dep?.store && selectedConstraintOf(dep) !== null ? true : ActionDisabledReason.SelectionRequired;\n },\n};\n\n/**\n * Constrain the selected anchors: params `{ kind, length? }`, read as\n * {@link constraintsForAnchors} reads them. The path moves the least that\n * makes every constraint hold; a constraint that conflicts with the rest is\n * kept all the same, left unsolved, and shown as a conflict.\n */\nexport const constrainAnchorsAction = constraintCommand(\n 'constrainAnchors',\n 'Constrain anchors',\n (dep, params) => withAdded(dep, params as Partial<ConstrainAnchorsParams> | undefined),\n);\n\n/**\n * Remove the constraints whose anchors are all selected — only those of\n * `kind` when the params name one.\n */\nexport const unconstrainAnchorsAction = constraintCommand(\n 'unconstrainAnchors',\n 'Remove constraints',\n (dep, params) => withRemoved(dep, params?.kind as PathConstraintKind | undefined),\n);\n","/**\n * What the click-driven path commands share: the press they act at and how\n * far it reaches, the strokes of the scene they act on, and the outlines that\n * stop or cut them.\n */\nimport type { ActionDeps } from '@weasel-js/routing';\nimport type { Path } from '@weasel-js/geom';\nimport { type NodeId, nodeOutline, type PathNode, resolveEditablePathOf, type SceneNode } from '@weasel-js/core';\n\ntype AnyNode = SceneNode<unknown, string, unknown>;\n\n/** Default reach of a click from the stroke it acts on, in screen pixels. */\nexport const DEFAULT_STROKE_REACH_PX = 6;\n\ntype PressParams = {\n pressX?: number; pressY?: number; worldX?: number; worldY?: number; radiusPx?: number;\n} | undefined;\n\n/** A world point, and how far from it a stroke may be in world units. */\nexport interface StrokePress {\n at: { x: number; y: number };\n radius: number;\n}\n\n/** The press in `params` — a click's, or else a hover's pointer — and its\n * reach, `radiusPx` at the view's scale; null with neither point. */\nexport function pressOf(deps: ActionDeps, params: unknown): StrokePress | null {\n const p = params as PressParams;\n const x = p?.pressX ?? p?.worldX, y = p?.pressY ?? p?.worldY;\n if (x === undefined || y === undefined) return null;\n const scale = deps.view?.get().scale ?? { x: 1, y: 1 };\n const radius = (p?.radiusPx ?? DEFAULT_STROKE_REACH_PX) / Math.max(Math.abs(scale.x), Math.abs(scale.y));\n return { at: { x, y }, radius };\n}\n\nfunction renderOrder(deps: ActionDeps | undefined): readonly AnyNode[] {\n const scene = deps?.scene as { renderOrderNodes?(): readonly AnyNode[] } | undefined;\n return scene?.renderOrderNodes?.() ?? [];\n}\n\n/** Every leaf of the scene holding an editable path, back to front. */\nexport function scenePathNodes(deps: ActionDeps | undefined): PathNode[] {\n const out: PathNode[] = [];\n for (const node of renderOrder(deps)) {\n if (node.kind !== 'leaf') continue;\n const path = resolveEditablePathOf(node);\n if (path) out.push({ id: node.id as NodeId, node, path });\n }\n return out;\n}\n\n/** The drawn outline of every leaf but `id`: what a stroke is cut at or\n * stopped by. */\nexport function strokesBesides(deps: ActionDeps | undefined, id: string): Path[] {\n const out: Path[] = [];\n for (const node of renderOrder(deps)) {\n if (node.kind !== 'leaf' || node.id === id) continue;\n const outline = nodeOutline(node);\n if (outline) out.push(outline);\n }\n return out;\n}\n","/** Extend to next path: carry an open end along its tangent until it meets a stroke. */\nimport { type Action, type ActionDeps, ActionDisabledReason, type ImmediateInvoker } from '@weasel-js/routing';\nimport {\n extendToMeet, locateAnchor, openEndRay, openPathEnds, pathDistanceToPoint, pathToAnchors,\n type AnchorSet, type OpenPathEnd, type PolygonPath,\n} from '@weasel-js/geom';\nimport { commitOps, type Op, type PathNode, reshapeOps, selectedPathNodes, pathOperationTags } from '@weasel-js/core';\nimport { pressOf, scenePathNodes, strokesBesides, type StrokePress } from '../shared/scenePaths';\n\nconst EXTEND_LABEL = 'Extend to next path';\n\n/** The open ends of `path` whose anchors are in `anchors`, flat-indexed;\n * every open end when none of the anchors is one. */\nfunction endsAt(path: PolygonPath, anchors: ReadonlySet<number>): OpenPathEnd[] {\n const ends = openPathEnds(path);\n if (anchors.size === 0) return ends;\n const set = pathToAnchors(path) as AnchorSet;\n const picked = ends.filter((e) => [...anchors].some((flat) => {\n const at = locateAnchor(set, flat);\n if (!at || at.sub !== e.sub) return false;\n return e.end === 'first' ? at.idx === 0 : at.idx === set.anchors[at.sub].length - 1;\n }));\n return picked.length > 0 ? picked : ends;\n}\n\nconst dist = (a: { x: number; y: number }, b: { x: number; y: number }) => Math.hypot(a.x - b.x, a.y - b.y);\n\n/** The topmost stroke within reach of `press` with an open end, and that end\n * of it nearest the press. */\nfunction endNearPress(all: readonly PathNode[], press: StrokePress) {\n for (let i = all.length - 1; i >= 0; i--) {\n const node = all[i];\n if (pathDistanceToPoint(node.path, press.at.x, press.at.y) > press.radius) continue;\n const near = openPathEnds(node.path)\n .map((end) => ({ end, ray: openEndRay(node.path, end) }))\n .filter((e) => e.ray)\n .sort((a, b) => dist(a.ray!.at, press.at) - dist(b.ray!.at, press.at))[0];\n if (near) return [{ node, ends: [near.end] }];\n }\n return [];\n}\n\n/** What Extend to next path would make of each node it reaches. */\nfunction planExtend(deps: ActionDeps | undefined, params?: unknown): Map<string, { node: PathNode; path: PolygonPath }> {\n const out = new Map<string, { node: PathNode; path: PolygonPath }>();\n const all = scenePathNodes(deps);\n const editing = deps?.editAnchors?.editingId;\n const press = deps ? pressOf(deps, params) : null;\n const subjects = press ? endNearPress(all, press) : editing\n ? all.filter((n) => n.id === editing).map((node) => ({ node, ends: endsAt(node.path, deps!.editAnchors!.selectedAnchors) }))\n : selectedPathNodes(deps).map((node) => ({ node, ends: openPathEnds(node.path) }));\n for (const { node, ends } of subjects) {\n const boundaries = strokesBesides(deps, node.id);\n let path = node.path;\n for (const end of ends) path = extendToMeet(path, boundaries, end)?.path ?? path;\n if (path !== node.path) out.set(node.id, { node, path });\n }\n return out;\n}\n\n/**\n * @experimental Extend to next path: carry each open end of the selected\n * paths along its tangent to the first stroke it meets (`extendToMeet`). In\n * path edit, the selected end anchors of the edited path, or all its open\n * ends when none is selected. Given a press (`pressX`, `pressY`, as a click\n * binding supplies), the open end nearest it of the topmost stroke within\n * `radiusPx` instead. An end that meets nothing stays put. One undo step.\n */\nexport const extendToMeetAction: Action & { requires: string[] } = {\n id: 'extendToMeet',\n label: EXTEND_LABEL,\n tags: pathOperationTags('click'),\n group: 'path',\n eligible: { capability: 'creates-shapes' },\n requires: ['selection', 'scene', 'applyOps', 'editAnchors', 'view'],\n invoker: {\n timing: 'immediate',\n run: (deps, params) => {\n const ops: Op[] = [];\n for (const { node, path } of planExtend(deps, params).values()) ops.push(...reshapeOps(node.node, path, EXTEND_LABEL));\n commitOps(deps, ops, EXTEND_LABEL);\n },\n } satisfies ImmediateInvoker,\n // A click's point arrives here without the binding's reach, so `run` decides there.\n enabled: (deps?: ActionDeps, at?: { x: number; y: number }) =>\n (at || planExtend(deps).size > 0 ? true : ActionDisabledReason.NotApplicable),\n};\n","/**\n * Toggles for the locks every path-edit handle drag holds without a\n * modifier: its angle, its length, or both, which freezes it. They set the\n * `editAnchors` dep's `handleLocks`, so a bar, the command palette, and\n * `<SceneCanvas tune>`'s `handleLock` param, which they start from, all\n * reach the one value the drag reads.\n */\n\nimport { type Action, type ActionDeps, ActionDisabledReason, type ImmediateInvoker } from '@weasel-js/routing';\nimport { type HandleLock, HoldHandleAngleIcon, HoldHandleLengthIcon, pathOperationTags } from '@weasel-js/core';\n\nfunction makeHandleLockToggle(\n lock: HandleLock,\n label: string,\n icon: Action['icon'],\n): Action & { requires: string[] } {\n return {\n id: `handleLock.${lock}`,\n label,\n tags: pathOperationTags('drag'),\n icon,\n group: 'anchors',\n requires: ['editAnchors'],\n active: (deps?: ActionDeps) => deps?.editAnchors?.handleLocks?.[lock] === true,\n enabled: (deps?: ActionDeps) =>\n deps?.editAnchors?.setHandleLocks ? true : ActionDisabledReason.NotApplicable,\n invoker: {\n timing: 'immediate',\n run: (deps) => {\n const dep = deps?.editAnchors;\n if (!dep?.setHandleLocks) return;\n const held = dep.handleLocks ?? { angle: false, length: false };\n dep.setHandleLocks({ ...held, [lock]: !held[lock] });\n },\n } as ImmediateInvoker,\n };\n}\n\n/** Hold every handle drag to the handle's angle, as Shift does. */\nexport const handleLockAngleAction = makeHandleLockToggle('angle', 'Hold handle angle', <HoldHandleAngleIcon />);\n\n/** Hold every handle drag to the handle's length, as Mod (Cmd or Ctrl) does. */\nexport const handleLockLengthAction = makeHandleLockToggle('length', 'Hold handle length', <HoldHandleLengthIcon />);\n","import { harmonizeAnchors } from '@weasel-js/geom';\nimport { HarmonizeIcon, makeHandleCommand } from '@weasel-js/core';\n\n/**\n * Make the selected smooth anchors curvature-continuous by adjusting their\n * handle lengths, or every smooth anchor of the path while none is selected.\n */\nexport const harmonizeAnchorsAction = makeHandleCommand(\n 'harmonizeAnchors',\n 'Harmonize curvature',\n <HarmonizeIcon />,\n harmonizeAnchors,\n 'selectedOrAll',\n);\n","/**\n * Path-effect settings read from action params: each field taken only when it\n * is the right type, so a slider's number or a toggle's boolean passes and a\n * stray value is ignored rather than written into a document.\n */\nimport type { BendAlongEffect, BlendEffect, PathEffect, RepeatAlongEffect } from '@weasel-js/core';\n\ntype Params = Record<string, unknown> | undefined;\n\nconst num = (v: unknown): number | undefined => (typeof v === 'number' && Number.isFinite(v) ? v : undefined);\nconst bool = (v: unknown): boolean | undefined => (typeof v === 'boolean' ? v : undefined);\nconst oneOf = <T extends string>(v: unknown, options: readonly T[]): T | undefined =>\n (typeof v === 'string' && (options as readonly string[]).includes(v) ? (v as T) : undefined);\n\n/** `fields` without the entries left `undefined`. */\nfunction defined<T extends object>(fields: T): Partial<T> {\n return Object.fromEntries(Object.entries(fields).filter(([, v]) => v !== undefined)) as Partial<T>;\n}\n\n/** The settings of a `kind` effect that `params` names. */\nexport function effectSettings(kind: PathEffect['kind'], params: Params): Partial<PathEffect> {\n const p = params ?? {};\n switch (kind) {\n case 'blend':\n return defined<Partial<BlendEffect>>({\n steps: num(p.steps) === undefined ? undefined : Math.max(Math.round(num(p.steps)!), 0),\n autoAlign: bool(p.autoAlign),\n startOffset: num(p.startOffset) === undefined ? undefined : Math.round(num(p.startOffset)!),\n reverse: bool(p.reverse),\n rotate: bool(p.rotate),\n });\n case 'bendAlong':\n return defined<Partial<BendAlongEffect>>({\n fit: oneOf(p.fit, ['stretch', 'natural'] as const),\n baseline: num(p.baseline),\n flip: bool(p.flip),\n tolerance: num(p.tolerance) === undefined ? undefined : Math.max(num(p.tolerance)!, 0.01),\n });\n case 'repeatAlong':\n return defined<Partial<RepeatAlongEffect>>({\n count: num(p.count) === undefined ? undefined : Math.max(Math.round(num(p.count)!), 0),\n spacing: num(p.spacing) === undefined ? undefined : Math.max(num(p.spacing)!, 0),\n align: oneOf(p.align, ['start', 'center', 'end'] as const),\n offset: num(p.offset),\n orient: bool(p.orient),\n });\n }\n}\n\n/**\n * `effect` with the settings `params` names laid over it. A blend's\n * `reverse: 'auto'` clears its direction, handing it back to `autoAlign`.\n */\nexport function withEffectSettings(effect: PathEffect, params: Params): PathEffect {\n const next = { ...effect, ...effectSettings(effect.kind, params) } as PathEffect;\n if (next.kind === 'blend' && params?.reverse === 'auto') delete next.reverse;\n return next;\n}\n\n/** What a new effect of `kind` starts from, before its params. */\nexport const EFFECT_DEFAULTS: { [K in PathEffect['kind']]: Extract<PathEffect, { kind: K }> } = {\n blend: { kind: 'blend', steps: 4 },\n bendAlong: { kind: 'bendAlong' },\n repeatAlong: { kind: 'repeatAlong' },\n};\n","/**\n * The path-effect actions: make a live blend, bend, or repeat from the\n * selection; change one's settings; and expand one into ordinary paths.\n */\nimport { type Action, type ActionDeps, ActionDisabledReason, type ImmediateInvoker } from '@weasel-js/routing';\nimport { worldEditToStorage } from '@weasel-js/geom';\nimport {\n commitOps, createSetDataOp, deleteNode, derivedDepOf, insertAt, type NodeId, type Op, type PathEffect, pathEffectNode, pathEffectOf, pathEffectParts, registeredPathEffects, type Scene, type SceneNode as Node, slotOf, pathOperationTags,\n} from '@weasel-js/core';\nimport { EFFECT_DEFAULTS, withEffectSettings } from './params';\n\ntype AnyScene = Scene<unknown, string, unknown>;\ntype AnyNode = Node<unknown, string, unknown>;\n\n/** The `group` every path-effect action is in, for an `<ActionBar>`. */\nexport const PATH_EFFECTS_GROUP = 'pathEffects';\n\n/** The first two selected leaves, in the order they were selected. `null`\n * too in a scene whose registry holds no path effects, which could not save\n * one. */\nfunction selectedPair(deps: ActionDeps | undefined): [AnyNode, AnyNode] | null {\n const scene = deps?.scene as AnyScene | undefined;\n if (!scene || registeredPathEffects(scene.registry) === null) return null;\n const leaves = (deps?.selection?.get() ?? [])\n .map((id) => scene.get(id as NodeId))\n .filter((n): n is AnyNode => n !== undefined && n.kind === 'leaf');\n return leaves.length >= 2 ? [leaves[0]!, leaves[1]!] : null;\n}\n\n/** The selected nodes holding a path effect. */\nfunction selectedEffects(deps: ActionDeps | undefined, ids?: readonly string[]): AnyNode[] {\n const scene = deps?.scene as AnyScene | undefined;\n if (!scene) return [];\n return (ids ?? deps?.selection?.get() ?? [])\n .map((id) => scene.get(id as NodeId))\n .filter((n): n is AnyNode => n !== undefined && pathEffectOf(n) !== null);\n}\n\ninterface CreateSpec {\n id: string;\n label: string;\n kind: PathEffect['kind'];\n key: string;\n code: string;\n /** Where the new node goes: between its two sources, or over both. */\n between: boolean;\n}\n\nfunction createEffectAction(spec: CreateSpec): Action & { requires: string[] } {\n return {\n id: spec.id,\n label: spec.label,\n tags: pathOperationTags('command'),\n group: PATH_EFFECTS_GROUP,\n // Alt+Shift, which no major browser takes for these letters (see\n // `BROWSER_RESERVED_CHORDS`); `code` too, since with Alt held on a Mac the\n // key reads as another glyph.\n defaultBinding: { kind: 'key', key: spec.key, code: spec.code, mods: { alt: true, shift: true } },\n eligible: { capability: 'creates-shapes' },\n requires: ['selection', 'scene', 'applyOps'],\n invoker: {\n timing: 'immediate',\n run: (deps, params) => {\n const scene = deps.scene as AnyScene | undefined;\n const pair = selectedPair(deps);\n if (!scene || !pair) return;\n const derivations = registeredPathEffects(scene.registry)!;\n const [a, b] = pair;\n const effect = withEffectSettings(EFFECT_DEFAULTS[spec.kind], params as Record<string, unknown> | undefined);\n const sameParent = a.parent === b.parent;\n const slots = [slotOf(scene, a.id), slotOf(scene, b.id)];\n // Inserting at the upper source's slot puts the steps just under it.\n const index = !sameParent ? -1 : spec.between ? Math.max(...slots) : Math.max(...slots) + 1;\n const node = {\n ...pathEffectNode(effect, [a.id, b.id], a.layer, derivations),\n id: scene.mintId(),\n parent: sameParent ? a.parent : null,\n } as unknown as AnyNode;\n commitOps(deps, [insertAt(node, index, spec.label)], spec.label);\n deps.selection?.set([node.id] as never);\n },\n } satisfies ImmediateInvoker,\n enabled: (deps) => {\n const scene = deps?.scene as AnyScene | undefined;\n if (scene && registeredPathEffects(scene.registry) === null) return ActionDisabledReason.NotApplicable;\n return selectedPair(deps) ? true : ActionDisabledReason.SelectionRequired;\n },\n };\n}\n\n/**\n * Steps between the first two selected shapes, in the order they were\n * selected: `params.steps` of them, each shape, fill, stroke and turn\n * interpolated. The blend is live — editing either source moves its steps —\n * and goes just under the upper source. Its other params are\n * `BlendEffect`'s.\n */\nexport const blendAction = createEffectAction({\n id: 'blend', label: 'Blend', kind: 'blend', key: 'b', code: 'KeyB', between: true,\n});\n\n/**\n * The first selected shape bent along the second, live: editing the spine\n * re-bends it. Params are `BendAlongEffect`'s.\n */\nexport const bendAlongAction = createEffectAction({\n id: 'bendAlong', label: 'Bend Along Path', kind: 'bendAlong', key: 'w', code: 'KeyW', between: false,\n});\n\n/**\n * Copies of the first selected shape along the second, live. Params are\n * `RepeatAlongEffect`'s.\n */\nexport const repeatAlongAction = createEffectAction({\n id: 'repeatAlong', label: 'Repeat Along Path', kind: 'repeatAlong', key: 'r', code: 'KeyR', between: false,\n});\n\nconst EDIT_LABEL = 'Edit Path Effect';\n\n/**\n * Change the settings of path effects: `params.ids` when given, else the\n * selected ones. Every other param is a setting, laid over each effect's\n * own, and one that would change nothing commits nothing. Consecutive edits\n * of one effect coalesce, so a slider dragged through many values is one\n * undo step where the scene coalesces.\n */\nexport const editPathEffectAction: Action & { requires: string[] } = {\n id: 'editPathEffect',\n label: EDIT_LABEL,\n requires: ['scene', 'applyOps'],\n invoker: {\n timing: 'immediate',\n run: (deps, params) => {\n const p = params as Record<string, unknown> | undefined;\n const ids = Array.isArray(p?.ids) ? (p.ids as string[]) : undefined;\n const ops: Op[] = [];\n for (const node of selectedEffects(deps, ids)) {\n const effect = pathEffectOf(node)!;\n const next = withEffectSettings(effect, p);\n if (sameEffect(effect, next)) continue;\n ops.push(createSetDataOp({\n id: node.id,\n from: node.data,\n to: { ...(node.data as object), pathEffect: next },\n label: EDIT_LABEL,\n coalesceKey: `${EDIT_LABEL}:${node.id}`,\n }));\n }\n commitOps(deps, ops, EDIT_LABEL);\n },\n } satisfies ImmediateInvoker,\n};\n\nfunction sameEffect(a: PathEffect, b: PathEffect): boolean {\n const keys = new Set([...Object.keys(a), ...Object.keys(b)]);\n for (const k of keys) {\n if ((a as unknown as Record<string, unknown>)[k] !== (b as unknown as Record<string, unknown>)[k]) return false;\n }\n return true;\n}\n\nconst EXPAND_LABEL = 'Expand to Paths';\n\n/**\n * Turn each selected path effect into the ordinary paths it shows, in its\n * slot and in its paint, and select them. Its sources stay; the paths no\n * longer follow them.\n */\nexport const expandPathEffectAction: Action & { requires: string[] } = {\n id: 'expandPathEffect',\n label: EXPAND_LABEL,\n group: PATH_EFFECTS_GROUP,\n defaultBinding: { kind: 'key', key: 'e', code: 'KeyE', mods: { alt: true, shift: true } },\n eligible: { capability: 'creates-shapes' },\n requires: ['selection', 'scene', 'applyOps'],\n invoker: {\n timing: 'immediate',\n run: (deps) => {\n const scene = deps.scene as AnyScene | undefined;\n if (!scene) return;\n // Top slot first, so a delete cannot shift a later one's index.\n const effects = selectedEffects(deps)\n .map((node) => ({ node, at: slotOf(scene, node.id) }))\n .sort((x, y) => y.at - x.at);\n const ops: Op[] = [];\n const made: string[] = [];\n for (const { node, at } of effects) {\n const sources = (Array.isArray(node.dependsOn) ? node.dependsOn : []).map((id) => derivedDepOf(scene, id));\n const parts = pathEffectParts(node, sources) ?? [];\n ops.push(deleteNode(scene, node, EXPAND_LABEL));\n parts.forEach((part, k) => {\n const { pose, path } = worldEditToStorage({ x: 0, y: 0, width: 0, height: 0 }, part.path);\n const data = {\n path,\n ...(part.fill === undefined ? {} : { fill: part.fill }),\n ...(part.stroke === undefined ? {} : { stroke: part.stroke }),\n };\n const copy = { id: scene.mintId(), kind: 'leaf', layer: node.layer, parent: node.parent, pose, data } as AnyNode;\n ops.push(insertAt(copy, at < 0 ? at : at + k, EXPAND_LABEL));\n made.push(copy.id);\n });\n }\n if (ops.length === 0) return;\n commitOps(deps, ops, EXPAND_LABEL);\n deps.selection?.set(made as never);\n },\n } satisfies ImmediateInvoker,\n enabled: (deps) => (selectedEffects(deps).length > 0 ? true : ActionDisabledReason.SelectionRequired),\n};\n","import {\n type Action, ActionDisabledReason, type InvocationCtx, type OngoingHandle, resolveParams,\n} from '@weasel-js/routing';\nimport type { CursorSpec } from '@weasel-js/cursor';\nimport {\n anchorsUnderBrush, editAnchorSetTracked, pathToAnchors, simplifyAnchorsAt,\n type AnchorSet, type PointOrigin, type PolygonPath,\n} from '@weasel-js/geom';\nimport {\n DEFAULT_SIMPLIFY_TOLERANCE, depOf, editingLayer, inPlane, pathEditPreview, pathEditToolAction, SimplifyBrushIcon, pathOperationTags,\n} from '@weasel-js/core';\n\n/** The path-edit tool under which a plain drag brushes. */\nexport const SIMPLIFY_BRUSH_TOOL = 'simplifyBrush';\n\n/** The brush's radius on screen when no param names one. */\nexport const SIMPLIFY_BRUSH_RADIUS_PX = 12;\n\n/** Params the brush reads on every move, so a thunk can change them mid-stroke. */\nexport interface SimplifyBrushParams {\n /** Brush radius in screen pixels. */\n radiusPx?: number;\n /** How far the refit may stray from the original, in world units, as for\n * the Simplify command. */\n tolerance?: number;\n}\n\n/** The kit's brush-ring cursor drawn `radiusPx` in radius on screen. */\nexport function brushRingCursor(radiusPx: number): CursorSpec {\n // The `brush` glyph's ring is 9.9 units in radius on a 24-unit box.\n return { glyph: 'brush', size: Math.round((radiusPx * 24) / 9.9), fallback: 'crosshair' };\n}\n\ntype Point = { x: number; y: number };\n\nconst brushing = (deps: Parameters<typeof depOf>[0]) => depOf(deps)?.tool === SIMPLIFY_BRUSH_TOOL;\n\nfunction radiusOf(params: SimplifyBrushParams | undefined): number {\n const r = params?.radiusPx;\n return typeof r === 'number' && r > 0 ? r : SIMPLIFY_BRUSH_RADIUS_PX;\n}\n\nfunction toleranceOf(params: SimplifyBrushParams | undefined): number {\n const t = params?.tolerance;\n return typeof t === 'number' && t >= 0 ? t : DEFAULT_SIMPLIFY_TOLERANCE;\n}\n\n/**\n * The Simplify command, brushed on. While path edit's\n * `simplifyBrush` tool is on, a plain drag gathers every anchor a round brush\n * passes over, and each unbroken stretch of them along a subpath is refitted\n * as one span by Simplify's own fitter (`simplifyAnchorsAt`) at `tolerance`.\n * Only anchors the shape does not need go, so brushing again goes further.\n * The path previews the result while the brush is down and commits as one\n * undo step on release.\n */\nexport const simplifyBrushAction: Action & { requires: string[] } = inPlane({\n id: 'simplifyBrush',\n label: 'Simplify brush',\n tags: pathOperationTags('brush'),\n // Declines through `enabled` unless its tool is on.\n defaultBinding: [{ spec: { kind: 'drag' }, opts: { yields: true } }],\n cursor: (params) => brushRingCursor(radiusOf(params as SimplifyBrushParams | undefined)),\n eligible: { capability: 'edits-anchors' },\n requires: ['editAnchors', 'view'],\n invoker: {\n timing: 'ongoing',\n start(ctx: InvocationCtx, opts): OngoingHandle {\n const dep = depOf(ctx.deps);\n if (!dep || dep.tool !== SIMPLIFY_BRUSH_TOOL) return {};\n const id = dep.editingId;\n const origin = dep.getEditablePath(id) as PolygonPath | undefined;\n if (!origin || origin.kind !== 'polygon') return {};\n const originSet = pathToAnchors(origin) as AnchorSet;\n\n const params = () => resolveParams(opts?.params) as SimplifyBrushParams | undefined;\n const radiusPx = (): number => radiusOf(params());\n const tolerance = (): number => toleranceOf(params());\n const scale = () => ctx.deps.view?.get().scale;\n const trail: Point[] = [];\n const gathered = new Set<number>();\n let current: { path: PolygonPath; origins?: readonly (PointOrigin | null)[] } | null = null;\n\n const sweepTo = (p: Point): void => {\n const from = trail[trail.length - 1] ?? p;\n trail.push({ x: p.x, y: p.y });\n const before = gathered.size;\n for (const i of anchorsUnderBrush(originSet, from, p, { radiusPx: radiusPx(), scale: scale() })) {\n gathered.add(i);\n }\n if (gathered.size === before) return;\n current = editAnchorSetTracked(origin, (set) => simplifyAnchorsAt(set, gathered, tolerance()));\n };\n\n const preview = pathEditPreview(dep, id, () => current?.path ?? null);\n if (!preview) return {};\n sweepTo(ctx.world);\n\n return {\n kind: 'simplify-brush',\n cursor: () => brushRingCursor(radiusPx()),\n onMove(moveCtx: InvocationCtx): void {\n sweepTo(moveCtx.world);\n },\n onEnd(_endCtx: InvocationCtx, reason: 'commit' | 'cancel'): void {\n if (reason === 'cancel') { current = null; return; }\n // The tolerance as it stands at release decides the commit.\n const done = gathered.size > 0\n ? editAnchorSetTracked(origin, (set) => simplifyAnchorsAt(set, gathered, tolerance()))\n : null;\n current = null;\n if (!done) return;\n dep.applyEdit(id, done.path, 'Simplify brush', done.origins);\n // Thinning renumbers every anchor after the first one removed.\n dep.setSelectedAnchors([]);\n },\n overlay: () => ({ kind: 'brush', points: trail.slice(), radiusPx: radiusPx() }),\n previewIds: preview.previewIds,\n previewPose: preview.previewPose,\n previewData: preview.previewData,\n };\n },\n },\n enabled: (deps) => (brushing(deps) ? true : ActionDisabledReason.NotApplicable),\n}, editingLayer);\n\n/** The bar toggle for the brush: `pathEditTool.simplifyBrush`. */\nexport const simplifyBrushToolAction = pathEditToolAction(SIMPLIFY_BRUSH_TOOL, 'Simplify brush', SimplifyBrushIcon);\n","/**\n * The Smudge brush's drag: the selected paths' outlines under a round brush\n * follow the pointer, as one undo entry per stroke.\n */\nimport {\n type Action, type ActionDeps, ActionDisabledReason, type BindingOpts, type InvocationCtx, type OngoingHandle, resolveParams,\n} from '@weasel-js/routing';\nimport { pxExtent, smudgePath, type PolygonPath } from '@weasel-js/geom';\nimport { brushRingCursor } from '../simplifyBrush/simplifyBrush';\nimport { commitOps, reshapeOps, selectedPathNodes, withPath, type PathNode, type SceneNode, pathOperationTags } from '@weasel-js/core';\n\ntype AnyNode = SceneNode<unknown, string, unknown>;\n\n/** The brush's radius in screen px when no param gives one. */\nexport const DEFAULT_SMUDGE_RADIUS_PX = 40;\n/** How much of the pointer's motion the outline under the brush's center follows,\n * when no param gives it. */\nexport const DEFAULT_SMUDGE_STRENGTH = 0.6;\n\nconst LABEL = 'Smudge brush';\n\n/** The params `smudgeBrush` reads, each on every pointer move. */\nexport interface SmudgeBrushParams {\n /** The brush's radius, in screen px. */\n radiusPx?: number;\n /** `1` moves the outline under the brush's center as far as the pointer; less, less. */\n strength?: number;\n}\n\nconst num = (v: unknown, d: number) => (typeof v === 'number' && Number.isFinite(v) ? v : d);\n\nfunction radiusOf(params: SmudgeBrushParams | undefined): number {\n return Math.max(1, num(params?.radiusPx, DEFAULT_SMUDGE_RADIUS_PX));\n}\n\nfunction strengthOf(params: SmudgeBrushParams | undefined): number {\n return Math.min(1, Math.max(0, num(params?.strength, DEFAULT_SMUDGE_STRENGTH)));\n}\n\n/** The brush's radius in world units: `radiusPx` on screen at the view's scale. */\nfunction worldRadius(deps: ActionDeps, radiusPx: number): number {\n const reach = pxExtent(radiusPx, deps.view?.get().scale ?? { x: 1, y: 1 });\n return Math.max(reach.x, reach.y);\n}\n\n/**\n * @experimental A drag that pushes the outline of every selected path along with\n * the pointer (`smudgePath` in `@weasel-js/geom`). Each pointer move is one dab from\n * where the last one ended: points under the brush move with it, most at its center\n * and not at all at its rim, and a long segment the brush meets gets anchors added\n * so it can bend there. `params.radiusPx` is the brush's radius on screen, so it\n * covers the same part of the canvas at every zoom, and `params.strength` how closely\n * the outline follows; both are read on every move. The cursor is a ring the size of\n * the brush. The stroke commits as one undo entry; canceling it leaves the paths as\n * they were.\n */\nexport const smudgeBrushAction: Action & { requires: string[] } = {\n id: 'smudgeBrush',\n label: LABEL,\n tags: pathOperationTags('brush'),\n group: 'path',\n eligible: { capability: 'creates-shapes' },\n cursor: (params) => brushRingCursor(radiusOf(params as SmudgeBrushParams | undefined)),\n requires: ['selection', 'scene', 'view', 'applyOps'],\n invoker: {\n timing: 'ongoing',\n start(ctx: InvocationCtx, opts?: BindingOpts): OngoingHandle {\n const nodes = selectedPathNodes(ctx.deps);\n if (nodes.length === 0) return {};\n const { deps } = ctx;\n const params = (move: InvocationCtx): SmudgeBrushParams =>\n ({ ...resolveParams(opts?.params), ...move.params }) as SmudgeBrushParams;\n let radiusPx = radiusOf(params(ctx));\n let at = { x: ctx.drag?.start.x ?? ctx.world.x, y: ctx.drag?.start.y ?? ctx.world.y };\n const current = new Map<string, { node: PathNode; path: PolygonPath }>();\n const shapeOf = (id: string) => {\n const entry = current.get(id);\n return entry ? withPath(entry.node.node as AnyNode, entry.path) : null;\n };\n return {\n kind: 'smudge-brush',\n cursor: () => brushRingCursor(radiusPx),\n onMove(move: InvocationCtx): void {\n const p = params(move);\n radiusPx = radiusOf(p);\n const to = { x: move.world.x, y: move.world.y };\n const radius = worldRadius(deps, radiusPx);\n for (const node of nodes) {\n const from = current.get(node.id)?.path ?? node.path;\n const next = smudgePath(from, {\n center: at, delta: { x: to.x - at.x, y: to.y - at.y }, radius, strength: strengthOf(p),\n });\n if (next !== from) current.set(node.id, { node, path: next });\n }\n at = to;\n },\n onEnd(_end: InvocationCtx, reason: 'commit' | 'cancel'): void {\n const done = [...current.values()];\n current.clear();\n if (reason === 'cancel' || done.length === 0) return;\n commitOps(deps, done.flatMap(({ node, path }) => reshapeOps(node.node, path, LABEL)), LABEL);\n },\n previewIds: () => (current.size > 0 ? [...current.keys()] : null),\n previewPose: (id: string) => shapeOf(id)?.pose ?? null,\n previewData: (id: string) => shapeOf(id)?.data ?? null,\n };\n },\n },\n enabled: (deps) => (selectedPathNodes(deps).length > 0 ? true : ActionDisabledReason.SelectionRequired),\n};\n","/** Trim segment: cut a stroke back to the crossings on either side of a click. */\nimport type { Action, ActionDeps, ImmediateInvoker } from '@weasel-js/routing';\nimport { trimPathAt, type TrimResult } from '@weasel-js/geom';\nimport { commitOps, deleteNode, reshapeOps, type PathNode, pathOperationTags } from '@weasel-js/core';\nimport { pressOf, scenePathNodes, strokesBesides } from '../shared/scenePaths';\n\nconst TRIM_LABEL = 'Trim segment';\n\n/** What a trim at the press in `params` would do: the stroke it reaches, and\n * what `trimPathAt` makes of it. Null when it reaches none it can trim.\n * `params` as {@link trimPathAction} reads them; a hover's pointer serves\n * as the press, which is how a tool previews the piece. */\nexport function planTrim(\n deps: ActionDeps,\n params: unknown,\n): { target: PathNode; result: TrimResult } | null {\n const press = pressOf(deps, params);\n if (!press) return null;\n const all = scenePathNodes(deps);\n for (let i = all.length - 1; i >= 0; i--) {\n const target = all[i];\n const result = trimPathAt(target.path, strokesBesides(deps, target.id), press.at, { radius: press.radius });\n if (result) return { target, result };\n }\n return null;\n}\n\n/**\n * @experimental Trim segment: remove the piece of the stroke under the press\n * between the nearest crossings on either side — with any other node's\n * outline, or with itself — as `trimPathAt` cuts it. The topmost stroke\n * within `radiusPx` of the press (default 6) is the one trimmed; a stroke\n * with nothing left is deleted. Params: `pressX`, `pressY` in world space,\n * which a click binding supplies.\n */\nexport const trimPathAction: Action & { requires: string[] } = {\n id: 'trimPath',\n label: TRIM_LABEL,\n tags: pathOperationTags('click'),\n group: 'path',\n eligible: { capability: 'creates-shapes' },\n requires: ['scene', 'applyOps', 'selection', 'view'],\n invoker: {\n timing: 'immediate',\n run: (deps, params) => {\n const plan = deps.scene ? planTrim(deps, params) : null;\n if (!plan) return;\n const { target, result } = plan;\n const gone = result.path.commands.length === 0;\n const ops = gone\n ? [deleteNode(deps.scene as never, target.node, TRIM_LABEL)]\n : reshapeOps(target.node, result.path, TRIM_LABEL);\n commitOps(deps, ops, TRIM_LABEL);\n if (gone) deps.selection?.set((deps.selection.get() ?? []).filter((id) => id !== target.id) as never);\n },\n } satisfies ImmediateInvoker,\n enabled: () => true,\n};\n","/**\n * A warp a node is holding: the path it warped, the warp, and the tolerance\n * the result was refitted to, kept on the node as `data.warp` beside the\n * `data.path` (or polygon pose) they produced. The geometry stays what every\n * reader uses; the warp only says how to make it again, so it can be edited\n * until it is expanded away.\n *\n * The warp lives in its own frame, fixed when it was made. `frame` carries\n * that frame onto the stored path, so moving, resizing or rotating the node\n * keeps the warp without touching it. A writer that changes the geometry some\n * other way leaves a warp that no longer reproduces it, and such a warp is\n * ignored, the way a stale shape generator is.\n */\nimport {\n applyPathWarp,\n boundsOfPath,\n boxToBox,\n identity,\n invert,\n multiply,\n poseFrameOf,\n transformPath,\n type Affine,\n type PathWarp,\n type PolygonPath,\n} from '@weasel-js/geom';\nimport { classifyPathStorage, type EditableShape } from '@weasel-js/core';\n\n/** What `data.warp` holds. */\nexport interface HeldPathWarp {\n /** Shared by every node warped together, so one handle drives them all. */\n id: string;\n /** The path before warping, in the warp's frame. */\n source: PolygonPath;\n warp: PathWarp;\n /** How far the refitted result may stray from the exact warp. */\n tolerance: number;\n /** From the warp's frame to the frame the node stores its path in. */\n frame: Affine;\n}\n\n/** A held warp that still reproduces its node, and where its frame lands in\n * world space now. */\nexport interface ResolvedPathWarp {\n held: HeldPathWarp;\n /** From the warp's frame to world space. */\n toWorld: Affine;\n}\n\nconst results = new WeakMap<HeldPathWarp, PolygonPath>();\n\n/** The warped path `held` makes, in its own frame. Cached per held warp. */\nexport function heldWarpResult(held: HeldPathWarp): PolygonPath {\n let out = results.get(held);\n if (!out) {\n out = applyPathWarp(held.source, held.warp, held.tolerance);\n results.set(held, out);\n }\n return out;\n}\n\n/** Record that `held` makes `result`, so resolving it later skips the warp. */\nexport function rememberWarpResult(held: HeldPathWarp, result: PolygonPath): void {\n results.set(held, result);\n}\n\nfunction isHeldWarp(v: unknown): v is HeldPathWarp {\n if (v === null || typeof v !== 'object') return false;\n const h = v as Partial<HeldPathWarp>;\n return typeof h.id === 'string' && typeof h.tolerance === 'number'\n && (h.source as { kind?: string } | undefined)?.kind === 'polygon'\n && typeof (h.warp as { kind?: unknown } | undefined)?.kind === 'string'\n && Array.isArray(h.frame) && h.frame.length === 6;\n}\n\n/** The warp a node's `data` holds, whether or not it still matches. */\nexport function heldPathWarpOf(data: unknown): HeldPathWarp | null {\n const w = (data as { warp?: unknown } | null | undefined)?.warp;\n return isHeldWarp(w) ? w : null;\n}\n\n/** `data` without its warp: the shape as plain geometry. */\nexport function withoutPathWarp<T>(data: T): T {\n if (data === null || typeof data !== 'object' || !('warp' in data)) return data;\n const { warp: _dropped, ...rest } = data as Record<string, unknown>;\n void _dropped;\n return rest as T;\n}\n\n/** The path a node stores and the map from that storage to world space. */\nexport function storedPathOf(node: EditableShape): { path: PolygonPath; toWorld: Affine } | null {\n const storage = classifyPathStorage(node);\n if (!storage) return null;\n if (storage.kind === 'pose') return { path: node.pose as PolygonPath, toWorld: identity() };\n const { pose, data } = storage;\n const b = boundsOfPath(data.path);\n const box = boxToBox(b.x, b.y, b.width, b.height, pose.x, pose.y, pose.width, pose.height);\n return { path: data.path, toWorld: multiply(poseFrameOf(pose) ?? identity(), box) };\n}\n\n/** Whether every coordinate of `a`, carried by `m`, lands on `b`'s. */\nfunction sameUnder(a: PolygonPath, m: Affine, b: PolygonPath): boolean {\n if (a.coords.length !== b.coords.length || a.commands.length !== b.commands.length) return false;\n const bb = boundsOfPath(b);\n // Stored paths are float32, so the slack scales with their distance from the origin.\n const tol = 1e-3 * Math.max(1, Math.abs(bb.x) + bb.width, Math.abs(bb.y) + bb.height);\n for (let i = 0; i + 1 < a.coords.length; i += 2) {\n const x = m[0] * a.coords[i] + m[2] * a.coords[i + 1] + m[4];\n const y = m[1] * a.coords[i] + m[3] * a.coords[i + 1] + m[5];\n if (Math.abs(x - b.coords[i]) > tol || Math.abs(y - b.coords[i + 1]) > tol) return false;\n }\n return true;\n}\n\n/**\n * The warp `node` holds and its frame in world space, or null when it holds\n * none or the one it holds no longer reproduces its geometry. A node whose\n * stored path was only scaled and moved since — a polygon pose dragged, say —\n * still resolves: the box-to-box map between the two is folded into `frame`.\n */\nexport function resolvePathWarp(node: EditableShape | null | undefined): ResolvedPathWarp | null {\n if (!node) return null;\n const held = heldPathWarpOf(node.data);\n if (!held) return null;\n const stored = storedPathOf(node);\n if (!stored) return null;\n const made = heldWarpResult(held);\n let toStorage = held.frame;\n if (!sameUnder(made, toStorage, stored.path)) {\n const a = boundsOfPath(transformPath(made, toStorage) as PolygonPath);\n const b = boundsOfPath(stored.path);\n toStorage = multiply(boxToBox(a.x, a.y, a.width, a.height, b.x, b.y, b.width, b.height), toStorage);\n if (!sameUnder(made, toStorage, stored.path)) return null;\n }\n return { held, toWorld: multiply(stored.toWorld, toStorage) };\n}\n\n/**\n * The frame to store with a warp whose world map is `toWorld`, once `node`\n * holds its result. Null when the node's storage cannot be inverted.\n */\nexport function warpFrameFor(node: EditableShape, toWorld: Affine): Affine | null {\n const stored = storedPathOf(node);\n const back = stored && invert(stored.toWorld);\n return back ? multiply(back, toWorld) : null;\n}\n","/**\n * What every warp action shares: finding the selected paths' warps of one\n * kind, making fresh ones where a path holds none, and writing a changed warp\n * back as the geometry it makes plus the warp itself.\n */\nimport type { ActionDeps } from '@weasel-js/routing';\nimport {\n boundsOfPath,\n distortOver,\n envelopeOver,\n identity,\n resizeEnvelope,\n transformPath,\n type Affine,\n type DistortMode,\n type EnvelopeMapping,\n type PathWarp,\n type PolygonPath,\n type WarpBox,\n} from '@weasel-js/geom';\nimport {\n heldWarpResult, rememberWarpResult, resolvePathWarp, warpFrameFor, type HeldPathWarp,\n} from './pathWarp';\nimport { type PathNode, resolveEditablePathOf, type SceneNode, selectedPathNodes, withPath } from '@weasel-js/core';\n\ntype AnyNode = SceneNode<unknown, string, unknown>;\n\n/** Which warp a tool or action works with. */\nexport type WarpKind = PathWarp['kind'];\n\n/** Each kind's name, as its tool and its actions are labeled. */\nexport const WARP_LABELS: Record<WarpKind, string> = { distort: 'Distort', envelope: 'Envelope', puppet: 'Puppet Warp' };\n\n/** The settings a warp is made or remade with. Each applies only to the kinds\n * it names; absent ones leave a held warp as it is. */\nexport interface WarpSettings {\n /** A distort's map. Default `'free'`. */\n mode?: DistortMode;\n /** An envelope's interpolation. Default `'bicubic'`. */\n mapping?: EnvelopeMapping;\n /** An envelope's patch rows and columns. Default 3 each. */\n rows?: number;\n cols?: number;\n /** How far, in world units, the refitted result may stray from the exact\n * warp. Default {@link DEFAULT_WARP_TOLERANCE}. */\n tolerance?: number;\n}\n\n/** The refit tolerance of a warp made without one. */\nexport const DEFAULT_WARP_TOLERANCE = 0.5;\n/** The patch rows and columns of an envelope made without them. */\nexport const DEFAULT_ENVELOPE_SIZE = 3;\n\nconst count = (v: number | undefined, fallback: number) =>\n Math.min(16, Math.max(1, Math.round(v ?? fallback)));\n\n/** A selected path, the warp it is being warped by, and that warp's frame in\n * world space. `fresh` when the warp was made just now rather than held. */\nexport interface WarpTarget {\n node: PathNode;\n held: HeldPathWarp;\n toWorld: Affine;\n fresh: boolean;\n}\n\n/** A fresh warp of `kind` over `box` that leaves it where it is. */\nexport function freshWarp(kind: WarpKind, box: WarpBox, settings: WarpSettings): PathWarp {\n switch (kind) {\n case 'distort': return distortOver(box, settings.mode ?? 'free');\n case 'envelope':\n return envelopeOver(\n box,\n count(settings.rows, DEFAULT_ENVELOPE_SIZE),\n count(settings.cols, DEFAULT_ENVELOPE_SIZE),\n settings.mapping ?? 'bicubic',\n );\n case 'puppet': return { kind: 'puppet', pins: [] };\n }\n}\n\n/** `held` remade under `settings`: a new mode, mapping or tolerance, and an\n * envelope resampled to a new grid. */\nexport function withWarpSettings(held: HeldPathWarp, settings: WarpSettings): HeldPathWarp {\n const { warp } = held;\n let next: PathWarp = warp;\n if (warp.kind === 'distort' && settings.mode && settings.mode !== warp.mode) next = { ...warp, mode: settings.mode };\n if (warp.kind === 'envelope') {\n const sized = resizeEnvelope(\n warp,\n count(settings.rows, warp.mesh.rows),\n count(settings.cols, warp.mesh.cols),\n );\n next = settings.mapping && settings.mapping !== sized.mapping ? { ...sized, mapping: settings.mapping } : sized;\n }\n const tolerance = settings.tolerance !== undefined && settings.tolerance > 0 ? settings.tolerance : held.tolerance;\n if (next === warp && tolerance === held.tolerance) return held;\n return { ...held, warp: next, tolerance };\n}\n\n/** The box, in world space, around every path in `nodes`. */\nexport function worldBoxOf(nodes: readonly PathNode[]): WarpBox | null {\n let x0 = Infinity, y0 = Infinity, x1 = -Infinity, y1 = -Infinity;\n for (const { path } of nodes) {\n const b = boundsOfPath(path);\n x0 = Math.min(x0, b.x); y0 = Math.min(y0, b.y);\n x1 = Math.max(x1, b.x + b.width); y1 = Math.max(y1, b.y + b.height);\n }\n return x0 <= x1 ? { x: x0, y: y0, width: x1 - x0, height: y1 - y0 } : null;\n}\n\nlet freshIds = 0;\n/** An id no other warp made in this session holds. */\nfunction freshWarpId(): string {\n return `warp-${Date.now().toString(36)}-${(++freshIds).toString(36)}`;\n}\n\n/**\n * `nodes` split into those holding a warp of `kind` that still matches their\n * geometry, and the rest, with the box around the rest — where a fresh warp\n * for them goes.\n */\nexport function splitByWarp(\n nodes: readonly PathNode[],\n kind: WarpKind,\n): { held: WarpTarget[]; bare: PathNode[]; box: WarpBox | null } {\n const held: WarpTarget[] = [];\n const bare: PathNode[] = [];\n for (const node of nodes) {\n const resolved = resolvePathWarp(node.node);\n if (resolved && resolved.held.warp.kind === kind) held.push({ node, ...resolved, fresh: false });\n else bare.push(node);\n }\n return { held, bare, box: worldBoxOf(bare) };\n}\n\n/**\n * The selected paths' warps of `kind`. A path holding one that still matches\n * its geometry keeps it; the rest get one fresh warp shared between them,\n * laid over the box around them all, so dragging one of its controls warps\n * them together.\n */\nexport function warpTargets(deps: ActionDeps | undefined, kind: WarpKind, settings: WarpSettings): WarpTarget[] {\n const { held: out, bare, box } = splitByWarp(selectedPathNodes(deps), kind);\n if (!box) return out;\n const id = freshWarpId();\n const warp = freshWarp(kind, box, settings);\n const tolerance = settings.tolerance !== undefined && settings.tolerance > 0 ? settings.tolerance : DEFAULT_WARP_TOLERANCE;\n for (const node of bare) {\n const frame = warpFrameFor(node.node, identity());\n if (!frame) continue;\n // A fresh warp's frame is world space, so its source is the path as drawn.\n out.push({ node, held: { id, source: node.path, warp, tolerance, frame }, toWorld: identity(), fresh: true });\n }\n return out;\n}\n\n/**\n * `shape` (a node's pose and data) warped by `warp`, whose controls are in\n * world space, and holding it — for a scene that opens on a warp already\n * made. Null when `shape` holds no editable polygon.\n */\nexport function withPathWarp<S extends { pose: unknown; data: unknown }>(\n shape: S,\n warp: PathWarp,\n opts: { id?: string; tolerance?: number } = {},\n): { pose: unknown; data: unknown } | null {\n const source = resolveEditablePathOf(shape);\n if (!source) return null;\n const held: HeldPathWarp = {\n id: opts.id ?? freshWarpId(),\n source,\n warp,\n tolerance: opts.tolerance ?? DEFAULT_WARP_TOLERANCE,\n frame: identity(),\n };\n return storeWarp(shape as unknown as AnyNode, held, identity());\n}\n\n/** `node` holding `held`, its geometry what `held` makes under `toWorld`. */\nexport function storeWarp(node: AnyNode, held: HeldPathWarp, toWorld: Affine): { pose: unknown; data: unknown } | null {\n const made = heldWarpResult(held);\n const next = withPath(node, transformPath(made, toWorld) as PolygonPath);\n if (!next) return null;\n const frame = warpFrameFor(next, toWorld);\n if (!frame) return null;\n const kept: HeldPathWarp = { ...held, frame };\n rememberWarpResult(kept, made);\n return { pose: next.pose, data: { ...(next.data as object), warp: kept } };\n}\n","/**\n * The warp actions. A warp tool binds the per-kind ones (`<kind>.drag`,\n * `puppet.addPin`, `puppet.removePin`) and owns them; `expandWarp` and\n * `configureWarp` work on whatever warp the selection holds and ship with\n * the `paths` preset.\n */\nimport {\n type Action, type ActionDeps, ActionDisabledReason, type BindingOpts, type ImmediateInvoker, type InvocationCtx, type OngoingHandle, resolveParams,\n} from '@weasel-js/routing';\nimport { createEmitter } from '@weasel-js/registry';\nimport {\n applyToPoint, invert, moveWarpControl, pathWarpMap, unwarpPoint, warpControls, type Point,\n} from '@weasel-js/geom';\nimport { commitOps, createSetDataOp, type Op, reshapeTo, selectedPathNodes, pathOperationTags } from '@weasel-js/core';\nimport { heldPathWarpOf, resolvePathWarp, withoutPathWarp } from './pathWarp';\nimport {\n storeWarp, WARP_LABELS, warpTargets, withWarpSettings, type WarpKind, type WarpSettings, type WarpTarget,\n} from './warpTargets';\n\n/** What a press on a warp control hands the drag that follows. */\nexport interface WarpHandleScratch {\n /** The warp the control belongs to, or null for one shown over a selection\n * holding none yet, which the drag makes. */\n warpId: string | null;\n /** The control's index, as `warpControls` counts them. */\n index: number;\n}\n\n/** Nodes as an in-flight warp drag would leave them, for the chrome drawing\n * the warp's controls to follow the drag rather than the scene. */\nexport interface WarpLive {\n get(id: string): { pose: unknown; data: unknown } | undefined;\n set(next: ReadonlyMap<string, { pose: unknown; data: unknown }> | null): void;\n subscribe(listener: () => void): () => void;\n}\n\n/** An empty {@link WarpLive}. */\nexport function createWarpLive(): WarpLive {\n let current: ReadonlyMap<string, { pose: unknown; data: unknown }> | null = null;\n const changed = createEmitter();\n return {\n get: (id) => current?.get(id),\n set: (next) => { current = next; changed.emit(); },\n subscribe: changed.subscribe,\n };\n}\n\n/** The scratch a control press carried, or null when the press was elsewhere. */\nexport function warpHandleScratchOf(hit: unknown): WarpHandleScratch | null {\n const payload = (hit as { payload?: unknown } | null | undefined)?.payload as Partial<WarpHandleScratch> | undefined;\n return payload && typeof payload.index === 'number' && payload.warpId !== undefined\n ? payload as WarpHandleScratch\n : null;\n}\n\nconst REQUIRES: ('selection' | 'scene' | 'applyOps')[] = ['selection', 'scene', 'applyOps'];\n\nfunction commitTargets(deps: ActionDeps, next: ReadonlyMap<string, { target: WarpTarget; shape: { pose: unknown; data: unknown } }>, label: string): void {\n const ops: Op[] = [];\n for (const { target, shape } of next.values()) ops.push(...reshapeTo(target.node.node, shape, label));\n commitOps(deps, ops, label);\n}\n\n/**\n * Drag one control of the selection's `kind` warp: a distort's corner, an\n * envelope's mesh point, a puppet's pin. Every selected path sharing that warp\n * follows the control. A press on the controls shown over a selection with no\n * warp of this kind yet makes one, from the binding's params\n * ({@link WarpSettings}), and the drag is its first edit. One undo step.\n */\nexport function createWarpDragAction(kind: WarpKind, live?: WarpLive): Action {\n const label = WARP_LABELS[kind];\n return {\n id: `${kind}.drag`,\n label: `${label} — drag control`,\n tags: pathOperationTags(kind === 'puppet' ? 'brush' : 'box'),\n requires: REQUIRES,\n invoker: {\n timing: 'ongoing',\n start(ctx: InvocationCtx, opts?: BindingOpts): OngoingHandle {\n const scratch = warpHandleScratchOf(ctx.drag?.affordance);\n if (!scratch) return {};\n const settings = (resolveParams(opts?.params) ?? {}) as WarpSettings;\n const targets = warpTargets(ctx.deps, kind, settings)\n .filter((t) => (scratch.warpId === null ? t.fresh : t.held.id === scratch.warpId));\n const first = targets[0];\n const control = first && warpControls(first.held.warp)[scratch.index];\n if (!control) return {};\n const deps = ctx.deps;\n const [cx, cy] = applyToPoint(first.toWorld, control.x, control.y);\n const press = ctx.drag?.start ?? ctx.world;\n let current = new Map<string, { target: WarpTarget; shape: { pose: unknown; data: unknown } }>();\n const publish = () => live?.set(new Map([...current].map(([id, e]) => [id, e.shape])));\n return {\n kind: `${kind}.drag`,\n onMove(m: InvocationCtx): void {\n const at = m.drag?.current ?? m.world;\n const world = { x: cx + at.x - press.x, y: cy + at.y - press.y };\n current = new Map();\n for (const target of targets) {\n const back = invert(target.toWorld);\n if (!back) continue;\n const [lx, ly] = applyToPoint(back, world.x, world.y);\n const held = { ...target.held, warp: moveWarpControl(target.held.warp, scratch.index, { x: lx, y: ly }) };\n const shape = storeWarp(target.node.node, held, target.toWorld);\n if (shape) current.set(target.node.id, { target, shape });\n }\n publish();\n },\n onEnd(_end: InvocationCtx, reason: 'commit' | 'cancel'): void {\n const done = current;\n current = new Map();\n live?.set(null);\n if (reason === 'commit' && done.size > 0) commitTargets(deps, done, label);\n },\n previewIds: () => (current.size > 0 ? [...current.keys()] : null),\n previewPose: (id: string) => current.get(id)?.shape.pose ?? null,\n previewData: (id: string) => current.get(id)?.shape.data ?? null,\n };\n },\n },\n };\n}\n\n/** A click's world point: where the press landed. */\nfunction clickPoint(params: Record<string, unknown> | undefined): Point | null {\n const x = (params?.pressX ?? params?.worldX) as number | undefined;\n const y = (params?.pressY ?? params?.worldY) as number | undefined;\n return typeof x === 'number' && typeof y === 'number' ? { x, y } : null;\n}\n\n/**\n * Place a pin where the click landed on the selected paths, giving them a\n * puppet warp if they hold none. The pin goes where the shape is now: its\n * unwarped point is found by inverting the warp, so the shape keeps its\n * place until the pin is dragged.\n */\nexport function createAddPinAction(): Action {\n return {\n id: 'puppet.addPin',\n label: `${WARP_LABELS.puppet} — add pin`,\n tags: pathOperationTags('brush'),\n requires: REQUIRES,\n invoker: {\n timing: 'immediate',\n run: (deps, params) => {\n const at = clickPoint(params);\n if (!at) return;\n const next = new Map<string, { target: WarpTarget; shape: { pose: unknown; data: unknown } }>();\n for (const target of warpTargets(deps, 'puppet', (params ?? {}) as WarpSettings)) {\n const { warp } = target.held;\n const back = invert(target.toWorld);\n if (warp.kind !== 'puppet' || !back) continue;\n const [lx, ly] = applyToPoint(back, at.x, at.y);\n const to = { x: lx, y: ly };\n const from = unwarpPoint(pathWarpMap(warp), to);\n const held = { ...target.held, warp: { ...warp, pins: [...warp.pins, { from, to }] } };\n const shape = storeWarp(target.node.node, held, target.toWorld);\n if (shape) next.set(target.node.id, { target, shape });\n }\n commitTargets(deps, next, 'Add Pin');\n },\n } satisfies ImmediateInvoker,\n enabled: (deps) => (selectedPathNodes(deps).length > 0 ? true : ActionDisabledReason.SelectionRequired),\n };\n}\n\n/** Take out the pin the click landed on, from every path sharing its warp. */\nexport function createRemovePinAction(): Action {\n return {\n id: 'puppet.removePin',\n label: `${WARP_LABELS.puppet} — remove pin`,\n tags: pathOperationTags('brush'),\n requires: REQUIRES,\n invoker: {\n timing: 'immediate',\n run: (deps, params) => {\n const scratch = warpHandleScratchOf(params?.affordance);\n if (!scratch || scratch.warpId === null) return;\n const next = new Map<string, { target: WarpTarget; shape: { pose: unknown; data: unknown } }>();\n for (const target of warpTargets(deps, 'puppet', {})) {\n const { warp } = target.held;\n if (target.held.id !== scratch.warpId || warp.kind !== 'puppet') continue;\n const held = { ...target.held, warp: { ...warp, pins: warp.pins.filter((_, i) => i !== scratch.index) } };\n const shape = storeWarp(target.node.node, held, target.toWorld);\n if (shape) next.set(target.node.id, { target, shape });\n }\n commitTargets(deps, next, 'Remove Pin');\n },\n } satisfies ImmediateInvoker,\n };\n}\n\n/** Absorbs a press on a warp control, so the drag it grows into is the\n * control's: an exclusive claim with nothing bound to the press drops it. */\nexport function createWarpGrabAction(kind: WarpKind): Action {\n return {\n id: `${kind}.grab`,\n label: `${WARP_LABELS[kind]} — grab control`,\n invoker: { timing: 'immediate', run: () => {} },\n };\n}\n\n/**\n * Drop the warp from each selected path, keeping the geometry it made: the\n * shape becomes plain geometry that path editing and other warps start from.\n */\nexport const expandWarpAction: Action = {\n id: 'expandWarp',\n label: 'Expand Warp',\n tags: pathOperationTags('command'),\n group: 'path',\n requires: REQUIRES,\n invoker: {\n timing: 'immediate',\n run: (deps) => {\n const ops: Op[] = [];\n for (const { node } of selectedPathNodes(deps)) {\n if (!heldPathWarpOf(node.data)) continue;\n ops.push(createSetDataOp({ id: node.id, from: node.data, to: withoutPathWarp(node.data), label: 'Expand Warp' }));\n }\n commitOps(deps, ops, 'Expand Warp');\n },\n } satisfies ImmediateInvoker,\n enabled: (deps) => (selectedPathNodes(deps).some(({ node }) => heldPathWarpOf(node.data))\n ? true\n : ActionDisabledReason.NotApplicable),\n};\n\n/**\n * Remake the selection's warps under new settings (`params`, a\n * {@link WarpSettings}, plus an optional `kind` limiting it to one kind of\n * warp): switch a distort between free and perspective, an envelope between\n * its mappings or to a finer grid, or refit at another tolerance. One undo step.\n */\nexport const configureWarpAction: Action = {\n id: 'configureWarp',\n label: 'Warp Settings',\n tags: pathOperationTags('command'),\n group: 'path',\n requires: REQUIRES,\n invoker: {\n timing: 'immediate',\n run: (deps, params) => {\n const settings = (params ?? {}) as WarpSettings & { kind?: WarpKind };\n const next = new Map<string, { target: WarpTarget; shape: { pose: unknown; data: unknown } }>();\n for (const node of selectedPathNodes(deps)) {\n const resolved = resolvePathWarp(node.node);\n if (!resolved || (settings.kind && resolved.held.warp.kind !== settings.kind)) continue;\n const held = withWarpSettings(resolved.held, settings);\n if (held === resolved.held) continue;\n const shape = storeWarp(node.node, held, resolved.toWorld);\n if (shape) next.set(node.id, { target: { node, ...resolved, fresh: false }, shape });\n }\n commitTargets(deps, next, 'Warp Settings');\n },\n } satisfies ImmediateInvoker,\n};\n","/**\n * The package's behavior as `<SceneCanvas features>` presets: one per tool\n * family, and `pathTools` for all of them. Each assumes core's `paths`\n * preset, which opens a path for editing.\n */\nimport { never, type FeaturePreset } from '@weasel-js/core';\nimport { balanceHandlesAction, equalizeHandlesAction } from './balance/handleBalance';\nimport { createBalanceExtension, PATH_BALANCE_CHROME_ID, type PathEditBalanceStyle } from './balance/balanceMarks';\nimport { bridgeAnchorsAction, bridgePathsAction } from './bridge/bridge';\nimport { createCombExtension, PATH_COMB_CHROME_ID, type PathEditCombOptions } from './comb/comb';\nimport { constrainAnchorsAction, deleteConstraintAction, unconstrainAnchorsAction } from './constraints/anchorConstraints';\nimport type { ConstraintGlyphStyle } from './constraints/constraintGlyphs';\nimport { createConstraintsExtension } from './constraints/constraintsExtension';\nimport { extendToMeetAction } from './extend/extendToMeet';\nimport { handleLockAngleAction, handleLockLengthAction } from './handleLocks/handleLocks';\nimport { harmonizeAnchorsAction } from './harmonize/harmonize';\nimport {\n bendAlongAction, blendAction, editPathEffectAction, expandPathEffectAction, repeatAlongAction,\n} from './pathEffects/actions';\nimport { simplifyBrushAction, simplifyBrushToolAction } from './simplifyBrush/simplifyBrush';\nimport { smudgeBrushAction } from './smudge/smudgeBrush';\nimport { trimPathAction } from './trim/trimSegment';\nimport { configureWarpAction, expandWarpAction } from './warp/warpActions';\n\n/** The Simplify brush, a path-edit tool that refits the curve it passes over. */\nexport const simplifyBrushPreset: FeaturePreset = {\n id: 'simplifyBrush',\n actions: [simplifyBrushAction, simplifyBrushToolAction],\n};\n\n/** The `handleLock.angle` and `handleLock.length` toggles. */\nexport const handleLocksPreset: FeaturePreset = {\n id: 'handleLocks',\n actions: [handleLockAngleAction, handleLockLengthAction],\n};\n\n/** Bridge, on whole paths and on two selected anchors. */\nexport const bridgePreset: FeaturePreset = {\n id: 'bridge',\n actions: [bridgeAnchorsAction, bridgePathsAction],\n};\n\n/** `trimPath`, which `useTrimTool` binds. */\nexport const trimPreset: FeaturePreset = { id: 'trim', actions: [trimPathAction] };\n\n/** `extendToMeet`, which `useExtendTool` binds. */\nexport const extendPreset: FeaturePreset = { id: 'extend', actions: [extendToMeetAction] };\n\n/** `smudgeBrush`, which `useSmudgeBrushTool` binds. */\nexport const smudgePreset: FeaturePreset = { id: 'smudge', actions: [smudgeBrushAction] };\n\n/** Harmonize curvature. */\nexport const harmonizePreset: FeaturePreset = { id: 'harmonize', actions: [harmonizeAnchorsAction] };\n\n/** The curvature comb over the open path, drawn as `options` says, read every\n * frame. Off until chrome-caps shows `path-edit.comb`. */\nexport function createCurvatureCombPreset(options: () => PathEditCombOptions | undefined = () => undefined): FeaturePreset {\n return {\n id: 'curvatureComb',\n chromeRules: { [PATH_COMB_CHROME_ID]: never },\n pathEdit: [createCombExtension(options)],\n };\n}\n\n/** The curvature comb with its default look. */\nexport const curvatureCombPreset: FeaturePreset = createCurvatureCombPreset();\n\n/**\n * Balance handles: a line between each curved segment's handle tips with a\n * grip to drag (`balanceHandles`) or double-click (`equalizeHandles`), drawn\n * in `style`. Off until chrome-caps shows `path-edit.balance`. It refines\n * `paths`, so a grip's double-click goes ahead of entering path edit.\n */\nexport function createBalancePreset(style: PathEditBalanceStyle = {}): FeaturePreset {\n return {\n id: 'balance',\n refines: ['paths'],\n actions: [equalizeHandlesAction, balanceHandlesAction],\n chromeRules: { [PATH_BALANCE_CHROME_ID]: never },\n pathEdit: [createBalanceExtension(style)],\n };\n}\n\n/** Balance handles with their default look. */\nexport const balancePreset: FeaturePreset = createBalancePreset();\n\n/** Path constraints: their actions, their marks in `style`'s colors, and\n * every edit of a constrained path finished so they hold. */\nexport function createConstraintsPreset(style: Partial<ConstraintGlyphStyle> = {}): FeaturePreset {\n return {\n id: 'constraints',\n actions: [constrainAnchorsAction, unconstrainAnchorsAction, deleteConstraintAction],\n pathEdit: [createConstraintsExtension(style)],\n };\n}\n\n/** Path constraints with their default colors. */\nexport const constraintsPreset: FeaturePreset = createConstraintsPreset();\n\n/** Blend, Bend along, and Repeat along, live, and the actions that edit and\n * expand them. The scene must hold `withPathEffectsRegistry`'s derivations. */\nexport const pathEffectsPreset: FeaturePreset = {\n id: 'pathEffects',\n actions: [blendAction, bendAlongAction, repeatAlongAction, editPathEffectAction, expandPathEffectAction],\n};\n\n/** `expandWarp` and `configureWarp`; the warp tools bring their own drags. */\nexport const warpPreset: FeaturePreset = {\n id: 'warp',\n actions: [expandWarpAction, configureWarpAction],\n};\n\n/** Every preset above, the comb, balance, and constraints with their defaults. */\nexport const pathTools: FeaturePreset = {\n id: 'pathTools',\n includes: [\n simplifyBrushPreset, handleLocksPreset, bridgePreset, trimPreset, extendPreset, smudgePreset,\n harmonizePreset, curvatureCombPreset, balancePreset, constraintsPreset, pathEffectsPreset, warpPreset,\n ],\n};\n","import { createElement, useMemo, type ComponentType } from 'react';\nimport type { Action, GestureBinding, ToolKeybinding } from '@weasel-js/routing';\nimport { defineTool, type RenderLayer, type Tool } from '@weasel-js/core';\n\n/** Options for a tool that acts on the stroke under a click. */\nexport interface StrokeClickToolOptions {\n /** Override the default keybinding. Pass `null` to omit. */\n keybinding?: ToolKeybinding | null;\n /** How far from a stroke a click may land and still reach it, in screen\n * pixels. Read on every click. Default 6. */\n radiusPx?: number | (() => number);\n}\n\n/** What the tool is: its id, label, icon, hook name, the action its click\n * hands the press to, and its default key. */\nexport interface StrokeClickToolSpec {\n id: string;\n label: string;\n icon: ComponentType;\n hookName: string;\n actionId: string;\n keybinding: ToolKeybinding;\n}\n\n/** The tool's own extras: actions it registers, bindings beside its click,\n * an overlay, and what to drop when it is put down. */\nexport interface StrokeClickExtras {\n actions?: Action[];\n bindings?: GestureBinding[];\n overlay?: RenderLayer<unknown>;\n onDeactivate?: () => void;\n}\n\n/** A declarative tool whose click binding, and any extra binding, hands the\n * press and `radiusPx` to `spec.actionId`. */\nexport function useStrokeClickTool(\n spec: StrokeClickToolSpec,\n options: StrokeClickToolOptions,\n extras: StrokeClickExtras = {},\n): Tool {\n const { keybinding = spec.keybinding, radiusPx } = options;\n const { id, label, icon, hookName, actionId } = spec;\n return useMemo(() => {\n const opts = radiusPx !== undefined\n ? { opts: { params: () => ({ radiusPx: typeof radiusPx === 'function' ? radiusPx() : radiusPx }) } }\n : {};\n return defineTool({\n id,\n ...(keybinding ? { keybinding } : {}),\n capabilities: ['creates-shapes'],\n hookName,\n cursor: 'crosshair',\n presentation: { label, group: 'path', icon: createElement(icon) },\n ...(extras.actions ? { actions: extras.actions } : {}),\n ...(extras.overlay ? { overlay: extras.overlay } : {}),\n ...(extras.onDeactivate ? { onDeactivate: extras.onDeactivate } : {}),\n bindings: [\n { spec: { kind: 'click' }, actionId, ...opts },\n ...(extras.bindings ?? []).map((b) => ({ ...b, ...opts })),\n ],\n });\n }, [id, label, icon, hookName, actionId, keybinding, radiusPx, extras.actions, extras.bindings, extras.overlay, extras.onDeactivate]);\n}\n","import { createEmitter } from '@weasel-js/registry';\nimport { transformPath, type PolygonPath } from '@weasel-js/geom';\nimport { OVERLAY_ROLE_STROKES, type RenderLayer, type Scene, viewToTransform } from '@weasel-js/core';\n\n/** A piece of a stroke shown before it is cut away, and the scene it was\n * measured on. */\nexport interface PiecePreviewState {\n path: PolygonPath;\n scene: Pick<Scene<unknown, string, unknown>, 'getVersion'>;\n}\n\n/**\n * The highlight a tool draws over the piece of a stroke a click would cut:\n * `show` sets it, and the screen-space `layer` paints it in the `cut` role's\n * stroke. A piece measured before the scene last changed is not drawn, so a\n * commit retires its own preview without being told.\n */\nexport function createPiecePreview(): {\n show(next: PiecePreviewState | null): void;\n current(): PiecePreviewState | null;\n layer: RenderLayer<unknown>;\n} {\n const changed = createEmitter();\n let state: { piece: PiecePreviewState; version: number } | null = null;\n const current = () => (state && state.piece.scene.getVersion() === state.version ? state.piece : null);\n return {\n show(next) {\n if (!next && !state) return;\n if (next && state && next.path === state.piece.path) return;\n state = next ? { piece: next, version: next.scene.getVersion() } : null;\n changed.emit();\n },\n current,\n layer: {\n id: 'stroke-piece-preview',\n label: 'Piece a click would cut',\n space: 'screen',\n subscribe: (repaint) => changed.subscribe(repaint),\n draw: (_data, view) => {\n const piece = current();\n if (!piece) return [];\n const t = viewToTransform(view);\n const stroke = { ...OVERLAY_ROLE_STROKES['cut'], width: 3 };\n return [{ kind: 'path', path: transformPath(piece.path, [t.zoom.x, 0, 0, t.zoom.y, t.panX, t.panY]), stroke }];\n },\n },\n };\n}\n","import { useMemo } from 'react';\nimport type { Action, ToolKeybinding } from '@weasel-js/routing';\nimport type { PolygonPath } from '@weasel-js/geom';\nimport { type Scene, SliceIcon, type Tool } from '@weasel-js/core';\nimport { planTrim } from './trimSegment';\nimport { useStrokeClickTool, type StrokeClickExtras, type StrokeClickToolOptions } from '../shared/strokeClickTool';\nimport { createPiecePreview } from './piecePreview';\n\n/** Options for `useTrimTool`; the default keybinding is `{ key: 'Y' }`. */\nexport type UseTrimToolOptions = StrokeClickToolOptions;\n\nconst TRIM_KEY: ToolKeybinding = { key: 'Y' };\nconst TRIM_PREVIEW_ID = 'trim.preview';\n\n/**\n * Trim segment tool. A click on a stroke removes its piece between the\n * crossings on either side — a declarative shell over the `trimPath` action,\n * which owns the hit-test and the commit. While it is up, the piece under the\n * pointer is drawn dashed, through the same `planTrim` the click commits.\n */\nexport function useTrimTool(options: UseTrimToolOptions = {}): Tool {\n const extras = useMemo<StrokeClickExtras>(() => {\n const preview = createPiecePreview();\n const action: Action = {\n id: TRIM_PREVIEW_ID,\n label: 'Trim segment: show the piece under the pointer',\n eligible: { capability: 'creates-shapes' },\n requires: ['scene', 'view'],\n invoker: {\n timing: 'immediate',\n run: (deps, params) => {\n const plan = deps.scene ? planTrim(deps, params) : null;\n const scene = deps.scene as Scene<unknown, string, unknown> | undefined;\n preview.show(plan && scene ? { path: plan.result.removed as PolygonPath, scene } : null);\n },\n },\n };\n return {\n actions: [action],\n bindings: [{ spec: { kind: 'hover' }, actionId: TRIM_PREVIEW_ID }],\n overlay: preview.layer,\n onDeactivate: () => preview.show(null),\n };\n }, []);\n return useStrokeClickTool(\n { id: 'trim', label: 'Trim segment', icon: SliceIcon, hookName: 'useTrimTool', actionId: 'trimPath', keybinding: TRIM_KEY },\n options,\n extras,\n );\n}\n","import type { ToolKeybinding } from '@weasel-js/routing';\nimport { SliceIcon, type Tool } from '@weasel-js/core';\nimport { useStrokeClickTool, type StrokeClickToolOptions } from '../shared/strokeClickTool';\n\n/** Options for `useExtendTool`; the default keybinding is `{ key: 'U' }`. */\nexport type UseExtendToolOptions = StrokeClickToolOptions;\n\nconst EXTEND_KEY: ToolKeybinding = { key: 'U' };\n\n/**\n * Extend to next path tool. A click near an open end of a stroke carries\n * that end along its tangent to the next stroke it meets — a declarative\n * shell over the `extendToMeet` action.\n */\nexport function useExtendTool(options: UseExtendToolOptions = {}): Tool {\n return useStrokeClickTool(\n {\n id: 'extend', label: 'Extend to next path', icon: SliceIcon, hookName: 'useExtendTool',\n actionId: 'extendToMeet', keybinding: EXTEND_KEY,\n },\n options,\n );\n}\n","import { useMemo } from 'react';\nimport type { ToolKeybinding } from '@weasel-js/routing';\nimport { defineTool, type Tool } from '@weasel-js/core';\n\n/** Options for `useSmudgeBrushTool`. */\nexport interface UseSmudgeBrushToolOptions {\n /** Override the default keybinding (`{ key: 'S' }`). Pass `null` to omit. */\n keybinding?: ToolKeybinding | null;\n}\n\nconst SMUDGE_KEY: ToolKeybinding = { key: 'S' };\n\n/**\n * Smudge brush tool. A round brush that pushes the outline of the selected\n * paths along with the pointer — a declarative shell whose one binding routes a\n * drag to the `smudgeBrush` action, which owns the stroke, its preview, its ring\n * cursor, and its one undo entry. The brush's radius (screen px) and strength are\n * that action's params: `tune={{ smudgeBrush: { params: () => ({ radiusPx, strength }) } }}`.\n */\nexport function useSmudgeBrushTool(options: UseSmudgeBrushToolOptions = {}): Tool {\n const { keybinding = SMUDGE_KEY } = options;\n return useMemo(() => defineTool({\n id: 'smudgeBrush',\n ...(keybinding ? { keybinding } : {}),\n capabilities: ['creates-shapes'],\n hookName: 'useSmudgeBrushTool',\n cursor: 'crosshair',\n presentation: { label: 'Smudge brush', group: 'path' },\n bindings: [{ spec: { kind: 'drag' }, actionId: 'smudgeBrush' }],\n }), [keybinding]);\n}\n","/**\n * The controls of the selection's warp, as a hit-tested layer: a distort's\n * corners and the quad they make, an envelope's mesh points and the grid\n * lines through them, a puppet's pins. Over a selection holding no warp of\n * the kind, the controls of a fresh one are shown where it would start.\n */\nimport {\n applyToPoint, ellipsePath, polylineFromPoints, pathWarpMap, warpControls,\n type Affine, type PathWarp, type Point,\n} from '@weasel-js/geom';\nimport type { DrawCommand } from '@weasel-js/renderer';\nimport {\n type Affordance, type AffordanceRegion, type ChromeState, composeAffordanceLayer, DEFAULT_OVERLAY_STYLE, pathNodesOf, type RenderLayer, type Scene, type View, viewToTransform, worldToScreen,\n} from '@weasel-js/core';\nimport type { WarpHandleScratch, WarpLive } from './warpActions';\nimport {\n freshWarp, splitByWarp, type WarpKind, type WarpSettings,\n} from './warpTargets';\n\n/** The id of the layer showing a `kind` warp's controls. A binding reaches\n * its controls through `affordance:layer:<id>`. */\nexport const warpLayerId = (kind: WarpKind): string => `warp-${kind}`;\n\n/** What the layer reads, live, on every paint and hit-test. */\nexport interface WarpHandleLayerSource {\n kind: WarpKind;\n /** Whether to show anything: the tool owning the layer is active. */\n active(): boolean;\n /** What a fresh warp is made with. */\n settings(): WarpSettings;\n scene(): Pick<Scene<unknown, string, unknown>, 'get'> | undefined;\n live: WarpLive;\n}\n\ninterface ControlGroup {\n warpId: string | null;\n warp: PathWarp;\n toWorld: Affine;\n}\n\nconst HIT_PX = 8;\nconst SIZE_PX = DEFAULT_OVERLAY_STYLE.anchorSizePx;\nconst PIN_RADIUS_PX = DEFAULT_OVERLAY_STYLE.handleDotRadiusPx;\nconst ACCENT = DEFAULT_OVERLAY_STYLE.anchorStroke;\nconst LINE = { paint: { kind: 'solid' as const, color: ACCENT }, width: 1 };\nconst LINE_SAMPLES = 12;\nconst IDENTITY: Affine = [1, 0, 0, 1, 0, 0];\n\n/** One group per warp the selection shares, then one for a fresh warp over\n * whatever selected paths hold none. */\nfunction groupsOf(src: WarpHandleLayerSource, state: ChromeState): ControlGroup[] {\n const scene = src.scene();\n if (!scene || !src.active()) return [];\n const nodes = pathNodesOf(scene, state.selection, (id) => src.live.get(id));\n const { held, box } = splitByWarp(nodes, src.kind);\n const out: ControlGroup[] = [];\n const seen = new Set<string>();\n for (const t of held) {\n if (seen.has(t.held.id)) continue;\n seen.add(t.held.id);\n out.push({ warpId: t.held.id, warp: t.held.warp, toWorld: t.toWorld });\n }\n if (box) out.push({ warpId: null, warp: freshWarp(src.kind, box, src.settings()), toWorld: IDENTITY });\n return out;\n}\n\nconst toWorld = (m: Affine, p: Point): Point => {\n const [x, y] = applyToPoint(m, p.x, p.y);\n return { x, y };\n};\n\nfunction pinPaint(view: View, at: { x: number; y: number }): DrawCommand[] {\n const [x, y] = worldToScreen(at.x, at.y, viewToTransform(view));\n const r = PIN_RADIUS_PX;\n return [{\n kind: 'path',\n path: ellipsePath({ x: x - r, y: y - r, width: 2 * r, height: 2 * r }),\n fill: { paint: { kind: 'solid', color: '#ffffff' } },\n stroke: { paint: { kind: 'solid', color: ACCENT }, width: 2 },\n }];\n}\n\n/** The lines a group's controls hang on, in world space: a distort's quad,\n * an envelope's grid lines carried through the mesh. */\nfunction guideLines(group: ControlGroup): Point[][] {\n const { warp, toWorld: m } = group;\n if (warp.kind === 'distort') {\n const c = warp.corners.map((p) => toWorld(m, p));\n return [[...c, c[0]]];\n }\n if (warp.kind !== 'envelope') return [];\n const map = pathWarpMap(warp);\n const { box, mesh } = warp;\n const at = (u: number, v: number) => toWorld(m, map({ x: box.x + u * box.width, y: box.y + v * box.height }));\n const lines: Point[][] = [];\n for (let i = 0; i <= mesh.rows; i++) {\n const n = mesh.cols * LINE_SAMPLES;\n lines.push(Array.from({ length: n + 1 }, (_, k) => at(k / n, i / mesh.rows)));\n }\n for (let j = 0; j <= mesh.cols; j++) {\n const n = mesh.rows * LINE_SAMPLES;\n lines.push(Array.from({ length: n + 1 }, (_, k) => at(j / mesh.cols, k / n)));\n }\n return lines;\n}\n\nfunction warpAffordance(src: WarpHandleLayerSource): Affordance {\n const id = warpLayerId(src.kind);\n return {\n id,\n regions(state): readonly AffordanceRegion[] {\n const out: AffordanceRegion[] = [];\n for (const group of groupsOf(src, state)) {\n warpControls(group.warp).forEach((local, index) => {\n const p = toWorld(group.toWorld, local);\n out.push({\n id: `${group.warpId ?? 'fresh'}:${index}`,\n targetId: null,\n shape: { kind: 'point', x: p.x, y: p.y, hitRadiusPx: HIT_PX },\n paint: group.warp.kind === 'puppet'\n ? { kind: 'custom', draw: ({ world, view }) => pinPaint(view, world) }\n : {\n kind: 'square',\n sizePx: SIZE_PX,\n fill: { paint: { kind: 'solid', color: '#ffffff' } },\n stroke: { paint: { kind: 'solid', color: ACCENT }, width: 1 },\n },\n cursor: 'move',\n strength: 'exclusive',\n claimedKinds: ['pointer'],\n bind: () => ({ initialScratch: { warpId: group.warpId, index } satisfies WarpHandleScratch }),\n });\n });\n }\n return out;\n },\n decorate(state, view) {\n const t = viewToTransform(view);\n const out: DrawCommand[] = [];\n for (const group of groupsOf(src, state)) {\n for (const line of guideLines(group)) {\n const screen = line.map((p) => {\n const [x, y] = worldToScreen(p.x, p.y, t);\n return { x, y };\n });\n out.push({ kind: 'path', path: polylineFromPoints(screen), stroke: LINE });\n }\n }\n return out;\n },\n };\n}\n\n/**\n * The layer, for `CanvasExtensionApi.registerLayer` — the attach route that\n * is hit-tested. Its guide lines paint before its controls, so a control is\n * never hidden under a line.\n */\nexport function createWarpHandleLayer(src: WarpHandleLayerSource): RenderLayer<unknown> {\n const lines: Affordance = { id: `${warpLayerId(src.kind)}:lines`, regions: () => [], decorate: warpAffordance(src).decorate };\n const controls: Affordance = { ...warpAffordance(src), decorate: undefined };\n return composeAffordanceLayer(warpLayerId(src.kind), 'Warp controls', [lines, controls]) as unknown as RenderLayer<unknown>;\n}\n","import { useMemo } from 'react';\nimport { useLatest } from '@weasel-js/react';\nimport type { DistortMode, EnvelopeMapping } from '@weasel-js/geom';\nimport type { Action, GestureBinding, ToolKeybinding } from '@weasel-js/routing';\nimport {\n type CanvasExtensionApi, type ContributionDepReader, defineTool, type SurfaceContribution, type Tool,\n} from '@weasel-js/core';\nimport {\n createAddPinAction, createRemovePinAction, createWarpDragAction, createWarpGrabAction, createWarpLive,\n} from './warpActions';\nimport { WARP_LABELS, type WarpKind, type WarpSettings } from './warpTargets';\nimport { createWarpHandleLayer, warpLayerId } from './warpHandles';\n\n/** A warp tool: a `Tool` that also registers the layer showing its controls. */\nexport type WarpTool = Tool & Pick<SurfaceContribution, 'attach'>;\n\n/** Options every warp tool takes. */\ninterface WarpToolOptions {\n /** Palette label. */\n label?: string;\n /** Override the default keybinding (Distort `F`, Envelope `M`, Puppet Warp\n * `B`). Pass `null` to omit. */\n keybinding?: ToolKeybinding | null;\n /** How far, in world units, a warped path's refitted curves may stray from\n * the exact warp. Default 0.5. */\n tolerance?: number;\n}\n\n/** Options for {@link useDistortTool}. */\nexport interface UseDistortToolOptions extends WarpToolOptions {\n /** The map a new distort starts with: `'free'` (bilinear, the default) or\n * `'perspective'` (projective). */\n mode?: DistortMode;\n}\n\n/** Options for {@link useEnvelopeTool}. */\nexport interface UseEnvelopeToolOptions extends WarpToolOptions {\n /** Patch rows and columns of a new envelope's mesh. Default 3 each. */\n rows?: number;\n cols?: number;\n /** How a new envelope interpolates its mesh. Default `'bicubic'`. */\n mapping?: EnvelopeMapping;\n}\n\n/** Options for {@link usePuppetTool}. */\nexport type UsePuppetToolOptions = WarpToolOptions;\n\nconst ANY_MODS = { shift: 'optional', alt: 'optional', meta: 'optional', ctrl: 'optional' } as const;\n\nfunction bindingsFor(kind: WarpKind, settings: () => Record<string, unknown>): GestureBinding[] {\n const target = `affordance:layer:${warpLayerId(kind)}` as const;\n const out: GestureBinding[] = [];\n if (kind === 'puppet') {\n out.push({ spec: { kind: 'click', target, mods: { alt: true } }, actionId: 'puppet.removePin' });\n out.push({ spec: { kind: 'click', target: 'selected-body' }, actionId: 'puppet.addPin', opts: { params: settings } });\n }\n out.push(\n { spec: { kind: 'drag', target }, actionId: `${kind}.drag`, opts: { params: settings } },\n { spec: { kind: 'pointerDown', target, mods: ANY_MODS }, actionId: `${kind}.grab` },\n { spec: { kind: 'click', target }, actionId: `${kind}.grab` },\n );\n return out;\n}\n\n/** `settings` without its unset keys, so `<SceneCanvas tune>` params fill them in. */\nfunction definedOf(settings: WarpSettings): Record<string, unknown> {\n return Object.fromEntries(Object.entries(settings).filter(([, v]) => v !== undefined));\n}\n\nconst KEYS: Record<WarpKind, ToolKeybinding> = { distort: { key: 'F' }, envelope: { key: 'M' }, puppet: { key: 'B' } };\n\n/** What a warp tool keeps between renders: whether it is active, the canvas\n * it is attached to, and the in-flight drag its controls follow. */\nfunction createWarpToolState() {\n let active = false;\n let api: CanvasExtensionApi | null = null;\n let deps: ContributionDepReader | null = null;\n const live = createWarpLive();\n return {\n live,\n active: () => active,\n scene: () => deps?.get('scene') as never,\n /** What an invocation of `actionId` passing `given` starts with here,\n * its tunings included. */\n paramsOf: (actionId: string, given: Record<string, unknown>) => deps?.get('actionParams')?.(actionId, given) ?? given,\n setActive(next: boolean): void {\n active = next;\n api?.requestRedraw();\n },\n attachTo(nextApi: CanvasExtensionApi | null, nextDeps: ContributionDepReader | null): void {\n api = nextApi;\n deps = nextDeps;\n },\n };\n}\n\nfunction useWarpTool(kind: WarpKind, options: WarpToolOptions, settings: WarpSettings): WarpTool {\n const { label, keybinding = KEYS[kind] } = options;\n const settingsRef = useLatest(settings);\n const state = useMemo(() => createWarpToolState(), []);\n\n const attach = useMemo(() => {\n const layer = createWarpHandleLayer({\n kind,\n active: state.active,\n settings: () => state.paramsOf(`${kind}.drag`, definedOf(settingsRef.current)) as WarpSettings,\n scene: state.scene,\n live: state.live,\n });\n return (api: CanvasExtensionApi, deps: ContributionDepReader) => {\n state.attachTo(api, deps);\n const unregister = api.registerLayer(layer);\n const unlisten = state.live.subscribe(() => api.requestRedraw());\n return () => {\n unlisten();\n unregister();\n state.attachTo(null, null);\n };\n };\n }, [kind, settingsRef, state]);\n\n const actions = useMemo<Action[]>(() => [\n createWarpDragAction(kind, state.live),\n createWarpGrabAction(kind),\n ...(kind === 'puppet' ? [createAddPinAction(), createRemovePinAction()] : []),\n ], [kind, state]);\n\n return useMemo(() => {\n const tool = defineTool({\n id: kind,\n ...(keybinding ? { keybinding } : {}),\n hookName: `use${kind[0].toUpperCase()}${kind.slice(1)}Tool`,\n capabilities: ['creates-shapes'],\n cursor: kind === 'puppet' ? 'crosshair' : 'default',\n actions,\n presentation: { label: label ?? WARP_LABELS[kind], group: 'warp' },\n onActivate: () => state.setActive(true),\n onDeactivate: () => state.setActive(false),\n bindings: bindingsFor(kind, () => definedOf(settingsRef.current)),\n });\n return Object.assign(tool, { attach });\n }, [actions, attach, keybinding, kind, label, settingsRef, state]);\n}\n\n/**\n * Distort the selected paths by their box's four corners, each dragged on its\n * own. The first drag gives the selection a distort, kept on each path as\n * `data.warp` until it is expanded (`expandWarp`); selecting the paths again\n * with this tool shows its corners where they were left. `configureWarp`\n * switches a held distort between free and perspective.\n */\nexport function useDistortTool(options: UseDistortToolOptions = {}): WarpTool {\n const { mode, tolerance } = options;\n return useWarpTool('distort', options, { mode, tolerance });\n}\n\n/**\n * Warp the selected paths through a mesh of control points over their box:\n * drag any point and the shape bends smoothly around it. The mesh is held on\n * each path until it is expanded, and `configureWarp` changes its grid or its\n * interpolation.\n */\nexport function useEnvelopeTool(options: UseEnvelopeToolOptions = {}): WarpTool {\n const { rows, cols, mapping, tolerance } = options;\n return useWarpTool('envelope', options, { rows, cols, mapping, tolerance });\n}\n\n/**\n * Pin the selected paths where they are clicked, and drag a pin to bend them:\n * the rest of the shape follows as rigidly as the pins allow, and a pin left\n * alone holds its place. Alt-click a pin to take it out. The pins are held on\n * each path until it is expanded.\n */\nexport function usePuppetTool(options: UsePuppetToolOptions = {}): WarpTool {\n return useWarpTool('puppet', options, { tolerance: options.tolerance });\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,55 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@weasel-js/path-tools",
|
|
3
|
-
"version": "
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
|
|
3
|
+
"version": "1.10.1",
|
|
4
|
+
"description": "Path-editing tools for a weasel canvas, as presets an app opts into: brushes, bridge, trim and extend, curvature and handle balance, path constraints, path effects, and warps.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"sideEffects": false,
|
|
8
|
+
"main": "./dist/index.js",
|
|
9
|
+
"module": "./dist/index.js",
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"exports": {
|
|
12
|
+
".": {
|
|
13
|
+
"import": "./dist/index.js",
|
|
14
|
+
"types": "./dist/index.d.ts"
|
|
15
|
+
},
|
|
16
|
+
"./package.json": "./package.json"
|
|
17
|
+
},
|
|
18
|
+
"author": "orochi235",
|
|
19
|
+
"homepage": "https://orochi235.github.io/weasel/",
|
|
20
|
+
"repository": {
|
|
21
|
+
"type": "git",
|
|
22
|
+
"url": "git+https://github.com/orochi235/weasel.git",
|
|
23
|
+
"directory": "packages/path-tools"
|
|
24
|
+
},
|
|
25
|
+
"bugs": {
|
|
26
|
+
"url": "https://github.com/orochi235/weasel/issues"
|
|
27
|
+
},
|
|
28
|
+
"engines": {
|
|
29
|
+
"node": ">=22"
|
|
30
|
+
},
|
|
31
|
+
"files": [
|
|
32
|
+
"dist",
|
|
33
|
+
"README.md",
|
|
34
|
+
"LICENSE"
|
|
35
|
+
],
|
|
36
|
+
"scripts": {
|
|
37
|
+
"build": "tsup"
|
|
38
|
+
},
|
|
39
|
+
"dependencies": {
|
|
40
|
+
"@weasel-js/cursor": "1.10.1",
|
|
41
|
+
"@weasel-js/react": "1.10.1",
|
|
42
|
+
"@weasel-js/registry": "1.10.1",
|
|
43
|
+
"@weasel-js/renderer": "1.10.1",
|
|
44
|
+
"@weasel-js/routing": "1.10.1"
|
|
45
|
+
},
|
|
46
|
+
"peerDependencies": {
|
|
47
|
+
"@weasel-js/core": "1.10.1",
|
|
48
|
+
"@weasel-js/geom": "1.10.1",
|
|
49
|
+
"react": ">=18"
|
|
50
|
+
},
|
|
51
|
+
"publishConfig": {
|
|
52
|
+
"access": "public",
|
|
53
|
+
"provenance": true
|
|
54
|
+
}
|
|
55
|
+
}
|