@weasel-js/diagram 1.11.0 → 1.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/README.md +696 -4
  2. package/dist/chunk-2SYY4W3B.js +2055 -0
  3. package/dist/chunk-2SYY4W3B.js.map +1 -0
  4. package/dist/chunk-5GIP2LA6.js +312 -0
  5. package/dist/chunk-5GIP2LA6.js.map +1 -0
  6. package/dist/chunk-DYDX6EJC.js +3653 -0
  7. package/dist/chunk-DYDX6EJC.js.map +1 -0
  8. package/dist/chunk-GA4BX7SH.js +1431 -0
  9. package/dist/chunk-GA4BX7SH.js.map +1 -0
  10. package/dist/{chunk-NUMMW5BI.js → chunk-R2XB6D32.js} +416 -36
  11. package/dist/chunk-R2XB6D32.js.map +1 -0
  12. package/dist/chunk-WDIE35AK.js +3 -0
  13. package/dist/chunk-WDIE35AK.js.map +1 -0
  14. package/dist/{fromData-GKqRgPFs.d.ts → dataTypes-DHdkzCL8.d.ts} +238 -59
  15. package/dist/effect-audio.d.ts +139 -0
  16. package/dist/effect-audio.js +533 -0
  17. package/dist/effect-audio.js.map +1 -0
  18. package/dist/effect.d.ts +486 -121
  19. package/dist/effect.js +1632 -347
  20. package/dist/effect.js.map +1 -1
  21. package/dist/icons.table.d.ts +6 -0
  22. package/dist/icons.table.js +32 -0
  23. package/dist/icons.table.js.map +1 -0
  24. package/dist/icons.table.json +24 -0
  25. package/dist/index.d.ts +2159 -92
  26. package/dist/index.js +1056 -2
  27. package/dist/index.js.map +1 -1
  28. package/dist/layout.d.ts +3 -3
  29. package/dist/layout.entry-B-jJMc50.d.ts +617 -0
  30. package/dist/layout.js +3 -1
  31. package/dist/stageTypes-DvnR8cKQ.d.ts +189 -0
  32. package/dist/{body-2lC7IiIA.d.ts → types-M_ccNAlk.d.ts} +221 -182
  33. package/package.json +28 -7
  34. package/dist/chunk-C4NAI6NV.js +0 -2041
  35. package/dist/chunk-C4NAI6NV.js.map +0 -1
  36. package/dist/chunk-NUMMW5BI.js.map +0 -1
  37. package/dist/layout.entry-BoWFcR4G.d.ts +0 -285
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/group.ts","../src/labelTrait.ts","../src/label.ts","../src/selfLoop.ts","../src/edgeTrait.ts","../src/edge.ts","../src/portAffordance.ts","../src/connect.ts","../src/portLayer.ts","../src/contribution.ts","../src/groupTree.ts","../src/graph.ts","../src/marks.ts","../src/dataGroups.ts","../src/dataEdges.ts","../src/fromData.ts","../src/routeWrites.ts","../src/layoutAction.ts","../src/liveProducers.ts","../src/livePlan.ts","../src/liveRoutes.ts","../src/live.ts","../src/shape.ts","../src/mirrorSelection.ts","../src/sceneSync.ts","../src/DiagramView.tsx"],"names":["near","AUTO_POSE_DESCRIPTOR","center","translatePoseViaDescriptor","facing","NONE","out","wireLabels","polylineFromPoints","LAYOUTS","useRef","useMemo","useEffect","graphOf","placed","held","RECT_POSE_DESCRIPTOR","commandFill","commandStroke","registerNodeShape","useLatest","useCallback","portsOf","DiagramView"],"mappings":"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","file":"chunk-C4NAI6NV.js","sourcesContent":["/**\n * A group's box, and anything pinned to a point on another node.\n *\n * The box is an ordinary node that depends on its members and derives its pose\n * from theirs: their union, grown by the inset. Drag a member and the box\n * follows; lay the diagram out and the box lands around wherever the members\n * went. Nothing has to keep it in sync, because nothing stores it.\n *\n * An anchored node — a group's title is the first — derives its pose from one\n * dependency's bounds the same way, so it travels with the box it labels.\n */\nimport {\n AUTO_POSE_DESCRIPTOR,\n translatePoseViaDescriptor,\n type DerivedDep,\n type PoseDescriptor,\n} from '@weasel-js/core';\nimport type { Vec2 } from '@weasel-js/core/math';\nimport { insetOf, type GroupInset } from './cluster';\nimport { grownBy } from './footprint';\nimport { DIAGRAM_TRAIT_KEY } from './trait';\nimport type { DiagramGroup, PortAnchor } from './types';\n\n/** Where an anchored node sits on its dependency. */\nexport interface DiagramAnchor {\n /** The point on the dependency's bounds, normalized as a port's is. */\n at: PortAnchor;\n /** The point on the node's own bounds that lands there. Default `at`, so\n * `{ u: 0, v: 0 }` puts the node's top-left on the dependency's. */\n self?: PortAnchor;\n /** Then moved by this much, in world units. */\n offset?: Vec2;\n}\n\nfunction traitOf(node: { data: unknown }): Record<string, unknown> | null {\n const data = node.data;\n if (data === null || typeof data !== 'object') return null;\n const trait = (data as Record<string, unknown>)[DIAGRAM_TRAIT_KEY];\n return trait !== null && typeof trait === 'object' ? (trait as Record<string, unknown>) : null;\n}\n\n/** The group trait on a node's data, or `null`. */\nexport function diagramGroupOf(node: { data: unknown }): DiagramGroup | null {\n const group = traitOf(node)?.group;\n return group !== null && typeof group === 'object' ? (group as DiagramGroup) : null;\n}\n\n/** The anchor trait on a node's data, or `null`. */\nexport function diagramAnchorOf(node: { data: unknown }): DiagramAnchor | null {\n const anchor = traitOf(node)?.anchor;\n return anchor !== null && typeof anchor === 'object' && 'at' in anchor ? (anchor as DiagramAnchor) : null;\n}\n\n/** Options for {@link groupDerivePose} and {@link anchorDerivePose}.\n * `geometry` defaults to the kit's `AUTO_POSE_DESCRIPTOR`. */\nexport interface GroupPoseOptions<TPose> {\n geometry?: PoseDescriptor<TPose>;\n}\n\n/** A `derivePose` function as the scene calls it: the node, then what it depends on, in `dependsOn` order. */\nexport type DiagramDerivePose<TPose> = (\n node: { pose: TPose; data: unknown },\n deps: readonly (DerivedDep<TPose> | undefined)[],\n) => TPose | null;\n\n/**\n * A `derivePose` that draws a group's box around its members: the union of\n * what each takes up, its `margin` included, grown by the trait's inset. `null` — the authored pose stands — when the node\n * carries no group trait or every member is gone.\n */\nexport function groupDerivePose<TPose>(opts: GroupPoseOptions<TPose> = {}): DiagramDerivePose<TPose> {\n const geometry = opts.geometry ?? (AUTO_POSE_DESCRIPTOR as PoseDescriptor<TPose>);\n return (node, deps) => {\n const group = diagramGroupOf(node);\n if (group === null) return null;\n let x0 = Infinity;\n let y0 = Infinity;\n let x1 = -Infinity;\n let y1 = -Infinity;\n for (const dep of deps) {\n if (dep === undefined) continue;\n const b = grownBy(geometry.getBounds(dep.pose), traitOf(dep.node)?.margin as GroupInset | undefined);\n x0 = Math.min(x0, b.x);\n y0 = Math.min(y0, b.y);\n x1 = Math.max(x1, b.x + b.width);\n y1 = Math.max(y1, b.y + b.height);\n }\n if (!Number.isFinite(x0)) return null;\n return geometry.fromBounds(boxAround({ x: x0, y: y0, width: x1 - x0, height: y1 - y0 }, group), node.pose);\n };\n}\n\n/** A group's box around the union of its members: grown by its inset, and\n * widened evenly to its `minWidth`. */\nexport function boxAround(\n union: { x: number; y: number; width: number; height: number },\n group: DiagramGroup,\n): { x: number; y: number; width: number; height: number } {\n const inset = insetOf(group.inset);\n const width = union.width + inset.left + inset.right;\n const grow = Math.max(0, (group.minWidth ?? 0) - width);\n return {\n x: union.x - inset.left - grow / 2,\n y: union.y - inset.top,\n width: width + grow,\n height: union.height + inset.top + inset.bottom,\n };\n}\n\n/**\n * A `derivePose` that keeps a node at a point on its dependency's bounds.\n * `null` when the node carries no anchor trait or the dependency is gone.\n */\nexport function anchorDerivePose<TPose>(opts: GroupPoseOptions<TPose> = {}): DiagramDerivePose<TPose> {\n const geometry = opts.geometry ?? (AUTO_POSE_DESCRIPTOR as PoseDescriptor<TPose>);\n return (node, deps) => {\n const anchor = diagramAnchorOf(node);\n const dep = deps[0];\n if (anchor === null || dep === undefined) return null;\n const target = geometry.getBounds(dep.pose);\n const own = geometry.getBounds(node.pose);\n const self = anchor.self ?? anchor.at;\n const x = target.x + anchor.at.u * target.width + (anchor.offset?.x ?? 0) - self.u * own.width;\n const y = target.y + anchor.at.v * target.height + (anchor.offset?.y ?? 0) - self.v * own.height;\n return translatePoseViaDescriptor(node.pose, x - own.x, y - own.y, geometry);\n };\n}\n\n/** Registry key for {@link GROUP_DERIVE_POSE}. */\nexport const DIAGRAM_GROUP = 'diagram:group';\n/** Registry key for {@link ANCHOR_DERIVE_POSE}. */\nexport const DIAGRAM_ANCHOR = 'diagram:anchor';\n\n/** The default group derivation, a stable reference so `toJSON` can find its key. */\nexport const GROUP_DERIVE_POSE = groupDerivePose<unknown>();\n/** The default anchor derivation, a stable reference for the same reason. */\nexport const ANCHOR_DERIVE_POSE = anchorDerivePose<unknown>();\n","/**\n * The label trait: where along its edge a label sits. Data only — placing the\n * label on the route is `label`'s job, so layout can read one without\n * reaching the scene.\n */\nimport type { Vec2 } from '@weasel-js/core/math';\n\n/** Where along an edge a label sits. */\nexport interface DiagramLabel {\n /** `'start'`, `'mid'` and `'end'` are 0, 0.5 and 1; a number is that\n * fraction of the route's length. `{ near }` is the point on the route\n * nearest `near`, in world coordinates — where `layered` leaves a label\n * room — so a bend added or removed elsewhere leaves the label on the\n * stretch it was on. */\n at: 'start' | 'mid' | 'end' | number | { near: Vec2 };\n /** World units between the route and the label's near side, to the **left\n * of the direction of travel** — above a left-to-right edge. Default 0,\n * which centers the label on the line. */\n offset?: number;\n}\n\n/** The label trait on a node's data, or `null`. */\nexport function diagramLabelOf(node: { data: unknown }): DiagramLabel | null {\n const data = node.data;\n if (data === null || typeof data !== 'object') return null;\n const trait = (data as { diagram?: unknown }).diagram;\n if (trait === null || typeof trait !== 'object') return null;\n const label = (trait as { label?: unknown }).label;\n if (label === null || typeof label !== 'object') return null;\n return 'at' in label ? (label as DiagramLabel) : null;\n}\n","/**\n * A label on an edge: an ordinary leaf node that derives its *pose* from the\n * route it sits on.\n *\n * It reads the edge's resolved path off its dependency rather than routing\n * again, so the label and the arrowhead can never disagree about where the\n * edge went. Everything else about it is a normal scene node — its own size,\n * data, styling, z-order and selection.\n */\nimport {\n AUTO_POSE_DESCRIPTOR,\n pointAlongPath,\n translatePoseViaDescriptor,\n type DerivedDep,\n type Path,\n type PoseDescriptor,\n type Vec2,\n} from '@weasel-js/core';\nimport {\n PATH_C, PATH_L, PATH_Q, forEachSegment, nearestOnCubic, nearestOnLine, nearestOnQuadratic, type CurveNearest,\n} from '@weasel-js/geom';\nimport { diagramLabelOf, type DiagramLabel } from './labelTrait';\n\nconst NAMED = { start: 0, mid: 0.5, end: 1 } as const;\n\n/** The point on `path` nearest `near`, and the heading of the path there;\n * `null` for a path with no segment to stand on. */\nfunction nearestStation(path: Path, near: Vec2): { point: Vec2; tangent: Vec2 } | null {\n if (path.kind !== 'polygon') return null;\n const { commands, coords } = path;\n let best: CurveNearest | null = null;\n let heading: Vec2 = { x: 1, y: 0 };\n forEachSegment(commands, coords, (cmd, ci, x0, y0) => {\n let hit: CurveNearest;\n let d: Vec2;\n if (cmd === PATH_L) {\n hit = nearestOnLine(near.x, near.y, x0, y0, coords[ci]!, coords[ci + 1]!);\n d = { x: coords[ci]! - x0, y: coords[ci + 1]! - y0 };\n } else if (cmd === PATH_Q) {\n hit = nearestOnQuadratic(near.x, near.y, x0, y0, coords[ci]!, coords[ci + 1]!, coords[ci + 2]!, coords[ci + 3]!);\n const t = hit.t;\n d = {\n x: 2 * (1 - t) * (coords[ci]! - x0) + 2 * t * (coords[ci + 2]! - coords[ci]!),\n y: 2 * (1 - t) * (coords[ci + 1]! - y0) + 2 * t * (coords[ci + 3]! - coords[ci + 1]!),\n };\n } else if (cmd === PATH_C) {\n hit = nearestOnCubic(\n near.x, near.y, x0, y0,\n coords[ci]!, coords[ci + 1]!, coords[ci + 2]!, coords[ci + 3]!, coords[ci + 4]!, coords[ci + 5]!,\n );\n const t = hit.t;\n const u = 1 - t;\n d = {\n x: 3 * u * u * (coords[ci]! - x0) + 6 * u * t * (coords[ci + 2]! - coords[ci]!) + 3 * t * t * (coords[ci + 4]! - coords[ci + 2]!),\n y: 3 * u * u * (coords[ci + 1]! - y0) + 6 * u * t * (coords[ci + 3]! - coords[ci + 1]!) + 3 * t * t * (coords[ci + 5]! - coords[ci + 3]!),\n };\n } else return;\n const len = Math.hypot(d.x, d.y);\n if (len === 0 || (best !== null && hit.dist >= best.dist)) return;\n best = hit;\n heading = { x: d.x / len, y: d.y / len };\n });\n const found = best as CurveNearest | null;\n return found === null ? null : { point: { x: found.x, y: found.y }, tangent: heading };\n}\n\n/** Where the center of a label `size` big sits along `path`; `null` for a\n * path with no points. */\nexport function labelCenter(path: Path, label: DiagramLabel, size: { width: number; height: number }): Vec2 | null {\n const station = typeof label.at === 'object'\n ? nearestStation(path, label.at.near) ?? pointAlongPath(path, 0.5)\n : pointAlongPath(path, typeof label.at === 'number' ? label.at : NAMED[label.at] ?? 0.5);\n if (station === null) return null;\n const nx = station.tangent.y;\n const ny = -station.tangent.x;\n // Half the label's depth along the normal, so its near side, not its center, sits `offset` off the line.\n const offset = label.offset ?? 0;\n const reach = offset + Math.sign(offset) * (Math.abs(nx) * size.width + Math.abs(ny) * size.height) / 2;\n // Left of travel: with y down, that is above an edge running rightward.\n return { x: station.point.x + nx * reach, y: station.point.y + ny * reach };\n}\n\n/** Options for {@link labelDerivePose}. `geometry` defaults to the kit's\n * `AUTO_POSE_DESCRIPTOR`. */\nexport interface LabelPoseOptions<TPose> {\n geometry?: PoseDescriptor<TPose>;\n}\n\n/**\n * A `derivePose` that stations a label along its dependency's path.\n *\n * Returns `null` — nothing derived, so the node keeps its authored pose —\n * when the node carries no label trait, when the dependency is gone, or when\n * the dependency derives no path. A label that snapped to the origin because\n * its edge was deleted is worse than one that stayed where the author left it.\n */\nexport function labelDerivePose<TPose>(\n opts: LabelPoseOptions<TPose> = {},\n): (node: { pose: TPose; data: unknown }, deps: readonly (DerivedDep<TPose> | undefined)[]) => TPose | null {\n const geometry = opts.geometry ?? (AUTO_POSE_DESCRIPTOR as PoseDescriptor<TPose>);\n\n return (node, deps) => {\n const label = diagramLabelOf(node);\n if (label === null) return null;\n const path = deps[0]?.path ?? null;\n if (path === null) return null;\n\n const bounds = geometry.getBounds(node.pose);\n const center = labelCenter(path, label, bounds);\n if (center === null) return null;\n\n return translatePoseViaDescriptor(\n node.pose,\n center.x - (bounds.x + bounds.width / 2),\n center.y - (bounds.y + bounds.height / 2),\n geometry,\n );\n };\n}\n\n/** Registry key for {@link LABEL_DERIVE_POSE}. */\nexport const DIAGRAM_LABEL = 'diagram:label';\n\n/** The default label derivation, as one stable function reference so `toJSON`\n * can find its key. */\nexport const LABEL_DERIVE_POSE = labelDerivePose<unknown>();\n","import type { Vec2 } from '@weasel-js/core';\nimport type { Port } from './types';\n\n/** How a self-edge with no ports named leaves its node and comes back. */\nexport interface SelfLoop {\n from: Port;\n to: Port;\n /** A point outside the node, off the corner between the two sides. */\n via: Vec2;\n}\n\nconst dot = (a: Vec2, b: Vec2): number => a.x * b.x + a.y * b.y;\n\n/**\n * The route a self-edge takes when neither end names a port: out by one side\n * and back by the next one round, past a point `standoff` clear of both.\n *\n * Both ends of such an edge aim at their own node's center, so every port\n * faces it equally, both pick the same one, and the edge has no length. The\n * sides are taken by where they face on the page, east and then north, so the\n * loop sits at the same corner of every node however its ports are listed.\n * `null` where the node has no two ports facing different ways.\n */\nexport function selfLoop(ports: readonly Port[], standoff: number): SelfLoop | null {\n const facing = ports.filter((p): p is Port & { normal: Vec2 } => p.normal !== null);\n const most = (dir: Vec2, among: typeof facing) =>\n among.reduce<(typeof facing)[number] | undefined>(\n (best, p) => (best === undefined || dot(p.normal, dir) > dot(best.normal, dir) ? p : best),\n undefined,\n );\n const from = most({ x: 1, y: 0 }, facing);\n if (from === undefined) return null;\n // Across, not along: a second port on the same side would fold the loop flat.\n const to = most({ x: 0, y: -1 }, facing.filter((p) => Math.abs(dot(p.normal, from.normal)) < 0.5));\n if (to === undefined) return null;\n // Out along the first side's facing, then along the second's until level with its own standoff.\n const out = { x: from.point.x + from.normal.x * standoff, y: from.point.y + from.normal.y * standoff };\n const reach = dot({ x: to.point.x - out.x, y: to.point.y - out.y }, to.normal) + standoff;\n return { from, to, via: { x: out.x + to.normal.x * reach, y: out.y + to.normal.y * reach } };\n}\n","/**\n * The edge trait: what an edge's `data` says about its ends and its route, and\n * who owns each. Data only — the routers and the scene wiring are in `edge`,\n * so layout can read an edge without reaching the scene.\n */\nimport type { Vec2 } from '@weasel-js/core/math';\n\n/** Where an edge attaches at one end. */\nexport interface EdgeEnd {\n /** The port to leave from, when the endpoint declares one. Falls back to\n * the nearest port, so an edge drawn before ports were thought about still\n * meets the shape. */\n port?: string;\n /** The port layout last named here. While `port` still equals it, or names\n * none, layout owns the end and names it again on its next run. */\n laidOut?: string;\n}\n\n/** Whether layout may name this end's port: it names none, or only the one\n * layout last named. */\nexport function layoutOwnsPort(end: EdgeEnd): boolean {\n return end.port === undefined || end.port === end.laidOut;\n}\n\n/** The trait on an edge's `data`, under the same key participants use. */\nexport interface DiagramEdge {\n from: EdgeEnd;\n to: EdgeEnd;\n /** Registry key for the router. Resolved by whoever builds the edge's\n * `derivePath`; unknown keys fall back to `straight`. */\n router?: string;\n /** Points in world coordinates the route must pass through, in order. The\n * author owns these; the router owns everything between them. */\n waypoints?: readonly Vec2[];\n /** The waypoints layout last wrote here. While `waypoints` still equals\n * them, layout owns the route and rewrites it on its next run; once anyone\n * edits them, they are the author's and layout leaves them alone. */\n laidOut?: readonly Vec2[];\n}\n\n/** Whether layout may rewrite this edge's route: it has no waypoints, or only\n * the ones layout last wrote. */\nexport function layoutOwnsRoute(edge: DiagramEdge): boolean {\n const points = edge.waypoints ?? [];\n if (points.length === 0) return true;\n return edge.laidOut !== undefined && samePoints(points, edge.laidOut);\n}\n\n/** Two point lists the same, point for point. */\nexport function samePoints(a: readonly Vec2[], b: readonly Vec2[]): boolean {\n return a.length === b.length && a.every((p, i) => p.x === b[i]!.x && p.y === b[i]!.y);\n}\n\n/** The edge trait on a node's data, or `null`. */\nexport function diagramEdgeOf(node: { data: unknown }): DiagramEdge | null {\n const data = node.data;\n if (data === null || typeof data !== 'object') return null;\n const edge = (data as { diagram?: unknown }).diagram;\n if (edge === null || typeof edge !== 'object') return null;\n return 'from' in edge && 'to' in edge ? (edge as DiagramEdge) : null;\n}\n","/**\n * `DiagramEdge` — a connection between two participants.\n *\n * An edge is an ordinary leaf scene node with `dependsOn: [from, to]` and a\n * `derivePath` that runs a **router**. Being a scene node rather than a\n * plugin-owned render layer buys selection, hit-testing, hover, styling,\n * z-order, SVG export, undo, and copy/paste. The cost is that an edge costs\n * what a node costs — right for tens to hundreds of edges, wrong for a\n * 10k-edge force graph.\n *\n * **Author-dragged waypoints are data on the edge and the router routes\n * through them**, so a moved endpoint still re-routes.\n *\n * Arrowheads are not here. They are stroke markers, the same\n * `markerStart` / `markerEnd` any other stroke carries.\n */\nimport {\n AUTO_POSE_DESCRIPTOR,\n polylineFromPoints,\n type DerivedDep,\n type Path,\n type PoseDescriptor,\n type SceneRegistry,\n type Vec2,\n} from '@weasel-js/core';\nimport { portCurvePoints } from '@weasel-js/geom';\nimport { ANCHOR_DERIVE_POSE, DIAGRAM_ANCHOR, DIAGRAM_GROUP, GROUP_DERIVE_POSE } from './group';\nimport { DIAGRAM_LABEL, LABEL_DERIVE_POSE } from './label';\nimport { portSitesOf, portsOf, type PortsOptions } from './ports';\nimport { selfLoop } from './selfLoop';\nimport { diagramEdgeOf, type EdgeEnd } from './edgeTrait';\nimport type { Port } from './types';\n\n/** What a router is given: the two resolved ends, and the author's waypoints\n * between them. */\nexport interface RouteRequest {\n from: Port;\n to: Port;\n waypoints: readonly Vec2[];\n}\n\n/** A router returns the points the edge runs through, `from.point` first and\n * `to.point` last. */\nexport type Router = (req: RouteRequest) => readonly Vec2[];\n\n/** The straight run between the two ends, through any waypoints. */\nexport const straight: Router = (req) => [req.from.point, ...req.waypoints, req.to.point];\n\n/**\n * An axis-aligned route: leave along the departing end's normal and arrive\n * against the receiving one's.\n *\n * A leg is one elbow where the two ends face different axes and two where they\n * face the same one, turning at the midpoint of the axis they share. Arriving\n * along the port's own facing is what makes the arrowhead point *into* the\n * shape.\n */\nexport const orthogonal: Router = (req) => {\n const stops = [req.from.point, ...req.waypoints, req.to.point];\n const out: Vec2[] = [stops[0]!];\n for (let i = 1; i < stops.length; i++) {\n const a = out[out.length - 1]!;\n const b = stops[i]!;\n if (a.x === b.x || a.y === b.y) {\n out.push(b);\n continue;\n }\n // Only the first leg has a port to leave along; later legs follow the\n // one before them so the route does not alternate for no reason.\n const leaveHorizontal = i === 1\n ? isHorizontal(req.from.normal)\n : out.length > 1 && out[out.length - 2]!.y === a.y;\n // Likewise only the last leg has a port to arrive against. Without a\n // facing there is nothing to satisfy, so it keeps the single elbow.\n const arriving = i === stops.length - 1 ? req.to.normal : null;\n const arriveHorizontal = arriving == null ? !leaveHorizontal : isHorizontal(arriving);\n if (leaveHorizontal !== arriveHorizontal) {\n out.push(leaveHorizontal ? { x: b.x, y: a.y } : { x: a.x, y: b.y });\n out.push(b);\n continue;\n }\n // Splitting the leg at its midpoint starts back the way the route just\n // came when the last stop overshot this one; turning at once does not.\n const prev = out.length > 1 ? out[out.length - 2]! : null;\n if (leaveHorizontal) {\n const mid = (a.x + b.x) / 2;\n if (prev !== null && (mid - a.x) * (a.x - prev.x) < 0) out.push({ x: a.x, y: b.y }, b);\n else out.push({ x: mid, y: a.y }, { x: mid, y: b.y }, b);\n } else {\n const mid = (a.y + b.y) / 2;\n if (prev !== null && (mid - a.y) * (a.y - prev.y) < 0) out.push({ x: b.x, y: a.y }, b);\n else out.push({ x: a.x, y: mid }, { x: b.x, y: mid }, b);\n }\n }\n return out;\n};\n\n/** Which axis a port faces. A port with no facing counts as horizontal. */\nfunction isHorizontal(normal: Vec2 | null | undefined): boolean {\n return Math.abs(normal?.x ?? 1) >= Math.abs(normal?.y ?? 0);\n}\n\n/**\n * A smooth route, sampled into points.\n *\n * Each leg is a cubic that leaves along the departing end's normal and arrives\n * against the receiving one's, and passes each waypoint without a corner.\n * Sampled rather than emitted as curve commands so every router returns the\n * same thing.\n */\nexport const bezier: Router = (req) => {\n const stops = [req.from.point, ...req.waypoints, req.to.point];\n const out: Vec2[] = [stops[0]!];\n for (let i = 1; i < stops.length; i++) {\n const a = stops[i - 1]!;\n const b = stops[i]!;\n const outN = i === 1 ? req.from.normal : through(stops, i - 1);\n const inN = i === stops.length - 1 ? req.to.normal : negated(through(stops, i));\n const leg = portCurvePoints(\n a.x, a.y, b.x, b.y,\n outN == null ? null : [outN.x, outN.y],\n inN == null ? null : [inN.x, inN.y],\n BEZIER_SAMPLES,\n );\n for (const [x, y] of leg) out.push({ x, y });\n }\n return out;\n};\n\nconst BEZIER_SAMPLES = 16;\n\n/**\n * The direction a smooth route passes an interior stop: along the straight run\n * it makes with a neighboring waypoint level with it on one axis, else from\n * the stop before it toward the one after. Two such waypoints are a run the\n * route was meant to hold, the way `layered` lays one through each rank.\n */\nfunction through(stops: readonly Vec2[], i: number): Vec2 | null {\n const last = stops.length - 1;\n const run = (a: number, b: number) => a >= 1 && b <= last - 1 && (stops[a]!.x === stops[b]!.x || stops[a]!.y === stops[b]!.y);\n const [from, to] = run(i, i + 1) ? [i, i + 1] : run(i - 1, i) ? [i - 1, i] : [i - 1, i + 1];\n const dx = stops[to]!.x - stops[from]!.x;\n const dy = stops[to]!.y - stops[from]!.y;\n const len = Math.hypot(dx, dy);\n return len === 0 ? null : { x: dx / len, y: dy / len };\n}\n\nconst negated = (v: Vec2 | null): Vec2 | null => (v === null ? null : { x: -v.x, y: -v.y });\n\n/** The routers this package ships. A consumer's own go in the same shape. */\nexport const ROUTERS: Readonly<Record<string, Router>> = Object.freeze({\n straight,\n orthogonal,\n bezier,\n});\n\n/**\n * The port an end resolves to: the one it named, at whichever of its places\n * faces `toward` most directly, else the port facing `toward` most directly.\n *\n * \"Facing\" rather than \"nearest\": a port on the far side of a wide node can be\n * closer in a straight line than the one pointing at the target.\n */\nexport function resolveEnd<TPose>(\n end: EdgeEnd,\n dep: DerivedDep<TPose>,\n toward: Vec2,\n opts: PortsOptions<TPose>,\n allPorts: (d: DerivedDep<TPose>) => Port[],\n): Port | undefined {\n if (end.port !== undefined) {\n const sites = portSitesOf(dep.node as never, dep.pose, end.port, opts);\n // A place counts only when it faces `toward` at all; else the port sits\n // at `at`, as a self-loop's does.\n const ahead = sites.filter((p) => p.normal !== null && p.normal.x * (toward.x - p.point.x) + p.normal.y * (toward.y - p.point.y) > 0);\n if (sites.length > 0) return ahead.length > 0 ? facing(ahead, toward) : sites[0];\n }\n return facing(allPorts(dep), toward);\n}\n\n/** The port pointing at `toward` most directly, tie-broken toward the closer. */\nfunction facing(ports: readonly Port[], toward: Vec2): Port | undefined {\n let best: Port | undefined;\n let bestScore = -Infinity;\n for (const port of ports) {\n const dx = toward.x - port.point.x;\n const dy = toward.y - port.point.y;\n const len = Math.hypot(dx, dy) || 1;\n // Alignment with the port's own facing, tie-broken toward the closer port.\n const aim = port.normal === null\n ? 0\n : (port.normal.x * dx + port.normal.y * dy) / len;\n const score = aim - len / 1e6;\n if (score > bestScore) {\n bestScore = score;\n best = port;\n }\n }\n return best;\n}\n\n/** Options for {@link edgeDerivePath}. */\nexport interface EdgeRouteOptions<TPose> extends PortsOptions<TPose> {\n /** Routers by key. Defaults to {@link ROUTERS}. */\n routers?: Readonly<Record<string, Router>>;\n /** How far outside its node a self-edge with no ports named turns, in\n * world units. Defaults to half the node's shorter side. */\n selfLoopStandoff?: number;\n}\n\n/**\n * A `derivePath` that routes an edge between its two dependencies.\n *\n * An edge from a node to itself that names no ports leaves and returns by the\n * sides {@link selfLoop} picks, and where the author set no waypoints the\n * router is handed that rule's point outside the node as one.\n *\n * Returns `null` — nothing to draw — when the node is not an edge, when either\n * dependency is gone, or when an endpoint offers no ports at all.\n */\nexport function edgeDerivePath<TPose>(\n opts: EdgeRouteOptions<TPose> = {},\n): (node: { data: unknown }, deps: readonly (DerivedDep<TPose> | undefined)[]) => Path | null {\n const geometry = opts.geometry ?? (AUTO_POSE_DESCRIPTOR as PoseDescriptor<TPose>);\n const portOpts: PortsOptions<TPose> = { geometry, ...(opts.read ? { read: opts.read } : {}) };\n const allPorts = (d: DerivedDep<TPose>): Port[] =>\n portsOf(d.node as never, d.pose, portOpts);\n const centerOf = (d: DerivedDep<TPose>): Vec2 => {\n const b = geometry.getBounds(d.pose);\n return { x: b.x + b.width / 2, y: b.y + b.height / 2 };\n };\n\n const standoffOf = (d: DerivedDep<TPose>): number => {\n const b = geometry.getBounds(d.pose);\n return Math.min(b.width, b.height) / 2;\n };\n\n return (node, deps) => {\n const edge = diagramEdgeOf(node);\n if (edge === null) return null;\n const [fromDep, toDep] = deps;\n if (fromDep === undefined || toDep === undefined) return null;\n\n const loop = fromDep.node.id === toDep.node.id && edge.from.port === undefined && edge.to.port === undefined\n ? selfLoop(allPorts(fromDep), opts.selfLoopStandoff ?? standoffOf(fromDep))\n : null;\n // Each end aims at its first waypoint, else at the other's center, which\n // is stable while both are being resolved — aiming at the other *port*\n // would be circular.\n const authored = edge.waypoints ?? [];\n const from = loop?.from ?? resolveEnd(edge.from, fromDep, authored[0] ?? centerOf(toDep), portOpts, allPorts);\n const to = loop?.to ?? resolveEnd(edge.to, toDep, authored[authored.length - 1] ?? centerOf(fromDep), portOpts, allPorts);\n if (from === undefined || to === undefined) return null;\n\n const waypoints = loop !== null && authored.length === 0 ? [loop.via] : authored;\n const routers = opts.routers ?? ROUTERS;\n const router = (edge.router !== undefined && routers[edge.router]) || straight;\n const points = router({ from, to, waypoints });\n return points.length < 2 ? null : polylineFromPoints(points as { x: number; y: number }[]);\n };\n}\n\n/** Registry key for {@link EDGE_DERIVE_PATH}. */\nexport const DIAGRAM_EDGE = 'diagram:edge';\n\n/** The default edge router, as one stable function reference so `toJSON` can\n * find its key. A consumer wanting different options registers their own\n * `edgeDerivePath(...)` under a key of their choosing. */\nexport const EDGE_DERIVE_PATH = edgeDerivePath<unknown>();\n\n/** Merge this package's registry entries under a consumer's, so an edge\n * round-trips through `toJSON` without the consumer wiring the key. */\nexport function withDiagramRegistry<TPose, TData = unknown, TLayer extends string = string>(\n registry: SceneRegistry<TPose, TData, TLayer> = {},\n): SceneRegistry<TPose, TData, TLayer> {\n return {\n ...registry,\n derivePath: {\n [DIAGRAM_EDGE]: EDGE_DERIVE_PATH,\n ...registry.derivePath,\n },\n derivePose: {\n [DIAGRAM_LABEL]: LABEL_DERIVE_POSE as NonNullable<SceneRegistry<TPose, TData, TLayer>['derivePose']>[string],\n [DIAGRAM_GROUP]: GROUP_DERIVE_POSE as NonNullable<SceneRegistry<TPose, TData, TLayer>['derivePose']>[string],\n [DIAGRAM_ANCHOR]: ANCHOR_DERIVE_POSE as NonNullable<SceneRegistry<TPose, TData, TLayer>['derivePose']>[string],\n ...registry.derivePose,\n },\n };\n}\n","/**\n * Ports as affordances — what makes a painted port a grabbable one.\n *\n * A port is declared as an `AffordanceRegion`, so the kit's own region walk\n * supplies the hit-test, the screen-pixel hit radius, the cursor and the\n * exclusive claim that keeps a port drag out of the select tool's hands. The\n * walk runs on every pointerdown before any tool sees the event, so a port\n * answers whatever tool happens to be active.\n *\n * Two things about this are easy to get wrong, and both fail silently.\n *\n * **`targetId` is `null`.** The framework composes a target's rotation about\n * its bounds center for any region naming one, and `portsOf` has already\n * rotated the port. Naming the participant here would rotate it twice.\n *\n * **`hitKind` is not set.** On the registered-layer route the discriminator is\n * the layer's own id — `<SceneCanvas>` stamps the hit `layer:<RenderLayer.id>`\n * and carries `initialScratch` through as `payload`. A `hitKind` declared here\n * would be dropped, and a binding written against it would never match.\n */\nimport type {\n Affordance,\n AffordanceRegion,\n ChromeState,\n CommandStroke,\n CursorSpec,\n PoseDescriptor,\n CommandFill,\n} from '@weasel-js/core';\nimport { ellipsePath, paintsLayer, viewToTransform } from '@weasel-js/core';\nimport { portsOf } from './ports';\nimport type { DiagramNodeLike, DiagramNodeReader } from './trait';\nimport type { Port } from './types';\n\n/** The layer id this package composes its port regions into. */\nexport const PORT_LAYER_ID = 'diagram-ports';\n\n/** The affordance kind a press on a port reports — what a binding's\n * `target: 'affordance:...'` has to name. `<SceneCanvas>` builds it from\n * {@link PORT_LAYER_ID}, so the two cannot drift. */\nexport const PORT_AFFORDANCE_KIND = `layer:${PORT_LAYER_ID}` as const;\n\n/** A participant and the pose it is **painted** at. `effectivePose`, not\n * `node.pose` — a port that answers from the document pose while its node is\n * mid-drag sits somewhere the user can see the node is not. */\nexport interface ParticipantPose<TPose> {\n node: DiagramNodeLike;\n pose: TPose;\n /** Not drawn: on a hidden layer, or hidden on its own or by an ancestor.\n * `sceneParticipants` answers it from the scene's `nodeGates`. */\n hidden?: boolean;\n /** Out of reach: locked, or on a locked layer. */\n locked?: boolean;\n /** The scene layer the node is painted on, which the asking view may not\n * paint (`ChromeState.layerIsPainted`, `ViewApi.layerIsPainted`). */\n layer?: string;\n}\n\n/** Whether a participant's ports are drawn, grabbed and landed on. A hidden\n * or locked node gets none, as it gets no selection or hover chrome either,\n * and nor does one on a layer the asking view does not paint. */\nexport function offersPorts(\n p: { hidden?: boolean; locked?: boolean; layer?: string },\n view?: Parameters<typeof paintsLayer>[0],\n): boolean {\n return p.hidden !== true && p.locked !== true && paintsLayer(view, p.layer);\n}\n\n/** Where the affordance gets its participants. A thunk rather than a scene so\n * the geometry is testable without one, and so a consumer whose participants\n * come from somewhere else needs no adapter. */\nexport type ParticipantSource<TPose> = () => Iterable<ParticipantPose<TPose>>;\n\n/** What a press on a port hands the action that picks up the drag. Arrives as\n * `InvocationCtx.drag.affordance.payload`. */\nexport interface PortScratch {\n /** `CommonAffordanceScratch.targetId` — becomes `AffordanceHit.targetIds`. */\n targetId: string;\n nodeId: string;\n portId: string;\n /** The port resolved at press time: where it was and which way it faces. */\n port: Port;\n}\n\n/** Options for {@link createPortAffordance}: which ports show, and how they\n * are painted and hit. */\nexport interface PortAffordanceOptions<TPose> {\n /** Also the chrome-caps visibility id. Default {@link PORT_LAYER_ID}. */\n id?: string;\n read?: DiagramNodeReader;\n geometry?: PoseDescriptor<TPose>;\n /** Which participants show their ports. Default: all of them. Gate on\n * selection or hover by reading `state`. */\n shows?: (node: DiagramNodeLike, state: ChromeState) => boolean;\n /** Which of a participant's ports show. Default: all of them. A port\n * this turns away is not painted or grabbable, and passed with the connect\n * options (as `diagramPorts` and `DiagramView` do), no connect lands on it. */\n showsPort?: (port: Port) => boolean;\n /** Screen-pixel hit radius. Default 8, the kit's `HANDLE_BASE_PX`. */\n hitRadiusPx?: number;\n /** Screen-pixel size of the painted mark: a square's side, or a circle's\n * diameter. Default 7. Omit `paint` entirely by passing 0 — a port the\n * consumer draws itself is still hittable. */\n sizePx?: number;\n /** One fill for every port, or a function of the port — its `type`, say. */\n fill?: CommandFill | ((port: Port) => CommandFill);\n stroke?: CommandStroke;\n /** Default `'square'`. */\n shape?: 'square' | 'circle';\n cursor?: CursorSpec;\n /** Default `'exclusive'` on pointer gestures: a drag from a port is a\n * connect, never a move of the node underneath it. */\n strength?: 'exclusive' | 'shared';\n}\n\nconst DEFAULT_HIT_PX = 8;\nconst DEFAULT_SIZE_PX = 7;\n\n/** Read a port press's scratch back off the hit an action was handed. */\nexport function portScratchOf(hit: { payload?: unknown } | null | undefined): PortScratch | null {\n const payload = hit?.payload as PortScratch | undefined;\n return payload !== undefined && typeof payload.portId === 'string' ? payload : null;\n}\n\nfunction withPaint(paint: AffordanceRegion['paint']): { paint?: NonNullable<AffordanceRegion['paint']> } {\n return paint === undefined ? {} : { paint };\n}\n\n/**\n * The affordance. Compose it into a layer with `composeAffordanceLayer` and\n * attach that with `CanvasExtensionApi.registerLayer` — the only attach route\n * that is hit-tested. A `Contribution.overlay` is painted and never hit.\n */\nexport function createPortAffordance<TPose>(\n participants: ParticipantSource<TPose>,\n opts: PortAffordanceOptions<TPose> = {},\n): Affordance {\n const {\n id = PORT_LAYER_ID,\n hitRadiusPx = DEFAULT_HIT_PX,\n sizePx = DEFAULT_SIZE_PX,\n strength = 'exclusive',\n } = opts;\n const portOpts = {\n ...(opts.geometry ? { geometry: opts.geometry } : {}),\n ...(opts.read ? { read: opts.read } : {}),\n };\n const paintOf = (port: Port): AffordanceRegion['paint'] => {\n if (sizePx <= 0) return undefined;\n const fill = typeof opts.fill === 'function' ? opts.fill(port) : opts.fill;\n const look = { ...(fill ? { fill } : {}), ...(opts.stroke ? { stroke: opts.stroke } : {}) };\n if (opts.shape !== 'circle') return { kind: 'square', sizePx, ...look };\n return {\n kind: 'custom',\n // An affordance layer paints in screen pixels, so the mark stays one size at any zoom.\n draw: ({ world, view }) => {\n const t = viewToTransform(view);\n const x = t.panX + world.x * t.zoom.x - sizePx / 2;\n const y = t.panY + world.y * t.zoom.y - sizePx / 2;\n return [{ kind: 'path', path: ellipsePath({ x, y, width: sizePx, height: sizePx }), ...look }];\n },\n };\n };\n\n return {\n id,\n regions(state: ChromeState): readonly AffordanceRegion[] {\n const out: AffordanceRegion[] = [];\n for (const participant of participants()) {\n if (!offersPorts(participant, state)) continue;\n const { node, pose } = participant;\n if (opts.shows !== undefined && !opts.shows(node, state)) continue;\n for (const port of portsOf(node, pose, portOpts)) {\n if (opts.showsPort !== undefined && !opts.showsPort(port)) continue;\n out.push({\n id: `${node.id}:${port.id}`,\n targetId: null,\n shape: { kind: 'point', x: port.point.x, y: port.point.y, hitRadiusPx },\n ...withPaint(paintOf(port)),\n ...(opts.cursor !== undefined ? { cursor: opts.cursor } : {}),\n strength,\n claimedKinds: ['pointer'],\n bind: () => ({\n initialScratch: {\n targetId: node.id,\n nodeId: node.id,\n portId: port.id,\n port,\n } satisfies PortScratch,\n }),\n });\n }\n }\n return out;\n },\n };\n}\n","/**\n * The connect gesture — dragging one port onto another to author an edge.\n *\n * Connect is an ordinary drag binding, not a mode and not a tool of its own:\n * the binding is gated on a press landing on a port affordance, so a connect\n * starts from whatever tool happens to be active, and a press that is *not* on\n * a port falls through to the tool that wants it.\n *\n * *Which presses start a connect* is routing, and belongs to the binding spec.\n * *Which ports a live connect may land on* cannot be routing — the dispatcher\n * never re-reads the affordance under a moving pointer — so `canConnect`\n * filters the candidate set: the preview will not snap to an illegal port and\n * a release over it commits nothing.\n *\n * One resolver answers both the live preview and the commit, so the preview\n * cannot lie about what releasing will do.\n */\nimport {\n type Action,\n type GestureBinding,\n type InvocationCtx,\n type OngoingHandle,\n type OngoingOverlay,\n type PoseDescriptor,\n type Stroke,\n type Vec2,\n} from '@weasel-js/core';\nimport { EDGE_DERIVE_PATH, ROUTERS, type Router } from './edge';\nimport type { DiagramEdge } from './edgeTrait';\nimport {\n PORT_AFFORDANCE_KIND, offersPorts, portScratchOf, type ParticipantSource,\n} from './portAffordance';\nimport { portsOf } from './ports';\nimport type { DiagramNodeReader } from './trait';\nimport type { Port } from './types';\n\n/** The default action id, and what {@link connectBinding} points at. */\nexport const CONNECT_ACTION_ID = 'diagram.connect';\n\n/** Whether an edge may run from `from` to `to`. */\nexport type CanConnect = (from: Port, to: Port) => boolean;\n\n/** The edge a finished connect describes. Both ends are resolved ports, so a\n * consumer minting the node has nothing left to look up. */\nexport interface PendingEdge {\n from: Port;\n to: Port;\n /** Registry key for the router the new edge should name. */\n router: string;\n}\n\n/**\n * The shipped policy: a port may not join itself, and two ports that both\n * declare a `type` must declare the same one.\n *\n * A port with no type joins anything. Two different ports on the *same node*\n * may be joined: a self-edge is meaningful in a state machine.\n */\nexport const defaultCanConnect: CanConnect = (from, to) => {\n if (from.nodeId === to.nodeId && from.id === to.id) return false;\n if (from.type === undefined || to.type === undefined) return true;\n return from.type === to.type;\n};\n\n/** Options for {@link createConnectAction}. Only `participants` is required. */\nexport interface ConnectActionOptions<TPose> {\n /** Where the droppable ports come from. The same source the port affordance\n * reads, so what is grabbable and what is landable cannot disagree. */\n participants: ParticipantSource<TPose>;\n /** Default {@link CONNECT_ACTION_ID}. */\n id?: string;\n read?: DiagramNodeReader;\n geometry?: PoseDescriptor<TPose>;\n /** Default {@link defaultCanConnect}. */\n canConnect?: CanConnect;\n /** Which ports a connect may land on: a port this turns away is never a\n * target. The port affordance's option of the same name, so a port that is\n * not shown cannot be dropped onto. Default: all of them. */\n showsPort?: (port: Port) => boolean;\n /** How near the pointer must come to a port, in world units, before the\n * edge snaps to it. Default 16. */\n snapRadius?: number;\n /** Registry key the new edge names, and the router the preview draws with.\n * Default `'straight'`. */\n router?: string;\n routers?: Readonly<Record<string, Router>>;\n /**\n * Mints and commits the edge. Called once, on release over a valid port.\n *\n * Defaults to {@link commitEdgeToScene} against `deps.scene`. Override it to\n * choose the edge node's data, its layer, or its stroke.\n */\n commit?: (edge: PendingEdge, ctx: InvocationCtx) => void;\n}\n\nconst DEFAULT_SNAP = 16;\n/** What a connect-authored edge is drawn with, when the consumer overrides\n * nothing. */\nexport const DEFAULT_EDGE_STROKE: Stroke = {\n paint: { color: '#7ba7c7' },\n width: 2,\n markerEnd: 'arrow',\n};\nconst DEFAULT_ROUTER = 'straight';\n\ninterface ConnectScratch {\n from: Port;\n current: Vec2;\n open: boolean;\n /** The deps bag as it was at `start`. The dispatcher builds it once, so\n * every later pump event carries `deps: {}` — an action that reads a dep at\n * commit time reads nothing and commits nothing, silently. */\n deps: InvocationCtx['deps'];\n}\n\n/**\n * The binding that starts a connect: a drag whose press landed on the port\n * layer's own chrome.\n *\n * The string form of `target` rather than a predicate, because it ranks higher\n * in specificity: a bare `{ kind: 'drag' }` on the select tool cannot outrank it.\n */\nexport function connectBinding(actionId: string = CONNECT_ACTION_ID): GestureBinding {\n return {\n spec: { kind: 'drag', target: `affordance:${PORT_AFFORDANCE_KIND}` },\n actionId,\n };\n}\n\n/** The action id that absorbs a press on a port. */\nexport const GRAB_PORT_ACTION_ID = 'diagram.grabPort';\n\n/**\n * Absorbs a press on a port, and does nothing else.\n *\n * A port claims the press **protocol**, not one gesture in it: `pointerDown`,\n * `click` and `drag` are a single claimable `'pointer'` token, and an exclusive\n * claim bars every binding whose target does not consult the affordance. So a\n * bundle that binds only `drag` leaves the pointerdown with nowhere to go, and\n * the dispatcher drops the press — the drag it would have grown into never\n * happens.\n */\nexport function grabPortAction(id: string = GRAB_PORT_ACTION_ID): Action {\n return {\n id,\n label: 'Grab port',\n group: 'diagram',\n invoker: { timing: 'immediate', run: () => {} },\n enabled: () => true as const,\n };\n}\n\n/** The two bindings that keep a port's claim from dropping the press. */\nexport function grabPortBindings(actionId: string = GRAB_PORT_ACTION_ID): GestureBinding[] {\n return [\n { spec: { kind: 'pointerDown', target: `affordance:${PORT_AFFORDANCE_KIND}` }, actionId },\n { spec: { kind: 'click', target: `affordance:${PORT_AFFORDANCE_KIND}` }, actionId },\n ];\n}\n\n/**\n * The default commit: one leaf node carrying the edge trait, added to\n * `deps.scene`. One `add` is one history entry, so the edge undoes in one.\n *\n * The edge lands on the **source node's** layer rather than the bottom one.\n */\nexport function commitEdgeToScene(edge: PendingEdge, ctx: InvocationCtx): void {\n const scene = ctx.deps.scene;\n if (scene === undefined) return;\n const trait: DiagramEdge = {\n from: { port: edge.from.id },\n to: { port: edge.to.id },\n router: edge.router,\n };\n const source = scene.get(edge.from.nodeId as never);\n scene.add({\n kind: 'leaf',\n layer: source?.layer ?? scene.layers[0]!.id,\n pose: { x: 0, y: 0, width: 0, height: 0 } as never,\n data: { diagram: trait, stroke: DEFAULT_EDGE_STROKE } as never,\n dependsOn: [edge.from.nodeId as never, edge.to.nodeId as never],\n // Without this the edge re-resolves on every dependency move and paints\n // nothing. `EDGE_DERIVE_PATH` rather than a fresh `edgeDerivePath()` so the\n // scene can find its registry key and the edge survives `toJSON`.\n derivePath: EDGE_DERIVE_PATH as never,\n });\n}\n\n/**\n * The `diagram.connect` action: an ongoing drag whose preview is an ephemeral\n * edge and whose commit is one op batch.\n */\nexport function createConnectAction<TPose>(opts: ConnectActionOptions<TPose>): Action {\n const {\n id = CONNECT_ACTION_ID,\n canConnect = defaultCanConnect,\n snapRadius = DEFAULT_SNAP,\n router: routerKey = DEFAULT_ROUTER,\n commit = commitEdgeToScene,\n } = opts;\n const routers = opts.routers ?? ROUTERS;\n const portOpts = {\n ...(opts.geometry ? { geometry: opts.geometry } : {}),\n ...(opts.read ? { read: opts.read } : {}),\n };\n const route: Router = routers[routerKey] ?? routers['straight'] ?? ROUTERS['straight']!;\n\n /** The port the pointer is over and may legally land on, or `null`.\n * `view` is the one the drag started in, whose layers it may land on. */\n function targetPort(from: Port, at: Vec2, view: Parameters<typeof offersPorts>[1]): Port | null {\n let best: Port | null = null;\n let bestD2 = snapRadius * snapRadius;\n for (const participant of opts.participants()) {\n if (!offersPorts(participant, view)) continue;\n for (const port of portsOf(participant.node, participant.pose, portOpts)) {\n if (opts.showsPort !== undefined && !opts.showsPort(port)) continue;\n if (!canConnect(from, port)) continue;\n const d2 = (port.point.x - at.x) ** 2 + (port.point.y - at.y) ** 2;\n if (d2 <= bestD2) {\n bestD2 = d2;\n best = port;\n }\n }\n }\n return best;\n }\n\n /** The end the edge currently runs to: a snapped port, or the bare pointer.\n * A free end is a port with no facing, so a router aims straight at it. */\n function endAt(scratch: ConnectScratch, at: Vec2): { port: Port | null; end: Port } {\n const port = targetPort(scratch.from, at, scratch.deps.view);\n return {\n port,\n end: port ?? { id: '', nodeId: '', point: at, normal: null },\n };\n }\n\n return {\n id,\n label: 'Connect',\n group: 'diagram',\n requires: ['scene'],\n invoker: {\n timing: 'ongoing',\n start(ctx: InvocationCtx): OngoingHandle {\n const pressed = portScratchOf(ctx.drag?.affordance);\n // Not a port press. The binding spec is the gate; this is the backstop,\n // and an empty handle is how the dispatcher is told to fall through.\n if (pressed === null) return {};\n const scratch: ConnectScratch = {\n from: pressed.port,\n current: { x: ctx.world.x, y: ctx.world.y },\n open: true,\n deps: ctx.deps,\n };\n\n return {\n kind: 'diagram-connect',\n onMove(moveCtx: InvocationCtx): void {\n scratch.current = { x: moveCtx.world.x, y: moveCtx.world.y };\n },\n overlay(): OngoingOverlay | null {\n if (!scratch.open) return null;\n const { end } = endAt(scratch, scratch.current);\n const points = route({ from: scratch.from, to: end, waypoints: [] });\n if (points.length < 2) return null;\n // How a connector reads belongs to whatever surface paints the role.\n return { kind: 'polyline', points, role: 'connector' };\n },\n onEnd(endCtx: InvocationCtx, reason: 'commit' | 'cancel'): void {\n scratch.open = false;\n if (reason === 'cancel') return;\n const { port } = endAt(scratch, { x: endCtx.world.x, y: endCtx.world.y });\n if (port === null) return;\n // World and modifiers from the release; deps from the press.\n commit(\n { from: scratch.from, to: port, router: routerKey },\n { ...endCtx, deps: scratch.deps },\n );\n },\n };\n },\n },\n enabled: () => true as const,\n };\n}\n","/**\n * The port affordance, composed into a layer and pointed at a scene.\n */\nimport {\n composeAffordanceLayer,\n effectivePose,\n nodeGates,\n type GatedLayer,\n type RenderLayer,\n} from '@weasel-js/core';\nimport {\n PORT_LAYER_ID,\n createPortAffordance,\n type ParticipantPose,\n type ParticipantSource,\n type PortAffordanceOptions,\n} from './portAffordance';\nimport type { GraphNodeLike } from './graph';\n\n/** The minimum a participant source needs from a scene. Narrower than `Scene`\n * so a consumer can pass anything that answers these. `layers` and each\n * node's `layer`, `parent`, `hidden` and `locked` feed `nodeGates`; a stand-in\n * without them gates nothing. */\nexport interface ParticipantScene<TPose> {\n readonly layers?: readonly GatedLayer[];\n renderOrderNodes(): readonly {\n id: string;\n kind: 'leaf' | 'container';\n layer?: string;\n parent?: string | null;\n hidden?: boolean;\n locked?: boolean;\n data: unknown;\n pose: TPose;\n dependsOn?: readonly string[] | 'children';\n }[];\n readonly overrides: { read(id: string): { pose?: TPose } | undefined };\n get(id: string): unknown;\n childrenOf(id: string): readonly string[];\n}\n\n/**\n * Every node in `scene`, at the pose it is **painted** at, marked `hidden` or\n * `locked` where the scene's `nodeGates` says so, and carrying its `layer` so\n * a view that does not paint that layer can turn its ports away too. The\n * marks keep ports off such a node; the graph reads past them, so a hidden\n * node is still laid out.\n *\n * `effectivePose`, not `node.pose`: an override is what a gesture is currently\n * showing, and a port that answers from the document pose while its node is\n * mid-drag sits somewhere the user can see the node is not.\n *\n * One source answers both the ports and the graph.\n */\nexport function sceneParticipants<TPose>(\n scene: ParticipantScene<TPose>,\n): () => Iterable<ParticipantPose<TPose> & { node: GraphNodeLike }> {\n return function* () {\n const gates = nodeGates(scene as never);\n for (const node of scene.renderOrderNodes()) {\n const hidden = gates.hidden(node.id);\n const locked = gates.locked(node.id);\n yield {\n node: node as GraphNodeLike,\n pose: effectivePose(scene as never, node as never) as TPose,\n ...(node.layer !== undefined ? { layer: node.layer } : {}),\n ...(hidden ? { hidden } : {}),\n ...(locked ? { locked } : {}),\n };\n }\n };\n}\n\n/**\n * The composed layer, ready for `CanvasExtensionApi.registerLayer` — the only\n * attach route that is hit-tested. Handing this to `SceneCanvas`'s `layers`\n * prop, or to a `Contribution.overlay`, paints the ports and makes none of them\n * grabbable.\n */\nexport function portLayer<TPose>(\n participants: ParticipantSource<TPose>,\n opts: PortAffordanceOptions<TPose> = {},\n): RenderLayer<unknown> & { hitTest: NonNullable<RenderLayer<unknown>['hitTest']> } {\n return composeAffordanceLayer(\n opts.id ?? PORT_LAYER_ID,\n 'Diagram ports',\n [createPortAffordance(participants, opts)],\n ) as unknown as RenderLayer<unknown> & { hitTest: NonNullable<RenderLayer<unknown>['hitTest']> };\n}\n","/**\n * The plugin as a `Contribution` bundle — one object a consumer hands to\n * `<SceneCanvas ambient={…}>`.\n *\n * **Ambient, not a tool.** A port is grabbable whatever tool is active:\n * `claimed` makes the bundle live for a press the port layer's affordance\n * claimed, and dormant otherwise.\n *\n * **The layer is not in here, on purpose.** `Contribution.overlay` is painted\n * and never hit-tested — only `CanvasExtensionApi.registerLayer` gets a\n * `hitTest` call — so the port layer as an overlay would paint every port and\n * make none of them grabbable. {@link diagramPorts} hands back both.\n */\nimport type { Contribution, RenderLayer } from '@weasel-js/core';\nimport {\n CONNECT_ACTION_ID,\n connectBinding,\n createConnectAction,\n grabPortAction,\n grabPortBindings,\n type ConnectActionOptions,\n} from './connect';\nimport { portLayer } from './portLayer';\nimport type { PortAffordanceOptions } from './portAffordance';\n\nexport { CONNECT_ACTION_ID };\n\n/** The connect action's options and the port affordance's, in one bag. */\nexport interface DiagramContributionOptions<TPose>\n extends ConnectActionOptions<TPose>, PortAffordanceOptions<TPose> {}\n\n/** The bundle: the connect action and the one binding that reaches it. */\nexport function createDiagramContribution<TPose>(\n opts: DiagramContributionOptions<TPose>,\n): Contribution {\n const actionId = opts.id ?? CONNECT_ACTION_ID;\n return {\n id: 'weasel-diagram',\n eligibility: { claimed: true },\n actions: [createConnectAction({ ...opts, id: actionId }), grabPortAction()],\n bindings: [connectBinding(actionId), ...grabPortBindings()],\n };\n}\n\n/**\n * Both halves of the port affordance: the layer to `registerLayer`, and the\n * contribution to pass as `ambient`.\n *\n * They are returned together because attaching one without the other fails\n * quietly — the layer alone paints ports that start no gesture, and the\n * contribution alone binds an affordance kind nothing ever reports.\n */\nexport function diagramPorts<TPose>(opts: DiagramContributionOptions<TPose>): {\n layer: RenderLayer<unknown>;\n contribution: Contribution;\n} {\n return {\n layer: portLayer(opts.participants, opts),\n contribution: createDiagramContribution(opts),\n };\n}\n","/**\n * Which group holds what, settled once for both readers of groups: the scene\n * graph a layout runs over, and the data a diagram is built from.\n *\n * A group names nodes and other groups. A node belongs to the first group that\n * names it and a group to the first group that names it, in source order; a\n * membership that would make a group its own ancestor is ignored, and so is an\n * id that is neither. A group with no node anywhere inside it is dropped.\n */\n\n/** A group as declared: its id and the ids it names. */\nexport interface DeclaredGroup {\n id: string;\n members: readonly string[];\n}\n\n/** A group with its place in the tree settled. */\nexport interface NestedGroup {\n id: string;\n /** The nodes and groups directly inside, in the order they were named. */\n direct: string[];\n /** Every node inside, through any nested group, in that same order. */\n members: string[];\n /** The group this one is directly inside. */\n parent?: string;\n}\n\nexport function nestGroups(\n declared: readonly DeclaredGroup[],\n isNode: (id: string) => boolean,\n): NestedGroup[] {\n const groupIds = new Set(declared.map((g) => g.id));\n const parentOf = new Map<string, string>();\n const claimedNodes = new Set<string>();\n const direct = new Map<string, string[]>();\n\n const isAncestorOrSelf = (candidate: string, of: string): boolean => {\n for (let at: string | undefined = of; at !== undefined; at = parentOf.get(at)) {\n if (at === candidate) return true;\n }\n return false;\n };\n\n for (const group of declared) {\n const own: string[] = [];\n for (const id of group.members) {\n if (isNode(id)) {\n if (claimedNodes.has(id)) continue;\n claimedNodes.add(id);\n own.push(id);\n } else if (groupIds.has(id) && !parentOf.has(id) && !isAncestorOrSelf(id, group.id)) {\n parentOf.set(id, group.id);\n own.push(id);\n }\n }\n direct.set(group.id, own);\n }\n\n const flat = new Map<string, string[]>();\n const flatten = (id: string): string[] => {\n const known = flat.get(id);\n if (known !== undefined) return known;\n const out: string[] = [];\n for (const member of direct.get(id)!) {\n if (groupIds.has(member)) out.push(...flatten(member));\n else out.push(member);\n }\n flat.set(id, out);\n return out;\n };\n\n const live = new Set(declared.filter((g) => flatten(g.id).length > 0).map((g) => g.id));\n return declared.filter((g) => live.has(g.id)).map((g) => {\n const parent = parentOf.get(g.id);\n return {\n id: g.id,\n direct: direct.get(g.id)!.filter((id) => !groupIds.has(id) || live.has(id)),\n members: flat.get(g.id)!,\n ...(parent !== undefined ? { parent } : {}),\n };\n });\n}\n","/**\n * `Graph` — the adjacency index a layout runs over.\n *\n * Built from the scene on demand, used, and thrown away. Rebuilding per layout\n * invocation is deliberate — a maintained index is a cache to invalidate on\n * every add, delete, reparent, and `dependsOn` edit, and layout is not on the\n * hot path.\n */\nimport { AUTO_POSE_DESCRIPTOR, type PoseDescriptor, type Vec2 } from '@weasel-js/core/math';\nimport { expandGroupEdges, insetOf, type GroupInset } from './cluster';\nimport { diagramEdgeOf, layoutOwnsRoute } from './edgeTrait';\nimport { nestGroups } from './groupTree';\nimport { diagramLabelOf, type DiagramLabel } from './labelTrait';\nimport type { Bounds, Outline } from './outline';\nimport { diagramNodeOf, type DiagramNodeLike, type DiagramNodeReader } from './trait';\nimport type { PortSpec } from './types';\n\n/** A scene node as the graph reads it. `dependsOn` is what an edge's two\n * endpoints are: the edge trait names *ports*, and the nodes those ports are\n * on are the dependencies the derivation already runs on. */\nexport interface GraphNodeLike extends DiagramNodeLike {\n dependsOn?: readonly string[] | 'children';\n}\n\n/** Where the graph gets its nodes. The same thunk shape the port affordance\n * takes, so one source answers both. */\nexport type GraphSource<TPose> = () => Iterable<{ node: GraphNodeLike; pose: TPose }>;\n\n/** One participant. */\nexport interface GraphNode {\n id: string;\n /** Where it is now, in world coordinates. */\n bounds: Bounds;\n /** Layout must not move it. */\n pinned: boolean;\n /** The innermost group it belongs to, when it belongs to one. */\n group?: string;\n /** Where its ports sit. Absent, the four compass midpoints\n * (`DEFAULT_PORTS`). */\n ports?: readonly PortSpec[];\n /** The shape its ports are cast onto, as `portsOf` casts them. Absent,\n * its bounds. */\n outline?: Outline;\n /** How far past `bounds` it reaches (`DiagramNode.margin`). `planOf` lays\n * it out as that much bigger. */\n margin?: GroupInset;\n}\n\n/** A box drawn around some participants, which a layout keeps together and\n * leaves room for. */\nexport interface GraphGroup {\n id: string;\n /** Every participant inside, through any group nested in this one, in\n * source order. */\n members: readonly string[];\n /** Room the box keeps around what it holds, in world units. */\n inset: GroupInset;\n /** The narrowest its box may be across the world x axis, which a layout\n * leaves room for. */\n minWidth?: number;\n /** The group this one is directly inside. */\n parent?: string;\n}\n\n/** One connection. `id` is the edge node's own id, so a caller can go back to\n * the scene for its trait. */\nexport interface GraphEdge {\n id: string;\n from: string;\n to: string;\n /** The port it leaves `from` by, when it names one. */\n fromPort?: string;\n /** The port it arrives at `to` by, when it names one. */\n toPort?: string;\n /** Room its label needs: the label's box, and how far its near side sits\n * from the wire (`DiagramLabel.offset`). `layered` sets the label beside\n * its wire in a rank of its own. */\n label?: EdgeLabelRoom;\n /** Where its route runs now, from `from` to `to`. `layered` starts each\n * placeholder where the route already crosses that rank, so a re-run keeps\n * the order the last one settled on. */\n waypoints?: readonly Vec2[];\n /** Its route is someone's own: layout leaves it, and keeps no room for it\n * in the ranks it crosses. */\n authored?: boolean;\n /** The edge as drawn, when this one stands in for an edge to or from a\n * group (see `expandGroupEdges`). */\n origin?: { id: string; from: string; to: string };\n}\n\n/** The room a {@link GraphEdge}'s label takes, in world units. */\nexport interface EdgeLabelRoom {\n width: number;\n height: number;\n /** Between the wire and the label's near side, to the left of the\n * direction of travel; negative for the right. Default 0, which centers\n * the label on the wire. */\n offset?: number;\n}\n\n/**\n * Nodes, edges, and the two adjacency reads a layout needs.\n *\n * Every list is in source order — render order, when the source is a scene —\n * which is what a layout's tiebreaks resolve against.\n */\nexport interface Graph {\n readonly nodes: readonly GraphNode[];\n readonly edges: readonly GraphEdge[];\n /** Absent or empty for a graph with no groups. */\n readonly groups?: readonly GraphGroup[];\n node(id: string): GraphNode | undefined;\n /** Edges leaving `id`, in source order. */\n outgoing(id: string): readonly GraphEdge[];\n /** Edges arriving at `id`, in source order. */\n incoming(id: string): readonly GraphEdge[];\n}\n\n/** Options for {@link buildGraph}: how the trait is read, and how a pose\n * yields bounds. Both default to the kit's own. */\nexport interface BuildGraphOptions<TPose> {\n read?: DiagramNodeReader;\n geometry?: PoseDescriptor<TPose>;\n}\n\n/**\n * Read a graph out of a source of scene nodes.\n *\n * A node is an edge if it carries the edge trait and names exactly two\n * dependencies; a group if its trait carries `group`, with its dependencies as\n * its members, which may be groups themselves (see `nestGroups`); a participant if the reader hands back any other\n * `DiagramNode`; and otherwise not in the diagram at all. An edge whose\n * endpoints are not both participants or groups is dropped, and an edge to a\n * group ranks against its members (see `expandGroupEdges`).\n */\nexport function buildGraph<TPose>(\n source: GraphSource<TPose>,\n opts: BuildGraphOptions<TPose> = {},\n): Graph {\n const geometry = opts.geometry ?? (AUTO_POSE_DESCRIPTOR as PoseDescriptor<TPose>);\n const nodes: GraphNode[] = [];\n const byId = new Map<string, GraphNode>();\n const candidates: GraphEdge[] = [];\n const groupNodes: { id: string; members: readonly string[]; inset: GroupInset; minWidth?: number }[] = [];\n const routed = new Set<string>();\n const rooms = new Map<string, EdgeLabelRoom>();\n\n for (const { node, pose } of source()) {\n const edge = diagramEdgeOf(node);\n if (edge !== null) {\n const deps = node.dependsOn;\n if (Array.isArray(deps) && deps.length === 2) {\n candidates.push({\n id: node.id,\n from: deps[0]!,\n to: deps[1]!,\n ...(edge.from.port !== undefined ? { fromPort: edge.from.port } : {}),\n ...(edge.to.port !== undefined ? { toPort: edge.to.port } : {}),\n ...(edge.waypoints !== undefined && edge.waypoints.length > 0 ? { waypoints: edge.waypoints } : {}),\n ...(layoutOwnsRoute(edge) ? {} : { authored: true }),\n });\n if (layoutOwnsRoute(edge)) routed.add(node.id);\n }\n continue;\n }\n const label = diagramLabelOf(node);\n if (label !== null) {\n const deps = node.dependsOn;\n if (Array.isArray(deps) && deps.length === 1 && labelFollowsLayout(label.at) && !rooms.has(deps[0]!)) {\n const { width, height } = geometry.getBounds(pose);\n rooms.set(deps[0]!, { width, height, ...(label.offset ? { offset: label.offset } : {}) });\n }\n continue;\n }\n const trait = diagramNodeOf(node, opts.read);\n if (trait === null) continue;\n if (trait.group !== undefined) {\n const deps = node.dependsOn;\n groupNodes.push({\n id: node.id,\n members: Array.isArray(deps) ? deps : [],\n inset: insetOf(trait.group.inset),\n ...(trait.group.minWidth !== undefined ? { minWidth: trait.group.minWidth } : {}),\n });\n continue;\n }\n const entry: GraphNode = {\n id: node.id,\n bounds: geometry.getBounds(pose),\n pinned: trait.pinned === true,\n ...(trait.ports !== undefined ? { ports: trait.ports } : {}),\n ...(trait.outline !== undefined ? { outline: trait.outline } : {}),\n ...(trait.margin !== undefined ? { margin: trait.margin } : {}),\n };\n nodes.push(entry);\n byId.set(entry.id, entry);\n }\n\n const declared = new Map(groupNodes.map((g) => [g.id, g]));\n const live: GraphGroup[] = nestGroups(groupNodes, (id) => byId.has(id)).map((g) => {\n for (const id of g.direct) {\n const node = byId.get(id);\n if (node !== undefined) node.group = g.id;\n }\n return {\n id: g.id,\n members: g.members,\n inset: declared.get(g.id)!.inset,\n ...(declared.get(g.id)!.minWidth !== undefined ? { minWidth: declared.get(g.id)!.minWidth } : {}),\n ...(g.parent !== undefined ? { parent: g.parent } : {}),\n };\n });\n const known = (id: string) => byId.has(id) || live.some((g) => g.id === id);\n // Room beside layout's own route only: an author's waypoints say where the\n // wire goes, and the label goes with it.\n const roomed = candidates.map((e) => {\n const room = rooms.get(e.id);\n return room !== undefined && routed.has(e.id) ? { ...e, label: room } : e;\n });\n const edges = expandGroupEdges(roomed.filter((e) => known(e.from) && known(e.to)), live);\n const out = new Map<string, GraphEdge[]>();\n const into = new Map<string, GraphEdge[]>();\n for (const edge of edges) {\n push(out, edge.from, edge);\n push(into, edge.to, edge);\n }\n\n const NONE: readonly GraphEdge[] = Object.freeze([]);\n return {\n nodes,\n edges,\n groups: live,\n node: (id) => byId.get(id),\n outgoing: (id) => out.get(id) ?? NONE,\n incoming: (id) => into.get(id) ?? NONE,\n };\n}\n\n/** Whether layout stations a label stationed at `at`: the default middle, or a\n * place among its edge's waypoints, which only layout hands out. A label put\n * at an end or a fraction stays there. */\nexport function labelFollowsLayout(at: DiagramLabel['at']): boolean {\n return at === 'mid' || typeof at === 'object';\n}\n\nfunction push(index: Map<string, GraphEdge[]>, key: string, edge: GraphEdge): void {\n const list = index.get(key);\n if (list === undefined) index.set(key, [edge]);\n else list.push(edge);\n}\n","/**\n * Marks: what a data node draws besides its rows. A drawn mark is SVG path\n * data in a unit square, stretched over the node's box, so it follows the node\n * wherever layout or a drag puts it. A text mark is pinned to a point on the box.\n */\nimport {\n commandFill,\n commandStroke,\n pathFromD,\n RECT_POSE_DESCRIPTOR,\n registerNodeShape,\n transformPath,\n type Fill,\n type NodeShapeEntry,\n type Path,\n type PoseDescriptor,\n type Stroke,\n} from '@weasel-js/core';\nimport type { Vec2 } from '@weasel-js/core/math';\nimport type { MeasureRowText, RowTextStyle } from './body';\nimport type { DiagramSpec, DiagramTextStyle, NodeStyle } from './fromData';\nimport { ANCHOR_DERIVE_POSE } from './group';\nimport type { Bounds } from './outline';\nimport { DIAGRAM_TRAIT_KEY } from './trait';\nimport type { PortAnchor } from './types';\n\n/** One mark on a `DataNode`. Colors default to the node's stroke and text. */\nexport type DataMark =\n | { d: string; fill?: string; stroke?: string; strokeWidth?: number; dash?: number[]; opacity?: number }\n | { text: string; at: PortAnchor; self?: PortAnchor; offset?: Vec2; color?: string; style?: RowTextStyle };\n\n/** The trait on a drawn mark's `data`: path data in a unit square. */\nexport interface DiagramMark { d: string }\n\n/** The mark a scene node carries, or null for a node that is not a drawn\n * mark: how `markShape` tells which nodes it paints. */\nexport function diagramMarkOf(node: { data: unknown }): DiagramMark | null {\n const data = node.data;\n if (data === null || typeof data !== 'object') return null;\n const trait = (data as Record<string, unknown>)[DIAGRAM_TRAIT_KEY];\n if (trait === null || typeof trait !== 'object' || !('mark' in trait)) return null;\n const mark = (trait as { mark: unknown }).mark;\n return mark !== null && typeof mark === 'object' && typeof (mark as DiagramMark).d === 'string'\n ? (mark as DiagramMark)\n : null;\n}\n\nconst PARSED = new Map<string, Path>();\nconst PARSED_MAX = 256;\n\nfunction unitPath(d: string, onWarn?: (message: string) => void): Path {\n let path = PARSED.get(d);\n if (path === undefined) {\n let warned = false;\n path = pathFromD(d, (message) => {\n warned = true;\n onWarn?.(message);\n });\n if (path.kind === 'polygon' && path.commands.length === 0) onWarn?.('it draws nothing');\n else if (!warned) {\n if (PARSED.size >= PARSED_MAX) PARSED.clear();\n PARSED.set(d, path);\n }\n }\n return path;\n}\n\n/** Parse a drawn mark's path data now, so a typo surfaces where the diagram\n * is built rather than at first paint. */\nfunction checkMarkPath(nodeId: string, index: number, d: string): void {\n unitPath(d, (message) => {\n throw new Error(`diagramScene: node \"${nodeId}\", mark ${index}: path data ${JSON.stringify(d)} does not parse: ${message}`);\n });\n}\n\n/** The painter for a drawn mark. */\nexport function markShape<TPose>(\n opts: { geometry?: PoseDescriptor<TPose> } = {},\n): NodeShapeEntry<unknown, TPose> {\n const geometry = opts.geometry ?? (RECT_POSE_DESCRIPTOR as PoseDescriptor<TPose>);\n return {\n id: 'diagram:mark',\n matches: (node) => diagramMarkOf(node) !== null,\n paint: (node, pose) => {\n const mark = diagramMarkOf(node);\n if (mark === null) return [];\n const box = geometry.getBounds(pose);\n const d = node.data as { fill?: Fill | null; stroke?: Stroke | null };\n const fill = d.fill && commandFill(d.fill, box);\n const stroke = d.stroke && commandStroke(d.stroke, box);\n return [{\n kind: 'path',\n path: transformPath(unitPath(mark.d), [box.width, 0, 0, box.height, box.x, box.y]),\n ...(fill ? { fill } : {}),\n ...(stroke ? { stroke } : {}),\n }];\n },\n };\n}\n\n/** Register {@link markShape}; returns the disposer. */\nexport function registerMarkShape<TPose>(opts: { geometry?: PoseDescriptor<TPose> } = {}): () => void {\n return registerNodeShape(markShape(opts), { priority: 'high' });\n}\n\n/** The specs for one node's marks. `box` is where the node stands. */\nexport function markSpecs(\n nodeId: string,\n marks: readonly DataMark[],\n box: Bounds,\n ctx: { style: NodeStyle; textStyle: (s: RowTextStyle | undefined) => DiagramTextStyle; measure: MeasureRowText },\n): DiagramSpec[] {\n return marks.map((mark, i): DiagramSpec => {\n const id = `${nodeId}/mark:${i}` as never;\n if ('d' in mark) {\n checkMarkPath(nodeId, i, mark.d);\n const paint = (color: string) => ({ color, ...(mark.opacity !== undefined ? { opacity: mark.opacity } : {}) });\n const stroke = mark.stroke ?? (mark.fill === undefined ? ctx.style.stroke : undefined);\n return {\n id,\n kind: 'leaf',\n layer: 'main',\n parent: nodeId as never,\n pickable: false,\n pose: { x: box.x, y: box.y, width: box.width, height: box.height },\n data: {\n diagram: { mark: { d: mark.d } },\n ...(mark.fill !== undefined ? { fill: { paint: paint(mark.fill) } } : {}),\n ...(stroke !== undefined\n ? { stroke: { paint: paint(stroke), width: mark.strokeWidth ?? 1.5, ...(mark.dash ? { dash: mark.dash } : {}) } }\n : {}),\n },\n };\n }\n const size = ctx.measure(mark.text, mark.style ?? {});\n const self = mark.self ?? mark.at;\n return {\n id,\n kind: 'leaf',\n layer: 'main',\n pickable: false,\n pose: {\n x: box.x + mark.at.u * box.width + (mark.offset?.x ?? 0) - self.u * size.width,\n y: box.y + mark.at.v * box.height + (mark.offset?.y ?? 0) - self.v * size.height,\n width: size.width,\n height: size.height,\n },\n data: {\n diagram: { anchor: { at: mark.at, self, ...(mark.offset ? { offset: mark.offset } : {}) } },\n text: mark.text,\n style: ctx.textStyle(mark.style),\n fill: { paint: { color: mark.color ?? ctx.style.text } },\n },\n dependsOn: [nodeId as never],\n derivePose: ANCHOR_DERIVE_POSE as never,\n };\n });\n}\n","/**\n * `diagramScene`'s groups: which nodes each one holds, and the box and label\n * it draws around them.\n */\nimport type { GroupInset } from './cluster';\nimport type { DataGroup, DiagramSceneData, DiagramSpec, NodeStyle } from './fromData';\nimport { ANCHOR_DERIVE_POSE, GROUP_DERIVE_POSE, boxAround, type DiagramAnchor } from './group';\nimport { nestGroups } from './groupTree';\n\n/** A group with its members settled and its inset worked out. */\nexport interface ResolvedGroup {\n group: DataGroup;\n /** The nodes and groups directly inside, which the box derives from. */\n direct: readonly string[];\n /** Every node inside, through any nested group. */\n members: readonly string[];\n /** The group this one is directly inside. */\n parent?: string;\n inset: GroupInset;\n pad: number;\n title: { width: number; height: number } | null;\n /** Room for the title across the box, when there is one. */\n minWidth?: number;\n}\n\n/**\n * Settle what each group holds (see `nestGroups`), outer groups ahead of the\n * groups inside them. A group left with no node inside it is dropped. Throws\n * on a group id already in `ids`, and adds each group's id to it.\n */\nexport function resolveGroups(\n groups: readonly DataGroup[],\n ids: Set<string>,\n nodeIds: ReadonlySet<string>,\n opts: { padding: number; title: (text: string) => { width: number; height: number } },\n): ResolvedGroup[] {\n for (const group of groups) {\n if (ids.has(group.id)) throw new Error(`diagramScene: group id \"${group.id}\" is already a node or group id`);\n ids.add(group.id);\n }\n const declared = new Map(groups.map((g) => [g.id, g]));\n const nested = nestGroups(groups, (id) => nodeIds.has(id));\n const depthOf = new Map<string, number>();\n const byId = new Map(nested.map((g) => [g.id, g]));\n const depth = (id: string): number => {\n const parent = byId.get(id)!.parent;\n let d = depthOf.get(id);\n if (d === undefined) depthOf.set(id, (d = parent === undefined ? 0 : depth(parent) + 1));\n return d;\n };\n // Stable, so groups at one depth keep the order they were declared in.\n return nested.map((g, i) => ({ g, i })).sort((a, b) => depth(a.g.id) - depth(b.g.id) || a.i - b.i).map(({ g }) => {\n const group = declared.get(g.id)!;\n const pad = group.padding ?? opts.padding;\n const title = group.label ? opts.title(group.label) : null;\n // The label sits in the top inset, half a pad above what the box holds.\n const inset = { top: pad + (title ? title.height + pad / 2 : 0), right: pad, bottom: pad, left: pad };\n return {\n group, direct: g.direct, members: g.members, inset, pad, title,\n ...(title ? { minWidth: title.width + 2 * pad } : {}),\n ...(g.parent !== undefined ? { parent: g.parent } : {}),\n };\n });\n}\n\ntype Rect = { x: number; y: number; width: number; height: number };\n\n/** A label on a wire, as a group box takes it in: the label node's id, and\n * where it sits when that is known before the scene derives it. */\nexport interface WireLabel {\n id: string;\n from: string;\n to: string;\n at: Rect | null;\n}\n\n/** The labels each group's box takes in: those on wires with both ends\n * inside it, each in the innermost group holding both. */\nexport function labelsByGroup(groups: readonly ResolvedGroup[], labels: readonly WireLabel[]): Map<string, WireLabel[]> {\n const byId = new Map(groups.map((g) => [g.group.id, g]));\n const holder = new Map<string, string>();\n for (const g of groups) for (const m of g.direct) holder.set(m, g.group.id);\n const ancestry = (id: string): string[] => {\n const out: string[] = [];\n for (let at = byId.has(id) ? byId.get(id)!.parent : holder.get(id); at !== undefined; at = byId.get(at)?.parent) out.push(at);\n return out;\n };\n const out = new Map<string, WireLabel[]>();\n for (const label of labels) {\n const up = new Set(ancestry(label.to));\n const shared = ancestry(label.from).find((g) => up.has(g));\n if (shared !== undefined) out.set(shared, [...(out.get(shared) ?? []), label]);\n }\n return out;\n}\n\n/** Each group's box around where its members were placed, and the labels\n * it takes in where they are known. */\nexport function groupBoxes(\n groups: readonly ResolvedGroup[],\n placedAt: ReadonlyMap<string, Rect>,\n labels: ReadonlyMap<string, readonly WireLabel[]> = new Map(),\n): Map<string, Rect> {\n const byId = new Map(groups.map((g) => [g.group.id, g]));\n const boxes = new Map<string, Rect>();\n const boxOf = (id: string): Rect => {\n const known = boxes.get(id);\n if (known !== undefined) return known;\n const g = byId.get(id)!;\n const rs = g.direct.map((m) => (byId.has(m) ? boxOf(m) : placedAt.get(m)!));\n for (const label of labels.get(id) ?? []) if (label.at !== null) rs.push(label.at);\n const x = Math.min(...rs.map((r) => r.x));\n const y = Math.min(...rs.map((r) => r.y));\n const box = boxAround({\n x,\n y,\n width: Math.max(...rs.map((r) => r.x + r.width)) - x,\n height: Math.max(...rs.map((r) => r.y + r.height)) - y,\n }, g);\n boxes.set(id, box);\n return box;\n };\n for (const g of groups) boxOf(g.group.id);\n return boxes;\n}\n\n/**\n * Each group's box, and its label when it has one, around where its members\n * were placed. In the order given, so an outer box paints behind the boxes\n * inside it. A box depends on its members and on the labels it takes in\n * (see {@link labelsByGroup}), so a wire's label stays inside it.\n */\nexport function groupSpecs(\n groups: readonly ResolvedGroup[],\n placedAt: ReadonlyMap<string, Rect>,\n styleOf: (group: DataGroup) => { style: NodeStyle; text: NonNullable<DiagramSceneData['style']> },\n wireLabels: readonly WireLabel[] = [],\n): DiagramSpec[] {\n const labels = labelsByGroup(groups, wireLabels);\n const boxes = groupBoxes(groups, placedAt, labels);\n const specs: DiagramSpec[] = [];\n for (const g of groups) {\n const { style, text } = styleOf(g.group);\n const { x, y, width, height } = boxes.get(g.group.id)!;\n specs.push({\n id: g.group.id as never,\n kind: 'leaf',\n layer: 'main',\n pose: { x, y, width, height },\n data: {\n diagram: { outline: 'rect', group: { inset: g.inset, ...(g.minWidth !== undefined ? { minWidth: g.minWidth } : {}) } },\n fill: { paint: { color: style.fill } },\n stroke: {\n paint: { color: style.stroke },\n width: style.strokeWidth ?? 1,\n ...(style.dash ? { dash: style.dash } : {}),\n },\n },\n dependsOn: [...g.direct, ...(labels.get(g.group.id) ?? []).map((l) => l.id)] as never[],\n derivePose: GROUP_DERIVE_POSE as never,\n });\n if (g.title === null || !g.group.label) continue;\n const anchor: DiagramAnchor = { at: { u: 0, v: 0 }, offset: { x: g.pad, y: g.pad } };\n specs.push({\n id: `${g.group.id}/label` as never,\n kind: 'leaf',\n layer: 'main',\n pickable: false,\n pose: { x: x + g.pad, y: y + g.pad, width: g.title.width, height: g.title.height },\n data: { diagram: { anchor }, text: g.group.label, style: text, fill: { paint: { color: style.text } } },\n dependsOn: [g.group.id as never],\n derivePose: ANCHOR_DERIVE_POSE as never,\n });\n }\n return specs;\n}\n","/** The scene specs `diagramScene` makes for edges and their labels. */\nimport { polylineFromPoints } from '@weasel-js/core';\nimport type { WireLabel } from './dataGroups';\nimport { EDGE_DERIVE_PATH } from './edge';\nimport type { MeasureRowText } from './body';\nimport type { DataEdge, DiagramSceneOptions, DiagramSpec, EdgeStyle } from './fromData';\nimport { LABEL_DERIVE_POSE, labelCenter } from './label';\nimport type { DiagramLabel } from './labelTrait';\nimport type { LayeredRoute } from './route';\n\nexport interface EdgeSpecContext {\n idOf: (edge: DataEdge) => string;\n font: { fontFamily: string; fontSize: number };\n measure: MeasureRowText;\n fallback: EdgeStyle;\n labelPlacement: DiagramLabel;\n /** Ports and waypoints by edge id, overriding the edge's own (from `layeredRoutes`). */\n routes?: ReadonlyMap<string, LayeredRoute> | null;\n opts: Pick<DiagramSceneOptions, 'edgeStyle' | 'router' | 'labelPlacement'>;\n}\n\n/** The face an edge label is set in: the diagram's, two sizes down. */\nexport const labelStyleOf = (font: { fontFamily: string; fontSize: number }) => ({ ...font, fontSize: font.fontSize - 2 });\n\n/** Where a label sits: beside the room layout left it, at the edge's own\n * offset or else the diagram's; else the edge's own placement, else the\n * diagram's. */\nfunction placementOf(e: DataEdge, route: LayeredRoute | undefined, ctx: EdgeSpecContext): DiagramLabel {\n const placement = e.labelPlacement ?? ctx.opts.labelPlacement ?? ctx.labelPlacement;\n return route?.labelAt === undefined ? placement : { ...placement, at: { near: route.labelAt } };\n}\n\n/** The box an edge's label takes, set in the diagram's label face. */\nfunction labelSizeOf(text: string, ctx: EdgeSpecContext): { width: number; height: number } {\n const style = labelStyleOf(ctx.font);\n return { width: ctx.measure(text, style).width, height: style.fontSize };\n}\n\n/** Each edge's label as a group's box takes it in: where it sits, when layout\n * stationed it beside its waypoints, else only its id. */\nexport function wireLabels(edges: readonly DataEdge[], ctx: EdgeSpecContext): WireLabel[] {\n const out: WireLabel[] = [];\n for (const e of edges) {\n if (!e.label) continue;\n const id = ctx.idOf(e);\n const route = ctx.routes?.get(id);\n const size = labelSizeOf(e.label, ctx);\n const placement = placementOf(e, route, ctx);\n const center = route?.waypoints !== undefined && typeof placement.at === 'object'\n ? labelCenter(polylineFromPoints([...route.waypoints]), placement, size)\n : null;\n out.push({\n id: `${id}/label`,\n from: e.from,\n to: e.to,\n at: center === null ? null : { x: center.x - size.width / 2, y: center.y - size.height / 2, ...size },\n });\n }\n return out;\n}\n\n/** An edge end naming `port`, marked as layout's when the author named none. */\nconst endOf = (own: string | undefined, port: string | undefined) =>\n !port ? {} : own === undefined ? { port, laidOut: port } : { port };\n\nexport function edgeSpecs(edges: readonly DataEdge[], ctx: EdgeSpecContext): DiagramSpec[] {\n const specs: DiagramSpec[] = [];\n for (const e of edges) {\n const id = ctx.idOf(e);\n const route = ctx.routes?.get(id);\n const { fromPort, toPort, waypoints } = route ?? {\n fromPort: e.fromPort ?? e.routedPorts?.from,\n toPort: e.toPort ?? e.routedPorts?.to,\n waypoints: e.waypoints ?? e.routed,\n };\n // Layout's own route, marked so a later layout of the live scene owns it.\n const laidOut = e.waypoints === undefined && waypoints !== undefined;\n const style = ctx.opts.edgeStyle?.(e) ?? ctx.fallback;\n const markerStart = style.markerStart ?? null;\n const markerEnd = style.markerEnd === undefined ? 'arrow' : style.markerEnd;\n specs.push({\n id: id as never,\n kind: 'leaf',\n layer: 'main',\n pickable: false,\n pose: { x: 0, y: 0, width: 0, height: 0 },\n data: {\n diagram: {\n from: endOf(e.fromPort, fromPort),\n to: endOf(e.toPort, toPort),\n router: e.router ?? ctx.opts.router ?? 'bezier',\n ...(waypoints ? { waypoints } : {}),\n ...(laidOut ? { laidOut: waypoints } : {}),\n },\n stroke: {\n paint: { color: style.stroke },\n width: style.width ?? 1.5,\n ...(style.dash ? { dash: style.dash } : {}),\n ...(markerStart !== null ? { markerStart } : {}),\n ...(markerEnd !== null ? { markerEnd } : {}),\n },\n },\n dependsOn: [e.from as never, e.to as never],\n derivePath: EDGE_DERIVE_PATH,\n });\n if (!e.label) continue;\n const labelStyle = labelStyleOf(ctx.font);\n specs.push({\n id: `${id}/label` as never,\n kind: 'leaf',\n layer: 'main',\n pickable: false,\n pose: { x: 0, y: 0, ...labelSizeOf(e.label, ctx) },\n data: {\n diagram: { label: placementOf(e, route, ctx) },\n text: e.label,\n style: labelStyle,\n fill: { paint: { color: style.label ?? style.stroke } },\n },\n dependsOn: [id as never],\n derivePose: LABEL_DERIVE_POSE as never,\n });\n }\n return specs;\n}\n","/**\n * `diagramScene` — a laid-out diagram from plain `{ nodes, edges }`.\n *\n * Every box is a `buildBody` body, so a data node can say anything a body\n * can: outline, rows, padding, ports. Sizes are estimated from character\n * counts unless `measure` is given, so layout runs without a canvas and gives\n * the same answer in node and in a browser.\n */\nimport type { AddNodeSpec, MarkerRef, RectPose, Stroke } from '@weasel-js/core';\nimport { DEFAULT_GROUP_INSET, expandGroupEdges } from './cluster';\nimport { groupSpecs, resolveGroups } from './dataGroups';\nimport { bodyTrait, buildBody, measureBody, sizeToBody, type BodySpec, type MeasureRowText, type Row, type RowTextStyle } from './body';\nimport { edgeSpecs, labelStyleOf, wireLabels } from './dataEdges';\nimport type { DiagramEdge } from './edgeTrait';\nimport { force } from './force';\nimport { grownBy } from './footprint';\nimport { labelFollowsLayout, type EdgeLabelRoom, type Graph, type GraphEdge, type GraphGroup, type GraphNode } from './graph';\nimport type { DiagramAnchor } from './group';\nimport type { DiagramLabel } from './labelTrait';\nimport { chain } from './chain';\nimport { layered } from './layered';\nimport { planOf, type LayoutFn, type LayoutOptions, type LayoutPorts } from './layout';\nimport { markSpecs, type DataMark, type DiagramMark } from './marks';\nimport type { Outline } from './outline';\nimport { authoredOver } from './route';\nimport { tree } from './tree';\nimport type { DiagramNode, PortSpec } from './types';\nimport type { Vec2 } from '@weasel-js/core/math';\n\n/** One node of a {@link DiagramData}: its rows of text, and optionally its outline, ports, size, and starting place. */\nexport interface DataNode {\n id: string;\n /** Shorthand for one `label` row per line. Ignored when `rows` is given. */\n lines?: readonly string[];\n rows?: readonly Row[];\n /** Default `DiagramSceneOptions.outline`, which defaults to `'rect'`. */\n outline?: Outline;\n /** Perimeter ports, replacing the four compass midpoints. */\n ports?: readonly PortSpec[];\n /** Labels for the perimeter ports by id, drawn outside the box beside each. */\n portLabels?: Readonly<Record<string, string>>;\n /** Layout leaves this node at `at`. */\n pinned?: boolean;\n /** Where the node starts, before layout. Unset, nodes start on the\n * diagonal in source order, which is what within-rank order is seeded\n * from. */\n at?: Vec2;\n /** The smallest the box may be. Its content grows it past this. */\n width?: number;\n height?: number;\n /** Default `DiagramSceneOptions.padding`. */\n padding?: number;\n /** Default `DiagramSceneOptions.gap`. */\n gap?: number;\n /** Default `DiagramSceneOptions.verticalAlign`. */\n verticalAlign?: BodySpec['verticalAlign'];\n /** Drawn over the box besides its rows: shapes in a unit square stretched\n * over it, and text pinned to a point on it. */\n marks?: readonly DataMark[];\n}\n\n/** One edge of a {@link DiagramData}, between two nodes or groups by id. */\nexport interface DataEdge {\n /** A node's id, or a group's: an edge naming a group meets its box. */\n from: string;\n to: string;\n /** The port to leave from or arrive at. Unset, the end facing the other\n * node most directly. */\n fromPort?: string;\n toPort?: string;\n label?: string;\n /** Where along the edge the label sits. Unset or at `'mid'`, under\n * `layered` the label sits in the room layout leaves it beside its wire,\n * at this placement's offset, else `DiagramSceneOptions.labelPlacement`'s;\n * otherwise at the placement. */\n labelPlacement?: DiagramLabel;\n /** Default `DiagramSceneOptions.router`. */\n router?: DiagramRouter;\n /** World points the route passes through. Layout does not move them. */\n waypoints?: readonly Vec2[];\n /** A route a layout run wrote, as `DiagramView`'s `onMove` reports it: drawn\n * until layout runs again, which may replace it. `waypoints` wins. */\n routed?: readonly Vec2[];\n /** Ports a layout run named, as `onMove` reports them: used like `routed`,\n * and not part of the edge's id. `fromPort` and `toPort` win. */\n routedPorts?: LayoutPorts;\n}\n\n/** A box drawn around some nodes, which layout keeps together. */\nexport interface DataGroup {\n /** Shares one namespace with node ids. */\n id: string;\n /** Node ids, and the ids of groups nested in this one. A node or group a\n * later group also names stays in this one; an id that is neither is\n * ignored, and so is one that would put a group inside itself. */\n members: readonly string[];\n /** Drawn inside the box, above its members. */\n label?: string;\n /** Between the box and its members, and around the label. Default\n * `DiagramSceneOptions.groupPadding`. */\n padding?: number;\n}\n\n/** A diagram as plain data, the input to `diagramScene`. */\nexport interface DiagramData {\n nodes: readonly DataNode[];\n edges: readonly DataEdge[];\n /** A group may be a member of another. `layered`, `tree`, and `force` keep\n * each group's members together; `chain` and `'none'` ignore groups but\n * still draw them. */\n groups?: readonly DataGroup[];\n}\n\n/** The colors and outline a node is drawn with. */\nexport interface NodeStyle {\n fill: string;\n stroke: string;\n text: string;\n strokeWidth?: number;\n dash?: number[];\n}\n\n/** The stroke, markers, and label color an edge is drawn with. */\nexport interface EdgeStyle {\n stroke: string;\n width?: number;\n dash?: number[];\n /** `null` for none. Default none. */\n markerStart?: MarkerRef | null;\n /** `null` for none. Default `'arrow'`. */\n markerEnd?: MarkerRef | null;\n /** Default `stroke`. */\n label?: string;\n}\n\n/** How an edge is drawn between its ends. */\nexport type DiagramRouter = 'straight' | 'bezier' | 'orthogonal';\n/** The face a diagram node's text is set in. */\nexport type DiagramTextStyle = { fontFamily: string; fontSize: number; fontWeight?: number };\n\n/** The `data` of a scene node `diagramScene` makes: its diagram role, and what it paints. */\nexport interface DiagramSceneData {\n diagram?: DiagramNode | DiagramEdge | { label: DiagramLabel } | { anchor: DiagramAnchor } | { mark: DiagramMark };\n fill?: { paint: { color: string; opacity?: number } };\n stroke?: Stroke;\n text?: string;\n style?: DiagramTextStyle;\n /** What a slot is filled with: an image the kit's image painter draws. */\n image?: { src: string; opacity?: number };\n}\n\n/** The frame an empty slot with an id draws, in the unit square a mark is drawn in. */\nexport const SLOT_FRAME = 'M0 0H1V1H0Z';\n\n/** A scene node spec, as `diagramScene` returns them. */\nexport type DiagramSpec = AddNodeSpec<DiagramSceneData, 'main', RectPose>;\n\n/** How `diagramScene` lays out, routes, and styles a {@link DiagramData}. */\nexport interface DiagramSceneOptions {\n /** A layout by name, or any `LayoutFn`. Default `'layered'`. `'none'`\n * leaves every node at its `at`. */\n layout?: 'layered' | 'tree' | 'force' | 'chain' | 'none' | LayoutFn;\n /** Merged over `{ order: 'barycenter' }`. */\n layoutOptions?: LayoutOptions;\n /** Default `'bezier'`. */\n router?: DiagramRouter;\n /** The text style rows fall back on. Default 12px sans-serif. */\n font?: { fontFamily: string; fontSize: number };\n /** Measures one run of text. Default an estimate from character count, so\n * layout needs no canvas; pass `canvasMeasure(ctx)` for real widths. */\n measure?: MeasureRowText;\n /** Default `'rect'`. */\n outline?: Outline;\n /** Between a box's outline and its rows. Default 8. */\n padding?: number;\n /** Between adjacent rows. Default 4. */\n gap?: number;\n /** Where a box's rows sit when it is taller than they need. Default `'center'`. */\n verticalAlign?: BodySpec['verticalAlign'];\n /** The narrowest a box may be. Default 64. */\n minWidth?: number;\n /** Where edge labels sit. Default `{ at: 'mid', offset: 9 }`. */\n labelPlacement?: DiagramLabel;\n nodeStyle?: (node: DataNode) => NodeStyle;\n /** Default 12. */\n groupPadding?: number;\n /** A group's box and label. `text` colors the label. */\n groupStyle?: (group: DataGroup) => NodeStyle;\n edgeStyle?: (edge: DataEdge) => EdgeStyle;\n}\n\nconst FONT = { fontFamily: 'sans-serif', fontSize: 12 };\nconst NODE: NodeStyle = { fill: '#16222c', stroke: '#7ba7c7', text: '#dbe7f2' };\nconst EDGE: EdgeStyle = { stroke: '#7ba7c7' };\nconst GROUP: NodeStyle = { fill: 'rgba(123, 167, 199, 0.08)', stroke: '#7ba7c7', text: '#9fbdd6', strokeWidth: 1, dash: [4, 3] };\n/** Where an edge label sits when neither the edge nor the scene says. */\nexport const LABEL_PLACEMENT: DiagramLabel = { at: 'mid', offset: 9 };\nconst LINE = 1.4;\nconst GLYPH = 0.6;\nconst MIN_WIDTH = 64;\nconst LAYOUTS = { layered, tree, force, chain } as const;\n\n/** A part of an edge id with its separators, and the `/` sub-specs append\n * after one, escaped by a backslash. */\nconst idPart = (s: string) => s.replace(/[\\\\.>:/]/g, '\\\\$&');\n\n/** The scene node id `diagramScene` gives an edge, built from its ends, ports,\n * and label. Two edges differing in any of those get different ids, an empty\n * port or label included: a `.`, `>`, `:`, `/` or `\\` in one of them is\n * escaped with a backslash. */\nexport const edgeIdOf = (e: DataEdge) => {\n const part = (mark: string, p: string | undefined) => (p === undefined ? '' : `${mark}${idPart(p)}`);\n return `edge:${idPart(e.from)}${part('.', e.fromPort)}->${idPart(e.to)}${part('.', e.toPort)}${part(':', e.label)}`;\n};\n\nfunction graphOf(nodes: GraphNode[], edges: GraphEdge[], groups: GraphGroup[] = []): Graph {\n const byId = new Map(nodes.map((n) => [n.id, n]));\n const out = new Map<string, GraphEdge[]>();\n const inc = new Map<string, GraphEdge[]>();\n for (const e of edges) {\n out.set(e.from, [...(out.get(e.from) ?? []), e]);\n inc.set(e.to, [...(inc.get(e.to) ?? []), e]);\n }\n return {\n nodes,\n edges,\n groups,\n node: (id) => byId.get(id),\n outgoing: (id) => out.get(id) ?? [],\n incoming: (id) => inc.get(id) ?? [],\n };\n}\n\n/** The room an edge's label asks layout for: none when the edge puts its\n * label somewhere layout does not station it, or routes itself through\n * waypoints of its own. */\nfunction labelRoomOf(e: DataEdge, opts: DiagramSceneOptions, font: { fontFamily: string; fontSize: number },\n measure: MeasureRowText): EdgeLabelRoom | null {\n if (!e.label || e.waypoints !== undefined) return null;\n if (e.labelPlacement !== undefined && !labelFollowsLayout(e.labelPlacement.at)) return null;\n const style = labelStyleOf(font);\n const offset = (e.labelPlacement ?? opts.labelPlacement ?? LABEL_PLACEMENT).offset;\n return { width: measure(e.label, style).width, height: style.fontSize, ...(offset !== undefined ? { offset } : {}) };\n}\n\n/** A data edge as layout reads it: its ends, the ports it names, and the room\n * its label asks for. */\nfunction graphEdgeOf(e: DataEdge, room: EdgeLabelRoom | null): GraphEdge {\n return {\n id: edgeIdOf(e),\n from: e.from,\n to: e.to,\n ...(e.fromPort ? { fromPort: e.fromPort } : {}),\n ...(e.toPort ? { toPort: e.toPort } : {}),\n ...(room !== null ? { label: room } : {}),\n };\n}\n\ntype Rect = { x: number; y: number; width: number; height: number };\n\n/** Each node's box where layout put it, or where it started if layout left it. */\nfunction placed(data: DiagramData, seeds: readonly GraphNode[], moved: ReadonlyMap<string, Vec2>): Map<string, Rect> {\n return new Map(data.nodes.map((n, i) => {\n const seed = seeds[i]!.bounds;\n const at = moved.get(n.id) ?? seed;\n return [n.id, { x: at.x, y: at.y, width: seed.width, height: seed.height }];\n }));\n}\n\n/** A node's box, its rows' text and slots, and its port labels, laid out in `box`. */\nfunction nodeSpecs(\n n: DataNode, body: BodySpec, box: { x: number; y: number; width: number; height: number },\n look: { style: NodeStyle; text: (s: RowTextStyle | undefined) => DiagramTextStyle; measure: MeasureRowText },\n): DiagramSpec[] {\n const { style } = look;\n const textData = (text: string, s: RowTextStyle | undefined): DiagramSceneData =>\n ({ text, style: look.text(s), fill: { paint: { color: style.text } } });\n const built = buildBody<DiagramSceneData, 'main', RectPose>(body, box, {\n id: n.id,\n layer: 'main',\n measure: look.measure,\n body: (trait) => ({\n diagram: n.pinned === true ? { ...trait, pinned: true } : trait,\n fill: { paint: { color: style.fill } },\n stroke: { paint: { color: style.stroke }, width: style.strokeWidth ?? 2, ...(style.dash ? { dash: style.dash } : {}) },\n }),\n row: (text, at) =>\n at.row.kind === 'slot'\n ? (at.row.id === undefined ? null : { diagram: { mark: { d: SLOT_FRAME } }, stroke: { paint: { color: style.stroke }, width: 1 } })\n : text === '' ? null : textData(text, at.row.kind === 'label' || at.row.kind === 'field' ? at.row.style : undefined),\n portLabel: (text) => textData(text, undefined),\n });\n return built.specs.map((s, k) => ({ ...s, ...(s.id !== undefined ? {} : { id: `${n.id}/${k}` }) }) as DiagramSpec);\n}\n\n/** Every spec carries an id — a node's own, `<id>/<k>` for its text,\n * `<id>/mark:<i>` for its marks, `<edge id>/label`, a group's own and\n * `<group id>/label` — so a later call's\n * specs can be reconciled against this one's. Throws on a repeated id among\n * nodes and groups, which names two things as one. An edge whose\n * end is not a node is dropped, and so is a repeat of an earlier edge with\n * the same ends, ports and label: it would draw exactly on top of the first. */\nexport function diagramScene(data: DiagramData, opts: DiagramSceneOptions = {}): DiagramSpec[] {\n const font = opts.font ?? FONT;\n const styleOf = (s: RowTextStyle | undefined): DiagramTextStyle => ({\n fontFamily: s?.fontFamily ?? font.fontFamily,\n fontSize: s?.fontSize ?? font.fontSize,\n ...(s?.bold === true ? { fontWeight: 700 } : {}),\n });\n const measure: MeasureRowText = opts.measure\n ? (text, s) => opts.measure!(text, { ...s, fontFamily: s.fontFamily ?? font.fontFamily, fontSize: s.fontSize ?? font.fontSize })\n : (text, s) => {\n const size = s.fontSize ?? font.fontSize;\n return { width: text.length * GLYPH * size, height: Math.ceil(LINE * size) };\n };\n\n const ids = new Set<string>();\n for (const n of data.nodes) {\n if (ids.has(n.id)) throw new Error(`diagramScene: node id \"${n.id}\" appears more than once`);\n ids.add(n.id);\n }\n const nodeIds = new Set(ids);\n const titleStyle = { ...font, fontSize: font.fontSize - 1 };\n const groups = resolveGroups(data.groups ?? [], ids, nodeIds, {\n padding: opts.groupPadding ?? DEFAULT_GROUP_INSET,\n title: (text) => measure(text, titleStyle),\n });\n const seen = new Set<string>();\n const edges = data.edges.filter((e) => {\n const id = edgeIdOf(e);\n if (seen.has(id) || !ids.has(e.from) || !ids.has(e.to)) return false;\n seen.add(id);\n return true;\n });\n\n const bodies = data.nodes.map((n) => ({\n outline: n.outline ?? opts.outline ?? 'rect',\n rows: n.rows ?? (n.lines ?? []).map((text): Row => ({ kind: 'label', text })),\n padding: n.padding ?? opts.padding ?? 8,\n gap: n.gap ?? opts.gap ?? 4,\n verticalAlign: n.verticalAlign ?? opts.verticalAlign ?? 'center',\n ...(n.ports ? { ports: n.ports } : {}),\n ...(n.portLabels ? { portLabels: n.portLabels } : {}),\n }));\n // Seeded on the diagonal in source order, so whichever axis a layout reads\n // for in-rank order, it starts from the data's own order.\n const seeds: GraphNode[] = data.nodes.map((n, i) => {\n const pose = sizeToBody(\n { ...(n.at ?? { x: i, y: i }), width: n.width ?? opts.minWidth ?? MIN_WIDTH, height: n.height ?? 0 },\n measureBody(bodies[i]!, measure),\n );\n const { ports, outline, margin } = bodyTrait(bodies[i]!, pose, measure);\n return { id: n.id, bounds: pose, pinned: n.pinned === true, ...(ports !== undefined ? { ports } : {}),\n ...(outline !== undefined ? { outline } : {}), ...(margin !== undefined ? { margin } : {}) };\n });\n const graphGroups: GraphGroup[] = groups.map((g) => ({\n id: g.group.id,\n members: g.members,\n inset: g.inset,\n ...(g.minWidth !== undefined ? { minWidth: g.minWidth } : {}),\n ...(g.parent !== undefined ? { parent: g.parent } : {}),\n }));\n const seedOf = new Map(seeds.map((n) => [n.id, n]));\n for (const g of groups) {\n for (const m of g.direct) {\n const seed = seedOf.get(m);\n if (seed !== undefined) seed.group = g.group.id;\n }\n }\n const graph = graphOf(\n seeds,\n expandGroupEdges(edges.map((e) => graphEdgeOf(e, labelRoomOf(e, opts, font, measure))), graphGroups),\n graphGroups,\n );\n const layout: LayoutFn | null = typeof opts.layout === 'function' ? opts.layout\n : opts.layout === 'none' ? null\n : LAYOUTS[opts.layout ?? 'layered'];\n const layoutOptions: LayoutOptions = { order: 'barycenter', ...opts.layoutOptions };\n const plan = layout === null ? null : planOf(layout, graph, layoutOptions);\n const moved = plan?.moves ?? new Map();\n\n const specs: DiagramSpec[] = [];\n const placedAt = placed(data, seeds, moved);\n // The author's own ports and waypoints win over the plan's.\n const routes = plan === null || layout?.plan === undefined ? null : authoredOver(edges.map((e) => ({ ...e, id: edgeIdOf(e) })), plan);\n // Behind every node, so a box never paints over what it holds.\n const edgeCtx = { idOf: edgeIdOf, font, measure, fallback: EDGE, labelPlacement: LABEL_PLACEMENT, routes, opts };\n const groupLook = (g: DataGroup) => ({ style: opts.groupStyle?.(g) ?? GROUP, text: styleOf(titleStyle) });\n const footprints = new Map(seeds.map((s) => [s.id, grownBy(placedAt.get(s.id)!, s.margin)]));\n specs.push(...groupSpecs(groups, footprints, groupLook, wireLabels(edges, edgeCtx)));\n for (const [i, n] of data.nodes.entries()) {\n const seed = seeds[i]!.bounds;\n const at = placedAt.get(n.id)!;\n const style = opts.nodeStyle?.(n) ?? NODE;\n specs.push(...nodeSpecs(n, bodies[i]!, { x: at.x, y: at.y, width: seed.width, height: seed.height }, { style, text: styleOf, measure }));\n if (n.marks) specs.push(...markSpecs(n.id, n.marks, at, { style, textStyle: styleOf, measure }));\n }\n specs.push(...edgeSpecs(edges, edgeCtx));\n return specs;\n}\n","/**\n * The edge half of writing a layout to a scene: each edge's waypoints, and\n * where its label sits among them.\n *\n * Layout writes only what it owns. An edge's route is its own while the edge\n * has no waypoints or still has the ones layout last wrote (`laidOut`); a\n * label's place is its own while the label sits at the default middle or at a\n * `{ near }`, and its edge's route is layout's.\n */\nimport type { Vec2 } from '@weasel-js/core/math';\nimport { diagramEdgeOf, layoutOwnsPort, layoutOwnsRoute, type DiagramEdge, type EdgeEnd } from './edgeTrait';\nimport { labelFollowsLayout, type Graph } from './graph';\nimport { diagramLabelOf, type DiagramLabel } from './labelTrait';\nimport type { LayoutPlan, LayoutPorts } from './layout';\n\n/** Edge routes for `applyLayout` to write alongside a layout's moves. */\nexport interface LayoutRoutes {\n /** Every edge the layout laid out. Each one layout owns gets its route\n * from `waypoints`, or loses the one a layout gave it before. */\n edges: ReadonlySet<string>;\n waypoints: ReadonlyMap<string, readonly Vec2[]>;\n labels?: ReadonlyMap<string, Vec2>;\n /** The ports layout names. Each end layout owns gets its port from here,\n * or loses the one a layout named before. */\n ports?: ReadonlyMap<string, LayoutPorts>;\n}\n\n/** How far a route may sit from the one already written and still count as\n * it, in world units: a re-run's translation can land an ulp off. */\nconst ROUTE_TOLERANCE = 1e-3;\n\n/** The routes `plan` laid out for `graph`'s edges. A layout that routes\n * nothing routes every edge straight, taking back what `layered` wrote. */\nexport function routesOf(graph: Graph, plan: LayoutPlan): LayoutRoutes {\n return {\n edges: new Set(graph.edges.map((e) => e.origin?.id ?? e.id)),\n waypoints: plan.waypoints ?? new Map(),\n ...(plan.labels !== undefined ? { labels: plan.labels } : {}),\n ...(plan.ports !== undefined ? { ports: plan.ports } : {}),\n };\n}\n\n/** A scene as {@link routeWrites} reads it. */\nexport interface RoutedScene {\n get(id: never): { data: unknown } | undefined;\n isLocked(id: never): boolean;\n renderOrderNodes(): readonly { id: string; data: unknown; dependsOn?: readonly string[] | 'children' }[];\n}\n\n/** The new `data` for every edge and label whose route or place changes. A\n * locked edge or label is left as it is. */\nexport function routeWrites(scene: RoutedScene, routes: LayoutRoutes): Map<string, unknown> {\n const out = new Map<string, unknown>();\n const owned = new Set<string>();\n for (const id of routes.edges) {\n const node = scene.get(id as never);\n const edge = node === undefined ? null : diagramEdgeOf(node);\n if (node === undefined || edge === null || scene.isLocked(id as never)) {\n if (edge !== null && layoutOwnsRoute(edge)) owned.add(id);\n continue;\n }\n let next = edge;\n if (layoutOwnsRoute(edge)) {\n owned.add(id);\n next = rerouted(edge, routes.waypoints.get(id));\n }\n const ports = routes.ports?.get(id);\n const from = renamed(edge.from, ports?.from);\n const to = renamed(edge.to, ports?.to);\n if (from !== edge.from || to !== edge.to) next = { ...next, from, to };\n if (next !== edge) out.set(id, withTrait(node.data, next));\n }\n // The first label on an edge is the one `buildGraph` left room for.\n const stationed = new Set<string>();\n for (const node of scene.renderOrderNodes()) {\n const label = diagramLabelOf(node);\n const deps = node.dependsOn;\n if (label === null || !Array.isArray(deps) || deps.length !== 1 || !owned.has(deps[0]!)) continue;\n if (!labelFollowsLayout(label.at) || stationed.has(deps[0]!)) continue;\n stationed.add(deps[0]!);\n const near = routes.labels?.get(deps[0]!);\n const at: DiagramLabel['at'] = near === undefined ? 'mid' : { near };\n if (sameAt(label.at, at) || scene.isLocked(node.id as never)) continue;\n out.set(node.id, withTrait(node.data, { ...label, at }, 'label'));\n }\n return out;\n}\n\n/** `edge` on the route layout gave it, or `edge` itself when that changes\n * nothing. No route clears the one layout wrote before. */\nfunction rerouted(edge: DiagramEdge, route: readonly Vec2[] | undefined): DiagramEdge {\n if (route === undefined || route.length === 0) {\n if ((edge.waypoints ?? []).length === 0 && edge.laidOut === undefined) return edge;\n const { waypoints: _w, laidOut: _l, ...rest } = edge;\n return rest;\n }\n if (edge.waypoints !== undefined && near(edge.waypoints, route)) return edge;\n return { ...edge, waypoints: route, laidOut: route };\n}\n\n/** `end` with the port layout names for it, or `end` itself when layout does\n * not own it or names what it already has. */\nfunction renamed(end: EdgeEnd, port: string | undefined): EdgeEnd {\n if (!layoutOwnsPort(end) || (end.port === port && (port === undefined || end.laidOut === port))) return end;\n const { port: _p, laidOut: _l, ...rest } = end;\n return port === undefined ? rest : { ...rest, port, laidOut: port };\n}\n\nfunction near(a: readonly Vec2[], b: readonly Vec2[]): boolean {\n return a.length === b.length\n && a.every((p, i) => Math.abs(p.x - b[i]!.x) <= ROUTE_TOLERANCE && Math.abs(p.y - b[i]!.y) <= ROUTE_TOLERANCE);\n}\n\nfunction sameAt(a: DiagramLabel['at'], b: DiagramLabel['at']): boolean {\n if (typeof a === 'object' && typeof b === 'object') return near([a.near], [b.near]);\n return a === b;\n}\n\n/** `data` with its diagram trait, or one key of it, replaced. */\nfunction withTrait(data: unknown, value: unknown, key?: string): unknown {\n const own = data as { diagram: Record<string, unknown> };\n const diagram = key === undefined ? value : { ...own.diagram, [key]: value };\n return { ...own, diagram };\n}\n","/**\n * Running a layout against a scene: `LAYOUTS`, one batch of pose writes, and\n * the action that reaches both. A layout is a pure function of the graph;\n * `applyLayout` is the only thing that touches a scene.\n */\nimport {\n translatePoseViaDescriptor,\n AUTO_POSE_DESCRIPTOR,\n type Action,\n type PoseDescriptor,\n type Scene,\n} from '@weasel-js/core';\nimport { force } from './force';\nimport { buildGraph, type GraphSource } from './graph';\nimport { chain } from './chain';\nimport { layered } from './layered';\nimport { tree } from './tree';\nimport { planOf, type LayoutFn, type LayoutOptions, type LayoutResult } from './layout';\nimport { routeWrites, routesOf, type LayoutRoutes } from './routeWrites';\nimport type { DiagramNodeReader } from './trait';\n\n/** The layouts this package ships. A consumer's own go in the same shape. */\nexport const LAYOUTS: Readonly<Record<string, LayoutFn>> = Object.freeze({\n layered,\n tree,\n force,\n chain,\n});\n\n/** Options for {@link applyLayout}. */\nexport interface ApplyLayoutOptions<TPose> {\n geometry?: PoseDescriptor<TPose>;\n /** The undo entry's name. Default `'Layout'`. */\n label?: string;\n /** Edge routes to write in the same batch, from `routesOf`. */\n routes?: LayoutRoutes;\n}\n\n/**\n * Write a layout's answer to the scene, as one undoable batch.\n *\n * Returns how many nodes moved. A layout with nothing to do, nodes or routes,\n * writes nothing and pushes no history entry.\n *\n * Nodes are **translated**, never re-posed from the layout's numbers: a node's\n * pose can be a path or anything else a consumer wired, and only its own\n * descriptor knows how to move one.\n *\n * A participant that is a container takes its whole subtree along. `setPose`\n * does not cascade — poses are absolute.\n */\nexport function applyLayout<TPose>(\n scene: Scene<unknown, string, TPose>,\n result: LayoutResult,\n opts: ApplyLayoutOptions<TPose> = {},\n): number {\n const poses = layoutPoses(scene, result, opts.geometry);\n const data = opts.routes === undefined ? new Map<string, unknown>() : routeWrites(scene as never, opts.routes);\n if (poses.size === 0 && data.size === 0) return 0;\n // A node on a locked layer stays put, as it does under a live run.\n const open = [...poses].filter(([id]) => !scene.isLocked(id as never));\n if (open.length === 0 && data.size === 0) return 0;\n scene.batch(opts.label ?? 'Layout', () => {\n for (const [id, pose] of open) scene.setPose(id as never, pose);\n for (const [id, d] of data) scene.update(id as never, { data: d });\n });\n // Participants, not the descendants they carried along: a caller asking how\n // much a layout did means the nodes it placed.\n const wrote = new Set(open.map(([id]) => id));\n let moved = 0;\n for (const id of result.keys()) if (wrote.has(id)) moved++;\n return moved;\n}\n\n/**\n * The poses a layout result implies, without writing any of them: each moved\n * node translated to its new top-left, and its subtree translated with it.\n *\n * The translation is measured from the node's document pose, which a live run\n * in flight never changes, so a frame's answer does not depend on the frame\n * before it.\n */\nexport function layoutPoses<TPose>(\n scene: Scene<unknown, string, TPose>,\n result: LayoutResult,\n geometry: PoseDescriptor<TPose> = AUTO_POSE_DESCRIPTOR as PoseDescriptor<TPose>,\n): Map<string, TPose> {\n const out = new Map<string, TPose>();\n for (const [id, at] of result) {\n const node = scene.get(id as never);\n if (node === undefined) continue;\n const bounds = geometry.getBounds(node.pose);\n const dx = at.x - bounds.x;\n const dy = at.y - bounds.y;\n if (dx === 0 && dy === 0) continue;\n out.set(id, translatePoseViaDescriptor(node.pose, dx, dy, geometry));\n for (const descendant of subtreeOf(scene, id)) {\n const child = scene.get(descendant as never);\n if (child === undefined) continue;\n out.set(descendant, translatePoseViaDescriptor(child.pose, dx, dy, geometry));\n }\n }\n return out;\n}\n\nfunction subtreeOf<TPose>(scene: Scene<unknown, string, TPose>, id: string): string[] {\n const out: string[] = [];\n const stack = [...scene.childrenOf(id as never)];\n while (stack.length > 0) {\n const next = stack.pop()!;\n out.push(next);\n stack.push(...scene.childrenOf(next));\n }\n return out;\n}\n\n/** The default action id. */\nexport const LAYOUT_ACTION_ID = 'diagram.layout';\n\n/** Options for {@link createLayoutAction}. Only `source` is required. */\nexport interface LayoutActionOptions<TPose> {\n /** Where the graph is read from. The same thunk the port affordance takes. */\n source: GraphSource<TPose>;\n /** Default {@link LAYOUT_ACTION_ID}. */\n id?: string;\n label?: string;\n /** Which `<ActionBar group>` it lands in. Default `'diagram'`, alongside\n * connect — give a bar of its own a group of its own. */\n group?: string;\n /** A key in {@link LAYOUTS}, or a layout of the consumer's own. Default\n * `'layered'`. */\n algorithm?: string | LayoutFn;\n layout?: LayoutOptions;\n read?: DiagramNodeReader;\n geometry?: PoseDescriptor<TPose>;\n}\n\n/**\n * `diagram.layout` — rebuild the graph, run a layout, write the result.\n */\nexport function createLayoutAction<TPose>(opts: LayoutActionOptions<TPose>): Action {\n const algorithm = typeof opts.algorithm === 'function'\n ? opts.algorithm\n : LAYOUTS[opts.algorithm ?? 'layered'] ?? layered;\n const build = {\n ...(opts.read ? { read: opts.read } : {}),\n ...(opts.geometry ? { geometry: opts.geometry } : {}),\n };\n\n return {\n id: opts.id ?? LAYOUT_ACTION_ID,\n label: opts.label ?? 'Lay out diagram',\n group: opts.group ?? 'diagram',\n requires: ['scene'],\n invoker: {\n timing: 'immediate',\n run: (deps) => {\n const scene = deps['scene'] as Scene<unknown, string, TPose> | undefined;\n if (scene === undefined) return;\n const graph = buildGraph(opts.source, build);\n const plan = planOf(algorithm, graph, opts.layout);\n applyLayout(scene, plan.moves, {\n ...(opts.geometry ? { geometry: opts.geometry } : {}),\n ...(opts.label ? { label: opts.label } : {}),\n routes: routesOf(graph, plan),\n });\n },\n },\n enabled: () => true as const,\n };\n}\n","/**\n * A live layout's producers: what each frame of a run says about where the\n * participants are. `forceProducer` relaxes; `easedProducer` walks to a\n * destination it knows. `useLiveLayout` (`live.ts`) runs them.\n */\nimport {\n AUTO_POSE_DESCRIPTOR,\n type NodeId,\n type PoseDescriptor,\n} from '@weasel-js/core';\nimport { type EasingFn } from '@weasel-js/animator';\nimport { forceRelaxation, type ForceOptions } from './force';\nimport type { Graph } from './graph';\nimport { center, type LayoutFn, type LayoutOptions, type LayoutResult } from './layout';\n\n/** What a live producer is told, and what it answers with. */\nexport interface LiveLayoutCtx<TPose> {\n /** Nodes another gesture is moving, and where each is drawn. */\n pinned: ReadonlyMap<NodeId, TPose>;\n /** Frames since this run heated, starting at 0. */\n frame: number;\n}\n\n/** A frame of a live layout: where the participants are, and whether it is\n * finished. Positions are top-lefts, the same as a `LayoutResult`. */\nexport interface LiveLayoutFrame {\n result: LayoutResult;\n done: boolean;\n}\n\n/** One frame of a live layout, called once per frame until it reports `done`. */\nexport type LiveLayoutProducer<TPose> = (ctx: LiveLayoutCtx<TPose>) => LiveLayoutFrame;\n\n/** How long an eased layout takes to arrive, in frames. Frame-counted rather\n * than timed, so a background tab resumes where it paused rather than\n * arriving the instant it comes back. */\nexport const EASE_FRAMES = 24;\n\n/** Smooth start and end. Inlined rather than pulled from the animator, which\n * is a registry of running tweens, not a curve library. */\nexport const easeInOut: EasingFn = (t) => (t < 0.5 ? 2 * t * t : 1 - (-2 * t + 2) ** 2 / 2);\n\n/** How far along an eased run is at `frame`, before and after its easing. */\nexport function progress(frame: number, frames: number, easing: EasingFn): { t: number; u: number } {\n const t = Math.min((frame + 1) / frames, 1);\n return { t, u: easing(t) };\n}\n\n/** Options for {@link forceProducer}. */\nexport interface ForceProducerOptions<TPose> extends ForceOptions {\n geometry?: PoseDescriptor<TPose>;\n /** Alpha held while something is pinned, so the graph keeps answering a drag\n * instead of freezing under it. Default 0.3. */\n dragAlpha?: number;\n /** The run is at rest once no node moves this far in a tick, in world units.\n * Default 0.1. `0` never rests, leaving the run to the cooling schedule. */\n restDistance?: number;\n /** Consecutive ticks at rest before the run finishes. Default 5. */\n restTicks?: number;\n}\n\nconst REST_DISTANCE = 0.1;\nconst REST_TICKS = 5;\n\n/**\n * A relaxation, one tick a frame, done when the graph stops moving.\n *\n * Motion ends long before alpha cools, so it finishes on whichever comes\n * first: `restTicks` ticks in a row with no node moving `restDistance`, or the\n * cooling schedule running out. Nothing rests while a node is held.\n *\n * It does **not** re-anchor the way the one-shot `force` does. Re-anchoring\n * per frame would fight a drag: the anchor is measured from where the nodes\n * were, and a pinned node is deliberately somewhere else.\n */\nexport function forceProducer<TPose>(\n graph: Graph,\n opts: ForceProducerOptions<TPose> = {},\n): LiveLayoutProducer<TPose> {\n const geometry = opts.geometry ?? (AUTO_POSE_DESCRIPTOR as PoseDescriptor<TPose>);\n const relaxation = forceRelaxation(graph, opts);\n const dragAlpha = opts.dragAlpha ?? 0.3;\n const restDistance = opts.restDistance ?? REST_DISTANCE;\n const restTicks = opts.restTicks ?? REST_TICKS;\n const was = relaxation.bodies.map((b) => ({ x: b.x, y: b.y }));\n let still = 0;\n\n return ({ pinned }) => {\n for (const node of graph.nodes) {\n const body = relaxation.byId.get(node.id);\n if (body === undefined) continue;\n const held = pinned.get(node.id as NodeId);\n if (held !== undefined) {\n // A dragged node holds its neighbors while they relax, which is `fx` /\n // `fy` on the integrator rather than a correction applied afterward.\n const bounds = geometry.getBounds(held);\n body.fx = center(bounds, 'x');\n body.fy = center(bounds, 'y');\n } else if (!relaxation.pinned.has(node.id)) {\n delete body.fx;\n delete body.fy;\n }\n }\n // A pin is a live edit, so the run keeps its temperature up until the\n // pointer lets go.\n relaxation.sim.alphaTarget(pinned.size > 0 ? dragAlpha : 0);\n relaxation.sim.tick();\n\n let moved = 0;\n relaxation.bodies.forEach((body, i) => {\n const at = was[i]!;\n moved = Math.max(moved, Math.hypot(body.x - at.x, body.y - at.y));\n at.x = body.x;\n at.y = body.y;\n });\n still = pinned.size === 0 && moved < restDistance ? still + 1 : 0;\n\n const done = still >= restTicks || relaxation.sim.isSettled();\n return { result: relaxation.placed(), done };\n };\n}\n\n/** Options for {@link easedProducer}. */\nexport interface EasedProducerOptions {\n layout?: LayoutOptions;\n /** Frames to arrive in. Default 24. */\n frames?: number;\n easing?: EasingFn;\n}\n\n/**\n * A layout that knows its destination, walked into place.\n *\n * The target is computed once, from the graph as it stood when the run heated;\n * each frame is that target scaled by the easing curve, measured from where the\n * nodes started. A pinned node is dropped from the target rather than fought\n * over.\n */\nexport function easedProducer<TPose>(\n graph: Graph,\n algorithm: LayoutFn,\n opts: EasedProducerOptions = {},\n): LiveLayoutProducer<TPose> {\n const frames = opts.frames ?? EASE_FRAMES;\n const easing = opts.easing ?? easeInOut;\n const target = algorithm(graph, opts.layout);\n const from = new Map<string, { x: number; y: number }>();\n for (const node of graph.nodes) from.set(node.id, { x: node.bounds.x, y: node.bounds.y });\n\n return ({ pinned, frame }) => {\n const { t, u } = progress(frame, frames, easing);\n const result = new Map<string, { x: number; y: number }>();\n for (const [id, to] of target) {\n if (pinned.has(id as NodeId)) continue;\n const start = from.get(id);\n if (start === undefined) continue;\n result.set(id, {\n x: start.x + (to.x - start.x) * u,\n y: start.y + (to.y - start.y) * u,\n });\n }\n return { result, done: t >= 1 };\n };\n}\n","/**\n * The wait before a live run whose layout answers later: a `LayoutPlanner`\n * that returns a promise.\n *\n * Only the newest request is answered, and only while the graph it was asked\n * about is still the one on screen. A drag, an edit, or a node added while the\n * answer was on its way makes the plan describe somewhere the diagram no\n * longer is, so the answer is dropped and the run never starts.\n */\nimport { useEffect, useMemo, useRef } from 'react';\nimport type { Graph } from './graph';\nimport type { LayoutPlan } from './layout';\n\n/** The shape of a graph, as a string that changes when a node or edge does. */\nexport function shapeOf(graph: Graph): string {\n const nodes = graph.nodes.map((n) => n.id).sort().join(',');\n const edges = graph.edges.map((e) => `${e.from}>${e.to}`).sort().join(',');\n return `${nodes}|${edges}`;\n}\n\n/** Whether `b` is `a` again: the same nodes and edges, every node in the same box. */\nexport function sameGraph(a: Graph, b: Graph): boolean {\n if (shapeOf(a) !== shapeOf(b)) return false;\n return a.nodes.every((n) => {\n const m = b.node(n.id)?.bounds;\n const k = n.bounds;\n return m !== undefined && m.x === k.x && m.y === k.y && m.width === k.width && m.height === k.height;\n });\n}\n\n/** A live run's outstanding request for a plan. Stable for the life of the\n * component; unmounting drops whatever is pending. */\nexport interface PendingPlan {\n /** Hand `ready` the plan once it arrives, or `failed` the reason it never\n * will, unless another request or a `drop` comes first; a superseded\n * request's failure is dropped with its answer. */\n request(answer: Promise<LayoutPlan>, ready: (plan: LayoutPlan) => void, failed: (error: unknown) => void): void;\n /** Forget the outstanding request. */\n drop(): void;\n isWaiting(): boolean;\n}\n\nexport function usePendingPlan(): PendingPlan {\n const generation = useRef(0);\n const waiting = useRef(false);\n const pending = useMemo<PendingPlan>(() => ({\n request(answer, ready, failed) {\n const mine = ++generation.current;\n waiting.current = true;\n const current = () => generation.current === mine;\n void answer.then(\n (plan) => {\n if (!current()) return;\n waiting.current = false;\n ready(plan);\n },\n (error: unknown) => {\n if (!current()) return;\n waiting.current = false;\n failed(error);\n },\n );\n },\n drop() {\n generation.current++;\n waiting.current = false;\n },\n isWaiting: () => waiting.current,\n }), []);\n useEffect(() => () => pending.drop(), [pending]);\n return pending;\n}\n","/**\n * The edge half of a live layout: each route the run will rewrite, eased from\n * where it ran to where the run puts it, frame by frame, alongside the nodes,\n * and drawn through the ports the run will name for its ends.\n *\n * Nothing here writes the document. A frame's route is published as the edge's\n * path on the scene's override channel, drawn by the edge's own `derivePath`\n * through the frame's waypoints and the poses its ends are drawn at; the\n * routes themselves are written once, when the run arrives (`routeWrites`).\n */\nimport { useEffect, useMemo, useRef } from 'react';\nimport {\n AUTO_POSE_DESCRIPTOR,\n derivedDepOf,\n type DerivedDep,\n type PoseDescriptor,\n type NodeId,\n type Path,\n type PoseOverride,\n type Scene,\n} from '@weasel-js/core';\nimport type { Vec2 } from '@weasel-js/core/math';\nimport { diagramEdgeOf, layoutOwnsRoute, type DiagramEdge } from './edgeTrait';\nimport type { Graph } from './graph';\nimport { routeWrites, type LayoutRoutes } from './routeWrites';\n\n/** One route on its way from where it ran to where layout puts it. */\nexport interface RouteEasing {\n id: string;\n /** Point `k` of the route eases from `from[k]` to `to[k]`. */\n from: readonly Vec2[];\n /** As long as `from`, or `null` for a route layout takes away: it eases\n * onto the straight line between its ends' centers where each frame draws\n * them, and arrives with no waypoints at all. */\n to: readonly Vec2[] | null;\n /** The edge's ends as the run will write them, ports and all. */\n ends: Pick<DiagramEdge, 'from' | 'to'>;\n}\n\nconst lerp = (a: Vec2, b: Vec2, u: number): Vec2 => ({ x: a.x + (b.x - a.x) * u, y: a.y + (b.y - a.y) * u });\n\n/** The point `s` of the way along the polyline through `points`, 0 to 1. */\nfunction along(points: readonly Vec2[], s: number): Vec2 {\n if (points.length === 1) return points[0]!;\n const lengths = points.slice(1).map((p, i) => Math.hypot(p.x - points[i]!.x, p.y - points[i]!.y));\n const total = lengths.reduce((a, b) => a + b, 0);\n let left = s * total;\n for (const [i, len] of lengths.entries()) {\n if (left <= len || i === lengths.length - 1) return lerp(points[i]!, points[i + 1]!, len === 0 ? 0 : Math.min(left / len, 1));\n left -= len;\n }\n return points[points.length - 1]!;\n}\n\n/** `count` points spread evenly along the straight line from `start` to\n * `end`, its ends left off. */\nconst straightRun = (count: number, start: Vec2, end: Vec2): Vec2[] =>\n Array.from({ length: count }, (_, k) => lerp(start, end, (k + 1) / (count + 1)));\n\n/** `points` as `count` points spread along the same run, its ends kept. A\n * run of none is the straight line from `start` to `end`. */\nfunction respread(points: readonly Vec2[], count: number, start: Vec2, end: Vec2): Vec2[] {\n if (points.length === count) return [...points];\n if (points.length === 0) return straightRun(count, start, end);\n return Array.from({ length: count }, (_, k) => along(points, count === 1 ? 0.5 : k / (count - 1)));\n}\n\n/**\n * The routes a run eases: every edge `routes` lays out that the run will\n * rewrite, whether its route or the ports its ends name. A route gaining\n * waypoints starts on the straight line between its ends' centers; one losing\n * them ends there.\n */\nexport function routeEasings<TPose>(\n scene: Scene<unknown, string, TPose>,\n graph: Graph,\n routes: LayoutRoutes,\n): RouteEasing[] {\n const centerOf = (id: string): Vec2 | null => {\n const ids = graph.node(id) !== undefined ? [id] : graph.groups?.find((g) => g.id === id)?.members ?? [];\n const boxes = ids.flatMap((m) => graph.node(m)?.bounds ?? []);\n if (boxes.length === 0) return null;\n const x0 = Math.min(...boxes.map((b) => b.x));\n const y0 = Math.min(...boxes.map((b) => b.y));\n const x1 = Math.max(...boxes.map((b) => b.x + b.width));\n const y1 = Math.max(...boxes.map((b) => b.y + b.height));\n return { x: (x0 + x1) / 2, y: (y0 + y1) / 2 };\n };\n const writes = routeWrites(scene as never, routes);\n const out: RouteEasing[] = [];\n for (const id of routes.edges) {\n const node = scene.get(id as NodeId);\n const edge = node === undefined ? null : diagramEdgeOf(node);\n const written = writes.get(id);\n if (node === undefined || edge === null || written === undefined) continue;\n const next = diagramEdgeOf({ data: written });\n if (next === null) continue;\n const ends = { from: next.from, to: next.to };\n const was = edge.waypoints ?? [];\n if (!layoutOwnsRoute(edge)) {\n out.push({ id, from: was, to: was, ends });\n continue;\n }\n const after = routes.waypoints.get(id) ?? [];\n if (after.length === 0) {\n out.push({ id, from: was, to: null, ends });\n continue;\n }\n const deps = Array.isArray(node.dependsOn) ? node.dependsOn : [];\n const [a, b] = deps.length === 2 ? [centerOf(deps[0]!), centerOf(deps[1]!)] : [null, null];\n if (a === null || b === null) continue;\n const count = Math.max(was.length, after.length);\n out.push({ id, from: respread(was, count, a, b), to: respread(after, count, a, b), ends });\n }\n return out;\n}\n\n/**\n * Each eased route's path `u` of the way there, drawn by the edge's own\n * `derivePath` with its ends where `poseOf` puts them. A node `poseOf` does\n * not place is drawn where the scene shows it, unless it derives its pose —\n * a group's box — when it is derived afresh from where this frame puts what\n * it depends on. An edge that derives no path is left out.\n */\nexport function easedPaths<TPose>(\n scene: Scene<unknown, string, TPose>,\n easings: readonly RouteEasing[],\n u: number,\n poseOf: (id: string) => TPose | undefined,\n geometry: PoseDescriptor<TPose> = AUTO_POSE_DESCRIPTOR as PoseDescriptor<TPose>,\n): Map<string, Path> {\n const depOf = frameDeps(scene, poseOf);\n const centerOf = (dep: DerivedDep<TPose>): Vec2 => {\n const b = geometry.getBounds(dep.pose);\n return { x: b.x + b.width / 2, y: b.y + b.height / 2 };\n };\n const out = new Map<string, Path>();\n for (const { id, from, to, ends } of easings) {\n const node = scene.get(id as NodeId);\n if (node?.derivePath === undefined || !Array.isArray(node.dependsOn)) continue;\n const deps = node.dependsOn.map(depOf);\n let target = to;\n if (target === null) {\n const [a, b] = deps;\n target = u >= 1 || a === undefined || b === undefined ? [] : straightRun(from.length, centerOf(a), centerOf(b));\n }\n const waypoints = target.length === 0 && u >= 1 ? [] : from.map((p, k) => lerp(p, target[k]!, u));\n const data = node.data as { diagram: object };\n const diagram = { ...data.diagram, ...ends, waypoints };\n const path = node.derivePath({ ...node, data: { ...data, diagram } } as never, deps);\n if (path !== null) out.set(id, path);\n }\n return out;\n}\n\n/** Each node as this frame draws it: where `poseOf` puts it, else derived from\n * where this frame puts its dependencies, else where the scene shows it. */\nfunction frameDeps<TPose>(\n scene: Scene<unknown, string, TPose>,\n poseOf: (id: string) => TPose | undefined,\n): (id: string) => DerivedDep<TPose> | undefined {\n const memo = new Map<string, DerivedDep<TPose> | undefined>();\n const depOf = (id: string): DerivedDep<TPose> | undefined => {\n if (memo.has(id)) return memo.get(id);\n // Closes a cycle at the scene's answer rather than recursing forever.\n memo.set(id, derivedDepOf(scene, id as NodeId));\n const shown = memo.get(id);\n if (shown === undefined) return undefined;\n const pose = poseOf(id) ?? derivedFromFrame(scene, shown, depOf) ?? shown.pose;\n const dep: DerivedDep<TPose> = { node: shown.node, pose, get path() { return shown.path; } };\n memo.set(id, dep);\n return dep;\n };\n return depOf;\n}\n\n/** `shown`'s pose derived from where this frame draws its dependencies, or\n * `undefined` when it derives none or something else holds it this frame. */\nfunction derivedFromFrame<TPose>(\n scene: Scene<unknown, string, TPose>,\n shown: DerivedDep<TPose>,\n depOf: (id: string) => DerivedDep<TPose> | undefined,\n): TPose | undefined {\n const { node } = shown;\n if (node.derivePose === undefined || scene.overrides.read(node.id)?.pose !== undefined) return undefined;\n const ids = node.dependsOn === 'children' ? scene.childrenOf(node.id) : node.dependsOn ?? [];\n if (ids.length === 0) return undefined;\n return node.derivePose(node as never, ids.map(depOf)) ?? undefined;\n}\n\n/** A claim on some edges' paths in the override channel. */\nexport interface PathHold {\n /** Show these paths, and stop showing any other this hold showed. */\n show(paths: ReadonlyMap<string, Path>): void;\n /** Stop showing every path this hold shows. An entry another writer has\n * since replaced is left alone. */\n drop(): void;\n}\n\n/** A {@link PathHold} on `scene`'s override channel. Its writes are published\n * with the next `commit` of the channel, which the run's own pose frame makes. */\nexport function pathHold<TPose>(scene: Scene<unknown, string, TPose>): PathHold {\n const held = new Map<string, PoseOverride<TPose>>();\n const release = (id: string, entry: PoseOverride<TPose>) => {\n held.delete(id);\n if (scene.overrides.get(id as NodeId) === entry) scene.overrides.clear(id as NodeId);\n };\n return {\n show(paths) {\n for (const [id, entry] of held) if (!paths.has(id)) release(id, entry);\n for (const [id, path] of paths) {\n const entry = held.get(id);\n if (entry !== undefined && scene.overrides.get(id as NodeId) === entry) {\n entry.path = path;\n continue;\n }\n const fresh: PoseOverride<TPose> = { path };\n held.set(id, fresh);\n scene.overrides.set(id as NodeId, fresh);\n }\n },\n drop() {\n for (const [id, entry] of held) release(id, entry);\n },\n };\n}\n\n/** The routes a live run eases, and where it shows them. Stable for the life\n * of the component, and drops what it shows when the component unmounts. */\nexport interface EasedRoutes<TPose> {\n /** The routes the run now eases; any shown before stop showing. */\n set(easings: readonly RouteEasing[]): void;\n /** Show each route `u` of the way there, its ends where `poseOf` puts\n * them; `null` shows none. `geometry` reads the poses' bounds. */\n show(\n scene: Scene<unknown, string, TPose>,\n u: number | null,\n poseOf: (id: string) => TPose | undefined,\n geometry?: PoseDescriptor<TPose>,\n ): void;\n /** Stop showing them. */\n drop(): void;\n}\n\nexport function useEasedRoutes<TPose>(): EasedRoutes<TPose> {\n const easings = useRef<readonly RouteEasing[]>([]);\n const held = useRef<{ scene: Scene<unknown, string, TPose>; hold: PathHold } | null>(null);\n const routes = useMemo<EasedRoutes<TPose>>(() => ({\n set(next) {\n held.current?.hold.drop();\n easings.current = next;\n },\n show(scene, u, poseOf, geometry) {\n if (u === null) held.current?.hold.drop();\n if (u === null || easings.current.length === 0) return;\n if (held.current?.scene !== scene) {\n held.current?.hold.drop();\n held.current = { scene, hold: pathHold(scene) };\n }\n held.current.hold.show(easedPaths(scene, easings.current, u, poseOf, geometry));\n },\n drop() {\n held.current?.hold.drop();\n },\n }), []);\n useEffect(() => () => routes.drop(), [routes]);\n return routes;\n}\n","/**\n * Layout you can watch, and push against.\n *\n * A live layout is a producer on core's `usePoseRun`: each frame it hands back\n * where the participants are, the run publishes that to the scene's override\n * channel, and the whole thing commits as one batch when it settles. Nothing\n * here writes the document.\n *\n * Two producers: `force` is a relaxation whose target changes every tick;\n * `layered` and `tree` know where they are going, so they ease into it. So\n * does a `LayoutPlanner`, once it answers.\n *\n * **A node another gesture owns is a pin.** `force` holds it with `fx`/`fy`\n * and relaxes its neighbors around it, and an eased layout leaves it alone, so\n * dragging a body mid-run is the consumer's ordinary move tool.\n */\nimport { useCallback, useEffect, useMemo, useRef } from 'react';\nimport {\n useLatest,\n usePoseRun,\n type NodeId,\n type PoseDescriptor,\n type PoseRunCtx,\n type PoseRunStep,\n type Scene,\n} from '@weasel-js/core';\nimport { type EasingFn } from '@weasel-js/animator';\nimport { isPromise } from './footprint';\nimport { buildGraph, type Graph, type GraphSource } from './graph';\nimport { chain } from './chain';\nimport { layered } from './layered';\nimport { LAYOUTS, layoutPoses } from './layoutAction';\nimport { planOf, plannerPlan, type LayoutFn, type LayoutOptions, type LayoutPlan, type LayoutPlanner } from './layout';\nimport { sameGraph, shapeOf, usePendingPlan } from './livePlan';\nimport {\n EASE_FRAMES,\n easeInOut,\n easedProducer,\n forceProducer,\n progress,\n type ForceProducerOptions,\n type LiveLayoutProducer,\n} from './liveProducers';\nimport { routeEasings, useEasedRoutes } from './liveRoutes';\nimport { routeWrites, routesOf, type LayoutRoutes } from './routeWrites';\nimport { tree } from './tree';\nimport type { DiagramNodeReader } from './trait';\n\nexport {\n easedProducer,\n forceProducer,\n type EasedProducerOptions,\n type ForceProducerOptions,\n type LiveLayoutCtx,\n type LiveLayoutFrame,\n type LiveLayoutProducer,\n} from './liveProducers';\n\n/** Options for {@link useLiveLayout}. Only `scene` and `source` are required. */\nexport interface UseLiveLayoutOptions<TPose> {\n scene: Scene<unknown, string, TPose>;\n /** Where the graph is read from. The same thunk the port affordance takes. */\n source: GraphSource<TPose>;\n /** A key in `LAYOUTS`, a layout of the consumer's own, or a planner that\n * answers later. `'force'` relaxes continuously; anything else eases to its\n * answer. Default `'force'`. */\n algorithm?: string | LayoutFn | LayoutPlanner;\n layout?: LayoutOptions;\n /** The relaxation's forces, and when a live run of it counts as at rest. */\n force?: Omit<ForceProducerOptions<TPose>, 'geometry'>;\n /** Frames an eased layout takes to arrive. Default 24. */\n frames?: number;\n easing?: EasingFn;\n read?: DiagramNodeReader;\n geometry?: PoseDescriptor<TPose>;\n /** The undo entry's name. Default `'Layout'`. */\n label?: string;\n /** Fires once the run has settled or been stopped and its poses are in the\n * document, with how many participants moved. */\n onSettle?: (moved: number) => void;\n /** Hears why a `LayoutPlanner` failed to answer, and no run starts. Unset,\n * the failure goes to `console.error`. */\n onError?: (error: unknown) => void;\n /** Whether a node or edge appearing or disappearing re-heats the run.\n * Default true — a diagram that ignores a new edge looks broken. */\n reheatOnGraphChange?: boolean;\n /** Clock injection, for tests. Defaults to `requestAnimationFrame`. */\n requestFrame?: (cb: (t: number) => void) => number;\n cancelFrame?: (handle: number) => void;\n}\n\n/** Controls for a live layout run, from {@link useLiveLayout}. */\nexport interface LiveLayout {\n /** Heat and run. Idempotent while running, which includes waiting on a\n * planner's answer. */\n start(): void;\n /** Finish now: commit where the nodes stand. A planner's answer still to\n * come is dropped. */\n stop(): void;\n /** Abandon: the document keeps the poses it had. */\n cancel(): void;\n /** Rebuild the graph and run again from where the nodes are now. */\n restart(): void;\n isRunning(): boolean;\n}\n\n/** The graph `o.source` describes now. */\nfunction graphOf<TPose>(o: UseLiveLayoutOptions<TPose>): Graph {\n return buildGraph(o.source, {\n ...(o.read ? { read: o.read } : {}),\n ...(o.geometry ? { geometry: o.geometry } : {}),\n });\n}\n\n/** What `o.algorithm` plans for `graph`: `null` for a relaxation, which has\n * no destination, and a promise from a planner that answers later. */\nfunction planFor<TPose>(graph: Graph, o: UseLiveLayoutOptions<TPose>): LayoutPlan | Promise<LayoutPlan> | null {\n const algorithm = o.algorithm ?? 'force';\n if (algorithm === 'force') return null;\n if (typeof algorithm === 'object') return plannerPlan(algorithm, graph, o.layout);\n return planOf(typeof algorithm === 'function' ? algorithm : LAYOUTS[algorithm] ?? layered, graph, o.layout);\n}\n\n/** The producer that eases from `graph` to `plan`, or relaxes `graph` when\n * there is no plan. */\nfunction producerFor<TPose>(graph: Graph, plan: LayoutPlan | null, o: UseLiveLayoutOptions<TPose>): LiveLayoutProducer<TPose> {\n if (plan === null) return forceProducer<TPose>(graph, { ...o.layout, ...o.force, ...(o.geometry ? { geometry: o.geometry } : {}) });\n return easedProducer<TPose>(graph, () => plan.moves, {\n ...(o.frames === undefined ? {} : { frames: o.frames }),\n ...(o.easing ? { easing: o.easing } : {}),\n });\n}\n\n/**\n * Run a layout live against a scene.\n *\n * The returned handle is stable. Dragging a participant while it runs needs no\n * wiring: the consumer's move tool publishes an override, and the run treats\n * that as a pin.\n */\nexport function useLiveLayout<TPose>(opts: UseLiveLayoutOptions<TPose>): LiveLayout {\n const optsRef = useLatest(opts);\n\n const producer = useRef<LiveLayoutProducer<TPose> | null>(null);\n const producerFrame = useRef(0);\n const shape = useRef('');\n /** The routes the run's layout laid out, written once it arrives. */\n const routes = useRef<LayoutRoutes | undefined>(undefined);\n /** Whether a gesture held a participant during the run: the routes were\n * laid out around where it was going, not where it was put. */\n const held = useRef(false);\n const eased = useEasedRoutes<TPose>();\n\n const pending = usePendingPlan();\n\n /** Set the run up to ease from `graph` to `plan`, or to relax it when\n * there is no plan. */\n const install = useCallback((graph: Graph, plan: LayoutPlan | null): void => {\n const o = optsRef.current;\n producerFrame.current = 0;\n held.current = false;\n routes.current = routesOf(graph, plan ?? { moves: new Map() });\n eased.set(routeEasings(o.scene, graph, routes.current));\n producer.current = producerFor(graph, plan, o);\n }, [optsRef, eased]);\n\n const step = useCallback((ctx: PoseRunCtx<TPose>): PoseRunStep<TPose> => {\n const o = optsRef.current;\n if (producer.current === null) return { poses: [], done: true };\n if (ctx.pinned.size > 0) held.current = true;\n const frame = producerFrame.current++;\n const { result, done } = producer.current({ pinned: ctx.pinned, frame });\n // A pinned participant takes its subtree out of the frame with it: its\n // rows and labels are ids of their own, and left in they would be\n // published from the pose the document still holds.\n let placed = result;\n if (ctx.pinned.size > 0) {\n const held = new Map(result);\n for (const id of ctx.pinned.keys()) held.delete(id as string);\n placed = held;\n }\n const poses = layoutPoses(o.scene, placed, o.geometry);\n // Routes ease only toward where they will be written, which a held run never writes.\n const { u } = progress(frame, o.frames ?? EASE_FRAMES, o.easing ?? easeInOut);\n eased.show(o.scene, held.current ? null : u, (id) => poses.get(id) ?? ctx.pinned.get(id as NodeId), o.geometry);\n return { poses: [...poses] as [NodeId, TPose][], done };\n }, [optsRef, eased]);\n\n const run = usePoseRun<TPose>({\n scene: opts.scene,\n step,\n // Eased routes go once the routes are in the document, so no frame shows the old ones.\n onCommit: (moved) => { eased.drop(); optsRef.current.onSettle?.(moved); },\n // Routes match where the layout was going, so only a run that got there\n // with nothing held along the way writes them.\n commitWith: (finished) => {\n if (!finished || held.current || routes.current === undefined) return;\n const scene = optsRef.current.scene;\n for (const [id, data] of routeWrites(scene as never, routes.current)) scene.update(id as never, { data });\n },\n ...(opts.label ? { label: opts.label } : {}),\n ...(opts.requestFrame ? { requestFrame: opts.requestFrame } : {}),\n ...(opts.cancelFrame ? { cancelFrame: opts.cancelFrame } : {}),\n });\n\n /** Read the graph and set the run up on it: true once it is ready to run,\n * false while a planner's answer is on its way, after which it starts the\n * run itself. */\n const build = useCallback((): boolean => {\n const graph = graphOf(optsRef.current);\n shape.current = shapeOf(graph);\n const plan = planFor(graph, optsRef.current);\n if (plan === null || !isPromise(plan)) {\n install(graph, plan);\n return true;\n }\n pending.request(plan, (answer) => {\n if (!sameGraph(graph, graphOf(optsRef.current))) return;\n install(graph, answer);\n run.start();\n }, (error) => {\n const onError = optsRef.current.onError;\n if (onError) onError(error);\n else console.error(error);\n });\n return false;\n }, [optsRef, install, pending, run]);\n\n /** Abandon whatever is running or awaited, and start again from where the\n * nodes are now. */\n const restart = useCallback((): void => {\n pending.drop();\n run.cancel();\n if (build()) run.start();\n }, [pending, run, build]);\n\n // A node or edge appearing or disappearing is a new problem, so the run\n // re-heats rather than finishing the one it started on. A planner is asked\n // again, since its answer has no place for what changed.\n useEffect(() => {\n if (opts.reheatOnGraphChange === false) return;\n return opts.scene.subscribe(() => {\n if (!run.isRunning() && !pending.isWaiting()) return;\n if (shapeOf(graphOf(optsRef.current)) === shape.current) return;\n if (typeof optsRef.current.algorithm === 'object') restart();\n else build();\n });\n }, [opts.scene, opts.reheatOnGraphChange, run, build, restart, pending, optsRef]);\n\n return useMemo<LiveLayout>(() => ({\n start() {\n if (run.isRunning() || pending.isWaiting()) return;\n if (build()) run.start();\n },\n stop: () => { pending.drop(); run.stop(); },\n cancel: () => { pending.drop(); run.cancel(); eased.drop(); },\n restart,\n isRunning: () => run.isRunning() || pending.isWaiting(),\n }), [run, build, restart, eased, pending]);\n}\n\n/** The layouts that ease rather than relax, for a consumer choosing one. */\nexport const EASED_LAYOUTS: Readonly<Record<string, LayoutFn>> = Object.freeze({\n layered,\n tree,\n chain,\n});\n","/**\n * The painter for a node whose trait names an `outline`. A participant that\n * already had a look of its own (a text block, an image, a path) keeps it by\n * naming no outline at all.\n *\n * Rows are **not** painted here. A built body's rows are ordinary scene nodes\n * under the container, so the kit's own text painter draws them.\n */\nimport {\n commandFill,\n commandStroke,\n RECT_POSE_DESCRIPTOR,\n registerNodeShape,\n type NodeShapeEntry,\n type PoseDescriptor,\n type Stroke,\n type Fill,\n} from '@weasel-js/core';\nimport { outlinePath } from './outline';\nimport { diagramNodeOf, type DiagramNodeReader } from './trait';\n\n/** Options for {@link diagramShape} and {@link registerDiagramShape}. */\nexport interface DiagramShapeOptions<TPose> {\n /** Distinguishes one registration from another, and is what the disposer\n * removes. Default `'diagram:outline'`. */\n id?: string;\n /** How the trait is read. Default: the node's own `data.diagram`. */\n read?: DiagramNodeReader;\n /** Reads the box the outline is built in. Default `RECT_POSE_DESCRIPTOR`. */\n geometry?: PoseDescriptor<TPose>;\n /** Painted when the node's data declares neither. */\n defaultFill?: Fill | null;\n defaultStroke?: Stroke | null;\n}\n\n/** The entry, for a consumer composing their own painter list. */\nexport function diagramShape<TPose>(\n opts: DiagramShapeOptions<TPose> = {},\n): NodeShapeEntry<unknown, TPose> {\n const geometry = opts.geometry ?? (RECT_POSE_DESCRIPTOR as PoseDescriptor<TPose>);\n const outlineOf = (node: { id: string; kind: 'leaf' | 'container'; data: unknown }) =>\n diagramNodeOf(node, opts.read)?.outline;\n\n return {\n id: opts.id ?? 'diagram:outline',\n matches: (node) => outlineOf(node) !== undefined,\n paint: (node, pose) => {\n const outline = outlineOf(node);\n if (outline === undefined) return [];\n const d = node.data as { fill?: Fill | null; stroke?: Stroke | null };\n const box = geometry.getBounds(pose);\n const declaredFill = d.fill === undefined ? opts.defaultFill : d.fill;\n const declaredStroke = d.stroke === undefined ? opts.defaultStroke : d.stroke;\n const fill = declaredFill && commandFill(declaredFill, box);\n const stroke = declaredStroke && commandStroke(declaredStroke, box);\n return [{\n kind: 'path',\n path: outlinePath(outline, box),\n ...(fill ? { fill } : {}),\n ...(stroke ? { stroke } : {}),\n }];\n },\n // The drawn boundary, so picking and clipping follow the diamond rather\n // than its bounding box.\n silhouette: (node, pose) => {\n const outline = outlineOf(node);\n return outline === undefined ? null : outlinePath(outline, geometry.getBounds(pose));\n },\n };\n}\n\n/**\n * Register {@link diagramShape}. Returns the disposer, and takes `'high'`\n * priority so a body outline wins over a `data.shape` or `data.path` the same\n * node may also carry.\n */\nexport function registerDiagramShape<TPose>(opts: DiagramShapeOptions<TPose> = {}): () => void {\n return registerNodeShape(diagramShape(opts), { priority: 'high' });\n}\n","import { useLatest, type NodeId, type SelectionApi } from '@weasel-js/core';\nimport { useCallback, useEffect, useRef } from 'react';\n\n/** Keeps a canvas selection and a controlled `selected` prop in step: a prop\n * change is pushed in, and every click reports what the selection holds after\n * it — a re-click on the picked node included. Wire the returned handler to\n * `<SceneCanvas onClick>`. */\nexport function useMirroredSelection(\n selection: Pick<SelectionApi, 'get' | 'set'>,\n selected: string | null | undefined,\n onSelect: ((id: string | null) => void) | undefined,\n): () => void {\n const want = selected ?? null;\n const pushed = useRef<string | null | undefined>(undefined);\n useEffect(() => {\n if (pushed.current === want) return;\n pushed.current = want;\n if ((selection.get()[0] ?? null) !== want) selection.set(want === null ? [] : [want as NodeId]);\n // eslint-disable-next-line react-hooks/exhaustive-deps -- runs when the prop changes, not the canvas\n }, [want]);\n const onSelectRef = useLatest(onSelect);\n return useCallback(() => {\n onSelectRef.current?.((selection.get()[0] as string | undefined) ?? null);\n }, [selection, onSelectRef]);\n}\n","/**\n * `DiagramView`'s two-way sync with the data it was built from: new specs are\n * reconciled into the scene, and what a drag or a layout run changed is\n * reported back, so a consumer keeping the diagram as data can store it.\n * `diagramLayoutOf` reads the same report off a `diagramScene` build.\n */\nimport { reconcileSpecs, useLatest, type RectPose, type Scene } from '@weasel-js/core';\nimport type { Vec2 } from '@weasel-js/core/math';\nimport { useEffect, useRef } from 'react';\nimport { diagramEdgeOf, layoutOwnsRoute, samePoints, type DiagramEdge, type EdgeEnd } from './edgeTrait';\nimport type { DiagramSceneData, DiagramSpec } from './fromData';\nimport { diagramGroupOf } from './group';\nimport type { LayoutPorts } from './layout';\nimport { isPinned } from './trait';\n\n/** Where a moved node now stands. */\nexport interface NodeMove { id: string; x: number; y: number }\n\n/** An edge whose route or ports a layout run rewrote. `id` is the edge's\n * scene id, `edgeIdOf` of its data edge; `waypoints` is empty when the run\n * took a route away and left the edge straight, and `ports` names the ends\n * layout owns. Store them as the data edge's `routed` and `routedPorts`,\n * which stay layout's, not as `waypoints`, `fromPort` and `toPort`, which\n * would be the author's and rename the edge. */\nexport interface EdgeRoute { id: string; waypoints: readonly Vec2[]; ports: LayoutPorts }\n\ntype DiagramScene = Scene<DiagramSceneData, 'main', RectPose>;\n\ninterface Route { waypoints: readonly Vec2[]; ports: LayoutPorts }\n\ninterface Standing {\n nodes: Map<string, { x: number; y: number }>;\n routes: Map<string, Route>;\n}\n\nconst NONE: readonly Vec2[] = [];\n\n/** The port layout owns at `end`, if it named one. */\nconst laidPort = (end: EdgeEnd) => (end.laidOut !== undefined && end.port === end.laidOut ? end.laidOut : undefined);\n\nfunction portsOf(from: EdgeEnd, to: EdgeEnd): LayoutPorts {\n const f = laidPort(from);\n const t = laidPort(to);\n return { ...(f !== undefined ? { from: f } : {}), ...(t !== undefined ? { to: t } : {}) };\n}\n\nconst samePorts = (a: LayoutPorts, b: LayoutPorts) => a.from === b.from && a.to === b.to;\n\nconst routeOf = (edge: DiagramEdge): Route => ({ waypoints: edge.waypoints ?? NONE, ports: portsOf(edge.from, edge.to) });\n\nfunction readScene(scene: DiagramScene): Standing {\n const nodes = new Map<string, { x: number; y: number }>();\n const routes = new Map<string, Route>();\n for (const n of scene.renderOrderNodes()) {\n if (n.kind === 'container') {\n nodes.set(n.id, { x: n.pose.x, y: n.pose.y });\n continue;\n }\n const edge = diagramEdgeOf(n);\n if (edge !== null) routes.set(n.id, routeOf(edge));\n }\n return { nodes, routes };\n}\n\n/** What layout placed in a `diagramScene` build, in the shape `DiagramView`'s\n * `onMove` reports: every node not pinned, where it stands, and every edge\n * whose route or ports layout wrote. Store them the way `onMove` says and\n * the next build leaves those nodes where they are. */\nexport function diagramLayoutOf(specs: readonly DiagramSpec[]): { moves: NodeMove[]; routes: EdgeRoute[] } {\n const moves: NodeMove[] = [];\n const routes: EdgeRoute[] = [];\n for (const s of specs) {\n const id = s.id;\n if (id === undefined) continue;\n if (s.kind === 'container') {\n if (diagramGroupOf(s) === null && !isPinned({ id, kind: s.kind, data: s.data })) moves.push({ id, x: s.pose.x, y: s.pose.y });\n continue;\n }\n const edge = diagramEdgeOf(s);\n if (edge === null) continue;\n const route = routeOf(edge);\n const laid = edge.laidOut !== undefined && route.waypoints.length > 0 && layoutOwnsRoute(edge);\n if (laid || route.ports.from !== undefined || route.ports.to !== undefined) {\n routes.push({ id, waypoints: laid ? route.waypoints : NONE, ports: route.ports });\n }\n }\n return { moves, routes };\n}\n\nfunction changes(was: Standing, now: Standing): { moves: NodeMove[]; routes: EdgeRoute[] } {\n const moves: NodeMove[] = [];\n for (const [id, at] of now.nodes) {\n const before = was.nodes.get(id);\n if (before !== undefined && (before.x !== at.x || before.y !== at.y)) moves.push({ id, ...at });\n }\n const routes: EdgeRoute[] = [];\n for (const [id, after] of now.routes) {\n const before = was.routes.get(id);\n if (before === undefined) continue;\n const moved = before.waypoints !== after.waypoints && !samePoints(before.waypoints, after.waypoints);\n if (moved || !samePorts(before.ports, after.ports)) routes.push({ id, ...after });\n }\n return { moves, routes };\n}\n\n/** Reconcile `specs` into `scene` as they change, and report every move and\n * route change that did not come from a reconcile to `onMove`. */\nexport function useSceneSync(\n scene: DiagramScene,\n specs: readonly DiagramSpec[],\n onMove: ((moves: readonly NodeMove[], routes: readonly EdgeRoute[]) => void) | undefined,\n): void {\n const onMoveRef = useLatest(onMove);\n const syncing = useRef(false);\n const applied = useRef(specs);\n useEffect(() => {\n let known = readScene(scene);\n return scene.subscribe(() => {\n const now = readScene(scene);\n const found = syncing.current ? null : changes(known, now);\n known = now;\n if (found !== null && (found.moves.length > 0 || found.routes.length > 0)) {\n onMoveRef.current?.(found.moves, found.routes);\n }\n });\n }, [scene, onMoveRef]);\n useEffect(() => {\n if (applied.current === specs) return;\n syncing.current = true;\n try {\n reconcileSpecs(scene, applied.current as DiagramSpec[], specs as DiagramSpec[]);\n } finally {\n syncing.current = false;\n }\n applied.current = specs;\n }, [scene, specs]);\n}\n","import {\n dragPanContribution,\n fitViewToBounds,\n SceneCanvas,\n useLatest,\n useScene,\n useSelection,\n WeaselProvider,\n type Paint,\n type RectPose,\n type CanvasSize,\n type SceneCanvasApi,\n type View,\n} from '@weasel-js/core';\nimport { forwardRef, useEffect, useImperativeHandle, useMemo, useRef, useState, type Ref, type RefObject } from 'react';\nimport type { CanConnect } from './connect';\nimport { diagramPorts, type DiagramContributionOptions } from './contribution';\nimport { withDiagramRegistry } from './edge';\nimport { diagramGroupOf } from './group';\nimport type { DataEdge, DiagramSceneData, DiagramSpec } from './fromData';\nimport type { LayoutFn, LayoutPlanner } from './layout';\nimport { useLiveLayout, type LiveLayout, type UseLiveLayoutOptions } from './live';\nimport { useMirroredSelection } from './mirrorSelection';\nimport { portLayer, sceneParticipants } from './portLayer';\nimport { registerMarkShape } from './marks';\nimport { useSceneSync, type EdgeRoute, type NodeMove } from './sceneSync';\nimport { registerDiagramShape } from './shape';\n\nexport type { EdgeRoute, NodeMove } from './sceneSync';\n\n/** Props for `DiagramView`. */\nexport interface DiagramViewProps {\n /** Every spec needs an id, which `diagramScene` gives them. A new array is\n * reconciled into the scene the view already holds, so the view, the\n * selection and anything moved since stay put unless the new specs change\n * them. Pass a new `key` to start over instead. */\n specs: readonly DiagramSpec[];\n /** The view opens fitted to the diagram, and fits again when the size or a\n * fit option changes or a layout run settles, until the user pans or zooms;\n * from then on the view is theirs. Omit both to fill the parent, which\n * then needs a size of its own; a resize of the parent is a size change. */\n width?: number;\n height?: number;\n /** A participant id, or null for none. */\n selected?: string | null;\n /** Reports what each click leaves picked, `null` for none — a re-click on the\n * picked node reports it again. The canvas keeps the pick even if\n * `selected` does not follow it; only a change to `selected` is pushed in. */\n onSelect?: (id: string | null) => void;\n /** Set to let nodes be dragged. Reports every node a drag or a layout run\n * moved, and every edge whose route or ports a layout run rewrote. Store\n * each move as the data node's `at` with `pinned: true`, and each route as\n * the data edge's `routed` and `routedPorts`, or the next `diagramScene`\n * lays them out again. */\n onMove?: (moves: readonly NodeMove[], routes: readonly EdgeRoute[]) => void;\n /** Ports are grabbable when this is set, unless `ports` says otherwise. Dragging one port onto another reports the\n * edge it describes and draws nothing; add it to the data to keep it. */\n onConnect?: (edge: DataEdge) => void;\n /** Whether ports are drawn. `'connect'` draws them and lets one be dragged\n * onto another; `'show'` only draws them. Default: `'connect'` when\n * `onConnect` is set, else `'none'`. */\n ports?: 'connect' | 'show' | 'none';\n /** Whether the canvas's keyboard shortcuts — held Space to pan among them —\n * run. They listen page-wide, so a view-only diagram beside other UI would\n * claim keys meant for the page. Default: on when `onMove` or `onConnect`\n * is set. */\n enableKeybindings?: boolean;\n /** Which ports may be joined. Default: a port may not join itself, and two\n * typed ports must share a type. */\n canConnect?: CanConnect;\n /** How ports look and answer the pointer, and the router a connect's\n * preview draws with. */\n portOptions?: Pick<\n DiagramContributionOptions<RectPose>,\n 'fill' | 'stroke' | 'shape' | 'sizePx' | 'hitRadiusPx' | 'cursor' | 'shows' | 'showsPort' | 'snapRadius' | 'router'\n >;\n /** How a layout run from {@link DiagramViewApi.layout} behaves: its forces,\n * how many frames an eased layout takes, its easing, and `onError`, which\n * hears a `LayoutPlanner` that failed to answer. */\n live?: Omit<UseLiveLayoutOptions<RectPose>, 'scene' | 'source' | 'algorithm'>;\n /** The smallest scale the fit may use. Unset, the whole diagram fits\n * however small that makes it; set, it stops here and the rest is a pan away. */\n minScale?: number;\n /** The largest scale the fit may use. Default 1, so a small\n * diagram opens at its own size rather than blown up. */\n maxScale?: number;\n /** Which part of a diagram too big for the box it opens on: its middle\n * (default) or its top-left, where a layered flow begins. */\n anchor?: 'center' | 'start';\n /** Space kept clear around the diagram by the fit, in CSS pixels.\n * Default 16. */\n fitPadding?: number;\n /** What the canvas paints behind the diagram. Unset, it is transparent. */\n background?: Paint;\n /** The view, controlled. Set it and the fit is skipped; pair it\n * with `onViewChange` or panning does nothing. */\n view?: View;\n /** Every view change, from a pan, a zoom or a refit. */\n onViewChange?: (view: View) => void;\n className?: string;\n}\n\n/** What a `ref` on `DiagramView` holds. */\nexport interface DiagramViewApi {\n /** Lay the diagram out again from where its nodes stand, animated. `'force'`\n * (default) relaxes until it settles; any other layout eases to its answer.\n * A `LayoutPlanner` is handed the diagram's graph and eased to once it\n * answers; a drag, an edit or another `layout` call before then drops the\n * answer. What moved is reported to `onMove` once the run settles. */\n layout(algorithm?: DiagramLayout): void;\n /** The run `layout` started: stop it where it stands, or cancel it. */\n live: LiveLayout;\n}\n\n/** What {@link DiagramViewApi.layout} runs. */\nexport type DiagramLayout = 'layered' | 'tree' | 'force' | 'chain' | LayoutFn | LayoutPlanner;\n\nconst AMBIENT = [dragPanContribution()];\nconst IDENTITY: View = { x: 0, y: 0, scale: { x: 1, y: 1 } };\nconst sameView = (a: View, b: View) =>\n a.x === b.x && a.y === b.y && a.scale.x === b.scale.x && a.scale.y === b.scale.y;\nconst NO_MARQUEE = { areaSelect: null };\n\n/** A diagram: drag or wheel to pan, zoom, and pick a node; drag nodes with\n * `onMove`, join ports with `onConnect`. Labels paint only in a registered\n * font family; `diagramScene` defaults to sans-serif, so call\n * `registerCanvasFont('sans-serif')` or text renders blank. */\nexport const DiagramView = forwardRef<DiagramViewApi, DiagramViewProps>(function DiagramView(props, ref) {\n return (\n <WeaselProvider>\n <Inner {...props} apiRef={ref} />\n </WeaselProvider>\n );\n});\n\nfunction Inner({\n specs, width, height, selected, onSelect, onMove, onConnect, enableKeybindings, canConnect, portOptions, ports: portMode, live: liveOpts,\n minScale, maxScale, anchor, fitPadding, background, view, onViewChange, className, apiRef,\n}: DiagramViewProps & { apiRef: Ref<DiagramViewApi> }) {\n useEffect(() => {\n const disposers = [registerDiagramShape<RectPose>(), registerMarkShape<RectPose>()];\n return () => disposers.forEach((dispose) => dispose());\n }, []);\n const registry = useMemo(() => withDiagramRegistry<RectPose>(), []);\n const scene = useScene<DiagramSceneData, 'main', RectPose>({\n systemLayers: [{ id: 'main' }],\n initial: specs as DiagramSpec[],\n registry,\n });\n const selection = useSelection({ scene, mode: 'single' });\n const onClick = useMirroredSelection(selection, selected, onSelect);\n\n useSceneSync(scene, specs, onMove);\n\n const source = useMemo(() => sceneParticipants<RectPose>(scene), [scene]);\n // Each `layout()` call is a new run: the state change lands the algorithm in\n // the live layout's options before the effect restarts it.\n const [run, setRun] = useState<{ algorithm: DiagramLayout } | null>(null);\n const controlled = view !== undefined;\n const fills = width === undefined || height === undefined;\n const [measured, setMeasured] = useState<CanvasSize | null>(null);\n const boxWidth = width ?? measured?.width ?? 0;\n const boxHeight = height ?? measured?.height ?? 0;\n // A filling canvas is 0 × 0 until measured, and no box to fit into.\n const unsized = boxWidth === 0 || boxHeight === 0;\n const fitOpts = { minScale, maxScale, anchor, padding: fitPadding };\n const defaultView = useMemo(\n () => controlled || unsized ? undefined : fitDiagram(specs, { width: boxWidth, height: boxHeight }, fitOpts),\n // A later `specs` keeps the view it has.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [controlled, unsized, boxWidth, boxHeight, minScale, maxScale, anchor, fitPadding],\n );\n // A settled run's fit holds until the box or a fit option changes.\n const [settledFit, setSettledFit] = useState<{ view: View | undefined; over: View | undefined } | null>(null);\n const fit = settledFit !== null && settledFit.over === defaultView ? settledFit.view : defaultView;\n const settled = useLatest((moved: number) => {\n liveOpts?.onSettle?.(moved);\n if (controlled || moved === 0) return;\n const boxes = Array.from(source(), ({ node, pose }) => ({ ...node, pose }));\n setSettledFit({ view: fitDiagram(boxes, { width: boxWidth, height: boxHeight }, fitOpts), over: defaultView });\n });\n const live = useLiveLayout<RectPose>({\n ...liveOpts, scene, source, algorithm: run?.algorithm ?? 'force', onSettle: (moved) => settled.current(moved),\n });\n useEffect(() => {\n if (run !== null) live.restart();\n }, [run, live]);\n useImperativeHandle(apiRef, () => ({\n layout: (algorithm = 'force') => setRun({ algorithm }),\n live,\n }), [live]);\n\n const onConnectRef = useLatest(onConnect);\n const mode = portMode ?? (onConnect !== undefined ? 'connect' : 'none');\n const ports = useMemo(() => mode === 'connect'\n ? diagramPorts<RectPose>({\n ...portOptions,\n participants: source,\n ...(canConnect ? { canConnect } : {}),\n commit: ({ from, to }) => onConnectRef.current?.({\n from: from.nodeId, fromPort: from.id, to: to.nodeId, toPort: to.id,\n }),\n })\n : null, [mode, source, canConnect, portOptions, onConnectRef]);\n // A registered layer with no `hitTest` is painted and claims no press.\n const shown = useMemo(() => {\n if (mode !== 'show') return null;\n const { hitTest: _hitTest, ...paintOnly } = portLayer<RectPose>(source, portOptions);\n return paintOnly;\n }, [mode, source, portOptions]);\n const canvasRef = useRef<SceneCanvasApi | null>(null);\n const layer = ports?.layer ?? shown;\n useEffect(() => (layer ? canvasRef.current?.registerLayer(layer) : undefined), [layer]);\n const ambient = useMemo(() => (ports ? [...AMBIENT, ports.contribution] : AMBIENT), [ports]);\n\n useRefit(canvasRef, fit);\n return (\n <SceneCanvas\n ref={canvasRef}\n scene={scene}\n selection={selection}\n features={onMove ? ['view', 'pick', 'move'] : ['view', 'pick']}\n enableKeybindings={enableKeybindings ?? (onMove !== undefined || onConnect !== undefined)}\n ambient={ambient}\n // A drag on empty canvas pans: the select tool's marquee would outrank the ambient pan.\n actions={NO_MARQUEE}\n onClick={onClick}\n width={width}\n height={height}\n {...(fills ? { onResize: setMeasured } : {})}\n className={className}\n {...(defaultView ? { defaultView } : {})}\n {...(view ? { view } : {})}\n {...(onViewChange ? { onViewChange } : {})}\n {...(background ? { backgroundFill: background } : {})}\n />\n );\n}\n\n/** Apply each new fit while the view is still the last one applied. */\nfunction useRefit(canvasRef: RefObject<SceneCanvasApi | null>, fit: View | undefined): void {\n const fitted = useRef(fit);\n useEffect(() => {\n const canvas = canvasRef.current;\n const was = fitted.current;\n if (canvas === null || fit === undefined || was === fit) return;\n // A view the user has panned or zoomed off its fit is theirs to keep.\n if (!sameView(canvas.getView(), was ?? IDENTITY)) return;\n fitted.current = fit;\n canvas.setView(fit);\n }, [canvasRef, fit]);\n}\n\n/** How `fitDiagram` frames a diagram in its box. */\nexport interface DiagramFit {\n minScale?: number;\n maxScale?: number;\n anchor?: 'center' | 'start';\n padding?: number;\n}\n\n/** The view `DiagramView` opens on: every node box and group box in view, never above\n * `maxScale` (default 1) and never below `minScale`. Takes specs, or a scene's\n * nodes at the poses they are drawn at. */\nexport function fitDiagram(\n specs: readonly { kind: string; pose: unknown; data: unknown }[],\n size: { width: number; height: number },\n fit: DiagramFit = {},\n): View | undefined {\n const boxes = specs.filter((s) => s.kind === 'container' || diagramGroupOf(s) !== null).map((s) => s.pose as RectPose);\n if (boxes.length === 0) return undefined;\n const x = Math.min(...boxes.map((b) => b.x));\n const y = Math.min(...boxes.map((b) => b.y));\n const bounds = {\n x,\n y,\n width: Math.max(...boxes.map((b) => b.x + b.width)) - x,\n height: Math.max(...boxes.map((b) => b.y + b.height)) - y,\n };\n return fitViewToBounds(bounds, size, { x: 0, y: 0, scale: { x: 1, y: 1 } }, {\n maxScale: fit.maxScale ?? 1,\n ...(fit.minScale !== undefined ? { minScale: fit.minScale } : {}),\n ...(fit.anchor !== undefined ? { anchor: fit.anchor } : {}),\n ...(fit.padding !== undefined ? { padding: fit.padding } : {}),\n });\n}\n"]}