@weasel-js/diagram 1.10.0 → 1.10.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/group.ts","../src/label.ts","../src/selfLoop.ts","../src/edge.ts","../src/portAffordance.ts","../src/connect.ts","../src/portLayer.ts","../src/contribution.ts","../src/groupTree.ts","../src/graph.ts","../src/dataGroups.ts","../src/fromData.ts","../src/layoutAction.ts","../src/live.ts","../src/shape.ts","../src/mirrorSelection.ts","../src/DiagramView.tsx"],"names":["AUTO_POSE_DESCRIPTOR","translatePoseViaDescriptor","LAYOUTS","useRef","useEffect","useLatest","useCallback","DiagramView","useMemo"],"mappings":"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","file":"index.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 } from './cluster';\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: their union,\n * 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 = geometry.getBounds(dep.pose);\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 const inset = insetOf(group.inset);\n return geometry.fromBounds(\n {\n x: x0 - inset.left,\n y: y0 - inset.top,\n width: x1 - x0 + inset.left + inset.right,\n height: y1 - y0 + inset.top + inset.bottom,\n },\n node.pose,\n );\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 * 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 PoseDescriptor,\n} from '@weasel-js/core';\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. */\n at: 'start' | 'mid' | 'end' | number;\n /** World units perpendicular to the route, to the **left of the direction of\n * travel** — above a left-to-right edge. Default 0, which centers the label\n * on the line. */\n offset?: number;\n}\n\nconst NAMED = { start: 0, mid: 0.5, end: 1 } as const;\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/** 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 t = typeof label.at === 'number' ? label.at : NAMED[label.at] ?? 0.5;\n const station = pointAlongPath(path, t);\n if (station === null) return null;\n\n const offset = label.offset ?? 0;\n // Left of travel: with y down, that is above an edge running rightward.\n const x = station.point.x + station.tangent.y * offset;\n const y = station.point.y - station.tangent.x * offset;\n\n const bounds = geometry.getBounds(node.pose);\n return translatePoseViaDescriptor(\n node.pose,\n x - (bounds.x + bounds.width / 2),\n 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 * `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 { portOf, portsOf, type PortsOptions } from './ports';\nimport { selfLoop } from './selfLoop';\nimport type { Port } from './types';\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}\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}\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. Sampled rather than emitted as curve commands so\n * every router returns the 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 : null;\n const inN = i === stops.length - 1 ? req.to.normal : null;\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/** 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/** 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/**\n * The port an end resolves to: the one it named, else the port facing the\n * other end 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 named = portOf(dep.node as never, dep.pose, end.port, opts);\n if (named !== undefined) return named;\n }\n let best: Port | undefined;\n let bestScore = -Infinity;\n for (const port of allPorts(dep)) {\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 facing = port.normal === null\n ? 0\n : (port.normal.x * dx + port.normal.y * dy) / len;\n const score = facing - 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 the other's center, which is stable while both are\n // being resolved — aiming at the other *port* would be circular.\n const from = loop?.from ?? resolveEnd(edge.from, fromDep, centerOf(toDep), portOpts, allPorts);\n const to = loop?.to ?? resolveEnd(edge.to, toDep, centerOf(fromDep), portOpts, allPorts);\n if (from === undefined || to === undefined) return null;\n\n const authored = edge.waypoints ?? [];\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 { 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}\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 /** Screen-pixel hit radius. Default 8, the kit's `HANDLE_BASE_PX`. */\n hitRadiusPx?: number;\n /** Screen-pixel side of the painted square. Default 7. Omit `paint` entirely\n * by passing 0 — a port the consumer draws itself is still hittable. */\n sizePx?: number;\n fill?: CommandFill;\n stroke?: CommandStroke;\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\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 paint = sizePx <= 0\n ? undefined\n : {\n kind: 'square' as const,\n sizePx,\n ...(opts.fill ? { fill: opts.fill } : {}),\n ...(opts.stroke ? { stroke: opts.stroke } : {}),\n };\n\n return {\n id,\n regions(state: ChromeState): readonly AffordanceRegion[] {\n const out: AffordanceRegion[] = [];\n for (const { node, pose } of participants()) {\n if (opts.shows !== undefined && !opts.shows(node, state)) continue;\n for (const port of portsOf(node, pose, portOpts)) {\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 ...(paint ? { paint } : {}),\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 DiagramEdge, type Router } from './edge';\nimport { PORT_AFFORDANCE_KIND, portScratchOf, type ParticipantSource } 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 /** 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 function targetPort(from: Port, at: Vec2): Port | null {\n let best: Port | null = null;\n let bestD2 = snapRadius * snapRadius;\n for (const { node, pose } of opts.participants()) {\n for (const port of portsOf(node, pose, portOpts)) {\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(from: Port, at: Vec2): { port: Port | null; end: Port } {\n const port = targetPort(from, at);\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.from, 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.from, { 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 type RenderLayer,\n} from '@weasel-js/core';\nimport {\n PORT_LAYER_ID,\n createPortAffordance,\n type ParticipantSource,\n type PortAffordanceOptions,\n} from './portAffordance';\nimport type { GraphNodeLike, GraphSource } 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 two. */\nexport interface ParticipantScene<TPose> {\n renderOrderNodes(): readonly {\n id: string;\n kind: 'leaf' | 'container';\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.\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): GraphSource<TPose> {\n return function* () {\n for (const node of scene.renderOrderNodes()) {\n yield {\n node: node as GraphNodeLike,\n pose: effectivePose(scene as never, node as never) as TPose,\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 } from '@weasel-js/core/math';\nimport { expandGroupEdges, insetOf, type GroupInset } from './cluster';\nimport { diagramEdgeOf } from './edge';\nimport { nestGroups } from './groupTree';\nimport type { Bounds } from './outline';\nimport { diagramNodeOf, type DiagramNodeLike, type DiagramNodeReader } from './trait';\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}\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 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}\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 }[] = [];\n\n for (const { node, pose } of source()) {\n if (diagramEdgeOf(node) !== null) {\n const deps = node.dependsOn;\n if (Array.isArray(deps) && deps.length === 2) {\n candidates.push({ id: node.id, from: deps[0]!, to: deps[1]! });\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 });\n continue;\n }\n const entry: GraphNode = {\n id: node.id,\n bounds: geometry.getBounds(pose),\n pinned: trait.pinned === true,\n };\n nodes.push(entry);\n byId.set(entry.id, entry);\n }\n\n const insets = new Map(groupNodes.map((g) => [g.id, g.inset]));\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: insets.get(g.id)!,\n ...(g.parent !== undefined ? { parent: g.parent } : {}),\n };\n });\n const known = (id: string) => byId.has(id) || live.some((g) => g.id === id);\n const edges = expandGroupEdges(candidates.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\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 * `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, 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}\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 ...(g.parent !== undefined ? { parent: g.parent } : {}),\n };\n });\n}\n\ntype Rect = { x: number; y: number; width: number; height: number };\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.\n */\nexport function groupSpecs(\n groups: readonly ResolvedGroup[],\n placedAt: ReadonlyMap<string, Rect>,\n styleOf: (group: DataGroup) => { style: NodeStyle; text: NonNullable<DiagramSceneData['style']> },\n): DiagramSpec[] {\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 const x = Math.min(...rs.map((r) => r.x)) - g.inset.left;\n const y = Math.min(...rs.map((r) => r.y)) - g.inset.top;\n const box = {\n x,\n y,\n width: Math.max(...rs.map((r) => r.x + r.width)) + g.inset.right - x,\n height: Math.max(...rs.map((r) => r.y + r.height)) + g.inset.bottom - y,\n };\n boxes.set(id, box);\n return box;\n };\n const specs: DiagramSpec[] = [];\n for (const g of groups) {\n const { style, text } = styleOf(g.group);\n const { x, y, width, height } = boxOf(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 } },\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 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","/**\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 { buildBody, measureBody, sizeToBody, type BodySpec, type MeasureRowText, type Row, type RowTextStyle } from './body';\nimport { EDGE_DERIVE_PATH, type DiagramEdge } from './edge';\nimport { force } from './force';\nimport type { Graph, GraphEdge, GraphGroup, GraphNode } from './graph';\nimport type { DiagramAnchor } from './group';\nimport { LABEL_DERIVE_POSE, type DiagramLabel } from './label';\nimport { layered } from './layered';\nimport type { LayoutFn, LayoutOptions } from './layout';\nimport type { Outline } from './outline';\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 /** 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}\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. Default `DiagramSceneOptions.labelPlacement`. */\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}\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; `'none'` ignores groups but still draws\n * 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 };\n fill?: { paint: { color: string } };\n stroke?: Stroke;\n text?: string;\n style?: DiagramTextStyle;\n}\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' | '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] };\nconst LABEL_PLACEMENT: DiagramLabel = { at: 'mid', offset: 9 };\nconst LINE = 1.4;\nconst GLYPH = 0.6;\nconst MIN_WIDTH = 64;\nconst LAYOUTS = { layered, tree, force } as const;\n\n/** The scene node id `diagramScene` gives an edge, built from its ends, ports, and label. */\nexport const edgeIdOf = (e: DataEdge) =>\n `edge:${e.from}${e.fromPort ? `.${e.fromPort}` : ''}->${e.to}${e.toPort ? `.${e.toPort}` : ''}${e.label ? `:${e.label}` : ''}`;\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/** Every spec carries an id — a node's own, `<id>/<k>` for its text,\n * `<edge id>/label`, a group's own and `<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 // 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 return { id: n.id, bounds: pose, pinned: n.pinned === true };\n });\n const graphGroups: GraphGroup[] = groups.map((g) => ({\n id: g.group.id,\n members: g.members,\n inset: g.inset,\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) => ({ id: edgeIdOf(e), from: e.from, to: e.to })), graphGroups),\n graphGroups,\n );\n const layout = typeof opts.layout === 'function' ? opts.layout\n : opts.layout === 'none' ? null\n : LAYOUTS[opts.layout ?? 'layered'];\n const moved = layout === null ? new Map() : layout(graph, { order: 'barycenter', ...opts.layoutOptions });\n\n const specs: DiagramSpec[] = [];\n const placedAt = 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 // Behind every node, so a box never paints over what it holds.\n specs.push(...groupSpecs(groups, placedAt, (g) => ({\n style: opts.groupStyle?.(g) ?? GROUP,\n text: styleOf(titleStyle),\n })));\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 const textData = (text: string, s: RowTextStyle | undefined): DiagramSceneData =>\n ({ text, style: styleOf(s), fill: { paint: { color: style.text } } });\n const built = buildBody<DiagramSceneData, 'main', RectPose>(\n bodies[i]!,\n { x: at.x, y: at.y, width: seed.width, height: seed.height },\n {\n id: n.id,\n layer: 'main',\n measure,\n body: (trait) => ({\n diagram: n.pinned === true ? { ...trait, pinned: true } : trait,\n fill: { paint: { color: style.fill } },\n stroke: {\n paint: { color: style.stroke },\n width: style.strokeWidth ?? 2,\n ...(style.dash ? { dash: style.dash } : {}),\n },\n }),\n row: (text, box) =>\n text === '' ? null : textData(text, box.row.kind === 'label' || box.row.kind === 'field' ? box.row.style : undefined),\n portLabel: (text) => textData(text, undefined),\n },\n );\n for (const [k, s] of built.specs.entries()) {\n specs.push({ ...s, ...(k === 0 ? {} : { id: `${n.id}/${k}` }) } as DiagramSpec);\n }\n }\n\n for (const e of edges) {\n const id = edgeIdOf(e);\n const style = opts.edgeStyle?.(e) ?? EDGE;\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: e.fromPort ? { port: e.fromPort } : {},\n to: e.toPort ? { port: e.toPort } : {},\n router: e.router ?? opts.router ?? 'bezier',\n ...(e.waypoints ? { waypoints: e.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) {\n const labelStyle = { ...font, fontSize: font.fontSize - 2 };\n specs.push({\n id: `${id}/label` as never,\n kind: 'leaf',\n layer: 'main',\n pickable: false,\n pose: { x: 0, y: 0, width: measure(e.label, labelStyle).width, height: labelStyle.fontSize },\n data: {\n diagram: { label: e.labelPlacement ?? opts.labelPlacement ?? LABEL_PLACEMENT },\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 }\n return specs;\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 { layered } from './layered';\nimport { tree } from './tree';\nimport type { LayoutFn, LayoutOptions, LayoutResult } from './layout';\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});\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}\n\n/**\n * Write a layout's answer to the scene, as one undoable batch.\n *\n * Returns how many nodes moved, which is zero for a layout that had nothing to\n * do — nothing is written and no history entry is pushed.\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 if (poses.size === 0) return 0;\n scene.batch(opts.label ?? 'Layout', () => {\n for (const [id, pose] of poses) scene.setPose(id as never, pose);\n });\n // Participants, not the descendants they carried along: a caller asking how\n // much a layout did means the nodes it placed.\n let moved = 0;\n for (const id of result.keys()) if (poses.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 applyLayout(scene, algorithm(graph, opts.layout), {\n ...(opts.geometry ? { geometry: opts.geometry } : {}),\n ...(opts.label ? { label: opts.label } : {}),\n });\n },\n },\n enabled: () => true as const,\n };\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.\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 AUTO_POSE_DESCRIPTOR,\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 { forceRelaxation, type ForceOptions } from './force';\nimport { buildGraph, type Graph, type GraphSource } from './graph';\nimport { layered } from './layered';\nimport { LAYOUTS, layoutPoses } from './layoutAction';\nimport { center, type LayoutFn, type LayoutOptions, type LayoutResult } from './layout';\nimport { tree } from './tree';\nimport type { DiagramNodeReader } from './trait';\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. */\nconst 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. */\nconst easeInOut: EasingFn = (t) => (t < 0.5 ? 2 * t * t : 1 - (-2 * t + 2) ** 2 / 2);\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 = Math.min((frame + 1) / frames, 1);\n const u = easing(t);\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/** 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`, or a layout of the consumer's own. `'force'` relaxes\n * continuously; anything else eases to its answer. Default `'force'`. */\n algorithm?: string | LayoutFn;\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 /** 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. */\n start(): void;\n /** Finish now: commit where the nodes stand. */\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 shape of a graph, as a string that changes when a node or edge does. */\nfunction 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/**\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\n const build = useCallback((): void => {\n const o = optsRef.current;\n const graph = buildGraph(o.source, {\n ...(o.read ? { read: o.read } : {}),\n ...(o.geometry ? { geometry: o.geometry } : {}),\n });\n shape.current = shapeOf(graph);\n producerFrame.current = 0;\n const algorithm = o.algorithm ?? 'force';\n if (algorithm === 'force') {\n producer.current = forceProducer<TPose>(graph, {\n ...o.layout, ...o.force,\n ...(o.geometry ? { geometry: o.geometry } : {}),\n });\n return;\n }\n const fn = typeof algorithm === 'function' ? algorithm : LAYOUTS[algorithm] ?? layered;\n producer.current = easedProducer<TPose>(graph, fn, {\n ...(o.layout ? { layout: o.layout } : {}),\n ...(o.frames === undefined ? {} : { frames: o.frames }),\n ...(o.easing ? { easing: o.easing } : {}),\n });\n }, [optsRef]);\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 const { result, done } = producer.current({\n pinned: ctx.pinned,\n frame: producerFrame.current++,\n });\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 return { poses: [...poses] as [NodeId, TPose][], done };\n }, [optsRef]);\n\n const run = usePoseRun<TPose>({\n scene: opts.scene,\n step,\n onCommit: (moved) => optsRef.current.onSettle?.(moved),\n ...(opts.label ? { label: opts.label } : {}),\n ...(opts.requestFrame ? { requestFrame: opts.requestFrame } : {}),\n ...(opts.cancelFrame ? { cancelFrame: opts.cancelFrame } : {}),\n });\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.\n useEffect(() => {\n if (opts.reheatOnGraphChange === false) return;\n return opts.scene.subscribe(() => {\n if (!run.isRunning()) return;\n const o = optsRef.current;\n const graph = buildGraph(o.source, {\n ...(o.read ? { read: o.read } : {}),\n ...(o.geometry ? { geometry: o.geometry } : {}),\n });\n if (shapeOf(graph) === shape.current) return;\n build();\n });\n }, [opts.scene, opts.reheatOnGraphChange, run, build, optsRef]);\n\n return useMemo<LiveLayout>(() => ({\n start() {\n if (run.isRunning()) return;\n build();\n run.start();\n },\n stop: () => { run.stop(); },\n cancel: () => { run.cancel(); },\n restart() {\n run.cancel();\n build();\n run.start();\n },\n isRunning: () => run.isRunning(),\n }), [run, build]);\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});\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","import {\n dragPanContribution,\n fitViewToBounds,\n reconcileSpecs,\n SceneCanvas,\n useLatest,\n useScene,\n useSelection,\n WeaselProvider,\n type Paint,\n type RectPose,\n type SceneCanvasApi,\n type View,\n} from '@weasel-js/core';\nimport { forwardRef, useEffect, useImperativeHandle, useMemo, useRef, useState, type Ref } 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 } from './layout';\nimport { useLiveLayout, type LiveLayout, type UseLiveLayoutOptions } from './live';\nimport { useMirroredSelection } from './mirrorSelection';\nimport { sceneParticipants } from './portLayer';\nimport { registerDiagramShape } from './shape';\n\n/** Where a moved node now stands. */\nexport interface NodeMove { id: string; x: number; y: number }\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 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. Store each as the data node's `at` with `pinned: true`, or the\n * next `diagramScene` lays it out again. */\n onMove?: (moves: readonly NodeMove[]) => void;\n /** Set to make ports grabbable. 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 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' | 'sizePx' | 'hitRadiusPx' | 'cursor' | 'shows' | '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. */\n live?: Omit<UseLiveLayoutOptions<RectPose>, 'scene' | 'source' | 'algorithm'>;\n /** The smallest scale the initial 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 initial 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 initial 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 initial 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 the initial fit. */\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 * What moved is reported to `onMove` once the run settles. */\n layout(algorithm?: 'layered' | 'tree' | 'force' | LayoutFn): void;\n /** The run `layout` started: stop it where it stands, or cancel it. */\n live: LiveLayout;\n}\n\nconst AMBIENT = [dragPanContribution()];\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, live: liveOpts,\n minScale, maxScale, anchor, fitPadding, background, view, onViewChange, className, apiRef,\n}: DiagramViewProps & { apiRef: Ref<DiagramViewApi> }) {\n useEffect(() => registerDiagramShape<RectPose>(), []);\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 const onMoveRef = useLatest(onMove);\n const syncing = useRef(false);\n const applied = useRef(specs);\n const known = useRef<Map<string, { x: number; y: number }>>(new Map());\n useEffect(() => {\n const read = () => {\n const out = new Map<string, { x: number; y: number }>();\n for (const n of scene.renderOrderNodes()) {\n if (n.kind === 'container') out.set(n.id, { x: n.pose.x, y: n.pose.y });\n }\n return out;\n };\n known.current = read();\n return scene.subscribe(() => {\n const now = read();\n const moves: NodeMove[] = [];\n if (!syncing.current) {\n for (const [id, at] of now) {\n const was = known.current.get(id);\n if (was !== undefined && (was.x !== at.x || was.y !== at.y)) moves.push({ id, ...at });\n }\n }\n known.current = now;\n if (moves.length > 0) onMoveRef.current?.(moves);\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 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: 'layered' | 'tree' | 'force' | LayoutFn } | null>(null);\n const live = useLiveLayout<RectPose>({ ...liveOpts, scene, source, algorithm: run?.algorithm ?? 'force' });\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 connecting = onConnect !== undefined;\n const ports = useMemo(() => connecting\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, [connecting, source, canConnect, portOptions, onConnectRef]);\n const canvasRef = useRef<SceneCanvasApi | null>(null);\n useEffect(() => (ports ? canvasRef.current?.registerLayer(ports.layer) : undefined), [ports]);\n const ambient = useMemo(() => (ports ? [...AMBIENT, ports.contribution] : AMBIENT), [ports]);\n\n const controlled = view !== undefined;\n const defaultView = useMemo(\n () => controlled\n ? undefined\n : fitDiagram(specs, { width, height }, { minScale, maxScale, anchor, padding: fitPadding }),\n // The fit is where the view opens; a later `specs` keeps the view it has.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [controlled, width, height, minScale, maxScale, anchor, fitPadding],\n );\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 onClick={onClick}\n width={width}\n height={height}\n className={className}\n {...(defaultView ? { defaultView } : {})}\n {...(view ? { view } : {})}\n {...(onViewChange ? { onViewChange } : {})}\n {...(background ? { backgroundFill: background } : {})}\n />\n );\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`. */\nexport function fitDiagram(\n specs: readonly DiagramSpec[],\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"]}
1
+ {"version":3,"sources":["../src/group.ts","../src/label.ts","../src/selfLoop.ts","../src/edge.ts","../src/portAffordance.ts","../src/connect.ts","../src/portLayer.ts","../src/contribution.ts","../src/groupTree.ts","../src/graph.ts","../src/dataGroups.ts","../src/route.ts","../src/fromData.ts","../src/layoutAction.ts","../src/live.ts","../src/shape.ts","../src/mirrorSelection.ts","../src/DiagramView.tsx"],"names":["AUTO_POSE_DESCRIPTOR","translatePoseViaDescriptor","LAYOUTS","placed","useRef","useEffect","useLatest","useCallback","DiagramView","useMemo"],"mappings":"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","file":"index.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 } from './cluster';\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: their union,\n * 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 = geometry.getBounds(dep.pose);\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 * 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 PoseDescriptor,\n} from '@weasel-js/core';\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. */\n at: 'start' | 'mid' | 'end' | number;\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\nconst NAMED = { start: 0, mid: 0.5, end: 1 } as const;\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/** 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 t = typeof label.at === 'number' ? label.at : NAMED[label.at] ?? 0.5;\n const station = pointAlongPath(path, t);\n if (station === null) return null;\n\n const bounds = geometry.getBounds(node.pose);\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) * bounds.width + Math.abs(ny) * bounds.height) / 2;\n // Left of travel: with y down, that is above an edge running rightward.\n const x = station.point.x + nx * reach;\n const y = station.point.y + ny * reach;\n\n return translatePoseViaDescriptor(\n node.pose,\n x - (bounds.x + bounds.width / 2),\n 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 * `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 { portOf, portsOf, type PortsOptions } from './ports';\nimport { selfLoop } from './selfLoop';\nimport type { Port } from './types';\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}\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}\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/** The direction a smooth route passes an interior stop: from the stop before it toward the one after. */\nfunction through(stops: readonly Vec2[], i: number): Vec2 | null {\n const dx = stops[i + 1]!.x - stops[i - 1]!.x;\n const dy = stops[i + 1]!.y - stops[i - 1]!.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/** 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/**\n * The port an end resolves to: the one it named, else the port facing the\n * other end 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 named = portOf(dep.node as never, dep.pose, end.port, opts);\n if (named !== undefined) return named;\n }\n let best: Port | undefined;\n let bestScore = -Infinity;\n for (const port of allPorts(dep)) {\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 facing = port.normal === null\n ? 0\n : (port.normal.x * dx + port.normal.y * dy) / len;\n const score = facing - 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 the other's center, which is stable while both are\n // being resolved — aiming at the other *port* would be circular.\n const from = loop?.from ?? resolveEnd(edge.from, fromDep, centerOf(toDep), portOpts, allPorts);\n const to = loop?.to ?? resolveEnd(edge.to, toDep, centerOf(fromDep), portOpts, allPorts);\n if (from === undefined || to === undefined) return null;\n\n const authored = edge.waypoints ?? [];\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 { 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}\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 /** Screen-pixel hit radius. Default 8, the kit's `HANDLE_BASE_PX`. */\n hitRadiusPx?: number;\n /** Screen-pixel side of the painted square. Default 7. Omit `paint` entirely\n * by passing 0 — a port the consumer draws itself is still hittable. */\n sizePx?: number;\n fill?: CommandFill;\n stroke?: CommandStroke;\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\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 paint = sizePx <= 0\n ? undefined\n : {\n kind: 'square' as const,\n sizePx,\n ...(opts.fill ? { fill: opts.fill } : {}),\n ...(opts.stroke ? { stroke: opts.stroke } : {}),\n };\n\n return {\n id,\n regions(state: ChromeState): readonly AffordanceRegion[] {\n const out: AffordanceRegion[] = [];\n for (const { node, pose } of participants()) {\n if (opts.shows !== undefined && !opts.shows(node, state)) continue;\n for (const port of portsOf(node, pose, portOpts)) {\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 ...(paint ? { paint } : {}),\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 DiagramEdge, type Router } from './edge';\nimport { PORT_AFFORDANCE_KIND, portScratchOf, type ParticipantSource } 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 /** 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 function targetPort(from: Port, at: Vec2): Port | null {\n let best: Port | null = null;\n let bestD2 = snapRadius * snapRadius;\n for (const { node, pose } of opts.participants()) {\n for (const port of portsOf(node, pose, portOpts)) {\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(from: Port, at: Vec2): { port: Port | null; end: Port } {\n const port = targetPort(from, at);\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.from, 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.from, { 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 type RenderLayer,\n} from '@weasel-js/core';\nimport {\n PORT_LAYER_ID,\n createPortAffordance,\n type ParticipantSource,\n type PortAffordanceOptions,\n} from './portAffordance';\nimport type { GraphNodeLike, GraphSource } 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 two. */\nexport interface ParticipantScene<TPose> {\n renderOrderNodes(): readonly {\n id: string;\n kind: 'leaf' | 'container';\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.\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): GraphSource<TPose> {\n return function* () {\n for (const node of scene.renderOrderNodes()) {\n yield {\n node: node as GraphNodeLike,\n pose: effectivePose(scene as never, node as never) as TPose,\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 } from '@weasel-js/core/math';\nimport { expandGroupEdges, insetOf, type GroupInset } from './cluster';\nimport { diagramEdgeOf } from './edge';\nimport { nestGroups } from './groupTree';\nimport type { Bounds } from './outline';\nimport { diagramNodeOf, type DiagramNodeLike, type DiagramNodeReader } from './trait';\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}\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}\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\n for (const { node, pose } of source()) {\n if (diagramEdgeOf(node) !== null) {\n const deps = node.dependsOn;\n if (Array.isArray(deps) && deps.length === 2) {\n candidates.push({ id: node.id, from: deps[0]!, to: deps[1]! });\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 };\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 const edges = expandGroupEdges(candidates.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\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 * `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/** Each group's box around where its members were placed. */\nexport function groupBoxes(\n groups: readonly ResolvedGroup[],\n placedAt: ReadonlyMap<string, Rect>,\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 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.\n */\nexport function groupSpecs(\n groups: readonly ResolvedGroup[],\n placedAt: ReadonlyMap<string, Rect>,\n styleOf: (group: DataGroup) => { style: NodeStyle; text: NonNullable<DiagramSceneData['style']> },\n): DiagramSpec[] {\n const boxes = groupBoxes(groups, placedAt);\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 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","/**\n * Routes for a laid-out `layered` diagram.\n *\n * An edge running down the ranks leaves its source by the face toward the\n * next rank and arrives at its target's face toward the last, so it reads\n * along the direction the diagram flows. An edge that skips ranks gets\n * waypoints through the gaps in each rank it crosses, so it goes around the\n * nodes between its ends rather than through them.\n *\n * An edge running back up the ranks, or within one, is left to the ends'\n * facing rule.\n */\nimport type { Vec2 } from '@weasel-js/core/math';\nimport type { Graph } from './graph';\nimport { backEdges, ranksOf } from './layered';\nimport { axesFor, type LayoutDirection } from './layout';\n\ntype Rect = { x: number; y: number; width: number; height: number };\n\n/** One edge to route, by the ids of its ends: a node's or a group's. */\nexport interface RouteEdge {\n id: string;\n from: string;\n to: string;\n}\n\n/** What {@link layeredRoutes} hands an edge. A field is absent where the\n * default does as well. */\nexport interface LayeredRoute {\n fromPort?: string;\n toPort?: string;\n waypoints?: readonly Vec2[];\n}\n\n/** What {@link layeredRoutes} reads: the ranked graph, and where everything landed. */\nexport interface LayeredRouteInput {\n /** The graph layout ranked, for which rank each node is in. */\n graph: Graph;\n edges: readonly RouteEdge[];\n /** Every node and group box where it was placed. */\n boxes: ReadonlyMap<string, Rect>;\n /** Each group's node members, through nested groups. */\n members: ReadonlyMap<string, readonly string[]>;\n /** Ids whose ports are the four compass midpoints, which are the only ones\n * a route names. */\n compass: ReadonlySet<string>;\n direction?: LayoutDirection;\n /** How far a route keeps from the boxes it passes. */\n clearance: number;\n}\n\n/** The compass port facing the next rank, and the one facing the last. */\nconst FACES: Record<LayoutDirection, { out: string; in: string }> = {\n down: { out: 's', in: 'n' },\n up: { out: 'n', in: 's' },\n right: { out: 'e', in: 'w' },\n left: { out: 'w', in: 'e' },\n};\n\n/** Ports and waypoints for each edge of a laid-out `layered` diagram that\n * needs any, keyed by edge id. */\nexport function layeredRoutes(input: LayeredRouteInput): Map<string, LayeredRoute> {\n const { graph, boxes, members, compass, clearance } = input;\n const direction = input.direction ?? 'down';\n const axes = axesFor(direction);\n const faces = FACES[direction];\n const ranks = ranksOf(graph, backEdges(graph));\n\n const span = (id: string): [number, number] | null => {\n const ids = members.get(id) ?? [id];\n const rs = ids.map((m) => ranks.get(m)).filter((r): r is number => r !== undefined);\n return rs.length === 0 ? null : [Math.min(...rs), Math.max(...rs)];\n };\n const lo = (r: Rect, axis: 'x' | 'y') => (axis === 'x' ? r.x : r.y);\n const hi = (r: Rect, axis: 'x' | 'y') => (axis === 'x' ? r.x + r.width : r.y + r.height);\n const mid = (r: Rect, axis: 'x' | 'y') => (lo(r, axis) + hi(r, axis)) / 2;\n\n const byRank = new Map<number, Rect[]>();\n for (const node of graph.nodes) {\n const rank = ranks.get(node.id);\n const box = boxes.get(node.id);\n if (rank === undefined || box === undefined) continue;\n byRank.set(rank, [...(byRank.get(rank) ?? []), box]);\n }\n\n const routes = new Map<string, LayeredRoute>();\n for (const edge of input.edges) {\n const from = span(edge.from);\n const to = span(edge.to);\n const a = boxes.get(edge.from);\n const b = boxes.get(edge.to);\n // Ranks run along `direction` in rank number whichever way the world axis\n // points, so a forward edge is one whose target ranks past its source.\n if (from === null || to === null || a === undefined || b === undefined || from[1] >= to[0]) continue;\n const route: LayeredRoute = {};\n if (compass.has(edge.from)) route.fromPort = faces.out;\n if (compass.has(edge.to)) route.toPort = faces.in;\n\n const near = axes.sign === 1 ? hi : lo;\n const far = axes.sign === 1 ? lo : hi;\n const start = { cross: mid(a, axes.cross), rank: near(a, axes.rank) };\n const end = { cross: mid(b, axes.cross), rank: far(b, axes.rank) };\n const ends = new Set([edge.from, edge.to, ...(members.get(edge.from) ?? []), ...(members.get(edge.to) ?? [])]);\n // A group box an end sits in is one the edge has to cross.\n const groupsInWay = [...members].filter(([g, ms]) => !ends.has(g) && !ms.some((m) => ends.has(m)));\n\n const stops: { cross: number; rank: number }[] = [];\n let blocked = false;\n for (let k = from[1] + 1; k < to[0]; k++) {\n const row = byRank.get(k) ?? [];\n if (row.length === 0) continue;\n const bandLo = Math.min(...row.map((r) => lo(r, axes.rank)));\n const bandHi = Math.max(...row.map((r) => hi(r, axes.rank)));\n const obstacles = [...row];\n for (const [g] of groupsInWay) {\n const box = boxes.get(g);\n if (box !== undefined && lo(box, axes.rank) < bandHi && hi(box, axes.rank) > bandLo) obstacles.push(box);\n }\n const t = ((bandLo + bandHi) / 2 - start.rank) / (end.rank - start.rank);\n const ideal = start.cross + (end.cross - start.cross) * t;\n const cross = freeAt(ideal, obstacles.map((r) => [lo(r, axes.cross) - clearance, hi(r, axes.cross) + clearance]));\n if (cross !== ideal) blocked = true;\n const [first, last] = axes.sign === 1 ? [bandLo, bandHi] : [bandHi, bandLo];\n stops.push({ cross, rank: first }, { cross, rank: last });\n }\n if (blocked) {\n route.waypoints = stops.map((s) => (axes.rank === 'y' ? { x: s.cross, y: s.rank } : { x: s.rank, y: s.cross }));\n }\n if (route.fromPort !== undefined || route.toPort !== undefined || route.waypoints !== undefined) {\n routes.set(edge.id, route);\n }\n }\n return routes;\n}\n\n/** Each edge's ports and waypoints: the author's where given, else\n * {@link layeredRoutes}'. */\nexport function authoredOver(\n edges: readonly (RouteEdge & LayeredRoute)[],\n input: Omit<LayeredRouteInput, 'edges'>,\n): Map<string, LayeredRoute> {\n const routes = layeredRoutes({ ...input, edges });\n return new Map(edges.map((e) => {\n const r = routes.get(e.id);\n const fromPort = e.fromPort ?? r?.fromPort;\n const toPort = e.toPort ?? r?.toPort;\n const waypoints = e.waypoints ?? r?.waypoints;\n return [e.id, { ...(fromPort ? { fromPort } : {}), ...(toPort ? { toPort } : {}), ...(waypoints ? { waypoints } : {}) }];\n }));\n}\n\n/** The point nearest `at` that lies in none of `spans`. Spans that only touch\n * leave the point where they meet free. */\nfunction freeAt(at: number, spans: readonly (readonly [number, number])[]): number {\n const sorted = [...spans].sort((p, q) => p[0] - q[0]);\n const merged: [number, number][] = [];\n for (const [s, e] of sorted) {\n const top = merged[merged.length - 1];\n if (top !== undefined && s < top[1]) top[1] = Math.max(top[1], e);\n else merged.push([s, e]);\n }\n for (const [s, e] of merged) {\n if (at > s && at < e) return at - s <= e - at ? s : e;\n }\n return at;\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 { groupBoxes, groupSpecs, resolveGroups, type ResolvedGroup } from './dataGroups';\nimport { buildBody, measureBody, sizeToBody, type BodySpec, type MeasureRowText, type Row, type RowTextStyle } from './body';\nimport { EDGE_DERIVE_PATH, type DiagramEdge } from './edge';\nimport { force } from './force';\nimport type { Graph, GraphEdge, GraphGroup, GraphNode } from './graph';\nimport type { DiagramAnchor } from './group';\nimport { LABEL_DERIVE_POSE, type DiagramLabel } from './label';\nimport { layered } from './layered';\nimport { DEFAULT_NODE_GAP, type LayoutFn, type LayoutOptions } from './layout';\nimport type { Outline } from './outline';\nimport { authoredOver, type LayeredRoute } 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 /** 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}\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. Default `DiagramSceneOptions.labelPlacement`. */\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}\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; `'none'` ignores groups but still draws\n * 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 };\n fill?: { paint: { color: string } };\n stroke?: Stroke;\n text?: string;\n style?: DiagramTextStyle;\n}\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' | '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] };\nconst LABEL_PLACEMENT: DiagramLabel = { at: 'mid', offset: 9 };\nconst LINE = 1.4;\nconst GLYPH = 0.6;\nconst MIN_WIDTH = 64;\nconst LAYOUTS = { layered, tree, force } as const;\n\n/** The scene node id `diagramScene` gives an edge, built from its ends, ports, and label. */\nexport const edgeIdOf = (e: DataEdge) =>\n `edge:${e.from}${e.fromPort ? `.${e.fromPort}` : ''}->${e.to}${e.toPort ? `.${e.toPort}` : ''}${e.label ? `:${e.label}` : ''}`;\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/** Each edge's ports and waypoints under `layered`: the author's where given, else `layeredRoutes`'. */\nfunction routed(data: DiagramData, edges: readonly DataEdge[], graph: Graph, groups: readonly ResolvedGroup[],\n placedAt: ReadonlyMap<string, Rect>, layoutOptions: LayoutOptions): Map<string, LayeredRoute> {\n return authoredOver(edges.map((e) => ({ ...e, id: edgeIdOf(e) })), {\n graph,\n boxes: new Map([...placedAt, ...groupBoxes(groups, placedAt)]),\n members: new Map(groups.map((g) => [g.group.id, g.members])),\n compass: new Set([...data.nodes.filter((n) => n.ports === undefined).map((n) => n.id), ...groups.map((g) => g.group.id)]),\n clearance: (layoutOptions.nodeGap ?? DEFAULT_NODE_GAP) / 2,\n ...(layoutOptions.direction ? { direction: layoutOptions.direction } : {}),\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/** Every spec carries an id — a node's own, `<id>/<k>` for its text,\n * `<edge id>/label`, a group's own and `<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 // 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 return { id: n.id, bounds: pose, pinned: n.pinned === true };\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) => ({ id: edgeIdOf(e), from: e.from, to: e.to })), graphGroups),\n graphGroups,\n );\n const layout = 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 moved = layout === null ? new Map() : layout(graph, layoutOptions);\n\n const specs: DiagramSpec[] = [];\n const placedAt = placed(data, seeds, moved);\n const routes = layout === layered ? routed(data, edges, graph, groups, placedAt, layoutOptions) : null;\n // Behind every node, so a box never paints over what it holds.\n specs.push(...groupSpecs(groups, placedAt, (g) => ({\n style: opts.groupStyle?.(g) ?? GROUP,\n text: styleOf(titleStyle),\n })));\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 const textData = (text: string, s: RowTextStyle | undefined): DiagramSceneData =>\n ({ text, style: styleOf(s), fill: { paint: { color: style.text } } });\n const built = buildBody<DiagramSceneData, 'main', RectPose>(\n bodies[i]!,\n { x: at.x, y: at.y, width: seed.width, height: seed.height },\n {\n id: n.id,\n layer: 'main',\n measure,\n body: (trait) => ({\n diagram: n.pinned === true ? { ...trait, pinned: true } : trait,\n fill: { paint: { color: style.fill } },\n stroke: {\n paint: { color: style.stroke },\n width: style.strokeWidth ?? 2,\n ...(style.dash ? { dash: style.dash } : {}),\n },\n }),\n row: (text, box) =>\n text === '' ? null : textData(text, box.row.kind === 'label' || box.row.kind === 'field' ? box.row.style : undefined),\n portLabel: (text) => textData(text, undefined),\n },\n );\n for (const [k, s] of built.specs.entries()) {\n specs.push({ ...s, ...(k === 0 ? {} : { id: `${n.id}/${k}` }) } as DiagramSpec);\n }\n }\n\n for (const e of edges) {\n const id = edgeIdOf(e);\n const { fromPort, toPort, waypoints } = routes?.get(id) ?? e;\n const style = opts.edgeStyle?.(e) ?? EDGE;\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: fromPort ? { port: fromPort } : {},\n to: toPort ? { port: toPort } : {},\n router: e.router ?? opts.router ?? 'bezier',\n ...(waypoints ? { 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) {\n const labelStyle = { ...font, fontSize: font.fontSize - 2 };\n specs.push({\n id: `${id}/label` as never,\n kind: 'leaf',\n layer: 'main',\n pickable: false,\n pose: { x: 0, y: 0, width: measure(e.label, labelStyle).width, height: labelStyle.fontSize },\n data: {\n diagram: { label: e.labelPlacement ?? opts.labelPlacement ?? LABEL_PLACEMENT },\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 }\n return specs;\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 { layered } from './layered';\nimport { tree } from './tree';\nimport type { LayoutFn, LayoutOptions, LayoutResult } from './layout';\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});\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}\n\n/**\n * Write a layout's answer to the scene, as one undoable batch.\n *\n * Returns how many nodes moved, which is zero for a layout that had nothing to\n * do — nothing is written and no history entry is pushed.\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 if (poses.size === 0) return 0;\n scene.batch(opts.label ?? 'Layout', () => {\n for (const [id, pose] of poses) scene.setPose(id as never, pose);\n });\n // Participants, not the descendants they carried along: a caller asking how\n // much a layout did means the nodes it placed.\n let moved = 0;\n for (const id of result.keys()) if (poses.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 applyLayout(scene, algorithm(graph, opts.layout), {\n ...(opts.geometry ? { geometry: opts.geometry } : {}),\n ...(opts.label ? { label: opts.label } : {}),\n });\n },\n },\n enabled: () => true as const,\n };\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.\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 AUTO_POSE_DESCRIPTOR,\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 { forceRelaxation, type ForceOptions } from './force';\nimport { buildGraph, type Graph, type GraphSource } from './graph';\nimport { layered } from './layered';\nimport { LAYOUTS, layoutPoses } from './layoutAction';\nimport { center, type LayoutFn, type LayoutOptions, type LayoutResult } from './layout';\nimport { tree } from './tree';\nimport type { DiagramNodeReader } from './trait';\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. */\nconst 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. */\nconst easeInOut: EasingFn = (t) => (t < 0.5 ? 2 * t * t : 1 - (-2 * t + 2) ** 2 / 2);\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 = Math.min((frame + 1) / frames, 1);\n const u = easing(t);\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/** 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`, or a layout of the consumer's own. `'force'` relaxes\n * continuously; anything else eases to its answer. Default `'force'`. */\n algorithm?: string | LayoutFn;\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 /** 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. */\n start(): void;\n /** Finish now: commit where the nodes stand. */\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 shape of a graph, as a string that changes when a node or edge does. */\nfunction 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/**\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\n const build = useCallback((): void => {\n const o = optsRef.current;\n const graph = buildGraph(o.source, {\n ...(o.read ? { read: o.read } : {}),\n ...(o.geometry ? { geometry: o.geometry } : {}),\n });\n shape.current = shapeOf(graph);\n producerFrame.current = 0;\n const algorithm = o.algorithm ?? 'force';\n if (algorithm === 'force') {\n producer.current = forceProducer<TPose>(graph, {\n ...o.layout, ...o.force,\n ...(o.geometry ? { geometry: o.geometry } : {}),\n });\n return;\n }\n const fn = typeof algorithm === 'function' ? algorithm : LAYOUTS[algorithm] ?? layered;\n producer.current = easedProducer<TPose>(graph, fn, {\n ...(o.layout ? { layout: o.layout } : {}),\n ...(o.frames === undefined ? {} : { frames: o.frames }),\n ...(o.easing ? { easing: o.easing } : {}),\n });\n }, [optsRef]);\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 const { result, done } = producer.current({\n pinned: ctx.pinned,\n frame: producerFrame.current++,\n });\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 return { poses: [...poses] as [NodeId, TPose][], done };\n }, [optsRef]);\n\n const run = usePoseRun<TPose>({\n scene: opts.scene,\n step,\n onCommit: (moved) => optsRef.current.onSettle?.(moved),\n ...(opts.label ? { label: opts.label } : {}),\n ...(opts.requestFrame ? { requestFrame: opts.requestFrame } : {}),\n ...(opts.cancelFrame ? { cancelFrame: opts.cancelFrame } : {}),\n });\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.\n useEffect(() => {\n if (opts.reheatOnGraphChange === false) return;\n return opts.scene.subscribe(() => {\n if (!run.isRunning()) return;\n const o = optsRef.current;\n const graph = buildGraph(o.source, {\n ...(o.read ? { read: o.read } : {}),\n ...(o.geometry ? { geometry: o.geometry } : {}),\n });\n if (shapeOf(graph) === shape.current) return;\n build();\n });\n }, [opts.scene, opts.reheatOnGraphChange, run, build, optsRef]);\n\n return useMemo<LiveLayout>(() => ({\n start() {\n if (run.isRunning()) return;\n build();\n run.start();\n },\n stop: () => { run.stop(); },\n cancel: () => { run.cancel(); },\n restart() {\n run.cancel();\n build();\n run.start();\n },\n isRunning: () => run.isRunning(),\n }), [run, build]);\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});\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","import {\n dragPanContribution,\n fitViewToBounds,\n reconcileSpecs,\n SceneCanvas,\n useLatest,\n useScene,\n useSelection,\n WeaselProvider,\n type Paint,\n type RectPose,\n type SceneCanvasApi,\n type View,\n} from '@weasel-js/core';\nimport { forwardRef, useEffect, useImperativeHandle, useMemo, useRef, useState, type Ref } 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 } from './layout';\nimport { useLiveLayout, type LiveLayout, type UseLiveLayoutOptions } from './live';\nimport { useMirroredSelection } from './mirrorSelection';\nimport { sceneParticipants } from './portLayer';\nimport { registerDiagramShape } from './shape';\n\n/** Where a moved node now stands. */\nexport interface NodeMove { id: string; x: number; y: number }\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 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. Store each as the data node's `at` with `pinned: true`, or the\n * next `diagramScene` lays it out again. */\n onMove?: (moves: readonly NodeMove[]) => void;\n /** Set to make ports grabbable. 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 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' | 'sizePx' | 'hitRadiusPx' | 'cursor' | 'shows' | '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. */\n live?: Omit<UseLiveLayoutOptions<RectPose>, 'scene' | 'source' | 'algorithm'>;\n /** The smallest scale the initial 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 initial 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 initial 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 initial 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 the initial fit. */\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 * What moved is reported to `onMove` once the run settles. */\n layout(algorithm?: 'layered' | 'tree' | 'force' | LayoutFn): void;\n /** The run `layout` started: stop it where it stands, or cancel it. */\n live: LiveLayout;\n}\n\nconst AMBIENT = [dragPanContribution()];\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, live: liveOpts,\n minScale, maxScale, anchor, fitPadding, background, view, onViewChange, className, apiRef,\n}: DiagramViewProps & { apiRef: Ref<DiagramViewApi> }) {\n useEffect(() => registerDiagramShape<RectPose>(), []);\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 const onMoveRef = useLatest(onMove);\n const syncing = useRef(false);\n const applied = useRef(specs);\n const known = useRef<Map<string, { x: number; y: number }>>(new Map());\n useEffect(() => {\n const read = () => {\n const out = new Map<string, { x: number; y: number }>();\n for (const n of scene.renderOrderNodes()) {\n if (n.kind === 'container') out.set(n.id, { x: n.pose.x, y: n.pose.y });\n }\n return out;\n };\n known.current = read();\n return scene.subscribe(() => {\n const now = read();\n const moves: NodeMove[] = [];\n if (!syncing.current) {\n for (const [id, at] of now) {\n const was = known.current.get(id);\n if (was !== undefined && (was.x !== at.x || was.y !== at.y)) moves.push({ id, ...at });\n }\n }\n known.current = now;\n if (moves.length > 0) onMoveRef.current?.(moves);\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 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: 'layered' | 'tree' | 'force' | LayoutFn } | null>(null);\n const live = useLiveLayout<RectPose>({ ...liveOpts, scene, source, algorithm: run?.algorithm ?? 'force' });\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 connecting = onConnect !== undefined;\n const ports = useMemo(() => connecting\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, [connecting, source, canConnect, portOptions, onConnectRef]);\n const canvasRef = useRef<SceneCanvasApi | null>(null);\n useEffect(() => (ports ? canvasRef.current?.registerLayer(ports.layer) : undefined), [ports]);\n const ambient = useMemo(() => (ports ? [...AMBIENT, ports.contribution] : AMBIENT), [ports]);\n\n const controlled = view !== undefined;\n const defaultView = useMemo(\n () => controlled\n ? undefined\n : fitDiagram(specs, { width, height }, { minScale, maxScale, anchor, padding: fitPadding }),\n // The fit is where the view opens; a later `specs` keeps the view it has.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [controlled, width, height, minScale, maxScale, anchor, fitPadding],\n );\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 className={className}\n {...(defaultView ? { defaultView } : {})}\n {...(view ? { view } : {})}\n {...(onViewChange ? { onViewChange } : {})}\n {...(background ? { backgroundFill: background } : {})}\n />\n );\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`. */\nexport function fitDiagram(\n specs: readonly DiagramSpec[],\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"]}