@vanduo-oss/vd3-flowchart 1.3.0 → 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +93 -0
- package/README.md +75 -8
- package/SKILL.md +32 -3
- package/dist/core.d.ts +105 -2
- package/dist/index.cjs +1937 -265
- package/dist/index.cjs.map +4 -4
- package/dist/index.d.ts +5 -0
- package/dist/index.js +1937 -265
- package/dist/index.js.map +4 -4
- package/dist/meta.json +29 -12
- package/dist/vd3-flowchart.css +190 -12
- package/dist/vue.d.ts +18 -0
- package/package.json +5 -2
- package/recipes/editor.vue +4 -2
package/dist/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/vue.js", "../src/layout.js", "../src/core.js"],
|
|
4
|
-
"sourcesContent": ["/**\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\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 },\n emits: ['change', 'select', 'viewport', 'connect', 'ready'],\n setup(props, { emit, expose }) {\n const el = ref(null);\n let instance = null;\n\n const create = () => {\n instance = new VdFlowchartCore({\n element: el.value,\n data: props.data,\n readonly: props.readonly,\n gridSize: props.gridSize,\n autoFit: props.autoFit,\n history: props.history,\n historyLimit: props.historyLimit,\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 () => [props.readonly, props.gridSize, props.autoFit, props.history, props.historyLimit],\n () => {\n if (!instance) return;\n instance.updateOptions({\n readonly: props.readonly,\n gridSize: props.gridSize,\n autoFit: props.autoFit,\n history: props.history,\n historyLimit: props.historyLimit,\n });\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 });\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", "/* global queueMicrotask */\nimport { computeLayout, LAYOUT_MODES } from './layout.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 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 MIN_SCALE = 0.35;\nconst MAX_SCALE = 3;\nconst MIN_NODE_SIZE = 56;\nconst MAX_NODE_SIZE = 420;\nconst WORLD_EXTENT = 12000;\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;\nconst CONNECTION_PORT_HIT_RADIUS = 14;\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 = 34;\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.3.0';\n/** Serialized schema version; change only when the document format changes. */\nexport const FLOWCHART_DOCUMENT_VERSION = '1.2.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'];\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']);\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 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 getNodeSizeBounds(type) {\n const spec = getNodeSpec(type);\n return {\n minWidth: spec.minWidth ?? MIN_NODE_SIZE,\n minHeight: spec.minHeight ?? MIN_NODE_SIZE,\n maxWidth: spec.maxWidth ?? MAX_NODE_SIZE,\n maxHeight: spec.maxHeight ?? MAX_NODE_SIZE,\n };\n}\n\nfunction clampNodeWidth(type, width, fallback) {\n const bounds = getNodeSizeBounds(type);\n return clamp(toFiniteNumber(width, fallback), bounds.minWidth, bounds.maxWidth);\n}\n\nfunction clampNodeHeight(type, height, fallback) {\n const bounds = getNodeSizeBounds(type);\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) {\n return {\n x: toFiniteNumber(viewport?.x, 0),\n y: toFiniteNumber(viewport?.y, 0),\n scale: clamp(toFiniteNumber(viewport?.scale, 1), MIN_SCALE, MAX_SCALE),\n };\n}\n\nfunction normalizeNode(rawNode, index, usedIds) {\n const type = normalizeNodeType(rawNode?.type);\n const spec = getNodeSpec(type);\n\n return {\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),\n height: clampNodeHeight(type, rawNode?.height, spec.height),\n text: rawNode?.text == null ? spec.text : String(rawNode.text),\n data: isPlainObject(rawNode?.data) ? deepClone(rawNode.data) : {},\n };\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) {\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));\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),\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 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 curveControlPoint(point, port, target, curvature) {\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, MIN_CURVE_ARM, MAX_CURVE_ARM);\n return { x: point.x + normal.x * arm, y: point.y + normal.y * arm };\n}\n\nfunction buildCurvePath(fromPoint, toPoint, fromPort = 'right', toPort = 'left') {\n const controlA = curveControlPoint(fromPoint, fromPort, toPoint, EDGE_CURVATURE);\n const controlB = curveControlPoint(toPoint, toPort, fromPoint, EDGE_CURVATURE);\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(fromPoint, toPoint, fromPort, toPort, fromRect, toRect) {\n const fromNormal = getPortNormal(fromPort);\n const toNormal = getPortNormal(toPort);\n const fromStub = offsetPoint(fromPoint, fromNormal, ORTHOGONAL_STUB_LENGTH);\n const toStub = offsetPoint(toPoint, toNormal, ORTHOGONAL_STUB_LENGTH);\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) {\n let points;\n if (fromRect && toRect) {\n points = getOrthogonalPoints(fromPoint, toPoint, fromPort, toPort, fromRect, toRect);\n } else {\n const fromStub = offsetPoint(fromPoint, getPortNormal(fromPort), ORTHOGONAL_STUB_LENGTH);\n const toStub = offsetPoint(toPoint, getPortNormal(toPort), ORTHOGONAL_STUB_LENGTH);\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, ORTHOGONAL_CORNER_RADIUS),\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\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, ORTHOGONAL_CLEARANCE) : null;\n const toRect =\n !edge?.toPoint && toNode ? getNodeRectBounds(toNode, ORTHOGONAL_CLEARANCE) : null;\n return buildOrthogonalPath(fromPoint, toPoint, fromPort, toPort, fromRect, toRect);\n }\n\n return buildCurvePath(fromPoint, toPoint, fromPort, toPort);\n}\n\nfunction createArrowMarker(id, strokeWidth, reversed = false) {\n const size = formatNumber(Math.max(9, strokeWidth * 4.4));\n const refInset = formatNumber(Math.max(1.5, strokeWidth * 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) {\n const size = formatNumber(Math.max(8, strokeWidth * 3.3));\n const radius = formatNumber(Math.max(2.75, strokeWidth * 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\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 this.documentData = normalizeDocument(options.data || {});\n this.listeners = {};\n this.selection = null;\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.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.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 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 toolbarLeft.appendChild(this.arrangeSelect);\n toolbarLeft.appendChild(this.clearButton);\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: -WORLD_EXTENT / 2,\n y: -WORLD_EXTENT / 2,\n width: WORLD_EXTENT,\n height: 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\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.svg.appendChild(this.world);\n this.canvasEl.appendChild(this.svg);\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.canvasEl.setAttribute(\n 'aria-label',\n 'Diagram canvas. Arrow keys select nodes; Enter edits a label. Graph outline provides connections.',\n );\n this.jsonTextarea.setAttribute('aria-label', 'Flowchart JSON');\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 signature = JSON.stringify([\n nodes.map((node) => [node.id, node.text]),\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 ];\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 }\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 handleKeyDown(event) {\n if (\n event.target &&\n (event.target.tagName === 'INPUT' ||\n event.target.tagName === 'TEXTAREA' ||\n event.target.tagName === 'SELECT')\n ) {\n return;\n }\n\n if (event.target === this.canvasEl) {\n const nodes = this.documentData.nodes;\n const index = nodes.findIndex((node) => node.id === this.selection?.id);\n let next = -1;\n if (event.key === 'ArrowDown' || event.key === 'ArrowRight')\n next = (index + 1) % nodes.length;\n if (event.key === 'ArrowUp' || event.key === 'ArrowLeft')\n next = index < 0 ? nodes.length - 1 : (index - 1 + nodes.length) % nodes.length;\n if (event.key === 'Home') next = 0;\n if (event.key === 'End') next = nodes.length - 1;\n if (nodes[next]) {\n event.preventDefault();\n this.selectNode(nodes[next].id);\n return;\n }\n if (event.key === 'Enter' && !this.readonly && this.selection?.kind === 'node') {\n event.preventDefault();\n this.startTextEdit(this.selection.id);\n return;\n }\n }\n if (this.readonly) return;\n\n if (event.key === 'Escape' && this.activeTool) {\n event.preventDefault();\n this.setActiveTool(null);\n return;\n }\n\n const modKey = event.metaKey || event.ctrlKey;\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 this.deleteSelection();\n }\n }\n\n copySelection() {\n if (!this.selection) return false;\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 const usedIds = new Set(this.documentData.nodes.map((node) => node.id));\n const node = normalizeNode(\n {\n ...this.clipboard.data,\n id: undefined,\n x: this.clipboard.data.x + 24,\n y: this.clipboard.data.y + 24,\n },\n this.documentData.nodes.length,\n usedIds,\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 true;\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.findEdge(edgeId)) {\n this.reconnectEdgeId = edgeId;\n this.select({ kind: 'edge', id: edgeId });\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n }\n\n const nodeTarget = event.target.closest('[data-node-id]');\n if (!nodeTarget || event.target.closest('[data-edge-id]')) return;\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 )\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 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 && !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 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 this.select({ kind: 'node', id: nodeId });\n\n if (!this.readonly) {\n const node = this.findNode(nodeId);\n const world = this.clientToWorld(event.clientX, event.clientY);\n this.interaction = {\n kind: 'drag-node',\n pointerId: event.pointerId,\n nodeId,\n offsetX: world.x - node.x,\n offsetY: world.y - node.y,\n moved: false,\n };\n this.capturePointer(event.pointerId);\n }\n\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 handlePointerMove(event) {\n if (!this.interaction || this.interaction.pointerId !== event.pointerId) return;\n\n if (this.interaction.kind === 'drag-node') {\n const node = this.findNode(this.interaction.nodeId);\n if (!node) return;\n const world = this.clientToWorld(event.clientX, event.clientY);\n const nextX = formatNumber(world.x - this.interaction.offsetX);\n const nextY = formatNumber(world.y - this.interaction.offsetY);\n if (nextX !== node.x || nextY !== node.y) {\n node.x = nextX;\n node.y = nextY;\n this.interaction.moved = true;\n this.renderDraggedNode(node);\n }\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 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 === 'drag-node') {\n if (interaction.moved) {\n this.render({ inspector: true, json: true });\n this.emitChange('node:move', { node: deepClone(this.findNode(interaction.nodeId)) });\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 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 this.selection?.kind === 'node' && this.selection.id === node.id;\n }\n\n getMarkerId(markerType, position, strokeWidth) {\n const width = normalizeEdgeStrokeWidth(strokeWidth);\n const key = `${markerType}:${position}:${width}`;\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)\n : createArrowMarker(markerId, width, position === 'start');\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) {\n return formatNumber(Math.max(EDGE_HIT_STROKE_MIN, this.getEdgeStrokeWidth(edge) + 12));\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.documentData.nodes.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(nextType, original.width + deltaX, original.width);\n }\n if (handle.includes('s')) {\n height = clampNodeHeight(nextType, original.height + deltaY, original.height);\n }\n if (handle.includes('w')) {\n width = clampNodeWidth(nextType, original.width - deltaX, original.width);\n x = original.x + original.width - width;\n }\n if (handle.includes('n')) {\n height = clampNodeHeight(nextType, original.height - deltaY, original.height);\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(formatNumber(viewport.scale * factor), MIN_SCALE, MAX_SCALE);\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 startTextEdit(nodeId) {\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 textarea = createElement('textarea', {\n className: `vd-flowchart-text-editor vd-flowchart-text-editor--${node.type}`,\n value: 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) => {\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' && (event.ctrlKey || event.metaKey)) {\n event.preventDefault();\n this.stopTextEdit({ commit: true });\n this.canvasEl.focus();\n }\n });\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 textarea,\n };\n this.canvasEl.appendChild(textarea);\n this.render({ inspector: true, json: false });\n\n window.requestAnimationFrame(() => {\n if (this.textEditor?.textarea === textarea) {\n textarea.focus();\n textarea.select();\n }\n });\n\n return true;\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 (commit && !this.readonly && nextText !== editor.previousText) {\n this.updateNode(\n editor.nodeId,\n { text: nextText },\n { inspector: true, reason: 'node:update' },\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 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 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 * scale;\n const lineCount = Math.max(1, textarea.value.split(/\\r?\\n/).length);\n const horizontalPadding = (node.type === 'textbox' ? 16 : 12) * scale;\n const verticalPadding =\n node.type === 'textbox' ? 12 * scale : Math.max(4, (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 * scale)}px`;\n textarea.style.lineHeight = `${formatNumber(lineHeight)}px`;\n textarea.style.padding = `${formatNumber(verticalPadding)}px ${formatNumber(horizontalPadding)}px`;\n }\n\n render(options = {}) {\n if (this.destroyed) return;\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 }\n\n renderScene() {\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\n const nodeMap = new Map(this.documentData.nodes.map((node) => [node.id, node]));\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 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) {\n if (edge.startMarker && edge.startMarker !== 'none') {\n pathElement.setAttribute(\n 'marker-start',\n `url(#${this.getMarkerId(edge.startMarker, 'start', this.getEdgeStrokeWidth(edge))})`,\n );\n }\n if (edge.endMarker && edge.endMarker !== 'none') {\n pathElement.setAttribute(\n 'marker-end',\n `url(#${this.getMarkerId(edge.endMarker, 'end', this.getEdgeStrokeWidth(edge))})`,\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 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 strokeWidth = this.getEdgeStrokeWidth(edge);\n\n if (selected) {\n group.appendChild(\n svgEl('path', {\n class: 'vd-flowchart-edge-selection',\n d: edgePath.d,\n 'stroke-width': 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);\n\n const hitPath = svgEl('path', {\n class: 'vd-flowchart-edge-hit',\n d: edgePath.d,\n 'stroke-width': this.getEdgeHitStrokeWidth(edge),\n 'data-edge-id': edge.id,\n });\n\n group.appendChild(visiblePath);\n group.appendChild(hitPath);\n\n if (edge.label) {\n const label = svgEl('text', {\n class: 'vd-flowchart-edge-label',\n x: edgePath.labelX,\n y: edgePath.labelY - 8,\n 'text-anchor': 'middle',\n 'data-edge-id': edge.id,\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 edgePath = buildEdgePath({\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 return svgEl('path', {\n class: 'vd-flowchart-preview-path',\n d: edgePath.d,\n 'stroke-width': this.getEdgeStrokeWidth(interaction),\n });\n }\n\n renderNode(node) {\n const selected = this.selection?.kind === 'node' && this.selection.id === node.id;\n const dragging = this.interaction?.kind === 'drag-node' && this.interaction.nodeId === 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 hitbox = svgEl('rect', {\n x: 0,\n y: 0,\n width: node.width,\n height: node.height,\n rx:\n node.type === 'rounded-rect' || node.type === 'textbox'\n ? 16\n : node.type === 'junction'\n ? node.width / 2\n : 6,\n fill: 'transparent',\n 'data-node-id': node.id,\n });\n group.appendChild(hitbox);\n group.appendChild(this.renderNodeShape(node));\n group.appendChild(this.renderNodeText(node));\n\n if (selected && !this.readonly && isNodeResizable(node)) {\n group.appendChild(this.renderResizeControls(node));\n }\n\n const scale = this.documentData.viewport.scale || 1;\n FLOWCHART_PORTS.forEach((port) => {\n const position = getPortPosition({ ...node, x: 0, y: 0 }, port);\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 group.appendChild(portGroup);\n });\n\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 = 9 / 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 position = getResizeHandlePosition(node, handle);\n const dotOffset = 8 / scale;\n if (handle.includes('e')) position.x += dotOffset;\n if (handle.includes('w')) position.x -= dotOffset;\n if (handle.includes('n')) position.y -= dotOffset;\n if (handle.includes('s')) position.y += dotOffset;\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 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 / 3,\n ry: handleSize / 3,\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 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 if (node.type === 'textbox') {\n const lines = wrapText(node.text, estimateChars(node.width - 32));\n const { lineHeight } = getNodeFontMetrics(node);\n lines.forEach((line, index) => {\n const span = svgEl('tspan', {\n x: 16,\n y: 28 + index * lineHeight,\n });\n span.textContent = line;\n textElement.appendChild(span);\n });\n return textElement;\n }\n\n const lines = wrapText(node.text, estimateChars(node.width));\n const { lineHeight } = getNodeFontMetrics(node);\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: 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.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(MIN_NODE_SIZE));\n widthInput.setAttribute('max', String(MAX_NODE_SIZE));\n\n const heightInput = createElement('input', { value: node.height, type: 'number' });\n heightInput.setAttribute('data-field', 'node-height');\n heightInput.setAttribute('min', String(MIN_NODE_SIZE));\n heightInput.setAttribute('max', String(MAX_NODE_SIZE));\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 const previousKey = this.selection ? `${this.selection.kind}:${this.selection.id}` : '';\n const nextKey = next ? `${next.kind}:${next.id}` : '';\n\n this.selection = next;\n if (previousKey !== nextKey) {\n this.render({ scene: true, inspector: true, json: false });\n this.emit('select', { selection: this.getSelectionSnapshot() });\n return;\n }\n\n this.render({ scene: true, inspector: false, json: false });\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 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 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 canCoalesce =\n Boolean(top) &&\n this.historyIndex === this.history.length - 1 &&\n COALESCING_REASONS.has(reason) &&\n top.reason === reason &&\n top.targetKey === targetKey;\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);\n this.documentData.viewport = normalizeViewport(currentViewport);\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 );\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 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 // 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);\n node.height = clampNodeHeight(nextType, patch.height, node.height);\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.selection.kind === 'node') return this.removeNode(this.selection.id);\n return this.removeEdge(this.selection.id);\n }\n\n setViewport(viewport) {\n this.documentData.viewport = normalizeViewport(viewport);\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 });\n this.render({ inspector: false, json: true });\n this.emitViewportChange('viewport:reset');\n return this;\n }\n\n fitView() {\n if (!this.documentData.nodes.length) {\n return this.resetView();\n }\n\n const bounds = getBounds(this.documentData.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 = clamp(\n Math.min((width - padding * 2) / contentWidth, (height - padding * 2) / contentHeight),\n MIN_SCALE,\n MAX_SCALE,\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: formatNumber(scale),\n };\n\n this.render({ inspector: false, json: true });\n this.emitViewportChange('viewport:fit');\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 nodes: [],\n edges: [],\n viewport: { x: 0, y: 0, scale: 1 },\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 ('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 this.updateHistoryButtons();\n return this;\n }\n\n load(data, options = {}) {\n const documentData = normalizeDocument(data);\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 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": ["
|
|
3
|
+
"sources": ["../src/vue.js", "../src/layout.js", "../src/mindmap.js", "../src/core.js"],
|
|
4
|
+
"sourcesContent": ["/**\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": ["queue", "node", "edge", "distanceToBounds", "lines", "startY", "ref", "VdFlowchart"]
|
|
7
7
|
}
|