@weasel-js/diagram 1.15.0 → 1.15.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/README.md +114 -5
  2. package/dist/{chunk-GR2DK4S2.js → chunk-6YQSQXQT.js} +1485 -266
  3. package/dist/chunk-6YQSQXQT.js.map +1 -0
  4. package/dist/{chunk-FDCODMFW.js → chunk-7BV2MBED.js} +906 -606
  5. package/dist/chunk-7BV2MBED.js.map +1 -0
  6. package/dist/{chunk-IYUU5KUY.js → chunk-FQVZWS24.js} +11 -101
  7. package/dist/chunk-FQVZWS24.js.map +1 -0
  8. package/dist/{chunk-AXL4JQBM.js → chunk-LPTNAYER.js} +3 -3
  9. package/dist/{chunk-AXL4JQBM.js.map → chunk-LPTNAYER.js.map} +1 -1
  10. package/dist/{chunk-DE7UILJA.js → chunk-QGL6QJE4.js} +183 -23
  11. package/dist/chunk-QGL6QJE4.js.map +1 -0
  12. package/dist/{dataTypes-BIkhAOc4.d.ts → dataTypes-1ch6cMtq.d.ts} +12 -3
  13. package/dist/effect-audio.d.ts +2 -2
  14. package/dist/effect-audio.js +7 -11
  15. package/dist/effect-audio.js.map +1 -1
  16. package/dist/effect.d.ts +5 -5
  17. package/dist/effect.js +13 -20
  18. package/dist/effect.js.map +1 -1
  19. package/dist/icons.table.js +44 -0
  20. package/dist/icons.table.js.map +1 -1
  21. package/dist/icons.table.json +44 -0
  22. package/dist/index.d.ts +932 -37
  23. package/dist/index.js +707 -34
  24. package/dist/index.js.map +1 -1
  25. package/dist/{labelTrait-BBjRgxbz.d.ts → labelTrait-moIciyXr.d.ts} +4 -0
  26. package/dist/layout.d.ts +3 -3
  27. package/dist/{layout.entry-CbmGuqE-.d.ts → layout.entry-zstuljAl.d.ts} +2 -2
  28. package/dist/layout.js +2 -2
  29. package/dist/{stageTypes-UiO25hcn.d.ts → stageTypes-B7oF8Lww.d.ts} +1 -1
  30. package/dist/{types-B0n2CNTW.d.ts → types-D5ybp8Xh.d.ts} +32 -1
  31. package/package.json +12 -11
  32. package/dist/chunk-DE7UILJA.js.map +0 -1
  33. package/dist/chunk-FDCODMFW.js.map +0 -1
  34. package/dist/chunk-GR2DK4S2.js.map +0 -1
  35. package/dist/chunk-IYUU5KUY.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/portAffordance.ts","../src/connectTargets.ts","../src/connect.ts","../src/containers/canDropInto.ts","../src/reorderSlide.ts","../src/reorder.ts","../src/overlays.tsx","../src/reorderModel.ts","../src/itemDropTarget.ts","../src/itemDrop.ts","../src/theme/themeWrites.ts","../src/stencils/containers.ts","../src/containers/containerStencils.ts","../src/worldWith.ts","../src/containers/laneBoundaryLayer.ts","../src/containers/containerActions.ts","../src/containers/containerTitle.ts","../src/hops/hopsAction.ts","../src/labelDragAction.ts","../src/labelCommands.ts","../src/portLayer.ts","../src/edgeEndLayer.ts","../src/waypoints.ts","../src/waypointLayer.ts","../src/routeSnapSource.ts","../src/waypointAction.ts","../src/routeCommands.ts","../src/routerCommands.ts","../src/contribution.ts","../src/avoid/sceneInput.ts","../src/specWorld.ts","../src/avoid/specRoutes.ts","../src/hops/sceneEdges.ts","../src/hops/specHops.ts","../src/reconnect.ts","../src/groupReorder.ts","../src/labels/specLabels.ts","../src/sequence/trait.ts","../src/resizable.ts","../src/liveProducers.ts","../src/livePlan.ts","../src/liveRoutes.ts","../src/live.ts","../src/bodyRules.ts","../src/shape.ts","../src/bodyNode.ts","../src/sequence/edit.ts","../src/sequence/metrics.ts","../src/sequence/columns.ts","../src/sequence/rows.ts","../src/sequence/layout.ts","../src/sequence/specs.ts","../src/sequence/commit.ts","../src/sequence/author.ts","../src/sequence/authorSteps.ts","../src/sequence/layer.ts","../src/sequence/select.ts","../src/sequence/actions.ts","../src/mirrorSelection.ts","../src/regionSync.ts","../src/sceneSync.ts","../src/sequence/textEdit.ts","../src/regionEditing.ts","../src/diagramEditing.ts","../src/usePagesView.ts","../src/diagramFit.ts","../src/DiagramView.tsx"],"names":["paintOf","AUTO_POSE_DESCRIPTOR","toward","along","boxes","region","effectivePose","useLatest","members","nearestGap","place","refusalOf","look","at","membersOf","composeWorldPose","viewToTransform","ellipsePath","paintsLayer","ActionDisabledReason","bodyPredicate","center","proposed","NO_MODIFIERS","scenePoseFrame","composeAffordanceLayer","p","DEFAULT_HIT_PX","DEFAULT_SIZE_PX","out","DEFAULT_FILL","DEFAULT_STROKE","moveOf","routeOf","scenePoseAdapter","RIGID_POSE_COMPOSITION","avoid","DEFAULT_SNAP","moveItems","onBody","traitOf","moved","useRef","useMemo","useEffect","useCallback","held","polylineFromPoints","outlineOf","steps","localizeWorldPoses","pressOf","portsOf","worldPosesOf","known","createDeleteAction","unionRects","DiagramView","useState","viewRectToScreen"],"mappings":"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","file":"chunk-6YQSQXQT.js","sourcesContent":["/**\n * Ports as affordances — what makes a painted port a grabbable one.\n *\n * A port is declared as an `AffordanceRegion`, so the kit's own region walk\n * supplies the hit-test, the screen-pixel hit radius, the cursor and the\n * exclusive claim that keeps a port drag out of the select tool's hands. The\n * walk runs on every pointerdown before any tool sees the event, so a port\n * answers whatever tool happens to be active.\n *\n * Two things about this are easy to get wrong, and both fail silently.\n *\n * **`targetId` is `null`.** The framework composes a target's rotation about\n * its bounds center for any region naming one, and `portsOf` has already\n * rotated the port. Naming the participant here would rotate it twice.\n *\n * **`hitKind` is not set.** On the registered-layer route the discriminator is\n * the layer's own id — `<SceneCanvas>` stamps the hit `layer:<RenderLayer.id>`\n * and carries `initialScratch` through as `payload`. A `hitKind` declared here\n * would be dropped, and a binding written against it would never match.\n */\nimport type {\n Affordance,\n AffordanceRegion,\n ChromeState,\n CommandStroke,\n CursorSpec,\n PoseDescriptor,\n CommandFill,\n} from '@weasel-js/core';\nimport { ellipsePath, paintsLayer, viewToTransform } from '@weasel-js/core';\nimport { createSettledCache } from '@weasel-js/geom/nd';\nimport { boxIndex, boxesMeeting, keyedIndex } from './keyedIndex';\nimport { portsOf } from './ports';\nimport type { DiagramNodeLike, DiagramNodeReader } from './trait';\nimport type { Port } from './types';\n\n/** The layer id this package composes its port regions into. */\nexport const PORT_LAYER_ID = 'diagram-ports';\n\n/** The affordance kind a press on a port reports — what a binding's\n * `target: 'affordance:...'` has to name. `<SceneCanvas>` builds it from\n * {@link PORT_LAYER_ID}, so the two cannot drift. */\nexport const PORT_AFFORDANCE_KIND = `layer:${PORT_LAYER_ID}` as const;\n\n/** A participant and the pose it is **painted** at. `effectivePose`, not\n * `node.pose` — a port that answers from the document pose while its node is\n * mid-drag sits somewhere the user can see the node is not. */\nexport interface ParticipantPose<TPose> {\n node: DiagramNodeLike;\n pose: TPose;\n /** Not drawn: on a hidden layer, or hidden on its own or by an ancestor.\n * `sceneParticipants` answers it from the scene's `nodeGates`. */\n hidden?: boolean;\n /** Out of reach: locked, or on a locked layer. */\n locked?: boolean;\n /** The scene layer the node is painted on, which the asking view may not\n * paint (`ChromeState.layerIsPainted`, `ViewApi.layerIsPainted`). */\n layer?: string;\n}\n\n/** Whether a participant's ports are drawn, grabbed and landed on. A hidden\n * or locked node gets none, as it gets no selection or hover chrome either,\n * and nor does one on a layer the asking view does not paint. */\nexport function offersPorts(\n p: { hidden?: boolean; locked?: boolean; layer?: string },\n view?: Parameters<typeof paintsLayer>[0],\n): boolean {\n return p.hidden !== true && p.locked !== true && paintsLayer(view, p.layer);\n}\n\n/** Where the affordance gets its participants. A thunk rather than a scene so\n * the geometry is testable without one, and so a consumer whose participants\n * come from somewhere else needs no adapter.\n *\n * With `generation`, the ports are read once per generation, so a frame paints\n * them without reading any, and a press is tested against an index of them\n * rather than every one: it must answer differently whenever the thunk can yield\n * something different (`sceneParticipants` answers the scene's version and\n * its overrides' generation). */\nexport type ParticipantSource<TPose> = (() => Iterable<ParticipantPose<TPose>>) & {\n generation?: () => readonly unknown[];\n};\n\n/** What a press on a port hands the action that picks up the drag. Arrives as\n * `InvocationCtx.drag.affordance.payload`. */\nexport interface PortScratch {\n /** `CommonAffordanceScratch.targetId` — becomes `AffordanceHit.targetIds`. */\n targetId: string;\n nodeId: string;\n portId: string;\n /** The port resolved at press time: where it was and which way it faces. */\n port: Port;\n}\n\n/** Options for {@link createPortAffordance}: which ports show, and how they\n * are painted and hit. */\nexport interface PortAffordanceOptions<TPose> {\n /** Also the chrome-caps visibility id. Default {@link PORT_LAYER_ID}. */\n id?: string;\n read?: DiagramNodeReader;\n geometry?: PoseDescriptor<TPose>;\n /** Which participants show their ports. Default: all of them. Gate on\n * selection or hover by reading `state`. */\n shows?: (node: DiagramNodeLike, state: ChromeState) => boolean;\n /** Which of a participant's ports show. Default: all of them. A port\n * this turns away is not painted or grabbable, and passed with the connect\n * options (as `diagramPorts` and `DiagramView` do), no connect lands on it. */\n showsPort?: (port: Port) => boolean;\n /** Screen-pixel hit radius. Default 8, the kit's `HANDLE_BASE_PX`. */\n hitRadiusPx?: number;\n /** Screen-pixel size of the painted mark: a square's side, or a circle's\n * diameter. Default 7. Omit `paint` entirely by passing 0 — a port the\n * consumer draws itself is still hittable. */\n sizePx?: number;\n /** One fill for every port, or a function of the port — its `type`, say. */\n fill?: CommandFill | ((port: Port) => CommandFill);\n stroke?: CommandStroke;\n /** Default `'square'`. */\n shape?: 'square' | 'circle';\n cursor?: CursorSpec;\n /** Default `'exclusive'` on pointer gestures: a drag from a port is a\n * connect, never a move of the node underneath it. */\n strength?: 'exclusive' | 'shared';\n}\n\nconst DEFAULT_HIT_PX = 8;\nconst DEFAULT_SIZE_PX = 7;\n\n/** Read a port press's scratch back off the hit an action was handed. */\nexport function portScratchOf(hit: { payload?: unknown } | null | undefined): PortScratch | null {\n const payload = hit?.payload as PortScratch | undefined;\n return payload !== undefined && typeof payload.portId === 'string' ? payload : null;\n}\n\nfunction withPaint(paint: AffordanceRegion['paint']): { paint?: NonNullable<AffordanceRegion['paint']> } {\n return paint === undefined ? {} : { paint };\n}\n\n/**\n * The affordance. Compose it into a layer with `composeAffordanceLayer` and\n * attach that with `CanvasExtensionApi.registerLayer` — the only attach route\n * that is hit-tested. A `Contribution.overlay` is painted and never hit.\n */\nexport function createPortAffordance<TPose>(\n participants: ParticipantSource<TPose>,\n opts: PortAffordanceOptions<TPose> = {},\n): Affordance {\n const {\n id = PORT_LAYER_ID,\n hitRadiusPx = DEFAULT_HIT_PX,\n sizePx = DEFAULT_SIZE_PX,\n strength = 'exclusive',\n } = opts;\n const portOpts = {\n ...(opts.geometry ? { geometry: opts.geometry } : {}),\n ...(opts.read ? { read: opts.read } : {}),\n };\n const paintOf = (port: Port): AffordanceRegion['paint'] => {\n if (sizePx <= 0) return undefined;\n const fill = typeof opts.fill === 'function' ? opts.fill(port) : opts.fill;\n const look = { ...(fill ? { fill } : {}), ...(opts.stroke ? { stroke: opts.stroke } : {}) };\n if (opts.shape !== 'circle') return { kind: 'square', sizePx, ...look };\n return {\n kind: 'custom',\n // An affordance layer paints in screen pixels, so the mark stays one size at any zoom.\n draw: ({ world, view }) => {\n const t = viewToTransform(view);\n const x = t.panX + world.x * t.zoom.x - sizePx / 2;\n const y = t.panY + world.y * t.zoom.y - sizePx / 2;\n return [{ kind: 'path', path: ellipsePath({ x, y, width: sizePx, height: sizePx }), ...look }];\n },\n };\n };\n\n const regionOf = (node: DiagramNodeLike, port: Port): AffordanceRegion => ({\n id: `${node.id}:${port.id}`,\n targetId: null,\n shape: { kind: 'point', x: port.point.x, y: port.point.y, hitRadiusPx },\n ...withPaint(paintOf(port)),\n ...(opts.cursor !== undefined ? { cursor: opts.cursor } : {}),\n strength,\n claimedKinds: ['pointer'],\n bind: () => ({\n initialScratch: {\n targetId: node.id,\n nodeId: node.id,\n portId: port.id,\n port,\n } satisfies PortScratch,\n }),\n });\n const shown = (participant: ParticipantPose<TPose>, state: ChromeState): boolean =>\n offersPorts(participant, state) && (opts.shows === undefined || opts.shows(participant.node, state));\n const showsPort = (port: Port): boolean => opts.showsPort === undefined || opts.showsPort(port);\n\n // Every participant's ports, gated by nothing that reads the chrome state, each with its region\n // once one is asked for. Held while the source's generation holds, so painting reads no ports.\n type PortAt = { participant: ParticipantPose<TPose>; port: Port; region?: AffordanceRegion };\n const generation = participants.generation;\n const allPorts = (): PortAt[] => {\n const at: PortAt[] = [];\n for (const participant of participants()) {\n for (const port of portsOf(participant.node, participant.pose, portOpts)) at.push({ participant, port });\n }\n return at;\n };\n const held = createSettledCache<PortAt[]>({ reads: 1 });\n const portsAt = (key: readonly unknown[]): PortAt[] => held.read(key, allPorts) ?? allPorts();\n const regionAt = (entry: PortAt): AffordanceRegion => (entry.region ??= regionOf(entry.participant.node, entry.port));\n const index = keyedIndex(generation ?? (() => undefined), () => {\n const at = portsAt(generation!());\n return { at, boxes: boxIndex(at.map(({ port: { point: p } }) => [p.x, p.y, p.x, p.y] as const)) };\n });\n\n const regions = (state: ChromeState): readonly AffordanceRegion[] => {\n const out: AffordanceRegion[] = [];\n if (generation !== undefined) {\n for (const entry of portsAt(generation())) {\n if (shown(entry.participant, state) && showsPort(entry.port)) out.push(regionAt(entry));\n }\n return out;\n }\n for (const participant of participants()) {\n if (!shown(participant, state)) continue;\n for (const port of portsOf(participant.node, participant.pose, portOpts)) {\n if (showsPort(port)) out.push(regionOf(participant.node, port));\n }\n }\n return out;\n };\n\n return {\n id,\n regions,\n regionsAt(state, wx, wy, view) {\n const built = index();\n // A port is hit within `hitRadiusPx` of its point on screen, along each axis.\n const rx = hitRadiusPx / Math.abs(view.scale.x);\n const ry = hitRadiusPx / Math.abs(view.scale.y);\n const near = built && boxesMeeting(built.boxes, wx - rx, wy - ry, wx + rx, wy + ry);\n if (!built || !near) return regions(state);\n const out: AffordanceRegion[] = [];\n for (const i of near) {\n const entry = built.at[i]!;\n if (shown(entry.participant, state) && showsPort(entry.port)) out.push(regionAt(entry));\n }\n return out;\n },\n };\n}\n","/**\n * What a connect may run from and land on: a port, or a participant's body.\n *\n * A body end is Visio's dynamic glue. It names the shape and not a port, and\n * the edge resolves to whichever port faces the other end each time it is\n * routed (`resolveEnd`), so it follows the shape around as things move.\n */\nimport { refusalOf, type DerivedDep, type DropVerdict, type OngoingOverlay } from '@weasel-js/core';\nimport {\n AUTO_POSE_DESCRIPTOR,\n rotatePoint,\n type PoseDescriptor,\n type Vec2,\n} from '@weasel-js/core/math';\nimport { pathContainsPoint } from '@weasel-js/geom';\nimport { boxCenter, endAims, resolveEnd, type Router } from './edge';\nimport { diagramEdgeOf } from './edgeTrait';\nimport { diagramGroupOf } from './group';\nimport { diagramLabelOf } from './labelTrait';\nimport { outlinePath } from './outline';\nimport { offersPorts, type ParticipantPose, type ParticipantSource } from './portAffordance';\nimport { portsOf, type PortsOptions } from './ports';\nimport { diagramNodeOf } from './trait';\nimport type { Port } from './types';\n\n/** An end on a participant's body rather than on one of its ports. `point` is\n * where the pointer was, in world coordinates. */\nexport interface BodyEnd {\n kind: 'body';\n nodeId: string;\n point: Vec2;\n}\n\n/** Either end of a connect. */\nexport type ConnectEnd = Port | BodyEnd;\n\n/** Whether a connect end lands on a node's body rather than a port. */\nexport function isBodyEnd(end: ConnectEnd): end is BodyEnd {\n return (end as { kind?: unknown }).kind === 'body';\n}\n\n/** A body under the pointer, and the participant it belongs to. */\nexport interface BodyHit<TPose> {\n end: BodyEnd;\n participant: ParticipantPose<TPose>;\n}\n\n/** The view a connect started in, which decides what layers it may reach. */\nexport type ConnectView = Parameters<typeof offersPorts>[1];\n\n/**\n * The topmost participant whose body contains `at`, or `null`.\n *\n * Its outline when it declares one, else its bounds, both taken in the pose's\n * unrotated frame. Edges, edge labels and group boxes are not bodies, and nor\n * is anything the reader does not take as a participant or that `offersPorts`\n * turns away.\n */\nexport function bodyAt<TPose>(\n participants: ParticipantSource<TPose>,\n at: Vec2,\n opts: PortsOptions<TPose> & { view?: ConnectView } = {},\n): BodyHit<TPose> | null {\n const geometry = opts.geometry ?? (AUTO_POSE_DESCRIPTOR as PoseDescriptor<TPose>);\n let hit: BodyHit<TPose> | null = null;\n // Render order, so the last match is the one drawn on top.\n for (const participant of participants()) {\n const { node } = participant;\n if (!offersPorts(participant, opts.view)) continue;\n if (diagramEdgeOf(node) !== null || diagramLabelOf(node) !== null || diagramGroupOf(node) !== null) continue;\n const trait = diagramNodeOf(node, opts.read);\n if (trait === null || trait.group !== undefined) continue;\n const bounds = geometry.getBounds(participant.pose);\n if (bounds.width <= 0 || bounds.height <= 0) continue;\n const rotation = geometry.getRotation?.(participant.pose) ?? 0;\n const local = rotation === 0\n ? at\n : rotatePoint(at.x, at.y, bounds.x + bounds.width / 2, bounds.y + bounds.height / 2, -rotation);\n const inside = trait.outline === undefined\n ? local.x >= bounds.x && local.x <= bounds.x + bounds.width\n && local.y >= bounds.y && local.y <= bounds.y + bounds.height\n : pathContainsPoint(outlinePath(trait.outline, bounds), local.x, local.y);\n if (inside) hit = { end: { kind: 'body', nodeId: node.id, point: { x: at.x, y: at.y } }, participant };\n }\n return hit;\n}\n\n/** A refused end's marks: its shape's box outlined refused, and the reason at the pointer. */\nfunction refusalMarks(box: { x: number; y: number; width: number; height: number } | null, at: Vec2, reason: string): OngoingOverlay[] {\n const out: OngoingOverlay[] = [];\n if (box !== null) {\n const { x, y, width, height } = box;\n out.push({ kind: 'polyline', points: [{ x, y }, { x: x + width, y }, { x: x + width, y: y + height }, { x, y: y + height }, { x, y }], role: 'refused' });\n }\n out.push({ kind: 'reason', at: { x: at.x, y: at.y }, text: reason });\n return out;\n}\n\n/** What {@link createTargets} needs from the connect action's options. */\nexport interface TargetOptions<TPose> extends PortsOptions<TPose> {\n participants: ParticipantSource<TPose>;\n /** Asked with the end that stays put first, and the candidate second. */\n canConnect: (fixed: ConnectEnd, candidate: ConnectEnd) => DropVerdict;\n showsPort?: (port: Port) => boolean;\n snapRadius: number;\n bodies: boolean;\n}\n\n/** What the pointer is over: an end a connect may land on, or one that\n * refuses it with `refuse`, the reason. */\nexport interface Landing {\n end: ConnectEnd;\n refuse: string | null;\n}\n\n/** One resolver for what a connect lands on, and the port each end is drawn\n * to, shared by the preview and the commit, with what it paints on the way. */\nexport function createTargets<TPose>(opts: TargetOptions<TPose>) {\n const resolver = createResolver(opts);\n const { landing, preview, boxOf } = resolver;\n\n /**\n * What a connect paints with the pointer at `at`: the run `preview` routes,\n * as a connector, or over an end that refuses it, refused, with that end's\n * shape outlined refused and the reason at the pointer.\n */\n function overlays(\n route: Router,\n fixed: ConnectEnd,\n at: Vec2,\n view: ConnectView,\n moving: 'from' | 'to' = 'to',\n waypoints: readonly Vec2[] = [],\n ): OngoingOverlay[] {\n const points = preview(route, fixed, at, view, moving, waypoints);\n const hit = landing(fixed, at, view);\n const run: OngoingOverlay[] = points.length < 2 ? [] : [{ kind: 'polyline', points, role: hit?.refuse != null ? 'refused' : 'connector' }];\n if (hit === null || hit.refuse === null) return run;\n return [...run, ...refusalMarks(boxOf(hit.end.nodeId), at, hit.refuse)];\n }\n\n return { ...resolver, overlays };\n}\n\nfunction createResolver<TPose>(opts: TargetOptions<TPose>) {\n const portOpts: PortsOptions<TPose> = {\n ...(opts.geometry ? { geometry: opts.geometry } : {}),\n ...(opts.read ? { read: opts.read } : {}),\n };\n const geometry = opts.geometry ?? (AUTO_POSE_DESCRIPTOR as PoseDescriptor<TPose>);\n\n /** The nearest port in reach that `canConnect` does not silently turn away, or `null`. */\n function portTarget(from: ConnectEnd, at: Vec2, view: ConnectView): Landing | null {\n let best: Landing | null = null;\n let bestD2 = opts.snapRadius * opts.snapRadius;\n for (const participant of opts.participants()) {\n if (!offersPorts(participant, view)) continue;\n for (const port of portsOf(participant.node, participant.pose, portOpts)) {\n if (opts.showsPort !== undefined && !opts.showsPort(port)) continue;\n const d2 = (port.point.x - at.x) ** 2 + (port.point.y - at.y) ** 2;\n if (d2 > bestD2) continue;\n const verdict = opts.canConnect(from, port);\n if (verdict === false) continue;\n bestD2 = d2;\n best = { end: port, refuse: refusalOf(verdict) };\n }\n }\n return best;\n }\n\n /** What the pointer at `at` is over: a port in reach beats the body under\n * it. A body with no ports is nothing, since an edge glued to it has\n * nothing to route to. */\n function landing(from: ConnectEnd, at: Vec2, view: ConnectView): Landing | null {\n const port = portTarget(from, at, view);\n if (port !== null || !opts.bodies) return port;\n const body = bodyAt(opts.participants, at, { ...portOpts, view });\n if (body === null || portsOf(body.participant.node, body.participant.pose, portOpts).length === 0) return null;\n const verdict = opts.canConnect(from, body.end);\n return verdict === false ? null : { end: body.end, refuse: refusalOf(verdict) };\n }\n\n /** What a release at `at` lands on, or `null` where nothing may land. */\n function target(from: ConnectEnd, at: Vec2, view: ConnectView): ConnectEnd | null {\n const hit = landing(from, at, view);\n return hit === null || hit.refuse !== null ? null : hit.end;\n }\n\n function participantOf(nodeId: string): ParticipantPose<TPose> | undefined {\n for (const participant of opts.participants()) {\n if (participant.node.id === nodeId) return participant;\n }\n return undefined;\n }\n\n /** The center an end is aimed by, as the edge router takes it: its node's,\n * else its own point. */\n function centerOf(end: ConnectEnd): Vec2 {\n const participant = participantOf(end.nodeId);\n return participant === undefined ? end.point : boxCenter(geometry, participant.pose);\n }\n\n /** The port an end is drawn to: itself, or for a body, the port facing\n * `toward` — the one the committed edge will resolve to. */\n function portFor(end: ConnectEnd, toward: Vec2): Port | null {\n if (!isBodyEnd(end)) return end;\n const participant = participantOf(end.nodeId);\n if (participant === undefined) return null;\n const dep = { node: participant.node, pose: participant.pose } as unknown as DerivedDep<TPose>;\n const all = (d: DerivedDep<TPose>): Port[] => portsOf(d.node as never, d.pose, portOpts);\n return resolveEnd({}, dep, toward, portOpts, all) ?? null;\n }\n\n /**\n * The run an edge would take with `fixed` at one end and the other released\n * at `at`: snapped to the target there, else to the bare point, which as a\n * port with no facing a router aims straight at. `moving` says which end of\n * the edge the pointer carries, so the run is routed in the edge's direction,\n * through `waypoints` in that direction, each end aimed as `endAims` aims a\n * committed edge's.\n */\n function preview(\n route: Router,\n fixed: ConnectEnd,\n at: Vec2,\n view: ConnectView,\n moving: 'from' | 'to' = 'to',\n waypoints: readonly Vec2[] = [],\n ): readonly Vec2[] {\n const landed = landing(fixed, at, view)?.end ?? null;\n const [fixedCenter, landedCenter] = [centerOf(fixed), landed === null ? at : centerOf(landed)];\n const aims = moving === 'to'\n ? endAims(fixedCenter, landedCenter, waypoints)\n : endAims(landedCenter, fixedCenter, waypoints);\n const [fixedAim, landedAim] = moving === 'to' ? [aims.from, aims.to] : [aims.to, aims.from];\n const free = landed === null\n ? { id: '', nodeId: '', point: at, normal: null }\n : portFor(landed, landedAim);\n const anchored = portFor(fixed, fixedAim);\n if (free === null || anchored === null) return [];\n return moving === 'to'\n ? route({ from: anchored, to: free, waypoints })\n : route({ from: free, to: anchored, waypoints });\n }\n\n /** The world box of `nodeId`'s participant, or `null`. */\n function boxOf(nodeId: string): { x: number; y: number; width: number; height: number } | null {\n const participant = participantOf(nodeId);\n return participant === undefined ? null : geometry.getBounds(participant.pose);\n }\n\n return { target, landing, portFor, preview, boxOf };\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 *\n * With `bodies`, a release over a participant's body away from any port lands\n * on the body (`connectTargets`); with `startFrom: 'body'`, so can the press.\n */\nimport {\n type Action,\n type DropVerdict,\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 { bodyAt, createTargets, isBodyEnd, type ConnectEnd } from './connectTargets';\nimport { EDGE_DERIVE_PATH, ROUTERS, type Router } from './edge';\nimport type { DiagramEdge, EdgeEnd } from './edgeTrait';\nimport { PORT_AFFORDANCE_KIND, portScratchOf, type ParticipantSource } from './portAffordance';\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/** The edge end a reconnect is carrying: the scene id of the edge, and which end. */\nexport interface MovingEnd {\n edge: string;\n end: 'from' | 'to';\n}\n\n/** Whether an edge may run from `from` to `to`: `true`, `false` for a silent\n * no, where the end never snaps, or a refusal, which the end snaps to and is\n * drawn refused with the reason beside the pointer, and where a release\n * lands nothing. `moving` is the end being dragged when the edge already\n * exists, and absent for a new connect. */\nexport type CanConnect = (from: ConnectEnd, to: ConnectEnd, moving?: MovingEnd) => DropVerdict;\n\n/** The edge a finished connect describes. Each end is a resolved port, or a\n * body whose port the edge picks each time it is routed. */\nexport interface PendingEdge {\n from: ConnectEnd;\n to: ConnectEnd;\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. A body is\n * untyped, and never joins its own node.\n */\nexport const defaultCanConnect: CanConnect = (from, to) => {\n if (isBodyEnd(from) || isBodyEnd(to)) return from.nodeId !== to.nodeId;\n if (from.nodeId === to.nodeId && from.id === to.id) return false;\n if (from.type === undefined || to.type === undefined) return true;\n return from.type === to.type;\n};\n\n/** Options for {@link createConnectAction}. Only `participants` is required. */\nexport interface ConnectActionOptions<TPose> {\n /** Where the droppable ports come from. The same source the port affordance\n * reads, so what is grabbable and what is landable cannot disagree. */\n participants: ParticipantSource<TPose>;\n /** Default {@link CONNECT_ACTION_ID}. */\n id?: string;\n read?: DiagramNodeReader;\n geometry?: PoseDescriptor<TPose>;\n /** Default {@link defaultCanConnect}. */\n canConnect?: CanConnect;\n /** Which ports a connect may land on: a port this turns away is never a\n * target. The port affordance's option of the same name, so a port that is\n * not shown cannot be dropped onto. Default: all of them. */\n showsPort?: (port: Port) => boolean;\n /** How near the pointer must come to a port, in world units, before the\n * edge snaps to it. Default 16. */\n snapRadius?: number;\n /** Registry key the new edge names, and the router the preview draws with.\n * Default `'straight'`. */\n router?: string;\n routers?: Readonly<Record<string, Router>>;\n /** A release over a participant's body, with no port in reach, lands on the\n * body. Default false. */\n bodies?: boolean;\n /** `'body'`: a press that is not on a port starts from the participant\n * under it. Default `'port'`, where such a press falls through. */\n startFrom?: 'port' | 'body';\n /**\n * Mints and commits the edge. Called once, on release over a valid target.\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 /** What the default commit draws the edge with. Default {@link DEFAULT_EDGE_STROKE}.\n * Ignored when `commit` is given. */\n edgeStroke?: Stroke;\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: ConnectEnd;\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 opts: { id: `${actionId}.drag` },\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. `kind`\n * names another affordance that claims the press protocol the same way. */\nexport function grabPortBindings(\n actionId: string = GRAB_PORT_ACTION_ID,\n kind: string = PORT_AFFORDANCE_KIND,\n): GestureBinding[] {\n return [\n { spec: { kind: 'pointerDown', target: `affordance:${kind}` }, actionId, opts: { id: `${actionId}.pointerDown` } },\n { spec: { kind: 'click', target: `affordance:${kind}` }, actionId, opts: { id: `${actionId}.click` } },\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(\n edge: PendingEdge, ctx: InvocationCtx, opts: { stroke?: Stroke } = {},\n): void {\n const scene = ctx.deps.scene;\n if (scene === undefined) return;\n const trait: DiagramEdge = {\n from: edgeEndOf(edge.from),\n to: edgeEndOf(edge.to),\n router: edge.router,\n };\n const source = scene.get(edge.from.nodeId as never);\n scene.add({\n kind: 'mark',\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: opts.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/** A body end names no port, so the edge resolves the facing one. */\nexport function edgeEndOf(end: ConnectEnd): EdgeEnd {\n return isBodyEnd(end) ? {} : { port: end.id };\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 } = opts;\n const stroke = opts.edgeStroke;\n const commit = opts.commit\n ?? ((edge: PendingEdge, ctx: InvocationCtx) => commitEdgeToScene(edge, ctx, stroke ? { stroke } : {}));\n const routers = opts.routers ?? ROUTERS;\n const route: Router = routers[routerKey] ?? routers['straight'] ?? ROUTERS['straight']!;\n const targets = createTargets({ ...opts, canConnect, snapRadius, bodies: opts.bodies ?? false });\n\n /** What the press starts from: the pressed port, else — with\n * `startFrom: 'body'` — the body under the pointer. */\n function startEnd(ctx: InvocationCtx): ConnectEnd | null {\n const pressed = portScratchOf(ctx.drag?.affordance);\n if (pressed !== null) return pressed.port;\n if (opts.startFrom !== 'body') return null;\n return bodyAt(opts.participants, ctx.world, { ...opts, view: ctx.deps.view })?.end ?? null;\n }\n\n return {\n id,\n label: 'Connect',\n group: 'diagram',\n requires: ['scene', 'view'],\n invoker: {\n timing: 'ongoing',\n start(ctx: InvocationCtx): OngoingHandle {\n const from = startEnd(ctx);\n // Nothing to start from. The binding spec is the gate; this is the\n // backstop, and an empty handle is how the dispatcher is told to fall\n // through.\n if (from === null) return {};\n const scratch: ConnectScratch = {\n from,\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(): readonly OngoingOverlay[] | null {\n if (!scratch.open) return null;\n // How a connector reads belongs to whatever surface paints the role.\n return targets.overlays(route, scratch.from, scratch.current, scratch.deps.view);\n },\n onEnd(endCtx: InvocationCtx, reason: 'commit' | 'cancel'): void {\n scratch.open = false;\n if (reason === 'cancel') return;\n const to = targets.target(scratch.from, { x: endCtx.world.x, y: endCtx.world.y }, scratch.deps.view);\n if (to === null) return;\n // World and modifiers from the release; deps from the press.\n commit(\n { from: scratch.from, to, router: routerKey },\n { ...endCtx, deps: scratch.deps },\n );\n },\n };\n },\n },\n enabled: () => true as const,\n };\n}\n","import { rectContainsPointHalfOpen } from '@weasel-js/geom';\nimport { diagramEdgeOf } from '../edgeTrait';\nimport { diagramLabelOf } from '../labelTrait';\nimport { dataKeyReader } from '../trait';\nimport type { DropVerdict } from '@weasel-js/core';\nimport { bodyBox, diagramContainerOf, type ContainerRole } from './trait';\n\ntype SceneLike = { get(id: never): { id: string; kind: 'mark' | 'group'; data: unknown; parent?: string | null } | undefined };\n\n/** Whether the nodes `ids` may move into the container or lane `container`. */\nexport type CanReparent = (ids: readonly string[], container: string) => DropVerdict;\n\n/**\n * The `canDropInto` dep for a diagram scene. A container or a lane takes\n * shapes and other containers, a pool takes only lanes, and a lane goes\n * nowhere but a pool. A stencil body, an edge, or a label takes nothing, and\n * edges and labels are never dropped in: they stay where they are, drawn from\n * what they are attached to. Any other container — a plain group — takes\n * anything but a lane. `canReparent` is asked about a move the rules allow\n * into a container the nodes are not already in, and has the last word.\n */\nexport function diagramCanDropInto(\n scene: SceneLike,\n canReparent?: CanReparent,\n): (parent: string, ids: readonly string[]) => DropVerdict {\n const nodeOf = (id: string) => scene.get(id as never);\n const roleOf = (id: string) => {\n const node = nodeOf(id);\n return node === undefined ? null : diagramContainerOf(node)?.role ?? null;\n };\n const attached = (id: string) => {\n const node = nodeOf(id);\n return node !== undefined && (diagramEdgeOf(node) !== null || diagramLabelOf(node) !== null);\n };\n const allowed = (parent: string, ids: readonly string[]): boolean => {\n const node = nodeOf(parent);\n if (node === undefined || ids.some(attached)) return false;\n const role = roleOf(parent);\n if (role === 'pool') return ids.every((id) => roleOf(id) === 'lane');\n if (ids.some((id) => roleOf(id) === 'lane')) return false;\n if (role !== null) return ids.every((id) => roleOf(id) !== 'pool');\n return !attached(parent) && dataKeyReader(node) === null;\n };\n return (parent, ids) => {\n if (!allowed(parent, ids)) return false;\n if (canReparent === undefined || ids.every((id) => nodeOf(id)?.parent === parent)) return true;\n return canReparent(ids, parent);\n };\n}\n\n/** What {@link diagramDropParentAt} walks. */\nexport interface DropParentScene {\n readonly roots: readonly string[];\n childrenOf(id: never): readonly string[];\n get(id: never): { id: string; kind: 'mark' | 'group'; data: unknown; pose: unknown } | undefined;\n /** How a child's stored pose joins its parent's. Absent, poses are world poses. */\n readonly composition?: { compose(parent: never, child: never): unknown };\n}\n\ntype Rect = { x: number; y: number; width: number; height: number };\n\n/**\n * The innermost container or lane whose body holds `point`, that would admit\n * a new node of `role` (`null` for a shape): where an insert at `point` goes.\n * Null for the top level — always so for a pool.\n */\nexport function diagramDropParentAt(\n scene: DropParentScene,\n point: { x: number; y: number },\n role: ContainerRole | null,\n): string | null {\n if (role === 'pool' || role === 'lane') return null;\n let best: string | null = null;\n const compose = scene.composition?.compose;\n const walk = (ids: readonly string[], frame: Rect | null): void => {\n for (const id of ids) {\n const node = scene.get(id as never);\n if (node === undefined) continue;\n const pose = node.pose as Rect;\n const world = frame === null || compose === undefined ? pose : compose(frame as never, pose as never) as Rect;\n const trait = diagramContainerOf(node);\n const b = bodyBox(world, trait?.header);\n if (!rectContainsPointHalfOpen(b, point.x, point.y)) continue;\n if (trait?.role === 'container' || trait?.role === 'lane') best = id;\n walk(scene.childrenOf(id as never), world);\n }\n };\n walk(scene.roots, null);\n return best;\n}\n","/**\n * The `'slide'` look of a reorder: the carried item under the pointer and the\n * others in the places they would take, published as pose overrides so\n * everything that derives its pose from them follows.\n */\nimport { effectivePose, type NodeId, type Scene } from '@weasel-js/core';\nimport type { ReorderItem, ReorderSlots } from './reorder';\n\nexport type Box = { x: number; y: number; width: number; height: number };\n\n/** Where an item stands along the axis: its start and its length. */\ninterface Span {\n start: number;\n size: number;\n}\n\n/**\n * Where each item starts along the axis once they stand in `order`: packed\n * from where the first stood, each gap kept at its place in the row.\n */\nfunction packed(items: readonly string[], spans: ReadonlyMap<string, Span>, order: readonly string[]): Map<string, number> {\n const gaps = items.slice(1).map((m, i) => spans.get(m)!.start - (spans.get(items[i]!)!.start + spans.get(items[i]!)!.size));\n const out = new Map<string, number>();\n let at = items.length > 0 ? spans.get(items[0]!)!.start : 0;\n order.forEach((m, i) => {\n out.set(m, at);\n at += spans.get(m)!.size + (gaps[i] ?? gaps[gaps.length - 1] ?? 0);\n });\n return out;\n}\n\n/** The scene nodes that move with `item`. */\nexport const carriedBy = (item: ReorderItem): readonly string[] => item.carries ?? [item.id];\n\nconst RELEASE_MS = 500;\n\n/** Slides `slots`' items around `carried` until dropped, or kept past a commit. */\nexport function slideOthers(scene: Scene<unknown, string, unknown>, slots: ReorderSlots, carried: string) {\n const { axis } = slots;\n const size = axis === 'x' ? 'width' : 'height';\n const ids = slots.items.map((i) => i.id);\n const spans = new Map(slots.items.map((i) => [i.id, { start: i.bounds[axis], size: i.bounds[size] }]));\n // Nodes that derive their pose follow the ones that hold theirs.\n const nodes = slots.items.map((item) => ({\n id: item.id,\n poses: carriedBy(item).flatMap((id) => {\n const node = scene.get(id as NodeId);\n return node === undefined || node.derivePose !== undefined ? [] : [{ id: id as NodeId, pose: effectivePose(scene, node) as Box }];\n }),\n }));\n const hold = scene.overrides.hold();\n return {\n /** The items standing in `order`, or as they were for `null`, with the carried one `by` along. */\n show(order: readonly string[] | null, by: number): void {\n const starts = packed(ids, spans, order ?? ids);\n hold.set(nodes.flatMap(({ id, poses }) => {\n const d = id === carried ? by : starts.get(id)! - spans.get(id)!.start;\n return poses.map(({ id: node, pose }) => [node, { ...pose, [axis]: pose[axis] + d }] as const);\n }));\n },\n drop: () => hold.drop(),\n /** Held until the host's new specs land, so the items do not jump back for\n * the frames in between; a host that keeps the old order gets it back shortly after. */\n keep(): void {\n const release = () => {\n stop();\n clearTimeout(timer);\n hold.drop();\n };\n const stop = scene.subscribe(release);\n const timer = setTimeout(release, RELEASE_MS);\n },\n };\n}\n","/**\n * Reorder: dragging one item of a drawn sequence — boxes in a row, rows in a\n * column, the members of a group — to another place in it. The item follows\n * the pointer along the sequence's axis and lands in the gap nearest its\n * middle. A `'bar'` drag marks that gap with an insertion bar; a `'slide'`\n * drag slides the other items into the places they would take. Either way\n * the release hands the move to a commit, and nothing is written to the scene.\n */\nimport {\n ActionDisabledReason,\n bodyPredicate,\n type Action,\n type ActionDeps,\n type Contribution,\n type GestureBinding,\n type InvocationCtx,\n type OngoingHandle,\n type OngoingOverlay,\n type TargetPredicate,\n type Vec2,\n} from '@weasel-js/core';\nimport { rectContainsPoint } from '@weasel-js/geom';\nimport { isNoopDrop, moveItems, nearestGap } from '@weasel-js/ui-logic';\nimport { carriedBy, slideOthers, type Box } from './reorderSlide';\n\n/** The action that drags an item of a sequence to another place in it. */\nexport const REORDER_ACTION_ID = 'diagram.reorder';\n\n/** One item of a sequence, in world units. */\nexport interface ReorderItem {\n /** The scene node drawn for it. */\n id: string;\n bounds: Box;\n /** Where a press picks it up. Default `bounds`; `null` never picks it up, though it keeps its gaps. */\n grip?: Box | null;\n /** The scene nodes that move with it, in either `show` mode. Default `[id]`. */\n carries?: readonly string[];\n}\n\n/** A place an item can land: before `items[index]`, or after the last at `items.length`. */\nexport interface ReorderGap {\n index: number;\n /** The insertion bar's two ends. */\n a: Vec2;\n b: Vec2;\n}\n\n/** A drawn sequence: its items in order along `axis`, and the gaps between them. */\nexport interface ReorderSlots {\n axis: 'x' | 'y';\n items: readonly ReorderItem[];\n gaps: readonly ReorderGap[];\n}\n\n/** The item at index `from` dropped in gap `to`, and every item's id in the order that leaves. */\nexport interface ReorderMove {\n id: string;\n from: number;\n to: number;\n order: readonly string[];\n}\n\n/** Options for {@link createReorderAction}. */\nexport interface ReorderOptions {\n /** Default {@link REORDER_ACTION_ID}. */\n id?: string;\n /** Default 'Reorder'. */\n label?: string;\n /** The sequence a press at `at` picks from, as drawn now, or `null` when there is none. */\n slots: (deps: ActionDeps, at: Vec2) => ReorderSlots | null;\n /** Deps `slots` reads beyond `scene`. */\n requires?: Action['requires'];\n /**\n * `'bar'` (default) carries the item and draws an insertion bar at its\n * gap. `'slide'` carries everything each item `carries` as pose overrides,\n * so what derives from them follows, and slides the others into place; the\n * overrides stay after a commit until the scene next changes.\n */\n show?: 'bar' | 'slide';\n /** Where a drag of `item` stays a reorder, in world units. A move outside it hands the drag off (`'pass'` from\n * `OngoingHandle.onMove`) to whatever else would have taken the press, a move for one, and drops this\n * drag's preview. `null`, or the default, keeps every move a reorder. */\n region?: (deps: ActionDeps, item: ReorderItem) => Box | null;\n /** Whether a drop may land. The bar draws refused, or nothing slides, where not. Default: every drop. */\n canDrop?: (move: ReorderMove) => boolean;\n /** Called once, on release over a gap that is not the item's own and that `canDrop` allows. */\n commit: (move: ReorderMove, ctx: InvocationCtx) => void;\n}\n\nconst END_GAP = 24;\n\n/**\n * The slots of items laid out in order along `axis`: a gap halfway between\n * each pair, its bar spanning both across the axis, and one beyond each end,\n * as far out as the nearest interior gap's half, or `END_GAP / 2` with none.\n */\nexport function sequenceSlots(axis: 'x' | 'y', items: readonly ReorderItem[]): ReorderSlots {\n const [along, across, size, depth] = axis === 'x' ? ['x', 'y', 'width', 'height'] as const : ['y', 'x', 'height', 'width'] as const;\n const lo = (b: Box) => b[along];\n const hi = (b: Box) => b[along] + b[size];\n const bar = (at: number, boxes: readonly Box[]): Pick<ReorderGap, 'a' | 'b'> => {\n const from = Math.min(...boxes.map((b) => b[across]));\n const to = Math.max(...boxes.map((b) => b[across] + b[depth]));\n const point = (c: number) => (axis === 'x' ? { x: at, y: c } : { x: c, y: at });\n return { a: point(from), b: point(to) };\n };\n const boxes = items.map((i) => i.bounds);\n const halves = boxes.slice(1).map((b, k) => (lo(b) - hi(boxes[k]!)) / 2);\n const gaps: ReorderGap[] = [];\n if (boxes.length === 0) return { axis, items, gaps };\n gaps.push({ index: 0, ...bar(lo(boxes[0]!) - (halves[0] ?? END_GAP / 2), [boxes[0]!]) });\n for (let k = 1; k < boxes.length; k++) gaps.push({ index: k, ...bar(hi(boxes[k - 1]!) + halves[k - 1]!, [boxes[k - 1]!, boxes[k]!]) });\n const last = boxes[boxes.length - 1]!;\n gaps.push({ index: boxes.length, ...bar(hi(last) + (halves[halves.length - 1] ?? END_GAP / 2), [last]) });\n return { axis, items, gaps };\n}\n\n/** What a drag holds once it has picked an item. */\ninterface Held {\n slots: ReorderSlots;\n from: number;\n item: ReorderItem;\n}\n\nfunction pickAt(slots: ReorderSlots | null, at: Vec2): { from: number; item: ReorderItem } | null {\n const from = slots?.items.findIndex((i) => i.grip !== null && rectContainsPoint(i.grip ?? i.bounds, at.x, at.y)) ?? -1;\n return from < 0 ? null : { from, item: slots!.items[from]! };\n}\n\n/** The gap nearest the carried item's middle, moved `by` along the axis, or\n * `null` for one beside the item, where a drop changes nothing. */\nfunction gapAt(held: Held, by: number): ReorderGap | null {\n const { axis, gaps } = held.slots;\n const size = axis === 'x' ? 'width' : 'height';\n const mid = held.item.bounds[axis] + held.item.bounds[size] / 2 + by;\n const best = gaps[nearestGap(gaps.map((g) => g.a[axis]), mid)];\n return best === undefined || isNoopDrop([held.from], best.index) ? null : best;\n}\n\nfunction moveOf(held: Held, gap: ReorderGap): ReorderMove {\n const order = moveItems(held.slots.items.map((i) => i.id), [held.from], gap.index);\n return { id: held.item.id, from: held.from, to: gap.index, order };\n}\n\n/** The `diagram.reorder` action: an ongoing drag carrying one item of a sequence. */\nexport function createReorderAction(opts: ReorderOptions): Action {\n const { canDrop = () => true, show = 'bar' } = opts;\n return {\n id: opts.id ?? REORDER_ACTION_ID,\n label: opts.label ?? 'Reorder',\n group: 'diagram',\n requires: ['scene', ...(opts.requires ?? [])],\n cursor: 'grab',\n activeCursor: 'grabbing',\n enabled: (deps, at) => (deps === undefined || at === undefined || pickAt(opts.slots(deps, at), at) !== null\n ? true\n : ActionDisabledReason.NotApplicable),\n invoker: {\n timing: 'ongoing',\n start(ctx: InvocationCtx): OngoingHandle {\n const start = { x: (ctx.drag?.start ?? ctx.world).x, y: (ctx.drag?.start ?? ctx.world).y };\n const slots = opts.slots(ctx.deps, start);\n const picked = pickAt(slots, start);\n if (slots === null || picked === null) return {};\n const held: Held = { slots, ...picked };\n const { axis } = slots;\n const region = opts.region?.(ctx.deps, held.item) ?? null;\n const leaves = (at: Vec2) => region !== null && !rectContainsPoint(region, at.x, at.y);\n let by = ctx.world[axis] - start[axis];\n let open = true;\n // The overlay is read every frame; ask about each gap once a drag.\n const verdicts = new Map<number, ReorderMove | null>();\n const landing = (gap: ReorderGap | null): ReorderMove | null => {\n if (gap === null) return null;\n if (!verdicts.has(gap.index)) {\n const move = moveOf(held, gap);\n verdicts.set(gap.index, canDrop(move) ? move : null);\n }\n return verdicts.get(gap.index)!;\n };\n const finish = (endCtx: InvocationCtx, reason: 'commit' | 'cancel'): ReorderMove | null => {\n open = false;\n by = endCtx.world[axis] - start[axis];\n const move = reason === 'commit' ? landing(gapAt(held, by)) : null;\n if (move !== null) opts.commit(move, { ...endCtx, deps: ctx.deps });\n return move;\n };\n\n if (show === 'slide') {\n const slide = ctx.deps.scene === undefined ? null : slideOthers(ctx.deps.scene, held.slots, held.item.id);\n return {\n kind: 'diagram-reorder',\n onMove(moveCtx: InvocationCtx): void | 'pass' {\n if (leaves(moveCtx.world)) return 'pass';\n by = moveCtx.world[axis] - start[axis];\n slide?.show(landing(gapAt(held, by))?.order ?? null, by);\n },\n onEnd(endCtx, reason): void {\n const move = finish(endCtx, reason);\n if (move === null) slide?.drop();\n else slide?.keep();\n },\n };\n }\n\n const carried = carriedBy(held.item);\n const poses = new Map<string, Box>();\n for (const id of carried) {\n const pose = ctx.deps.scene?.get(id as never)?.pose as Box | undefined;\n if (pose !== undefined) poses.set(id, pose);\n }\n return {\n kind: 'diagram-reorder',\n onMove(moveCtx: InvocationCtx): void | 'pass' {\n if (leaves(moveCtx.world)) return 'pass';\n by = moveCtx.world[axis] - start[axis];\n },\n previewIds: () => (open && poses.size > 0 ? [...poses.keys()] : null),\n previewPose: (id) => {\n const pose = poses.get(id);\n return pose === undefined ? null : { ...pose, [axis]: pose[axis] + by };\n },\n previewOpaqueIds: () => [...carried],\n overlay(): OngoingOverlay | null {\n const gap = open ? gapAt(held, by) : null;\n if (gap === null) return null;\n return { kind: 'polyline', points: [gap.a, gap.b], role: landing(gap) !== null ? 'insert' : 'refused' };\n },\n onEnd(endCtx, reason): void {\n finish(endCtx, reason);\n },\n };\n },\n },\n };\n}\n\n// Matches every press, as a bare drag does, but ranks a step above one, so it\n// is asked before an ambient pan; the action declines off an item's grip.\nexport const ANYWHERE = bodyPredicate(() => true);\n\n/** The binding that starts a reorder: a drag pressed on `on`, by default anywhere; the action declines off an item's grip. */\nexport function reorderBinding(actionId: string = REORDER_ACTION_ID, on: TargetPredicate = ANYWHERE): GestureBinding {\n return { spec: { kind: 'drag', target: { kindOf: on } }, actionId, opts: { id: on === ANYWHERE ? `${actionId}.drag` : `${actionId}.bodyDrag` } };\n}\n\n/** The reorder action and its binding, to pass as `ambient`. */\nexport function reorderContribution(opts: ReorderOptions & { on?: TargetPredicate }): Contribution {\n const actionId = opts.id ?? REORDER_ACTION_ID;\n return {\n id: `weasel-diagram-reorder:${actionId}`,\n eligibility: { always: true },\n actions: [createReorderAction({ ...opts, id: actionId })],\n bindings: [reorderBinding(actionId, opts.on)],\n };\n}\n","/**\n * DOM pinned to a diagram's nodes and edges: a settings card beside the picked\n * node, a button on an edge's midpoint. Each overlay is placed after every\n * paint, so it follows a pan, a zoom, a resize and a layout run's every frame.\n */\nimport {\n composeWorldPose,\n drawnAABBOf,\n drawnBoundsScene,\n effectivePose,\n pointAlongPath,\n scenePoseAdapter,\n type Bounds,\n type NodeId,\n type RectPose,\n type Scene,\n type SceneCanvasApi,\n viewRectToScreen,\n} from '@weasel-js/core';\nimport { useLatest } from '@weasel-js/react';\nimport { clampRectWithin, placeRect, type Placement } from '@weasel-js/geom';\nimport { useCallback, useLayoutEffect, useRef, type ReactNode, type RefObject } from 'react';\nimport { diagramEdgeOf } from './edgeTrait';\nimport type { DiagramSceneData } from './fromData';\n\n/** One piece of DOM held against a node, a group or an edge. */\nexport interface DiagramOverlay {\n /** The node, group or edge it is held against. While no such id is in the\n * diagram it is not shown. */\n target: string;\n /** Beside the target's box, flipped to the far side when the near one has\n * no room, and kept inside the view, over the target when neither side has\n * room; or `'center'`, centered on it. Default `'center'`. */\n placement?: Placement | 'center';\n /** Gap between the target's box and the overlay, in CSS pixels. Default 0. */\n offset?: number;\n /** Tells two overlays on one target apart. Default `target`. */\n key?: string;\n content: ReactNode;\n}\n\ntype DiagramScene = Scene<DiagramSceneData, 'main', RectPose>;\n\n/** Where `id` is drawn, in world units: a node's or group's box, or for an\n * edge an empty rect at the midpoint along its route. `null` when the scene\n * has no such node. */\nexport function worldRectOf(scene: DiagramScene, id: string): Bounds | null {\n const node = scene.get(id as NodeId);\n if (node === undefined) return null;\n const drawn = drawnBoundsScene(scene);\n const route = diagramEdgeOf(node) === null ? null : drawn.derivedPathOf?.(id as NodeId) ?? null;\n const mid = route === null ? null : pointAlongPath(route, 0.5);\n if (mid != null) return { x: mid.point.x, y: mid.point.y, width: 0, height: 0 };\n const live = { ...scenePoseAdapter(scene as never), getPose: (at: string) => effectivePose(scene, scene.get(at as NodeId)!) };\n return drawnAABBOf(drawn, id as NodeId, composeWorldPose(live, id, scene.composition.compose as never), { includeStroke: false });\n}\n\nconst CENTER = 'center';\n\n/** Place `el` against `anchor` inside `view`. */\nfunction place(el: HTMLElement, overlay: DiagramOverlay, anchor: Bounds, view: Bounds): void {\n const size = { width: el.offsetWidth, height: el.offsetHeight };\n const placement = overlay.placement ?? CENTER;\n const at = placement === CENTER\n ? { x: anchor.x + (anchor.width - size.width) / 2, y: anchor.y + (anchor.height - size.height) / 2 }\n // With no room on either side, placeRect leaves it overflowing; the view keeps it inside, over its target if it must.\n : clampRectWithin(placeRect({ anchor, overlay: size, boundary: view, placement, offset: overlay.offset ?? 0 }).rect, view);\n el.style.transform = `translate(${Math.round(at.x)}px, ${Math.round(at.y)}px)`;\n}\n\n/**\n * The overlays' elements, placed after every paint and whenever one of them\n * changes size. The returned ref function takes each overlay's element by key.\n */\nexport function useOverlayPlacement(\n canvasRef: RefObject<SceneCanvasApi | null>,\n scene: DiagramScene,\n overlays: readonly DiagramOverlay[],\n): (key: string) => (el: HTMLElement | null) => void {\n const elements = useRef(new Map<string, HTMLElement>());\n const current = useLatest(overlays);\n\n const placeAll = useCallback(() => {\n const canvas = canvasRef.current;\n const surface = canvas?.element;\n if (canvas == null || surface == null) return;\n const view = canvas.getView();\n for (const overlay of current.current) {\n const el = elements.current.get(overlay.key ?? overlay.target);\n if (el === undefined) continue;\n const world = worldRectOf(scene, overlay.target);\n el.hidden = world === null;\n if (world === null) continue;\n const rect = viewRectToScreen(view, world);\n const anchor = { ...rect, x: rect.x + surface.offsetLeft, y: rect.y + surface.offsetTop };\n place(el, overlay, anchor, {\n x: surface.offsetLeft, y: surface.offsetTop, width: surface.offsetWidth, height: surface.offsetHeight,\n });\n }\n }, [canvasRef, scene, current]);\n\n useLayoutEffect(() => {\n placeAll();\n const canvas = canvasRef.current;\n if (canvas == null) return;\n const stop = canvas.subscribeFrame(placeAll);\n const observer = typeof ResizeObserver === 'undefined' ? null : new ResizeObserver(placeAll);\n for (const el of elements.current.values()) observer?.observe(el);\n return () => {\n stop();\n observer?.disconnect();\n };\n }, [canvasRef, placeAll, overlays]);\n\n const refs = useRef(new Map<string, (el: HTMLElement | null) => void>());\n return useCallback((key: string) => {\n let ref = refs.current.get(key);\n if (ref === undefined) {\n ref = (el) => {\n if (el !== null) {\n elements.current.set(key, el);\n return;\n }\n elements.current.delete(key);\n refs.current.delete(key);\n };\n refs.current.set(key, ref);\n }\n return ref;\n }, []);\n}\n","/**\n * Which members a reorderable group or container holds, and what moves with\n * each. Plain reads of the scene; `groupReorder.ts` builds a reorder's slots\n * from them.\n */\nimport type { Bounds } from '@weasel-js/core';\nimport { diagramContainerOf, titleIdOf } from './containers/trait';\nimport { diagramEdgeOf } from './edgeTrait';\nimport { diagramAnchorOf, diagramGroupOf } from './group';\nimport { diagramLabelOf } from './labelTrait';\n\n/** The scene reads a reorder makes. */\nexport interface ReorderScene {\n get(id: string): { id: string; data: unknown; dependsOn?: unknown; parent?: string | null } | undefined;\n renderOrderNodes(): Iterable<{ id: string; data: unknown; dependsOn?: unknown }>;\n /** A container's children, which a reorder carries with it. Absent, every node is a leaf. */\n childrenOf?(id: string): readonly string[];\n}\n\n/** A group or container whose members are carried along one axis, and the member a press picked up. */\nexport interface ReorderTarget {\n /** The group's or the container's id. */\n parent: string;\n axis: 'x' | 'y';\n member: string;\n /** The group's members, in the order they stand along the axis. */\n members: readonly string[];\n}\n\nconst depsOf = (node: { dependsOn?: unknown } | undefined): string[] =>\n Array.isArray(node?.dependsOn) ? (node.dependsOn as string[]) : [];\n\n/** The group box directly holding each node or group. A wire label a box takes in is not one of its members. */\nfunction holders(scene: ReorderScene): Map<string, string> {\n const out = new Map<string, string>();\n for (const node of scene.renderOrderNodes()) {\n if (diagramGroupOf(node) === null) continue;\n for (const dep of depsOf(node)) {\n const member = scene.get(dep);\n if (member !== undefined && diagramLabelOf(member) === null) out.set(dep, node.id);\n }\n }\n return out;\n}\n\n/** The members of `holder`, the way {@link holderOf} counts them: a group's, or a container's children but its title. */\nexport function membersOf(scene: ReorderScene, holder: string): string[] {\n const node = scene.get(holder);\n const ids = node !== undefined && diagramGroupOf(node) !== null\n ? depsOf(node)\n : (scene.childrenOf?.(holder) ?? []).filter((id) => id !== titleIdOf(holder));\n return ids.filter((id) => {\n const member = scene.get(id);\n return member !== undefined && diagramLabelOf(member) === null && diagramEdgeOf(member) === null;\n });\n}\n\n/** The group box directly holding `id`, else the container it is a child of. */\nfunction holderOf(scene: ReorderScene, held: ReadonlyMap<string, string>, id: string): string | undefined {\n const group = held.get(id);\n if (group !== undefined) return group;\n const parent = scene.get(id)?.parent;\n const node = parent == null ? undefined : scene.get(parent);\n return node !== undefined && diagramContainerOf(node)?.role === 'container' ? node.id : undefined;\n}\n\nconst axisOf = (node: { data: unknown }): 'x' | 'y' | undefined =>\n diagramGroupOf(node)?.reorder ?? diagramContainerOf(node)?.reorder;\n\n/**\n * The reorderable group or container a press on `id` carries a member of: the\n * nearest one above `id` with `reorder` set, and its member on the way up —\n * `id` itself, or the group or container holding it. `null` when none above\n * it reorders.\n */\nexport function reorderTargetOf(\n scene: ReorderScene,\n id: string,\n boxOf: (id: string) => Bounds | null,\n): ReorderTarget | null {\n const held = holders(scene);\n for (let member = id, holder = holderOf(scene, held, id); holder !== undefined; member = holder, holder = holderOf(scene, held, holder)) {\n const axis = axisOf(scene.get(holder)!);\n if (axis === undefined) continue;\n const start = (m: string) => {\n const box = boxOf(m);\n return box === null ? 0 : axis === 'x' ? box.x : box.y;\n };\n const members = membersOf(scene, holder).sort((a, b) => start(a) - start(b));\n return { parent: holder, axis, member, members };\n }\n return null;\n}\n\n/** `member` and everything drawn with it: a group's members and the labels it\n * takes in, all the way down, every container's children, and every node\n * anchored to any of those. */\nexport function carriedWith(scene: ReorderScene, member: string): Set<string> {\n const out = new Set<string>();\n const visit = (id: string) => {\n if (out.has(id)) return;\n out.add(id);\n const node = scene.get(id);\n if (node !== undefined && diagramGroupOf(node) !== null) depsOf(node).forEach(visit);\n scene.childrenOf?.(id).forEach(visit);\n };\n visit(member);\n for (const node of scene.renderOrderNodes()) {\n const on = depsOf(node)[0];\n if (on !== undefined && out.has(on) && diagramAnchorOf(node) !== null) out.add(node.id);\n }\n return out;\n}\n","/**\n * Where an item carried in from outside the canvas would land: the shape or\n * container under the pointer, the container that would hold it, and its\n * place among that container's members.\n */\nimport type { Bounds, OngoingOverlay, RectPose, Scene, Vec2 } from '@weasel-js/core';\nimport { nearestGap } from '@weasel-js/ui-logic';\nimport { bodyAt } from './connectTargets';\nimport { diagramDropParentAt, type DropParentScene } from './containers/canDropInto';\nimport { diagramContainerOf } from './containers/trait';\nimport type { DiagramSceneData } from './fromData';\nimport { worldRectOf } from './overlays';\nimport type { ParticipantSource } from './portAffordance';\nimport { sequenceSlots, type ReorderGap } from './reorder';\nimport { membersOf } from './reorderModel';\n\n/** Where a carried item is over. */\nexport interface ItemDropTarget {\n /** The shape or the container it would be dropped on, or `null` for the bare canvas. */\n target: string | null;\n /** The container or lane that would hold it: the target when that is one,\n * else the one around the pointer. `null` at the top level. */\n container: string | null;\n /** Its place among `container`'s members, as they stand along the\n * container's `reorder` axis, else in reading order: top to bottom, then\n * left to right. `null` with no container. */\n index: number | null;\n /** The pointer, in world units. */\n at: Vec2;\n}\n\ntype DiagramScene = Scene<DiagramSceneData, 'main', RectPose>;\n\n/** A container's members as they stand, and the gap the pointer is nearest along `axis`, or by reading order. */\nfunction placeAmong(scene: DiagramScene, container: string, at: Vec2): { index: number; gap: ReorderGap | null } {\n const axis = diagramContainerOf(scene.get(container as never)!)?.reorder;\n const boxed = membersOf(scene as never, container).flatMap((id) => {\n const bounds = worldRectOf(scene, id);\n return bounds === null ? [] : [{ id, bounds }];\n });\n if (axis === undefined) {\n const before = (b: Bounds) => at.y > b.y + b.height || (at.y >= b.y && at.x > b.x + b.width / 2);\n return { index: boxed.filter((m) => before(m.bounds)).length, gap: null };\n }\n const slots = sequenceSlots(axis, [...boxed].sort((p, q) => p.bounds[axis] - q.bounds[axis]));\n const gap = slots.gaps[nearestGap(slots.gaps.map((g) => g.a[axis]), at[axis])] ?? null;\n return { index: gap?.index ?? 0, gap };\n}\n\n/** What `at` is over, and the insertion bar to draw there in a reorderable container. */\nexport function itemDropTargetAt(\n scene: DiagramScene,\n participants: ParticipantSource<RectPose>,\n at: Vec2,\n): ItemDropTarget & { gap: ReorderGap | null } {\n const point = { x: at.x, y: at.y };\n const hit = bodyAt(participants, point);\n const node = hit !== null && diagramContainerOf(hit.participant.node) === null ? hit.end.nodeId : null;\n const container = diagramDropParentAt(scene as unknown as DropParentScene, point, null);\n const place = container === null ? null : placeAmong(scene, container, point);\n return { target: node ?? container, container, index: place?.index ?? null, at: point, gap: place?.gap ?? null };\n}\n\n/** The outline of `id`'s box, as a closed run. */\nexport function outlineOf(scene: DiagramScene, id: string, role: string): OngoingOverlay | null {\n const b = worldRectOf(scene, id);\n if (b === null) return null;\n const points = [{ x: b.x, y: b.y }, { x: b.x + b.width, y: b.y }, { x: b.x + b.width, y: b.y + b.height }, { x: b.x, y: b.y + b.height }, { x: b.x, y: b.y }];\n return { kind: 'polyline', points, role };\n}\n","/**\n * An item carried in from a list outside the canvas — a palette the host\n * renders — and dropped onto a shape, a container, or the bare canvas. The\n * host makes an element a source with {@link dragItemProps}; the canvas hears\n * the carry, draws where it would land, and reports the drop. Nothing is\n * written: the host adds what the item stands for to its data.\n */\nimport {\n refusalOf,\n startCarry,\n useLatest,\n type Action,\n type ActionDeps,\n type Carry,\n type CarryCallbacks,\n type Contribution,\n type DepName,\n type DropVerdict,\n type InvocationCtx,\n type OngoingHandle,\n type OngoingOverlay,\n type RectPose,\n type Scene,\n} from '@weasel-js/core';\nimport { useMemo, type PointerEvent as ReactPointerEvent } from 'react';\nimport type { DiagramSceneData } from './fromData';\nimport { itemDropTargetAt, outlineOf, type ItemDropTarget } from './itemDropTarget';\nimport type { ParticipantSource } from './portAffordance';\n\nexport type { ItemDropTarget } from './itemDropTarget';\n\n/** The carry type an item travels as. */\nexport const DIAGRAM_ITEM_CARRY = 'weasel-diagram/item';\n\n/** The action a carried item's drop runs. */\nexport const ITEM_DROP_ACTION_ID = 'diagram.dropItem';\n\n/** An item dropped on the diagram: the host's own value, and where it landed. */\nexport interface ItemDrop extends ItemDropTarget {\n item: unknown;\n}\n\n/** Whether `item` may land where `target` says. */\nexport type CanDropItem = (item: unknown, target: ItemDropTarget) => DropVerdict;\n\n/** Carry `item` from the press `down` over the page; a diagram the pointer is\n * released over reports it to `onDropItem`. */\nexport function startItemDrag(down: PointerEvent | ReactPointerEvent, item: unknown, cb?: CarryCallbacks): Carry {\n return startCarry(down.currentTarget as Element, down, { type: DIAGRAM_ITEM_CARRY, value: item }, cb);\n}\n\n/** Props that make an element a source of `item`: a press with the main\n * button carries it. Give the element `touch-action: none` for touch. */\nexport function dragItemProps(item: unknown, cb?: CarryCallbacks): { onPointerDown: (e: ReactPointerEvent) => void } {\n return {\n onPointerDown: (e) => {\n if (e.button !== 0) return;\n e.preventDefault();\n startItemDrag(e, item, cb);\n },\n };\n}\n\n/** Options for {@link createItemDropAction}. */\nexport interface ItemDropOptions {\n participants: ParticipantSource<RectPose>;\n /** Default: every drop lands. */\n canDrop?: CanDropItem;\n /** Deps `report` reads beyond the scene, such as `insert` and `snap` to add the item itself. */\n requires?: readonly DepName[];\n /** Hears a drop that lands, with the canvas's deps as the carry came over it: `scene` and whatever `requires` names. */\n report: (drop: ItemDrop, deps: ActionDeps) => void;\n}\n\ntype DiagramScene = Scene<DiagramSceneData, 'main', RectPose>;\n\nconst ANY = 'optional' as const;\n\n/** The ongoing action a carried item runs from coming over the canvas to its release. */\nexport function createItemDropAction(opts: ItemDropOptions): Action {\n const { participants, report, canDrop = () => true, requires = [] } = opts;\n return {\n id: ITEM_DROP_ACTION_ID,\n label: 'Drop an item',\n group: 'diagram',\n requires: [...new Set<DepName>(['scene', ...requires])],\n defaultBinding: [{\n spec: { kind: 'carry', types: [DIAGRAM_ITEM_CARRY], mods: { alt: ANY, ctrl: ANY, meta: ANY, shift: ANY } },\n opts: { id: `${ITEM_DROP_ACTION_ID}.carry` },\n }],\n invoker: {\n timing: 'ongoing',\n start(ctx: InvocationCtx): OngoingHandle {\n const scene = ctx.deps.scene as DiagramScene | undefined;\n if (scene === undefined || ctx.carry === undefined) return {};\n const item = ctx.carry.value;\n // The dispatcher hands an ongoing handle's onEnd no deps, so report gets these.\n const { deps } = ctx;\n // The host is asked once per place, not every frame.\n const verdicts = new Map<string, DropVerdict>();\n const over = (c: InvocationCtx) => {\n const { gap, ...drop } = itemDropTargetAt(scene, participants, c.world);\n const key = `${drop.target}|${drop.container}|${drop.index}`;\n if (!verdicts.has(key)) verdicts.set(key, canDrop(item, drop));\n return { drop, gap, verdict: verdicts.get(key)! };\n };\n let now = over(ctx);\n let open = true;\n return {\n kind: 'diagram-item-drop',\n onMove(moveCtx) {\n now = over(moveCtx);\n },\n overlay(): readonly OngoingOverlay[] | null {\n const { drop, gap, verdict } = now;\n if (!open || drop.target === null || verdict === false) return null;\n const reason = refusalOf(verdict);\n const box = outlineOf(scene, drop.target, reason === null ? 'target' : 'refused');\n const out: OngoingOverlay[] = box === null ? [] : [box];\n if (reason !== null) out.push({ kind: 'reason', at: drop.at, text: reason });\n else if (gap !== null) out.push({ kind: 'polyline', points: [gap.a, gap.b], role: 'insert' });\n return out;\n },\n onEnd(endCtx, reason) {\n open = false;\n if (reason !== 'commit') return;\n now = over(endCtx);\n if (now.verdict === true) report({ item, ...now.drop }, deps);\n },\n };\n },\n },\n };\n}\n\n/** The item drop as a contribution, to pass as `ambient`. */\nexport function itemDropContribution(opts: ItemDropOptions): Contribution {\n return {\n id: 'weasel-diagram-item-drop',\n eligibility: { always: true },\n actions: [createItemDropAction(opts)],\n };\n}\n\n/** The item drop `DiagramView` installs while `onDropItem` is set, asking the latest `canDropItem`. */\nexport function useItemDrop(\n participants: ParticipantSource<RectPose>,\n props: { onDropItem?: ((drop: ItemDrop) => void) | undefined; canDropItem?: CanDropItem | undefined },\n): Contribution | null {\n const latest = useLatest(props);\n const on = props.onDropItem !== undefined;\n return useMemo(() => (on\n ? itemDropContribution({\n participants,\n canDrop: (item, target) => latest.current.canDropItem?.(item, target) ?? true,\n report: (drop) => latest.current.onDropItem?.(drop),\n })\n : null), [on, participants, latest]);\n}\n","/**\n * What applying a theme writes: every color the theme owns, on every box,\n * text row, connector, label, and off-page tag, as new node `data`. A color named in the\n * owner's `ownStyle` is the author's, and stays.\n */\nimport type { NodeStyle } from '../fromData';\nimport { roleEdgeStyle, roleStyle, themeLabelFamily, themeLabelFont } from './resolve';\nimport type { DiagramTheme, FontField, StyleField } from './types';\n\n/** A scene node as {@link themeWrites} reads it. */\nexport interface ThemedNode {\n id: string;\n parent: string | null;\n data: unknown;\n dependsOn?: readonly string[] | 'children';\n}\n\n/** A scene as {@link themeWrites} reads it. */\nexport interface ThemedScene {\n get(id: never): ThemedNode | undefined;\n renderOrderNodes(): readonly ThemedNode[];\n childrenOf(id: never): readonly string[];\n}\n\ntype Trait = Record<string, unknown> & { style?: string; ownStyle?: readonly StyleField[]; ownFont?: readonly FontField[] };\ntype Paint = { paint?: { color?: string } & Record<string, unknown> } & Record<string, unknown>;\ntype Data = Record<string, unknown> & { diagram?: Trait; fill?: Paint; stroke?: Paint; text?: unknown; style?: Record<string, unknown> };\n\n/** A box's colors, and the ones its author set, and whether the author set its text size. Its text\n * rows take `style.text`. */\ninterface Look { style: NodeStyle; own: ReadonlySet<StyleField>; ownSize: boolean }\n\nconst traitOf = (data: unknown): Trait | null => {\n const d = (data as Data | null)?.diagram;\n return d !== null && typeof d === 'object' ? d : null;\n};\n\nconst ownOf = (trait: Trait): ReadonlySet<StyleField> => new Set(trait.ownStyle ?? []);\nconst ownsSize = (trait: Trait): boolean => trait.ownFont?.includes('size') === true;\n\n/** A container's role, as the containers trait (`data.diagram.container`) names it. */\nfunction containerRole(trait: Trait): string | null {\n const c = trait.container as { role?: unknown } | undefined;\n return c !== null && typeof c === 'object' && typeof c.role === 'string' ? c.role : null;\n}\n\nfunction laneIndex(scene: ThemedScene, node: ThemedNode): number {\n if (node.parent === null) return 0;\n const lanes = scene.childrenOf(node.parent as never).filter((id) => {\n const t = traitOf(scene.get(id as never)?.data);\n return t !== null && containerRole(t) === 'lane';\n });\n return Math.max(0, lanes.indexOf(node.id));\n}\n\n/** The look a box takes from `theme`: a body its role's, a group or container the theme's\n * container, a pool its lane header, a lane the lane bodies in turn. `null` for no box. */\nfunction boxLook(scene: ThemedScene, node: ThemedNode, theme: DiagramTheme): Look | null {\n const trait = traitOf(node.data);\n if (trait === null || 'from' in trait || 'label' in trait || 'anchor' in trait || 'mark' in trait) return null;\n const own = ownOf(trait);\n const ownSize = ownsSize(trait);\n const role = containerRole(trait);\n if (role === 'pool') return { style: theme.lane.header, own, ownSize };\n if (role === 'lane') {\n const bodies = theme.lane.bodies;\n return { style: bodies[laneIndex(scene, node) % bodies.length] ?? theme.container, own, ownSize };\n }\n if (role !== null || 'group' in trait) return { style: theme.container, own, ownSize };\n return { style: roleStyle(theme, trait.style), own, ownSize };\n}\n\nconst recolored = (paint: Paint | undefined, color: string): Paint | undefined =>\n paint?.paint?.color === color ? undefined : { ...paint, paint: { ...paint?.paint, color } };\n\n/** `data` with its fill and stroke recolored where the author has not set them, or `null` when\n * nothing changes. */\nfunction paintBox(data: Data, look: Look): Data | null {\n const fill = look.own.has('fill') ? undefined : recolored(data.fill, look.style.fill);\n const stroke = look.own.has('stroke') || data.stroke === undefined ? undefined : recolored(data.stroke, look.style.stroke);\n if (fill === undefined && stroke === undefined) return null;\n return { ...data, ...(fill ? { fill } : {}), ...(stroke ? { stroke } : {}) };\n}\n\n/** `data`'s text recolored to `color` (unless `undefined`), set in `family`, and its size moved by\n * `step`, or `null` when nothing changes. */\nfunction paintText(data: Data, color: string | undefined, family: string, step: number): Data | null {\n const fill = color === undefined ? undefined : recolored(data.fill, color);\n const size = data.style?.fontSize;\n const resized = step !== 0 && typeof size === 'number' ? { fontSize: Math.max(1, size + step) } : {};\n const face = data.style !== undefined && (data.style.fontFamily !== family || 'fontSize' in resized)\n ? { ...data.style, fontFamily: family, ...resized } : undefined;\n if (fill === undefined && face === undefined) return null;\n return { ...data, ...(fill ? { fill } : {}), ...(face ? { style: face } : {}) };\n}\n\n/** An off-page tag's `data` in `theme`'s label color and face, on its page color, its size moved\n * by `step` as an edge label's is, or `null`. */\nfunction paintTag(data: Data, theme: DiagramTheme, step: number): Data | null {\n const text = paintText(data, theme.label.fill, themeLabelFamily(theme), step);\n const background = recolored(data.background as Paint | undefined, theme.page);\n if (text === null && background === undefined) return null;\n return { ...(text ?? data), ...(background ? { background } : {}) };\n}\n\n/** A connector's own colors, and its label's, under `theme`. */\nfunction edgeLook(trait: Trait, theme: DiagramTheme): { stroke: string; label: string; own: ReadonlySet<StyleField>; ownSize: boolean } {\n const style = roleEdgeStyle(theme, trait.style);\n return { stroke: style.stroke, label: style.label ?? style.stroke, own: ownOf(trait), ownSize: ownsSize(trait) };\n}\n\nconst ownerOf = (node: ThemedNode): string | null =>\n Array.isArray(node.dependsOn) && node.dependsOn.length === 1 ? node.dependsOn[0]! : node.parent;\n\n/**\n * The new `data` for every node `theme` recolors: shapes, their text rows,\n * groups and containers and their titles, connectors and their labels. Given\n * `ids`, only those boxes and connectors, and the text that belongs to them.\n * Given `from`, the theme the scene was in, text moves by the step between the\n * two themes' sizes, except where its owner's author set the size. A node\n * already as the theme draws it is left out.\n */\nexport function themeWrites(scene: ThemedScene, theme: DiagramTheme, ids?: ReadonlySet<string>, from?: DiagramTheme): Map<string, unknown> {\n const out = new Map<string, unknown>();\n const step = from === undefined ? 0 : theme.font.size - from.font.size;\n const labelStep = from === undefined ? 0 : themeLabelFont(theme).fontSize - themeLabelFont(from).fontSize;\n const looks = new Map<string, Look | null>();\n const lookOf = (id: string): Look | null => {\n if (!looks.has(id)) {\n const node = scene.get(id as never);\n looks.set(id, node === undefined ? null : boxLook(scene, node, theme));\n }\n return looks.get(id)!;\n };\n const write = (id: string, next: Data | null) => { if (next !== null) out.set(id, next); };\n for (const node of scene.renderOrderNodes()) {\n const data = node.data as Data | null;\n if (data === null || typeof data !== 'object') continue;\n const trait = traitOf(data);\n // A sequence draws its parts from its data and the theme, and `applyDiagramTheme` draws them again.\n if (trait !== null && ('seq' in trait || 'sequence' in trait)) continue;\n if (trait !== null && 'from' in trait && 'to' in trait) {\n if (ids !== undefined && !ids.has(node.id)) continue;\n const look = edgeLook(trait, theme);\n const stroke = look.own.has('stroke') || data.stroke === undefined ? undefined : recolored(data.stroke, look.stroke);\n if (stroke !== undefined) out.set(node.id, { ...data, stroke });\n continue;\n }\n if (trait !== null && 'label' in trait) {\n const edgeId = ownerOf(node);\n const edgeTrait = edgeId === null ? null : traitOf(scene.get(edgeId as never)?.data);\n if (edgeId === null || edgeTrait === null || (ids !== undefined && !ids.has(edgeId))) continue;\n const look = edgeLook(edgeTrait, theme);\n write(node.id, paintText(data, look.own.has('text') ? undefined : look.label, themeLabelFamily(theme), look.ownSize ? 0 : labelStep));\n continue;\n }\n if (trait !== null && 'offPageTag' in trait) {\n const edgeId = ownerOf(node);\n if (ids === undefined || (edgeId !== null && ids.has(edgeId))) write(node.id, paintTag(data, theme, labelStep));\n continue;\n }\n if (trait !== null && 'mark' in trait) continue;\n const look = lookOf(node.id);\n if (look !== null) {\n if (ids === undefined || ids.has(node.id)) write(node.id, paintBox(data, look));\n continue;\n }\n // A text row, a port label, or a group's title: colored as the box it belongs to.\n const owner = ownerOf(node);\n const ownerLook = owner === null ? null : lookOf(owner);\n if (ownerLook === null || typeof data.text !== 'string' || (ids !== undefined && !ids.has(owner!))) continue;\n write(node.id, paintText(data, ownerLook.own.has('text') ? undefined : ownerLook.style.text, theme.font.family, ownerLook.ownSize ? 0 : step));\n }\n return out;\n}\n","import { icon } from '../icons.gen';\nimport type { ContainerStencil } from '../containers/containerStencils';\nimport type { StencilGroup } from '../diagramTypes/types';\n\n/** A titled box, and pools of rows and of columns. */\nexport const CONTAINER_STENCILS: readonly ContainerStencil[] = [\n { id: 'container', label: 'Container', role: 'container', size: { width: 240, height: 160 }, icon: /* @icon */ 'diagram:container' },\n { id: 'pool-rows', label: 'Pool (rows)', role: 'pool', axis: 'y', size: { width: 480, height: 240 }, icon: /* @icon */ 'diagram:poolRows' },\n { id: 'pool-columns', label: 'Pool (columns)', role: 'pool', axis: 'x', size: { width: 480, height: 300 }, icon: /* @icon */ 'diagram:poolColumns' },\n];\n\n/** The containers as a stencil group. */\nexport const CONTAINERS_GROUP: StencilGroup = { id: 'containers', label: 'Containers', stencils: CONTAINER_STENCILS };\n","/**\n * The container stencils a palette offers, what one becomes when it is drawn,\n * and the edits on one: adding a lane to a pool, and releasing a container's\n * members.\n */\nimport { RIGID_POSE_COMPOSITION, createInsertOp, localizeWorldPoses, scenePoseFrame, type NodeId, type Op, type PoseComposition, type RectPose, type Scene } from '@weasel-js/core';\nimport type { IconRef } from '@weasel-js/icons';\nimport type { NodeStyle } from '../dataTypes';\nimport { diagramThemeOf } from '../theme/resolve';\nimport { themeWrites, type ThemedScene } from '../theme/themeWrites';\nimport { DIAGRAM_THEME_KEY } from '../theme/types';\nimport { firstLanes, regionSpecs, type ContainerBuildOptions } from './regionSpecs';\nimport { diagramContainerOf, titleIdOf, type DiagramContainer } from './trait';\n\nexport type { ContainerBuildOptions };\n\n/** One container a palette offers. A pool stacks its lanes along `axis`. */\nexport interface ContainerStencil {\n id: string;\n label: string;\n role: 'container' | 'pool';\n axis?: 'x' | 'y';\n size: { width: number; height: number };\n /** The glyph a palette draws on its button. */\n icon?: IconRef;\n /** The title a new one is drawn with. Default `label`, and `'Pool'` for a pool. */\n title?: string;\n /** A new pool's lanes, by title, in the order they stack. Default two, `Lane 1` and `Lane 2`. */\n lanes?: readonly string[];\n}\n\nexport { CONTAINER_STENCILS } from '../stencils/containers';\n\n/** A lane added to a pool, along its stack. */\nconst NEW_LANE_SIZE = 120;\n\ntype Bounds = { x: number; y: number; width: number; height: number };\ntype AnyScene = Scene<unknown, string, unknown>;\n\n/** A zero-size box — a click rather than a drag — becomes the stencil's own size centered on it. */\nfunction placedBounds(stencil: ContainerStencil, b: Bounds): RectPose {\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/** The ops that insert `stencil` at `bounds`: the region and its title, and a\n * pool's first lanes. Applied as one batch, they are one undo entry. */\nexport function containerBuild<TLayer extends string>(\n stencil: ContainerStencil,\n bounds: Bounds,\n opts: ContainerBuildOptions<TLayer>,\n): { id: string; ops: Op[] } {\n const id = opts.newId();\n const axis = stencil.axis ?? 'y';\n const at = placedBounds(stencil, bounds);\n const title = stencil.title ?? (stencil.role === 'pool' ? 'Pool' : stencil.label);\n const style = stencil.role === 'pool' && opts.laneStyles ? opts.laneStyles.header : opts.style;\n const specs = [\n ...regionSpecs(stencil.role, axis, at, title, {\n id, layer: opts.layer, parent: opts.parent ?? null, ...(style ? { style } : {}),\n }),\n ...(stencil.role === 'pool' ? firstLanes(id, axis, at, opts, stencil.lanes) : []),\n ];\n const label = `Insert ${stencil.label}`;\n // Built in one frame; each lane and title is stored in its container's.\n const stored = localizeWorldPoses(specs, RIGID_POSE_COMPOSITION);\n return { id, ops: stored.map((node) => createInsertOp({ node, label })) };\n}\n\n/** The axis a pool stacks its lanes along, read off its header. */\nexport const poolAxisOf = (pool: DiagramContainer): 'x' | 'y' => (pool.header?.side === 'top' ? 'x' : 'y');\n\n/** The lanes of `poolId`, in the order they stack. */\nexport function lanesOf(scene: AnyScene, poolId: string): NodeId[] {\n const pool = scene.get(poolId as NodeId);\n const trait = pool === undefined ? null : diagramContainerOf(pool);\n if (pool === undefined || trait?.role !== 'pool') return [];\n const axis = poolAxisOf(trait);\n const start = (id: NodeId) => {\n const p = scene.get(id)!.pose as RectPose;\n return axis === 'y' ? p.y : p.x;\n };\n return scene.childrenOf(pool.id)\n .filter((id) => diagramContainerOf(scene.get(id)!)?.role === 'lane')\n .sort((a, b) => start(a) - start(b));\n}\n\n/**\n * Add a lane to `poolId` before the lane at `index`, or at the end of the\n * stack, as one history entry. The pool grows to hold it. Returns the new\n * lane's id, or null when `poolId` is not a pool.\n */\nexport function addLane(scene: AnyScene, poolId: string, index?: number, style?: NodeStyle): string | null {\n const pool = scene.get(poolId as NodeId);\n const trait = pool === undefined ? null : diagramContainerOf(pool);\n if (pool === undefined || trait?.role !== 'pool') return null;\n const axis = poolAxisOf(trait);\n const lanes = lanesOf(scene, poolId);\n // In the pool's own frame, where its lanes are stored.\n const { width, height } = pool.pose as RectPose;\n const b: RectPose = { x: 0, y: 0, width, height };\n const at = index === undefined || index >= lanes.length ? null : scene.get(lanes[index]!)!.pose as RectPose;\n const boundary = at !== null ? (axis === 'y' ? at.y : at.x) : axis === 'y' ? b.y + b.height : b.x + b.width;\n // Centered on the boundary it goes in at: the stack orders lanes by where they sit.\n const start = boundary - NEW_LANE_SIZE / 2;\n const offset = trait.header?.size ?? 0;\n const pose: RectPose = axis === 'y'\n ? { x: b.x + offset, y: start, width: b.width - offset, height: NEW_LANE_SIZE }\n : { x: start, y: b.y + offset, width: NEW_LANE_SIZE, height: b.height - offset };\n const id = scene.mintId() as string;\n const specs = localizeWorldPoses(regionSpecs('lane', axis, pose, `Lane ${lanes.length + 1}`, {\n id, layer: pool.layer, parent: poolId, ...(style ? { style } : {}),\n }), scene.composition as PoseComposition<RectPose>);\n scene.batch('Add lane', () => {\n for (const spec of specs) scene.add(spec as never);\n // A themed scene colors the lane as a theme change would, by its place in the stack.\n if (style === undefined && scene.doc.get(DIAGRAM_THEME_KEY) !== undefined) {\n const writes = themeWrites(scene as unknown as ThemedScene, diagramThemeOf(scene), new Set([id]));\n for (const [at, data] of writes) scene.update(at as never, { data } as never);\n }\n });\n return id;\n}\n\n/** The node a release lands members beside: `id`, or the pool around a lane. */\nfunction releasedFrom(scene: AnyScene, id: NodeId): NodeId {\n const parent = scene.get(id)!.parent;\n const around = parent === null ? undefined : scene.get(parent);\n return around !== undefined && diagramContainerOf(around)?.role === 'pool' ? around.id : id;\n}\n\n/**\n * Remove container `id` and keep its members, which take its place in its\n * parent, as one history entry. A pool's members are its lanes' members, and\n * a lane's go past its pool. Connectors on what is removed go with it.\n */\nexport function releaseMembers(scene: AnyScene, id: string): void {\n const node = scene.get(id as NodeId);\n const trait = node === undefined ? null : diagramContainerOf(node);\n if (node === undefined || trait === null) return;\n const membersOf = (c: NodeId) => scene.childrenOf(c).filter((m) => m !== titleIdOf(c as string));\n const members = trait.role === 'pool' ? membersOf(node.id).flatMap(membersOf) : membersOf(node.id);\n const beside = releasedFrom(scene, node.id);\n const parent = scene.get(beside)!.parent;\n const index = (parent === null ? scene.roots : scene.childrenOf(parent)).indexOf(beside);\n // Read where each draws before the first move: it is stored in a frame that is about to go.\n const frame = scenePoseFrame(scene);\n const worlds = members.map((m) => frame.world(m));\n scene.batch('Release members', () => {\n members.forEach((m, k) => {\n scene.move(m, parent, index + k);\n scene.setPose(m, frame.localUnder(parent, worlds[k]));\n });\n scene.remove(node.id);\n });\n}\n","/**\n * Where nodes draw once a set of poses is written: each node's stored pose,\n * or the one `frame` gives it, folded through every container's frame. A node\n * a moving container carries moves with it though `frame` does not name it.\n */\nimport { composeWorldPose, definesFrame, type Scene } from '@weasel-js/core';\n\ntype AnyScene = Scene<unknown, string, unknown>;\n\n/** `(id) => where it draws` with `frame`'s poses in place of the stored ones. */\nexport function worldWith(sc: AnyScene, frame: ReadonlyMap<string, unknown> = new Map()): (id: string) => unknown {\n const poses = {\n getPose: (id: string) => (frame.has(id) ? frame.get(id) : sc.get(id as never)!.pose),\n getParent: (id: string) => (sc.get(id as never)?.parent ?? null) as string | null,\n definesFrame: (id: string) => {\n const n = sc.get(id as never);\n return n === undefined || definesFrame(n);\n },\n };\n return (id) => composeWorldPose(poses, id, sc.composition.compose);\n}\n","/**\n * The lane affordances on every pool: the boundary after each lane, which a\n * drag moves to resize that lane, and the add-lane button past the end of the\n * stack. Built the way the edge-end handles are: regions with a `null`\n * `targetId`, composed into a layer whose id is the kind a press reports.\n */\nimport { worldWith } from '../worldWith';\nimport {\n composeAffordanceLayer,\n ellipsePath,\n paintsLayer,\n PathBuilder,\n polylineFromPoints,\n viewToTransform,\n type Affordance,\n type AffordanceRegion,\n type ChromeState,\n type CommandFill,\n type CommandStroke,\n type NodeId,\n type RectPose,\n type RenderLayer,\n type Scene,\n} from '@weasel-js/core';\nimport { lanesOf, poolAxisOf } from './containerStencils';\nimport { diagramContainerOf } from './trait';\n\n/** The layer id the lane affordances are composed into. */\nexport const LANE_LAYER_ID = 'diagram-lanes';\n/** The affordance kind a press on a lane affordance reports. */\nexport const LANE_AFFORDANCE_KIND = `layer:${LANE_LAYER_ID}` as const;\n\n/** What a press on a lane affordance hands the action: the boundary after\n * `laneId`, or, with no lane, the add-lane button. */\nexport interface LaneScratch {\n targetId: string;\n poolId: string;\n laneId?: string;\n}\n\n/** Read a lane press's scratch back off the hit an action was handed. */\nexport function laneScratchOf(hit: { payload?: unknown } | null | undefined): LaneScratch | null {\n const payload = hit?.payload as LaneScratch | undefined;\n return payload !== undefined && typeof payload.poolId === 'string' ? payload : null;\n}\n\ntype AnyScene = Scene<unknown, string, unknown>;\n\n/** A pool as the affordances see it: its box, the axis it stacks along, and its lanes in order.\n * `pose` is as stored, `at` where it draws. */\nexport interface PoolLanes {\n id: string;\n axis: 'x' | 'y';\n pose: RectPose;\n at: RectPose;\n lanes: { id: string; pose: RectPose; at: RectPose }[];\n}\n\n/** Every pool in `scene` that is drawn and not locked. */\nexport function poolsOf(scene: AnyScene): PoolLanes[] {\n const out: PoolLanes[] = [];\n const world = worldWith(scene);\n for (const node of scene.renderOrderNodes()) {\n const trait = diagramContainerOf(node);\n if (trait?.role !== 'pool' || scene.isHidden(node.id) || scene.isLocked(node.id)) continue;\n out.push({\n id: node.id,\n axis: poolAxisOf(trait),\n pose: node.pose as RectPose,\n at: world(node.id) as RectPose,\n lanes: lanesOf(scene, node.id).map((id) => ({ id, pose: scene.get(id)!.pose as RectPose, at: world(id) as RectPose })),\n });\n }\n return out;\n}\n\n/** Options for {@link laneLayer}. */\nexport interface LaneLayerOptions {\n /** Screen-pixel reach of a boundary either side of it. Default 4. */\n hitRadiusPx?: number;\n /** Screen-pixel diameter of the add-lane button. Default 14; 0 hides it. */\n addSizePx?: number;\n fill?: CommandFill;\n stroke?: CommandStroke;\n}\n\nconst DEFAULT_FILL: CommandFill = { paint: { kind: 'solid', color: '#ffffff' } };\nconst DEFAULT_STROKE: CommandStroke = { paint: { kind: 'solid', color: '#3b6fd4' }, width: 1.5 };\n/** How far past the end of the stack the add-lane button sits, in screen pixels. */\nconst ADD_STANDOFF_PX = 14;\n\n/** The far edge of a lane: the boundary between it and the next. */\nfunction boundaryOf(axis: 'x' | 'y', lane: RectPose) {\n const b = new PathBuilder();\n return axis === 'y'\n ? b.moveTo(lane.x, lane.y + lane.height).lineTo(lane.x + lane.width, lane.y + lane.height).build()\n : b.moveTo(lane.x + lane.width, lane.y).lineTo(lane.x + lane.width, lane.y + lane.height).build();\n}\n\n/** The add-lane button: a ring with a plus, drawn in screen pixels. */\nfunction addPaint(sizePx: number, fill: CommandFill, stroke: CommandStroke): AffordanceRegion['paint'] {\n return {\n kind: 'custom',\n draw: ({ world, view }) => {\n const t = viewToTransform(view);\n const cx = t.panX + world.x * t.zoom.x;\n const cy = t.panY + world.y * t.zoom.y;\n const r = sizePx / 2;\n const arm = r * 0.55;\n return [\n { kind: 'path', path: ellipsePath({ x: cx - r, y: cy - r, width: sizePx, height: sizePx }), fill, stroke },\n { kind: 'path', path: polylineFromPoints([{ x: cx - arm, y: cy }, { x: cx + arm, y: cy }]), stroke },\n { kind: 'path', path: polylineFromPoints([{ x: cx, y: cy - arm }, { x: cx, y: cy + arm }]), stroke },\n ];\n },\n };\n}\n\n/** The affordance: a boundary region after each lane of each pool, and an add-lane button per pool. */\nexport function createLaneAffordance(scene: AnyScene, opts: LaneLayerOptions = {}): Affordance {\n const { hitRadiusPx = 4, addSizePx = 14 } = opts;\n const fill = opts.fill ?? DEFAULT_FILL;\n const stroke = opts.stroke ?? DEFAULT_STROKE;\n return {\n id: LANE_LAYER_ID,\n regions(state: ChromeState): readonly AffordanceRegion[] {\n const out: AffordanceRegion[] = [];\n for (const pool of poolsOf(scene)) {\n if (!paintsLayer(state, scene.get(pool.id as NodeId)!.layer)) continue;\n const cursor = pool.axis === 'y' ? 'row-resize' : 'col-resize';\n for (const lane of pool.lanes) {\n out.push({\n id: `${lane.id}:boundary`,\n targetId: null,\n shape: { kind: 'outline', path: boundaryOf(pool.axis, lane.at), hitRadiusPx },\n cursor,\n strength: 'exclusive',\n claimedKinds: ['pointer'],\n bind: () => ({ initialScratch: { targetId: pool.id, poolId: pool.id, laneId: lane.id } satisfies LaneScratch }),\n });\n }\n if (addSizePx <= 0) continue;\n const p = pool.at;\n const end = pool.axis === 'y'\n ? { x: p.x + p.width / 2, y: p.y + p.height, normal: { x: 0, y: 1 } }\n : { x: p.x + p.width, y: p.y + p.height / 2, normal: { x: 1, y: 0 } };\n out.push({\n id: `${pool.id}:add-lane`,\n targetId: null,\n shape: { kind: 'point', x: end.x, y: end.y, hitRadiusPx: addSizePx / 2 + 2, standoff: { px: ADD_STANDOFF_PX, normal: end.normal } },\n paint: addPaint(addSizePx, fill, stroke),\n cursor: 'pointer',\n strength: 'exclusive',\n claimedKinds: ['pointer'],\n bind: () => ({ initialScratch: { targetId: pool.id, poolId: pool.id } satisfies LaneScratch }),\n });\n }\n return out;\n },\n };\n}\n\n/** The composed layer, for `CanvasExtensionApi.registerLayer`. */\nexport function laneLayer(scene: AnyScene, opts: LaneLayerOptions = {}): RenderLayer<unknown> {\n return composeAffordanceLayer(LANE_LAYER_ID, 'Diagram lanes', [createLaneAffordance(scene, opts)]) as unknown as RenderLayer<unknown>;\n}\n","/**\n * The container actions: dragging the boundary after a lane resizes it, the\n * add-lane button adds one at the end of the stack, and Release members\n * removes a container and keeps what it holds. The two lane gestures take a\n * swappable commit; the default writes the scene.\n */\nimport {\n ActionDisabledReason,\n carriedDescendants,\n sceneCarrySource,\n type Action,\n type Contribution,\n type InvocationCtx,\n type NodeId,\n type OngoingHandle,\n type RectPose,\n type RenderLayer,\n type Scene,\n} from '@weasel-js/core';\nimport type { Vec2 } from '@weasel-js/core/math';\nimport { grabPortAction, grabPortBindings } from '../connect';\nimport { addLane, releaseMembers } from './containerStencils';\nimport { LANE_AFFORDANCE_KIND, laneLayer, laneScratchOf, poolsOf, type LaneLayerOptions, type PoolLanes } from './laneBoundaryLayer';\nimport { MIN_LANE_SIZE } from './laneStack';\nimport { titleInFrame } from './titlePose';\nimport { diagramContainerOf, titleIdOf } from './trait';\nimport type { ImmediateParams } from '@weasel-js/core';\n\n/** The action that drags a lane's boundary. */\nexport const LANE_RESIZE_ACTION_ID = 'diagram.resizeLane';\n/** The action the add-lane button runs. */\nexport const ADD_LANE_ACTION_ID = 'diagram.addLane';\n/** The command that removes the selected containers and keeps their members. */\nexport const RELEASE_MEMBERS_ACTION_ID = 'diagram.releaseMembers';\nconst GRAB_LANE_ACTION_ID = 'diagram.grabLane';\n\ntype AnyScene = Scene<unknown, string, unknown>;\n\n/** A lane resized: its new size along its pool's stack. */\nexport interface LaneResize {\n poolId: string;\n laneId: string;\n size: number;\n}\n\n/** The default commit: the lane's and the pool's new size, as one history\n * entry labeled \"Resize lane\". The pool's layout restacks the lanes after it. */\nexport function commitLaneResizeToScene(resize: LaneResize, ctx: InvocationCtx): void {\n const scene = ctx.deps.scene as AnyScene | undefined;\n const pool = scene?.get(resize.poolId as NodeId);\n const lane = scene?.get(resize.laneId as NodeId);\n if (scene === undefined || pool === undefined || lane === undefined) return;\n const axis = diagramContainerOf(pool)?.header?.side === 'top' ? 'x' : 'y';\n const l = lane.pose as RectPose;\n const p = pool.pose as RectPose;\n const d = resize.size - (axis === 'y' ? l.height : l.width);\n scene.batch('Resize lane', () => {\n scene.setPose(lane.id, axis === 'y' ? { ...l, height: resize.size } : { ...l, width: resize.size });\n scene.setPose(pool.id, axis === 'y' ? { ...p, height: p.height + d } : { ...p, width: p.width + d });\n });\n}\n\n/** Where everything stands with the lane at `index` of `pool` resized to `size`: the\n * lane, its title, the pool and its title, and every later lane with what it holds. */\nexport function laneResizeFrame(scene: AnyScene, pool: PoolLanes, index: number, size: number): Map<string, RectPose> {\n const { axis } = pool;\n const along = (r: RectPose) => (axis === 'y' ? r.height : r.width);\n const grow = (r: RectPose, by: number): RectPose => (axis === 'y' ? { ...r, height: r.height + by } : { ...r, width: r.width + by });\n const shift = (r: RectPose, by: number): RectPose => (axis === 'y' ? { ...r, y: r.y + by } : { ...r, x: r.x + by });\n const lane = pool.lanes[index]!;\n const d = size - along(lane.pose);\n const out = new Map<string, RectPose>();\n const placeTitle = (id: string, at: RectPose) => {\n const node = scene.get(id as NodeId);\n if (node !== undefined && scene.get(titleIdOf(id) as NodeId) !== undefined) {\n out.set(titleIdOf(id), titleInFrame(at, diagramContainerOf(node)?.header));\n }\n };\n const laneAt = grow(lane.pose, d);\n out.set(lane.id, laneAt);\n placeTitle(lane.id, laneAt);\n const poolAt = grow(pool.pose, d);\n out.set(pool.id, poolAt);\n placeTitle(pool.id, poolAt);\n for (const later of pool.lanes.slice(index + 1)) {\n out.set(later.id, shift(later.pose, d));\n const carried = carriedDescendants(sceneCarrySource(scene), later.id as NodeId, (p) => shift(p as RectPose, d));\n for (const [id, p] of carried) out.set(id, p as RectPose);\n }\n return out;\n}\n\n/** Options for the container actions. */\nexport interface LaneActionOptions extends LaneLayerOptions {\n scene: AnyScene;\n /** The selected ids, which Release members reads. */\n selected?: () => readonly string[];\n /** Defaults to {@link commitLaneResizeToScene}. */\n commitResize?: (resize: LaneResize, ctx: InvocationCtx) => void;\n /** Defaults to `addLane` on `deps.scene`, at the end of the stack. */\n commitAddLane?: (poolId: string, ctx: InvocationCtx) => void;\n /** Runs for each selected region in place of `releaseMembers`. */\n commitRelease?: (id: string) => void;\n}\n\n/** The `diagram.resizeLane` action: an ongoing drag moving one lane's far boundary. */\nexport function createLaneResizeAction(opts: LaneActionOptions): Action {\n const commit = opts.commitResize ?? commitLaneResizeToScene;\n return {\n id: LANE_RESIZE_ACTION_ID,\n label: 'Resize lane',\n group: 'diagram',\n requires: ['scene'],\n invoker: {\n timing: 'ongoing',\n start(ctx: InvocationCtx): OngoingHandle {\n const pressed = laneScratchOf(ctx.drag?.affordance);\n const pool = poolsOf(opts.scene).find((p) => p.id === pressed?.poolId);\n const index = pool?.lanes.findIndex((l) => l.id === pressed?.laneId) ?? -1;\n if (pressed === null || pool === undefined || index < 0) return {};\n const lane = pool.lanes[index]!;\n const start = pool.axis === 'y' ? lane.pose.height : lane.pose.width;\n const press: Vec2 = ctx.drag?.start ?? ctx.world;\n const sizeAt = (at: Vec2) => Math.max(MIN_LANE_SIZE, start + (pool.axis === 'y' ? at.y - press.y : at.x - press.x));\n let frame: Map<string, RectPose> | null = null;\n let open = true;\n return {\n kind: 'diagram-resize-lane',\n onMove(moveCtx: InvocationCtx): void {\n const size = sizeAt(moveCtx.world);\n frame = size === start ? null : laneResizeFrame(opts.scene, pool, index, size);\n },\n previewIds: () => (open && frame !== null ? [...frame.keys()] : null),\n previewPose: (id) => (open ? frame?.get(id) ?? null : null),\n onEnd(endCtx: InvocationCtx, reason: 'commit' | 'cancel'): void {\n open = false;\n if (reason === 'cancel') return;\n const size = sizeAt(endCtx.world);\n if (size !== start) commit({ poolId: pool.id, laneId: lane.id, size }, { ...endCtx, deps: ctx.deps });\n },\n };\n },\n },\n enabled: () => true as const,\n };\n}\n\nconst NO_MODIFIERS = { alt: false, shift: false, meta: false, ctrl: false };\n\n/** The `diagram.addLane` action: the add-lane button's click. */\nexport function createAddLaneAction(opts: LaneActionOptions): Action {\n const commit = opts.commitAddLane ?? ((poolId: string, ctx: InvocationCtx) => {\n const scene = ctx.deps.scene as AnyScene | undefined;\n if (scene !== undefined) addLane(scene, poolId);\n });\n return {\n id: ADD_LANE_ACTION_ID,\n label: 'Add lane',\n group: 'diagram',\n requires: ['scene'],\n invoker: {\n timing: 'immediate',\n run(deps, params) {\n const p = params as ImmediateParams | undefined;\n const pressed = laneScratchOf(p?.affordance as { payload?: unknown } | undefined);\n const world = p?.world;\n if (pressed === null || pressed.laneId !== undefined || !world) return;\n commit(pressed.poolId, { world, modifiers: NO_MODIFIERS, deps } as InvocationCtx);\n },\n },\n enabled: () => true as const,\n };\n}\n\n/** The selected containers, pools, and lanes. */\nconst selectedContainers = (opts: LaneActionOptions): string[] =>\n (opts.selected?.() ?? []).filter((id) => {\n const node = opts.scene.get(id as NodeId);\n return node !== undefined && diagramContainerOf(node) !== null;\n });\n\n/** The `diagram.releaseMembers` command: removes each selected container and\n * keeps what it holds, in one history entry. */\nexport function createReleaseMembersAction(opts: LaneActionOptions): Action {\n return {\n id: RELEASE_MEMBERS_ACTION_ID,\n label: 'Release members',\n group: 'diagram',\n requires: ['scene'],\n invoker: {\n timing: 'immediate',\n run() {\n const ids = selectedContainers(opts);\n if (ids.length === 0) return;\n const commit = opts.commitRelease;\n if (commit !== undefined) {\n for (const id of ids) commit(id);\n return;\n }\n opts.scene.batch('Release members', () => {\n for (const id of ids) releaseMembers(opts.scene, id);\n });\n },\n },\n enabled: () => (selectedContainers(opts).length > 0 ? true : ActionDisabledReason.NotApplicable),\n };\n}\n\n/**\n * Both halves of container editing: the lane layer to `registerLayer`, and\n * the contribution to pass as `ambient`, which carries the lane boundary\n * drag, the add-lane click, and the `diagram.releaseMembers` command. Like\n * `diagramPorts`, one without the other fails quietly.\n */\nexport function diagramContainers(opts: LaneActionOptions): { layer: RenderLayer<unknown>; contribution: Contribution } {\n const target = `affordance:${LANE_AFFORDANCE_KIND}` as const;\n return {\n layer: laneLayer(opts.scene, opts),\n contribution: {\n id: 'weasel-diagram-containers',\n eligibility: { claimed: true },\n actions: [\n createLaneResizeAction(opts), createAddLaneAction(opts), createReleaseMembersAction(opts), grabPortAction(GRAB_LANE_ACTION_ID),\n ],\n bindings: [\n { spec: { kind: 'drag', target }, actionId: LANE_RESIZE_ACTION_ID, opts: { id: 'weasel-diagram-containers.drag' } },\n { spec: { kind: 'click', target }, actionId: ADD_LANE_ACTION_ID, opts: { id: 'weasel-diagram-containers.click' } },\n ...grabPortBindings(GRAB_LANE_ACTION_ID, LANE_AFFORDANCE_KIND).filter((b) => b.spec.kind !== 'click'),\n ],\n },\n };\n}\n","/**\n * A double-click on a region's header: the action that reports which region's\n * title to edit, and its binding.\n */\nimport {\n ActionDisabledReason,\n bodyPredicate,\n type Action,\n type ActionDeps,\n type GestureBinding,\n type RectPose,\n} from '@weasel-js/core';\nimport { diagramContainerOf, headerBox } from './trait';\nimport type { ImmediateParams } from '@weasel-js/core';\n\n/** The action a double-click on a region's header runs. */\nexport const EDIT_CONTAINER_TITLE_ACTION_ID = 'diagram.editContainerTitle';\n\n/** The container, pool, or lane whose header holds `at`: the node under it, or a region around that. */\nexport function regionHeaderAt(deps: ActionDeps | undefined, at: { x: number; y: number } | undefined): string | null {\n if (deps === undefined || at === undefined) return null;\n const scene = deps.scene;\n for (let id = deps.nodeAtPoint?.(at) ?? null; id != null && scene !== undefined; id = scene.get(id)?.parent ?? null) {\n const node = scene.get(id);\n const trait = node === undefined ? null : diagramContainerOf(node);\n if (node === undefined || trait === null) continue;\n const h = headerBox(node.pose as RectPose, trait.header);\n if (h !== null && at.x >= h.x && at.x <= h.x + h.width && at.y >= h.y && at.y <= h.y + h.height) return id as string;\n }\n return null;\n}\n\n/** The action that hands `commit` the region whose header a double-click landed on. It declines anywhere else. */\nexport function editContainerTitleAction(commit: (id: string) => void): Action {\n return {\n id: EDIT_CONTAINER_TITLE_ACTION_ID,\n label: 'Edit container title',\n group: 'diagram',\n requires: ['scene', 'nodeAtPoint'],\n eligible: { mode: 'normal' },\n invoker: {\n timing: 'immediate',\n run(deps, params) {\n const world = (params as ImmediateParams | undefined)?.world;\n const id = world ? regionHeaderAt(deps, world) : null;\n if (id !== null) commit(id);\n },\n },\n enabled: (deps, at) => (regionHeaderAt(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 declines unless it lands in a region's header. */\nexport function editContainerTitleBinding(): GestureBinding {\n return {\n spec: { kind: 'doubleClick', target: { kindOf: onBody } },\n actionId: EDIT_CONTAINER_TITLE_ACTION_ID,\n opts: { id: `${EDIT_CONTAINER_TITLE_ACTION_ID}.doubleClick` },\n };\n}\n","import type { Action } from '@weasel-js/core';\nimport { icon } from '../icons.gen';\nimport { DEFAULT_HOP_SIZE, HOPS_DOC_KEY } from './types';\n\n/** The line jumps command's id. */\nexport const SET_HOPS_ACTION_ID = 'diagram.hops';\n\n/** Options for {@link createSetHopsAction}. */\nexport interface SetHopsOptions {\n /** The radius hops take when the command turns them on. Default\n * {@link DEFAULT_HOP_SIZE}. */\n size?: number;\n}\n\n/**\n * The command that turns line jumps on for the whole document, or off, by\n * writing its `HOPS_DOC_KEY` value: one history entry, which the hop pass\n * (`useHops`) joins with every connector's hops. Active while they are on.\n */\nexport function createSetHopsAction(opts: SetHopsOptions = {}): Action {\n const size = opts.size ?? DEFAULT_HOP_SIZE;\n return {\n id: SET_HOPS_ACTION_ID,\n label: 'Line jumps',\n icon: /* @icon */ 'diagram:lineJumps',\n group: 'diagram',\n requires: ['scene'],\n invoker: {\n timing: 'immediate',\n run(deps) {\n const doc = deps.scene?.doc;\n doc?.set(HOPS_DOC_KEY, doc.get(HOPS_DOC_KEY) === undefined ? { size } : undefined);\n },\n },\n active: (deps) => deps?.scene?.doc.get(HOPS_DOC_KEY) !== undefined,\n };\n}\n","/**\n * Moving an edge label along and beside its edge.\n *\n * The label layer (`labelDragLayer`) claims the press; this action moves the\n * label. The drag previews the label's own data at the station the pointer\n * proposes, and the pose that data derives, so the preview stands where the\n * commit will.\n */\nimport {\n AUTO_POSE_DESCRIPTOR,\n documentDepOf,\n effectivePose,\n translatePoseViaDescriptor,\n type Action,\n type InvocationCtx,\n type OngoingHandle,\n} from '@weasel-js/core';\nimport type { Path, Vec2 } from '@weasel-js/core/math';\nimport { LABEL_PLACEMENT, diagramLabelOf, type DiagramLabel, type LabelSpot } from './labelTrait';\nimport { labelCenter, labelSpotAt } from './labels/station';\nimport { labelScratchOf } from './labelDragLayer';\n\n/** The action that drags an edge label. */\nexport const MOVE_LABEL_ACTION_ID = 'diagram.moveLabel';\n\n/** A label placed: where it now sits on its edge, or `null` to reset it to {@link LABEL_PLACEMENT}. */\nexport interface LabelEdit {\n labelId: string;\n edgeId: string;\n placement: DiagramLabel | null;\n}\n\n/** Options for {@link createLabelDragAction}. */\nexport interface LabelDragOptions {\n /** Defaults to {@link commitLabelToScene} against `deps.scene`. */\n commit?: (edit: LabelEdit, ctx: InvocationCtx) => void;\n id?: string;\n}\n\nconst placementAt = (spot: LabelSpot): DiagramLabel => ({ at: spot.at, offset: spot.offset, dodge: false });\n\n/** `data` with its label trait set where `placement` says. */\nfunction placedData(data: unknown, placement: DiagramLabel): Record<string, unknown> {\n const record = data as Record<string, unknown>;\n return { ...record, diagram: { ...(record.diagram as Record<string, unknown>), label: placement } };\n}\n\n/** `data` with its label trait at `spot`, owned by the author from now on:\n * placement's `placed` is dropped, and placement won't move it again. */\nexport function movedLabelData(data: unknown, spot: LabelSpot): Record<string, unknown> {\n return placedData(data, placementAt(spot));\n}\n\n/** The default commit: the label's placement in `data.diagram.label`, as one\n * history entry labeled \"Move label\", or \"Reset label\" for a `null` placement. */\nexport function commitLabelToScene(edit: LabelEdit, ctx: InvocationCtx): void {\n const scene = ctx.deps.scene;\n const node = scene?.get(edit.labelId as never);\n if (scene === undefined || node === undefined || diagramLabelOf(node) === null) return;\n const placement = edit.placement ?? LABEL_PLACEMENT;\n scene.batch(edit.placement === null ? 'Reset label' : 'Move label', () => {\n scene.update(node.id, { data: placedData(node.data, placement) as never });\n });\n}\n\n/** What a label drag captured at its press, read-only after. */\ninterface LabelPress {\n labelId: string;\n edgeId: string;\n data: unknown;\n pose: unknown;\n size: { width: number; height: number };\n center: Vec2;\n path: Path;\n /** The label's center less the press point. */\n grab: Vec2;\n deps: InvocationCtx['deps'];\n}\n\nfunction pressOf(ctx: InvocationCtx): LabelPress | null {\n const pressed = labelScratchOf(ctx.drag?.affordance);\n const scene = ctx.deps.scene;\n const node = pressed === null ? undefined : scene?.get(pressed.labelId as never);\n if (pressed === null || scene === undefined || node === undefined || diagramLabelOf(node) === null) return null;\n const path = documentDepOf(scene as never, pressed.edgeId as never)?.path ?? null;\n if (path === null) return null;\n const pose = effectivePose(scene as never, node as never);\n const box = AUTO_POSE_DESCRIPTOR.getBounds(pose);\n const center = { x: box.x + box.width / 2, y: box.y + box.height / 2 };\n const press = ctx.drag?.start ?? { x: ctx.world.x, y: ctx.world.y };\n return {\n labelId: pressed.labelId, edgeId: pressed.edgeId, data: node.data, pose, path, center,\n size: { width: box.width, height: box.height },\n grab: { x: center.x - press.x, y: center.y - press.y },\n deps: ctx.deps,\n };\n}\n\n/** The station the label's center stands at with the pointer at `ctx.world`. */\nconst spotAt = (p: LabelPress, ctx: InvocationCtx): LabelSpot | null =>\n labelSpotAt(p.path, { x: ctx.world.x + p.grab.x, y: ctx.world.y + p.grab.y }, p.size);\n\n/** The press pose moved to where `spot` derives the label's center. */\nfunction poseAt(p: LabelPress, spot: LabelSpot): unknown {\n const c = labelCenter(p.path, placementAt(spot), p.size);\n return c === null ? p.pose : translatePoseViaDescriptor(p.pose, c.x - p.center.x, c.y - p.center.y, AUTO_POSE_DESCRIPTOR);\n}\n\n/** The `diagram.moveLabel` action: an ongoing drag moving one edge label along and beside its edge. */\nexport function createLabelDragAction(opts: LabelDragOptions = {}): Action {\n const { commit = commitLabelToScene } = opts;\n return {\n id: opts.id ?? MOVE_LABEL_ACTION_ID,\n label: 'Move label',\n group: 'diagram',\n requires: ['scene'],\n eligible: { mode: 'normal' },\n invoker: {\n timing: 'ongoing',\n start(ctx: InvocationCtx): OngoingHandle {\n const p = pressOf(ctx);\n if (p === null) return {};\n // Null until the pointer moves, so a still click commits nothing.\n let spot: LabelSpot | null = null;\n let open = true;\n const proposed = () => (open ? spot : null);\n return {\n kind: 'diagram-move-label',\n onMove(moveCtx: InvocationCtx): void {\n spot = spotAt(p, moveCtx);\n },\n previewIds: () => (proposed() === null ? null : [p.labelId]),\n previewPose: (id) => {\n const next = proposed();\n return id === p.labelId && next !== null ? poseAt(p, next) : null;\n },\n previewData: (id) => {\n const next = proposed();\n return id === p.labelId && next !== null ? movedLabelData(p.data, next) : null;\n },\n onEnd(endCtx: InvocationCtx, reason: 'commit' | 'cancel'): void {\n open = false;\n const final = reason === 'commit' && spot !== null ? spotAt(p, endCtx) ?? spot : null;\n if (final !== null) {\n commit({ labelId: p.labelId, edgeId: p.edgeId, placement: placementAt(final) }, { ...endCtx, deps: p.deps });\n }\n },\n };\n },\n },\n enabled: () => true as const,\n };\n}\n","/**\n * The label edit that is not a drag: the Reset label command.\n */\nimport { ActionDisabledReason, type Action, type InvocationCtx, type Scene } from '@weasel-js/core';\nimport { commitLabelToScene, type LabelEdit } from './labelDragAction';\nimport { editableLabels } from './labelDragLayer';\n\n/** The command that puts the selected edges' dragged labels back where placement puts them. */\nexport const RESET_LABEL_ACTION_ID = 'diagram.resetLabel';\n\nconst NO_MODIFIERS = { alt: false, shift: false, meta: false, ctrl: false };\n\n/** The labels on `selected` edges that a drag has pinned (`dodge: false`) and an edit may touch. */\nfunction draggedLabels(scene: Scene<unknown, string, unknown> | undefined, selected: readonly string[]): LabelEdit[] {\n if (scene === undefined || selected.length === 0) return [];\n const out: LabelEdit[] = [];\n for (const { labelId, edgeId, label } of editableLabels(scene, new Set(selected))) {\n if (label.dodge === false) out.push({ labelId, edgeId, placement: null });\n }\n return out;\n}\n\n/** The `diagram.resetLabel` command: sets each selected edge's dragged label\n * back to `LABEL_PLACEMENT`, in one history entry when they commit to the scene. */\nexport function createResetLabelAction(opts: {\n selected: () => readonly string[];\n commit?: (edit: LabelEdit, ctx: InvocationCtx) => void;\n}): Action {\n const { commit = commitLabelToScene } = opts;\n return {\n id: RESET_LABEL_ACTION_ID,\n label: 'Reset label',\n group: 'diagram',\n requires: ['scene'],\n invoker: {\n timing: 'immediate',\n run(deps) {\n const edits = draggedLabels(deps.scene as never, opts.selected());\n const ctx = { world: { x: 0, y: 0 }, modifiers: NO_MODIFIERS, deps } as InvocationCtx;\n const all = () => { for (const edit of edits) commit(edit, ctx); };\n if (deps.scene === undefined) all();\n else deps.scene.batch('Reset label', all);\n },\n },\n enabled: (deps) =>\n draggedLabels(deps?.scene as never, opts.selected()).length > 0 ? true : ActionDisabledReason.NotApplicable,\n };\n}\n","/**\n * The port affordance, composed into a layer and pointed at a scene.\n */\nimport { scenePoseFrame,\n composeAffordanceLayer,\n nodeGates,\n type GatedLayer,\n type RenderLayer,\n} from '@weasel-js/core';\nimport {\n PORT_LAYER_ID,\n createPortAffordance,\n type ParticipantPose,\n type ParticipantSource,\n type PortAffordanceOptions,\n} from './portAffordance';\nimport type { GraphNodeLike } from './graph';\n\n/** The minimum a participant source needs from a scene. Narrower than `Scene`\n * so a consumer can pass anything that answers these. `layers` and each\n * node's `layer`, `parent`, `hidden` and `locked` feed `nodeGates`; a stand-in\n * without them gates nothing. */\nexport interface ParticipantScene<TPose> {\n readonly layers?: readonly GatedLayer[];\n renderOrderNodes(): readonly {\n id: string;\n kind: 'mark' | 'group';\n layer?: string;\n parent?: string | null;\n hidden?: boolean;\n locked?: boolean;\n data: unknown;\n pose: TPose;\n dependsOn?: readonly string[] | 'children';\n }[];\n readonly overrides: { read(id: string): { pose?: TPose } | undefined; getGeneration?(): number };\n /** With `overrides.getGeneration`, what lets the port layer index the ports. */\n getVersion?(): number;\n get(id: string): unknown;\n childrenOf(id: string): readonly string[];\n}\n\n/**\n * Every node in `scene`, at the pose it is **painted** at, marked `hidden` or\n * `locked` where the scene's `nodeGates` says so, and carrying its `layer` so\n * a view that does not paint that layer can turn its ports away too. The\n * marks keep ports off such a node; the graph reads past them, so a hidden\n * node is still laid out.\n *\n * Its effective pose, in world: 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, or from its pose in its container's frame, sits somewhere the\n * user can see the node is not.\n *\n * One source answers both the ports and the graph. A scene with versions\n * gives it a `generation`, so the port layer hit-tests through an index.\n */\nexport function sceneParticipants<TPose>(\n scene: ParticipantScene<TPose>,\n): ParticipantSource<TPose> & (() => Iterable<ParticipantPose<TPose> & { node: GraphNodeLike }>) {\n const each = function* () {\n const gates = nodeGates(scene as never);\n const frame = scenePoseFrame(scene as never);\n for (const node of scene.renderOrderNodes()) {\n const hidden = gates.hidden(node.id);\n const locked = gates.locked(node.id);\n yield {\n node: node as GraphNodeLike,\n pose: frame.world(node.id as never) as TPose,\n ...(node.layer !== undefined ? { layer: node.layer } : {}),\n ...(hidden ? { hidden } : {}),\n ...(locked ? { locked } : {}),\n };\n }\n };\n const { getVersion } = scene;\n const getGeneration = scene.overrides.getGeneration;\n if (getVersion === undefined || getGeneration === undefined) return each;\n return Object.assign(each, {\n generation: () => [getVersion.call(scene), getGeneration.call(scene.overrides)] as const,\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 * Handles on the ends of a selected edge — what makes an edge's end grabbable,\n * so a drag can carry it onto another shape (`reconnect`).\n *\n * Built the way the port affordance is: point regions with a `null`\n * `targetId` and no `hitKind`, composed into a layer whose id is the kind a\n * press reports. See `portAffordance` for why both matter.\n */\nimport {\n composeAffordanceLayer,\n type Affordance,\n type AffordanceRegion,\n type ChromeState,\n type CommandFill,\n type CommandStroke,\n type CursorSpec,\n type DerivedDep,\n type RenderLayer,\n} from '@weasel-js/core';\nimport type { Vec2 } from '@weasel-js/core/math';\nimport { edgeRouter, type ResolvedRoute, type Router } from './edge';\nimport { diagramEdgeOf, type DiagramEdge } from './edgeTrait';\nimport type { GraphNodeLike } from './graph';\nimport { offersPorts, type ParticipantPose, type ParticipantSource } from './portAffordance';\nimport type { PortsOptions } from './ports';\n\n/** The layer id the edge-end handles are composed into. */\nexport const EDGE_END_LAYER_ID = 'diagram-edge-ends';\n\n/** The affordance kind a press on an edge-end handle reports. */\nexport const EDGE_END_AFFORDANCE_KIND = `layer:${EDGE_END_LAYER_ID}` as const;\n\n/** What a press on an edge-end handle hands the reconnect action, as\n * `InvocationCtx.drag.affordance.payload`. */\nexport interface EdgeEndScratch {\n targetId: string;\n edgeId: string;\n end: 'from' | 'to';\n}\n\n/** Read an edge-end press's scratch back off the hit an action was handed. */\nexport function edgeEndScratchOf(hit: { payload?: unknown } | null | undefined): EdgeEndScratch | null {\n const payload = hit?.payload as EdgeEndScratch | undefined;\n return payload !== undefined && typeof payload.edgeId === 'string'\n && (payload.end === 'from' || payload.end === 'to') ? payload : null;\n}\n\n/** An edge as it stands: its trait, the participants at its two ends, and\n * where its routed path starts and ends. */\nexport interface EdgeEnds<TPose> {\n edge: ParticipantPose<TPose>;\n trait: DiagramEdge;\n from: ParticipantPose<TPose>;\n to: ParticipantPose<TPose>;\n points: { from: Vec2; to: Vec2 };\n /** The route as the edge's own `derivePath` draws it. */\n route: ResolvedRoute;\n}\n\n/** Options shared by the edge-end affordance and the reconnect action. */\nexport interface EdgeEndOptions<TPose> extends PortsOptions<TPose> {\n routers?: Readonly<Record<string, Router>>;\n}\n\n/** Resolves an edge's two ends from `participants`, routed as the edge's own\n * `derivePath` routes it. `null` for a node that is not a drawable edge. */\nexport function createEdgeEnds<TPose>(participants: ParticipantSource<TPose>, opts: EdgeEndOptions<TPose> = {}) {\n const derive = edgeRouter<TPose>({\n ...(opts.geometry ? { geometry: opts.geometry } : {}),\n ...(opts.read ? { read: opts.read } : {}),\n ...(opts.routers ? { routers: opts.routers } : {}),\n });\n return function endsOf(edgeId: string): EdgeEnds<TPose> | null {\n const byId = new Map<string, ParticipantPose<TPose>>();\n for (const p of participants()) byId.set(p.node.id, p);\n const edge = byId.get(edgeId);\n if (edge === undefined) return null;\n const trait = diagramEdgeOf(edge.node);\n const deps = (edge.node as GraphNodeLike).dependsOn;\n if (trait === null || !Array.isArray(deps) || deps.length !== 2) return null;\n const from = byId.get(deps[0]!);\n const to = byId.get(deps[1]!);\n if (from === undefined || to === undefined) return null;\n const dep = (p: ParticipantPose<TPose>) => ({ node: p.node, pose: p.pose }) as unknown as DerivedDep<TPose>;\n const route = derive(edge.node, [dep(from), dep(to)]);\n const p = route?.points;\n if (route === null || p === undefined || p.length < 2) return null;\n return { edge, trait, from, to, points: { from: p[0]!, to: p[p.length - 1]! }, route };\n };\n}\n\n/** Options for {@link createEdgeEndAffordance}. */\nexport interface EdgeEndAffordanceOptions<TPose> extends EdgeEndOptions<TPose> {\n /** Also the chrome-caps visibility id. Default {@link EDGE_END_LAYER_ID}. */\n id?: string;\n /** Screen-pixel hit radius. Default 8. */\n hitRadiusPx?: number;\n /** Screen-pixel side of the painted square. Default 8; 0 paints nothing. */\n sizePx?: number;\n fill?: CommandFill;\n stroke?: CommandStroke;\n cursor?: CursorSpec;\n}\n\nconst DEFAULT_HIT_PX = 8;\nconst DEFAULT_SIZE_PX = 8;\n\n/** The affordance: one point region on each end of each selected edge. */\nexport function createEdgeEndAffordance<TPose>(\n participants: ParticipantSource<TPose>,\n selected: () => readonly string[],\n opts: EdgeEndAffordanceOptions<TPose> = {},\n): Affordance {\n const { id = EDGE_END_LAYER_ID, hitRadiusPx = DEFAULT_HIT_PX, sizePx = DEFAULT_SIZE_PX } = opts;\n const endsOf = createEdgeEnds(participants, opts);\n const look = { ...(opts.fill ? { fill: opts.fill } : {}), ...(opts.stroke ? { stroke: opts.stroke } : {}) };\n const paint = sizePx > 0 ? { paint: { kind: 'square' as const, sizePx, ...look } } : {};\n\n return {\n id,\n regions(state: ChromeState): readonly AffordanceRegion[] {\n const out: AffordanceRegion[] = [];\n for (const edgeId of selected()) {\n const ends = endsOf(edgeId);\n if (ends === null || !offersPorts(ends.edge, state)) continue;\n for (const end of ['from', 'to'] as const) {\n const at = ends.points[end];\n out.push({\n id: `${edgeId}:${end}`,\n targetId: null,\n shape: { kind: 'point', x: at.x, y: at.y, hitRadiusPx },\n ...paint,\n ...(opts.cursor !== undefined ? { cursor: opts.cursor } : {}),\n strength: 'exclusive',\n claimedKinds: ['pointer'],\n bind: () => ({ initialScratch: { targetId: edgeId, edgeId, end } satisfies EdgeEndScratch }),\n });\n }\n }\n return out;\n },\n };\n}\n\n/** The composed layer, for `CanvasExtensionApi.registerLayer`. Register it\n * after the port layer: the last-registered layer is hit first, and an edge's\n * end sits on a port. */\nexport function edgeEndLayer<TPose>(\n participants: ParticipantSource<TPose>,\n selected: () => readonly string[],\n opts: EdgeEndAffordanceOptions<TPose> = {},\n): RenderLayer<unknown> {\n return composeAffordanceLayer(\n opts.id ?? EDGE_END_LAYER_ID,\n 'Diagram edge ends',\n [createEdgeEndAffordance(participants, selected, opts)],\n ) as unknown as RenderLayer<unknown>;\n}\n","/**\n * Waypoint editing as pure math on an edge's route.\n *\n * The **stops** are the points a route must pass through: its `from` end, the\n * author's waypoints, and its `to` end. The **drawn** route is what the router\n * made of them. Every shipped router passes through each stop exactly, so the\n * drawn polyline splits at the stops and a leg's middle is found on it.\n *\n * Each edit answers the edge's new waypoints, never the whole route.\n */\nimport type { Vec2 } from '@weasel-js/core/math';\nimport { avoid, orthogonal, type Router } from './edge';\nimport { simplifyStops } from './polyline';\n\nexport { simplifyStops };\n\n/** A handle a selected edge shows along its route. `at` is where it sits, in world units. */\nexport type RouteHandle =\n /** Waypoint `index`: dragging moves it. */\n | { kind: 'vertex'; index: number; at: Vec2 }\n /** The middle of leg `leg`, between stops `leg` and `leg + 1`: dragging inserts a waypoint there. */\n | { kind: 'insert'; leg: number; at: Vec2 }\n /** Segment `index` of an orthogonal route, which runs along `axis`: dragging slides it across. */\n | { kind: 'segment'; index: number; axis: 'x' | 'y'; at: Vec2 };\n\nconst EPS = 1e-6;\n/** World units a jog stands off from the port it keeps square. */\nconst JOG = 16;\n\nconst same = (a: Vec2, b: Vec2) => Math.abs(a.x - b.x) <= EPS && Math.abs(a.y - b.y) <= EPS;\n\n/** The axis a segment runs along, or null when it is a point or slanted. */\nexport function segmentAxis(a: Vec2, b: Vec2): 'x' | 'y' | null {\n if (same(a, b)) return null;\n if (Math.abs(a.y - b.y) <= EPS) return 'x';\n if (Math.abs(a.x - b.x) <= EPS) return 'y';\n return null;\n}\n\n/** Index in `drawn` of each stop, found in order; null when one is not on it. */\nfunction stopIndices(drawn: readonly Vec2[], stops: readonly Vec2[]): number[] | null {\n const out: number[] = [];\n let from = 0;\n for (const stop of stops) {\n let i = from;\n while (i < drawn.length && !same(drawn[i]!, stop)) i++;\n if (i === drawn.length) return null;\n out.push(i);\n from = i;\n }\n return out;\n}\n\n/** The point halfway along `drawn` between indices `a` and `b`, by length. */\nfunction middleOf(drawn: readonly Vec2[], a: number, b: number): Vec2 {\n let total = 0;\n for (let i = a; i < b; i++) total += Math.hypot(drawn[i + 1]!.x - drawn[i]!.x, drawn[i + 1]!.y - drawn[i]!.y);\n let left = total / 2;\n for (let i = a; i < b; i++) {\n const p = drawn[i]!;\n const q = drawn[i + 1]!;\n const len = Math.hypot(q.x - p.x, q.y - p.y);\n if (len >= left && len > 0) return { x: p.x + ((q.x - p.x) * left) / len, y: p.y + ((q.y - p.y) * left) / len };\n left -= len;\n }\n return drawn[a]!;\n}\n\n/** The handles an edge shows: a bar per segment under `orthogonal` and\n * `avoid`, else a dot per waypoint and a hollow dot per leg. */\nexport function routeHandles(drawn: readonly Vec2[], stops: readonly Vec2[], router: Router): RouteHandle[] {\n if (router === orthogonal || router === avoid) {\n const out: RouteHandle[] = [];\n for (let i = 0; i + 1 < drawn.length; i++) {\n const a = drawn[i]!;\n const b = drawn[i + 1]!;\n const axis = segmentAxis(a, b);\n if (axis !== null) out.push({ kind: 'segment', index: i, axis, at: { x: (a.x + b.x) / 2, y: (a.y + b.y) / 2 } });\n }\n return out;\n }\n const out: RouteHandle[] = [];\n for (let k = 1; k + 1 < stops.length; k++) out.push({ kind: 'vertex', index: k - 1, at: stops[k]! });\n const at = stopIndices(drawn, stops);\n for (let leg = 0; leg + 1 < stops.length; leg++) {\n const a = stops[leg]!;\n const b = stops[leg + 1]!;\n out.push({\n kind: 'insert', leg,\n at: at === null ? { x: (a.x + b.x) / 2, y: (a.y + b.y) / 2 } : middleOf(drawn, at[leg]!, at[leg + 1]!),\n });\n }\n return out;\n}\n\nconst interior = (stops: readonly Vec2[]): Vec2[] => stops.slice(1, -1).map((p) => ({ x: p.x, y: p.y }));\n\n/** The waypoints with waypoint `index` moved to `to`. */\nexport function dragVertex(stops: readonly Vec2[], index: number, to: Vec2): Vec2[] {\n const out = interior(stops);\n out[index] = { x: to.x, y: to.y };\n return out;\n}\n\n/** The waypoints with one at `at` inserted on leg `leg`: it becomes waypoint `leg`. */\nexport function insertWaypoint(stops: readonly Vec2[], leg: number, at: Vec2): Vec2[] {\n const out = interior(stops);\n out.splice(leg, 0, { x: at.x, y: at.y });\n return out;\n}\n\n/** The waypoints without waypoint `index`. */\nexport function removeWaypoint(stops: readonly Vec2[], index: number): Vec2[] {\n const out = interior(stops);\n out.splice(index, 1);\n return out;\n}\n\nconst shifted = (p: Vec2, axis: 'x' | 'y', offset: number): Vec2 =>\n axis === 'x' ? { x: p.x, y: p.y + offset } : { x: p.x + offset, y: p.y };\n\n/** The point `distance` from `a` toward `b`. */\nfunction toward(a: Vec2, b: Vec2, distance: number): Vec2 {\n const len = Math.hypot(b.x - a.x, b.y - a.y);\n return len === 0 ? a : { x: a.x + ((b.x - a.x) * distance) / len, y: a.y + ((b.y - a.y) * distance) / len };\n}\n\n/**\n * The waypoints of `drawn`, an orthogonal route, with segment `index` slid\n * `offset` across its axis: every interior bend of the new route, since the\n * orthogonal router recomputes elbows between stops. A segment touching a\n * port keeps a short stub there and jogs over, so the port end stays square.\n */\nexport function dragSegment(drawn: readonly Vec2[], index: number, offset: number): Vec2[] {\n const a = drawn[index]!;\n const b = drawn[index + 1]!;\n const axis = segmentAxis(a, b);\n if (axis === null) return interior(drawn);\n const jog = Math.min(JOG, Math.hypot(b.x - a.x, b.y - a.y) / 2);\n const start = index === 0 ? toward(a, b, jog) : null;\n const end = index === drawn.length - 2 ? toward(b, a, jog) : null;\n const route = [\n ...drawn.slice(0, index),\n ...(start === null ? [] : [a, start]),\n shifted(start ?? a, axis, offset),\n shifted(end ?? b, axis, offset),\n ...(end === null ? [] : [end, b]),\n ...drawn.slice(index + 2),\n ];\n return interior(simplifyStops(route));\n}\n\n/**\n * The waypoints of an `avoid` route with segment `index` of `drawn` slid\n * `offset` across its axis and pinned there: its two ends join the author's\n * waypoints, in route order, and the router keeps the rest. A waypoint at one\n * of its ends moves with it, and a segment meeting a port jogs off it so the\n * port end stays square.\n */\nexport function pinSegment(drawn: readonly Vec2[], stops: readonly Vec2[], index: number, offset: number): Vec2[] {\n const a = drawn[index]!;\n const b = drawn[index + 1]!;\n const axis = segmentAxis(a, b);\n const waypoints = interior(stops);\n if (axis === null) return waypoints;\n const jog = Math.min(JOG, Math.hypot(b.x - a.x, b.y - a.y) / 2);\n const start = index === 0 ? toward(a, b, jog) : a;\n const end = index === drawn.length - 2 ? toward(b, a, jog) : b;\n const at = waypoints.map((w) => drawn.findIndex((p) => same(p, w)));\n const before = waypoints.filter((w, k) => at[k]! >= 0 && at[k]! <= index && !same(w, a));\n const after = waypoints.filter((w, k) => (at[k]! < 0 || at[k]! > index) && !same(w, b));\n return [...before, shifted(start, axis, offset), shifted(end, axis, offset), ...after];\n}\n\n/** The waypoints of an `avoid` route without those at either end of segment\n * `index`, which hands the segment back to the router; null when neither end is one. */\nexport function unpinSegment(drawn: readonly Vec2[], stops: readonly Vec2[], index: number): Vec2[] | null {\n const ends = [drawn[index]!, drawn[index + 1]!];\n const waypoints = interior(stops);\n const kept = waypoints.filter((w) => !ends.some((e) => same(e, w)));\n return kept.length === waypoints.length ? null : kept;\n}\n\n/**\n * The waypoints with segment `index` straightened away: its neighbors run in\n * parallel, and the one touching no port slides onto the other's line. Null\n * when it is the first or last segment, or both neighbors touch a port.\n */\nexport function removeSegment(drawn: readonly Vec2[], index: number): Vec2[] | null {\n const last = drawn.length - 2;\n if (index <= 0 || index >= last) return null;\n const axis = segmentAxis(drawn[index]!, drawn[index + 1]!);\n if (axis === null) return null;\n const across = (p: Vec2) => (axis === 'x' ? p.x : p.y);\n const prev = index - 1;\n const next = index + 1;\n if (next < last) return dragSegment(drawn, next, across(drawn[index]!) - across(drawn[index + 1]!));\n if (prev > 0) return dragSegment(drawn, prev, across(drawn[index + 1]!) - across(drawn[index]!));\n return null;\n}\n","/**\n * Handles along a selected edge's route — what makes its waypoints and\n * segments grabbable, so a drag can reshape the route (`waypointAction`).\n *\n * Built the way the edge-end handles are: point regions with a `null`\n * `targetId` and no `hitKind`, composed into a layer whose id is the kind a\n * press reports.\n */\nimport {\n composeAffordanceLayer,\n ellipsePath,\n viewToTransform,\n type Affordance,\n type AffordanceRegion,\n type ChromeState,\n type CommandFill,\n type CommandStroke,\n type CursorSpec,\n type RenderLayer,\n} from '@weasel-js/core';\nimport type { Vec2 } from '@weasel-js/core/math';\nimport { routerOf, type Router } from './edge';\nimport { createEdgeEnds, type EdgeEndOptions, type EdgeEnds } from './edgeEndLayer';\nimport { offersPorts, type ParticipantSource } from './portAffordance';\nimport type { Port } from './types';\nimport { routeHandles, type RouteHandle } from './waypoints';\n\n/** The layer id the route handles are composed into. */\nexport const WAYPOINT_LAYER_ID = 'diagram-waypoints';\n\n/** The affordance kind a press on a route handle reports. */\nexport const WAYPOINT_AFFORDANCE_KIND = `layer:${WAYPOINT_LAYER_ID}` as const;\n\n/** What a press on a route handle hands the route-edit actions, as the hit's `payload`. */\nexport interface WaypointScratch {\n targetId: string;\n edgeId: string;\n handle: RouteHandle;\n}\n\n/** Read a route-handle press's scratch back off the hit an action was handed. */\nexport function waypointScratchOf(hit: { payload?: unknown } | null | undefined): WaypointScratch | null {\n const payload = hit?.payload as WaypointScratch | undefined;\n return payload !== undefined && typeof payload.edgeId === 'string' && typeof payload.handle?.kind === 'string'\n ? payload : null;\n}\n\n/** An edge's route as the handles read it: its resolved ends, its stops, the\n * route drawn through them, the router that drew it, and the handles it shows. */\nexport interface EdgeRouteState {\n from: Port;\n to: Port;\n stops: readonly Vec2[];\n drawn: readonly Vec2[];\n router: Router;\n handles: readonly RouteHandle[];\n}\n\n/** The route state of an edge whose ends `ends` resolved. */\nexport function routeStateOf(ends: EdgeEnds<unknown>, routers?: Readonly<Record<string, Router>>): EdgeRouteState {\n const { route } = ends;\n const stops = [route.from.point, ...route.waypoints, route.to.point];\n const router = routerOf(ends.trait, routers);\n const handles = route.stubs !== undefined ? [] : routeHandles(route.points, stops, router);\n return { from: route.from, to: route.to, stops, drawn: route.points, router, handles };\n}\n\n/** Options for {@link createWaypointAffordance}. */\nexport interface WaypointAffordanceOptions<TPose> extends EdgeEndOptions<TPose> {\n /** Also the chrome-caps visibility id. Default {@link WAYPOINT_LAYER_ID}. */\n id?: string;\n /** Screen-pixel hit radius. Default 7. */\n hitRadiusPx?: number;\n /** Screen-pixel diameter of a waypoint's dot; an insert dot is three\n * quarters of it, and a segment bar twice as long. Default 8; 0 paints nothing. */\n sizePx?: number;\n fill?: CommandFill;\n stroke?: CommandStroke;\n cursor?: CursorSpec;\n}\n\n/** A route handle's default screen-pixel hit radius. */\nexport const WAYPOINT_HIT_PX = 7;\nconst DEFAULT_SIZE_PX = 8;\nconst DEFAULT_FILL: CommandFill = { paint: { kind: 'solid', color: '#ffffff' } };\nconst DEFAULT_STROKE: CommandStroke = { paint: { kind: 'solid', color: '#3b6fd4' }, width: 1.5 };\n\n/** A handle's mark, drawn in screen pixels so it keeps its size at any zoom. */\nfunction paintOf(handle: RouteHandle, sizePx: number, fill: CommandFill, stroke: CommandStroke): AffordanceRegion['paint'] {\n return {\n kind: 'custom',\n draw: ({ world, view }) => {\n const t = viewToTransform(view);\n const cx = t.panX + world.x * t.zoom.x;\n const cy = t.panY + world.y * t.zoom.y;\n if (handle.kind === 'segment') {\n const [w, h] = handle.axis === 'x' ? [sizePx * 2, sizePx / 2] : [sizePx / 2, sizePx * 2];\n return [{ kind: 'path', path: { kind: 'rect', x: cx - w / 2, y: cy - h / 2, width: w, height: h }, fill, stroke }];\n }\n const d = handle.kind === 'vertex' ? sizePx : sizePx * 0.75;\n const path = ellipsePath({ x: cx - d / 2, y: cy - d / 2, width: d, height: d });\n return [handle.kind === 'vertex' ? { kind: 'path', path, fill, stroke } : { kind: 'path', path, stroke }];\n },\n };\n}\n\n/** The affordance: a region on each route handle of each selected edge. */\nexport function createWaypointAffordance<TPose>(\n participants: ParticipantSource<TPose>,\n selected: () => readonly string[],\n opts: WaypointAffordanceOptions<TPose> = {},\n): Affordance {\n const { id = WAYPOINT_LAYER_ID, hitRadiusPx = WAYPOINT_HIT_PX, sizePx = DEFAULT_SIZE_PX } = opts;\n const endsOf = createEdgeEnds(participants, opts);\n const fill = opts.fill ?? DEFAULT_FILL;\n const stroke = opts.stroke ?? DEFAULT_STROKE;\n\n return {\n id,\n regions(state: ChromeState): readonly AffordanceRegion[] {\n const out: AffordanceRegion[] = [];\n for (const edgeId of selected()) {\n const ends = endsOf(edgeId);\n if (ends === null || !offersPorts(ends.edge, state)) continue;\n for (const handle of routeStateOf(ends as EdgeEnds<unknown>, opts.routers).handles) {\n out.push({\n id: `${edgeId}:${handle.kind}:${handle.kind === 'insert' ? handle.leg : handle.index}`,\n targetId: null,\n shape: { kind: 'point', x: handle.at.x, y: handle.at.y, hitRadiusPx },\n ...(sizePx > 0 ? { paint: paintOf(handle, sizePx, fill, stroke) } : {}),\n ...(opts.cursor !== undefined ? { cursor: opts.cursor } : {}),\n strength: 'exclusive',\n claimedKinds: ['pointer'],\n bind: () => ({ initialScratch: { targetId: edgeId, edgeId, handle } satisfies WaypointScratch }),\n });\n }\n }\n return out;\n },\n };\n}\n\n/** The composed layer, for `CanvasExtensionApi.registerLayer`. Register it\n * after the port layer and before the edge-end layer: the last registered is\n * hit first, and an edge's end handle must win over a handle beside it. */\nexport function waypointLayer<TPose>(\n participants: ParticipantSource<TPose>,\n selected: () => readonly string[],\n opts: WaypointAffordanceOptions<TPose> = {},\n): RenderLayer<unknown> {\n return composeAffordanceLayer(\n opts.id ?? WAYPOINT_LAYER_ID,\n 'Diagram waypoints',\n [createWaypointAffordance(participants, selected, opts)],\n ) as unknown as RenderLayer<unknown>;\n}\n","/**\n * The snap targets a route-handle drag brings: the stops beside the dragged\n * point and each end's port axis, which exist only for that drag.\n */\nimport type { SnapSource, SourceCandidate } from '@weasel-js/core';\nimport type { Vec2 } from '@weasel-js/core/math';\nimport type { Port } from './types';\n\n/** Options for {@link routeSnapSource}. */\nexport interface RouteSnapSourceOptions {\n /** Must not collide with a source the canvas asks. */\n id: string;\n /** Points a dragged handle lines up with on either axis. */\n stops: readonly Vec2[];\n /** Ports a dragged handle lines up with along their axis. */\n ports: readonly Port[];\n /** Screen px. */\n reachPx: number;\n}\n\ntype Axis = 'x' | 'y';\n\nconst BOTH: readonly Axis[] = ['x', 'y'];\n/** The direction of the line holding coordinate `axis` fixed. */\nconst ALONG: Record<Axis, Vec2> = { x: { x: 0, y: 1 }, y: { x: 1, y: 0 } };\n\n/** The coordinates a port lines up on: a port facing east or west on y, one\n * facing north or south on x, and one facing nowhere on both. */\nfunction portAxes(port: Port): readonly Axis[] {\n const n = port.normal;\n if (n === null) return BOTH;\n return Math.abs(n.x) >= Math.abs(n.y) ? ['y'] : ['x'];\n}\n\n/** A pointer source for a route drag: a line through each stop on each axis,\n * and through each port along its axis, marked from the target to where the\n * handle lands. */\nexport function routeSnapSource(opts: RouteSnapSourceOptions): SnapSource {\n const targets = [\n ...opts.stops.map((at) => ({ at, axes: BOTH })),\n ...opts.ports.map((p) => ({ at: p.point, axes: portAxes(p) })),\n ];\n return {\n id: opts.id,\n tier: 'target',\n reachPx: opts.reachPx,\n roles: ['pointer'],\n gestures: ['point'],\n *collect(q): Iterable<SourceCandidate> {\n const reach = q.reachWorld(q.reachPx);\n for (const p of q.probes) {\n for (const t of targets) {\n for (const axis of t.axes) {\n if (Math.abs(p.at[axis] - t.at[axis]) > reach) continue;\n yield {\n probe: p.id,\n locus: { at: { ...p.at, [axis]: t.at[axis] }, dirs: [ALONG[axis]] },\n mark: (delta) => ({\n kind: 'line',\n from: t.at,\n to: { x: p.at.x - q.delta0.x + delta.x, y: p.at.y - q.delta0.y + delta.y },\n }),\n };\n }\n }\n }\n },\n };\n}\n","/**\n * Route editing — dragging a selected edge's waypoints and segments.\n *\n * The route handles (`waypointLayer`) claim the press; this action reshapes\n * the route. The drag previews the edge's own data with the new waypoints,\n * so its `derivePath` draws the preview exactly as the commit will.\n */\nimport { SNAP_ROLES, snapMods, type Action, type InvocationCtx, type OngoingHandle, type SnapSession } from '@weasel-js/core';\nimport type { Vec2 } from '@weasel-js/core/math';\nimport { createEdgeEnds, type EdgeEndOptions } from './edgeEndLayer';\nimport { diagramEdgeOf, samePoints, type DiagramEdge } from './edgeTrait';\nimport type { ParticipantSource } from './portAffordance';\nimport { routeSnapSource } from './routeSnapSource';\nimport { routeStateOf, waypointScratchOf, type EdgeRouteState } from './waypointLayer';\nimport { avoid } from './edge';\nimport { dragSegment, dragVertex, insertWaypoint, pinSegment, type RouteHandle } from './waypoints';\n\n/** The action that drags a route handle. */\nexport const ROUTE_EDIT_ACTION_ID = 'diagram.editRoute';\n\n/** An edge's route edited: its waypoints as they now stand. */\nexport interface RouteEdit {\n edgeId: string;\n waypoints: readonly Vec2[];\n}\n\n/** Options for the route-editing actions: the drag, the double-click that removes, and Reset route. */\nexport interface RouteEditOptions<TPose> extends EdgeEndOptions<TPose> {\n participants: ParticipantSource<TPose>;\n /** The selected edge ids, whose routes show handles. */\n selected: () => readonly string[];\n /** Screen pixels within which a dragged handle lines up with a neighbor\n * or a port's axis. Default 6. */\n snapPx?: number;\n /** Screen-pixel reach of a handle, as the handle layer's `hitRadiusPx`. Default 7. */\n hitRadiusPx?: number;\n /** Defaults to {@link commitRouteToScene} against `deps.scene`. */\n commit?: (edit: RouteEdit, ctx: InvocationCtx) => void;\n id?: string;\n}\n\nconst DEFAULT_SNAP_PX = 6;\n\n/** The id of the snap source each route drag brings. */\nconst ROUTE_SNAP_ID = 'diagram-route';\n\n/** `data` with its edge trait routed through `waypoints`: owned by the author\n * from now on, so layout's mark is dropped, and no waypoints at all when there are none. */\nexport function routedData(data: unknown, trait: DiagramEdge, waypoints: readonly Vec2[]): Record<string, unknown> {\n const { waypoints: _w, laidOut: _l, ...rest } = trait;\n return { ...(data as Record<string, unknown>), diagram: waypoints.length > 0 ? { ...rest, waypoints } : rest };\n}\n\n/** The default commit: the edge's new waypoints in `data.diagram`, as one history entry labeled \"Edit route\". */\nexport function commitRouteToScene(edit: RouteEdit, ctx: InvocationCtx): void {\n const scene = ctx.deps.scene;\n const node = scene?.get(edit.edgeId as never);\n const trait = node === undefined ? null : diagramEdgeOf(node);\n if (scene === undefined || node === undefined || trait === null) return;\n scene.batch('Edit route', () => {\n scene.update(node.id, { data: routedData(node.data, trait, edit.waypoints) as never });\n });\n}\n\n/** What a route drag captured at its press, read-only after. */\ninterface RoutePress {\n edgeId: string;\n handle: RouteHandle;\n route: EdgeRouteState;\n trait: DiagramEdge;\n data: unknown;\n pose: unknown;\n press: Vec2;\n deps: InvocationCtx['deps'];\n}\n\n/** The snap session for dragging `handle`, whose point is its probe: a\n * segment held to the axis it slides across, a bend free to turn. */\nfunction beginSnap(ctx: InvocationCtx, p: RoutePress, reachPx: number): SnapSession | null {\n const { handle, route } = p;\n const segment = handle.kind === 'segment';\n const stops = segment\n ? route.drawn.filter((_, i) => i !== handle.index && i !== handle.index + 1)\n : neighborsOf(handle, route.stops);\n const source = routeSnapSource({ id: ROUTE_SNAP_ID, stops, ports: segment ? [] : [route.from, route.to], reachPx });\n return ctx.deps.snap?.begin({\n gesture: 'point',\n press: handle.at,\n ids: [p.edgeId],\n omit: ['path-snap'],\n sources: [source],\n ...(segment ? { handle: handle.axis === 'x' ? { x: 'free', y: 'min' } : { x: 'min', y: 'free' } } : { constrain: 'axis' }),\n }) ?? null;\n}\n\n/** The stops either side of a dragged bend or of the leg a bend is inserted in. */\nfunction neighborsOf(handle: Exclude<RouteHandle, { kind: 'segment' }>, stops: readonly Vec2[]): Vec2[] {\n const at = handle.kind === 'vertex' ? handle.index + 1 : handle.leg + 1;\n return [stops[at - 1]!, stops[handle.kind === 'vertex' ? at + 1 : at]!];\n}\n\n/** How far the handle moves with the pointer at `ctx.world`, snapped through `session`. */\nfunction moveOf(p: RoutePress, session: SnapSession | null, ctx: InvocationCtx): Vec2 {\n const d = { x: ctx.world.x - p.press.x, y: ctx.world.y - p.press.y };\n if (session === null) return d;\n const at = session.at({ x: p.handle.at.x + d.x, y: p.handle.at.y + d.y }, snapMods(ctx)).point;\n return { x: at.x - p.handle.at.x, y: at.y - p.handle.at.y };\n}\n\n/** The waypoints the handle proposes moved by `d`, or null for none. A\n * segment reads only the axis it slides across. */\nfunction waypointsAt(p: RoutePress, d: Vec2): readonly Vec2[] | null {\n if (d.x === 0 && d.y === 0) return null;\n const { handle, route } = p;\n let next: Vec2[];\n if (handle.kind === 'segment') {\n const across = handle.axis === 'x' ? 'y' : 'x';\n const offset = d[across];\n next = route.router === avoid\n ? pinSegment(route.drawn, route.stops, handle.index, offset)\n : dragSegment(route.drawn, handle.index, offset);\n } else {\n const point = { x: handle.at.x + d.x, y: handle.at.y + d.y };\n next = handle.kind === 'vertex' ? dragVertex(route.stops, handle.index, point) : insertWaypoint(route.stops, handle.leg, point);\n }\n return samePoints(next, p.trait.waypoints ?? []) ? null : next;\n}\n\n/** The `diagram.editRoute` action: an ongoing drag reshaping one edge's route. */\nexport function createRouteEditAction<TPose>(opts: RouteEditOptions<TPose>): Action {\n const { commit = commitRouteToScene, snapPx = DEFAULT_SNAP_PX } = opts;\n const endsOf = createEdgeEnds(opts.participants, opts);\n return {\n id: opts.id ?? ROUTE_EDIT_ACTION_ID,\n label: 'Edit route',\n group: 'diagram',\n requires: ['scene', 'view', 'snap'],\n modifierRoles: SNAP_ROLES,\n invoker: {\n timing: 'ongoing',\n start(ctx: InvocationCtx): OngoingHandle {\n const pressed = waypointScratchOf(ctx.drag?.affordance);\n const ends = pressed === null ? null : endsOf(pressed.edgeId);\n if (pressed === null || ends === null) return {};\n const p: RoutePress = {\n edgeId: pressed.edgeId,\n handle: pressed.handle,\n route: routeStateOf(ends as never, opts.routers),\n trait: ends.trait,\n data: ends.edge.node.data,\n pose: ends.edge.pose,\n press: ctx.drag?.start ?? { x: ctx.world.x, y: ctx.world.y },\n deps: ctx.deps,\n };\n const session = beginSnap(ctx, p, snapPx);\n let waypoints: readonly Vec2[] | null = null;\n let open = true;\n const proposed = () => (open ? waypoints : null);\n return {\n kind: 'diagram-edit-route',\n onMove(moveCtx: InvocationCtx): void {\n waypoints = waypointsAt(p, moveOf(p, session, moveCtx));\n },\n previewIds: () => (proposed() === null ? null : [p.edgeId]),\n previewPose: (id) => (id === p.edgeId && proposed() !== null ? p.pose : null),\n previewData: (id) => {\n const next = proposed();\n return id === p.edgeId && next !== null ? routedData(p.data, p.trait, next) : null;\n },\n onEnd(endCtx: InvocationCtx, reason: 'commit' | 'cancel'): void {\n open = false;\n const final = reason === 'commit' ? waypointsAt(p, moveOf(p, session, endCtx)) : null;\n session?.end();\n if (final !== null) commit({ edgeId: p.edgeId, waypoints: final }, { ...endCtx, deps: p.deps });\n },\n };\n },\n },\n enabled: () => true as const,\n };\n}\n","/**\n * The route edits that are not drags: a double-click on a route handle, and\n * the Reset route command.\n */\nimport { ActionDisabledReason, type Action, type ActionDeps, type InvocationCtx } from '@weasel-js/core';\nimport type { Vec2 } from '@weasel-js/core/math';\nimport { createEdgeEnds } from './edgeEndLayer';\nimport { diagramEdgeOf } from './edgeTrait';\nimport { commitRouteToScene, type RouteEdit, type RouteEditOptions } from './waypointAction';\nimport { WAYPOINT_HIT_PX, routeStateOf, waypointScratchOf, type EdgeRouteState } from './waypointLayer';\nimport { avoid } from './edge';\nimport { removeSegment, removeWaypoint, unpinSegment, type RouteHandle } from './waypoints';\nimport type { ImmediateParams } from '@weasel-js/core';\n\n/** The action that removes a waypoint, straightens a segment, or unpins an\n * `avoid` connector's segment, on a double-click of its handle. */\nexport const REMOVE_WAYPOINT_ACTION_ID = 'diagram.removeWaypoint';\n/** The command that clears the selected edges' waypoints. */\nexport const RESET_ROUTE_ACTION_ID = 'diagram.resetRoute';\n\nconst NO_MODIFIERS = { alt: false, shift: false, meta: false, ctrl: false };\n\n/** The waypoints left once `handle` is double-clicked away; null where it removes nothing. */\nfunction removalOf(route: EdgeRouteState, handle: RouteHandle): Vec2[] | null {\n if (handle.kind === 'vertex') return removeWaypoint(route.stops, handle.index);\n if (handle.kind === 'segment') {\n return route.router === avoid ? unpinSegment(route.drawn, route.stops, handle.index) : removeSegment(route.drawn, handle.index);\n }\n return null;\n}\n\n/** The `diagram.removeWaypoint` action: a double-click on a waypoint's dot\n * removes it, and on a segment's bar straightens that jog away. Where it\n * would remove nothing it declines, so the double-click reaches whatever is\n * under the handle, an edge's label editing among them. */\nexport function createRemoveWaypointAction<TPose>(opts: RouteEditOptions<TPose>): Action {\n const { commit = commitRouteToScene, hitRadiusPx = WAYPOINT_HIT_PX } = opts;\n const endsOf = createEdgeEnds(opts.participants, opts);\n const routeOf = (edgeId: string) => {\n const ends = endsOf(edgeId);\n return ends === null ? null : routeStateOf(ends as never, opts.routers);\n };\n /** The removal a double-click at `at` makes, read off the handles as the layer places them. */\n const removalAt = (deps: ActionDeps | undefined, at: Vec2): RouteEdit | null => {\n const reach = hitRadiusPx / Math.abs(deps?.view?.get().scale.x || 1);\n for (const edgeId of opts.selected()) {\n const route = routeOf(edgeId);\n for (const handle of route?.handles ?? []) {\n if (Math.max(Math.abs(handle.at.x - at.x), Math.abs(handle.at.y - at.y)) > reach) continue;\n const waypoints = removalOf(route!, handle);\n if (waypoints !== null) return { edgeId, waypoints };\n }\n }\n return null;\n };\n return {\n id: REMOVE_WAYPOINT_ACTION_ID,\n label: 'Remove waypoint',\n group: 'diagram',\n requires: ['scene', 'view'],\n invoker: {\n timing: 'immediate',\n run(deps, params) {\n const p = params as ImmediateParams | undefined;\n const world = p?.world;\n if (!world) return;\n const pressed = waypointScratchOf(p.affordance as { payload?: unknown } | undefined);\n const route = pressed === null ? null : routeOf(pressed.edgeId);\n const waypoints = pressed === null || route === null ? null : removalOf(route, pressed.handle);\n const edit = pressed !== null && waypoints !== null ? { edgeId: pressed.edgeId, waypoints } : removalAt(deps, world);\n if (edit !== null) commit(edit, { world, modifiers: NO_MODIFIERS, deps } as InvocationCtx);\n },\n },\n enabled: (deps, at) => (at !== undefined && removalAt(deps, at) !== null ? true : ActionDisabledReason.NotApplicable),\n };\n}\n\n/** The selected edges that have waypoints of their own. */\nfunction routedEdges<TPose>(opts: RouteEditOptions<TPose>): string[] {\n const ids = new Set(opts.selected());\n if (ids.size === 0) return [];\n const out: string[] = [];\n for (const { node } of opts.participants()) {\n if (ids.has(node.id) && (diagramEdgeOf(node)?.waypoints ?? []).length > 0) out.push(node.id);\n }\n return out;\n}\n\n/** The `diagram.resetRoute` command: clears the selected edges' waypoints,\n * in one history entry when they commit to the scene. */\nexport function createResetRouteAction<TPose>(opts: RouteEditOptions<TPose>): Action {\n const { commit = commitRouteToScene } = opts;\n return {\n id: RESET_ROUTE_ACTION_ID,\n label: 'Reset route',\n group: 'diagram',\n requires: ['scene'],\n invoker: {\n timing: 'immediate',\n run(deps) {\n const edges = routedEdges(opts);\n const ctx = { world: { x: 0, y: 0 }, modifiers: NO_MODIFIERS, deps } as InvocationCtx;\n const all = () => { for (const edgeId of edges) commit({ edgeId, waypoints: [] }, ctx); };\n if (deps.scene === undefined) all();\n else deps.scene.batch('Reset route', all);\n },\n },\n enabled: () => (routedEdges(opts).length > 0 ? true : ActionDisabledReason.NotApplicable),\n };\n}\n","/**\n * The commands that set the selected connectors' router: Around shapes,\n * Orthogonal, Straight, and Curved. Leaving `avoid` drops the stored route;\n * joining it leaves the route to the edit pass `useAvoidRouting` installs,\n * which routes the connectors in the same history entry.\n */\nimport { ActionDisabledReason, type Action, type InvocationCtx } from '@weasel-js/core';\nimport { diagramEdgeOf, type DiagramEdge } from './edgeTrait';\nimport { icon } from './icons.gen';\nimport type { ParticipantSource } from './portAffordance';\n\n/** The router commands' ids, by router key. */\nexport const SET_ROUTER_ACTION_IDS = {\n avoid: 'diagram.router.avoid',\n orthogonal: 'diagram.router.orthogonal',\n straight: 'diagram.router.straight',\n bezier: 'diagram.router.bezier',\n} as const;\n\n/** Each shipped router's name in a menu. */\nexport const ROUTER_LABELS: Readonly<Record<keyof typeof SET_ROUTER_ACTION_IDS, string>> = {\n avoid: 'Around shapes',\n orthogonal: 'Orthogonal',\n straight: 'Straight',\n bezier: 'Curved',\n};\n\nconst ROUTER_ICONS = {\n avoid: /* @icon */ 'diagram:routerAvoid',\n orthogonal: /* @icon */ 'diagram:routerOrthogonal',\n straight: /* @icon */ 'diagram:routerStraight',\n bezier: /* @icon */ 'diagram:routerCurved',\n} as const;\n\n/** One connector's router changed. */\nexport interface RouterEdit {\n edgeId: string;\n router: string;\n}\n\n/** Options for {@link createSetRouterAction}. */\nexport interface SetRouterOptions<TPose> {\n participants: ParticipantSource<TPose>;\n /** The selected ids; the connectors among them are set. */\n selected: () => readonly string[];\n /** Defaults to {@link commitRouterToScene} against `deps.scene`. */\n commit?: (edit: RouterEdit, ctx: InvocationCtx) => void;\n}\n\n/** `data` with its edge trait on `router`, its stored route dropped. */\nexport function withRouter(data: unknown, trait: DiagramEdge, router: string): Record<string, unknown> {\n const { route: _r, ...rest } = trait;\n return { ...(data as Record<string, unknown>), diagram: { ...rest, router } };\n}\n\n/** The default commit: the connector's `data.diagram.router`, written to the scene. */\nexport function commitRouterToScene(edit: RouterEdit, ctx: InvocationCtx): void {\n const scene = ctx.deps.scene;\n const node = scene?.get(edit.edgeId as never);\n const trait = node === undefined ? null : diagramEdgeOf(node);\n if (scene === undefined || node === undefined || trait === null) return;\n scene.update(node.id, { data: withRouter(node.data, trait, edit.router) as never });\n}\n\n/** The selected connectors, and the router each names. */\nfunction selectedEdges<TPose>(opts: SetRouterOptions<TPose>): { id: string; router: string }[] {\n const ids = new Set(opts.selected());\n if (ids.size === 0) return [];\n const out: { id: string; router: string }[] = [];\n for (const { node } of opts.participants()) {\n const trait = ids.has(node.id) ? diagramEdgeOf(node) : null;\n if (trait !== null) out.push({ id: node.id, router: trait.router ?? 'straight' });\n }\n return out;\n}\n\nconst NO_MODIFIERS = { alt: false, shift: false, meta: false, ctrl: false };\n\n/** The command that puts the selected connectors on `router`, in one history\n * entry. Active while every selected connector is on it already. */\nexport function createSetRouterAction<TPose>(router: keyof typeof SET_ROUTER_ACTION_IDS, opts: SetRouterOptions<TPose>): Action {\n const { commit = commitRouterToScene } = opts;\n return {\n id: SET_ROUTER_ACTION_IDS[router],\n label: ROUTER_LABELS[router],\n icon: ROUTER_ICONS[router],\n group: 'diagram',\n requires: ['scene'],\n invoker: {\n timing: 'immediate',\n run(deps) {\n const edges = selectedEdges(opts).filter((e) => e.router !== router);\n const ctx = { world: { x: 0, y: 0 }, modifiers: NO_MODIFIERS, deps } as InvocationCtx;\n const all = () => { for (const e of edges) commit({ edgeId: e.id, router }, ctx); };\n if (deps.scene === undefined) all();\n else deps.scene.batch(`Route ${ROUTER_LABELS[router].toLowerCase()}`, all);\n },\n },\n enabled: () => (selectedEdges(opts).length > 0 ? true : ActionDisabledReason.NotApplicable),\n active: () => {\n const edges = selectedEdges(opts);\n return edges.length > 0 && edges.every((e) => e.router === router);\n },\n };\n}\n\n/** One command per shipped router, in menu order. */\nexport function routerActions<TPose>(opts: SetRouterOptions<TPose>): Action[] {\n return (Object.keys(SET_ROUTER_ACTION_IDS) as (keyof typeof SET_ROUTER_ACTION_IDS)[]).map((r) => createSetRouterAction(r, opts));\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 {\n ActionDisabledReason,\n type Action,\n type Contribution,\n type CursorSpec,\n type NodeId,\n type RenderLayer,\n type Scene,\n} from '@weasel-js/core';\nimport {\n CONNECT_ACTION_ID,\n connectBinding,\n createConnectAction,\n grabPortAction,\n grabPortBindings,\n type ConnectActionOptions,\n} from './connect';\nimport { EDIT_EDGE_LABEL_ACTION_ID } from './edgeLabel';\nimport { createSetHopsAction } from './hops/hopsAction';\nimport { createResetLabelAction } from './labelCommands';\nimport { MOVE_LABEL_ACTION_ID, createLabelDragAction, type LabelDragOptions } from './labelDragAction';\nimport { LABEL_DRAG_AFFORDANCE_KIND, labelDragLayer, labelScratchOf } from './labelDragLayer';\nimport { portLayer } from './portLayer';\nimport type { PortAffordanceOptions } from './portAffordance';\nimport { REMOVE_WAYPOINT_ACTION_ID, createRemoveWaypointAction, createResetRouteAction } from './routeCommands';\nimport { routerActions } from './routerCommands';\nimport { ROUTE_EDIT_ACTION_ID, createRouteEditAction, type RouteEditOptions } from './waypointAction';\nimport {\n WAYPOINT_AFFORDANCE_KIND,\n WAYPOINT_LAYER_ID,\n waypointLayer,\n type WaypointAffordanceOptions,\n} from './waypointLayer';\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/** The action id that absorbs the rest of a press on a route handle. */\nexport const GRAB_WAYPOINT_ACTION_ID = 'diagram.grabWaypoint';\n\n/**\n * Both halves of route editing: the handle layer to `registerLayer` — after\n * the port layer and before the edge-end layer, so an end handle wins over a\n * route handle beside it — and the contribution to pass as `ambient`, which\n * carries the drag, the double-click that removes, the\n * `diagram.resetRoute` command, the commands that set the selected\n * connectors' router (`SET_ROUTER_ACTION_IDS`), and the line jumps toggle\n * (`SET_HOPS_ACTION_ID`). Like `diagramPorts`, one without the other\n * fails quietly.\n */\nexport function diagramWaypoints<TPose>(\n opts: RouteEditOptions<TPose> & Omit<WaypointAffordanceOptions<TPose>, 'id'>,\n): { layer: RenderLayer<unknown>; contribution: Contribution } {\n const actionId = opts.id ?? ROUTE_EDIT_ACTION_ID;\n const target = `affordance:${WAYPOINT_AFFORDANCE_KIND}` as const;\n return {\n // `opts.id` names the drag action; the layer keeps its own id.\n layer: waypointLayer(opts.participants, opts.selected, { ...opts, id: WAYPOINT_LAYER_ID }),\n contribution: {\n id: 'weasel-diagram-waypoints',\n eligibility: { claimed: true },\n actions: [\n createRouteEditAction({ ...opts, id: actionId }),\n createRemoveWaypointAction(opts),\n createResetRouteAction(opts),\n ...routerActions({ participants: opts.participants, selected: opts.selected }),\n createSetHopsAction(),\n grabPortAction(GRAB_WAYPOINT_ACTION_ID),\n ],\n bindings: [\n { spec: { kind: 'drag', target }, actionId, opts: { id: 'weasel-diagram-waypoints.drag' } },\n { spec: { kind: 'doubleClick', target }, actionId: REMOVE_WAYPOINT_ACTION_ID, opts: { id: 'weasel-diagram-waypoints.doubleClick' } },\n ...grabPortBindings(GRAB_WAYPOINT_ACTION_ID, WAYPOINT_AFFORDANCE_KIND),\n ],\n },\n };\n}\n\n/** The action id that absorbs a press on an edge label, so it reaches neither marquee nor pan. */\nexport const GRAB_LABEL_ACTION_ID = 'diagram.grabLabel';\n\n/** The action id that selects a clicked label's edge. */\nexport const SELECT_LABEL_EDGE_ACTION_ID = 'diagram.selectLabelEdge';\n\nconst NO_MODIFIERS = { shift: false, meta: false, ctrl: false };\nconst ANY_MODIFIERS = { shift: 'optional', meta: 'optional', ctrl: 'optional', alt: 'optional' } as const;\n\nfunction selectLabelEdgeAction(): Action {\n return {\n id: SELECT_LABEL_EDGE_ACTION_ID,\n label: 'Select label edge',\n group: 'diagram',\n requires: ['selection'],\n invoker: {\n timing: 'immediate',\n run(deps, params) {\n const p = params as { affordance?: { payload?: unknown }; mods?: { shift: boolean; meta: boolean; ctrl: boolean } } | undefined;\n const pressed = labelScratchOf(p?.affordance);\n if (pressed !== null) deps.selection?.applyClick(pressed.edgeId as NodeId, p?.mods ?? NO_MODIFIERS);\n },\n },\n enabled: (deps) => (deps?.selection !== undefined ? true : ActionDisabledReason.NotApplicable),\n };\n}\n\n/**\n * Both halves of label dragging: the label layer to `registerLayer` — before\n * the port layer, so a port or a route handle wins over a label beside it —\n * and the contribution to pass as `ambient`, which carries the drag\n * (`diagram.moveLabel`), a click that selects the label's edge, and a\n * double-click that edits the label's text through\n * `EDIT_EDGE_LABEL_ACTION_ID`, which the host registers. Like `diagramPorts`,\n * one without the other fails quietly.\n */\nexport function diagramLabelDrag(\n opts: LabelDragOptions & { scene: Scene<unknown, string, unknown>; selected: () => readonly string[]; cursor?: CursorSpec },\n): { layer: RenderLayer<unknown>; contribution: Contribution } {\n const actionId = opts.id ?? MOVE_LABEL_ACTION_ID;\n const target = `affordance:${LABEL_DRAG_AFFORDANCE_KIND}` as const;\n return {\n layer: labelDragLayer(opts.scene, opts.cursor !== undefined ? { cursor: opts.cursor } : {}),\n contribution: {\n id: 'weasel-diagram-label-drag',\n eligibility: { claimed: true },\n actions: [\n createLabelDragAction({ ...opts, id: actionId }),\n createResetLabelAction({ selected: opts.selected, ...(opts.commit ? { commit: opts.commit } : {}) }),\n grabPortAction(GRAB_LABEL_ACTION_ID),\n selectLabelEdgeAction(),\n ],\n bindings: [\n { spec: { kind: 'drag', target }, actionId, opts: { id: 'weasel-diagram-label-drag.drag' } },\n { spec: { kind: 'pointerDown', target }, actionId: GRAB_LABEL_ACTION_ID, opts: { id: 'weasel-diagram-label-drag.pointerDown' } },\n { spec: { kind: 'click', target, mods: ANY_MODIFIERS }, actionId: SELECT_LABEL_EDGE_ACTION_ID, opts: { id: 'weasel-diagram-label-drag.click' } },\n { spec: { kind: 'doubleClick', target }, actionId: EDIT_EDGE_LABEL_ACTION_ID, opts: { id: 'weasel-diagram-label-drag.doubleClick' } },\n ],\n },\n };\n}\n","/**\n * A diagram scene as the avoid router reads it: every participant, container,\n * pool, group box, and header as an obstacle, and every `avoid` connector not\n * split across pages, with the ports each end may use and its label. A split\n * connector's label, on its first stub, is an obstacle of its own.\n */\nimport { composeWorldPose, scenePoseAdapter,\n AUTO_POSE_DESCRIPTOR,\n type PoseDescriptor,\n type Scene,\n} from '@weasel-js/core';\nimport type { Vec2 } from '@weasel-js/core/math';\nimport { diagramContainerOf, headerBox } from '../containers/trait';\nimport { diagramEdgeOf } from '../edgeTrait';\nimport { diagramGroupOf } from '../group';\nimport { diagramLabelOf } from '../labelTrait';\nimport { portSitesOf, portsOf, type PortsOptions } from '../ports';\nimport { diagramNodeOf } from '../trait';\nimport type { Port } from '../types';\nimport type { AvoidEdge, AvoidInput, AvoidLabel, AvoidObstacle, AvoidPort } from './types';\n\n/** How a scene is read for routing. */\nexport interface AvoidSceneOptions<TPose> extends PortsOptions<TPose> {\n /** The router key whose connectors are routed. Default `'avoid'`. */\n routerKey?: string;\n}\n\ntype AnyScene = Scene<unknown, string, unknown>;\ntype SceneNode = ReturnType<AnyScene['renderOrderNodes']>[number];\n\n/** The id of a container's header obstacle. */\nexport const headerIdOf = (id: string): string => `${id}/header`;\n\nconst facingPorts = (ports: readonly Port[]): AvoidPort[] =>\n ports.flatMap((p) => (p.normal === null ? [] : [{ point: p.point, normal: p.normal }]));\n\n/** Every id under `node`, at any depth: its children, or what a derived group box holds. */\nfunction members(scene: AnyScene, node: SceneNode, into: Set<string>): Set<string> {\n const under = Array.isArray(node.dependsOn) && diagramGroupOf(node) !== null ? node.dependsOn : scene.childrenOf(node.id as never);\n for (const id of under) {\n if (into.has(id)) continue;\n into.add(id);\n const child = scene.get(id as never);\n if (child !== undefined) members(scene, child, into);\n }\n return into;\n}\n\n/**\n * What the router reads off `scene`: its obstacles and its `avoid` connectors,\n * each node at the pose `poseOf` gives it, else the one the document holds.\n */\nexport function avoidSceneInput<TPose>(\n scene: Scene<unknown, string, TPose>,\n opts: AvoidSceneOptions<TPose> = {},\n poseOf?: (id: string) => TPose | undefined,\n): AvoidInput {\n const sc = scene as unknown as AnyScene;\n const geometry = opts.geometry ?? (AUTO_POSE_DESCRIPTOR as PoseDescriptor<TPose>);\n const portOpts: PortsOptions<TPose> = { geometry, ...(opts.read ? { read: opts.read } : {}) };\n const key = opts.routerKey ?? 'avoid';\n const poses = new Map<string, TPose>();\n const pose = (node: SceneNode): TPose => {\n let p = poses.get(node.id);\n if (p === undefined) {\n p = poseOf?.(node.id) ?? (composeWorldPose(scenePoseAdapter(sc), node.id, sc.composition.compose) as TPose);\n poses.set(node.id, p);\n }\n return p;\n };\n\n const obstacles: AvoidObstacle[] = [];\n const edgeNodes: SceneNode[] = [];\n const labels = new Map<string, AvoidLabel>();\n const labelNodes = new Map<string, SceneNode>();\n const split: string[] = [];\n for (const node of sc.renderOrderNodes()) {\n const edge = diagramEdgeOf(node);\n if (edge !== null) {\n if (edge.router === key && edge.offPage === undefined) edgeNodes.push(node);\n else if (edge.router === key) split.push(node.id);\n continue;\n }\n const label = diagramLabelOf(node);\n if (label !== null) {\n const owner = Array.isArray(node.dependsOn) ? node.dependsOn[0] : undefined;\n const { width, height } = geometry.getBounds(node.pose as TPose);\n if (owner !== undefined && !labels.has(owner)) {\n labels.set(owner, { id: node.id, placement: label, size: { width, height } });\n labelNodes.set(owner, node);\n }\n continue;\n }\n const container = diagramContainerOf(node);\n const isParticipant = diagramNodeOf(node as never, opts.read) !== null;\n if (!isParticipant && container?.role !== 'lane') continue;\n const box = geometry.getBounds(pose(node));\n const header = container === null ? null : headerBox(box, container.header);\n if (header !== null) obstacles.push({ id: headerIdOf(node.id), kind: 'shape', box: header });\n if (container?.role === 'lane') continue;\n const region = container !== null || diagramGroupOf(node) !== null;\n obstacles.push(region\n ? { id: node.id, kind: 'region', box, members: members(sc, node, new Set()) }\n : { id: node.id, kind: 'shape', box });\n }\n\n for (const id of split) {\n const node = labelNodes.get(id);\n if (node !== undefined) obstacles.push({ id: node.id, kind: 'label', edge: id, box: geometry.getBounds(pose(node)) });\n }\n\n const edges: AvoidEdge[] = [];\n for (const node of edgeNodes) {\n const edge = diagramEdgeOf(node)!;\n const ends = node.dependsOn;\n if (!Array.isArray(ends) || ends.length !== 2) continue;\n if (ends[0] === ends[1] && edge.from.port === undefined && edge.to.port === undefined) continue;\n const [a, b] = ends.map((id) => sc.get(id as never));\n if (a === undefined || b === undefined) continue;\n const portsAt = (n: SceneNode, port: string | undefined) => facingPorts(port === undefined\n ? portsOf(n as never, pose(n), portOpts)\n : portSitesOf(n as never, pose(n), port, portOpts));\n const from = portsAt(a, edge.from.port);\n const to = portsAt(b, edge.to.port);\n if (from.length === 0 || to.length === 0) continue;\n edges.push({\n id: node.id,\n from: { node: a.id, ports: from },\n to: { node: b.id, ports: to },\n ...(edge.waypoints !== undefined && edge.waypoints.length > 0 ? { waypoints: edge.waypoints as Vec2[] } : {}),\n ...(edge.route !== undefined ? { route: edge.route } : {}),\n ...(labels.has(node.id) ? { label: labels.get(node.id)! } : {}),\n });\n }\n return { obstacles, edges };\n}\n","import { RIGID_POSE_COMPOSITION, worldPosesOf, type DerivedDep, type PoseComposition, type RectPose } from '@weasel-js/core';\nimport type { DiagramSpec } from './fromData';\n\n/** Where each of `specs` draws, by id: its pose folded through the containers above it under `composition`, which\n * must be the one `diagramScene` was given (default, as there, {@link RIGID_POSE_COMPOSITION}). */\nexport const specWorldPoses = (\n specs: readonly DiagramSpec[],\n composition: PoseComposition<RectPose> = RIGID_POSE_COMPOSITION,\n): Map<string, RectPose> => worldPosesOf(specs as never, composition) as Map<string, RectPose>;\n\n/** Each spec by id as an edge router reads one of its ends: the spec, at the pose it draws at. */\nexport function specDeps(specs: readonly DiagramSpec[], world: ReadonlyMap<string, RectPose>): (id: unknown) => DerivedDep<RectPose> | undefined {\n const byId = new Map(specs.map((s) => [s.id as string, s]));\n return (id) => {\n const s = byId.get(id as string);\n if (s === undefined) return undefined;\n const pose = world.get(s.id as string) ?? (s.pose as RectPose);\n return { node: { ...s, parent: null, pose } as never, pose, path: null };\n };\n}\n","/**\n * Routes for a data-backed diagram: the specs `diagramScene` builds, with\n * every edge routed around the shapes. The routes derive from the data, so\n * they live in the specs and are never reported back to the host.\n */\nimport { RIGID_POSE_COMPOSITION, type PoseComposition, type RectPose } from '@weasel-js/core';\nimport type { Vec2 } from '@weasel-js/core/math';\nimport { diagramContainerOf, headerBox } from '../containers/trait';\nimport { diagramEdgeOf, type DiagramEdge } from '../edgeTrait';\nimport type { DiagramSpec } from '../fromData';\nimport { diagramLabelOf } from '../labelTrait';\nimport { portSitesOf, portsOf } from '../ports';\nimport { diagramNodeOf } from '../trait';\nimport { specWorldPoses } from '../specWorld';\nimport type { Port } from '../types';\nimport { createAvoidRouter } from './router';\nimport { headerIdOf } from './sceneInput';\nimport type { AvoidEdge, AvoidLabel, AvoidObstacle, AvoidOptions, AvoidPort } from './types';\n\nconst facing = (ports: readonly Port[]): AvoidPort[] =>\n ports.flatMap((p) => (p.normal === null ? [] : [{ point: p.point, normal: p.normal }]));\n\n/** The obstacles specs make, as `avoidSceneInput` reads a scene: a shape's box; a\n * container's or pool's box as a region holding what is inside it, and its header;\n * a lane's header alone. A derived box, a group's, is none. */\nfunction obstaclesOf(specs: readonly DiagramSpec[], world: ReadonlyMap<string, RectPose>): AvoidObstacle[] {\n const children = new Map<string, string[]>();\n for (const s of specs) {\n if (s.parent == null) continue;\n children.set(s.parent as string, [...(children.get(s.parent as string) ?? []), s.id as string]);\n }\n const inside = (id: string, into: Set<string>): Set<string> => {\n for (const child of children.get(id) ?? []) {\n into.add(child);\n inside(child, into);\n }\n return into;\n };\n const out: AvoidObstacle[] = [];\n for (const spec of specs) {\n const node = { id: spec.id as string, kind: spec.kind, data: spec.data };\n if (spec.derivePose !== undefined || diagramEdgeOf(spec) !== null) continue;\n const region = diagramContainerOf(spec);\n if (diagramNodeOf(node) === null && region?.role !== 'lane') continue;\n const box = world.get(node.id) ?? (spec.pose as RectPose);\n const header = region === null ? null : headerBox(box, region.header);\n if (header !== null) out.push({ id: headerIdOf(node.id), kind: 'shape', box: header });\n if (region?.role === 'lane') continue;\n out.push(region === null\n ? { id: node.id, kind: 'shape', box }\n : { id: node.id, kind: 'region', box, members: inside(node.id, new Set()) });\n }\n return out;\n}\n\n/** Each edge's label spec, by the edge it labels. */\nfunction labelsOf(specs: readonly DiagramSpec[]): Map<string, AvoidLabel> {\n const out = new Map<string, AvoidLabel>();\n for (const spec of specs) {\n const label = diagramLabelOf(spec);\n const owner = Array.isArray(spec.dependsOn) ? spec.dependsOn[0] as string | undefined : undefined;\n if (label === null || owner === undefined || out.has(owner)) continue;\n const { width, height } = spec.pose as RectPose;\n out.set(owner, { id: spec.id as string, placement: label, size: { width, height } });\n }\n return out;\n}\n\n/** How {@link createSpecRouter} routes: the router's own options, and the composition the specs' poses are stored\n * under, which must be the one `diagramScene` was given. Default {@link RIGID_POSE_COMPOSITION}, as there. */\nexport interface SpecRouterOptions extends AvoidOptions {\n composition?: PoseComposition<RectPose>;\n}\n\n/**\n * A function from specs to the same specs with each edge on `avoid` and\n * holding its route. It holds one router across calls, so each call reroutes\n * only the edges the change since the last one disturbed. Shapes and ports are\n * read where they draw, each pose folded through the containers above it.\n */\nexport function createSpecRouter(options: SpecRouterOptions = {}): (specs: readonly DiagramSpec[]) => DiagramSpec[] {\n const { composition = RIGID_POSE_COMPOSITION, ...avoid } = options;\n const router = createAvoidRouter(avoid);\n let held = new Map<string, Vec2[] | null>();\n return (specs) => {\n const byId = new Map(specs.map((s) => [s.id as string, s]));\n const labels = labelsOf(specs);\n const world = specWorldPoses(specs, composition);\n const obstacles = obstaclesOf(specs, world);\n const edges: AvoidEdge[] = [];\n for (const spec of specs) {\n const edge = diagramEdgeOf(spec);\n if (edge === null || edge.offPage !== undefined) continue;\n const ends = Array.isArray(spec.dependsOn) ? spec.dependsOn.map((id) => byId.get(id as string)) : [];\n const [a, b] = ends;\n if (a === undefined || b === undefined || a === b) continue;\n const portsAt = (s: DiagramSpec, port: string | undefined) => {\n const n = { id: s.id as string, kind: s.kind, data: s.data };\n const pose = world.get(n.id) ?? (s.pose as RectPose);\n return facing(port === undefined ? portsOf(n, pose) : portSitesOf(n, pose, port));\n };\n const route = held.get(spec.id as string);\n edges.push({\n id: spec.id as string,\n from: { node: a.id as string, ports: portsAt(a, edge.from.port) },\n to: { node: b.id as string, ports: portsAt(b, edge.to.port) },\n ...(edge.waypoints !== undefined && edge.waypoints.length > 0 ? { waypoints: edge.waypoints } : {}),\n ...(route != null ? { route } : {}),\n ...(labels.has(spec.id as string) ? { label: labels.get(spec.id as string)! } : {}),\n });\n }\n if (edges.length === 0) return [...specs];\n const next = new Map(held);\n for (const [id, route] of router.update({ obstacles, edges })) next.set(id, route);\n held = new Map(edges.map((e) => [e.id, next.get(e.id) ?? null]));\n return specs.map((spec) => {\n const edge = diagramEdgeOf(spec);\n if (edge === null || !held.has(spec.id as string)) return spec;\n const route = held.get(spec.id as string);\n const { route: _r, ...rest } = edge;\n const diagram: DiagramEdge = { ...rest, router: 'avoid', ...(route != null ? { route } : {}) };\n return { ...spec, data: { ...spec.data, diagram } };\n });\n };\n}\n","/**\n * A scene's connectors as line jumps read them: each one's route before any\n * hop, and the data write that stores its hops.\n */\nimport { AUTO_POSE_DESCRIPTOR, createSetDataOp, documentPose, type DerivedDep, type Op, type Scene } from '@weasel-js/core';\nimport type { Vec2 } from '@weasel-js/core/math';\nimport { edgeRouter, type EdgeRouteOptions } from '../edge';\nimport { diagramEdgeOf, type DiagramEdge } from '../edgeTrait';\nimport type { EdgeHop } from './types';\n\nexport type AnyScene = Scene<unknown, string, unknown>;\nexport type SceneNode = ReturnType<AnyScene['renderOrderNodes']>[number];\n\n/** A connector: its node and the ids of its two ends. */\nexport interface SceneEdge {\n node: SceneNode;\n trait: DiagramEdge;\n ends: readonly [string, string];\n}\n\n/** Every connector in `scene`, in render order. */\nexport function sceneEdges(scene: AnyScene): SceneEdge[] {\n const out: SceneEdge[] = [];\n for (const node of scene.renderOrderNodes()) {\n const trait = diagramEdgeOf(node);\n const ends = node.dependsOn;\n if (trait === null || !Array.isArray(ends) || ends.length !== 2) continue;\n out.push({ node, trait, ends: [ends[0]!, ends[1]!] });\n }\n return out;\n}\n\n/** A function from a connector to the points it is routed through, as its\n * `derivePath` routes it before drawing any hop; null where it draws nothing,\n * and for a connector split across pages: its stubs are shorter than a hop's\n * clearance from their ends, and the run between them is not drawn. */\nexport function edgePolylines<TPose>(scene: AnyScene, opts: EdgeRouteOptions<TPose> = {}): (edge: SceneEdge) => Vec2[] | null {\n const route = edgeRouter<unknown>({ geometry: AUTO_POSE_DESCRIPTOR, ...(opts as EdgeRouteOptions<unknown>) });\n const dep = (id: string): DerivedDep<unknown> | undefined => {\n const node = scene.get(id as never);\n return node === undefined ? undefined : ({ node, pose: documentPose(scene, node as never), path: null } as DerivedDep<unknown>);\n };\n return (edge) => {\n const routed = route(edge.node, [dep(edge.ends[0]), dep(edge.ends[1])]);\n const points = routed?.stubs === undefined ? routed?.points : undefined;\n return points === undefined || points.length < 2 ? null : [...points];\n };\n}\n\n/** Whether `id`, or a node it sits in, is in `ids`. */\nexport function inOrUnder(scene: AnyScene, id: string, ids: { has(id: string): boolean }): boolean {\n for (let at: string | null | undefined = id; at != null; at = scene.get(at as never)?.parent) {\n if (ids.has(at)) return true;\n }\n return false;\n}\n\n/** `data` with its edge trait holding `hops`, or none when the list is empty. */\nexport function withHopsData(data: unknown, trait: DiagramEdge, hops: readonly EdgeHop[]): Record<string, unknown> {\n const { hops: _h, ...rest } = trait;\n return { ...(data as Record<string, unknown>), diagram: hops.length === 0 ? rest : { ...rest, hops } };\n}\n\nconst sameHop = (a: EdgeHop, b: EdgeHop): boolean =>\n a.at.x === b.at.x && a.at.y === b.at.y && a.r === b.r && a.over.length === b.over.length && a.over.every((o, i) => o === b.over[i]);\n\n/** The data writes that store `hops` on their connectors, skipping any unchanged. */\nexport function hopDataOps(scene: AnyScene, hops: ReadonlyMap<string, readonly EdgeHop[]>): Op[] {\n const ops: Op[] = [];\n for (const [id, list] of hops) {\n const node = scene.get(id as never);\n const trait = node === undefined ? null : diagramEdgeOf(node);\n if (node === undefined || trait === null) continue;\n const had = trait.hops ?? [];\n if (had.length === list.length && had.every((h, i) => sameHop(h, list[i]!))) continue;\n ops.push(createSetDataOp({ id, from: node.data, to: withHopsData(node.data, trait, list), label: 'Line jumps' }));\n }\n return ops;\n}\n","/**\n * Line jumps for a data-backed diagram: the specs `diagramScene` builds, with\n * each edge carrying the hops it makes over the edges before it. The hops\n * derive from the specs, so they live there and are never reported back.\n */\nimport type { RectPose } from '@weasel-js/core';\nimport type { Vec2 } from '@weasel-js/core/math';\nimport { edgeRouter } from '../edge';\nimport { diagramEdgeOf } from '../edgeTrait';\nimport type { DiagramSpec } from '../fromData';\nimport { edgeHops } from './crossings';\nimport { withHopsData } from './sceneEdges';\nimport { specDeps, specWorldPoses } from '../specWorld';\n\n/** A function from specs to the same specs with every edge's hops of radius\n * `r`, edges hopping those earlier in the list. An edge split across pages\n * takes no part. */\nexport function createSpecHops(r: number): (specs: readonly DiagramSpec[]) => DiagramSpec[] {\n const route = edgeRouter<RectPose>();\n return (specs) => {\n const dep = specDeps(specs, specWorldPoses(specs));\n const polylines = new Map<string, Vec2[]>();\n const order: string[] = [];\n for (const spec of specs) {\n const ends = spec.dependsOn;\n if (diagramEdgeOf(spec) === null || !Array.isArray(ends) || ends.length !== 2) continue;\n const routed = route(spec, [dep(ends[0]), dep(ends[1])]);\n const points = routed?.stubs === undefined ? routed?.points : undefined;\n if (points === undefined || points.length < 2) continue;\n polylines.set(spec.id as string, [...points]);\n order.push(spec.id as string);\n }\n const hops = edgeHops(polylines, order, r);\n return specs.map((spec) => {\n const trait = diagramEdgeOf(spec);\n const list = hops.get(spec.id as string) ?? [];\n if (trait === null || (list.length === 0 && trait.hops === undefined)) return spec;\n return { ...spec, data: withHopsData(spec.data, trait, list) as DiagramSpec['data'] };\n });\n };\n}\n","/**\n * Reconnect — dragging a selected edge's end onto another port or shape.\n *\n * The edge-end handles (`edgeEndLayer`) claim the press; this action carries\n * the end. It lands where a connect from the edge's other end would land, by\n * the same resolver and the same `canConnect`, asked with the edge's from/to\n * order kept, so a reconnect can never make an edge a connect could not.\n */\nimport type {\n Action,\n Contribution,\n GestureBinding,\n InvocationCtx,\n OngoingHandle,\n OngoingOverlay,\n RenderLayer,\n Vec2,\n} from '@weasel-js/core';\nimport {\n defaultCanConnect,\n edgeEndOf,\n grabPortAction,\n grabPortBindings,\n type ConnectActionOptions,\n type MovingEnd,\n} from './connect';\nimport { createTargets, isBodyEnd, type ConnectEnd } from './connectTargets';\nimport { routerOf, type Router } from './edge';\nimport {\n EDGE_END_AFFORDANCE_KIND,\n EDGE_END_LAYER_ID,\n createEdgeEnds,\n edgeEndLayer,\n edgeEndScratchOf,\n type EdgeEndAffordanceOptions,\n type EdgeEnds,\n} from './edgeEndLayer';\nimport { diagramEdgeOf } from './edgeTrait';\nimport { portOf } from './ports';\n\nexport { EDGE_END_LAYER_ID };\n\n/** The action that drags an edge end onto a new port or body. */\nexport const RECONNECT_ACTION_ID = 'diagram.reconnect';\n/** The action id that absorbs a press on an edge-end handle. */\nexport const GRAB_EDGE_END_ACTION_ID = 'diagram.grabEdgeEnd';\n\n/** One end of one edge, moved onto `target`. */\nexport interface EndChange {\n edgeId: string;\n end: 'from' | 'to';\n target: ConnectEnd;\n}\n\n/** Options for {@link createReconnectAction}. `bodies` defaults to true: an end\n * may be dropped on a shape's body. */\nexport interface ReconnectOptions<TPose> extends Omit<ConnectActionOptions<TPose>, 'commit' | 'startFrom'> {\n /** The selected edge ids whose ends show handles. */\n selected: () => readonly string[];\n /** Defaults to {@link commitReconnectToScene} against `deps.scene`. */\n commit?: (change: EndChange, ctx: InvocationCtx) => void;\n}\n\nconst DEFAULT_SNAP = 16;\n\n/**\n * The default commit: rewrites the moved end in `data.diagram` — `{ port }`,\n * or `{}` for a body — and points the edge's `dependsOn` at the new node, as\n * one history entry.\n */\nexport function commitReconnectToScene(change: EndChange, ctx: InvocationCtx): void {\n const scene = ctx.deps.scene;\n if (scene === undefined) return;\n const node = scene.get(change.edgeId as never);\n const trait = node === undefined ? null : diagramEdgeOf(node);\n const deps = node?.dependsOn;\n if (node === undefined || trait === null || !Array.isArray(deps) || deps.length !== 2) return;\n const data = node.data as Record<string, unknown>;\n const nextDeps = [...deps];\n nextDeps[change.end === 'from' ? 0 : 1] = change.target.nodeId as never;\n scene.batch('Reconnect edge', () => {\n scene.update(node.id, {\n data: { ...data, diagram: { ...trait, [change.end]: edgeEndOf(change.target) } } as never,\n });\n scene.setDependsOn(node.id, nextDeps);\n });\n}\n\n/** The end of `ends` that stays put while `moving` is dragged: its named\n * port, else its body. */\nfunction fixedEndOf<TPose>(ends: EdgeEnds<TPose>, moving: 'from' | 'to', opts: ReconnectOptions<TPose>): ConnectEnd {\n const side = moving === 'from' ? 'to' : 'from';\n const { node, pose } = ends[side];\n const named = ends.trait[side].port;\n const port = named === undefined ? undefined : portOf(node, pose, named, {\n ...(opts.geometry ? { geometry: opts.geometry } : {}),\n ...(opts.read ? { read: opts.read } : {}),\n });\n return port ?? { kind: 'body', nodeId: node.id, point: ends.points[side] };\n}\n\n/** Whether `target` is the end the edge already has. */\nfunction sameEnd(ends: EdgeEnds<unknown>, moving: 'from' | 'to', target: ConnectEnd): boolean {\n if (ends[moving].node.id !== target.nodeId) return false;\n const named = ends.trait[moving].port;\n return isBodyEnd(target) ? named === undefined : named === target.id;\n}\n\ninterface ReconnectScratch {\n edgeId: string;\n moving: 'from' | 'to';\n fixed: ConnectEnd;\n ends: EdgeEnds<unknown>;\n route: Router;\n current: Vec2;\n open: boolean;\n /** The deps bag from `start`; later pump events carry an empty one. */\n deps: InvocationCtx['deps'];\n}\n\n/** The `diagram.reconnect` action: an ongoing drag carrying one edge end. */\nexport function createReconnectAction<TPose>(opts: ReconnectOptions<TPose>): Action {\n const { canConnect = defaultCanConnect, commit = commitReconnectToScene } = opts;\n const endsOf = createEdgeEnds(opts.participants, opts);\n const shared = { ...opts, snapRadius: opts.snapRadius ?? DEFAULT_SNAP, bodies: opts.bodies ?? true };\n // The resolver asks `canConnect(fixed, candidate)`; a moved `from` end\n // swaps them back so the policy sees the edge's own direction.\n const targetsFor = (moving: MovingEnd) => createTargets({\n ...shared,\n canConnect: moving.end === 'to'\n ? (fixed, candidate) => canConnect(fixed, candidate, moving)\n : (fixed, candidate) => canConnect(candidate, fixed, moving),\n });\n\n return {\n id: opts.id ?? RECONNECT_ACTION_ID,\n label: 'Reconnect',\n group: 'diagram',\n requires: ['scene', 'view'],\n invoker: {\n timing: 'ongoing',\n start(ctx: InvocationCtx): OngoingHandle {\n const pressed = edgeEndScratchOf(ctx.drag?.affordance);\n const ends = pressed === null ? null : endsOf(pressed.edgeId);\n if (pressed === null || ends === null) return {};\n const scratch: ReconnectScratch = {\n edgeId: pressed.edgeId,\n moving: pressed.end,\n fixed: fixedEndOf(ends, pressed.end, opts),\n ends: ends as EdgeEnds<unknown>,\n route: routerOf(ends.trait, opts.routers),\n current: { x: ctx.world.x, y: ctx.world.y },\n open: true,\n deps: ctx.deps,\n };\n const resolver = targetsFor({ edge: scratch.edgeId, end: scratch.moving });\n\n return {\n kind: 'diagram-reconnect',\n onMove(moveCtx: InvocationCtx): void {\n scratch.current = { x: moveCtx.world.x, y: moveCtx.world.y };\n },\n overlay(): readonly OngoingOverlay[] | null {\n if (!scratch.open) return null;\n return resolver.overlays(scratch.route, scratch.fixed, scratch.current, scratch.deps.view, scratch.moving, scratch.ends.trait.waypoints);\n },\n onEnd(endCtx: InvocationCtx, reason: 'commit' | 'cancel'): void {\n scratch.open = false;\n if (reason === 'cancel') return;\n const target = resolver.target(scratch.fixed, { x: endCtx.world.x, y: endCtx.world.y }, scratch.deps.view);\n if (target === null || sameEnd(scratch.ends, scratch.moving, target)) return;\n commit({ edgeId: scratch.edgeId, end: scratch.moving, target }, { ...endCtx, deps: scratch.deps });\n },\n };\n },\n },\n enabled: () => true as const,\n };\n}\n\n/** The binding that starts a reconnect: a drag pressed on an edge-end handle. */\nexport function reconnectBinding(actionId: string = RECONNECT_ACTION_ID): GestureBinding {\n return { spec: { kind: 'drag', target: `affordance:${EDGE_END_AFFORDANCE_KIND}` }, actionId, opts: { id: `${actionId}.drag` } };\n}\n\n/**\n * Both halves of reconnect: the handle layer to `registerLayer` — after the\n * port layer, since an edge's end sits on a port — and the contribution to\n * pass as `ambient`. Like `diagramPorts`, one without the other fails quietly.\n */\nexport function diagramEdgeEnds<TPose>(\n opts: ReconnectOptions<TPose> & Omit<EdgeEndAffordanceOptions<TPose>, 'id'>,\n): { layer: RenderLayer<unknown>; contribution: Contribution } {\n const actionId = opts.id ?? RECONNECT_ACTION_ID;\n return {\n // `opts.id` names the action; the layer keeps its own id.\n layer: edgeEndLayer(opts.participants, opts.selected, { ...opts, id: EDGE_END_LAYER_ID }),\n contribution: {\n id: 'weasel-diagram-edge-ends',\n eligibility: { claimed: true },\n actions: [createReconnectAction({ ...opts, id: actionId }), grabPortAction(GRAB_EDGE_END_ACTION_ID)],\n bindings: [\n reconnectBinding(actionId),\n ...grabPortBindings(GRAB_EDGE_END_ACTION_ID, EDGE_END_AFFORDANCE_KIND),\n ],\n },\n };\n}\n","/**\n * Reordering a group or container marked `reorder`: a member dragged along that axis among\n * its siblings, which slide into the places they would take, or the selected\n * one stepped with Alt and an arrow key. A container's member dragged out of its box goes to the move instead. Nothing is written: the host hears\n * the new order, writes it to its data, and layout keeps it.\n */\nimport {\n ActionDisabledReason,\n bodyPredicate,\n type Action,\n type ActionDeps,\n type Contribution,\n type RectPose,\n type Scene,\n type Vec2,\n} from '@weasel-js/core';\nimport { moveItems, nudgeGap } from '@weasel-js/ui-logic';\nimport { diagramContainerOf } from './containers/trait';\nimport { worldRectOf } from './overlays';\nimport type { DiagramSceneData } from './fromData';\nimport { reorderContribution, sequenceSlots, type ReorderSlots } from './reorder';\nimport { carriedWith, reorderTargetOf, type ReorderTarget } from './reorderModel';\n\n/** Alt and an arrow key: the selected member one place along. */\nexport const STEP_REORDER_ACTION_ID = 'diagram.stepReorder';\n\n/** A reorderable group's or container's members in their new order. */\nexport interface ReorderChange {\n /** The group's or the container's id. */\n parent: string;\n order: readonly string[];\n}\n\ntype DiagramScene = Scene<DiagramSceneData, 'main', RectPose>;\n\nconst sceneOf = (deps: ActionDeps | undefined) => deps?.scene as DiagramScene | undefined;\n\nfunction targetAt(deps: ActionDeps | undefined, id: string | null | undefined): ReorderTarget | null {\n const scene = sceneOf(deps);\n if (scene === undefined || id == null) return null;\n return reorderTargetOf(scene as never, id, (m) => worldRectOf(scene, m));\n}\n\n/** The members of the reorderable group or container a press at `at` carries\n * one of, each with everything drawn with it, or `null` off any. */\nexport function groupReorderSlots(deps: ActionDeps, at: Vec2): ReorderSlots | null {\n const scene = sceneOf(deps);\n const target = targetAt(deps, deps.nodeAtPoint?.(at));\n if (scene === undefined || target === null) return null;\n return sequenceSlots(target.axis, target.members.map((m) => ({\n id: m,\n bounds: worldRectOf(scene, m) ?? { x: 0, y: 0, width: 0, height: 0 },\n carries: [...carriedWith(scene as never, m)],\n })));\n}\n\nconst STEPS: readonly { key: string; role: string; axis: 'x' | 'y'; step: -1 | 1 }[] = [\n { key: 'ArrowUp', role: 'up', axis: 'y', step: -1 },\n { key: 'ArrowDown', role: 'down', axis: 'y', step: 1 },\n { key: 'ArrowLeft', role: 'left', axis: 'x', step: -1 },\n { key: 'ArrowRight', role: 'right', axis: 'x', step: 1 },\n];\n\n/** Steps the selected node's member one place toward the start (`-1`) or the end (`1`). */\nexport function createStepReorderAction(report: (change: ReorderChange) => void): Action {\n const selectedTarget = (deps: ActionDeps | undefined) => targetAt(deps, deps?.selection?.get()[0]);\n return {\n id: STEP_REORDER_ACTION_ID,\n label: 'Move along',\n group: 'diagram',\n defaultBinding: STEPS.map(({ key, role, axis, step }) => ({\n spec: { kind: 'key' as const, key, mods: { alt: true } },\n opts: { id: `${STEP_REORDER_ACTION_ID}.${role}`, params: { axis, step } },\n })),\n requires: ['scene', 'selection'],\n invoker: {\n timing: 'immediate',\n run(deps, params) {\n const target = selectedTarget(deps);\n if (target === null || params?.axis !== target.axis) return;\n const { members, member } = target;\n const at = members.indexOf(member);\n const to = nudgeGap([at], params.step === -1 ? -1 : 1, members.length);\n if (to === null) return;\n report({ parent: target.parent, order: moveItems(members, [at], to) });\n },\n },\n enabled: (deps) => (selectedTarget(deps) !== null ? true : ActionDisabledReason.NotApplicable),\n };\n}\n\n/** The box of the container `member` stands in, which a drag of it leaves to be moved out; `null` for a group's\n * member, which has nowhere to go. */\nfunction containerRegion(deps: ActionDeps, member: string) {\n const scene = sceneOf(deps);\n const parent = targetAt(deps, member)?.parent;\n const node = parent === undefined ? undefined : scene?.get(parent as never);\n if (scene === undefined || node === undefined || diagramContainerOf(node)?.role !== 'container') return null;\n return worldRectOf(scene, parent!);\n}\n\nconst onBody = bodyPredicate((target) => target === 'selected-body' || target === 'unselected-body');\n\n/** Everything `DiagramView` installs for `onReorder`: the reorder drag,\n * sliding, pressed on a node's body, and the step action. A container's member\n * dragged out of the container's box is handed to the move. */\nexport function groupReorderContribution(report: (change: ReorderChange) => void): Contribution {\n const drag = reorderContribution({\n slots: groupReorderSlots,\n requires: ['nodeAtPoint'],\n show: 'slide',\n on: onBody,\n region: (deps, item) => containerRegion(deps, item.id),\n commit: (move, ctx) => {\n const parent = targetAt(ctx.deps, move.id)?.parent;\n if (parent !== undefined) report({ parent, order: move.order });\n },\n });\n return { ...drag, id: 'weasel-diagram-reorder', actions: [...(drag.actions ?? []), createStepReorderAction(report)] };\n}\n","/**\n * Label placement for a data-backed diagram: the specs `diagramScene` builds,\n * with each edge label moved off whatever covers it. Placement derives from\n * the specs, so it lives in them and is never reported back to the host.\n */\nimport type { RectPose } from '@weasel-js/core';\nimport type { Vec2 } from '@weasel-js/core/math';\nimport { diagramContainerOf } from '../containers/trait';\nimport { edgeRouter } from '../edge';\nimport { diagramEdgeOf } from '../edgeTrait';\nimport type { DiagramSpec } from '../fromData';\nimport { diagramGroupOf } from '../group';\nimport { diagramLabelOf, type DiagramLabel } from '../labelTrait';\nimport { diagramNodeOf } from '../trait';\nimport { specDeps, specWorldPoses } from '../specWorld';\nimport { placeLabels, type LabelPlacements, type PlaceLabel, type PlaceLabelsInput, type PlaceLabelsOptions, type PlaceRoute } from './place';\n\nconst routeOf = edgeRouter<RectPose>();\n\n/** What placement reads off `specs`: every label moving. */\nfunction inputOf(specs: readonly DiagramSpec[]): PlaceLabelsInput {\n const world = specWorldPoses(specs);\n const dep = specDeps(specs, world);\n const shapes: PlaceLabelsInput['shapes'][number][] = [];\n const routes: PlaceRoute[] = [];\n const labels: PlaceLabel[] = [];\n for (const spec of specs) {\n const id = spec.id as string;\n const ends = Array.isArray(spec.dependsOn) ? spec.dependsOn : [];\n if (diagramEdgeOf(spec) !== null) {\n const points = routeOf(spec, ends.map(dep))?.points;\n if (points !== undefined && points.length >= 2) routes.push({ id, points: points as Vec2[] });\n continue;\n }\n const placement = diagramLabelOf(spec);\n if (placement !== null) {\n const { width, height } = spec.pose;\n if (ends[0] !== undefined) labels.push({ id, edge: ends[0] as string, placement, size: { width, height } });\n continue;\n }\n const node = { id, kind: spec.kind, data: spec.data };\n if (spec.derivePose !== undefined || diagramContainerOf(node) !== null || diagramGroupOf(node) !== null || diagramNodeOf(node) === null) continue;\n shapes.push({ id, box: world.get(id) ?? spec.pose });\n }\n return { shapes, routes, labels };\n}\n\nconst keyOf = (input: PlaceLabelsInput): string => JSON.stringify([\n input.shapes.map((s) => [s.id, s.box.x, s.box.y, s.box.width, s.box.height]),\n input.routes.map((r) => [r.id, r.points.flatMap((p) => [p.x, p.y])]),\n input.labels.map((l) => [l.id, l.edge, l.placement.at, l.placement.offset, l.placement.dodge, l.size.width, l.size.height]),\n]);\n\n/**\n * A function from specs to the same specs with each edge label placed off\n * whatever covers it. Every label is placed afresh, in id order, whenever\n * the shapes, routes, or labels change, and the last answer is reused while\n * they do not. Run it after any router, so labels dodge the routes drawn.\n */\nexport function createSpecLabelPlacer(opts: PlaceLabelsOptions = {}): (specs: readonly DiagramSpec[]) => DiagramSpec[] {\n let last: { key: string; placed: LabelPlacements } | null = null;\n return (specs) => {\n const input = inputOf(specs);\n if (input.labels.length === 0) return [...specs];\n const key = keyOf(input);\n if (last?.key !== key) last = { key, placed: placeLabels(input, opts) };\n const placed = last.placed;\n return specs.map((spec) => {\n const spot = placed.get(spec.id as string);\n const label = diagramLabelOf(spec);\n if (spot === undefined || label === null) return spec;\n const { placed: _p, ...preferred } = label;\n const next: DiagramLabel = spot === null ? preferred : { ...preferred, placed: spot };\n return { ...spec, data: { ...spec.data, diagram: { ...(spec.data.diagram as object), label: next } } };\n });\n };\n}\n","/**\n * What a sequence's scene nodes carry under `data.diagram`: the root holds the\n * whole `SequenceData`, and every part drawn from it names its root and what\n * it draws.\n */\nimport type { SeqMessagePlace, SeqRect, SeqSlot } from './layout';\nimport type { SeqMarkRef, SeqTextTarget, SequenceData } from './types';\n\n/** Where a root's parts stand, in its own frame: what a drag reads to place a drop without laying the data out again. */\nexport interface SequenceGeometry {\n columns: readonly { id: string; x: number }[];\n slots: readonly SeqSlot[];\n heads: readonly { id: string; box: SeqRect }[];\n messages: readonly SeqMessagePlace[];\n notes: readonly { id: string; box: SeqRect }[];\n /** Where a fragment is taken hold of: its type tab, or a region's top edge. Absent on a root drawn before fragments could be. */\n fragments?: readonly { id: string; grip: SeqRect }[];\n /** Where a box is taken hold of: the strip above its heads that holds its label. Absent as for `fragments`. */\n boxes?: readonly { id: string; grip: SeqRect }[];\n /** Where a part drawn for lifeline marks is taken hold of, by the part's id under the root: an activation bar, a\n * destruction's cross. Absent as for `fragments`. */\n marks?: readonly { id: string; grip: SeqRect }[];\n}\n\n/** The trait on a sequence's root. */\nexport interface SequenceRootTrait {\n sequence: SequenceData;\n geometry: SequenceGeometry;\n}\n\n/** What a part draws. */\nexport type SeqPartKind =\n | 'head' | 'lifeline' | 'destroy' | 'message' | 'activation' | 'note' | 'fragment' | 'divider' | 'box' | 'number' | 'text';\n\n/** The trait on a part of a sequence: its root, what it draws, and for text, what an edit of it sets. */\nexport interface SeqPartTrait {\n root: string;\n part: SeqPartKind;\n /** The participant or step it draws. */\n id?: string;\n /** For text an edit can set. */\n target?: SeqTextTarget;\n /** For an activation bar or a destruction's cross: the marks and message flags that draw it, which deleting it removes. */\n marks?: readonly SeqMarkRef[];\n}\n\nconst 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;\n return trait !== null && typeof trait === 'object' ? (trait as Record<string, unknown>) : null;\n};\n\n/** The sequence a root node holds, or `null` for any other node. */\nexport function sequenceRootOf(node: { data: unknown }): SequenceRootTrait | null {\n const trait = traitOf(node);\n return trait !== null && 'sequence' in trait && 'geometry' in trait ? (trait as unknown as SequenceRootTrait) : null;\n}\n\n/** The part trait a node drawn for a sequence carries, or `null`. */\nexport function sequencePartOf(node: { data: unknown }): SeqPartTrait | null {\n const seq = traitOf(node)?.seq;\n return seq !== null && typeof seq === 'object' && typeof (seq as SeqPartTrait).root === 'string' ? (seq as SeqPartTrait) : null;\n}\n","import { diagramContainerOf } from './containers/trait';\nimport { diagramEdgeOf } from './edgeTrait';\nimport { diagramGroupOf } from './group';\nimport { diagramLabelOf } from './labelTrait';\nimport { sequencePartOf } from './sequence/trait';\n\n/**\n * `<SceneCanvas selectTool={{ resize: { resizable } }}>` for a diagram scene:\n * edges and edge labels take their geometry from what they are attached to,\n * so their own pose is a placeholder, and a resize handle on it sits at the\n * origin and resizes nothing. A group's box is its members' union, and a\n * pool's lane is sized by its pool's stack and resized by dragging its\n * boundary. A sequence's part is drawn from its root's data, and a selected\n * one is there to be deleted, not resized.\n */\nexport function diagramResizable(scene: { get(id: never): { data: unknown } | undefined }): (id: string) => boolean {\n return (id) => {\n const node = scene.get(id as never);\n return node === undefined\n || (diagramEdgeOf(node) === null && diagramLabelOf(node) === null && diagramGroupOf(node) === null\n && diagramContainerOf(node)?.role !== 'lane' && sequencePartOf(node) === null);\n };\n}\n","/**\n * A live layout's producers: what each frame of a run says about where the\n * participants are. `forceProducer` relaxes; `easedProducer` walks to a\n * destination it knows. `useLiveLayout` (`live.ts`) runs them.\n */\nimport {\n AUTO_POSE_DESCRIPTOR,\n type NodeId,\n type PoseDescriptor,\n} from '@weasel-js/core';\nimport { type EasingFn } from '@weasel-js/animator';\nimport { forceRelaxation, type ForceOptions } from './force';\nimport type { Graph } from './graph';\nimport { center, type LayoutFn, type LayoutOptions, type LayoutResult } from './layout';\n\n/** What a live producer is told, and what it answers with. */\nexport interface LiveLayoutCtx<TPose> {\n /** Nodes another gesture is moving, and where each is drawn. */\n pinned: ReadonlyMap<NodeId, TPose>;\n /** Frames since this run heated, starting at 0. */\n frame: number;\n}\n\n/** A frame of a live layout: where the participants are, and whether it is\n * finished. Positions are top-lefts, the same as a `LayoutResult`. */\nexport interface LiveLayoutFrame {\n result: LayoutResult;\n done: boolean;\n}\n\n/** One frame of a live layout, called once per frame until it reports `done`. */\nexport type LiveLayoutProducer<TPose> = (ctx: LiveLayoutCtx<TPose>) => LiveLayoutFrame;\n\n/** How long an eased layout takes to arrive, in frames. Frame-counted rather\n * than timed, so a background tab resumes where it paused rather than\n * arriving the instant it comes back. */\nexport const EASE_FRAMES = 24;\n\n/** Smooth start and end. Inlined rather than pulled from the animator, which\n * is a registry of running tweens, not a curve library. */\nexport const easeInOut: EasingFn = (t) => (t < 0.5 ? 2 * t * t : 1 - (-2 * t + 2) ** 2 / 2);\n\n/** How far along an eased run is at `frame`, before and after its easing. */\nexport function progress(frame: number, frames: number, easing: EasingFn): { t: number; u: number } {\n const t = Math.min((frame + 1) / frames, 1);\n return { t, u: easing(t) };\n}\n\n/** Options for {@link forceProducer}. */\nexport interface ForceProducerOptions<TPose> extends ForceOptions {\n geometry?: PoseDescriptor<TPose>;\n /** Alpha held while something is pinned, so the graph keeps answering a drag\n * instead of freezing under it. Default 0.3. */\n dragAlpha?: number;\n /** The run is at rest once no node moves this far in a tick, in world units.\n * Default 0.1. `0` never rests, leaving the run to the cooling schedule. */\n restDistance?: number;\n /** Consecutive ticks at rest before the run finishes. Default 5. */\n restTicks?: number;\n}\n\nconst REST_DISTANCE = 0.1;\nconst REST_TICKS = 5;\n\n/**\n * A relaxation, one tick a frame, done when the graph stops moving.\n *\n * Motion ends long before alpha cools, so it finishes on whichever comes\n * first: `restTicks` ticks in a row with no node moving `restDistance`, or the\n * cooling schedule running out. Nothing rests while a node is held.\n *\n * It does **not** re-anchor the way the one-shot `force` does. Re-anchoring\n * per frame would fight a drag: the anchor is measured from where the nodes\n * were, and a pinned node is deliberately somewhere else.\n */\nexport function forceProducer<TPose>(\n graph: Graph,\n opts: ForceProducerOptions<TPose> = {},\n): LiveLayoutProducer<TPose> {\n const geometry = opts.geometry ?? (AUTO_POSE_DESCRIPTOR as PoseDescriptor<TPose>);\n const relaxation = forceRelaxation(graph, opts);\n const dragAlpha = opts.dragAlpha ?? 0.3;\n const restDistance = opts.restDistance ?? REST_DISTANCE;\n const restTicks = opts.restTicks ?? REST_TICKS;\n const was = relaxation.bodies.map((b) => ({ x: b.x, y: b.y }));\n let still = 0;\n\n return ({ pinned }) => {\n for (const node of graph.nodes) {\n const body = relaxation.byId.get(node.id);\n if (body === undefined) continue;\n const held = pinned.get(node.id as NodeId);\n if (held !== undefined) {\n // A dragged node holds its neighbors while they relax, which is `fx` /\n // `fy` on the integrator rather than a correction applied afterward.\n const bounds = geometry.getBounds(held);\n body.fx = center(bounds, 'x');\n body.fy = center(bounds, 'y');\n } else if (!relaxation.pinned.has(node.id)) {\n delete body.fx;\n delete body.fy;\n }\n }\n // A pin is a live edit, so the run keeps its temperature up until the\n // pointer lets go.\n relaxation.sim.alphaTarget(pinned.size > 0 ? dragAlpha : 0);\n relaxation.sim.tick();\n\n let moved = 0;\n relaxation.bodies.forEach((body, i) => {\n const at = was[i]!;\n moved = Math.max(moved, Math.hypot(body.x - at.x, body.y - at.y));\n at.x = body.x;\n at.y = body.y;\n });\n still = pinned.size === 0 && moved < restDistance ? still + 1 : 0;\n\n const done = still >= restTicks || relaxation.sim.isSettled();\n return { result: relaxation.placed(), done };\n };\n}\n\n/** Options for {@link easedProducer}. */\nexport interface EasedProducerOptions {\n layout?: LayoutOptions;\n /** Frames to arrive in. Default 24. */\n frames?: number;\n easing?: EasingFn;\n}\n\n/**\n * A layout that knows its destination, walked into place.\n *\n * The target is computed once, from the graph as it stood when the run heated;\n * each frame is that target scaled by the easing curve, measured from where the\n * nodes started. A pinned node is dropped from the target rather than fought\n * over.\n */\nexport function easedProducer<TPose>(\n graph: Graph,\n algorithm: LayoutFn,\n opts: EasedProducerOptions = {},\n): LiveLayoutProducer<TPose> {\n const frames = opts.frames ?? EASE_FRAMES;\n const easing = opts.easing ?? easeInOut;\n const target = algorithm(graph, opts.layout);\n const from = new Map<string, { x: number; y: number }>();\n for (const node of graph.nodes) from.set(node.id, { x: node.bounds.x, y: node.bounds.y });\n\n return ({ pinned, frame }) => {\n const { t, u } = progress(frame, frames, easing);\n const result = new Map<string, { x: number; y: number }>();\n for (const [id, to] of target) {\n if (pinned.has(id as NodeId)) continue;\n const start = from.get(id);\n if (start === undefined) continue;\n result.set(id, {\n x: start.x + (to.x - start.x) * u,\n y: start.y + (to.y - start.y) * u,\n });\n }\n return { result, done: t >= 1 };\n };\n}\n","/**\n * The wait before a live run whose layout answers later: a `LayoutPlanner`\n * that returns a promise.\n *\n * Only the newest request is answered, and only while the graph it was asked\n * about is still the one on screen. A drag, an edit, or a node added while the\n * answer was on its way makes the plan describe somewhere the diagram no\n * longer is, so the answer is dropped and the run never starts.\n */\nimport { useEffect, useMemo, useRef } from 'react';\nimport type { Graph } from './graph';\nimport type { LayoutPlan } from './layout';\n\n/** The shape of a graph, as a string that changes when a node or edge does. */\nexport function shapeOf(graph: Graph): string {\n const nodes = graph.nodes.map((n) => n.id).sort().join(',');\n const edges = graph.edges.map((e) => `${e.from}>${e.to}`).sort().join(',');\n return `${nodes}|${edges}`;\n}\n\n/** Whether `b` is `a` again: the same nodes and edges, every node in the same box. */\nexport function sameGraph(a: Graph, b: Graph): boolean {\n if (shapeOf(a) !== shapeOf(b)) return false;\n return a.nodes.every((n) => {\n const m = b.node(n.id)?.bounds;\n const k = n.bounds;\n return m !== undefined && m.x === k.x && m.y === k.y && m.width === k.width && m.height === k.height;\n });\n}\n\n/** A live run's outstanding request for a plan. Stable for the life of the\n * component; unmounting drops whatever is pending. */\nexport interface PendingPlan {\n /** Hand `ready` the plan once it arrives, or `failed` the reason it never\n * will, unless another request or a `drop` comes first; a superseded\n * request's failure is dropped with its answer. */\n request(answer: Promise<LayoutPlan>, ready: (plan: LayoutPlan) => void, failed: (error: unknown) => void): void;\n /** Forget the outstanding request. */\n drop(): void;\n isWaiting(): boolean;\n}\n\nexport function usePendingPlan(): PendingPlan {\n const generation = useRef(0);\n const waiting = useRef(false);\n const pending = useMemo<PendingPlan>(() => ({\n request(answer, ready, failed) {\n const mine = ++generation.current;\n waiting.current = true;\n const current = () => generation.current === mine;\n void answer.then(\n (plan) => {\n if (!current()) return;\n waiting.current = false;\n ready(plan);\n },\n (error: unknown) => {\n if (!current()) return;\n waiting.current = false;\n failed(error);\n },\n );\n },\n drop() {\n generation.current++;\n waiting.current = false;\n },\n isWaiting: () => waiting.current,\n }), []);\n useEffect(() => () => pending.drop(), [pending]);\n return pending;\n}\n","/**\n * The edge half of a live layout: each route the run will rewrite, eased from\n * where it ran to where the run puts it, frame by frame, alongside the nodes,\n * and drawn through the ports the run will name for its ends.\n *\n * Nothing here writes the document. A frame's route is published as the edge's\n * path on the scene's override channel, drawn by the edge's own `derivePath`\n * through the frame's waypoints and the poses its ends are drawn at; the\n * routes themselves are written once, when the run arrives (`routeWrites`).\n */\nimport { useEffect, useMemo, useRef } from 'react';\nimport {\n AUTO_POSE_DESCRIPTOR,\n derivedDepOf,\n type DerivedDep,\n type PoseDescriptor,\n type NodeId,\n type Path,\n type PoseOverride,\n type Scene,\n} from '@weasel-js/core';\nimport type { Vec2 } from '@weasel-js/core/math';\nimport { lerpPoint } from '@weasel-js/geom';\nimport { diagramEdgeOf, layoutWritesRoute, type DiagramEdge } from './edgeTrait';\nimport type { Graph } from './graph';\nimport { routeWrites, type LayoutRoutes } from './routeWrites';\n\n/** One route on its way from where it ran to where layout puts it. */\nexport interface RouteEasing {\n id: string;\n /** Point `k` of the route eases from `from[k]` to `to[k]`. */\n from: readonly Vec2[];\n /** As long as `from`, or `null` for a route layout takes away: it eases\n * onto the straight line between its ends' centers where each frame draws\n * them, and arrives with no waypoints at all. */\n to: readonly Vec2[] | null;\n /** The edge's ends as the run will write them, ports and all. */\n ends: Pick<DiagramEdge, 'from' | 'to'>;\n}\n\n/** The point `s` of the way along the polyline through `points`, 0 to 1. */\nfunction along(points: readonly Vec2[], s: number): Vec2 {\n if (points.length === 1) return points[0]!;\n const lengths = points.slice(1).map((p, i) => Math.hypot(p.x - points[i]!.x, p.y - points[i]!.y));\n const total = lengths.reduce((a, b) => a + b, 0);\n let left = s * total;\n for (const [i, len] of lengths.entries()) {\n if (left <= len || i === lengths.length - 1) return lerpPoint(points[i]!, points[i + 1]!, len === 0 ? 0 : Math.min(left / len, 1));\n left -= len;\n }\n return points[points.length - 1]!;\n}\n\n/** `count` points spread evenly along the straight line from `start` to\n * `end`, its ends left off. */\nconst straightRun = (count: number, start: Vec2, end: Vec2): Vec2[] =>\n Array.from({ length: count }, (_, k) => lerpPoint(start, end, (k + 1) / (count + 1)));\n\n/** `points` as `count` points spread along the same run, its ends kept. A\n * run of none is the straight line from `start` to `end`. */\nfunction respread(points: readonly Vec2[], count: number, start: Vec2, end: Vec2): Vec2[] {\n if (points.length === count) return [...points];\n if (points.length === 0) return straightRun(count, start, end);\n return Array.from({ length: count }, (_, k) => along(points, count === 1 ? 0.5 : k / (count - 1)));\n}\n\n/**\n * The routes a run eases: every edge `routes` lays out that the run will\n * rewrite, whether its route or the ports its ends name. A route gaining\n * waypoints starts on the straight line between its ends' centers; one losing\n * them ends there.\n */\nexport function routeEasings<TPose>(\n scene: Scene<unknown, string, TPose>,\n graph: Graph,\n routes: LayoutRoutes,\n): RouteEasing[] {\n const centerOf = (id: string): Vec2 | null => {\n const ids = graph.node(id) !== undefined ? [id] : graph.groups?.find((g) => g.id === id)?.members ?? [];\n const boxes = ids.flatMap((m) => graph.node(m)?.bounds ?? []);\n if (boxes.length === 0) return null;\n const x0 = Math.min(...boxes.map((b) => b.x));\n const y0 = Math.min(...boxes.map((b) => b.y));\n const x1 = Math.max(...boxes.map((b) => b.x + b.width));\n const y1 = Math.max(...boxes.map((b) => b.y + b.height));\n return { x: (x0 + x1) / 2, y: (y0 + y1) / 2 };\n };\n const writes = routeWrites(scene as never, routes);\n const out: RouteEasing[] = [];\n for (const id of routes.edges) {\n const node = scene.get(id as NodeId);\n const edge = node === undefined ? null : diagramEdgeOf(node);\n const written = writes.get(id);\n if (node === undefined || edge === null || written === undefined) continue;\n const next = diagramEdgeOf({ data: written });\n if (next === null) continue;\n const ends = { from: next.from, to: next.to };\n const was = edge.waypoints ?? [];\n if (!layoutWritesRoute(edge)) {\n out.push({ id, from: was, to: was, ends });\n continue;\n }\n const after = routes.waypoints.get(id) ?? [];\n if (after.length === 0) {\n out.push({ id, from: was, to: null, ends });\n continue;\n }\n const deps = Array.isArray(node.dependsOn) ? node.dependsOn : [];\n const [a, b] = deps.length === 2 ? [centerOf(deps[0]!), centerOf(deps[1]!)] : [null, null];\n if (a === null || b === null) continue;\n const count = Math.max(was.length, after.length);\n out.push({ id, from: respread(was, count, a, b), to: respread(after, count, a, b), ends });\n }\n return out;\n}\n\n/**\n * Each eased route's path `u` of the way there, drawn by the edge's own\n * `derivePath` with its ends where `poseOf` puts them. A node `poseOf` does\n * not place is drawn where the scene shows it, unless it derives its pose —\n * a group's box — when it is derived afresh from where this frame puts what\n * it depends on. An edge that derives no path is left out.\n */\nexport function easedPaths<TPose>(\n scene: Scene<unknown, string, TPose>,\n easings: readonly RouteEasing[],\n u: number,\n poseOf: (id: string) => TPose | undefined,\n geometry: PoseDescriptor<TPose> = AUTO_POSE_DESCRIPTOR as PoseDescriptor<TPose>,\n): Map<string, Path> {\n const depOf = frameDeps(scene, poseOf);\n const centerOf = (dep: DerivedDep<TPose>): Vec2 => {\n const b = geometry.getBounds(dep.pose);\n return { x: b.x + b.width / 2, y: b.y + b.height / 2 };\n };\n const out = new Map<string, Path>();\n for (const { id, from, to, ends } of easings) {\n const node = scene.get(id as NodeId);\n if (node?.derivePath === undefined || !Array.isArray(node.dependsOn)) continue;\n const deps = node.dependsOn.map(depOf);\n let target = to;\n if (target === null) {\n const [a, b] = deps;\n target = u >= 1 || a === undefined || b === undefined ? [] : straightRun(from.length, centerOf(a), centerOf(b));\n }\n const waypoints = target.length === 0 && u >= 1 ? [] : from.map((p, k) => lerpPoint(p, target[k]!, u));\n const data = node.data as { diagram: object };\n const diagram = { ...data.diagram, ...ends, waypoints };\n const path = node.derivePath({ ...node, data: { ...data, diagram } } as never, deps);\n if (path !== null) out.set(id, path);\n }\n return out;\n}\n\n/** Each node as this frame draws it: where `poseOf` puts it, else derived from\n * where this frame puts its dependencies, else where the scene shows it. */\nfunction frameDeps<TPose>(\n scene: Scene<unknown, string, TPose>,\n poseOf: (id: string) => TPose | undefined,\n): (id: string) => DerivedDep<TPose> | undefined {\n const memo = new Map<string, DerivedDep<TPose> | undefined>();\n const depOf = (id: string): DerivedDep<TPose> | undefined => {\n if (memo.has(id)) return memo.get(id);\n // Closes a cycle at the scene's answer rather than recursing forever.\n memo.set(id, derivedDepOf(scene, id as NodeId));\n const shown = memo.get(id);\n if (shown === undefined) return undefined;\n const pose = poseOf(id) ?? derivedFromFrame(scene, shown, depOf) ?? shown.pose;\n const dep: DerivedDep<TPose> = { node: shown.node, pose, get path() { return shown.path; } };\n memo.set(id, dep);\n return dep;\n };\n return depOf;\n}\n\n/** `shown`'s pose derived from where this frame draws its dependencies, or\n * `undefined` when it derives none or something else holds it this frame. */\nfunction derivedFromFrame<TPose>(\n scene: Scene<unknown, string, TPose>,\n shown: DerivedDep<TPose>,\n depOf: (id: string) => DerivedDep<TPose> | undefined,\n): TPose | undefined {\n const { node } = shown;\n if (node.derivePose === undefined || scene.overrides.read(node.id)?.pose !== undefined) return undefined;\n const ids = node.dependsOn === 'children' ? scene.childrenOf(node.id) : node.dependsOn ?? [];\n if (ids.length === 0) return undefined;\n return node.derivePose(node as never, ids.map(depOf)) ?? undefined;\n}\n\n/** A claim on some edges' paths in the override channel. */\nexport interface PathHold {\n /** Show these paths, and stop showing any other this hold showed. */\n show(paths: ReadonlyMap<string, Path>): void;\n /** Stop showing every path this hold shows, revealing whatever other\n * writers' overrides lie under each. */\n drop(): void;\n}\n\n/** A {@link PathHold} on `scene`'s override channel. Its writes are published\n * with the next `commit` of the channel, which the run's own pose frame makes. */\nexport function pathHold<TPose>(scene: Scene<unknown, string, TPose>): PathHold {\n const held = new Map<string, PoseOverride<TPose>>();\n const release = (id: string, entry: PoseOverride<TPose>) => {\n held.delete(id);\n scene.overrides.clear(id as NodeId, entry);\n };\n return {\n show(paths) {\n for (const [id, entry] of held) if (!paths.has(id)) release(id, entry);\n for (const [id, path] of paths) {\n const entry = held.get(id);\n if (entry !== undefined && scene.overrides.has(id as NodeId, entry)) {\n entry.path = path;\n continue;\n }\n const fresh: PoseOverride<TPose> = { path };\n held.set(id, fresh);\n scene.overrides.set(id as NodeId, fresh);\n }\n },\n drop() {\n for (const [id, entry] of held) release(id, entry);\n },\n };\n}\n\n/** The routes a live run eases, and where it shows them. Stable for the life\n * of the component, and drops what it shows when the component unmounts. */\nexport interface EasedRoutes<TPose> {\n /** The routes the run now eases; any shown before stop showing. */\n set(easings: readonly RouteEasing[]): void;\n /** Show each route `u` of the way there, its ends where `poseOf` puts\n * them; `null` shows none. `geometry` reads the poses' bounds. */\n show(\n scene: Scene<unknown, string, TPose>,\n u: number | null,\n poseOf: (id: string) => TPose | undefined,\n geometry?: PoseDescriptor<TPose>,\n ): void;\n /** Stop showing them. */\n drop(): void;\n}\n\nexport function useEasedRoutes<TPose>(): EasedRoutes<TPose> {\n const easings = useRef<readonly RouteEasing[]>([]);\n const held = useRef<{ scene: Scene<unknown, string, TPose>; hold: PathHold } | null>(null);\n const routes = useMemo<EasedRoutes<TPose>>(() => ({\n set(next) {\n held.current?.hold.drop();\n easings.current = next;\n },\n show(scene, u, poseOf, geometry) {\n if (u === null) held.current?.hold.drop();\n if (u === null || easings.current.length === 0) return;\n if (held.current?.scene !== scene) {\n held.current?.hold.drop();\n held.current = { scene, hold: pathHold(scene) };\n }\n held.current.hold.show(easedPaths(scene, easings.current, u, poseOf, geometry));\n },\n drop() {\n held.current?.hold.drop();\n },\n }), []);\n useEffect(() => () => routes.drop(), [routes]);\n return routes;\n}\n","/**\n * Layout you can watch, and push against.\n *\n * A live layout is a producer on core's `usePoseRun`: each frame it hands back\n * where the participants are, the run publishes that to the scene's override\n * channel, and the whole thing commits as one batch when it settles. Nothing\n * here writes the document.\n *\n * Two producers: `force` is a relaxation whose target changes every tick;\n * `layered` and `tree` know where they are going, so they ease into it. So\n * does a `LayoutPlanner`, once it answers.\n *\n * **A node another gesture owns is a pin.** `force` holds it with `fx`/`fy`\n * and relaxes its neighbors around it, and an eased layout leaves it alone, so\n * dragging a body mid-run is the consumer's ordinary move tool.\n */\nimport { useCallback, useEffect, useMemo, useRef } from 'react';\nimport {\n useLatest,\n usePoseRun,\n type NodeId,\n type PoseDescriptor,\n type PoseRunCtx,\n type PoseRunStep,\n type Scene,\n} from '@weasel-js/core';\nimport { type EasingFn } from '@weasel-js/animator';\nimport { isPromise } from './footprint';\nimport { buildGraph, type Graph, type GraphSource } from './graph';\nimport { chain } from './chain';\nimport { grid } from './grid';\nimport { layered } from './layered';\nimport { LAYOUTS, layoutPoses } from './layoutAction';\nimport { planOf, plannerPlan, type LayoutFn, type LayoutOptions, type LayoutPlan, type LayoutPlanner } from './layout';\nimport { sameGraph, shapeOf, usePendingPlan } from './livePlan';\nimport {\n EASE_FRAMES,\n easeInOut,\n easedProducer,\n forceProducer,\n progress,\n type ForceProducerOptions,\n type LiveLayoutProducer,\n} from './liveProducers';\nimport { routeEasings, useEasedRoutes } from './liveRoutes';\nimport { routeWrites, routesOf, type LayoutRoutes } from './routeWrites';\nimport { tree } from './tree';\nimport type { DiagramNodeReader } from './trait';\n\nexport {\n easedProducer,\n forceProducer,\n type EasedProducerOptions,\n type ForceProducerOptions,\n type LiveLayoutCtx,\n type LiveLayoutFrame,\n type LiveLayoutProducer,\n} from './liveProducers';\n\n/** Options for {@link useLiveLayout}. Only `scene` and `source` are required. */\nexport interface UseLiveLayoutOptions<TPose> {\n scene: Scene<unknown, string, TPose>;\n /** Where the graph is read from. The same thunk the port affordance takes. */\n source: GraphSource<TPose>;\n /** A key in `LAYOUTS`, a layout of the consumer's own, or a planner that\n * answers later. `'force'` relaxes continuously; anything else eases to its\n * answer. Default `'force'`. */\n algorithm?: string | LayoutFn | LayoutPlanner;\n layout?: LayoutOptions;\n /** The relaxation's forces, and when a live run of it counts as at rest. */\n force?: Omit<ForceProducerOptions<TPose>, 'geometry'>;\n /** Frames an eased layout takes to arrive. Default 24. */\n frames?: number;\n easing?: EasingFn;\n read?: DiagramNodeReader;\n geometry?: PoseDescriptor<TPose>;\n /** The undo entry's name. Default `'Layout'`. */\n label?: string;\n /** Fires once the run has settled or been stopped and its poses are in the\n * document, with how many participants moved. */\n onSettle?: (moved: number) => void;\n /** Hears why a `LayoutPlanner` failed to answer, and no run starts. Unset,\n * the failure goes to `console.error`. */\n onError?: (error: unknown) => void;\n /** Whether a node or edge appearing or disappearing re-heats the run.\n * Default true — a diagram that ignores a new edge looks broken. */\n reheatOnGraphChange?: boolean;\n /** Clock injection, for tests. Defaults to `requestAnimationFrame`. */\n requestFrame?: (cb: (t: number) => void) => number;\n cancelFrame?: (handle: number) => void;\n}\n\n/** Controls for a live layout run, from {@link useLiveLayout}. */\nexport interface LiveLayout {\n /** Heat and run. Idempotent while running, which includes waiting on a\n * planner's answer. */\n start(): void;\n /** Finish now: commit where the nodes stand. A planner's answer still to\n * come is dropped. */\n stop(): void;\n /** Abandon: the document keeps the poses it had. */\n cancel(): void;\n /** Rebuild the graph and run again from where the nodes are now. */\n restart(): void;\n isRunning(): boolean;\n}\n\n/** The graph `o.source` describes now. */\nfunction graphOf<TPose>(o: UseLiveLayoutOptions<TPose>): Graph {\n return buildGraph(o.source, {\n ...(o.read ? { read: o.read } : {}),\n ...(o.geometry ? { geometry: o.geometry } : {}),\n });\n}\n\n/** What `o.algorithm` plans for `graph`: `null` for a relaxation, which has\n * no destination, and a promise from a planner that answers later. */\nfunction planFor<TPose>(graph: Graph, o: UseLiveLayoutOptions<TPose>): LayoutPlan | Promise<LayoutPlan> | null {\n const algorithm = o.algorithm ?? 'force';\n if (algorithm === 'force') return null;\n if (typeof algorithm === 'object') return plannerPlan(algorithm, graph, o.layout);\n return planOf(typeof algorithm === 'function' ? algorithm : LAYOUTS[algorithm] ?? layered, graph, o.layout);\n}\n\n/** The producer that eases from `graph` to `plan`, or relaxes `graph` when\n * there is no plan. */\nfunction producerFor<TPose>(graph: Graph, plan: LayoutPlan | null, o: UseLiveLayoutOptions<TPose>): LiveLayoutProducer<TPose> {\n if (plan === null) return forceProducer<TPose>(graph, { ...o.layout, ...o.force, ...(o.geometry ? { geometry: o.geometry } : {}) });\n return easedProducer<TPose>(graph, () => plan.moves, {\n ...(o.frames === undefined ? {} : { frames: o.frames }),\n ...(o.easing ? { easing: o.easing } : {}),\n });\n}\n\n/**\n * Run a layout live against a scene.\n *\n * The returned handle is stable. Dragging a participant while it runs needs no\n * wiring: the consumer's move tool publishes an override, and the run treats\n * that as a pin.\n */\nexport function useLiveLayout<TPose>(opts: UseLiveLayoutOptions<TPose>): LiveLayout {\n const optsRef = useLatest(opts);\n\n const producer = useRef<LiveLayoutProducer<TPose> | null>(null);\n const producerFrame = useRef(0);\n const shape = useRef('');\n /** The routes the run's layout laid out, written once it arrives. */\n const routes = useRef<LayoutRoutes | undefined>(undefined);\n /** Whether a gesture held a participant during the run: the routes were\n * laid out around where it was going, not where it was put. */\n const held = useRef(false);\n const eased = useEasedRoutes<TPose>();\n\n const pending = usePendingPlan();\n\n /** Set the run up to ease from `graph` to `plan`, or to relax it when\n * there is no plan. */\n const install = useCallback((graph: Graph, plan: LayoutPlan | null): void => {\n const o = optsRef.current;\n producerFrame.current = 0;\n held.current = false;\n routes.current = routesOf(graph, plan ?? { moves: new Map() });\n eased.set(routeEasings(o.scene, graph, routes.current));\n producer.current = producerFor(graph, plan, o);\n }, [optsRef, eased]);\n\n const step = useCallback((ctx: PoseRunCtx<TPose>): PoseRunStep<TPose> => {\n const o = optsRef.current;\n if (producer.current === null) return { poses: [], done: true };\n if (ctx.pinned.size > 0) held.current = true;\n const frame = producerFrame.current++;\n const { result, done } = producer.current({ pinned: ctx.pinned, frame });\n // A pinned participant takes its subtree out of the frame with it: its\n // rows and labels are ids of their own, and left in they would be\n // published from the pose the document still holds.\n let placed = result;\n if (ctx.pinned.size > 0) {\n const held = new Map(result);\n for (const id of ctx.pinned.keys()) held.delete(id as string);\n placed = held;\n }\n const poses = layoutPoses(o.scene, placed, o.geometry);\n // Routes ease only toward where they will be written, which a held run never writes.\n const { u } = progress(frame, o.frames ?? EASE_FRAMES, o.easing ?? easeInOut);\n eased.show(o.scene, held.current ? null : u, (id) => poses.get(id) ?? ctx.pinned.get(id as NodeId), o.geometry);\n return { poses: [...poses] as [NodeId, TPose][], done };\n }, [optsRef, eased]);\n\n const run = usePoseRun<TPose>({\n scene: opts.scene,\n step,\n // Eased routes go once the routes are in the document, so no frame shows the old ones.\n onCommit: (moved) => { eased.drop(); optsRef.current.onSettle?.(moved); },\n // Routes match where the layout was going, so only a run that got there\n // with nothing held along the way writes them.\n commitWith: (finished) => {\n if (!finished || held.current || routes.current === undefined) return;\n const scene = optsRef.current.scene;\n for (const [id, data] of routeWrites(scene as never, routes.current)) scene.update(id as never, { data });\n },\n ...(opts.label ? { label: opts.label } : {}),\n ...(opts.requestFrame ? { requestFrame: opts.requestFrame } : {}),\n ...(opts.cancelFrame ? { cancelFrame: opts.cancelFrame } : {}),\n });\n\n /** Read the graph and set the run up on it: true once it is ready to run,\n * false while a planner's answer is on its way, after which it starts the\n * run itself. */\n const build = useCallback((): boolean => {\n const graph = graphOf(optsRef.current);\n shape.current = shapeOf(graph);\n const plan = planFor(graph, optsRef.current);\n if (plan === null || !isPromise(plan)) {\n install(graph, plan);\n return true;\n }\n pending.request(plan, (answer) => {\n if (!sameGraph(graph, graphOf(optsRef.current))) return;\n install(graph, answer);\n run.start();\n }, (error) => {\n const onError = optsRef.current.onError;\n if (onError) onError(error);\n else console.error(error);\n });\n return false;\n }, [optsRef, install, pending, run]);\n\n /** Abandon whatever is running or awaited, and start again from where the\n * nodes are now. */\n const restart = useCallback((): void => {\n pending.drop();\n run.cancel();\n if (build()) run.start();\n }, [pending, run, build]);\n\n // A node or edge appearing or disappearing is a new problem, so the run\n // re-heats rather than finishing the one it started on. A planner is asked\n // again, since its answer has no place for what changed.\n useEffect(() => {\n if (opts.reheatOnGraphChange === false) return;\n return opts.scene.subscribe(() => {\n if (!run.isRunning() && !pending.isWaiting()) return;\n if (shapeOf(graphOf(optsRef.current)) === shape.current) return;\n if (typeof optsRef.current.algorithm === 'object') restart();\n else build();\n });\n }, [opts.scene, opts.reheatOnGraphChange, run, build, restart, pending, optsRef]);\n\n return useMemo<LiveLayout>(() => ({\n start() {\n if (run.isRunning() || pending.isWaiting()) return;\n if (build()) run.start();\n },\n stop: () => { pending.drop(); run.stop(); },\n cancel: () => { pending.drop(); run.cancel(); eased.drop(); },\n restart,\n isRunning: () => run.isRunning() || pending.isWaiting(),\n }), [run, build, restart, eased, pending]);\n}\n\n/** The layouts that ease rather than relax, for a consumer choosing one. */\nexport const EASED_LAYOUTS: Readonly<Record<string, LayoutFn>> = Object.freeze({\n layered,\n tree,\n chain,\n grid,\n});\n","import { polylineFromPoints, type Path } from '@weasel-js/core';\nimport { layoutBody } from './body';\nimport { recordedRows } from './bodyRelayout';\nimport type { Bounds } from './outline';\nimport type { DiagramNode } from './types';\n\n/** The rule each divider row of a built body draws when the body is at `box`, laid out from the row\n * heights its trait records. Empty for a body with no dividers. */\nexport function bodyRules(trait: DiagramNode, box: Bounds): Path[] {\n const layout = trait.body;\n if (layout?.dividers === undefined || trait.outline === undefined) return [];\n const rows = recordedRows(layout);\n if (rows === null) return [];\n const spec = { outline: trait.outline, rows, padding: layout.padding, gap: layout.gap, verticalAlign: layout.verticalAlign };\n return layoutBody(spec, box).filter((b) => b.row.kind === 'divider').map((b) => {\n const y = b.y + b.height / 2;\n return polylineFromPoints([{ x: b.x, y }, { x: b.x + b.width, y }]);\n });\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 polylineFromPoints,\n RECT_POSE_DESCRIPTOR,\n registerNodeShape,\n resolveFill,\n resolveStroke,\n type NodeShapeEntry,\n type Path,\n type PoseDescriptor,\n type Stroke,\n type Fill,\n type Inherit,\n} from '@weasel-js/core';\nimport { bodyRules } from './bodyRules';\nimport { outlineDetail, outlinePath, outlineSolid, type Outline } from './outline';\nimport { diagramContainerOf, headerBox, laneOutlineOf } from './containers/trait';\nimport { diagramNodeOf, type DiagramNodeReader } from './trait';\nimport { sequencePartOf } from './sequence/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}\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: 'mark' | 'group'; data: unknown }) =>\n diagramNodeOf(node, opts.read)?.outline ?? laneOutlineOf(node) ?? sequenceOutlineOf(node);\n\n return {\n id: opts.id ?? 'diagram:outline',\n matches: (node) => outlineOf(node) !== undefined,\n paint: (node, pose, ctx) => {\n const outline = outlineOf(node);\n if (outline === undefined) return [];\n const d = node.data as { fill?: Fill | Inherit | null; stroke?: Stroke | Inherit | null };\n const box = geometry.getBounds(pose);\n const declaredFill = resolveFill(d.fill, ctx?.inherited?.fill);\n const declaredStroke = resolveStroke(d.stroke, ctx?.inherited?.stroke);\n const fill = declaredFill && commandFill(declaredFill, box);\n const stroke = declaredStroke && commandStroke(declaredStroke, box);\n const header = headerBox(box, diagramContainerOf(node)?.header);\n const divider = header === null || !stroke ? [] : [{ kind: 'path' as const, path: dividerPath(box, header), stroke }];\n const detailPath = stroke ? outlineDetail(outline, box) : null;\n const detail = stroke && detailPath ? [{ kind: 'path' as const, path: detailPath, stroke }] : [];\n const solidPath = declaredStroke ? outlineSolid(outline, box) : null;\n const solidFill = declaredStroke && solidPath ? commandFill({ paint: declaredStroke.paint }, box) : null;\n const solid = solidPath && solidFill ? [{ kind: 'path' as const, path: solidPath, fill: solidFill }] : [];\n const trait = diagramNodeOf(node, opts.read);\n const rules = stroke && trait !== null ? bodyRules(trait, box).map((path) => ({ kind: 'path' as const, path, stroke })) : [];\n return [{\n kind: 'path',\n path: outlinePath(outline, box),\n ...(fill ? { fill } : {}),\n ...(stroke ? { stroke } : {}),\n }, ...solid, ...detail, ...rules, ...divider];\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/** A sequence part's outline: its head, note, or box, which the sequence draws and no connector meets. */\nfunction sequenceOutlineOf(node: { data: unknown }): Outline | undefined {\n if (sequencePartOf(node) === null) return undefined;\n return (node.data as { diagram?: { outline?: Outline } }).diagram?.outline;\n}\n\ntype Box = { x: number; y: number; width: number; height: number };\n\n/** The line between a container's header and its body. */\nfunction dividerPath(box: Box, header: Box): Path {\n return header.width < box.width\n ? polylineFromPoints([{ x: header.x + header.width, y: box.y }, { x: header.x + header.width, y: box.y + box.height }])\n : polylineFromPoints([{ x: box.x, y: header.y + header.height }, { x: box.x + box.width, y: header.y + header.height }]);\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 { diagramContainerOf } from './containers/trait';\nimport { diagramGroupOf } from './group';\nimport { dataKeyReader, type DiagramNodeLike } from './trait';\n\ntype Like = { data: unknown };\n\n/** A built shape body: a participant that is neither a region nor a diagram group. */\nexport const isDiagramBody = (node: Like): boolean =>\n diagramContainerOf(node) === null && diagramGroupOf(node) === null\n && dataKeyReader(node as DiagramNodeLike) !== null;\n\n/** A body or a region: what a diagram's own box is made of. */\nexport const isBodyOrRegion = (node: Like): boolean =>\n diagramContainerOf(node) !== null || isDiagramBody(node);\n","/**\n * The edits a sequence takes, each a pure function from one `SequenceData` to\n * the next. A no-op returns the data it was given, so a caller can tell\n * nothing changed by identity.\n */\nimport type { SeqFragment, SeqStep, SeqTextTarget, SequenceData, StepPlace } from './types';\n\ntype Steps = readonly SeqStep[];\n\n/** Whether two places are in the same list. */\nexport const sameList = (a: StepPlace['parent'], b: StepPlace['parent']): boolean =>\n a === b || (a !== null && b !== null && a.fragment === b.fragment && a.section === b.section);\n\n/** Whether `s` carries an id: a message, a note, or a fragment. */\nexport const hasId = (s: SeqStep): s is Extract<SeqStep, { id: string }> => 'id' in s;\n\n/** The step list `parent` names: the top level, or one section of a fragment anywhere in `steps`. `null` when there is none. */\nexport function stepListOf(steps: Steps, parent: StepPlace['parent']): Steps | null {\n if (parent === null) return steps;\n const frag = findStep(steps, parent.fragment);\n return frag?.kind === 'fragment' ? frag.sections[parent.section]?.steps ?? null : null;\n}\n\n/** The step with `id`, at any depth. */\nexport function findStep(steps: Steps, id: string): SeqStep | null {\n for (const s of steps) {\n if (hasId(s) && s.id === id) return s;\n if (s.kind === 'fragment') {\n for (const section of s.sections) {\n const found = findStep(section.steps, id);\n if (found !== null) return found;\n }\n }\n }\n return null;\n}\n\n/** Where the step with `id` stands. */\nexport function placeOf(steps: Steps, id: string, parent: StepPlace['parent'] = null): StepPlace | null {\n for (const [index, s] of steps.entries()) {\n if (hasId(s) && s.id === id) return { parent, index };\n if (s.kind === 'fragment') {\n for (const [k, section] of s.sections.entries()) {\n const found = placeOf(section.steps, id, { fragment: s.id, section: k });\n if (found !== null) return found;\n }\n }\n }\n return null;\n}\n\n/** `steps` with every step `fn` maps, fragments' sections included, rebuilt only along changed paths. */\nexport function mapSteps(steps: Steps, fn: (s: SeqStep) => SeqStep): Steps {\n let changed = false;\n const out = steps.map((s) => {\n let next = fn(s);\n if (next.kind === 'fragment') {\n const frag = next;\n const sections = frag.sections.map((section) => {\n const inner = mapSteps(section.steps, fn);\n return inner === section.steps ? section : { ...section, steps: inner };\n });\n if (sections.some((sec, k) => sec !== frag.sections[k])) next = { ...frag, sections };\n }\n if (next !== s) changed = true;\n return next;\n });\n return changed ? out : steps;\n}\n\n/**\n * `steps` with every step `fn` maps, at any depth, and those it maps to\n * `null` dropped; a fragment is mapped after its sections are. Rebuilt only\n * along changed paths.\n */\nexport function pruneSteps(steps: Steps, fn: (s: SeqStep) => SeqStep | null): Steps {\n let changed = false;\n const out: SeqStep[] = [];\n for (const s of steps) {\n let step: SeqStep = s;\n if (s.kind === 'fragment') {\n const sections = s.sections.map((sec) => {\n const inner = pruneSteps(sec.steps, fn);\n return inner === sec.steps ? sec : { ...sec, steps: inner };\n });\n if (sections.some((sec, k) => sec !== s.sections[k])) step = { ...s, sections };\n }\n const next = fn(step);\n if (next !== s) changed = true;\n if (next !== null) out.push(next);\n }\n return changed ? out : steps;\n}\n\n/** `steps` with the list at `parent` replaced by `fn` of it. */\nexport function withList(steps: Steps, parent: StepPlace['parent'], fn: (list: Steps) => Steps): Steps {\n if (parent === null) return fn(steps);\n return mapSteps(steps, (s) => {\n if (s.kind !== 'fragment' || s.id !== parent.fragment) return s;\n const sections = s.sections.map((sec, k) => (k === parent.section ? { ...sec, steps: fn(sec.steps) } : sec));\n return { ...s, sections } satisfies SeqFragment;\n });\n}\n\nconst contains = (step: SeqStep, id: string): boolean =>\n step.kind === 'fragment' && step.sections.some((sec) => sec.steps.some((s) => (hasId(s) && s.id === id) || contains(s, id)));\n\n/**\n * The step `id` moved to `to`, whose `index` counts the list as it stands\n * before the move. A fragment cannot move into itself.\n */\nexport function moveStep(data: SequenceData, id: string, to: StepPlace): SequenceData {\n const from = placeOf(data.steps, id);\n const step = findStep(data.steps, id);\n if (from === null || step === null) return data;\n if (to.parent !== null && (to.parent.fragment === id || contains(step, to.parent.fragment))) return data;\n if (stepListOf(data.steps, to.parent) === null) return data;\n const within = sameList(from.parent, to.parent);\n if (within && (to.index === from.index || to.index === from.index + 1)) return data;\n const removed = withList(data.steps, from.parent, (list) => list.filter((_, i) => i !== from.index));\n const index = within && to.index > from.index ? to.index - 1 : to.index;\n const steps = withList(removed, to.parent, (list) => [...list.slice(0, index), step, ...list.slice(index)]);\n return { ...data, steps };\n}\n\n/** Participant `id` moved to `index` among them, counted as they stand before the move. */\nexport function moveParticipant(data: SequenceData, id: string, index: number): SequenceData {\n const from = data.participants.findIndex((p) => p.id === id);\n if (from < 0 || index === from || index === from + 1) return data;\n const p = data.participants[from]!;\n const rest = data.participants.filter((_, i) => i !== from);\n const at = index > from ? index - 1 : index;\n return { ...data, participants: [...rest.slice(0, at), p, ...rest.slice(at)] };\n}\n\n/** Message `id`'s `end` moved to `participant`'s lifeline. */\nexport function reconnectMessage(data: SequenceData, id: string, end: 'from' | 'to', participant: string): SequenceData {\n const step = findStep(data.steps, id);\n if (step?.kind !== 'message' || step[end] === participant || !data.participants.some((p) => p.id === participant)) return data;\n return { ...data, steps: mapSteps(data.steps, (s) => (s === step ? { ...step, [end]: participant } : s)) };\n}\n\n/** `data` with `target`'s text set to `text`. Empty text clears a label; a note keeps its text as given. */\nexport function setSequenceText(data: SequenceData, target: SeqTextTarget, text: string): SequenceData {\n if ('participant' in target) {\n const at = data.participants.findIndex((p) => p.id === target.participant);\n const p = data.participants[at];\n if (p === undefined || (p.label ?? p.id) === text) return data;\n const { label: _label, ...rest } = p;\n const next = text === '' || text === p.id ? rest : { ...rest, label: text };\n return { ...data, participants: data.participants.map((q, i) => (i === at ? next : q)) };\n }\n if ('box' in target) {\n const boxes = data.boxes?.map((b) => {\n if (b.id !== target.box || (b.label ?? '') === text) return b;\n const { label: _label, ...rest } = b;\n return text === '' ? rest : { ...rest, label: text };\n });\n return boxes === undefined || boxes.every((b, i) => b === data.boxes![i]) ? data : { ...data, boxes };\n }\n if ('fragment' in target) {\n const steps = mapSteps(data.steps, (s) => {\n if (s.kind !== 'fragment' || s.id !== target.fragment) return s;\n const section = s.sections[target.section];\n if (section === undefined || (section.label ?? '') === text) return s;\n const { label: _label, ...rest } = section;\n const next = text === '' ? rest : { ...rest, label: text };\n return { ...s, sections: s.sections.map((sec, k) => (k === target.section ? next : sec)) };\n });\n return steps === data.steps ? data : { ...data, steps };\n }\n const steps = mapSteps(data.steps, (s) => {\n if (s.kind === 'note' && s.id === target.step && s.text !== text) return { ...s, text };\n if (s.kind !== 'message' || s.id !== target.step || (s.text ?? '') === text) return s;\n const { text: _text, ...rest } = s;\n return text === '' ? rest : { ...rest, text };\n });\n return steps === data.steps ? data : { ...data, steps };\n}\n\n/** The text `target` holds in `data`, as an edit opens on it. */\nexport function sequenceTextOf(data: SequenceData, target: SeqTextTarget): string | null {\n if ('participant' in target) {\n const p = data.participants.find((q) => q.id === target.participant);\n return p === undefined ? null : p.label ?? p.id;\n }\n if ('box' in target) {\n const b = data.boxes?.find((q) => q.id === target.box);\n return b === undefined ? null : b.label ?? '';\n }\n if ('fragment' in target) {\n const f = findStep(data.steps, target.fragment);\n const section = f?.kind === 'fragment' ? f.sections[target.section] : undefined;\n return section === undefined ? null : section.label ?? '';\n }\n const s = findStep(data.steps, target.step);\n return s?.kind === 'message' ? s.text ?? '' : s?.kind === 'note' ? s.text : null;\n}\n","/** The sizes a sequence is laid out with, and how its text is measured. */\nimport type { MeasureRowText, RowTextStyle } from '../body';\nimport { DEFAULT_FONT, GLYPH } from '../edgeLabel';\nimport { boxForContent, type Outline } from '../outline';\nimport type { SeqParticipant } from './types';\n\n/** The spacing a sequence keeps, in world units. */\nexport const SEQ = {\n /** Around the whole diagram. */\n margin: 12,\n /** Between a head's outline and its text. */\n headPad: 10,\n headMinWidth: 80,\n headMinHeight: 36,\n /** The least room between two heads. */\n columnGap: 32,\n /** Either side of a message's text along its line. */\n textPad: 10,\n /** Above every row. */\n rowGap: 14,\n /** Between a message's text and its line. */\n textGap: 3,\n /** A self-message's loop: how far it reaches right, and how tall it is. */\n loopWidth: 32,\n loopHeight: 20,\n /** An activation bar's width, and how far each nested one steps right. */\n barWidth: 10,\n barStep: 5,\n notePad: 6,\n noteMinWidth: 60,\n /** Between a lifeline and a note beside it. */\n noteGap: 10,\n /** How far a note over two lifelines reaches past them. */\n noteOverhang: 16,\n /** Between a fragment's box and the lifelines it holds, and between nested boxes. */\n fragmentPad: 14,\n fragmentNest: 8,\n /** Around a fragment's type label in its tab. */\n tabPad: 6,\n /** Between a box's border and the heads it holds. */\n boxPad: 10,\n /** Below the last row. */\n footer: 16,\n /** The X at a destroyed lifeline's end. */\n cross: 12,\n} as const;\n\n/** A box in world units. */\nexport interface SeqRect { x: number; y: number; width: number; height: number }\n\n/** Measures text as the layout and the specs both read it. */\nexport interface SeqMeasure {\n font: { fontFamily: string; fontSize: number };\n /** The size of `text` at `size` (default the font's), each `\\n` a line. */\n text(text: string, style?: RowTextStyle): { width: number; height: number };\n}\n\n/** A measure from `measure` (default an estimate from character count) in `font`. */\nexport function seqMeasure(measure: MeasureRowText | undefined, font = DEFAULT_FONT): SeqMeasure {\n const line: MeasureRowText = measure ?? ((text, s) => {\n const size = s.fontSize ?? font.fontSize;\n return { width: text.length * GLYPH * size, height: Math.ceil(1.4 * size) };\n });\n return {\n font,\n text: (text, style = {}) => {\n const s = { ...style, fontFamily: style.fontFamily ?? font.fontFamily, fontSize: style.fontSize ?? font.fontSize };\n const sizes = text.split('\\n').map((l) => line(l, s));\n return { width: Math.max(0, ...sizes.map((z) => z.width)), height: sizes.reduce((h, z) => h + z.height, 0) };\n },\n };\n}\n\n/** A participant's head size: its text and padding, grown to the box its outline holds them in. */\nexport function headSize(p: SeqParticipant, m: SeqMeasure): { width: number; height: number } {\n const t = m.text(p.label ?? p.id);\n const outline: Outline = p.outline ?? 'rect';\n const box = boxForContent(outline, { width: t.width + SEQ.headPad * 2, height: t.height + SEQ.headPad * 2 });\n return { width: Math.max(SEQ.headMinWidth, Math.ceil(box.width)), height: Math.max(SEQ.headMinHeight, Math.ceil(box.height)) };\n}\n","/**\n * Where each participant's lifeline stands: far enough from its neighbors\n * that every message's text, every self-message's loop, and every note fits\n * between the lifelines it sits among.\n */\nimport { SEQ, headSize, type SeqMeasure } from './metrics';\nimport type { SeqStep, SequenceData } from './types';\n\n/** A pull between two lifelines: their centers stand at least `room` apart. */\ninterface Need { a: number; b: number; room: number }\n\n/** Every step, fragments' sections flattened in, in order. */\nexport function* flatSteps(steps: readonly SeqStep[]): Iterable<SeqStep> {\n for (const s of steps) {\n yield s;\n if (s.kind === 'fragment') for (const section of s.sections) yield* flatSteps(section.steps);\n }\n}\n\n/** The room a note needs between lifelines, or past the first or last. */\nfunction noteNeeds(over: readonly number[], side: 'left' | 'right' | undefined, width: number, half: (i: number) => number): Need[] {\n const [a, b] = [Math.min(...over), Math.max(...over)];\n const room = width + SEQ.noteGap * 2;\n if (side === 'right') return [{ a, b: a + 1, room: room + half(a + 1) }];\n if (side === 'left') return [{ a: a - 1, b: a, room: room + half(a - 1) }];\n if (a === b) return [{ a: a - 1, b: a, room: width / 2 + half(a - 1) + SEQ.noteGap }, { a, b: a + 1, room: width / 2 + half(a + 1) + SEQ.noteGap }];\n return [{ a, b, room: width - SEQ.noteOverhang * 2 }];\n}\n\n/** The needs `data`'s steps put between lifelines, by index; `-1` and `n` stand for the margins. */\nfunction needsOf(data: SequenceData, m: SeqMeasure, index: ReadonlyMap<string, number>, half: (i: number) => number): Need[] {\n const out: Need[] = [];\n const numbered = data.autonumber !== undefined;\n for (const s of flatSteps(data.steps)) {\n if (s.kind === 'message') {\n const a = index.get(s.from);\n const b = index.get(s.to);\n if (a === undefined || b === undefined) continue;\n const text = (s.text ?? '') === '' ? 0 : m.text(s.text!).width;\n const room = text + SEQ.textPad * 2 + SEQ.barWidth * 2 + (numbered ? SEQ.textPad * 2 : 0);\n if (a === b) out.push({ a, b: a + 1, room: SEQ.loopWidth + room + half(a + 1) });\n else out.push({ a: Math.min(a, b), b: Math.max(a, b), room });\n } else if (s.kind === 'note') {\n const over = s.over.map((id) => index.get(id)).filter((i): i is number => i !== undefined);\n if (over.length > 0) out.push(...noteNeeds(over, s.side, Math.max(SEQ.noteMinWidth, m.text(s.text).width + SEQ.notePad * 2), half));\n }\n }\n return out;\n}\n\n/** What {@link columnsOf} places. */\nexport interface Columns {\n /** Lifeline x by participant index. */\n x: number[];\n heads: { width: number; height: number }[];\n /** The rightmost x anything in a column reaches. */\n right: number;\n}\n\n/**\n * Lifeline centers, left to right from `left`: neighbors' heads apart by the\n * column gap, boxes' borders clear of their heads, and every need met by\n * spreading what it lacks over the gaps it spans, narrowest spans first.\n */\nexport function columnsOf(data: SequenceData, m: SeqMeasure, left: number): Columns {\n const ps = data.participants;\n const heads = ps.map((p) => headSize(p, m));\n const index = new Map(ps.map((p, i) => [p.id, i]));\n const boxOf = new Map<string, string>();\n for (const b of data.boxes ?? []) for (const id of b.members) if (!boxOf.has(id)) boxOf.set(id, b.id);\n const half = (i: number) => (heads[i]?.width ?? 0) / 2;\n const boxPad = (i: number) => (i >= 0 && i < ps.length && boxOf.has(ps[i]!.id) ? SEQ.boxPad : 0);\n // gaps[i] runs from lifeline i - 1 to lifeline i; gaps[0] from the left margin, gaps[n] to the right one.\n const gaps = Array.from({ length: ps.length + 1 }, (_, i) => {\n if (i === 0) return half(0) + boxPad(0);\n if (i === ps.length) return half(i - 1) + boxPad(i - 1);\n const split = boxOf.get(ps[i - 1]!.id) !== boxOf.get(ps[i]!.id);\n return half(i - 1) + half(i) + SEQ.columnGap + (split ? boxPad(i - 1) + boxPad(i) : 0);\n });\n const needs = needsOf(data, m, index, half).sort((p, q) => (p.b - p.a) - (q.b - q.a));\n for (const { a, b, room } of needs) {\n const lo = Math.max(a, -1) + 1;\n const hi = Math.min(b, ps.length) + 1;\n let have = 0;\n for (let i = lo; i < hi; i++) have += gaps[i]!;\n const lack = room - have;\n if (lack > 0) for (let i = lo; i < hi; i++) gaps[i]! += lack / (hi - lo);\n }\n const x: number[] = [];\n let at = left;\n for (let i = 0; i < ps.length; i++) {\n at += gaps[i]!;\n x.push(at);\n }\n return { x, heads, right: at + gaps[ps.length]! };\n}\n","/**\n * The walk down a sequence's steps that gives each its row: a message its\n * text and line, a note its box, a fragment its header and sections. It\n * tracks what spans rows as it goes — open activations, heads created and\n * lifelines destroyed — and collects what each fragment's box must take in.\n */\nimport type { Columns } from './columns';\nimport type {\n SeqActivationPlace, SeqFragmentPlace, SeqHeadPlace, SeqMessagePlace, SeqNotePlace, SeqSlot,\n} from './layout';\nimport { SEQ, type SeqMeasure, type SeqRect } from './metrics';\nimport type { SeqFragment, SeqMark, SeqMarkRef, SeqMessage, SeqNote, SeqStep, SequenceData, StepPlace } from './types';\n\n/** What {@link walkRows} places; a lifeline's `y1` is `null` when it runs to the foot. */\nexport interface Rows {\n heads: SeqHeadPlace[];\n lifelines: Lifeline[];\n messages: SeqMessagePlace[];\n activations: SeqActivationPlace[];\n notes: SeqNotePlace[];\n fragments: SeqFragmentPlace[];\n slots: SeqSlot[];\n /** Below the last row. */\n bottom: number;\n}\n\n/** A lifeline as the walk tracks it; `y1` is `null` while it runs to the foot. */\ntype Lifeline = { id: string; x: number; y0: number; y1: number | null; destroyedBy?: StepPlace };\n\nconst spanOf = (rects: readonly SeqRect[]) => {\n const x0 = Math.min(...rects.map((r) => r.x));\n return { x0, x1: Math.max(...rects.map((r) => r.x + r.width)) };\n};\n\nclass RowWalk {\n readonly out: Rows = { heads: [], lifelines: [], messages: [], activations: [], notes: [], fragments: [], slots: [], bottom: 0 };\n readonly index: Map<string, number>;\n readonly created: Set<string>;\n readonly lifeline = new Map<string, Lifeline>();\n readonly bars = new Map<string, { y: number; opener: SeqMarkRef }[]>();\n /** Lifelines a `destroy` ends at the next message to them, each with where it ends if none comes. */\n readonly destroying = new Map<string, number | null>();\n readonly frames: SeqRect[][] = [];\n last: { y: number; ends: readonly string[] } | null = null;\n number: number | undefined;\n y: number;\n\n constructor(readonly data: SequenceData, readonly m: SeqMeasure, readonly cols: Columns, top: number) {\n this.index = new Map(data.participants.map((p, i) => [p.id, i]));\n this.created = new Set(flatMarks(data.steps, 'create'));\n this.number = data.autonumber;\n const shown = data.participants.filter((p) => !this.created.has(p.id));\n const tall = Math.max(SEQ.headMinHeight, ...shown.map((p) => cols.heads[this.index.get(p.id)!]!.height));\n for (const p of shown) this.placeHead(p.id, top + tall - cols.heads[this.index.get(p.id)!]!.height, false);\n for (const l of this.lifeline.values()) l.y0 = top + tall;\n this.y = top + tall;\n }\n\n cx(id: string): number { return this.cols.x[this.index.get(id)!]!; }\n\n headRect(id: string): SeqRect {\n const size = this.cols.heads[this.index.get(id)!]!;\n return { x: this.cx(id) - size.width / 2, y: 0, width: size.width, height: 0 };\n }\n\n placeHead(id: string, y: number, created: boolean): number {\n const size = this.cols.heads[this.index.get(id)!]!;\n this.out.heads.push({ id, box: { x: this.cx(id) - size.width / 2, y, width: size.width, height: size.height }, created });\n const line = { id, x: this.cx(id), y0: y + size.height, y1: null };\n this.lifeline.set(id, line);\n this.out.lifelines.push(line);\n return y + size.height;\n }\n\n /** Into every open fragment's reach. */\n touch(rect: SeqRect): void {\n for (const f of this.frames) f.push(rect);\n }\n\n /** Where a line meets `id`'s lifeline from `side`: the edge of its innermost open activation. */\n endX(id: string, side: 1 | -1): number {\n const depth = this.bars.get(id)?.length ?? 0;\n if (depth === 0) return this.cx(id);\n return this.cx(id) + side * (SEQ.barWidth / 2) + (depth - 1) * SEQ.barStep;\n }\n\n open(id: string, y: number, opener: SeqMarkRef): void {\n const stack = this.bars.get(id) ?? [];\n stack.push({ y, opener });\n this.bars.set(id, stack);\n }\n\n close(id: string, y: number, closer?: SeqMarkRef): void {\n const stack = this.bars.get(id);\n const bar = stack?.pop();\n if (bar === undefined) return;\n const start = bar.y;\n const depth = stack!.length;\n const x = this.cx(id) - SEQ.barWidth / 2 + depth * SEQ.barStep;\n const box = { x, y: start, width: SEQ.barWidth, height: Math.max(y, start + 8) - start };\n this.out.activations.push({ participant: id, depth, box, opener: bar.opener, ...(closer ? { closer } : {}) });\n }\n\n steps(list: readonly SeqStep[], parent: StepPlace['parent']): void {\n list.forEach((step, index) => {\n this.out.slots.push({ y: this.y, place: { parent, index } });\n if (step.kind === 'message') this.message(step);\n else if (step.kind === 'note') this.note(step);\n else if (step.kind === 'fragment') this.fragment(step);\n else this.mark(step, { parent, index });\n });\n this.out.slots.push({ y: this.y, place: { parent, index: list.length } });\n }\n\n message(s: SeqMessage): void {\n if (!this.index.has(s.from) || !this.index.has(s.to)) return;\n this.y += SEQ.rowGap;\n const text = (s.text ?? '') === '' ? null : this.m.text(s.text!);\n const lineY = this.y + Math.max(text === null ? 0 : text.height + SEQ.textGap, 6);\n if (s.activate !== undefined) this.open(s[s.activate], lineY, { message: s.id, flag: 'activate' });\n const self = s.from === s.to;\n const dir = self ? 1 : Math.sign(this.cx(s.to) - this.cx(s.from)) as 1 | -1;\n const x1 = this.endX(s.from, dir);\n const x2 = self ? x1 : this.endX(s.to, -dir as 1 | -1);\n const place: SeqMessagePlace = { id: s.id, y: lineY, x1, x2 };\n if (self) place.loopY = lineY + SEQ.loopHeight;\n if (text !== null) {\n const x = self ? x1 + SEQ.textGap + 2 : (x1 + x2) / 2 - text.width / 2;\n place.text = { x, y: lineY - SEQ.textGap - text.height, ...text };\n this.touch(place.text);\n }\n if (this.number !== undefined) {\n const n = this.m.text(String(this.number), { fontSize: Math.max(8, this.m.font.fontSize - 2) });\n const d = Math.max(16, n.width + 6);\n place.number = { n: this.number++, box: { x: x1 - d / 2, y: lineY - d / 2, width: d, height: d } };\n }\n this.out.messages.push(place);\n this.touch(this.headRect(s.from));\n this.touch(this.headRect(s.to));\n if (self) this.touch({ x: x1, y: lineY, width: SEQ.loopWidth, height: 0 });\n if (s.deactivate !== undefined) this.close(s[s.deactivate], self ? place.loopY! : lineY, { message: s.id, flag: 'deactivate' });\n for (const id of new Set([s.from, s.to])) {\n if (!this.destroying.delete(id)) continue;\n const line = this.lifeline.get(id);\n if (line !== undefined) line.y1 = self ? place.loopY! : lineY;\n }\n this.y = place.loopY ?? lineY;\n this.last = { y: this.y, ends: [s.from, s.to] };\n }\n\n note(s: SeqNote): void {\n const over = s.over.filter((id) => this.index.has(id));\n if (over.length === 0) return;\n this.y += SEQ.rowGap;\n const t = this.m.text(s.text);\n const width = Math.max(SEQ.noteMinWidth, t.width + SEQ.notePad * 2);\n const height = t.height + SEQ.notePad * 2;\n const xs = over.map((id) => this.cx(id));\n const [lo, hi] = [Math.min(...xs), Math.max(...xs)];\n const x = s.side === 'right' ? lo + SEQ.barWidth / 2 + SEQ.noteGap\n : s.side === 'left' ? lo - SEQ.barWidth / 2 - SEQ.noteGap - width\n : lo === hi ? lo - width / 2\n : Math.min(lo - SEQ.noteOverhang, (lo + hi) / 2 - width / 2);\n const box = { x, y: this.y, width: s.side === undefined && lo !== hi ? Math.max(width, hi - lo + SEQ.noteOverhang * 2) : width, height };\n this.out.notes.push({ id: s.id, box });\n this.touch(box);\n for (const id of over) this.touch(this.headRect(id));\n this.y += height;\n this.last = null;\n }\n\n mark(s: SeqMark, at: StepPlace): void {\n if (!this.index.has(s.participant)) return;\n this.touch(this.headRect(s.participant));\n const y = this.last?.ends.includes(s.participant) ? this.last.y : this.y + SEQ.rowGap / 2;\n if (s.kind === 'activate') this.open(s.participant, y, { place: at });\n else if (s.kind === 'deactivate') this.close(s.participant, y, { place: at });\n else if (s.kind === 'destroy') {\n this.destroying.set(s.participant, this.last?.ends.includes(s.participant) ? this.last.y : null);\n const line = this.lifeline.get(s.participant);\n if (line !== undefined) line.destroyedBy = at;\n } else if (this.out.heads.every((h) => h.id !== s.participant)) {\n this.y = this.placeHead(s.participant, this.y + SEQ.rowGap, true);\n this.last = null;\n }\n }\n\n fragment(s: SeqFragment): void {\n this.y += SEQ.rowGap;\n const top = this.y;\n const tabText = s.type === 'region' ? null : this.m.text(s.type, { bold: true });\n const tab = tabText === null ? null : { width: tabText.width + SEQ.tabPad * 2, height: tabText.height + SEQ.tabPad };\n const labels = s.sections.map((sec) => ((sec.label ?? '') === '' ? null : this.m.text(sec.label!)));\n this.y += Math.max(tab?.height ?? 0, (labels[0]?.height ?? 0) + 4, 8);\n const frame: SeqRect[] = [];\n this.frames.push(frame);\n const sections: { y: number; height: number }[] = [];\n s.sections.forEach((sec, k) => {\n if (k > 0) {\n this.y += SEQ.rowGap / 2;\n sections.push({ y: this.y, height: 0 });\n this.y += (labels[k]?.height ?? 0) + 4;\n } else sections.push({ y: top, height: 0 });\n this.steps(sec.steps, { fragment: s.id, section: k });\n this.last = null;\n });\n this.frames.pop();\n this.y += SEQ.rowGap / 2;\n const reach = frame.length > 0 ? spanOf(frame) : { x0: this.cols.x[0] ?? 0, x1: this.cols.x.at(-1) ?? 0 };\n const minWidth = (tab?.width ?? 0) + (labels[0]?.width ?? 0) + SEQ.tabPad * 4;\n const x0 = reach.x0 - SEQ.fragmentPad / 2;\n const width = Math.max(reach.x1 - reach.x0 + SEQ.fragmentPad, minWidth);\n const box = { x: x0, y: top, width, height: this.y - top };\n const place: SeqFragmentPlace = {\n id: s.id, type: s.type, box,\n sections: sections.map((sec, k) => {\n const l = labels[k];\n if (l === null || l === undefined) return { y: sec.y };\n const label = k === 0\n ? { x: x0 + (tab?.width ?? 0) + SEQ.tabPad * 2, y: top + 2, ...l }\n : { x: x0 + width / 2 - l.width / 2, y: sec.y + 2, ...l };\n return { y: sec.y, label };\n }),\n };\n if (tab !== null) place.tab = { x: x0, y: top, ...tab };\n this.out.fragments.push(place);\n this.touch({ x: box.x - SEQ.fragmentNest, y: top, width: box.width + SEQ.fragmentNest * 2, height: 0 });\n }\n}\n\n/** The participants every `kind` mark names, in order. */\nfunction flatMarks(steps: readonly SeqStep[], kind: SeqMark['kind']): string[] {\n const out: string[] = [];\n for (const s of steps) {\n if (s.kind === kind) out.push((s as SeqMark).participant);\n if (s.kind === 'fragment') for (const sec of s.sections) out.push(...flatMarks(sec.steps, kind));\n }\n return out;\n}\n\n/** Each step's row, from `top` down, under heads placed at `top`. */\nexport function walkRows(data: SequenceData, m: SeqMeasure, cols: Columns, top: number): Rows {\n const walk = new RowWalk(data, m, cols, top);\n walk.steps(data.steps, null);\n const bottom = walk.y + SEQ.rowGap;\n for (const [id, fallback] of walk.destroying) {\n const line = walk.lifeline.get(id);\n if (line !== undefined) line.y1 = fallback ?? bottom;\n }\n for (const [id, stack] of walk.bars) while (stack.length > 0) walk.close(id, bottom + SEQ.footer);\n walk.out.bottom = bottom;\n return walk.out;\n}\n","/**\n * `sequenceLayout` — where every part of a sequence diagram stands, in the\n * diagram's own frame (its top-left at the origin). Pure geometry: the specs\n * draw it, the editing reads it back to place a drop.\n */\nimport { unionRects } from '@weasel-js/geom';\nimport type { MeasureRowText } from '../body';\nimport { columnsOf } from './columns';\nimport { SEQ, seqMeasure, type SeqRect } from './metrics';\nimport { walkRows } from './rows';\nimport type { SeqFragment, SeqMarkRef, SequenceData, StepPlace } from './types';\n\nexport type { SeqRect };\n\n/** Options for {@link sequenceLayout}. */\nexport interface SequenceLayoutOptions {\n /** Measures text. Default an estimate from character count. */\n measure?: MeasureRowText;\n /** The face text is set in. Default 12px sans-serif. */\n font?: { fontFamily: string; fontSize: number };\n}\n\n/** A head: at the top, or at its `create` row. */\nexport interface SeqHeadPlace { id: string; box: SeqRect; created: boolean }\n/** A lifeline, from under its head to the foot, or to where it was destroyed: by the `destroy` mark at `destroyedBy`. */\nexport interface SeqLifelinePlace { id: string; x: number; y0: number; y1: number; destroyed: boolean; destroyedBy?: StepPlace }\n/** A message's line from `x1` (its `from` end) to `x2`, at `y`; a self-message loops down to `loopY`. */\nexport interface SeqMessagePlace {\n id: string; y: number; x1: number; x2: number; loopY?: number; text?: SeqRect; number?: { n: number; box: SeqRect };\n}\n/** An activation bar, with what opened it and what closed it; one the diagram's end closed has no `closer`. */\nexport interface SeqActivationPlace { participant: string; depth: number; box: SeqRect; opener: SeqMarkRef; closer?: SeqMarkRef }\nexport interface SeqNotePlace { id: string; box: SeqRect }\n/** A fragment's box, its type tab (none for a `region`), and each section's top and label. */\nexport interface SeqFragmentPlace {\n id: string; type: SeqFragment['type']; box: SeqRect; tab?: SeqRect; sections: { y: number; label?: SeqRect }[];\n}\nexport interface SeqBoxPlace { id: string; box: SeqRect; label?: SeqRect }\n/** Where a dragged step dropped at `y` would go. */\nexport interface SeqSlot { y: number; place: StepPlace }\n\n/** Every part of a sequence, placed. */\nexport interface SequenceLayout {\n width: number;\n height: number;\n /** Lifeline x by participant, in data order. */\n columns: readonly { id: string; x: number }[];\n heads: readonly SeqHeadPlace[];\n lifelines: readonly SeqLifelinePlace[];\n messages: readonly SeqMessagePlace[];\n activations: readonly SeqActivationPlace[];\n notes: readonly SeqNotePlace[];\n fragments: readonly SeqFragmentPlace[];\n boxes: readonly SeqBoxPlace[];\n /** Every place a step can be dropped, top to bottom. */\n slots: readonly SeqSlot[];\n}\n\n/**\n * Lays `data` out: lifelines spaced to the widest text between neighbors, a\n * row per step sized to its text, self-messages looped, heads started at\n * their `create` and lifelines ended at their `destroy`, nested activations\n * stepped right, and each fragment boxed over the lifelines its steps touch.\n */\nexport function sequenceLayout(data: SequenceData, opts: SequenceLayoutOptions = {}): SequenceLayout {\n const m = seqMeasure(opts.measure, opts.font);\n const boxLabelHeight = Math.max(0, ...(data.boxes ?? []).map((b) => ((b.label ?? '') === '' ? 0 : m.text(b.label!).height + 4)));\n const cols = columnsOf(data, m, SEQ.margin);\n const top = SEQ.margin + (data.boxes?.length ? SEQ.boxPad : 0) + boxLabelHeight;\n const rows = walkRows(data, m, cols, top);\n const columns = data.participants.map((p, i) => ({ id: p.id, x: cols.x[i]! }));\n const foot = rows.bottom + SEQ.footer;\n const lifelines = rows.lifelines.map((l) => ({ ...l, y1: l.y1 ?? foot, destroyed: l.y1 !== null }));\n const boxes = (data.boxes ?? []).flatMap((b): SeqBoxPlace[] => {\n const heads = rows.heads.filter((h) => b.members.includes(h.id)).map((h) => h.box);\n const around = unionRects(heads);\n if (around === null) return [];\n const label = (b.label ?? '') === '' ? null : m.text(b.label!);\n const x = around.x - SEQ.boxPad;\n const width = around.width + SEQ.boxPad * 2;\n const y = SEQ.margin;\n const box = { x, y, width, height: foot + SEQ.boxPad - y };\n return [{ id: b.id, box, ...(label ? { label: { x: x + (width - label.width) / 2, y: y + 2, ...label } } : {}) }];\n });\n const all = unionRects([\n ...rows.heads.map((h) => h.box), ...rows.notes.map((n) => n.box), ...rows.fragments.map((f) => f.box), ...boxes.map((b) => b.box),\n ...rows.messages.flatMap((msg) => (msg.text ? [msg.text] : [])),\n { x: 0, y: 0, width: cols.right, height: foot },\n ])!;\n return {\n width: Math.ceil(all.x + all.width + SEQ.margin),\n height: Math.ceil(Math.max(foot, all.y + all.height) + SEQ.margin),\n columns, heads: rows.heads, lifelines, messages: rows.messages, activations: rows.activations, notes: rows.notes,\n fragments: rows.fragments, boxes, slots: rows.slots,\n };\n}\n","/**\n * `sequenceSpecs` — a sequence diagram as scene specs: one root holding the\n * `SequenceData`, and every part drawn from it as a child the root owns. The\n * parts take no press of their own; an edit replaces the root's data and\n * builds them again.\n */\nimport { RIGID_POSE_COMPOSITION, localizeWorldPoses, type PoseComposition, type RectPose } from '@weasel-js/core';\nimport type { Vec2 } from '@weasel-js/core/math';\nimport type { MeasureRowText } from '../body';\nimport { withColors } from '../dataColors';\nimport type { DiagramSceneData, DiagramSpec, NodeStyle } from '../dataTypes';\nimport { contentBox, type Outline } from '../outline';\nimport { diagramThemeFrom, roleEdgeStyle, roleStyle, themeFont } from '../theme/resolve';\nimport type { DiagramTheme } from '../theme/types';\nimport { sequenceLayout, type SequenceLayout } from './layout';\nimport { SEQ, type SeqRect } from './metrics';\nimport type { SeqPartKind, SeqPartTrait, SequenceGeometry } from './trait';\nimport type { SeqMarkRef, SeqStep, SeqTextTarget, SequenceData } from './types';\nimport { flatSteps } from './columns';\n\n/** The theme role each kind of part is drawn in, where its data names none. */\nexport const SEQUENCE_ROLES = { note: 'warning', number: 'accent' } as const;\n\n/** Options for {@link sequenceSpecs}. */\nexport interface SequenceSpecsOptions<TLayer extends string = 'main'> {\n /** The root's id; every part's id starts with it. */\n id: string;\n /** Where the diagram's top-left corner stands. Default the origin. */\n at?: Vec2;\n /** Default `'main'`. */\n layer?: TLayer;\n /** Default the night theme. */\n theme?: DiagramTheme;\n /** Default the theme's face. */\n font?: { fontFamily: string; fontSize: number };\n /** Measures text. Default an estimate from character count. */\n measure?: MeasureRowText;\n /** How the scene folds a child's pose into its parent's. Default `RIGID_POSE_COMPOSITION`. */\n composition?: PoseComposition<RectPose>;\n}\n\nconst DASH = [6, 4];\nconst LIFELINE_DASH = [4, 4];\nconst MARKERS = { arrow: 'arrow', open: 'arrow-open', cross: null, none: null } as const;\n\ntype Font = { fontFamily: string; fontSize: number };\n\nclass PartSpecs {\n readonly specs: DiagramSpec[] = [];\n\n constructor(readonly root: string, readonly at: Vec2, readonly font: Font) {}\n\n place(r: SeqRect): RectPose {\n return { x: this.at.x + r.x, y: this.at.y + r.y, width: r.width, height: r.height };\n }\n\n push(id: string, seq: Omit<SeqPartTrait, 'root'>, r: SeqRect, data: Omit<DiagramSceneData, 'diagram'> & { diagram?: object }): void {\n this.specs.push({\n id: `${this.root}/${id}` as never, kind: 'mark', layer: 'main', parent: this.root as never, pickable: false, pose: this.place(r),\n data: { ...data, diagram: { ...data.diagram, seq: { root: this.root, ...seq } } } as DiagramSceneData,\n });\n }\n\n body(id: string, part: SeqPartKind, of: string | undefined, r: SeqRect, outline: Outline, style: NodeStyle, dash?: number[]): void {\n const lines = dash ?? style.dash;\n this.push(id, { part, ...(of !== undefined ? { id: of } : {}) }, r, {\n diagram: { outline },\n fill: { paint: { color: style.fill } },\n stroke: { paint: { color: style.stroke }, width: style.strokeWidth ?? 1.5, ...(lines !== undefined && lines.length > 0 ? { dash: lines } : {}) },\n });\n }\n\n line(id: string, part: SeqPartKind, of: string | undefined, r: SeqRect, d: string, stroke: DiagramSceneData['stroke'], fill?: string): void {\n this.push(id, { part, ...(of !== undefined ? { id: of } : {}) }, r, {\n diagram: { mark: { d } }, stroke, ...(fill !== undefined ? { fill: { paint: { color: fill } } } : {}),\n });\n }\n\n /** The marks the part just pushed draws, onto its trait. */\n marks(refs: readonly SeqMarkRef[]): void {\n const seq = (this.specs.at(-1)!.data as { diagram: { seq: SeqPartTrait } }).diagram.seq;\n seq.marks = refs;\n }\n\n text(id: string, r: SeqRect, text: string, color: string, target?: SeqTextTarget, face: { fontSize?: number; fontWeight?: number } = {}, centered = true): void {\n // A hair wider than measured, so the painter never breaks a line the layout kept whole.\n const box = { ...r, x: r.x - 1, width: r.width + 2 };\n this.push(id, { part: 'text', ...(target ? { target } : {}) }, box, {\n text, style: { ...this.font, ...(centered ? { align: 'center' as const } : {}), ...face }, verticalAlign: 'center', fill: { paint: { color } },\n });\n }\n}\n\n/** The head and lifeline of each participant, and the X where one was destroyed. */\nfunction participantSpecs(out: PartSpecs, data: SequenceData, layout: SequenceLayout, theme: DiagramTheme): void {\n for (const l of layout.lifelines) {\n const p = data.participants.find((q) => q.id === l.id)!;\n const style = withColors(roleStyle(theme, p.style), p.colors);\n out.line(`life:${l.id}`, 'lifeline', l.id, { x: l.x - 1, y: l.y0, width: 2, height: Math.max(l.y1 - l.y0, 0) }, 'M0.5 0V1',\n { paint: { color: style.stroke }, width: 1, dash: LIFELINE_DASH });\n if (l.destroyed) {\n const c = SEQ.cross;\n out.line(`destroy:${l.id}`, 'destroy', l.id, { x: l.x - c / 2, y: l.y1 - c / 2, width: c, height: c }, 'M0 0L1 1M1 0L0 1',\n { paint: { color: style.stroke }, width: 2 });\n if (l.destroyedBy) out.marks([{ place: l.destroyedBy }]);\n }\n }\n for (const [i, a] of layout.activations.entries()) {\n const p = data.participants.find((q) => q.id === a.participant)!;\n out.body(`act:${i}`, 'activation', a.participant, a.box, 'rect', withColors(roleStyle(theme, p.style), p.colors));\n out.marks(a.closer ? [a.opener, a.closer] : [a.opener]);\n }\n}\n\nfunction headSpecs(out: PartSpecs, data: SequenceData, layout: SequenceLayout, theme: DiagramTheme): void {\n for (const h of layout.heads) {\n const p = data.participants.find((q) => q.id === h.id)!;\n const style = withColors(roleStyle(theme, p.style), p.colors);\n const outline = p.outline ?? 'rect';\n out.body(`head:${p.id}`, 'head', p.id, h.box, outline, style);\n out.text(`head:${p.id}/text`, contentBox(outline, h.box), p.label ?? p.id, style.text, { participant: p.id });\n }\n}\n\nfunction messageSpecs(out: PartSpecs, steps: readonly SeqStep[], layout: SequenceLayout, theme: DiagramTheme): void {\n const byId = new Map(layout.messages.map((m) => [m.id, m]));\n const edge = roleEdgeStyle(theme);\n const width = edge.width ?? 1.5;\n for (const msg of flatSteps(steps)) {\n const at = msg.kind === 'message' ? byId.get(msg.id) : undefined;\n if (at === undefined || msg.kind !== 'message') continue;\n const s = msg;\n const marker = MARKERS[msg.head];\n const stroke = {\n paint: { color: edge.stroke }, width, ...(msg.line === 'dashed' ? { dash: DASH } : {}),\n ...(marker !== null ? { markerEnd: marker } : {}), ...(marker !== null && msg.both ? { markerStart: marker } : {}),\n };\n if (at.loopY !== undefined) {\n out.line(`msg:${s.id}`, 'message', s.id, { x: at.x1, y: at.y, width: SEQ.loopWidth, height: at.loopY - at.y }, 'M0 0H1V1H0', stroke);\n } else {\n const d = at.x2 >= at.x1 ? 'M0 0H1' : 'M1 0H0';\n out.line(`msg:${s.id}`, 'message', s.id, { x: Math.min(at.x1, at.x2), y: at.y, width: Math.abs(at.x2 - at.x1), height: 0 }, d, stroke);\n }\n if (msg.head === 'cross') {\n const c = SEQ.cross * 0.8;\n const end = { x: at.x2, y: at.loopY ?? at.y };\n out.line(`msg:${s.id}/cross`, 'message', s.id, { x: end.x - c / 2, y: end.y - c / 2, width: c, height: c }, 'M0 0L1 1M1 0L0 1',\n { paint: { color: edge.stroke }, width });\n }\n if (at.text) out.text(`msg:${s.id}/text`, at.text, msg.text ?? '', edge.label ?? edge.stroke, { step: s.id }, {}, msg.from !== msg.to);\n if (at.number) {\n const style = roleStyle(theme, SEQUENCE_ROLES.number);\n out.body(`msg:${s.id}/number`, 'number', s.id, at.number.box, 'ellipse', style);\n out.text(`msg:${s.id}/number/text`, at.number.box, String(at.number.n), style.text, undefined, { fontSize: Math.max(8, out.font.fontSize - 2) });\n }\n }\n}\n\nfunction noteSpecs(out: PartSpecs, steps: readonly SeqStep[], layout: SequenceLayout, theme: DiagramTheme): void {\n const byId = new Map(layout.notes.map((n) => [n.id, n]));\n const style = roleStyle(theme, SEQUENCE_ROLES.note);\n for (const s of flatSteps(steps)) {\n const at = s.kind === 'note' ? byId.get(s.id) : undefined;\n if (at === undefined || s.kind !== 'note') continue;\n out.body(`note:${s.id}`, 'note', s.id, at.box, 'note', style);\n out.text(`note:${s.id}/text`, contentBox('note', at.box), s.text, style.text, { step: s.id });\n }\n}\n\nfunction fragmentSpecs(out: PartSpecs, steps: readonly SeqStep[], layout: SequenceLayout, theme: DiagramTheme, boxesOnly: boolean): void {\n const byId = new Map(layout.fragments.map((f) => [f.id, f]));\n for (const s of flatSteps(steps)) {\n const at = s.kind === 'fragment' ? byId.get(s.id) : undefined;\n if (at === undefined || s.kind !== 'fragment') continue;\n const style = withColors({ ...theme.container, ...(s.type === 'region' ? {} : { fill: 'transparent' }) }, s.colors);\n if (boxesOnly) {\n out.body(`frag:${s.id}`, 'fragment', s.id, at.box, 'rect', { ...style, strokeWidth: 1 }, []);\n continue;\n }\n at.sections.forEach((sec, k) => {\n if (k > 0) {\n out.line(`frag:${s.id}/divider:${k}`, 'divider', s.id, { x: at.box.x, y: sec.y, width: at.box.width, height: 0 }, 'M0 0H1',\n { paint: { color: style.stroke }, width: 1, dash: DASH });\n }\n if (sec.label) out.text(`frag:${s.id}/label:${k}`, sec.label, s.sections[k]!.label ?? '', style.text, { fragment: s.id, section: k });\n });\n if (at.tab) {\n out.line(`frag:${s.id}/tab`, 'fragment', s.id, at.tab, 'M0 0H1V0.6L0.85 1H0Z', { paint: { color: style.stroke }, width: 1 }, theme.container.fill);\n out.text(`frag:${s.id}/type`, at.tab, s.type, style.text, undefined, { fontWeight: 700 });\n }\n }\n}\n\nfunction boxSpecs(out: PartSpecs, data: SequenceData, layout: SequenceLayout, theme: DiagramTheme): void {\n for (const b of layout.boxes) {\n const own = data.boxes?.find((q) => q.id === b.id);\n const style = withColors(theme.container, own?.colors);\n out.body(`box:${b.id}`, 'box', b.id, b.box, 'rect', { ...style, strokeWidth: 1 }, []);\n if (b.label) out.text(`box:${b.id}/text`, b.label, own?.label ?? '', style.text, { box: b.id });\n }\n}\n\n/** What a root keeps of its layout for the editing to read. */\nconst geometryOf = (layout: SequenceLayout): SequenceGeometry => ({\n columns: layout.columns, slots: layout.slots, messages: layout.messages, notes: layout.notes,\n heads: layout.heads.map(({ id, box }) => ({ id, box })),\n fragments: layout.fragments.map(({ id, box, tab }) => ({ id, grip: tab ?? { ...box, height: Math.min(box.height, SEQ.rowGap) } })),\n boxes: layout.boxes.map(({ id, box, label }) => ({ id, grip: { ...box, height: (label?.height ?? 0) + SEQ.boxPad } })),\n marks: [\n ...layout.activations.map((a, i) => ({ id: `act:${i}`, grip: a.box })),\n ...layout.lifelines.flatMap((l) => (l.destroyedBy === undefined ? [] : [{ id: `destroy:${l.id}`, grip: crossGrip(l.x, l.y1) }])),\n ],\n});\n\n/** A destruction's cross, grown to a size a pointer can take. */\nconst crossGrip = (x: number, y: number): SeqRect => {\n const c = Math.max(SEQ.cross, 12);\n return { x: x - c / 2, y: y - c / 2, width: c, height: c };\n};\n\n/**\n * The root and parts of a sequence diagram: its root at `at`, sized to the\n * layout, holding `data`; boxes, fragments, lifelines, activations, messages,\n * notes, and heads drawn over one another in that order, each from the\n * theme's roles, its own colors over them.\n */\nexport function sequenceSpecs<TLayer extends string = 'main'>(data: SequenceData, opts: SequenceSpecsOptions<TLayer>): DiagramSpec<TLayer>[] {\n const theme = opts.theme ?? diagramThemeFrom(undefined);\n const font = opts.font ?? themeFont(theme);\n const layout = sequenceLayout(data, { font, ...(opts.measure ? { measure: opts.measure } : {}) });\n const at = opts.at ?? { x: 0, y: 0 };\n const out = new PartSpecs(opts.id, at, font);\n out.specs.push({\n id: opts.id as never, kind: 'mark', layer: 'main', pose: out.place({ x: 0, y: 0, width: layout.width, height: layout.height }),\n data: { diagram: { sequence: data, geometry: geometryOf(layout) } } as DiagramSceneData,\n });\n boxSpecs(out, data, layout, theme);\n fragmentSpecs(out, data.steps, layout, theme, true);\n participantSpecs(out, data, layout, theme);\n messageSpecs(out, data.steps, layout, theme);\n noteSpecs(out, data.steps, layout, theme);\n headSpecs(out, data, layout, theme);\n fragmentSpecs(out, data.steps, layout, theme, false);\n const layer = (opts.layer ?? 'main') as TLayer;\n return localizeWorldPoses(out.specs, opts.composition ?? RIGID_POSE_COMPOSITION).map((s) => ({ ...s, layer })) as DiagramSpec<TLayer>[];\n}\n","/**\n * Writing a sequence edit into a scene: the root's data replaced and its parts\n * built again, as one undo entry.\n */\nimport { composeWorldPose, scenePoseAdapter, type InvocationCtx, type RectPose, type Scene } from '@weasel-js/core';\nimport type { MeasureRowText } from '../body';\nimport { diagramThemeOf } from '../theme/resolve';\nimport type { DiagramTheme } from '../theme/types';\nimport { setSequenceText } from './edit';\nimport { sequenceSpecs } from './specs';\nimport { sequencePartOf, sequenceRootOf } from './trait';\nimport type { SequenceData } from './types';\n\ntype AnyScene = Scene<unknown, string, unknown>;\n\n/** How a scene's sequences are drawn when an edit builds their parts again. */\nexport interface SequenceDrawOptions {\n /** Measures text. Default an estimate from character count; pass what the sequence was first drawn with. */\n measure?: MeasureRowText;\n /** Default the scene's own `diagram:theme`. */\n theme?: DiagramTheme;\n}\n\n/** The world pose `id` stands at. */\nconst worldPose = (scene: AnyScene, id: string): RectPose =>\n composeWorldPose(scenePoseAdapter(scene as never), id, scene.composition.compose as never) as RectPose;\n\n/** The parts of root `id` built from `data`, in the batch the caller has open. A selected part still drawn stays selected. */\nfunction rebuild(scene: AnyScene, id: string, data: SequenceData, opts: SequenceDrawOptions): void {\n const root = scene.get(id as never)!;\n const at = worldPose(scene, id);\n const [own, ...parts] = sequenceSpecs(data, {\n id, at, theme: opts.theme ?? diagramThemeOf(scene), layer: root.layer, composition: scene.composition as never,\n ...(opts.measure ? { measure: opts.measure } : {}),\n });\n const selected = scene.getSelection();\n scene.removeMany([...scene.childrenOf(id as never)]);\n const pose = root.pose as RectPose;\n scene.update(id as never, { data: own!.data });\n scene.setPose(id as never, { ...pose, width: own!.pose.width, height: own!.pose.height } as never);\n for (const part of parts) scene.add(part as never);\n const kept = selected.filter((s) => scene.get(s) !== undefined);\n if (kept.length !== scene.getSelection().length) scene.setSelection(kept);\n}\n\n/** Replaces root `id`'s sequence with `data` and builds its parts again, as one undo entry under `label`. */\nexport function commitSequence(scene: AnyScene, id: string, data: SequenceData, label: string, opts: SequenceDrawOptions = {}): void {\n const node = scene.get(id as never);\n if (node === undefined || sequenceRootOf(node) === null) return;\n scene.batch(label, () => rebuild(scene, id, data, opts));\n}\n\n/**\n * Adds a new sequence root drawing `data` with its top-left corner at `at`,\n * as one undo entry under `label`, and returns its id. On `layer`, default\n * the scene's first.\n */\nexport function startSequence(\n scene: AnyScene, at: { x: number; y: number }, data: SequenceData, label: string, opts: SequenceDrawOptions & { layer?: string } = {},\n): string {\n const id = scene.mintId() as string;\n const layer = opts.layer ?? scene.layers[0]?.id ?? 'main';\n const specs = sequenceSpecs(data, {\n id, at, theme: opts.theme ?? diagramThemeOf(scene), layer, composition: scene.composition as never,\n ...(opts.measure ? { measure: opts.measure } : {}),\n });\n scene.batch(label, () => {\n for (const spec of specs) scene.add(spec as never);\n });\n return id;\n}\n\n/** Builds every sequence in `scene` again from its own data, in the batch the caller has open: after a theme change. */\nexport function redrawSequences(scene: AnyScene, opts: SequenceDrawOptions = {}): void {\n for (const node of scene.renderOrderNodes()) {\n const root = sequenceRootOf(node);\n if (root !== null) rebuild(scene, node.id, root.sequence, opts);\n }\n}\n\n/** A sequence edit: root `id`'s new data. */\nexport interface SequenceEdit {\n id: string;\n data: SequenceData;\n /** What undo calls it. */\n label: string;\n}\n\n/**\n * Folds a text edit that has just been written to one of a sequence's text\n * parts into its root's data: the edit is undone and `commit` gets the\n * sequence with the new text, so the change is one entry on the data, not a\n * part that the next build would overwrite. Does nothing for any other node,\n * or text that did not change.\n */\nexport function foldSequenceText(scene: AnyScene, textId: string, commit: (edit: SequenceEdit) => void): void {\n const node = scene.get(textId as never);\n const part = node === undefined ? null : sequencePartOf(node);\n const root = part === null ? undefined : scene.get(part.root as never);\n const held = root === undefined ? null : sequenceRootOf(root);\n if (part === null || held === null || part.target === undefined) return;\n const text = (node!.data as { text?: unknown }).text;\n if (typeof text !== 'string') return;\n const next = setSequenceText(held.sequence, part.target, text);\n if (next === held.sequence) return;\n scene.undo();\n commit({ id: part.root, data: next, label: 'Edit text' });\n}\n\n/** Options for a sequence's editing actions: how an edit is committed and drawn. */\nexport interface SequenceEditOptions extends SequenceDrawOptions {\n /** Defaults to {@link commitSequence} against `deps.scene`, with the draw options. */\n commit?: (edit: SequenceEdit, ctx: Pick<InvocationCtx, 'deps'>) => void;\n id?: string;\n}\n\n/** `opts.commit`, or {@link commitSequence} against the scene the edit's deps hold, drawn with `opts`. */\nexport function sequenceCommitOf(opts: SequenceEditOptions): (edit: SequenceEdit, ctx: Pick<InvocationCtx, 'deps'>) => void {\n return opts.commit ?? ((edit, ctx) => {\n const scene = ctx.deps.scene as AnyScene | undefined;\n if (scene !== undefined) commitSequence(scene, edit.id, edit.data, edit.label, opts);\n });\n}\n","/**\n * Authoring a sequence's columns: participants added and removed, boxes drawn\n * around them, messages numbered. Pure functions from one `SequenceData` to\n * the next; a no-op returns the data it was given.\n */\nimport type { Outline } from '../outline';\nimport { flatSteps } from './columns';\nimport { hasId, pruneSteps } from './edit';\nimport type { SeqBox, SeqParticipant, SequenceData } from './types';\n\n/** Every id `data` uses: its participants', its steps', its boxes'. */\nfunction idsOf(data: SequenceData): Set<string> {\n const ids = new Set(data.participants.map((p) => p.id));\n for (const s of flatSteps(data.steps)) if (hasId(s)) ids.add(s.id);\n for (const b of data.boxes ?? []) ids.add(b.id);\n return ids;\n}\n\n/** Whether a participant, step, or box in `data` already has `id`. */\nexport const seqIdTaken = (data: SequenceData, id: string): boolean => idsOf(data).has(id);\n\n/** An id nothing in `data` uses yet: `prefix` and the lowest free number from 1. */\nexport function freshSeqId(data: SequenceData, prefix: string): string {\n const ids = idsOf(data);\n let n = 1;\n while (ids.has(`${prefix}${n}`)) n++;\n return `${prefix}${n}`;\n}\n\n/** What a new participant is drawn as: a plain box, or the UML stick figure. */\nexport type SeqParticipantKind = 'participant' | 'actor';\n\n/** A participant `data` can take: a fresh id, and a label naming its kind and number (\"Actor 2\"). */\nexport function newParticipant(data: SequenceData, kind: SeqParticipantKind = 'participant'): SeqParticipant {\n const id = freshSeqId(data, kind === 'actor' ? 'A' : 'P');\n const label = `${kind === 'actor' ? 'Actor' : 'Participant'} ${id.slice(1)}`;\n return { id, label, ...(kind === 'actor' ? { outline: 'actor' as const } : {}) };\n}\n\n/** `p` added at `index` among the participants (default last). Nothing changes when its id is taken. */\nexport function addParticipant(data: SequenceData, p: SeqParticipant, index = data.participants.length): SequenceData {\n if (seqIdTaken(data, p.id)) return data;\n const at = Math.max(0, Math.min(index, data.participants.length));\n return { ...data, participants: [...data.participants.slice(0, at), p, ...data.participants.slice(at)] };\n}\n\n/**\n * Participant `id` removed, with what names it: every message to or from it,\n * every activation, creation, or destruction of it, and it from every note\n * and box, a note or box left naming no one going too. Fragments stay, even\n * emptied, since they hold no participant of their own.\n */\nexport function removeParticipant(data: SequenceData, id: string): SequenceData {\n if (!data.participants.some((p) => p.id === id)) return data;\n const steps = pruneSteps(data.steps, (s) => {\n if (s.kind === 'message') return s.from === id || s.to === id ? null : s;\n if (s.kind === 'note') {\n if (!s.over.includes(id)) return s;\n const over = s.over.filter((q) => q !== id);\n return over.length === 0 ? null : { ...s, over };\n }\n if (s.kind === 'fragment') return s;\n return s.participant === id ? null : s;\n });\n const boxes = data.boxes?.flatMap((b) => {\n if (!b.members.includes(id)) return [b];\n const members = b.members.filter((m) => m !== id);\n return members.length === 0 ? [] : [{ ...b, members }];\n });\n const { boxes: _boxes, ...rest } = data;\n return {\n ...rest, participants: data.participants.filter((p) => p.id !== id), steps,\n ...(boxes !== undefined && boxes.length > 0 ? { boxes } : {}),\n };\n}\n\n/** Participant `id` drawn as `outline`; `undefined` or `'rect'` is the plain box. */\nexport function setParticipantOutline(data: SequenceData, id: string, outline: Outline | undefined): SequenceData {\n const at = data.participants.findIndex((p) => p.id === id);\n const p = data.participants[at];\n const next = outline === 'rect' ? undefined : outline;\n if (p === undefined || p.outline === next) return data;\n const { outline: _outline, ...rest } = p;\n const q = next === undefined ? rest : { ...rest, outline: next };\n return { ...data, participants: data.participants.map((r, i) => (i === at ? q : r)) };\n}\n\n/**\n * `box` drawn around its members: ids naming no participant are dropped, each\n * member leaves any box it was in (one left empty goes), and the members are\n * gathered side by side where the first of them stands, since a box spans\n * every column between its ends. Nothing changes for a box naming no one, or\n * whose id is taken.\n */\nexport function addBox(data: SequenceData, box: SeqBox): SequenceData {\n const members = data.participants.filter((p) => box.members.includes(p.id));\n if (members.length === 0 || seqIdTaken(data, box.id)) return data;\n const taken = new Set(members.map((p) => p.id));\n const first = data.participants.findIndex((p) => taken.has(p.id));\n const before = data.participants.slice(0, first).filter((p) => !taken.has(p.id));\n const after = data.participants.slice(first).filter((p) => !taken.has(p.id));\n const others = (data.boxes ?? []).flatMap((b) => {\n const left = b.members.filter((m) => !taken.has(m));\n return left.length === 0 ? [] : [left.length === b.members.length ? b : { ...b, members: left }];\n });\n return {\n ...data, participants: [...before, ...members, ...after],\n boxes: [...others, { ...box, members: members.map((p) => p.id) }],\n };\n}\n\n/** Box `id` removed; its members stay. */\nexport function removeBox(data: SequenceData, id: string): SequenceData {\n if (!data.boxes?.some((b) => b.id === id)) return data;\n const boxes = data.boxes.filter((b) => b.id !== id);\n const { boxes: _boxes, ...rest } = data;\n return boxes.length === 0 ? rest : { ...rest, boxes };\n}\n\n/** Messages numbered from `from`, or not numbered at all for `undefined`. */\nexport function setAutonumber(data: SequenceData, from: number | undefined): SequenceData {\n if (data.autonumber === from) return data;\n const { autonumber: _n, ...rest } = data;\n return from === undefined ? rest : { ...rest, autonumber: from };\n}\n","/**\n * Authoring a sequence's rows: messages, notes, and marks inserted, runs of\n * steps wrapped in fragments, sections added, and any step removed. Pure\n * functions from one `SequenceData` to the next; a no-op returns the data it\n * was given.\n */\nimport { freshSeqId, seqIdTaken } from './author';\nimport { findStep, hasId, mapSteps, placeOf, pruneSteps, stepListOf, withList } from './edit';\nimport type { SeqFragment, SeqMark, SeqMarkRef, SeqMessage, SeqNote, SeqStep, SequenceData, StepPlace } from './types';\n\n/** How a message is drawn: its line, its head, and whether it has a head at both ends or is sent without waiting. */\nexport type SeqArrow = Pick<SeqMessage, 'line' | 'head'> & Pick<Partial<SeqMessage>, 'both' | 'async'>;\n\n/** The arrows a message is commonly drawn with, by name; each one Mermaid writes. */\nexport const SEQ_ARROWS = {\n /** A call: a solid line, a filled head. */\n sync: { line: 'solid', head: 'arrow' },\n /** An answer: a dashed line, a filled head. */\n reply: { line: 'dashed', head: 'arrow' },\n /** Sent without waiting: a solid line, an open head. */\n async: { line: 'solid', head: 'open', async: true },\n /** Lost or refused: a solid line ending in a cross. */\n lost: { line: 'solid', head: 'cross' },\n /** A plain solid line. */\n line: { line: 'solid', head: 'none' },\n /** A plain dashed line. */\n dashed: { line: 'dashed', head: 'none' },\n /** Both ways: a solid line, filled heads at both ends. */\n both: { line: 'solid', head: 'arrow', both: true },\n} as const satisfies Record<string, SeqArrow>;\n\n/** A name in {@link SEQ_ARROWS}. */\nexport type SeqArrowName = keyof typeof SEQ_ARROWS;\n\n/** The fragment types that hold more than one section: an alt's branches, a par's threads, a critical's options. */\nexport const SEQ_MULTI_SECTION: ReadonlySet<SeqFragment['type']> = new Set(['alt', 'par', 'critical']);\n\n/** `step` inserted at `at`, whose index is clamped to its list. Nothing changes where `at` names no list, or the step's id is taken. */\nexport function insertStep(data: SequenceData, step: SeqStep, at: StepPlace): SequenceData {\n const list = stepListOf(data.steps, at.parent);\n if (list === null || (hasId(step) && seqIdTaken(data, step.id))) return data;\n const index = Math.max(0, Math.min(at.index, list.length));\n return { ...data, steps: withList(data.steps, at.parent, (l) => [...l.slice(0, index), step, ...l.slice(index)]) };\n}\n\nconst known = (data: SequenceData, ...ids: string[]): boolean => ids.every((id) => data.participants.some((p) => p.id === id));\n\n/** What {@link insertMessage} takes. */\nexport interface NewSeqMessage {\n from: string;\n to: string;\n at: StepPlace;\n /** A name in {@link SEQ_ARROWS}, or an arrow of its own. Default `'sync'`. */\n arrow?: SeqArrowName | SeqArrow;\n text?: string;\n /** Default a fresh `m` id. */\n id?: string;\n}\n\n/** A message from `from` to `to` (the same for a self-message) inserted at `at`. Nothing changes for an unknown participant. */\nexport function insertMessage(data: SequenceData, m: NewSeqMessage): SequenceData {\n if (!known(data, m.from, m.to)) return data;\n const arrow = typeof m.arrow === 'object' ? m.arrow : SEQ_ARROWS[m.arrow ?? 'sync'];\n const step: SeqMessage = {\n kind: 'message', id: m.id ?? freshSeqId(data, 'm'), from: m.from, to: m.to, ...arrow, ...(m.text ? { text: m.text } : {}),\n };\n return insertStep(data, step, m.at);\n}\n\n/** What {@link insertNote} takes. */\nexport interface NewSeqNote {\n /** Participant ids: one, or the first and last of a span. */\n over: readonly string[];\n /** Beside its participant rather than over it. */\n side?: 'left' | 'right';\n at: StepPlace;\n /** Default `'Note'`. */\n text?: string;\n /** Default a fresh `n` id. */\n id?: string;\n}\n\n/** A note over (or beside) participants inserted at `at`. Nothing changes for an unknown participant or none at all. */\nexport function insertNote(data: SequenceData, n: NewSeqNote): SequenceData {\n if (n.over.length === 0 || !known(data, ...n.over)) return data;\n const step: SeqNote = {\n kind: 'note', id: n.id ?? freshSeqId(data, 'n'), over: n.side === undefined ? [...n.over] : [n.over[0]!],\n ...(n.side ? { side: n.side } : {}), text: n.text ?? 'Note',\n };\n return insertStep(data, step, n.at);\n}\n\n/**\n * A lifeline mark inserted at `at`: an activation starting or ending, its head\n * created there (it is then not drawn at the top), or its lifeline ended.\n * Nothing changes for an unknown participant, or a second `create` of one.\n */\nexport function insertMark(data: SequenceData, mark: SeqMark, at: StepPlace): SequenceData {\n if (!known(data, mark.participant)) return data;\n if (mark.kind === 'create' && hasMark(data.steps, 'create', mark.participant)) return data;\n return insertStep(data, { kind: mark.kind, participant: mark.participant }, at);\n}\n\nfunction hasMark(steps: readonly SeqStep[], kind: SeqMark['kind'], participant: string): boolean {\n return steps.some((s) => (s.kind === kind && (s as SeqMark).participant === participant)\n || (s.kind === 'fragment' && s.sections.some((sec) => hasMark(sec.steps, kind, participant))));\n}\n\n/** Step `id` removed, with all a fragment holds. */\nexport function removeStep(data: SequenceData, id: string): SequenceData {\n if (findStep(data.steps, id) === null) return data;\n return { ...data, steps: pruneSteps(data.steps, (s) => (hasId(s) && s.id === id ? null : s)) };\n}\n\n/** The step at `at` removed: how a mark, which has no id, is taken out. */\nexport function removeStepAt(data: SequenceData, at: StepPlace): SequenceData {\n const list = stepListOf(data.steps, at.parent);\n if (list === null || at.index < 0 || at.index >= list.length) return data;\n return { ...data, steps: withList(data.steps, at.parent, (l) => l.filter((_, i) => i !== at.index)) };\n}\n\n/**\n * What `refs` name removed: each mark step at its place, and each message\n * flag cleared. The places are read against `data` as given, so removing one\n * does not shift the next. A place holding anything but a mark is left alone.\n */\nexport function removeMarks(data: SequenceData, refs: readonly SeqMarkRef[]): SequenceData {\n const key = (p: StepPlace['parent']) => (p === null ? '' : `${p.fragment}/${p.section}`);\n const places = refs.flatMap((r) => ('place' in r ? [r.place] : []))\n .filter((p) => {\n const s = stepListOf(data.steps, p.parent)?.[p.index];\n return s !== undefined && !hasId(s);\n })\n .sort((a, b) => (key(a.parent) === key(b.parent) ? b.index - a.index : key(a.parent) < key(b.parent) ? -1 : 1));\n let next = places.reduce((d, p) => removeStepAt(d, p), data);\n for (const r of refs) if ('message' in r) next = setMessageActivation(next, r.message, { [r.flag]: undefined });\n return next;\n}\n\n/** Every `kind` mark naming `participant` removed, at any depth: a created head drawn at the top again, say. */\nexport function removeMarksOf(data: SequenceData, kind: SeqMark['kind'], participant: string): SequenceData {\n const steps = pruneSteps(data.steps, (s) => (s.kind === kind && (s as SeqMark).participant === participant ? null : s));\n return steps === data.steps ? data : { ...data, steps };\n}\n\n/** What {@link wrapSteps} takes. */\nexport interface NewSeqFragment {\n type: SeqFragment['type'];\n /** The first section's guard or title. */\n label?: string;\n /** Default a fresh `f` id. */\n id?: string;\n}\n\n/**\n * The steps of the list at `parent` from `start` up to (not including) `end`\n * wrapped in a new fragment standing where they stood. An empty run makes an\n * empty fragment at `start`. Nothing changes where `parent` names no list.\n */\nexport function wrapSteps(data: SequenceData, parent: StepPlace['parent'], start: number, end: number, f: NewSeqFragment): SequenceData {\n const list = stepListOf(data.steps, parent);\n const id = f.id ?? freshSeqId(data, 'f');\n if (list === null || seqIdTaken(data, id)) return data;\n const lo = Math.max(0, Math.min(start, end, list.length));\n const hi = Math.max(lo, Math.min(Math.max(start, end), list.length));\n const frag: SeqFragment = {\n kind: 'fragment', id, type: f.type, sections: [{ ...(f.label ? { label: f.label } : {}), steps: list.slice(lo, hi) }],\n };\n return { ...data, steps: withList(data.steps, parent, (l) => [...l.slice(0, lo), frag, ...l.slice(hi)]) };\n}\n\n/** Fragment `id` dissolved: its sections' steps, in order, stand where it stood. */\nexport function unwrapFragment(data: SequenceData, id: string): SequenceData {\n const place = placeOf(data.steps, id);\n const frag = findStep(data.steps, id);\n if (place === null || frag?.kind !== 'fragment') return data;\n const inner = frag.sections.flatMap((sec) => sec.steps);\n return { ...data, steps: withList(data.steps, place.parent, (l) => [...l.slice(0, place.index), ...inner, ...l.slice(place.index + 1)]) };\n}\n\n/** `fn` of fragment `id`, where it is one and `fn` changes it. */\nfunction withFragment(data: SequenceData, id: string, fn: (f: SeqFragment) => SeqFragment): SequenceData {\n const steps = mapSteps(data.steps, (s) => (s.kind === 'fragment' && s.id === id ? fn(s) : s));\n return steps === data.steps ? data : { ...data, steps };\n}\n\n/** An empty section added to an alt, par, or critical, at `index` among its sections (default last). Other types hold one. */\nexport function addSection(data: SequenceData, id: string, label?: string, index?: number): SequenceData {\n return withFragment(data, id, (f) => {\n if (!SEQ_MULTI_SECTION.has(f.type)) return f;\n const at = Math.max(1, Math.min(index ?? f.sections.length, f.sections.length));\n const section = { ...(label ? { label } : {}), steps: [] };\n return { ...f, sections: [...f.sections.slice(0, at), section, ...f.sections.slice(at)] };\n });\n}\n\n/** Section `index` of fragment `id` removed, with its steps. A fragment's only section stays: remove the fragment instead. */\nexport function removeSection(data: SequenceData, id: string, index: number): SequenceData {\n return withFragment(data, id, (f) => (f.sections.length < 2 || f.sections[index] === undefined\n ? f\n : { ...f, sections: f.sections.filter((_, k) => k !== index) }));\n}\n\n/** Fragment `id` retyped. A fragment with several sections keeps them, so it takes only another type that holds several. */\nexport function setFragmentType(data: SequenceData, id: string, type: SeqFragment['type']): SequenceData {\n return withFragment(data, id, (f) => (f.type === type || (f.sections.length > 1 && !SEQ_MULTI_SECTION.has(type)) ? f : { ...f, type }));\n}\n\n/** `fn` of message `id`, where it is one and `fn` changes it. */\nfunction withMessage(data: SequenceData, id: string, fn: (m: SeqMessage) => SeqMessage): SequenceData {\n const steps = mapSteps(data.steps, (s) => (s.kind === 'message' && s.id === id ? fn(s) : s));\n return steps === data.steps ? data : { ...data, steps };\n}\n\n/** Message `id` drawn with `arrow`, a name in {@link SEQ_ARROWS} or an arrow of its own. */\nexport function setMessageArrow(data: SequenceData, id: string, arrow: SeqArrowName | SeqArrow): SequenceData {\n const next: SeqArrow = typeof arrow === 'object' ? arrow : SEQ_ARROWS[arrow];\n return withMessage(data, id, (m) => {\n if (m.line === next.line && m.head === next.head && m.both === next.both && m.async === next.async) return m;\n const { both: _both, async: _async, ...rest } = m;\n return { ...rest, line: next.line, head: next.head, ...(next.both ? { both: true } : {}), ...(next.async ? { async: true } : {}) };\n });\n}\n\n/** Message `id`'s activation flags set: which end it starts an activation on, and which end it ends one on; `undefined` clears one. */\nexport function setMessageActivation(\n data: SequenceData, id: string, flags: { activate?: 'to' | 'from' | undefined; deactivate?: 'to' | 'from' | undefined },\n): SequenceData {\n return withMessage(data, id, (m) => {\n const activate = 'activate' in flags ? flags.activate : m.activate;\n const deactivate = 'deactivate' in flags ? flags.deactivate : m.deactivate;\n if (activate === m.activate && deactivate === m.deactivate) return m;\n const { activate: _a, deactivate: _d, ...rest } = m;\n return { ...rest, ...(activate ? { activate } : {}), ...(deactivate ? { deactivate } : {}) };\n });\n}\n","/**\n * What makes a sequence's parts grabbable: a head, a message or note, a\n * fragment's tab, a box's label strip, an activation bar, a destruction's\n * cross, and each end of a message, as regions over every sequence root in the scene.\n * The parts themselves take no press, so these regions are the only way in.\n */\nimport {\n composeAffordanceLayer, composeWorldPose, scenePoseAdapter, type Affordance, type AffordanceRegion, type RectPose,\n type RenderLayer, type Scene, type Vec2,\n} from '@weasel-js/core';\nimport { keyedIndex } from '../keyedIndex';\nimport type { SeqRect } from './layout';\nimport { sequenceRootOf, type SequenceGeometry } from './trait';\n\n/** The layer id the sequence regions are composed into. */\nexport const SEQUENCE_LAYER_ID = 'diagram-sequence';\n\n/** The affordance kind a press on a sequence part reports. */\nexport const SEQUENCE_AFFORDANCE_KIND = `layer:${SEQUENCE_LAYER_ID}` as const;\n\n/** What a press on a sequence part hands the sequence actions, as the hit's `payload`. */\nexport interface SequenceScratch {\n targetId: string;\n /** The sequence root's id. */\n root: string;\n /** A head, a message's, note's or fragment's row, one end of a message, a box, or a part drawn for lifeline marks. */\n part: 'head' | 'step' | 'end' | 'box' | 'mark';\n /** The participant's, step's, or box's id; for a mark's part, the part's id under the root (`act:0`). */\n id: string;\n end?: 'from' | 'to';\n}\n\n/** Read a sequence press's scratch back off the hit an action was handed. */\nexport function sequenceScratchOf(hit: { payload?: unknown } | null | undefined): SequenceScratch | null {\n const p = hit?.payload as SequenceScratch | undefined;\n return p !== undefined && typeof p.root === 'string' && typeof p.id === 'string' && typeof p.part === 'string' ? p : null;\n}\n\ntype AnyScene = Scene<unknown, string, unknown>;\n\n/** One root an edit may touch: its id, its world origin and size, and the geometry its parts were built with. */\nexport interface PlacedSequence { id: string; origin: Vec2; width: number; height: number; geometry: SequenceGeometry }\n\n/** Every sequence root in `scene` that is neither locked nor hidden. */\nexport function placedSequences(scene: AnyScene): PlacedSequence[] {\n const out: PlacedSequence[] = [];\n const poses = scenePoseAdapter(scene as never);\n for (const node of scene.renderOrderNodes()) {\n const root = sequenceRootOf(node);\n if (root === null || scene.isLocked(node.id) || scene.isHidden(node.id)) continue;\n const at = composeWorldPose(poses, node.id, scene.composition.compose as never) as RectPose;\n out.push({ id: node.id, origin: { x: at.x, y: at.y }, width: at.width, height: at.height, geometry: root.geometry });\n }\n return out;\n}\n\n/** Half the height a message's line takes a press across. */\nconst REACH = 6;\n/** Half an end handle's side. */\nconst END = 7;\n\nconst moved = (r: SeqRect, o: Vec2): SeqRect => ({ x: r.x + o.x, y: r.y + o.y, width: r.width, height: r.height });\n\n/** The rect a message takes a press in: its line, its loop, and its text. */\nexport function messageReach(m: SequenceGeometry['messages'][number]): SeqRect {\n const x0 = Math.min(m.x1, m.x2);\n const x1 = m.loopY !== undefined ? m.x1 + 32 : Math.max(m.x1, m.x2);\n const y1 = (m.loopY ?? m.y) + REACH;\n const top = Math.min(m.y - REACH, m.text?.y ?? Infinity);\n const left = Math.min(x0, m.text?.x ?? Infinity);\n const right = Math.max(x1, m.text ? m.text.x + m.text.width : -Infinity);\n return { x: left, y: top, width: right - left, height: y1 - top };\n}\n\nfunction region(id: string, r: SeqRect, scratch: SequenceScratch, cursor: string): AffordanceRegion {\n return {\n id, targetId: null, shape: { kind: 'rect', x: r.x, y: r.y, width: r.width, height: r.height }, cursor: cursor as never,\n strength: 'exclusive', claimedKinds: ['pointer'], bind: () => ({ initialScratch: scratch }),\n };\n}\n\n/** The regions for heads and rows, and the ones for message ends, which win wherever they overlap the rest. */\nfunction regionsOf(all: readonly PlacedSequence[]): { parts: AffordanceRegion[]; ends: AffordanceRegion[] } {\n const parts: AffordanceRegion[] = [];\n const ends: AffordanceRegion[] = [];\n for (const { id: root, origin, geometry } of all) {\n const base = { targetId: root, root };\n for (const h of geometry.heads) parts.push(region(`${root}/head:${h.id}`, moved(h.box, origin), { ...base, part: 'head', id: h.id }, 'ew-resize'));\n for (const m of geometry.marks ?? []) parts.push(region(`${root}/${m.id}`, moved(m.grip, origin), { ...base, part: 'mark', id: m.id }, 'default'));\n for (const b of geometry.boxes ?? []) parts.push(region(`${root}/box:${b.id}`, moved(b.grip, origin), { ...base, part: 'box', id: b.id }, 'default'));\n for (const f of geometry.fragments ?? []) parts.push(region(`${root}/frag:${f.id}`, moved(f.grip, origin), { ...base, part: 'step', id: f.id }, 'ns-resize'));\n for (const n of geometry.notes) parts.push(region(`${root}/note:${n.id}`, moved(n.box, origin), { ...base, part: 'step', id: n.id }, 'ns-resize'));\n for (const m of geometry.messages) {\n parts.push(region(`${root}/msg:${m.id}`, moved(messageReach(m), origin), { ...base, part: 'step', id: m.id }, 'ns-resize'));\n const at = [['from', m.x1, m.y], ['to', m.x2, m.loopY ?? m.y]] as const;\n for (const [end, x, y] of at) {\n const r = { x: x - END + origin.x, y: y - END + origin.y, width: END * 2, height: END * 2 };\n ends.push(region(`${root}/msg:${m.id}/${end}`, r, { ...base, part: 'end', id: m.id, end }, 'crosshair'));\n }\n }\n }\n return { parts, ends };\n}\n\nconst INDEXES = new WeakMap<AnyScene, () => { parts: AffordanceRegion[]; ends: AffordanceRegion[] } | null>();\n\nfunction regionsIn(scene: AnyScene) {\n let index = INDEXES.get(scene);\n if (index === undefined) {\n index = keyedIndex(\n () => (typeof scene.getVersion === 'function' ? [scene.getVersion()] : undefined),\n () => regionsOf(placedSequences(scene)),\n );\n INDEXES.set(scene, index);\n }\n return index() ?? regionsOf(placedSequences(scene));\n}\n\n/** The composed layer, for `CanvasExtensionApi.registerLayer`. Register it last: the last registered is hit first. */\nexport function sequenceLayer(scene: Scene<unknown, string, unknown>): RenderLayer<unknown> {\n const parts: Affordance = { id: SEQUENCE_LAYER_ID, regions: () => regionsIn(scene).parts };\n const ends: Affordance = { id: `${SEQUENCE_LAYER_ID}-ends`, regions: () => regionsIn(scene).ends };\n return composeAffordanceLayer(SEQUENCE_LAYER_ID, 'Sequence diagram parts', [parts, ends]) as unknown as RenderLayer<unknown>;\n}\n","/**\n * Picking a sequence's parts and deleting them. A click on a head, a message,\n * a note, a fragment's tab, or a box's label strip selects the scene node that\n * draws it; Delete on a selection holding such nodes removes what they draw\n * from their root's data, one edit per root, and the rest of the selection as\n * core's delete would.\n */\nimport {\n commitDeleteToScene, createDeleteAction, type Action, type ActionDeps, type NodeId, type Scene, type SelectionApi,\n} from '@weasel-js/core';\nimport { removeBox, removeParticipant } from './author';\nimport { removeMarks, removeStep } from './authorSteps';\nimport { sequenceCommitOf, type SequenceEditOptions } from './commit';\nimport { sequenceScratchOf, type SequenceScratch } from './layer';\nimport { sequencePartOf, sequenceRootOf } from './trait';\nimport type { SeqMarkRef, SequenceData } from './types';\n\n/** The action a click on a sequence part runs. */\nexport const SELECT_SEQUENCE_PART_ACTION_ID = 'diagram.sequence.select';\n\ntype AnyScene = Scene<unknown, string, unknown>;\n\n/** The id of the node that draws what `s` names, among its root's parts: a head, a message, a note, a fragment's box, a box. */\nexport function sequencePartNodeOf(scene: AnyScene, s: Pick<SequenceScratch, 'root' | 'part' | 'id'>): string | null {\n if (s.part === 'mark') return scene.get(`${s.root}/${s.id}` as never) === undefined ? null : `${s.root}/${s.id}`;\n const names = s.part === 'head' ? [`head:${s.id}`]\n : s.part === 'box' ? [`box:${s.id}`]\n : s.part === 'end' ? [`msg:${s.id}`]\n : [`msg:${s.id}`, `note:${s.id}`, `frag:${s.id}`];\n return names.map((n) => `${s.root}/${n}`).find((id) => scene.get(id as never) !== undefined) ?? null;\n}\n\n/** The sequence part's click: selects the node drawing it, or with Shift adds it to the selection or takes it out. */\nexport const selectSequencePartAction: Action = {\n id: SELECT_SEQUENCE_PART_ACTION_ID, label: 'Select sequence part', group: 'diagram', requires: ['scene', 'selection'],\n invoker: {\n timing: 'immediate',\n run(deps, params) {\n const scene = deps.scene as AnyScene | undefined;\n const selection = deps.selection as SelectionApi | undefined;\n const scratch = sequenceScratchOf(params?.affordance as { payload?: unknown } | undefined);\n const id = scene === undefined || scratch === null ? null : sequencePartNodeOf(scene, scratch);\n if (id === null || selection === undefined) return;\n const held = selection.get() as readonly string[];\n const shift = (params?.mods as { shift?: boolean } | undefined)?.shift === true;\n selection.set((!shift ? [id] : held.includes(id) ? held.filter((h) => h !== id) : [...held, id]) as NodeId[]);\n },\n },\n enabled: () => true as const,\n};\n\n/** What a selected part removes from its root's data: a head or lifeline its participant, a box itself, a message's, note's, or fragment's part its step. */\nfunction removing(data: SequenceData, part: { part: string; id: string }): SequenceData {\n if (part.part === 'head' || part.part === 'lifeline') return removeParticipant(data, part.id);\n if (part.part === 'box') return removeBox(data, part.id);\n if (part.part === 'message' || part.part === 'note' || part.part === 'fragment' || part.part === 'divider') return removeStep(data, part.id);\n return data;\n}\n\n/**\n * `ids` split into the sequence edits deleting them make, one per root, and\n * the ids that are no sequence's part. An activation bar or a destruction's\n * cross removes the marks and message flags that draw it. A part that draws\n * nothing an edit can remove (a number, a section label) is dropped.\n */\nexport function sequenceDeletes(scene: AnyScene, ids: readonly string[]): { edits: { id: string; data: SequenceData }[]; rest: string[] } {\n // Marks go by place, so they come out of each root's data as it was, before anything else shifts them.\n const byRoot = new Map<string, { was: SequenceData; marks: SeqMarkRef[]; parts: { part: string; id: string }[] }>();\n const rest: string[] = [];\n for (const id of ids) {\n const node = scene.get(id as never);\n const part = node === undefined ? null : sequencePartOf(node);\n if (part === null) {\n rest.push(id);\n continue;\n }\n const root = scene.get(part.root as never);\n const held = root === undefined ? null : sequenceRootOf(root);\n if (held === null) continue;\n const at = byRoot.get(part.root) ?? { was: held.sequence, marks: [], parts: [] };\n byRoot.set(part.root, at);\n if (part.marks !== undefined) at.marks.push(...part.marks);\n else if (part.id !== undefined) at.parts.push({ part: part.part, id: part.id });\n }\n const edits = [...byRoot].flatMap(([id, { was, marks, parts }]) => {\n const data = parts.reduce(removing, removeMarks(was, marks));\n return data === was ? [] : [{ id, data }];\n });\n return { edits, rest };\n}\n\n/** Options for {@link createSequenceDeleteAction}. */\nexport interface SequenceDeleteOptions extends SequenceEditOptions {\n /** Deletes the selected ids that are no sequence's part. Default core's `commitDeleteToScene`. */\n others?: (ids: readonly NodeId[], deps: ActionDeps) => void;\n}\n\n/**\n * Core's `delete`, for a canvas holding sequences: the selected sequence parts\n * are removed from their roots' data (a head takes its participant and what\n * names it), the rest go to `others`, and the selection is emptied.\n */\nexport function createSequenceDeleteAction(opts: SequenceDeleteOptions = {}): Action {\n const commit = sequenceCommitOf(opts);\n const others = opts.others ?? commitDeleteToScene;\n return createDeleteAction({\n commit: (ids, deps) => {\n const scene = deps.scene as AnyScene | undefined;\n if (scene === undefined) return;\n const { edits, rest } = sequenceDeletes(scene, ids);\n for (const edit of edits) commit({ ...edit, label: 'Delete' }, { deps });\n if (rest.length > 0) others(rest as NodeId[], deps);\n else deps.selection?.set([]);\n },\n });\n}\n","/**\n * Dragging a sequence's parts: a message or note to another row, a head to\n * another column, a message's end to another lifeline. Each drag previews the\n * parts it carries and, on release, hands one edit of the root's data to\n * `commit`, which by default replaces it in the scene as one undo entry.\n */\nimport type { Action, Contribution, InvocationCtx, OngoingHandle, RectPose, RenderLayer, Scene, Vec2 } from '@weasel-js/core';\nimport { moveParticipant, moveStep, reconnectMessage } from './edit';\nimport { sequenceCommitOf, type SequenceEditOptions } from './commit';\nimport { SELECT_SEQUENCE_PART_ACTION_ID, selectSequencePartAction } from './select';\nimport { SEQUENCE_AFFORDANCE_KIND, placedSequences, sequenceLayer, sequenceScratchOf, type PlacedSequence, type SequenceScratch } from './layer';\nimport { sequencePartOf, sequenceRootOf } from './trait';\nimport type { SequenceData } from './types';\n\n/** The action that drags a sequence part. */\nexport const SEQUENCE_DRAG_ACTION_ID = 'diagram.sequence.drag';\n/** The action that absorbs the rest of a press on a sequence part, so it reaches neither marquee nor pan. */\nexport const GRAB_SEQUENCE_ACTION_ID = 'diagram.sequence.grab';\n\ntype AnyScene = Scene<unknown, string, unknown>;\n\n/** What a drag captured at its press, read-only after. */\ninterface Press {\n scratch: SequenceScratch;\n scene: AnyScene;\n root: PlacedSequence;\n data: SequenceData;\n start: Vec2;\n /** The ids of the parts the drag carries, and their poses at the press. */\n carried: ReadonlyMap<string, RectPose>;\n}\n\n/** Whether part `node` of the sequence belongs to what a press on `s` carries. */\nfunction carries(s: SequenceScratch, part: NonNullable<ReturnType<typeof sequencePartOf>>): boolean {\n if (s.part === 'head') {\n if (part.target !== undefined) return 'participant' in part.target && part.target.participant === s.id;\n return part.id === s.id && ['head', 'lifeline', 'destroy', 'activation'].includes(part.part);\n }\n if (s.part === 'step') {\n return part.id === s.id || (part.target !== undefined && (('step' in part.target && part.target.step === s.id)\n || ('fragment' in part.target && part.target.fragment === s.id)));\n }\n return s.part === 'end' && part.part === 'message' && part.id === s.id;\n}\n\nfunction pressOf(ctx: InvocationCtx): Press | null {\n const scratch = sequenceScratchOf(ctx.drag?.affordance);\n const scene = ctx.deps.scene as AnyScene | undefined;\n const node = scratch === null ? undefined : scene?.get(scratch.root as never);\n const held = node === undefined ? null : sequenceRootOf(node);\n const root = scene === undefined || held === null ? undefined : placedSequences(scene).find((p) => p.id === scratch!.root);\n if (scratch === null || scene === undefined || held === null || root === undefined) return null;\n const carried = new Map<string, RectPose>();\n for (const id of scene.childrenOf(scratch.root as never)) {\n const child = scene.get(id)!;\n const part = sequencePartOf(child);\n if (part !== null && carries(scratch, part)) carried.set(id, child.pose as RectPose);\n }\n return { scratch, scene, root, data: held.sequence, start: ctx.drag?.start ?? { x: ctx.world.x, y: ctx.world.y }, carried };\n}\n\n/** The nearest of `xs` to `x`, by index. */\nconst nearest = (xs: readonly number[], x: number): number =>\n xs.reduce((best, v, i) => (Math.abs(v - x) < Math.abs(xs[best]! - x) ? i : best), 0);\n\n/** The data the drag leaves with the pointer at `at`, and what undo calls it. */\nfunction proposed(p: Press, at: Vec2): { data: SequenceData; label: string } {\n const { geometry, origin } = p.root;\n const local = { x: at.x - origin.x, y: at.y - origin.y };\n const { scratch } = p;\n if (scratch.part === 'box' || scratch.part === 'mark') return { data: p.data, label: '' };\n if (scratch.part === 'head') {\n const index = geometry.columns.filter((c) => c.x < local.x).length;\n return { data: moveParticipant(p.data, scratch.id, index), label: 'Move participant' };\n }\n if (scratch.part === 'end') {\n const column = geometry.columns[nearest(geometry.columns.map((c) => c.x), local.x)];\n if (column === undefined) return { data: p.data, label: '' };\n return { data: reconnectMessage(p.data, scratch.id, scratch.end!, column.id), label: 'Reconnect message' };\n }\n const slot = geometry.slots[nearest(geometry.slots.map((s) => s.y), local.y)];\n if (slot === undefined) return { data: p.data, label: '' };\n return { data: moveStep(p.data, scratch.id, slot.place), label: 'Move step' };\n}\n\n/** A carried part's pose with the pointer at `at`: along the drag's axis, or for an end, its line stretched to the pointer. */\nfunction previewOf(p: Press, id: string, pose: RectPose, at: Vec2): RectPose {\n const dx = at.x - p.start.x;\n const dy = at.y - p.start.y;\n if (p.scratch.part === 'head') return { ...pose, x: pose.x + dx };\n if (p.scratch.part === 'step') return { ...pose, y: pose.y + dy };\n const m = p.root.geometry.messages.find((q) => q.id === p.scratch.id);\n if (m === undefined || id !== `${p.scratch.root}/msg:${p.scratch.id}` || m.loopY !== undefined) return pose;\n // The line's other end stays; the dragged one follows the pointer.\n const shift = pose.x - Math.min(m.x1, m.x2);\n const still = (p.scratch.end === 'from' ? m.x2 : m.x1) + shift;\n const moving = (p.scratch.end === 'from' ? m.x1 : m.x2) + shift + dx;\n return { ...pose, x: Math.min(still, moving), width: Math.abs(moving - still) };\n}\n\n/** The `diagram.sequence.drag` action: an ongoing drag of whatever sequence part was pressed. */\nexport function createSequenceDragAction(opts: SequenceEditOptions = {}): Action {\n const commit = sequenceCommitOf(opts);\n return {\n id: opts.id ?? SEQUENCE_DRAG_ACTION_ID,\n label: 'Move sequence part',\n group: 'diagram',\n requires: ['scene'],\n eligible: { mode: 'normal' },\n invoker: {\n timing: 'ongoing',\n start(ctx: InvocationCtx): OngoingHandle {\n const p = pressOf(ctx);\n if (p === null) return {};\n // Null until the pointer moves, so a still click commits nothing.\n let at: Vec2 | null = null;\n let open = true;\n return {\n kind: 'diagram-sequence-drag',\n onMove(move: InvocationCtx): void {\n at = { x: move.world.x, y: move.world.y };\n },\n previewIds: () => (open && at !== null ? [...p.carried.keys()] : null),\n previewPose: (id) => {\n const pose = p.carried.get(id);\n return open && at !== null && pose !== undefined ? previewOf(p, id, pose, at) : null;\n },\n onEnd(end: InvocationCtx, reason: 'commit' | 'cancel'): void {\n open = false;\n if (reason !== 'commit' || at === null) return;\n const next = proposed(p, { x: end.world.x, y: end.world.y });\n if (next.data !== p.data) commit({ id: p.scratch.root, data: next.data, label: next.label }, { ...end, deps: { ...end.deps, scene: p.scene as never } });\n },\n };\n },\n },\n enabled: () => true as const,\n };\n}\n\nconst grab: Action = {\n id: GRAB_SEQUENCE_ACTION_ID, label: 'Grab sequence part', group: 'diagram',\n invoker: { timing: 'immediate', run: () => {} }, enabled: () => true as const,\n};\n\n/**\n * Both halves of sequence editing: the layer to `registerLayer` — last, so a\n * sequence part wins over anything beside it — and the contribution to pass\n * as `ambient`, which carries the drag. Like `diagramPorts`, one without the\n * other fails quietly. Text is edited in place by the host's text editor,\n * through `foldSequenceText`.\n */\nexport function diagramSequence(opts: SequenceEditOptions & { scene: Scene<unknown, string, unknown> }): {\n layer: RenderLayer<unknown>; contribution: Contribution;\n} {\n const actionId = opts.id ?? SEQUENCE_DRAG_ACTION_ID;\n const target = `affordance:${SEQUENCE_AFFORDANCE_KIND}` as const;\n return {\n layer: sequenceLayer(opts.scene),\n contribution: {\n id: 'weasel-diagram-sequence',\n eligibility: { claimed: true },\n actions: [createSequenceDragAction({ ...opts, id: actionId }), grab, selectSequencePartAction],\n bindings: [\n { spec: { kind: 'drag', target }, actionId, opts: { id: 'weasel-diagram-sequence.drag' } },\n { spec: { kind: 'pointerDown', target }, actionId: GRAB_SEQUENCE_ACTION_ID, opts: { id: 'weasel-diagram-sequence.pointerDown' } },\n { spec: { kind: 'click', target, mods: { shift: 'optional' } }, actionId: SELECT_SEQUENCE_PART_ACTION_ID, opts: { id: 'weasel-diagram-sequence.click' } },\n ],\n },\n };\n}\n","import { useLatest, type NodeId, type SelectionApi } from '@weasel-js/core';\nimport { useCallback, useEffect, useRef } from 'react';\n\n/** Whether `selection` already shows `want`: a set, as the same ids in any order; one id, as its latest pick. */\nfunction agrees(selection: readonly string[], want: string | null | readonly string[]): boolean {\n if (typeof want === 'string' || want === null) return (selection.at(-1) ?? null) === want;\n return selection.length === want.length && want.every((id) => selection.includes(id));\n}\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 — as its latest pick and as\n * every id it holds, in the order they were picked. `selected` is one id, a set\n * of them, or null for none; one id agrees with a selection whose latest pick\n * it is, so reporting a pick back does not drop the rest of a set. Wire the\n * returned handler to `<SceneCanvas onClick>`. */\nexport function useMirroredSelection(\n selection: Pick<SelectionApi, 'get' | 'set'>,\n selected: string | null | readonly string[] | undefined,\n onSelect: ((id: string | null, ids: readonly string[]) => void) | undefined,\n): () => void {\n const want = selected ?? null;\n const key = typeof want === 'string' || want === null ? want : `\\u0000${want.join('\\u0000')}`;\n const pushed = useRef<string | null | undefined>(undefined);\n useEffect(() => {\n if (pushed.current === key) return;\n pushed.current = key;\n if (agrees(selection.get() as string[], want)) return;\n selection.set((want === null ? [] : typeof want === 'string' ? [want] : [...want]) as NodeId[]);\n // eslint-disable-next-line react-hooks/exhaustive-deps -- runs when the prop changes, not the canvas\n }, [key]);\n const onSelectRef = useLatest(onSelect);\n return useCallback(() => {\n const ids = [...selection.get()] as string[];\n onSelectRef.current?.(ids.at(-1) ?? null, ids);\n }, [selection, onSelectRef]);\n}\n","/**\n * The regions half of `DiagramView`'s sync: where each container, pool, and\n * lane stands, and the region edits a change to that is reported as.\n */\nimport { worldWith } from './worldWith';\nimport type { RectPose, Scene } from '@weasel-js/core';\nimport { lanesOf, poolAxisOf } from './containers/containerStencils';\nimport { diagramContainerOf } from './containers/trait';\n\ntype Box = { x: number; y: number; width: number; height: number };\n\n/**\n * A region edit, which `DiagramView` reports and does not keep: `box`, a\n * container or pool moved or resized (`parent` present when a drop changed\n * the region it is in, `null` for the top level); `lanes`, a pool's lanes\n * resized, reordered, or added to, every lane in stacking order with its size\n * (a new lane's id is minted by the view); `release`, Release members run on\n * a region; `title`, a double-click on a region's header.\n */\nexport type ContainerEdit =\n | { kind: 'box'; id: string; box: Box; parent?: string | null }\n | { kind: 'lanes'; pool: string; lanes: readonly { id: string; size: number }[] }\n | { kind: 'release'; id: string }\n | { kind: 'title'; id: string };\n\ninterface RegionAt { box: Box; parent: string | null; fitted: boolean }\n\n/** Where every region stands, and each pool's lanes in order. */\nexport interface RegionStanding {\n regions: Map<string, RegionAt>;\n pools: Map<string, { id: string; size: number }[]>;\n}\n\ntype AnyScene = Scene<unknown, string, unknown>;\n\n/** Each lane of `poolId` with its size along the stack, in order. */\nexport function laneList(scene: AnyScene, poolId: string): { id: string; size: number }[] {\n const pool = scene.get(poolId as never);\n const trait = pool === undefined ? null : diagramContainerOf(pool);\n if (trait === null) return [];\n const axis = poolAxisOf(trait);\n return lanesOf(scene, poolId).map((id) => {\n const p = scene.get(id)!.pose as RectPose;\n return { id: id as string, size: axis === 'y' ? p.height : p.width };\n });\n}\n\n/** Where each region in `scene` stands. */\nexport function readRegions(scene: AnyScene): RegionStanding {\n const regions = new Map<string, RegionAt>();\n const pools = new Map<string, { id: string; size: number }[]>();\n const at = worldWith(scene);\n for (const n of scene.renderOrderNodes()) {\n const trait = diagramContainerOf(n);\n if (trait === null) continue;\n const { x, y, width, height } = at(n.id) as RectPose;\n regions.set(n.id, { box: { x, y, width, height }, parent: n.parent, fitted: trait.fitted === true });\n if (trait.role === 'pool') pools.set(n.id, laneList(scene, n.id));\n }\n return { regions, pools };\n}\n\nconst sameBox = (a: Box, b: Box) => a.x === b.x && a.y === b.y && a.width === b.width && a.height === b.height;\nconst sameLanes = (a: readonly { id: string; size: number }[], b: readonly { id: string; size: number }[]) =>\n a.length === b.length && a.every((l, i) => l.id === b[i]!.id && l.size === b[i]!.size);\n\n/**\n * The region edits between two standings. A lane's box is reported only as\n * its pool's lanes, and a fitted container carried along by a region around\n * it not at all: its box is fitted to its members, which report their own moves.\n */\nexport function regionChanges(was: RegionStanding, now: RegionStanding): ContainerEdit[] {\n const out: ContainerEdit[] = [];\n const changed = new Set<string>();\n for (const [id, at] of now.regions) {\n const before = was.regions.get(id);\n if (before !== undefined && (!sameBox(before.box, at.box) || before.parent !== at.parent)) changed.add(id);\n }\n const carried = (id: string): boolean => {\n for (let p = now.regions.get(id)?.parent ?? null; p !== null; p = now.regions.get(p)?.parent ?? null) {\n if (changed.has(p)) return true;\n }\n return false;\n };\n for (const id of changed) {\n const at = now.regions.get(id)!;\n const before = was.regions.get(id)!;\n if (now.pools.has(at.parent ?? '')) continue;\n if (at.fitted && before.parent === at.parent && carried(id)) continue;\n out.push({ kind: 'box', id, box: at.box, ...(before.parent !== at.parent ? { parent: at.parent } : {}) });\n }\n for (const [pool, lanes] of now.pools) {\n const before = was.pools.get(pool);\n if (before !== undefined && !sameLanes(before, lanes)) out.push({ kind: 'lanes', pool, lanes });\n }\n return out;\n}\n","/**\n * `DiagramView`'s two-way sync with the data it was built from: new specs are\n * reconciled into the scene, and what a drag or a layout run changed is\n * reported back, so a consumer keeping the diagram as data can store it.\n * `diagramLayoutOf` reads the same report off a `diagramScene` build.\n */\nimport { isBodyOrRegion, isDiagramBody } from './bodyNode';\nimport { RIGID_POSE_COMPOSITION, reconcileSpecs, useLatest, worldPosesOf, type RectPose, type Scene } from '@weasel-js/core';\nimport { worldWith } from './worldWith';\nimport type { Vec2 } from '@weasel-js/core/math';\nimport { useEffect, useRef } from 'react';\nimport { diagramContainerOf } from './containers/trait';\nimport { diagramEdgeOf, layoutOwnsRoute, samePoints, type DiagramEdge, type EdgeEnd } from './edgeTrait';\nimport type { DiagramSceneData, DiagramSpec } from './fromData';\nimport type { LayoutPorts } from './layout';\nimport { readRegions, regionChanges, type ContainerEdit, type RegionStanding } from './regionSync';\nimport { isPinned } from './trait';\n\nexport type { ContainerEdit };\n\n/** Where a moved node now stands. `parent` is present when a drop changed\n * the region it is in: that container's or lane's id, or `null` for the top\n * level. The host moves the id from one `members` list to the other. */\nexport interface NodeMove { id: string; x: number; y: number; parent?: string | null }\n\n/** An edge whose route or ports a layout run rewrote. `id` is the edge's\n * scene id, `edgeIdOf` of its data edge; `waypoints` is empty when the run\n * took a route away and left the edge straight, and `ports` names the ends\n * layout owns. Store them as the data edge's `routed` and `routedPorts`,\n * which stay layout's, not as `waypoints`, `fromPort` and `toPort`, which\n * would be the author's and rename the edge. */\nexport interface EdgeRoute { id: string; waypoints: readonly Vec2[]; ports: LayoutPorts }\n\ntype DiagramScene = Scene<DiagramSceneData, 'main', RectPose>;\n\ninterface Route { waypoints: readonly Vec2[]; ports: LayoutPorts }\n\ninterface Standing {\n nodes: Map<string, { x: number; y: number; parent: string | null }>;\n routes: Map<string, Route>;\n regions: RegionStanding;\n}\n\nconst NONE: readonly Vec2[] = [];\n\n/** The port layout owns at `end`, if it named one. */\nconst laidPort = (end: EdgeEnd) => (end.laidOut !== undefined && end.port === end.laidOut ? end.laidOut : undefined);\n\nfunction portsOf(from: EdgeEnd, to: EdgeEnd): LayoutPorts {\n const f = laidPort(from);\n const t = laidPort(to);\n return { ...(f !== undefined ? { from: f } : {}), ...(t !== undefined ? { to: t } : {}) };\n}\n\nconst samePorts = (a: LayoutPorts, b: LayoutPorts) => a.from === b.from && a.to === b.to;\n\nconst routeOf = (edge: DiagramEdge): Route => ({ waypoints: edge.waypoints ?? NONE, ports: portsOf(edge.from, edge.to) });\n\nfunction readScene(scene: DiagramScene): Standing {\n const nodes = new Map<string, { x: number; y: number; parent: string | null }>();\n const routes = new Map<string, Route>();\n // Where each stands in world, which is what the data says.\n const at = worldWith(scene as never);\n for (const n of scene.renderOrderNodes()) {\n if (isDiagramBody(n)) {\n const { x, y } = at(n.id) as RectPose;\n nodes.set(n.id, { x, y, parent: n.parent });\n continue;\n }\n if (diagramContainerOf(n) !== null) continue;\n const edge = diagramEdgeOf(n);\n if (edge !== null) routes.set(n.id, routeOf(edge));\n }\n return { nodes, routes, regions: readRegions(scene as never) };\n}\n\n/** What layout placed in a `diagramScene` build, in the shapes `DiagramView`\n * reports: every node not pinned, where it stands, every edge whose route\n * or ports layout wrote, and the box of every container and pool not pinned\n * whose box is its own rather than fitted. Store them the way `onMove` and\n * `onEditContainer` say and the next build leaves them where they are. */\nexport function diagramLayoutOf(specs: readonly DiagramSpec[]): { moves: NodeMove[]; routes: EdgeRoute[]; containers: ContainerEdit[] } {\n const moves: NodeMove[] = [];\n const routes: EdgeRoute[] = [];\n const containers: ContainerEdit[] = [];\n const world = worldPosesOf(specs, RIGID_POSE_COMPOSITION);\n for (const s of specs) {\n const id = s.id;\n if (id === undefined) continue;\n if (isBodyOrRegion(s)) {\n const region = diagramContainerOf(s);\n const pinned = isPinned({ id, kind: s.kind, data: s.data });\n const { x, y, width, height } = world.get(id)!;\n if (region !== null) {\n if (!pinned && region.role !== 'lane' && region.fitted !== true) {\n containers.push({ kind: 'box', id, box: { x, y, width, height } });\n }\n } else if (!pinned) moves.push({ id, x, y });\n continue;\n }\n const edge = diagramEdgeOf(s);\n if (edge === null) continue;\n const route = routeOf(edge);\n const laid = edge.laidOut !== undefined && route.waypoints.length > 0 && layoutOwnsRoute(edge);\n if (laid || route.ports.from !== undefined || route.ports.to !== undefined) {\n routes.push({ id, waypoints: laid ? route.waypoints : NONE, ports: route.ports });\n }\n }\n return { moves, routes, containers };\n}\n\ninterface Changes { moves: NodeMove[]; routes: EdgeRoute[]; containers: ContainerEdit[] }\n\nfunction changes(was: Standing, now: Standing): Changes {\n const moves: NodeMove[] = [];\n for (const [id, { x, y, parent }] of now.nodes) {\n const before = was.nodes.get(id);\n if (before === undefined) continue;\n const reparented = before.parent !== parent;\n if (before.x !== x || before.y !== y || reparented) moves.push({ id, x, y, ...(reparented ? { parent } : {}) });\n }\n const routes: EdgeRoute[] = [];\n for (const [id, after] of now.routes) {\n const before = was.routes.get(id);\n if (before === undefined) continue;\n const moved = before.waypoints !== after.waypoints && !samePoints(before.waypoints, after.waypoints);\n if (moved || !samePorts(before.ports, after.ports)) routes.push({ id, ...after });\n }\n return { moves, routes, containers: regionChanges(was.regions, now.regions) };\n}\n\n/** The callbacks {@link useSceneSync} reports to. */\nexport interface SceneSyncReports {\n onMove?: ((moves: readonly NodeMove[], routes: readonly EdgeRoute[]) => void) | undefined;\n onEditContainer?: ((edit: ContainerEdit) => void) | undefined;\n}\n\n/** Reconcile `specs` into `scene` as they change, and report every move and\n * route change that did not come from a reconcile to `onMove`, and every\n * region change to `onEditContainer`. */\nexport function useSceneSync(scene: DiagramScene, specs: readonly DiagramSpec[], reports: SceneSyncReports): void {\n const reportsRef = useLatest(reports);\n const syncing = useRef(false);\n const applied = useRef(specs);\n useEffect(() => {\n let known = readScene(scene);\n return scene.subscribe(() => {\n const now = readScene(scene);\n const found = syncing.current ? null : changes(known, now);\n known = now;\n if (found === null) return;\n if (found.moves.length > 0 || found.routes.length > 0) reportsRef.current.onMove?.(found.moves, found.routes);\n for (const edit of found.containers) reportsRef.current.onEditContainer?.(edit);\n });\n }, [scene, reportsRef]);\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","/** Editing a sequence's text in place, through a canvas's own text editor. */\nimport { isTextData, useLatest, type Scene, type SceneCanvasTextEditor } from '@weasel-js/core';\nimport type { DiagramSceneData } from '../dataTypes';\nimport { useMemo } from 'react';\nimport { foldSequenceText, type SequenceEdit } from './commit';\nimport { sequencePartOf } from './trait';\n\n/** Whether `data` is a sequence's text an edit can set: a head's, a message's or note's, a section's, a box's. */\nexport const isSequenceText = (data: unknown): boolean => isTextData(data) && sequencePartOf({ data })?.target !== undefined;\n\n/**\n * The `<SceneCanvas textEditor>` options that open on a sequence's text and,\n * as the edit closes, fold it into one edit of the sequence's data for\n * `report`. `undefined` while `report` is.\n */\nexport function useSequenceTextEdit(\n scene: Scene<unknown, string, unknown>, report: ((edit: SequenceEdit) => void) | undefined,\n): Exclude<SceneCanvasTextEditor<DiagramSceneData>, false> | undefined {\n const latest = useLatest(report);\n const on = report !== undefined;\n return useMemo(() => (on\n ? {\n isText: isSequenceText,\n onEnd: (id: string) => foldSequenceText(scene, id, (edit) => latest.current?.(edit)),\n }\n : undefined), [on, scene, latest]);\n}\n","/**\n * What `DiagramView` installs for `onEditContainer`: the container actions\n * with every commit swapped for a report, and the header double-click.\n */\nimport { isDiagramBody } from './bodyNode';\nimport type { Contribution, NodeId, RectPose, RenderLayer, Scene } from '@weasel-js/core';\nimport { worldWith } from './worldWith';\nimport { diagramContainers, laneResizeFrame, type LaneResize } from './containers/containerActions';\nimport { editContainerTitleAction, editContainerTitleBinding } from './containers/containerTitle';\nimport { poolsOf } from './containers/laneBoundaryLayer';\nimport { diagramContainerOf } from './containers/trait';\nimport { DEFAULT_LANE_SIZE } from './dataTypes';\nimport { laneList, type ContainerEdit } from './regionSync';\nimport type { NodeMove } from './sceneSync';\n\ntype AnyScene = Scene<unknown, string, unknown>;\n\n/** Where region edits and the moves they bring about are reported. */\nexport interface RegionReports {\n onEditContainer?: ((edit: ContainerEdit) => void) | undefined;\n onMove?: ((moves: readonly NodeMove[], routes: readonly never[]) => void) | undefined;\n}\n\n/**\n * A lane resize as reports: the pool's lanes with the one resized, and, for\n * what the lanes after it carry, a node's move or a boxed region's box.\n */\nexport function laneResizeReports(scene: AnyScene, resize: LaneResize): { lanes: ContainerEdit; moves: NodeMove[]; boxes: ContainerEdit[] } | null {\n const pool = poolsOf(scene).find((p) => p.id === resize.poolId);\n const index = pool?.lanes.findIndex((l) => l.id === resize.laneId) ?? -1;\n if (pool === undefined || index < 0) return null;\n const lanes = laneList(scene, pool.id).map((l) => (l.id === resize.laneId ? { ...l, size: resize.size } : l));\n const moves: NodeMove[] = [];\n const boxes: ContainerEdit[] = [];\n // Reported in world: what a later lane carries moves with it, written or not.\n const after = worldWith(scene, laneResizeFrame(scene, pool, index, resize.size));\n const before = worldWith(scene);\n for (const lane of pool.lanes.slice(index + 1)) {\n for (const id of descendantsOf(scene, lane.id)) {\n const node = scene.get(id as NodeId);\n if (node === undefined) continue;\n const { x, y, width, height } = after(id) as RectPose;\n const was = before(id) as RectPose;\n if (x === was.x && y === was.y) continue;\n const region = diagramContainerOf(node);\n if (region !== null) {\n if (region.role === 'container' && region.fitted !== true) boxes.push({ kind: 'box', id, box: { x, y, width, height } });\n } else if (isDiagramBody(node)) moves.push({ id, x, y });\n }\n }\n return { lanes: { kind: 'lanes', pool: pool.id, lanes }, moves, boxes };\n}\n\n/** The lane layer and the contributions that report region edits through `reports`. */\nexport function regionEditing(\n scene: AnyScene,\n selected: () => readonly string[],\n reports: { readonly current: RegionReports },\n): { layer: RenderLayer<unknown>; contributions: Contribution[] } {\n const edit = (e: ContainerEdit) => reports.current.onEditContainer?.(e);\n const containers = diagramContainers({\n scene,\n selected,\n commitResize: (resize) => {\n const out = laneResizeReports(scene, resize);\n if (out === null) return;\n edit(out.lanes);\n for (const box of out.boxes) edit(box);\n if (out.moves.length > 0) reports.current.onMove?.(out.moves, []);\n },\n commitAddLane: (poolId) => {\n const lanes = [...laneList(scene, poolId), { id: scene.mintId() as string, size: DEFAULT_LANE_SIZE }];\n edit({ kind: 'lanes', pool: poolId, lanes });\n },\n commitRelease: (id) => edit({ kind: 'release', id }),\n });\n const title: Contribution = {\n id: 'weasel-diagram-container-title',\n eligibility: { always: true },\n actions: [editContainerTitleAction((id) => edit({ kind: 'title', id }))],\n bindings: [editContainerTitleBinding()],\n };\n return { layer: containers.layer, contributions: [containers.contribution, title] };\n}\n\n/** Every node under `id`, each after its parent. */\nfunction descendantsOf(scene: AnyScene, id: string): string[] {\n const out: string[] = [];\n for (const c of scene.childrenOf(id as NodeId)) out.push(c as string, ...descendantsOf(scene, c as string));\n return out;\n}\n","/**\n * What `DiagramView` installs for each editing callback it is handed. Every\n * action keeps its gesture and swaps its commit for one that reports a data\n * edit, so the host changes its data and the view follows through the specs.\n */\nimport {\n createDeleteAction,\n createResizeAction,\n dragPanContribution,\n useLatest,\n type Action,\n type ActionsProp,\n type Contribution,\n type RectPose,\n type RenderLayer,\n type Scene,\n} from '@weasel-js/core';\nimport { useMemo } from 'react';\nimport { isBodyEnd } from './connectTargets';\nimport { diagramContainerOf, titleIdOf } from './containers/trait';\nimport { diagramLabelDrag, diagramPorts, diagramWaypoints } from './contribution';\nimport { editEdgeLabelAction, editEdgeLabelBinding } from './edgeLabel';\nimport { diagramEdgeOf } from './edgeTrait';\nimport type { DiagramSpec } from './fromData';\nimport type { ParticipantSource } from './portAffordance';\nimport { portLayer } from './portLayer';\nimport { diagramEdgeEnds, type EndChange } from './reconnect';\nimport { groupReorderContribution } from './groupReorder';\nimport { regionEditing } from './regionEditing';\nimport type { ContainerEdit } from './regionSync';\nimport { dataKeyReader } from './trait';\nimport type { DeleteReport, DiagramViewProps, NodeResize, ReconnectChange } from './diagramViewProps';\nimport { diagramSequence } from './sequence/actions';\nimport type { SequenceEdit } from './sequence/commit';\nimport { createSequenceDeleteAction } from './sequence/select';\n\nconst AMBIENT = [dragPanContribution()];\n// A drag on empty canvas pans: the select tool's marquee would outrank the ambient pan.\nconst NO_MARQUEE = { areaSelect: null };\n\ntype AnyScene = Scene<unknown, string, unknown>;\n\n/** `id`, a region, and every node and region inside it, into `out`. */\nfunction regionAndMembers(scene: AnyScene, id: string, out: Set<string>): void {\n out.add(id);\n for (const child of scene.childrenOf(id as never)) {\n const node = scene.get(child);\n if (node === undefined || child === titleIdOf(id)) continue;\n if (diagramContainerOf(node) !== null) regionAndMembers(scene, child, out);\n else if (dataKeyReader(node) !== null) out.add(child);\n }\n}\n\n/**\n * The data a delete of `ids` takes: the selected nodes and groups, every\n * container, pool, or lane with what it holds, and every edge selected or\n * ending on one of them. Not `removalClosure`: a group depends on its\n * members, and deleting a member leaves the group standing.\n */\nexport function removedData(scene: AnyScene, ids: readonly string[]): DeleteReport {\n const nodes = new Set<string>();\n const edges = new Set<string>();\n for (const id of ids) {\n const node = scene.get(id as never);\n if (node === undefined) continue;\n if (diagramEdgeOf(node) !== null) edges.add(id);\n else if (diagramContainerOf(node) !== null) regionAndMembers(scene, id, nodes);\n else if (dataKeyReader(node) !== null) nodes.add(id);\n }\n for (const node of scene.renderOrderNodes()) {\n const ends = node.dependsOn;\n if (diagramEdgeOf(node) !== null && Array.isArray(ends) && ends.some((end) => nodes.has(end))) edges.add(node.id);\n }\n return { nodes: [...nodes], edges: [...edges] };\n}\n\n/** Core's `delete`, reporting what it would remove instead of removing it. */\nexport function reportDeleteAction(report: (removed: DeleteReport) => void): Action {\n return createDeleteAction({\n commit: (ids, deps) => {\n if (deps.scene === undefined) return;\n const removed = removedData(deps.scene as Scene<unknown, string, unknown>, ids);\n if (removed.nodes.length > 0 || removed.edges.length > 0) report(removed);\n },\n });\n}\n\n/** Core's `delete` on a view drawing sequences: a sequence's parts are reported as its edit, anything else as `onDelete` would. */\nfunction sequenceDeleteAction(\n scene: AnyScene, edit: (edit: SequenceEdit) => void, report: ((removed: DeleteReport) => void) | null,\n): Action {\n return createSequenceDeleteAction({\n commit: edit,\n others: (ids) => {\n const removed = removedData(scene, ids);\n if (report !== null && (removed.nodes.length > 0 || removed.edges.length > 0)) report(removed);\n },\n });\n}\n\n/** Core's `resize`, reporting the selected boxes it would leave instead of writing them: a\n * container's or pool's to `region` as a box edit, any other's to `report`. */\nexport function reportResizeAction(\n report: ((resizes: readonly NodeResize[]) => void) | undefined,\n region?: (edit: ContainerEdit) => void,\n): Action {\n return createResizeAction({\n commit: (poses, deps) => {\n const picked = new Set(deps.selection?.get() ?? []);\n const resizes: NodeResize[] = [];\n for (const [id, pose] of poses) {\n if (!picked.has(id)) continue;\n const { x, y, width, height } = pose as RectPose;\n const node = deps.scene?.get(id as never);\n if (node !== undefined && diagramContainerOf(node) !== null) region?.({ kind: 'box', id, box: { x, y, width, height } });\n else resizes.push({ id, x, y, width, height });\n }\n if (resizes.length > 0) report?.(resizes);\n },\n });\n}\n\nexport const reconnectChangeOf =({ edgeId, end, target }: EndChange): ReconnectChange => ({\n edge: edgeId,\n end,\n node: target.nodeId,\n ...(isBodyEnd(target) ? {} : { port: target.id }),\n});\n\n/** `specs` with every edge pickable, so a click selects it. */\nexport function withPickableEdges(specs: readonly DiagramSpec[]): DiagramSpec[] {\n return specs.map((s) => (diagramEdgeOf(s) !== null ? { ...s, pickable: true } : s));\n}\n\ntype EditingProps = Pick<\n DiagramViewProps,\n 'onConnect' | 'onReconnect' | 'onEditRoute' | 'onDelete' | 'onEditLabel' | 'onMoveLabel' | 'onReorder' | 'onResize' | 'onEditContainer' | 'onMove'\n | 'onEditSequence'\n | 'connectBodies' | 'canConnect' | 'portOptions' | 'ambient'\n>;\n\nexport interface DiagramEditing {\n /** In registration order: the last is hit first. */\n layers: readonly RenderLayer<unknown>[];\n ambient: readonly Contribution[];\n actions: ActionsProp;\n}\n\nexport function useDiagramEditing(\n props: EditingProps & {\n scene: AnyScene; source: ParticipantSource<RectPose>; selected: () => readonly string[]; mode: 'connect' | 'show' | 'none';\n },\n): DiagramEditing {\n const { scene, source, selected, mode, canConnect, portOptions, connectBodies } = props;\n const report = useLatest(props);\n const reconnects = props.onReconnect !== undefined;\n const routes = props.onEditRoute !== undefined;\n const labels = props.onEditLabel !== undefined;\n const labelMoves = props.onMoveLabel !== undefined;\n const deletes = props.onDelete !== undefined;\n const reorders = props.onReorder !== undefined;\n const resizes = props.onResize !== undefined;\n const regionEdits = props.onEditContainer !== undefined;\n const sequences = props.onEditSequence !== undefined;\n\n const ports = useMemo(() => mode === 'connect'\n ? diagramPorts<RectPose>({\n ...portOptions,\n participants: source,\n bodies: connectBodies === true,\n ...(canConnect ? { canConnect } : {}),\n commit: ({ from, to }) => report.current.onConnect?.({\n from: from.nodeId,\n ...(isBodyEnd(from) ? {} : { fromPort: from.id }),\n to: to.nodeId,\n ...(isBodyEnd(to) ? {} : { toPort: to.id }),\n }),\n })\n : null, [mode, source, canConnect, portOptions, connectBodies, report]);\n // A registered layer with no `hitTest` is painted and claims no press.\n const shown = useMemo(() => {\n if (mode !== 'show') return null;\n const { hitTest: _hitTest, ...paintOnly } = portLayer<RectPose>(source, portOptions);\n return paintOnly;\n }, [mode, source, portOptions]);\n const ends = useMemo(() => reconnects\n ? diagramEdgeEnds<RectPose>({\n participants: source,\n selected,\n bodies: connectBodies === true,\n ...(canConnect ? { canConnect } : {}),\n ...(portOptions?.snapRadius !== undefined ? { snapRadius: portOptions.snapRadius } : {}),\n ...(portOptions?.showsPort ? { showsPort: portOptions.showsPort } : {}),\n commit: (change) => report.current.onReconnect?.(reconnectChangeOf(change)),\n })\n : null, [reconnects, source, selected, connectBodies, canConnect, portOptions, report]);\n const route = useMemo(() => routes\n ? diagramWaypoints<RectPose>({\n participants: source,\n selected,\n commit: ({ edgeId, waypoints }) => report.current.onEditRoute?.({ edge: edgeId, waypoints }),\n })\n : null, [routes, source, selected, report]);\n const labelDrag = useMemo(() => labelMoves\n ? diagramLabelDrag({\n scene,\n selected,\n commit: ({ edgeId, placement }) => report.current.onMoveLabel?.({ edge: edgeId, placement }),\n })\n : null, [labelMoves, scene, selected, report]);\n const label = useMemo((): Contribution | null => labels\n ? {\n id: 'weasel-diagram-edge-label',\n eligibility: { always: true },\n actions: [editEdgeLabelAction({ commit: (edgeId) => report.current.onEditLabel?.(edgeId) })],\n bindings: [editEdgeLabelBinding()],\n }\n : null, [labels, report]);\n const reorder = useMemo(\n () => (reorders ? groupReorderContribution((change) => report.current.onReorder?.(change)) : null),\n [reorders, report],\n );\n const regions = useMemo(() => (regionEdits ? regionEditing(scene, selected, report) : null), [regionEdits, scene, selected, report]);\n const sequence = useMemo(\n () => (sequences ? diagramSequence({ scene, commit: (edit) => report.current.onEditSequence?.(edit) }) : null),\n [sequences, scene, report],\n );\n const actions = useMemo(() => ({\n ...NO_MARQUEE,\n ...(sequences\n ? { delete: sequenceDeleteAction(scene, (edit) => report.current.onEditSequence?.(edit), deletes ? (r) => report.current.onDelete?.(r) : null) }\n : deletes ? { delete: reportDeleteAction((r) => report.current.onDelete?.(r)) } : {}),\n ...(resizes || regionEdits\n ? { resize: reportResizeAction((r) => report.current.onResize?.(r), (e) => report.current.onEditContainer?.(e)) }\n : {}),\n }), [deletes, sequences, scene, resizes, regionEdits, report]);\n\n const portsLayer = ports?.layer ?? shown;\n const layers = useMemo(\n // Edge ends after ports and routes: an edge's end sits on a port and beside a route handle, and the last layer is hit first.\n () => [regions?.layer, labelDrag?.layer, portsLayer, route?.layer, ends?.layer, sequence?.layer]\n .filter((l): l is RenderLayer<unknown> => l != null),\n [regions, labelDrag, portsLayer, route, ends, sequence],\n );\n const extra = props.ambient;\n const ambient = useMemo(() => [\n ...AMBIENT,\n ...[ports?.contribution, route?.contribution, ends?.contribution, labelDrag?.contribution, label, reorder, sequence?.contribution]\n .filter((c): c is Contribution => c != null),\n ...(regions?.contributions ?? []),\n ...(extra ?? []),\n ], [ports, route, ends, labelDrag, label, reorder, sequence, regions, extra]);\n return { layers, ambient, actions };\n}\n","import { pagesBounds, pagesLayer } from '@weasel-js/core';\nimport { useMemo } from 'react';\nimport type { DiagramViewProps } from './diagramViewProps';\n\n/** What `DiagramView`'s `pages` prop adds: the layer that paints them under the scene, and their bounds for the fit.\n * Keyed on the placed array and the fill, so a `pages` object built inline each render changes nothing. */\nexport function usePagesView(pages: DiagramViewProps['pages']) {\n const placed = pages?.placed;\n const fill = pages?.fill;\n return useMemo(() => {\n if (placed === undefined || fill === undefined) return { layers: undefined, box: undefined };\n return {\n layers: { pages: { layer: pagesLayer(placed, { fill }), before: 'scene' as const } },\n box: pagesBounds(placed) ?? undefined,\n };\n }, [placed, fill]);\n}\n","/**\n * How `DiagramView` frames its diagram: the fit it opens on, and the fits that\n * replace it — a settled layout run, specs that no longer fit in view, or a\n * call to `fit()` — each applied only while the view is still the last fit,\n * except `fit()`, which takes the view back.\n */\nimport { RIGID_POSE_COMPOSITION, worldPosesOf, clampView, fitViewToBounds, useLatest, viewportWorldRect, type Bounds, type RectPose, type SceneCanvasApi, type View } from '@weasel-js/core';\nimport { unionRects } from '@weasel-js/geom';\nimport { useEffect, useMemo, useRef, useState, type RefObject } from 'react';\nimport { isBodyOrRegion } from './bodyNode';\nimport { diagramEdgeOf } from './edgeTrait';\nimport { diagramGroupOf } from './group';\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 /** A world rect every fit is kept inside, as `SceneCanvas` keeps every view inside its `viewBounds`. */\n bounds?: Bounds;\n}\n\n/** The space a fit keeps clear around a diagram, in CSS pixels, and a bounded view's margin in world units. */\nexport const DEFAULT_FIT_PADDING = 16;\n\ntype Boxes = readonly { id?: string; kind: string; pose: unknown; data: unknown; parent?: string | null }[];\n\n/** The world rect every node box, group box and route point takes, and `extra`, or `null` for none. */\nfunction diagramBounds(specs: Boxes, extra?: Bounds): Bounds | null {\n const world = worldPosesOf(specs as never, RIGID_POSE_COMPOSITION);\n const boxes: Bounds[] = specs.filter((s) => isBodyOrRegion(s) || diagramGroupOf(s) !== null)\n .map((s) => (world.get((s as { id?: string }).id ?? '') ?? s.pose) as RectPose);\n for (const s of specs) {\n const edge = diagramEdgeOf(s);\n for (const p of [...(edge?.waypoints ?? []), ...(edge?.route ?? [])]) boxes.push({ x: p.x, y: p.y, width: 0, height: 0 });\n }\n if (extra !== undefined) boxes.push(extra);\n return unionRects(boxes);\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`. `extra` is further bounds to take in, such as the\n * pages'. Takes specs, or a scene's nodes at the poses they are drawn at. */\nexport function fitDiagram(\n specs: Boxes,\n size: { width: number; height: number },\n fit: DiagramFit = {},\n extra?: Bounds,\n): View | undefined {\n const bounds = diagramBounds(specs, extra);\n if (bounds === null) return undefined;\n const view = 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 padding: fit.padding ?? DEFAULT_FIT_PADDING,\n });\n // Clamped here as the canvas would clamp it, so the view the canvas holds is the fit itself, and\n // a later fit still sees the view as untouched.\n return fit.bounds === undefined ? view : clampView(view, fit.bounds, size);\n}\n\n/** The world rect a bounded diagram's view stays inside: every node box, group box and route\n * point, and `extra`, with `padding` world units around them; `undefined` for an empty diagram. */\nexport function diagramViewBounds(specs: Boxes, padding: number, extra?: Bounds): Bounds | undefined {\n const b = diagramBounds(specs, extra);\n return b === null ? undefined : { x: b.x - padding, y: b.y - padding, width: b.width + 2 * padding, height: b.height + 2 * padding };\n}\n\nconst IDENTITY: View = { x: 0, y: 0, scale: { x: 1, y: 1 } };\nconst sameView = (a: View, b: View) =>\n a.x === b.x && a.y === b.y && a.scale.x === b.scale.x && a.scale.y === b.scale.y;\n\n/** Whether `inner` lies inside what `view` shows of a `size` box. */\nfunction inView(inner: Bounds, view: View, size: { width: number; height: number }): boolean {\n const shown = viewportWorldRect(view, size);\n return inner.x >= shown.x && inner.y >= shown.y\n && inner.x + inner.width <= shown.x + shown.width && inner.y + inner.height <= shown.y + shown.height;\n}\n\nexport interface DiagramFitting {\n /** The fit the canvas opens on, before anything replaces it. */\n defaultView: View | undefined;\n /** Fit the diagram as it now stands, if the view is still the last fit. */\n settle: () => void;\n /** Fit the diagram as it now stands, whatever the view is. */\n fitNow: () => void;\n}\n\nexport function useDiagramFit(args: {\n canvasRef: RefObject<SceneCanvasApi | null>;\n specs: Boxes;\n /** The nodes as they stand now, at the poses they are drawn at. */\n current: () => Boxes;\n controlled: boolean;\n size: { width: number; height: number };\n fit: DiagramFit;\n /** Further bounds every fit takes in, such as the pages'. */\n extra: Bounds | undefined;\n /** When new specs refit a view still on its last fit: only once they run past it (`'overflow'`,\n * the default), or on every change (`'always'`). */\n refit?: 'overflow' | 'always';\n}): DiagramFitting {\n const { canvasRef, specs, controlled, size, fit, extra } = args;\n // A filling canvas is 0 × 0 until measured, and no box to fit into.\n const unsized = size.width === 0 || size.height === 0;\n const defaultView = useMemo(\n () => (controlled || unsized ? undefined : fitDiagram(specs, size, fit, extra)),\n // A later `specs` is the refit check's to answer.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [controlled, unsized, size.width, size.height, fit.minScale, fit.maxScale, fit.anchor, fit.padding, extra],\n );\n // A later fit holds until the box or a fit option changes.\n const [later, setLater] = useState<{ view: View | undefined; over: View | undefined } | null>(null);\n const target = later !== null && later.over === defaultView ? later.view : defaultView;\n const fitted = useRef(target);\n const opts = useLatest({ controlled, unsized, size, fit, extra, defaultView, current: args.current, refit: args.refit ?? 'overflow' });\n\n useEffect(() => {\n const canvas = canvasRef.current;\n const was = fitted.current;\n if (canvas === null || target === undefined || was === target) return;\n // A view the user has panned or zoomed off its fit is theirs to keep.\n if (!sameView(canvas.getView(), was ?? IDENTITY)) return;\n fitted.current = target;\n canvas.setView(target);\n }, [canvasRef, target]);\n\n const first = useRef(true);\n useEffect(() => {\n if (first.current) {\n first.current = false;\n return;\n }\n const { controlled: c, unsized: u, size: box, fit: f, extra: more, defaultView: over, refit } = opts.current;\n const canvas = canvasRef.current;\n const bounds = diagramBounds(specs, more);\n if (c || u || canvas === null || bounds === null) return;\n if (refit === 'overflow' && inView(bounds, canvas.getView(), box)) return;\n setLater({ view: fitDiagram(specs, box, f, more), over });\n }, [specs, canvasRef, opts]);\n\n return useMemo(() => {\n const now = () => {\n const { size: box, fit: f, extra: more, current } = opts.current;\n return fitDiagram(current(), box, f, more);\n };\n return {\n defaultView,\n settle: () => {\n if (opts.current.controlled) return;\n setLater({ view: now(), over: opts.current.defaultView });\n },\n fitNow: () => {\n const canvas = canvasRef.current;\n const view = now();\n if (canvas === null || view === undefined) return;\n fitted.current = view;\n canvas.setView(view);\n },\n };\n }, [defaultView, canvasRef, opts]);\n}\n","import {\n SceneCanvas,\n useDepSource,\n useLatest,\n useScene,\n useSelection,\n viewRectToScreen,\n WeaselProvider,\n type RectPose,\n type RenderLayer,\n type CanvasSize,\n type Scene,\n type SceneCanvasApi,\n} from '@weasel-js/core';\nimport { adoptCssOnce } from '@weasel-js/react';\nimport { forwardRef, useCallback, useEffect, useImperativeHandle, useMemo, useRef, useState, type Ref, type RefObject } from 'react';\nimport { createSpecRouter } from './avoid/specRoutes';\nimport { diagramCanDropInto, type CanReparent } from './containers/canDropInto';\nimport { createSpecHops } from './hops/specHops';\nimport { createSpecLabelPlacer } from './labels/specLabels';\nimport { useDiagramEditing, withPickableEdges } from './diagramEditing';\nimport type { DiagramLayout, DiagramViewApi, DiagramViewProps } from './diagramViewProps';\nimport { withDiagramRegistry } from './edge';\nimport type { DiagramSceneData, DiagramSpec } from './fromData';\nimport { useItemDrop } from './itemDrop';\nimport { useLiveLayout, type LiveLayout } from './live';\nimport { usePagesView } from './usePagesView';\nimport { DEFAULT_FIT_PADDING, diagramViewBounds, useDiagramFit } from './diagramFit';\nimport { useMirroredSelection } from './mirrorSelection';\nimport { useOverlayPlacement, worldRectOf } from './overlays';\nimport { sceneParticipants } from './portLayer';\nimport { registerMarkShape } from './marks';\nimport { diagramResizable } from './resizable';\nimport { useSceneSync } from './sceneSync';\nimport { registerDiagramShape } from './shape';\nimport { useSequenceTextEdit } from './sequence/textEdit';\n\nexport type { ContainerEdit, EdgeRoute, NodeMove } from './sceneSync';\nexport type {\n DeleteReport, DiagramLayout, DiagramViewApi, DiagramViewProps, LabelMove, NodeResize, ReconnectChange, RouteChange,\n} from './diagramViewProps';\nexport type { DiagramOverlay } from './overlays';\nexport { fitDiagram, type DiagramFit } from './diagramFit';\nexport type { ReorderChange } from './groupReorder';\n\n/** The view's box holds the canvas and the overlays placed over it, and is as\n * big as the canvas: its parent's box on an axis the canvas fills. */\nconst VIEW_RULE = ':where([data-wzl-diagram]) { position: relative; width: fit-content; }'\n + ' :where([data-wzl-diagram~=\"fill-x\"]) { width: 100%; }'\n + ' :where([data-wzl-diagram~=\"fill-y\"]) { height: 100%; }'\n + ' :where([data-wzl-diagram]) > canvas { display: block; }'\n + ' :where([data-wzl-diagram-overlay]) { position: absolute; left: 0; top: 0; }'\n + ' :where([data-wzl-diagram-overlay][hidden]) { display: none; }';\n\nconst adoptViewRule = (el: HTMLElement | null) => {\n if (el !== null) adoptCssOnce(el, VIEW_RULE);\n};\n\n/** A diagram: drag or wheel to pan, zoom, and pick a node; drag nodes with\n * `onMove`, join ports with `onConnect`. Every edit is reported, never\n * written: change the specs to keep it. 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: given, router, labels, hops, width, height, selectionMode = 'single', selected, onSelect, onHover, onMove, onResize, onConnect, onReconnect, onEditRoute, onDelete, onEditLabel, onMoveLabel,\n onEditSequence,\n onReorder, onEditContainer, connectBodies, canReparent, onDropItem, canDropItem,\n pickEdges, overlays = NO_OVERLAYS,\n ambient: extraAmbient, tools, onToolsCreated, enableKeybindings, canConnect, portOptions, ports: portMode, live: liveOpts,\n minScale, maxScale, anchor, fitPadding, bounded, refit, background, pages, view, onViewChange, className, apiRef,\n}: DiagramViewProps & { apiRef: Ref<DiagramViewApi> }) {\n const edgesPick = pickEdges ?? (onReconnect !== undefined || onEditRoute !== undefined || onDelete !== undefined || onEditLabel !== undefined || onMoveLabel !== undefined);\n const avoid = useMemo(() => (router === 'avoid' ? createSpecRouter() : null), [router]);\n const placer = useMemo(() => (labels === 'dodge' ? createSpecLabelPlacer() : null), [labels]);\n const routed = useMemo(() => {\n const out = avoid === null ? given : avoid(given);\n return placer === null ? out : placer(out);\n }, [avoid, placer, given]);\n const hopped = useMemo(() => (hops === undefined ? routed : createSpecHops(hops)(routed)), [hops, routed]);\n const specs = useMemo(() => (edgesPick ? withPickableEdges(hopped) : hopped), [edgesPick, hopped]);\n useEffect(() => {\n const disposers = [registerDiagramShape<RectPose>(), registerMarkShape<RectPose>()];\n return () => disposers.forEach((dispose) => dispose());\n }, []);\n const registry = useMemo(() => withDiagramRegistry<RectPose>(), []);\n const scene = useScene<DiagramSceneData, 'main', RectPose>({\n systemLayers: [{ id: 'main' }],\n initial: specs as DiagramSpec[],\n registry,\n });\n const selection = useSelection({ scene, mode: selectionMode === 'multiple' ? 'multi' : 'single' });\n const onClick = useMirroredSelection(selection, selected, onSelect);\n\n useSceneSync(scene, specs, { onMove, onEditContainer });\n\n const source = useMemo(() => sceneParticipants<RectPose>(scene), [scene]);\n // Each `layout()` call is a new run: the state change lands the algorithm in\n // the live layout's options before the effect restarts it.\n const [run, setRun] = useState<{ algorithm: DiagramLayout } | null>(null);\n const controlled = view !== undefined;\n const fills = width === undefined || height === undefined;\n const [measured, setMeasured] = useState<CanvasSize | null>(null);\n const { layers, box: pagesBox } = usePagesView(pages);\n const canvasRef = useRef<SceneCanvasApi | null>(null);\n const current = useCallback(() => Array.from(source(), ({ node, pose }) => ({ ...node, pose })), [source]);\n const viewBounds = useMemo(\n () => (bounded ? diagramViewBounds(specs, fitPadding ?? DEFAULT_FIT_PADDING, pagesBox) : undefined),\n [bounded, specs, fitPadding, pagesBox],\n );\n const fitting = useDiagramFit({\n canvasRef, specs, current, controlled,\n size: { width: width ?? measured?.width ?? 0, height: height ?? measured?.height ?? 0 },\n fit: { minScale, maxScale, anchor, padding: fitPadding, ...(viewBounds ? { bounds: viewBounds } : {}) }, extra: pagesBox,\n ...(refit ? { refit } : {}),\n });\n const { defaultView } = fitting;\n const settled = useLatest((moved: number) => {\n liveOpts?.onSettle?.(moved);\n if (moved !== 0) fitting.settle();\n });\n const live = useLiveLayout<RectPose>({\n ...liveOpts, scene, source, algorithm: run?.algorithm ?? 'force', onSettle: (moved) => settled.current(moved),\n });\n useEffect(() => {\n if (run !== null) live.restart();\n }, [run, live]);\n useDiagramApi(apiRef, canvasRef, scene, live, setRun, fitting.fitNow);\n\n const selectedIds = useCallback(() => selection.get() as readonly string[], [selection]);\n const editing = useDiagramEditing({\n scene: scene as never, source, selected: selectedIds, mode: portMode ?? (onConnect !== undefined ? 'connect' : 'none'),\n onConnect, onReconnect, onEditRoute, onDelete, onEditLabel, onMoveLabel, onReorder, onResize, onEditContainer, onMove, onEditSequence,\n connectBodies, canConnect, portOptions, ambient: extraAmbient,\n });\n const itemDrop = useItemDrop(source, { onDropItem, canDropItem });\n const ambient = useMemo(() => (itemDrop === null ? editing.ambient : [...editing.ambient, itemDrop]), [editing.ambient, itemDrop]);\n useRegisteredLayers(canvasRef, editing.layers);\n const moves = onMove !== undefined || onEditContainer !== undefined;\n const resizes = onResize !== undefined || onEditContainer !== undefined;\n const sequences = onEditSequence !== undefined;\n const edits = moves || onConnect !== undefined || onReorder !== undefined || resizes || edgesPick || sequences;\n const features = useMemo(() => [\n 'view', 'pick', ...(moves ? ['move' as const] : []), ...(resizes ? ['resize' as const] : []), ...(sequences ? ['edit' as const] : []),\n ] as const, [moves, resizes, sequences]);\n const textEditor = useSequenceTextEdit(scene, onEditSequence);\n const selectTool = useMemo(() => ({ resize: { resizable: diagramResizable(scene) } }), [scene]);\n\n const overlayRef = useOverlayPlacement(canvasRef, scene, overlays);\n const fillsOn = [width === undefined ? 'fill-x' : '', height === undefined ? 'fill-y' : ''].join(' ').trim();\n return (\n <div ref={adoptViewRule} data-wzl-diagram={fillsOn} className={className}>\n <SceneCanvas\n ref={canvasRef}\n scene={scene}\n selection={selection}\n features={features}\n {...(resizes ? { selectTool } : {})}\n {...(textEditor ? { textEditor } : {})}\n enableKeybindings={enableKeybindings ?? edits}\n ambient={ambient}\n actions={editing.actions}\n {...(tools ? { tools } : {})} {...(onToolsCreated ? { onToolsCreated } : {})}\n onClick={onClick}\n {...(onHover ? { onHover } : {})}\n width={width}\n height={height}\n {...(fills ? { onResize: setMeasured } : {})}\n {...(defaultView ? { defaultView } : {})}\n {...(view ? { view } : {})}\n {...(onViewChange ? { onViewChange } : {})}\n {...(viewBounds ? { viewBounds } : {})}\n {...(background ? { backgroundFill: background } : {})}\n {...(layers ? { layers } : {})}\n >\n <DropRules scene={scene} canReparent={canReparent} />\n </SceneCanvas>\n {overlays.map((o) => {\n const key = o.key ?? o.target;\n return <div key={key} ref={overlayRef(key)} data-wzl-diagram-overlay=\"\">{o.content}</div>;\n })}\n </div>\n );\n}\n\nconst NO_OVERLAYS: readonly never[] = [];\n\n/** Registers `layers` on the canvas, the only attach route that is hit-tested, in order: the last is hit first. */\nfunction useRegisteredLayers(canvasRef: RefObject<SceneCanvasApi | null>, layers: readonly RenderLayer<unknown>[]): void {\n useEffect(() => {\n const canvas = canvasRef.current;\n if (canvas === null) return;\n const disposers = layers.map((layer) => canvas.registerLayer(layer));\n return () => disposers.forEach((dispose) => dispose());\n }, [canvasRef, layers]);\n}\n\n/** Shapes drop only into containers and lanes, and lanes only into pools. A child of `<SceneCanvas>`, so its dep source registers after the canvas's own. */\nfunction DropRules({ scene, canReparent }: { scene: Scene<DiagramSceneData, 'main', RectPose>; canReparent: CanReparent | undefined }): null {\n const latest = useLatest(canReparent);\n const asks = canReparent !== undefined;\n const canDropInto = useMemo(\n () => diagramCanDropInto(scene as never, asks ? (ids, into) => latest.current?.(ids, into) ?? true : undefined),\n [scene, asks, latest],\n );\n useDepSource('canDropInto', () => canDropInto);\n return null;\n}\n\n/** What a `ref` on the view holds. */\nfunction useDiagramApi(\n apiRef: Ref<DiagramViewApi>,\n canvasRef: RefObject<SceneCanvasApi | null>,\n scene: Scene<DiagramSceneData, 'main', RectPose>,\n live: LiveLayout,\n setRun: (run: { algorithm: DiagramLayout }) => void,\n fitNow: () => void,\n): void {\n useImperativeHandle(apiRef, () => ({\n layout: (algorithm = 'force') => setRun({ algorithm }),\n fit: fitNow,\n live,\n worldAt: (clientX, clientY) => {\n const [x, y] = canvasRef.current?.clientToWorld(clientX, clientY) ?? [clientX, clientY];\n return { x, y };\n },\n visible: () => {\n const canvas = canvasRef.current;\n const r = canvas?.element?.getBoundingClientRect();\n if (canvas == null || r === undefined || r.width === 0 || r.height === 0) return null;\n const [x0, y0] = canvas.clientToWorld(r.left, r.top);\n const [x1, y1] = canvas.clientToWorld(r.right, r.bottom);\n return { x: x0, y: y0, width: x1 - x0, height: y1 - y0 };\n },\n rectOf: (id) => {\n const canvas = canvasRef.current;\n const world = worldRectOf(scene, id);\n const r = canvas?.element?.getBoundingClientRect();\n if (canvas == null || world === null || r === undefined) return null;\n const rect = viewRectToScreen(canvas.getView(), world);\n return { ...rect, x: rect.x + r.left, y: rect.y + r.top };\n },\n subscribeFrame: (fn) => canvasRef.current?.subscribeFrame(() => fn()) ?? (() => {}),\n }), [canvasRef, live, scene, setRun, fitNow]);\n}\n\n\n"]}