@vanduo-oss/vd3-cbun 1.0.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.
Files changed (45) hide show
  1. package/CHANGELOG.md +50 -0
  2. package/LICENSE +22 -0
  3. package/README.md +160 -0
  4. package/SKILL.md +119 -0
  5. package/dist/charts/core.d.ts +273 -0
  6. package/dist/charts/index.cjs +1828 -0
  7. package/dist/charts/index.cjs.map +7 -0
  8. package/dist/charts/index.d.ts +65 -0
  9. package/dist/charts/index.js +1805 -0
  10. package/dist/charts/index.js.map +7 -0
  11. package/dist/charts/vd3-charts.css +51 -0
  12. package/dist/charts/vue.d.ts +86 -0
  13. package/dist/flowchart/core.d.ts +288 -0
  14. package/dist/flowchart/index.cjs +3447 -0
  15. package/dist/flowchart/index.cjs.map +7 -0
  16. package/dist/flowchart/index.d.ts +54 -0
  17. package/dist/flowchart/index.js +3424 -0
  18. package/dist/flowchart/index.js.map +7 -0
  19. package/dist/flowchart/vd3-flowchart.css +600 -0
  20. package/dist/flowchart/vue.d.ts +66 -0
  21. package/dist/hex-grid/core.d.ts +200 -0
  22. package/dist/hex-grid/hex-math.cjs +162 -0
  23. package/dist/hex-grid/hex-math.cjs.map +7 -0
  24. package/dist/hex-grid/hex-math.d.ts +119 -0
  25. package/dist/hex-grid/hex-math.js +141 -0
  26. package/dist/hex-grid/hex-math.js.map +7 -0
  27. package/dist/hex-grid/index.cjs +915 -0
  28. package/dist/hex-grid/index.cjs.map +7 -0
  29. package/dist/hex-grid/index.d.ts +15 -0
  30. package/dist/hex-grid/index.js +894 -0
  31. package/dist/hex-grid/index.js.map +7 -0
  32. package/dist/hex-grid/vue.d.ts +14 -0
  33. package/dist/index.d.ts +13 -0
  34. package/dist/index.js +11 -0
  35. package/dist/index.js.map +7 -0
  36. package/dist/meta.json +551 -0
  37. package/dist/music-player/core.d.ts +88 -0
  38. package/dist/music-player/index.cjs +1227 -0
  39. package/dist/music-player/index.cjs.map +7 -0
  40. package/dist/music-player/index.d.ts +12 -0
  41. package/dist/music-player/index.js +1204 -0
  42. package/dist/music-player/index.js.map +7 -0
  43. package/dist/music-player/vd3-music-player.css +829 -0
  44. package/dist/music-player/vue.d.ts +32 -0
  45. package/package.json +105 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/flowchart/index.js", "../../src/flowchart/vue.js", "../../src/flowchart/layout.js", "../../src/flowchart/core.js"],
4
+ "sourcesContent": ["// Entry for @vanduo-oss/vd3-cbun/flowchart.\n//\n// The Vue 3 wrapper is the primary export; the framework-agnostic editor core\n// (1.2.0 lineage) is re-exported alongside as VdFlowchartCore. Named exports\n// only \u2014 no default.\n\nexport { VdFlowchart } from './vue.js';\nexport {\n VdFlowchart as VdFlowchartCore,\n computeLayout,\n LAYOUT_MODES,\n VD_FLOWCHART_VERSION,\n FLOWCHART_NODE_TYPES,\n FLOWCHART_PORTS,\n FLOWCHART_EDGE_MARKERS,\n FLOWCHART_EDGE_ROUTES,\n} from './core.js';\n", "/**\n * Vue 3 bindings for the flowchart component \u2014 the primary export surface.\n *\n * import { VdFlowchart } from '@vanduo-oss/vd3-cbun/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 // Data flows through load(); construct-time options recreate the editor.\n watch(\n () => props.data,\n (next) => {\n if (instance && typeof instance.load === 'function') {\n instance.load(next, { preserveSelection: props.preserveSelection });\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.destroy();\n create();\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-cbun 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';\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;\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.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 rect' },\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 normalizeDocument(input) {\n let source = input;\n if (typeof source === 'string') {\n try {\n source = JSON.parse(source);\n } catch {\n source = {};\n }\n }\n\n if (!isPlainObject(source)) {\n source = {};\n }\n\n const usedNodeIds = new Set();\n const nodes = (Array.isArray(source.nodes) ? source.nodes : []).map((node, index) =>\n normalizeNode(node, index, usedNodeIds),\n );\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 .map((edge, index) => normalizeEdge(edge, index, nodeIds, usedEdgeIds))\n .filter(Boolean);\n\n return {\n version: VD_FLOWCHART_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 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.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 const toolbarLeft = createElement('div', { className: 'vd-flowchart-toolbar-group' });\n const toolbarRight = createElement('div', { className: 'vd-flowchart-toolbar-group' });\n\n this.zoomOutButton = createElement('button', { className: 'vd-flowchart-btn', text: '-' });\n this.zoomOutButton.setAttribute('data-flowchart-action', 'zoom-out');\n this.zoomOutButton.setAttribute('type', 'button');\n\n this.zoomInButton = createElement('button', { className: 'vd-flowchart-btn', text: '+' });\n this.zoomInButton.setAttribute('data-flowchart-action', 'zoom-in');\n this.zoomInButton.setAttribute('type', 'button');\n\n this.resetViewButton = createElement('button', {\n className: 'vd-flowchart-btn',\n text: 'Reset',\n });\n this.resetViewButton.setAttribute('data-flowchart-action', 'reset-view');\n this.resetViewButton.setAttribute('type', 'button');\n\n this.fitViewButton = createElement('button', { className: 'vd-flowchart-btn', text: 'Fit' });\n this.fitViewButton.setAttribute('data-flowchart-action', 'fit-view');\n this.fitViewButton.setAttribute('type', 'button');\n\n this.undoButton = createElement('button', {\n className: 'vd-flowchart-btn',\n text: '\u21B6',\n title: 'Undo',\n disabled: true,\n });\n this.undoButton.setAttribute('data-flowchart-action', 'undo');\n this.undoButton.setAttribute('type', 'button');\n this.undoButton.setAttribute('aria-label', 'Undo');\n\n this.redoButton = createElement('button', {\n className: 'vd-flowchart-btn',\n text: '\u21B7',\n title: 'Redo',\n disabled: true,\n });\n this.redoButton.setAttribute('data-flowchart-action', 'redo');\n this.redoButton.setAttribute('type', 'button');\n this.redoButton.setAttribute('aria-label', 'Redo');\n\n this.arrangeSelect = createElement('select', {\n className: 'vd-flowchart-btn vd-flowchart-arrange',\n disabled: this.readonly,\n });\n this.arrangeSelect.setAttribute('aria-label', 'Auto-arrange layout');\n this.arrangeSelect.setAttribute('data-flowchart-arrange', '');\n [\n { value: '', label: 'Arrange \u25BE' },\n { value: 'tree', label: 'Tree' },\n { value: 'radial', label: 'Radial' },\n { value: 'grid', label: 'Grid' },\n ].forEach((item, index) => {\n const option = createElement('option', { value: item.value, text: item.label });\n option.value = item.value;\n if (index === 0) option.disabled = true;\n this.arrangeSelect.appendChild(option);\n });\n this.arrangeSelect.selectedIndex = 0;\n\n this.clearButton = createElement('button', {\n className: 'vd-flowchart-btn',\n text: 'Clear',\n disabled: this.readonly,\n });\n this.clearButton.setAttribute('data-flowchart-action', 'clear');\n this.clearButton.setAttribute('type', 'button');\n\n this.zoomLabel = createElement('span', {\n className: 'vd-flowchart-toolbar-label',\n text: '100%',\n });\n\n toolbarLeft.appendChild(this.zoomOutButton);\n toolbarLeft.appendChild(this.zoomInButton);\n toolbarLeft.appendChild(this.resetViewButton);\n toolbarLeft.appendChild(this.fitViewButton);\n toolbarLeft.appendChild(this.undoButton);\n toolbarLeft.appendChild(this.redoButton);\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 & tools' }),\n );\n this.paletteGrid = createElement('div', { className: 'vd-flowchart-palette' });\n FLOWCHART_PALETTE_ITEMS.forEach((item) => {\n const button = createElement('button', {\n className: 'vd-flowchart-palette-btn',\n });\n button.setAttribute('type', 'button');\n if (item.kind === 'tool') {\n button.setAttribute('data-tool', item.tool);\n button.setAttribute('aria-label', `Use ${item.label}`);\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.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.element.appendChild(this.root);\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 button.classList.toggle('is-active', Boolean(tool) && tool === this.activeTool);\n });\n this.canvasEl.classList.toggle('is-arrow-tool', arrowArmed);\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 (mode) this.layout(mode);\n event.target.selectedIndex = 0;\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 this.load(this.jsonTextarea.value);\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 (this.readonly) return;\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.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.render({ inspector: false, json: false });\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 return;\n }\n if (event.key === 'Enter' && (event.ctrlKey || event.metaKey)) {\n event.preventDefault();\n this.stopTextEdit({ commit: true });\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 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\n this.documentData.edges.forEach((edge) => {\n const edgeElement = this.renderEdge(edge, nodeMap);\n if (edgeElement) this.edgesLayer.appendChild(edgeElement);\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 this.nodesLayer.appendChild(this.renderNode(node));\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 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 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 load(data, options = {}) {\n this.stopTextEdit({ commit: false });\n this.activeTool = null;\n this.reconnectEdgeId = null;\n const previousSelection = this.selection;\n this.documentData = normalizeDocument(data);\n this.selection = this.resolvePreservedSelection(previousSelection, options.preserveSelection);\n this.render();\n this.emitChange('load');\n return this;\n }\n\n toJSON() {\n return deepClone({\n version: VD_FLOWCHART_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.element.innerHTML = '';\n this.element.classList.remove('vd-flowchart-host');\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["VdFlowchart", "usedIds", "node", "edge", "distanceToBounds", "lines", "lineHeight", "ref", "VdFlowchart"]
7
+ }