@vanduo-oss/vd3-flowchart 1.5.0 → 1.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +18 -0
- package/README.md +7 -2
- package/dist/index.cjs +283 -35
- package/dist/index.cjs.map +3 -3
- package/dist/index.js +283 -35
- package/dist/index.js.map +3 -3
- package/dist/meta.json +10 -10
- package/dist/vd3-flowchart.css +50 -4
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/index.js", "../src/vue.js", "../src/layout.js", "../src/mindmap.js", "../src/core.js"],
|
|
4
|
-
"sourcesContent": ["// Entry for @vanduo-oss/vd3-flowchart.\n//\n// The Vue 3 wrapper is the primary export; the framework-agnostic editor core\n// (1.2.0 lineage) is re-exported alongside as VdFlowchartCore. Named exports\n// only \u2014 no default.\n\nexport { VdFlowchart } from './vue.js';\nexport {\n VdFlowchart as VdFlowchartCore,\n computeLayout,\n LAYOUT_MODES,\n VD_FLOWCHART_VERSION,\n FLOWCHART_DOCUMENT_VERSION,\n FLOWCHART_NODE_TYPES,\n FLOWCHART_PORTS,\n FLOWCHART_EDGE_MARKERS,\n FLOWCHART_EDGE_ROUTES,\n FLOWCHART_KEYBOARD_SHORTCUTS,\n} from './core.js';\n", "/**\n * Vue 3 bindings for the flowchart component \u2014 the primary export surface.\n *\n * import { VdFlowchart } from '@vanduo-oss/vd3-flowchart';\n * <VdFlowchart :data=\"doc\" :readonly=\"false\" @change=\"onChange\" @ready=\"onReady\" />\n *\n * The core editor stays framework-agnostic in ./core.js. SSR-safe: the editor\n * is created on mount (client) into a plain container the server can\n * pre-render.\n */\nimport { defineComponent, h, ref, onMounted, onBeforeUnmount, watch } from 'vue';\nimport { VdFlowchart as VdFlowchartCore } from './core.js';\n\n// `ready` is forwarded from the core editor (fires post-layout) like the rest.\nconst FORWARDED_EVENTS = ['change', 'select', 'viewport', 'connect', 'ready'];\n// Props passed to the core on creation and through updateOptions() after.\nconst EDITOR_OPTION_KEYS = [\n 'readonly',\n 'gridSize',\n 'autoFit',\n 'history',\n 'historyLimit',\n 'keyboardShortcuts',\n 'snapGuides',\n 'minimap',\n 'autoLayout',\n 'minScale',\n 'maxScale',\n 'minNodeSize',\n 'maxNodeSize',\n];\n\nexport const VdFlowchart = defineComponent({\n name: 'VdFlowchart',\n props: {\n /** Flowchart document \u2014 `{ nodes, edges }`. */\n data: { type: Object, default: () => ({}) },\n /** Render as a non-editable viewer. */\n readonly: { type: Boolean, default: false },\n /** Background grid size in px. */\n gridSize: { type: Number, default: undefined },\n /** Keep the current selection across `data`-driven reloads when possible. */\n preserveSelection: { type: Boolean, default: false },\n /** Fit the view to content once the editor reports a measurable size. */\n autoFit: { type: Boolean, default: false },\n /** Enable the built-in undo/redo history (default true). */\n history: { type: Boolean, default: true },\n /** Maximum number of history entries to retain. */\n historyLimit: { type: Number, default: undefined },\n /** Keyboard model: 'mindmap' (Tab child, Enter sibling) or 'basic'. */\n keyboardShortcuts: { type: String, default: 'mindmap' },\n /** Snap dragged nodes to other nodes' edges and centres (default true). */\n snapGuides: { type: Boolean, default: true },\n /** Show the overview minimap in the canvas corner (default true). */\n minimap: { type: Boolean, default: true },\n /** Re-run the current layout after keyboard or handle insertions (default false). */\n autoLayout: { type: Boolean, default: false },\n /** Lowest camera scale. Defaults to 0.35. Set it together with maxScale. */\n minScale: { type: Number, default: undefined },\n /** Highest camera scale. Defaults to 3. Set it together with minScale. */\n maxScale: { type: Number, default: undefined },\n /** Smallest resizable-node side. Defaults to 56. Set it together with maxNodeSize. */\n minNodeSize: { type: Number, default: undefined },\n /** Largest resizable-node side. Defaults to 420. Set it together with minNodeSize. */\n maxNodeSize: { type: Number, default: undefined },\n },\n emits: ['change', 'select', 'viewport', 'connect', 'ready'],\n setup(props, { emit, expose }) {\n const el = ref(null);\n let instance = null;\n\n const editorOptions = () =>\n Object.fromEntries(\n EDITOR_OPTION_KEYS.flatMap((key) => {\n const value = props[key];\n if (\n (key === 'minScale' ||\n key === 'maxScale' ||\n key === 'minNodeSize' ||\n key === 'maxNodeSize') &&\n value == null\n ) {\n return [];\n }\n return [[key, value]];\n }),\n );\n\n const create = () => {\n instance = new VdFlowchartCore({\n element: el.value,\n data: props.data,\n ...editorOptions(),\n });\n FORWARDED_EVENTS.forEach((name) => {\n instance.on(name, (payload) => emit(name, payload));\n });\n };\n\n onMounted(() => {\n if (typeof window === 'undefined' || !el.value) return;\n create();\n });\n\n // External replacements are silent; feeding change.document back is safe.\n watch(\n () => props.data,\n (next) => {\n if (instance && typeof instance.load === 'function') {\n instance.load(next, { preserveSelection: props.preserveSelection, silent: true });\n }\n },\n { deep: true },\n );\n watch(\n () => EDITOR_OPTION_KEYS.map((key) => props[key]),\n () => {\n if (instance) instance.updateOptions(editorOptions());\n },\n );\n\n onBeforeUnmount(() => {\n if (instance) {\n instance.destroy();\n instance = null;\n }\n });\n\n expose({\n getInstance: () => instance,\n undo: () => instance?.undo(),\n redo: () => instance?.redo(),\n canUndo: () => Boolean(instance?.canUndo()),\n canRedo: () => Boolean(instance?.canRedo()),\n layout: (mode, options) => instance?.layout(mode, options),\n fitNode: (nodeId, padding) => instance?.fitNode(nodeId, padding),\n });\n\n return () => h('div', { ref: el, class: 'vd-flowchart' });\n },\n});\n", "// Pure, framework-free graph layout for the vd3-flowchart component.\n//\n// computeLayout(documentData, mode, options) -> Map<nodeId, { x, y }>\n//\n// Positions are top-left in world coordinates. The input is never mutated, so\n// the function is trivially unit-testable and reusable outside the editor. The\n// editor's `layout()` method applies the result in place.\n//\n// Modes:\n// 'tree' layered hierarchy from directed edges (from -> to), one axis per\n// depth level, siblings centered under their parent.\n// 'radial' root at the center, descendants on concentric rings (mind maps).\n// 'grid' edge-agnostic row/col snap of every node (autoArrange).\n\nconst DIRECTIONS = {\n right: { main: 'x', sign: 1 },\n left: { main: 'x', sign: -1 },\n down: { main: 'y', sign: 1 },\n up: { main: 'y', sign: -1 },\n};\n\nfunction num(value, fallback) {\n const next = Number(value);\n return Number.isFinite(next) ? next : fallback;\n}\n\nfunction buildGraph(nodes, edges) {\n const byId = new Map(nodes.map((node) => [node.id, node]));\n const children = new Map(nodes.map((node) => [node.id, []]));\n const indegree = new Map(nodes.map((node) => [node.id, 0]));\n edges.forEach((edge) => {\n const from = edge?.from?.nodeId;\n const to = edge?.to?.nodeId;\n if (from === to || !byId.has(from) || !byId.has(to)) return;\n children.get(from).push(to);\n indegree.set(to, indegree.get(to) + 1);\n });\n return { byId, children, indegree };\n}\n\nfunction pickRoots(nodes, indegree, optRoot) {\n if (optRoot && indegree.has(optRoot)) return [optRoot];\n const roots = nodes.filter((node) => indegree.get(node.id) === 0).map((node) => node.id);\n return roots.length ? roots : nodes.length ? [nodes[0].id] : [];\n}\n\n// Spanning forest (first visit wins) so a shared child or a cycle is placed\n// exactly once. Every node is reached: any node left unvisited after the real\n// roots becomes its own root. Returns DFS depth + per-node spanning children.\nfunction spanningForest(allIds, roots, children) {\n const visited = new Set();\n const depth = new Map();\n const tree = new Map();\n const forestRoots = [];\n\n const walk = (id, d) => {\n visited.add(id);\n depth.set(id, d);\n const kids = [];\n (children.get(id) || []).forEach((child) => {\n if (!visited.has(child)) {\n kids.push(child);\n walk(child, d + 1);\n }\n });\n tree.set(id, kids);\n };\n\n roots.forEach((root) => {\n if (!visited.has(root)) {\n forestRoots.push(root);\n walk(root, 0);\n }\n });\n allIds.forEach((id) => {\n if (!visited.has(id)) {\n forestRoots.push(id);\n walk(id, 0);\n }\n });\n\n return { depth, tree, forestRoots };\n}\n\nfunction treeCenters(forestRoots, tree, depth, sizeOf, options) {\n const dir = DIRECTIONS[options.direction] || DIRECTIONS.right;\n const levelGap = num(options.levelGap, 220);\n const siblingGap = num(options.siblingGap, 140);\n const crossOf = new Map();\n let cursor = 0;\n\n const place = (id) => {\n const kids = tree.get(id) || [];\n if (!kids.length) {\n crossOf.set(id, cursor);\n cursor += siblingGap;\n return crossOf.get(id);\n }\n const childCenters = kids.map(place);\n const center = (childCenters[0] + childCenters[childCenters.length - 1]) / 2;\n crossOf.set(id, center);\n return center;\n };\n forestRoots.forEach((root) => {\n place(root);\n cursor += siblingGap;\n });\n\n const centers = new Map();\n crossOf.forEach((cross, id) => {\n const main = (depth.get(id) || 0) * levelGap * dir.sign;\n centers.set(\n id,\n dir.main === 'x' ? { centerX: main, centerY: cross } : { centerX: cross, centerY: main },\n );\n });\n return centers;\n}\n\nfunction radialCenters(forestRoots, tree, depth, options) {\n const ringGap = num(options.radius, 220);\n const leaves = [];\n const collect = (id) => {\n const kids = tree.get(id) || [];\n if (!kids.length) leaves.push(id);\n else kids.forEach(collect);\n };\n forestRoots.forEach(collect);\n\n const total = Math.max(1, leaves.length);\n const leafAngle = new Map(leaves.map((id, index) => [id, ((index + 0.5) / total) * Math.PI * 2]));\n\n const angleOf = new Map();\n const resolveAngle = (id) => {\n const kids = tree.get(id) || [];\n if (!kids.length) {\n angleOf.set(id, leafAngle.get(id));\n return angleOf.get(id);\n }\n const childAngles = kids.map(resolveAngle);\n const mean = childAngles.reduce((sum, value) => sum + value, 0) / childAngles.length;\n angleOf.set(id, mean);\n return mean;\n };\n forestRoots.forEach(resolveAngle);\n\n const centers = new Map();\n angleOf.forEach((angle, id) => {\n const radius = (depth.get(id) || 0) * ringGap;\n centers.set(id, { centerX: Math.cos(angle) * radius, centerY: Math.sin(angle) * radius });\n });\n return centers;\n}\n\nfunction gridCenters(nodes, sizeOf, options) {\n const gap = num(options.gap, 48);\n const columns = Math.max(\n 1,\n Math.floor(num(options.columns, Math.ceil(Math.sqrt(nodes.length || 1)))),\n );\n let cellW = 0;\n let cellH = 0;\n nodes.forEach((node) => {\n const size = sizeOf(node.id);\n cellW = Math.max(cellW, size.width);\n cellH = Math.max(cellH, size.height);\n });\n cellW += gap;\n cellH += gap;\n\n const sorted = [...nodes].sort((a, b) => a.y - b.y || a.x - b.x);\n const centers = new Map();\n sorted.forEach((node, index) => {\n const col = index % columns;\n const row = Math.floor(index / columns);\n centers.set(node.id, { centerX: col * cellW, centerY: row * cellH });\n });\n return centers;\n}\n\nexport function computeLayout(documentData, mode = 'tree', options = {}) {\n const nodes = Array.isArray(documentData?.nodes) ? documentData.nodes : [];\n const edges = Array.isArray(documentData?.edges) ? documentData.edges : [];\n if (!nodes.length) return new Map();\n\n const { byId, children, indegree } = buildGraph(nodes, edges);\n const sizeOf = (id) => {\n const node = byId.get(id);\n return { width: num(node?.width, 160), height: num(node?.height, 96) };\n };\n const allIds = nodes.map((node) => node.id);\n\n let centers;\n let anchorId = nodes[0].id;\n if (mode === 'grid') {\n centers = gridCenters(nodes, sizeOf, options);\n } else {\n const rootOpt = options.root == null ? null : String(options.root).trim();\n const roots = pickRoots(nodes, indegree, rootOpt);\n anchorId = roots[0] || anchorId;\n const { depth, tree, forestRoots } = spanningForest(allIds, roots, children);\n centers =\n mode === 'radial'\n ? radialCenters(forestRoots, tree, depth, options)\n : treeCenters(forestRoots, tree, depth, sizeOf, options);\n }\n\n // Translate so the anchor node keeps its previous center \u2014 re-layout nudges\n // the structure into shape without teleporting the whole diagram.\n const anchorNode = byId.get(anchorId);\n const anchorCenter = centers.get(anchorId) || { centerX: 0, centerY: 0 };\n const dx = anchorNode ? anchorNode.x + anchorNode.width / 2 - anchorCenter.centerX : 0;\n const dy = anchorNode ? anchorNode.y + anchorNode.height / 2 - anchorCenter.centerY : 0;\n\n const result = new Map();\n centers.forEach((center, id) => {\n const size = sizeOf(id);\n result.set(id, {\n x: Math.round((center.centerX + dx - size.width / 2) * 100) / 100,\n y: Math.round((center.centerY + dy - size.height / 2) * 100) / 100,\n });\n });\n return result;\n}\n\nexport const LAYOUT_MODES = ['tree', 'radial', 'grid'];\n", "// Pure geometry for keyboard-driven mind-map editing: spatial navigation and\n// placement of new branch nodes. Inputs are never mutated.\n//\n// Directions are screen-space ('right' | 'left' | 'down' | 'up'), the same\n// vocabulary as addNode({ relativeTo: { direction } }).\n\nexport const DIRECTION_PORTS = { right: 'right', left: 'left', down: 'bottom', up: 'top' };\nexport const PORT_DIRECTIONS = { right: 'right', left: 'left', bottom: 'down', top: 'up' };\n\nconst OPPOSITE_DIRECTIONS = { right: 'left', left: 'right', down: 'up', up: 'down' };\nconst DIRECTION_VECTORS = {\n right: { x: 1, y: 0 },\n left: { x: -1, y: 0 },\n down: { x: 0, y: 1 },\n up: { x: 0, y: -1 },\n};\n\nexport const BRANCH_GAP = 72;\nexport const SIBLING_GAP = 24;\nconst COLLISION_GAP = 12;\nconst COLLISION_STEP = 12;\nconst MAX_COLLISION_STEPS = 400;\nconst BRANCH_RING_STEP = 48;\nconst MAX_BRANCH_RINGS = 8;\n// Half-angle of the preferred navigation cone (60 degrees).\nconst NAVIGATION_CONE = Math.tan(Math.PI / 3);\n\nfunction centerOf(node) {\n return { x: node.x + node.width / 2, y: node.y + node.height / 2 };\n}\n\nexport function oppositeDirection(direction) {\n return OPPOSITE_DIRECTIONS[direction] || 'left';\n}\n\n/** Dominant screen direction from one node's centre to another's. */\nexport function directionBetween(from, to) {\n const a = centerOf(from);\n const b = centerOf(to);\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n if (Math.abs(dx) >= Math.abs(dy)) return dx >= 0 ? 'right' : 'left';\n return dy >= 0 ? 'down' : 'up';\n}\n\n/**\n * Nearest node in `direction` from `fromNode`. Candidates are scored by their\n * distance along the direction plus twice their perpendicular offset; nodes\n * inside a 60-degree half-cone win over the rest of the half-plane.\n */\nexport function findSpatialNeighbor(nodes, fromNode, direction) {\n const vector = DIRECTION_VECTORS[direction];\n if (!vector || !fromNode) return null;\n const origin = centerOf(fromNode);\n let bestCone = null;\n let bestPlane = null;\n nodes.forEach((node) => {\n if (node.id === fromNode.id) return;\n const center = centerOf(node);\n const dx = center.x - origin.x;\n const dy = center.y - origin.y;\n const along = dx * vector.x + dy * vector.y;\n if (along <= 0) return;\n const across = Math.abs(dx * vector.y - dy * vector.x);\n const score = along + across * 2;\n if (across <= along * NAVIGATION_CONE && (!bestCone || score < bestCone.score)) {\n bestCone = { node, score };\n }\n if (!bestPlane || score < bestPlane.score) bestPlane = { node, score };\n });\n return (bestCone || bestPlane)?.node ?? null;\n}\n\n/** Node whose centre is closest to `point`. */\nexport function findNearestNode(nodes, point) {\n let best = null;\n nodes.forEach((node) => {\n const center = centerOf(node);\n const distance = Math.hypot(center.x - point.x, center.y - point.y);\n if (!best || distance < best.distance) best = { node, distance };\n });\n return best?.node ?? null;\n}\n\nfunction overlapsAny(rect, nodes) {\n return nodes.some(\n (node) =>\n rect.x < node.x + node.width + COLLISION_GAP &&\n rect.x + rect.width + COLLISION_GAP > node.x &&\n rect.y < node.y + node.height + COLLISION_GAP &&\n rect.y + rect.height + COLLISION_GAP > node.y,\n );\n}\n\n/**\n * Top-left position for a new node of `size` on the `direction` side of\n * `parent`. With `anchor` (a sibling) the node goes right after it \u2014 or right\n * before it when `before` is set; otherwise it goes after the last sibling on\n * that side, or level with the parent when there is none, then moves to the\n * nearest spot that overlaps nothing in `nodes`.\n */\nexport function placeBranchNode({\n nodes,\n parent,\n siblings = [],\n direction,\n size,\n anchor = null,\n before = false,\n}) {\n const horizontal = direction === 'right' || direction === 'left';\n const cross = horizontal ? 'y' : 'x';\n const crossSize = horizontal ? 'height' : 'width';\n const lastSibling = siblings.reduce(\n (last, node) =>\n !last || node[cross] + node[crossSize] > last[cross] + last[crossSize] ? node : last,\n null,\n );\n const reference = anchor || lastSibling;\n\n const rect = { x: 0, y: 0, width: size.width, height: size.height };\n if (reference) {\n if (direction === 'right') rect.x = reference.x;\n if (direction === 'left') rect.x = reference.x + reference.width - size.width;\n if (direction === 'down') rect.y = reference.y;\n if (direction === 'up') rect.y = reference.y + reference.height - size.height;\n rect[cross] = before\n ? reference[cross] - SIBLING_GAP - size[crossSize]\n : reference[cross] + reference[crossSize] + SIBLING_GAP;\n } else {\n if (direction === 'right') rect.x = parent.x + parent.width + BRANCH_GAP;\n if (direction === 'left') rect.x = parent.x - BRANCH_GAP - size.width;\n if (direction === 'down') rect.y = parent.y + parent.height + BRANCH_GAP;\n if (direction === 'up') rect.y = parent.y - BRANCH_GAP - size.height;\n rect[cross] = parent[cross] + parent[crossSize] / 2 - size[crossSize] / 2;\n }\n\n // A sibling keeps its order by sliding one way only; a first child may go\n // either way from level with its parent.\n const crossSign = reference ? (before ? -1 : 1) : 0;\n const result = nearestFreeSlot(\n rect,\n nodes,\n cross,\n horizontal ? 'x' : 'y',\n DIRECTION_VECTORS[direction],\n crossSign,\n );\n return { x: Math.round(result.x * 100) / 100, y: Math.round(result.y * 100) / 100 };\n}\n\nfunction crossOffsetAt(index, crossSign) {\n if (crossSign) return crossSign * COLLISION_STEP * index;\n return COLLISION_STEP * Math.ceil(index / 2) * (index % 2 ? 1 : -1);\n}\n\n// Free spot closest to the ideal position: slide along the sibling axis and,\n// when that column is crowded, step further out along the branch.\nfunction nearestFreeSlot(rect, nodes, cross, main, vector, crossSign) {\n const origin = { ...rect };\n const outward = vector.x + vector.y;\n let best = null;\n for (let ring = 0; ring <= MAX_BRANCH_RINGS; ring += 1) {\n const mainOffset = ring * BRANCH_RING_STEP;\n if (best && mainOffset >= best.cost) break;\n const candidate = { ...origin, [main]: origin[main] + outward * mainOffset };\n for (let index = 0; index <= MAX_COLLISION_STEPS; index += 1) {\n const crossOffset = crossOffsetAt(index, crossSign);\n const cost = Math.hypot(mainOffset, crossOffset);\n if (best && cost >= best.cost) break;\n candidate[cross] = origin[cross] + crossOffset;\n if (!overlapsAny(candidate, nodes)) {\n best = { rect: { ...candidate }, cost };\n break;\n }\n }\n }\n return best ? best.rect : origin;\n}\n", "/* global queueMicrotask */\nimport { computeLayout, LAYOUT_MODES } from './layout.js';\nimport {\n DIRECTION_PORTS,\n PORT_DIRECTIONS,\n findNearestNode,\n findSpatialNeighbor,\n oppositeDirection,\n placeBranchNode,\n} from './mindmap.js';\n\n// Re-export the pure layout helper so consumers can compute positions without\n// an editor instance.\nexport { computeLayout, LAYOUT_MODES } from './layout.js';\n\nconst SVG_NS = 'http://www.w3.org/2000/svg';\n\n// Phosphor regular paths (MIT) \u2014 inlined like draw so the component stays\n// self-contained. viewBox 0 0 256 256, fill currentColor.\nconst TOOLBAR_ICON_PATHS = {\n 'zoom-out':\n 'M229.66,218.34l-50.07-50.06a88.11,88.11,0,1,0-11.31,11.31l50.06,50.07a8,8,0,0,0,11.32-11.32ZM40,112a72,72,0,1,1,72,72A72.08,72.08,0,0,1,40,112Zm112-8H88a8,8,0,0,0,0,16h64a8,8,0,0,0,0-16Z',\n 'zoom-in':\n 'M229.66,218.34l-50.07-50.06a88.11,88.11,0,1,0-11.31,11.31l50.06,50.07a8,8,0,0,0,11.32-11.32ZM40,112a72,72,0,1,1,72,72A72.08,72.08,0,0,1,40,112Zm112,24H128v24a8,8,0,0,1-16,0V136H88a8,8,0,0,1,0-16h24V96a8,8,0,0,1,16,0v24h24a8,8,0,0,1,0,16Z',\n 'reset-view':\n 'M240,56v48a8,8,0,0,1-8,8H184a8,8,0,0,1,0-16h28.69L187.31,70.63A80,80,0,1,0,208,128a8,8,0,0,1,16,0,96,96,0,1,1-27.22-66.91L224,85.8V56a8,8,0,0,1,16,0Z',\n 'fit-view':\n 'M216,48V88a8,8,0,0,1-16,0V67.31l-42.34,42.35a8,8,0,0,1-11.32-11.32L188.69,56H168a8,8,0,0,1,0-16h40A8,8,0,0,1,216,48ZM98.34,146.34,56,188.69V168a8,8,0,0,0-16,0v40a8,8,0,0,0,8,8H88a8,8,0,0,0,0-16H67.31l42.35-42.34a8,8,0,0,0-11.32-11.32Zm11.32-36.68L67.31,56H88a8,8,0,0,0,0-16H48a8,8,0,0,0-8,8V88a8,8,0,0,0,16,0V67.31l42.34,42.35a8,8,0,0,0,11.32-11.32ZM208,160a8,8,0,0,0-8,8v20.69l-42.34-42.35a8,8,0,0,0-11.32,11.32L188.69,200H168a8,8,0,0,0,0,16h40a8,8,0,0,0,8-8V168A8,8,0,0,0,208,160Z',\n undo: 'M224,128a96,96,0,0,1-94.71,96H128A95.38,95.38,0,0,1,62.1,197.8a8,8,0,0,1,11-11.63A80,80,0,1,0,71.43,71.39a3.07,3.07,0,0,1-.26.25L44.59,96H72a8,8,0,0,1,0,16H24a8,8,0,0,1-8-8V56a8,8,0,0,1,16,0V85.8L60.25,60A96,96,0,0,1,224,128Z',\n redo: 'M240,56v48a8,8,0,0,1-8,8H184a8,8,0,0,1,0-16H211.4L184.81,71.64l-.25-.24a80,80,0,1,0-1.67,114.78,8,8,0,0,1,11,11.63A95.44,95.44,0,0,1,128,224h-1.32A96,96,0,1,1,195.75,60L224,85.8V56a8,8,0,1,1,16,0Z',\n minimap:\n 'M228.92,49.69a8,8,0,0,0-6.86-1.45L160.93,63.52,99.58,32.84a8,8,0,0,0-5.52-.6l-64,16A8,8,0,0,0,24,56V200a8,8,0,0,0,9.94,7.76l61.13-15.28,61.35,30.68A8.15,8.15,0,0,0,160,224a8,8,0,0,0,1.94-.24l64-16A8,8,0,0,0,232,200V56A8,8,0,0,0,228.92,49.69ZM104,52.94l48,24V203.06l-48-24ZM40,62.25l48-12v127.5l-48,12Zm176,131.5-48,12V78.25l48-12Z',\n clear:\n 'M216,48H176V40a24,24,0,0,0-24-24H104A24,24,0,0,0,80,40v8H40a8,8,0,0,0,0,16h8V208a16,16,0,0,0,16,16H192a16,16,0,0,0,16-16V64h8a8,8,0,0,0,0-16ZM96,40a8,8,0,0,1,8-8h48a8,8,0,0,1,8,8v8H96Zm96,168H64V64H192ZM112,104v64a8,8,0,0,1-16,0V104a8,8,0,0,1,16,0Zm48,0v64a8,8,0,0,1-16,0V104a8,8,0,0,1,16,0Z',\n};\n\nconst TOOLBAR_ACTIONS = [\n { action: 'zoom-out', label: 'Zoom out', icon: 'zoom-out' },\n { action: 'zoom-in', label: 'Zoom in', icon: 'zoom-in' },\n { action: 'reset-view', label: 'Reset view', icon: 'reset-view' },\n { action: 'fit-view', label: 'Fit view', icon: 'fit-view' },\n { action: 'undo', label: 'Undo', icon: 'undo' },\n { action: 'redo', label: 'Redo', icon: 'redo' },\n];\n\nconst LAYOUT_OPTIONS = [\n { value: 'tree', label: 'Tree' },\n { value: 'radial', label: 'Radial' },\n { value: 'grid', label: 'Grid' },\n];\n\nfunction createToolbarIcon(name) {\n const svg = svgEl('svg', {\n class: 'vd-flowchart-icon',\n viewBox: '0 0 256 256',\n 'aria-hidden': 'true',\n focusable: 'false',\n });\n svg.setAttribute('fill', 'currentColor');\n svg.appendChild(svgEl('path', { d: TOOLBAR_ICON_PATHS[name] || '' }));\n return svg;\n}\n\nfunction createToolbarButton({ action, label, icon, disabled = false }) {\n const button = createElement('button', {\n className: 'vd-flowchart-btn vd-flowchart-icon-btn',\n title: label,\n disabled,\n });\n button.setAttribute('type', 'button');\n button.setAttribute('data-flowchart-action', action);\n button.setAttribute('aria-label', label);\n button.appendChild(createToolbarIcon(icon));\n return button;\n}\nconst DEFAULT_GRID_SIZE = 24;\nconst DEFAULT_MIN_SCALE = 0.35;\nconst DEFAULT_MAX_SCALE = 3;\nconst DEFAULT_MIN_NODE_SIZE = 56;\nconst DEFAULT_MAX_NODE_SIZE = 420;\nconst DEFAULT_WORLD_EXTENT = 12000;\nconst WIDE_WORLD_EXTENT = 240000;\n// Bounded deserialization caps. An untrusted or corrupt document (e.g. a shared\n// link with millions of nodes/edges) is TRUNCATED \u2014 never thrown \u2014 inside\n// normalizeDocument, so `load()` cannot be turned into a client-side DoS: the\n// O(n) normalization and the resulting render stay bounded. A normal diagram is\n// far below these limits and is unaffected.\nexport const MAX_NODES = 10000;\nexport const MAX_EDGES = 10000;\nconst RESIZE_HANDLES = ['n', 'ne', 'e', 'se', 's', 'sw', 'w', 'nw'];\nconst DEFAULT_EDGE_STROKE_WIDTH = 2.25;\nconst MIN_EDGE_STROKE_WIDTH = 1.25;\nconst MAX_EDGE_STROKE_WIDTH = 6;\nconst CONNECTION_PORT_RADIUS = 6;\n// The handle sits outside the boundary; a hit radius slightly larger than the\n// offset overlaps the node edge so the pointer can slide from node to handle\n// without losing hover.\nconst PORT_HANDLE_OFFSET = 12;\nconst CONNECTION_PORT_HIT_RADIUS = 14;\nconst PORT_CLICK_SLOP = 4;\nconst RESIZE_HANDLE_SIZE = 9;\nconst SELECTION_OUTSET = 4;\nconst GUIDE_SNAP_DISTANCE = 6;\nconst GUIDE_OVERHANG = 12;\n// Beyond the connection handle (12px out, 14px hit radius) so both stay usable.\nconst COLLAPSE_TOGGLE_OFFSET = 36;\nconst MINIMAP_WIDTH = 180;\nconst MINIMAP_HEIGHT = 120;\nconst MINIMAP_MIN_CANVAS_WIDTH = 480;\n// Shapes whose outline does not reach the corners of their bounds get a dashed\n// selection box so the corner resize handles have something to sit on.\nconst SELECTION_BOX_TYPES = new Set(['circle', 'diamond', 'label']);\nconst RECONNECT_ENDPOINT_RADIUS = 7;\nconst RECONNECT_ENDPOINT_HIT_RADIUS = 12;\nconst EDGE_HIT_STROKE_MIN = 16;\nconst CONNECTION_SNAP_PADDING = 36;\nconst CONNECTION_HYSTERESIS = 16;\nconst CONNECTION_CENTER_LOCK_RADIUS = 18;\nconst RESIZE_PORT_GAP = 28;\n\nconst EDGE_STROKE_PRESETS = [\n { id: 'thin', label: 'Thin', width: 1.75 },\n { id: 'medium', label: 'Medium', width: DEFAULT_EDGE_STROKE_WIDTH },\n { id: 'bold', label: 'Bold', width: 3.5 },\n];\n\nexport const VD_FLOWCHART_VERSION = '1.5.0';\n/** Serialized schema version; change only when the document format changes. */\nexport const FLOWCHART_DOCUMENT_VERSION = '1.3.0';\nexport const FLOWCHART_NODE_TYPES = [\n 'rounded-rect',\n 'rect',\n 'diamond',\n 'circle',\n 'textbox',\n 'label',\n 'junction',\n];\nexport const FLOWCHART_PORTS = ['top', 'right', 'bottom', 'left'];\nexport const FLOWCHART_EDGE_MARKERS = ['none', 'arrow', 'dot'];\nexport const FLOWCHART_EDGE_ROUTES = ['curve', 'straight', 'orthogonal'];\nexport const FLOWCHART_KEYBOARD_SHORTCUTS = ['mindmap', 'basic'];\n\nfunction normalizeKeyboardShortcuts(value) {\n return value === 'basic' ? 'basic' : 'mindmap';\n}\n\nconst ARROW_DIRECTIONS = {\n ArrowRight: 'right',\n ArrowLeft: 'left',\n ArrowDown: 'down',\n ArrowUp: 'up',\n};\n\nfunction getShortcutRows(mode, readonly) {\n const navigation = [\n ['Arrow keys', 'Select the nearest node in that direction'],\n ['Shift + Arrow', 'Select a connection on that side (repeat to cycle)'],\n ['Shift + click, Shift + drag', 'Add nodes to the selection, or select with a box'],\n ['Cmd/Ctrl + A', 'Select all nodes'],\n ];\n const view = [\n ['Cmd/Ctrl + = or -', 'Zoom in or out'],\n ['Cmd/Ctrl + 0', 'Zoom to 100%'],\n ['Shift + 1', 'Fit the diagram to the view'],\n ];\n const help = [['?', 'Show or hide this list']];\n if (readonly) {\n return [...navigation, ...view, ...help, ['Tab', 'Leave the canvas']];\n }\n const mindmap =\n mode === 'mindmap'\n ? [\n ['Tab', 'Add a child node'],\n ['Enter', 'Add a sibling below (Shift + Enter: above)'],\n ['F2, Space, or type', 'Edit the label'],\n ['Enter while editing', 'Save the label (Shift + Enter: new line)'],\n ['Tab while editing', 'Save and add a child'],\n ]\n : [\n ['Enter or F2', 'Edit the label'],\n ['Cmd/Ctrl + Enter', 'Save the label'],\n ];\n return [\n ...navigation,\n ...mindmap,\n [\n mode === 'mindmap' ? 'Enter, F2, or type on a connection' : 'Enter or F2 on a connection',\n 'Edit the connection label',\n ],\n ['Cmd/Ctrl + /', 'Collapse or expand the branch'],\n ['Alt + Arrow', 'Nudge the node (add Shift for 1 px)'],\n ['Delete or Backspace', 'Delete the selection'],\n ['Cmd/Ctrl + D', 'Duplicate the node'],\n ['Cmd/Ctrl + Z, Shift + Cmd/Ctrl + Z', 'Undo, redo'],\n ['Cmd/Ctrl + C, X, V', 'Copy, cut, paste'],\n ...view,\n ['Esc', 'Cancel editing, then the tool, then deselect'],\n [\n mode === 'mindmap' ? 'Shift + Tab, or Esc then Tab' : 'Tab or Shift + Tab',\n 'Leave the canvas',\n ],\n ...help,\n ];\n}\n\n// History entries for these reasons collapse into the previous entry when they\n// target the same node/edge, so a burst of inspector keystrokes (one\n// `node:update` each) is a single undo step. Discrete gestures are excluded.\nconst COALESCING_REASONS = new Set(['node:update', 'edge:update', 'node:nudge']);\n\nconst DEFAULT_EDGE_ROUTE = 'curve';\nconst ORTHOGONAL_STUB_LENGTH = 32;\nconst ORTHOGONAL_CORNER_RADIUS = 12;\nconst ORTHOGONAL_CLEARANCE = 16;\n// Fraction of the endpoint distance used for each cubic control arm, plus the\n// clamp that keeps very short edges graceful and very long ones from ballooning.\nconst EDGE_CURVATURE = 0.5;\nconst MIN_CURVE_ARM = 22;\nconst MAX_CURVE_ARM = 260;\nconst FLOWCHART_EDGE_ROUTE_LABELS = {\n curve: 'Curve',\n straight: 'Straight',\n orthogonal: 'Stepped orthogonal',\n};\n\nconst DEFAULT_NODE_SPECS = {\n 'rounded-rect': { width: 180, height: 96, text: 'Step' },\n rect: { width: 180, height: 96, text: 'Process' },\n diamond: { width: 184, height: 120, text: 'Decision' },\n circle: { width: 128, height: 128, text: 'Start' },\n textbox: { width: 240, height: 144, text: 'Notes' },\n label: { width: 180, height: 72, text: 'Label' },\n junction: {\n width: 28,\n height: 28,\n text: '',\n minWidth: 28,\n minHeight: 28,\n maxWidth: 28,\n maxHeight: 28,\n resizable: false,\n textEditable: false,\n },\n};\n\nconst FLOWCHART_PALETTE_ITEMS = [\n { kind: 'tool', tool: 'arrow', label: 'Arrow' },\n { kind: 'node', type: 'rounded-rect', label: 'Rounded' },\n { kind: 'node', type: 'rect', label: 'Rect' },\n { kind: 'node', type: 'diamond', label: 'Diamond' },\n { kind: 'node', type: 'circle', label: 'Circle' },\n { kind: 'node', type: 'junction', label: 'Junction' },\n { kind: 'node', type: 'textbox', label: 'Textbox' },\n { kind: 'node', type: 'label', label: 'Label' },\n];\n\nlet flowchartId = 0;\n\nfunction nextId(prefix) {\n flowchartId += 1;\n return `${prefix}-${flowchartId}`;\n}\n\nfunction hasWindow() {\n return typeof window !== 'undefined' && typeof document !== 'undefined';\n}\n\nfunction isElement(value) {\n return hasWindow() && value instanceof Element;\n}\n\nfunction isPlainObject(value) {\n return Boolean(value) && Object.prototype.toString.call(value) === '[object Object]';\n}\n\nfunction clamp(value, min, max) {\n return Math.min(max, Math.max(min, value));\n}\n\nfunction toFiniteNumber(value, fallback) {\n const next = Number(value);\n return Number.isFinite(next) ? next : fallback;\n}\n\nfunction deepClone(value) {\n return JSON.parse(JSON.stringify(value));\n}\n\nfunction formatNumber(value) {\n return Number(value.toFixed(2));\n}\n\nfunction formatScale(value) {\n return Number(toFiniteNumber(value, 1).toFixed(4));\n}\n\nfunction normalizeBoundPair(min, max, fallbackMin, fallbackMax) {\n const low = Number(min);\n const high = Number(max);\n if (!Number.isFinite(low) || !Number.isFinite(high) || low <= 0 || high <= 0 || low >= high) {\n return { min: fallbackMin, max: fallbackMax };\n }\n return { min: low, max: high };\n}\n\nfunction sanitizeId(value) {\n if (value == null) return '';\n return String(value).trim();\n}\n\nfunction resolveElement(target) {\n if (!hasWindow()) {\n throw new Error('Vanduo Flowchart requires a browser DOM target.');\n }\n if (typeof target === 'string') {\n const el = document.querySelector(target);\n if (!el) throw new Error(`Flowchart target not found: ${target}`);\n return el;\n }\n if (isElement(target)) return target;\n throw new Error('Flowchart target must be an Element or selector string.');\n}\n\nfunction createElement(tagName, options = {}) {\n const element = document.createElement(tagName);\n if (options.className) element.className = options.className;\n if (options.text != null) element.textContent = String(options.text);\n if (options.type) element.type = options.type;\n if (options.value != null) element.value = String(options.value);\n if (options.placeholder != null) element.placeholder = String(options.placeholder);\n if (options.title != null) element.title = String(options.title);\n if (options.rows != null) element.rows = Number(options.rows);\n if (options.disabled) element.disabled = true;\n if (options.tabIndex != null) element.tabIndex = Number(options.tabIndex);\n return element;\n}\n\nfunction svgEl(name, attrs = {}) {\n const element = document.createElementNS(SVG_NS, name);\n Object.entries(attrs).forEach(([key, value]) => {\n if (value != null) {\n element.setAttribute(key, String(value));\n }\n });\n return element;\n}\n\nfunction clearChildren(element) {\n while (element.firstChild) {\n element.removeChild(element.firstChild);\n }\n}\n\nfunction ensureUniqueId(preferred, prefix, usedIds) {\n let candidate = sanitizeId(preferred) || nextId(prefix);\n while (usedIds.has(candidate)) {\n candidate = nextId(prefix);\n }\n usedIds.add(candidate);\n return candidate;\n}\n\nfunction normalizeNodeType(type) {\n return FLOWCHART_NODE_TYPES.includes(type) ? type : 'rounded-rect';\n}\n\nfunction getNodeSpec(type) {\n return DEFAULT_NODE_SPECS[normalizeNodeType(type)];\n}\n\nfunction nodeVisualScale(node) {\n if (!node || node.type === 'junction') return 1;\n const spec = getNodeSpec(node.type);\n const width = spec.width > 0 ? toFiniteNumber(node.width, spec.width) / spec.width : 1;\n const height = spec.height > 0 ? toFiniteNumber(node.height, spec.height) / spec.height : 1;\n return clamp(Math.min(1, width, height), 0.01, 1);\n}\n\nfunction edgeVisualScale(fromNode, toNode) {\n if (fromNode && toNode) return Math.min(nodeVisualScale(fromNode), nodeVisualScale(toNode));\n if (fromNode) return nodeVisualScale(fromNode);\n if (toNode) return nodeVisualScale(toNode);\n return 1;\n}\n\nfunction getNodeSizeBounds(type, sizeBounds) {\n const spec = getNodeSpec(type);\n const min = sizeBounds?.min ?? DEFAULT_MIN_NODE_SIZE;\n const max = sizeBounds?.max ?? DEFAULT_MAX_NODE_SIZE;\n return {\n minWidth: spec.minWidth ?? min,\n minHeight: spec.minHeight ?? min,\n maxWidth: spec.maxWidth ?? max,\n maxHeight: spec.maxHeight ?? max,\n };\n}\n\nfunction clampNodeWidth(type, width, fallback, sizeBounds) {\n const bounds = getNodeSizeBounds(type, sizeBounds);\n return clamp(toFiniteNumber(width, fallback), bounds.minWidth, bounds.maxWidth);\n}\n\nfunction clampNodeHeight(type, height, fallback, sizeBounds) {\n const bounds = getNodeSizeBounds(type, sizeBounds);\n return clamp(toFiniteNumber(height, fallback), bounds.minHeight, bounds.maxHeight);\n}\n\nfunction isNodeResizable(nodeOrType) {\n const spec =\n typeof nodeOrType === 'string' ? getNodeSpec(nodeOrType) : getNodeSpec(nodeOrType?.type);\n return spec.resizable !== false;\n}\n\nfunction isNodeTextEditable(nodeOrType) {\n const spec =\n typeof nodeOrType === 'string' ? getNodeSpec(nodeOrType) : getNodeSpec(nodeOrType?.type);\n return spec.textEditable !== false;\n}\n\nfunction normalizeEdgeStrokeWidth(value) {\n const next = Number(value);\n if (!Number.isFinite(next)) return DEFAULT_EDGE_STROKE_WIDTH;\n return formatNumber(clamp(next, MIN_EDGE_STROKE_WIDTH, MAX_EDGE_STROKE_WIDTH));\n}\n\nfunction getStrokePresetId(strokeWidth) {\n const match = EDGE_STROKE_PRESETS.find((preset) => Math.abs(preset.width - strokeWidth) < 0.01);\n return match?.id || 'medium';\n}\n\nfunction getStrokePresetWidth(presetId) {\n const preset = EDGE_STROKE_PRESETS.find((item) => item.id === presetId);\n return preset?.width ?? DEFAULT_EDGE_STROKE_WIDTH;\n}\n\nfunction normalizeViewport(viewport, scaleBounds) {\n const min = scaleBounds?.min ?? DEFAULT_MIN_SCALE;\n const max = scaleBounds?.max ?? DEFAULT_MAX_SCALE;\n return {\n x: toFiniteNumber(viewport?.x, 0),\n y: toFiniteNumber(viewport?.y, 0),\n scale: clamp(formatScale(toFiniteNumber(viewport?.scale, 1)), min, max),\n };\n}\n\nfunction normalizeNode(rawNode, index, usedIds, sizeBounds) {\n const type = normalizeNodeType(rawNode?.type);\n const spec = getNodeSpec(type);\n\n const node = {\n id: ensureUniqueId(rawNode?.id, 'node', usedIds),\n type,\n x: toFiniteNumber(rawNode?.x, index * 28),\n y: toFiniteNumber(rawNode?.y, index * 18),\n width: clampNodeWidth(type, rawNode?.width, spec.width, sizeBounds),\n height: clampNodeHeight(type, rawNode?.height, spec.height, sizeBounds),\n text: rawNode?.text == null ? spec.text : String(rawNode.text),\n data: isPlainObject(rawNode?.data) ? deepClone(rawNode.data) : {},\n };\n // Written only when true so expanded nodes serialize as in format 1.2.0.\n if (rawNode?.collapsed === true) node.collapsed = true;\n return node;\n}\n\n// Nodes hidden by collapsed branches. Every descendant of a collapsed node is\n// a candidate (the collapsed node itself is not, so a loop back to it cannot\n// hide it); a candidate stays visible when it is also reachable through an\n// expanded node outside the candidates. Linear in nodes plus edges.\nfunction computeHiddenNodeIds(nodes, edges) {\n const collapsed = new Set(nodes.filter((node) => node.collapsed).map((node) => node.id));\n if (!collapsed.size) return new Set();\n const outgoing = new Map(nodes.map((node) => [node.id, []]));\n edges.forEach((edge) => {\n if (edge.from.nodeId === edge.to.nodeId) return;\n outgoing.get(edge.from.nodeId)?.push(edge.to.nodeId);\n });\n\n const candidates = new Set();\n collapsed.forEach((rootId) => {\n const queue = [...(outgoing.get(rootId) || [])];\n for (let index = 0; index < queue.length; index += 1) {\n const id = queue[index];\n if (id === rootId || candidates.has(id)) continue;\n candidates.add(id);\n queue.push(...(outgoing.get(id) || []));\n }\n });\n\n const queue = nodes\n .filter((node) => !candidates.has(node.id) && !collapsed.has(node.id))\n .map((node) => node.id);\n for (let index = 0; index < queue.length; index += 1) {\n const id = queue[index];\n (outgoing.get(id) || []).forEach((childId) => {\n if (!candidates.has(childId)) return;\n candidates.delete(childId);\n if (!collapsed.has(childId)) queue.push(childId);\n });\n }\n return candidates;\n}\n\nfunction normalizeEndpoint(rawEndpoint, fallbackPort) {\n return {\n nodeId: sanitizeId(rawEndpoint?.nodeId),\n port: FLOWCHART_PORTS.includes(rawEndpoint?.port) ? rawEndpoint.port : fallbackPort,\n };\n}\n\nfunction normalizeEdgeMarker(value) {\n return FLOWCHART_EDGE_MARKERS.includes(value) ? value : null;\n}\n\nfunction normalizeEdgeRoute(value) {\n return FLOWCHART_EDGE_ROUTES.includes(value) ? value : DEFAULT_EDGE_ROUTE;\n}\n\nfunction syncEdgeKind(edge) {\n edge.kind = edge.startMarker === 'none' && edge.endMarker === 'none' ? 'line' : 'arrow';\n}\n\nfunction normalizeEdge(rawEdge, index, nodeIds, usedIds) {\n const from = normalizeEndpoint(rawEdge?.from, 'right');\n const to = normalizeEndpoint(rawEdge?.to, 'left');\n if (!from.nodeId || !to.nodeId) return null;\n if (!nodeIds.has(from.nodeId) || !nodeIds.has(to.nodeId)) return null;\n if (!FLOWCHART_PORTS.includes(from.port) || !FLOWCHART_PORTS.includes(to.port)) return null;\n\n const legacyKind = rawEdge?.kind === 'line' ? 'line' : 'arrow';\n const startMarker =\n normalizeEdgeMarker(rawEdge?.startMarker) ?? (legacyKind === 'line' ? 'none' : 'none');\n const endMarker =\n normalizeEdgeMarker(rawEdge?.endMarker) ?? (legacyKind === 'line' ? 'none' : 'arrow');\n\n const edge = {\n id: ensureUniqueId(rawEdge?.id, 'edge', usedIds),\n from,\n to,\n kind: legacyKind,\n startMarker,\n endMarker,\n strokeWidth: normalizeEdgeStrokeWidth(rawEdge?.strokeWidth),\n route: normalizeEdgeRoute(rawEdge?.route),\n label: rawEdge?.label == null ? '' : String(rawEdge.label),\n data: isPlainObject(rawEdge?.data) ? deepClone(rawEdge.data) : {},\n };\n syncEdgeKind(edge);\n return edge;\n}\n\nfunction parseDocumentVersion(value) {\n const raw =\n typeof value === 'number' && Number.isFinite(value)\n ? String(value)\n : typeof value === 'string'\n ? value.trim()\n : '';\n const match = /^(\\d+)(?:\\.(\\d+))?(?:\\.(\\d+))?$/.exec(raw);\n if (!match) return null;\n return {\n major: Number(match[1]),\n minor: Number(match[2] ?? 0),\n patch: Number(match[3] ?? 0),\n };\n}\n\nfunction isSupportedDocumentVersion(value) {\n const parsed = parseDocumentVersion(value);\n const max = parseDocumentVersion(FLOWCHART_DOCUMENT_VERSION);\n if (!parsed || !max || parsed.major !== max.major) return false;\n if (parsed.minor > max.minor) return false;\n if (parsed.minor === max.minor && parsed.patch > max.patch) return false;\n return true;\n}\n\nfunction normalizeDocument(input, limits = {}) {\n let source = input;\n if (typeof source === 'string') {\n try {\n source = JSON.parse(source);\n } catch {\n throw new TypeError('Invalid flowchart JSON. The current document was not changed.');\n }\n }\n\n if (!isPlainObject(source)) {\n throw new TypeError('A flowchart document must be an object.');\n }\n if (source.version !== undefined && !isSupportedDocumentVersion(source.version)) {\n throw new RangeError(\n `Unsupported flowchart document version: ${String(source.version)}. Supported through ${FLOWCHART_DOCUMENT_VERSION}.`,\n );\n }\n for (const key of ['nodes', 'edges']) {\n if (source[key] !== undefined && !Array.isArray(source[key])) {\n throw new TypeError(`Flowchart ${key} must be an array.`);\n }\n }\n\n const usedNodeIds = new Set();\n // Bounded deserialization: truncate an untrusted document to MAX_NODES /\n // MAX_EDGES so a hostile doc loads bounded instead of freezing the tab.\n const nodes = (Array.isArray(source.nodes) ? source.nodes : [])\n .slice(0, MAX_NODES)\n .map((node, index) => normalizeNode(node, index, usedNodeIds, limits.sizeBounds));\n const nodeIds = new Set(nodes.map((node) => node.id));\n const usedEdgeIds = new Set();\n const edges = (Array.isArray(source.edges) ? source.edges : [])\n .slice(0, MAX_EDGES)\n .map((edge, index) => normalizeEdge(edge, index, nodeIds, usedEdgeIds))\n .filter(Boolean);\n\n return {\n version: FLOWCHART_DOCUMENT_VERSION,\n viewport: normalizeViewport(source.viewport, limits.scaleBounds),\n nodes,\n edges,\n };\n}\n\nfunction splitLongToken(token, maxChars) {\n const result = [];\n let index = 0;\n while (index < token.length) {\n result.push(token.slice(index, index + maxChars));\n index += maxChars;\n }\n return result;\n}\n\nfunction wrapText(text, maxChars) {\n const safeMaxChars = Math.max(6, maxChars);\n const lines = [];\n\n String(text || '')\n .split(/\\r?\\n/)\n .forEach((paragraph) => {\n const trimmed = paragraph.trim();\n if (!trimmed) {\n lines.push('');\n return;\n }\n\n let current = '';\n trimmed.split(/\\s+/).forEach((word) => {\n if (word.length > safeMaxChars) {\n if (current) {\n lines.push(current);\n current = '';\n }\n splitLongToken(word, safeMaxChars).forEach((chunk) => lines.push(chunk));\n return;\n }\n\n const next = current ? `${current} ${word}` : word;\n if (next.length <= safeMaxChars) {\n current = next;\n return;\n }\n\n if (current) lines.push(current);\n current = word;\n });\n\n if (current) lines.push(current);\n });\n\n if (!lines.length) return [''];\n if (lines.length <= 6) return lines;\n\n const clipped = lines.slice(0, 6);\n clipped[5] =\n clipped[5].length > safeMaxChars - 3\n ? `${clipped[5].slice(0, safeMaxChars - 3)}...`\n : `${clipped[5]}...`;\n return clipped;\n}\n\nfunction estimateChars(width) {\n return Math.max(8, Math.floor((width - 24) / 7));\n}\n\nfunction getPortPosition(node, port) {\n switch (port) {\n case 'top':\n return { x: node.x + node.width / 2, y: node.y };\n case 'right':\n return { x: node.x + node.width, y: node.y + node.height / 2 };\n case 'bottom':\n return { x: node.x + node.width / 2, y: node.y + node.height };\n case 'left':\n default:\n return { x: node.x, y: node.y + node.height / 2 };\n }\n}\n\nfunction getPortHandlePosition(node, port, scale = 1) {\n const point = getPortPosition(node, port);\n const normal = getPortNormal(port);\n const offset = PORT_HANDLE_OFFSET / scale;\n return {\n x: formatNumber(point.x + normal.x * offset),\n y: formatNumber(point.y + normal.y * offset),\n };\n}\n\nfunction getNearestPort(node, point) {\n return FLOWCHART_PORTS.reduce((best, port) => {\n const portPoint = getPortPosition(node, port);\n const distance = Math.hypot(point.x - portPoint.x, point.y - portPoint.y);\n if (!best || distance < best.distance) {\n return { port, point: portPoint, distance };\n }\n return best;\n }, null);\n}\n\nfunction getPortNormal(port) {\n switch (port) {\n case 'top':\n return { x: 0, y: -1 };\n case 'right':\n return { x: 1, y: 0 };\n case 'bottom':\n return { x: 0, y: 1 };\n case 'left':\n default:\n return { x: -1, y: 0 };\n }\n}\n\nfunction isPointInsideNode(node, point) {\n return (\n point.x >= node.x &&\n point.x <= node.x + node.width &&\n point.y >= node.y &&\n point.y <= node.y + node.height\n );\n}\n\nfunction getPortByDirection(node, point) {\n const centerX = node.x + node.width / 2;\n const centerY = node.y + node.height / 2;\n const deltaX = point.x - centerX;\n const deltaY = point.y - centerY;\n const port =\n Math.abs(deltaX) > Math.abs(deltaY)\n ? deltaX > 0\n ? 'right'\n : 'left'\n : deltaY > 0\n ? 'bottom'\n : 'top';\n const portPoint = getPortPosition(node, port);\n return {\n port,\n point: portPoint,\n distance: Math.hypot(point.x - portPoint.x, point.y - portPoint.y),\n };\n}\n\nfunction pickPortForNode(node, point, referencePoint = null) {\n if (isPointInsideNode(node, point)) {\n const centerX = node.x + node.width / 2;\n const centerY = node.y + node.height / 2;\n const distanceFromCenter = Math.hypot(point.x - centerX, point.y - centerY);\n if (referencePoint && distanceFromCenter <= CONNECTION_CENTER_LOCK_RADIUS) {\n return getPortByDirection(node, referencePoint);\n }\n return getPortByDirection(node, point);\n }\n return getNearestPort(node, point);\n}\n\nfunction getDistanceToNodeBounds(node, point) {\n const left = node.x;\n const right = node.x + node.width;\n const top = node.y;\n const bottom = node.y + node.height;\n const dx = point.x < left ? left - point.x : point.x > right ? point.x - right : 0;\n const dy = point.y < top ? top - point.y : point.y > bottom ? point.y - bottom : 0;\n return Math.hypot(dx, dy);\n}\n\nfunction offsetPoint(point, normal, distance) {\n return {\n x: point.x + normal.x * distance,\n y: point.y + normal.y * distance,\n };\n}\n\nfunction isHorizontalPort(port) {\n return port === 'left' || port === 'right';\n}\n\nfunction addDistinctPoint(points, point) {\n const previous = points[points.length - 1];\n if (!previous || previous.x !== point.x || previous.y !== point.y) {\n points.push(point);\n }\n}\n\nfunction buildPathFromPoints(points) {\n return points\n .map((point, index) => {\n const command = index === 0 ? 'M' : 'L';\n return `${command} ${formatNumber(point.x)} ${formatNumber(point.y)}`;\n })\n .join(' ');\n}\n\n// Render an orthogonal polyline with rounded corners. Each interior vertex is\n// replaced by `L <approach> Q <corner> <departure>`, where approach/departure\n// are pulled back from the corner by a radius clamped to half of each adjacent\n// segment so short segments never overshoot. Endpoints (first M, final L) stay\n// exact. Quadratic Q joins keep the output free of cubic `C` commands.\nfunction buildRoundedPath(points, radius) {\n if (points.length < 3 || radius <= 0) {\n return buildPathFromPoints(points);\n }\n\n let d = `M ${formatNumber(points[0].x)} ${formatNumber(points[0].y)}`;\n for (let index = 1; index < points.length - 1; index += 1) {\n const prev = points[index - 1];\n const corner = points[index];\n const next = points[index + 1];\n const lenIn = Math.hypot(corner.x - prev.x, corner.y - prev.y);\n const lenOut = Math.hypot(next.x - corner.x, next.y - corner.y);\n const r = Math.min(radius, lenIn / 2, lenOut / 2);\n\n if (!(r > 0)) {\n d += ` L ${formatNumber(corner.x)} ${formatNumber(corner.y)}`;\n continue;\n }\n\n const approach = {\n x: corner.x - ((corner.x - prev.x) / lenIn) * r,\n y: corner.y - ((corner.y - prev.y) / lenIn) * r,\n };\n const departure = {\n x: corner.x + ((next.x - corner.x) / lenOut) * r,\n y: corner.y + ((next.y - corner.y) / lenOut) * r,\n };\n d += ` L ${formatNumber(approach.x)} ${formatNumber(approach.y)}`;\n d += ` Q ${formatNumber(corner.x)} ${formatNumber(corner.y)} ${formatNumber(departure.x)} ${formatNumber(departure.y)}`;\n }\n const last = points[points.length - 1];\n d += ` L ${formatNumber(last.x)} ${formatNumber(last.y)}`;\n return d;\n}\n\nfunction getPolylineLabelPoint(points) {\n let totalLength = 0;\n for (let index = 1; index < points.length; index += 1) {\n totalLength += Math.hypot(\n points[index].x - points[index - 1].x,\n points[index].y - points[index - 1].y,\n );\n }\n\n if (!totalLength) {\n const first = points[0] || { x: 0, y: 0 };\n return { x: formatNumber(first.x), y: formatNumber(first.y) };\n }\n\n const halfway = totalLength / 2;\n let covered = 0;\n for (let index = 1; index < points.length; index += 1) {\n const start = points[index - 1];\n const end = points[index];\n const segmentLength = Math.hypot(end.x - start.x, end.y - start.y);\n if (!segmentLength) continue;\n if (covered + segmentLength >= halfway) {\n const ratio = (halfway - covered) / segmentLength;\n return {\n x: formatNumber(start.x + (end.x - start.x) * ratio),\n y: formatNumber(start.y + (end.y - start.y) * ratio),\n };\n }\n covered += segmentLength;\n }\n\n const last = points[points.length - 1] || { x: 0, y: 0 };\n return { x: formatNumber(last.x), y: formatNumber(last.y) };\n}\n\n// Cubic-bezier control point for one endpoint. The control arm always extends\n// straight out along the port's outward normal (so the curve leaves/enters the\n// arrow perpendicular to the node edge), and its LENGTH is a fraction of the\n// straight-line distance between the endpoints \u2014 not of a single axis. The old\n// per-axis model (React Flow's) gave one endpoint a huge arm and the other a\n// tiny one whenever the ports were perpendicular, producing the long-straight-\n// then-sharp-kink-at-the-arrow look. Scaling by total distance keeps both arms\n// balanced, so radial/mind-map edges read as smooth arcs.\n//\n// `align` is how much the target lies in the port's outward direction\n// (1 = dead ahead, 0 = sideways, -1 = behind). Easing the arm by alignment\n// shortens it when the target sits behind the port, avoiding a ballooned loop,\n// while giving aligned endpoints a long, graceful tangent into the arrowhead.\nfunction routeMetrics(edgeScale = 1) {\n const scale = clamp(toFiniteNumber(edgeScale, 1), 0.01, 1);\n return {\n scale,\n minCurveArm: MIN_CURVE_ARM * scale,\n maxCurveArm: MAX_CURVE_ARM * scale,\n stub: ORTHOGONAL_STUB_LENGTH * scale,\n corner: ORTHOGONAL_CORNER_RADIUS * scale,\n clearance: ORTHOGONAL_CLEARANCE * scale,\n };\n}\n\nfunction curveControlPoint(point, port, target, curvature, metrics = routeMetrics(1)) {\n const normal = getPortNormal(port);\n const dx = target.x - point.x;\n const dy = target.y - point.y;\n const distance = Math.hypot(dx, dy) || 1;\n const align = (normal.x * dx + normal.y * dy) / distance;\n const ease = 0.55 + 0.45 * align;\n const arm = clamp(distance * curvature * ease, metrics.minCurveArm, metrics.maxCurveArm);\n return { x: point.x + normal.x * arm, y: point.y + normal.y * arm };\n}\n\nfunction buildCurvePath(\n fromPoint,\n toPoint,\n fromPort = 'right',\n toPort = 'left',\n metrics = routeMetrics(1),\n) {\n const controlA = curveControlPoint(fromPoint, fromPort, toPoint, EDGE_CURVATURE, metrics);\n const controlB = curveControlPoint(toPoint, toPort, fromPoint, EDGE_CURVATURE, metrics);\n\n // Cubic bezier value at t = 0.5 for an accurate on-curve label anchor.\n const labelX = 0.125 * fromPoint.x + 0.375 * controlA.x + 0.375 * controlB.x + 0.125 * toPoint.x;\n const labelY = 0.125 * fromPoint.y + 0.375 * controlA.y + 0.375 * controlB.y + 0.125 * toPoint.y;\n\n return {\n d: `M ${formatNumber(fromPoint.x)} ${formatNumber(fromPoint.y)} C ${formatNumber(controlA.x)} ${formatNumber(controlA.y)} ${formatNumber(controlB.x)} ${formatNumber(controlB.y)} ${formatNumber(toPoint.x)} ${formatNumber(toPoint.y)}`,\n labelX: formatNumber(labelX),\n labelY: formatNumber(labelY),\n };\n}\n\nfunction buildStraightPath(fromPoint, toPoint) {\n return {\n d: buildPathFromPoints([fromPoint, toPoint]),\n labelX: formatNumber((fromPoint.x + toPoint.x) / 2),\n labelY: formatNumber((fromPoint.y + toPoint.y) / 2),\n };\n}\n\nfunction getNodeRectBounds(node, pad = 0) {\n if (!node) return null;\n return {\n left: node.x - pad,\n top: node.y - pad,\n right: node.x + node.width + pad,\n bottom: node.y + node.height + pad,\n };\n}\n\n// Does an axis-aligned segment pass through a rect's interior? Edge contact\n// (e.g. a stub running along a node border or a port sitting on the boundary)\n// is not a hit \u2014 only strict interior overlap counts.\nfunction segmentIntersectsRect(a, b, rect) {\n if (!rect) return false;\n const minX = Math.min(a.x, b.x);\n const maxX = Math.max(a.x, b.x);\n const minY = Math.min(a.y, b.y);\n const maxY = Math.max(a.y, b.y);\n return minX < rect.right && maxX > rect.left && minY < rect.bottom && maxY > rect.top;\n}\n\n// Pick a perpendicular \"channel\" coordinate that sits clear of both node\n// rectangles when the connector has to loop around them. `low` is the edge\n// before both nodes (top / left), `high` is after both (bottom / right);\n// we route on whichever side is cheaper, biased toward the target on a tie.\nfunction pickOrthogonalChannel(from, to, low, high) {\n const costLow = Math.abs(low - from) + Math.abs(low - to);\n const costHigh = Math.abs(high - from) + Math.abs(high - to);\n if (costLow < costHigh) return low;\n if (costHigh < costLow) return high;\n return to >= from ? high : low;\n}\n\n// Node-blind fallback used for the live connection preview, where one endpoint\n// is a free pointer with no rectangle to route around.\nfunction getOrthogonalMidpoints(fromStub, toStub, fromPort, toPort) {\n const sourceHorizontal = isHorizontalPort(fromPort);\n const targetHorizontal = isHorizontalPort(toPort);\n\n if (sourceHorizontal && targetHorizontal) {\n const midX = (fromStub.x + toStub.x) / 2;\n return [\n { x: midX, y: fromStub.y },\n { x: midX, y: toStub.y },\n ];\n }\n\n if (!sourceHorizontal && !targetHorizontal) {\n const midY = (fromStub.y + toStub.y) / 2;\n return [\n { x: fromStub.x, y: midY },\n { x: toStub.x, y: midY },\n ];\n }\n\n if (sourceHorizontal) {\n return [{ x: toStub.x, y: fromStub.y }];\n }\n\n return [{ x: fromStub.x, y: toStub.y }];\n}\n\n// Node-aware orthogonal routing. Each endpoint extends a stub beyond its port,\n// then the two stubs are bridged: directly when the ports face each other with\n// room in between, otherwise through a channel routed clear of both node rects\n// so the connector never cuts through a box (draw.io-style \"around\" routing).\nfunction getOrthogonalPoints(\n fromPoint,\n toPoint,\n fromPort,\n toPort,\n fromRect,\n toRect,\n metrics = routeMetrics(1),\n) {\n const fromNormal = getPortNormal(fromPort);\n const toNormal = getPortNormal(toPort);\n const fromStub = offsetPoint(fromPoint, fromNormal, metrics.stub);\n const toStub = offsetPoint(toPoint, toNormal, metrics.stub);\n const sourceHorizontal = isHorizontalPort(fromPort);\n const targetHorizontal = isHorizontalPort(toPort);\n const mids = [];\n\n if (sourceHorizontal && targetHorizontal) {\n // A straight vertical bridge only works when the ports face each other AND\n // the stubs leave room between them. Otherwise (facing-but-overlapping, or\n // same-direction ports) `facing && hasRoom` is false and we always detour\n // through a clear horizontal channel \u2014 the channel handles every such case.\n const facing = fromNormal.x === -toNormal.x;\n const hasRoom = fromNormal.x > 0 ? fromStub.x <= toStub.x : fromStub.x >= toStub.x;\n if (facing && hasRoom) {\n const midX = (fromStub.x + toStub.x) / 2;\n mids.push({ x: midX, y: fromStub.y }, { x: midX, y: toStub.y });\n } else {\n const top = Math.min(fromRect.top, toRect.top);\n const bottom = Math.max(fromRect.bottom, toRect.bottom);\n const yChannel = pickOrthogonalChannel(fromStub.y, toStub.y, top, bottom);\n mids.push({ x: fromStub.x, y: yChannel }, { x: toStub.x, y: yChannel });\n }\n } else if (!sourceHorizontal && !targetHorizontal) {\n // Mirror of the both-horizontal case; see the comment above.\n const facing = fromNormal.y === -toNormal.y;\n const hasRoom = fromNormal.y > 0 ? fromStub.y <= toStub.y : fromStub.y >= toStub.y;\n if (facing && hasRoom) {\n const midY = (fromStub.y + toStub.y) / 2;\n mids.push({ x: fromStub.x, y: midY }, { x: toStub.x, y: midY });\n } else {\n const left = Math.min(fromRect.left, toRect.left);\n const right = Math.max(fromRect.right, toRect.right);\n const xChannel = pickOrthogonalChannel(fromStub.x, toStub.x, left, right);\n mids.push({ x: xChannel, y: fromStub.y }, { x: xChannel, y: toStub.y });\n }\n } else {\n // Perpendicular ports form an L with a single corner. Two corners respect\n // the exit/entry directions: the \"clean\" one continues the source stub's\n // axis, the alternate continues the target stub's axis. Prefer the clean\n // corner, but fall back to the alternate when the clean L's legs would cut\n // through either node (e.g. target tucked beside/under the source).\n const cleanCorner = sourceHorizontal\n ? { x: toStub.x, y: fromStub.y }\n : { x: fromStub.x, y: toStub.y };\n const altCorner = sourceHorizontal\n ? { x: fromStub.x, y: toStub.y }\n : { x: toStub.x, y: fromStub.y };\n const legsClear = (corner) =>\n !segmentIntersectsRect(fromStub, corner, fromRect) &&\n !segmentIntersectsRect(fromStub, corner, toRect) &&\n !segmentIntersectsRect(corner, toStub, fromRect) &&\n !segmentIntersectsRect(corner, toStub, toRect);\n mids.push(legsClear(cleanCorner) || !legsClear(altCorner) ? cleanCorner : altCorner);\n }\n\n const points = [];\n [fromPoint, fromStub, ...mids, toStub, toPoint].forEach((point) =>\n addDistinctPoint(points, point),\n );\n return points;\n}\n\nfunction buildOrthogonalPath(\n fromPoint,\n toPoint,\n fromPort = 'right',\n toPort = 'left',\n fromRect = null,\n toRect = null,\n metrics = routeMetrics(1),\n) {\n let points;\n if (fromRect && toRect) {\n points = getOrthogonalPoints(fromPoint, toPoint, fromPort, toPort, fromRect, toRect, metrics);\n } else {\n const fromStub = offsetPoint(fromPoint, getPortNormal(fromPort), metrics.stub);\n const toStub = offsetPoint(toPoint, getPortNormal(toPort), metrics.stub);\n points = [];\n [\n fromPoint,\n fromStub,\n ...getOrthogonalMidpoints(fromStub, toStub, fromPort, toPort),\n toStub,\n toPoint,\n ].forEach((point) => addDistinctPoint(points, point));\n }\n\n const label = getPolylineLabelPoint(points);\n return {\n d: buildRoundedPath(points, metrics.corner),\n labelX: label.x,\n labelY: label.y,\n };\n}\n\nfunction buildEdgePath(edge, fromNode = null, toNode = null) {\n const fromPort = edge?.from?.port || edge?.fromPort || 'right';\n const toPort = edge?.to?.port || edge?.toPort || 'left';\n const fromPoint = edge?.fromPoint || (fromNode ? getPortPosition(fromNode, fromPort) : null);\n const toPoint = edge?.toPoint || (toNode ? getPortPosition(toNode, toPort) : null);\n const route = normalizeEdgeRoute(edge?.route);\n const metrics = routeMetrics(edgeVisualScale(fromNode, toNode));\n\n if (!fromPoint || !toPoint) {\n return { d: '', labelX: 0, labelY: 0 };\n }\n\n if (route === 'straight') {\n return buildStraightPath(fromPoint, toPoint);\n }\n\n if (route === 'orthogonal') {\n const fromRect =\n !edge?.fromPoint && fromNode ? getNodeRectBounds(fromNode, metrics.clearance) : null;\n const toRect = !edge?.toPoint && toNode ? getNodeRectBounds(toNode, metrics.clearance) : null;\n return buildOrthogonalPath(fromPoint, toPoint, fromPort, toPort, fromRect, toRect, metrics);\n }\n\n return buildCurvePath(fromPoint, toPoint, fromPort, toPort, metrics);\n}\n\nfunction createArrowMarker(id, strokeWidth, reversed = false, edgeScale = 1) {\n const scale = clamp(toFiniteNumber(edgeScale, 1), 0.01, 1);\n const effective = Math.max(0.02, strokeWidth * scale);\n const size = formatNumber(Math.max(9 * scale, effective * 4.4));\n const refInset = formatNumber(Math.max(1.5 * scale, effective * 0.85));\n const marker = svgEl('marker', {\n id,\n markerWidth: size,\n markerHeight: size,\n refX: reversed ? refInset : formatNumber(size - refInset),\n refY: formatNumber(size / 2),\n orient: 'auto',\n markerUnits: 'userSpaceOnUse',\n });\n marker.appendChild(\n svgEl('path', {\n d: reversed\n ? `M ${formatNumber(size)} 0 L 0 ${formatNumber(size / 2)} L ${formatNumber(size)} ${formatNumber(size)} z`\n : `M 0 0 L ${formatNumber(size)} ${formatNumber(size / 2)} L 0 ${formatNumber(size)} z`,\n fill: 'var(--vd-flowchart-accent)',\n }),\n );\n return marker;\n}\n\nfunction createDotMarker(id, strokeWidth, edgeScale = 1) {\n const scale = clamp(toFiniteNumber(edgeScale, 1), 0.01, 1);\n const effective = Math.max(0.02, strokeWidth * scale);\n const size = formatNumber(Math.max(8 * scale, effective * 3.3));\n const radius = formatNumber(Math.max(2.75 * scale, effective * 1.45));\n const marker = svgEl('marker', {\n id,\n markerWidth: size,\n markerHeight: size,\n refX: formatNumber(size / 2),\n refY: formatNumber(size / 2),\n orient: 'auto',\n markerUnits: 'userSpaceOnUse',\n });\n marker.appendChild(\n svgEl('circle', {\n cx: formatNumber(size / 2),\n cy: formatNumber(size / 2),\n r: radius,\n fill: 'var(--vd-flowchart-accent)',\n }),\n );\n return marker;\n}\n\nfunction getNodeFontMetrics(node) {\n if (node.type === 'label') {\n return { fontSize: 18, lineHeight: 20 };\n }\n if (node.type === 'textbox') {\n return { fontSize: 13, lineHeight: 18 };\n }\n return { fontSize: 14, lineHeight: 18 };\n}\n\nfunction getResizeHandlePosition(node, handle) {\n const middleX = node.width / 2;\n const middleY = node.height / 2;\n const x = handle.includes('w') ? 0 : handle.includes('e') ? node.width : middleX;\n const y = handle.includes('n') ? 0 : handle.includes('s') ? node.height : middleY;\n return { x, y };\n}\n\nfunction getResizeCursor(handle) {\n if (handle === 'n' || handle === 's') return 'ns-resize';\n if (handle === 'e' || handle === 'w') return 'ew-resize';\n if (handle === 'ne' || handle === 'sw') return 'nesw-resize';\n return 'nwse-resize';\n}\n\n// Alignment lines of `nodes`: left/centre/right on x and top/middle/bottom on\n// y, each with the node's extent on the other axis, sorted by value.\nfunction collectGuideLines(nodes) {\n const x = [];\n const y = [];\n nodes.forEach((node) => {\n const right = node.x + node.width;\n const bottom = node.y + node.height;\n [node.x, node.x + node.width / 2, right].forEach((value) =>\n x.push({ value, start: node.y, end: bottom }),\n );\n [node.y, node.y + node.height / 2, bottom].forEach((value) =>\n y.push({ value, start: node.x, end: right }),\n );\n });\n const byValue = (a, b) => a.value - b.value;\n return { x: x.sort(byValue), y: y.sort(byValue) };\n}\n\nfunction lowerBound(lines, value) {\n let low = 0;\n let high = lines.length;\n while (low < high) {\n const middle = (low + high) >> 1;\n if (lines[middle].value < value) low = middle + 1;\n else high = middle;\n }\n return low;\n}\n\n// Smallest offset that puts one of `candidates` on a guide line within\n// `threshold`, plus every line at the snapped position.\nfunction snapToGuides(lines, candidates, threshold) {\n let best = null;\n candidates.forEach((candidate) => {\n const index = lowerBound(lines, candidate);\n [lines[index - 1], lines[index]].forEach((line) => {\n if (!line) return;\n const offset = line.value - candidate;\n if (Math.abs(offset) <= threshold && (!best || Math.abs(offset) < Math.abs(best.offset))) {\n best = { offset };\n }\n });\n });\n if (!best) return null;\n const positions = candidates.map((candidate) => candidate + best.offset);\n best.lines = lines.filter((line) =>\n positions.some((position) => Math.abs(line.value - position) < 0.5),\n );\n return best;\n}\n\n// Guide segments spanning the snapped box and every node sharing the line.\nfunction guideSegments(axis, lines, box) {\n const byValue = new Map();\n lines.forEach((line) => {\n const current = byValue.get(line.value);\n byValue.set(line.value, {\n start: Math.min(current?.start ?? Infinity, line.start),\n end: Math.max(current?.end ?? -Infinity, line.end),\n });\n });\n const boxStart = axis === 'x' ? box.top : box.left;\n const boxEnd = boxStart + (axis === 'x' ? box.height : box.width);\n return [...byValue].map(([value, extent]) => {\n const start = Math.min(extent.start, boxStart) - GUIDE_OVERHANG;\n const end = Math.max(extent.end, boxEnd) + GUIDE_OVERHANG;\n return axis === 'x'\n ? { x1: value, y1: start, x2: value, y2: end }\n : { x1: start, y1: value, x2: end, y2: value };\n });\n}\n\nfunction getBounds(nodes) {\n if (!nodes.length) {\n return { left: 0, top: 0, right: 0, bottom: 0 };\n }\n\n return nodes.reduce(\n (accumulator, node) => ({\n left: Math.min(accumulator.left, node.x),\n top: Math.min(accumulator.top, node.y),\n right: Math.max(accumulator.right, node.x + node.width),\n bottom: Math.max(accumulator.bottom, node.y + node.height),\n }),\n {\n left: Number.POSITIVE_INFINITY,\n top: Number.POSITIVE_INFINITY,\n right: Number.NEGATIVE_INFINITY,\n bottom: Number.NEGATIVE_INFINITY,\n },\n );\n}\n\nfunction createField(labelText, control) {\n const wrapper = createElement('div', { className: 'vd-flowchart-field' });\n const label = createElement('label', { text: labelText });\n control.id ||= nextId('flowchart-field');\n label.htmlFor = control.id;\n wrapper.appendChild(label);\n wrapper.appendChild(control);\n return wrapper;\n}\n\nfunction createPalettePreview(type) {\n const preview = svgEl('svg', {\n class: `vd-flowchart-palette-preview vd-flowchart-palette-preview--${type}`,\n viewBox: '0 0 72 44',\n 'aria-hidden': 'true',\n focusable: 'false',\n });\n const baseClass = `vd-flowchart-palette-shape vd-flowchart-palette-shape--${type}`;\n\n if (type === 'arrow') {\n preview.appendChild(\n svgEl('path', {\n class: 'vd-flowchart-palette-arrow',\n d: 'M 12 30 C 28 10 44 10 60 22',\n }),\n );\n preview.appendChild(\n svgEl('path', {\n class: 'vd-flowchart-palette-arrowhead',\n d: 'M 53 16 L 64 22 L 52 27 z',\n }),\n );\n return preview;\n }\n\n if (type === 'rounded-rect') {\n preview.appendChild(\n svgEl('rect', {\n class: baseClass,\n x: 10,\n y: 10,\n width: 52,\n height: 24,\n rx: 8,\n ry: 8,\n }),\n );\n return preview;\n }\n\n if (type === 'rect') {\n preview.appendChild(\n svgEl('rect', {\n class: baseClass,\n x: 10,\n y: 10,\n width: 52,\n height: 24,\n rx: 1,\n ry: 1,\n }),\n );\n return preview;\n }\n\n if (type === 'diamond') {\n preview.appendChild(\n svgEl('polygon', {\n class: baseClass,\n points: '36,6 64,22 36,38 8,22',\n }),\n );\n return preview;\n }\n\n if (type === 'circle') {\n preview.appendChild(\n svgEl('ellipse', {\n class: baseClass,\n cx: 36,\n cy: 22,\n rx: 18,\n ry: 18,\n }),\n );\n return preview;\n }\n\n if (type === 'junction') {\n preview.appendChild(\n svgEl('path', {\n class: 'vd-flowchart-palette-junction-lines',\n d: 'M 12 22 H 27 M 45 22 H 60 M 36 8 V 14 M 36 30 V 36',\n }),\n );\n preview.appendChild(\n svgEl('circle', {\n class: baseClass,\n cx: 36,\n cy: 22,\n r: 8,\n }),\n );\n return preview;\n }\n\n if (type === 'textbox') {\n preview.appendChild(\n svgEl('rect', {\n class: baseClass,\n x: 10,\n y: 8,\n width: 52,\n height: 28,\n rx: 6,\n ry: 6,\n }),\n );\n preview.appendChild(\n svgEl('path', {\n class: 'vd-flowchart-palette-lines',\n d: 'M 20 18 H 52 M 20 25 H 46',\n }),\n );\n return preview;\n }\n\n const label = svgEl('text', {\n class: 'vd-flowchart-palette-label-mark',\n x: 36,\n y: 24,\n 'text-anchor': 'middle',\n 'dominant-baseline': 'middle',\n });\n label.textContent = 'Aa';\n preview.appendChild(label);\n return preview;\n}\n\nexport class VdFlowchart {\n constructor(options = {}) {\n this.element = resolveElement(options.element || options.target);\n this.readonly = Boolean(options.readonly);\n this.gridSize = clamp(toFiniteNumber(options.gridSize, DEFAULT_GRID_SIZE), 12, 64);\n const scaleBounds = normalizeBoundPair(\n options.minScale,\n options.maxScale,\n DEFAULT_MIN_SCALE,\n DEFAULT_MAX_SCALE,\n );\n const sizeBounds = normalizeBoundPair(\n options.minNodeSize,\n options.maxNodeSize,\n DEFAULT_MIN_NODE_SIZE,\n DEFAULT_MAX_NODE_SIZE,\n );\n this.minScale = scaleBounds.min;\n this.maxScale = scaleBounds.max;\n this.minNodeSize = sizeBounds.min;\n this.maxNodeSize = sizeBounds.max;\n this.documentData = normalizeDocument(options.data || {}, { scaleBounds, sizeBounds });\n this.listeners = {};\n this.selection = null;\n this.selectedNodeIds = new Set();\n this.interaction = null;\n this.activeTool = null;\n this.layoutMode = 'tree';\n this.paletteSerial = 0;\n this.destroyed = false;\n this.lastNodePointer = null;\n this.reconnectEdgeId = null;\n this.edgeCycleAnchor = null;\n this.clipboard = null;\n this.gridPatternId = nextId('flowchart-grid');\n this.markerIds = new Map();\n this.textEditor = null;\n\n this.historyEnabled = options.history !== false;\n this.historyLimit = Math.max(1, Math.floor(toFiniteNumber(options.historyLimit, 100)));\n this.history = [];\n this.historyIndex = -1;\n this.isApplyingHistory = false;\n this.historyBatchDepth = 0;\n this.historyBatchDirty = false;\n this.coalesceInsertedText = false;\n this.keyboardShortcuts = normalizeKeyboardShortcuts(options.keyboardShortcuts);\n this.snapGuides = options.snapGuides !== false;\n this.minimapEnabled = options.minimap !== false;\n this.autoLayout = Boolean(options.autoLayout);\n this.minimapFrame = 0;\n this.minimapDrag = null;\n this.shortcutsHelpOpen = false;\n this.autoFit = Boolean(options.autoFit);\n this.readyEmitted = false;\n this.resizeObserver = null;\n\n this.handleToolbarClick = this.handleToolbarClick.bind(this);\n this.handleArrangeChange = this.handleArrangeChange.bind(this);\n this.handlePaletteClick = this.handlePaletteClick.bind(this);\n this.handlePointerDown = this.handlePointerDown.bind(this);\n this.handlePointerMove = this.handlePointerMove.bind(this);\n this.handlePointerUp = this.handlePointerUp.bind(this);\n this.handleClick = this.handleClick.bind(this);\n this.handleDoubleClick = this.handleDoubleClick.bind(this);\n this.handleWheel = this.handleWheel.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n this.handleSelectionFieldInput = this.handleSelectionFieldInput.bind(this);\n this.handleSelectionFieldChange = this.handleSelectionFieldChange.bind(this);\n this.handleJsonActionClick = this.handleJsonActionClick.bind(this);\n this.handleResize = this.handleResize.bind(this);\n\n this.buildShell();\n this.bindEvents();\n this.render();\n this.seedHistory();\n this.updateHistoryButtons();\n this.scheduleReady();\n }\n\n // --- Readiness -----------------------------------------------------------\n // The editor builds synchronously, but fitView() needs real canvas\n // dimensions, which only exist after the host is laid out. Emit `ready` once\n // the canvas reports a non-zero size (the old code fell back to an 800x560\n // guess); consumers can then fitView() without nextTick/setTimeout. The emit\n // is always deferred at least a microtask so a listener attached right after\n // construction \u2014 e.g. `new VdFlowchart(...).on('ready', ...)` or the Vue\n // wrapper \u2014 is registered before it fires.\n scheduleReady() {\n if (this.readyEmitted || this.destroyed || !hasWindow()) return;\n\n const tryEmit = () => {\n if (this.readyEmitted || this.destroyed) return true;\n const ready = this.canvasEl.clientWidth > 0 && this.canvasEl.clientHeight > 0;\n if (!ready) return false;\n this.readyEmitted = true;\n if (this.autoFit) this.fitView();\n else this.scheduleMinimap();\n this.emit('ready', this);\n return true;\n };\n\n const startObserving = () => {\n if (this.readyEmitted || this.destroyed || tryEmit()) return;\n\n if (typeof ResizeObserver === 'function') {\n this.resizeObserver = new ResizeObserver(() => {\n if (tryEmit()) {\n this.resizeObserver?.disconnect();\n this.resizeObserver = null;\n }\n });\n this.resizeObserver.observe(this.canvasEl);\n }\n\n // Fallback for environments without ResizeObserver (or a host that is\n // measurable on the next frame). If the host never gets a size, ready\n // simply never fires \u2014 which is correct.\n const raf =\n typeof requestAnimationFrame === 'function'\n ? requestAnimationFrame\n : (cb) => setTimeout(cb, 16);\n raf(() => tryEmit());\n };\n\n if (typeof queueMicrotask === 'function') {\n queueMicrotask(startObserving);\n } else {\n Promise.resolve().then(startObserving);\n }\n }\n\n buildShell() {\n this.element.innerHTML = '';\n this.element.classList.add('vd-flowchart-host');\n\n this.root = createElement('div', {\n className: `vd-flowchart-shell${this.readonly ? ' vd-flowchart-readonly' : ''}`,\n });\n\n this.toolbar = createElement('div', { className: 'vd-flowchart-toolbar' });\n this.toolbar.setAttribute('role', 'toolbar');\n this.toolbar.setAttribute('aria-label', 'Flowchart tools');\n const toolbarLeft = createElement('div', { className: 'vd-flowchart-toolbar-group' });\n const toolbarRight = createElement('div', { className: 'vd-flowchart-toolbar-group' });\n\n TOOLBAR_ACTIONS.forEach((item) => {\n const button = createToolbarButton(item);\n if (item.action === 'undo') this.undoButton = button;\n if (item.action === 'redo') this.redoButton = button;\n if (item.action === 'zoom-out') this.zoomOutButton = button;\n if (item.action === 'zoom-in') this.zoomInButton = button;\n if (item.action === 'reset-view') this.resetViewButton = button;\n if (item.action === 'fit-view') this.fitViewButton = button;\n toolbarLeft.appendChild(button);\n });\n this.undoButton.disabled = true;\n this.redoButton.disabled = true;\n\n this.arrangeSelect = createElement('select', {\n className: 'vd-flowchart-btn vd-flowchart-arrange',\n disabled: this.readonly,\n title: 'Auto-arrange layout',\n });\n this.arrangeSelect.setAttribute('aria-label', 'Layout mode');\n this.arrangeSelect.setAttribute('data-flowchart-arrange', '');\n LAYOUT_OPTIONS.forEach((item) => {\n const option = createElement('option', { value: item.value, text: item.label });\n option.value = item.value;\n this.arrangeSelect.appendChild(option);\n });\n this.arrangeSelect.value = this.layoutMode;\n\n this.clearButton = createToolbarButton({\n action: 'clear',\n label: 'Clear canvas',\n icon: 'clear',\n disabled: this.readonly,\n });\n\n this.zoomLabel = createElement('span', {\n className: 'vd-flowchart-toolbar-label',\n text: '100%',\n });\n\n this.shortcutsButton = createElement('button', {\n className: 'vd-flowchart-btn vd-flowchart-icon-btn vd-flowchart-shortcuts-btn',\n title: 'Keyboard shortcuts (?)',\n text: '?',\n });\n this.shortcutsButton.setAttribute('type', 'button');\n this.shortcutsButton.setAttribute('data-flowchart-action', 'shortcuts');\n this.shortcutsButton.setAttribute('aria-label', 'Keyboard shortcuts');\n this.shortcutsButton.setAttribute('aria-expanded', 'false');\n\n this.minimapButton = createToolbarButton({\n action: 'minimap',\n label: 'Toggle minimap',\n icon: 'minimap',\n });\n this.minimapButton.setAttribute('aria-pressed', this.minimapEnabled ? 'true' : 'false');\n\n toolbarLeft.appendChild(this.arrangeSelect);\n toolbarLeft.appendChild(this.clearButton);\n toolbarRight.appendChild(this.minimapButton);\n toolbarRight.appendChild(this.shortcutsButton);\n toolbarRight.appendChild(this.zoomLabel);\n this.toolbar.appendChild(toolbarLeft);\n this.toolbar.appendChild(toolbarRight);\n\n this.body = createElement('div', { className: 'vd-flowchart-body' });\n\n this.palettePanel = createElement('aside', {\n className: 'vd-flowchart-panel vd-flowchart-panel--palette',\n });\n this.palettePanel.appendChild(\n createElement('h4', { className: 'vd-flowchart-panel-title', text: 'Shapes' }),\n );\n this.paletteGrid = createElement('div', {\n className: 'vd-flowchart-palette',\n role: 'toolbar',\n });\n this.paletteGrid.setAttribute('aria-label', 'Shapes and tools');\n FLOWCHART_PALETTE_ITEMS.forEach((item) => {\n const button = createElement('button', {\n className: 'vd-flowchart-palette-btn',\n title: item.label,\n });\n button.setAttribute('type', 'button');\n if (item.kind === 'tool') {\n button.setAttribute('data-tool', item.tool);\n button.setAttribute('aria-label', item.label);\n button.setAttribute('aria-pressed', 'false');\n } else {\n button.setAttribute('data-node-type', item.type);\n button.setAttribute('aria-label', `Add ${item.label}`);\n }\n button.appendChild(createPalettePreview(item.tool || item.type));\n button.appendChild(\n createElement('span', {\n className: 'vd-flowchart-palette-label',\n text: item.label,\n }),\n );\n this.paletteGrid.appendChild(button);\n });\n this.palettePanel.appendChild(this.paletteGrid);\n\n this.canvasEl = createElement('div', { className: 'vd-flowchart-canvas', tabIndex: 0 });\n this.svg = svgEl('svg', {\n class: 'vd-flowchart-svg',\n role: 'img',\n 'aria-label': 'Vanduo Flowchart editor',\n });\n\n const defs = svgEl('defs');\n this.markerDefs = svgEl('g');\n defs.appendChild(this.markerDefs);\n\n const pattern = svgEl('pattern', {\n id: this.gridPatternId,\n width: this.gridSize,\n height: this.gridSize,\n patternUnits: 'userSpaceOnUse',\n });\n pattern.appendChild(\n svgEl('path', {\n d: `M ${this.gridSize} 0 L 0 0 0 ${this.gridSize}`,\n fill: 'none',\n stroke: 'var(--vd-flowchart-border)',\n 'stroke-opacity': 0.55,\n 'stroke-width': 1,\n }),\n );\n\n defs.appendChild(pattern);\n this.svg.appendChild(defs);\n\n this.world = svgEl('g', { class: 'vd-flowchart-world' });\n this.gridRect = svgEl('rect', {\n class: 'vd-flowchart-grid',\n x: -DEFAULT_WORLD_EXTENT / 2,\n y: -DEFAULT_WORLD_EXTENT / 2,\n width: DEFAULT_WORLD_EXTENT,\n height: DEFAULT_WORLD_EXTENT,\n fill: `url(#${this.gridPatternId})`,\n });\n this.edgesLayer = svgEl('g', { class: 'vd-flowchart-edges' });\n this.previewLayer = svgEl('g', { class: 'vd-flowchart-preview' });\n this.nodesLayer = svgEl('g', { class: 'vd-flowchart-nodes' });\n this.overlayLayer = svgEl('g', { class: 'vd-flowchart-overlay' });\n this.guidesLayer = svgEl('g', { class: 'vd-flowchart-guides' });\n\n this.world.appendChild(this.gridRect);\n this.world.appendChild(this.edgesLayer);\n this.world.appendChild(this.previewLayer);\n this.world.appendChild(this.nodesLayer);\n this.world.appendChild(this.overlayLayer);\n this.world.appendChild(this.guidesLayer);\n this.svg.appendChild(this.world);\n this.canvasEl.appendChild(this.svg);\n\n this.shortcutsHelp = createElement('div', { className: 'vd-flowchart-shortcuts' });\n this.shortcutsHelp.id = nextId('flowchart-shortcuts');\n this.shortcutsHelp.setAttribute('role', 'dialog');\n this.shortcutsHelp.setAttribute('aria-label', 'Keyboard shortcuts');\n this.shortcutsHelp.hidden = true;\n this.shortcutsHelp.addEventListener('pointerdown', (event) => event.stopPropagation());\n this.shortcutsHelp.addEventListener('wheel', (event) => event.stopPropagation());\n this.shortcutsButton.setAttribute('aria-controls', this.shortcutsHelp.id);\n this.canvasEl.appendChild(this.shortcutsHelp);\n\n // Pointer-only overview: keyboard users already have arrows and zoom keys.\n this.minimapEl = createElement('div', { className: 'vd-flowchart-minimap' });\n this.minimapEl.setAttribute('aria-hidden', 'true');\n this.minimapEl.hidden = true;\n this.minimapSvg = svgEl('svg', {\n class: 'vd-flowchart-minimap-svg',\n width: MINIMAP_WIDTH,\n height: MINIMAP_HEIGHT,\n viewBox: `0 0 ${MINIMAP_WIDTH} ${MINIMAP_HEIGHT}`,\n });\n this.minimapEl.appendChild(this.minimapSvg);\n this.minimapEl.addEventListener('pointerdown', (event) => this.handleMinimapPointer(event));\n this.minimapEl.addEventListener('pointermove', (event) => this.handleMinimapPointer(event));\n this.minimapEl.addEventListener('pointerup', (event) => this.endMinimapDrag(event));\n this.minimapEl.addEventListener('pointercancel', (event) => this.endMinimapDrag(event));\n this.minimapEl.addEventListener('wheel', (event) => event.stopPropagation());\n this.canvasEl.appendChild(this.minimapEl);\n\n this.inspectorPanel = createElement('aside', {\n className: 'vd-flowchart-panel vd-flowchart-panel--inspector',\n });\n this.inspectorPanel.appendChild(\n createElement('h4', { className: 'vd-flowchart-panel-title', text: 'Inspector' }),\n );\n this.selectionMeta = createElement('div', { className: 'vd-flowchart-selection-meta' });\n this.selectionFields = createElement('div', { className: 'vd-flowchart-fields' });\n this.deleteButton = createElement('button', {\n className: 'vd-flowchart-btn vd-flowchart-delete',\n text: 'Delete',\n disabled: true,\n });\n this.deleteButton.setAttribute('type', 'button');\n this.inspectorPanel.appendChild(this.selectionMeta);\n this.inspectorPanel.appendChild(this.selectionFields);\n this.inspectorPanel.appendChild(this.deleteButton);\n\n this.inspectorPanel.appendChild(\n createElement('h4', { className: 'vd-flowchart-panel-title', text: 'JSON' }),\n );\n this.jsonPanel = createElement('div', { className: 'vd-flowchart-json' });\n this.jsonTextarea = createElement('textarea', { rows: 18 });\n this.jsonActions = createElement('div', { className: 'vd-flowchart-json-actions' });\n this.refreshJsonButton = createElement('button', {\n className: 'vd-flowchart-json-btn',\n text: 'Refresh',\n });\n this.refreshJsonButton.setAttribute('type', 'button');\n this.refreshJsonButton.setAttribute('data-json-action', 'refresh');\n this.loadJsonButton = createElement('button', {\n className: 'vd-flowchart-json-btn',\n text: 'Load',\n disabled: this.readonly,\n });\n this.loadJsonButton.setAttribute('type', 'button');\n this.loadJsonButton.setAttribute('data-json-action', 'load');\n this.jsonActions.appendChild(this.refreshJsonButton);\n this.jsonActions.appendChild(this.loadJsonButton);\n this.jsonPanel.appendChild(this.jsonTextarea);\n this.jsonPanel.appendChild(this.jsonActions);\n this.jsonStatus = createElement('p', { className: 'vd-flowchart-json-status' });\n this.jsonStatus.setAttribute('role', 'status');\n this.jsonPanel.appendChild(this.jsonStatus);\n this.inspectorPanel.appendChild(this.jsonPanel);\n\n this.body.appendChild(this.palettePanel);\n this.body.appendChild(this.canvasEl);\n this.body.appendChild(this.inspectorPanel);\n\n this.root.appendChild(this.toolbar);\n this.root.appendChild(this.body);\n this.buildGraphOutline();\n this.element.appendChild(this.root);\n }\n\n buildGraphOutline() {\n this.graphOutline = createElement('details', { className: 'vd-flowchart-outline' });\n this.graphOutline.appendChild(createElement('summary', { text: 'Graph outline' }));\n this.graphOutline.addEventListener('toggle', () => {\n if (this.graphOutline.open) this.renderGraphOutline();\n });\n this.graphStatus = createElement('p', { className: 'vd-flowchart-sr-only' });\n this.graphStatus.setAttribute('role', 'status');\n this.canvasEl.appendChild(this.graphStatus);\n this.graphControls = createElement('div', { className: 'vd-flowchart-outline-controls' });\n this.graphNodeSelect = createElement('select');\n this.graphNodeSelect.setAttribute('aria-label', 'Selected node');\n this.graphNodeSelect.addEventListener('change', () =>\n this.selectNode(this.graphNodeSelect.value),\n );\n this.graphTargetSelect = createElement('select');\n this.graphTargetSelect.setAttribute('aria-label', 'Connection target');\n this.graphTargetSelect.addEventListener('change', () => this.renderGraphOutline());\n this.graphConnectButton = createElement('button', {\n text: 'Connect nodes',\n type: 'button',\n className: 'vd-flowchart-btn',\n });\n this.graphConnectButton.addEventListener('click', () => {\n if (this.readonly || this.graphNodeSelect.value === this.graphTargetSelect.value) {\n return;\n }\n this.addEdge({\n from: this.graphNodeSelect.value,\n to: this.graphTargetSelect.value,\n autoPort: true,\n });\n });\n this.graphEditButton = createElement('button', {\n text: 'Edit selected label',\n type: 'button',\n className: 'vd-flowchart-btn',\n });\n this.graphEditButton.addEventListener('click', () =>\n this.startTextEdit(this.graphNodeSelect.value),\n );\n this.graphControls.append(\n createField('Selected node', this.graphNodeSelect),\n createField('Connection target', this.graphTargetSelect),\n this.graphConnectButton,\n this.graphEditButton,\n );\n this.graphOutline.appendChild(this.graphControls);\n this.graphList = createElement('ul');\n this.graphList.setAttribute('aria-label', 'Nodes and connections');\n this.graphOutline.appendChild(this.graphList);\n this.root.appendChild(this.graphOutline);\n this.canvasEl.setAttribute('role', 'group');\n this.syncCanvasLabel();\n this.jsonTextarea.setAttribute('aria-label', 'Flowchart JSON');\n }\n\n syncCanvasLabel() {\n const keys =\n this.readonly || this.keyboardShortcuts === 'basic'\n ? 'Arrow keys select nodes; Enter or F2 edits a label.'\n : 'Arrow keys select nodes; Tab adds a child, Enter adds a sibling, F2 edits a label.';\n this.canvasEl.setAttribute(\n 'aria-label',\n `Diagram canvas. ${keys} Press ? for all shortcuts. Graph outline provides connections.`,\n );\n }\n\n renderGraphOutline() {\n if (!this.graphOutline) return;\n const nodes = this.documentData.nodes;\n const edges = this.documentData.edges;\n const labels = new Map(nodes.map((node) => [node.id, node.text || node.id]));\n const selected = this.selection?.kind === 'node' ? this.selection.id : null;\n this.graphStatus.textContent = selected\n ? `Selected: ${labels.get(selected)}. ${nodes.length} nodes, ${edges.length} connections.`\n : `${nodes.length} nodes, ${edges.length} connections.`;\n if (!this.graphOutline.open) return;\n const hidden = this.getHiddenNodeIds();\n const signature = JSON.stringify([\n nodes.map((node) => [node.id, node.text, Boolean(node.collapsed), hidden.has(node.id)]),\n edges.map((edge) => [edge.id, edge.from.nodeId, edge.to.nodeId, edge.label]),\n ]);\n if (signature !== this.graphSignature) {\n this.graphSignature = signature;\n for (const select of [this.graphNodeSelect, this.graphTargetSelect]) {\n const previous = select.value;\n select.replaceChildren();\n for (const node of nodes)\n select.appendChild(\n createElement('option', { value: node.id, text: labels.get(node.id) }),\n );\n if (labels.has(previous)) select.value = previous;\n }\n this.graphList.replaceChildren();\n const outgoing = new Map(nodes.map((node) => [node.id, []]));\n const incoming = new Map(nodes.map((node) => [node.id, []]));\n for (const edge of edges) {\n outgoing\n .get(edge.from.nodeId)\n ?.push(`${labels.get(edge.to.nodeId)}${edge.label ? ` (${edge.label})` : ''}`);\n incoming.get(edge.to.nodeId)?.push(labels.get(edge.from.nodeId));\n }\n for (const node of nodes) {\n const to = outgoing.get(node.id);\n const from = incoming.get(node.id);\n const relationships = [\n to.length ? `Connects to ${to.join(', ')}.` : 'No outgoing connections.',\n from.length ? `Connected from ${from.join(', ')}.` : '',\n node.collapsed ? 'Branch collapsed.' : '',\n hidden.has(node.id) ? 'Hidden in a collapsed branch.' : '',\n ].filter(Boolean);\n this.graphList.appendChild(\n createElement('li', { text: `${labels.get(node.id)}. ${relationships.join(' ')}` }),\n );\n }\n }\n if (selected) this.graphNodeSelect.value = selected;\n this.graphNodeSelect.disabled = nodes.length === 0;\n this.graphTargetSelect.disabled = this.readonly || nodes.length < 2;\n this.graphConnectButton.disabled =\n this.readonly ||\n nodes.length < 2 ||\n this.graphNodeSelect.value === this.graphTargetSelect.value;\n this.graphEditButton.disabled = this.readonly || nodes.length === 0;\n }\n\n bindEvents() {\n this.toolbar.addEventListener('click', this.handleToolbarClick);\n this.arrangeSelect.addEventListener('change', this.handleArrangeChange);\n this.paletteGrid.addEventListener('click', this.handlePaletteClick);\n this.deleteButton.addEventListener('click', () => this.deleteSelection());\n this.selectionFields.addEventListener('input', this.handleSelectionFieldInput);\n this.selectionFields.addEventListener('change', this.handleSelectionFieldChange);\n this.jsonActions.addEventListener('click', this.handleJsonActionClick);\n this.canvasEl.addEventListener('pointerdown', this.handlePointerDown);\n this.canvasEl.addEventListener('pointermove', this.handlePointerMove);\n this.canvasEl.addEventListener('pointerup', this.handlePointerUp);\n this.canvasEl.addEventListener('pointercancel', this.handlePointerUp);\n this.canvasEl.addEventListener('click', this.handleClick);\n this.canvasEl.addEventListener('dblclick', this.handleDoubleClick);\n this.canvasEl.addEventListener('wheel', this.handleWheel, { passive: false });\n this.root.addEventListener('keydown', this.handleKeyDown, true);\n window.addEventListener('pointerup', this.handlePointerUp);\n window.addEventListener('resize', this.handleResize);\n }\n\n unbindEvents() {\n this.toolbar.removeEventListener('click', this.handleToolbarClick);\n this.arrangeSelect.removeEventListener('change', this.handleArrangeChange);\n this.paletteGrid.removeEventListener('click', this.handlePaletteClick);\n this.selectionFields.removeEventListener('input', this.handleSelectionFieldInput);\n this.selectionFields.removeEventListener('change', this.handleSelectionFieldChange);\n this.jsonActions.removeEventListener('click', this.handleJsonActionClick);\n this.canvasEl.removeEventListener('pointerdown', this.handlePointerDown);\n this.canvasEl.removeEventListener('pointermove', this.handlePointerMove);\n this.canvasEl.removeEventListener('pointerup', this.handlePointerUp);\n this.canvasEl.removeEventListener('pointercancel', this.handlePointerUp);\n this.canvasEl.removeEventListener('click', this.handleClick);\n this.canvasEl.removeEventListener('dblclick', this.handleDoubleClick);\n this.canvasEl.removeEventListener('wheel', this.handleWheel);\n this.root.removeEventListener('keydown', this.handleKeyDown, true);\n window.removeEventListener('pointerup', this.handlePointerUp);\n window.removeEventListener('resize', this.handleResize);\n }\n\n handleResize() {\n if (this.destroyed) return;\n this.render({ inspector: false, json: false });\n }\n\n updatePaletteState() {\n const arrowArmed = this.activeTool === 'arrow';\n this.paletteGrid.querySelectorAll('.vd-flowchart-palette-btn').forEach((button) => {\n const tool = button.getAttribute('data-tool');\n const active = Boolean(tool) && tool === this.activeTool;\n button.classList.toggle('is-active', active);\n if (tool) button.setAttribute('aria-pressed', active ? 'true' : 'false');\n });\n this.canvasEl.classList.toggle('is-arrow-tool', arrowArmed);\n }\n\n syncArrangeSelect() {\n if (!this.arrangeSelect) return;\n const mode = LAYOUT_OPTIONS.some((item) => item.value === this.layoutMode)\n ? this.layoutMode\n : 'tree';\n this.layoutMode = mode;\n this.arrangeSelect.value = mode;\n }\n\n setActiveTool(tool) {\n this.activeTool = tool || null;\n this.updatePaletteState();\n this.render({ scene: true, inspector: false, json: false });\n }\n\n handleToolbarClick(event) {\n const actionButton = event.target.closest('[data-flowchart-action]');\n if (!actionButton) return;\n\n const action = actionButton.getAttribute('data-flowchart-action');\n if (action === 'zoom-in') this.zoomIn();\n if (action === 'zoom-out') this.zoomOut();\n if (action === 'reset-view') this.resetView();\n if (action === 'fit-view') this.fitView();\n if (action === 'undo') this.undo();\n if (action === 'redo') this.redo();\n if (action === 'clear' && !this.readonly) this.clear();\n if (action === 'shortcuts') this.toggleShortcutsHelp();\n if (action === 'minimap') this.setMinimapEnabled(!this.minimapEnabled);\n }\n\n setMinimapEnabled(enabled) {\n this.minimapEnabled = Boolean(enabled);\n this.minimapButton.setAttribute('aria-pressed', this.minimapEnabled ? 'true' : 'false');\n this.drawMinimap();\n return this;\n }\n\n scheduleMinimap() {\n if (this.minimapFrame || !hasWindow()) return;\n const raf =\n typeof requestAnimationFrame === 'function'\n ? requestAnimationFrame\n : (callback) => setTimeout(callback, 16);\n this.minimapFrame = raf(() => {\n this.minimapFrame = 0;\n this.drawMinimap();\n });\n }\n\n // World-to-minimap mapping covering every visible node and the viewport.\n getMinimapTransform() {\n const viewport = this.documentData.viewport;\n const width = this.canvasEl.clientWidth;\n const height = this.canvasEl.clientHeight;\n const view = {\n left: -viewport.x / viewport.scale,\n top: -viewport.y / viewport.scale,\n right: (width - viewport.x) / viewport.scale,\n bottom: (height - viewport.y) / viewport.scale,\n };\n const content = getBounds(this.getVisibleNodes());\n const left = Math.min(content.left, view.left);\n const top = Math.min(content.top, view.top);\n const spanX = Math.max(1, Math.max(content.right, view.right) - left);\n const spanY = Math.max(1, Math.max(content.bottom, view.bottom) - top);\n const padding = 8;\n const scale = Math.min(\n (MINIMAP_WIDTH - padding * 2) / spanX,\n (MINIMAP_HEIGHT - padding * 2) / spanY,\n );\n return {\n scale,\n offsetX: (MINIMAP_WIDTH - spanX * scale) / 2 - left * scale,\n offsetY: (MINIMAP_HEIGHT - spanY * scale) / 2 - top * scale,\n view,\n };\n }\n\n drawMinimap() {\n if (this.destroyed || !this.minimapEl) return;\n const nodes = this.getVisibleNodes();\n const visible =\n this.minimapEnabled &&\n nodes.length > 0 &&\n this.canvasEl.clientWidth >= MINIMAP_MIN_CANVAS_WIDTH;\n this.minimapEl.hidden = !visible;\n if (!visible) return;\n\n const transform = this.minimapDrag?.transform || this.getMinimapTransform();\n const view = this.getMinimapTransform().view;\n const map = (x, y) => ({\n x: formatNumber(x * transform.scale + transform.offsetX),\n y: formatNumber(y * transform.scale + transform.offsetY),\n });\n clearChildren(this.minimapSvg);\n nodes.forEach((node) => {\n const point = map(node.x, node.y);\n const selected = this.isNodeSelected(node.id);\n this.minimapSvg.appendChild(\n svgEl('rect', {\n class: `vd-flowchart-minimap-node${selected ? ' is-selected' : ''}`,\n x: point.x,\n y: point.y,\n width: formatNumber(Math.max(1.5, node.width * transform.scale)),\n height: formatNumber(Math.max(1.5, node.height * transform.scale)),\n rx: 1.5,\n }),\n );\n });\n const corner = map(view.left, view.top);\n this.minimapSvg.appendChild(\n svgEl('rect', {\n class: 'vd-flowchart-minimap-viewport',\n x: corner.x,\n y: corner.y,\n width: formatNumber((view.right - view.left) * transform.scale),\n height: formatNumber((view.bottom - view.top) * transform.scale),\n }),\n );\n }\n\n // Centre the main view on the world point under the minimap pointer. The\n // mapping is frozen for the whole drag so the map does not shift under it.\n handleMinimapPointer(event) {\n event.stopPropagation();\n if (event.type === 'pointerdown') {\n if (event.button != null && event.button !== 0) return;\n event.preventDefault();\n this.minimapDrag = { pointerId: event.pointerId, transform: this.getMinimapTransform() };\n try {\n this.minimapEl.setPointerCapture?.(event.pointerId);\n } catch {\n /* ignore */\n }\n }\n if (!this.minimapDrag || this.minimapDrag.pointerId !== event.pointerId) return;\n const rect = this.minimapEl.getBoundingClientRect();\n const { transform } = this.minimapDrag;\n this.centerViewOn(\n (event.clientX - rect.left - transform.offsetX) / transform.scale,\n (event.clientY - rect.top - transform.offsetY) / transform.scale,\n );\n }\n\n endMinimapDrag(event) {\n event.stopPropagation();\n if (!this.minimapDrag || this.minimapDrag.pointerId !== event.pointerId) return;\n this.minimapDrag = null;\n this.syncJsonTextarea();\n this.emitViewportChange('viewport:pan');\n this.drawMinimap();\n }\n\n centerViewOn(worldX, worldY) {\n const viewport = this.documentData.viewport;\n const width = this.canvasEl.clientWidth || 800;\n const height = this.canvasEl.clientHeight || 560;\n viewport.x = formatNumber(width / 2 - worldX * viewport.scale);\n viewport.y = formatNumber(height / 2 - worldY * viewport.scale);\n this.render({ inspector: false, json: false });\n return this;\n }\n\n toggleShortcutsHelp(force) {\n const open = typeof force === 'boolean' ? force : !this.shortcutsHelpOpen;\n this.shortcutsHelpOpen = open;\n this.shortcutsButton.setAttribute('aria-expanded', open ? 'true' : 'false');\n if (open) this.renderShortcutsHelp();\n this.shortcutsHelp.hidden = !open;\n if (!open && this.shortcutsHelp.contains(document.activeElement)) this.canvasEl.focus();\n return this;\n }\n\n renderShortcutsHelp() {\n clearChildren(this.shortcutsHelp);\n const header = createElement('div', { className: 'vd-flowchart-shortcuts-header' });\n header.appendChild(\n createElement('h4', { className: 'vd-flowchart-panel-title', text: 'Keyboard shortcuts' }),\n );\n const close = createElement('button', {\n className: 'vd-flowchart-btn vd-flowchart-icon-btn',\n text: '\u00D7',\n });\n close.setAttribute('type', 'button');\n close.setAttribute('aria-label', 'Close keyboard shortcuts');\n close.addEventListener('click', () => this.toggleShortcutsHelp(false));\n header.appendChild(close);\n this.shortcutsHelp.appendChild(header);\n\n const list = createElement('dl', { className: 'vd-flowchart-shortcuts-list' });\n getShortcutRows(this.keyboardShortcuts, this.readonly).forEach(([keys, action]) => {\n list.appendChild(createElement('dt', { text: keys }));\n list.appendChild(createElement('dd', { text: action }));\n });\n this.shortcutsHelp.appendChild(list);\n }\n\n handleArrangeChange(event) {\n if (this.readonly) return;\n const mode = event.target.value;\n if (!LAYOUT_OPTIONS.some((item) => item.value === mode)) {\n this.syncArrangeSelect();\n return;\n }\n this.layoutMode = mode;\n this.layout(mode);\n }\n\n handlePaletteClick(event) {\n if (this.readonly) return;\n const toolButton = event.target.closest('[data-tool]');\n if (toolButton) {\n const tool = toolButton.getAttribute('data-tool');\n this.setActiveTool(this.activeTool === tool ? null : tool);\n return;\n }\n const button = event.target.closest('[data-node-type]');\n if (!button) return;\n this.setActiveTool(null);\n this.addNode({ type: button.getAttribute('data-node-type') });\n }\n\n handleJsonActionClick(event) {\n const button = event.target.closest('[data-json-action]');\n if (!button) return;\n\n const action = button.getAttribute('data-json-action');\n if (action === 'refresh') {\n this.syncJsonTextarea(true);\n return;\n }\n\n if (action === 'load' && !this.readonly) {\n try {\n this.load(this.jsonTextarea.value);\n this.jsonStatus.textContent = '';\n } catch (error) {\n this.jsonStatus.textContent = error.message;\n }\n }\n }\n\n handleSelectionFieldInput(event) {\n const field = event.target.getAttribute('data-field');\n if (!field) return;\n\n if (field === 'node-text') {\n this.updateNode(\n this.selection?.id,\n { text: event.target.value },\n { inspector: false, reason: 'node:update' },\n );\n return;\n }\n\n if (field === 'edge-label') {\n this.updateEdge(\n this.selection?.id,\n { label: event.target.value },\n { inspector: false, reason: 'edge:update' },\n );\n return;\n }\n\n if (field === 'node-width' || field === 'node-height') {\n const patch =\n field === 'node-width'\n ? { width: toFiniteNumber(event.target.value, undefined) }\n : { height: toFiniteNumber(event.target.value, undefined) };\n this.updateNode(this.selection?.id, patch, { inspector: false, reason: 'node:update' });\n }\n }\n\n handleSelectionFieldChange(event) {\n const field = event.target.getAttribute('data-field');\n if (!field) return;\n\n if (field === 'node-type') {\n this.updateNode(\n this.selection?.id,\n { type: event.target.value },\n { inspector: true, reason: 'node:update' },\n );\n return;\n }\n\n if (field === 'edge-start-marker') {\n this.updateEdge(\n this.selection?.id,\n { startMarker: event.target.value },\n { inspector: true, reason: 'edge:update' },\n );\n return;\n }\n\n if (field === 'edge-end-marker') {\n this.updateEdge(\n this.selection?.id,\n { endMarker: event.target.value },\n { inspector: true, reason: 'edge:update' },\n );\n return;\n }\n\n if (field === 'edge-route') {\n this.updateEdge(\n this.selection?.id,\n { route: event.target.value },\n { inspector: true, reason: 'edge:update' },\n );\n return;\n }\n\n if (field === 'edge-stroke-preset') {\n this.updateEdge(\n this.selection?.id,\n { strokeWidth: getStrokePresetWidth(event.target.value) },\n { inspector: true, reason: 'edge:update' },\n );\n }\n }\n\n // Keys the editor consumes stop here, so page-level shortcuts (a docs\n // site's \"/\" search, a host's Escape handler) do not also fire.\n handleKeyDown(event) {\n const alreadyHandled = event.defaultPrevented;\n this.handleEditorKey(event);\n if (!alreadyHandled && event.defaultPrevented) event.stopPropagation();\n }\n\n handleEditorKey(event) {\n const target = event.target;\n if (\n target &&\n (target.tagName === 'INPUT' ||\n target.tagName === 'TEXTAREA' ||\n target.tagName === 'SELECT' ||\n target.isContentEditable)\n ) {\n return;\n }\n if (event.isComposing) return;\n\n const key = event.key;\n const modKey = event.metaKey || event.ctrlKey;\n\n if (key === 'Escape' && this.shortcutsHelpOpen) {\n event.preventDefault();\n this.toggleShortcutsHelp(false);\n return;\n }\n\n if (target === this.canvasEl && this.handleCanvasKeyDown(event)) {\n event.preventDefault();\n return;\n }\n if (this.readonly) return;\n\n if (key === 'Escape') {\n // Step back one level: tool, then edge reconnect mode, then selection.\n if (this.activeTool) this.setActiveTool(null);\n else if (this.reconnectEdgeId) {\n this.reconnectEdgeId = null;\n this.render({ inspector: false, json: false });\n } else if (this.selection) this.select(null);\n else return;\n event.preventDefault();\n return;\n }\n\n if (modKey && (key === 'd' || key === 'D')) {\n if (this.selection?.kind === 'node') {\n event.preventDefault();\n this.duplicateSelection();\n }\n return;\n }\n if (modKey && (event.key === 'z' || event.key === 'Z')) {\n event.preventDefault();\n if (event.shiftKey) {\n this.redo();\n } else {\n this.undo();\n }\n return;\n }\n if (modKey && (event.key === 'y' || event.key === 'Y')) {\n event.preventDefault();\n this.redo();\n return;\n }\n if (modKey && event.key === 'c') {\n if (this.selection) {\n event.preventDefault();\n this.copySelection();\n }\n return;\n }\n if (modKey && event.key === 'v') {\n if (this.clipboard) {\n event.preventDefault();\n this.pasteClipboard();\n }\n return;\n }\n if (modKey && event.key === 'x') {\n if (this.selection) {\n event.preventDefault();\n this.cutSelection();\n }\n return;\n }\n\n if (!this.selection) return;\n if (event.key === 'Backspace' || event.key === 'Delete') {\n event.preventDefault();\n if (this.selection.kind === 'node' && !this.hasMultiSelection()) {\n const removedId = this.selection.id;\n const parent = this.getParentNode(removedId);\n const sibling = parent\n ? this.getChildNodes(parent.id).find((node) => node.id !== removedId)\n : null;\n if (this.deleteSelection()) {\n const next = (parent && this.findNode(parent.id)) || sibling;\n if (next) this.select({ kind: 'node', id: next.id });\n }\n return;\n }\n this.deleteSelection();\n }\n }\n\n // Keys that only apply while the canvas itself has focus. Returns true when\n // the key was handled (the caller prevents the default action).\n handleCanvasKeyDown(event) {\n const key = event.key;\n const modKey = event.metaKey || event.ctrlKey;\n const mindmap = this.keyboardShortcuts === 'mindmap';\n const selectedNode = this.selection?.kind === 'node' ? this.findNode(this.selection.id) : null;\n const selectedEdge = this.selection?.kind === 'edge' ? this.findEdge(this.selection.id) : null;\n const movable = !this.readonly && Boolean(selectedNode);\n // Insertion and label keys act on one node; a group only moves or deletes.\n const editable = movable && !this.hasMultiSelection();\n\n if (key === '?' && !modKey && !event.altKey) {\n this.toggleShortcutsHelp();\n return true;\n }\n\n if (modKey && !event.altKey) {\n if (key === '=' || key === '+') return Boolean(this.zoomIn());\n if (key === '-' || key === '_') return Boolean(this.zoomOut());\n if (key === '0') return Boolean(this.zoomTo(1));\n if (key === 'a' || key === 'A') {\n this.selectNodes(this.getVisibleNodes().map((node) => node.id));\n return true;\n }\n if (key === '/' && selectedNode && !this.hasMultiSelection()) {\n this.toggleCollapsed(selectedNode.id);\n return true;\n }\n return false;\n }\n if (event.shiftKey && !event.altKey && (key === '!' || event.code === 'Digit1')) {\n return Boolean(this.fitView());\n }\n\n const direction = ARROW_DIRECTIONS[key];\n if (direction) {\n if (event.altKey) {\n if (movable) {\n this.nudgeNodes(this.getSelectedNodeIds(), direction, event.shiftKey ? 1 : this.gridSize);\n }\n return true;\n }\n if (event.shiftKey) {\n const anchorId = selectedNode?.id ?? (selectedEdge ? this.edgeCycleAnchor : null);\n return anchorId ? this.selectSideEdge(anchorId, direction) : false;\n }\n this.navigateSelection(direction);\n return true;\n }\n\n const nodes = this.getVisibleNodes();\n if ((key === 'Home' || key === 'End') && nodes.length) {\n this.selectNode(nodes[key === 'Home' ? 0 : nodes.length - 1].id);\n return true;\n }\n\n if (selectedEdge && !this.readonly && !event.altKey) {\n if (key === 'F2' || key === 'Enter' || (key === ' ' && mindmap)) {\n return this.startEdgeLabelEdit(selectedEdge.id);\n }\n if (mindmap && key.length === 1 && key !== ' ') {\n return this.startEdgeLabelEdit(selectedEdge.id, { initialText: key });\n }\n return false;\n }\n\n if (!editable || event.altKey) return false;\n\n if (key === 'F2' || (key === 'Enter' && !mindmap) || (key === ' ' && mindmap)) {\n this.startTextEdit(selectedNode.id);\n return true;\n }\n if (!mindmap) return false;\n\n if (key === 'Tab' && !event.shiftKey) {\n this.insertBranchNode(selectedNode.id, { edit: true });\n return true;\n }\n if (key === 'Enter') {\n this.insertSiblingNode(selectedNode.id, { before: event.shiftKey, edit: true });\n return true;\n }\n if (key.length === 1 && key !== ' ' && isNodeTextEditable(selectedNode)) {\n this.startTextEdit(selectedNode.id, { initialText: key });\n return true;\n }\n return false;\n }\n\n // Move the selection to the nearest node in `direction`; with nothing (or an\n // edge) selected, start from the node closest to the centre of the view.\n navigateSelection(direction) {\n const nodes = this.getVisibleNodes();\n if (!nodes.length) return false;\n const current = this.selection?.kind === 'node' ? this.findNode(this.selection.id) : null;\n const edge = this.selection?.kind === 'edge' ? this.findEdge(this.selection.id) : null;\n const next = current\n ? findSpatialNeighbor(nodes, current, direction)\n : edge\n ? this.getEdgeEndInDirection(edge, direction)\n : findNearestNode(nodes, this.getViewportCenter());\n if (!next) return false;\n this.selectNode(next.id);\n this.revealNode(next.id);\n return true;\n }\n\n // The end of `edge` that best matches `direction`, measured from the label\n // anchor so either end can be reached from a selected connection.\n getEdgeEndInDirection(edge, direction) {\n const fromNode = this.findNode(edge.from.nodeId);\n const toNode = this.findNode(edge.to.nodeId);\n if (!fromNode || !toNode) return fromNode || toNode;\n const { labelX, labelY } = buildEdgePath(edge, fromNode, toNode);\n const vector = { right: [1, 0], left: [-1, 0], down: [0, 1], up: [0, -1] }[direction];\n const score = (node) =>\n (node.x + node.width / 2 - labelX) * vector[0] +\n (node.y + node.height / 2 - labelY) * vector[1];\n return score(toNode) >= score(fromNode) ? toNode : fromNode;\n }\n\n // Connections attached to `nodeId` on the `direction` side, outgoing or\n // incoming, in document order.\n getSideEdges(nodeId, direction) {\n const port = DIRECTION_PORTS[direction];\n return this.documentData.edges.filter(\n (edge) =>\n (edge.from.nodeId === nodeId && edge.from.port === port) ||\n (edge.to.nodeId === nodeId && edge.to.port === port),\n );\n }\n\n // Select a connection on one side of a node; repeating cycles through them.\n selectSideEdge(nodeId, direction) {\n const edges = this.getSideEdges(nodeId, direction);\n if (!edges.length) return false;\n const currentIndex =\n this.selection?.kind === 'edge'\n ? edges.findIndex((edge) => edge.id === this.selection.id)\n : -1;\n const next = edges[(currentIndex + 1) % edges.length];\n this.select({ kind: 'edge', id: next.id });\n this.edgeCycleAnchor = nodeId;\n return true;\n }\n\n nudgeNode(nodeId, direction, distance) {\n const [node] = this.nudgeNodes([nodeId], direction, distance);\n return node || null;\n }\n\n // Move nodes together; repeated nudges of the same selection coalesce into\n // one undo step.\n nudgeNodes(nodeIds, direction, distance) {\n const step = { right: [1, 0], left: [-1, 0], down: [0, 1], up: [0, -1] }[direction];\n if (this.readonly || !step) return [];\n const nodes = nodeIds.map((id) => this.findNode(id)).filter(Boolean);\n if (!nodes.length) return [];\n nodes.forEach((node) => {\n node.x = formatNumber(node.x + step[0] * distance);\n node.y = formatNumber(node.y + step[1] * distance);\n });\n this.render({ inspector: true, json: true });\n this.emitChange(\n 'node:nudge',\n nodes.length > 1 ? { nodeIds: nodes.map((node) => node.id) } : { node: deepClone(nodes[0]) },\n );\n return nodes.map((node) => deepClone(node));\n }\n\n zoomTo(scale) {\n const viewport = this.documentData.viewport;\n const width = this.canvasEl.clientWidth || 800;\n const height = this.canvasEl.clientHeight || 560;\n this.scaleAround(\n clamp(formatScale(scale), this.minScale, this.maxScale) / viewport.scale,\n width / 2,\n height / 2,\n 'viewport:zoom',\n );\n return this;\n }\n\n duplicateSelection() {\n if (this.readonly || this.selection?.kind !== 'node') return null;\n if (this.hasMultiSelection()) return this.pasteNodeGroup(this.captureNodeGroup());\n const node = this.findNode(this.selection.id);\n return node ? this.pasteNodeData(node) : null;\n }\n\n // Selected nodes plus the connections that run between them.\n captureNodeGroup() {\n const ids = new Set(this.getSelectedNodeIds());\n return {\n nodes: deepClone(this.documentData.nodes.filter((node) => ids.has(node.id))),\n edges: deepClone(\n this.documentData.edges.filter(\n (edge) => ids.has(edge.from.nodeId) && ids.has(edge.to.nodeId),\n ),\n ),\n };\n }\n\n // Paste a captured group offset by one step, remapping ids so internal\n // connections follow their copies. One change, one undo step.\n pasteNodeGroup(group) {\n if (this.readonly || !group?.nodes?.length) return [];\n const usedNodeIds = new Set(this.documentData.nodes.map((node) => node.id));\n const idMap = new Map();\n const nodes = group.nodes.map((data, index) => {\n const node = normalizeNode(\n { ...data, id: undefined, x: data.x + 24, y: data.y + 24 },\n this.documentData.nodes.length + index,\n usedNodeIds,\n this.nodeSizeBounds(),\n );\n idMap.set(data.id, node.id);\n return node;\n });\n this.documentData.nodes.push(...nodes);\n const nodeIds = new Set(this.documentData.nodes.map((node) => node.id));\n const usedEdgeIds = new Set(this.documentData.edges.map((edge) => edge.id));\n group.edges.forEach((data, index) => {\n const edge = normalizeEdge(\n {\n ...data,\n id: undefined,\n from: { ...data.from, nodeId: idMap.get(data.from.nodeId) },\n to: { ...data.to, nodeId: idMap.get(data.to.nodeId) },\n },\n this.documentData.edges.length + index,\n nodeIds,\n usedEdgeIds,\n );\n if (edge) this.documentData.edges.push(edge);\n });\n const ids = nodes.map((node) => node.id);\n this.selectNodes(ids);\n this.emitChange('nodes:add', { nodeIds: ids });\n return nodes.map((node) => deepClone(node));\n }\n\n pasteNodeData(data) {\n const usedIds = new Set(this.documentData.nodes.map((node) => node.id));\n // A lone copy has no children, so it cannot stay collapsed.\n const node = normalizeNode(\n { ...data, id: undefined, collapsed: undefined, x: data.x + 24, y: data.y + 24 },\n this.documentData.nodes.length,\n usedIds,\n this.nodeSizeBounds(),\n );\n this.documentData.nodes.push(node);\n this.select({ kind: 'node', id: node.id });\n this.emitChange('node:add', { node: deepClone(node) });\n return deepClone(node);\n }\n\n copySelection() {\n if (!this.selection) return false;\n if (this.hasMultiSelection()) {\n this.clipboard = { kind: 'nodes', data: this.captureNodeGroup() };\n return true;\n }\n if (this.selection.kind === 'node') {\n const node = this.findNode(this.selection.id);\n if (!node) return false;\n this.clipboard = { kind: 'node', data: deepClone(node) };\n return true;\n }\n const edge = this.findEdge(this.selection.id);\n if (!edge) return false;\n this.clipboard = { kind: 'edge', data: deepClone(edge) };\n return true;\n }\n\n pasteClipboard() {\n if (!this.clipboard || this.readonly) return false;\n\n if (this.clipboard.kind === 'node') {\n this.pasteNodeData(this.clipboard.data);\n return true;\n }\n if (this.clipboard.kind === 'nodes') {\n const pasted = this.pasteNodeGroup(this.clipboard.data);\n // Repeated pastes keep stepping instead of stacking on one spot.\n this.clipboard = { kind: 'nodes', data: this.captureNodeGroup() };\n return pasted.length > 0;\n }\n\n const usedIds = new Set(this.documentData.edges.map((edge) => edge.id));\n const nodeIds = new Set(this.documentData.nodes.map((node) => node.id));\n const edge = normalizeEdge(\n {\n ...this.clipboard.data,\n id: undefined,\n },\n this.documentData.edges.length,\n nodeIds,\n usedIds,\n );\n if (!edge) return false;\n\n this.documentData.edges.push(edge);\n this.select({ kind: 'edge', id: edge.id });\n this.emitChange('edge:add', { edge: deepClone(edge) });\n return true;\n }\n\n cutSelection() {\n if (!this.copySelection()) return false;\n return this.deleteSelection();\n }\n\n handleDoubleClick(event) {\n if (this.readonly) return;\n\n const edgeTarget = event.target.closest('[data-edge-id]');\n if (edgeTarget && !event.target.closest('[data-edge-endpoint]')) {\n const edgeId = edgeTarget.getAttribute('data-edge-id');\n if (edgeId && this.startEdgeLabelEdit(edgeId)) {\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n }\n\n const nodeTarget = event.target.closest('[data-node-id]');\n if (\n !nodeTarget ||\n event.target.closest('[data-edge-id]') ||\n event.target.closest('[data-collapse-toggle]')\n ) {\n return;\n }\n const nodeId = nodeTarget.getAttribute('data-node-id');\n if (this.startTextEdit(nodeId)) {\n event.preventDefault();\n event.stopPropagation();\n }\n }\n\n handleClick(event) {\n if (this.readonly || event.detail < 2) return;\n const nodeTarget = event.target.closest('[data-node-id]');\n if (\n !nodeTarget ||\n event.target.closest('[data-port]') ||\n event.target.closest('[data-resize-handle]') ||\n event.target.closest('[data-collapse-toggle]')\n )\n return;\n if (this.startTextEdit(nodeTarget.getAttribute('data-node-id'))) {\n event.preventDefault();\n event.stopPropagation();\n }\n }\n\n handlePointerDown(event) {\n if (this.destroyed || (event.button != null && event.button !== 0)) return;\n\n if (this.textEditor && !event.target.closest('.vd-flowchart-text-editor')) {\n this.stopTextEdit({ commit: true });\n }\n\n this.canvasEl.focus();\n const collapseTarget = event.target.closest('[data-collapse-toggle]');\n if (collapseTarget) {\n this.lastNodePointer = null;\n this.toggleCollapsed(collapseTarget.getAttribute('data-collapse-toggle'));\n event.preventDefault();\n return;\n }\n const nodeTarget = event.target.closest('[data-node-id]');\n const portTarget = event.target.closest('[data-port]');\n const resizeTarget = event.target.closest('[data-resize-handle]');\n const edgeTarget = event.target.closest('[data-edge-id]');\n const endpointTarget = event.target.closest('[data-edge-endpoint]');\n\n if (endpointTarget && !this.readonly) {\n const edgeId = endpointTarget.getAttribute('data-edge-id');\n const endpoint = endpointTarget.getAttribute('data-edge-endpoint');\n const edge = this.findEdge(edgeId);\n if (!edge || (endpoint !== 'from' && endpoint !== 'to')) return;\n\n const fromNode = this.findNode(edge.from.nodeId);\n const toNode = this.findNode(edge.to.nodeId);\n if (!fromNode || !toNode) return;\n\n this.reconnectEdgeId = edgeId;\n this.select({ kind: 'edge', id: edgeId });\n this.interaction = {\n kind: 'reconnect',\n pointerId: event.pointerId,\n edgeId,\n endpoint,\n target: null,\n previousSnap: null,\n fromPoint: getPortPosition(fromNode, edge.from.port),\n toPoint: getPortPosition(toNode, edge.to.port),\n fromPort: edge.from.port,\n toPort: edge.to.port,\n route: edge.route,\n strokeWidth: edge.strokeWidth,\n };\n this.capturePointer(event.pointerId);\n this.syncConnectingState();\n this.render({ inspector: false, json: false });\n event.preventDefault();\n return;\n }\n\n if (nodeTarget && !portTarget && !resizeTarget && !edgeTarget && event.shiftKey) {\n this.reconnectEdgeId = null;\n this.lastNodePointer = null;\n this.toggleNodeSelection(nodeTarget.getAttribute('data-node-id'));\n event.preventDefault();\n return;\n }\n\n if (nodeTarget && !portTarget && !resizeTarget && !edgeTarget && !this.readonly) {\n if (this.activeTool === 'arrow') {\n this.select({ kind: 'node', id: nodeTarget.getAttribute('data-node-id') });\n event.preventDefault();\n return;\n }\n const nodeId = nodeTarget.getAttribute('data-node-id');\n const now = Date.now();\n const repeatedNodeClick =\n this.lastNodePointer &&\n this.lastNodePointer.nodeId === nodeId &&\n now - this.lastNodePointer.time <= 420;\n this.lastNodePointer = { nodeId, time: now };\n if ((event.detail >= 2 || repeatedNodeClick) && this.startTextEdit(nodeId)) {\n event.preventDefault();\n return;\n }\n } else {\n this.lastNodePointer = null;\n }\n\n if (portTarget && !this.readonly) {\n const nodeId = portTarget.getAttribute('data-node-id');\n const port = portTarget.getAttribute('data-port');\n const node = this.findNode(nodeId);\n if (!node) return;\n\n const sourcePoint = getPortPosition(node, port);\n this.interaction = {\n kind: 'connect',\n pointerId: event.pointerId,\n startClientX: event.clientX,\n startClientY: event.clientY,\n moved: false,\n source: { nodeId, port },\n target: null,\n previousSnap: null,\n fromPoint: sourcePoint,\n toPoint: sourcePoint,\n fromPort: port,\n toPort: 'left',\n route: DEFAULT_EDGE_ROUTE,\n strokeWidth: DEFAULT_EDGE_STROKE_WIDTH,\n };\n this.select({ kind: 'node', id: nodeId });\n this.capturePointer(event.pointerId);\n this.syncConnectingState();\n this.render({ inspector: false, json: false });\n event.preventDefault();\n return;\n }\n\n if (resizeTarget && !this.readonly) {\n const nodeId = resizeTarget.getAttribute('data-node-id');\n const handle = resizeTarget.getAttribute('data-resize-handle');\n const node = this.findNode(nodeId);\n if (!node || !RESIZE_HANDLES.includes(handle)) return;\n\n this.select({ kind: 'node', id: nodeId });\n this.interaction = {\n kind: 'resize-node',\n pointerId: event.pointerId,\n nodeId,\n handle,\n startWorld: this.clientToWorld(event.clientX, event.clientY),\n original: deepClone(node),\n moved: false,\n };\n this.capturePointer(event.pointerId);\n event.preventDefault();\n return;\n }\n\n if (edgeTarget) {\n const edgeId = edgeTarget.getAttribute('data-edge-id');\n if (!this.readonly) {\n this.reconnectEdgeId = edgeId;\n } else if (this.reconnectEdgeId && this.reconnectEdgeId !== edgeId) {\n this.reconnectEdgeId = null;\n }\n this.select({ kind: 'edge', id: edgeId });\n event.preventDefault();\n return;\n }\n\n if (nodeTarget) {\n this.reconnectEdgeId = null;\n const nodeId = nodeTarget.getAttribute('data-node-id');\n // Pressing a node that is part of a group keeps the group and drags it.\n const groupIds =\n this.hasMultiSelection() && this.isNodeSelected(nodeId)\n ? this.getSelectedNodeIds()\n : [nodeId];\n if (groupIds.length > 1) this.selectNodes(groupIds, { primary: nodeId });\n else this.select({ kind: 'node', id: nodeId });\n\n if (!this.readonly) {\n this.interaction = this.createDragInteraction(event, nodeId, groupIds);\n this.capturePointer(event.pointerId);\n }\n\n return;\n }\n\n if (event.shiftKey) {\n const startWorld = this.clientToWorld(event.clientX, event.clientY);\n this.interaction = {\n kind: 'marquee',\n pointerId: event.pointerId,\n startWorld,\n baseIds: this.selection?.kind === 'node' ? this.getSelectedNodeIds() : [],\n };\n this.capturePointer(event.pointerId);\n event.preventDefault();\n return;\n }\n\n this.select(null);\n this.reconnectEdgeId = null;\n this.interaction = {\n kind: 'pan',\n pointerId: event.pointerId,\n startClientX: event.clientX,\n startClientY: event.clientY,\n startViewportX: this.documentData.viewport.x,\n startViewportY: this.documentData.viewport.y,\n moved: false,\n };\n this.capturePointer(event.pointerId);\n event.preventDefault();\n }\n\n createDragInteraction(event, nodeId, nodeIds) {\n const nodes = nodeIds.map((id) => this.findNode(id)).filter(Boolean);\n const moving = new Set(nodes.map((node) => node.id));\n return {\n kind: 'drag-node',\n pointerId: event.pointerId,\n nodeId,\n nodeIds: nodes.map((node) => node.id),\n startWorld: this.clientToWorld(event.clientX, event.clientY),\n origins: new Map(nodes.map((node) => [node.id, { x: node.x, y: node.y }])),\n bounds: getBounds(nodes),\n guideLines: this.snapGuides\n ? collectGuideLines(this.getVisibleNodes().filter((node) => !moving.has(node.id)))\n : null,\n snapDisabled: false,\n moved: false,\n };\n }\n\n // Translate every dragged node by the pointer delta, snapping the group's\n // bounds to the nearest alignment guide on each axis. Alt turns snapping\n // off for the rest of the gesture.\n moveDraggedNodes(event) {\n const interaction = this.interaction;\n const world = this.clientToWorld(event.clientX, event.clientY);\n let dx = world.x - interaction.startWorld.x;\n let dy = world.y - interaction.startWorld.y;\n if (event.altKey) interaction.snapDisabled = true;\n\n let guides = [];\n if (interaction.guideLines && !interaction.snapDisabled) {\n const box = interaction.bounds;\n const threshold = GUIDE_SNAP_DISTANCE / this.documentData.viewport.scale;\n const left = box.left + dx;\n const top = box.top + dy;\n const width = box.right - box.left;\n const height = box.bottom - box.top;\n const snapX = snapToGuides(\n interaction.guideLines.x,\n [left, left + width / 2, left + width],\n threshold,\n );\n const snapY = snapToGuides(\n interaction.guideLines.y,\n [top, top + height / 2, top + height],\n threshold,\n );\n if (snapX) dx += snapX.offset;\n if (snapY) dy += snapY.offset;\n const snapped = { left: box.left + dx, top: box.top + dy, width, height };\n if (snapX) guides = guides.concat(guideSegments('x', snapX.lines, snapped));\n if (snapY) guides = guides.concat(guideSegments('y', snapY.lines, snapped));\n }\n\n let changed = false;\n interaction.nodeIds.forEach((id) => {\n const node = this.findNode(id);\n const origin = interaction.origins.get(id);\n if (!node || !origin) return;\n const nextX = formatNumber(origin.x + dx);\n const nextY = formatNumber(origin.y + dy);\n if (nextX === node.x && nextY === node.y) return;\n node.x = nextX;\n node.y = nextY;\n changed = true;\n this.renderDraggedNode(node);\n });\n if (changed) interaction.moved = true;\n this.renderGuides(guides);\n }\n\n // Live marquee: select every visible node the box touches, added to the\n // selection the gesture started from.\n updateMarquee(event) {\n const interaction = this.interaction;\n const world = this.clientToWorld(event.clientX, event.clientY);\n const box = {\n left: Math.min(interaction.startWorld.x, world.x),\n top: Math.min(interaction.startWorld.y, world.y),\n right: Math.max(interaction.startWorld.x, world.x),\n bottom: Math.max(interaction.startWorld.y, world.y),\n };\n clearChildren(this.guidesLayer);\n this.guidesLayer.appendChild(\n svgEl('rect', {\n class: 'vd-flowchart-marquee',\n x: formatNumber(box.left),\n y: formatNumber(box.top),\n width: formatNumber(box.right - box.left),\n height: formatNumber(box.bottom - box.top),\n }),\n );\n const hits = this.getVisibleNodes()\n .filter(\n (node) =>\n node.x <= box.right &&\n node.x + node.width >= box.left &&\n node.y <= box.bottom &&\n node.y + node.height >= box.top,\n )\n .map((node) => node.id);\n const ids = [...new Set([...interaction.baseIds, ...hits])];\n const key = ids.join(',');\n if (key === interaction.lastKey) return;\n interaction.lastKey = key;\n this.selectNodes(ids, { primary: hits[hits.length - 1] });\n }\n\n renderGuides(guides) {\n clearChildren(this.guidesLayer);\n guides.forEach((guide) => {\n this.guidesLayer.appendChild(\n svgEl('line', {\n class: 'vd-flowchart-guide',\n x1: guide.x1,\n y1: guide.y1,\n x2: guide.x2,\n y2: guide.y2,\n }),\n );\n });\n }\n\n handlePointerMove(event) {\n if (!this.interaction || this.interaction.pointerId !== event.pointerId) return;\n\n if (this.interaction.kind === 'drag-node') {\n this.moveDraggedNodes(event);\n return;\n }\n\n if (this.interaction.kind === 'marquee') {\n this.updateMarquee(event);\n return;\n }\n\n if (this.interaction.kind === 'resize-node') {\n const node = this.findNode(this.interaction.nodeId);\n if (!node) return;\n const world = this.clientToWorld(event.clientX, event.clientY);\n const deltaX = world.x - this.interaction.startWorld.x;\n const deltaY = world.y - this.interaction.startWorld.y;\n const next = this.getResizedNodeBounds(\n this.interaction.original,\n this.interaction.handle,\n deltaX,\n deltaY,\n );\n\n if (\n next.x !== node.x ||\n next.y !== node.y ||\n next.width !== node.width ||\n next.height !== node.height\n ) {\n node.x = next.x;\n node.y = next.y;\n node.width = next.width;\n node.height = next.height;\n this.interaction.moved = true;\n this.render({ inspector: false, json: false });\n }\n return;\n }\n\n if (this.interaction.kind === 'pan') {\n const deltaX = event.clientX - this.interaction.startClientX;\n const deltaY = event.clientY - this.interaction.startClientY;\n this.documentData.viewport.x = formatNumber(this.interaction.startViewportX + deltaX);\n this.documentData.viewport.y = formatNumber(this.interaction.startViewportY + deltaY);\n this.interaction.moved = true;\n this.render({ inspector: false, json: false });\n return;\n }\n\n if (this.interaction.kind === 'connect') {\n if (!this.interaction.moved) {\n const travel = Math.hypot(\n event.clientX - this.interaction.startClientX,\n event.clientY - this.interaction.startClientY,\n );\n if (!(travel > PORT_CLICK_SLOP)) return;\n this.interaction.moved = true;\n }\n const world = this.clientToWorld(event.clientX, event.clientY);\n const snapTarget = this.findConnectionTarget(\n world,\n this.interaction.source.nodeId,\n this.interaction.previousSnap,\n this.interaction.fromPoint,\n );\n if (snapTarget) {\n this.interaction.target = { nodeId: snapTarget.node.id, port: snapTarget.port };\n this.interaction.toPoint = snapTarget.point;\n this.interaction.toPort = snapTarget.port;\n this.interaction.previousSnap = { nodeId: snapTarget.node.id, port: snapTarget.port };\n this.render({ inspector: false, json: false });\n return;\n }\n\n this.interaction.target = null;\n this.interaction.toPoint = world;\n this.interaction.toPort = this.interaction.toPort || 'left';\n this.interaction.previousSnap = null;\n this.render({ inspector: false, json: false });\n return;\n }\n\n if (this.interaction.kind === 'reconnect') {\n const edge = this.findEdge(this.interaction.edgeId);\n if (!edge) return;\n\n const world = this.clientToWorld(event.clientX, event.clientY);\n const snapTarget = this.findConnectionTarget(\n world,\n null,\n this.interaction.previousSnap,\n this.interaction.endpoint === 'from'\n ? this.interaction.toPoint\n : this.interaction.fromPoint,\n );\n\n if (this.interaction.endpoint === 'from') {\n const toNode = this.findNode(edge.to.nodeId);\n if (!toNode) return;\n this.interaction.toPoint = getPortPosition(toNode, edge.to.port);\n this.interaction.toPort = edge.to.port;\n if (snapTarget) {\n this.interaction.target = { nodeId: snapTarget.node.id, port: snapTarget.port };\n this.interaction.fromPoint = snapTarget.point;\n this.interaction.fromPort = snapTarget.port;\n this.interaction.previousSnap = { nodeId: snapTarget.node.id, port: snapTarget.port };\n } else {\n this.interaction.target = null;\n this.interaction.fromPoint = world;\n this.interaction.fromPort = this.interaction.fromPort || edge.from.port;\n this.interaction.previousSnap = null;\n }\n } else {\n const fromNode = this.findNode(edge.from.nodeId);\n if (!fromNode) return;\n this.interaction.fromPoint = getPortPosition(fromNode, edge.from.port);\n this.interaction.fromPort = edge.from.port;\n if (snapTarget) {\n this.interaction.target = { nodeId: snapTarget.node.id, port: snapTarget.port };\n this.interaction.toPoint = snapTarget.point;\n this.interaction.toPort = snapTarget.port;\n this.interaction.previousSnap = { nodeId: snapTarget.node.id, port: snapTarget.port };\n } else {\n this.interaction.target = null;\n this.interaction.toPoint = world;\n this.interaction.toPort = this.interaction.toPort || edge.to.port;\n this.interaction.previousSnap = null;\n }\n }\n\n this.render({ inspector: false, json: false });\n }\n }\n\n handlePointerUp(event) {\n if (\n !this.interaction ||\n (event.pointerId != null && this.interaction.pointerId !== event.pointerId)\n ) {\n return;\n }\n\n const interaction = this.interaction;\n this.interaction = null;\n this.releasePointerCapture(interaction.pointerId);\n this.syncConnectingState();\n\n if (interaction.kind === 'resize-node') {\n if (interaction.moved) {\n const node = this.findNode(interaction.nodeId);\n this.render({ inspector: true, json: true });\n this.emitChange('node:resize', { node: deepClone(node) });\n } else {\n this.render({ inspector: false, json: false });\n }\n return;\n }\n\n if (interaction.kind === 'marquee') {\n clearChildren(this.guidesLayer);\n return;\n }\n\n if (interaction.kind === 'drag-node') {\n clearChildren(this.guidesLayer);\n if (interaction.moved) {\n this.render({ inspector: true, json: true });\n if (interaction.nodeIds.length > 1) {\n this.emitChange('nodes:move', { nodeIds: [...interaction.nodeIds] });\n } else {\n this.emitChange('node:move', { node: deepClone(this.findNode(interaction.nodeId)) });\n }\n } else {\n this.render({ inspector: false, json: false });\n }\n return;\n }\n\n if (interaction.kind === 'pan') {\n if (interaction.moved) {\n this.render({ inspector: false, json: true });\n this.emitViewportChange('viewport:pan');\n } else {\n this.render({ inspector: false, json: false });\n }\n return;\n }\n\n if (interaction.kind === 'connect') {\n if (!interaction.moved && this.activeTool !== 'arrow') {\n this.render({ inspector: false, json: false });\n this.insertBranchNode(interaction.source.nodeId, {\n direction: PORT_DIRECTIONS[interaction.source.port],\n edit: true,\n });\n return;\n }\n const world = this.clientToWorld(event.clientX || 0, event.clientY || 0);\n const snapTarget = interaction.target\n ? { node: this.findNode(interaction.target.nodeId), port: interaction.target.port }\n : this.findConnectionTarget(\n world,\n interaction.source.nodeId,\n interaction.previousSnap,\n interaction.fromPoint,\n );\n if (snapTarget && snapTarget.node) {\n const edge = this.addEdge({\n from: interaction.source,\n to: {\n nodeId: snapTarget.node.id,\n port: snapTarget.port,\n },\n strokeWidth: interaction.strokeWidth,\n endMarker: 'arrow',\n });\n if (edge) {\n if (this.activeTool === 'arrow') this.setActiveTool(null);\n this.syncConnectingState();\n return;\n }\n }\n\n if (this.activeTool === 'arrow') this.setActiveTool(null);\n this.syncConnectingState();\n this.render({ inspector: false, json: false });\n return;\n }\n\n if (interaction.kind === 'reconnect') {\n const edge = this.findEdge(interaction.edgeId);\n if (edge && interaction.target) {\n const patch =\n interaction.endpoint === 'from'\n ? { from: { nodeId: interaction.target.nodeId, port: interaction.target.port } }\n : { to: { nodeId: interaction.target.nodeId, port: interaction.target.port } };\n const nextFrom = patch.from || edge.from;\n const nextTo = patch.to || edge.to;\n if (!(nextFrom.nodeId === nextTo.nodeId && nextFrom.port === nextTo.port)) {\n this.updateEdge(interaction.edgeId, patch, { inspector: true, reason: 'edge:reconnect' });\n } else {\n this.render({ inspector: false, json: false });\n }\n } else {\n this.render({ inspector: false, json: false });\n }\n this.reconnectEdgeId = interaction.edgeId;\n this.syncConnectingState();\n return;\n }\n }\n\n handleWheel(event) {\n event.preventDefault();\n const local = this.clientToLocal(event.clientX, event.clientY);\n const factor = event.deltaY > 0 ? 1 / 1.12 : 1.12;\n this.scaleAround(factor, local.x, local.y, 'viewport:zoom');\n }\n\n capturePointer(pointerId) {\n if (typeof this.canvasEl.setPointerCapture !== 'function') return;\n try {\n this.canvasEl.setPointerCapture(pointerId);\n } catch {\n /* ignore */\n }\n }\n\n releasePointerCapture(pointerId) {\n if (typeof this.canvasEl.releasePointerCapture !== 'function') return;\n try {\n this.canvasEl.releasePointerCapture(pointerId);\n } catch {\n /* ignore */\n }\n }\n\n syncConnectingState() {\n const connecting =\n this.interaction?.kind === 'connect' || this.interaction?.kind === 'reconnect';\n this.canvasEl.classList.toggle('is-connecting', connecting);\n }\n\n shouldShowNodePorts(node) {\n if (this.readonly) return false;\n if (this.interaction?.kind === 'connect' || this.interaction?.kind === 'reconnect') return true;\n if (this.activeTool === 'arrow') return true;\n return (\n this.selection?.kind === 'node' && this.selection.id === node.id && !this.hasMultiSelection()\n );\n }\n\n getMarkerId(markerType, position, strokeWidth, edgeScale = 1) {\n const width = normalizeEdgeStrokeWidth(strokeWidth);\n // Two decimals, not four: a resize drag changes the scale every frame, and\n // a four-decimal key would leave an orphan marker for each pointer move.\n const scale = clamp(formatNumber(Math.max(edgeScale, 0.01)), 0.01, 1);\n const key = `${markerType}:${position}:${width}:${scale}`;\n if (this.markerIds.has(key)) {\n return this.markerIds.get(key);\n }\n\n const markerId = nextId(`flowchart-${markerType}-${position}`);\n const marker =\n markerType === 'dot'\n ? createDotMarker(markerId, width, scale)\n : createArrowMarker(markerId, width, position === 'start', scale);\n this.markerDefs.appendChild(marker);\n this.markerIds.set(key, markerId);\n return markerId;\n }\n\n getEdgeStrokeWidth(edge) {\n return normalizeEdgeStrokeWidth(edge?.strokeWidth);\n }\n\n getEdgeHitStrokeWidth(edge, edgeScale = 1) {\n const visual = clamp(toFiniteNumber(edgeScale, 1), 0.01, 1);\n const base = this.getEdgeStrokeWidth(edge);\n const view = Math.max(this.documentData?.viewport?.scale || 1, 0.0001);\n const legacy = Math.max(EDGE_HIT_STROKE_MIN, base + 12);\n if (visual >= 0.999 && view >= DEFAULT_MIN_SCALE && view <= DEFAULT_MAX_SCALE) {\n return formatNumber(legacy);\n }\n return formatNumber(Math.max(base * visual, EDGE_HIT_STROKE_MIN / view));\n }\n\n findConnectionTarget(worldPoint, excludeNodeId, previousSnap = null, referencePoint = null) {\n const snapPadding = CONNECTION_SNAP_PADDING / this.documentData.viewport.scale;\n const hysteresisMargin = CONNECTION_HYSTERESIS / this.documentData.viewport.scale;\n\n const best = this.getVisibleNodes().reduce((candidate, node) => {\n if (node.id === excludeNodeId) return candidate;\n const distanceToBounds = getDistanceToNodeBounds(node, worldPoint);\n if (distanceToBounds > snapPadding) return candidate;\n const nearest = pickPortForNode(node, worldPoint, referencePoint);\n if (!nearest) return candidate;\n const score = distanceToBounds * 1000 + nearest.distance;\n if (!candidate || score < candidate.score) {\n return {\n node,\n port: nearest.port,\n point: nearest.point,\n score,\n };\n }\n return candidate;\n }, null);\n\n if (!previousSnap || !best) return best;\n\n const previousNode = this.findNode(previousSnap.nodeId);\n if (!previousNode || previousNode.id === excludeNodeId) return best;\n\n const distanceToBounds = getDistanceToNodeBounds(previousNode, worldPoint);\n if (distanceToBounds > snapPadding) return best;\n\n if (best.node.id === previousSnap.nodeId && best.port === previousSnap.port) {\n return best;\n }\n\n const previousPoint = getPortPosition(previousNode, previousSnap.port);\n const previousScore =\n distanceToBounds * 1000 +\n Math.hypot(worldPoint.x - previousPoint.x, worldPoint.y - previousPoint.y);\n if (best.score + hysteresisMargin >= previousScore) {\n return {\n node: previousNode,\n port: previousSnap.port,\n point: previousPoint,\n score: previousScore,\n };\n }\n\n return best;\n }\n\n getResizedNodeBounds(original, handle, deltaX, deltaY) {\n const nextType = original.type;\n if (!isNodeResizable(nextType)) {\n return {\n x: formatNumber(original.x),\n y: formatNumber(original.y),\n width: formatNumber(original.width),\n height: formatNumber(original.height),\n };\n }\n\n let x = original.x;\n let y = original.y;\n let width = original.width;\n let height = original.height;\n\n if (handle.includes('e')) {\n width = clampNodeWidth(\n nextType,\n original.width + deltaX,\n original.width,\n this.nodeSizeBounds(),\n );\n }\n if (handle.includes('s')) {\n height = clampNodeHeight(\n nextType,\n original.height + deltaY,\n original.height,\n this.nodeSizeBounds(),\n );\n }\n if (handle.includes('w')) {\n width = clampNodeWidth(\n nextType,\n original.width - deltaX,\n original.width,\n this.nodeSizeBounds(),\n );\n x = original.x + original.width - width;\n }\n if (handle.includes('n')) {\n height = clampNodeHeight(\n nextType,\n original.height - deltaY,\n original.height,\n this.nodeSizeBounds(),\n );\n y = original.y + original.height - height;\n }\n\n return {\n x: formatNumber(x),\n y: formatNumber(y),\n width: formatNumber(width),\n height: formatNumber(height),\n };\n }\n\n clientToLocal(clientX, clientY) {\n const rect = this.canvasEl.getBoundingClientRect();\n return {\n x: clientX - rect.left,\n y: clientY - rect.top,\n };\n }\n\n localToWorld(localX, localY) {\n const viewport = this.documentData.viewport;\n return {\n x: (localX - viewport.x) / viewport.scale,\n y: (localY - viewport.y) / viewport.scale,\n };\n }\n\n clientToWorld(clientX, clientY) {\n const local = this.clientToLocal(clientX, clientY);\n return this.localToWorld(local.x, local.y);\n }\n\n getViewportCenter() {\n const width = this.canvasEl.clientWidth || 800;\n const height = this.canvasEl.clientHeight || 560;\n return this.localToWorld(width / 2, height / 2);\n }\n\n scaleAround(factor, localX, localY, reason) {\n const viewport = this.documentData.viewport;\n const anchor = this.localToWorld(localX, localY);\n const nextScale = clamp(formatScale(viewport.scale * factor), this.minScale, this.maxScale);\n if (nextScale === viewport.scale) return;\n\n viewport.scale = nextScale;\n viewport.x = formatNumber(localX - anchor.x * nextScale);\n viewport.y = formatNumber(localY - anchor.y * nextScale);\n\n this.render({ inspector: false, json: true });\n this.emitViewportChange(reason);\n }\n\n updateToolbarLabel() {\n this.zoomLabel.textContent = `${Math.round(this.documentData.viewport.scale * 100)}%`;\n }\n\n // Options: `initialText` replaces the label with typed text (type-to-edit);\n // `inserted` marks a node created by a keyboard/handle insertion so naming it\n // shares the insertion's undo step.\n startTextEdit(nodeId, options = {}) {\n if (this.readonly) return false;\n const node = this.findNode(nodeId);\n if (!node || !isNodeTextEditable(node)) return false;\n\n if (this.textEditor?.nodeId === node.id) {\n this.positionTextEditor();\n this.textEditor.textarea.focus();\n this.textEditor.textarea.select();\n return true;\n }\n\n this.stopTextEdit({ commit: true });\n this.select({ kind: 'node', id: node.id });\n\n const replacing = typeof options.initialText === 'string';\n const textarea = createElement('textarea', {\n className: `vd-flowchart-text-editor vd-flowchart-text-editor--${node.type}`,\n value: replacing ? options.initialText : node.text,\n rows: 1,\n });\n textarea.setAttribute('data-node-id', node.id);\n textarea.setAttribute('aria-label', 'Edit node text');\n textarea.spellcheck = false;\n\n textarea.addEventListener('input', () => this.positionTextEditor());\n textarea.addEventListener('pointerdown', (event) => event.stopPropagation());\n textarea.addEventListener('dblclick', (event) => event.stopPropagation());\n textarea.addEventListener('keydown', (event) => this.handleTextEditorKeyDown(event, node));\n textarea.addEventListener('blur', () => {\n if (this.textEditor?.textarea === textarea) {\n this.stopTextEdit({ commit: true });\n }\n });\n\n this.textEditor = {\n nodeId: node.id,\n previousText: node.text,\n inserted: Boolean(options.inserted),\n textarea,\n };\n this.canvasEl.appendChild(textarea);\n this.render({ inspector: true, json: false });\n\n const focusEditor = () => {\n if (this.textEditor?.textarea !== textarea) return;\n textarea.focus();\n if (replacing) {\n textarea.setSelectionRange(textarea.value.length, textarea.value.length);\n } else {\n textarea.select();\n }\n };\n // Typed characters must land in the editor, so focus it synchronously;\n // the frame callback only restores focus if the browser moved it, so it\n // never re-selects text the user has already started typing.\n focusEditor();\n window.requestAnimationFrame(() => {\n if (document.activeElement !== textarea) focusEditor();\n });\n\n return true;\n }\n\n // Inline label editor for a connection, placed on the label anchor\n // (curve midpoint). Labels render on one line, so Enter always saves.\n startEdgeLabelEdit(edgeId, options = {}) {\n if (this.readonly) return false;\n const edge = this.findEdge(sanitizeId(edgeId));\n if (!edge) return false;\n this.stopTextEdit({ commit: true });\n this.select({ kind: 'edge', id: edge.id });\n\n const replacing = typeof options.initialText === 'string';\n const textarea = createElement('textarea', {\n className: 'vd-flowchart-text-editor vd-flowchart-text-editor--edge',\n value: replacing ? options.initialText : edge.label,\n rows: 1,\n });\n textarea.setAttribute('data-edge-id', edge.id);\n textarea.setAttribute('aria-label', 'Edit connection label');\n textarea.spellcheck = false;\n textarea.addEventListener('input', () => this.positionTextEditor());\n textarea.addEventListener('pointerdown', (event) => event.stopPropagation());\n textarea.addEventListener('dblclick', (event) => event.stopPropagation());\n textarea.addEventListener('keydown', (event) => {\n if (event.isComposing) return;\n if (event.key === 'Escape' || event.key === 'Enter') {\n event.preventDefault();\n this.stopTextEdit({ commit: event.key === 'Enter' });\n this.canvasEl.focus();\n }\n });\n textarea.addEventListener('blur', () => {\n if (this.textEditor?.textarea === textarea) this.stopTextEdit({ commit: true });\n });\n\n this.textEditor = { nodeId: null, edgeId: edge.id, previousText: edge.label, textarea };\n this.canvasEl.appendChild(textarea);\n this.render({ inspector: true, json: false });\n\n const focusEditor = () => {\n if (this.textEditor?.textarea !== textarea) return;\n textarea.focus();\n if (replacing) textarea.setSelectionRange(textarea.value.length, textarea.value.length);\n else textarea.select();\n };\n focusEditor();\n window.requestAnimationFrame(() => {\n if (document.activeElement !== textarea) focusEditor();\n });\n return true;\n }\n\n handleTextEditorKeyDown(event, node) {\n if (event.isComposing) return;\n const mindmap = this.keyboardShortcuts === 'mindmap';\n if (event.key === 'Escape') {\n event.preventDefault();\n this.stopTextEdit({ commit: false });\n this.canvasEl.focus();\n return;\n }\n if (event.key === 'Enter') {\n const modKey = event.ctrlKey || event.metaKey;\n const commits = modKey || (mindmap && node.type !== 'textbox' && !event.shiftKey);\n if (!commits) return;\n event.preventDefault();\n this.stopTextEdit({ commit: true });\n this.canvasEl.focus();\n return;\n }\n if (event.key === 'Tab' && mindmap && !event.shiftKey && !event.altKey && !event.ctrlKey) {\n event.preventDefault();\n this.stopTextEdit({ commit: true });\n this.canvasEl.focus();\n this.insertBranchNode(node.id, { edit: true });\n }\n }\n\n stopTextEdit(options = {}) {\n if (!this.textEditor) return false;\n const commit = options.commit !== false;\n const editor = this.textEditor;\n const nextText = editor.textarea.value;\n this.textEditor = null;\n editor.textarea.remove();\n\n if (editor.edgeId) {\n const label = nextText.replace(/\\s*\\n\\s*/g, ' ').trim();\n if (commit && !this.readonly && label !== editor.previousText) {\n this.updateEdge(editor.edgeId, { label }, { inspector: true, reason: 'edge:update' });\n } else {\n this.render({ scene: true, inspector: false, json: false });\n }\n return true;\n }\n\n if (commit && !this.readonly && nextText !== editor.previousText) {\n this.coalesceInsertedText = editor.inserted;\n try {\n this.updateNode(\n editor.nodeId,\n { text: nextText },\n { inspector: true, reason: 'node:update' },\n );\n } finally {\n this.coalesceInsertedText = false;\n }\n } else {\n this.render({ scene: true, inspector: false, json: false });\n }\n\n return true;\n }\n\n positionTextEditor() {\n if (!this.textEditor) return;\n if (this.textEditor.edgeId) {\n this.positionEdgeLabelEditor();\n return;\n }\n const node = this.findNode(this.textEditor.nodeId);\n if (!node) {\n this.stopTextEdit({ commit: false });\n return;\n }\n\n const viewport = this.documentData.viewport;\n const scale = viewport.scale;\n const visual = nodeVisualScale(node);\n const textarea = this.textEditor.textarea;\n const width = node.width * scale;\n const height = node.height * scale;\n const metrics = getNodeFontMetrics(node);\n const lineHeight = metrics.lineHeight * visual * scale;\n const lineCount = Math.max(1, textarea.value.split(/\\r?\\n/).length);\n const horizontalPadding = (node.type === 'textbox' ? 16 : 12) * visual * scale;\n const verticalPadding =\n node.type === 'textbox'\n ? 12 * visual * scale\n : Math.max(4 * visual, (height - lineCount * lineHeight) / 2);\n\n textarea.style.left = `${formatNumber(viewport.x + node.x * scale)}px`;\n textarea.style.top = `${formatNumber(viewport.y + node.y * scale)}px`;\n textarea.style.width = `${formatNumber(width)}px`;\n textarea.style.height = `${formatNumber(height)}px`;\n textarea.style.fontSize = `${formatNumber(metrics.fontSize * visual * scale)}px`;\n textarea.style.lineHeight = `${formatNumber(lineHeight)}px`;\n textarea.style.padding = `${formatNumber(verticalPadding)}px ${formatNumber(horizontalPadding)}px`;\n }\n\n positionEdgeLabelEditor() {\n const edge = this.findEdge(this.textEditor.edgeId);\n const fromNode = edge && this.findNode(edge.from.nodeId);\n const toNode = edge && this.findNode(edge.to.nodeId);\n if (!edge || !fromNode || !toNode) {\n this.stopTextEdit({ commit: false });\n return;\n }\n const visual = edgeVisualScale(fromNode, toNode);\n const { labelX, labelY } = buildEdgePath(edge, fromNode, toNode);\n const viewport = this.documentData.viewport;\n const textarea = this.textEditor.textarea;\n const fontSize = Math.max(11 * visual, 13 * visual * viewport.scale);\n const width = clamp(textarea.value.length * fontSize * 0.62 + 28 * visual, 96 * visual, 280);\n const height = fontSize * 1.4 + 12 * visual;\n const labelOffset = 8 * visual;\n textarea.style.left = `${formatNumber(viewport.x + labelX * viewport.scale - width / 2)}px`;\n textarea.style.top = `${formatNumber(viewport.y + (labelY - labelOffset) * viewport.scale - height / 2)}px`;\n textarea.style.width = `${formatNumber(width)}px`;\n textarea.style.height = `${formatNumber(height)}px`;\n textarea.style.fontSize = `${formatNumber(fontSize)}px`;\n textarea.style.lineHeight = `${formatNumber(fontSize * 1.4)}px`;\n textarea.style.padding = '6px 10px';\n }\n\n render(options = {}) {\n if (this.destroyed) return;\n this.syncGrid();\n\n const shouldRenderScene = options.scene !== false;\n const shouldRenderInspector = options.inspector !== false;\n const shouldRenderJson = options.json !== false;\n\n if (shouldRenderScene) this.renderScene();\n if (shouldRenderInspector) this.renderSelectionPanel();\n if (shouldRenderJson) this.syncJsonTextarea();\n if (shouldRenderInspector) this.renderGraphOutline();\n this.updateToolbarLabel();\n this.updatePaletteState();\n this.positionTextEditor();\n this.scheduleMinimap();\n }\n\n renderScene() {\n this.syncSelectedNodeIds();\n const viewport = this.documentData.viewport;\n this.world.setAttribute(\n 'transform',\n `matrix(${viewport.scale} 0 0 ${viewport.scale} ${viewport.x} ${viewport.y})`,\n );\n\n clearChildren(this.edgesLayer);\n clearChildren(this.previewLayer);\n clearChildren(this.nodesLayer);\n clearChildren(this.overlayLayer);\n clearChildren(this.markerDefs);\n this.markerIds = new Map();\n\n const hidden = this.getHiddenNodeIds();\n this.sceneHidden = hidden;\n this.sceneOutgoing = this.getOutgoingMap();\n const nodeMap = new Map(\n this.documentData.nodes.filter((node) => !hidden.has(node.id)).map((node) => [node.id, node]),\n );\n this.sceneNodeMap = nodeMap;\n this.nodeElements = new Map();\n this.edgeElements = new Map();\n this.incidentEdges = new Map();\n\n this.documentData.edges.forEach((edge) => {\n const edgeElement = this.renderEdge(edge, nodeMap);\n if (edgeElement) {\n this.edgesLayer.appendChild(edgeElement);\n this.edgeElements.set(edge.id, edgeElement);\n for (const id of new Set([edge.from.nodeId, edge.to.nodeId])) {\n if (!this.incidentEdges.has(id)) this.incidentEdges.set(id, []);\n this.incidentEdges.get(id).push(edge);\n }\n }\n });\n\n if (this.interaction?.kind === 'connect' || this.interaction?.kind === 'reconnect') {\n this.previewLayer.appendChild(this.renderPreviewEdge(this.interaction));\n }\n\n this.documentData.nodes.forEach((node) => {\n if (hidden.has(node.id)) return;\n const element = this.renderNode(node);\n this.nodesLayer.appendChild(element);\n this.nodeElements.set(node.id, element);\n });\n\n if (this.reconnectEdgeId && !this.readonly) {\n const reconnectEdge = this.findEdge(this.reconnectEdgeId);\n if (reconnectEdge) {\n const fromNode = nodeMap.get(reconnectEdge.from.nodeId);\n const toNode = nodeMap.get(reconnectEdge.to.nodeId);\n if (fromNode && toNode) {\n this.overlayLayer.appendChild(\n this.renderReconnectEndpoints(reconnectEdge, fromNode, toNode),\n );\n }\n }\n }\n\n this.syncConnectingState();\n }\n\n // Drag frames change one translation and its connected paths. Keep unrelated\n // SVG elements intact; the release event still refreshes inspector/history.\n renderDraggedNode(node) {\n const element = this.nodeElements?.get(node.id);\n if (!element) {\n this.render({ inspector: false, json: false });\n return;\n }\n element.setAttribute('transform', `translate(${formatNumber(node.x)} ${formatNumber(node.y)})`);\n element.classList.add('is-dragging');\n for (const edge of this.incidentEdges.get(node.id) || []) {\n const previous = this.edgeElements.get(edge.id);\n const next = this.renderEdge(edge, this.sceneNodeMap);\n if (previous && next) {\n previous.replaceWith(next);\n this.edgeElements.set(edge.id, next);\n }\n }\n }\n\n applyEdgeMarkers(pathElement, edge, edgeScale = 1) {\n const width = this.getEdgeStrokeWidth(edge);\n if (edge.startMarker && edge.startMarker !== 'none') {\n pathElement.setAttribute(\n 'marker-start',\n `url(#${this.getMarkerId(edge.startMarker, 'start', width, edgeScale)})`,\n );\n }\n if (edge.endMarker && edge.endMarker !== 'none') {\n pathElement.setAttribute(\n 'marker-end',\n `url(#${this.getMarkerId(edge.endMarker, 'end', width, edgeScale)})`,\n );\n }\n }\n\n renderEdge(edge, nodeMap) {\n const fromNode = nodeMap.get(edge.from.nodeId);\n const toNode = nodeMap.get(edge.to.nodeId);\n if (!fromNode || !toNode) return null;\n\n const visual = edgeVisualScale(fromNode, toNode);\n const edgePath = buildEdgePath(edge, fromNode, toNode);\n const selected = this.selection?.kind === 'edge' && this.selection.id === edge.id;\n const inReconnectMode = this.reconnectEdgeId === edge.id;\n\n const group = svgEl('g', {\n class: `vd-flowchart-edge${selected ? ' is-selected' : ''}${inReconnectMode ? ' is-reconnecting' : ''}`,\n 'data-edge-id': edge.id,\n });\n const baseStroke = this.getEdgeStrokeWidth(edge);\n const strokeWidth =\n visual < 0.999 ? formatNumber(Math.max(0.02, baseStroke * visual)) : baseStroke;\n\n if (selected) {\n group.appendChild(\n svgEl('path', {\n class: 'vd-flowchart-edge-selection',\n d: edgePath.d,\n 'stroke-width':\n visual < 0.999\n ? formatNumber((baseStroke + 7) * visual)\n : formatNumber(strokeWidth + 7),\n }),\n );\n }\n\n const visiblePath = svgEl('path', {\n class: 'vd-flowchart-edge-path',\n d: edgePath.d,\n 'stroke-width': strokeWidth,\n 'data-edge-id': edge.id,\n });\n this.applyEdgeMarkers(visiblePath, edge, visual);\n\n const hitPath = svgEl('path', {\n class: 'vd-flowchart-edge-hit',\n d: edgePath.d,\n 'stroke-width': this.getEdgeHitStrokeWidth(edge, visual),\n 'data-edge-id': edge.id,\n });\n\n group.appendChild(visiblePath);\n group.appendChild(hitPath);\n\n if (edge.label && this.textEditor?.edgeId !== edge.id) {\n const labelOffset = visual < 0.999 ? formatNumber(8 * visual) : 8;\n const label = svgEl('text', {\n class: 'vd-flowchart-edge-label',\n x: edgePath.labelX,\n y: edgePath.labelY - labelOffset,\n 'text-anchor': 'middle',\n 'data-edge-id': edge.id,\n });\n if (visual < 0.999) {\n label.style.fontSize = `${formatNumber(Math.max(0.06, 12 * visual))}px`;\n label.style.strokeWidth = `${formatNumber(Math.max(0.03, 5 * visual))}px`;\n }\n label.textContent = edge.label;\n group.appendChild(label);\n }\n\n return group;\n }\n\n renderReconnectEndpoints(edge, fromNode, toNode) {\n const scale = this.documentData.viewport.scale || 1;\n const group = svgEl('g', { class: 'vd-flowchart-edge-endpoints' });\n [\n { endpoint: 'from', point: getPortPosition(fromNode, edge.from.port) },\n { endpoint: 'to', point: getPortPosition(toNode, edge.to.port) },\n ].forEach(({ endpoint, point }) => {\n group.appendChild(\n svgEl('circle', {\n class: 'vd-flowchart-edge-endpoint-hit',\n cx: point.x,\n cy: point.y,\n r: RECONNECT_ENDPOINT_HIT_RADIUS / scale,\n 'data-edge-id': edge.id,\n 'data-edge-endpoint': endpoint,\n }),\n );\n group.appendChild(\n svgEl('circle', {\n class: 'vd-flowchart-edge-endpoint',\n cx: point.x,\n cy: point.y,\n r: RECONNECT_ENDPOINT_RADIUS / scale,\n 'data-edge-id': edge.id,\n 'data-edge-endpoint': endpoint,\n }),\n );\n });\n return group;\n }\n\n renderPreviewEdge(interaction) {\n const fromPort = interaction.fromPort || interaction.source?.port || 'right';\n const toPort = interaction.toPort || interaction.target?.port || 'left';\n const fromNode = interaction.source?.nodeId ? this.findNode(interaction.source.nodeId) : null;\n const toNode = interaction.target?.nodeId ? this.findNode(interaction.target.nodeId) : null;\n const visual = edgeVisualScale(fromNode, toNode);\n const edgePath = buildEdgePath(\n {\n strokeWidth: interaction.strokeWidth,\n route: interaction.route,\n fromPoint: interaction.fromPoint,\n toPoint: interaction.toPoint,\n from: { port: fromPort },\n to: { port: toPort },\n },\n fromNode,\n toNode,\n );\n const baseStroke = this.getEdgeStrokeWidth(interaction);\n return svgEl('path', {\n class: 'vd-flowchart-preview-path',\n d: edgePath.d,\n 'stroke-width':\n visual < 0.999 ? formatNumber(Math.max(0.02, baseStroke * visual)) : baseStroke,\n });\n }\n\n renderNode(node) {\n const selected = this.isNodeSelected(node.id);\n // Frames and handles describe one node; a group shows only the outline.\n const soloSelected = selected && !this.hasMultiSelection();\n const dragging =\n this.interaction?.kind === 'drag-node' && this.interaction.nodeIds.includes(node.id);\n const resizing =\n this.interaction?.kind === 'resize-node' && this.interaction.nodeId === node.id;\n const editing = this.textEditor?.nodeId === node.id;\n const group = svgEl('g', {\n class: `vd-flowchart-node${selected ? ' is-selected' : ''}${dragging ? ' is-dragging' : ''}${resizing ? ' is-resizing' : ''}${editing ? ' is-editing' : ''}`,\n transform: `translate(${formatNumber(node.x)} ${formatNumber(node.y)})`,\n 'data-node-id': node.id,\n });\n const portsVisible = this.shouldShowNodePorts(node);\n\n const visual = nodeVisualScale(node);\n const corner =\n node.type === 'rounded-rect' || node.type === 'textbox'\n ? 16\n : node.type === 'junction'\n ? node.width / 2\n : 6;\n const hitbox = svgEl('rect', {\n x: 0,\n y: 0,\n width: node.width,\n height: node.height,\n rx: visual < 0.999 && node.type !== 'junction' ? formatNumber(corner * visual) : corner,\n fill: 'transparent',\n 'data-node-id': node.id,\n });\n group.appendChild(hitbox);\n const shape = this.renderNodeShape(node);\n this.applyScaledNodeShape(node, shape);\n group.appendChild(shape);\n group.appendChild(this.renderNodeText(node));\n\n const scale = this.documentData.viewport.scale || 1;\n if (soloSelected && !this.readonly && SELECTION_BOX_TYPES.has(node.type)) {\n const outset = SELECTION_OUTSET / scale;\n group.appendChild(\n svgEl('rect', {\n class: 'vd-flowchart-selection-box',\n x: -outset,\n y: -outset,\n width: node.width + outset * 2,\n height: node.height + outset * 2,\n }),\n );\n }\n\n if (soloSelected && !this.readonly && isNodeResizable(node)) {\n group.appendChild(this.renderResizeControls(node));\n }\n\n const collapseToggle = this.renderCollapseToggle(node, soloSelected);\n if (this.readonly) {\n if (collapseToggle) group.appendChild(collapseToggle);\n return group;\n }\n\n FLOWCHART_PORTS.forEach((port) => {\n const position = getPortHandlePosition({ ...node, x: 0, y: 0 }, port, scale);\n const portGroup = svgEl('g', {\n class: `vd-flowchart-port-group${portsVisible ? ' is-visible' : ''}`,\n 'data-node-id': node.id,\n 'data-port': port,\n });\n portGroup.appendChild(\n svgEl('circle', {\n class: 'vd-flowchart-port-hit',\n cx: position.x,\n cy: position.y,\n r: CONNECTION_PORT_HIT_RADIUS / scale,\n }),\n );\n portGroup.appendChild(\n svgEl('circle', {\n class: 'vd-flowchart-port',\n cx: position.x,\n cy: position.y,\n r: CONNECTION_PORT_RADIUS / scale,\n }),\n );\n const arm = (CONNECTION_PORT_RADIUS - 2.5) / scale;\n portGroup.appendChild(\n svgEl('path', {\n class: 'vd-flowchart-port-plus',\n d: `M ${formatNumber(position.x - arm)} ${formatNumber(position.y)} H ${formatNumber(position.x + arm)} M ${formatNumber(position.x)} ${formatNumber(position.y - arm)} V ${formatNumber(position.y + arm)}`,\n }),\n );\n group.appendChild(portGroup);\n });\n if (collapseToggle) group.appendChild(collapseToggle);\n\n return group;\n }\n\n // \"+N\" on a collapsed node, or \"\u2212\" on a single selected node with children,\n // placed beyond the connection handle on the side its branch leaves from.\n renderCollapseToggle(node, soloSelected) {\n const outgoing = this.sceneOutgoing || this.getOutgoingMap();\n const childIds = (outgoing.get(node.id) || []).filter((id) => id !== node.id);\n if (!childIds.length) return null;\n const count = node.collapsed\n ? this.countCollapsedDescendants(\n node.id,\n this.sceneHidden || this.getHiddenNodeIds(),\n outgoing,\n )\n : 0;\n if (!node.collapsed && !(soloSelected && !this.readonly)) return null;\n\n const sides = new Map();\n this.documentData.edges.forEach((edge) => {\n if (edge.from.nodeId !== node.id || edge.to.nodeId === node.id) return;\n sides.set(edge.from.port, (sides.get(edge.from.port) || 0) + 1);\n });\n const port =\n [...sides].sort((a, b) => b[1] - a[1])[0]?.[0] ||\n DIRECTION_PORTS[this.getGrowthDirection(node)];\n const scale = this.documentData.viewport.scale || 1;\n const anchor = getPortPosition({ ...node, x: 0, y: 0 }, port);\n const normal = getPortNormal(port);\n const offset = COLLAPSE_TOGGLE_OFFSET / scale;\n const cx = formatNumber(anchor.x + normal.x * offset);\n const cy = formatNumber(anchor.y + normal.y * offset);\n const label = node.collapsed ? `+${count}` : '\u2212';\n const radius = (node.collapsed && label.length > 2 ? 12 : 9) / scale;\n\n const group = svgEl('g', {\n class: `vd-flowchart-collapse-toggle${node.collapsed ? ' is-collapsed' : ''}`,\n 'data-collapse-toggle': node.id,\n });\n const title = svgEl('title');\n title.textContent = node.collapsed ? `Expand ${count} hidden nodes` : 'Collapse branch';\n group.appendChild(title);\n group.appendChild(svgEl('circle', { cx, cy, r: formatNumber(radius) }));\n const text = svgEl('text', {\n x: cx,\n y: cy,\n 'font-size': formatNumber(10 / scale),\n 'text-anchor': 'middle',\n 'dominant-baseline': 'central',\n });\n text.textContent = label;\n group.appendChild(text);\n return group;\n }\n\n renderResizeControls(node) {\n const scale = this.documentData.viewport.scale || 1;\n const zone = 14 / scale;\n const cornerZone = 22 / scale;\n const handleSize = RESIZE_HANDLE_SIZE / scale;\n const gap = RESIZE_PORT_GAP / scale;\n const group = svgEl('g', { class: 'vd-flowchart-resize-controls' });\n\n const zones = {\n n: { x: 0, y: -zone / 2, width: node.width, height: zone },\n e: { x: node.width - zone / 2, y: 0, width: zone, height: node.height },\n s: { x: 0, y: node.height - zone / 2, width: node.width, height: zone },\n w: { x: -zone / 2, y: 0, width: zone, height: node.height },\n ne: {\n x: node.width - cornerZone / 2,\n y: -cornerZone / 2,\n width: cornerZone,\n height: cornerZone,\n },\n se: {\n x: node.width - cornerZone / 2,\n y: node.height - cornerZone / 2,\n width: cornerZone,\n height: cornerZone,\n },\n sw: {\n x: -cornerZone / 2,\n y: node.height - cornerZone / 2,\n width: cornerZone,\n height: cornerZone,\n },\n nw: { x: -cornerZone / 2, y: -cornerZone / 2, width: cornerZone, height: cornerZone },\n };\n\n RESIZE_HANDLES.forEach((handle) => {\n const zoneRect = zones[handle];\n const cursor = getResizeCursor(handle);\n const zoneSegments = [];\n if (handle === 'e' || handle === 'w') {\n const upperHeight = Math.max(0, node.height / 2 - gap / 2);\n const lowerY = node.height / 2 + gap / 2;\n const lowerHeight = Math.max(0, node.height - lowerY);\n zoneSegments.push(\n { x: zoneRect.x, y: zoneRect.y, width: zoneRect.width, height: upperHeight },\n { x: zoneRect.x, y: lowerY, width: zoneRect.width, height: lowerHeight },\n );\n } else if (handle === 'n' || handle === 's') {\n const leftWidth = Math.max(0, node.width / 2 - gap / 2);\n const rightX = node.width / 2 + gap / 2;\n const rightWidth = Math.max(0, node.width - rightX);\n zoneSegments.push(\n { x: zoneRect.x, y: zoneRect.y, width: leftWidth, height: zoneRect.height },\n { x: rightX, y: zoneRect.y, width: rightWidth, height: zoneRect.height },\n );\n } else {\n zoneSegments.push(zoneRect);\n }\n zoneSegments\n .filter((segment) => segment.width > 0 && segment.height > 0)\n .forEach((segment) => {\n const hit = svgEl('rect', {\n class: 'vd-flowchart-resize-zone',\n x: segment.x,\n y: segment.y,\n width: segment.width,\n height: segment.height,\n 'data-node-id': node.id,\n 'data-resize-handle': handle,\n style: `cursor: ${cursor}`,\n });\n group.appendChild(hit);\n });\n // Sides resize through the invisible strips only; a visible dot there\n // would sit on the same axis as the connection handle.\n if (handle.length === 1) return;\n const position = getResizeHandlePosition(node, handle);\n const outset = SELECTION_OUTSET / scale;\n position.x += handle.includes('e') ? outset : -outset;\n position.y += handle.includes('s') ? outset : -outset;\n const dot = svgEl('rect', {\n class: 'vd-flowchart-resize-handle',\n x: position.x - handleSize / 2,\n y: position.y - handleSize / 2,\n width: handleSize,\n height: handleSize,\n rx: handleSize / 5,\n ry: handleSize / 5,\n 'data-node-id': node.id,\n 'data-resize-handle': handle,\n style: `cursor: ${cursor}`,\n });\n group.appendChild(dot);\n });\n\n return group;\n }\n\n applyScaledNodeShape(node, shape) {\n const visual = nodeVisualScale(node);\n if (!shape || visual >= 0.999) return;\n const baseStroke = node.type === 'junction' ? 1.25 : 1.5;\n shape.style.strokeWidth = String(formatNumber(Math.max(0.03, baseStroke * visual)));\n if (node.type === 'textbox') {\n shape.style.strokeDasharray = `${formatNumber(8 * visual)} ${formatNumber(5 * visual)}`;\n }\n const baseRadius =\n node.type === 'rounded-rect'\n ? 18\n : node.type === 'textbox'\n ? 14\n : node.type === 'rect'\n ? 2\n : 0;\n if (baseRadius > 0) {\n const scaled = String(formatNumber(baseRadius * visual));\n shape.setAttribute('rx', scaled);\n shape.setAttribute('ry', scaled);\n }\n }\n\n renderNodeShape(node) {\n const baseClass = `vd-flowchart-node-shape vd-flowchart-node-shape--${node.type}`;\n\n if (node.type === 'rounded-rect') {\n return svgEl('rect', {\n class: baseClass,\n x: 0,\n y: 0,\n width: node.width,\n height: node.height,\n rx: 18,\n ry: 18,\n });\n }\n\n if (node.type === 'rect') {\n return svgEl('rect', {\n class: baseClass,\n x: 0,\n y: 0,\n width: node.width,\n height: node.height,\n rx: 2,\n ry: 2,\n });\n }\n\n if (node.type === 'diamond') {\n return svgEl('polygon', {\n class: baseClass,\n points: `${node.width / 2},0 ${node.width},${node.height / 2} ${node.width / 2},${node.height} 0,${node.height / 2}`,\n });\n }\n\n if (node.type === 'circle') {\n return svgEl('ellipse', {\n class: baseClass,\n cx: node.width / 2,\n cy: node.height / 2,\n rx: node.width / 2,\n ry: node.height / 2,\n });\n }\n\n if (node.type === 'junction') {\n return svgEl('circle', {\n class: baseClass,\n cx: node.width / 2,\n cy: node.height / 2,\n r: Math.min(node.width, node.height) / 2,\n });\n }\n\n if (node.type === 'textbox') {\n return svgEl('rect', {\n class: baseClass,\n x: 0,\n y: 0,\n width: node.width,\n height: node.height,\n rx: 14,\n ry: 14,\n });\n }\n\n return svgEl('rect', {\n class: baseClass,\n x: 0,\n y: 0,\n width: node.width,\n height: node.height,\n rx: 0,\n ry: 0,\n });\n }\n\n renderNodeText(node) {\n const textElement = svgEl('text', {\n class: `vd-flowchart-node-text vd-flowchart-node-text--${node.type}`,\n 'data-node-id': node.id,\n });\n\n if (node.type === 'junction' || !node.text) {\n return textElement;\n }\n\n const visual = nodeVisualScale(node);\n const metrics = getNodeFontMetrics(node);\n const lineHeight =\n visual < 0.999 ? Math.max(0.06, metrics.lineHeight * visual) : metrics.lineHeight;\n if (visual < 0.999) {\n textElement.style.fontSize = `${formatNumber(Math.max(0.05, metrics.fontSize * visual))}px`;\n }\n const equivalentWidth = visual < 0.999 ? node.width / visual : node.width;\n\n if (node.type === 'textbox') {\n const lines = wrapText(node.text, estimateChars(equivalentWidth - 32));\n const padX = visual < 0.999 ? formatNumber(16 * visual) : 16;\n const startY = visual < 0.999 ? formatNumber(28 * visual) : 28;\n lines.forEach((line, index) => {\n const span = svgEl('tspan', {\n x: padX,\n y:\n visual < 0.999\n ? formatNumber(startY + index * lineHeight)\n : startY + index * lineHeight,\n });\n span.textContent = line;\n textElement.appendChild(span);\n });\n return textElement;\n }\n\n const lines = wrapText(node.text, estimateChars(equivalentWidth));\n const totalHeight = (lines.length - 1) * lineHeight;\n const startY = node.height / 2 - totalHeight / 2;\n textElement.setAttribute('text-anchor', 'middle');\n textElement.setAttribute('dominant-baseline', 'middle');\n lines.forEach((line, index) => {\n const span = svgEl('tspan', {\n x: node.width / 2,\n y: visual < 0.999 ? formatNumber(startY + index * lineHeight) : startY + index * lineHeight,\n 'text-anchor': 'middle',\n 'dominant-baseline': 'middle',\n });\n span.textContent = line;\n textElement.appendChild(span);\n });\n\n return textElement;\n }\n\n renderSelectionPanel() {\n clearChildren(this.selectionFields);\n this.deleteButton.disabled = this.readonly || !this.selection;\n\n if (!this.selection) {\n this.selectionMeta.textContent = 'Nothing selected';\n this.selectionFields.appendChild(\n createElement('p', {\n className: 'vd-flowchart-selection-empty',\n text: 'Select a node or edge to edit it.',\n }),\n );\n return;\n }\n\n if (this.hasMultiSelection()) {\n this.selectionMeta.textContent = `${this.selectedNodeIds.size} nodes selected`;\n this.selectionFields.appendChild(\n createElement('p', {\n className: 'vd-flowchart-selection-empty',\n text: 'Drag, nudge with Alt+Arrow, copy, duplicate, or delete them together.',\n }),\n );\n return;\n }\n\n if (this.selection.kind === 'node') {\n const node = this.findNode(this.selection.id);\n if (!node) {\n this.selection = null;\n this.renderSelectionPanel();\n return;\n }\n\n this.selectionMeta.textContent = `Node ${node.id} \u00B7 ${node.type} \u00B7 ${Math.round(node.x)}, ${Math.round(node.y)}`;\n const typeSelect = createElement('select');\n typeSelect.setAttribute('data-field', 'node-type');\n FLOWCHART_NODE_TYPES.forEach((type) => {\n const option = createElement('option', { value: type, text: type.replace('-', ' ') });\n option.value = type;\n option.selected = type === node.type;\n typeSelect.appendChild(option);\n });\n\n const textArea = createElement('textarea', { value: node.text, rows: 5 });\n textArea.setAttribute('data-field', 'node-text');\n\n const widthInput = createElement('input', { value: node.width, type: 'number' });\n widthInput.setAttribute('data-field', 'node-width');\n widthInput.setAttribute('min', String(this.minNodeSize));\n widthInput.setAttribute('max', String(this.maxNodeSize));\n\n const heightInput = createElement('input', { value: node.height, type: 'number' });\n heightInput.setAttribute('data-field', 'node-height');\n heightInput.setAttribute('min', String(this.minNodeSize));\n heightInput.setAttribute('max', String(this.maxNodeSize));\n\n this.selectionFields.appendChild(createField('Type', typeSelect));\n if (isNodeTextEditable(node)) {\n this.selectionFields.appendChild(createField('Text', textArea));\n }\n\n if (isNodeResizable(node)) {\n const sizeGrid = createElement('div', { className: 'vd-flowchart-field-grid' });\n sizeGrid.appendChild(createField('Width', widthInput));\n sizeGrid.appendChild(createField('Height', heightInput));\n this.selectionFields.appendChild(sizeGrid);\n } else {\n this.selectionFields.appendChild(\n createElement('p', {\n className: 'vd-flowchart-selection-empty',\n text: 'Junctions stay fixed-size and do not carry inline text.',\n }),\n );\n }\n return;\n }\n\n const edge = this.findEdge(this.selection.id);\n if (!edge) {\n this.selection = null;\n this.renderSelectionPanel();\n return;\n }\n\n this.selectionMeta.textContent = `Edge ${edge.id} \u00B7 ${edge.route} \u00B7 ${formatNumber(edge.strokeWidth)}px \u00B7 ${edge.startMarker} \u2192 ${edge.endMarker}`;\n\n const routeSelect = createElement('select');\n routeSelect.setAttribute('data-field', 'edge-route');\n FLOWCHART_EDGE_ROUTES.forEach((route) => {\n const option = createElement('option', {\n value: route,\n text: FLOWCHART_EDGE_ROUTE_LABELS[route],\n });\n option.value = route;\n option.selected = route === edge.route;\n routeSelect.appendChild(option);\n });\n\n const startSelect = createElement('select');\n startSelect.setAttribute('data-field', 'edge-start-marker');\n FLOWCHART_EDGE_MARKERS.forEach((marker) => {\n const option = createElement('option', { value: marker, text: marker });\n option.value = marker;\n option.selected = marker === edge.startMarker;\n startSelect.appendChild(option);\n });\n\n const endSelect = createElement('select');\n endSelect.setAttribute('data-field', 'edge-end-marker');\n FLOWCHART_EDGE_MARKERS.forEach((marker) => {\n const option = createElement('option', { value: marker, text: marker });\n option.value = marker;\n option.selected = marker === edge.endMarker;\n endSelect.appendChild(option);\n });\n\n const widthSelect = createElement('select');\n widthSelect.setAttribute('data-field', 'edge-stroke-preset');\n EDGE_STROKE_PRESETS.forEach((preset) => {\n const option = createElement('option', { value: preset.id, text: preset.label });\n option.value = preset.id;\n option.selected = preset.id === getStrokePresetId(edge.strokeWidth);\n widthSelect.appendChild(option);\n });\n\n const labelInput = createElement('textarea', { value: edge.label, rows: 4 });\n labelInput.setAttribute('data-field', 'edge-label');\n\n const markerGrid = createElement('div', { className: 'vd-flowchart-field-grid' });\n markerGrid.appendChild(createField('Route', routeSelect));\n markerGrid.appendChild(createField('Weight', widthSelect));\n markerGrid.appendChild(createField('Start', startSelect));\n markerGrid.appendChild(createField('End', endSelect));\n this.selectionFields.appendChild(markerGrid);\n this.selectionFields.appendChild(createField('Label', labelInput));\n }\n\n syncJsonTextarea(force = false) {\n if (!force && document.activeElement === this.jsonTextarea) {\n return;\n }\n this.jsonTextarea.value = JSON.stringify(this.toJSON(), null, 2);\n }\n\n getSelectionSnapshot() {\n if (!this.selection) return null;\n if (this.selection.kind === 'node') {\n const node = this.findNode(this.selection.id);\n return node ? { kind: 'node', id: node.id, node: deepClone(node) } : null;\n }\n const edge = this.findEdge(this.selection.id);\n return edge ? { kind: 'edge', id: edge.id, edge: deepClone(edge) } : null;\n }\n\n select(selection) {\n const next =\n selection && selection.id && selection.kind\n ? { kind: selection.kind, id: selection.id }\n : null;\n this.applySelection(next, next?.kind === 'node' ? [next.id] : []);\n }\n\n // Single funnel for selection changes: `selection` is the primary item and\n // `selectedNodeIds` every selected node (the primary one included).\n applySelection(primary, nodeIds) {\n const previousKey = this.getSelectionKey();\n this.selection = primary;\n this.selectedNodeIds = new Set(nodeIds);\n if (primary?.kind === 'node') this.selectedNodeIds.add(primary.id);\n if (previousKey !== this.getSelectionKey()) {\n this.edgeCycleAnchor = null;\n this.render({ scene: true, inspector: true, json: false });\n this.emit('select', {\n selection: this.getSelectionSnapshot(),\n nodeIds: this.getSelectedNodeIds(),\n });\n return;\n }\n\n this.render({ scene: true, inspector: false, json: false });\n }\n\n getSelectionKey() {\n const primary = this.selection ? `${this.selection.kind}:${this.selection.id}` : '';\n return `${primary}|${[...(this.selectedNodeIds || [])].sort().join(',')}`;\n }\n\n // Keep the set valid after mutations that bypass applySelection (undo,\n // load, removal): drop missing nodes and keep the primary node in the set.\n syncSelectedNodeIds() {\n if (this.selection?.kind !== 'node') {\n this.selectedNodeIds = new Set();\n return;\n }\n const existing = new Set(this.documentData.nodes.map((node) => node.id));\n const hidden = this.getHiddenNodeIds();\n this.selectedNodeIds = new Set(\n [...(this.selectedNodeIds || [])].filter((id) => existing.has(id) && !hidden.has(id)),\n );\n this.selectedNodeIds.add(this.selection.id);\n }\n\n getSelectedNodeIds() {\n return [...(this.selectedNodeIds || [])];\n }\n\n isNodeSelected(nodeId) {\n return Boolean(this.selectedNodeIds?.has(nodeId));\n }\n\n hasMultiSelection() {\n return (this.selectedNodeIds?.size || 0) > 1;\n }\n\n /** Select several nodes; `primary` (default: the last id) drives single-node UI. */\n selectNodes(nodeIds, options = {}) {\n const existing = new Set(this.documentData.nodes.map((node) => node.id));\n const ids = [...new Set((nodeIds || []).map(sanitizeId))].filter((id) => existing.has(id));\n const primaryId = ids.includes(options.primary) ? options.primary : ids[ids.length - 1];\n this.applySelection(primaryId ? { kind: 'node', id: primaryId } : null, ids);\n return this;\n }\n\n toggleNodeSelection(nodeId) {\n const ids = this.selection?.kind === 'node' ? this.getSelectedNodeIds() : [];\n if (ids.includes(nodeId)) {\n const rest = ids.filter((id) => id !== nodeId);\n return this.selectNodes(rest, { primary: rest[rest.length - 1] });\n }\n return this.selectNodes([...ids, nodeId], { primary: nodeId });\n }\n\n selectNode(nodeId) {\n this.select({ kind: 'node', id: sanitizeId(nodeId) });\n return this;\n }\n\n selectEdge(edgeId) {\n this.select({ kind: 'edge', id: sanitizeId(edgeId) });\n return this;\n }\n\n deselect() {\n this.select(null);\n return this;\n }\n\n resolvePreservedSelection(previousSelection, preserve) {\n if (!preserve || !previousSelection) return null;\n const exists =\n previousSelection.kind === 'node'\n ? Boolean(this.findNode(previousSelection.id))\n : Boolean(this.findEdge(previousSelection.id));\n return exists ? { kind: previousSelection.kind, id: previousSelection.id } : null;\n }\n\n findNode(nodeId) {\n return this.documentData.nodes.find((node) => node.id === nodeId) || null;\n }\n\n getHiddenNodeIds() {\n return computeHiddenNodeIds(this.documentData.nodes, this.documentData.edges);\n }\n\n getVisibleNodes() {\n const hidden = this.getHiddenNodeIds();\n return hidden.size\n ? this.documentData.nodes.filter((node) => !hidden.has(node.id))\n : this.documentData.nodes;\n }\n\n isNodeHidden(nodeId) {\n return this.getHiddenNodeIds().has(nodeId);\n }\n\n getOutgoingMap() {\n const outgoing = new Map();\n this.documentData.edges.forEach((edge) => {\n if (!outgoing.has(edge.from.nodeId)) outgoing.set(edge.from.nodeId, []);\n outgoing.get(edge.from.nodeId).push(edge.to.nodeId);\n });\n return outgoing;\n }\n\n // Hidden nodes under one collapsed node (its \"+N\" count).\n countCollapsedDescendants(\n nodeId,\n hidden = this.getHiddenNodeIds(),\n outgoing = this.getOutgoingMap(),\n ) {\n const seen = new Set();\n const queue = [nodeId];\n for (let index = 0; index < queue.length; index += 1) {\n (outgoing.get(queue[index]) || []).forEach((childId) => {\n if (seen.has(childId) || !hidden.has(childId)) return;\n seen.add(childId);\n queue.push(childId);\n });\n }\n return seen.size;\n }\n\n setCollapsed(nodeId, collapsed) {\n if (this.readonly) return false;\n const node = this.findNode(sanitizeId(nodeId));\n if (!node) return false;\n const next = Boolean(collapsed);\n if (Boolean(node.collapsed) === next) return false;\n if (next && !this.getChildNodes(node.id).length) return false;\n if (next) node.collapsed = true;\n else delete node.collapsed;\n\n // Keep the selection on something visible.\n if (this.selection?.kind === 'node') {\n const hidden = this.getHiddenNodeIds();\n const visibleIds = this.getSelectedNodeIds().filter((id) => !hidden.has(id));\n if (hidden.has(this.selection.id)) {\n this.select({ kind: 'node', id: node.id });\n } else if (visibleIds.length !== this.selectedNodeIds.size) {\n this.selectNodes(visibleIds, { primary: this.selection.id });\n }\n } else if (this.selection?.kind === 'edge') {\n const edge = this.findEdge(this.selection.id);\n const hidden = this.getHiddenNodeIds();\n if (edge && (hidden.has(edge.from.nodeId) || hidden.has(edge.to.nodeId))) {\n this.select({ kind: 'node', id: node.id });\n }\n }\n\n this.render({ inspector: true, json: true });\n this.emitChange('node:collapse', { node: deepClone(node) });\n return true;\n }\n\n toggleCollapsed(nodeId) {\n const node = this.findNode(sanitizeId(nodeId));\n return node ? this.setCollapsed(node.id, !node.collapsed) : false;\n }\n\n findEdge(edgeId) {\n return this.documentData.edges.find((edge) => edge.id === edgeId) || null;\n }\n\n emit(eventName, payload) {\n const listeners = this.listeners[eventName];\n if (!listeners || !listeners.size) return;\n listeners.forEach((listener) => listener(payload));\n }\n\n emitChange(reason, extra = {}) {\n if (this.historyEnabled && !this.isApplyingHistory) {\n if (this.historyBatchDepth > 0) this.historyBatchDirty = true;\n else this.recordHistory(reason);\n }\n this.syncJsonTextarea();\n this.emit('change', {\n reason,\n document: this.toJSON(),\n ...extra,\n });\n }\n\n emitViewportChange(reason) {\n const payload = {\n reason,\n viewport: deepClone(this.documentData.viewport),\n document: this.toJSON(),\n };\n this.syncJsonTextarea();\n this.emit('viewport', payload);\n this.emit('change', payload);\n }\n\n on(eventName, callback) {\n if (!this.listeners[eventName]) {\n this.listeners[eventName] = new Set();\n }\n this.listeners[eventName].add(callback);\n return this;\n }\n\n off(eventName, callback) {\n this.listeners[eventName]?.delete(callback);\n return this;\n }\n\n // --- History (undo / redo) ----------------------------------------------\n // Every document mutation funnels through emitChange(), so recording there\n // captures all of them with exactly one entry per committed gesture (live\n // drag/resize only render()). Viewport pan/zoom go through emitViewportChange\n // and are intentionally not recorded \u2014 undo is for content, not the camera.\n seedHistory() {\n if (!this.historyEnabled) return;\n this.history = [{ reason: 'init', targetKey: '', snapshot: this.toJSON() }];\n this.historyIndex = 0;\n }\n\n recordHistory(reason) {\n const snapshot = this.toJSON();\n const targetKey = this.selection ? `${this.selection.kind}:${this.selection.id}` : '';\n const top = this.history[this.historyIndex];\n const atTip = Boolean(top) && this.historyIndex === this.history.length - 1;\n // Naming a node right after inserting it is part of the same gesture.\n const namesInsertedNode =\n this.coalesceInsertedText && top?.reason === 'node:insert' && reason === 'node:update';\n const canCoalesce =\n atTip &&\n top.targetKey === targetKey &&\n (namesInsertedNode || (COALESCING_REASONS.has(reason) && top.reason === reason));\n\n if (canCoalesce) {\n top.snapshot = snapshot;\n return;\n }\n\n if (this.historyIndex < this.history.length - 1) {\n this.history.length = this.historyIndex + 1;\n }\n this.history.push({ reason, targetKey, snapshot });\n if (this.history.length > this.historyLimit) {\n this.history.shift();\n }\n this.historyIndex = this.history.length - 1;\n this.emitHistoryState(reason);\n }\n\n applyHistorySnapshot(snapshot, reason) {\n this.isApplyingHistory = true;\n this.stopTextEdit({ commit: false });\n this.activeTool = null;\n this.reconnectEdgeId = null;\n // Preserve the current camera so undo/redo never makes the view jump.\n const currentViewport = deepClone(this.documentData.viewport);\n const previousSelection = this.selection;\n this.documentData = normalizeDocument(snapshot, this.normalizationLimits());\n this.documentData.viewport = normalizeViewport(currentViewport, this.scaleBounds());\n this.selection = this.resolvePreservedSelection(previousSelection, true);\n this.render();\n this.emitChange(reason);\n this.isApplyingHistory = false;\n this.emitHistoryState(reason);\n }\n\n emitHistoryState(reason) {\n this.updateHistoryButtons();\n this.emit('history', { reason, canUndo: this.canUndo(), canRedo: this.canRedo() });\n }\n\n canUndo() {\n return this.historyEnabled && this.historyIndex > 0;\n }\n\n canRedo() {\n return this.historyEnabled && this.historyIndex < this.history.length - 1;\n }\n\n undo() {\n if (!this.canUndo()) return this;\n this.historyIndex -= 1;\n this.applyHistorySnapshot(this.history[this.historyIndex].snapshot, 'undo');\n return this;\n }\n\n redo() {\n if (!this.canRedo()) return this;\n this.historyIndex += 1;\n this.applyHistorySnapshot(this.history[this.historyIndex].snapshot, 'redo');\n return this;\n }\n\n clearHistory() {\n this.seedHistory();\n this.emitHistoryState('history:clear');\n return this;\n }\n\n updateHistoryButtons() {\n if (this.undoButton) this.undoButton.disabled = this.readonly || !this.canUndo();\n if (this.redoButton) this.redoButton.disabled = this.readonly || !this.canRedo();\n }\n\n // Resolve a `relativeTo` anchor into a top-left position for a new node of the\n // given spec. Accepts a bare node id or `{ node, direction, distance, angle }`;\n // `direction` (right/down/left/up) is sugar for an angle in screen space\n // (y-down). Returns null when the anchor node can't be found.\n resolveRelativePosition(relativeTo, spec) {\n const ref = typeof relativeTo === 'string' ? { node: relativeTo } : relativeTo || {};\n const anchor = this.findNode(sanitizeId(ref.node ?? ref.nodeId ?? ref.id));\n if (!anchor) return null;\n\n const directionAngles = { right: 0, down: 90, left: 180, up: -90 };\n const angleDeg =\n ref.angle != null ? toFiniteNumber(ref.angle, 0) : (directionAngles[ref.direction] ?? 0);\n const distance = Math.max(0, toFiniteNumber(ref.distance, 220));\n const radians = (angleDeg * Math.PI) / 180;\n\n const centerX = anchor.x + anchor.width / 2 + Math.cos(radians) * distance;\n const centerY = anchor.y + anchor.height / 2 + Math.sin(radians) * distance;\n return {\n x: formatNumber(centerX - spec.width / 2),\n y: formatNumber(centerY - spec.height / 2),\n };\n }\n\n addNode(partialNode = {}) {\n const type = normalizeNodeType(partialNode.type);\n const spec = DEFAULT_NODE_SPECS[type];\n const relative =\n partialNode.relativeTo != null\n ? this.resolveRelativePosition(partialNode.relativeTo, spec)\n : null;\n const center = this.getViewportCenter();\n const offset = (this.paletteSerial % 6) * 26;\n this.paletteSerial += 1;\n\n const fallbackX = relative ? relative.x : formatNumber(center.x - spec.width / 2 + offset);\n const fallbackY = relative ? relative.y : formatNumber(center.y - spec.height / 2 + offset);\n\n const rest = { ...partialNode };\n delete rest.relativeTo;\n const usedIds = new Set(this.documentData.nodes.map((node) => node.id));\n const node = normalizeNode(\n {\n ...rest,\n type,\n x: partialNode.x == null ? fallbackX : partialNode.x,\n y: partialNode.y == null ? fallbackY : partialNode.y,\n },\n this.documentData.nodes.length,\n usedIds,\n this.nodeSizeBounds(),\n );\n\n this.documentData.nodes.push(node);\n this.select({ kind: 'node', id: node.id });\n this.syncJsonTextarea();\n this.emitChange('node:add', { node: deepClone(node) });\n return deepClone(node);\n }\n\n // Convenience: place a child node relative to a parent and connect them with\n // an auto-ported arrow in one call. Returns { node, edge } (edge may be null\n // if the connection is rejected). The new child is left selected.\n addChildNode(parentId, options = {}) {\n if (this.readonly) return null;\n const parent = this.findNode(sanitizeId(parentId));\n if (!parent) return null;\n\n const { direction = 'right', distance, angle, edge: edgeOptions, ...nodeOptions } = options;\n return this.batchHistory('node:add-child', () => {\n const node = this.addNode({\n ...nodeOptions,\n relativeTo: { node: parent.id, direction, distance, angle },\n });\n\n const edge = this.addEdge({\n from: parent.id,\n to: node.id,\n autoPort: true,\n endMarker: 'arrow',\n ...(isPlainObject(edgeOptions) ? edgeOptions : {}),\n });\n\n this.select({ kind: 'node', id: node.id });\n return { node, edge };\n });\n }\n\n // Run `fn` with history recording suspended, then record a single entry for\n // everything it changed (change events still fire for each mutation).\n batchHistory(reason, fn) {\n this.historyBatchDepth += 1;\n let result;\n try {\n result = fn();\n } finally {\n this.historyBatchDepth -= 1;\n }\n if (this.historyBatchDepth === 0 && this.historyBatchDirty) {\n this.historyBatchDirty = false;\n if (this.historyEnabled && !this.isApplyingHistory) this.recordHistory(reason);\n }\n return result;\n }\n\n // Mind-map structure: a node's parent is the source of its first incoming\n // edge; its children are the targets of its outgoing edges. The side a\n // branch is on is the port its edge leaves the parent from, which is what\n // the user sees (centre geometry is ambiguous for diagonal nodes).\n getParentEdge(nodeId) {\n return (\n this.documentData.edges.find(\n (edge) => edge.to.nodeId === nodeId && edge.from.nodeId !== nodeId,\n ) || null\n );\n }\n\n getParentNode(nodeId) {\n const edge = this.getParentEdge(nodeId);\n return edge ? this.findNode(edge.from.nodeId) : null;\n }\n\n getChildNodes(nodeId, direction = null) {\n const port = direction ? DIRECTION_PORTS[direction] : null;\n const ids = new Set();\n this.documentData.edges.forEach((edge) => {\n if (edge.from.nodeId !== nodeId || edge.to.nodeId === nodeId) return;\n if (!port || edge.from.port === port) ids.add(edge.to.nodeId);\n });\n return this.documentData.nodes.filter((node) => ids.has(node.id));\n }\n\n // Direction a branch grows from `node`: the side its parent edge leaves\n // from, or the emptier horizontal side for a root.\n getGrowthDirection(node) {\n const parentEdge = this.getParentEdge(node.id);\n if (parentEdge) return PORT_DIRECTIONS[parentEdge.from.port] || 'right';\n const right = this.getChildNodes(node.id, 'right').length;\n const left = this.getChildNodes(node.id, 'left').length;\n return left < right ? 'left' : 'right';\n }\n\n // Shape for a new branch node: copy a sibling when there is one, otherwise\n // the parent's box shape, falling back to a rounded step.\n getBranchTemplate(parent, sibling) {\n const source =\n sibling ||\n (['rounded-rect', 'rect', 'textbox'].includes(parent.type) ? parent : null) ||\n null;\n if (source) return { type: source.type, width: source.width, height: source.height };\n const spec = DEFAULT_NODE_SPECS['rounded-rect'];\n return { type: 'rounded-rect', width: spec.width, height: spec.height };\n }\n\n /**\n * Add a node connected from `parentId` on the `direction` side (default: the\n * branch's growth direction), stacked after `anchorId` or the last sibling on\n * that side. The node and its edge are one undo step; the new edge copies a\n * sibling's (or the parent's incoming) edge style. With `edit: true` the\n * label editor opens with the text selected.\n */\n insertBranchNode(parentId, options = {}) {\n if (this.readonly) return null;\n const parent = this.findNode(sanitizeId(parentId));\n if (!parent) return null;\n\n const direction = DIRECTION_PORTS[options.direction]\n ? options.direction\n : this.getGrowthDirection(parent);\n const siblings = this.getChildNodes(parent.id, direction);\n const anchor = options.anchorId ? this.findNode(sanitizeId(options.anchorId)) : null;\n const lastSibling = siblings[siblings.length - 1] || null;\n const template = this.getBranchTemplate(parent, anchor || lastSibling);\n const position = placeBranchNode({\n nodes: this.documentData.nodes,\n parent,\n siblings,\n direction,\n size: template,\n anchor,\n before: Boolean(options.before),\n });\n\n const styleSource =\n this.documentData.edges.find(\n (edge) => edge.from.nodeId === parent.id && edge.to.nodeId === (anchor || lastSibling)?.id,\n ) || this.documentData.edges.find((edge) => edge.to.nodeId === parent.id);\n const edgeStyle = styleSource\n ? {\n route: styleSource.route,\n strokeWidth: styleSource.strokeWidth,\n startMarker: styleSource.startMarker,\n endMarker: styleSource.endMarker,\n }\n : { endMarker: 'arrow' };\n\n const result = this.batchHistory('node:insert', () => {\n // A new child must be visible, so its branch opens in the same step.\n if (parent.collapsed) delete parent.collapsed;\n const node = this.addNode({ ...template, x: position.x, y: position.y });\n const edge = this.addEdge({\n from: { nodeId: parent.id, port: DIRECTION_PORTS[direction] },\n to: { nodeId: node.id, port: DIRECTION_PORTS[oppositeDirection(direction)] },\n ...edgeStyle,\n });\n if (edge && anchor) this.placeEdgeBySibling(edge.id, parent.id, anchor.id, options.before);\n if (this.autoLayout && this.layoutMode !== 'grid') this.layout(this.layoutMode);\n this.select({ kind: 'node', id: node.id });\n return { node, edge };\n });\n\n this.revealNode(result.node.id);\n if (options.edit) this.startTextEdit(result.node.id, { inserted: true });\n return result;\n }\n\n // Tree and radial layouts order children by connection order, so a sibling's\n // connection goes right after (or before) its anchor's instead of last.\n placeEdgeBySibling(edgeId, parentId, anchorId, before = false) {\n const edges = this.documentData.edges;\n const fromIndex = edges.findIndex((edge) => edge.id === edgeId);\n if (fromIndex === -1) return;\n const [moved] = edges.splice(fromIndex, 1);\n const anchorIndex = edges.findIndex(\n (edge) => edge.from.nodeId === parentId && edge.to.nodeId === anchorId,\n );\n if (anchorIndex === -1) edges.push(moved);\n else edges.splice(before ? anchorIndex : anchorIndex + 1, 0, moved);\n }\n\n // Insert a sibling after (or before) `nodeId`; a node without a parent gets a\n // child instead, which is what Enter on a mind-map root means.\n insertSiblingNode(nodeId, options = {}) {\n if (this.readonly) return null;\n const node = this.findNode(sanitizeId(nodeId));\n if (!node) return null;\n const parentEdge = this.getParentEdge(node.id);\n const parent = parentEdge ? this.findNode(parentEdge.from.nodeId) : null;\n if (!parent) return this.insertBranchNode(node.id, { edit: options.edit });\n return this.insertBranchNode(parent.id, {\n direction: PORT_DIRECTIONS[parentEdge.from.port],\n anchorId: node.id,\n before: Boolean(options.before),\n edit: options.edit,\n });\n }\n\n // Pan just enough to bring a node fully into view (with a small margin).\n revealNode(nodeId) {\n const node = this.findNode(nodeId);\n const width = this.canvasEl.clientWidth;\n const height = this.canvasEl.clientHeight;\n if (!node || !width || !height) return;\n const viewport = this.documentData.viewport;\n const margin = 32;\n const left = viewport.x + node.x * viewport.scale;\n const top = viewport.y + node.y * viewport.scale;\n const right = left + node.width * viewport.scale;\n const bottom = top + node.height * viewport.scale;\n let dx = 0;\n let dy = 0;\n if (right > width - margin) dx = width - margin - right;\n if (left + dx < margin) dx = margin - left;\n if (bottom > height - margin) dy = height - margin - bottom;\n if (top + dy < margin) dy = margin - top;\n if (!dx && !dy) return;\n viewport.x = formatNumber(viewport.x + dx);\n viewport.y = formatNumber(viewport.y + dy);\n this.render({ inspector: false, json: true });\n this.emitViewportChange('viewport:pan');\n }\n\n // Arrange nodes with a built-in layout. Positions are computed by the pure\n // computeLayout() module, then applied in place (NOT via load(), which would\n // wipe selection/viewport) so the result is one undoable, change-emitting step.\n layout(mode = 'tree', options = {}) {\n if (this.readonly) return this;\n const resolvedMode = LAYOUT_MODES.includes(mode) ? mode : 'tree';\n this.layoutMode = resolvedMode;\n this.syncArrangeSelect();\n const positions = computeLayout(this.documentData, resolvedMode, options);\n if (!positions.size) return this;\n\n let changed = false;\n this.documentData.nodes.forEach((node) => {\n const next = positions.get(node.id);\n if (!next) return;\n const x = formatNumber(next.x);\n const y = formatNumber(next.y);\n if (x !== node.x || y !== node.y) {\n node.x = x;\n node.y = y;\n changed = true;\n }\n });\n\n const rerouted = options.reroutePorts === false ? false : this.rerouteEdgePorts();\n if (!changed && !rerouted) return this;\n\n this.render();\n this.emitChange('layout', { mode: resolvedMode });\n if (options.fit) this.fitView();\n return this;\n }\n\n autoArrange(options = {}) {\n return this.layout('grid', options);\n }\n\n // Re-pick each edge's from/to port from the nodes' current centers, so a\n // freshly laid-out graph attaches connectors on sensible sides. Returns\n // whether any port actually changed.\n rerouteEdgePorts() {\n let changed = false;\n this.documentData.edges.forEach((edge) => {\n const fromNode = this.findNode(edge.from.nodeId);\n const toNode = this.findNode(edge.to.nodeId);\n if (!fromNode || !toNode) return;\n const fromCenter = {\n x: fromNode.x + fromNode.width / 2,\n y: fromNode.y + fromNode.height / 2,\n };\n const toCenter = { x: toNode.x + toNode.width / 2, y: toNode.y + toNode.height / 2 };\n const nextFrom = getPortByDirection(fromNode, toCenter).port;\n const nextTo = getPortByDirection(toNode, fromCenter).port;\n if (nextFrom !== edge.from.port || nextTo !== edge.to.port) {\n edge.from.port = nextFrom;\n edge.to.port = nextTo;\n changed = true;\n }\n });\n return changed;\n }\n\n applyNodePatch(node, patch = {}) {\n const nextType = normalizeNodeType(patch.type ?? node.type);\n node.type = nextType;\n node.x = patch.x == null ? node.x : formatNumber(toFiniteNumber(patch.x, node.x));\n node.y = patch.y == null ? node.y : formatNumber(toFiniteNumber(patch.y, node.y));\n node.text = isNodeTextEditable(nextType)\n ? patch.text == null\n ? node.text\n : String(patch.text)\n : getNodeSpec(nextType).text;\n\n node.width = clampNodeWidth(nextType, patch.width, node.width, this.nodeSizeBounds());\n node.height = clampNodeHeight(nextType, patch.height, node.height, this.nodeSizeBounds());\n\n if (isPlainObject(patch.data)) {\n node.data = deepClone(patch.data);\n }\n }\n\n updateNode(nodeId, patch = {}, options = {}) {\n const node = this.findNode(nodeId);\n if (!node) return null;\n\n const previousType = node.type;\n const previousSpec = DEFAULT_NODE_SPECS[previousType];\n this.applyNodePatch(node, patch);\n if (patch.type && previousType !== node.type) {\n const nextSpec = DEFAULT_NODE_SPECS[node.type];\n if (patch.width == null && node.width === previousSpec.width) {\n node.width = nextSpec.width;\n }\n if (patch.height == null && node.height === previousSpec.height) {\n node.height = nextSpec.height;\n }\n if (node.text === DEFAULT_NODE_SPECS[previousType].text) {\n node.text = nextSpec.text;\n }\n }\n\n this.render({\n scene: true,\n inspector: options.inspector !== false,\n json: true,\n });\n this.emitChange(options.reason || 'node:update', { node: deepClone(node) });\n return deepClone(node);\n }\n\n // Walk outgoing edges (from.nodeId -> to.nodeId) breadth-first to collect a\n // node and every descendant reachable through the directed graph. The visited\n // Set doubles as a cycle guard, so a diamond or loop is safe (each node once).\n collectDescendants(rootId) {\n const visited = new Set([rootId]);\n const queue = [rootId];\n while (queue.length) {\n const current = queue.shift();\n this.documentData.edges.forEach((edge) => {\n if (edge.from.nodeId === current && !visited.has(edge.to.nodeId)) {\n visited.add(edge.to.nodeId);\n queue.push(edge.to.nodeId);\n }\n });\n }\n return visited;\n }\n\n removeNode(nodeId, options = {}) {\n const id = sanitizeId(nodeId);\n if (!this.findNode(id)) return false;\n\n const ids = options.cascade ? this.collectDescendants(id) : new Set([id]);\n return this.removeNodeIds(ids, options.reason || 'node:remove', id);\n }\n\n removeNodeIds(ids, reason = 'node:remove', primaryId = null) {\n const idSet = ids instanceof Set ? ids : new Set(ids);\n const removed = this.documentData.nodes\n .filter((node) => idSet.has(node.id))\n .map((node) => node.id);\n if (!removed.length) return false;\n\n if (this.textEditor && idSet.has(this.textEditor.nodeId)) {\n this.stopTextEdit({ commit: false });\n }\n\n this.documentData.nodes = this.documentData.nodes.filter((node) => !idSet.has(node.id));\n this.documentData.edges = this.documentData.edges.filter(\n (edge) => !idSet.has(edge.from.nodeId) && !idSet.has(edge.to.nodeId),\n );\n\n if (this.selection?.kind === 'node' && idSet.has(this.selection.id)) {\n this.selection = null;\n }\n\n this.render();\n this.emitChange(reason, { nodeId: primaryId ?? removed[0], nodeIds: removed });\n return true;\n }\n\n updateEdge(edgeId, patch = {}, options = {}) {\n const edge = this.findEdge(edgeId);\n if (!edge) return null;\n\n const nodeIds = new Set(this.documentData.nodes.map((node) => node.id));\n const nextFrom = patch.from ? normalizeEndpoint(patch.from, edge.from.port) : edge.from;\n const nextTo = patch.to ? normalizeEndpoint(patch.to, edge.to.port) : edge.to;\n\n if (patch.from != null || patch.to != null) {\n if (!nodeIds.has(nextFrom.nodeId) || !nodeIds.has(nextTo.nodeId)) return null;\n if (!FLOWCHART_PORTS.includes(nextFrom.port) || !FLOWCHART_PORTS.includes(nextTo.port))\n return null;\n if (nextFrom.nodeId === nextTo.nodeId && nextFrom.port === nextTo.port) return null;\n edge.from = nextFrom;\n edge.to = nextTo;\n }\n\n if (patch.kind != null) {\n edge.kind = patch.kind === 'line' ? 'line' : 'arrow';\n if (patch.startMarker == null && patch.endMarker == null) {\n if (edge.kind === 'line') {\n edge.startMarker = 'none';\n edge.endMarker = 'none';\n } else if (edge.endMarker === 'none' && edge.startMarker === 'none') {\n edge.endMarker = 'arrow';\n }\n }\n }\n if (patch.startMarker != null) {\n edge.startMarker = normalizeEdgeMarker(patch.startMarker) || 'none';\n }\n if (patch.endMarker != null) {\n edge.endMarker = normalizeEdgeMarker(patch.endMarker) || 'none';\n }\n if (patch.route != null) {\n edge.route = normalizeEdgeRoute(patch.route);\n }\n if (patch.strokeWidth != null) {\n edge.strokeWidth = normalizeEdgeStrokeWidth(patch.strokeWidth);\n }\n if (patch.label != null) {\n edge.label = String(patch.label);\n }\n if (isPlainObject(patch.data)) {\n edge.data = deepClone(patch.data);\n }\n\n syncEdgeKind(edge);\n\n this.render({\n scene: true,\n inspector: options.inspector !== false,\n json: true,\n });\n this.emitChange(options.reason || 'edge:update', { edge: deepClone(edge) });\n return deepClone(edge);\n }\n\n // Accept `from`/`to` as a bare node id or `{ nodeId, port }`. When `autoPort`\n // is set, fill any omitted port by aiming each endpoint at the other node's\n // center via getPortByDirection \u2014 the same geometry the live connect tool\n // uses, so a programmatic edge picks the same side a dragged one would.\n resolveEdgeEndpoints(partialEdge) {\n const toEndpoint = (value) => {\n if (typeof value === 'string') return { nodeId: value };\n if (isPlainObject(value)) return { ...value };\n return {};\n };\n const from = toEndpoint(partialEdge.from);\n const to = toEndpoint(partialEdge.to);\n\n if (partialEdge.autoPort) {\n const fromNode = this.findNode(sanitizeId(from.nodeId));\n const toNode = this.findNode(sanitizeId(to.nodeId));\n if (fromNode && toNode) {\n const fromCenter = {\n x: fromNode.x + fromNode.width / 2,\n y: fromNode.y + fromNode.height / 2,\n };\n const toCenter = { x: toNode.x + toNode.width / 2, y: toNode.y + toNode.height / 2 };\n if (!FLOWCHART_PORTS.includes(from.port))\n from.port = getPortByDirection(fromNode, toCenter).port;\n if (!FLOWCHART_PORTS.includes(to.port))\n to.port = getPortByDirection(toNode, fromCenter).port;\n }\n }\n\n const rest = { ...partialEdge };\n delete rest.autoPort;\n return { ...rest, from, to };\n }\n\n addEdge(partialEdge = {}) {\n if (this.readonly) return null;\n\n const input = this.resolveEdgeEndpoints(partialEdge);\n const nodeIds = new Set(this.documentData.nodes.map((node) => node.id));\n const usedIds = new Set(this.documentData.edges.map((edge) => edge.id));\n const edge = normalizeEdge(input, this.documentData.edges.length, nodeIds, usedIds);\n\n if (!edge) return null;\n if (edge.from.nodeId === edge.to.nodeId && edge.from.port === edge.to.port) return null;\n\n this.documentData.edges.push(edge);\n this.select({ kind: 'edge', id: edge.id });\n this.syncJsonTextarea();\n this.emit('connect', { edge: deepClone(edge) });\n this.emitChange('edge:add', { edge: deepClone(edge) });\n return deepClone(edge);\n }\n\n removeEdge(edgeId) {\n const edgeIndex = this.documentData.edges.findIndex((edge) => edge.id === edgeId);\n if (edgeIndex === -1) return false;\n\n this.documentData.edges.splice(edgeIndex, 1);\n if (this.selection?.kind === 'edge' && this.selection.id === edgeId) {\n this.selection = null;\n }\n\n this.render();\n this.emitChange('edge:remove', { edgeId });\n return true;\n }\n\n deleteSelection() {\n if (!this.selection || this.readonly) return false;\n if (this.hasMultiSelection()) {\n return this.removeNodeIds(new Set(this.getSelectedNodeIds()), 'node:remove');\n }\n if (this.selection.kind === 'node') return this.removeNode(this.selection.id);\n return this.removeEdge(this.selection.id);\n }\n\n nodeSizeBounds() {\n return { min: this.minNodeSize, max: this.maxNodeSize };\n }\n\n scaleBounds() {\n return { min: this.minScale, max: this.maxScale };\n }\n\n normalizationLimits() {\n return { scaleBounds: this.scaleBounds(), sizeBounds: this.nodeSizeBounds() };\n }\n\n hasWideCamera() {\n return this.minScale < DEFAULT_MIN_SCALE || this.maxScale > DEFAULT_MAX_SCALE;\n }\n\n syncGrid() {\n const wide = this.hasWideCamera();\n const extent = wide ? WIDE_WORLD_EXTENT : DEFAULT_WORLD_EXTENT;\n this.gridRect?.setAttribute('x', String(-extent / 2));\n this.gridRect?.setAttribute('y', String(-extent / 2));\n this.gridRect?.setAttribute('width', String(extent));\n this.gridRect?.setAttribute('height', String(extent));\n const pattern = this.svg?.querySelector('pattern');\n const path = pattern?.querySelector('path');\n if (!pattern || !path) return;\n let tile = this.gridSize;\n if (wide) {\n const scale = Math.max(this.minScale, this.documentData?.viewport?.scale || 1);\n while (tile * scale < 12 && tile < extent / 8) tile *= 4;\n while (tile * scale > 48 && tile > 1.5) tile /= 4;\n tile = formatNumber(tile);\n path.setAttribute('vector-effect', 'non-scaling-stroke');\n } else {\n path.removeAttribute('vector-effect');\n }\n path.setAttribute('stroke-width', '1');\n pattern.setAttribute('width', String(tile));\n pattern.setAttribute('height', String(tile));\n path.setAttribute('d', `M ${tile} 0 L 0 0 0 ${tile}`);\n }\n\n setViewport(viewport) {\n this.documentData.viewport = normalizeViewport(viewport, this.scaleBounds());\n this.render({ inspector: false, json: true });\n this.emitViewportChange('viewport:set');\n return this;\n }\n\n zoomIn() {\n const width = this.canvasEl.clientWidth || 800;\n const height = this.canvasEl.clientHeight || 560;\n this.scaleAround(1.12, width / 2, height / 2, 'viewport:zoom');\n return this;\n }\n\n zoomOut() {\n const width = this.canvasEl.clientWidth || 800;\n const height = this.canvasEl.clientHeight || 560;\n this.scaleAround(1 / 1.12, width / 2, height / 2, 'viewport:zoom');\n return this;\n }\n\n resetView() {\n this.documentData.viewport = normalizeViewport({ x: 0, y: 0, scale: 1 }, this.scaleBounds());\n this.render({ inspector: false, json: true });\n this.emitViewportChange('viewport:reset');\n return this;\n }\n\n fitView() {\n const nodes = this.getVisibleNodes();\n if (!nodes.length) {\n return this.resetView();\n }\n\n const bounds = getBounds(nodes);\n const width = this.canvasEl.clientWidth || 800;\n const height = this.canvasEl.clientHeight || 560;\n const padding = 80;\n const contentWidth = Math.max(1, bounds.right - bounds.left);\n const contentHeight = Math.max(1, bounds.bottom - bounds.top);\n const scale = formatScale(\n clamp(\n Math.min((width - padding * 2) / contentWidth, (height - padding * 2) / contentHeight),\n this.minScale,\n this.maxScale,\n ),\n );\n\n this.documentData.viewport = {\n x: formatNumber(width / 2 - ((bounds.left + bounds.right) / 2) * scale),\n y: formatNumber(height / 2 - ((bounds.top + bounds.bottom) / 2) * scale),\n scale,\n };\n\n this.render({ inspector: false, json: true });\n this.emitViewportChange('viewport:fit');\n return this;\n }\n\n fitNode(nodeId, padding = 48) {\n const node = this.findNode(nodeId);\n if (!node || this.isNodeHidden(node.id)) return this;\n const pad = Math.max(0, toFiniteNumber(padding, 48));\n const width = this.canvasEl.clientWidth || 800;\n const height = this.canvasEl.clientHeight || 560;\n const availableWidth = Math.max(1, width - pad * 2);\n const availableHeight = Math.max(1, height - pad * 2);\n const scale = formatScale(\n clamp(\n Math.min(\n availableWidth / Math.max(1, node.width),\n availableHeight / Math.max(1, node.height),\n ),\n this.minScale,\n this.maxScale,\n ),\n );\n const centerX = node.x + node.width / 2;\n const centerY = node.y + node.height / 2;\n this.documentData.viewport = {\n x: formatNumber(width / 2 - centerX * scale),\n y: formatNumber(height / 2 - centerY * scale),\n scale,\n };\n this.render({ inspector: false, json: true });\n this.emitViewportChange('viewport:fit-node');\n return this;\n }\n\n clear() {\n this.stopTextEdit({ commit: false });\n this.activeTool = null;\n this.reconnectEdgeId = null;\n this.clipboard = null;\n this.documentData = normalizeDocument(\n {\n nodes: [],\n edges: [],\n viewport: { x: 0, y: 0, scale: 1 },\n },\n this.normalizationLimits(),\n );\n this.selection = null;\n this.render();\n this.emitChange('clear');\n return this;\n }\n\n updateOptions(options = {}) {\n if (this.destroyed) return this;\n if ('readonly' in options) {\n if (options.readonly && !this.readonly) {\n this.stopTextEdit({ commit: true });\n this.interaction = null;\n this.activeTool = null;\n this.reconnectEdgeId = null;\n }\n this.readonly = Boolean(options.readonly);\n this.root.classList.toggle('vd-flowchart-readonly', this.readonly);\n this.arrangeSelect.disabled = this.readonly;\n this.clearButton.disabled = this.readonly;\n this.loadJsonButton.disabled = this.readonly;\n }\n if ('gridSize' in options) {\n this.gridSize = clamp(toFiniteNumber(options.gridSize, DEFAULT_GRID_SIZE), 12, 64);\n const pattern = this.svg.querySelector('pattern');\n pattern.setAttribute('width', this.gridSize);\n pattern.setAttribute('height', this.gridSize);\n pattern\n .querySelector('path')\n .setAttribute('d', `M ${this.gridSize} 0 L 0 0 0 ${this.gridSize}`);\n }\n // autoFit is a readiness preference, not a request to reset the camera.\n if ('autoFit' in options) this.autoFit = Boolean(options.autoFit);\n if ('keyboardShortcuts' in options) {\n this.keyboardShortcuts = normalizeKeyboardShortcuts(options.keyboardShortcuts);\n }\n if ('snapGuides' in options) this.snapGuides = options.snapGuides !== false;\n if ('minimap' in options) this.setMinimapEnabled(options.minimap !== false);\n if ('autoLayout' in options) this.autoLayout = Boolean(options.autoLayout);\n if (\n 'minScale' in options ||\n 'maxScale' in options ||\n 'minNodeSize' in options ||\n 'maxNodeSize' in options\n ) {\n const nextScale = normalizeBoundPair(\n 'minScale' in options ? options.minScale : this.minScale,\n 'maxScale' in options ? options.maxScale : this.maxScale,\n DEFAULT_MIN_SCALE,\n DEFAULT_MAX_SCALE,\n );\n const nextSize = normalizeBoundPair(\n 'minNodeSize' in options ? options.minNodeSize : this.minNodeSize,\n 'maxNodeSize' in options ? options.maxNodeSize : this.maxNodeSize,\n DEFAULT_MIN_NODE_SIZE,\n DEFAULT_MAX_NODE_SIZE,\n );\n this.minScale = nextScale.min;\n this.maxScale = nextScale.max;\n this.minNodeSize = nextSize.min;\n this.maxNodeSize = nextSize.max;\n const clamped = clamp(\n formatScale(this.documentData.viewport.scale),\n this.minScale,\n this.maxScale,\n );\n if (clamped !== this.documentData.viewport.scale) {\n this.documentData.viewport.scale = clamped;\n this.pendingBoundsEvent = true;\n }\n }\n this.syncCanvasLabel();\n if (this.shortcutsHelpOpen) this.renderShortcutsHelp();\n if ('history' in options && (options.history !== false) !== this.historyEnabled) {\n this.historyEnabled = options.history !== false;\n this.history = [];\n this.historyIndex = -1;\n this.seedHistory();\n }\n if ('historyLimit' in options) {\n this.historyLimit = Math.max(1, Math.floor(toFiniteNumber(options.historyLimit, 100)));\n if (this.history.length > this.historyLimit) {\n const start = Math.max(0, this.historyIndex - this.historyLimit + 1);\n this.history = this.history.slice(start, start + this.historyLimit);\n this.historyIndex -= start;\n }\n }\n this.render();\n if (this.pendingBoundsEvent) {\n this.pendingBoundsEvent = false;\n this.emitViewportChange('viewport:bounds');\n }\n this.updateHistoryButtons();\n return this;\n }\n\n load(data, options = {}) {\n const documentData = normalizeDocument(data, this.normalizationLimits());\n if (options.silent && JSON.stringify(documentData) === JSON.stringify(this.documentData)) {\n return this;\n }\n this.stopTextEdit({ commit: false });\n this.activeTool = null;\n this.reconnectEdgeId = null;\n const previousSelection = this.selection;\n this.documentData = documentData;\n this.selection = this.resolvePreservedSelection(previousSelection, options.preserveSelection);\n this.render();\n if (options.silent) {\n if (this.historyEnabled) this.recordHistory('load');\n } else {\n this.emitChange('load');\n }\n return this;\n }\n\n toJSON() {\n return deepClone({\n version: FLOWCHART_DOCUMENT_VERSION,\n viewport: this.documentData.viewport,\n nodes: this.documentData.nodes,\n edges: this.documentData.edges,\n });\n }\n\n destroy() {\n if (this.destroyed) return;\n this.destroyed = true;\n if (this.minimapFrame && typeof cancelAnimationFrame === 'function') {\n cancelAnimationFrame(this.minimapFrame);\n }\n this.minimapFrame = 0;\n this.activeTool = null;\n this.stopTextEdit({ commit: false });\n this.resizeObserver?.disconnect();\n this.resizeObserver = null;\n this.unbindEvents();\n this.sceneNodeMap?.clear();\n this.nodeElements?.clear();\n this.edgeElements?.clear();\n this.incidentEdges?.clear();\n this.element.innerHTML = '';\n this.element.classList.remove('vd-flowchart-host');\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["VdFlowchart", "queue", "node", "edge", "distanceToBounds", "lines", "startY", "ref", "VdFlowchart"]
|
|
4
|
+
"sourcesContent": ["// Entry for @vanduo-oss/vd3-flowchart.\n//\n// The Vue 3 wrapper is the primary export; the framework-agnostic editor core\n// (1.2.0 lineage) is re-exported alongside as VdFlowchartCore. Named exports\n// only \u2014 no default.\n\nexport { VdFlowchart } from './vue.js';\nexport {\n VdFlowchart as VdFlowchartCore,\n computeLayout,\n LAYOUT_MODES,\n VD_FLOWCHART_VERSION,\n FLOWCHART_DOCUMENT_VERSION,\n FLOWCHART_NODE_TYPES,\n FLOWCHART_PORTS,\n FLOWCHART_EDGE_MARKERS,\n FLOWCHART_EDGE_ROUTES,\n FLOWCHART_KEYBOARD_SHORTCUTS,\n} from './core.js';\n", "/**\n * Vue 3 bindings for the flowchart component \u2014 the primary export surface.\n *\n * import { VdFlowchart } from '@vanduo-oss/vd3-flowchart';\n * <VdFlowchart :data=\"doc\" :readonly=\"false\" @change=\"onChange\" @ready=\"onReady\" />\n *\n * The core editor stays framework-agnostic in ./core.js. SSR-safe: the editor\n * is created on mount (client) into a plain container the server can\n * pre-render.\n */\nimport { defineComponent, h, ref, onMounted, onBeforeUnmount, watch } from 'vue';\nimport { VdFlowchart as VdFlowchartCore } from './core.js';\n\n// `ready` is forwarded from the core editor (fires post-layout) like the rest.\nconst FORWARDED_EVENTS = ['change', 'select', 'viewport', 'connect', 'ready'];\n// Props passed to the core on creation and through updateOptions() after.\nconst EDITOR_OPTION_KEYS = [\n 'readonly',\n 'gridSize',\n 'autoFit',\n 'history',\n 'historyLimit',\n 'keyboardShortcuts',\n 'snapGuides',\n 'minimap',\n 'autoLayout',\n 'minScale',\n 'maxScale',\n 'minNodeSize',\n 'maxNodeSize',\n];\n\nexport const VdFlowchart = defineComponent({\n name: 'VdFlowchart',\n props: {\n /** Flowchart document \u2014 `{ nodes, edges }`. */\n data: { type: Object, default: () => ({}) },\n /** Render as a non-editable viewer. */\n readonly: { type: Boolean, default: false },\n /** Background grid size in px. */\n gridSize: { type: Number, default: undefined },\n /** Keep the current selection across `data`-driven reloads when possible. */\n preserveSelection: { type: Boolean, default: false },\n /** Fit the view to content once the editor reports a measurable size. */\n autoFit: { type: Boolean, default: false },\n /** Enable the built-in undo/redo history (default true). */\n history: { type: Boolean, default: true },\n /** Maximum number of history entries to retain. */\n historyLimit: { type: Number, default: undefined },\n /** Keyboard model: 'mindmap' (Tab child, Enter sibling) or 'basic'. */\n keyboardShortcuts: { type: String, default: 'mindmap' },\n /** Snap dragged nodes to other nodes' edges and centres (default true). */\n snapGuides: { type: Boolean, default: true },\n /** Show the overview minimap in the canvas corner (default true). */\n minimap: { type: Boolean, default: true },\n /** Re-run the current layout after keyboard or handle insertions (default false). */\n autoLayout: { type: Boolean, default: false },\n /** Lowest camera scale. Defaults to 0.35. Set it together with maxScale. */\n minScale: { type: Number, default: undefined },\n /** Highest camera scale. Defaults to 3. Set it together with minScale. */\n maxScale: { type: Number, default: undefined },\n /** Smallest resizable-node side. Defaults to 56. Set it together with maxNodeSize. */\n minNodeSize: { type: Number, default: undefined },\n /** Largest resizable-node side. Defaults to 420. Set it together with minNodeSize. */\n maxNodeSize: { type: Number, default: undefined },\n },\n emits: ['change', 'select', 'viewport', 'connect', 'ready'],\n setup(props, { emit, expose }) {\n const el = ref(null);\n let instance = null;\n\n const editorOptions = () =>\n Object.fromEntries(\n EDITOR_OPTION_KEYS.flatMap((key) => {\n const value = props[key];\n if (\n (key === 'minScale' ||\n key === 'maxScale' ||\n key === 'minNodeSize' ||\n key === 'maxNodeSize') &&\n value == null\n ) {\n return [];\n }\n return [[key, value]];\n }),\n );\n\n const create = () => {\n instance = new VdFlowchartCore({\n element: el.value,\n data: props.data,\n ...editorOptions(),\n });\n FORWARDED_EVENTS.forEach((name) => {\n instance.on(name, (payload) => emit(name, payload));\n });\n };\n\n onMounted(() => {\n if (typeof window === 'undefined' || !el.value) return;\n create();\n });\n\n // External replacements are silent; feeding change.document back is safe.\n watch(\n () => props.data,\n (next) => {\n if (instance && typeof instance.load === 'function') {\n instance.load(next, { preserveSelection: props.preserveSelection, silent: true });\n }\n },\n { deep: true },\n );\n watch(\n () => EDITOR_OPTION_KEYS.map((key) => props[key]),\n () => {\n if (instance) instance.updateOptions(editorOptions());\n },\n );\n\n onBeforeUnmount(() => {\n if (instance) {\n instance.destroy();\n instance = null;\n }\n });\n\n expose({\n getInstance: () => instance,\n undo: () => instance?.undo(),\n redo: () => instance?.redo(),\n canUndo: () => Boolean(instance?.canUndo()),\n canRedo: () => Boolean(instance?.canRedo()),\n layout: (mode, options) => instance?.layout(mode, options),\n fitNode: (nodeId, padding) => instance?.fitNode(nodeId, padding),\n });\n\n return () => h('div', { ref: el, class: 'vd-flowchart' });\n },\n});\n", "// Pure, framework-free graph layout for the vd3-flowchart component.\n//\n// computeLayout(documentData, mode, options) -> Map<nodeId, { x, y }>\n//\n// Positions are top-left in world coordinates. The input is never mutated, so\n// the function is trivially unit-testable and reusable outside the editor. The\n// editor's `layout()` method applies the result in place.\n//\n// Modes:\n// 'tree' layered hierarchy from directed edges (from -> to), one axis per\n// depth level, siblings centered under their parent.\n// 'radial' root at the center, descendants on concentric rings (mind maps).\n// 'grid' edge-agnostic row/col snap of every node (autoArrange).\n\nconst DIRECTIONS = {\n right: { main: 'x', sign: 1 },\n left: { main: 'x', sign: -1 },\n down: { main: 'y', sign: 1 },\n up: { main: 'y', sign: -1 },\n};\n\nconst DEFAULT_LEVEL_EDGE_GAP = 88;\nconst DEFAULT_SIBLING_EDGE_GAP = 64;\n\nfunction num(value, fallback) {\n const next = Number(value);\n return Number.isFinite(next) ? next : fallback;\n}\n\nfunction buildGraph(nodes, edges) {\n const byId = new Map(nodes.map((node) => [node.id, node]));\n const children = new Map(nodes.map((node) => [node.id, []]));\n const indegree = new Map(nodes.map((node) => [node.id, 0]));\n edges.forEach((edge) => {\n const from = edge?.from?.nodeId;\n const to = edge?.to?.nodeId;\n if (from === to || !byId.has(from) || !byId.has(to)) return;\n children.get(from).push(to);\n indegree.set(to, indegree.get(to) + 1);\n });\n return { byId, children, indegree };\n}\n\nfunction pickRoots(nodes, indegree, optRoot) {\n if (optRoot && indegree.has(optRoot)) return [optRoot];\n const roots = nodes.filter((node) => indegree.get(node.id) === 0).map((node) => node.id);\n return roots.length ? roots : nodes.length ? [nodes[0].id] : [];\n}\n\n// Spanning forest with cycle-safe longest-path ranks so a shared child (e.g. a\n// diamond join or End node) sits below all incoming forward branches instead of\n// staying pinned to whichever short branch DFS visited first.\nfunction spanningForest(allIds, roots, children) {\n const visited = new Set();\n const active = new Set();\n const forestRoots = [];\n const forwardParents = new Map(allIds.map((id) => [id, []]));\n\n const dfs = (id) => {\n visited.add(id);\n active.add(id);\n (children.get(id) || []).forEach((child) => {\n if (active.has(child)) return;\n const list = forwardParents.get(child);\n if (list && !list.includes(id)) list.push(id);\n if (!visited.has(child)) dfs(child);\n });\n active.delete(id);\n };\n\n roots.forEach((root) => {\n if (!visited.has(root)) {\n forestRoots.push(root);\n dfs(root);\n }\n });\n allIds.forEach((id) => {\n if (!visited.has(id)) {\n forestRoots.push(id);\n dfs(id);\n }\n });\n\n const depth = new Map(allIds.map((id) => [id, 0]));\n const limit = Math.max(1, allIds.length);\n for (let pass = 0; pass < limit; pass += 1) {\n let changed = false;\n for (const id of allIds) {\n const parents = forwardParents.get(id) || [];\n for (const parent of parents) {\n const nextDepth = Math.min(limit, (depth.get(parent) || 0) + 1);\n if (nextDepth > (depth.get(id) || 0)) {\n depth.set(id, nextDepth);\n changed = true;\n }\n }\n }\n if (!changed) break;\n }\n\n const tree = new Map(allIds.map((id) => [id, []]));\n const rootSet = new Set(forestRoots);\n const chosenParent = new Map();\n for (const id of allIds) {\n if (rootSet.has(id)) continue;\n const parents = forwardParents.get(id) || [];\n if (!parents.length) continue;\n let bestParent = parents[0];\n let bestDepth = depth.get(bestParent) ?? -1;\n for (let index = 1; index < parents.length; index += 1) {\n const candidate = parents[index];\n const candidateDepth = depth.get(candidate) ?? -1;\n if (candidateDepth > bestDepth) {\n bestDepth = candidateDepth;\n bestParent = candidate;\n }\n }\n chosenParent.set(id, bestParent);\n }\n const placedChild = new Set();\n for (const parentId of allIds) {\n const out = tree.get(parentId);\n for (const childId of children.get(parentId) || []) {\n if (chosenParent.get(childId) === parentId && !placedChild.has(childId)) {\n placedChild.add(childId);\n out.push(childId);\n }\n }\n }\n\n return { depth, tree, forestRoots };\n}\n\nfunction treeCenters(forestRoots, tree, depth, sizeOf, options) {\n const dir = DIRECTIONS[options.direction] || DIRECTIONS.right;\n const hasExplicitLevel = Number.isFinite(Number(options.levelGap));\n const hasExplicitSibling = Number.isFinite(Number(options.siblingGap));\n const explicitLevelGap = num(options.levelGap, 220);\n const explicitSiblingGap = num(options.siblingGap, 140);\n const edgeSiblingGap = hasExplicitSibling\n ? Math.max(16, explicitSiblingGap - 96)\n : DEFAULT_SIBLING_EDGE_GAP;\n\n const crossSpan = (id) => {\n const size = sizeOf(id);\n return dir.main === 'x' ? size.height : size.width;\n };\n const mainSpan = (id) => {\n const size = sizeOf(id);\n return dir.main === 'x' ? size.width : size.height;\n };\n\n const subtreeSpan = new Map();\n const subtreeCount = new Map();\n const measure = (id) => {\n const selfSpan = crossSpan(id);\n const kids = tree.get(id) || [];\n if (!kids.length) {\n subtreeSpan.set(id, selfSpan);\n subtreeCount.set(id, 1);\n return selfSpan;\n }\n let childTotal = 0;\n let totalCount = 1;\n kids.forEach((kid, index) => {\n if (index > 0) childTotal += edgeSiblingGap;\n childTotal += measure(kid);\n totalCount += subtreeCount.get(kid) || 1;\n });\n const span = Math.max(selfSpan, childTotal);\n subtreeSpan.set(id, span);\n subtreeCount.set(id, totalCount);\n return span;\n };\n forestRoots.forEach(measure);\n\n const crossOf = new Map();\n const place = (id, startCross) => {\n const span = subtreeSpan.get(id) || crossSpan(id);\n const kids = tree.get(id) || [];\n if (!kids.length) {\n const center = startCross + span / 2;\n crossOf.set(id, center);\n return center;\n }\n let childTotal = 0;\n const kidSpans = kids.map((kid, index) => {\n const kidSpan = subtreeSpan.get(kid) || crossSpan(kid);\n if (index > 0) childTotal += edgeSiblingGap;\n childTotal += kidSpan;\n return kidSpan;\n });\n let cursor = startCross + (span - childTotal) / 2;\n const childCenters = kids.map((kid, index) => {\n const kidSpan = kidSpans[index];\n const center = place(kid, cursor);\n cursor += kidSpan + edgeSiblingGap;\n return center;\n });\n if (kids.length >= 2) {\n const counts = kids.map((kid) => subtreeCount.get(kid) || 1);\n const maxCount = Math.max(...counts);\n const minCount = Math.min(...counts);\n if (maxCount > minCount) {\n const primaryIndex = counts.indexOf(maxCount);\n const center = childCenters[primaryIndex];\n crossOf.set(id, center);\n return center;\n }\n }\n const center = (childCenters[0] + childCenters[childCenters.length - 1]) / 2;\n crossOf.set(id, center);\n return center;\n };\n\n let rootCursor = 0;\n forestRoots.forEach((root, index) => {\n if (index > 0) rootCursor += edgeSiblingGap;\n const span = subtreeSpan.get(root) || crossSpan(root);\n place(root, rootCursor);\n rootCursor += span;\n });\n\n let maxDepth = 0;\n const maxMainAtDepth = new Map();\n crossOf.forEach((_cross, id) => {\n const d = depth.get(id) || 0;\n if (d > maxDepth) maxDepth = d;\n const current = maxMainAtDepth.get(d) || 0;\n const span = mainSpan(id);\n if (span > current) maxMainAtDepth.set(d, span);\n });\n\n const mainCenterAtDepth = new Map([[0, 0]]);\n for (let d = 1; d <= maxDepth; d += 1) {\n const prevCenter = mainCenterAtDepth.get(d - 1) || 0;\n const prevSpan = maxMainAtDepth.get(d - 1) || 160;\n const currSpan = maxMainAtDepth.get(d) || 160;\n const step = hasExplicitLevel\n ? Math.max(explicitLevelGap, (prevSpan + currSpan) / 2 + 24)\n : (prevSpan + currSpan) / 2 + DEFAULT_LEVEL_EDGE_GAP;\n mainCenterAtDepth.set(d, prevCenter + step * dir.sign);\n }\n\n const centers = new Map();\n crossOf.forEach((cross, id) => {\n const main = mainCenterAtDepth.get(depth.get(id) || 0) || 0;\n centers.set(\n id,\n dir.main === 'x' ? { centerX: main, centerY: cross } : { centerX: cross, centerY: main },\n );\n });\n return centers;\n}\n\nfunction radialCenters(forestRoots, tree, depth, options) {\n const ringGap = num(options.radius, 220);\n const leaves = [];\n const collect = (id) => {\n const kids = tree.get(id) || [];\n if (!kids.length) leaves.push(id);\n else kids.forEach(collect);\n };\n forestRoots.forEach(collect);\n\n const total = Math.max(1, leaves.length);\n const leafAngle = new Map(leaves.map((id, index) => [id, ((index + 0.5) / total) * Math.PI * 2]));\n\n const angleOf = new Map();\n const resolveAngle = (id) => {\n const kids = tree.get(id) || [];\n if (!kids.length) {\n angleOf.set(id, leafAngle.get(id));\n return angleOf.get(id);\n }\n const childAngles = kids.map(resolveAngle);\n const mean = childAngles.reduce((sum, value) => sum + value, 0) / childAngles.length;\n angleOf.set(id, mean);\n return mean;\n };\n forestRoots.forEach(resolveAngle);\n\n const centers = new Map();\n angleOf.forEach((angle, id) => {\n const radius = (depth.get(id) || 0) * ringGap;\n centers.set(id, { centerX: Math.cos(angle) * radius, centerY: Math.sin(angle) * radius });\n });\n return centers;\n}\n\nfunction gridCenters(nodes, sizeOf, options) {\n const gap = num(options.gap, 48);\n const columns = Math.max(\n 1,\n Math.floor(num(options.columns, Math.ceil(Math.sqrt(nodes.length || 1)))),\n );\n let cellW = 0;\n let cellH = 0;\n nodes.forEach((node) => {\n const size = sizeOf(node.id);\n cellW = Math.max(cellW, size.width);\n cellH = Math.max(cellH, size.height);\n });\n cellW += gap;\n cellH += gap;\n\n const sorted = [...nodes].sort((a, b) => a.y - b.y || a.x - b.x);\n const centers = new Map();\n sorted.forEach((node, index) => {\n const col = index % columns;\n const row = Math.floor(index / columns);\n centers.set(node.id, { centerX: col * cellW, centerY: row * cellH });\n });\n return centers;\n}\n\nexport function computeLayout(documentData, mode = 'tree', options = {}) {\n const nodes = Array.isArray(documentData?.nodes) ? documentData.nodes : [];\n const edges = Array.isArray(documentData?.edges) ? documentData.edges : [];\n if (!nodes.length) return new Map();\n\n const { byId, children, indegree } = buildGraph(nodes, edges);\n const sizeOf = (id) => {\n const node = byId.get(id);\n return { width: num(node?.width, 160), height: num(node?.height, 96) };\n };\n const allIds = nodes.map((node) => node.id);\n\n let centers;\n let anchorId = nodes[0].id;\n if (mode === 'grid') {\n centers = gridCenters(nodes, sizeOf, options);\n } else {\n const rootOpt = options.root == null ? null : String(options.root).trim();\n const roots = pickRoots(nodes, indegree, rootOpt);\n anchorId = roots[0] || anchorId;\n const { depth, tree, forestRoots } = spanningForest(allIds, roots, children);\n centers =\n mode === 'radial'\n ? radialCenters(forestRoots, tree, depth, options)\n : treeCenters(forestRoots, tree, depth, sizeOf, options);\n }\n\n // Translate so the anchor node keeps its previous center \u2014 re-layout nudges\n // the structure into shape without teleporting the whole diagram.\n const anchorNode = byId.get(anchorId);\n const anchorCenter = centers.get(anchorId) || { centerX: 0, centerY: 0 };\n const dx = anchorNode ? anchorNode.x + anchorNode.width / 2 - anchorCenter.centerX : 0;\n const dy = anchorNode ? anchorNode.y + anchorNode.height / 2 - anchorCenter.centerY : 0;\n\n const result = new Map();\n centers.forEach((center, id) => {\n const size = sizeOf(id);\n result.set(id, {\n x: Math.round((center.centerX + dx - size.width / 2) * 100) / 100,\n y: Math.round((center.centerY + dy - size.height / 2) * 100) / 100,\n });\n });\n return result;\n}\n\nexport const LAYOUT_MODES = ['tree', 'radial', 'grid'];\n", "// Pure geometry for keyboard-driven mind-map editing: spatial navigation and\n// placement of new branch nodes. Inputs are never mutated.\n//\n// Directions are screen-space ('right' | 'left' | 'down' | 'up'), the same\n// vocabulary as addNode({ relativeTo: { direction } }).\n\nexport const DIRECTION_PORTS = { right: 'right', left: 'left', down: 'bottom', up: 'top' };\nexport const PORT_DIRECTIONS = { right: 'right', left: 'left', bottom: 'down', top: 'up' };\n\nconst OPPOSITE_DIRECTIONS = { right: 'left', left: 'right', down: 'up', up: 'down' };\nconst DIRECTION_VECTORS = {\n right: { x: 1, y: 0 },\n left: { x: -1, y: 0 },\n down: { x: 0, y: 1 },\n up: { x: 0, y: -1 },\n};\n\nexport const BRANCH_GAP = 72;\nexport const SIBLING_GAP = 24;\nconst COLLISION_GAP = 12;\nconst COLLISION_STEP = 12;\nconst MAX_COLLISION_STEPS = 400;\nconst BRANCH_RING_STEP = 48;\nconst MAX_BRANCH_RINGS = 8;\n// Half-angle of the preferred navigation cone (60 degrees).\nconst NAVIGATION_CONE = Math.tan(Math.PI / 3);\n\nfunction centerOf(node) {\n return { x: node.x + node.width / 2, y: node.y + node.height / 2 };\n}\n\nexport function oppositeDirection(direction) {\n return OPPOSITE_DIRECTIONS[direction] || 'left';\n}\n\n/** Dominant screen direction from one node's centre to another's. */\nexport function directionBetween(from, to) {\n const a = centerOf(from);\n const b = centerOf(to);\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n if (Math.abs(dx) >= Math.abs(dy)) return dx >= 0 ? 'right' : 'left';\n return dy >= 0 ? 'down' : 'up';\n}\n\n/**\n * Nearest node in `direction` from `fromNode`. Candidates are scored by their\n * distance along the direction plus twice their perpendicular offset; nodes\n * inside a 60-degree half-cone win over the rest of the half-plane.\n */\nexport function findSpatialNeighbor(nodes, fromNode, direction) {\n const vector = DIRECTION_VECTORS[direction];\n if (!vector || !fromNode) return null;\n const origin = centerOf(fromNode);\n let bestCone = null;\n let bestPlane = null;\n nodes.forEach((node) => {\n if (node.id === fromNode.id) return;\n const center = centerOf(node);\n const dx = center.x - origin.x;\n const dy = center.y - origin.y;\n const along = dx * vector.x + dy * vector.y;\n if (along <= 0) return;\n const across = Math.abs(dx * vector.y - dy * vector.x);\n const score = along + across * 2;\n if (across <= along * NAVIGATION_CONE && (!bestCone || score < bestCone.score)) {\n bestCone = { node, score };\n }\n if (!bestPlane || score < bestPlane.score) bestPlane = { node, score };\n });\n return (bestCone || bestPlane)?.node ?? null;\n}\n\n/** Node whose centre is closest to `point`. */\nexport function findNearestNode(nodes, point) {\n let best = null;\n nodes.forEach((node) => {\n const center = centerOf(node);\n const distance = Math.hypot(center.x - point.x, center.y - point.y);\n if (!best || distance < best.distance) best = { node, distance };\n });\n return best?.node ?? null;\n}\n\nfunction overlapsAny(rect, nodes) {\n return nodes.some(\n (node) =>\n rect.x < node.x + node.width + COLLISION_GAP &&\n rect.x + rect.width + COLLISION_GAP > node.x &&\n rect.y < node.y + node.height + COLLISION_GAP &&\n rect.y + rect.height + COLLISION_GAP > node.y,\n );\n}\n\n/**\n * Top-left position for a new node of `size` on the `direction` side of\n * `parent`. With `anchor` (a sibling) the node goes right after it \u2014 or right\n * before it when `before` is set; otherwise it goes after the last sibling on\n * that side, or level with the parent when there is none, then moves to the\n * nearest spot that overlaps nothing in `nodes`.\n */\nexport function placeBranchNode({\n nodes,\n parent,\n siblings = [],\n direction,\n size,\n anchor = null,\n before = false,\n}) {\n const horizontal = direction === 'right' || direction === 'left';\n const cross = horizontal ? 'y' : 'x';\n const crossSize = horizontal ? 'height' : 'width';\n const lastSibling = siblings.reduce(\n (last, node) =>\n !last || node[cross] + node[crossSize] > last[cross] + last[crossSize] ? node : last,\n null,\n );\n const reference = anchor || lastSibling;\n\n const rect = { x: 0, y: 0, width: size.width, height: size.height };\n if (reference) {\n if (direction === 'right') rect.x = reference.x;\n if (direction === 'left') rect.x = reference.x + reference.width - size.width;\n if (direction === 'down') rect.y = reference.y;\n if (direction === 'up') rect.y = reference.y + reference.height - size.height;\n rect[cross] = before\n ? reference[cross] - SIBLING_GAP - size[crossSize]\n : reference[cross] + reference[crossSize] + SIBLING_GAP;\n } else {\n if (direction === 'right') rect.x = parent.x + parent.width + BRANCH_GAP;\n if (direction === 'left') rect.x = parent.x - BRANCH_GAP - size.width;\n if (direction === 'down') rect.y = parent.y + parent.height + BRANCH_GAP;\n if (direction === 'up') rect.y = parent.y - BRANCH_GAP - size.height;\n rect[cross] = parent[cross] + parent[crossSize] / 2 - size[crossSize] / 2;\n }\n\n // A sibling keeps its order by sliding one way only; a first child may go\n // either way from level with its parent.\n const crossSign = reference ? (before ? -1 : 1) : 0;\n const result = nearestFreeSlot(\n rect,\n nodes,\n cross,\n horizontal ? 'x' : 'y',\n DIRECTION_VECTORS[direction],\n crossSign,\n );\n return { x: Math.round(result.x * 100) / 100, y: Math.round(result.y * 100) / 100 };\n}\n\nfunction crossOffsetAt(index, crossSign) {\n if (crossSign) return crossSign * COLLISION_STEP * index;\n return COLLISION_STEP * Math.ceil(index / 2) * (index % 2 ? 1 : -1);\n}\n\n// Free spot closest to the ideal position: slide along the sibling axis and,\n// when that column is crowded, step further out along the branch.\nfunction nearestFreeSlot(rect, nodes, cross, main, vector, crossSign) {\n const origin = { ...rect };\n const outward = vector.x + vector.y;\n let best = null;\n for (let ring = 0; ring <= MAX_BRANCH_RINGS; ring += 1) {\n const mainOffset = ring * BRANCH_RING_STEP;\n if (best && mainOffset >= best.cost) break;\n const candidate = { ...origin, [main]: origin[main] + outward * mainOffset };\n for (let index = 0; index <= MAX_COLLISION_STEPS; index += 1) {\n const crossOffset = crossOffsetAt(index, crossSign);\n const cost = Math.hypot(mainOffset, crossOffset);\n if (best && cost >= best.cost) break;\n candidate[cross] = origin[cross] + crossOffset;\n if (!overlapsAny(candidate, nodes)) {\n best = { rect: { ...candidate }, cost };\n break;\n }\n }\n }\n return best ? best.rect : origin;\n}\n", "/* global queueMicrotask */\nimport { computeLayout, LAYOUT_MODES } from './layout.js';\nimport {\n DIRECTION_PORTS,\n PORT_DIRECTIONS,\n findNearestNode,\n findSpatialNeighbor,\n oppositeDirection,\n placeBranchNode,\n} from './mindmap.js';\n\n// Re-export the pure layout helper so consumers can compute positions without\n// an editor instance.\nexport { computeLayout, LAYOUT_MODES } from './layout.js';\n\nconst SVG_NS = 'http://www.w3.org/2000/svg';\n\n// Phosphor regular paths (MIT) \u2014 inlined like draw so the component stays\n// self-contained. viewBox 0 0 256 256, fill currentColor.\nconst TOOLBAR_ICON_PATHS = {\n 'zoom-out':\n 'M229.66,218.34l-50.07-50.06a88.11,88.11,0,1,0-11.31,11.31l50.06,50.07a8,8,0,0,0,11.32-11.32ZM40,112a72,72,0,1,1,72,72A72.08,72.08,0,0,1,40,112Zm112-8H88a8,8,0,0,0,0,16h64a8,8,0,0,0,0-16Z',\n 'zoom-in':\n 'M229.66,218.34l-50.07-50.06a88.11,88.11,0,1,0-11.31,11.31l50.06,50.07a8,8,0,0,0,11.32-11.32ZM40,112a72,72,0,1,1,72,72A72.08,72.08,0,0,1,40,112Zm112,24H128v24a8,8,0,0,1-16,0V136H88a8,8,0,0,1,0-16h24V96a8,8,0,0,1,16,0v24h24a8,8,0,0,1,0,16Z',\n 'reset-view':\n 'M240,56v48a8,8,0,0,1-8,8H184a8,8,0,0,1,0-16h28.69L187.31,70.63A80,80,0,1,0,208,128a8,8,0,0,1,16,0,96,96,0,1,1-27.22-66.91L224,85.8V56a8,8,0,0,1,16,0Z',\n 'fit-view':\n 'M216,48V88a8,8,0,0,1-16,0V67.31l-42.34,42.35a8,8,0,0,1-11.32-11.32L188.69,56H168a8,8,0,0,1,0-16h40A8,8,0,0,1,216,48ZM98.34,146.34,56,188.69V168a8,8,0,0,0-16,0v40a8,8,0,0,0,8,8H88a8,8,0,0,0,0-16H67.31l42.35-42.34a8,8,0,0,0-11.32-11.32Zm11.32-36.68L67.31,56H88a8,8,0,0,0,0-16H48a8,8,0,0,0-8,8V88a8,8,0,0,0,16,0V67.31l42.34,42.35a8,8,0,0,0,11.32-11.32ZM208,160a8,8,0,0,0-8,8v20.69l-42.34-42.35a8,8,0,0,0-11.32,11.32L188.69,200H168a8,8,0,0,0,0,16h40a8,8,0,0,0,8-8V168A8,8,0,0,0,208,160Z',\n undo: 'M224,128a96,96,0,0,1-94.71,96H128A95.38,95.38,0,0,1,62.1,197.8a8,8,0,0,1,11-11.63A80,80,0,1,0,71.43,71.39a3.07,3.07,0,0,1-.26.25L44.59,96H72a8,8,0,0,1,0,16H24a8,8,0,0,1-8-8V56a8,8,0,0,1,16,0V85.8L60.25,60A96,96,0,0,1,224,128Z',\n redo: 'M240,56v48a8,8,0,0,1-8,8H184a8,8,0,0,1,0-16H211.4L184.81,71.64l-.25-.24a80,80,0,1,0-1.67,114.78,8,8,0,0,1,11,11.63A95.44,95.44,0,0,1,128,224h-1.32A96,96,0,1,1,195.75,60L224,85.8V56a8,8,0,1,1,16,0Z',\n minimap:\n 'M228.92,49.69a8,8,0,0,0-6.86-1.45L160.93,63.52,99.58,32.84a8,8,0,0,0-5.52-.6l-64,16A8,8,0,0,0,24,56V200a8,8,0,0,0,9.94,7.76l61.13-15.28,61.35,30.68A8.15,8.15,0,0,0,160,224a8,8,0,0,0,1.94-.24l64-16A8,8,0,0,0,232,200V56A8,8,0,0,0,228.92,49.69ZM104,52.94l48,24V203.06l-48-24ZM40,62.25l48-12v127.5l-48,12Zm176,131.5-48,12V78.25l48-12Z',\n clear:\n 'M216,48H176V40a24,24,0,0,0-24-24H104A24,24,0,0,0,80,40v8H40a8,8,0,0,0,0,16h8V208a16,16,0,0,0,16,16H192a16,16,0,0,0,16-16V64h8a8,8,0,0,0,0-16ZM96,40a8,8,0,0,1,8-8h48a8,8,0,0,1,8,8v8H96Zm96,168H64V64H192ZM112,104v64a8,8,0,0,1-16,0V104a8,8,0,0,1,16,0Zm48,0v64a8,8,0,0,1-16,0V104a8,8,0,0,1,16,0Z',\n};\n\nconst TOOLBAR_ACTIONS = [\n { action: 'zoom-out', label: 'Zoom out', icon: 'zoom-out' },\n { action: 'zoom-in', label: 'Zoom in', icon: 'zoom-in' },\n { action: 'reset-view', label: 'Reset view', icon: 'reset-view' },\n { action: 'fit-view', label: 'Fit view', icon: 'fit-view' },\n { action: 'undo', label: 'Undo', icon: 'undo' },\n { action: 'redo', label: 'Redo', icon: 'redo' },\n];\n\nconst LAYOUT_OPTIONS = [\n { value: 'tree', label: 'Tree' },\n { value: 'radial', label: 'Radial' },\n { value: 'grid', label: 'Grid' },\n];\n\nfunction createToolbarIcon(name) {\n const svg = svgEl('svg', {\n class: 'vd-flowchart-icon',\n viewBox: '0 0 256 256',\n 'aria-hidden': 'true',\n focusable: 'false',\n });\n svg.setAttribute('fill', 'currentColor');\n svg.appendChild(svgEl('path', { d: TOOLBAR_ICON_PATHS[name] || '' }));\n return svg;\n}\n\nfunction createToolbarButton({ action, label, icon, disabled = false }) {\n const button = createElement('button', {\n className: 'vd-flowchart-btn vd-flowchart-icon-btn',\n title: label,\n disabled,\n });\n button.setAttribute('type', 'button');\n button.setAttribute('data-flowchart-action', action);\n button.setAttribute('aria-label', label);\n button.appendChild(createToolbarIcon(icon));\n return button;\n}\nconst DEFAULT_GRID_SIZE = 24;\nconst DEFAULT_MIN_SCALE = 0.35;\nconst DEFAULT_MAX_SCALE = 3;\nconst DEFAULT_MIN_NODE_SIZE = 56;\nconst DEFAULT_MAX_NODE_SIZE = 420;\nconst DEFAULT_WORLD_EXTENT = 12000;\nconst WIDE_WORLD_EXTENT = 240000;\n// Bounded deserialization caps. An untrusted or corrupt document (e.g. a shared\n// link with millions of nodes/edges) is TRUNCATED \u2014 never thrown \u2014 inside\n// normalizeDocument, so `load()` cannot be turned into a client-side DoS: the\n// O(n) normalization and the resulting render stay bounded. A normal diagram is\n// far below these limits and is unaffected.\nexport const MAX_NODES = 10000;\nexport const MAX_EDGES = 10000;\nconst RESIZE_HANDLES = ['n', 'ne', 'e', 'se', 's', 'sw', 'w', 'nw'];\nconst DEFAULT_EDGE_STROKE_WIDTH = 2.25;\nconst MIN_EDGE_STROKE_WIDTH = 1.25;\nconst MAX_EDGE_STROKE_WIDTH = 6;\nconst CONNECTION_PORT_RADIUS = 6;\n// The handle sits outside the boundary; a hit radius slightly larger than the\n// offset overlaps the node edge so the pointer can slide from node to handle\n// without losing hover.\nconst PORT_HANDLE_OFFSET = 12;\nconst CONNECTION_PORT_HIT_RADIUS = 14;\nconst PORT_CLICK_SLOP = 4;\nconst RESIZE_HANDLE_SIZE = 9;\nconst SELECTION_OUTSET = 4;\nconst GUIDE_SNAP_DISTANCE = 6;\nconst GUIDE_OVERHANG = 12;\n// Beyond the connection handle (12px out, 14px hit radius) so both stay usable.\nconst COLLAPSE_TOGGLE_OFFSET = 36;\nconst MINIMAP_WIDTH = 180;\nconst MINIMAP_HEIGHT = 120;\nconst MINIMAP_MIN_CANVAS_WIDTH = 480;\n// Shapes whose outline does not reach the corners of their bounds get a dashed\n// selection box so the corner resize handles have something to sit on.\nconst SELECTION_BOX_TYPES = new Set(['circle', 'diamond', 'label']);\nconst RECONNECT_ENDPOINT_RADIUS = 7;\nconst RECONNECT_ENDPOINT_HIT_RADIUS = 12;\nconst EDGE_HIT_STROKE_MIN = 16;\nconst CONNECTION_SNAP_PADDING = 36;\nconst CONNECTION_HYSTERESIS = 16;\nconst CONNECTION_CENTER_LOCK_RADIUS = 18;\nconst RESIZE_PORT_GAP = 28;\n\nconst EDGE_STROKE_PRESETS = [\n { id: 'thin', label: 'Thin', width: 1.75 },\n { id: 'medium', label: 'Medium', width: DEFAULT_EDGE_STROKE_WIDTH },\n { id: 'bold', label: 'Bold', width: 3.5 },\n];\n\nexport const VD_FLOWCHART_VERSION = '1.5.1';\n/** Serialized schema version; change only when the document format changes. */\nexport const FLOWCHART_DOCUMENT_VERSION = '1.3.0';\nexport const FLOWCHART_NODE_TYPES = [\n 'rounded-rect',\n 'rect',\n 'diamond',\n 'circle',\n 'textbox',\n 'label',\n 'junction',\n];\nexport const FLOWCHART_PORTS = ['top', 'right', 'bottom', 'left'];\nexport const FLOWCHART_EDGE_MARKERS = ['none', 'arrow', 'dot'];\nexport const FLOWCHART_EDGE_ROUTES = ['curve', 'straight', 'orthogonal'];\nexport const FLOWCHART_KEYBOARD_SHORTCUTS = ['mindmap', 'basic'];\n\nfunction normalizeKeyboardShortcuts(value) {\n return value === 'basic' ? 'basic' : 'mindmap';\n}\n\nconst ARROW_DIRECTIONS = {\n ArrowRight: 'right',\n ArrowLeft: 'left',\n ArrowDown: 'down',\n ArrowUp: 'up',\n};\n\nfunction getShortcutRows(mode, readonly) {\n const navigation = [\n ['Arrow keys', 'Select the nearest node in that direction'],\n ['Shift + Arrow', 'Select a connection on that side (repeat to cycle)'],\n ['Shift + click, Shift + drag', 'Add nodes to the selection, or select with a box'],\n ['Cmd/Ctrl + A', 'Select all nodes'],\n ];\n const view = [\n ['Cmd/Ctrl + = or -', 'Zoom in or out'],\n ['Cmd/Ctrl + 0', 'Zoom to 100%'],\n ['Shift + 1', 'Fit the diagram to the view'],\n ];\n const help = [['?', 'Show or hide this list']];\n if (readonly) {\n return [...navigation, ...view, ...help, ['Tab', 'Leave the canvas']];\n }\n const mindmap =\n mode === 'mindmap'\n ? [\n ['Tab', 'Add a child node'],\n ['Enter', 'Add a sibling below (Shift + Enter: above)'],\n ['F2, Space, or type', 'Edit the label'],\n ['Enter while editing', 'Save the label (Shift + Enter: new line)'],\n ['Tab while editing', 'Save and add a child'],\n ]\n : [\n ['Enter or F2', 'Edit the label'],\n ['Cmd/Ctrl + Enter', 'Save the label'],\n ];\n return [\n ...navigation,\n ...mindmap,\n [\n mode === 'mindmap' ? 'Enter, F2, or type on a connection' : 'Enter or F2 on a connection',\n 'Edit the connection label',\n ],\n ['Cmd/Ctrl + /', 'Collapse or expand the branch'],\n ['Alt + Arrow', 'Nudge the node (add Shift for 1 px)'],\n ['Delete or Backspace', 'Delete the selection'],\n ['Cmd/Ctrl + D', 'Duplicate the node'],\n ['Cmd/Ctrl + Z, Shift + Cmd/Ctrl + Z', 'Undo, redo'],\n ['Cmd/Ctrl + C, X, V', 'Copy, cut, paste'],\n ...view,\n ['Esc', 'Cancel editing, then the tool, then deselect'],\n [\n mode === 'mindmap' ? 'Shift + Tab, or Esc then Tab' : 'Tab or Shift + Tab',\n 'Leave the canvas',\n ],\n ...help,\n ];\n}\n\n// History entries for these reasons collapse into the previous entry when they\n// target the same node/edge, so a burst of inspector keystrokes (one\n// `node:update` each) is a single undo step. Discrete gestures are excluded.\nconst COALESCING_REASONS = new Set(['node:update', 'edge:update', 'node:nudge']);\n\nconst DEFAULT_EDGE_ROUTE = 'curve';\nconst ORTHOGONAL_STUB_LENGTH = 32;\nconst ORTHOGONAL_CORNER_RADIUS = 12;\nconst ORTHOGONAL_CLEARANCE = 16;\n// Fraction of the endpoint distance used for each cubic control arm, plus the\n// clamp that keeps very short edges graceful and very long ones from ballooning.\nconst EDGE_CURVATURE = 0.5;\nconst MIN_CURVE_ARM = 22;\nconst MAX_CURVE_ARM = 260;\nconst FLOWCHART_EDGE_ROUTE_LABELS = {\n curve: 'Curve',\n straight: 'Straight',\n orthogonal: 'Stepped orthogonal',\n};\n\nconst DEFAULT_NODE_SPECS = {\n 'rounded-rect': { width: 180, height: 96, text: 'Step' },\n rect: { width: 180, height: 96, text: 'Process' },\n diamond: { width: 184, height: 120, text: 'Decision' },\n circle: { width: 128, height: 128, text: 'Start' },\n textbox: { width: 240, height: 144, text: 'Notes' },\n label: { width: 180, height: 72, text: 'Label' },\n junction: {\n width: 28,\n height: 28,\n text: '',\n minWidth: 28,\n minHeight: 28,\n maxWidth: 28,\n maxHeight: 28,\n resizable: false,\n textEditable: false,\n },\n};\n\nconst FLOWCHART_PALETTE_ITEMS = [\n { kind: 'tool', tool: 'arrow', label: 'Arrow' },\n { kind: 'node', type: 'rounded-rect', label: 'Rounded' },\n { kind: 'node', type: 'rect', label: 'Rect' },\n { kind: 'node', type: 'diamond', label: 'Diamond' },\n { kind: 'node', type: 'circle', label: 'Circle' },\n { kind: 'node', type: 'junction', label: 'Junction' },\n { kind: 'node', type: 'textbox', label: 'Textbox' },\n { kind: 'node', type: 'label', label: 'Label' },\n];\n\nlet flowchartId = 0;\n\nfunction nextId(prefix) {\n flowchartId += 1;\n return `${prefix}-${flowchartId}`;\n}\n\nfunction hasWindow() {\n return typeof window !== 'undefined' && typeof document !== 'undefined';\n}\n\nfunction isElement(value) {\n return hasWindow() && value instanceof Element;\n}\n\nfunction isPlainObject(value) {\n return Boolean(value) && Object.prototype.toString.call(value) === '[object Object]';\n}\n\nfunction clamp(value, min, max) {\n return Math.min(max, Math.max(min, value));\n}\n\nfunction toFiniteNumber(value, fallback) {\n const next = Number(value);\n return Number.isFinite(next) ? next : fallback;\n}\n\nfunction deepClone(value) {\n return JSON.parse(JSON.stringify(value));\n}\n\nfunction formatNumber(value) {\n return Number(value.toFixed(2));\n}\n\nfunction formatScale(value) {\n return Number(toFiniteNumber(value, 1).toFixed(4));\n}\n\nfunction normalizeBoundPair(min, max, fallbackMin, fallbackMax) {\n const low = Number(min);\n const high = Number(max);\n if (!Number.isFinite(low) || !Number.isFinite(high) || low <= 0 || high <= 0 || low >= high) {\n return { min: fallbackMin, max: fallbackMax };\n }\n return { min: low, max: high };\n}\n\nfunction sanitizeId(value) {\n if (value == null) return '';\n return String(value).trim();\n}\n\nfunction resolveElement(target) {\n if (!hasWindow()) {\n throw new Error('Vanduo Flowchart requires a browser DOM target.');\n }\n if (typeof target === 'string') {\n const el = document.querySelector(target);\n if (!el) throw new Error(`Flowchart target not found: ${target}`);\n return el;\n }\n if (isElement(target)) return target;\n throw new Error('Flowchart target must be an Element or selector string.');\n}\n\nfunction createElement(tagName, options = {}) {\n const element = document.createElement(tagName);\n if (options.className) element.className = options.className;\n if (options.text != null) element.textContent = String(options.text);\n if (options.type) element.type = options.type;\n if (options.value != null) element.value = String(options.value);\n if (options.placeholder != null) element.placeholder = String(options.placeholder);\n if (options.title != null) element.title = String(options.title);\n if (options.rows != null) element.rows = Number(options.rows);\n if (options.disabled) element.disabled = true;\n if (options.tabIndex != null) element.tabIndex = Number(options.tabIndex);\n return element;\n}\n\nfunction svgEl(name, attrs = {}) {\n const element = document.createElementNS(SVG_NS, name);\n Object.entries(attrs).forEach(([key, value]) => {\n if (value != null) {\n element.setAttribute(key, String(value));\n }\n });\n return element;\n}\n\nfunction clearChildren(element) {\n while (element.firstChild) {\n element.removeChild(element.firstChild);\n }\n}\n\nfunction ensureUniqueId(preferred, prefix, usedIds) {\n let candidate = sanitizeId(preferred) || nextId(prefix);\n while (usedIds.has(candidate)) {\n candidate = nextId(prefix);\n }\n usedIds.add(candidate);\n return candidate;\n}\n\nfunction normalizeNodeType(type) {\n return FLOWCHART_NODE_TYPES.includes(type) ? type : 'rounded-rect';\n}\n\nfunction getNodeSpec(type) {\n return DEFAULT_NODE_SPECS[normalizeNodeType(type)];\n}\n\nfunction nodeVisualScale(node) {\n if (!node || node.type === 'junction') return 1;\n const spec = getNodeSpec(node.type);\n const width = spec.width > 0 ? toFiniteNumber(node.width, spec.width) / spec.width : 1;\n const height = spec.height > 0 ? toFiniteNumber(node.height, spec.height) / spec.height : 1;\n return clamp(Math.min(1, width, height), 0.01, 1);\n}\n\nfunction edgeVisualScale(fromNode, toNode) {\n if (fromNode && toNode) return Math.min(nodeVisualScale(fromNode), nodeVisualScale(toNode));\n if (fromNode) return nodeVisualScale(fromNode);\n if (toNode) return nodeVisualScale(toNode);\n return 1;\n}\n\nfunction getNodeSizeBounds(type, sizeBounds) {\n const spec = getNodeSpec(type);\n const min = sizeBounds?.min ?? DEFAULT_MIN_NODE_SIZE;\n const max = sizeBounds?.max ?? DEFAULT_MAX_NODE_SIZE;\n return {\n minWidth: spec.minWidth ?? min,\n minHeight: spec.minHeight ?? min,\n maxWidth: spec.maxWidth ?? max,\n maxHeight: spec.maxHeight ?? max,\n };\n}\n\nfunction clampNodeWidth(type, width, fallback, sizeBounds) {\n const bounds = getNodeSizeBounds(type, sizeBounds);\n return clamp(toFiniteNumber(width, fallback), bounds.minWidth, bounds.maxWidth);\n}\n\nfunction clampNodeHeight(type, height, fallback, sizeBounds) {\n const bounds = getNodeSizeBounds(type, sizeBounds);\n return clamp(toFiniteNumber(height, fallback), bounds.minHeight, bounds.maxHeight);\n}\n\nfunction isNodeResizable(nodeOrType) {\n const spec =\n typeof nodeOrType === 'string' ? getNodeSpec(nodeOrType) : getNodeSpec(nodeOrType?.type);\n return spec.resizable !== false;\n}\n\nfunction isNodeTextEditable(nodeOrType) {\n const spec =\n typeof nodeOrType === 'string' ? getNodeSpec(nodeOrType) : getNodeSpec(nodeOrType?.type);\n return spec.textEditable !== false;\n}\n\nfunction normalizeEdgeStrokeWidth(value) {\n const next = Number(value);\n if (!Number.isFinite(next)) return DEFAULT_EDGE_STROKE_WIDTH;\n return formatNumber(clamp(next, MIN_EDGE_STROKE_WIDTH, MAX_EDGE_STROKE_WIDTH));\n}\n\nfunction getStrokePresetId(strokeWidth) {\n const match = EDGE_STROKE_PRESETS.find((preset) => Math.abs(preset.width - strokeWidth) < 0.01);\n return match?.id || 'medium';\n}\n\nfunction getStrokePresetWidth(presetId) {\n const preset = EDGE_STROKE_PRESETS.find((item) => item.id === presetId);\n return preset?.width ?? DEFAULT_EDGE_STROKE_WIDTH;\n}\n\nfunction normalizeViewport(viewport, scaleBounds) {\n const min = scaleBounds?.min ?? DEFAULT_MIN_SCALE;\n const max = scaleBounds?.max ?? DEFAULT_MAX_SCALE;\n return {\n x: toFiniteNumber(viewport?.x, 0),\n y: toFiniteNumber(viewport?.y, 0),\n scale: clamp(formatScale(toFiniteNumber(viewport?.scale, 1)), min, max),\n };\n}\n\nfunction normalizeNode(rawNode, index, usedIds, sizeBounds) {\n const type = normalizeNodeType(rawNode?.type);\n const spec = getNodeSpec(type);\n\n const node = {\n id: ensureUniqueId(rawNode?.id, 'node', usedIds),\n type,\n x: toFiniteNumber(rawNode?.x, index * 28),\n y: toFiniteNumber(rawNode?.y, index * 18),\n width: clampNodeWidth(type, rawNode?.width, spec.width, sizeBounds),\n height: clampNodeHeight(type, rawNode?.height, spec.height, sizeBounds),\n text: rawNode?.text == null ? spec.text : String(rawNode.text),\n data: isPlainObject(rawNode?.data) ? deepClone(rawNode.data) : {},\n };\n // Written only when true so expanded nodes serialize as in format 1.2.0.\n if (rawNode?.collapsed === true) node.collapsed = true;\n return node;\n}\n\n// Nodes hidden by collapsed branches. Every descendant of a collapsed node is\n// a candidate (the collapsed node itself is not, so a loop back to it cannot\n// hide it); a candidate stays visible when it is also reachable through an\n// expanded node outside the candidates. Linear in nodes plus edges.\nfunction computeHiddenNodeIds(nodes, edges) {\n const collapsed = new Set(nodes.filter((node) => node.collapsed).map((node) => node.id));\n if (!collapsed.size) return new Set();\n const outgoing = new Map(nodes.map((node) => [node.id, []]));\n edges.forEach((edge) => {\n if (edge.from.nodeId === edge.to.nodeId) return;\n outgoing.get(edge.from.nodeId)?.push(edge.to.nodeId);\n });\n\n const candidates = new Set();\n collapsed.forEach((rootId) => {\n const queue = [...(outgoing.get(rootId) || [])];\n for (let index = 0; index < queue.length; index += 1) {\n const id = queue[index];\n if (id === rootId || candidates.has(id)) continue;\n candidates.add(id);\n queue.push(...(outgoing.get(id) || []));\n }\n });\n\n const queue = nodes\n .filter((node) => !candidates.has(node.id) && !collapsed.has(node.id))\n .map((node) => node.id);\n for (let index = 0; index < queue.length; index += 1) {\n const id = queue[index];\n (outgoing.get(id) || []).forEach((childId) => {\n if (!candidates.has(childId)) return;\n candidates.delete(childId);\n if (!collapsed.has(childId)) queue.push(childId);\n });\n }\n return candidates;\n}\n\nfunction normalizeEndpoint(rawEndpoint, fallbackPort) {\n return {\n nodeId: sanitizeId(rawEndpoint?.nodeId),\n port: FLOWCHART_PORTS.includes(rawEndpoint?.port) ? rawEndpoint.port : fallbackPort,\n };\n}\n\nfunction normalizeEdgeMarker(value) {\n return FLOWCHART_EDGE_MARKERS.includes(value) ? value : null;\n}\n\nfunction normalizeEdgeRoute(value) {\n return FLOWCHART_EDGE_ROUTES.includes(value) ? value : DEFAULT_EDGE_ROUTE;\n}\n\nfunction syncEdgeKind(edge) {\n edge.kind = edge.startMarker === 'none' && edge.endMarker === 'none' ? 'line' : 'arrow';\n}\n\nfunction normalizeEdge(rawEdge, index, nodeIds, usedIds) {\n const from = normalizeEndpoint(rawEdge?.from, 'right');\n const to = normalizeEndpoint(rawEdge?.to, 'left');\n if (!from.nodeId || !to.nodeId) return null;\n if (!nodeIds.has(from.nodeId) || !nodeIds.has(to.nodeId)) return null;\n if (!FLOWCHART_PORTS.includes(from.port) || !FLOWCHART_PORTS.includes(to.port)) return null;\n\n const legacyKind = rawEdge?.kind === 'line' ? 'line' : 'arrow';\n const startMarker =\n normalizeEdgeMarker(rawEdge?.startMarker) ?? (legacyKind === 'line' ? 'none' : 'none');\n const endMarker =\n normalizeEdgeMarker(rawEdge?.endMarker) ?? (legacyKind === 'line' ? 'none' : 'arrow');\n\n const edge = {\n id: ensureUniqueId(rawEdge?.id, 'edge', usedIds),\n from,\n to,\n kind: legacyKind,\n startMarker,\n endMarker,\n strokeWidth: normalizeEdgeStrokeWidth(rawEdge?.strokeWidth),\n route: normalizeEdgeRoute(rawEdge?.route),\n label: rawEdge?.label == null ? '' : String(rawEdge.label),\n data: isPlainObject(rawEdge?.data) ? deepClone(rawEdge.data) : {},\n };\n syncEdgeKind(edge);\n return edge;\n}\n\nfunction parseDocumentVersion(value) {\n const raw =\n typeof value === 'number' && Number.isFinite(value)\n ? String(value)\n : typeof value === 'string'\n ? value.trim()\n : '';\n const match = /^(\\d+)(?:\\.(\\d+))?(?:\\.(\\d+))?$/.exec(raw);\n if (!match) return null;\n return {\n major: Number(match[1]),\n minor: Number(match[2] ?? 0),\n patch: Number(match[3] ?? 0),\n };\n}\n\nfunction isSupportedDocumentVersion(value) {\n const parsed = parseDocumentVersion(value);\n const max = parseDocumentVersion(FLOWCHART_DOCUMENT_VERSION);\n if (!parsed || !max || parsed.major !== max.major) return false;\n if (parsed.minor > max.minor) return false;\n if (parsed.minor === max.minor && parsed.patch > max.patch) return false;\n return true;\n}\n\nfunction normalizeDocument(input, limits = {}) {\n let source = input;\n if (typeof source === 'string') {\n try {\n source = JSON.parse(source);\n } catch {\n throw new TypeError('Invalid flowchart JSON. The current document was not changed.');\n }\n }\n\n if (!isPlainObject(source)) {\n throw new TypeError('A flowchart document must be an object.');\n }\n if (source.version !== undefined && !isSupportedDocumentVersion(source.version)) {\n throw new RangeError(\n `Unsupported flowchart document version: ${String(source.version)}. Supported through ${FLOWCHART_DOCUMENT_VERSION}.`,\n );\n }\n for (const key of ['nodes', 'edges']) {\n if (source[key] !== undefined && !Array.isArray(source[key])) {\n throw new TypeError(`Flowchart ${key} must be an array.`);\n }\n }\n\n const usedNodeIds = new Set();\n // Bounded deserialization: truncate an untrusted document to MAX_NODES /\n // MAX_EDGES so a hostile doc loads bounded instead of freezing the tab.\n const nodes = (Array.isArray(source.nodes) ? source.nodes : [])\n .slice(0, MAX_NODES)\n .map((node, index) => normalizeNode(node, index, usedNodeIds, limits.sizeBounds));\n const nodeIds = new Set(nodes.map((node) => node.id));\n const usedEdgeIds = new Set();\n const edges = (Array.isArray(source.edges) ? source.edges : [])\n .slice(0, MAX_EDGES)\n .map((edge, index) => normalizeEdge(edge, index, nodeIds, usedEdgeIds))\n .filter(Boolean);\n\n return {\n version: FLOWCHART_DOCUMENT_VERSION,\n viewport: normalizeViewport(source.viewport, limits.scaleBounds),\n nodes,\n edges,\n };\n}\n\nfunction splitLongToken(token, maxChars) {\n const result = [];\n let index = 0;\n while (index < token.length) {\n result.push(token.slice(index, index + maxChars));\n index += maxChars;\n }\n return result;\n}\n\nfunction wrapText(text, maxChars) {\n const safeMaxChars = Math.max(6, maxChars);\n const lines = [];\n\n String(text || '')\n .split(/\\r?\\n/)\n .forEach((paragraph) => {\n const trimmed = paragraph.trim();\n if (!trimmed) {\n lines.push('');\n return;\n }\n\n let current = '';\n trimmed.split(/\\s+/).forEach((word) => {\n if (word.length > safeMaxChars) {\n if (current) {\n lines.push(current);\n current = '';\n }\n splitLongToken(word, safeMaxChars).forEach((chunk) => lines.push(chunk));\n return;\n }\n\n const next = current ? `${current} ${word}` : word;\n if (next.length <= safeMaxChars) {\n current = next;\n return;\n }\n\n if (current) lines.push(current);\n current = word;\n });\n\n if (current) lines.push(current);\n });\n\n if (!lines.length) return [''];\n if (lines.length <= 6) return lines;\n\n const clipped = lines.slice(0, 6);\n clipped[5] =\n clipped[5].length > safeMaxChars - 3\n ? `${clipped[5].slice(0, safeMaxChars - 3)}...`\n : `${clipped[5]}...`;\n return clipped;\n}\n\nfunction estimateChars(width) {\n return Math.max(8, Math.floor((width - 24) / 7));\n}\n\nfunction getPortPosition(node, port) {\n switch (port) {\n case 'top':\n return { x: node.x + node.width / 2, y: node.y };\n case 'right':\n return { x: node.x + node.width, y: node.y + node.height / 2 };\n case 'bottom':\n return { x: node.x + node.width / 2, y: node.y + node.height };\n case 'left':\n default:\n return { x: node.x, y: node.y + node.height / 2 };\n }\n}\n\nfunction getPortHandlePosition(node, port, scale = 1) {\n const point = getPortPosition(node, port);\n const normal = getPortNormal(port);\n const offset = PORT_HANDLE_OFFSET / scale;\n return {\n x: formatNumber(point.x + normal.x * offset),\n y: formatNumber(point.y + normal.y * offset),\n };\n}\n\nfunction getNearestPort(node, point) {\n return FLOWCHART_PORTS.reduce((best, port) => {\n const portPoint = getPortPosition(node, port);\n const distance = Math.hypot(point.x - portPoint.x, point.y - portPoint.y);\n if (!best || distance < best.distance) {\n return { port, point: portPoint, distance };\n }\n return best;\n }, null);\n}\n\nfunction getPortNormal(port) {\n switch (port) {\n case 'top':\n return { x: 0, y: -1 };\n case 'right':\n return { x: 1, y: 0 };\n case 'bottom':\n return { x: 0, y: 1 };\n case 'left':\n default:\n return { x: -1, y: 0 };\n }\n}\n\nfunction isPointInsideNode(node, point) {\n return (\n point.x >= node.x &&\n point.x <= node.x + node.width &&\n point.y >= node.y &&\n point.y <= node.y + node.height\n );\n}\n\nfunction getPortByDirection(node, point) {\n const centerX = node.x + node.width / 2;\n const centerY = node.y + node.height / 2;\n const deltaX = point.x - centerX;\n const deltaY = point.y - centerY;\n const port =\n Math.abs(deltaX) > Math.abs(deltaY)\n ? deltaX > 0\n ? 'right'\n : 'left'\n : deltaY > 0\n ? 'bottom'\n : 'top';\n const portPoint = getPortPosition(node, port);\n return {\n port,\n point: portPoint,\n distance: Math.hypot(point.x - portPoint.x, point.y - portPoint.y),\n };\n}\n\nfunction pickPortForNode(node, point, referencePoint = null) {\n if (isPointInsideNode(node, point)) {\n const centerX = node.x + node.width / 2;\n const centerY = node.y + node.height / 2;\n const distanceFromCenter = Math.hypot(point.x - centerX, point.y - centerY);\n if (referencePoint && distanceFromCenter <= CONNECTION_CENTER_LOCK_RADIUS) {\n return getPortByDirection(node, referencePoint);\n }\n return getPortByDirection(node, point);\n }\n return getNearestPort(node, point);\n}\n\nfunction getDistanceToNodeBounds(node, point) {\n const left = node.x;\n const right = node.x + node.width;\n const top = node.y;\n const bottom = node.y + node.height;\n const dx = point.x < left ? left - point.x : point.x > right ? point.x - right : 0;\n const dy = point.y < top ? top - point.y : point.y > bottom ? point.y - bottom : 0;\n return Math.hypot(dx, dy);\n}\n\nfunction offsetPoint(point, normal, distance) {\n return {\n x: point.x + normal.x * distance,\n y: point.y + normal.y * distance,\n };\n}\n\nfunction isHorizontalPort(port) {\n return port === 'left' || port === 'right';\n}\n\nfunction addDistinctPoint(points, point) {\n const previous = points[points.length - 1];\n if (!previous || previous.x !== point.x || previous.y !== point.y) {\n points.push(point);\n }\n}\n\nfunction buildPathFromPoints(points) {\n return points\n .map((point, index) => {\n const command = index === 0 ? 'M' : 'L';\n return `${command} ${formatNumber(point.x)} ${formatNumber(point.y)}`;\n })\n .join(' ');\n}\n\n// Render an orthogonal polyline with rounded corners. Each interior vertex is\n// replaced by `L <approach> Q <corner> <departure>`, where approach/departure\n// are pulled back from the corner by a radius clamped to half of each adjacent\n// segment so short segments never overshoot. Endpoints (first M, final L) stay\n// exact. Quadratic Q joins keep the output free of cubic `C` commands.\nfunction buildRoundedPath(points, radius) {\n if (points.length < 3 || radius <= 0) {\n return buildPathFromPoints(points);\n }\n\n let d = `M ${formatNumber(points[0].x)} ${formatNumber(points[0].y)}`;\n for (let index = 1; index < points.length - 1; index += 1) {\n const prev = points[index - 1];\n const corner = points[index];\n const next = points[index + 1];\n const lenIn = Math.hypot(corner.x - prev.x, corner.y - prev.y);\n const lenOut = Math.hypot(next.x - corner.x, next.y - corner.y);\n const r = Math.min(radius, lenIn / 2, lenOut / 2);\n\n if (!(r > 0)) {\n d += ` L ${formatNumber(corner.x)} ${formatNumber(corner.y)}`;\n continue;\n }\n\n const approach = {\n x: corner.x - ((corner.x - prev.x) / lenIn) * r,\n y: corner.y - ((corner.y - prev.y) / lenIn) * r,\n };\n const departure = {\n x: corner.x + ((next.x - corner.x) / lenOut) * r,\n y: corner.y + ((next.y - corner.y) / lenOut) * r,\n };\n d += ` L ${formatNumber(approach.x)} ${formatNumber(approach.y)}`;\n d += ` Q ${formatNumber(corner.x)} ${formatNumber(corner.y)} ${formatNumber(departure.x)} ${formatNumber(departure.y)}`;\n }\n const last = points[points.length - 1];\n d += ` L ${formatNumber(last.x)} ${formatNumber(last.y)}`;\n return d;\n}\n\nfunction getPolylineLabelPoint(points) {\n let totalLength = 0;\n for (let index = 1; index < points.length; index += 1) {\n totalLength += Math.hypot(\n points[index].x - points[index - 1].x,\n points[index].y - points[index - 1].y,\n );\n }\n\n if (!totalLength) {\n const first = points[0] || { x: 0, y: 0 };\n return { x: formatNumber(first.x), y: formatNumber(first.y) };\n }\n\n const halfway = totalLength / 2;\n let covered = 0;\n for (let index = 1; index < points.length; index += 1) {\n const start = points[index - 1];\n const end = points[index];\n const segmentLength = Math.hypot(end.x - start.x, end.y - start.y);\n if (!segmentLength) continue;\n if (covered + segmentLength >= halfway) {\n const ratio = (halfway - covered) / segmentLength;\n return {\n x: formatNumber(start.x + (end.x - start.x) * ratio),\n y: formatNumber(start.y + (end.y - start.y) * ratio),\n };\n }\n covered += segmentLength;\n }\n\n const last = points[points.length - 1] || { x: 0, y: 0 };\n return { x: formatNumber(last.x), y: formatNumber(last.y) };\n}\n\n// Cubic-bezier control point for one endpoint. The control arm always extends\n// straight out along the port's outward normal (so the curve leaves/enters the\n// arrow perpendicular to the node edge), and its LENGTH is a fraction of the\n// straight-line distance between the endpoints \u2014 not of a single axis. The old\n// per-axis model (React Flow's) gave one endpoint a huge arm and the other a\n// tiny one whenever the ports were perpendicular, producing the long-straight-\n// then-sharp-kink-at-the-arrow look. Scaling by total distance keeps both arms\n// balanced, so radial/mind-map edges read as smooth arcs.\n//\n// `align` is how much the target lies in the port's outward direction\n// (1 = dead ahead, 0 = sideways, -1 = behind). Easing the arm by alignment\n// shortens it when the target sits behind the port, avoiding a ballooned loop,\n// while giving aligned endpoints a long, graceful tangent into the arrowhead.\nfunction routeMetrics(edgeScale = 1) {\n const scale = clamp(toFiniteNumber(edgeScale, 1), 0.01, 1);\n return {\n scale,\n minCurveArm: MIN_CURVE_ARM * scale,\n maxCurveArm: MAX_CURVE_ARM * scale,\n stub: ORTHOGONAL_STUB_LENGTH * scale,\n corner: ORTHOGONAL_CORNER_RADIUS * scale,\n clearance: ORTHOGONAL_CLEARANCE * scale,\n };\n}\n\nfunction curveControlPoint(point, port, target, curvature, metrics = routeMetrics(1)) {\n const normal = getPortNormal(port);\n const dx = target.x - point.x;\n const dy = target.y - point.y;\n const distance = Math.hypot(dx, dy) || 1;\n const align = (normal.x * dx + normal.y * dy) / distance;\n const ease = 0.55 + 0.45 * align;\n const arm = clamp(distance * curvature * ease, metrics.minCurveArm, metrics.maxCurveArm);\n return { x: point.x + normal.x * arm, y: point.y + normal.y * arm };\n}\n\nfunction buildCurvePath(\n fromPoint,\n toPoint,\n fromPort = 'right',\n toPort = 'left',\n metrics = routeMetrics(1),\n) {\n const controlA = curveControlPoint(fromPoint, fromPort, toPoint, EDGE_CURVATURE, metrics);\n const controlB = curveControlPoint(toPoint, toPort, fromPoint, EDGE_CURVATURE, metrics);\n\n // Cubic bezier value at t = 0.5 for an accurate on-curve label anchor.\n const labelX = 0.125 * fromPoint.x + 0.375 * controlA.x + 0.375 * controlB.x + 0.125 * toPoint.x;\n const labelY = 0.125 * fromPoint.y + 0.375 * controlA.y + 0.375 * controlB.y + 0.125 * toPoint.y;\n\n return {\n d: `M ${formatNumber(fromPoint.x)} ${formatNumber(fromPoint.y)} C ${formatNumber(controlA.x)} ${formatNumber(controlA.y)} ${formatNumber(controlB.x)} ${formatNumber(controlB.y)} ${formatNumber(toPoint.x)} ${formatNumber(toPoint.y)}`,\n labelX: formatNumber(labelX),\n labelY: formatNumber(labelY),\n };\n}\n\nfunction buildStraightPath(fromPoint, toPoint) {\n return {\n d: buildPathFromPoints([fromPoint, toPoint]),\n labelX: formatNumber((fromPoint.x + toPoint.x) / 2),\n labelY: formatNumber((fromPoint.y + toPoint.y) / 2),\n };\n}\n\nfunction getNodeRectBounds(node, pad = 0) {\n if (!node) return null;\n return {\n left: node.x - pad,\n top: node.y - pad,\n right: node.x + node.width + pad,\n bottom: node.y + node.height + pad,\n };\n}\n\n// Does an axis-aligned segment pass through a rect's interior? Edge contact\n// (e.g. a stub running along a node border or a port sitting on the boundary)\n// is not a hit \u2014 only strict interior overlap counts.\nfunction segmentIntersectsRect(a, b, rect) {\n if (!rect) return false;\n const minX = Math.min(a.x, b.x);\n const maxX = Math.max(a.x, b.x);\n const minY = Math.min(a.y, b.y);\n const maxY = Math.max(a.y, b.y);\n return minX < rect.right && maxX > rect.left && minY < rect.bottom && maxY > rect.top;\n}\n\n// Pick a perpendicular \"channel\" coordinate that sits clear of both node\n// rectangles when the connector has to loop around them. `low` is the edge\n// before both nodes (top / left), `high` is after both (bottom / right);\n// we route on whichever side is cheaper, biased toward the target on a tie.\nfunction pickOrthogonalChannel(from, to, low, high) {\n const costLow = Math.abs(low - from) + Math.abs(low - to);\n const costHigh = Math.abs(high - from) + Math.abs(high - to);\n if (costLow < costHigh) return low;\n if (costHigh < costLow) return high;\n return to >= from ? high : low;\n}\n\n// Node-blind fallback used for the live connection preview, where one endpoint\n// is a free pointer with no rectangle to route around.\nfunction getOrthogonalMidpoints(fromStub, toStub, fromPort, toPort) {\n const sourceHorizontal = isHorizontalPort(fromPort);\n const targetHorizontal = isHorizontalPort(toPort);\n\n if (sourceHorizontal && targetHorizontal) {\n const midX = (fromStub.x + toStub.x) / 2;\n return [\n { x: midX, y: fromStub.y },\n { x: midX, y: toStub.y },\n ];\n }\n\n if (!sourceHorizontal && !targetHorizontal) {\n const midY = (fromStub.y + toStub.y) / 2;\n return [\n { x: fromStub.x, y: midY },\n { x: toStub.x, y: midY },\n ];\n }\n\n if (sourceHorizontal) {\n return [{ x: toStub.x, y: fromStub.y }];\n }\n\n return [{ x: fromStub.x, y: toStub.y }];\n}\n\n// Node-aware orthogonal routing. Each endpoint extends a stub beyond its port,\n// then the two stubs are bridged: directly when the ports face each other with\n// room in between, otherwise through a channel routed clear of both node rects\n// so the connector never cuts through a box (draw.io-style \"around\" routing).\nfunction getOrthogonalPoints(\n fromPoint,\n toPoint,\n fromPort,\n toPort,\n fromRect,\n toRect,\n metrics = routeMetrics(1),\n) {\n const fromNormal = getPortNormal(fromPort);\n const toNormal = getPortNormal(toPort);\n const sourceHorizontal = isHorizontalPort(fromPort);\n const targetHorizontal = isHorizontalPort(toPort);\n const minStub = 4 * (metrics.scale || 1);\n let fromStubLen = metrics.stub;\n let toStubLen = metrics.stub;\n\n if (sourceHorizontal && targetHorizontal && fromNormal.x === -toNormal.x) {\n const span = (toPoint.x - fromPoint.x) * fromNormal.x;\n if (span > 0) {\n const fitted = Math.min(metrics.stub, span * 0.45, span / 2);\n fromStubLen = fitted;\n toStubLen = fitted;\n }\n } else if (!sourceHorizontal && !targetHorizontal && fromNormal.y === -toNormal.y) {\n const span = (toPoint.y - fromPoint.y) * fromNormal.y;\n if (span > 0) {\n const fitted = Math.min(metrics.stub, span * 0.45, span / 2);\n fromStubLen = fitted;\n toStubLen = fitted;\n }\n } else if (sourceHorizontal !== targetHorizontal) {\n const spanFrom = sourceHorizontal\n ? (toPoint.x - fromPoint.x) * fromNormal.x\n : (toPoint.y - fromPoint.y) * fromNormal.y;\n const spanTo = targetHorizontal\n ? (fromPoint.x - toPoint.x) * toNormal.x\n : (fromPoint.y - toPoint.y) * toNormal.y;\n if (spanFrom > 0 && spanFrom < metrics.stub) {\n fromStubLen = Math.min(spanFrom / 2, Math.max(minStub, spanFrom * 0.5));\n }\n if (spanTo > 0 && spanTo < metrics.stub) {\n toStubLen = Math.min(spanTo / 2, Math.max(minStub, spanTo * 0.5));\n }\n }\n\n const fromStub = offsetPoint(fromPoint, fromNormal, fromStubLen);\n const toStub = offsetPoint(toPoint, toNormal, toStubLen);\n const mids = [];\n\n if (sourceHorizontal && targetHorizontal) {\n // A straight vertical bridge only works when the ports face each other AND\n // the stubs leave room between them. Otherwise (facing-but-overlapping, or\n // same-direction ports) `facing && hasRoom` is false and we always detour\n // through a clear horizontal channel \u2014 the channel handles every such case.\n const facing = fromNormal.x === -toNormal.x;\n const hasRoom = fromNormal.x > 0 ? fromStub.x <= toStub.x : fromStub.x >= toStub.x;\n if (facing && hasRoom) {\n const midX = (fromStub.x + toStub.x) / 2;\n mids.push({ x: midX, y: fromStub.y }, { x: midX, y: toStub.y });\n } else {\n const top = Math.min(fromRect.top, toRect.top);\n const bottom = Math.max(fromRect.bottom, toRect.bottom);\n const yChannel = pickOrthogonalChannel(fromStub.y, toStub.y, top, bottom);\n mids.push({ x: fromStub.x, y: yChannel }, { x: toStub.x, y: yChannel });\n }\n } else if (!sourceHorizontal && !targetHorizontal) {\n // Mirror of the both-horizontal case; see the comment above.\n const facing = fromNormal.y === -toNormal.y;\n const hasRoom = fromNormal.y > 0 ? fromStub.y <= toStub.y : fromStub.y >= toStub.y;\n if (facing && hasRoom) {\n const midY = (fromStub.y + toStub.y) / 2;\n mids.push({ x: fromStub.x, y: midY }, { x: toStub.x, y: midY });\n } else {\n const left = Math.min(fromRect.left, toRect.left);\n const right = Math.max(fromRect.right, toRect.right);\n const xChannel = pickOrthogonalChannel(fromStub.x, toStub.x, left, right);\n mids.push({ x: xChannel, y: fromStub.y }, { x: xChannel, y: toStub.y });\n }\n } else {\n // Perpendicular ports form an L with a single corner. Two corners respect\n // the exit/entry directions: the \"clean\" one continues the source stub's\n // axis, the alternate continues the target stub's axis. Prefer the clean\n // corner, but fall back to the alternate when the clean L's legs would cut\n // through either node (e.g. target tucked beside/under the source).\n const cleanCorner = sourceHorizontal\n ? { x: toStub.x, y: fromStub.y }\n : { x: fromStub.x, y: toStub.y };\n const altCorner = sourceHorizontal\n ? { x: fromStub.x, y: toStub.y }\n : { x: toStub.x, y: fromStub.y };\n const legsClear = (corner) =>\n !segmentIntersectsRect(fromStub, corner, fromRect) &&\n !segmentIntersectsRect(fromStub, corner, toRect) &&\n !segmentIntersectsRect(corner, toStub, fromRect) &&\n !segmentIntersectsRect(corner, toStub, toRect);\n mids.push(legsClear(cleanCorner) || !legsClear(altCorner) ? cleanCorner : altCorner);\n }\n\n const points = [];\n [fromPoint, fromStub, ...mids, toStub, toPoint].forEach((point) =>\n addDistinctPoint(points, point),\n );\n return points;\n}\n\nfunction buildOrthogonalPath(\n fromPoint,\n toPoint,\n fromPort = 'right',\n toPort = 'left',\n fromRect = null,\n toRect = null,\n metrics = routeMetrics(1),\n) {\n let points;\n if (fromRect && toRect) {\n points = getOrthogonalPoints(fromPoint, toPoint, fromPort, toPort, fromRect, toRect, metrics);\n } else {\n const fromStub = offsetPoint(fromPoint, getPortNormal(fromPort), metrics.stub);\n const toStub = offsetPoint(toPoint, getPortNormal(toPort), metrics.stub);\n points = [];\n [\n fromPoint,\n fromStub,\n ...getOrthogonalMidpoints(fromStub, toStub, fromPort, toPort),\n toStub,\n toPoint,\n ].forEach((point) => addDistinctPoint(points, point));\n }\n\n const label = getPolylineLabelPoint(points);\n return {\n d: buildRoundedPath(points, metrics.corner),\n labelX: label.x,\n labelY: label.y,\n };\n}\n\nfunction buildEdgePath(edge, fromNode = null, toNode = null) {\n const fromPort = edge?.from?.port || edge?.fromPort || 'right';\n const toPort = edge?.to?.port || edge?.toPort || 'left';\n const fromPoint = edge?.fromPoint || (fromNode ? getPortPosition(fromNode, fromPort) : null);\n const toPoint = edge?.toPoint || (toNode ? getPortPosition(toNode, toPort) : null);\n const route = normalizeEdgeRoute(edge?.route);\n const metrics = routeMetrics(edgeVisualScale(fromNode, toNode));\n\n if (!fromPoint || !toPoint) {\n return { d: '', labelX: 0, labelY: 0 };\n }\n\n if (route === 'straight') {\n return buildStraightPath(fromPoint, toPoint);\n }\n\n if (route === 'orthogonal') {\n const fromRect =\n !edge?.fromPoint && fromNode ? getNodeRectBounds(fromNode, metrics.clearance) : null;\n const toRect = !edge?.toPoint && toNode ? getNodeRectBounds(toNode, metrics.clearance) : null;\n return buildOrthogonalPath(fromPoint, toPoint, fromPort, toPort, fromRect, toRect, metrics);\n }\n\n return buildCurvePath(fromPoint, toPoint, fromPort, toPort, metrics);\n}\n\nfunction createArrowMarker(id, strokeWidth, reversed = false, edgeScale = 1) {\n const scale = clamp(toFiniteNumber(edgeScale, 1), 0.01, 1);\n const effective = Math.max(0.02, strokeWidth * scale);\n const size = formatNumber(Math.max(9 * scale, effective * 4.4));\n const refInset = formatNumber(Math.max(1.5 * scale, effective * 0.85));\n const marker = svgEl('marker', {\n id,\n markerWidth: size,\n markerHeight: size,\n refX: reversed ? refInset : formatNumber(size - refInset),\n refY: formatNumber(size / 2),\n orient: 'auto',\n markerUnits: 'userSpaceOnUse',\n });\n marker.appendChild(\n svgEl('path', {\n d: reversed\n ? `M ${formatNumber(size)} 0 L 0 ${formatNumber(size / 2)} L ${formatNumber(size)} ${formatNumber(size)} z`\n : `M 0 0 L ${formatNumber(size)} ${formatNumber(size / 2)} L 0 ${formatNumber(size)} z`,\n fill: 'var(--vd-flowchart-accent)',\n }),\n );\n return marker;\n}\n\nfunction createDotMarker(id, strokeWidth, edgeScale = 1) {\n const scale = clamp(toFiniteNumber(edgeScale, 1), 0.01, 1);\n const effective = Math.max(0.02, strokeWidth * scale);\n const size = formatNumber(Math.max(8 * scale, effective * 3.3));\n const radius = formatNumber(Math.max(2.75 * scale, effective * 1.45));\n const marker = svgEl('marker', {\n id,\n markerWidth: size,\n markerHeight: size,\n refX: formatNumber(size / 2),\n refY: formatNumber(size / 2),\n orient: 'auto',\n markerUnits: 'userSpaceOnUse',\n });\n marker.appendChild(\n svgEl('circle', {\n cx: formatNumber(size / 2),\n cy: formatNumber(size / 2),\n r: radius,\n fill: 'var(--vd-flowchart-accent)',\n }),\n );\n return marker;\n}\n\nfunction getNodeFontMetrics(node) {\n if (node.type === 'label') {\n return { fontSize: 18, lineHeight: 20 };\n }\n if (node.type === 'textbox') {\n return { fontSize: 13, lineHeight: 18 };\n }\n return { fontSize: 14, lineHeight: 18 };\n}\n\nfunction getResizeHandlePosition(node, handle) {\n const middleX = node.width / 2;\n const middleY = node.height / 2;\n const x = handle.includes('w') ? 0 : handle.includes('e') ? node.width : middleX;\n const y = handle.includes('n') ? 0 : handle.includes('s') ? node.height : middleY;\n return { x, y };\n}\n\nfunction getResizeCursor(handle) {\n if (handle === 'n' || handle === 's') return 'ns-resize';\n if (handle === 'e' || handle === 'w') return 'ew-resize';\n if (handle === 'ne' || handle === 'sw') return 'nesw-resize';\n return 'nwse-resize';\n}\n\n// Alignment lines of `nodes`: left/centre/right on x and top/middle/bottom on\n// y, each with the node's extent on the other axis, sorted by value.\nfunction collectGuideLines(nodes) {\n const x = [];\n const y = [];\n nodes.forEach((node) => {\n const right = node.x + node.width;\n const bottom = node.y + node.height;\n [node.x, node.x + node.width / 2, right].forEach((value) =>\n x.push({ value, start: node.y, end: bottom }),\n );\n [node.y, node.y + node.height / 2, bottom].forEach((value) =>\n y.push({ value, start: node.x, end: right }),\n );\n });\n const byValue = (a, b) => a.value - b.value;\n return { x: x.sort(byValue), y: y.sort(byValue) };\n}\n\nfunction lowerBound(lines, value) {\n let low = 0;\n let high = lines.length;\n while (low < high) {\n const middle = (low + high) >> 1;\n if (lines[middle].value < value) low = middle + 1;\n else high = middle;\n }\n return low;\n}\n\n// Smallest offset that puts one of `candidates` on a guide line within\n// `threshold`, plus every line at the snapped position.\nfunction snapToGuides(lines, candidates, threshold) {\n let best = null;\n candidates.forEach((candidate) => {\n const index = lowerBound(lines, candidate);\n [lines[index - 1], lines[index]].forEach((line) => {\n if (!line) return;\n const offset = line.value - candidate;\n if (Math.abs(offset) <= threshold && (!best || Math.abs(offset) < Math.abs(best.offset))) {\n best = { offset };\n }\n });\n });\n if (!best) return null;\n const positions = candidates.map((candidate) => candidate + best.offset);\n best.lines = lines.filter((line) =>\n positions.some((position) => Math.abs(line.value - position) < 0.5),\n );\n return best;\n}\n\n// Guide segments spanning the snapped box and every node sharing the line.\nfunction guideSegments(axis, lines, box) {\n const byValue = new Map();\n lines.forEach((line) => {\n const current = byValue.get(line.value);\n byValue.set(line.value, {\n start: Math.min(current?.start ?? Infinity, line.start),\n end: Math.max(current?.end ?? -Infinity, line.end),\n });\n });\n const boxStart = axis === 'x' ? box.top : box.left;\n const boxEnd = boxStart + (axis === 'x' ? box.height : box.width);\n return [...byValue].map(([value, extent]) => {\n const start = Math.min(extent.start, boxStart) - GUIDE_OVERHANG;\n const end = Math.max(extent.end, boxEnd) + GUIDE_OVERHANG;\n return axis === 'x'\n ? { x1: value, y1: start, x2: value, y2: end }\n : { x1: start, y1: value, x2: end, y2: value };\n });\n}\n\nfunction getBounds(nodes) {\n if (!nodes.length) {\n return { left: 0, top: 0, right: 0, bottom: 0 };\n }\n\n return nodes.reduce(\n (accumulator, node) => ({\n left: Math.min(accumulator.left, node.x),\n top: Math.min(accumulator.top, node.y),\n right: Math.max(accumulator.right, node.x + node.width),\n bottom: Math.max(accumulator.bottom, node.y + node.height),\n }),\n {\n left: Number.POSITIVE_INFINITY,\n top: Number.POSITIVE_INFINITY,\n right: Number.NEGATIVE_INFINITY,\n bottom: Number.NEGATIVE_INFINITY,\n },\n );\n}\n\nfunction createField(labelText, control) {\n const wrapper = createElement('div', { className: 'vd-flowchart-field' });\n const label = createElement('label', { text: labelText });\n control.id ||= nextId('flowchart-field');\n label.htmlFor = control.id;\n wrapper.appendChild(label);\n wrapper.appendChild(control);\n return wrapper;\n}\n\nfunction createPalettePreview(type) {\n const preview = svgEl('svg', {\n class: `vd-flowchart-palette-preview vd-flowchart-palette-preview--${type}`,\n viewBox: '0 0 72 44',\n 'aria-hidden': 'true',\n focusable: 'false',\n });\n const baseClass = `vd-flowchart-palette-shape vd-flowchart-palette-shape--${type}`;\n\n if (type === 'arrow') {\n preview.appendChild(\n svgEl('path', {\n class: 'vd-flowchart-palette-arrow',\n d: 'M 12 30 C 28 10 44 10 60 22',\n }),\n );\n preview.appendChild(\n svgEl('path', {\n class: 'vd-flowchart-palette-arrowhead',\n d: 'M 53 16 L 64 22 L 52 27 z',\n }),\n );\n return preview;\n }\n\n if (type === 'rounded-rect') {\n preview.appendChild(\n svgEl('rect', {\n class: baseClass,\n x: 10,\n y: 10,\n width: 52,\n height: 24,\n rx: 8,\n ry: 8,\n }),\n );\n return preview;\n }\n\n if (type === 'rect') {\n preview.appendChild(\n svgEl('rect', {\n class: baseClass,\n x: 10,\n y: 10,\n width: 52,\n height: 24,\n rx: 1,\n ry: 1,\n }),\n );\n return preview;\n }\n\n if (type === 'diamond') {\n preview.appendChild(\n svgEl('polygon', {\n class: baseClass,\n points: '36,6 64,22 36,38 8,22',\n }),\n );\n return preview;\n }\n\n if (type === 'circle') {\n preview.appendChild(\n svgEl('ellipse', {\n class: baseClass,\n cx: 36,\n cy: 22,\n rx: 18,\n ry: 18,\n }),\n );\n return preview;\n }\n\n if (type === 'junction') {\n preview.appendChild(\n svgEl('path', {\n class: 'vd-flowchart-palette-junction-lines',\n d: 'M 12 22 H 27 M 45 22 H 60 M 36 8 V 14 M 36 30 V 36',\n }),\n );\n preview.appendChild(\n svgEl('circle', {\n class: baseClass,\n cx: 36,\n cy: 22,\n r: 8,\n }),\n );\n return preview;\n }\n\n if (type === 'textbox') {\n preview.appendChild(\n svgEl('rect', {\n class: baseClass,\n x: 10,\n y: 8,\n width: 52,\n height: 28,\n rx: 6,\n ry: 6,\n }),\n );\n preview.appendChild(\n svgEl('path', {\n class: 'vd-flowchart-palette-lines',\n d: 'M 20 18 H 52 M 20 25 H 46',\n }),\n );\n return preview;\n }\n\n const label = svgEl('text', {\n class: 'vd-flowchart-palette-label-mark',\n x: 36,\n y: 24,\n 'text-anchor': 'middle',\n 'dominant-baseline': 'middle',\n });\n label.textContent = 'Aa';\n preview.appendChild(label);\n return preview;\n}\n\nexport class VdFlowchart {\n constructor(options = {}) {\n this.element = resolveElement(options.element || options.target);\n this.readonly = Boolean(options.readonly);\n this.gridSize = clamp(toFiniteNumber(options.gridSize, DEFAULT_GRID_SIZE), 12, 64);\n const scaleBounds = normalizeBoundPair(\n options.minScale,\n options.maxScale,\n DEFAULT_MIN_SCALE,\n DEFAULT_MAX_SCALE,\n );\n const sizeBounds = normalizeBoundPair(\n options.minNodeSize,\n options.maxNodeSize,\n DEFAULT_MIN_NODE_SIZE,\n DEFAULT_MAX_NODE_SIZE,\n );\n this.minScale = scaleBounds.min;\n this.maxScale = scaleBounds.max;\n this.minNodeSize = sizeBounds.min;\n this.maxNodeSize = sizeBounds.max;\n this.documentData = normalizeDocument(options.data || {}, { scaleBounds, sizeBounds });\n this.listeners = {};\n this.selection = null;\n this.selectedNodeIds = new Set();\n this.interaction = null;\n this.activeTool = null;\n this.layoutMode = 'tree';\n this.paletteSerial = 0;\n this.destroyed = false;\n this.lastNodePointer = null;\n this.reconnectEdgeId = null;\n this.edgeCycleAnchor = null;\n this.clipboard = null;\n this.gridPatternId = nextId('flowchart-grid');\n this.markerIds = new Map();\n this.textEditor = null;\n\n this.historyEnabled = options.history !== false;\n this.historyLimit = Math.max(1, Math.floor(toFiniteNumber(options.historyLimit, 100)));\n this.history = [];\n this.historyIndex = -1;\n this.isApplyingHistory = false;\n this.historyBatchDepth = 0;\n this.historyBatchDirty = false;\n this.coalesceInsertedText = false;\n this.keyboardShortcuts = normalizeKeyboardShortcuts(options.keyboardShortcuts);\n this.snapGuides = options.snapGuides !== false;\n this.minimapEnabled = options.minimap !== false;\n this.autoLayout = Boolean(options.autoLayout);\n this.minimapFrame = 0;\n this.minimapDrag = null;\n this.shortcutsHelpOpen = false;\n this.autoFit = Boolean(options.autoFit);\n this.readyEmitted = false;\n this.resizeObserver = null;\n\n this.handleToolbarClick = this.handleToolbarClick.bind(this);\n this.handleArrangeChange = this.handleArrangeChange.bind(this);\n this.handlePaletteClick = this.handlePaletteClick.bind(this);\n this.handlePointerDown = this.handlePointerDown.bind(this);\n this.handlePointerMove = this.handlePointerMove.bind(this);\n this.handlePointerUp = this.handlePointerUp.bind(this);\n this.handleClick = this.handleClick.bind(this);\n this.handleDoubleClick = this.handleDoubleClick.bind(this);\n this.handleWheel = this.handleWheel.bind(this);\n this.handleCanvasBlur = this.handleCanvasBlur.bind(this);\n this.handleKeyDown = this.handleKeyDown.bind(this);\n this.handleSelectionFieldInput = this.handleSelectionFieldInput.bind(this);\n this.handleSelectionFieldChange = this.handleSelectionFieldChange.bind(this);\n this.handleJsonActionClick = this.handleJsonActionClick.bind(this);\n this.handleResize = this.handleResize.bind(this);\n\n this.buildShell();\n this.bindEvents();\n this.render();\n this.seedHistory();\n this.updateHistoryButtons();\n this.scheduleReady();\n }\n\n // --- Readiness -----------------------------------------------------------\n // The editor builds synchronously, but fitView() needs real canvas\n // dimensions, which only exist after the host is laid out. Emit `ready` once\n // the canvas reports a non-zero size (the old code fell back to an 800x560\n // guess); consumers can then fitView() without nextTick/setTimeout. The emit\n // is always deferred at least a microtask so a listener attached right after\n // construction \u2014 e.g. `new VdFlowchart(...).on('ready', ...)` or the Vue\n // wrapper \u2014 is registered before it fires.\n scheduleReady() {\n if (this.readyEmitted || this.destroyed || !hasWindow()) return;\n\n const tryEmit = () => {\n if (this.readyEmitted || this.destroyed) return true;\n const ready = this.canvasEl.clientWidth > 0 && this.canvasEl.clientHeight > 0;\n if (!ready) return false;\n this.readyEmitted = true;\n if (this.autoFit) this.fitView();\n else this.scheduleMinimap();\n this.emit('ready', this);\n return true;\n };\n\n const startObserving = () => {\n if (this.readyEmitted || this.destroyed || tryEmit()) return;\n\n if (typeof ResizeObserver === 'function') {\n this.resizeObserver = new ResizeObserver(() => {\n if (tryEmit()) {\n this.resizeObserver?.disconnect();\n this.resizeObserver = null;\n }\n });\n this.resizeObserver.observe(this.canvasEl);\n }\n\n // Fallback for environments without ResizeObserver (or a host that is\n // measurable on the next frame). If the host never gets a size, ready\n // simply never fires \u2014 which is correct.\n const raf =\n typeof requestAnimationFrame === 'function'\n ? requestAnimationFrame\n : (cb) => setTimeout(cb, 16);\n raf(() => tryEmit());\n };\n\n if (typeof queueMicrotask === 'function') {\n queueMicrotask(startObserving);\n } else {\n Promise.resolve().then(startObserving);\n }\n }\n\n buildShell() {\n this.element.innerHTML = '';\n this.element.classList.add('vd-flowchart-host');\n\n this.root = createElement('div', {\n className: `vd-flowchart-shell${this.readonly ? ' vd-flowchart-readonly' : ''}`,\n });\n\n this.toolbar = createElement('div', { className: 'vd-flowchart-toolbar' });\n this.toolbar.setAttribute('role', 'toolbar');\n this.toolbar.setAttribute('aria-label', 'Flowchart tools');\n const toolbarLeft = createElement('div', { className: 'vd-flowchart-toolbar-group' });\n const toolbarRight = createElement('div', { className: 'vd-flowchart-toolbar-group' });\n\n TOOLBAR_ACTIONS.forEach((item) => {\n const button = createToolbarButton(item);\n if (item.action === 'undo') this.undoButton = button;\n if (item.action === 'redo') this.redoButton = button;\n if (item.action === 'zoom-out') this.zoomOutButton = button;\n if (item.action === 'zoom-in') this.zoomInButton = button;\n if (item.action === 'reset-view') this.resetViewButton = button;\n if (item.action === 'fit-view') this.fitViewButton = button;\n toolbarLeft.appendChild(button);\n });\n this.undoButton.disabled = true;\n this.redoButton.disabled = true;\n\n this.arrangeSelect = createElement('select', {\n className: 'vd-flowchart-btn vd-flowchart-arrange',\n disabled: this.readonly,\n title: 'Auto-arrange layout',\n });\n this.arrangeSelect.setAttribute('aria-label', 'Layout mode');\n this.arrangeSelect.setAttribute('data-flowchart-arrange', '');\n LAYOUT_OPTIONS.forEach((item) => {\n const option = createElement('option', { value: item.value, text: item.label });\n option.value = item.value;\n this.arrangeSelect.appendChild(option);\n });\n this.arrangeSelect.value = this.layoutMode;\n\n this.clearButton = createToolbarButton({\n action: 'clear',\n label: 'Clear canvas',\n icon: 'clear',\n disabled: this.readonly,\n });\n\n this.zoomLabel = createElement('span', {\n className: 'vd-flowchart-toolbar-label',\n text: '100%',\n });\n\n this.shortcutsButton = createElement('button', {\n className: 'vd-flowchart-btn vd-flowchart-icon-btn vd-flowchart-shortcuts-btn',\n title: 'Keyboard shortcuts (?)',\n text: '?',\n });\n this.shortcutsButton.setAttribute('type', 'button');\n this.shortcutsButton.setAttribute('data-flowchart-action', 'shortcuts');\n this.shortcutsButton.setAttribute('aria-label', 'Keyboard shortcuts');\n this.shortcutsButton.setAttribute('aria-expanded', 'false');\n\n this.minimapButton = createToolbarButton({\n action: 'minimap',\n label: 'Toggle minimap',\n icon: 'minimap',\n });\n this.minimapButton.setAttribute('aria-pressed', this.minimapEnabled ? 'true' : 'false');\n\n toolbarLeft.appendChild(this.arrangeSelect);\n toolbarLeft.appendChild(this.clearButton);\n toolbarRight.appendChild(this.minimapButton);\n toolbarRight.appendChild(this.shortcutsButton);\n toolbarRight.appendChild(this.zoomLabel);\n this.toolbar.appendChild(toolbarLeft);\n this.toolbar.appendChild(toolbarRight);\n\n this.body = createElement('div', { className: 'vd-flowchart-body' });\n\n this.palettePanel = createElement('aside', {\n className: 'vd-flowchart-panel vd-flowchart-panel--palette',\n });\n this.palettePanel.appendChild(\n createElement('h4', { className: 'vd-flowchart-panel-title', text: 'Shapes' }),\n );\n this.paletteGrid = createElement('div', {\n className: 'vd-flowchart-palette',\n role: 'toolbar',\n });\n this.paletteGrid.setAttribute('aria-label', 'Shapes and tools');\n FLOWCHART_PALETTE_ITEMS.forEach((item) => {\n const button = createElement('button', {\n className: 'vd-flowchart-palette-btn',\n title: item.label,\n });\n button.setAttribute('type', 'button');\n if (item.kind === 'tool') {\n button.setAttribute('data-tool', item.tool);\n button.setAttribute('aria-label', item.label);\n button.setAttribute('aria-pressed', 'false');\n } else {\n button.setAttribute('data-node-type', item.type);\n button.setAttribute('aria-label', `Add ${item.label}`);\n }\n button.appendChild(createPalettePreview(item.tool || item.type));\n button.appendChild(\n createElement('span', {\n className: 'vd-flowchart-palette-label',\n text: item.label,\n }),\n );\n this.paletteGrid.appendChild(button);\n });\n this.palettePanel.appendChild(this.paletteGrid);\n\n this.canvasEl = createElement('div', { className: 'vd-flowchart-canvas', tabIndex: 0 });\n this.svg = svgEl('svg', {\n class: 'vd-flowchart-svg',\n role: 'img',\n 'aria-label': 'Vanduo Flowchart editor',\n });\n\n const defs = svgEl('defs');\n this.markerDefs = svgEl('g');\n defs.appendChild(this.markerDefs);\n\n const pattern = svgEl('pattern', {\n id: this.gridPatternId,\n width: this.gridSize,\n height: this.gridSize,\n patternUnits: 'userSpaceOnUse',\n });\n pattern.appendChild(\n svgEl('path', {\n d: `M ${this.gridSize} 0 L 0 0 0 ${this.gridSize}`,\n fill: 'none',\n stroke: 'var(--vd-flowchart-border)',\n 'stroke-opacity': 0.55,\n 'stroke-width': 1,\n }),\n );\n\n defs.appendChild(pattern);\n this.svg.appendChild(defs);\n\n this.world = svgEl('g', { class: 'vd-flowchart-world' });\n this.gridRect = svgEl('rect', {\n class: 'vd-flowchart-grid',\n x: -DEFAULT_WORLD_EXTENT / 2,\n y: -DEFAULT_WORLD_EXTENT / 2,\n width: DEFAULT_WORLD_EXTENT,\n height: DEFAULT_WORLD_EXTENT,\n fill: `url(#${this.gridPatternId})`,\n });\n this.edgesLayer = svgEl('g', { class: 'vd-flowchart-edges' });\n this.previewLayer = svgEl('g', { class: 'vd-flowchart-preview' });\n this.nodesLayer = svgEl('g', { class: 'vd-flowchart-nodes' });\n this.overlayLayer = svgEl('g', { class: 'vd-flowchart-overlay' });\n this.guidesLayer = svgEl('g', { class: 'vd-flowchart-guides' });\n\n this.world.appendChild(this.gridRect);\n this.world.appendChild(this.edgesLayer);\n this.world.appendChild(this.previewLayer);\n this.world.appendChild(this.nodesLayer);\n this.world.appendChild(this.overlayLayer);\n this.world.appendChild(this.guidesLayer);\n this.svg.appendChild(this.world);\n this.canvasEl.appendChild(this.svg);\n\n this.shortcutsHelp = createElement('div', { className: 'vd-flowchart-shortcuts' });\n this.shortcutsHelp.id = nextId('flowchart-shortcuts');\n this.shortcutsHelp.setAttribute('role', 'dialog');\n this.shortcutsHelp.setAttribute('aria-label', 'Keyboard shortcuts');\n this.shortcutsHelp.hidden = true;\n this.shortcutsHelp.addEventListener('pointerdown', (event) => event.stopPropagation());\n this.shortcutsHelp.addEventListener('wheel', (event) => event.stopPropagation());\n this.shortcutsButton.setAttribute('aria-controls', this.shortcutsHelp.id);\n this.canvasEl.appendChild(this.shortcutsHelp);\n\n // Pointer-only overview: keyboard users already have arrows and zoom keys.\n this.minimapEl = createElement('div', { className: 'vd-flowchart-minimap' });\n this.minimapEl.setAttribute('aria-hidden', 'true');\n this.minimapEl.hidden = true;\n this.minimapSvg = svgEl('svg', {\n class: 'vd-flowchart-minimap-svg',\n width: MINIMAP_WIDTH,\n height: MINIMAP_HEIGHT,\n viewBox: `0 0 ${MINIMAP_WIDTH} ${MINIMAP_HEIGHT}`,\n });\n this.minimapEl.appendChild(this.minimapSvg);\n this.minimapEl.addEventListener('pointerdown', (event) => this.handleMinimapPointer(event));\n this.minimapEl.addEventListener('pointermove', (event) => this.handleMinimapPointer(event));\n this.minimapEl.addEventListener('pointerup', (event) => this.endMinimapDrag(event));\n this.minimapEl.addEventListener('pointercancel', (event) => this.endMinimapDrag(event));\n this.minimapEl.addEventListener('wheel', (event) => event.stopPropagation());\n this.canvasEl.appendChild(this.minimapEl);\n\n this.inspectorPanel = createElement('aside', {\n className: 'vd-flowchart-panel vd-flowchart-panel--inspector',\n });\n this.inspectorPanel.appendChild(\n createElement('h4', { className: 'vd-flowchart-panel-title', text: 'Inspector' }),\n );\n this.selectionMeta = createElement('div', { className: 'vd-flowchart-selection-meta' });\n this.selectionFields = createElement('div', { className: 'vd-flowchart-fields' });\n this.deleteButton = createElement('button', {\n className: 'vd-flowchart-btn vd-flowchart-delete',\n text: 'Delete',\n disabled: true,\n });\n this.deleteButton.setAttribute('type', 'button');\n this.inspectorPanel.appendChild(this.selectionMeta);\n this.inspectorPanel.appendChild(this.selectionFields);\n this.inspectorPanel.appendChild(this.deleteButton);\n\n this.inspectorPanel.appendChild(\n createElement('h4', { className: 'vd-flowchart-panel-title', text: 'JSON' }),\n );\n this.jsonPanel = createElement('div', { className: 'vd-flowchart-json' });\n this.jsonTextarea = createElement('textarea', { rows: 18 });\n this.jsonActions = createElement('div', { className: 'vd-flowchart-json-actions' });\n this.refreshJsonButton = createElement('button', {\n className: 'vd-flowchart-json-btn',\n text: 'Refresh',\n });\n this.refreshJsonButton.setAttribute('type', 'button');\n this.refreshJsonButton.setAttribute('data-json-action', 'refresh');\n this.loadJsonButton = createElement('button', {\n className: 'vd-flowchart-json-btn',\n text: 'Load',\n disabled: this.readonly,\n });\n this.loadJsonButton.setAttribute('type', 'button');\n this.loadJsonButton.setAttribute('data-json-action', 'load');\n this.jsonActions.appendChild(this.refreshJsonButton);\n this.jsonActions.appendChild(this.loadJsonButton);\n this.jsonPanel.appendChild(this.jsonTextarea);\n this.jsonPanel.appendChild(this.jsonActions);\n this.jsonStatus = createElement('p', { className: 'vd-flowchart-json-status' });\n this.jsonStatus.setAttribute('role', 'status');\n this.jsonPanel.appendChild(this.jsonStatus);\n this.inspectorPanel.appendChild(this.jsonPanel);\n\n this.body.appendChild(this.palettePanel);\n this.body.appendChild(this.canvasEl);\n this.body.appendChild(this.inspectorPanel);\n\n this.root.appendChild(this.toolbar);\n this.root.appendChild(this.body);\n this.buildGraphOutline();\n this.element.appendChild(this.root);\n }\n\n buildGraphOutline() {\n this.graphOutline = createElement('details', { className: 'vd-flowchart-outline' });\n this.graphOutline.appendChild(createElement('summary', { text: 'Graph outline' }));\n this.graphOutline.addEventListener('toggle', () => {\n if (this.graphOutline.open) this.renderGraphOutline();\n });\n this.graphStatus = createElement('p', { className: 'vd-flowchart-sr-only' });\n this.graphStatus.setAttribute('role', 'status');\n this.canvasEl.appendChild(this.graphStatus);\n this.graphControls = createElement('div', { className: 'vd-flowchart-outline-controls' });\n this.graphNodeSelect = createElement('select');\n this.graphNodeSelect.setAttribute('aria-label', 'Selected node');\n this.graphNodeSelect.addEventListener('change', () =>\n this.selectNode(this.graphNodeSelect.value),\n );\n this.graphTargetSelect = createElement('select');\n this.graphTargetSelect.setAttribute('aria-label', 'Connection target');\n this.graphTargetSelect.addEventListener('change', () => this.renderGraphOutline());\n this.graphConnectButton = createElement('button', {\n text: 'Connect nodes',\n type: 'button',\n className: 'vd-flowchart-btn',\n });\n this.graphConnectButton.addEventListener('click', () => {\n if (this.readonly || this.graphNodeSelect.value === this.graphTargetSelect.value) {\n return;\n }\n this.addEdge({\n from: this.graphNodeSelect.value,\n to: this.graphTargetSelect.value,\n autoPort: true,\n });\n });\n this.graphEditButton = createElement('button', {\n text: 'Edit selected label',\n type: 'button',\n className: 'vd-flowchart-btn',\n });\n this.graphEditButton.addEventListener('click', () =>\n this.startTextEdit(this.graphNodeSelect.value),\n );\n this.graphControls.append(\n createField('Selected node', this.graphNodeSelect),\n createField('Connection target', this.graphTargetSelect),\n this.graphConnectButton,\n this.graphEditButton,\n );\n this.graphOutline.appendChild(this.graphControls);\n this.graphList = createElement('ul');\n this.graphList.setAttribute('aria-label', 'Nodes and connections');\n this.graphOutline.appendChild(this.graphList);\n this.root.appendChild(this.graphOutline);\n this.canvasEl.setAttribute('role', 'group');\n this.syncCanvasLabel();\n this.jsonTextarea.setAttribute('aria-label', 'Flowchart JSON');\n }\n\n syncCanvasLabel() {\n const keys =\n this.readonly || this.keyboardShortcuts === 'basic'\n ? 'Arrow keys select nodes; Enter or F2 edits a label.'\n : 'Arrow keys select nodes; Tab adds a child, Enter adds a sibling, F2 edits a label.';\n this.canvasEl.setAttribute(\n 'aria-label',\n `Diagram canvas. ${keys} Press ? for all shortcuts. Graph outline provides connections.`,\n );\n }\n\n renderGraphOutline() {\n if (!this.graphOutline) return;\n const nodes = this.documentData.nodes;\n const edges = this.documentData.edges;\n const labels = new Map(nodes.map((node) => [node.id, node.text || node.id]));\n const selected = this.selection?.kind === 'node' ? this.selection.id : null;\n this.graphStatus.textContent = selected\n ? `Selected: ${labels.get(selected)}. ${nodes.length} nodes, ${edges.length} connections.`\n : `${nodes.length} nodes, ${edges.length} connections.`;\n if (!this.graphOutline.open) return;\n const hidden = this.getHiddenNodeIds();\n const signature = JSON.stringify([\n nodes.map((node) => [node.id, node.text, Boolean(node.collapsed), hidden.has(node.id)]),\n edges.map((edge) => [edge.id, edge.from.nodeId, edge.to.nodeId, edge.label]),\n ]);\n if (signature !== this.graphSignature) {\n this.graphSignature = signature;\n for (const select of [this.graphNodeSelect, this.graphTargetSelect]) {\n const previous = select.value;\n select.replaceChildren();\n for (const node of nodes)\n select.appendChild(\n createElement('option', { value: node.id, text: labels.get(node.id) }),\n );\n if (labels.has(previous)) select.value = previous;\n }\n this.graphList.replaceChildren();\n const outgoing = new Map(nodes.map((node) => [node.id, []]));\n const incoming = new Map(nodes.map((node) => [node.id, []]));\n for (const edge of edges) {\n outgoing\n .get(edge.from.nodeId)\n ?.push(`${labels.get(edge.to.nodeId)}${edge.label ? ` (${edge.label})` : ''}`);\n incoming.get(edge.to.nodeId)?.push(labels.get(edge.from.nodeId));\n }\n for (const node of nodes) {\n const to = outgoing.get(node.id);\n const from = incoming.get(node.id);\n const relationships = [\n to.length ? `Connects to ${to.join(', ')}.` : 'No outgoing connections.',\n from.length ? `Connected from ${from.join(', ')}.` : '',\n node.collapsed ? 'Branch collapsed.' : '',\n hidden.has(node.id) ? 'Hidden in a collapsed branch.' : '',\n ].filter(Boolean);\n this.graphList.appendChild(\n createElement('li', { text: `${labels.get(node.id)}. ${relationships.join(' ')}` }),\n );\n }\n }\n if (selected) this.graphNodeSelect.value = selected;\n this.graphNodeSelect.disabled = nodes.length === 0;\n this.graphTargetSelect.disabled = this.readonly || nodes.length < 2;\n this.graphConnectButton.disabled =\n this.readonly ||\n nodes.length < 2 ||\n this.graphNodeSelect.value === this.graphTargetSelect.value;\n this.graphEditButton.disabled = this.readonly || nodes.length === 0;\n }\n\n bindEvents() {\n this.toolbar.addEventListener('click', this.handleToolbarClick);\n this.arrangeSelect.addEventListener('change', this.handleArrangeChange);\n this.paletteGrid.addEventListener('click', this.handlePaletteClick);\n this.deleteButton.addEventListener('click', () => this.deleteSelection());\n this.selectionFields.addEventListener('input', this.handleSelectionFieldInput);\n this.selectionFields.addEventListener('change', this.handleSelectionFieldChange);\n this.jsonActions.addEventListener('click', this.handleJsonActionClick);\n this.canvasEl.addEventListener('pointerdown', this.handlePointerDown);\n this.canvasEl.addEventListener('pointermove', this.handlePointerMove);\n this.canvasEl.addEventListener('pointerup', this.handlePointerUp);\n this.canvasEl.addEventListener('pointercancel', this.handlePointerUp);\n this.canvasEl.addEventListener('click', this.handleClick);\n this.canvasEl.addEventListener('dblclick', this.handleDoubleClick);\n this.canvasEl.addEventListener('wheel', this.handleWheel, { passive: false });\n this.canvasEl.addEventListener('blur', this.handleCanvasBlur);\n this.root.addEventListener('keydown', this.handleKeyDown, true);\n window.addEventListener('pointerup', this.handlePointerUp);\n window.addEventListener('resize', this.handleResize);\n }\n\n unbindEvents() {\n this.toolbar.removeEventListener('click', this.handleToolbarClick);\n this.arrangeSelect.removeEventListener('change', this.handleArrangeChange);\n this.paletteGrid.removeEventListener('click', this.handlePaletteClick);\n this.selectionFields.removeEventListener('input', this.handleSelectionFieldInput);\n this.selectionFields.removeEventListener('change', this.handleSelectionFieldChange);\n this.jsonActions.removeEventListener('click', this.handleJsonActionClick);\n this.canvasEl.removeEventListener('pointerdown', this.handlePointerDown);\n this.canvasEl.removeEventListener('pointermove', this.handlePointerMove);\n this.canvasEl.removeEventListener('pointerup', this.handlePointerUp);\n this.canvasEl.removeEventListener('pointercancel', this.handlePointerUp);\n this.canvasEl.removeEventListener('click', this.handleClick);\n this.canvasEl.removeEventListener('dblclick', this.handleDoubleClick);\n this.canvasEl.removeEventListener('wheel', this.handleWheel);\n this.canvasEl.removeEventListener('blur', this.handleCanvasBlur);\n this.root.removeEventListener('keydown', this.handleKeyDown, true);\n window.removeEventListener('pointerup', this.handlePointerUp);\n window.removeEventListener('resize', this.handleResize);\n }\n\n handleResize() {\n if (this.destroyed) return;\n this.render({ inspector: false, json: false });\n }\n\n /**\n * Focus the diagram canvas. Quiet focus returns from an inline editor without\n * painting the full-canvas `:focus-visible` ring (see `.is-quiet-focus`).\n */\n focusCanvas(options = {}) {\n if (!this.canvasEl || this.destroyed) return;\n const quiet = options.quiet === true;\n this.canvasEl.classList.toggle('is-quiet-focus', quiet);\n this.canvasEl.focus({ preventScroll: true });\n }\n\n handleCanvasBlur() {\n this.canvasEl?.classList.remove('is-quiet-focus');\n }\n\n updatePaletteState() {\n const arrowArmed = this.activeTool === 'arrow';\n this.paletteGrid.querySelectorAll('.vd-flowchart-palette-btn').forEach((button) => {\n const tool = button.getAttribute('data-tool');\n const active = Boolean(tool) && tool === this.activeTool;\n button.classList.toggle('is-active', active);\n if (tool) button.setAttribute('aria-pressed', active ? 'true' : 'false');\n });\n this.canvasEl.classList.toggle('is-arrow-tool', arrowArmed);\n }\n\n syncArrangeSelect() {\n if (!this.arrangeSelect) return;\n const mode = LAYOUT_OPTIONS.some((item) => item.value === this.layoutMode)\n ? this.layoutMode\n : 'tree';\n this.layoutMode = mode;\n this.arrangeSelect.value = mode;\n }\n\n setActiveTool(tool) {\n this.activeTool = tool || null;\n this.updatePaletteState();\n this.render({ scene: true, inspector: false, json: false });\n }\n\n handleToolbarClick(event) {\n const actionButton = event.target.closest('[data-flowchart-action]');\n if (!actionButton) return;\n\n const action = actionButton.getAttribute('data-flowchart-action');\n if (action === 'zoom-in') this.zoomIn();\n if (action === 'zoom-out') this.zoomOut();\n if (action === 'reset-view') this.resetView();\n if (action === 'fit-view') this.fitView();\n if (action === 'undo') this.undo();\n if (action === 'redo') this.redo();\n if (action === 'clear' && !this.readonly) this.clear();\n if (action === 'shortcuts') this.toggleShortcutsHelp();\n if (action === 'minimap') this.setMinimapEnabled(!this.minimapEnabled);\n }\n\n setMinimapEnabled(enabled) {\n this.minimapEnabled = Boolean(enabled);\n this.minimapButton.setAttribute('aria-pressed', this.minimapEnabled ? 'true' : 'false');\n this.drawMinimap();\n return this;\n }\n\n scheduleMinimap() {\n if (this.minimapFrame || !hasWindow()) return;\n const raf =\n typeof requestAnimationFrame === 'function'\n ? requestAnimationFrame\n : (callback) => setTimeout(callback, 16);\n this.minimapFrame = raf(() => {\n this.minimapFrame = 0;\n this.drawMinimap();\n });\n }\n\n // World-to-minimap mapping covering every visible node and the viewport.\n getMinimapTransform() {\n const viewport = this.documentData.viewport;\n const width = this.canvasEl.clientWidth;\n const height = this.canvasEl.clientHeight;\n const view = {\n left: -viewport.x / viewport.scale,\n top: -viewport.y / viewport.scale,\n right: (width - viewport.x) / viewport.scale,\n bottom: (height - viewport.y) / viewport.scale,\n };\n const content = getBounds(this.getVisibleNodes());\n const left = Math.min(content.left, view.left);\n const top = Math.min(content.top, view.top);\n const spanX = Math.max(1, Math.max(content.right, view.right) - left);\n const spanY = Math.max(1, Math.max(content.bottom, view.bottom) - top);\n const padding = 8;\n const scale = Math.min(\n (MINIMAP_WIDTH - padding * 2) / spanX,\n (MINIMAP_HEIGHT - padding * 2) / spanY,\n );\n return {\n scale,\n offsetX: (MINIMAP_WIDTH - spanX * scale) / 2 - left * scale,\n offsetY: (MINIMAP_HEIGHT - spanY * scale) / 2 - top * scale,\n view,\n };\n }\n\n drawMinimap() {\n if (this.destroyed || !this.minimapEl) return;\n const nodes = this.getVisibleNodes();\n const visible =\n this.minimapEnabled &&\n nodes.length > 0 &&\n this.canvasEl.clientWidth >= MINIMAP_MIN_CANVAS_WIDTH;\n this.minimapEl.hidden = !visible;\n if (!visible) return;\n\n const transform = this.minimapDrag?.transform || this.getMinimapTransform();\n const view = this.getMinimapTransform().view;\n const map = (x, y) => ({\n x: formatNumber(x * transform.scale + transform.offsetX),\n y: formatNumber(y * transform.scale + transform.offsetY),\n });\n clearChildren(this.minimapSvg);\n nodes.forEach((node) => {\n const point = map(node.x, node.y);\n const selected = this.isNodeSelected(node.id);\n this.minimapSvg.appendChild(\n svgEl('rect', {\n class: `vd-flowchart-minimap-node${selected ? ' is-selected' : ''}`,\n x: point.x,\n y: point.y,\n width: formatNumber(Math.max(1.5, node.width * transform.scale)),\n height: formatNumber(Math.max(1.5, node.height * transform.scale)),\n rx: 1.5,\n }),\n );\n });\n const corner = map(view.left, view.top);\n this.minimapSvg.appendChild(\n svgEl('rect', {\n class: 'vd-flowchart-minimap-viewport',\n x: corner.x,\n y: corner.y,\n width: formatNumber((view.right - view.left) * transform.scale),\n height: formatNumber((view.bottom - view.top) * transform.scale),\n }),\n );\n }\n\n // Centre the main view on the world point under the minimap pointer. The\n // mapping is frozen for the whole drag so the map does not shift under it.\n handleMinimapPointer(event) {\n event.stopPropagation();\n if (event.type === 'pointerdown') {\n if (event.button != null && event.button !== 0) return;\n event.preventDefault();\n this.minimapDrag = { pointerId: event.pointerId, transform: this.getMinimapTransform() };\n try {\n this.minimapEl.setPointerCapture?.(event.pointerId);\n } catch {\n /* ignore */\n }\n }\n if (!this.minimapDrag || this.minimapDrag.pointerId !== event.pointerId) return;\n const rect = this.minimapEl.getBoundingClientRect();\n const { transform } = this.minimapDrag;\n this.centerViewOn(\n (event.clientX - rect.left - transform.offsetX) / transform.scale,\n (event.clientY - rect.top - transform.offsetY) / transform.scale,\n );\n }\n\n endMinimapDrag(event) {\n event.stopPropagation();\n if (!this.minimapDrag || this.minimapDrag.pointerId !== event.pointerId) return;\n this.minimapDrag = null;\n this.syncJsonTextarea();\n this.emitViewportChange('viewport:pan');\n this.drawMinimap();\n }\n\n centerViewOn(worldX, worldY) {\n const viewport = this.documentData.viewport;\n const width = this.canvasEl.clientWidth || 800;\n const height = this.canvasEl.clientHeight || 560;\n viewport.x = formatNumber(width / 2 - worldX * viewport.scale);\n viewport.y = formatNumber(height / 2 - worldY * viewport.scale);\n this.render({ inspector: false, json: false });\n return this;\n }\n\n toggleShortcutsHelp(force) {\n const open = typeof force === 'boolean' ? force : !this.shortcutsHelpOpen;\n this.shortcutsHelpOpen = open;\n this.shortcutsButton.setAttribute('aria-expanded', open ? 'true' : 'false');\n if (open) this.renderShortcutsHelp();\n this.shortcutsHelp.hidden = !open;\n if (!open && this.shortcutsHelp.contains(document.activeElement)) this.canvasEl.focus();\n return this;\n }\n\n renderShortcutsHelp() {\n clearChildren(this.shortcutsHelp);\n const header = createElement('div', { className: 'vd-flowchart-shortcuts-header' });\n header.appendChild(\n createElement('h4', { className: 'vd-flowchart-panel-title', text: 'Keyboard shortcuts' }),\n );\n const close = createElement('button', {\n className: 'vd-flowchart-btn vd-flowchart-icon-btn',\n text: '\u00D7',\n });\n close.setAttribute('type', 'button');\n close.setAttribute('aria-label', 'Close keyboard shortcuts');\n close.addEventListener('click', () => this.toggleShortcutsHelp(false));\n header.appendChild(close);\n this.shortcutsHelp.appendChild(header);\n\n const list = createElement('dl', { className: 'vd-flowchart-shortcuts-list' });\n getShortcutRows(this.keyboardShortcuts, this.readonly).forEach(([keys, action]) => {\n list.appendChild(createElement('dt', { text: keys }));\n list.appendChild(createElement('dd', { text: action }));\n });\n this.shortcutsHelp.appendChild(list);\n }\n\n handleArrangeChange(event) {\n if (this.readonly) return;\n const mode = event.target.value;\n if (!LAYOUT_OPTIONS.some((item) => item.value === mode)) {\n this.syncArrangeSelect();\n return;\n }\n this.layoutMode = mode;\n this.layout(mode);\n }\n\n handlePaletteClick(event) {\n if (this.readonly) return;\n const toolButton = event.target.closest('[data-tool]');\n if (toolButton) {\n const tool = toolButton.getAttribute('data-tool');\n this.setActiveTool(this.activeTool === tool ? null : tool);\n return;\n }\n const button = event.target.closest('[data-node-type]');\n if (!button) return;\n this.setActiveTool(null);\n this.addNode({ type: button.getAttribute('data-node-type') });\n }\n\n handleJsonActionClick(event) {\n const button = event.target.closest('[data-json-action]');\n if (!button) return;\n\n const action = button.getAttribute('data-json-action');\n if (action === 'refresh') {\n this.syncJsonTextarea(true);\n return;\n }\n\n if (action === 'load' && !this.readonly) {\n try {\n this.load(this.jsonTextarea.value);\n this.jsonStatus.textContent = '';\n } catch (error) {\n this.jsonStatus.textContent = error.message;\n }\n }\n }\n\n handleSelectionFieldInput(event) {\n const field = event.target.getAttribute('data-field');\n if (!field) return;\n\n if (field === 'node-text') {\n this.updateNode(\n this.selection?.id,\n { text: event.target.value },\n { inspector: false, reason: 'node:update' },\n );\n return;\n }\n\n if (field === 'edge-label') {\n this.updateEdge(\n this.selection?.id,\n { label: event.target.value },\n { inspector: false, reason: 'edge:update' },\n );\n return;\n }\n\n if (field === 'node-width' || field === 'node-height') {\n const patch =\n field === 'node-width'\n ? { width: toFiniteNumber(event.target.value, undefined) }\n : { height: toFiniteNumber(event.target.value, undefined) };\n this.updateNode(this.selection?.id, patch, { inspector: false, reason: 'node:update' });\n }\n }\n\n handleSelectionFieldChange(event) {\n const field = event.target.getAttribute('data-field');\n if (!field) return;\n\n if (field === 'node-type') {\n this.updateNode(\n this.selection?.id,\n { type: event.target.value },\n { inspector: true, reason: 'node:update' },\n );\n return;\n }\n\n if (field === 'edge-start-marker') {\n this.updateEdge(\n this.selection?.id,\n { startMarker: event.target.value },\n { inspector: true, reason: 'edge:update' },\n );\n return;\n }\n\n if (field === 'edge-end-marker') {\n this.updateEdge(\n this.selection?.id,\n { endMarker: event.target.value },\n { inspector: true, reason: 'edge:update' },\n );\n return;\n }\n\n if (field === 'edge-route') {\n this.updateEdge(\n this.selection?.id,\n { route: event.target.value },\n { inspector: true, reason: 'edge:update' },\n );\n return;\n }\n\n if (field === 'edge-stroke-preset') {\n this.updateEdge(\n this.selection?.id,\n { strokeWidth: getStrokePresetWidth(event.target.value) },\n { inspector: true, reason: 'edge:update' },\n );\n }\n }\n\n // Keys the editor consumes stop here, so page-level shortcuts (a docs\n // site's \"/\" search, a host's Escape handler) do not also fire.\n handleKeyDown(event) {\n const alreadyHandled = event.defaultPrevented;\n this.handleEditorKey(event);\n if (!alreadyHandled && event.defaultPrevented) event.stopPropagation();\n }\n\n handleEditorKey(event) {\n const target = event.target;\n if (\n target &&\n (target.tagName === 'INPUT' ||\n target.tagName === 'TEXTAREA' ||\n target.tagName === 'SELECT' ||\n target.isContentEditable)\n ) {\n return;\n }\n if (event.isComposing) return;\n\n const key = event.key;\n const modKey = event.metaKey || event.ctrlKey;\n\n if (key === 'Escape' && this.shortcutsHelpOpen) {\n event.preventDefault();\n this.toggleShortcutsHelp(false);\n return;\n }\n\n if (target === this.canvasEl && this.handleCanvasKeyDown(event)) {\n event.preventDefault();\n return;\n }\n if (this.readonly) return;\n\n if (key === 'Escape') {\n // Step back one level: tool, then edge reconnect mode, then selection.\n if (this.activeTool) this.setActiveTool(null);\n else if (this.reconnectEdgeId) {\n this.reconnectEdgeId = null;\n this.render({ inspector: false, json: false });\n } else if (this.selection) this.select(null);\n else return;\n event.preventDefault();\n return;\n }\n\n if (modKey && (key === 'd' || key === 'D')) {\n if (this.selection?.kind === 'node') {\n event.preventDefault();\n this.duplicateSelection();\n }\n return;\n }\n if (modKey && (event.key === 'z' || event.key === 'Z')) {\n event.preventDefault();\n if (event.shiftKey) {\n this.redo();\n } else {\n this.undo();\n }\n return;\n }\n if (modKey && (event.key === 'y' || event.key === 'Y')) {\n event.preventDefault();\n this.redo();\n return;\n }\n if (modKey && event.key === 'c') {\n if (this.selection) {\n event.preventDefault();\n this.copySelection();\n }\n return;\n }\n if (modKey && event.key === 'v') {\n if (this.clipboard) {\n event.preventDefault();\n this.pasteClipboard();\n }\n return;\n }\n if (modKey && event.key === 'x') {\n if (this.selection) {\n event.preventDefault();\n this.cutSelection();\n }\n return;\n }\n\n if (!this.selection) return;\n if (event.key === 'Backspace' || event.key === 'Delete') {\n event.preventDefault();\n if (this.selection.kind === 'node' && !this.hasMultiSelection()) {\n const removedId = this.selection.id;\n const parent = this.getParentNode(removedId);\n const sibling = parent\n ? this.getChildNodes(parent.id).find((node) => node.id !== removedId)\n : null;\n if (this.deleteSelection()) {\n const next = (parent && this.findNode(parent.id)) || sibling;\n if (next) this.select({ kind: 'node', id: next.id });\n }\n return;\n }\n this.deleteSelection();\n }\n }\n\n // Keys that only apply while the canvas itself has focus. Returns true when\n // the key was handled (the caller prevents the default action).\n handleCanvasKeyDown(event) {\n const key = event.key;\n const modKey = event.metaKey || event.ctrlKey;\n const mindmap = this.keyboardShortcuts === 'mindmap';\n const selectedNode = this.selection?.kind === 'node' ? this.findNode(this.selection.id) : null;\n const selectedEdge = this.selection?.kind === 'edge' ? this.findEdge(this.selection.id) : null;\n const movable = !this.readonly && Boolean(selectedNode);\n // Insertion and label keys act on one node; a group only moves or deletes.\n const editable = movable && !this.hasMultiSelection();\n\n if (key === '?' && !modKey && !event.altKey) {\n this.toggleShortcutsHelp();\n return true;\n }\n\n if (modKey && !event.altKey) {\n if (key === '=' || key === '+') return Boolean(this.zoomIn());\n if (key === '-' || key === '_') return Boolean(this.zoomOut());\n if (key === '0') return Boolean(this.zoomTo(1));\n if (key === 'a' || key === 'A') {\n this.selectNodes(this.getVisibleNodes().map((node) => node.id));\n return true;\n }\n if (key === '/' && selectedNode && !this.hasMultiSelection()) {\n this.toggleCollapsed(selectedNode.id);\n return true;\n }\n return false;\n }\n if (event.shiftKey && !event.altKey && (key === '!' || event.code === 'Digit1')) {\n return Boolean(this.fitView());\n }\n\n const direction = ARROW_DIRECTIONS[key];\n if (direction) {\n if (event.altKey) {\n if (movable) {\n this.nudgeNodes(this.getSelectedNodeIds(), direction, event.shiftKey ? 1 : this.gridSize);\n }\n return true;\n }\n if (event.shiftKey) {\n const anchorId = selectedNode?.id ?? (selectedEdge ? this.edgeCycleAnchor : null);\n return anchorId ? this.selectSideEdge(anchorId, direction) : false;\n }\n this.navigateSelection(direction);\n return true;\n }\n\n const nodes = this.getVisibleNodes();\n if ((key === 'Home' || key === 'End') && nodes.length) {\n this.selectNode(nodes[key === 'Home' ? 0 : nodes.length - 1].id);\n return true;\n }\n\n if (selectedEdge && !this.readonly && !event.altKey) {\n if (key === 'F2' || key === 'Enter' || (key === ' ' && mindmap)) {\n return this.startEdgeLabelEdit(selectedEdge.id);\n }\n if (mindmap && key.length === 1 && key !== ' ') {\n return this.startEdgeLabelEdit(selectedEdge.id, { initialText: key });\n }\n return false;\n }\n\n if (!editable || event.altKey) return false;\n\n if (key === 'F2' || (key === 'Enter' && !mindmap) || (key === ' ' && mindmap)) {\n this.startTextEdit(selectedNode.id);\n return true;\n }\n if (!mindmap) return false;\n\n if (key === 'Tab' && !event.shiftKey) {\n this.insertBranchNode(selectedNode.id, { edit: true });\n return true;\n }\n if (key === 'Enter') {\n this.insertSiblingNode(selectedNode.id, { before: event.shiftKey, edit: true });\n return true;\n }\n if (key.length === 1 && key !== ' ' && isNodeTextEditable(selectedNode)) {\n this.startTextEdit(selectedNode.id, { initialText: key });\n return true;\n }\n return false;\n }\n\n // Move the selection to the nearest node in `direction`; with nothing (or an\n // edge) selected, start from the node closest to the centre of the view.\n navigateSelection(direction) {\n const nodes = this.getVisibleNodes();\n if (!nodes.length) return false;\n const current = this.selection?.kind === 'node' ? this.findNode(this.selection.id) : null;\n const edge = this.selection?.kind === 'edge' ? this.findEdge(this.selection.id) : null;\n const next = current\n ? findSpatialNeighbor(nodes, current, direction)\n : edge\n ? this.getEdgeEndInDirection(edge, direction)\n : findNearestNode(nodes, this.getViewportCenter());\n if (!next) return false;\n this.selectNode(next.id);\n this.revealNode(next.id);\n return true;\n }\n\n // The end of `edge` that best matches `direction`, measured from the label\n // anchor so either end can be reached from a selected connection.\n getEdgeEndInDirection(edge, direction) {\n const fromNode = this.findNode(edge.from.nodeId);\n const toNode = this.findNode(edge.to.nodeId);\n if (!fromNode || !toNode) return fromNode || toNode;\n const { labelX, labelY } = buildEdgePath(edge, fromNode, toNode);\n const vector = { right: [1, 0], left: [-1, 0], down: [0, 1], up: [0, -1] }[direction];\n const score = (node) =>\n (node.x + node.width / 2 - labelX) * vector[0] +\n (node.y + node.height / 2 - labelY) * vector[1];\n return score(toNode) >= score(fromNode) ? toNode : fromNode;\n }\n\n // Connections attached to `nodeId` on the `direction` side, outgoing or\n // incoming, in document order.\n getSideEdges(nodeId, direction) {\n const port = DIRECTION_PORTS[direction];\n return this.documentData.edges.filter(\n (edge) =>\n (edge.from.nodeId === nodeId && edge.from.port === port) ||\n (edge.to.nodeId === nodeId && edge.to.port === port),\n );\n }\n\n // Select a connection on one side of a node; repeating cycles through them.\n selectSideEdge(nodeId, direction) {\n const edges = this.getSideEdges(nodeId, direction);\n if (!edges.length) return false;\n const currentIndex =\n this.selection?.kind === 'edge'\n ? edges.findIndex((edge) => edge.id === this.selection.id)\n : -1;\n const next = edges[(currentIndex + 1) % edges.length];\n this.select({ kind: 'edge', id: next.id });\n this.edgeCycleAnchor = nodeId;\n return true;\n }\n\n nudgeNode(nodeId, direction, distance) {\n const [node] = this.nudgeNodes([nodeId], direction, distance);\n return node || null;\n }\n\n // Move nodes together; repeated nudges of the same selection coalesce into\n // one undo step.\n nudgeNodes(nodeIds, direction, distance) {\n const step = { right: [1, 0], left: [-1, 0], down: [0, 1], up: [0, -1] }[direction];\n if (this.readonly || !step) return [];\n const nodes = nodeIds.map((id) => this.findNode(id)).filter(Boolean);\n if (!nodes.length) return [];\n nodes.forEach((node) => {\n node.x = formatNumber(node.x + step[0] * distance);\n node.y = formatNumber(node.y + step[1] * distance);\n });\n this.render({ inspector: true, json: true });\n this.emitChange(\n 'node:nudge',\n nodes.length > 1 ? { nodeIds: nodes.map((node) => node.id) } : { node: deepClone(nodes[0]) },\n );\n return nodes.map((node) => deepClone(node));\n }\n\n zoomTo(scale) {\n const viewport = this.documentData.viewport;\n const width = this.canvasEl.clientWidth || 800;\n const height = this.canvasEl.clientHeight || 560;\n this.scaleAround(\n clamp(formatScale(scale), this.minScale, this.maxScale) / viewport.scale,\n width / 2,\n height / 2,\n 'viewport:zoom',\n );\n return this;\n }\n\n duplicateSelection() {\n if (this.readonly || this.selection?.kind !== 'node') return null;\n if (this.hasMultiSelection()) return this.pasteNodeGroup(this.captureNodeGroup());\n const node = this.findNode(this.selection.id);\n return node ? this.pasteNodeData(node) : null;\n }\n\n // Selected nodes plus the connections that run between them.\n captureNodeGroup() {\n const ids = new Set(this.getSelectedNodeIds());\n return {\n nodes: deepClone(this.documentData.nodes.filter((node) => ids.has(node.id))),\n edges: deepClone(\n this.documentData.edges.filter(\n (edge) => ids.has(edge.from.nodeId) && ids.has(edge.to.nodeId),\n ),\n ),\n };\n }\n\n // Paste a captured group offset by one step, remapping ids so internal\n // connections follow their copies. One change, one undo step.\n pasteNodeGroup(group) {\n if (this.readonly || !group?.nodes?.length) return [];\n const usedNodeIds = new Set(this.documentData.nodes.map((node) => node.id));\n const idMap = new Map();\n const nodes = group.nodes.map((data, index) => {\n const node = normalizeNode(\n { ...data, id: undefined, x: data.x + 24, y: data.y + 24 },\n this.documentData.nodes.length + index,\n usedNodeIds,\n this.nodeSizeBounds(),\n );\n idMap.set(data.id, node.id);\n return node;\n });\n this.documentData.nodes.push(...nodes);\n const nodeIds = new Set(this.documentData.nodes.map((node) => node.id));\n const usedEdgeIds = new Set(this.documentData.edges.map((edge) => edge.id));\n group.edges.forEach((data, index) => {\n const edge = normalizeEdge(\n {\n ...data,\n id: undefined,\n from: { ...data.from, nodeId: idMap.get(data.from.nodeId) },\n to: { ...data.to, nodeId: idMap.get(data.to.nodeId) },\n },\n this.documentData.edges.length + index,\n nodeIds,\n usedEdgeIds,\n );\n if (edge) this.documentData.edges.push(edge);\n });\n const ids = nodes.map((node) => node.id);\n this.selectNodes(ids);\n this.emitChange('nodes:add', { nodeIds: ids });\n return nodes.map((node) => deepClone(node));\n }\n\n pasteNodeData(data) {\n const usedIds = new Set(this.documentData.nodes.map((node) => node.id));\n // A lone copy has no children, so it cannot stay collapsed.\n const node = normalizeNode(\n { ...data, id: undefined, collapsed: undefined, x: data.x + 24, y: data.y + 24 },\n this.documentData.nodes.length,\n usedIds,\n this.nodeSizeBounds(),\n );\n this.documentData.nodes.push(node);\n this.select({ kind: 'node', id: node.id });\n this.emitChange('node:add', { node: deepClone(node) });\n return deepClone(node);\n }\n\n copySelection() {\n if (!this.selection) return false;\n if (this.hasMultiSelection()) {\n this.clipboard = { kind: 'nodes', data: this.captureNodeGroup() };\n return true;\n }\n if (this.selection.kind === 'node') {\n const node = this.findNode(this.selection.id);\n if (!node) return false;\n this.clipboard = { kind: 'node', data: deepClone(node) };\n return true;\n }\n const edge = this.findEdge(this.selection.id);\n if (!edge) return false;\n this.clipboard = { kind: 'edge', data: deepClone(edge) };\n return true;\n }\n\n pasteClipboard() {\n if (!this.clipboard || this.readonly) return false;\n\n if (this.clipboard.kind === 'node') {\n this.pasteNodeData(this.clipboard.data);\n return true;\n }\n if (this.clipboard.kind === 'nodes') {\n const pasted = this.pasteNodeGroup(this.clipboard.data);\n // Repeated pastes keep stepping instead of stacking on one spot.\n this.clipboard = { kind: 'nodes', data: this.captureNodeGroup() };\n return pasted.length > 0;\n }\n\n const usedIds = new Set(this.documentData.edges.map((edge) => edge.id));\n const nodeIds = new Set(this.documentData.nodes.map((node) => node.id));\n const edge = normalizeEdge(\n {\n ...this.clipboard.data,\n id: undefined,\n },\n this.documentData.edges.length,\n nodeIds,\n usedIds,\n );\n if (!edge) return false;\n\n this.documentData.edges.push(edge);\n this.select({ kind: 'edge', id: edge.id });\n this.emitChange('edge:add', { edge: deepClone(edge) });\n return true;\n }\n\n cutSelection() {\n if (!this.copySelection()) return false;\n return this.deleteSelection();\n }\n\n handleDoubleClick(event) {\n if (this.readonly) return;\n\n const edgeTarget = event.target.closest('[data-edge-id]');\n if (edgeTarget && !event.target.closest('[data-edge-endpoint]')) {\n const edgeId = edgeTarget.getAttribute('data-edge-id');\n if (edgeId && this.startEdgeLabelEdit(edgeId)) {\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n }\n\n const nodeTarget = event.target.closest('[data-node-id]');\n if (\n !nodeTarget ||\n event.target.closest('[data-edge-id]') ||\n event.target.closest('[data-collapse-toggle]')\n ) {\n return;\n }\n const nodeId = nodeTarget.getAttribute('data-node-id');\n if (this.startTextEdit(nodeId)) {\n event.preventDefault();\n event.stopPropagation();\n }\n }\n\n handleClick(event) {\n if (this.readonly || event.detail < 2) return;\n const nodeTarget = event.target.closest('[data-node-id]');\n if (\n !nodeTarget ||\n event.target.closest('[data-port]') ||\n event.target.closest('[data-resize-handle]') ||\n event.target.closest('[data-collapse-toggle]')\n )\n return;\n if (this.startTextEdit(nodeTarget.getAttribute('data-node-id'))) {\n event.preventDefault();\n event.stopPropagation();\n }\n }\n\n handlePointerDown(event) {\n if (this.destroyed || (event.button != null && event.button !== 0)) return;\n\n if (this.textEditor && !event.target.closest('.vd-flowchart-text-editor')) {\n this.stopTextEdit({ commit: true });\n }\n\n this.canvasEl.focus();\n const collapseTarget = event.target.closest('[data-collapse-toggle]');\n if (collapseTarget) {\n this.lastNodePointer = null;\n this.toggleCollapsed(collapseTarget.getAttribute('data-collapse-toggle'));\n event.preventDefault();\n return;\n }\n const nodeTarget = event.target.closest('[data-node-id]');\n const portTarget = event.target.closest('[data-port]');\n const resizeTarget = event.target.closest('[data-resize-handle]');\n const edgeTarget = event.target.closest('[data-edge-id]');\n const endpointTarget = event.target.closest('[data-edge-endpoint]');\n\n if (endpointTarget && !this.readonly) {\n const edgeId = endpointTarget.getAttribute('data-edge-id');\n const endpoint = endpointTarget.getAttribute('data-edge-endpoint');\n const edge = this.findEdge(edgeId);\n if (!edge || (endpoint !== 'from' && endpoint !== 'to')) return;\n\n const fromNode = this.findNode(edge.from.nodeId);\n const toNode = this.findNode(edge.to.nodeId);\n if (!fromNode || !toNode) return;\n\n this.reconnectEdgeId = edgeId;\n this.select({ kind: 'edge', id: edgeId });\n this.interaction = {\n kind: 'reconnect',\n pointerId: event.pointerId,\n edgeId,\n endpoint,\n target: null,\n previousSnap: null,\n fromPoint: getPortPosition(fromNode, edge.from.port),\n toPoint: getPortPosition(toNode, edge.to.port),\n fromPort: edge.from.port,\n toPort: edge.to.port,\n route: edge.route,\n strokeWidth: edge.strokeWidth,\n };\n this.capturePointer(event.pointerId);\n this.syncConnectingState();\n this.render({ inspector: false, json: false });\n event.preventDefault();\n return;\n }\n\n if (nodeTarget && !portTarget && !resizeTarget && !edgeTarget && event.shiftKey) {\n this.reconnectEdgeId = null;\n this.lastNodePointer = null;\n this.toggleNodeSelection(nodeTarget.getAttribute('data-node-id'));\n event.preventDefault();\n return;\n }\n\n if (nodeTarget && !portTarget && !resizeTarget && !edgeTarget && !this.readonly) {\n if (this.activeTool === 'arrow') {\n this.select({ kind: 'node', id: nodeTarget.getAttribute('data-node-id') });\n event.preventDefault();\n return;\n }\n const nodeId = nodeTarget.getAttribute('data-node-id');\n const now = Date.now();\n const repeatedNodeClick =\n this.lastNodePointer &&\n this.lastNodePointer.nodeId === nodeId &&\n now - this.lastNodePointer.time <= 420;\n this.lastNodePointer = { nodeId, time: now };\n if ((event.detail >= 2 || repeatedNodeClick) && this.startTextEdit(nodeId)) {\n event.preventDefault();\n return;\n }\n } else {\n this.lastNodePointer = null;\n }\n\n if (portTarget && !this.readonly) {\n const nodeId = portTarget.getAttribute('data-node-id');\n const port = portTarget.getAttribute('data-port');\n const node = this.findNode(nodeId);\n if (!node) return;\n\n const sourcePoint = getPortPosition(node, port);\n this.interaction = {\n kind: 'connect',\n pointerId: event.pointerId,\n startClientX: event.clientX,\n startClientY: event.clientY,\n moved: false,\n source: { nodeId, port },\n target: null,\n previousSnap: null,\n fromPoint: sourcePoint,\n toPoint: sourcePoint,\n fromPort: port,\n toPort: 'left',\n route: DEFAULT_EDGE_ROUTE,\n strokeWidth: DEFAULT_EDGE_STROKE_WIDTH,\n };\n this.select({ kind: 'node', id: nodeId });\n this.capturePointer(event.pointerId);\n this.syncConnectingState();\n this.render({ inspector: false, json: false });\n event.preventDefault();\n return;\n }\n\n if (resizeTarget && !this.readonly) {\n const nodeId = resizeTarget.getAttribute('data-node-id');\n const handle = resizeTarget.getAttribute('data-resize-handle');\n const node = this.findNode(nodeId);\n if (!node || !RESIZE_HANDLES.includes(handle)) return;\n\n this.select({ kind: 'node', id: nodeId });\n this.interaction = {\n kind: 'resize-node',\n pointerId: event.pointerId,\n nodeId,\n handle,\n startWorld: this.clientToWorld(event.clientX, event.clientY),\n original: deepClone(node),\n moved: false,\n };\n this.capturePointer(event.pointerId);\n event.preventDefault();\n return;\n }\n\n if (edgeTarget) {\n const edgeId = edgeTarget.getAttribute('data-edge-id');\n if (!this.readonly) {\n this.reconnectEdgeId = edgeId;\n } else if (this.reconnectEdgeId && this.reconnectEdgeId !== edgeId) {\n this.reconnectEdgeId = null;\n }\n this.select({ kind: 'edge', id: edgeId });\n event.preventDefault();\n return;\n }\n\n if (nodeTarget) {\n this.reconnectEdgeId = null;\n const nodeId = nodeTarget.getAttribute('data-node-id');\n // Pressing a node that is part of a group keeps the group and drags it.\n const groupIds =\n this.hasMultiSelection() && this.isNodeSelected(nodeId)\n ? this.getSelectedNodeIds()\n : [nodeId];\n if (groupIds.length > 1) this.selectNodes(groupIds, { primary: nodeId });\n else this.select({ kind: 'node', id: nodeId });\n\n if (!this.readonly) {\n this.interaction = this.createDragInteraction(event, nodeId, groupIds);\n this.capturePointer(event.pointerId);\n }\n\n return;\n }\n\n if (event.shiftKey) {\n const startWorld = this.clientToWorld(event.clientX, event.clientY);\n this.interaction = {\n kind: 'marquee',\n pointerId: event.pointerId,\n startWorld,\n baseIds: this.selection?.kind === 'node' ? this.getSelectedNodeIds() : [],\n };\n this.capturePointer(event.pointerId);\n event.preventDefault();\n return;\n }\n\n this.select(null);\n this.reconnectEdgeId = null;\n this.interaction = {\n kind: 'pan',\n pointerId: event.pointerId,\n startClientX: event.clientX,\n startClientY: event.clientY,\n startViewportX: this.documentData.viewport.x,\n startViewportY: this.documentData.viewport.y,\n moved: false,\n };\n this.capturePointer(event.pointerId);\n event.preventDefault();\n }\n\n createDragInteraction(event, nodeId, nodeIds) {\n const nodes = nodeIds.map((id) => this.findNode(id)).filter(Boolean);\n const moving = new Set(nodes.map((node) => node.id));\n return {\n kind: 'drag-node',\n pointerId: event.pointerId,\n nodeId,\n nodeIds: nodes.map((node) => node.id),\n startWorld: this.clientToWorld(event.clientX, event.clientY),\n origins: new Map(nodes.map((node) => [node.id, { x: node.x, y: node.y }])),\n bounds: getBounds(nodes),\n guideLines: this.snapGuides\n ? collectGuideLines(this.getVisibleNodes().filter((node) => !moving.has(node.id)))\n : null,\n snapDisabled: false,\n moved: false,\n };\n }\n\n // Translate every dragged node by the pointer delta, snapping the group's\n // bounds to the nearest alignment guide on each axis. Alt turns snapping\n // off for the rest of the gesture.\n moveDraggedNodes(event) {\n const interaction = this.interaction;\n const world = this.clientToWorld(event.clientX, event.clientY);\n let dx = world.x - interaction.startWorld.x;\n let dy = world.y - interaction.startWorld.y;\n if (event.altKey) interaction.snapDisabled = true;\n\n let guides = [];\n if (interaction.guideLines && !interaction.snapDisabled) {\n const box = interaction.bounds;\n const threshold = GUIDE_SNAP_DISTANCE / this.documentData.viewport.scale;\n const left = box.left + dx;\n const top = box.top + dy;\n const width = box.right - box.left;\n const height = box.bottom - box.top;\n const snapX = snapToGuides(\n interaction.guideLines.x,\n [left, left + width / 2, left + width],\n threshold,\n );\n const snapY = snapToGuides(\n interaction.guideLines.y,\n [top, top + height / 2, top + height],\n threshold,\n );\n if (snapX) dx += snapX.offset;\n if (snapY) dy += snapY.offset;\n const snapped = { left: box.left + dx, top: box.top + dy, width, height };\n if (snapX) guides = guides.concat(guideSegments('x', snapX.lines, snapped));\n if (snapY) guides = guides.concat(guideSegments('y', snapY.lines, snapped));\n }\n\n let changed = false;\n interaction.nodeIds.forEach((id) => {\n const node = this.findNode(id);\n const origin = interaction.origins.get(id);\n if (!node || !origin) return;\n const nextX = formatNumber(origin.x + dx);\n const nextY = formatNumber(origin.y + dy);\n if (nextX === node.x && nextY === node.y) return;\n node.x = nextX;\n node.y = nextY;\n changed = true;\n this.renderDraggedNode(node);\n });\n if (changed) interaction.moved = true;\n this.renderGuides(guides);\n }\n\n // Live marquee: select every visible node the box touches, added to the\n // selection the gesture started from.\n updateMarquee(event) {\n const interaction = this.interaction;\n const world = this.clientToWorld(event.clientX, event.clientY);\n const box = {\n left: Math.min(interaction.startWorld.x, world.x),\n top: Math.min(interaction.startWorld.y, world.y),\n right: Math.max(interaction.startWorld.x, world.x),\n bottom: Math.max(interaction.startWorld.y, world.y),\n };\n clearChildren(this.guidesLayer);\n this.guidesLayer.appendChild(\n svgEl('rect', {\n class: 'vd-flowchart-marquee',\n x: formatNumber(box.left),\n y: formatNumber(box.top),\n width: formatNumber(box.right - box.left),\n height: formatNumber(box.bottom - box.top),\n }),\n );\n const hits = this.getVisibleNodes()\n .filter(\n (node) =>\n node.x <= box.right &&\n node.x + node.width >= box.left &&\n node.y <= box.bottom &&\n node.y + node.height >= box.top,\n )\n .map((node) => node.id);\n const ids = [...new Set([...interaction.baseIds, ...hits])];\n const key = ids.join(',');\n if (key === interaction.lastKey) return;\n interaction.lastKey = key;\n this.selectNodes(ids, { primary: hits[hits.length - 1] });\n }\n\n renderGuides(guides) {\n clearChildren(this.guidesLayer);\n guides.forEach((guide) => {\n this.guidesLayer.appendChild(\n svgEl('line', {\n class: 'vd-flowchart-guide',\n x1: guide.x1,\n y1: guide.y1,\n x2: guide.x2,\n y2: guide.y2,\n }),\n );\n });\n }\n\n handlePointerMove(event) {\n if (!this.interaction || this.interaction.pointerId !== event.pointerId) return;\n\n if (this.interaction.kind === 'drag-node') {\n this.moveDraggedNodes(event);\n return;\n }\n\n if (this.interaction.kind === 'marquee') {\n this.updateMarquee(event);\n return;\n }\n\n if (this.interaction.kind === 'resize-node') {\n const node = this.findNode(this.interaction.nodeId);\n if (!node) return;\n const world = this.clientToWorld(event.clientX, event.clientY);\n const deltaX = world.x - this.interaction.startWorld.x;\n const deltaY = world.y - this.interaction.startWorld.y;\n const next = this.getResizedNodeBounds(\n this.interaction.original,\n this.interaction.handle,\n deltaX,\n deltaY,\n );\n\n if (\n next.x !== node.x ||\n next.y !== node.y ||\n next.width !== node.width ||\n next.height !== node.height\n ) {\n node.x = next.x;\n node.y = next.y;\n node.width = next.width;\n node.height = next.height;\n this.interaction.moved = true;\n this.render({ inspector: false, json: false });\n }\n return;\n }\n\n if (this.interaction.kind === 'pan') {\n const deltaX = event.clientX - this.interaction.startClientX;\n const deltaY = event.clientY - this.interaction.startClientY;\n this.documentData.viewport.x = formatNumber(this.interaction.startViewportX + deltaX);\n this.documentData.viewport.y = formatNumber(this.interaction.startViewportY + deltaY);\n this.interaction.moved = true;\n this.render({ inspector: false, json: false });\n return;\n }\n\n if (this.interaction.kind === 'connect') {\n if (!this.interaction.moved) {\n const travel = Math.hypot(\n event.clientX - this.interaction.startClientX,\n event.clientY - this.interaction.startClientY,\n );\n if (!(travel > PORT_CLICK_SLOP)) return;\n this.interaction.moved = true;\n }\n const world = this.clientToWorld(event.clientX, event.clientY);\n const snapTarget = this.findConnectionTarget(\n world,\n this.interaction.source.nodeId,\n this.interaction.previousSnap,\n this.interaction.fromPoint,\n );\n if (snapTarget) {\n this.interaction.target = { nodeId: snapTarget.node.id, port: snapTarget.port };\n this.interaction.toPoint = snapTarget.point;\n this.interaction.toPort = snapTarget.port;\n this.interaction.previousSnap = { nodeId: snapTarget.node.id, port: snapTarget.port };\n this.render({ inspector: false, json: false });\n return;\n }\n\n this.interaction.target = null;\n this.interaction.toPoint = world;\n this.interaction.toPort = this.interaction.toPort || 'left';\n this.interaction.previousSnap = null;\n this.render({ inspector: false, json: false });\n return;\n }\n\n if (this.interaction.kind === 'reconnect') {\n const edge = this.findEdge(this.interaction.edgeId);\n if (!edge) return;\n\n const world = this.clientToWorld(event.clientX, event.clientY);\n const snapTarget = this.findConnectionTarget(\n world,\n null,\n this.interaction.previousSnap,\n this.interaction.endpoint === 'from'\n ? this.interaction.toPoint\n : this.interaction.fromPoint,\n );\n\n if (this.interaction.endpoint === 'from') {\n const toNode = this.findNode(edge.to.nodeId);\n if (!toNode) return;\n this.interaction.toPoint = getPortPosition(toNode, edge.to.port);\n this.interaction.toPort = edge.to.port;\n if (snapTarget) {\n this.interaction.target = { nodeId: snapTarget.node.id, port: snapTarget.port };\n this.interaction.fromPoint = snapTarget.point;\n this.interaction.fromPort = snapTarget.port;\n this.interaction.previousSnap = { nodeId: snapTarget.node.id, port: snapTarget.port };\n } else {\n this.interaction.target = null;\n this.interaction.fromPoint = world;\n this.interaction.fromPort = this.interaction.fromPort || edge.from.port;\n this.interaction.previousSnap = null;\n }\n } else {\n const fromNode = this.findNode(edge.from.nodeId);\n if (!fromNode) return;\n this.interaction.fromPoint = getPortPosition(fromNode, edge.from.port);\n this.interaction.fromPort = edge.from.port;\n if (snapTarget) {\n this.interaction.target = { nodeId: snapTarget.node.id, port: snapTarget.port };\n this.interaction.toPoint = snapTarget.point;\n this.interaction.toPort = snapTarget.port;\n this.interaction.previousSnap = { nodeId: snapTarget.node.id, port: snapTarget.port };\n } else {\n this.interaction.target = null;\n this.interaction.toPoint = world;\n this.interaction.toPort = this.interaction.toPort || edge.to.port;\n this.interaction.previousSnap = null;\n }\n }\n\n this.render({ inspector: false, json: false });\n }\n }\n\n handlePointerUp(event) {\n if (\n !this.interaction ||\n (event.pointerId != null && this.interaction.pointerId !== event.pointerId)\n ) {\n return;\n }\n\n const interaction = this.interaction;\n this.interaction = null;\n this.releasePointerCapture(interaction.pointerId);\n this.syncConnectingState();\n\n if (interaction.kind === 'resize-node') {\n if (interaction.moved) {\n const node = this.findNode(interaction.nodeId);\n this.render({ inspector: true, json: true });\n this.emitChange('node:resize', { node: deepClone(node) });\n } else {\n this.render({ inspector: false, json: false });\n }\n return;\n }\n\n if (interaction.kind === 'marquee') {\n clearChildren(this.guidesLayer);\n return;\n }\n\n if (interaction.kind === 'drag-node') {\n clearChildren(this.guidesLayer);\n if (interaction.moved) {\n this.render({ inspector: true, json: true });\n if (interaction.nodeIds.length > 1) {\n this.emitChange('nodes:move', { nodeIds: [...interaction.nodeIds] });\n } else {\n this.emitChange('node:move', { node: deepClone(this.findNode(interaction.nodeId)) });\n }\n } else {\n this.render({ inspector: false, json: false });\n }\n return;\n }\n\n if (interaction.kind === 'pan') {\n if (interaction.moved) {\n this.render({ inspector: false, json: true });\n this.emitViewportChange('viewport:pan');\n } else {\n this.render({ inspector: false, json: false });\n }\n return;\n }\n\n if (interaction.kind === 'connect') {\n if (!interaction.moved && this.activeTool !== 'arrow') {\n this.render({ inspector: false, json: false });\n this.insertBranchNode(interaction.source.nodeId, {\n direction: PORT_DIRECTIONS[interaction.source.port],\n edit: true,\n });\n return;\n }\n const world = this.clientToWorld(event.clientX || 0, event.clientY || 0);\n const snapTarget = interaction.target\n ? { node: this.findNode(interaction.target.nodeId), port: interaction.target.port }\n : this.findConnectionTarget(\n world,\n interaction.source.nodeId,\n interaction.previousSnap,\n interaction.fromPoint,\n );\n if (snapTarget && snapTarget.node) {\n const edge = this.addEdge({\n from: interaction.source,\n to: {\n nodeId: snapTarget.node.id,\n port: snapTarget.port,\n },\n strokeWidth: interaction.strokeWidth,\n endMarker: 'arrow',\n });\n if (edge) {\n if (this.activeTool === 'arrow') this.setActiveTool(null);\n this.syncConnectingState();\n return;\n }\n }\n\n if (this.activeTool === 'arrow') this.setActiveTool(null);\n this.syncConnectingState();\n this.render({ inspector: false, json: false });\n return;\n }\n\n if (interaction.kind === 'reconnect') {\n const edge = this.findEdge(interaction.edgeId);\n if (edge && interaction.target) {\n const patch =\n interaction.endpoint === 'from'\n ? { from: { nodeId: interaction.target.nodeId, port: interaction.target.port } }\n : { to: { nodeId: interaction.target.nodeId, port: interaction.target.port } };\n const nextFrom = patch.from || edge.from;\n const nextTo = patch.to || edge.to;\n if (!(nextFrom.nodeId === nextTo.nodeId && nextFrom.port === nextTo.port)) {\n this.updateEdge(interaction.edgeId, patch, { inspector: true, reason: 'edge:reconnect' });\n } else {\n this.render({ inspector: false, json: false });\n }\n } else {\n this.render({ inspector: false, json: false });\n }\n this.reconnectEdgeId = interaction.edgeId;\n this.syncConnectingState();\n return;\n }\n }\n\n handleWheel(event) {\n event.preventDefault();\n const local = this.clientToLocal(event.clientX, event.clientY);\n const factor = event.deltaY > 0 ? 1 / 1.12 : 1.12;\n this.scaleAround(factor, local.x, local.y, 'viewport:zoom');\n }\n\n capturePointer(pointerId) {\n if (typeof this.canvasEl.setPointerCapture !== 'function') return;\n try {\n this.canvasEl.setPointerCapture(pointerId);\n } catch {\n /* ignore */\n }\n }\n\n releasePointerCapture(pointerId) {\n if (typeof this.canvasEl.releasePointerCapture !== 'function') return;\n try {\n this.canvasEl.releasePointerCapture(pointerId);\n } catch {\n /* ignore */\n }\n }\n\n syncConnectingState() {\n const connecting =\n this.interaction?.kind === 'connect' || this.interaction?.kind === 'reconnect';\n this.canvasEl.classList.toggle('is-connecting', connecting);\n }\n\n shouldShowNodePorts(node) {\n if (this.readonly) return false;\n if (this.interaction?.kind === 'connect' || this.interaction?.kind === 'reconnect') return true;\n if (this.activeTool === 'arrow') return true;\n return (\n this.selection?.kind === 'node' && this.selection.id === node.id && !this.hasMultiSelection()\n );\n }\n\n getMarkerId(markerType, position, strokeWidth, edgeScale = 1) {\n const width = normalizeEdgeStrokeWidth(strokeWidth);\n // Two decimals, not four: a resize drag changes the scale every frame, and\n // a four-decimal key would leave an orphan marker for each pointer move.\n const scale = clamp(formatNumber(Math.max(edgeScale, 0.01)), 0.01, 1);\n const key = `${markerType}:${position}:${width}:${scale}`;\n if (this.markerIds.has(key)) {\n return this.markerIds.get(key);\n }\n\n const markerId = nextId(`flowchart-${markerType}-${position}`);\n const marker =\n markerType === 'dot'\n ? createDotMarker(markerId, width, scale)\n : createArrowMarker(markerId, width, position === 'start', scale);\n this.markerDefs.appendChild(marker);\n this.markerIds.set(key, markerId);\n return markerId;\n }\n\n getEdgeStrokeWidth(edge) {\n return normalizeEdgeStrokeWidth(edge?.strokeWidth);\n }\n\n getEdgeHitStrokeWidth(edge, edgeScale = 1) {\n const visual = clamp(toFiniteNumber(edgeScale, 1), 0.01, 1);\n const base = this.getEdgeStrokeWidth(edge);\n const view = Math.max(this.documentData?.viewport?.scale || 1, 0.0001);\n const legacy = Math.max(EDGE_HIT_STROKE_MIN, base + 12);\n if (visual >= 0.999 && view >= DEFAULT_MIN_SCALE && view <= DEFAULT_MAX_SCALE) {\n return formatNumber(legacy);\n }\n return formatNumber(Math.max(base * visual, EDGE_HIT_STROKE_MIN / view));\n }\n\n findConnectionTarget(worldPoint, excludeNodeId, previousSnap = null, referencePoint = null) {\n const snapPadding = CONNECTION_SNAP_PADDING / this.documentData.viewport.scale;\n const hysteresisMargin = CONNECTION_HYSTERESIS / this.documentData.viewport.scale;\n\n const best = this.getVisibleNodes().reduce((candidate, node) => {\n if (node.id === excludeNodeId) return candidate;\n const distanceToBounds = getDistanceToNodeBounds(node, worldPoint);\n if (distanceToBounds > snapPadding) return candidate;\n const nearest = pickPortForNode(node, worldPoint, referencePoint);\n if (!nearest) return candidate;\n const score = distanceToBounds * 1000 + nearest.distance;\n if (!candidate || score < candidate.score) {\n return {\n node,\n port: nearest.port,\n point: nearest.point,\n score,\n };\n }\n return candidate;\n }, null);\n\n if (!previousSnap || !best) return best;\n\n const previousNode = this.findNode(previousSnap.nodeId);\n if (!previousNode || previousNode.id === excludeNodeId) return best;\n\n const distanceToBounds = getDistanceToNodeBounds(previousNode, worldPoint);\n if (distanceToBounds > snapPadding) return best;\n\n if (best.node.id === previousSnap.nodeId && best.port === previousSnap.port) {\n return best;\n }\n\n const previousPoint = getPortPosition(previousNode, previousSnap.port);\n const previousScore =\n distanceToBounds * 1000 +\n Math.hypot(worldPoint.x - previousPoint.x, worldPoint.y - previousPoint.y);\n if (best.score + hysteresisMargin >= previousScore) {\n return {\n node: previousNode,\n port: previousSnap.port,\n point: previousPoint,\n score: previousScore,\n };\n }\n\n return best;\n }\n\n getResizedNodeBounds(original, handle, deltaX, deltaY) {\n const nextType = original.type;\n if (!isNodeResizable(nextType)) {\n return {\n x: formatNumber(original.x),\n y: formatNumber(original.y),\n width: formatNumber(original.width),\n height: formatNumber(original.height),\n };\n }\n\n let x = original.x;\n let y = original.y;\n let width = original.width;\n let height = original.height;\n\n if (handle.includes('e')) {\n width = clampNodeWidth(\n nextType,\n original.width + deltaX,\n original.width,\n this.nodeSizeBounds(),\n );\n }\n if (handle.includes('s')) {\n height = clampNodeHeight(\n nextType,\n original.height + deltaY,\n original.height,\n this.nodeSizeBounds(),\n );\n }\n if (handle.includes('w')) {\n width = clampNodeWidth(\n nextType,\n original.width - deltaX,\n original.width,\n this.nodeSizeBounds(),\n );\n x = original.x + original.width - width;\n }\n if (handle.includes('n')) {\n height = clampNodeHeight(\n nextType,\n original.height - deltaY,\n original.height,\n this.nodeSizeBounds(),\n );\n y = original.y + original.height - height;\n }\n\n return {\n x: formatNumber(x),\n y: formatNumber(y),\n width: formatNumber(width),\n height: formatNumber(height),\n };\n }\n\n clientToLocal(clientX, clientY) {\n const rect = this.canvasEl.getBoundingClientRect();\n return {\n x: clientX - rect.left,\n y: clientY - rect.top,\n };\n }\n\n localToWorld(localX, localY) {\n const viewport = this.documentData.viewport;\n return {\n x: (localX - viewport.x) / viewport.scale,\n y: (localY - viewport.y) / viewport.scale,\n };\n }\n\n clientToWorld(clientX, clientY) {\n const local = this.clientToLocal(clientX, clientY);\n return this.localToWorld(local.x, local.y);\n }\n\n getViewportCenter() {\n const width = this.canvasEl.clientWidth || 800;\n const height = this.canvasEl.clientHeight || 560;\n return this.localToWorld(width / 2, height / 2);\n }\n\n scaleAround(factor, localX, localY, reason) {\n const viewport = this.documentData.viewport;\n const anchor = this.localToWorld(localX, localY);\n const nextScale = clamp(formatScale(viewport.scale * factor), this.minScale, this.maxScale);\n if (nextScale === viewport.scale) return;\n\n viewport.scale = nextScale;\n viewport.x = formatNumber(localX - anchor.x * nextScale);\n viewport.y = formatNumber(localY - anchor.y * nextScale);\n\n this.render({ inspector: false, json: true });\n this.emitViewportChange(reason);\n }\n\n updateToolbarLabel() {\n this.zoomLabel.textContent = `${Math.round(this.documentData.viewport.scale * 100)}%`;\n }\n\n // Options: `initialText` replaces the label with typed text (type-to-edit);\n // `inserted` marks a node created by a keyboard/handle insertion so naming it\n // shares the insertion's undo step.\n startTextEdit(nodeId, options = {}) {\n if (this.readonly) return false;\n const node = this.findNode(nodeId);\n if (!node || !isNodeTextEditable(node)) return false;\n\n if (this.textEditor?.nodeId === node.id) {\n this.positionTextEditor();\n this.textEditor.textarea.focus();\n this.textEditor.textarea.select();\n return true;\n }\n\n this.stopTextEdit({ commit: true });\n this.select({ kind: 'node', id: node.id });\n\n const replacing = typeof options.initialText === 'string';\n const textarea = createElement('textarea', {\n className: `vd-flowchart-text-editor vd-flowchart-text-editor--${node.type}`,\n value: replacing ? options.initialText : node.text,\n rows: 1,\n });\n textarea.setAttribute('data-node-id', node.id);\n textarea.setAttribute('aria-label', 'Edit node text');\n textarea.spellcheck = false;\n\n textarea.addEventListener('input', () => this.positionTextEditor());\n textarea.addEventListener('pointerdown', (event) => event.stopPropagation());\n textarea.addEventListener('dblclick', (event) => event.stopPropagation());\n textarea.addEventListener('keydown', (event) => this.handleTextEditorKeyDown(event, node));\n textarea.addEventListener('blur', () => {\n if (this.textEditor?.textarea === textarea) {\n this.stopTextEdit({ commit: true });\n }\n });\n\n this.textEditor = {\n nodeId: node.id,\n previousText: node.text,\n inserted: Boolean(options.inserted),\n textarea,\n };\n this.canvasEl.appendChild(textarea);\n this.render({ inspector: true, json: false });\n\n const focusEditor = () => {\n if (this.textEditor?.textarea !== textarea) return;\n textarea.focus();\n if (replacing) {\n textarea.setSelectionRange(textarea.value.length, textarea.value.length);\n } else {\n textarea.select();\n }\n };\n // Typed characters must land in the editor, so focus it synchronously;\n // the frame callback only restores focus if the browser moved it, so it\n // never re-selects text the user has already started typing.\n focusEditor();\n window.requestAnimationFrame(() => {\n if (document.activeElement !== textarea) focusEditor();\n });\n\n return true;\n }\n\n // Inline label editor for a connection, placed on the label anchor\n // (curve midpoint). Labels render on one line, so Enter always saves.\n startEdgeLabelEdit(edgeId, options = {}) {\n if (this.readonly) return false;\n const edge = this.findEdge(sanitizeId(edgeId));\n if (!edge) return false;\n this.stopTextEdit({ commit: true });\n this.select({ kind: 'edge', id: edge.id });\n\n const replacing = typeof options.initialText === 'string';\n const textarea = createElement('textarea', {\n className: 'vd-flowchart-text-editor vd-flowchart-text-editor--edge',\n value: replacing ? options.initialText : edge.label,\n rows: 1,\n });\n textarea.setAttribute('data-edge-id', edge.id);\n textarea.setAttribute('aria-label', 'Edit connection label');\n textarea.spellcheck = false;\n textarea.addEventListener('input', () => this.positionTextEditor());\n textarea.addEventListener('pointerdown', (event) => event.stopPropagation());\n textarea.addEventListener('dblclick', (event) => event.stopPropagation());\n textarea.addEventListener('keydown', (event) => {\n if (event.isComposing) return;\n if (event.key === 'Escape' || event.key === 'Enter') {\n event.preventDefault();\n this.stopTextEdit({ commit: event.key === 'Enter' });\n this.focusCanvas({ quiet: true });\n }\n });\n textarea.addEventListener('blur', () => {\n if (this.textEditor?.textarea === textarea) this.stopTextEdit({ commit: true });\n });\n\n this.textEditor = { nodeId: null, edgeId: edge.id, previousText: edge.label, textarea };\n this.canvasEl.appendChild(textarea);\n this.render({ inspector: true, json: false });\n\n const focusEditor = () => {\n if (this.textEditor?.textarea !== textarea) return;\n textarea.focus();\n if (replacing) textarea.setSelectionRange(textarea.value.length, textarea.value.length);\n else textarea.select();\n };\n focusEditor();\n window.requestAnimationFrame(() => {\n if (document.activeElement !== textarea) focusEditor();\n });\n return true;\n }\n\n handleTextEditorKeyDown(event, node) {\n if (event.isComposing) return;\n const mindmap = this.keyboardShortcuts === 'mindmap';\n if (event.key === 'Escape') {\n event.preventDefault();\n this.stopTextEdit({ commit: false });\n this.focusCanvas({ quiet: true });\n return;\n }\n if (event.key === 'Enter') {\n const modKey = event.ctrlKey || event.metaKey;\n const commits = modKey || (mindmap && node.type !== 'textbox' && !event.shiftKey);\n if (!commits) return;\n event.preventDefault();\n this.stopTextEdit({ commit: true });\n this.focusCanvas({ quiet: true });\n return;\n }\n if (event.key === 'Tab' && mindmap && !event.shiftKey && !event.altKey && !event.ctrlKey) {\n event.preventDefault();\n this.stopTextEdit({ commit: true });\n // Skip canvas focus \u2014 the new branch editor takes focus next.\n this.insertBranchNode(node.id, { edit: true });\n }\n }\n\n stopTextEdit(options = {}) {\n if (!this.textEditor) return false;\n const commit = options.commit !== false;\n const editor = this.textEditor;\n const nextText = editor.textarea.value;\n this.textEditor = null;\n editor.textarea.remove();\n\n if (editor.edgeId) {\n const label = nextText.replace(/\\s*\\n\\s*/g, ' ').trim();\n if (commit && !this.readonly && label !== editor.previousText) {\n this.updateEdge(editor.edgeId, { label }, { inspector: true, reason: 'edge:update' });\n } else {\n this.render({ scene: true, inspector: false, json: false });\n }\n return true;\n }\n\n if (commit && !this.readonly && nextText !== editor.previousText) {\n this.coalesceInsertedText = editor.inserted;\n try {\n this.updateNode(\n editor.nodeId,\n { text: nextText },\n { inspector: true, reason: 'node:update' },\n );\n } finally {\n this.coalesceInsertedText = false;\n }\n } else {\n this.render({ scene: true, inspector: false, json: false });\n }\n\n return true;\n }\n\n positionTextEditor() {\n if (!this.textEditor) return;\n if (this.textEditor.edgeId) {\n this.positionEdgeLabelEditor();\n return;\n }\n const node = this.findNode(this.textEditor.nodeId);\n if (!node) {\n this.stopTextEdit({ commit: false });\n return;\n }\n\n const viewport = this.documentData.viewport;\n const scale = viewport.scale;\n const visual = nodeVisualScale(node);\n const textarea = this.textEditor.textarea;\n const width = node.width * scale;\n const height = node.height * scale;\n const metrics = getNodeFontMetrics(node);\n const lineHeight = metrics.lineHeight * visual * scale;\n const lineCount = Math.max(1, textarea.value.split(/\\r?\\n/).length);\n const horizontalPadding = (node.type === 'textbox' ? 16 : 12) * visual * scale;\n const verticalPadding =\n node.type === 'textbox'\n ? 12 * visual * scale\n : Math.max(4 * visual, (height - lineCount * lineHeight) / 2);\n\n textarea.style.left = `${formatNumber(viewport.x + node.x * scale)}px`;\n textarea.style.top = `${formatNumber(viewport.y + node.y * scale)}px`;\n textarea.style.width = `${formatNumber(width)}px`;\n textarea.style.height = `${formatNumber(height)}px`;\n textarea.style.fontSize = `${formatNumber(metrics.fontSize * visual * scale)}px`;\n textarea.style.lineHeight = `${formatNumber(lineHeight)}px`;\n textarea.style.padding = `${formatNumber(verticalPadding)}px ${formatNumber(horizontalPadding)}px`;\n }\n\n positionEdgeLabelEditor() {\n const edge = this.findEdge(this.textEditor.edgeId);\n const fromNode = edge && this.findNode(edge.from.nodeId);\n const toNode = edge && this.findNode(edge.to.nodeId);\n if (!edge || !fromNode || !toNode) {\n this.stopTextEdit({ commit: false });\n return;\n }\n const visual = edgeVisualScale(fromNode, toNode);\n const { labelX, labelY } = buildEdgePath(edge, fromNode, toNode);\n const viewport = this.documentData.viewport;\n const textarea = this.textEditor.textarea;\n const fontSize = Math.max(11 * visual, 13 * visual * viewport.scale);\n const width = clamp(textarea.value.length * fontSize * 0.62 + 28 * visual, 96 * visual, 280);\n const height = fontSize * 1.4 + 12 * visual;\n const labelOffset = 8 * visual;\n textarea.style.left = `${formatNumber(viewport.x + labelX * viewport.scale - width / 2)}px`;\n textarea.style.top = `${formatNumber(viewport.y + (labelY - labelOffset) * viewport.scale - height / 2)}px`;\n textarea.style.width = `${formatNumber(width)}px`;\n textarea.style.height = `${formatNumber(height)}px`;\n textarea.style.fontSize = `${formatNumber(fontSize)}px`;\n textarea.style.lineHeight = `${formatNumber(fontSize * 1.4)}px`;\n textarea.style.padding = '6px 10px';\n }\n\n render(options = {}) {\n if (this.destroyed) return;\n this.syncGrid();\n\n const shouldRenderScene = options.scene !== false;\n const shouldRenderInspector = options.inspector !== false;\n const shouldRenderJson = options.json !== false;\n\n if (shouldRenderScene) this.renderScene();\n if (shouldRenderInspector) this.renderSelectionPanel();\n if (shouldRenderJson) this.syncJsonTextarea();\n if (shouldRenderInspector) this.renderGraphOutline();\n this.updateToolbarLabel();\n this.updatePaletteState();\n this.positionTextEditor();\n this.scheduleMinimap();\n }\n\n renderScene() {\n this.syncSelectedNodeIds();\n const viewport = this.documentData.viewport;\n this.world.setAttribute(\n 'transform',\n `matrix(${viewport.scale} 0 0 ${viewport.scale} ${viewport.x} ${viewport.y})`,\n );\n\n clearChildren(this.edgesLayer);\n clearChildren(this.previewLayer);\n clearChildren(this.nodesLayer);\n clearChildren(this.overlayLayer);\n clearChildren(this.markerDefs);\n this.markerIds = new Map();\n\n const hidden = this.getHiddenNodeIds();\n this.sceneHidden = hidden;\n this.sceneOutgoing = this.getOutgoingMap();\n const nodeMap = new Map(\n this.documentData.nodes.filter((node) => !hidden.has(node.id)).map((node) => [node.id, node]),\n );\n this.sceneNodeMap = nodeMap;\n this.nodeElements = new Map();\n this.edgeElements = new Map();\n this.incidentEdges = new Map();\n\n this.documentData.edges.forEach((edge) => {\n const edgeElement = this.renderEdge(edge, nodeMap);\n if (edgeElement) {\n this.edgesLayer.appendChild(edgeElement);\n this.edgeElements.set(edge.id, edgeElement);\n for (const id of new Set([edge.from.nodeId, edge.to.nodeId])) {\n if (!this.incidentEdges.has(id)) this.incidentEdges.set(id, []);\n this.incidentEdges.get(id).push(edge);\n }\n }\n });\n\n if (this.interaction?.kind === 'connect' || this.interaction?.kind === 'reconnect') {\n this.previewLayer.appendChild(this.renderPreviewEdge(this.interaction));\n }\n\n this.documentData.nodes.forEach((node) => {\n if (hidden.has(node.id)) return;\n const element = this.renderNode(node);\n this.nodesLayer.appendChild(element);\n this.nodeElements.set(node.id, element);\n });\n\n if (this.reconnectEdgeId && !this.readonly) {\n const reconnectEdge = this.findEdge(this.reconnectEdgeId);\n if (reconnectEdge) {\n const fromNode = nodeMap.get(reconnectEdge.from.nodeId);\n const toNode = nodeMap.get(reconnectEdge.to.nodeId);\n if (fromNode && toNode) {\n this.overlayLayer.appendChild(\n this.renderReconnectEndpoints(reconnectEdge, fromNode, toNode),\n );\n }\n }\n }\n\n this.syncConnectingState();\n }\n\n // Drag frames change one translation and its connected paths. Keep unrelated\n // SVG elements intact; the release event still refreshes inspector/history.\n renderDraggedNode(node) {\n const element = this.nodeElements?.get(node.id);\n if (!element) {\n this.render({ inspector: false, json: false });\n return;\n }\n element.setAttribute('transform', `translate(${formatNumber(node.x)} ${formatNumber(node.y)})`);\n element.classList.add('is-dragging');\n for (const edge of this.incidentEdges.get(node.id) || []) {\n const previous = this.edgeElements.get(edge.id);\n const next = this.renderEdge(edge, this.sceneNodeMap);\n if (previous && next) {\n previous.replaceWith(next);\n this.edgeElements.set(edge.id, next);\n }\n }\n }\n\n applyEdgeMarkers(pathElement, edge, edgeScale = 1) {\n const width = this.getEdgeStrokeWidth(edge);\n if (edge.startMarker && edge.startMarker !== 'none') {\n pathElement.setAttribute(\n 'marker-start',\n `url(#${this.getMarkerId(edge.startMarker, 'start', width, edgeScale)})`,\n );\n }\n if (edge.endMarker && edge.endMarker !== 'none') {\n pathElement.setAttribute(\n 'marker-end',\n `url(#${this.getMarkerId(edge.endMarker, 'end', width, edgeScale)})`,\n );\n }\n }\n\n renderEdge(edge, nodeMap) {\n const fromNode = nodeMap.get(edge.from.nodeId);\n const toNode = nodeMap.get(edge.to.nodeId);\n if (!fromNode || !toNode) return null;\n\n const visual = edgeVisualScale(fromNode, toNode);\n const edgePath = buildEdgePath(edge, fromNode, toNode);\n const selected = this.selection?.kind === 'edge' && this.selection.id === edge.id;\n const inReconnectMode = this.reconnectEdgeId === edge.id;\n\n const group = svgEl('g', {\n class: `vd-flowchart-edge${selected ? ' is-selected' : ''}${inReconnectMode ? ' is-reconnecting' : ''}`,\n 'data-edge-id': edge.id,\n });\n const baseStroke = this.getEdgeStrokeWidth(edge);\n const strokeWidth =\n visual < 0.999 ? formatNumber(Math.max(0.02, baseStroke * visual)) : baseStroke;\n\n if (selected) {\n group.appendChild(\n svgEl('path', {\n class: 'vd-flowchart-edge-selection',\n d: edgePath.d,\n 'stroke-width':\n visual < 0.999\n ? formatNumber((baseStroke + 7) * visual)\n : formatNumber(strokeWidth + 7),\n }),\n );\n }\n\n const visiblePath = svgEl('path', {\n class: 'vd-flowchart-edge-path',\n d: edgePath.d,\n 'stroke-width': strokeWidth,\n 'data-edge-id': edge.id,\n });\n this.applyEdgeMarkers(visiblePath, edge, visual);\n\n const hitPath = svgEl('path', {\n class: 'vd-flowchart-edge-hit',\n d: edgePath.d,\n 'stroke-width': this.getEdgeHitStrokeWidth(edge, visual),\n 'data-edge-id': edge.id,\n });\n\n group.appendChild(visiblePath);\n group.appendChild(hitPath);\n\n if (edge.label && this.textEditor?.edgeId !== edge.id) {\n const labelOffset = visual < 0.999 ? formatNumber(8 * visual) : 8;\n const label = svgEl('text', {\n class: 'vd-flowchart-edge-label',\n x: edgePath.labelX,\n y: edgePath.labelY - labelOffset,\n 'text-anchor': 'middle',\n 'data-edge-id': edge.id,\n });\n if (visual < 0.999) {\n label.style.fontSize = `${formatNumber(Math.max(0.06, 12 * visual))}px`;\n label.style.strokeWidth = `${formatNumber(Math.max(0.03, 5 * visual))}px`;\n }\n label.textContent = edge.label;\n group.appendChild(label);\n }\n\n return group;\n }\n\n renderReconnectEndpoints(edge, fromNode, toNode) {\n const scale = this.documentData.viewport.scale || 1;\n const group = svgEl('g', { class: 'vd-flowchart-edge-endpoints' });\n [\n { endpoint: 'from', point: getPortPosition(fromNode, edge.from.port) },\n { endpoint: 'to', point: getPortPosition(toNode, edge.to.port) },\n ].forEach(({ endpoint, point }) => {\n group.appendChild(\n svgEl('circle', {\n class: 'vd-flowchart-edge-endpoint-hit',\n cx: point.x,\n cy: point.y,\n r: RECONNECT_ENDPOINT_HIT_RADIUS / scale,\n 'data-edge-id': edge.id,\n 'data-edge-endpoint': endpoint,\n }),\n );\n group.appendChild(\n svgEl('circle', {\n class: 'vd-flowchart-edge-endpoint',\n cx: point.x,\n cy: point.y,\n r: RECONNECT_ENDPOINT_RADIUS / scale,\n 'data-edge-id': edge.id,\n 'data-edge-endpoint': endpoint,\n }),\n );\n });\n return group;\n }\n\n renderPreviewEdge(interaction) {\n const fromPort = interaction.fromPort || interaction.source?.port || 'right';\n const toPort = interaction.toPort || interaction.target?.port || 'left';\n const fromNode = interaction.source?.nodeId ? this.findNode(interaction.source.nodeId) : null;\n const toNode = interaction.target?.nodeId ? this.findNode(interaction.target.nodeId) : null;\n const visual = edgeVisualScale(fromNode, toNode);\n const edgePath = buildEdgePath(\n {\n strokeWidth: interaction.strokeWidth,\n route: interaction.route,\n fromPoint: interaction.fromPoint,\n toPoint: interaction.toPoint,\n from: { port: fromPort },\n to: { port: toPort },\n },\n fromNode,\n toNode,\n );\n const baseStroke = this.getEdgeStrokeWidth(interaction);\n return svgEl('path', {\n class: 'vd-flowchart-preview-path',\n d: edgePath.d,\n 'stroke-width':\n visual < 0.999 ? formatNumber(Math.max(0.02, baseStroke * visual)) : baseStroke,\n });\n }\n\n renderNode(node) {\n const selected = this.isNodeSelected(node.id);\n // Frames and handles describe one node; a group shows only the outline.\n const soloSelected = selected && !this.hasMultiSelection();\n const dragging =\n this.interaction?.kind === 'drag-node' && this.interaction.nodeIds.includes(node.id);\n const resizing =\n this.interaction?.kind === 'resize-node' && this.interaction.nodeId === node.id;\n const editing = this.textEditor?.nodeId === node.id;\n const group = svgEl('g', {\n class: `vd-flowchart-node${selected ? ' is-selected' : ''}${dragging ? ' is-dragging' : ''}${resizing ? ' is-resizing' : ''}${editing ? ' is-editing' : ''}`,\n transform: `translate(${formatNumber(node.x)} ${formatNumber(node.y)})`,\n 'data-node-id': node.id,\n });\n const portsVisible = this.shouldShowNodePorts(node);\n\n const visual = nodeVisualScale(node);\n const corner =\n node.type === 'rounded-rect' || node.type === 'textbox'\n ? 16\n : node.type === 'junction'\n ? node.width / 2\n : 6;\n const hitbox = svgEl('rect', {\n x: 0,\n y: 0,\n width: node.width,\n height: node.height,\n rx: visual < 0.999 && node.type !== 'junction' ? formatNumber(corner * visual) : corner,\n fill: 'transparent',\n 'data-node-id': node.id,\n });\n group.appendChild(hitbox);\n const shape = this.renderNodeShape(node);\n this.applyScaledNodeShape(node, shape);\n group.appendChild(shape);\n group.appendChild(this.renderNodeText(node));\n\n const scale = this.documentData.viewport.scale || 1;\n if (soloSelected && !this.readonly && SELECTION_BOX_TYPES.has(node.type)) {\n const outset = SELECTION_OUTSET / scale;\n group.appendChild(\n svgEl('rect', {\n class: 'vd-flowchart-selection-box',\n x: -outset,\n y: -outset,\n width: node.width + outset * 2,\n height: node.height + outset * 2,\n }),\n );\n }\n\n if (soloSelected && !this.readonly && isNodeResizable(node)) {\n group.appendChild(this.renderResizeControls(node));\n }\n\n const collapseToggle = this.renderCollapseToggle(node, soloSelected);\n if (this.readonly) {\n if (collapseToggle) group.appendChild(collapseToggle);\n return group;\n }\n\n FLOWCHART_PORTS.forEach((port) => {\n const position = getPortHandlePosition({ ...node, x: 0, y: 0 }, port, scale);\n const portGroup = svgEl('g', {\n class: `vd-flowchart-port-group${portsVisible ? ' is-visible' : ''}`,\n 'data-node-id': node.id,\n 'data-port': port,\n });\n portGroup.appendChild(\n svgEl('circle', {\n class: 'vd-flowchart-port-hit',\n cx: position.x,\n cy: position.y,\n r: CONNECTION_PORT_HIT_RADIUS / scale,\n }),\n );\n portGroup.appendChild(\n svgEl('circle', {\n class: 'vd-flowchart-port',\n cx: position.x,\n cy: position.y,\n r: CONNECTION_PORT_RADIUS / scale,\n }),\n );\n const arm = (CONNECTION_PORT_RADIUS - 2.5) / scale;\n portGroup.appendChild(\n svgEl('path', {\n class: 'vd-flowchart-port-plus',\n d: `M ${formatNumber(position.x - arm)} ${formatNumber(position.y)} H ${formatNumber(position.x + arm)} M ${formatNumber(position.x)} ${formatNumber(position.y - arm)} V ${formatNumber(position.y + arm)}`,\n }),\n );\n group.appendChild(portGroup);\n });\n if (collapseToggle) group.appendChild(collapseToggle);\n\n return group;\n }\n\n // \"+N\" on a collapsed node, or \"\u2212\" on a single selected node with children,\n // placed beyond the connection handle on the side its branch leaves from.\n renderCollapseToggle(node, soloSelected) {\n const outgoing = this.sceneOutgoing || this.getOutgoingMap();\n const childIds = (outgoing.get(node.id) || []).filter((id) => id !== node.id);\n if (!childIds.length) return null;\n const count = node.collapsed\n ? this.countCollapsedDescendants(\n node.id,\n this.sceneHidden || this.getHiddenNodeIds(),\n outgoing,\n )\n : 0;\n if (!node.collapsed && !(soloSelected && !this.readonly)) return null;\n\n const sides = new Map();\n this.documentData.edges.forEach((edge) => {\n if (edge.from.nodeId !== node.id || edge.to.nodeId === node.id) return;\n sides.set(edge.from.port, (sides.get(edge.from.port) || 0) + 1);\n });\n const port =\n [...sides].sort((a, b) => b[1] - a[1])[0]?.[0] ||\n DIRECTION_PORTS[this.getGrowthDirection(node)];\n const scale = this.documentData.viewport.scale || 1;\n const anchor = getPortPosition({ ...node, x: 0, y: 0 }, port);\n const normal = getPortNormal(port);\n const offset = COLLAPSE_TOGGLE_OFFSET / scale;\n const cx = formatNumber(anchor.x + normal.x * offset);\n const cy = formatNumber(anchor.y + normal.y * offset);\n const label = node.collapsed ? `+${count}` : '\u2212';\n const radius = (node.collapsed && label.length > 2 ? 12 : 9) / scale;\n\n const group = svgEl('g', {\n class: `vd-flowchart-collapse-toggle${node.collapsed ? ' is-collapsed' : ''}`,\n 'data-collapse-toggle': node.id,\n });\n const title = svgEl('title');\n title.textContent = node.collapsed ? `Expand ${count} hidden nodes` : 'Collapse branch';\n group.appendChild(title);\n group.appendChild(svgEl('circle', { cx, cy, r: formatNumber(radius) }));\n const text = svgEl('text', {\n x: cx,\n y: cy,\n 'font-size': formatNumber(10 / scale),\n 'text-anchor': 'middle',\n 'dominant-baseline': 'central',\n });\n text.textContent = label;\n group.appendChild(text);\n return group;\n }\n\n renderResizeControls(node) {\n const scale = this.documentData.viewport.scale || 1;\n const zone = 14 / scale;\n const cornerZone = 22 / scale;\n const handleSize = RESIZE_HANDLE_SIZE / scale;\n const gap = RESIZE_PORT_GAP / scale;\n const group = svgEl('g', { class: 'vd-flowchart-resize-controls' });\n\n const zones = {\n n: { x: 0, y: -zone / 2, width: node.width, height: zone },\n e: { x: node.width - zone / 2, y: 0, width: zone, height: node.height },\n s: { x: 0, y: node.height - zone / 2, width: node.width, height: zone },\n w: { x: -zone / 2, y: 0, width: zone, height: node.height },\n ne: {\n x: node.width - cornerZone / 2,\n y: -cornerZone / 2,\n width: cornerZone,\n height: cornerZone,\n },\n se: {\n x: node.width - cornerZone / 2,\n y: node.height - cornerZone / 2,\n width: cornerZone,\n height: cornerZone,\n },\n sw: {\n x: -cornerZone / 2,\n y: node.height - cornerZone / 2,\n width: cornerZone,\n height: cornerZone,\n },\n nw: { x: -cornerZone / 2, y: -cornerZone / 2, width: cornerZone, height: cornerZone },\n };\n\n RESIZE_HANDLES.forEach((handle) => {\n const zoneRect = zones[handle];\n const cursor = getResizeCursor(handle);\n const zoneSegments = [];\n if (handle === 'e' || handle === 'w') {\n const upperHeight = Math.max(0, node.height / 2 - gap / 2);\n const lowerY = node.height / 2 + gap / 2;\n const lowerHeight = Math.max(0, node.height - lowerY);\n zoneSegments.push(\n { x: zoneRect.x, y: zoneRect.y, width: zoneRect.width, height: upperHeight },\n { x: zoneRect.x, y: lowerY, width: zoneRect.width, height: lowerHeight },\n );\n } else if (handle === 'n' || handle === 's') {\n const leftWidth = Math.max(0, node.width / 2 - gap / 2);\n const rightX = node.width / 2 + gap / 2;\n const rightWidth = Math.max(0, node.width - rightX);\n zoneSegments.push(\n { x: zoneRect.x, y: zoneRect.y, width: leftWidth, height: zoneRect.height },\n { x: rightX, y: zoneRect.y, width: rightWidth, height: zoneRect.height },\n );\n } else {\n zoneSegments.push(zoneRect);\n }\n zoneSegments\n .filter((segment) => segment.width > 0 && segment.height > 0)\n .forEach((segment) => {\n const hit = svgEl('rect', {\n class: 'vd-flowchart-resize-zone',\n x: segment.x,\n y: segment.y,\n width: segment.width,\n height: segment.height,\n 'data-node-id': node.id,\n 'data-resize-handle': handle,\n style: `cursor: ${cursor}`,\n });\n group.appendChild(hit);\n });\n // Sides resize through the invisible strips only; a visible dot there\n // would sit on the same axis as the connection handle.\n if (handle.length === 1) return;\n const position = getResizeHandlePosition(node, handle);\n const outset = SELECTION_OUTSET / scale;\n position.x += handle.includes('e') ? outset : -outset;\n position.y += handle.includes('s') ? outset : -outset;\n const dot = svgEl('rect', {\n class: 'vd-flowchart-resize-handle',\n x: position.x - handleSize / 2,\n y: position.y - handleSize / 2,\n width: handleSize,\n height: handleSize,\n rx: handleSize / 5,\n ry: handleSize / 5,\n 'data-node-id': node.id,\n 'data-resize-handle': handle,\n style: `cursor: ${cursor}`,\n });\n group.appendChild(dot);\n });\n\n return group;\n }\n\n applyScaledNodeShape(node, shape) {\n const visual = nodeVisualScale(node);\n if (!shape || visual >= 0.999) return;\n const baseStroke = node.type === 'junction' ? 1.25 : 1.5;\n shape.style.strokeWidth = String(formatNumber(Math.max(0.03, baseStroke * visual)));\n if (node.type === 'textbox') {\n shape.style.strokeDasharray = `${formatNumber(8 * visual)} ${formatNumber(5 * visual)}`;\n }\n const baseRadius =\n node.type === 'rounded-rect'\n ? 18\n : node.type === 'textbox'\n ? 14\n : node.type === 'rect'\n ? 2\n : 0;\n if (baseRadius > 0) {\n const scaled = String(formatNumber(baseRadius * visual));\n shape.setAttribute('rx', scaled);\n shape.setAttribute('ry', scaled);\n }\n }\n\n renderNodeShape(node) {\n const baseClass = `vd-flowchart-node-shape vd-flowchart-node-shape--${node.type}`;\n\n if (node.type === 'rounded-rect') {\n return svgEl('rect', {\n class: baseClass,\n x: 0,\n y: 0,\n width: node.width,\n height: node.height,\n rx: 18,\n ry: 18,\n });\n }\n\n if (node.type === 'rect') {\n return svgEl('rect', {\n class: baseClass,\n x: 0,\n y: 0,\n width: node.width,\n height: node.height,\n rx: 2,\n ry: 2,\n });\n }\n\n if (node.type === 'diamond') {\n return svgEl('polygon', {\n class: baseClass,\n points: `${node.width / 2},0 ${node.width},${node.height / 2} ${node.width / 2},${node.height} 0,${node.height / 2}`,\n });\n }\n\n if (node.type === 'circle') {\n return svgEl('ellipse', {\n class: baseClass,\n cx: node.width / 2,\n cy: node.height / 2,\n rx: node.width / 2,\n ry: node.height / 2,\n });\n }\n\n if (node.type === 'junction') {\n return svgEl('circle', {\n class: baseClass,\n cx: node.width / 2,\n cy: node.height / 2,\n r: Math.min(node.width, node.height) / 2,\n });\n }\n\n if (node.type === 'textbox') {\n return svgEl('rect', {\n class: baseClass,\n x: 0,\n y: 0,\n width: node.width,\n height: node.height,\n rx: 14,\n ry: 14,\n });\n }\n\n return svgEl('rect', {\n class: baseClass,\n x: 0,\n y: 0,\n width: node.width,\n height: node.height,\n rx: 0,\n ry: 0,\n });\n }\n\n renderNodeText(node) {\n const textElement = svgEl('text', {\n class: `vd-flowchart-node-text vd-flowchart-node-text--${node.type}`,\n 'data-node-id': node.id,\n });\n\n if (node.type === 'junction' || !node.text) {\n return textElement;\n }\n\n const visual = nodeVisualScale(node);\n const metrics = getNodeFontMetrics(node);\n const lineHeight =\n visual < 0.999 ? Math.max(0.06, metrics.lineHeight * visual) : metrics.lineHeight;\n if (visual < 0.999) {\n textElement.style.fontSize = `${formatNumber(Math.max(0.05, metrics.fontSize * visual))}px`;\n }\n const equivalentWidth = visual < 0.999 ? node.width / visual : node.width;\n\n if (node.type === 'textbox') {\n const lines = wrapText(node.text, estimateChars(equivalentWidth - 32));\n const padX = visual < 0.999 ? formatNumber(16 * visual) : 16;\n const startY = visual < 0.999 ? formatNumber(28 * visual) : 28;\n lines.forEach((line, index) => {\n const span = svgEl('tspan', {\n x: padX,\n y:\n visual < 0.999\n ? formatNumber(startY + index * lineHeight)\n : startY + index * lineHeight,\n });\n span.textContent = line;\n textElement.appendChild(span);\n });\n return textElement;\n }\n\n const lines = wrapText(node.text, estimateChars(equivalentWidth));\n const totalHeight = (lines.length - 1) * lineHeight;\n const startY = node.height / 2 - totalHeight / 2;\n textElement.setAttribute('text-anchor', 'middle');\n textElement.setAttribute('dominant-baseline', 'middle');\n lines.forEach((line, index) => {\n const span = svgEl('tspan', {\n x: node.width / 2,\n y: visual < 0.999 ? formatNumber(startY + index * lineHeight) : startY + index * lineHeight,\n 'text-anchor': 'middle',\n 'dominant-baseline': 'middle',\n });\n span.textContent = line;\n textElement.appendChild(span);\n });\n\n return textElement;\n }\n\n renderSelectionPanel() {\n clearChildren(this.selectionFields);\n this.deleteButton.disabled = this.readonly || !this.selection;\n\n if (!this.selection) {\n this.selectionMeta.textContent = 'Nothing selected';\n this.selectionFields.appendChild(\n createElement('p', {\n className: 'vd-flowchart-selection-empty',\n text: 'Select a node or edge to edit it.',\n }),\n );\n return;\n }\n\n if (this.hasMultiSelection()) {\n this.selectionMeta.textContent = `${this.selectedNodeIds.size} nodes selected`;\n this.selectionFields.appendChild(\n createElement('p', {\n className: 'vd-flowchart-selection-empty',\n text: 'Drag, nudge with Alt+Arrow, copy, duplicate, or delete them together.',\n }),\n );\n return;\n }\n\n if (this.selection.kind === 'node') {\n const node = this.findNode(this.selection.id);\n if (!node) {\n this.selection = null;\n this.renderSelectionPanel();\n return;\n }\n\n this.selectionMeta.textContent = `Node ${node.id} \u00B7 ${node.type} \u00B7 ${Math.round(node.x)}, ${Math.round(node.y)}`;\n const typeSelect = createElement('select');\n typeSelect.setAttribute('data-field', 'node-type');\n FLOWCHART_NODE_TYPES.forEach((type) => {\n const option = createElement('option', { value: type, text: type.replace('-', ' ') });\n option.value = type;\n option.selected = type === node.type;\n typeSelect.appendChild(option);\n });\n\n const textArea = createElement('textarea', { value: node.text, rows: 5 });\n textArea.setAttribute('data-field', 'node-text');\n\n const widthInput = createElement('input', { value: node.width, type: 'number' });\n widthInput.setAttribute('data-field', 'node-width');\n widthInput.setAttribute('min', String(this.minNodeSize));\n widthInput.setAttribute('max', String(this.maxNodeSize));\n\n const heightInput = createElement('input', { value: node.height, type: 'number' });\n heightInput.setAttribute('data-field', 'node-height');\n heightInput.setAttribute('min', String(this.minNodeSize));\n heightInput.setAttribute('max', String(this.maxNodeSize));\n\n this.selectionFields.appendChild(createField('Type', typeSelect));\n if (isNodeTextEditable(node)) {\n this.selectionFields.appendChild(createField('Text', textArea));\n }\n\n if (isNodeResizable(node)) {\n const sizeGrid = createElement('div', { className: 'vd-flowchart-field-grid' });\n sizeGrid.appendChild(createField('Width', widthInput));\n sizeGrid.appendChild(createField('Height', heightInput));\n this.selectionFields.appendChild(sizeGrid);\n } else {\n this.selectionFields.appendChild(\n createElement('p', {\n className: 'vd-flowchart-selection-empty',\n text: 'Junctions stay fixed-size and do not carry inline text.',\n }),\n );\n }\n return;\n }\n\n const edge = this.findEdge(this.selection.id);\n if (!edge) {\n this.selection = null;\n this.renderSelectionPanel();\n return;\n }\n\n this.selectionMeta.textContent = `Edge ${edge.id} \u00B7 ${edge.route} \u00B7 ${formatNumber(edge.strokeWidth)}px \u00B7 ${edge.startMarker} \u2192 ${edge.endMarker}`;\n\n const routeSelect = createElement('select');\n routeSelect.setAttribute('data-field', 'edge-route');\n FLOWCHART_EDGE_ROUTES.forEach((route) => {\n const option = createElement('option', {\n value: route,\n text: FLOWCHART_EDGE_ROUTE_LABELS[route],\n });\n option.value = route;\n option.selected = route === edge.route;\n routeSelect.appendChild(option);\n });\n\n const startSelect = createElement('select');\n startSelect.setAttribute('data-field', 'edge-start-marker');\n FLOWCHART_EDGE_MARKERS.forEach((marker) => {\n const option = createElement('option', { value: marker, text: marker });\n option.value = marker;\n option.selected = marker === edge.startMarker;\n startSelect.appendChild(option);\n });\n\n const endSelect = createElement('select');\n endSelect.setAttribute('data-field', 'edge-end-marker');\n FLOWCHART_EDGE_MARKERS.forEach((marker) => {\n const option = createElement('option', { value: marker, text: marker });\n option.value = marker;\n option.selected = marker === edge.endMarker;\n endSelect.appendChild(option);\n });\n\n const widthSelect = createElement('select');\n widthSelect.setAttribute('data-field', 'edge-stroke-preset');\n EDGE_STROKE_PRESETS.forEach((preset) => {\n const option = createElement('option', { value: preset.id, text: preset.label });\n option.value = preset.id;\n option.selected = preset.id === getStrokePresetId(edge.strokeWidth);\n widthSelect.appendChild(option);\n });\n\n const labelInput = createElement('textarea', { value: edge.label, rows: 4 });\n labelInput.setAttribute('data-field', 'edge-label');\n\n const markerGrid = createElement('div', { className: 'vd-flowchart-field-grid' });\n markerGrid.appendChild(createField('Route', routeSelect));\n markerGrid.appendChild(createField('Weight', widthSelect));\n markerGrid.appendChild(createField('Start', startSelect));\n markerGrid.appendChild(createField('End', endSelect));\n this.selectionFields.appendChild(markerGrid);\n this.selectionFields.appendChild(createField('Label', labelInput));\n }\n\n syncJsonTextarea(force = false) {\n if (!force && document.activeElement === this.jsonTextarea) {\n return;\n }\n this.jsonTextarea.value = JSON.stringify(this.toJSON(), null, 2);\n }\n\n getSelectionSnapshot() {\n if (!this.selection) return null;\n if (this.selection.kind === 'node') {\n const node = this.findNode(this.selection.id);\n return node ? { kind: 'node', id: node.id, node: deepClone(node) } : null;\n }\n const edge = this.findEdge(this.selection.id);\n return edge ? { kind: 'edge', id: edge.id, edge: deepClone(edge) } : null;\n }\n\n select(selection) {\n const next =\n selection && selection.id && selection.kind\n ? { kind: selection.kind, id: selection.id }\n : null;\n this.applySelection(next, next?.kind === 'node' ? [next.id] : []);\n }\n\n // Single funnel for selection changes: `selection` is the primary item and\n // `selectedNodeIds` every selected node (the primary one included).\n applySelection(primary, nodeIds) {\n const previousKey = this.getSelectionKey();\n this.selection = primary;\n this.selectedNodeIds = new Set(nodeIds);\n if (primary?.kind === 'node') this.selectedNodeIds.add(primary.id);\n if (previousKey !== this.getSelectionKey()) {\n this.edgeCycleAnchor = null;\n this.render({ scene: true, inspector: true, json: false });\n this.emit('select', {\n selection: this.getSelectionSnapshot(),\n nodeIds: this.getSelectedNodeIds(),\n });\n return;\n }\n\n this.render({ scene: true, inspector: false, json: false });\n }\n\n getSelectionKey() {\n const primary = this.selection ? `${this.selection.kind}:${this.selection.id}` : '';\n return `${primary}|${[...(this.selectedNodeIds || [])].sort().join(',')}`;\n }\n\n // Keep the set valid after mutations that bypass applySelection (undo,\n // load, removal): drop missing nodes and keep the primary node in the set.\n syncSelectedNodeIds() {\n if (this.selection?.kind !== 'node') {\n this.selectedNodeIds = new Set();\n return;\n }\n const existing = new Set(this.documentData.nodes.map((node) => node.id));\n const hidden = this.getHiddenNodeIds();\n this.selectedNodeIds = new Set(\n [...(this.selectedNodeIds || [])].filter((id) => existing.has(id) && !hidden.has(id)),\n );\n this.selectedNodeIds.add(this.selection.id);\n }\n\n getSelectedNodeIds() {\n return [...(this.selectedNodeIds || [])];\n }\n\n isNodeSelected(nodeId) {\n return Boolean(this.selectedNodeIds?.has(nodeId));\n }\n\n hasMultiSelection() {\n return (this.selectedNodeIds?.size || 0) > 1;\n }\n\n /** Select several nodes; `primary` (default: the last id) drives single-node UI. */\n selectNodes(nodeIds, options = {}) {\n const existing = new Set(this.documentData.nodes.map((node) => node.id));\n const ids = [...new Set((nodeIds || []).map(sanitizeId))].filter((id) => existing.has(id));\n const primaryId = ids.includes(options.primary) ? options.primary : ids[ids.length - 1];\n this.applySelection(primaryId ? { kind: 'node', id: primaryId } : null, ids);\n return this;\n }\n\n toggleNodeSelection(nodeId) {\n const ids = this.selection?.kind === 'node' ? this.getSelectedNodeIds() : [];\n if (ids.includes(nodeId)) {\n const rest = ids.filter((id) => id !== nodeId);\n return this.selectNodes(rest, { primary: rest[rest.length - 1] });\n }\n return this.selectNodes([...ids, nodeId], { primary: nodeId });\n }\n\n selectNode(nodeId) {\n this.select({ kind: 'node', id: sanitizeId(nodeId) });\n return this;\n }\n\n selectEdge(edgeId) {\n this.select({ kind: 'edge', id: sanitizeId(edgeId) });\n return this;\n }\n\n deselect() {\n this.select(null);\n return this;\n }\n\n resolvePreservedSelection(previousSelection, preserve) {\n if (!preserve || !previousSelection) return null;\n const exists =\n previousSelection.kind === 'node'\n ? Boolean(this.findNode(previousSelection.id))\n : Boolean(this.findEdge(previousSelection.id));\n return exists ? { kind: previousSelection.kind, id: previousSelection.id } : null;\n }\n\n findNode(nodeId) {\n return this.documentData.nodes.find((node) => node.id === nodeId) || null;\n }\n\n getHiddenNodeIds() {\n return computeHiddenNodeIds(this.documentData.nodes, this.documentData.edges);\n }\n\n getVisibleNodes() {\n const hidden = this.getHiddenNodeIds();\n return hidden.size\n ? this.documentData.nodes.filter((node) => !hidden.has(node.id))\n : this.documentData.nodes;\n }\n\n isNodeHidden(nodeId) {\n return this.getHiddenNodeIds().has(nodeId);\n }\n\n getOutgoingMap() {\n const outgoing = new Map();\n this.documentData.edges.forEach((edge) => {\n if (!outgoing.has(edge.from.nodeId)) outgoing.set(edge.from.nodeId, []);\n outgoing.get(edge.from.nodeId).push(edge.to.nodeId);\n });\n return outgoing;\n }\n\n // Hidden nodes under one collapsed node (its \"+N\" count).\n countCollapsedDescendants(\n nodeId,\n hidden = this.getHiddenNodeIds(),\n outgoing = this.getOutgoingMap(),\n ) {\n const seen = new Set();\n const queue = [nodeId];\n for (let index = 0; index < queue.length; index += 1) {\n (outgoing.get(queue[index]) || []).forEach((childId) => {\n if (seen.has(childId) || !hidden.has(childId)) return;\n seen.add(childId);\n queue.push(childId);\n });\n }\n return seen.size;\n }\n\n setCollapsed(nodeId, collapsed) {\n if (this.readonly) return false;\n const node = this.findNode(sanitizeId(nodeId));\n if (!node) return false;\n const next = Boolean(collapsed);\n if (Boolean(node.collapsed) === next) return false;\n if (next && !this.getChildNodes(node.id).length) return false;\n if (next) node.collapsed = true;\n else delete node.collapsed;\n\n // Keep the selection on something visible.\n if (this.selection?.kind === 'node') {\n const hidden = this.getHiddenNodeIds();\n const visibleIds = this.getSelectedNodeIds().filter((id) => !hidden.has(id));\n if (hidden.has(this.selection.id)) {\n this.select({ kind: 'node', id: node.id });\n } else if (visibleIds.length !== this.selectedNodeIds.size) {\n this.selectNodes(visibleIds, { primary: this.selection.id });\n }\n } else if (this.selection?.kind === 'edge') {\n const edge = this.findEdge(this.selection.id);\n const hidden = this.getHiddenNodeIds();\n if (edge && (hidden.has(edge.from.nodeId) || hidden.has(edge.to.nodeId))) {\n this.select({ kind: 'node', id: node.id });\n }\n }\n\n this.render({ inspector: true, json: true });\n this.emitChange('node:collapse', { node: deepClone(node) });\n return true;\n }\n\n toggleCollapsed(nodeId) {\n const node = this.findNode(sanitizeId(nodeId));\n return node ? this.setCollapsed(node.id, !node.collapsed) : false;\n }\n\n findEdge(edgeId) {\n return this.documentData.edges.find((edge) => edge.id === edgeId) || null;\n }\n\n emit(eventName, payload) {\n const listeners = this.listeners[eventName];\n if (!listeners || !listeners.size) return;\n listeners.forEach((listener) => listener(payload));\n }\n\n emitChange(reason, extra = {}) {\n if (this.historyEnabled && !this.isApplyingHistory) {\n if (this.historyBatchDepth > 0) this.historyBatchDirty = true;\n else this.recordHistory(reason);\n }\n this.syncJsonTextarea();\n this.emit('change', {\n reason,\n document: this.toJSON(),\n ...extra,\n });\n }\n\n emitViewportChange(reason) {\n const payload = {\n reason,\n viewport: deepClone(this.documentData.viewport),\n document: this.toJSON(),\n };\n this.syncJsonTextarea();\n this.emit('viewport', payload);\n this.emit('change', payload);\n }\n\n on(eventName, callback) {\n if (!this.listeners[eventName]) {\n this.listeners[eventName] = new Set();\n }\n this.listeners[eventName].add(callback);\n return this;\n }\n\n off(eventName, callback) {\n this.listeners[eventName]?.delete(callback);\n return this;\n }\n\n // --- History (undo / redo) ----------------------------------------------\n // Every document mutation funnels through emitChange(), so recording there\n // captures all of them with exactly one entry per committed gesture (live\n // drag/resize only render()). Viewport pan/zoom go through emitViewportChange\n // and are intentionally not recorded \u2014 undo is for content, not the camera.\n seedHistory() {\n if (!this.historyEnabled) return;\n this.history = [{ reason: 'init', targetKey: '', snapshot: this.toJSON() }];\n this.historyIndex = 0;\n }\n\n recordHistory(reason) {\n const snapshot = this.toJSON();\n const targetKey = this.selection ? `${this.selection.kind}:${this.selection.id}` : '';\n const top = this.history[this.historyIndex];\n const atTip = Boolean(top) && this.historyIndex === this.history.length - 1;\n // Naming a node right after inserting it is part of the same gesture.\n const namesInsertedNode =\n this.coalesceInsertedText && top?.reason === 'node:insert' && reason === 'node:update';\n const canCoalesce =\n atTip &&\n top.targetKey === targetKey &&\n (namesInsertedNode || (COALESCING_REASONS.has(reason) && top.reason === reason));\n\n if (canCoalesce) {\n top.snapshot = snapshot;\n return;\n }\n\n if (this.historyIndex < this.history.length - 1) {\n this.history.length = this.historyIndex + 1;\n }\n this.history.push({ reason, targetKey, snapshot });\n if (this.history.length > this.historyLimit) {\n this.history.shift();\n }\n this.historyIndex = this.history.length - 1;\n this.emitHistoryState(reason);\n }\n\n applyHistorySnapshot(snapshot, reason) {\n this.isApplyingHistory = true;\n this.stopTextEdit({ commit: false });\n this.activeTool = null;\n this.reconnectEdgeId = null;\n // Preserve the current camera so undo/redo never makes the view jump.\n const currentViewport = deepClone(this.documentData.viewport);\n const previousSelection = this.selection;\n this.documentData = normalizeDocument(snapshot, this.normalizationLimits());\n this.documentData.viewport = normalizeViewport(currentViewport, this.scaleBounds());\n this.selection = this.resolvePreservedSelection(previousSelection, true);\n this.render();\n this.emitChange(reason);\n this.isApplyingHistory = false;\n this.emitHistoryState(reason);\n }\n\n emitHistoryState(reason) {\n this.updateHistoryButtons();\n this.emit('history', { reason, canUndo: this.canUndo(), canRedo: this.canRedo() });\n }\n\n canUndo() {\n return this.historyEnabled && this.historyIndex > 0;\n }\n\n canRedo() {\n return this.historyEnabled && this.historyIndex < this.history.length - 1;\n }\n\n undo() {\n if (!this.canUndo()) return this;\n this.historyIndex -= 1;\n this.applyHistorySnapshot(this.history[this.historyIndex].snapshot, 'undo');\n return this;\n }\n\n redo() {\n if (!this.canRedo()) return this;\n this.historyIndex += 1;\n this.applyHistorySnapshot(this.history[this.historyIndex].snapshot, 'redo');\n return this;\n }\n\n clearHistory() {\n this.seedHistory();\n this.emitHistoryState('history:clear');\n return this;\n }\n\n updateHistoryButtons() {\n if (this.undoButton) this.undoButton.disabled = this.readonly || !this.canUndo();\n if (this.redoButton) this.redoButton.disabled = this.readonly || !this.canRedo();\n }\n\n // Resolve a `relativeTo` anchor into a top-left position for a new node of the\n // given spec. Accepts a bare node id or `{ node, direction, distance, angle }`;\n // `direction` (right/down/left/up) is sugar for an angle in screen space\n // (y-down). Returns null when the anchor node can't be found.\n resolveRelativePosition(relativeTo, spec) {\n const ref = typeof relativeTo === 'string' ? { node: relativeTo } : relativeTo || {};\n const anchor = this.findNode(sanitizeId(ref.node ?? ref.nodeId ?? ref.id));\n if (!anchor) return null;\n\n const directionAngles = { right: 0, down: 90, left: 180, up: -90 };\n const angleDeg =\n ref.angle != null ? toFiniteNumber(ref.angle, 0) : (directionAngles[ref.direction] ?? 0);\n const distance = Math.max(0, toFiniteNumber(ref.distance, 220));\n const radians = (angleDeg * Math.PI) / 180;\n\n const centerX = anchor.x + anchor.width / 2 + Math.cos(radians) * distance;\n const centerY = anchor.y + anchor.height / 2 + Math.sin(radians) * distance;\n return {\n x: formatNumber(centerX - spec.width / 2),\n y: formatNumber(centerY - spec.height / 2),\n };\n }\n\n addNode(partialNode = {}) {\n const type = normalizeNodeType(partialNode.type);\n const spec = DEFAULT_NODE_SPECS[type];\n const relative =\n partialNode.relativeTo != null\n ? this.resolveRelativePosition(partialNode.relativeTo, spec)\n : null;\n const center = this.getViewportCenter();\n const offset = (this.paletteSerial % 6) * 26;\n this.paletteSerial += 1;\n\n const fallbackX = relative ? relative.x : formatNumber(center.x - spec.width / 2 + offset);\n const fallbackY = relative ? relative.y : formatNumber(center.y - spec.height / 2 + offset);\n\n const rest = { ...partialNode };\n delete rest.relativeTo;\n const usedIds = new Set(this.documentData.nodes.map((node) => node.id));\n const node = normalizeNode(\n {\n ...rest,\n type,\n x: partialNode.x == null ? fallbackX : partialNode.x,\n y: partialNode.y == null ? fallbackY : partialNode.y,\n },\n this.documentData.nodes.length,\n usedIds,\n this.nodeSizeBounds(),\n );\n\n this.documentData.nodes.push(node);\n this.select({ kind: 'node', id: node.id });\n this.syncJsonTextarea();\n this.emitChange('node:add', { node: deepClone(node) });\n return deepClone(node);\n }\n\n // Convenience: place a child node relative to a parent and connect them with\n // an auto-ported arrow in one call. Returns { node, edge } (edge may be null\n // if the connection is rejected). The new child is left selected.\n addChildNode(parentId, options = {}) {\n if (this.readonly) return null;\n const parent = this.findNode(sanitizeId(parentId));\n if (!parent) return null;\n\n const { direction = 'right', distance, angle, edge: edgeOptions, ...nodeOptions } = options;\n return this.batchHistory('node:add-child', () => {\n const node = this.addNode({\n ...nodeOptions,\n relativeTo: { node: parent.id, direction, distance, angle },\n });\n\n const edge = this.addEdge({\n from: parent.id,\n to: node.id,\n autoPort: true,\n endMarker: 'arrow',\n ...(isPlainObject(edgeOptions) ? edgeOptions : {}),\n });\n\n this.select({ kind: 'node', id: node.id });\n return { node, edge };\n });\n }\n\n // Run `fn` with history recording suspended, then record a single entry for\n // everything it changed (change events still fire for each mutation).\n batchHistory(reason, fn) {\n this.historyBatchDepth += 1;\n let result;\n try {\n result = fn();\n } finally {\n this.historyBatchDepth -= 1;\n }\n if (this.historyBatchDepth === 0 && this.historyBatchDirty) {\n this.historyBatchDirty = false;\n if (this.historyEnabled && !this.isApplyingHistory) this.recordHistory(reason);\n }\n return result;\n }\n\n // Mind-map structure: a node's parent is the source of its first incoming\n // edge; its children are the targets of its outgoing edges. The side a\n // branch is on is the port its edge leaves the parent from, which is what\n // the user sees (centre geometry is ambiguous for diagonal nodes).\n getParentEdge(nodeId) {\n return (\n this.documentData.edges.find(\n (edge) => edge.to.nodeId === nodeId && edge.from.nodeId !== nodeId,\n ) || null\n );\n }\n\n getParentNode(nodeId) {\n const edge = this.getParentEdge(nodeId);\n return edge ? this.findNode(edge.from.nodeId) : null;\n }\n\n getChildNodes(nodeId, direction = null) {\n const port = direction ? DIRECTION_PORTS[direction] : null;\n const ids = new Set();\n this.documentData.edges.forEach((edge) => {\n if (edge.from.nodeId !== nodeId || edge.to.nodeId === nodeId) return;\n if (!port || edge.from.port === port) ids.add(edge.to.nodeId);\n });\n return this.documentData.nodes.filter((node) => ids.has(node.id));\n }\n\n // Direction a branch grows from `node`: the side its parent edge leaves\n // from, or the emptier horizontal side for a root.\n getGrowthDirection(node) {\n const parentEdge = this.getParentEdge(node.id);\n if (parentEdge) return PORT_DIRECTIONS[parentEdge.from.port] || 'right';\n const right = this.getChildNodes(node.id, 'right').length;\n const left = this.getChildNodes(node.id, 'left').length;\n return left < right ? 'left' : 'right';\n }\n\n // Shape for a new branch node: copy a sibling when there is one, otherwise\n // the parent's box shape, falling back to a rounded step.\n getBranchTemplate(parent, sibling) {\n const source =\n sibling ||\n (['rounded-rect', 'rect', 'textbox'].includes(parent.type) ? parent : null) ||\n null;\n if (source) return { type: source.type, width: source.width, height: source.height };\n const spec = DEFAULT_NODE_SPECS['rounded-rect'];\n return { type: 'rounded-rect', width: spec.width, height: spec.height };\n }\n\n /**\n * Add a node connected from `parentId` on the `direction` side (default: the\n * branch's growth direction), stacked after `anchorId` or the last sibling on\n * that side. The node and its edge are one undo step; the new edge copies a\n * sibling's (or the parent's incoming) edge style. With `edit: true` the\n * label editor opens with the text selected.\n */\n insertBranchNode(parentId, options = {}) {\n if (this.readonly) return null;\n const parent = this.findNode(sanitizeId(parentId));\n if (!parent) return null;\n\n const direction = DIRECTION_PORTS[options.direction]\n ? options.direction\n : this.getGrowthDirection(parent);\n const siblings = this.getChildNodes(parent.id, direction);\n const anchor = options.anchorId ? this.findNode(sanitizeId(options.anchorId)) : null;\n const lastSibling = siblings[siblings.length - 1] || null;\n const template = this.getBranchTemplate(parent, anchor || lastSibling);\n const position = placeBranchNode({\n nodes: this.documentData.nodes,\n parent,\n siblings,\n direction,\n size: template,\n anchor,\n before: Boolean(options.before),\n });\n\n const styleSource =\n this.documentData.edges.find(\n (edge) => edge.from.nodeId === parent.id && edge.to.nodeId === (anchor || lastSibling)?.id,\n ) || this.documentData.edges.find((edge) => edge.to.nodeId === parent.id);\n const edgeStyle = styleSource\n ? {\n route: styleSource.route,\n strokeWidth: styleSource.strokeWidth,\n startMarker: styleSource.startMarker,\n endMarker: styleSource.endMarker,\n }\n : { endMarker: 'arrow' };\n\n const result = this.batchHistory('node:insert', () => {\n // A new child must be visible, so its branch opens in the same step.\n if (parent.collapsed) delete parent.collapsed;\n const node = this.addNode({ ...template, x: position.x, y: position.y });\n const edge = this.addEdge({\n from: { nodeId: parent.id, port: DIRECTION_PORTS[direction] },\n to: { nodeId: node.id, port: DIRECTION_PORTS[oppositeDirection(direction)] },\n ...edgeStyle,\n });\n if (edge && anchor) this.placeEdgeBySibling(edge.id, parent.id, anchor.id, options.before);\n if (this.autoLayout && this.layoutMode !== 'grid') this.layout(this.layoutMode);\n this.select({ kind: 'node', id: node.id });\n return { node, edge };\n });\n\n this.revealNode(result.node.id);\n if (options.edit) this.startTextEdit(result.node.id, { inserted: true });\n return result;\n }\n\n // Tree and radial layouts order children by connection order, so a sibling's\n // connection goes right after (or before) its anchor's instead of last.\n placeEdgeBySibling(edgeId, parentId, anchorId, before = false) {\n const edges = this.documentData.edges;\n const fromIndex = edges.findIndex((edge) => edge.id === edgeId);\n if (fromIndex === -1) return;\n const [moved] = edges.splice(fromIndex, 1);\n const anchorIndex = edges.findIndex(\n (edge) => edge.from.nodeId === parentId && edge.to.nodeId === anchorId,\n );\n if (anchorIndex === -1) edges.push(moved);\n else edges.splice(before ? anchorIndex : anchorIndex + 1, 0, moved);\n }\n\n // Insert a sibling after (or before) `nodeId`; a node without a parent gets a\n // child instead, which is what Enter on a mind-map root means.\n insertSiblingNode(nodeId, options = {}) {\n if (this.readonly) return null;\n const node = this.findNode(sanitizeId(nodeId));\n if (!node) return null;\n const parentEdge = this.getParentEdge(node.id);\n const parent = parentEdge ? this.findNode(parentEdge.from.nodeId) : null;\n if (!parent) return this.insertBranchNode(node.id, { edit: options.edit });\n return this.insertBranchNode(parent.id, {\n direction: PORT_DIRECTIONS[parentEdge.from.port],\n anchorId: node.id,\n before: Boolean(options.before),\n edit: options.edit,\n });\n }\n\n // Pan just enough to bring a node fully into view (with a small margin).\n revealNode(nodeId) {\n const node = this.findNode(nodeId);\n const width = this.canvasEl.clientWidth;\n const height = this.canvasEl.clientHeight;\n if (!node || !width || !height) return;\n const viewport = this.documentData.viewport;\n const margin = 32;\n const left = viewport.x + node.x * viewport.scale;\n const top = viewport.y + node.y * viewport.scale;\n const right = left + node.width * viewport.scale;\n const bottom = top + node.height * viewport.scale;\n let dx = 0;\n let dy = 0;\n if (right > width - margin) dx = width - margin - right;\n if (left + dx < margin) dx = margin - left;\n if (bottom > height - margin) dy = height - margin - bottom;\n if (top + dy < margin) dy = margin - top;\n if (!dx && !dy) return;\n viewport.x = formatNumber(viewport.x + dx);\n viewport.y = formatNumber(viewport.y + dy);\n this.render({ inspector: false, json: true });\n this.emitViewportChange('viewport:pan');\n }\n\n // Arrange nodes with a built-in layout. Positions are computed by the pure\n // computeLayout() module, then applied in place (NOT via load(), which would\n // wipe selection/viewport) so the result is one undoable, change-emitting step.\n layout(mode = 'tree', options = {}) {\n if (this.readonly) return this;\n const resolvedMode = LAYOUT_MODES.includes(mode) ? mode : 'tree';\n this.layoutMode = resolvedMode;\n this.syncArrangeSelect();\n const positions = computeLayout(this.documentData, resolvedMode, options);\n if (!positions.size) return this;\n\n let changed = false;\n this.documentData.nodes.forEach((node) => {\n const next = positions.get(node.id);\n if (!next) return;\n const x = formatNumber(next.x);\n const y = formatNumber(next.y);\n if (x !== node.x || y !== node.y) {\n node.x = x;\n node.y = y;\n changed = true;\n }\n });\n\n const rerouted =\n options.reroutePorts === false\n ? false\n : this.rerouteEdgePorts(resolvedMode === 'tree' ? options.direction || 'right' : null);\n if (!changed && !rerouted) return this;\n\n this.render();\n this.emitChange('layout', { mode: resolvedMode });\n if (options.fit) this.fitView();\n return this;\n }\n\n autoArrange(options = {}) {\n return this.layout('grid', options);\n }\n\n // Re-pick each edge's from/to port from the nodes' current centers, so a\n // freshly laid-out graph attaches connectors on sensible sides. Returns\n // whether any port actually changed.\n rerouteEdgePorts(flowDirection = null) {\n let changed = false;\n const flow =\n flowDirection === 'down' ||\n flowDirection === 'up' ||\n flowDirection === 'left' ||\n flowDirection === 'right'\n ? flowDirection\n : null;\n const outDegree = new Map();\n if (flow) {\n this.documentData.edges.forEach((edge) => {\n const fromId = edge?.from?.nodeId;\n if (fromId) outDegree.set(fromId, (outDegree.get(fromId) || 0) + 1);\n });\n }\n this.documentData.edges.forEach((edge) => {\n const fromNode = this.findNode(edge.from.nodeId);\n const toNode = this.findNode(edge.to.nodeId);\n if (!fromNode || !toNode) return;\n const fromCenter = {\n x: fromNode.x + fromNode.width / 2,\n y: fromNode.y + fromNode.height / 2,\n };\n const toCenter = { x: toNode.x + toNode.width / 2, y: toNode.y + toNode.height / 2 };\n let nextFrom;\n let nextTo;\n if (flow) {\n const dx = toCenter.x - fromCenter.x;\n const dy = toCenter.y - fromCenter.y;\n const vertical = flow === 'down' || flow === 'up';\n const sign = flow === 'up' || flow === 'left' ? -1 : 1;\n const mainDelta = (vertical ? dy : dx) * sign;\n const crossDelta = vertical ? dx : dy;\n const isDiamondBranch =\n fromNode.type === 'diamond' && (outDegree.get(fromNode.id) || 0) >= 2;\n if (mainDelta < -8) {\n const allNodes = this.documentData.nodes;\n if (vertical) {\n const minX = Math.min(fromNode.x, toNode.x);\n const maxRight = Math.max(fromNode.x + fromNode.width, toNode.x + toNode.width);\n const minY = Math.min(fromCenter.y, toCenter.y) - 8;\n const maxY = Math.max(fromCenter.y, toCenter.y) + 8;\n let rightCount = 0;\n let leftCount = 0;\n allNodes.forEach((n) => {\n if (!n || n.id === fromNode.id || n.id === toNode.id) return;\n const ny = n.y + n.height / 2;\n if (ny < minY || ny > maxY) return;\n const nx = n.x + n.width / 2;\n if (nx >= maxRight - 20) rightCount += 1;\n if (nx <= minX + 20) leftCount += 1;\n });\n const side =\n leftCount < rightCount\n ? 'left'\n : rightCount < leftCount\n ? 'right'\n : crossDelta < -8\n ? 'left'\n : 'right';\n nextFrom = side;\n nextTo = side;\n } else {\n const minY = Math.min(fromNode.y, toNode.y);\n const maxBottom = Math.max(fromNode.y + fromNode.height, toNode.y + toNode.height);\n const minX = Math.min(fromCenter.x, toCenter.x) - 8;\n const maxX = Math.max(fromCenter.x, toCenter.x) + 8;\n let bottomCount = 0;\n let topCount = 0;\n allNodes.forEach((n) => {\n if (!n || n.id === fromNode.id || n.id === toNode.id) return;\n const nx = n.x + n.width / 2;\n if (nx < minX || nx > maxX) return;\n const ny = n.y + n.height / 2;\n if (ny >= maxBottom - 20) bottomCount += 1;\n if (ny <= minY + 20) topCount += 1;\n });\n const side =\n topCount < bottomCount\n ? 'top'\n : bottomCount < topCount\n ? 'bottom'\n : crossDelta < -8\n ? 'top'\n : 'bottom';\n nextFrom = side;\n nextTo = side;\n }\n } else if (mainDelta >= 12) {\n if (vertical) {\n nextTo = sign > 0 ? 'top' : 'bottom';\n if (isDiamondBranch && Math.abs(crossDelta) >= fromNode.width * 0.45) {\n nextFrom = crossDelta > 0 ? 'right' : 'left';\n } else {\n nextFrom = sign > 0 ? 'bottom' : 'top';\n }\n } else {\n nextTo = sign > 0 ? 'left' : 'right';\n if (isDiamondBranch && Math.abs(crossDelta) >= fromNode.height * 0.45) {\n nextFrom = crossDelta > 0 ? 'bottom' : 'top';\n } else {\n nextFrom = sign > 0 ? 'right' : 'left';\n }\n }\n } else if (vertical) {\n nextFrom = dx >= 0 ? 'right' : 'left';\n nextTo = dx >= 0 ? 'left' : 'right';\n } else {\n nextFrom = dy >= 0 ? 'bottom' : 'top';\n nextTo = dy >= 0 ? 'top' : 'bottom';\n }\n } else {\n nextFrom = getPortByDirection(fromNode, toCenter).port;\n nextTo = getPortByDirection(toNode, fromCenter).port;\n }\n if (nextFrom !== edge.from.port || nextTo !== edge.to.port) {\n edge.from.port = nextFrom;\n edge.to.port = nextTo;\n changed = true;\n }\n });\n return changed;\n }\n\n applyNodePatch(node, patch = {}) {\n const nextType = normalizeNodeType(patch.type ?? node.type);\n node.type = nextType;\n node.x = patch.x == null ? node.x : formatNumber(toFiniteNumber(patch.x, node.x));\n node.y = patch.y == null ? node.y : formatNumber(toFiniteNumber(patch.y, node.y));\n node.text = isNodeTextEditable(nextType)\n ? patch.text == null\n ? node.text\n : String(patch.text)\n : getNodeSpec(nextType).text;\n\n node.width = clampNodeWidth(nextType, patch.width, node.width, this.nodeSizeBounds());\n node.height = clampNodeHeight(nextType, patch.height, node.height, this.nodeSizeBounds());\n\n if (isPlainObject(patch.data)) {\n node.data = deepClone(patch.data);\n }\n }\n\n updateNode(nodeId, patch = {}, options = {}) {\n const node = this.findNode(nodeId);\n if (!node) return null;\n\n const previousType = node.type;\n const previousSpec = DEFAULT_NODE_SPECS[previousType];\n this.applyNodePatch(node, patch);\n if (patch.type && previousType !== node.type) {\n const nextSpec = DEFAULT_NODE_SPECS[node.type];\n if (patch.width == null && node.width === previousSpec.width) {\n node.width = nextSpec.width;\n }\n if (patch.height == null && node.height === previousSpec.height) {\n node.height = nextSpec.height;\n }\n if (node.text === DEFAULT_NODE_SPECS[previousType].text) {\n node.text = nextSpec.text;\n }\n }\n\n this.render({\n scene: true,\n inspector: options.inspector !== false,\n json: true,\n });\n this.emitChange(options.reason || 'node:update', { node: deepClone(node) });\n return deepClone(node);\n }\n\n // Walk outgoing edges (from.nodeId -> to.nodeId) breadth-first to collect a\n // node and every descendant reachable through the directed graph. The visited\n // Set doubles as a cycle guard, so a diamond or loop is safe (each node once).\n collectDescendants(rootId) {\n const visited = new Set([rootId]);\n const queue = [rootId];\n while (queue.length) {\n const current = queue.shift();\n this.documentData.edges.forEach((edge) => {\n if (edge.from.nodeId === current && !visited.has(edge.to.nodeId)) {\n visited.add(edge.to.nodeId);\n queue.push(edge.to.nodeId);\n }\n });\n }\n return visited;\n }\n\n removeNode(nodeId, options = {}) {\n const id = sanitizeId(nodeId);\n if (!this.findNode(id)) return false;\n\n const ids = options.cascade ? this.collectDescendants(id) : new Set([id]);\n return this.removeNodeIds(ids, options.reason || 'node:remove', id);\n }\n\n removeNodeIds(ids, reason = 'node:remove', primaryId = null) {\n const idSet = ids instanceof Set ? ids : new Set(ids);\n const removed = this.documentData.nodes\n .filter((node) => idSet.has(node.id))\n .map((node) => node.id);\n if (!removed.length) return false;\n\n if (this.textEditor && idSet.has(this.textEditor.nodeId)) {\n this.stopTextEdit({ commit: false });\n }\n\n this.documentData.nodes = this.documentData.nodes.filter((node) => !idSet.has(node.id));\n this.documentData.edges = this.documentData.edges.filter(\n (edge) => !idSet.has(edge.from.nodeId) && !idSet.has(edge.to.nodeId),\n );\n\n if (this.selection?.kind === 'node' && idSet.has(this.selection.id)) {\n this.selection = null;\n }\n\n this.render();\n this.emitChange(reason, { nodeId: primaryId ?? removed[0], nodeIds: removed });\n return true;\n }\n\n updateEdge(edgeId, patch = {}, options = {}) {\n const edge = this.findEdge(edgeId);\n if (!edge) return null;\n\n const nodeIds = new Set(this.documentData.nodes.map((node) => node.id));\n const nextFrom = patch.from ? normalizeEndpoint(patch.from, edge.from.port) : edge.from;\n const nextTo = patch.to ? normalizeEndpoint(patch.to, edge.to.port) : edge.to;\n\n if (patch.from != null || patch.to != null) {\n if (!nodeIds.has(nextFrom.nodeId) || !nodeIds.has(nextTo.nodeId)) return null;\n if (!FLOWCHART_PORTS.includes(nextFrom.port) || !FLOWCHART_PORTS.includes(nextTo.port))\n return null;\n if (nextFrom.nodeId === nextTo.nodeId && nextFrom.port === nextTo.port) return null;\n edge.from = nextFrom;\n edge.to = nextTo;\n }\n\n if (patch.kind != null) {\n edge.kind = patch.kind === 'line' ? 'line' : 'arrow';\n if (patch.startMarker == null && patch.endMarker == null) {\n if (edge.kind === 'line') {\n edge.startMarker = 'none';\n edge.endMarker = 'none';\n } else if (edge.endMarker === 'none' && edge.startMarker === 'none') {\n edge.endMarker = 'arrow';\n }\n }\n }\n if (patch.startMarker != null) {\n edge.startMarker = normalizeEdgeMarker(patch.startMarker) || 'none';\n }\n if (patch.endMarker != null) {\n edge.endMarker = normalizeEdgeMarker(patch.endMarker) || 'none';\n }\n if (patch.route != null) {\n edge.route = normalizeEdgeRoute(patch.route);\n }\n if (patch.strokeWidth != null) {\n edge.strokeWidth = normalizeEdgeStrokeWidth(patch.strokeWidth);\n }\n if (patch.label != null) {\n edge.label = String(patch.label);\n }\n if (isPlainObject(patch.data)) {\n edge.data = deepClone(patch.data);\n }\n\n syncEdgeKind(edge);\n\n this.render({\n scene: true,\n inspector: options.inspector !== false,\n json: true,\n });\n this.emitChange(options.reason || 'edge:update', { edge: deepClone(edge) });\n return deepClone(edge);\n }\n\n // Accept `from`/`to` as a bare node id or `{ nodeId, port }`. When `autoPort`\n // is set, fill any omitted port by aiming each endpoint at the other node's\n // center via getPortByDirection \u2014 the same geometry the live connect tool\n // uses, so a programmatic edge picks the same side a dragged one would.\n resolveEdgeEndpoints(partialEdge) {\n const toEndpoint = (value) => {\n if (typeof value === 'string') return { nodeId: value };\n if (isPlainObject(value)) return { ...value };\n return {};\n };\n const from = toEndpoint(partialEdge.from);\n const to = toEndpoint(partialEdge.to);\n\n if (partialEdge.autoPort) {\n const fromNode = this.findNode(sanitizeId(from.nodeId));\n const toNode = this.findNode(sanitizeId(to.nodeId));\n if (fromNode && toNode) {\n const fromCenter = {\n x: fromNode.x + fromNode.width / 2,\n y: fromNode.y + fromNode.height / 2,\n };\n const toCenter = { x: toNode.x + toNode.width / 2, y: toNode.y + toNode.height / 2 };\n if (!FLOWCHART_PORTS.includes(from.port))\n from.port = getPortByDirection(fromNode, toCenter).port;\n if (!FLOWCHART_PORTS.includes(to.port))\n to.port = getPortByDirection(toNode, fromCenter).port;\n }\n }\n\n const rest = { ...partialEdge };\n delete rest.autoPort;\n return { ...rest, from, to };\n }\n\n addEdge(partialEdge = {}) {\n if (this.readonly) return null;\n\n const input = this.resolveEdgeEndpoints(partialEdge);\n const nodeIds = new Set(this.documentData.nodes.map((node) => node.id));\n const usedIds = new Set(this.documentData.edges.map((edge) => edge.id));\n const edge = normalizeEdge(input, this.documentData.edges.length, nodeIds, usedIds);\n\n if (!edge) return null;\n if (edge.from.nodeId === edge.to.nodeId && edge.from.port === edge.to.port) return null;\n\n this.documentData.edges.push(edge);\n this.select({ kind: 'edge', id: edge.id });\n this.syncJsonTextarea();\n this.emit('connect', { edge: deepClone(edge) });\n this.emitChange('edge:add', { edge: deepClone(edge) });\n return deepClone(edge);\n }\n\n removeEdge(edgeId) {\n const edgeIndex = this.documentData.edges.findIndex((edge) => edge.id === edgeId);\n if (edgeIndex === -1) return false;\n\n this.documentData.edges.splice(edgeIndex, 1);\n if (this.selection?.kind === 'edge' && this.selection.id === edgeId) {\n this.selection = null;\n }\n\n this.render();\n this.emitChange('edge:remove', { edgeId });\n return true;\n }\n\n deleteSelection() {\n if (!this.selection || this.readonly) return false;\n if (this.hasMultiSelection()) {\n return this.removeNodeIds(new Set(this.getSelectedNodeIds()), 'node:remove');\n }\n if (this.selection.kind === 'node') return this.removeNode(this.selection.id);\n return this.removeEdge(this.selection.id);\n }\n\n nodeSizeBounds() {\n return { min: this.minNodeSize, max: this.maxNodeSize };\n }\n\n scaleBounds() {\n return { min: this.minScale, max: this.maxScale };\n }\n\n normalizationLimits() {\n return { scaleBounds: this.scaleBounds(), sizeBounds: this.nodeSizeBounds() };\n }\n\n hasWideCamera() {\n return this.minScale < DEFAULT_MIN_SCALE || this.maxScale > DEFAULT_MAX_SCALE;\n }\n\n syncGrid() {\n const wide = this.hasWideCamera();\n const extent = wide ? WIDE_WORLD_EXTENT : DEFAULT_WORLD_EXTENT;\n this.gridRect?.setAttribute('x', String(-extent / 2));\n this.gridRect?.setAttribute('y', String(-extent / 2));\n this.gridRect?.setAttribute('width', String(extent));\n this.gridRect?.setAttribute('height', String(extent));\n const pattern = this.svg?.querySelector('pattern');\n const path = pattern?.querySelector('path');\n if (!pattern || !path) return;\n let tile = this.gridSize;\n if (wide) {\n const scale = Math.max(this.minScale, this.documentData?.viewport?.scale || 1);\n while (tile * scale < 12 && tile < extent / 8) tile *= 4;\n while (tile * scale > 48 && tile > 1.5) tile /= 4;\n tile = formatNumber(tile);\n path.setAttribute('vector-effect', 'non-scaling-stroke');\n } else {\n path.removeAttribute('vector-effect');\n }\n path.setAttribute('stroke-width', '1');\n pattern.setAttribute('width', String(tile));\n pattern.setAttribute('height', String(tile));\n path.setAttribute('d', `M ${tile} 0 L 0 0 0 ${tile}`);\n }\n\n setViewport(viewport) {\n this.documentData.viewport = normalizeViewport(viewport, this.scaleBounds());\n this.render({ inspector: false, json: true });\n this.emitViewportChange('viewport:set');\n return this;\n }\n\n zoomIn() {\n const width = this.canvasEl.clientWidth || 800;\n const height = this.canvasEl.clientHeight || 560;\n this.scaleAround(1.12, width / 2, height / 2, 'viewport:zoom');\n return this;\n }\n\n zoomOut() {\n const width = this.canvasEl.clientWidth || 800;\n const height = this.canvasEl.clientHeight || 560;\n this.scaleAround(1 / 1.12, width / 2, height / 2, 'viewport:zoom');\n return this;\n }\n\n resetView() {\n this.documentData.viewport = normalizeViewport({ x: 0, y: 0, scale: 1 }, this.scaleBounds());\n this.render({ inspector: false, json: true });\n this.emitViewportChange('viewport:reset');\n return this;\n }\n\n fitView() {\n const nodes = this.getVisibleNodes();\n if (!nodes.length) {\n return this.resetView();\n }\n\n const bounds = getBounds(nodes);\n const width = this.canvasEl.clientWidth || 800;\n const height = this.canvasEl.clientHeight || 560;\n const padding = 80;\n const contentWidth = Math.max(1, bounds.right - bounds.left);\n const contentHeight = Math.max(1, bounds.bottom - bounds.top);\n const scale = formatScale(\n clamp(\n Math.min((width - padding * 2) / contentWidth, (height - padding * 2) / contentHeight),\n this.minScale,\n this.maxScale,\n ),\n );\n\n this.documentData.viewport = {\n x: formatNumber(width / 2 - ((bounds.left + bounds.right) / 2) * scale),\n y: formatNumber(height / 2 - ((bounds.top + bounds.bottom) / 2) * scale),\n scale,\n };\n\n this.render({ inspector: false, json: true });\n this.emitViewportChange('viewport:fit');\n return this;\n }\n\n fitNode(nodeId, padding = 48) {\n const node = this.findNode(nodeId);\n if (!node || this.isNodeHidden(node.id)) return this;\n const pad = Math.max(0, toFiniteNumber(padding, 48));\n const width = this.canvasEl.clientWidth || 800;\n const height = this.canvasEl.clientHeight || 560;\n const availableWidth = Math.max(1, width - pad * 2);\n const availableHeight = Math.max(1, height - pad * 2);\n const scale = formatScale(\n clamp(\n Math.min(\n availableWidth / Math.max(1, node.width),\n availableHeight / Math.max(1, node.height),\n ),\n this.minScale,\n this.maxScale,\n ),\n );\n const centerX = node.x + node.width / 2;\n const centerY = node.y + node.height / 2;\n this.documentData.viewport = {\n x: formatNumber(width / 2 - centerX * scale),\n y: formatNumber(height / 2 - centerY * scale),\n scale,\n };\n this.render({ inspector: false, json: true });\n this.emitViewportChange('viewport:fit-node');\n return this;\n }\n\n clear() {\n this.stopTextEdit({ commit: false });\n this.activeTool = null;\n this.reconnectEdgeId = null;\n this.clipboard = null;\n this.documentData = normalizeDocument(\n {\n nodes: [],\n edges: [],\n viewport: { x: 0, y: 0, scale: 1 },\n },\n this.normalizationLimits(),\n );\n this.selection = null;\n this.render();\n this.emitChange('clear');\n return this;\n }\n\n updateOptions(options = {}) {\n if (this.destroyed) return this;\n if ('readonly' in options) {\n if (options.readonly && !this.readonly) {\n this.stopTextEdit({ commit: true });\n this.interaction = null;\n this.activeTool = null;\n this.reconnectEdgeId = null;\n }\n this.readonly = Boolean(options.readonly);\n this.root.classList.toggle('vd-flowchart-readonly', this.readonly);\n this.arrangeSelect.disabled = this.readonly;\n this.clearButton.disabled = this.readonly;\n this.loadJsonButton.disabled = this.readonly;\n }\n if ('gridSize' in options) {\n this.gridSize = clamp(toFiniteNumber(options.gridSize, DEFAULT_GRID_SIZE), 12, 64);\n const pattern = this.svg.querySelector('pattern');\n pattern.setAttribute('width', this.gridSize);\n pattern.setAttribute('height', this.gridSize);\n pattern\n .querySelector('path')\n .setAttribute('d', `M ${this.gridSize} 0 L 0 0 0 ${this.gridSize}`);\n }\n // autoFit is a readiness preference, not a request to reset the camera.\n if ('autoFit' in options) this.autoFit = Boolean(options.autoFit);\n if ('keyboardShortcuts' in options) {\n this.keyboardShortcuts = normalizeKeyboardShortcuts(options.keyboardShortcuts);\n }\n if ('snapGuides' in options) this.snapGuides = options.snapGuides !== false;\n if ('minimap' in options) this.setMinimapEnabled(options.minimap !== false);\n if ('autoLayout' in options) this.autoLayout = Boolean(options.autoLayout);\n if (\n 'minScale' in options ||\n 'maxScale' in options ||\n 'minNodeSize' in options ||\n 'maxNodeSize' in options\n ) {\n const nextScale = normalizeBoundPair(\n 'minScale' in options ? options.minScale : this.minScale,\n 'maxScale' in options ? options.maxScale : this.maxScale,\n DEFAULT_MIN_SCALE,\n DEFAULT_MAX_SCALE,\n );\n const nextSize = normalizeBoundPair(\n 'minNodeSize' in options ? options.minNodeSize : this.minNodeSize,\n 'maxNodeSize' in options ? options.maxNodeSize : this.maxNodeSize,\n DEFAULT_MIN_NODE_SIZE,\n DEFAULT_MAX_NODE_SIZE,\n );\n this.minScale = nextScale.min;\n this.maxScale = nextScale.max;\n this.minNodeSize = nextSize.min;\n this.maxNodeSize = nextSize.max;\n const clamped = clamp(\n formatScale(this.documentData.viewport.scale),\n this.minScale,\n this.maxScale,\n );\n if (clamped !== this.documentData.viewport.scale) {\n this.documentData.viewport.scale = clamped;\n this.pendingBoundsEvent = true;\n }\n }\n this.syncCanvasLabel();\n if (this.shortcutsHelpOpen) this.renderShortcutsHelp();\n if ('history' in options && (options.history !== false) !== this.historyEnabled) {\n this.historyEnabled = options.history !== false;\n this.history = [];\n this.historyIndex = -1;\n this.seedHistory();\n }\n if ('historyLimit' in options) {\n this.historyLimit = Math.max(1, Math.floor(toFiniteNumber(options.historyLimit, 100)));\n if (this.history.length > this.historyLimit) {\n const start = Math.max(0, this.historyIndex - this.historyLimit + 1);\n this.history = this.history.slice(start, start + this.historyLimit);\n this.historyIndex -= start;\n }\n }\n this.render();\n if (this.pendingBoundsEvent) {\n this.pendingBoundsEvent = false;\n this.emitViewportChange('viewport:bounds');\n }\n this.updateHistoryButtons();\n return this;\n }\n\n load(data, options = {}) {\n const documentData = normalizeDocument(data, this.normalizationLimits());\n if (options.silent && JSON.stringify(documentData) === JSON.stringify(this.documentData)) {\n return this;\n }\n this.stopTextEdit({ commit: false });\n this.activeTool = null;\n this.reconnectEdgeId = null;\n const previousSelection = this.selection;\n this.documentData = documentData;\n this.selection = this.resolvePreservedSelection(previousSelection, options.preserveSelection);\n this.render();\n if (options.silent) {\n if (this.historyEnabled) this.recordHistory('load');\n } else {\n this.emitChange('load');\n }\n return this;\n }\n\n toJSON() {\n return deepClone({\n version: FLOWCHART_DOCUMENT_VERSION,\n viewport: this.documentData.viewport,\n nodes: this.documentData.nodes,\n edges: this.documentData.edges,\n });\n }\n\n destroy() {\n if (this.destroyed) return;\n this.destroyed = true;\n if (this.minimapFrame && typeof cancelAnimationFrame === 'function') {\n cancelAnimationFrame(this.minimapFrame);\n }\n this.minimapFrame = 0;\n this.activeTool = null;\n this.stopTextEdit({ commit: false });\n this.resizeObserver?.disconnect();\n this.resizeObserver = null;\n this.unbindEvents();\n this.sceneNodeMap?.clear();\n this.nodeElements?.clear();\n this.edgeElements?.clear();\n this.incidentEdges?.clear();\n this.element.innerHTML = '';\n this.element.classList.remove('vd-flowchart-host');\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["VdFlowchart", "center", "queue", "node", "edge", "distanceToBounds", "lines", "startY", "ref", "VdFlowchart"]
|
|
7
7
|
}
|