@weasel-js/diagram 1.10.1 → 1.11.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/README.md +1160 -26
- package/dist/chunk-43LDZ6L4.js +2053 -0
- package/dist/chunk-43LDZ6L4.js.map +1 -0
- package/dist/chunk-CI3I3I6T.js +3600 -0
- package/dist/chunk-CI3I3I6T.js.map +1 -0
- package/dist/chunk-IM6DHWZO.js +3220 -0
- package/dist/chunk-IM6DHWZO.js.map +1 -0
- package/dist/chunk-QKSWZEJH.js +312 -0
- package/dist/chunk-QKSWZEJH.js.map +1 -0
- package/dist/chunk-T6DQT553.js +1431 -0
- package/dist/chunk-T6DQT553.js.map +1 -0
- package/dist/chunk-WDIE35AK.js +3 -0
- package/dist/chunk-WDIE35AK.js.map +1 -0
- package/dist/dataTypes-B-iEwKZp.d.ts +553 -0
- package/dist/effect-audio.d.ts +138 -0
- package/dist/effect-audio.js +527 -0
- package/dist/effect-audio.js.map +1 -0
- package/dist/effect.d.ts +782 -0
- package/dist/effect.js +2542 -0
- package/dist/effect.js.map +1 -0
- package/dist/icons.table.d.ts +6 -0
- package/dist/icons.table.js +32 -0
- package/dist/icons.table.js.map +1 -0
- package/dist/icons.table.json +24 -0
- package/dist/index.d.ts +2270 -355
- package/dist/index.js +953 -1331
- package/dist/index.js.map +1 -1
- package/dist/layout.d.ts +3 -2
- package/dist/layout.entry-CH9gc0CY.d.ts +512 -0
- package/dist/layout.js +3 -1
- package/dist/stageTypes-DvnR8cKQ.d.ts +189 -0
- package/dist/{layout.entry-BUkiRKuX.d.ts → types-BbHunLXm.d.ts} +382 -261
- package/package.json +32 -7
- package/dist/chunk-JZ4CVLAB.js +0 -1247
- package/dist/chunk-JZ4CVLAB.js.map +0 -1
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/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"]}
|
|
1
|
+
{"version":3,"sources":["../src/connectorTool.ts","../src/stencil.ts","../src/stencilTool.ts","../src/waypointFollower.ts","../src/passOrder.ts","../src/avoid/install.ts","../src/avoid/useAvoidRouting.ts","../src/hops/follower.ts","../src/hops/install.ts","../src/hops/useHops.ts","../src/labels/fit.ts","../src/labels/install.ts","../src/labels/useLabelPlacement.ts","../src/offPage/endBox.ts","../src/offPage/install.ts","../src/offPage/useOffPageMarkers.ts","../src/offPage/follow.ts","../src/theme/fromTokens.ts","../src/rendererMeasure.ts","../src/theme/applyTheme.ts","../src/theme/themeEdit.ts","../src/theme/themeFile.ts"],"names":["read","spec","defineTool","useMemo","createSetDataOp","offsetOf","carried","AUTO_POSE_DESCRIPTOR","useLatest","useRef","useEffect","useTransformFollower","meets","touched","documentPose","createInsertOp","createTransformOp","boxOf","placedPagesOf"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * The connector tool: drag from one shape to another to join them.\n *\n * The ambient connect starts only on a port. This tool starts from a shape's\n * body too, and lands on one, so an edge drawn with it glues to the shapes\n * rather than to a port on each and picks its sides as they move.\n */\nimport { useMemo } from 'react';\nimport { defineTool, type Tool } from '@weasel-js/core';\nimport { createConnectAction, type ConnectActionOptions } from './connect';\nimport { icon } from './icons.gen';\n\n/** The connector tool's id. */\nexport const CONNECTOR_TOOL_ID = 'diagram.connector';\n/** The action the connector tool binds a drag to. */\nexport const CONNECTOR_ACTION_ID = 'diagram.connectorDraw';\n\n/** The connector tool's definition, outside React. `id`, `startFrom` and\n * `bodies` are the tool's own. */\nexport function connectorTool<TPose>(opts: ConnectActionOptions<TPose>): Tool {\n return defineTool({\n id: CONNECTOR_TOOL_ID,\n hookName: 'useConnectorTool',\n cursor: 'crosshair',\n presentation: { label: 'Connector', icon: /* @icon */ 'core:arrow', group: 'draw' },\n actions: [createConnectAction({ ...opts, id: CONNECTOR_ACTION_ID, startFrom: 'body', bodies: true })],\n bindings: [{ spec: { kind: 'drag' }, actionId: CONNECTOR_ACTION_ID }],\n });\n}\n\n/** {@link connectorTool}, rebuilt when one of its options changes rather than\n * when the bag holding them does. */\nexport function useConnectorTool<TPose>(opts: ConnectActionOptions<TPose>): Tool {\n const { participants, read, geometry, canConnect, showsPort, snapRadius, router, routers, commit, edgeStroke } = opts;\n return useMemo(\n () => connectorTool(opts),\n // eslint-disable-next-line react-hooks/exhaustive-deps -- `opts` is the fields listed\n [participants, read, geometry, canConnect, showsPort, snapRadius, router, routers, commit, edgeStroke],\n );\n}\n","/**\n * Stencils: the shapes a palette offers, as data, and what one becomes when it\n * is drawn — a `buildBody` body whose rows are ordinary text nodes.\n */\nimport { createInsertOp, type Op, type RectPose } from '@weasel-js/core';\nimport { buildBody, type MeasureRowText, type Row } from './body';\nimport { bodyLayoutOf } from './bodyRelayout';\nimport { DEFAULT_FONT } from './edgeLabel';\nimport { NODE, type DiagramSceneData, type NodeStyle } from './fromData';\nimport { NODE_STROKE_WIDTH } from './dataTypes';\nimport { rowTextStyle } from './rowStyle';\nimport type { IconRef } from '@weasel-js/icons';\nimport { icon } from './icons.gen';\nimport type { Outline } from './outline';\n\n/** One shape a palette offers. `size` is what a click places; `rows` default\n * to one empty label, so the body has a text node to type into. `icon` is its\n * tool's glyph in a palette. */\nexport interface DiagramStencil {\n id: string;\n label: string;\n outline: Outline;\n size: { width: number; height: number };\n rows?: readonly Row[];\n icon?: IconRef;\n}\n\n/** The basic flowchart symbols. */\nexport const FLOWCHART_STENCILS: readonly DiagramStencil[] = [\n { id: 'process', label: 'Process', outline: 'rect', size: { width: 120, height: 60 }, icon: /* @icon */ 'shape:rectangle' },\n { id: 'decision', label: 'Decision', outline: 'diamond', size: { width: 120, height: 80 }, icon: /* @icon */ 'shape:diamond' },\n { id: 'terminal', label: 'Terminal', outline: 'stadium', size: { width: 120, height: 50 }, icon: /* @icon */ 'shape:stadium' },\n { id: 'data', label: 'Data', outline: 'parallelogram', size: { width: 130, height: 60 }, icon: /* @icon */ 'shape:parallelogram' },\n { id: 'manual', label: 'Manual', outline: 'trapezoid', size: { width: 130, height: 60 }, icon: /* @icon */ 'shape:trapezoidSide' },\n { id: 'preparation', label: 'Preparation', outline: 'hexagon', size: { width: 130, height: 60 }, icon: /* @icon */ 'shape:hexagonFlat' },\n { id: 'connector', label: 'Connector', outline: 'ellipse', size: { width: 50, height: 50 }, icon: /* @icon */ 'shape:circle' },\n];\n\n/** The insert kind a stencil's tool passes to the `insert` dep. */\nexport const stencilKind = (id: string): string => `stencil:${id}`;\n\n/** The stencil id an insert kind names, or `null` for a kind that is no stencil's. */\nexport function stencilIdOf(kind: string): string | null {\n return kind.startsWith('stencil:') ? kind.slice('stencil:'.length) : null;\n}\n\nconst DEFAULT_ROWS: readonly Row[] = [{ kind: 'label', text: '' }];\n\ntype Bounds = { x: number; y: number; width: number; height: number };\n\n/** A zero-size box — a click rather than a drag — becomes the stencil's own\n * size centered on where it landed. */\nfunction placedBounds(stencil: DiagramStencil, b: Bounds): Bounds {\n if (b.width > 0 && b.height > 0) return b;\n const { width, height } = stencil.size;\n return { x: b.x + b.width / 2 - width / 2, y: b.y + b.height / 2 - height / 2, width, height };\n}\n\n/**\n * The ops that insert `stencil` at `bounds`: its container first, then one\n * text node per text row. Applied as one batch, they are one undo entry.\n * `style` colors the body and its text; default `diagramScene`'s node style.\n * `font` is the face its text rows fall back on; default 12px sans-serif.\n * `parent` is the container the body goes in; default the top level.\n */\nexport function stencilBuild<TLayer extends string>(\n stencil: DiagramStencil,\n bounds: Bounds,\n opts: {\n layer: TLayer; newId: () => string; measure?: MeasureRowText; style?: NodeStyle;\n font?: { fontFamily: string; fontSize: number }; parent?: string | null;\n },\n): { id: string; ops: Op[] } {\n const id = opts.newId();\n const style = opts.style ?? NODE;\n const at = placedBounds(stencil, bounds);\n const spec = { outline: stencil.outline, rows: stencil.rows ?? DEFAULT_ROWS };\n const built = buildBody<DiagramSceneData, TLayer, RectPose>(\n spec,\n at,\n {\n id,\n layer: opts.layer,\n ...(opts.measure ? { measure: opts.measure } : {}),\n body: (trait) => ({\n diagram: { ...trait, ...bodyLayoutOf(spec, trait) },\n fill: { paint: { color: style.fill } },\n stroke: { paint: { color: style.stroke }, width: style.strokeWidth ?? NODE_STROKE_WIDTH, ...(style.dash ? { dash: style.dash } : {}) },\n }),\n row: (text, box) => box.row.kind === 'label' || box.row.kind === 'field'\n ? {\n text,\n style: rowTextStyle(box.row, opts.font ?? DEFAULT_FONT),\n fill: { paint: { color: style.text } },\n bodyRow: box.index,\n }\n : null,\n },\n );\n const ops = built.specs.map((spec, k) => createInsertOp({\n node: { ...spec, id: spec.id ?? `${id}/${k}`, parent: spec.parent ?? opts.parent ?? null },\n label: `Insert ${stencil.label}`,\n }));\n return { id, ops };\n}\n","/**\n * Drawing stencils: one tool per stencil, each a declarative shell binding a\n * drag to core's `insert` action, and the `insert` dep that builds the body.\n */\nimport { useMemo } from 'react';\nimport {\n commitOps, defineTool, useDepRegistry, useDepSource, useLatest, INSERT_REPOSITION_BINDING,\n type ActionDeps, type InsertDep, type NodeId, type Op, type Tool,\n} from '@weasel-js/core';\nimport type { MeasureRowText } from './body';\nimport { diagramDropParentAt, type DropParentScene } from './containers/canDropInto';\nimport { containerBuild, type ContainerStencil } from './containers/containerStencils';\nimport type { NodeStyle } from './fromData';\nimport { stencilBuild, stencilIdOf, stencilKind, type DiagramStencil } from './stencil';\n\n/** The tool that draws `stencil`, a shape's or a container's: its id is the stencil's insert kind. */\nexport function stencilTool(stencil: Pick<DiagramStencil, 'id' | 'label' | 'icon'>): Tool {\n return defineTool({\n id: stencilKind(stencil.id),\n hookName: 'useStencilTool',\n capabilities: ['creates-shapes'],\n cursor: 'crosshair',\n presentation: { label: stencil.label, icon: stencil.icon, group: 'stencil' },\n bindings: [\n { spec: { kind: 'drag' }, actionId: 'insert', opts: { params: { kind: stencilKind(stencil.id) } } },\n INSERT_REPOSITION_BINDING,\n ],\n });\n}\n\n/** {@link stencilTool}, rebuilt only when the stencil changes. */\nexport function useStencilTool(stencil: Pick<DiagramStencil, 'id' | 'label' | 'icon'>): Tool {\n return useMemo(() => stencilTool(stencil), [stencil]);\n}\n\n/** Options for {@link useStencilInsert}. */\nexport interface StencilInsertOptions {\n /** The layer bodies are inserted on. Default: the scene's first layer. */\n layer?: string;\n measure?: MeasureRowText;\n /** The body's fill, stroke and text colors. Default `diagramScene`'s node style. */\n style?: NodeStyle;\n /** The face the body's text rows fall back on. Default 12px sans-serif. */\n font?: { fontFamily: string; fontSize: number };\n /** Container stencils to draw beside the shapes (`CONTAINER_STENCILS`). */\n containers?: readonly ContainerStencil[];\n /** Container stencils' box and title colors. Default `style`. */\n containerStyle?: NodeStyle;\n /** A new pool's header colors and its lanes' bodies in turn. Default `containerStyle`. */\n laneStyles?: { header: NodeStyle; bodies: readonly NodeStyle[] };\n}\n\ntype Bounds = { x: number; y: number; width: number; height: number };\n\n/**\n * Registers the `insert` dep for stencil kinds. Any other kind goes to the\n * `insert` dep this one displaced, so core's rect, ellipse and text tools\n * keep working beside the stencils. A stencil drawn inside a container or a\n * lane becomes its member (`diagramDropParentAt`).\n */\nexport function useStencilInsert(stencils: readonly DiagramStencil[], opts: StencilInsertOptions = {}): void {\n const registry = useDepRegistry();\n const stencilsRef = useLatest(stencils);\n const optsRef = useLatest(opts);\n\n useDepSource('insert', (below): InsertDep => {\n const scene = registry.get('scene');\n const fallback = below();\n const layer = () => optsRef.current.layer ?? fallback?.layer?.() ?? scene?.layers[0]?.id ?? 'default';\n const stencilOf = (kind: string): DiagramStencil | ContainerStencil | undefined => {\n const id = stencilIdOf(kind);\n if (id === null) return undefined;\n return stencilsRef.current.find((s) => s.id === id) ?? optsRef.current.containers?.find((s) => s.id === id);\n };\n const builtAt = (stencil: DiagramStencil | ContainerStencil, bounds: Bounds): { id: string; ops: Op[] } | null => {\n if (scene === undefined) return null;\n const center = { x: bounds.x + bounds.width / 2, y: bounds.y + bounds.height / 2 };\n const role = 'role' in stencil ? stencil.role : null;\n const { style, measure, font, containerStyle, laneStyles } = optsRef.current;\n const common = {\n layer: layer(),\n newId: () => scene.mintId() as string,\n parent: diagramDropParentAt(scene as unknown as DropParentScene, center, role),\n };\n if ('role' in stencil) {\n const boxStyle = containerStyle ?? style;\n return containerBuild(stencil, bounds, {\n ...common, ...(boxStyle ? { style: boxStyle } : {}), ...(laneStyles ? { laneStyles } : {}),\n });\n }\n return stencilBuild(stencil, bounds, {\n ...common, ...(style ? { style } : {}), ...(measure ? { measure } : {}), ...(font ? { font } : {}),\n });\n };\n const build: NonNullable<InsertDep['build']> = (bounds, extras, ends) => {\n const stencil = stencilOf(extras.kind);\n if (stencil === undefined) return fallback?.build?.(bounds, extras, ends) ?? null;\n const built = builtAt(stencil, bounds);\n return built === null ? null : { id: built.id as NodeId, ops: built.ops };\n };\n return {\n layer,\n build,\n commit(bounds, extras, ends) {\n const stencil = stencilOf(extras.kind);\n if (stencil === undefined) return fallback?.commit(bounds, extras, ends) ?? null;\n const built = build(bounds, extras, ends);\n if (built === null) return null;\n const deps = { scene, applyOps: registry.get('applyOps'), selection: registry.get('selection') };\n commitOps(deps as unknown as ActionDeps, built.ops, `Insert ${stencil.label}`);\n return built.id;\n },\n };\n });\n}\n","/**\n * Waypoints ride along with a move: when a whole-node transform carries both\n * ends of an edge by the same offset, the edge's waypoints go with them.\n * Otherwise they stay put — a route the author placed is not bent by moving\n * one end.\n */\nimport {\n AUTO_POSE_DESCRIPTOR,\n createSetDataOp,\n writtenBy,\n type PoseDescriptor,\n type Scene,\n type TransformFollower,\n type TransformPreviewNode,\n} from '@weasel-js/core';\nimport type { Vec2 } from '@weasel-js/core/math';\nimport { diagramEdgeOf, samePoints, type DiagramEdge } from './edgeTrait';\n\ntype AnyScene = Scene<unknown, string, unknown>;\n\nconst EPS = 1e-6;\n\n/** The offset carrying `before` to `after`, read off their bounds. */\nfunction offsetOf(geometry: PoseDescriptor<unknown>, before: unknown, after: unknown): Vec2 {\n const a = geometry.getBounds(before);\n const b = geometry.getBounds(after);\n return { x: b.x - a.x, y: b.y - a.y };\n}\n\n/** `edge` with its waypoints moved by `d`, and layout's mark moved with them while layout still owns them. */\nfunction carried(edge: DiagramEdge, d: Vec2): DiagramEdge {\n const move = (points: readonly Vec2[]) => points.map((p) => ({ x: p.x + d.x, y: p.y + d.y }));\n const waypoints = move(edge.waypoints ?? []);\n const owned = edge.laidOut !== undefined && samePoints(edge.waypoints ?? [], edge.laidOut);\n return { ...edge, waypoints, ...(owned ? { laidOut: waypoints } : {}) };\n}\n\n/** Each edge whose two ends `frame` moves by one offset, with its data as\n * that offset leaves it. `frame` holds the poses the transform gives the\n * nodes it moves. */\nfunction followers(sc: AnyScene, geometry: PoseDescriptor<unknown>, frame: ReadonlyMap<string, unknown>): TransformPreviewNode[] {\n const out: TransformPreviewNode[] = [];\n for (const node of sc.renderOrderNodes()) {\n const edge = diagramEdgeOf(node);\n const ends = node.dependsOn;\n if (edge === null || (edge.waypoints ?? []).length === 0 || !Array.isArray(ends) || ends.length !== 2) continue;\n const [from, to] = ends.map((id) => sc.get(id));\n const fromAfter = frame.get(ends[0]!);\n const toAfter = frame.get(ends[1]!);\n if (from === undefined || to === undefined || fromAfter === undefined || toAfter === undefined) continue;\n const d = offsetOf(geometry, from.pose, fromAfter);\n const e = offsetOf(geometry, to.pose, toAfter);\n if (Math.abs(d.x - e.x) > EPS || Math.abs(d.y - e.y) > EPS || (d.x === 0 && d.y === 0)) continue;\n const data = node.data as Record<string, unknown>;\n out.push({ id: node.id, pose: node.pose, data: { ...data, diagram: carried(edge, d) } });\n }\n return out;\n}\n\n/** The poses `ops` change, by node id. */\nfunction posesMovedBy(sc: AnyScene, ops: Parameters<TransformFollower['finish']>[0]): Map<string, unknown> | null {\n const written = writtenBy(sc, ops);\n if (written === null) return null;\n const moved = new Map<string, unknown>();\n for (const [id, w] of written) if (w.pose !== sc.get(id as never)?.pose) moved.set(id, w.pose);\n return moved;\n}\n\n/**\n * The transform follower that carries waypoints along with a move, for the\n * `transformFollowers` dep (`useTransformFollower`). `geometry` reads a pose's\n * bounds; default `AUTO_POSE_DESCRIPTOR`.\n */\nexport function waypointFollower<TPose>(\n scene: Scene<unknown, string, TPose>,\n geometry: PoseDescriptor<TPose> = AUTO_POSE_DESCRIPTOR as PoseDescriptor<TPose>,\n): TransformFollower {\n const sc = scene as unknown as AnyScene;\n const geo = geometry as PoseDescriptor<unknown>;\n return {\n preview: (frame) => (frame.size < 2 ? [] : followers(sc, geo, frame)),\n finish(ops, label) {\n const moved = posesMovedBy(sc, ops);\n if (moved === null || moved.size < 2) return [...ops];\n const changes = followers(sc, geo, moved).map((c) => createSetDataOp({\n id: c.id, from: sc.get(c.id as never)!.data, to: c.data, label,\n }));\n return [...ops, ...changes];\n },\n };\n}\n","/**\n * Where each of the diagram's scene edit passes runs among the others\n * (`scene.addEditPass`'s `order`). Each pass hears what the ones before it\n * wrote: markers are placed before routing sees them, routes before labels\n * dodge them, and line jumps last, on the routes as they end up.\n */\nexport const DIAGRAM_PASS_ORDER = { offPage: 100, avoid: 200, labels: 300, hops: 400 } as const;\n","/**\n * Obstacle-avoiding routing on a live scene: a scene edit pass that reroutes\n * whatever an edit disturbed, in that edit's own history entry, and a\n * transform follower that reroutes the connectors near a dragged shape each\n * frame.\n */\nimport {\n AUTO_POSE_DESCRIPTOR,\n createSetDataOp,\n type Op,\n type PoseDescriptor,\n type Scene,\n type SceneEditSummary,\n type TransformFollower,\n type TransformPreviewNode,\n} from '@weasel-js/core';\nimport type { Vec2 } from '@weasel-js/core/math';\nimport { diagramEdgeOf, samePoints, type DiagramEdge } from '../edgeTrait';\nimport { DIAGRAM_PASS_ORDER } from '../passOrder';\nimport { createAvoidRouter, type AvoidRouter, type AvoidRoutes } from './router';\nimport { avoidSceneInput, type AvoidSceneOptions } from './sceneInput';\nimport type { AvoidInput, AvoidOptions } from './types';\n\n/** Options for {@link installAvoidRouting} and `useAvoidRouting`. */\nexport interface AvoidRoutingOptions<TPose> extends AvoidSceneOptions<TPose>, AvoidOptions {\n /** World units one screen pixel covers now. A drag frame that moves\n * nothing further than this does no work. Default 1. */\n pixelSize?: () => number;\n /** Milliseconds one drag frame may spend rerouting. Default 4. */\n frameBudgetMs?: number;\n}\n\n/** Routing installed on a scene. */\nexport interface AvoidRouting {\n router: AvoidRouter;\n /** The drag half, for the `transformFollowers` dep (`useTransformFollower`). */\n follower: TransformFollower;\n /** Remove the edit pass. */\n dispose(): void;\n}\n\ntype AnyScene = Scene<unknown, string, unknown>;\n\n/** `data` with its edge trait holding `route`, or no route when null. */\nfunction withRoute(data: unknown, edge: DiagramEdge, route: readonly Vec2[] | null): Record<string, unknown> {\n const { route: _r, ...rest } = edge;\n return { ...(data as Record<string, unknown>), diagram: route === null ? rest : { ...rest, route } };\n}\n\n/** The data writes that store `routes` on their edges, skipping any unchanged. */\nexport function routeDataOps(scene: Scene<unknown, string, unknown>, routes: AvoidRoutes): Op[] {\n const ops: Op[] = [];\n for (const [id, route] of routes) {\n const node = scene.get(id as never);\n const edge = node === undefined ? null : diagramEdgeOf(node);\n if (node === undefined || edge === null) continue;\n const had = edge.route;\n if (route === null ? had === undefined : had !== undefined && samePoints(had, route)) continue;\n ops.push(createSetDataOp({ id, from: node.data, to: withRoute(node.data, edge, route), label: 'Route' }));\n }\n return ops;\n}\n\nconst touched = (s: SceneEditSummary): boolean =>\n s.added.size + s.removed.size + s.posed.size + s.reparented.size + s.dataChanged.size > 0;\n\n/** The offset carrying `before` to `after`, read off their bounds. */\nfunction offsetOf(geometry: PoseDescriptor<unknown>, before: unknown, after: unknown): Vec2 {\n const a = geometry.getBounds(before);\n const b = geometry.getBounds(after);\n return { x: b.x - a.x, y: b.y - a.y };\n}\n\n/** `input` with each edge's waypoints where `data`, what the followers before\n * this one previewed, has them: `waypointFollower`'s carrying, read rather\n * than worked out again. */\nfunction carried(data: ReadonlyMap<string, unknown>, input: AvoidInput): AvoidInput {\n const edges = input.edges.map((e) => {\n const shown = data.get(e.id);\n const waypoints = shown === undefined ? undefined : diagramEdgeOf({ data: shown })?.waypoints;\n return waypoints === undefined ? e : { ...e, waypoints };\n });\n return { obstacles: input.obstacles, edges };\n}\n\n/** The drag half: each frame previews the reroutes near what moved. */\nfunction avoidFollower<TPose>(scene: Scene<unknown, string, TPose>, router: AvoidRouter, opts: AvoidRoutingOptions<TPose>): TransformFollower {\n const sc = scene as unknown as AnyScene;\n const geometry = (opts.geometry ?? AUTO_POSE_DESCRIPTOR) as PoseDescriptor<unknown>;\n let last: { frame: ReadonlyMap<string, unknown>; out: TransformPreviewNode[] } | null = null;\n const still = (frame: ReadonlyMap<string, unknown>): boolean => {\n if (last === null || last.frame.size !== frame.size) return false;\n const px = opts.pixelSize?.() ?? 1;\n for (const [id, pose] of frame) {\n const was = last.frame.get(id);\n if (was === undefined) return false;\n const d = offsetOf(geometry, was, pose);\n if (Math.abs(d.x) >= px || Math.abs(d.y) >= px) return false;\n }\n return true;\n };\n return {\n preview(frame, data) {\n if (frame.size === 0) return [];\n if (still(frame)) return last!.out;\n const input = carried(data, avoidSceneInput(scene, opts, (id) => frame.get(id) as TPose | undefined));\n const routes = router.update(input, { preview: true, budgetMs: opts.frameBudgetMs ?? 4 });\n const out: TransformPreviewNode[] = [];\n for (const [id, route] of routes) {\n const node = sc.get(id as never);\n const shown = data.get(id) ?? node?.data;\n const edge = node === undefined ? null : diagramEdgeOf({ data: shown });\n if (node === undefined || edge === null) continue;\n out.push({ id, pose: node.pose, data: withRoute(shown, edge, route) });\n }\n last = { frame, out };\n return out;\n },\n finish: (ops) => [...ops],\n };\n}\n\n/**\n * Route `scene`'s `avoid` connectors around its shapes from now on. Every\n * live edit reroutes what it disturbed, in its own history entry; on install\n * nothing reroutes, and the routes the scene holds stand. A host without\n * React calls this; a component calls `useAvoidRouting`.\n */\nexport function installAvoidRouting<TPose>(\n scene: Scene<unknown, string, TPose>,\n opts: AvoidRoutingOptions<TPose> = {},\n): AvoidRouting {\n const sc = scene as unknown as AnyScene;\n const router = createAvoidRouter(opts);\n router.seed(avoidSceneInput(scene, opts));\n const dispose = scene.addEditPass((summary) => {\n if (!touched(summary)) return null;\n const ops = routeDataOps(sc, router.update(avoidSceneInput(scene, opts)));\n return ops.length === 0 ? null : ops;\n }, { order: DIAGRAM_PASS_ORDER.avoid });\n return { router, follower: avoidFollower(scene, router, opts), dispose };\n}\n","import { useLatest, useOptionalDepRegistry, useTransformFollower, type Scene, type TransformFollower } from '@weasel-js/core';\nimport { useEffect, useRef } from 'react';\nimport { installAvoidRouting, type AvoidRoutingOptions } from './install';\n\n/**\n * Route `scene`'s `avoid` connectors around its shapes for the life of the\n * calling component: each edit reroutes what it disturbed in its own history\n * entry, and a drag reroutes the connectors near what it moves each frame.\n * Mount it as a child of `<SceneCanvas>`, where the drag's follower is heard,\n * after any `waypointFollower`, whose carried waypoints the drag routes through.\n * Options are read when the scene changes; `pixelSize` defaults to the\n * canvas's own view.\n */\nexport function useAvoidRouting<TPose>(scene: Scene<unknown, string, TPose>, opts: AvoidRoutingOptions<TPose> = {}): void {\n const deps = useOptionalDepRegistry();\n const latest = useLatest(opts);\n const follower = useRef<TransformFollower | null>(null);\n useEffect(() => {\n const pixelSize = () => latest.current.pixelSize?.() ?? 1 / Math.abs(deps?.get('view')?.get().scale.x || 1);\n const routing = installAvoidRouting(scene, { ...latest.current, pixelSize });\n follower.current = routing.follower;\n return () => {\n routing.dispose();\n follower.current = null;\n };\n }, [scene, deps, latest]);\n useTransformFollower(() => follower.current);\n}\n","import type { Scene, TransformFollower, TransformPreviewNode } from '@weasel-js/core';\nimport { diagramEdgeOf } from '../edgeTrait';\nimport { inOrUnder, sceneEdges, withHopsData, type AnyScene } from './sceneEdges';\n\n/**\n * The transform follower that hides hops while a drag is in progress: each\n * frame previews the connectors it moves, and every connector hopping over\n * one, without their hops. A hop stays where the edit pass put it, so it\n * would sit off a moving route; on release the pass recomputes them in the\n * drag's entry. Register it after any follower that reroutes connectors, whose\n * previewed data it keeps.\n */\nexport function hopFollower<TPose>(scene: Scene<unknown, string, TPose>): TransformFollower {\n const sc = scene as unknown as AnyScene;\n return {\n preview(frame, data) {\n if (frame.size === 0) return [];\n const edges = sceneEdges(sc);\n const moved = new Set<string>();\n for (const e of edges) {\n if (frame.has(e.node.id) || e.ends.some((end) => inOrUnder(sc, end, frame))) moved.add(e.node.id);\n }\n const out: TransformPreviewNode[] = [];\n for (const e of edges) {\n const hops = e.trait.hops;\n if (hops === undefined || hops.length === 0) continue;\n if (!moved.has(e.node.id) && !hops.some((h) => h.over.some((id) => moved.has(id)))) continue;\n const shown = data.get(e.node.id) ?? e.node.data;\n const trait = diagramEdgeOf({ data: shown }) ?? e.trait;\n out.push({ id: e.node.id, pose: e.node.pose, data: withHopsData(shown, trait, []) });\n }\n return out;\n },\n finish: (ops) => [...ops],\n };\n}\n","/**\n * Line jumps on a live scene: an edit pass that recomputes the hops an edit\n * disturbed, in that edit's own history entry, while the document's\n * line-jump setting is on.\n */\nimport type { Scene, SceneEditSummary, TransformFollower } from '@weasel-js/core';\nimport type { Vec2 } from '@weasel-js/core/math';\nimport type { EdgeRouteOptions } from '../edge';\nimport { DIAGRAM_PASS_ORDER } from '../passOrder';\nimport { samePoints } from '../edgeTrait';\nimport { edgeHops } from './crossings';\nimport { hopFollower } from './follower';\nimport { edgePolylines, hopDataOps, inOrUnder, sceneEdges, type AnyScene, type SceneEdge } from './sceneEdges';\nimport { HOPS_DOC_KEY, type HopsDocValue } from './types';\n\n/** Options for {@link installHops} and `useHops`: how a connector routes, as\n * its own `derivePath` does. */\nexport type HopsOptions<TPose> = EdgeRouteOptions<TPose>;\n\n/** Line jumps installed on a scene. */\nexport interface Hops {\n /** The drag half, for the `transformFollowers` dep (`useTransformFollower`). */\n follower: TransformFollower;\n /** Remove the edit pass. */\n dispose(): void;\n}\n\ninterface Box { x0: number; y0: number; x1: number; y1: number }\n\nfunction boxOf(points: readonly Vec2[], pad: number): Box {\n const b = { x0: Infinity, y0: Infinity, x1: -Infinity, y1: -Infinity };\n for (const p of points) {\n b.x0 = Math.min(b.x0, p.x - pad);\n b.y0 = Math.min(b.y0, p.y - pad);\n b.x1 = Math.max(b.x1, p.x + pad);\n b.y1 = Math.max(b.y1, p.y + pad);\n }\n return b;\n}\n\nconst meets = (a: Box, b: Box): boolean => a.x0 <= b.x1 && b.x0 <= a.x1 && a.y0 <= b.y1 && b.y0 <= a.y1;\n\n/** Whether the ids `before` and `now` share stand in a different order. */\nfunction reordered(before: readonly string[], now: readonly string[]): boolean {\n const was = new Set(before);\n const is = new Set(now);\n const a = before.filter((id) => is.has(id));\n const b = now.filter((id) => was.has(id));\n return a.some((id, i) => id !== b[i]);\n}\n\n/** What the pass holds between edits: each connector's last route, and the\n * order and radius it computed against. */\ninterface Held {\n polylines: Map<string, Vec2[]>;\n order: string[];\n r: number;\n}\n\n/** Every connector's route, by id. */\nfunction allPolylines(edges: readonly SceneEdge[], polylineOf: (e: SceneEdge) => Vec2[] | null): Map<string, Vec2[]> {\n const out = new Map<string, Vec2[]>();\n for (const e of edges) {\n const p = polylineOf(e);\n if (p !== null) out.set(e.node.id, p);\n }\n return out;\n}\n\n/** The connectors an edit may have rerouted: changed themselves, new, or\n * attached to a changed node or one inside it, or to a node whose pose\n * derives from others. */\nfunction candidates(sc: AnyScene, edges: readonly SceneEdge[], held: Held, s: SceneEditSummary): SceneEdge[] {\n const changed = new Set<string>([...s.added, ...s.removed, ...s.posed, ...s.reparented, ...s.dataChanged]);\n const derived = (id: string) => sc.get(id as never)?.derivePose !== undefined;\n return edges.filter((e) => changed.has(e.node.id) || !held.polylines.has(e.node.id)\n || e.ends.some((end) => inOrUnder(sc, end, changed) || derived(end)));\n}\n\n/**\n * Hop `scene`'s crossing connectors while its `HOPS_DOC_KEY` value is set.\n * Turning the value on or off, or changing its size, recomputes or clears\n * every connector in that same entry; any other edit recomputes the\n * connectors it rerouted and those whose routes meet theirs. Installing\n * writes nothing. A host without React calls this; a component calls `useHops`.\n */\nexport function installHops<TPose>(scene: Scene<unknown, string, TPose>, opts: HopsOptions<TPose> = {}): Hops {\n const sc = scene as unknown as AnyScene;\n const polylineOf = edgePolylines(sc, opts);\n let held: Held | null = null;\n\n const full = (edges: SceneEdge[], r: number) => {\n const order = edges.map((e) => e.node.id);\n held = { polylines: allPolylines(edges, polylineOf), order, r };\n return hopDataOps(sc, edgeHops(held.polylines, order, r));\n };\n\n const pass = (summary: SceneEditSummary) => {\n const value = sc.doc.get<HopsDocValue>(HOPS_DOC_KEY);\n const keyed = summary.docChanged.has(HOPS_DOC_KEY);\n if (value === undefined) {\n held = null;\n return keyed ? hopDataOps(sc, new Map(sceneEdges(sc).map((e) => [e.node.id, []]))) : null;\n }\n const edges = sceneEdges(sc);\n const order = edges.map((e) => e.node.id);\n if (keyed || held === null || held.r !== value.size || reordered(held.order, order)) return full(edges, value.size);\n const h: Held = held;\n const r = h.r;\n const boxes: Box[] = [];\n const dirty = new Set<string>();\n for (const e of candidates(sc, edges, h, summary)) {\n const was = h.polylines.get(e.node.id);\n const now = polylineOf(e);\n if (was !== undefined && now !== null && samePoints(was, now)) continue;\n dirty.add(e.node.id);\n if (was !== undefined) boxes.push(boxOf(was, r));\n if (now === null) h.polylines.delete(e.node.id);\n else {\n boxes.push(boxOf(now, r));\n h.polylines.set(e.node.id, now);\n }\n }\n const present = new Set<string>(order);\n for (const [id, was] of h.polylines) {\n if (present.has(id)) continue;\n boxes.push(boxOf(was, r));\n h.polylines.delete(id);\n }\n h.order = order;\n if (boxes.length === 0) return null;\n const affected = new Set(dirty);\n for (const [id, points] of h.polylines) {\n if (affected.has(id)) continue;\n const box = boxOf(points, 0);\n if (boxes.some((b) => meets(box, b))) affected.add(id);\n }\n const ops = hopDataOps(sc, edgeHops(h.polylines, order, r, affected));\n return ops.length === 0 ? null : ops;\n };\n\n const on = sc.doc.get<HopsDocValue>(HOPS_DOC_KEY);\n if (on !== undefined) {\n const edges = sceneEdges(sc);\n held = { polylines: allPolylines(edges, polylineOf), order: edges.map((e) => e.node.id), r: on.size };\n }\n const dispose = scene.addEditPass(pass, { order: DIAGRAM_PASS_ORDER.hops });\n return { follower: hopFollower(scene), dispose };\n}\n","import { useLatest, useTransformFollower, type Scene, type TransformFollower } from '@weasel-js/core';\nimport { useEffect, useRef } from 'react';\nimport { installHops, type HopsOptions } from './install';\n\n/**\n * Hop `scene`'s crossing connectors for the life of the calling component,\n * while its line-jump setting is on: each edit recomputes the hops it\n * disturbed in its own history entry, and a drag hides the hops on what it\n * moves. Mount it as a child of `<SceneCanvas>`, after any routing hook, so its\n * follower hears the routes that one previews. Options are read when the scene\n * changes.\n */\nexport function useHops<TPose>(scene: Scene<unknown, string, TPose>, opts: HopsOptions<TPose> = {}): void {\n const latest = useLatest(opts);\n const follower = useRef<TransformFollower | null>(null);\n useEffect(() => {\n const hops = installHops(scene, latest.current);\n follower.current = hops.follower;\n return () => {\n hops.dispose();\n follower.current = null;\n };\n }, [scene, latest]);\n useTransformFollower(() => follower.current);\n}\n","/**\n * A label's box follows its text: an edit that changes a label's data sizes\n * it to the text it now holds, so what it covers and what covers it are\n * measured from the words drawn, not the empty box it was added with.\n */\nimport { createTransformOp, type NodeId, type Op, type Scene, type SceneEditSummary } from '@weasel-js/core';\nimport type { MeasureRowText, RowTextStyle } from '../body';\nimport { DEFAULT_FONT, labelSize, labelStyleOf } from '../edgeLabel';\nimport { diagramLabelOf } from '../labelTrait';\n\ntype Size = { width: number; height: number };\n\nconst isRect = (pose: unknown): pose is Size & { x: number; y: number } =>\n typeof pose === 'object' && pose !== null && typeof (pose as Size).width === 'number' && typeof (pose as Size).height === 'number';\n\n/** The pose writes sizing each label whose data `summary`'s edit changed to its\n * text, and the size each now takes, by id. A pose without a width and a\n * height is left alone. */\nexport function labelFitOps(\n scene: Scene<unknown, string, unknown>,\n summary: SceneEditSummary,\n measure?: MeasureRowText,\n): { ops: Op[]; sizes: Map<string, Size> } {\n const ops: Op[] = [];\n const sizes = new Map<string, Size>();\n for (const id of summary.dataChanged) {\n const node = scene.get(id as NodeId);\n if (node === undefined || diagramLabelOf(node) === null || !isRect(node.pose)) continue;\n const data = node.data as { text?: unknown; style?: RowTextStyle };\n if (typeof data.text !== 'string') continue;\n const size = labelSize(data.text, data.style ?? labelStyleOf(DEFAULT_FONT), measure);\n if (Math.abs(size.width - node.pose.width) < 1e-6 && Math.abs(size.height - node.pose.height) < 1e-6) continue;\n sizes.set(id, size);\n ops.push(createTransformOp({ id, from: node.pose, to: { ...node.pose, ...size }, label: 'Fit label' }));\n }\n return { ops, sizes };\n}\n","/**\n * Label placement on a live scene: a scene edit pass that moves the labels\n * an edit covered to the nearest clear station, in that edit's own history\n * entry. It runs after routing, so labels dodge the routes the edit made.\n */\nimport {\n AUTO_POSE_DESCRIPTOR,\n createSetDataOp,\n documentDepOf,\n documentPose,\n type NodeId,\n type Op,\n type PoseDescriptor,\n type Scene,\n type SceneEditSummary,\n} from '@weasel-js/core';\nimport { PATH_M, type Path, type Vec2 } from '@weasel-js/core/math';\nimport type { MeasureRowText } from '../body';\nimport { diagramContainerOf } from '../containers/trait';\nimport { diagramEdgeOf } from '../edgeTrait';\nimport { diagramGroupOf } from '../group';\nimport { diagramLabelOf, type DiagramLabel, type LabelSpot } from '../labelTrait';\nimport type { Bounds } from '../outline';\nimport { DIAGRAM_PASS_ORDER } from '../passOrder';\nimport { diagramNodeOf, type DiagramNodeReader } from '../trait';\nimport { labelFitOps } from './fit';\nimport { placeLabels, type PlaceLabel, type PlaceLabelsOptions, type PlaceRoute } from './place';\nimport { labelCenter } from './station';\n\n/** Options for {@link installLabelPlacement} and `useLabelPlacement`. */\nexport interface LabelPlacementOptions<TPose> extends PlaceLabelsOptions {\n geometry?: PoseDescriptor<TPose>;\n /** How a node's diagram trait is read. Default its own `data.diagram`. */\n read?: DiagramNodeReader;\n /** Sizes a label to the text an edit gives it. Default a per-character estimate. */\n measure?: MeasureRowText;\n}\n\n/** Placement installed on a scene. */\nexport interface LabelPlacement {\n /** Remove the edit pass. */\n dispose(): void;\n}\n\ntype AnyScene = Scene<unknown, string, unknown>;\ntype Size = { width: number; height: number };\ntype SceneNode = ReturnType<AnyScene['renderOrderNodes']>[number];\n\n/** The scene as placement reads it. */\ninterface Reading {\n shapes: { id: string; box: Bounds }[];\n routes: Map<string, PlaceRoute & { path: Path; ends: readonly string[] }>;\n labels: (PlaceLabel & { node: SceneNode })[];\n}\n\n/** The points of each run of a polyline path: one for a whole connector, a\n * stub at each end for one split across pages. */\nfunction runsOf(path: Path | null): Vec2[][] {\n if (path === null || path.kind !== 'polygon') return [];\n const runs: Vec2[][] = [];\n for (let i = 0; i < path.commands.length; i++) {\n if (path.commands[i] === PATH_M || runs.length === 0) runs.push([]);\n runs[runs.length - 1]!.push({ x: path.coords[2 * i]!, y: path.coords[2 * i + 1]! });\n }\n return runs.filter((r) => r.length >= 2);\n}\n\nfunction read(\n sc: AnyScene, geometry: PoseDescriptor<unknown>, reader: DiagramNodeReader | undefined, sizes?: ReadonlyMap<string, Size>,\n): Reading {\n const out: Reading = { shapes: [], routes: new Map(), labels: [] };\n for (const node of sc.renderOrderNodes()) {\n const ends = Array.isArray(node.dependsOn) ? node.dependsOn as readonly string[] : [];\n if (diagramEdgeOf(node) !== null) {\n const path = documentDepOf(sc, node.id as NodeId)?.path ?? null;\n const [points, ...more] = runsOf(path);\n if (path !== null && points !== undefined) out.routes.set(node.id, { id: node.id, points, more, path, ends });\n continue;\n }\n const placement = diagramLabelOf(node);\n if (placement !== null) {\n const { width, height } = sizes?.get(node.id) ?? geometry.getBounds(node.pose);\n if (ends[0] !== undefined) out.labels.push({ id: node.id, edge: ends[0], placement, size: { width, height }, node });\n continue;\n }\n if (diagramContainerOf(node) !== null || diagramGroupOf(node) !== null || diagramNodeOf(node as never, reader) === null) continue;\n out.shapes.push({ id: node.id, box: geometry.getBounds(documentPose(sc, node as never)) });\n }\n return out;\n}\n\nconst grow = (b: Bounds, by: number): Bounds => ({ x: b.x - by, y: b.y - by, width: b.width + 2 * by, height: b.height + 2 * by });\nconst meets = (a: Bounds, b: Bounds) => a.x <= b.x + b.width && b.x <= a.x + a.width && a.y <= b.y + b.height && b.y <= a.y + a.height;\n\n/** Whether any segment of `points` comes within `box`. */\nfunction routeMeets(points: readonly Vec2[], box: Bounds): boolean {\n for (let i = 0; i + 1 < points.length; i++) {\n const a = points[i]!;\n const b = points[i + 1]!;\n const seg = { x: Math.min(a.x, b.x), y: Math.min(a.y, b.y), width: Math.abs(a.x - b.x), height: Math.abs(a.y - b.y) };\n if (meets(seg, box)) return true;\n }\n return false;\n}\n\n/** What the last pass saw, so an edit that moves something away from a\n * label still finds that label. Undo runs no pass, so this may be stale,\n * which only moves more labels than it must. */\nconst runsIn = (r: PlaceRoute): (readonly Vec2[])[] => [r.points, ...(r.more ?? [])];\n\ninterface Seen {\n shapes: Map<string, Bounds>;\n routes: Map<string, readonly (readonly Vec2[])[]>;\n}\n\n/** The boxes and routes `summary`'s edit changed, as they were and as they are. */\nfunction changesOf(scene: Reading, summary: SceneEditSummary, seen: Seen) {\n const touched = (id: string) => summary.added.has(id as NodeId) || summary.posed.has(id as NodeId) || summary.dataChanged.has(id as NodeId);\n const edges = new Set<string>();\n const routes: (readonly Vec2[])[] = [];\n for (const r of scene.routes.values()) {\n if (!touched(r.id) && !r.ends.some((e) => touched(e) || summary.removed.has(e as NodeId))) continue;\n edges.add(r.id);\n routes.push(...runsIn(r));\n routes.push(...seen.routes.get(r.id) ?? []);\n }\n const shapes: Bounds[] = [];\n for (const s of scene.shapes) {\n if (!touched(s.id)) continue;\n shapes.push(s.box);\n const was = seen.shapes.get(s.id);\n if (was !== undefined) shapes.push(was);\n }\n for (const id of summary.removed) {\n const shape = seen.shapes.get(id);\n if (shape !== undefined) shapes.push(shape);\n routes.push(...seen.routes.get(id) ?? []);\n }\n return { touched, edges, routes, shapes };\n}\n\n/** The boxes `label` stands in now and would stand in at its preference, grown by `gap`. */\nfunction boxesOf(scene: Reading, label: PlaceLabel, gap: number): Bounds[] {\n const route = scene.routes.get(label.edge);\n if (route === undefined) return [];\n const { placed, ...preferred } = label.placement;\n const out: Bounds[] = [];\n for (const placement of placed === undefined ? [preferred] : [label.placement, preferred]) {\n const c = labelCenter(route.path, placement, label.size);\n if (c !== null) out.push(grow({ x: c.x - label.size.width / 2, y: c.y - label.size.height / 2, ...label.size }, gap));\n }\n return out;\n}\n\n/** The ids of the labels `summary`'s edit may have covered or uncovered:\n * those of edges it changed or whose ends it moved, those it added or\n * changed, and those whose box, where it stands or at its preference, meets\n * a shape or route the edit changed, or another such label. */\nfunction movingOf(scene: Reading, summary: SceneEditSummary, seen: Seen, gap: number): Set<string> {\n const changed = changesOf(scene, summary, seen);\n const boxes = new Map(scene.labels.map((l) => [l.id, boxesOf(scene, l, gap)]));\n const first = new Set<string>();\n for (const l of scene.labels) {\n const own = boxes.get(l.id)!;\n const hit = own.some((box) => changed.shapes.some((s) => meets(s, box)) || changed.routes.some((r) => routeMeets(r, box)));\n if (changed.edges.has(l.edge) || changed.touched(l.id) || hit) first.add(l.id);\n }\n const moving = new Set(first);\n for (const l of scene.labels) {\n if (moving.has(l.id)) continue;\n const own = boxes.get(l.id)!;\n for (const id of first) if (boxes.get(id)!.some((b) => own.some((o) => meets(b, o)))) moving.add(l.id);\n }\n return moving;\n}\n\nconst sameSpot = (a: LabelSpot | undefined, b: LabelSpot | undefined) =>\n a === b || (a !== undefined && b !== undefined && Math.abs(a.at - b.at) < 1e-9 && Math.abs(a.offset - b.offset) < 1e-9);\n\n/** `data` with its label trait standing at `spot`, or back at its preference when undefined. */\nfunction withSpot(data: unknown, label: DiagramLabel, spot: LabelSpot | undefined): Record<string, unknown> {\n const { placed: _p, ...rest } = label;\n const diagram = (data as { diagram: object }).diagram;\n return { ...(data as Record<string, unknown>), diagram: { ...diagram, label: spot === undefined ? rest : { ...rest, placed: spot } } };\n}\n\n/** The writes that size each label to its edited text and place the labels\n * `summary`'s edit covered, skipping any that stay put. */\nfunction placementOps<TPose>(\n scene: Scene<unknown, string, TPose>,\n summary: SceneEditSummary,\n opts: LabelPlacementOptions<TPose>,\n seen: Seen,\n): Op[] {\n const sc = scene as unknown as AnyScene;\n const geometry = (opts.geometry ?? AUTO_POSE_DESCRIPTOR) as PoseDescriptor<unknown>;\n const fit = labelFitOps(sc, summary, opts.measure);\n const reading = read(sc, geometry, opts.read, fit.sizes);\n const moving = movingOf(reading, summary, seen, opts.gap ?? 2);\n seen.shapes = new Map(reading.shapes.map((s) => [s.id, s.box]));\n seen.routes = new Map([...reading.routes.values()].map((r) => [r.id, runsIn(r)]));\n if (moving.size === 0) return fit.ops;\n const labels = reading.labels.map((l) => ({ ...l, moving: moving.has(l.id) }));\n const placed = placeLabels({ shapes: reading.shapes, routes: [...reading.routes.values()], labels }, opts);\n const ops: Op[] = [...fit.ops];\n for (const l of labels) {\n if (!placed.has(l.id)) continue;\n const spot = placed.get(l.id) ?? undefined;\n if (sameSpot(l.placement.placed, spot)) continue;\n ops.push(createSetDataOp({ id: l.id, from: l.node.data, to: withSpot(l.node.data, l.placement, spot), label: 'Place label' }));\n }\n return ops;\n}\n\nconst any = (s: SceneEditSummary): boolean =>\n s.added.size + s.removed.size + s.posed.size + s.reparented.size + s.dataChanged.size > 0;\n\n/**\n * Move `scene`'s edge labels off whatever an edit leaves covering them, from\n * now on: each live edit places the labels it may have covered, in its own\n * history entry. Labels hold still during a drag and settle on release. A\n * host without React calls this; a component calls `useLabelPlacement`.\n */\nexport function installLabelPlacement<TPose>(\n scene: Scene<unknown, string, TPose>,\n opts: LabelPlacementOptions<TPose> = {},\n): LabelPlacement {\n const sc = scene as unknown as AnyScene;\n const first = read(sc, (opts.geometry ?? AUTO_POSE_DESCRIPTOR) as PoseDescriptor<unknown>, opts.read);\n const seen: Seen = {\n shapes: new Map(first.shapes.map((s) => [s.id, s.box])),\n routes: new Map([...first.routes.values()].map((r) => [r.id, runsIn(r)])),\n };\n const dispose = scene.addEditPass((summary) => {\n if (!any(summary)) return null;\n const ops = placementOps(scene, summary, opts, seen);\n return ops.length === 0 ? null : ops;\n }, { order: DIAGRAM_PASS_ORDER.labels });\n return { dispose };\n}\n","import { useLatest, type Scene } from '@weasel-js/core';\nimport { useEffect } from 'react';\nimport { installLabelPlacement, type LabelPlacementOptions } from './install';\n\n/**\n * Move `scene`'s edge labels off whatever an edit leaves covering them, for\n * the life of the calling component, each edit's moves in its own history\n * entry. Options are read when the scene changes.\n */\nexport function useLabelPlacement<TPose>(scene: Scene<unknown, string, TPose>, opts: LabelPlacementOptions<TPose> = {}): void {\n const latest = useLatest(opts);\n useEffect(() => installLabelPlacement(scene, latest.current).dispose, [scene, latest]);\n}\n","import { AUTO_POSE_DESCRIPTOR, documentPose, type Bounds, type PoseDescriptor, type Scene } from '@weasel-js/core';\n\n/** The box `node` has in document space, which is where pages are: its pose through every ancestor's transform. */\nexport function documentBoundsOf<TPose>(\n scene: Scene<unknown, string, TPose>,\n node: { id: string },\n geometry: PoseDescriptor<unknown> = AUTO_POSE_DESCRIPTOR as PoseDescriptor<unknown>,\n): Bounds {\n return geometry.getBounds(documentPose(scene as never, node as never));\n}\n","/**\n * Off-page markers on a live scene: an edit pass that splits a connector\n * whose ends land on different pages, joins one whose ends share a page\n * again, and keeps each split connector's two tags, all in the entry of the\n * edit that caused it.\n */\nimport {\n PAGES_DOC_KEY,\n createDeleteOp,\n createInsertOp,\n createSetDataOp,\n createTransformOp,\n placedPagesOf,\n type Op,\n type PlacedPage,\n type PoseDescriptor,\n type Scene,\n type SceneEditSummary,\n} from '@weasel-js/core';\nimport { diagramEdgeOf, type DiagramEdge } from '../edgeTrait';\nimport { DIAGRAM_PASS_ORDER } from '../passOrder';\nimport { diagramThemeOf } from '../theme/resolve';\nimport type { DiagramTheme } from '../theme/types';\nimport { documentBoundsOf } from './endBox';\nimport { offPageSplits, type OffPageEdgeInput } from './split';\nimport { offPageFarText, offPageTagData, offPageTagLook, offPageTagSize, offPageTagSpec, type OffPageTagLook } from './tag';\nimport { offPageTagId, type OffPageSplit } from './trait';\n\n/** Options for {@link installOffPageMarkers} and `useOffPageMarkers`. */\nexport interface OffPageMarkerOptions<TPose> {\n /** How node poses are measured. Default `AUTO_POSE_DESCRIPTOR`. */\n geometry?: PoseDescriptor<TPose>;\n /** The look a tag is given as it is made or retexted. Default the scene's\n * theme (`diagram:theme`), else `theme`. */\n look?: () => OffPageTagLook;\n /** The theme a scene naming none is drawn in. */\n theme?: DiagramTheme;\n}\n\ntype AnyScene = Scene<unknown, string, unknown>;\ntype SceneNode = ReturnType<AnyScene['renderOrderNodes']>[number];\nconst ENDS = ['from', 'to'] as const;\n\nconst sameSplit = (a: OffPageSplit | undefined, b: OffPageSplit | null): boolean =>\n (a === undefined ? b === null : b !== null && a.ref === b.ref && a.from === b.from && a.to === b.to);\n\nfunction withSplit(data: unknown, edge: DiagramEdge, split: OffPageSplit | null): Record<string, unknown> {\n const { offPage: _o, ...rest } = edge;\n return { ...(data as Record<string, unknown>), diagram: split === null ? rest : { ...rest, offPage: split } };\n}\n\n/** The connectors an edit's summary reaches: those it added, wrote, or whose\n * ends it moved, added, or re-parented, and those whose tag it removed. */\nfunction reached(scene: AnyScene, s: SceneEditSummary): Set<string> {\n const ids = new Set<string>([...s.added, ...s.posed, ...s.reparented, ...s.dataChanged]);\n const out = new Set<string>();\n for (const id of s.removed) {\n const tagged = /^(.*)\\/offpage-(?:from|to)$/.exec(id);\n if (tagged !== null) out.add(tagged[1]!);\n }\n for (const node of scene.renderOrderNodes()) {\n if (diagramEdgeOf(node) === null) continue;\n const deps = node.dependsOn;\n if (ids.has(node.id) || (Array.isArray(deps) && deps.some((d) => ids.has(d)))) out.add(node.id);\n }\n return out;\n}\n\n/** The ops that bring one connector's two tags in line with `split`. */\nfunction tagOps(scene: AnyScene, edge: SceneNode, split: OffPageSplit | null, pages: readonly PlacedPage[], look: () => OffPageTagLook): Op[] {\n const ops: Op[] = [];\n let lookNow: OffPageTagLook | null = null;\n const lookOf = () => (lookNow ??= look());\n for (const end of ENDS) {\n const id = offPageTagId(edge.id, end);\n const tag = scene.get(id as never);\n if (split === null) {\n if (tag !== undefined) ops.push(createDeleteOp({ node: tag as never, label: 'Off-page' }));\n continue;\n }\n const text = offPageFarText(pages, split, end);\n if (tag === undefined) {\n const spec = offPageTagSpec(edge.id, end, text, { ...lookOf(), layer: edge.layer });\n ops.push(createInsertOp({ node: { ...spec, parent: null } as never, label: 'Off-page' }));\n } else if ((tag.data as { text?: unknown }).text !== text) {\n const old = tag.data as { style?: OffPageTagLook['style']; fill?: { paint?: { color?: string } }; background?: { paint?: { color?: string } }; padding?: number };\n // Keeps the tag's own colors and face, which a theme or the author may have set since.\n const kept: OffPageTagLook = {\n ...lookOf(),\n ...(old.style ? { style: old.style } : {}),\n ...(old.fill?.paint?.color ? { fill: old.fill.paint.color } : {}),\n ...(old.background?.paint?.color ? { background: old.background.paint.color } : {}),\n ...(old.padding !== undefined ? { padding: old.padding } : {}),\n };\n ops.push(createSetDataOp({ id, from: tag.data, to: { ...(tag.data as object), ...offPageTagData(edge.id, end, text, kept) }, label: 'Off-page' }));\n const pose = tag.pose as Record<string, unknown>;\n ops.push(createTransformOp({ id, from: tag.pose, to: { ...pose, ...offPageTagSize(text, kept) }, label: 'Off-page' }));\n }\n }\n return ops;\n}\n\n/**\n * The ops that split, join, and tag the connectors `edges` names (every one,\n * for `'all'`), so each is split exactly when its ends sit on different\n * pages. Empty when nothing changes. The edit pass runs this; a host can run\n * it once over a document saved before it had off-page markers.\n */\nexport function offPageOps<TPose>(\n scene: Scene<unknown, string, TPose>,\n edges: Iterable<string> | 'all',\n opts: OffPageMarkerOptions<TPose> = {},\n): Op[] {\n const sc = scene as unknown as AnyScene;\n const geometry = opts.geometry as PoseDescriptor<unknown> | undefined;\n const look = opts.look ?? (() => offPageTagLook(diagramThemeOf(sc, opts.theme)));\n const wanted = edges === 'all' ? null : new Set(edges);\n const pages = placedPagesOf(sc);\n const boxOf = (id: string) => {\n const node = sc.get(id as never);\n return node === undefined ? null : documentBoundsOf(scene, node, geometry);\n };\n const inputs: (OffPageEdgeInput & { node: SceneNode; trait: DiagramEdge })[] = [];\n const used: string[] = [];\n for (const node of sc.renderOrderNodes()) {\n const trait = diagramEdgeOf(node);\n if (trait === null) continue;\n if (wanted !== null && !wanted.has(node.id)) {\n if (trait.offPage !== undefined) used.push(trait.offPage.ref);\n continue;\n }\n const deps = node.dependsOn;\n const from = Array.isArray(deps) ? boxOf(deps[0]!) : null;\n const to = Array.isArray(deps) ? boxOf(deps[1]!) : null;\n if (from === null || to === null) continue;\n inputs.push({ id: node.id, from, to, offPage: trait.offPage, node, trait });\n }\n if (inputs.length === 0) return [];\n const splits = offPageSplits({ pages, edges: inputs, used });\n const ops: Op[] = [];\n for (const edge of inputs) {\n const split = splits.get(edge.id) ?? null;\n if (!sameSplit(edge.trait.offPage, split)) {\n ops.push(createSetDataOp({ id: edge.id, from: edge.node.data, to: withSplit(edge.node.data, edge.trait, split), label: 'Off-page' }));\n }\n ops.push(...tagOps(sc, edge.node, split, pages, look));\n }\n return ops;\n}\n\n/**\n * Split `scene`'s connectors across pages from now on: every live edit that\n * moves a connector's end, adds or rewrites a connector, or changes the pages\n * splits, joins, and retags what it reached, in its own history entry. On\n * install nothing is recomputed. Returns the remover. A host without React\n * calls this; a component calls `useOffPageMarkers`.\n */\nexport function installOffPageMarkers<TPose>(\n scene: Scene<unknown, string, TPose>,\n opts: OffPageMarkerOptions<TPose> = {},\n): () => void {\n const sc = scene as unknown as AnyScene;\n return scene.addEditPass((summary) => {\n const edges = summary.docChanged.has(PAGES_DOC_KEY) ? 'all' : reached(sc, summary);\n if (edges !== 'all' && edges.size === 0) return null;\n const ops = offPageOps(scene, edges, opts);\n return ops.length === 0 ? null : ops;\n }, { order: DIAGRAM_PASS_ORDER.offPage });\n}\n","import { useLatest, type Scene } from '@weasel-js/core';\nimport { useEffect } from 'react';\nimport { installOffPageMarkers, type OffPageMarkerOptions } from './install';\n\n/**\n * Split `scene`'s connectors across pages for the life of the calling\n * component: each edit that moves a connector's end or changes the pages\n * splits, joins, and retags what it reached, in its own history entry.\n * Options are read when the scene changes.\n */\nexport function useOffPageMarkers<TPose>(scene: Scene<unknown, string, TPose>, opts: OffPageMarkerOptions<TPose> = {}): void {\n const latest = useLatest(opts);\n useEffect(() => installOffPageMarkers(scene, latest.current), [scene, latest]);\n}\n","/**\n * Following a connector off the page: a double-click on an off-page tag goes\n * to the page at the connector's far end and selects the shape there.\n */\nimport {\n ActionDisabledReason,\n bodyPredicate,\n fitViewToPage,\n placedPagesOf,\n type Action,\n type ActionDeps,\n type Contribution,\n type GestureBinding,\n type InvocationCtx,\n} from '@weasel-js/core';\nimport { diagramEdgeOf } from '../edgeTrait';\nimport { offPageTagOf } from './trait';\n\n/** The action that follows an off-page tag to its far page. */\nexport const FOLLOW_OFF_PAGE_ACTION_ID = 'diagram.followOffPage';\n\n/** Where a tag leads: the shape at its connector's far end, and that shape's page. */\nexport interface OffPageTarget {\n tag: string;\n edge: string;\n node: string;\n page: string;\n}\n\ntype SceneReads = NonNullable<ActionDeps['scene']>;\n\n/** Where tag `tagId` leads, or `null` when it is no tag of a split connector. */\nexport function offPageTargetOf(scene: SceneReads, tagId: string): OffPageTarget | null {\n const node = scene.get(tagId as never);\n const tag = node === undefined ? null : offPageTagOf(node);\n const edgeNode = tag === null ? undefined : scene.get(tag.edge as never);\n const split = edgeNode === undefined ? undefined : diagramEdgeOf(edgeNode)?.offPage;\n const deps = edgeNode?.dependsOn;\n if (tag === null || split === undefined || !Array.isArray(deps)) return null;\n const far = tag.end === 'from' ? 1 : 0;\n return { tag: tagId, edge: tag.edge, node: deps[far]!, page: far === 1 ? split.to : split.from };\n}\n\n/** Options for {@link createFollowOffPageAction}. */\nexport interface FollowOffPageOptions {\n /** Runs in place of the default, which selects `target.node` and fits the view to `target.page`. */\n follow?: (target: OffPageTarget, ctx: InvocationCtx) => void;\n /** Screen pixels the default leaves around the page it fits. Default 24. */\n padding?: number;\n}\n\nfunction tagUnder(deps: ActionDeps | undefined, at: { x: number; y: number } | undefined): OffPageTarget | null {\n if (deps?.scene === undefined || at === undefined) return null;\n const id = deps.nodeAtPoint?.(at);\n return id == null ? null : offPageTargetOf(deps.scene, id);\n}\n\nfunction followDefault(target: OffPageTarget, ctx: InvocationCtx, padding: number): void {\n const { scene, selection, view } = ctx.deps;\n if (scene === undefined) return;\n selection?.set([target.node as never]);\n const page = placedPagesOf(scene).find((p) => p.id === target.page);\n const size = view?.hostSize?.();\n if (page === undefined || view === undefined || size == null) return;\n view.set(fitViewToPage(page, size, view.get(), { padding }));\n}\n\n/**\n * Goes to the far page of the off-page tag a double-click lands on, and\n * selects the shape at the connector's far end there. It declines a\n * double-click on anything else.\n */\nexport function createFollowOffPageAction(opts: FollowOffPageOptions = {}): Action {\n const padding = opts.padding ?? 24;\n const follow = opts.follow ?? ((target: OffPageTarget, ctx: InvocationCtx) => followDefault(target, ctx, padding));\n return {\n id: FOLLOW_OFF_PAGE_ACTION_ID,\n label: 'Go to the other page',\n group: 'diagram',\n requires: ['scene', 'nodeAtPoint', 'selection', 'view'],\n eligible: { mode: { in: ['normal', 'isolation'] } },\n invoker: {\n timing: 'immediate',\n run(deps, params) {\n const world = { x: Number(params?.worldX), y: Number(params?.worldY) };\n const target = tagUnder(deps, world);\n if (target === null) return;\n follow(target, { world, modifiers: { alt: false, shift: false, meta: false, ctrl: false }, deps } as InvocationCtx);\n },\n },\n enabled: (deps, at) => (tagUnder(deps, at) !== null ? true : ActionDisabledReason.NotApplicable),\n };\n}\n\nconst onBody = bodyPredicate((target) => target === 'selected-body' || target === 'unselected-body');\n\n/** A double-click on a node's body; the action itself declines unless that node is an off-page tag. */\nexport function followOffPageBinding(actionId: string = FOLLOW_OFF_PAGE_ACTION_ID): GestureBinding {\n return { spec: { kind: 'doubleClick', target: { kindOf: onBody } }, actionId };\n}\n\n/** Following off-page tags, as a contribution to pass as `ambient`. */\nexport function diagramOffPage(opts: FollowOffPageOptions = {}): { contribution: Contribution } {\n return {\n contribution: {\n id: 'weasel-diagram-off-page',\n eligibility: { always: true },\n actions: [createFollowOffPageAction(opts)],\n bindings: [followOffPageBinding()],\n },\n };\n}\n","import { DIAGRAM_THEMES } from './themes';\nimport type { DiagramTheme } from './types';\n\n/**\n * A theme matching its host's chrome, built from resolved `--wzl-*` values:\n * `read` answers a custom property's value, as `getComputedStyle(el)\n * .getPropertyValue` does. A token that reads empty takes `paper`'s color.\n */\nexport function diagramThemeFromTokens(\n read: (token: string) => string,\n opts: { id?: string; name?: string } = {},\n): DiagramTheme {\n const paper = DIAGRAM_THEMES.paper!;\n const t = (name: string, fallback: string): string => read(`--wzl-${name}`).trim() || fallback;\n const fg = t('fg', paper.roles.default!.text);\n const muted = t('fg-muted', paper.roles.muted!.text);\n const raised = t('surface-raised', paper.roles.default!.fill);\n const sunken = t('surface-sunken', paper.roles.muted!.fill);\n const border = t('border-strong', t('border', paper.roles.default!.stroke));\n const accent = t('accent', paper.roles.accent!.stroke);\n const success = t('success', paper.roles.positive!.stroke);\n const warning = t('warning', paper.roles.warning!.stroke);\n const danger = t('danger', paper.roles.negative!.stroke);\n const size = Number.parseFloat(read('--wzl-font-size'));\n const shape = (stroke: string) => ({ fill: raised, stroke, text: fg });\n return {\n id: opts.id ?? 'tokens',\n name: opts.name ?? 'Match chrome',\n roles: {\n default: shape(border),\n accent: { fill: t('accent-soft', raised), stroke: accent, text: fg },\n muted: { fill: sunken, stroke: border, text: muted },\n positive: shape(success),\n warning: shape(warning),\n negative: shape(danger),\n },\n defaultRole: 'default',\n edge: { ...paper.edge, stroke: muted },\n label: { fill: fg },\n container: { ...paper.container, fill: sunken, stroke: border, text: muted },\n lane: {\n header: { fill: sunken, stroke: border, text: fg, strokeWidth: 1 },\n bodies: [\n { fill: t('surface', paper.page), stroke: border, text: fg, strokeWidth: 1 },\n { fill: raised, stroke: border, text: fg, strokeWidth: 1 },\n ],\n },\n page: t('surface', paper.page),\n font: { family: t('font-ui', paper.font.family), size: Number.isFinite(size) && size > 0 ? size : paper.font.size },\n series: [accent, success, warning, danger, t('accent-strong', accent), muted],\n };\n}\n","import { measureTextBounds } from '@weasel-js/core';\nimport type { MeasureRowText } from './body';\n\nconst FALLBACK_SIZE = 16;\n\n/**\n * Measures a row's text as the kit's text renderer lays it out, from the\n * registered font's metrics, so a body sized by it holds the text it draws.\n * The line height is 1.2 sizes, as `canvasMeasure`'s is. Needs the family\n * registered; an unregistered one measures as the fallback glyph.\n */\nexport const rendererMeasure: MeasureRowText = (text, style) => {\n const fontSize = style.fontSize ?? FALLBACK_SIZE;\n const { width } = measureTextBounds(text, {\n fontSize, ...(style.fontFamily !== undefined ? { fontFamily: style.fontFamily } : {}), ...(style.bold === true ? { fontWeight: 700 } : {}),\n });\n return { width: Math.ceil(width), height: Math.ceil(fontSize * 1.2) };\n};\n","/**\n * The edits a theme makes to a scene, each one undo entry: applying a theme,\n * naming a shape's or connector's role, and setting a color by hand.\n */\nimport type { Scene } from '@weasel-js/core';\nimport type { MeasureRowText } from '../body';\nimport { relayoutBodies, type RelayoutScene } from '../bodyRelayout';\nimport { diagramThemeOf, themeDocValue } from './resolve';\nimport { themeWrites, type ThemedScene } from './themeWrites';\nimport { DIAGRAM_THEME_KEY, type DiagramTheme, type FontField, type StyleField } from './types';\n\ntype AnyScene = Scene<unknown, string, unknown>;\ntype Paint = { paint?: Record<string, unknown> } & Record<string, unknown>;\ntype Data = Record<string, unknown> & { diagram?: Record<string, unknown>; fill?: Paint; stroke?: Paint };\n\n/** What a styleable node says about its style: a shape or a connector, the role it names, and the\n * colors its author set by hand. */\nexport interface DiagramStyleState {\n kind: 'shape' | 'connector';\n role?: string;\n own: readonly StyleField[];\n /** The parts of its text face the author set: a theme's size change leaves those. */\n ownFont: readonly FontField[];\n}\n\n/** The style state of a shape (a body) or a connector, or `null` for anything else — a text row,\n * a label, a group, a container. */\nexport function diagramStyleOf(node: { data: unknown }): DiagramStyleState | null {\n const trait = (node.data as Data | null)?.diagram;\n if (trait === null || typeof trait !== 'object') return null;\n const kind = 'from' in trait && 'to' in trait ? 'connector' : 'outline' in trait && !('group' in trait) && !('container' in trait) ? 'shape' : null;\n if (kind === null) return null;\n const role = trait.style as string | undefined;\n return {\n kind, ...(role !== undefined ? { role } : {}),\n own: (trait.ownStyle as readonly StyleField[] | undefined) ?? [],\n ownFont: (trait.ownFont as readonly FontField[] | undefined) ?? [],\n };\n}\n\ntype Sized = { style?: { fontSize?: unknown } } | undefined;\n\n/** Writes each node's new data, then lays out again every body whose text changed size. */\nfunction writeAll(scene: AnyScene, writes: ReadonlyMap<string, unknown>, measure?: MeasureRowText): void {\n const bodies: string[] = [];\n for (const [id, data] of writes) {\n const node = scene.get(id as never)!;\n if ((node.data as Sized)?.style?.fontSize !== (data as Sized)?.style?.fontSize && node.parent !== null) bodies.push(node.parent);\n scene.update(id as never, { data });\n }\n relayoutBodies(scene as unknown as RelayoutScene, bodies, measure);\n}\n\n/** Options for {@link applyDiagramTheme}. */\nexport interface ApplyDiagramThemeOptions {\n /** Fold this apply into the undo entry before it when that one was made under the same key, so a\n * run of applies, such as a theme color dragged, undoes as one. See `scene.batch`. */\n coalesceKey?: string;\n /** The theme the scene is in now, whose font size text moves from. Default the scene's own\n * `diagram:theme`; a host that draws a scene naming none in another theme passes that. */\n from?: DiagramTheme;\n /** Measures text, for laying out again a body whose text changed size. Default an estimate. */\n measure?: MeasureRowText;\n}\n\n/** Recolors the whole scene in `theme` and saves it as the `diagram:theme` document value, as one\n * undo entry. Colors the author set by hand stay. */\nexport function applyDiagramTheme(\n scene: AnyScene, theme: DiagramTheme, label = `Theme: ${theme.name}`, opts: ApplyDiagramThemeOptions = {},\n): void {\n const from = opts.from ?? diagramThemeOf(scene);\n scene.batch(label, () => {\n writeAll(scene, themeWrites(scene as unknown as ThemedScene, theme, undefined, from), opts.measure);\n scene.doc.set(DIAGRAM_THEME_KEY, themeDocValue(theme));\n }, opts.coalesceKey !== undefined ? { coalesceKey: opts.coalesceKey } : {});\n}\n\n/** Options for {@link setDiagramStyle} and {@link setDiagramColor}. */\nexport interface DiagramStyleEditOptions {\n /** The theme to color by. Default the scene's own `diagram:theme`. */\n theme?: DiagramTheme;\n label?: string;\n}\n\nconst withTrait = (data: Data, trait: Record<string, unknown>): Data => ({ ...data, diagram: trait });\n\n/**\n * Names `role` on every shape and connector among `ids` and recolors them in\n * it, as one undo entry. Choosing a role hands back any color the author had\n * set, so the role shows.\n */\nexport function setDiagramStyle(scene: AnyScene, ids: readonly string[], role: string, opts: DiagramStyleEditOptions = {}): void {\n const theme = opts.theme ?? diagramThemeOf(scene);\n const styled = ids.filter((id) => { const n = scene.get(id as never); return n !== undefined && diagramStyleOf(n) !== null; });\n if (styled.length === 0) return;\n scene.batch(opts.label ?? 'Set style', () => {\n for (const id of styled) {\n const data = scene.get(id as never)!.data as Data;\n const { ownStyle: _, ...trait } = data.diagram!;\n scene.update(id as never, { data: withTrait(data, { ...trait, style: role }) });\n }\n writeAll(scene, themeWrites(scene as unknown as ThemedScene, theme, new Set(styled)));\n });\n}\n\nconst painted = (paint: Paint | undefined, color: string): Paint => ({ ...paint, paint: { ...paint?.paint, color } });\n\n/** The text nodes a shape's or connector's `text` color reaches: a shape's rows, a connector's labels. */\nfunction textNodesOf(scene: AnyScene, id: string, kind: DiagramStyleState['kind']): string[] {\n if (kind === 'shape') return scene.childrenOf(id as never).filter((c) => typeof (scene.get(c)?.data as Data)?.text === 'string');\n return scene.renderOrderNodes().filter((n) => {\n const deps = n.dependsOn;\n return Array.isArray(deps) && deps.length === 1 && deps[0] === id && 'label' in ((n.data as Data).diagram ?? {});\n }).map((n) => n.id);\n}\n\n/**\n * Sets `field` to `color` on every shape and connector among `ids` — `text`\n * reaching a shape's rows and a connector's label — and records it in their\n * `ownStyle`, so a theme change leaves it. One undo entry. A connector has no\n * fill, and ignores one.\n */\nexport function setDiagramColor(scene: AnyScene, ids: readonly string[], field: StyleField, color: string, opts: Pick<DiagramStyleEditOptions, 'label'> = {}): void {\n scene.batch(opts.label ?? `Set ${field} color`, () => {\n for (const id of ids) {\n const node = scene.get(id as never);\n const state = node === undefined ? null : diagramStyleOf(node);\n if (state === null || (state.kind === 'connector' && field === 'fill')) continue;\n const data = node!.data as Data;\n const own = state.own.includes(field) ? state.own : [...state.own, field];\n const next = withTrait(data, { ...data.diagram, ownStyle: own });\n if (field !== 'text') next[field] = painted(data[field], color);\n scene.update(id as never, { data: next });\n if (field !== 'text') continue;\n for (const t of textNodesOf(scene, id, state.kind)) {\n const text = scene.get(t as never)!.data as Data;\n scene.update(t as never, { data: { ...text, fill: painted(text.fill, color) } });\n }\n }\n });\n}\n\n/**\n * Sets the text of every shape and connector among `ids` — a shape's rows, a\n * connector's label — to `size`, and records it in their `ownFont`, so a\n * theme's size change leaves it. One undo entry.\n */\nexport function setDiagramFontSize(\n scene: AnyScene, ids: readonly string[], size: number, opts: Pick<DiagramStyleEditOptions, 'label'> & { measure?: MeasureRowText } = {},\n): void {\n scene.batch(opts.label ?? 'Set text size', () => {\n const writes = new Map<string, unknown>();\n for (const id of ids) {\n const node = scene.get(id as never);\n const state = node === undefined ? null : diagramStyleOf(node);\n if (state === null) continue;\n const data = node!.data as Data;\n if (!state.ownFont.includes('size')) scene.update(id as never, { data: withTrait(data, { ...data.diagram, ownFont: [...state.ownFont, 'size'] }) });\n for (const t of textNodesOf(scene, id, state.kind)) {\n const text = scene.get(t as never)!.data as Data & { style?: Record<string, unknown> };\n writes.set(t, { ...text, style: { ...text.style, fontSize: size } });\n }\n }\n writeAll(scene, writes, opts.measure);\n });\n}\n","/**\n * Editing a theme as a value: every edit returns a new theme and leaves the\n * one it was given alone, so a shipped theme is never changed.\n */\nimport { DIAGRAM_THEMES } from './themes';\nimport { DIAGRAM_ROLES, type DiagramTheme } from './types';\n\ntype BoxField = 'fill' | 'stroke' | 'text';\n\n/** Where one value sits in a {@link DiagramTheme}. */\nexport type ThemePath =\n | readonly ['roles', string, BoxField]\n | readonly ['edge', 'stroke']\n | readonly ['label', 'fill']\n | readonly ['container', BoxField]\n | readonly ['lane', 'header', BoxField]\n | readonly ['lane', 'bodies', number, BoxField]\n | readonly ['page']\n | readonly ['font', 'family']\n | readonly ['font', 'size']\n | readonly ['series', number];\n\n/** Whether `theme` is one of {@link DIAGRAM_THEMES} itself, which no edit may change. */\nexport const isShippedTheme = (theme: DiagramTheme): boolean => DIAGRAM_THEMES[theme.id] === theme;\n\n/** A custom copy of `theme`, named \"<name> (edited)\", for a document to keep and change. */\nexport function forkTheme(theme: DiagramTheme): DiagramTheme {\n return { ...structuredClone(theme), id: `${theme.id}-edited`, name: `${theme.name} (edited)` };\n}\n\n/** `theme` when it is already a custom theme, else a fork of it: what the first edit to a shipped\n * theme starts from. */\nexport const editableTheme = (theme: DiagramTheme): DiagramTheme => (isShippedTheme(theme) ? forkTheme(theme) : theme);\n\n/** The value at `path` in `theme`. */\nexport function themeValue(theme: DiagramTheme, path: ThemePath): unknown {\n let at: unknown = theme;\n for (const key of path) at = (at as Record<string | number, unknown> | undefined)?.[key];\n return at;\n}\n\nfunction setIn(at: unknown, path: readonly (string | number)[], value: unknown): unknown {\n if (path.length === 0) return value;\n const [key, ...rest] = path;\n if (Array.isArray(at)) {\n const copy = [...at];\n copy[key as number] = setIn(copy[key as number], rest, value);\n return copy;\n }\n const obj = (at ?? {}) as Record<string, unknown>;\n return { ...obj, [key!]: setIn(obj[key!], rest, value) };\n}\n\n/** `theme` with `value` at `path`; everything else shared with it. */\nexport const setThemeValue = (theme: DiagramTheme, path: ThemePath, value: string | number): DiagramTheme =>\n setIn(theme, path, value) as DiagramTheme;\n\n/** Every role `theme` styles with the name a picker shows: the shipped roles first, in their order,\n * then the theme's own. */\nexport function themeRoles(theme: DiagramTheme): { id: string; label: string }[] {\n const shipped = new Map<string, string>(DIAGRAM_ROLES.map((r) => [r.id, r.label]));\n const ids = [...DIAGRAM_ROLES.map((r) => r.id as string).filter((id) => id in theme.roles),\n ...Object.keys(theme.roles).filter((id) => !shipped.has(id))];\n return ids.map((id) => ({ id, label: theme.roleLabels?.[id] ?? shipped.get(id) ?? id }));\n}\n\nconst slug = (label: string): string => label.trim().toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '') || 'role';\n\n/** `theme` with a role named `label`, in the default role's colors, and the id it was given. */\nexport function addThemeRole(theme: DiagramTheme, label: string): { theme: DiagramTheme; id: string } {\n const base = slug(label);\n let id = base;\n for (let n = 2; id in theme.roles; n++) id = `${base}-${n}`;\n return {\n theme: { ...theme, roles: { ...theme.roles, [id]: { ...theme.roles[theme.defaultRole]! } }, roleLabels: { ...theme.roleLabels, [id]: label } },\n id,\n };\n}\n\n/** `theme` with role `id` shown as `label`. The id, which shapes name the role by, stays. */\nexport const renameThemeRole = (theme: DiagramTheme, id: string, label: string): DiagramTheme =>\n (id in theme.roles ? { ...theme, roleLabels: { ...theme.roleLabels, [id]: label } } : theme);\n\n/** `theme` without role `id`; its shapes fall to the default role when the theme is next applied.\n * The default role stays: `theme` comes back unchanged. */\nexport function removeThemeRole(theme: DiagramTheme, id: string): DiagramTheme {\n if (id === theme.defaultRole || !(id in theme.roles)) return theme;\n const { [id]: _, ...roles } = theme.roles;\n const { [id]: __, ...labels } = theme.roleLabels ?? {};\n return { ...theme, roles, ...(theme.roleLabels ? { roleLabels: labels } : {}) };\n}\n","/**\n * A theme as a file, so a custom theme can travel between documents: written\n * as JSON, and checked on the way back in.\n */\nimport { parseColor } from '@weasel-js/core';\nimport type { DiagramTheme } from './types';\n\n/** The extension a theme file is saved with. */\nexport const DIAGRAM_THEME_EXTENSION = '.weasel-theme.json';\n\n/** `theme` as the text of a theme file. */\nexport const themeToJson = (theme: DiagramTheme): string => `${JSON.stringify(theme, null, 2)}\\n`;\n\ntype Raw = Record<string, unknown>;\n\nconst isObject = (v: unknown): v is Raw => v !== null && typeof v === 'object' && !Array.isArray(v);\n\nfunction isColor(v: unknown): boolean {\n if (typeof v !== 'string') return false;\n try {\n parseColor(v);\n return true;\n } catch {\n return false;\n }\n}\n\n/** The checks one theme gets, each adding what it finds wrong to `errors`, named by its path. */\nfunction checker(errors: string[]) {\n const color = (path: string, v: unknown) => { if (!isColor(v)) errors.push(`${path}: ${JSON.stringify(v)} is not a color`); };\n const box = (path: string, v: unknown) => {\n if (!isObject(v)) return void errors.push(`${path}: missing`);\n for (const field of ['fill', 'stroke', 'text']) color(`${path}.${field}`, v[field]);\n };\n const text = (path: string, v: unknown) => { if (typeof v !== 'string' || v === '') errors.push(`${path}: missing`); };\n const font = (path: string, v: unknown) => {\n if (!isObject(v)) return void errors.push(`${path}: missing`);\n text(`${path}.family`, v.family);\n if (typeof v.size !== 'number' || !(v.size > 0)) errors.push(`${path}.size: ${JSON.stringify(v.size)} is not a size`);\n };\n return { color, box, text, font };\n}\n\nfunction checkTheme(t: Raw, errors: string[]): void {\n const { color, box, text, font } = checker(errors);\n text('id', t.id);\n text('name', t.name);\n if (!isObject(t.roles) || Object.keys(t.roles).length === 0) errors.push('roles: missing');\n else for (const [id, style] of Object.entries(t.roles)) box(`roles.${id}`, style);\n if (typeof t.defaultRole !== 'string') errors.push('defaultRole: missing');\n else if (isObject(t.roles) && !(t.defaultRole in t.roles)) errors.push(`defaultRole: no role ${JSON.stringify(t.defaultRole)}`);\n if (t.roleLabels !== undefined) {\n if (!isObject(t.roleLabels)) errors.push('roleLabels: not an object');\n else for (const [id, label] of Object.entries(t.roleLabels)) text(`roleLabels.${id}`, label);\n }\n if (!isObject(t.edge)) errors.push('edge: missing');\n else color('edge.stroke', t.edge.stroke);\n if (!isObject(t.label)) errors.push('label: missing');\n else {\n color('label.fill', t.label.fill);\n if (t.label.font !== undefined) font('label.font', t.label.font);\n }\n box('container', t.container);\n if (!isObject(t.lane)) errors.push('lane: missing');\n else {\n box('lane.header', t.lane.header);\n if (!Array.isArray(t.lane.bodies) || t.lane.bodies.length === 0) errors.push('lane.bodies: missing');\n else t.lane.bodies.forEach((b, i) => box(`lane.bodies.${i}`, b));\n }\n color('page', t.page);\n font('font', t.font);\n if (!Array.isArray(t.series)) errors.push('series: missing');\n else t.series.forEach((c, i) => color(`series.${i}`, c));\n}\n\n/** The theme a theme file holds, or what is wrong with it, each error naming where. */\nexport function parseDiagramTheme(json: string): { theme: DiagramTheme } | { errors: string[] } {\n let raw: unknown;\n try {\n raw = JSON.parse(json);\n } catch (err) {\n return { errors: [`not JSON: ${(err as Error).message}`] };\n }\n if (!isObject(raw)) return { errors: ['a theme is an object'] };\n const errors: string[] = [];\n checkTheme(raw, errors);\n return errors.length > 0 ? { errors } : { theme: raw as unknown as DiagramTheme };\n}\n"]}
|