@pixerate/editor-svelte 0.5.2 → 0.5.4

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.
@@ -664,6 +664,14 @@ var linearTrajectory = (origin, target, progress) => {
664
664
  opacity: Math.min(1, progress * 1.5)
665
665
  };
666
666
  };
667
+ var linearPositionTrajectory = (origin, target, progress) => {
668
+ return {
669
+ position: {
670
+ x: origin.x + (target.x - origin.x) * progress,
671
+ y: origin.y + (target.y - origin.y) * progress
672
+ }
673
+ };
674
+ };
667
675
  function createFanOutTrajectory(options = {}) {
668
676
  const {
669
677
  curvature = 0.4,
@@ -747,6 +755,8 @@ function runMultiNodeTransition(transitions, options = {}) {
747
755
  }
748
756
  if (point.opacity !== void 0) {
749
757
  item.node.data.opacity = point.opacity;
758
+ const currentStyle = (item.node.style || "").replace(/opacity:\s*[^;]+;?/g, "").trim();
759
+ item.node.style = `${currentStyle ? currentStyle + "; " : ""}opacity: ${point.opacity};`;
750
760
  }
751
761
  }
752
762
  if (rawProgress < 1) {
@@ -1033,6 +1043,12 @@ function createCanvasExplosion(graph, options = {}) {
1033
1043
  if (!child.data) child.data = {};
1034
1044
  child.data.scale = 0;
1035
1045
  child.data.opacity = 0;
1046
+ const currentStyle = (child.style || "").replace(/opacity:\s*[^;]+;?/g, "").trim();
1047
+ child.style = `${currentStyle ? currentStyle + "; " : ""}opacity: 0;`;
1048
+ });
1049
+ edgesToAdd.forEach((edge) => {
1050
+ const currentStyle = (edge.style || "").replace(/opacity:\s*[^;]+;?/g, "").trim();
1051
+ edge.style = `${currentStyle ? currentStyle + "; " : ""}opacity: 0;`;
1036
1052
  });
1037
1053
  graph.addNodeOrNodes(childNodes, void 0, false);
1038
1054
  if (edgesToAdd.length > 0) {
@@ -1061,7 +1077,7 @@ function createCanvasExplosion(graph, options = {}) {
1061
1077
  node,
1062
1078
  from: { ...node.position },
1063
1079
  to: targetPos,
1064
- trajectory: linearTrajectory,
1080
+ trajectory: linearPositionTrajectory,
1065
1081
  duration,
1066
1082
  easing
1067
1083
  });
@@ -1074,10 +1090,56 @@ function createCanvasExplosion(graph, options = {}) {
1074
1090
  defaultDuration: duration,
1075
1091
  defaultEasing: easing,
1076
1092
  onUpdate: () => {
1093
+ if (edgesToAdd.length > 0) {
1094
+ const childIdSet = new Set(childNodes.map((c) => c.id));
1095
+ const childEdgesInGraph = graph.edges.filter((e) => childIdSet.has(e.target));
1096
+ if (childEdgesInGraph.length > 0) {
1097
+ childEdgesInGraph.forEach((edge) => {
1098
+ const child = childNodes.find((c) => c.id === edge.target);
1099
+ const childOpacity = child?.data?.opacity ?? 1;
1100
+ const currentStyle = (edge.style || "").replace(/opacity:\s*[^;]+;?/g, "").trim();
1101
+ edge.style = `${currentStyle ? currentStyle + "; " : ""}opacity: ${childOpacity};`;
1102
+ });
1103
+ graph.setEdges([...graph.edges]);
1104
+ }
1105
+ }
1106
+ transitions.forEach((t) => {
1107
+ const graphNode = graph.nodes.find((n) => n.id === t.node.id);
1108
+ if (graphNode && graphNode !== t.node) {
1109
+ graphNode.position = { ...t.node.position };
1110
+ graphNode.style = t.node.style;
1111
+ if (t.node.data) {
1112
+ graphNode.data = { ...graphNode.data, ...t.node.data };
1113
+ }
1114
+ }
1115
+ });
1077
1116
  graph.setNodes([...graph.nodes]);
1078
1117
  },
1079
1118
  onComplete: () => {
1119
+ childNodes.forEach((child, i) => {
1120
+ const node = graph.nodes.find((n) => n.id === child.id);
1121
+ if (node) {
1122
+ node.position = { ...targetPositions[i] };
1123
+ node.style = (node.style || "").replace(/opacity:\s*[^;]+;?/g, "").trim() || void 0;
1124
+ if (node.data) {
1125
+ node.data.opacity = 1;
1126
+ }
1127
+ }
1128
+ });
1129
+ displacementMap.forEach((targetPos, nodeId) => {
1130
+ const graphNode = graph.nodes.find((n) => n.id === nodeId);
1131
+ if (graphNode) {
1132
+ graphNode.position = { ...targetPos };
1133
+ }
1134
+ });
1135
+ edgesToAdd.forEach((edge) => {
1136
+ const graphEdge = graph.edges.find((e) => e.id === edge.id);
1137
+ if (graphEdge) {
1138
+ graphEdge.style = (graphEdge.style || "").replace(/opacity:\s*[^;]+;?/g, "").trim() || void 0;
1139
+ }
1140
+ });
1080
1141
  graph.setNodes([...graph.nodes]);
1142
+ graph.setEdges([...graph.edges]);
1081
1143
  $5.set(explodedNodeIds, [...$5.get(explodedNodeIds), parentId], true);
1082
1144
  activeAnimationCancel = null;
1083
1145
  options.onSave?.();
@@ -1135,7 +1197,7 @@ function createCanvasExplosion(graph, options = {}) {
1135
1197
  node,
1136
1198
  from: { ...node.position },
1137
1199
  to: originalPosition,
1138
- trajectory: linearTrajectory,
1200
+ trajectory: linearPositionTrajectory,
1139
1201
  duration,
1140
1202
  easing
1141
1203
  });
@@ -1148,6 +1210,27 @@ function createCanvasExplosion(graph, options = {}) {
1148
1210
  defaultDuration: duration,
1149
1211
  defaultEasing: easing,
1150
1212
  onUpdate: () => {
1213
+ const edgeIdSet = new Set(snapshot.childEdgeIds);
1214
+ const childEdgesInGraph = graph.edges.filter((e) => edgeIdSet.has(e.id));
1215
+ if (childEdgesInGraph.length > 0) {
1216
+ childEdgesInGraph.forEach((edge) => {
1217
+ const child = activeChildNodes.find((c) => c.id === edge.target);
1218
+ const childOpacity = child?.data?.opacity ?? 0;
1219
+ const currentStyle = (edge.style || "").replace(/opacity:\s*[^;]+;?/g, "").trim();
1220
+ edge.style = `${currentStyle ? currentStyle + "; " : ""}opacity: ${childOpacity};`;
1221
+ });
1222
+ graph.setEdges([...graph.edges]);
1223
+ }
1224
+ transitions.forEach((t) => {
1225
+ const graphNode = graph.nodes.find((n) => n.id === t.node.id);
1226
+ if (graphNode && graphNode !== t.node) {
1227
+ graphNode.position = { ...t.node.position };
1228
+ graphNode.style = t.node.style;
1229
+ if (t.node.data) {
1230
+ graphNode.data = { ...graphNode.data, ...t.node.data };
1231
+ }
1232
+ }
1233
+ });
1151
1234
  graph.setNodes([...graph.nodes]);
1152
1235
  },
1153
1236
  onComplete: () => {
@@ -1157,6 +1240,13 @@ function createCanvasExplosion(graph, options = {}) {
1157
1240
  if (edgesToRemove.length > 0) {
1158
1241
  graph.removeEdges(edgesToRemove, false);
1159
1242
  }
1243
+ snapshot.displacedNodes.forEach(({ id, originalPosition }) => {
1244
+ const graphNode = graph.nodes.find((n) => n.id === id);
1245
+ if (graphNode) {
1246
+ graphNode.position = { ...originalPosition };
1247
+ }
1248
+ });
1249
+ graph.setNodes([...graph.nodes]);
1160
1250
  snapshots.delete(parentId);
1161
1251
  $5.set(explodedNodeIds, $5.get(explodedNodeIds).filter((id) => id !== parentId), true);
1162
1252
  activeAnimationCancel = null;
@@ -1207,6 +1297,7 @@ export {
1207
1297
  isEventFromTextInput,
1208
1298
  isValidCanvasNode,
1209
1299
  isValidUrl,
1300
+ linearPositionTrajectory,
1210
1301
  linearTrajectory,
1211
1302
  miroCompatiblePreset,
1212
1303
  replaceNodeInGraph,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/canvas/createCanvasGraph.svelte.ts","../../src/canvas/createCanvasLayout.ts","../../src/canvas/createCanvasClipboard.svelte.ts","../../src/canvas/createCanvasDocking.svelte.ts","../../src/canvas/createCanvasShortcuts.ts","../../src/canvas/createCanvasInteractions.svelte.ts","../../src/canvas/createCanvasTrajectory.ts","../../src/canvas/createCanvasDisplacement.ts","../../src/canvas/createCanvasExplosion.svelte.ts"],"sourcesContent":["import { cubicOut } from \"svelte/easing\";\nexport function calculateGraphDifferences(currentState, baselineState) {\n const currentNodes = currentState.nodes ?? [];\n const currentEdges = currentState.edges ?? [];\n const baselineNodes = baselineState.nodes ?? [];\n const baselineEdges = baselineState.edges ?? [];\n const baselineNodeMap = new Map(baselineNodes.map((n) => [n.id, n]));\n const baselineEdgeMap = new Map(baselineEdges.map((e) => [e.id, e]));\n const currentNodeMap = new Map(currentNodes.map((n) => [n.id, n]));\n const currentEdgeMap = new Map(currentEdges.map((e) => [e.id, e]));\n const removedNodes = baselineNodes.filter((oldNode) => !currentNodeMap.has(oldNode.id));\n const removedEdges = baselineEdges.filter((oldEdge) => !currentEdgeMap.has(oldEdge.id));\n const changedNodes = currentNodes.filter((newNode) => {\n const oldNode = baselineNodeMap.get(newNode.id);\n if (!oldNode) return true;\n return JSON.stringify(newNode) !== JSON.stringify(oldNode);\n });\n const changedEdges = currentEdges.filter((newEdge) => {\n const oldEdge = baselineEdgeMap.get(newEdge.id);\n if (!oldEdge) return true;\n return JSON.stringify(newEdge) !== JSON.stringify(oldEdge);\n });\n return { changedNodes, changedEdges, removedNodes, removedEdges };\n}\nexport function replaceNodeInGraph(nodes, edges, oldNode, newNode, keepEdges = false) {\n const updatedNodes = nodes.map((n) => n.id === oldNode.id ? newNode : n);\n if (!keepEdges) {\n return { nodes: updatedNodes, edges };\n }\n const updatedEdges = edges.map((edge) => {\n if (edge.source === oldNode.id || edge.target === oldNode.id) {\n return {\n ...edge,\n id: crypto.randomUUID(),\n source: edge.source === oldNode.id ? newNode.id : edge.source,\n target: edge.target === oldNode.id ? newNode.id : edge.target\n };\n }\n return edge;\n });\n return {\n nodes: updatedNodes,\n edges: updatedEdges\n };\n}\nexport function createCanvasGraph(options = {}) {\n let nodes = $state.raw(options.initialNodes ?? []);\n let edges = $state.raw(options.initialEdges ?? []);\n function setNodes(newNodes, triggerCallback = true) {\n nodes = newNodes;\n if (triggerCallback) {\n options.onNodesChange?.(nodes);\n }\n }\n function setEdges(newEdges, triggerCallback = true) {\n edges = newEdges;\n if (triggerCallback) {\n options.onEdgesChange?.(edges);\n }\n }\n function animateNodePosition(node, targetPosition, duration = 400, easing = cubicOut) {\n const delay = node.data?.animationDelay ?? 0;\n const startPosition = { ...node.position };\n const startTime = Date.now() + delay;\n function step() {\n const currentTime = Date.now();\n if (currentTime < startTime) {\n if (typeof requestAnimationFrame !== \"undefined\") {\n requestAnimationFrame(step);\n }\n return;\n }\n const progress = Math.min((currentTime - startTime) / duration, 1);\n const eased = easing(progress);\n const currentPos = {\n x: startPosition.x + (targetPosition.x - startPosition.x) * eased,\n y: startPosition.y + (targetPosition.y - startPosition.y) * eased\n };\n const targetNode = nodes.find((n) => n.id === node.id);\n if (targetNode) {\n targetNode.position = currentPos;\n }\n if (progress < 1) {\n if (typeof requestAnimationFrame !== \"undefined\") {\n requestAnimationFrame(step);\n }\n } else {\n setNodes([...nodes]);\n }\n }\n step();\n }\n function addNodeOrNodes(nodeOrNodesToAdd, animateFromPosition, save = true) {\n const toAdd = Array.isArray(nodeOrNodesToAdd) ? nodeOrNodesToAdd : [nodeOrNodesToAdd];\n const existingMap = new Map(nodes.map((n) => [n.id, n]));\n toAdd.forEach((node) => {\n if (!existingMap.has(node.id)) {\n existingMap.set(node.id, node);\n }\n });\n setNodes(Array.from(existingMap.values()));\n if (animateFromPosition) {\n toAdd.forEach((node) => {\n const target = { ...node.position };\n node.position = { ...animateFromPosition };\n animateNodePosition(node, target);\n });\n }\n if (save) options.onSave?.();\n }\n function addEdge(edgeToAdd, save = true) {\n setEdges([...edges, edgeToAdd]);\n if (save) options.onSave?.();\n }\n function addEdges(edgesToAdd, save = true) {\n setEdges([...edges, ...edgesToAdd]);\n if (save) options.onSave?.();\n }\n function removeNodes(nodesToRemove, save = true) {\n const idsToRemove = new Set(nodesToRemove.map((n) => n.id));\n setNodes(nodes.filter((n) => !idsToRemove.has(n.id)));\n if (save) options.onSave?.();\n }\n function removeEdges(edgesToRemove, save = true) {\n const idsToRemove = new Set(edgesToRemove.map((e) => e.id));\n setEdges(edges.filter((e) => !idsToRemove.has(e.id)));\n if (save) options.onSave?.();\n }\n function replaceNode(oldNode, newNode, save = true, keepEdges = false) {\n const result = replaceNodeInGraph(nodes, edges, oldNode, newNode, keepEdges);\n setNodes(result.nodes);\n if (result.edges !== edges) {\n setEdges(result.edges);\n }\n if (save) options.onSave?.();\n }\n function addConnectedNodes(params) {\n const {\n nodesToAdd,\n inboundNodes = [],\n outboundNodes = [],\n animatedEdges = false,\n animateFromPosition,\n inboundEdgeData = {},\n outboundEdgeData = {},\n getEdgeLabel\n } = params;\n const defaultCreateEdge = (sourceId, targetId, opt) => {\n if (options.createEdge) {\n return options.createEdge(sourceId, targetId, opt);\n }\n return {\n id: crypto.randomUUID(),\n type: \"default\",\n source: sourceId,\n target: targetId,\n label: opt?.label ?? \"\",\n animated: opt?.animated ?? false,\n data: opt?.data ?? {}\n };\n };\n nodesToAdd.forEach((addedNode) => {\n addNodeOrNodes(addedNode, animateFromPosition, false);\n inboundNodes.forEach((sourceNode) => {\n const label = getEdgeLabel ? getEdgeLabel(sourceNode, addedNode) : \"\";\n addEdge(\n defaultCreateEdge(sourceNode.id, addedNode.id, {\n label,\n animated: animatedEdges,\n data: inboundEdgeData\n }),\n false\n );\n });\n outboundNodes.forEach((targetNode) => {\n const label = getEdgeLabel ? getEdgeLabel(addedNode, targetNode) : \"\";\n addEdge(\n defaultCreateEdge(addedNode.id, targetNode.id, {\n label,\n animated: animatedEdges,\n data: outboundEdgeData\n }),\n false\n );\n });\n });\n options.onSave?.();\n }\n function getDifferences(baseline) {\n return calculateGraphDifferences({ nodes, edges }, baseline);\n }\n return {\n get nodes() {\n return nodes;\n },\n set nodes(val) {\n setNodes(val);\n },\n get edges() {\n return edges;\n },\n set edges(val) {\n setEdges(val);\n },\n setNodes,\n setEdges,\n addNodeOrNodes,\n addEdge,\n addEdges,\n removeNodes,\n removeEdges,\n replaceNode,\n addConnectedNodes,\n animateNodePosition,\n getDifferences\n };\n}\n","import dagre from '@dagrejs/dagre';\nimport { Position, type XYPosition, type Rect } from '@xyflow/svelte';\nimport type { CanvasNode, CanvasEdge, CanvasLayoutOptions } from './types.js';\n\n/**\n * Calculates upper-left flow coordinate for an element to be centered in the viewport.\n */\nexport function getCenteredNodePosition(\n\twidth = 0,\n\theight = 0,\n\tscreenToFlowPosition: (position: XYPosition) => XYPosition,\n\tscreenDimensions?: { width: number; height: number }\n): XYPosition {\n\tconst rect = screenDimensions ?? (typeof document !== 'undefined'\n\t\t? { width: document.documentElement.clientWidth, height: document.documentElement.clientHeight }\n\t\t: { width: 1920, height: 1080 });\n\n\tconst flowPos = screenToFlowPosition({ x: rect.width / 2, y: rect.height / 2 });\n\treturn {\n\t\tx: flowPos.x - width / 2,\n\t\ty: flowPos.y - height / 2\n\t};\n}\n\n/**\n * Updates positions of nodes so their collective bounding box is centered in the current viewport.\n */\nexport function centerNodes<TNode extends CanvasNode = CanvasNode>(\n\tnodes: TNode[],\n\tscreenToFlowPosition: (position: XYPosition) => XYPosition,\n\tgetNodesBounds: (nodes: TNode[]) => Rect,\n\tscreenDimensions?: { width: number; height: number }\n): TNode[] {\n\tif (nodes.length === 0) {\n\t\treturn [];\n\t}\n\n\tconst bounds = getNodesBounds(nodes);\n\tconst boundingBoxOrigin = { x: bounds.x, y: bounds.y };\n\n\tconst centeredPosition = getCenteredNodePosition(\n\t\tbounds.width,\n\t\tbounds.height,\n\t\tscreenToFlowPosition,\n\t\tscreenDimensions\n\t);\n\n\tconst deltaX = centeredPosition.x - boundingBoxOrigin.x;\n\tconst deltaY = centeredPosition.y - boundingBoxOrigin.y;\n\n\treturn nodes.map((node) => ({\n\t\t...node,\n\t\tposition: {\n\t\t\tx: node.position.x + deltaX,\n\t\t\ty: node.position.y + deltaY\n\t\t}\n\t}));\n}\n\n/**\n * Automatically calculates directed hierarchical layout of nodes and edges using Dagre.\n */\nexport function getLayoutedNodes<\n\tTNode extends CanvasNode = CanvasNode,\n\tTEdge extends CanvasEdge = CanvasEdge\n>(\n\tnodes: TNode[],\n\tedges: TEdge[],\n\tgetNodesBounds: (nodes: TNode[]) => Rect,\n\toptions: CanvasLayoutOptions = {}\n): TNode[] {\n\tif (nodes.length === 0) return [];\n\n\tconst {\n\t\tdirection = 'LR',\n\t\tranksep = 100,\n\t\tnodesep = 25,\n\t\tdefaultNodeWidth = 200,\n\t\tdefaultNodeHeight = 200\n\t} = options;\n\n\tconst isHorizontal = direction === 'LR' || direction === 'RL';\n\tconst bounds = getNodesBounds(nodes);\n\n\tconst dagreGraph = new dagre.graphlib.Graph();\n\tdagreGraph.setDefaultEdgeLabel(() => ({}));\n\tdagreGraph.setGraph({ rankdir: direction, ranksep, nodesep });\n\n\tconst nodeIds = new Set(nodes.map((node) => node.id));\n\n\tnodes.forEach((node) => {\n\t\tconst nodeWidth = node.measured?.width ?? (node as any).width ?? defaultNodeWidth;\n\t\tconst nodeHeight = node.measured?.height ?? (node as any).height ?? defaultNodeHeight;\n\t\tdagreGraph.setNode(node.id, { width: nodeWidth, height: nodeHeight });\n\t});\n\n\tedges.forEach((edge) => {\n\t\tif (nodeIds.has(edge.source) && nodeIds.has(edge.target)) {\n\t\t\tdagreGraph.setEdge(edge.source, edge.target);\n\t\t}\n\t});\n\n\tdagre.layout(dagreGraph);\n\n\treturn nodes.map((node) => {\n\t\tconst nodeWithPosition = dagreGraph.node(node.id);\n\t\tconst nodeWidth = node.measured?.width ?? (node as any).width ?? defaultNodeWidth;\n\t\tconst nodeHeight = node.measured?.height ?? (node as any).height ?? defaultNodeHeight;\n\n\t\treturn {\n\t\t\t...node,\n\t\t\ttargetPosition: isHorizontal ? Position.Left : Position.Top,\n\t\t\tsourcePosition: isHorizontal ? Position.Right : Position.Bottom,\n\t\t\tposition: {\n\t\t\t\tx: bounds.x + (nodeWithPosition?.x ?? 0) - nodeWidth / 2,\n\t\t\t\ty: bounds.y + (nodeWithPosition?.y ?? 0) - nodeHeight / 2\n\t\t\t}\n\t\t};\n\t});\n}\n","import { tick } from \"svelte\";\nexport function isEventFromTextInput(event) {\n const target = event.target;\n if (!target) return false;\n if (target.tagName === \"INPUT\" || target.tagName === \"TEXTAREA\" || target.tagName === \"SELECT\" || target.isContentEditable || target.closest?.('[contenteditable=\"true\"]') || target.closest?.(\".ProseMirror\")) {\n return true;\n }\n return false;\n}\nexport function isValidCanvasNode(obj) {\n return typeof obj === \"object\" && obj !== null && \"id\" in obj && typeof obj.id === \"string\" && \"position\" in obj && typeof obj.position === \"object\" && obj.position !== null && \"x\" in obj.position && \"y\" in obj.position;\n}\nexport function isValidUrl(url) {\n try {\n const parsed = new URL(url);\n return parsed.protocol === \"http:\" || parsed.protocol === \"https:\";\n } catch {\n return false;\n }\n}\nexport function createCanvasClipboard(options = {}) {\n function copySelectedNodes(selectedNodes, connectedEdges, event) {\n if (event && isEventFromTextInput(event)) {\n return false;\n }\n if (selectedNodes.length === 0) return false;\n const payload = {\n version: 1,\n nodes: selectedNodes,\n edges: connectedEdges\n };\n const serialized = JSON.stringify(payload);\n if (event?.clipboardData) {\n event.clipboardData.setData(\"application/json\", serialized);\n event.clipboardData.setData(\"text/plain\", serialized);\n event.preventDefault();\n } else if (typeof navigator !== \"undefined\" && navigator.clipboard) {\n navigator.clipboard.writeText(serialized).catch(() => {\n });\n }\n return true;\n }\n function cutSelectedNodes(selectedNodes, connectedEdges, onRemove, event) {\n if (event && isEventFromTextInput(event)) {\n return false;\n }\n const copied = copySelectedNodes(selectedNodes, connectedEdges, event);\n if (copied && onRemove) {\n onRemove(selectedNodes);\n }\n return copied;\n }\n async function handlePasteEvent(event) {\n if (isEventFromTextInput(event)) {\n return false;\n }\n const clipboardData = event.clipboardData;\n if (!clipboardData) return false;\n const files = clipboardData.files;\n if (files && files.length > 0) {\n const imageFile = Array.from(files).find((f) => f.type.startsWith(\"image/\"));\n if (imageFile && options.onPasteImage) {\n event.preventDefault();\n await options.onPasteImage(imageFile);\n return true;\n }\n }\n const rawJson = clipboardData.getData(\"application/json\") || clipboardData.getData(\"text/plain\");\n if (rawJson) {\n try {\n const parsed = JSON.parse(rawJson);\n let rawNodes;\n let rawEdges;\n if (Array.isArray(parsed) && parsed.every(isValidCanvasNode)) {\n rawNodes = parsed;\n } else if (typeof parsed === \"object\" && parsed !== null && Array.isArray(parsed.nodes) && parsed.nodes.every(isValidCanvasNode)) {\n rawNodes = parsed.nodes;\n rawEdges = parsed.edges;\n }\n if (rawNodes && rawNodes.length > 0) {\n event.preventDefault();\n const idMap = /* @__PURE__ */ new Map();\n const newNodes = rawNodes.map((node) => {\n const newId = crypto.randomUUID();\n idMap.set(node.id, newId);\n return {\n ...node,\n id: newId,\n selected: true,\n position: {\n x: node.position.x + 40,\n y: node.position.y + 40\n }\n };\n });\n const newEdges = rawEdges?.map((edge) => ({\n ...edge,\n id: crypto.randomUUID(),\n source: idMap.get(edge.source) ?? edge.source,\n target: idMap.get(edge.target) ?? edge.target\n }));\n if (options.onPasteNodes) {\n await options.onPasteNodes(newNodes, newEdges);\n await tick();\n }\n return true;\n }\n } catch {\n }\n }\n const text = clipboardData.getData(\"text/plain\")?.trim();\n if (text) {\n if (isValidUrl(text) && options.onPasteUrl) {\n event.preventDefault();\n options.onPasteUrl(text);\n return true;\n } else if (options.onPasteText) {\n event.preventDefault();\n options.onPasteText(text);\n return true;\n }\n }\n return false;\n }\n return {\n copySelectedNodes,\n cutSelectedNodes,\n handlePasteEvent\n };\n}\n","export function createCanvasDocking(options = {}) {\n let draggedNode = $state.raw(null);\n let draggedInitialPosition = $state.raw(null);\n let connectingHandle = $state.raw(\"\");\n let connectingNode = $state.raw(null);\n let currentHoverTargets = $state.raw(/* @__PURE__ */ new Set());\n const isDockTarget = options.isDockTarget ?? ((target) => target.type === \"boardNode\");\n function handleNodeDragStart(params) {\n draggedNode = params.targetNode;\n draggedInitialPosition = params.targetNode?.position ? { ...params.targetNode.position } : null;\n currentHoverTargets = /* @__PURE__ */ new Set();\n }\n function handleNodeDrag(params, getIntersectingNodes) {\n draggedNode = params.targetNode;\n if (!draggedNode) return;\n const intersecting = getIntersectingNodes(draggedNode);\n const currentDockTargets = intersecting.filter(isDockTarget);\n const newHoverSet = new Set(currentDockTargets.map((t) => t.id));\n currentHoverTargets.forEach((targetId) => {\n if (!newHoverSet.has(targetId)) {\n const leftNode = intersecting.find((n) => n.id === targetId) ?? { id: targetId };\n options.onDockLeave?.(leftNode, draggedNode);\n }\n });\n currentDockTargets.forEach((target) => {\n if (!currentHoverTargets.has(target.id)) {\n options.onDockHover?.(target, draggedNode);\n }\n });\n currentHoverTargets = newHoverSet;\n }\n function handleNodeDragStop(params, getIntersectingNodes, updateNodePosition) {\n draggedNode = params.targetNode;\n if (draggedNode) {\n const intersecting = getIntersectingNodes(draggedNode);\n const dockTarget = intersecting.find(isDockTarget);\n if (dockTarget) {\n options.onDockDrop?.(dockTarget, draggedNode);\n if (options.restorePositionOnDock !== false && draggedInitialPosition && updateNodePosition) {\n updateNodePosition(draggedNode.id, draggedInitialPosition);\n }\n }\n }\n draggedNode = null;\n draggedInitialPosition = null;\n currentHoverTargets = /* @__PURE__ */ new Set();\n options.onSave?.();\n }\n function handleConnectStart(params, getNode) {\n connectingHandle = params.handleType ?? \"\";\n connectingNode = params.nodeId ? getNode(params.nodeId) ?? null : null;\n }\n function handleConnectEnd() {\n connectingHandle = \"\";\n connectingNode = null;\n }\n function reset() {\n draggedNode = null;\n draggedInitialPosition = null;\n connectingHandle = \"\";\n connectingNode = null;\n currentHoverTargets = /* @__PURE__ */ new Set();\n }\n return {\n get draggedNode() {\n return draggedNode;\n },\n get draggedInitialPosition() {\n return draggedInitialPosition;\n },\n get connectingHandle() {\n return connectingHandle;\n },\n get connectingNode() {\n return connectingNode;\n },\n get isDragging() {\n return draggedNode !== null;\n },\n handleNodeDragStart,\n handleNodeDrag,\n handleNodeDragStop,\n handleConnectStart,\n handleConnectEnd,\n reset\n };\n}\n","import { isEventFromTextInput } from './createCanvasClipboard.svelte.js';\nimport type { CanvasNode, CanvasShortcutsOptions } from './types.js';\n\n/**\n * Attaches keyboard shortcut handlers for canvas interaction.\n * Automatically ignores shortcuts when the user is typing into text inputs, textareas, or rich editors.\n *\n * @returns A cleanup function to remove event listeners.\n */\nexport function createCanvasShortcuts<TNode extends CanvasNode = CanvasNode>(\n\toptions: CanvasShortcutsOptions<TNode>\n): () => void {\n\tconst target = options.targetElement ?? (typeof window !== 'undefined' ? window : null);\n\tif (!target) return () => {};\n\n\tfunction handleKeyDown(event: Event) {\n\t\tconst keyboardEvent = event as KeyboardEvent;\n\t\tif (isEventFromTextInput(keyboardEvent)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst isMod = keyboardEvent.metaKey || keyboardEvent.ctrlKey;\n\t\tconst isShift = keyboardEvent.shiftKey;\n\t\tconst key = keyboardEvent.key;\n\n\t\tconst selectedNodes = options.getSelectedNodes ? options.getSelectedNodes() : [];\n\n\t\tif (key === 'Backspace' || key === 'Delete') {\n\t\t\tif (options.onDelete && selectedNodes.length > 0) {\n\t\t\t\tkeyboardEvent.preventDefault();\n\t\t\t\toptions.onDelete(selectedNodes);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tif (isMod) {\n\t\t\tconst lowerKey = key.toLowerCase();\n\n\t\t\tif (lowerKey === 'c' && !isShift) {\n\t\t\t\tif (options.onCopy) {\n\t\t\t\t\t// We let the native copy event fire or call onCopy\n\t\t\t\t\toptions.onCopy();\n\t\t\t\t}\n\t\t\t} else if (lowerKey === 'x' && !isShift) {\n\t\t\t\tif (options.onCut) {\n\t\t\t\t\toptions.onCut();\n\t\t\t\t}\n\t\t\t} else if (lowerKey === 'd' && !isShift) {\n\t\t\t\tif (options.onDuplicate && selectedNodes.length > 0) {\n\t\t\t\t\tkeyboardEvent.preventDefault();\n\t\t\t\t\toptions.onDuplicate(selectedNodes);\n\t\t\t\t}\n\t\t\t} else if (lowerKey === 'a' && !isShift) {\n\t\t\t\tif (options.onSelectAll) {\n\t\t\t\t\tkeyboardEvent.preventDefault();\n\t\t\t\t\toptions.onSelectAll();\n\t\t\t\t}\n\t\t\t} else if (lowerKey === 'g') {\n\t\t\t\tif (isShift) {\n\t\t\t\t\tif (options.onUngroup && selectedNodes.length > 0) {\n\t\t\t\t\t\tkeyboardEvent.preventDefault();\n\t\t\t\t\t\toptions.onUngroup(selectedNodes);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (options.onGroup && selectedNodes.length > 0) {\n\t\t\t\t\t\tkeyboardEvent.preventDefault();\n\t\t\t\t\t\toptions.onGroup(selectedNodes);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (key === '=' || key === '+') {\n\t\t\t\tif (options.onZoomIn) {\n\t\t\t\t\tkeyboardEvent.preventDefault();\n\t\t\t\t\toptions.onZoomIn();\n\t\t\t\t}\n\t\t\t} else if (key === '-') {\n\t\t\t\tif (options.onZoomOut) {\n\t\t\t\t\tkeyboardEvent.preventDefault();\n\t\t\t\t\toptions.onZoomOut();\n\t\t\t\t}\n\t\t\t} else if (key === '0') {\n\t\t\t\tif (options.onFitView) {\n\t\t\t\t\tkeyboardEvent.preventDefault();\n\t\t\t\t\toptions.onFitView();\n\t\t\t\t}\n\t\t\t} else if (lowerKey === 'f') {\n\t\t\t\tif (options.onSearch) {\n\t\t\t\t\tkeyboardEvent.preventDefault();\n\t\t\t\t\toptions.onSearch();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\ttarget.addEventListener('keydown', handleKeyDown as EventListener);\n\n\treturn () => {\n\t\ttarget.removeEventListener('keydown', handleKeyDown as EventListener);\n\t};\n}\n","import { isEventFromTextInput } from \"./createCanvasClipboard.svelte.js\";\nexport function createCanvasInteractions(options = {}) {\n let isSpacebarPanning = $state.raw(false);\n let trackpadDetected = $state.raw(false);\n let toggledPanMode = false;\n function handleKeyDown(event) {\n if (event.key === \" \" || event.code === \"Space\") {\n if (isSpacebarPanning || isEventFromTextInput(event)) return;\n isSpacebarPanning = true;\n toggledPanMode = true;\n options.onPanModeChange?.(true);\n if (typeof document !== \"undefined\") {\n document.body.classList.add(\"cursor-grab\");\n }\n }\n }\n function handleKeyUp(event) {\n if (event.key === \" \" || event.code === \"Space\") {\n if (!isSpacebarPanning && !toggledPanMode) return;\n isSpacebarPanning = false;\n toggledPanMode = false;\n options.onPanModeChange?.(false);\n if (typeof document !== \"undefined\") {\n document.body.classList.remove(\"cursor-grab\");\n }\n }\n }\n function handleWheel(event) {\n if (event.ctrlKey && !trackpadDetected) {\n trackpadDetected = true;\n options.onTrackpadDetected?.();\n }\n }\n function attachListeners(target) {\n const el = target ?? options.targetElement ?? (typeof window !== \"undefined\" ? window : null);\n if (!el) return () => {\n };\n el.addEventListener(\"keydown\", handleKeyDown);\n el.addEventListener(\"keyup\", handleKeyUp);\n el.addEventListener(\"wheel\", handleWheel, { passive: true });\n return () => {\n el.removeEventListener(\"keydown\", handleKeyDown);\n el.removeEventListener(\"keyup\", handleKeyUp);\n el.removeEventListener(\"wheel\", handleWheel);\n if (typeof document !== \"undefined\") {\n document.body.classList.remove(\"cursor-grab\");\n }\n };\n }\n return {\n get isSpacebarPanning() {\n return isSpacebarPanning;\n },\n get trackpadDetected() {\n return trackpadDetected;\n },\n attachListeners,\n destroy: attachListeners()\n };\n}\nexport const defaultSvelteFlowPreset = {\n snapGrid: [25, 25],\n panOnDrag: [0, 1, 2, 3, 4],\n panOnScroll: false,\n selectionOnDrag: false,\n colorMode: \"system\",\n multiSelectionKey: [\"Shift\", \"Meta\"]\n};\nexport const miroCompatiblePreset = {\n ...defaultSvelteFlowPreset,\n panOnDrag: [1, 2],\n selectionOnDrag: true\n};\nexport function restorePanelPointerEvents(panelSelector = \".svelte-flow__panel\") {\n if (typeof document === \"undefined\") return;\n const panels = document.querySelectorAll(panelSelector);\n panels.forEach((panel) => {\n panel.style.pointerEvents = \"auto\";\n });\n}\n","import { cubicOut } from 'svelte/easing';\nimport type { XYPosition } from '@xyflow/svelte';\nimport type {\n\tCanvasNode,\n\tFanOutTrajectoryOptions,\n\tNodeTransition,\n\tTrajectoryFunction,\n\tTrajectoryPoint\n} from './types.js';\n\n/**\n * Standard linear trajectory: straight line interpolation with linear scale & opacity progression.\n */\nexport const linearTrajectory: TrajectoryFunction = (\n\torigin: XYPosition,\n\ttarget: XYPosition,\n\tprogress: number\n): TrajectoryPoint => {\n\treturn {\n\t\tposition: {\n\t\t\tx: origin.x + (target.x - origin.x) * progress,\n\t\t\ty: origin.y + (target.y - origin.y) * progress\n\t\t},\n\t\tscale: progress,\n\t\topacity: Math.min(1, progress * 1.5)\n\t};\n};\n\n/**\n * Creates a fan-out trajectory where nodes arc outward from origin to target.\n * Matches the curved distribution shown in multi-node branching diagrams.\n */\nexport function createFanOutTrajectory(options: FanOutTrajectoryOptions = {}): TrajectoryFunction {\n\tconst {\n\t\tcurvature = 0.4,\n\t\tstartScale = 0,\n\t\tendScale = 1,\n\t\tstartOpacity = 0,\n\t\tendOpacity = 1\n\t} = options;\n\n\treturn (\n\t\torigin: XYPosition,\n\t\ttarget: XYPosition,\n\t\tprogress: number,\n\t\tindex: number,\n\t\ttotal: number\n\t): TrajectoryPoint => {\n\t\tconst dx = target.x - origin.x;\n\t\tconst dy = target.y - origin.y;\n\n\t\t// Normalized index from -1 (top) to +1 (bottom)\n\t\tconst normIndex = total > 1 ? (index - (total - 1) / 2) / ((total - 1) / 2) : 0;\n\n\t\t// Perpendicular control point offset to create smooth fan arc\n\t\tconst midX = origin.x + dx * 0.4;\n\t\tconst midY = origin.y + dy * 0.1 - normIndex * Math.abs(dx) * 0.15 * curvature;\n\n\t\t// Quadratic Bezier interpolation: B(t) = (1-t)^2 * P0 + 2(1-t)t * P1 + t^2 * P2\n\t\tconst t = progress;\n\t\tconst oneMinusT = 1 - t;\n\n\t\tconst x = oneMinusT * oneMinusT * origin.x + 2 * oneMinusT * t * midX + t * t * target.x;\n\t\tconst y = oneMinusT * oneMinusT * origin.y + 2 * oneMinusT * t * midY + t * t * target.y;\n\n\t\tconst scale = startScale + (endScale - startScale) * progress;\n\t\tconst opacity = startOpacity + (endOpacity - startOpacity) * progress;\n\n\t\treturn {\n\t\t\tposition: { x, y },\n\t\t\tscale,\n\t\t\topacity\n\t\t};\n\t};\n}\n\n/**\n * Creates a custom quadratic Bezier trajectory with a specified or dynamically calculated control point.\n */\nexport function createBezierTrajectory(\n\tgetControlPoint: (origin: XYPosition, target: XYPosition) => XYPosition\n): TrajectoryFunction {\n\treturn (origin: XYPosition, target: XYPosition, progress: number): TrajectoryPoint => {\n\t\tconst cp = getControlPoint(origin, target);\n\t\tconst t = progress;\n\t\tconst oneMinusT = 1 - t;\n\n\t\tconst x = oneMinusT * oneMinusT * origin.x + 2 * oneMinusT * t * cp.x + t * t * target.x;\n\t\tconst y = oneMinusT * oneMinusT * origin.y + 2 * oneMinusT * t * cp.y + t * t * target.y;\n\n\t\treturn {\n\t\t\tposition: { x, y },\n\t\t\tscale: progress,\n\t\t\topacity: progress\n\t\t};\n\t};\n}\n\n/**\n * Coordinates and animates multiple node transitions simultaneously with zero per-frame array allocations.\n * Directly mutates node positions and data (scale, opacity) in-place during the animation loop.\n */\nexport function runMultiNodeTransition<TNode extends CanvasNode = CanvasNode>(\n\ttransitions: NodeTransition<TNode>[],\n\toptions: {\n\t\tdefaultDuration?: number;\n\t\tdefaultEasing?: (t: number) => number;\n\t\tonUpdate?: () => void;\n\t\tonComplete?: () => void;\n\t} = {}\n): () => void {\n\tif (transitions.length === 0) {\n\t\toptions.onComplete?.();\n\t\treturn () => {};\n\t}\n\n\tconst { defaultDuration = 400, defaultEasing = cubicOut, onUpdate, onComplete } = options;\n\n\tlet isCancelled = false;\n\tconst startTime = Date.now();\n\n\tconst items = transitions.map((tr, i) => ({\n\t\t...tr,\n\t\tindex: tr.index ?? i,\n\t\ttotal: tr.total ?? transitions.length,\n\t\tduration: tr.duration ?? defaultDuration,\n\t\teasing: tr.easing ?? defaultEasing,\n\t\tdelay: tr.delay ?? 0,\n\t\ttrajectory: tr.trajectory ?? linearTrajectory\n\t}));\n\n\tfunction frame() {\n\t\tif (isCancelled) return;\n\n\t\tconst now = Date.now();\n\t\tlet allCompleted = true;\n\n\t\tfor (let i = 0; i < items.length; i++) {\n\t\t\tconst item = items[i];\n\t\t\tconst elapsed = now - (startTime + item.delay);\n\n\t\t\tif (elapsed < 0) {\n\t\t\t\tallCompleted = false;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst rawProgress = item.duration <= 0 ? 1 : Math.min(elapsed / item.duration, 1);\n\t\t\tconst progress = item.duration <= 0 ? 1 : item.easing(rawProgress);\n\n\t\t\tconst point = item.trajectory(item.from, item.to, progress, item.index, item.total);\n\n\t\t\t// Direct in-place mutation avoids array reconstruction during RAF\n\t\t\titem.node.position = { ...point.position };\n\n\t\t\tif (point.scale !== undefined || point.opacity !== undefined) {\n\t\t\t\tif (!item.node.data) {\n\t\t\t\t\titem.node.data = {} as any;\n\t\t\t\t}\n\t\t\t\tif (point.scale !== undefined) {\n\t\t\t\t\t(item.node.data as any).scale = point.scale;\n\t\t\t\t}\n\t\t\t\tif (point.opacity !== undefined) {\n\t\t\t\t\t(item.node.data as any).opacity = point.opacity;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (rawProgress < 1) {\n\t\t\t\tallCompleted = false;\n\t\t\t}\n\t\t}\n\n\t\tonUpdate?.();\n\n\t\tif (!allCompleted) {\n\t\t\tif (typeof requestAnimationFrame !== 'undefined') {\n\t\t\t\trequestAnimationFrame(frame);\n\t\t\t}\n\t\t} else {\n\t\t\tonComplete?.();\n\t\t}\n\t}\n\n\tframe();\n\n\treturn () => {\n\t\tisCancelled = true;\n\t};\n}\n","import dagre from '@dagrejs/dagre';\nimport type { Rect, XYPosition } from '@xyflow/svelte';\nimport type {\n\tCanvasEdge,\n\tCanvasLayoutOptions,\n\tCanvasNode,\n\tDirectionalDisplacementOptions\n} from './types.js';\n\n/**\n * Calculates a bounding rectangle for a set of nodes if not provided by getNodesBounds.\n */\nexport function computeNodesBoundingBox<TNode extends CanvasNode = CanvasNode>(\n\tnodes: TNode[],\n\tdefaultWidth = 200,\n\tdefaultHeight = 60\n): Rect {\n\tif (nodes.length === 0) {\n\t\treturn { x: 0, y: 0, width: 0, height: 0 };\n\t}\n\n\tlet minX = Infinity;\n\tlet minY = Infinity;\n\tlet maxX = -Infinity;\n\tlet maxY = -Infinity;\n\n\tfor (const node of nodes) {\n\t\tconst width = node.measured?.width ?? (node as any).width ?? defaultWidth;\n\t\tconst height = node.measured?.height ?? (node as any).height ?? defaultHeight;\n\n\t\tminX = Math.min(minX, node.position.x);\n\t\tminY = Math.min(minY, node.position.y);\n\t\tmaxX = Math.max(maxX, node.position.x + width);\n\t\tmaxY = Math.max(maxY, node.position.y + height);\n\t}\n\n\treturn {\n\t\tx: minX,\n\t\ty: minY,\n\t\twidth: maxX - minX,\n\t\theight: maxY - minY\n\t};\n}\n\n/**\n * Pure directional displacement calculation.\n * Shifts downstream or surrounding nodes along an axis to clear space for newly inserted child nodes.\n */\nexport function calculateDirectionalDisplacement<TNode extends CanvasNode = CanvasNode>(params: {\n\texistingNodes: TNode[];\n\toriginNode: TNode;\n\tchildNodes: TNode[];\n\tgetNodesBounds?: (nodes: TNode[]) => Rect;\n\toptions?: DirectionalDisplacementOptions;\n}): Map<string, XYPosition> {\n\tconst {\n\t\texistingNodes,\n\t\toriginNode,\n\t\tchildNodes,\n\t\tgetNodesBounds,\n\t\toptions = {}\n\t} = params;\n\n\tconst {\n\t\tdirection = 'right',\n\t\tgap = 40,\n\t\tspreadSiblingLanes = false,\n\t\tsiblingTolerance = 50,\n\t\tminY\n\t} = options;\n\n\tconst displacedMap = new Map<string, XYPosition>();\n\tif (childNodes.length === 0 || existingNodes.length === 0) {\n\t\treturn displacedMap;\n\t}\n\n\tconst childBounds = getNodesBounds\n\t\t? getNodesBounds(childNodes)\n\t\t: computeNodesBoundingBox(childNodes);\n\n\tconst originWidth = originNode.measured?.width ?? (originNode as any).width ?? 200;\n\tconst originHeight = originNode.measured?.height ?? (originNode as any).height ?? 60;\n\n\t// The delta space required along primary axis\n\tconst deltaPrimary = (direction === 'right' || direction === 'left')\n\t\t? childBounds.width + gap\n\t\t: childBounds.height + gap;\n\n\t// Vertical displacement parameters: upward and downward row clearance\n\tconst deltaUp = Math.max(0, originNode.position.y - childBounds.y + gap);\n\tconst deltaDown = Math.max(\n\t\t0,\n\t\tchildBounds.y + childBounds.height - (originNode.position.y + originHeight) + gap\n\t);\n\n\t// Both above and below displace equally so the row expands symmetrically\n\tconst equalDelta = Math.max(deltaUp, deltaDown);\n\n\tfor (const node of existingNodes) {\n\t\tif (node.id === originNode.id) continue;\n\n\t\tlet newX = node.position.x;\n\t\tlet newY = node.position.y;\n\t\tlet moved = false;\n\n\t\tif (direction === 'right') {\n\t\t\t// Downstream nodes strictly to the right of the origin\n\t\t\tif (node.position.x >= originNode.position.x + originWidth * 0.5) {\n\t\t\t\tnewX += deltaPrimary;\n\t\t\t\tmoved = true;\n\t\t\t} else if (spreadSiblingLanes) {\n\t\t\t\t// Sibling nodes occupying the same vertical space as the exploded cluster\n\t\t\t\tconst isVerticallyOverlapping =\n\t\t\t\t\tnode.position.y + ((node as any).height ?? 60) >= childBounds.y - gap &&\n\t\t\t\t\tnode.position.y <= childBounds.y + childBounds.height + gap;\n\n\t\t\t\tif (isVerticallyOverlapping && Math.abs(node.position.x - originNode.position.x) <= siblingTolerance) {\n\t\t\t\t\tconst pushDirection = node.position.y >= originNode.position.y ? 1 : -1;\n\t\t\t\t\tnewY += pushDirection * (childBounds.height * 0.5 + gap);\n\t\t\t\t\tmoved = true;\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (direction === 'left') {\n\t\t\tif (node.position.x <= originNode.position.x) {\n\t\t\t\tnewX -= deltaPrimary;\n\t\t\t\tmoved = true;\n\t\t\t}\n\t\t} else if (direction === 'down') {\n\t\t\tif (node.position.y >= originNode.position.y + originHeight * 0.5) {\n\t\t\t\tnewY += deltaPrimary;\n\t\t\t\tmoved = true;\n\t\t\t}\n\t\t} else if (direction === 'up') {\n\t\t\tif (node.position.y <= originNode.position.y) {\n\t\t\t\tnewY -= deltaPrimary;\n\t\t\t\tmoved = true;\n\t\t\t}\n\t\t} else if (direction === 'vertical') {\n\t\t\t// Row grows vertically:\n\t\t\t// Nodes strictly above the origin node move up by equalDelta\n\t\t\t// Nodes strictly below the origin node move down by equalDelta\n\t\t\t// Both above and below displace equally; horizontal position (x) is strictly preserved\n\t\t\tif (node.position.y < originNode.position.y) {\n\t\t\t\tif (equalDelta > 0) {\n\t\t\t\t\tnewY -= equalDelta;\n\t\t\t\t\tmoved = true;\n\t\t\t\t}\n\t\t\t} else if (node.position.y >= originNode.position.y + originHeight * 0.5) {\n\t\t\t\tif (equalDelta > 0) {\n\t\t\t\t\tnewY += equalDelta;\n\t\t\t\t\tmoved = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (moved) {\n\t\t\tdisplacedMap.set(node.id, { x: newX, y: newY });\n\t\t}\n\t}\n\n\treturn displacedMap;\n}\n\n/**\n * Pure hierarchical Dagre reflow displacement calculation.\n * Calculates new coordinates for surrounding nodes using Dagre hierarchical layout,\n * anchoring the origin node at its current position to eliminate layout jumping.\n */\nexport function calculateReflowDisplacement<\n\tTNode extends CanvasNode = CanvasNode,\n\tTEdge extends CanvasEdge = CanvasEdge\n>(params: {\n\texistingNodes: TNode[];\n\texistingEdges: TEdge[];\n\toriginNode: TNode;\n\tchildNodes: TNode[];\n\tchildEdges?: TEdge[];\n\tgetNodesBounds?: (nodes: TNode[]) => Rect;\n\toptions?: CanvasLayoutOptions;\n}): Map<string, XYPosition> {\n\tconst {\n\t\texistingNodes,\n\t\texistingEdges,\n\t\toriginNode,\n\t\tchildNodes,\n\t\tchildEdges = [],\n\t\toptions = {}\n\t} = params;\n\n\tconst {\n\t\tdirection = 'LR',\n\t\tranksep = 80,\n\t\tnodesep = 30,\n\t\tdefaultNodeWidth = 200,\n\t\tdefaultNodeHeight = 60\n\t} = options;\n\n\tconst displacedMap = new Map<string, XYPosition>();\n\tif (existingNodes.length === 0) return displacedMap;\n\n\tconst allNodes = [...existingNodes, ...childNodes];\n\tconst allEdges = [...existingEdges, ...childEdges];\n\n\tconst dagreGraph = new dagre.graphlib.Graph();\n\tdagreGraph.setDefaultEdgeLabel(() => ({}));\n\tdagreGraph.setGraph({ rankdir: direction, ranksep, nodesep });\n\n\tconst allNodeIds = new Set(allNodes.map((n) => n.id));\n\n\tallNodes.forEach((node) => {\n\t\tconst nodeWidth = node.measured?.width ?? (node as any).width ?? defaultNodeWidth;\n\t\tconst nodeHeight = node.measured?.height ?? (node as any).height ?? defaultNodeHeight;\n\t\tdagreGraph.setNode(node.id, { width: nodeWidth, height: nodeHeight });\n\t});\n\n\tallEdges.forEach((edge) => {\n\t\tif (allNodeIds.has(edge.source) && allNodeIds.has(edge.target)) {\n\t\t\tdagreGraph.setEdge(edge.source, edge.target);\n\t\t}\n\t});\n\n\tdagre.layout(dagreGraph);\n\n\tconst dagreOrigin = dagreGraph.node(originNode.id);\n\tif (!dagreOrigin) return displacedMap;\n\n\tconst originWidth = originNode.measured?.width ?? (originNode as any).width ?? defaultNodeWidth;\n\tconst originHeight = originNode.measured?.height ?? (originNode as any).height ?? defaultNodeHeight;\n\n\t// Calculate offset so origin node remains anchored at its exact initial coordinates\n\tconst anchorOffsetX = originNode.position.x - (dagreOrigin.x - originWidth / 2);\n\tconst anchorOffsetY = originNode.position.y - (dagreOrigin.y - originHeight / 2);\n\n\texistingNodes.forEach((node) => {\n\t\tif (node.id === originNode.id) return;\n\n\t\tconst dagreNode = dagreGraph.node(node.id);\n\t\tif (!dagreNode) return;\n\n\t\tconst nodeWidth = node.measured?.width ?? (node as any).width ?? defaultNodeWidth;\n\t\tconst nodeHeight = node.measured?.height ?? (node as any).height ?? defaultNodeHeight;\n\n\t\tconst targetX = dagreNode.x - nodeWidth / 2 + anchorOffsetX;\n\t\tconst targetY = dagreNode.y - nodeHeight / 2 + anchorOffsetY;\n\n\t\t// Only include if position actually shifted\n\t\tif (Math.abs(targetX - node.position.x) > 0.5 || Math.abs(targetY - node.position.y) > 0.5) {\n\t\t\tdisplacedMap.set(node.id, { x: targetX, y: targetY });\n\t\t}\n\t});\n\n\treturn displacedMap;\n}\n","import { cubicOut } from \"svelte/easing\";\nimport {\n calculateDirectionalDisplacement,\n calculateReflowDisplacement\n} from \"./createCanvasDisplacement.js\";\nimport {\n createFanOutTrajectory,\n linearTrajectory,\n runMultiNodeTransition\n} from \"./createCanvasTrajectory.js\";\nexport function createCanvasExplosion(graph, options = {}) {\n let explodedNodeIds = $state([]);\n const snapshots = /* @__PURE__ */ new Map();\n let activeAnimationCancel = null;\n function isExploded(nodeId) {\n return explodedNodeIds.includes(nodeId);\n }\n function explodeNode(parentId, explodeOptions) {\n if (isExploded(parentId)) {\n return false;\n }\n const parentNode = graph.nodes.find((n) => n.id === parentId);\n if (!parentNode) {\n return false;\n }\n const {\n childNodes,\n childEdges = [],\n connectParentToChildren = \"all\",\n displacementStrategy = \"directional\",\n directionalOptions = {},\n reflowOptions = {},\n trajectory,\n duration = 500,\n staggerDelay = 20,\n easing = cubicOut,\n onComplete\n } = explodeOptions;\n if (childNodes.length === 0) {\n return false;\n }\n let displacementMap;\n if (displacementStrategy === \"dagre\") {\n displacementMap = calculateReflowDisplacement({\n existingNodes: graph.nodes,\n existingEdges: graph.edges,\n originNode: parentNode,\n childNodes,\n childEdges,\n getNodesBounds: options.getNodesBounds,\n options: {\n ...reflowOptions,\n direction: reflowOptions.direction ?? \"LR\"\n }\n });\n } else if (displacementStrategy === \"none\") {\n displacementMap = /* @__PURE__ */ new Map();\n } else {\n displacementMap = calculateDirectionalDisplacement({\n existingNodes: graph.nodes,\n originNode: parentNode,\n childNodes,\n getNodesBounds: options.getNodesBounds,\n options: directionalOptions\n });\n }\n const displacedNodesSnapshot = Array.from(displacementMap.entries()).map(([id]) => {\n const node = graph.nodes.find((n) => n.id === id);\n return {\n id,\n originalPosition: { ...node?.position ?? { x: 0, y: 0 } }\n };\n });\n const edgesToAdd = [...childEdges];\n const defaultCreateEdge = (sourceId, targetId) => {\n if (graph.createEdge) {\n return graph.createEdge(sourceId, targetId);\n }\n return {\n id: crypto.randomUUID(),\n type: \"default\",\n source: sourceId,\n target: targetId\n };\n };\n if (connectParentToChildren === \"all\" || connectParentToChildren === true) {\n childNodes.forEach((child) => {\n const exists = edgesToAdd.some((e) => e.source === parentId && e.target === child.id);\n if (!exists) {\n edgesToAdd.push(defaultCreateEdge(parentId, child.id));\n }\n });\n } else if (connectParentToChildren === \"first\" && childNodes.length > 0) {\n const firstChild = childNodes[0];\n const exists = edgesToAdd.some((e) => e.source === parentId && e.target === firstChild.id);\n if (!exists) {\n edgesToAdd.push(defaultCreateEdge(parentId, firstChild.id));\n }\n }\n const snapshot = {\n parentId,\n childNodeIds: childNodes.map((n) => n.id),\n childEdgeIds: edgesToAdd.map((e) => e.id),\n displacedNodes: displacedNodesSnapshot,\n timestamp: Date.now()\n };\n snapshots.set(parentId, snapshot);\n const originPos = { ...parentNode.position };\n const targetPositions = childNodes.map((child) => ({ ...child.position }));\n childNodes.forEach((child) => {\n child.position = { ...originPos };\n if (!child.data) child.data = {};\n child.data.scale = 0;\n child.data.opacity = 0;\n });\n graph.addNodeOrNodes(childNodes, void 0, false);\n if (edgesToAdd.length > 0) {\n graph.addEdges(edgesToAdd, false);\n }\n const chosenTrajectory = trajectory ?? createFanOutTrajectory({ curvature: 0.35 });\n const transitions = [];\n const effectiveStagger = duration === 0 ? 0 : staggerDelay;\n childNodes.forEach((child, i) => {\n transitions.push({\n node: child,\n from: originPos,\n to: targetPositions[i],\n trajectory: chosenTrajectory,\n delay: i * effectiveStagger,\n duration,\n easing,\n index: i,\n total: childNodes.length\n });\n });\n displacementMap.forEach((targetPos, nodeId) => {\n const node = graph.nodes.find((n) => n.id === nodeId);\n if (node) {\n transitions.push({\n node,\n from: { ...node.position },\n to: targetPos,\n trajectory: linearTrajectory,\n duration,\n easing\n });\n }\n });\n if (activeAnimationCancel) {\n activeAnimationCancel();\n }\n activeAnimationCancel = runMultiNodeTransition(transitions, {\n defaultDuration: duration,\n defaultEasing: easing,\n onUpdate: () => {\n graph.setNodes([...graph.nodes]);\n },\n onComplete: () => {\n graph.setNodes([...graph.nodes]);\n explodedNodeIds = [...explodedNodeIds, parentId];\n activeAnimationCancel = null;\n options.onSave?.();\n graph.onSave?.();\n onComplete?.();\n }\n });\n return true;\n }\n function collapseNode(parentId, collapseOptions = {}) {\n const snapshot = snapshots.get(parentId);\n if (!snapshot) {\n return false;\n }\n const parentNode = graph.nodes.find((n) => n.id === parentId);\n if (!parentNode) {\n return false;\n }\n const {\n duration = 400,\n staggerDelay = 15,\n easing = cubicOut,\n trajectory,\n onComplete\n } = collapseOptions;\n const childIdSet = new Set(snapshot.childNodeIds);\n const activeChildNodes = graph.nodes.filter((n) => childIdSet.has(n.id));\n const originPos = { ...parentNode.position };\n const reverseTrajectory = trajectory ?? createFanOutTrajectory({\n curvature: 0.2,\n startScale: 1,\n endScale: 0,\n startOpacity: 1,\n endOpacity: 0\n });\n const transitions = [];\n const effectiveStagger = duration === 0 ? 0 : staggerDelay;\n activeChildNodes.forEach((child, i) => {\n transitions.push({\n node: child,\n from: { ...child.position },\n to: originPos,\n trajectory: reverseTrajectory,\n delay: (activeChildNodes.length - 1 - i) * effectiveStagger,\n duration,\n easing,\n index: i,\n total: activeChildNodes.length\n });\n });\n snapshot.displacedNodes.forEach(({ id, originalPosition }) => {\n const node = graph.nodes.find((n) => n.id === id);\n if (node) {\n transitions.push({\n node,\n from: { ...node.position },\n to: originalPosition,\n trajectory: linearTrajectory,\n duration,\n easing\n });\n }\n });\n if (activeAnimationCancel) {\n activeAnimationCancel();\n }\n activeAnimationCancel = runMultiNodeTransition(transitions, {\n defaultDuration: duration,\n defaultEasing: easing,\n onUpdate: () => {\n graph.setNodes([...graph.nodes]);\n },\n onComplete: () => {\n graph.removeNodes(activeChildNodes, false);\n const edgeIdSet = new Set(snapshot.childEdgeIds);\n const edgesToRemove = graph.edges.filter((e) => edgeIdSet.has(e.id));\n if (edgesToRemove.length > 0) {\n graph.removeEdges(edgesToRemove, false);\n }\n snapshots.delete(parentId);\n explodedNodeIds = explodedNodeIds.filter((id) => id !== parentId);\n activeAnimationCancel = null;\n options.onSave?.();\n graph.onSave?.();\n onComplete?.();\n }\n });\n return true;\n }\n function toggleExplode(parentId, explodeOptions, collapseOptions) {\n if (isExploded(parentId)) {\n return collapseNode(parentId, collapseOptions);\n }\n return explodeNode(parentId, explodeOptions);\n }\n function getSnapshot(parentId) {\n return snapshots.get(parentId);\n }\n return {\n get explodedNodeIds() {\n return explodedNodeIds;\n },\n isExploded,\n explodeNode,\n collapseNode,\n toggleExplode,\n getSnapshot\n };\n}\n"],"mappings":"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","names":["cubicOut","dagre","cubicOut","cubicOut"]}
1
+ {"version":3,"sources":["../../src/canvas/createCanvasGraph.svelte.ts","../../src/canvas/createCanvasLayout.ts","../../src/canvas/createCanvasClipboard.svelte.ts","../../src/canvas/createCanvasDocking.svelte.ts","../../src/canvas/createCanvasShortcuts.ts","../../src/canvas/createCanvasInteractions.svelte.ts","../../src/canvas/createCanvasTrajectory.ts","../../src/canvas/createCanvasDisplacement.ts","../../src/canvas/createCanvasExplosion.svelte.ts"],"sourcesContent":["import { cubicOut } from \"svelte/easing\";\nexport function calculateGraphDifferences(currentState, baselineState) {\n const currentNodes = currentState.nodes ?? [];\n const currentEdges = currentState.edges ?? [];\n const baselineNodes = baselineState.nodes ?? [];\n const baselineEdges = baselineState.edges ?? [];\n const baselineNodeMap = new Map(baselineNodes.map((n) => [n.id, n]));\n const baselineEdgeMap = new Map(baselineEdges.map((e) => [e.id, e]));\n const currentNodeMap = new Map(currentNodes.map((n) => [n.id, n]));\n const currentEdgeMap = new Map(currentEdges.map((e) => [e.id, e]));\n const removedNodes = baselineNodes.filter((oldNode) => !currentNodeMap.has(oldNode.id));\n const removedEdges = baselineEdges.filter((oldEdge) => !currentEdgeMap.has(oldEdge.id));\n const changedNodes = currentNodes.filter((newNode) => {\n const oldNode = baselineNodeMap.get(newNode.id);\n if (!oldNode) return true;\n return JSON.stringify(newNode) !== JSON.stringify(oldNode);\n });\n const changedEdges = currentEdges.filter((newEdge) => {\n const oldEdge = baselineEdgeMap.get(newEdge.id);\n if (!oldEdge) return true;\n return JSON.stringify(newEdge) !== JSON.stringify(oldEdge);\n });\n return { changedNodes, changedEdges, removedNodes, removedEdges };\n}\nexport function replaceNodeInGraph(nodes, edges, oldNode, newNode, keepEdges = false) {\n const updatedNodes = nodes.map((n) => n.id === oldNode.id ? newNode : n);\n if (!keepEdges) {\n return { nodes: updatedNodes, edges };\n }\n const updatedEdges = edges.map((edge) => {\n if (edge.source === oldNode.id || edge.target === oldNode.id) {\n return {\n ...edge,\n id: crypto.randomUUID(),\n source: edge.source === oldNode.id ? newNode.id : edge.source,\n target: edge.target === oldNode.id ? newNode.id : edge.target\n };\n }\n return edge;\n });\n return {\n nodes: updatedNodes,\n edges: updatedEdges\n };\n}\nexport function createCanvasGraph(options = {}) {\n let nodes = $state.raw(options.initialNodes ?? []);\n let edges = $state.raw(options.initialEdges ?? []);\n function setNodes(newNodes, triggerCallback = true) {\n nodes = newNodes;\n if (triggerCallback) {\n options.onNodesChange?.(nodes);\n }\n }\n function setEdges(newEdges, triggerCallback = true) {\n edges = newEdges;\n if (triggerCallback) {\n options.onEdgesChange?.(edges);\n }\n }\n function animateNodePosition(node, targetPosition, duration = 400, easing = cubicOut) {\n const delay = node.data?.animationDelay ?? 0;\n const startPosition = { ...node.position };\n const startTime = Date.now() + delay;\n function step() {\n const currentTime = Date.now();\n if (currentTime < startTime) {\n if (typeof requestAnimationFrame !== \"undefined\") {\n requestAnimationFrame(step);\n }\n return;\n }\n const progress = Math.min((currentTime - startTime) / duration, 1);\n const eased = easing(progress);\n const currentPos = {\n x: startPosition.x + (targetPosition.x - startPosition.x) * eased,\n y: startPosition.y + (targetPosition.y - startPosition.y) * eased\n };\n const targetNode = nodes.find((n) => n.id === node.id);\n if (targetNode) {\n targetNode.position = currentPos;\n }\n if (progress < 1) {\n if (typeof requestAnimationFrame !== \"undefined\") {\n requestAnimationFrame(step);\n }\n } else {\n setNodes([...nodes]);\n }\n }\n step();\n }\n function addNodeOrNodes(nodeOrNodesToAdd, animateFromPosition, save = true) {\n const toAdd = Array.isArray(nodeOrNodesToAdd) ? nodeOrNodesToAdd : [nodeOrNodesToAdd];\n const existingMap = new Map(nodes.map((n) => [n.id, n]));\n toAdd.forEach((node) => {\n if (!existingMap.has(node.id)) {\n existingMap.set(node.id, node);\n }\n });\n setNodes(Array.from(existingMap.values()));\n if (animateFromPosition) {\n toAdd.forEach((node) => {\n const target = { ...node.position };\n node.position = { ...animateFromPosition };\n animateNodePosition(node, target);\n });\n }\n if (save) options.onSave?.();\n }\n function addEdge(edgeToAdd, save = true) {\n setEdges([...edges, edgeToAdd]);\n if (save) options.onSave?.();\n }\n function addEdges(edgesToAdd, save = true) {\n setEdges([...edges, ...edgesToAdd]);\n if (save) options.onSave?.();\n }\n function removeNodes(nodesToRemove, save = true) {\n const idsToRemove = new Set(nodesToRemove.map((n) => n.id));\n setNodes(nodes.filter((n) => !idsToRemove.has(n.id)));\n if (save) options.onSave?.();\n }\n function removeEdges(edgesToRemove, save = true) {\n const idsToRemove = new Set(edgesToRemove.map((e) => e.id));\n setEdges(edges.filter((e) => !idsToRemove.has(e.id)));\n if (save) options.onSave?.();\n }\n function replaceNode(oldNode, newNode, save = true, keepEdges = false) {\n const result = replaceNodeInGraph(nodes, edges, oldNode, newNode, keepEdges);\n setNodes(result.nodes);\n if (result.edges !== edges) {\n setEdges(result.edges);\n }\n if (save) options.onSave?.();\n }\n function addConnectedNodes(params) {\n const {\n nodesToAdd,\n inboundNodes = [],\n outboundNodes = [],\n animatedEdges = false,\n animateFromPosition,\n inboundEdgeData = {},\n outboundEdgeData = {},\n getEdgeLabel\n } = params;\n const defaultCreateEdge = (sourceId, targetId, opt) => {\n if (options.createEdge) {\n return options.createEdge(sourceId, targetId, opt);\n }\n return {\n id: crypto.randomUUID(),\n type: \"default\",\n source: sourceId,\n target: targetId,\n label: opt?.label ?? \"\",\n animated: opt?.animated ?? false,\n data: opt?.data ?? {}\n };\n };\n nodesToAdd.forEach((addedNode) => {\n addNodeOrNodes(addedNode, animateFromPosition, false);\n inboundNodes.forEach((sourceNode) => {\n const label = getEdgeLabel ? getEdgeLabel(sourceNode, addedNode) : \"\";\n addEdge(\n defaultCreateEdge(sourceNode.id, addedNode.id, {\n label,\n animated: animatedEdges,\n data: inboundEdgeData\n }),\n false\n );\n });\n outboundNodes.forEach((targetNode) => {\n const label = getEdgeLabel ? getEdgeLabel(addedNode, targetNode) : \"\";\n addEdge(\n defaultCreateEdge(addedNode.id, targetNode.id, {\n label,\n animated: animatedEdges,\n data: outboundEdgeData\n }),\n false\n );\n });\n });\n options.onSave?.();\n }\n function getDifferences(baseline) {\n return calculateGraphDifferences({ nodes, edges }, baseline);\n }\n return {\n get nodes() {\n return nodes;\n },\n set nodes(val) {\n setNodes(val);\n },\n get edges() {\n return edges;\n },\n set edges(val) {\n setEdges(val);\n },\n setNodes,\n setEdges,\n addNodeOrNodes,\n addEdge,\n addEdges,\n removeNodes,\n removeEdges,\n replaceNode,\n addConnectedNodes,\n animateNodePosition,\n getDifferences\n };\n}\n","import dagre from '@dagrejs/dagre';\nimport { Position, type XYPosition, type Rect } from '@xyflow/svelte';\nimport type { CanvasNode, CanvasEdge, CanvasLayoutOptions } from './types.js';\n\n/**\n * Calculates upper-left flow coordinate for an element to be centered in the viewport.\n */\nexport function getCenteredNodePosition(\n\twidth = 0,\n\theight = 0,\n\tscreenToFlowPosition: (position: XYPosition) => XYPosition,\n\tscreenDimensions?: { width: number; height: number }\n): XYPosition {\n\tconst rect = screenDimensions ?? (typeof document !== 'undefined'\n\t\t? { width: document.documentElement.clientWidth, height: document.documentElement.clientHeight }\n\t\t: { width: 1920, height: 1080 });\n\n\tconst flowPos = screenToFlowPosition({ x: rect.width / 2, y: rect.height / 2 });\n\treturn {\n\t\tx: flowPos.x - width / 2,\n\t\ty: flowPos.y - height / 2\n\t};\n}\n\n/**\n * Updates positions of nodes so their collective bounding box is centered in the current viewport.\n */\nexport function centerNodes<TNode extends CanvasNode = CanvasNode>(\n\tnodes: TNode[],\n\tscreenToFlowPosition: (position: XYPosition) => XYPosition,\n\tgetNodesBounds: (nodes: TNode[]) => Rect,\n\tscreenDimensions?: { width: number; height: number }\n): TNode[] {\n\tif (nodes.length === 0) {\n\t\treturn [];\n\t}\n\n\tconst bounds = getNodesBounds(nodes);\n\tconst boundingBoxOrigin = { x: bounds.x, y: bounds.y };\n\n\tconst centeredPosition = getCenteredNodePosition(\n\t\tbounds.width,\n\t\tbounds.height,\n\t\tscreenToFlowPosition,\n\t\tscreenDimensions\n\t);\n\n\tconst deltaX = centeredPosition.x - boundingBoxOrigin.x;\n\tconst deltaY = centeredPosition.y - boundingBoxOrigin.y;\n\n\treturn nodes.map((node) => ({\n\t\t...node,\n\t\tposition: {\n\t\t\tx: node.position.x + deltaX,\n\t\t\ty: node.position.y + deltaY\n\t\t}\n\t}));\n}\n\n/**\n * Automatically calculates directed hierarchical layout of nodes and edges using Dagre.\n */\nexport function getLayoutedNodes<\n\tTNode extends CanvasNode = CanvasNode,\n\tTEdge extends CanvasEdge = CanvasEdge\n>(\n\tnodes: TNode[],\n\tedges: TEdge[],\n\tgetNodesBounds: (nodes: TNode[]) => Rect,\n\toptions: CanvasLayoutOptions = {}\n): TNode[] {\n\tif (nodes.length === 0) return [];\n\n\tconst {\n\t\tdirection = 'LR',\n\t\tranksep = 100,\n\t\tnodesep = 25,\n\t\tdefaultNodeWidth = 200,\n\t\tdefaultNodeHeight = 200\n\t} = options;\n\n\tconst isHorizontal = direction === 'LR' || direction === 'RL';\n\tconst bounds = getNodesBounds(nodes);\n\n\tconst dagreGraph = new dagre.graphlib.Graph();\n\tdagreGraph.setDefaultEdgeLabel(() => ({}));\n\tdagreGraph.setGraph({ rankdir: direction, ranksep, nodesep });\n\n\tconst nodeIds = new Set(nodes.map((node) => node.id));\n\n\tnodes.forEach((node) => {\n\t\tconst nodeWidth = node.measured?.width ?? (node as any).width ?? defaultNodeWidth;\n\t\tconst nodeHeight = node.measured?.height ?? (node as any).height ?? defaultNodeHeight;\n\t\tdagreGraph.setNode(node.id, { width: nodeWidth, height: nodeHeight });\n\t});\n\n\tedges.forEach((edge) => {\n\t\tif (nodeIds.has(edge.source) && nodeIds.has(edge.target)) {\n\t\t\tdagreGraph.setEdge(edge.source, edge.target);\n\t\t}\n\t});\n\n\tdagre.layout(dagreGraph);\n\n\treturn nodes.map((node) => {\n\t\tconst nodeWithPosition = dagreGraph.node(node.id);\n\t\tconst nodeWidth = node.measured?.width ?? (node as any).width ?? defaultNodeWidth;\n\t\tconst nodeHeight = node.measured?.height ?? (node as any).height ?? defaultNodeHeight;\n\n\t\treturn {\n\t\t\t...node,\n\t\t\ttargetPosition: isHorizontal ? Position.Left : Position.Top,\n\t\t\tsourcePosition: isHorizontal ? Position.Right : Position.Bottom,\n\t\t\tposition: {\n\t\t\t\tx: bounds.x + (nodeWithPosition?.x ?? 0) - nodeWidth / 2,\n\t\t\t\ty: bounds.y + (nodeWithPosition?.y ?? 0) - nodeHeight / 2\n\t\t\t}\n\t\t};\n\t});\n}\n","import { tick } from \"svelte\";\nexport function isEventFromTextInput(event) {\n const target = event.target;\n if (!target) return false;\n if (target.tagName === \"INPUT\" || target.tagName === \"TEXTAREA\" || target.tagName === \"SELECT\" || target.isContentEditable || target.closest?.('[contenteditable=\"true\"]') || target.closest?.(\".ProseMirror\")) {\n return true;\n }\n return false;\n}\nexport function isValidCanvasNode(obj) {\n return typeof obj === \"object\" && obj !== null && \"id\" in obj && typeof obj.id === \"string\" && \"position\" in obj && typeof obj.position === \"object\" && obj.position !== null && \"x\" in obj.position && \"y\" in obj.position;\n}\nexport function isValidUrl(url) {\n try {\n const parsed = new URL(url);\n return parsed.protocol === \"http:\" || parsed.protocol === \"https:\";\n } catch {\n return false;\n }\n}\nexport function createCanvasClipboard(options = {}) {\n function copySelectedNodes(selectedNodes, connectedEdges, event) {\n if (event && isEventFromTextInput(event)) {\n return false;\n }\n if (selectedNodes.length === 0) return false;\n const payload = {\n version: 1,\n nodes: selectedNodes,\n edges: connectedEdges\n };\n const serialized = JSON.stringify(payload);\n if (event?.clipboardData) {\n event.clipboardData.setData(\"application/json\", serialized);\n event.clipboardData.setData(\"text/plain\", serialized);\n event.preventDefault();\n } else if (typeof navigator !== \"undefined\" && navigator.clipboard) {\n navigator.clipboard.writeText(serialized).catch(() => {\n });\n }\n return true;\n }\n function cutSelectedNodes(selectedNodes, connectedEdges, onRemove, event) {\n if (event && isEventFromTextInput(event)) {\n return false;\n }\n const copied = copySelectedNodes(selectedNodes, connectedEdges, event);\n if (copied && onRemove) {\n onRemove(selectedNodes);\n }\n return copied;\n }\n async function handlePasteEvent(event) {\n if (isEventFromTextInput(event)) {\n return false;\n }\n const clipboardData = event.clipboardData;\n if (!clipboardData) return false;\n const files = clipboardData.files;\n if (files && files.length > 0) {\n const imageFile = Array.from(files).find((f) => f.type.startsWith(\"image/\"));\n if (imageFile && options.onPasteImage) {\n event.preventDefault();\n await options.onPasteImage(imageFile);\n return true;\n }\n }\n const rawJson = clipboardData.getData(\"application/json\") || clipboardData.getData(\"text/plain\");\n if (rawJson) {\n try {\n const parsed = JSON.parse(rawJson);\n let rawNodes;\n let rawEdges;\n if (Array.isArray(parsed) && parsed.every(isValidCanvasNode)) {\n rawNodes = parsed;\n } else if (typeof parsed === \"object\" && parsed !== null && Array.isArray(parsed.nodes) && parsed.nodes.every(isValidCanvasNode)) {\n rawNodes = parsed.nodes;\n rawEdges = parsed.edges;\n }\n if (rawNodes && rawNodes.length > 0) {\n event.preventDefault();\n const idMap = /* @__PURE__ */ new Map();\n const newNodes = rawNodes.map((node) => {\n const newId = crypto.randomUUID();\n idMap.set(node.id, newId);\n return {\n ...node,\n id: newId,\n selected: true,\n position: {\n x: node.position.x + 40,\n y: node.position.y + 40\n }\n };\n });\n const newEdges = rawEdges?.map((edge) => ({\n ...edge,\n id: crypto.randomUUID(),\n source: idMap.get(edge.source) ?? edge.source,\n target: idMap.get(edge.target) ?? edge.target\n }));\n if (options.onPasteNodes) {\n await options.onPasteNodes(newNodes, newEdges);\n await tick();\n }\n return true;\n }\n } catch {\n }\n }\n const text = clipboardData.getData(\"text/plain\")?.trim();\n if (text) {\n if (isValidUrl(text) && options.onPasteUrl) {\n event.preventDefault();\n options.onPasteUrl(text);\n return true;\n } else if (options.onPasteText) {\n event.preventDefault();\n options.onPasteText(text);\n return true;\n }\n }\n return false;\n }\n return {\n copySelectedNodes,\n cutSelectedNodes,\n handlePasteEvent\n };\n}\n","export function createCanvasDocking(options = {}) {\n let draggedNode = $state.raw(null);\n let draggedInitialPosition = $state.raw(null);\n let connectingHandle = $state.raw(\"\");\n let connectingNode = $state.raw(null);\n let currentHoverTargets = $state.raw(/* @__PURE__ */ new Set());\n const isDockTarget = options.isDockTarget ?? ((target) => target.type === \"boardNode\");\n function handleNodeDragStart(params) {\n draggedNode = params.targetNode;\n draggedInitialPosition = params.targetNode?.position ? { ...params.targetNode.position } : null;\n currentHoverTargets = /* @__PURE__ */ new Set();\n }\n function handleNodeDrag(params, getIntersectingNodes) {\n draggedNode = params.targetNode;\n if (!draggedNode) return;\n const intersecting = getIntersectingNodes(draggedNode);\n const currentDockTargets = intersecting.filter(isDockTarget);\n const newHoverSet = new Set(currentDockTargets.map((t) => t.id));\n currentHoverTargets.forEach((targetId) => {\n if (!newHoverSet.has(targetId)) {\n const leftNode = intersecting.find((n) => n.id === targetId) ?? { id: targetId };\n options.onDockLeave?.(leftNode, draggedNode);\n }\n });\n currentDockTargets.forEach((target) => {\n if (!currentHoverTargets.has(target.id)) {\n options.onDockHover?.(target, draggedNode);\n }\n });\n currentHoverTargets = newHoverSet;\n }\n function handleNodeDragStop(params, getIntersectingNodes, updateNodePosition) {\n draggedNode = params.targetNode;\n if (draggedNode) {\n const intersecting = getIntersectingNodes(draggedNode);\n const dockTarget = intersecting.find(isDockTarget);\n if (dockTarget) {\n options.onDockDrop?.(dockTarget, draggedNode);\n if (options.restorePositionOnDock !== false && draggedInitialPosition && updateNodePosition) {\n updateNodePosition(draggedNode.id, draggedInitialPosition);\n }\n }\n }\n draggedNode = null;\n draggedInitialPosition = null;\n currentHoverTargets = /* @__PURE__ */ new Set();\n options.onSave?.();\n }\n function handleConnectStart(params, getNode) {\n connectingHandle = params.handleType ?? \"\";\n connectingNode = params.nodeId ? getNode(params.nodeId) ?? null : null;\n }\n function handleConnectEnd() {\n connectingHandle = \"\";\n connectingNode = null;\n }\n function reset() {\n draggedNode = null;\n draggedInitialPosition = null;\n connectingHandle = \"\";\n connectingNode = null;\n currentHoverTargets = /* @__PURE__ */ new Set();\n }\n return {\n get draggedNode() {\n return draggedNode;\n },\n get draggedInitialPosition() {\n return draggedInitialPosition;\n },\n get connectingHandle() {\n return connectingHandle;\n },\n get connectingNode() {\n return connectingNode;\n },\n get isDragging() {\n return draggedNode !== null;\n },\n handleNodeDragStart,\n handleNodeDrag,\n handleNodeDragStop,\n handleConnectStart,\n handleConnectEnd,\n reset\n };\n}\n","import { isEventFromTextInput } from './createCanvasClipboard.svelte.js';\nimport type { CanvasNode, CanvasShortcutsOptions } from './types.js';\n\n/**\n * Attaches keyboard shortcut handlers for canvas interaction.\n * Automatically ignores shortcuts when the user is typing into text inputs, textareas, or rich editors.\n *\n * @returns A cleanup function to remove event listeners.\n */\nexport function createCanvasShortcuts<TNode extends CanvasNode = CanvasNode>(\n\toptions: CanvasShortcutsOptions<TNode>\n): () => void {\n\tconst target = options.targetElement ?? (typeof window !== 'undefined' ? window : null);\n\tif (!target) return () => {};\n\n\tfunction handleKeyDown(event: Event) {\n\t\tconst keyboardEvent = event as KeyboardEvent;\n\t\tif (isEventFromTextInput(keyboardEvent)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst isMod = keyboardEvent.metaKey || keyboardEvent.ctrlKey;\n\t\tconst isShift = keyboardEvent.shiftKey;\n\t\tconst key = keyboardEvent.key;\n\n\t\tconst selectedNodes = options.getSelectedNodes ? options.getSelectedNodes() : [];\n\n\t\tif (key === 'Backspace' || key === 'Delete') {\n\t\t\tif (options.onDelete && selectedNodes.length > 0) {\n\t\t\t\tkeyboardEvent.preventDefault();\n\t\t\t\toptions.onDelete(selectedNodes);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tif (isMod) {\n\t\t\tconst lowerKey = key.toLowerCase();\n\n\t\t\tif (lowerKey === 'c' && !isShift) {\n\t\t\t\tif (options.onCopy) {\n\t\t\t\t\t// We let the native copy event fire or call onCopy\n\t\t\t\t\toptions.onCopy();\n\t\t\t\t}\n\t\t\t} else if (lowerKey === 'x' && !isShift) {\n\t\t\t\tif (options.onCut) {\n\t\t\t\t\toptions.onCut();\n\t\t\t\t}\n\t\t\t} else if (lowerKey === 'd' && !isShift) {\n\t\t\t\tif (options.onDuplicate && selectedNodes.length > 0) {\n\t\t\t\t\tkeyboardEvent.preventDefault();\n\t\t\t\t\toptions.onDuplicate(selectedNodes);\n\t\t\t\t}\n\t\t\t} else if (lowerKey === 'a' && !isShift) {\n\t\t\t\tif (options.onSelectAll) {\n\t\t\t\t\tkeyboardEvent.preventDefault();\n\t\t\t\t\toptions.onSelectAll();\n\t\t\t\t}\n\t\t\t} else if (lowerKey === 'g') {\n\t\t\t\tif (isShift) {\n\t\t\t\t\tif (options.onUngroup && selectedNodes.length > 0) {\n\t\t\t\t\t\tkeyboardEvent.preventDefault();\n\t\t\t\t\t\toptions.onUngroup(selectedNodes);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (options.onGroup && selectedNodes.length > 0) {\n\t\t\t\t\t\tkeyboardEvent.preventDefault();\n\t\t\t\t\t\toptions.onGroup(selectedNodes);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (key === '=' || key === '+') {\n\t\t\t\tif (options.onZoomIn) {\n\t\t\t\t\tkeyboardEvent.preventDefault();\n\t\t\t\t\toptions.onZoomIn();\n\t\t\t\t}\n\t\t\t} else if (key === '-') {\n\t\t\t\tif (options.onZoomOut) {\n\t\t\t\t\tkeyboardEvent.preventDefault();\n\t\t\t\t\toptions.onZoomOut();\n\t\t\t\t}\n\t\t\t} else if (key === '0') {\n\t\t\t\tif (options.onFitView) {\n\t\t\t\t\tkeyboardEvent.preventDefault();\n\t\t\t\t\toptions.onFitView();\n\t\t\t\t}\n\t\t\t} else if (lowerKey === 'f') {\n\t\t\t\tif (options.onSearch) {\n\t\t\t\t\tkeyboardEvent.preventDefault();\n\t\t\t\t\toptions.onSearch();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\ttarget.addEventListener('keydown', handleKeyDown as EventListener);\n\n\treturn () => {\n\t\ttarget.removeEventListener('keydown', handleKeyDown as EventListener);\n\t};\n}\n","import { isEventFromTextInput } from \"./createCanvasClipboard.svelte.js\";\nexport function createCanvasInteractions(options = {}) {\n let isSpacebarPanning = $state.raw(false);\n let trackpadDetected = $state.raw(false);\n let toggledPanMode = false;\n function handleKeyDown(event) {\n if (event.key === \" \" || event.code === \"Space\") {\n if (isSpacebarPanning || isEventFromTextInput(event)) return;\n isSpacebarPanning = true;\n toggledPanMode = true;\n options.onPanModeChange?.(true);\n if (typeof document !== \"undefined\") {\n document.body.classList.add(\"cursor-grab\");\n }\n }\n }\n function handleKeyUp(event) {\n if (event.key === \" \" || event.code === \"Space\") {\n if (!isSpacebarPanning && !toggledPanMode) return;\n isSpacebarPanning = false;\n toggledPanMode = false;\n options.onPanModeChange?.(false);\n if (typeof document !== \"undefined\") {\n document.body.classList.remove(\"cursor-grab\");\n }\n }\n }\n function handleWheel(event) {\n if (event.ctrlKey && !trackpadDetected) {\n trackpadDetected = true;\n options.onTrackpadDetected?.();\n }\n }\n function attachListeners(target) {\n const el = target ?? options.targetElement ?? (typeof window !== \"undefined\" ? window : null);\n if (!el) return () => {\n };\n el.addEventListener(\"keydown\", handleKeyDown);\n el.addEventListener(\"keyup\", handleKeyUp);\n el.addEventListener(\"wheel\", handleWheel, { passive: true });\n return () => {\n el.removeEventListener(\"keydown\", handleKeyDown);\n el.removeEventListener(\"keyup\", handleKeyUp);\n el.removeEventListener(\"wheel\", handleWheel);\n if (typeof document !== \"undefined\") {\n document.body.classList.remove(\"cursor-grab\");\n }\n };\n }\n return {\n get isSpacebarPanning() {\n return isSpacebarPanning;\n },\n get trackpadDetected() {\n return trackpadDetected;\n },\n attachListeners,\n destroy: attachListeners()\n };\n}\nexport const defaultSvelteFlowPreset = {\n snapGrid: [25, 25],\n panOnDrag: [0, 1, 2, 3, 4],\n panOnScroll: false,\n selectionOnDrag: false,\n colorMode: \"system\",\n multiSelectionKey: [\"Shift\", \"Meta\"]\n};\nexport const miroCompatiblePreset = {\n ...defaultSvelteFlowPreset,\n panOnDrag: [1, 2],\n selectionOnDrag: true\n};\nexport function restorePanelPointerEvents(panelSelector = \".svelte-flow__panel\") {\n if (typeof document === \"undefined\") return;\n const panels = document.querySelectorAll(panelSelector);\n panels.forEach((panel) => {\n panel.style.pointerEvents = \"auto\";\n });\n}\n","import { cubicOut } from 'svelte/easing';\nimport type { XYPosition } from '@xyflow/svelte';\nimport type {\n\tCanvasNode,\n\tFanOutTrajectoryOptions,\n\tNodeTransition,\n\tTrajectoryFunction,\n\tTrajectoryPoint\n} from './types.js';\n\n/**\n * Standard linear trajectory: straight line interpolation with linear scale & opacity progression.\n */\nexport const linearTrajectory: TrajectoryFunction = (\n\torigin: XYPosition,\n\ttarget: XYPosition,\n\tprogress: number\n): TrajectoryPoint => {\n\treturn {\n\t\tposition: {\n\t\t\tx: origin.x + (target.x - origin.x) * progress,\n\t\t\ty: origin.y + (target.y - origin.y) * progress\n\t\t},\n\t\tscale: progress,\n\t\topacity: Math.min(1, progress * 1.5)\n\t};\n};\n\n/**\n * Linear position trajectory: pure position interpolation without altering scale or opacity.\n * Used for displaced sibling nodes to ensure their visibility remains unaltered.\n */\nexport const linearPositionTrajectory: TrajectoryFunction = (\n\torigin: XYPosition,\n\ttarget: XYPosition,\n\tprogress: number\n): TrajectoryPoint => {\n\treturn {\n\t\tposition: {\n\t\t\tx: origin.x + (target.x - origin.x) * progress,\n\t\t\ty: origin.y + (target.y - origin.y) * progress\n\t\t}\n\t};\n};\n\n/**\n * Creates a fan-out trajectory where nodes arc outward from origin to target.\n * Matches the curved distribution shown in multi-node branching diagrams.\n */\nexport function createFanOutTrajectory(options: FanOutTrajectoryOptions = {}): TrajectoryFunction {\n\tconst {\n\t\tcurvature = 0.4,\n\t\tstartScale = 0,\n\t\tendScale = 1,\n\t\tstartOpacity = 0,\n\t\tendOpacity = 1\n\t} = options;\n\n\treturn (\n\t\torigin: XYPosition,\n\t\ttarget: XYPosition,\n\t\tprogress: number,\n\t\tindex: number,\n\t\ttotal: number\n\t): TrajectoryPoint => {\n\t\tconst dx = target.x - origin.x;\n\t\tconst dy = target.y - origin.y;\n\n\t\t// Normalized index from -1 (top) to +1 (bottom)\n\t\tconst normIndex = total > 1 ? (index - (total - 1) / 2) / ((total - 1) / 2) : 0;\n\n\t\t// Perpendicular control point offset to create smooth fan arc\n\t\tconst midX = origin.x + dx * 0.4;\n\t\tconst midY = origin.y + dy * 0.1 - normIndex * Math.abs(dx) * 0.15 * curvature;\n\n\t\t// Quadratic Bezier interpolation: B(t) = (1-t)^2 * P0 + 2(1-t)t * P1 + t^2 * P2\n\t\tconst t = progress;\n\t\tconst oneMinusT = 1 - t;\n\n\t\tconst x = oneMinusT * oneMinusT * origin.x + 2 * oneMinusT * t * midX + t * t * target.x;\n\t\tconst y = oneMinusT * oneMinusT * origin.y + 2 * oneMinusT * t * midY + t * t * target.y;\n\n\t\tconst scale = startScale + (endScale - startScale) * progress;\n\t\tconst opacity = startOpacity + (endOpacity - startOpacity) * progress;\n\n\t\treturn {\n\t\t\tposition: { x, y },\n\t\t\tscale,\n\t\t\topacity\n\t\t};\n\t};\n}\n\n/**\n * Creates a custom quadratic Bezier trajectory with a specified or dynamically calculated control point.\n */\nexport function createBezierTrajectory(\n\tgetControlPoint: (origin: XYPosition, target: XYPosition) => XYPosition\n): TrajectoryFunction {\n\treturn (origin: XYPosition, target: XYPosition, progress: number): TrajectoryPoint => {\n\t\tconst cp = getControlPoint(origin, target);\n\t\tconst t = progress;\n\t\tconst oneMinusT = 1 - t;\n\n\t\tconst x = oneMinusT * oneMinusT * origin.x + 2 * oneMinusT * t * cp.x + t * t * target.x;\n\t\tconst y = oneMinusT * oneMinusT * origin.y + 2 * oneMinusT * t * cp.y + t * t * target.y;\n\n\t\treturn {\n\t\t\tposition: { x, y },\n\t\t\tscale: progress,\n\t\t\topacity: progress\n\t\t};\n\t};\n}\n\n/**\n * Coordinates and animates multiple node transitions simultaneously with zero per-frame array allocations.\n * Directly mutates node positions and data (scale, opacity) in-place during the animation loop.\n */\nexport function runMultiNodeTransition<TNode extends CanvasNode = CanvasNode>(\n\ttransitions: NodeTransition<TNode>[],\n\toptions: {\n\t\tdefaultDuration?: number;\n\t\tdefaultEasing?: (t: number) => number;\n\t\tonUpdate?: () => void;\n\t\tonComplete?: () => void;\n\t} = {}\n): () => void {\n\tif (transitions.length === 0) {\n\t\toptions.onComplete?.();\n\t\treturn () => {};\n\t}\n\n\tconst { defaultDuration = 400, defaultEasing = cubicOut, onUpdate, onComplete } = options;\n\n\tlet isCancelled = false;\n\tconst startTime = Date.now();\n\n\tconst items = transitions.map((tr, i) => ({\n\t\t...tr,\n\t\tindex: tr.index ?? i,\n\t\ttotal: tr.total ?? transitions.length,\n\t\tduration: tr.duration ?? defaultDuration,\n\t\teasing: tr.easing ?? defaultEasing,\n\t\tdelay: tr.delay ?? 0,\n\t\ttrajectory: tr.trajectory ?? linearTrajectory\n\t}));\n\n\tfunction frame() {\n\t\tif (isCancelled) return;\n\n\t\tconst now = Date.now();\n\t\tlet allCompleted = true;\n\n\t\tfor (let i = 0; i < items.length; i++) {\n\t\t\tconst item = items[i];\n\t\t\tconst elapsed = now - (startTime + item.delay);\n\n\t\t\tif (elapsed < 0) {\n\t\t\t\tallCompleted = false;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst rawProgress = item.duration <= 0 ? 1 : Math.min(elapsed / item.duration, 1);\n\t\t\tconst progress = item.duration <= 0 ? 1 : item.easing(rawProgress);\n\n\t\t\tconst point = item.trajectory(item.from, item.to, progress, item.index, item.total);\n\n\t\t\t// Direct in-place mutation avoids array reconstruction during RAF\n\t\t\titem.node.position = { ...point.position };\n\n\t\t\tif (point.scale !== undefined || point.opacity !== undefined) {\n\t\t\t\tif (!item.node.data) {\n\t\t\t\t\titem.node.data = {} as any;\n\t\t\t\t}\n\t\t\t\tif (point.scale !== undefined) {\n\t\t\t\t\t(item.node.data as any).scale = point.scale;\n\t\t\t\t}\n\t\t\t\tif (point.opacity !== undefined) {\n\t\t\t\t\t(item.node.data as any).opacity = point.opacity;\n\t\t\t\t\tconst currentStyle = (item.node.style || '').replace(/opacity:\\s*[^;]+;?/g, '').trim();\n\t\t\t\t\titem.node.style = `${currentStyle ? currentStyle + '; ' : ''}opacity: ${point.opacity};`;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (rawProgress < 1) {\n\t\t\t\tallCompleted = false;\n\t\t\t}\n\t\t}\n\n\t\tonUpdate?.();\n\n\t\tif (!allCompleted) {\n\t\t\tif (typeof requestAnimationFrame !== 'undefined') {\n\t\t\t\trequestAnimationFrame(frame);\n\t\t\t}\n\t\t} else {\n\t\t\tonComplete?.();\n\t\t}\n\t}\n\n\tframe();\n\n\treturn () => {\n\t\tisCancelled = true;\n\t};\n}\n","import dagre from '@dagrejs/dagre';\nimport type { Rect, XYPosition } from '@xyflow/svelte';\nimport type {\n\tCanvasEdge,\n\tCanvasLayoutOptions,\n\tCanvasNode,\n\tDirectionalDisplacementOptions\n} from './types.js';\n\n/**\n * Calculates a bounding rectangle for a set of nodes if not provided by getNodesBounds.\n */\nexport function computeNodesBoundingBox<TNode extends CanvasNode = CanvasNode>(\n\tnodes: TNode[],\n\tdefaultWidth = 200,\n\tdefaultHeight = 60\n): Rect {\n\tif (nodes.length === 0) {\n\t\treturn { x: 0, y: 0, width: 0, height: 0 };\n\t}\n\n\tlet minX = Infinity;\n\tlet minY = Infinity;\n\tlet maxX = -Infinity;\n\tlet maxY = -Infinity;\n\n\tfor (const node of nodes) {\n\t\tconst width = node.measured?.width ?? (node as any).width ?? defaultWidth;\n\t\tconst height = node.measured?.height ?? (node as any).height ?? defaultHeight;\n\n\t\tminX = Math.min(minX, node.position.x);\n\t\tminY = Math.min(minY, node.position.y);\n\t\tmaxX = Math.max(maxX, node.position.x + width);\n\t\tmaxY = Math.max(maxY, node.position.y + height);\n\t}\n\n\treturn {\n\t\tx: minX,\n\t\ty: minY,\n\t\twidth: maxX - minX,\n\t\theight: maxY - minY\n\t};\n}\n\n/**\n * Pure directional displacement calculation.\n * Shifts downstream or surrounding nodes along an axis to clear space for newly inserted child nodes.\n */\nexport function calculateDirectionalDisplacement<TNode extends CanvasNode = CanvasNode>(params: {\n\texistingNodes: TNode[];\n\toriginNode: TNode;\n\tchildNodes: TNode[];\n\tgetNodesBounds?: (nodes: TNode[]) => Rect;\n\toptions?: DirectionalDisplacementOptions;\n}): Map<string, XYPosition> {\n\tconst {\n\t\texistingNodes,\n\t\toriginNode,\n\t\tchildNodes,\n\t\tgetNodesBounds,\n\t\toptions = {}\n\t} = params;\n\n\tconst {\n\t\tdirection = 'right',\n\t\tgap = 40,\n\t\tspreadSiblingLanes = false,\n\t\tsiblingTolerance = 50,\n\t\tminY\n\t} = options;\n\n\tconst displacedMap = new Map<string, XYPosition>();\n\tif (childNodes.length === 0 || existingNodes.length === 0) {\n\t\treturn displacedMap;\n\t}\n\n\tconst childBounds = getNodesBounds\n\t\t? getNodesBounds(childNodes)\n\t\t: computeNodesBoundingBox(childNodes);\n\n\tconst originWidth = originNode.measured?.width ?? (originNode as any).width ?? 200;\n\tconst originHeight = originNode.measured?.height ?? (originNode as any).height ?? 60;\n\n\t// The delta space required along primary axis\n\tconst deltaPrimary = (direction === 'right' || direction === 'left')\n\t\t? childBounds.width + gap\n\t\t: childBounds.height + gap;\n\n\t// Vertical displacement parameters: upward and downward row clearance\n\tconst deltaUp = Math.max(0, originNode.position.y - childBounds.y + gap);\n\tconst deltaDown = Math.max(\n\t\t0,\n\t\tchildBounds.y + childBounds.height - (originNode.position.y + originHeight) + gap\n\t);\n\n\t// Both above and below displace equally so the row expands symmetrically\n\tconst equalDelta = Math.max(deltaUp, deltaDown);\n\n\tfor (const node of existingNodes) {\n\t\tif (node.id === originNode.id) continue;\n\n\t\tlet newX = node.position.x;\n\t\tlet newY = node.position.y;\n\t\tlet moved = false;\n\n\t\tif (direction === 'right') {\n\t\t\t// Downstream nodes strictly to the right of the origin\n\t\t\tif (node.position.x >= originNode.position.x + originWidth * 0.5) {\n\t\t\t\tnewX += deltaPrimary;\n\t\t\t\tmoved = true;\n\t\t\t} else if (spreadSiblingLanes) {\n\t\t\t\t// Sibling nodes occupying the same vertical space as the exploded cluster\n\t\t\t\tconst isVerticallyOverlapping =\n\t\t\t\t\tnode.position.y + ((node as any).height ?? 60) >= childBounds.y - gap &&\n\t\t\t\t\tnode.position.y <= childBounds.y + childBounds.height + gap;\n\n\t\t\t\tif (isVerticallyOverlapping && Math.abs(node.position.x - originNode.position.x) <= siblingTolerance) {\n\t\t\t\t\tconst pushDirection = node.position.y >= originNode.position.y ? 1 : -1;\n\t\t\t\t\tnewY += pushDirection * (childBounds.height * 0.5 + gap);\n\t\t\t\t\tmoved = true;\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (direction === 'left') {\n\t\t\tif (node.position.x <= originNode.position.x) {\n\t\t\t\tnewX -= deltaPrimary;\n\t\t\t\tmoved = true;\n\t\t\t}\n\t\t} else if (direction === 'down') {\n\t\t\tif (node.position.y >= originNode.position.y + originHeight * 0.5) {\n\t\t\t\tnewY += deltaPrimary;\n\t\t\t\tmoved = true;\n\t\t\t}\n\t\t} else if (direction === 'up') {\n\t\t\tif (node.position.y <= originNode.position.y) {\n\t\t\t\tnewY -= deltaPrimary;\n\t\t\t\tmoved = true;\n\t\t\t}\n\t\t} else if (direction === 'vertical') {\n\t\t\t// Row grows vertically:\n\t\t\t// Nodes strictly above the origin node move up by equalDelta\n\t\t\t// Nodes strictly below the origin node move down by equalDelta\n\t\t\t// Both above and below displace equally; horizontal position (x) is strictly preserved\n\t\t\tif (node.position.y < originNode.position.y) {\n\t\t\t\tif (equalDelta > 0) {\n\t\t\t\t\tnewY -= equalDelta;\n\t\t\t\t\tmoved = true;\n\t\t\t\t}\n\t\t\t} else if (node.position.y >= originNode.position.y + originHeight * 0.5) {\n\t\t\t\tif (equalDelta > 0) {\n\t\t\t\t\tnewY += equalDelta;\n\t\t\t\t\tmoved = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (moved) {\n\t\t\tdisplacedMap.set(node.id, { x: newX, y: newY });\n\t\t}\n\t}\n\n\treturn displacedMap;\n}\n\n/**\n * Pure hierarchical Dagre reflow displacement calculation.\n * Calculates new coordinates for surrounding nodes using Dagre hierarchical layout,\n * anchoring the origin node at its current position to eliminate layout jumping.\n */\nexport function calculateReflowDisplacement<\n\tTNode extends CanvasNode = CanvasNode,\n\tTEdge extends CanvasEdge = CanvasEdge\n>(params: {\n\texistingNodes: TNode[];\n\texistingEdges: TEdge[];\n\toriginNode: TNode;\n\tchildNodes: TNode[];\n\tchildEdges?: TEdge[];\n\tgetNodesBounds?: (nodes: TNode[]) => Rect;\n\toptions?: CanvasLayoutOptions;\n}): Map<string, XYPosition> {\n\tconst {\n\t\texistingNodes,\n\t\texistingEdges,\n\t\toriginNode,\n\t\tchildNodes,\n\t\tchildEdges = [],\n\t\toptions = {}\n\t} = params;\n\n\tconst {\n\t\tdirection = 'LR',\n\t\tranksep = 80,\n\t\tnodesep = 30,\n\t\tdefaultNodeWidth = 200,\n\t\tdefaultNodeHeight = 60\n\t} = options;\n\n\tconst displacedMap = new Map<string, XYPosition>();\n\tif (existingNodes.length === 0) return displacedMap;\n\n\tconst allNodes = [...existingNodes, ...childNodes];\n\tconst allEdges = [...existingEdges, ...childEdges];\n\n\tconst dagreGraph = new dagre.graphlib.Graph();\n\tdagreGraph.setDefaultEdgeLabel(() => ({}));\n\tdagreGraph.setGraph({ rankdir: direction, ranksep, nodesep });\n\n\tconst allNodeIds = new Set(allNodes.map((n) => n.id));\n\n\tallNodes.forEach((node) => {\n\t\tconst nodeWidth = node.measured?.width ?? (node as any).width ?? defaultNodeWidth;\n\t\tconst nodeHeight = node.measured?.height ?? (node as any).height ?? defaultNodeHeight;\n\t\tdagreGraph.setNode(node.id, { width: nodeWidth, height: nodeHeight });\n\t});\n\n\tallEdges.forEach((edge) => {\n\t\tif (allNodeIds.has(edge.source) && allNodeIds.has(edge.target)) {\n\t\t\tdagreGraph.setEdge(edge.source, edge.target);\n\t\t}\n\t});\n\n\tdagre.layout(dagreGraph);\n\n\tconst dagreOrigin = dagreGraph.node(originNode.id);\n\tif (!dagreOrigin) return displacedMap;\n\n\tconst originWidth = originNode.measured?.width ?? (originNode as any).width ?? defaultNodeWidth;\n\tconst originHeight = originNode.measured?.height ?? (originNode as any).height ?? defaultNodeHeight;\n\n\t// Calculate offset so origin node remains anchored at its exact initial coordinates\n\tconst anchorOffsetX = originNode.position.x - (dagreOrigin.x - originWidth / 2);\n\tconst anchorOffsetY = originNode.position.y - (dagreOrigin.y - originHeight / 2);\n\n\texistingNodes.forEach((node) => {\n\t\tif (node.id === originNode.id) return;\n\n\t\tconst dagreNode = dagreGraph.node(node.id);\n\t\tif (!dagreNode) return;\n\n\t\tconst nodeWidth = node.measured?.width ?? (node as any).width ?? defaultNodeWidth;\n\t\tconst nodeHeight = node.measured?.height ?? (node as any).height ?? defaultNodeHeight;\n\n\t\tconst targetX = dagreNode.x - nodeWidth / 2 + anchorOffsetX;\n\t\tconst targetY = dagreNode.y - nodeHeight / 2 + anchorOffsetY;\n\n\t\t// Only include if position actually shifted\n\t\tif (Math.abs(targetX - node.position.x) > 0.5 || Math.abs(targetY - node.position.y) > 0.5) {\n\t\t\tdisplacedMap.set(node.id, { x: targetX, y: targetY });\n\t\t}\n\t});\n\n\treturn displacedMap;\n}\n","import { cubicOut } from \"svelte/easing\";\nimport {\n calculateDirectionalDisplacement,\n calculateReflowDisplacement\n} from \"./createCanvasDisplacement.js\";\nimport {\n createFanOutTrajectory,\n linearPositionTrajectory,\n runMultiNodeTransition\n} from \"./createCanvasTrajectory.js\";\nexport function createCanvasExplosion(graph, options = {}) {\n let explodedNodeIds = $state([]);\n const snapshots = /* @__PURE__ */ new Map();\n let activeAnimationCancel = null;\n function isExploded(nodeId) {\n return explodedNodeIds.includes(nodeId);\n }\n function explodeNode(parentId, explodeOptions) {\n if (isExploded(parentId)) {\n return false;\n }\n const parentNode = graph.nodes.find((n) => n.id === parentId);\n if (!parentNode) {\n return false;\n }\n const {\n childNodes,\n childEdges = [],\n connectParentToChildren = \"all\",\n displacementStrategy = \"directional\",\n directionalOptions = {},\n reflowOptions = {},\n trajectory,\n duration = 500,\n staggerDelay = 20,\n easing = cubicOut,\n onComplete\n } = explodeOptions;\n if (childNodes.length === 0) {\n return false;\n }\n let displacementMap;\n if (displacementStrategy === \"dagre\") {\n displacementMap = calculateReflowDisplacement({\n existingNodes: graph.nodes,\n existingEdges: graph.edges,\n originNode: parentNode,\n childNodes,\n childEdges,\n getNodesBounds: options.getNodesBounds,\n options: {\n ...reflowOptions,\n direction: reflowOptions.direction ?? \"LR\"\n }\n });\n } else if (displacementStrategy === \"none\") {\n displacementMap = /* @__PURE__ */ new Map();\n } else {\n displacementMap = calculateDirectionalDisplacement({\n existingNodes: graph.nodes,\n originNode: parentNode,\n childNodes,\n getNodesBounds: options.getNodesBounds,\n options: directionalOptions\n });\n }\n const displacedNodesSnapshot = Array.from(displacementMap.entries()).map(([id]) => {\n const node = graph.nodes.find((n) => n.id === id);\n return {\n id,\n originalPosition: { ...node?.position ?? { x: 0, y: 0 } }\n };\n });\n const edgesToAdd = [...childEdges];\n const defaultCreateEdge = (sourceId, targetId) => {\n if (graph.createEdge) {\n return graph.createEdge(sourceId, targetId);\n }\n return {\n id: crypto.randomUUID(),\n type: \"default\",\n source: sourceId,\n target: targetId\n };\n };\n if (connectParentToChildren === \"all\" || connectParentToChildren === true) {\n childNodes.forEach((child) => {\n const exists = edgesToAdd.some((e) => e.source === parentId && e.target === child.id);\n if (!exists) {\n edgesToAdd.push(defaultCreateEdge(parentId, child.id));\n }\n });\n } else if (connectParentToChildren === \"first\" && childNodes.length > 0) {\n const firstChild = childNodes[0];\n const exists = edgesToAdd.some((e) => e.source === parentId && e.target === firstChild.id);\n if (!exists) {\n edgesToAdd.push(defaultCreateEdge(parentId, firstChild.id));\n }\n }\n const snapshot = {\n parentId,\n childNodeIds: childNodes.map((n) => n.id),\n childEdgeIds: edgesToAdd.map((e) => e.id),\n displacedNodes: displacedNodesSnapshot,\n timestamp: Date.now()\n };\n snapshots.set(parentId, snapshot);\n const originPos = { ...parentNode.position };\n const targetPositions = childNodes.map((child) => ({ ...child.position }));\n childNodes.forEach((child) => {\n child.position = { ...originPos };\n if (!child.data) child.data = {};\n child.data.scale = 0;\n child.data.opacity = 0;\n const currentStyle = (child.style || \"\").replace(/opacity:\\s*[^;]+;?/g, \"\").trim();\n child.style = `${currentStyle ? currentStyle + \"; \" : \"\"}opacity: 0;`;\n });\n edgesToAdd.forEach((edge) => {\n const currentStyle = (edge.style || \"\").replace(/opacity:\\s*[^;]+;?/g, \"\").trim();\n edge.style = `${currentStyle ? currentStyle + \"; \" : \"\"}opacity: 0;`;\n });\n graph.addNodeOrNodes(childNodes, void 0, false);\n if (edgesToAdd.length > 0) {\n graph.addEdges(edgesToAdd, false);\n }\n const chosenTrajectory = trajectory ?? createFanOutTrajectory({ curvature: 0.35 });\n const transitions = [];\n const effectiveStagger = duration === 0 ? 0 : staggerDelay;\n childNodes.forEach((child, i) => {\n transitions.push({\n node: child,\n from: originPos,\n to: targetPositions[i],\n trajectory: chosenTrajectory,\n delay: i * effectiveStagger,\n duration,\n easing,\n index: i,\n total: childNodes.length\n });\n });\n displacementMap.forEach((targetPos, nodeId) => {\n const node = graph.nodes.find((n) => n.id === nodeId);\n if (node) {\n transitions.push({\n node,\n from: { ...node.position },\n to: targetPos,\n trajectory: linearPositionTrajectory,\n duration,\n easing\n });\n }\n });\n if (activeAnimationCancel) {\n activeAnimationCancel();\n }\n activeAnimationCancel = runMultiNodeTransition(transitions, {\n defaultDuration: duration,\n defaultEasing: easing,\n onUpdate: () => {\n if (edgesToAdd.length > 0) {\n const childIdSet = new Set(childNodes.map((c) => c.id));\n const childEdgesInGraph = graph.edges.filter((e) => childIdSet.has(e.target));\n if (childEdgesInGraph.length > 0) {\n childEdgesInGraph.forEach((edge) => {\n const child = childNodes.find((c) => c.id === edge.target);\n const childOpacity = child?.data?.opacity ?? 1;\n const currentStyle = (edge.style || \"\").replace(/opacity:\\s*[^;]+;?/g, \"\").trim();\n edge.style = `${currentStyle ? currentStyle + \"; \" : \"\"}opacity: ${childOpacity};`;\n });\n graph.setEdges([...graph.edges]);\n }\n }\n transitions.forEach((t) => {\n const graphNode = graph.nodes.find((n) => n.id === t.node.id);\n if (graphNode && graphNode !== t.node) {\n graphNode.position = { ...t.node.position };\n graphNode.style = t.node.style;\n if (t.node.data) {\n graphNode.data = { ...graphNode.data, ...t.node.data };\n }\n }\n });\n graph.setNodes([...graph.nodes]);\n },\n onComplete: () => {\n childNodes.forEach((child, i) => {\n const node = graph.nodes.find((n) => n.id === child.id);\n if (node) {\n node.position = { ...targetPositions[i] };\n node.style = (node.style || \"\").replace(/opacity:\\s*[^;]+;?/g, \"\").trim() || void 0;\n if (node.data) {\n node.data.opacity = 1;\n }\n }\n });\n displacementMap.forEach((targetPos, nodeId) => {\n const graphNode = graph.nodes.find((n) => n.id === nodeId);\n if (graphNode) {\n graphNode.position = { ...targetPos };\n }\n });\n edgesToAdd.forEach((edge) => {\n const graphEdge = graph.edges.find((e) => e.id === edge.id);\n if (graphEdge) {\n graphEdge.style = (graphEdge.style || \"\").replace(/opacity:\\s*[^;]+;?/g, \"\").trim() || void 0;\n }\n });\n graph.setNodes([...graph.nodes]);\n graph.setEdges([...graph.edges]);\n explodedNodeIds = [...explodedNodeIds, parentId];\n activeAnimationCancel = null;\n options.onSave?.();\n graph.onSave?.();\n onComplete?.();\n }\n });\n return true;\n }\n function collapseNode(parentId, collapseOptions = {}) {\n const snapshot = snapshots.get(parentId);\n if (!snapshot) {\n return false;\n }\n const parentNode = graph.nodes.find((n) => n.id === parentId);\n if (!parentNode) {\n return false;\n }\n const {\n duration = 400,\n staggerDelay = 15,\n easing = cubicOut,\n trajectory,\n onComplete\n } = collapseOptions;\n const childIdSet = new Set(snapshot.childNodeIds);\n const activeChildNodes = graph.nodes.filter((n) => childIdSet.has(n.id));\n const originPos = { ...parentNode.position };\n const reverseTrajectory = trajectory ?? createFanOutTrajectory({\n curvature: 0.2,\n startScale: 1,\n endScale: 0,\n startOpacity: 1,\n endOpacity: 0\n });\n const transitions = [];\n const effectiveStagger = duration === 0 ? 0 : staggerDelay;\n activeChildNodes.forEach((child, i) => {\n transitions.push({\n node: child,\n from: { ...child.position },\n to: originPos,\n trajectory: reverseTrajectory,\n delay: (activeChildNodes.length - 1 - i) * effectiveStagger,\n duration,\n easing,\n index: i,\n total: activeChildNodes.length\n });\n });\n snapshot.displacedNodes.forEach(({ id, originalPosition }) => {\n const node = graph.nodes.find((n) => n.id === id);\n if (node) {\n transitions.push({\n node,\n from: { ...node.position },\n to: originalPosition,\n trajectory: linearPositionTrajectory,\n duration,\n easing\n });\n }\n });\n if (activeAnimationCancel) {\n activeAnimationCancel();\n }\n activeAnimationCancel = runMultiNodeTransition(transitions, {\n defaultDuration: duration,\n defaultEasing: easing,\n onUpdate: () => {\n const edgeIdSet = new Set(snapshot.childEdgeIds);\n const childEdgesInGraph = graph.edges.filter((e) => edgeIdSet.has(e.id));\n if (childEdgesInGraph.length > 0) {\n childEdgesInGraph.forEach((edge) => {\n const child = activeChildNodes.find((c) => c.id === edge.target);\n const childOpacity = child?.data?.opacity ?? 0;\n const currentStyle = (edge.style || \"\").replace(/opacity:\\s*[^;]+;?/g, \"\").trim();\n edge.style = `${currentStyle ? currentStyle + \"; \" : \"\"}opacity: ${childOpacity};`;\n });\n graph.setEdges([...graph.edges]);\n }\n transitions.forEach((t) => {\n const graphNode = graph.nodes.find((n) => n.id === t.node.id);\n if (graphNode && graphNode !== t.node) {\n graphNode.position = { ...t.node.position };\n graphNode.style = t.node.style;\n if (t.node.data) {\n graphNode.data = { ...graphNode.data, ...t.node.data };\n }\n }\n });\n graph.setNodes([...graph.nodes]);\n },\n onComplete: () => {\n graph.removeNodes(activeChildNodes, false);\n const edgeIdSet = new Set(snapshot.childEdgeIds);\n const edgesToRemove = graph.edges.filter((e) => edgeIdSet.has(e.id));\n if (edgesToRemove.length > 0) {\n graph.removeEdges(edgesToRemove, false);\n }\n snapshot.displacedNodes.forEach(({ id, originalPosition }) => {\n const graphNode = graph.nodes.find((n) => n.id === id);\n if (graphNode) {\n graphNode.position = { ...originalPosition };\n }\n });\n graph.setNodes([...graph.nodes]);\n snapshots.delete(parentId);\n explodedNodeIds = explodedNodeIds.filter((id) => id !== parentId);\n activeAnimationCancel = null;\n options.onSave?.();\n graph.onSave?.();\n onComplete?.();\n }\n });\n return true;\n }\n function toggleExplode(parentId, explodeOptions, collapseOptions) {\n if (isExploded(parentId)) {\n return collapseNode(parentId, collapseOptions);\n }\n return explodeNode(parentId, explodeOptions);\n }\n function getSnapshot(parentId) {\n return snapshots.get(parentId);\n }\n return {\n get explodedNodeIds() {\n return explodedNodeIds;\n },\n isExploded,\n explodeNode,\n collapseNode,\n toggleExplode,\n getSnapshot\n };\n}\n"],"mappings":"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","names":["cubicOut","dagre","cubicOut","cubicOut"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pixerate/editor-svelte",
3
- "version": "0.5.2",
3
+ "version": "0.5.4",
4
4
  "description": "Svelte bindings and prompt/rich-text components for @pixerate/editor",
5
5
  "author": "Pixerate",
6
6
  "license": "MIT",
@@ -1,6 +1,7 @@
1
1
  import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
2
2
  import {
3
3
  linearTrajectory,
4
+ linearPositionTrajectory,
4
5
  createFanOutTrajectory,
5
6
  createBezierTrajectory,
6
7
  runMultiNodeTransition
@@ -48,10 +49,35 @@ describe('Canvas Trajectory Math & Transition Runner', () => {
48
49
 
49
50
  expect(topPoint.scale).toBeCloseTo(0.6);
50
51
  expect(bottomPoint.scale).toBeCloseTo(0.6);
52
+ expect(topPoint.opacity).toBeCloseTo(0.5);
53
+ expect(bottomPoint.opacity).toBeCloseTo(0.5);
51
54
  // Trajectory arc deflects top and bottom differently based on normalized index
52
55
  expect(topPoint.position.y).not.toBe(bottomPoint.position.y);
53
56
  });
54
57
 
58
+ it('evaluates linearPositionTrajectory without altering scale or opacity', () => {
59
+ const origin = { x: 10, y: 20 };
60
+ const target = { x: 110, y: 120 };
61
+
62
+ const pt = linearPositionTrajectory(origin, target, 0.5, 0, 1);
63
+ expect(pt.position).toEqual({ x: 60, y: 70 });
64
+ expect(pt.scale).toBeUndefined();
65
+ expect(pt.opacity).toBeUndefined();
66
+ });
67
+
68
+ it('creates reverse trajectory fading out opacity from 1 to 0', () => {
69
+ const reverseTrajectory = createFanOutTrajectory({
70
+ startOpacity: 1,
71
+ endOpacity: 0,
72
+ startScale: 1,
73
+ endScale: 0
74
+ });
75
+
76
+ const pt = reverseTrajectory({ x: 100, y: 100 }, { x: 0, y: 0 }, 0.5, 0, 1);
77
+ expect(pt.opacity).toBeCloseTo(0.5);
78
+ expect(pt.scale).toBeCloseTo(0.5);
79
+ });
80
+
55
81
  it('creates custom bezier trajectory with control point calculator', () => {
56
82
  const trajectory = createBezierTrajectory((orig, tgt) => ({
57
83
  x: orig.x,
@@ -90,6 +116,36 @@ describe('Canvas Trajectory Math & Transition Runner', () => {
90
116
  expect(onComplete).toHaveBeenCalled();
91
117
  cancel();
92
118
  });
119
+
120
+ it('animates opacity and sets style in runMultiNodeTransition', () => {
121
+ const node: CanvasNode = {
122
+ id: 'n1',
123
+ position: { x: 0, y: 0 },
124
+ data: {}
125
+ };
126
+
127
+ const trajectory = createFanOutTrajectory({
128
+ startOpacity: 0,
129
+ endOpacity: 1
130
+ });
131
+
132
+ const cancel = runMultiNodeTransition(
133
+ [
134
+ {
135
+ node,
136
+ from: { x: 0, y: 0 },
137
+ to: { x: 100, y: 100 },
138
+ trajectory,
139
+ duration: 0
140
+ }
141
+ ]
142
+ );
143
+
144
+ expect(node.position).toEqual({ x: 100, y: 100 });
145
+ expect((node.data as any).opacity).toBe(1);
146
+ expect(node.style).toContain('opacity: 1');
147
+ cancel();
148
+ });
93
149
  });
94
150
 
95
151
  describe('Spatial Displacement Solvers', () => {
@@ -297,4 +353,98 @@ describe('createCanvasExplosion Rune Lifecycle & Reversibility', () => {
297
353
  explosion.toggleExplode('origin', { childNodes: [child], duration: 0 }, { duration: 0 });
298
354
  expect(explosion.isExploded('origin')).toBe(false);
299
355
  });
356
+
357
+ it('updates node positions and opacity continuously across multiple animation frames without freezing', () => {
358
+ let currentTime = 1000;
359
+ const originalDateNow = Date.now;
360
+ Date.now = () => currentTime;
361
+
362
+ let rafCallback: (() => void) | null = null;
363
+ const originalRaf = globalThis.requestAnimationFrame;
364
+ globalThis.requestAnimationFrame = ((cb: () => void) => {
365
+ rafCallback = cb;
366
+ return 1;
367
+ }) as any;
368
+
369
+ try {
370
+ const origin = createNode('origin', 0, 0);
371
+ const graph = createCanvasGraph({ initialNodes: [origin] });
372
+ const explosion = createCanvasExplosion(graph);
373
+
374
+ const child = createNode('c1', 100, 100);
375
+
376
+ explosion.explodeNode('origin', {
377
+ childNodes: [child],
378
+ duration: 200,
379
+ easing: (t) => t,
380
+ trajectory: linearPositionTrajectory
381
+ });
382
+
383
+ // Frame 0 ran at t=0 (currentTime = 1000)
384
+ let graphChild = graph.nodes.find((n) => n.id === 'c1')!;
385
+ expect(graphChild).toBeDefined();
386
+
387
+ // Advance time by 100ms (progress = 0.5)
388
+ currentTime = 1100;
389
+ expect(rafCallback).not.toBeNull();
390
+ if (rafCallback) {
391
+ const nextCb = rafCallback;
392
+ rafCallback = null;
393
+ nextCb();
394
+ }
395
+
396
+ graphChild = graph.nodes.find((n) => n.id === 'c1')!;
397
+ expect(graphChild.position.x).toBeCloseTo(50, 0);
398
+ expect(graphChild.position.y).toBeCloseTo(50, 0);
399
+
400
+ // Advance time by another 100ms (progress = 1.0)
401
+ currentTime = 1200;
402
+ expect(rafCallback).not.toBeNull();
403
+ if (rafCallback) {
404
+ const nextCb = rafCallback;
405
+ rafCallback = null;
406
+ nextCb();
407
+ }
408
+
409
+ graphChild = graph.nodes.find((n) => n.id === 'c1')!;
410
+ expect(graphChild.position.x).toBeCloseTo(100, 0);
411
+ expect(graphChild.position.y).toBeCloseTo(100, 0);
412
+
413
+ // Collapse node over 200ms
414
+ explosion.collapseNode('origin', {
415
+ duration: 200,
416
+ easing: (t) => t,
417
+ trajectory: linearPositionTrajectory
418
+ });
419
+
420
+ // Advance time by 100ms into collapse (progress = 0.5)
421
+ currentTime = 1300;
422
+ expect(rafCallback).not.toBeNull();
423
+ if (rafCallback) {
424
+ const nextCb = rafCallback;
425
+ rafCallback = null;
426
+ nextCb();
427
+ }
428
+
429
+ graphChild = graph.nodes.find((n) => n.id === 'c1')!;
430
+ expect(graphChild).toBeDefined();
431
+ expect(graphChild.position.x).toBeCloseTo(50, 0);
432
+ expect(graphChild.position.y).toBeCloseTo(50, 0);
433
+
434
+ // Advance time by another 100ms (collapse completion)
435
+ currentTime = 1400;
436
+ expect(rafCallback).not.toBeNull();
437
+ if (rafCallback) {
438
+ const nextCb = rafCallback;
439
+ rafCallback = null;
440
+ nextCb();
441
+ }
442
+
443
+ expect(graph.nodes.some((n) => n.id === 'c1')).toBe(false);
444
+ expect(explosion.isExploded('origin')).toBe(false);
445
+ } finally {
446
+ Date.now = originalDateNow;
447
+ globalThis.requestAnimationFrame = originalRaf;
448
+ }
449
+ });
300
450
  });
@@ -14,6 +14,7 @@ import {
14
14
  } from './createCanvasDisplacement.js';
15
15
  import {
16
16
  createFanOutTrajectory,
17
+ linearPositionTrajectory,
17
18
  linearTrajectory,
18
19
  runMultiNodeTransition
19
20
  } from './createCanvasTrajectory.js';
@@ -172,6 +173,13 @@ export function createCanvasExplosion<
172
173
  if (!child.data) child.data = {} as any;
173
174
  (child.data as any).scale = 0;
174
175
  (child.data as any).opacity = 0;
176
+ const currentStyle = (child.style || '').replace(/opacity:\s*[^;]+;?/g, '').trim();
177
+ child.style = `${currentStyle ? currentStyle + '; ' : ''}opacity: 0;`;
178
+ });
179
+
180
+ edgesToAdd.forEach((edge) => {
181
+ const currentStyle = (edge.style || '').replace(/opacity:\s*[^;]+;?/g, '').trim();
182
+ edge.style = `${currentStyle ? currentStyle + '; ' : ''}opacity: 0;`;
175
183
  });
176
184
 
177
185
  // Add nodes and edges to graph without saving yet
@@ -208,7 +216,7 @@ export function createCanvasExplosion<
208
216
  node,
209
217
  from: { ...node.position },
210
218
  to: targetPos,
211
- trajectory: linearTrajectory,
219
+ trajectory: linearPositionTrajectory,
212
220
  duration,
213
221
  easing
214
222
  });
@@ -224,10 +232,59 @@ export function createCanvasExplosion<
224
232
  defaultDuration: duration,
225
233
  defaultEasing: easing,
226
234
  onUpdate: () => {
235
+ if (edgesToAdd.length > 0) {
236
+ const childIdSet = new Set(childNodes.map((c) => c.id));
237
+ const childEdgesInGraph = graph.edges.filter((e) => childIdSet.has(e.target));
238
+ if (childEdgesInGraph.length > 0) {
239
+ childEdgesInGraph.forEach((edge) => {
240
+ const child = childNodes.find((c) => c.id === edge.target);
241
+ const childOpacity = (child?.data as any)?.opacity ?? 1;
242
+ const currentStyle = (edge.style || '').replace(/opacity:\s*[^;]+;?/g, '').trim();
243
+ edge.style = `${currentStyle ? currentStyle + '; ' : ''}opacity: ${childOpacity};`;
244
+ });
245
+ graph.setEdges([...graph.edges]);
246
+ }
247
+ }
248
+
249
+ // Sync any mismatched node references in graph.nodes from transitions
250
+ transitions.forEach((t) => {
251
+ const graphNode = graph.nodes.find((n) => n.id === t.node.id);
252
+ if (graphNode && graphNode !== t.node) {
253
+ graphNode.position = { ...t.node.position };
254
+ graphNode.style = t.node.style;
255
+ if (t.node.data) {
256
+ graphNode.data = { ...graphNode.data, ...t.node.data };
257
+ }
258
+ }
259
+ });
260
+
227
261
  graph.setNodes([...graph.nodes]);
228
262
  },
229
263
  onComplete: () => {
264
+ childNodes.forEach((child, i) => {
265
+ const node = graph.nodes.find((n) => n.id === child.id);
266
+ if (node) {
267
+ node.position = { ...targetPositions[i] };
268
+ node.style = (node.style || '').replace(/opacity:\s*[^;]+;?/g, '').trim() || undefined;
269
+ if (node.data) {
270
+ (node.data as any).opacity = 1;
271
+ }
272
+ }
273
+ });
274
+ displacementMap.forEach((targetPos, nodeId) => {
275
+ const graphNode = graph.nodes.find((n) => n.id === nodeId);
276
+ if (graphNode) {
277
+ graphNode.position = { ...targetPos };
278
+ }
279
+ });
280
+ edgesToAdd.forEach((edge) => {
281
+ const graphEdge = graph.edges.find((e) => e.id === edge.id);
282
+ if (graphEdge) {
283
+ graphEdge.style = (graphEdge.style || '').replace(/opacity:\s*[^;]+;?/g, '').trim() || undefined;
284
+ }
285
+ });
230
286
  graph.setNodes([...graph.nodes]);
287
+ graph.setEdges([...graph.edges]);
231
288
  explodedNodeIds = [...explodedNodeIds, parentId];
232
289
  activeAnimationCancel = null;
233
290
  options.onSave?.();
@@ -300,7 +357,7 @@ export function createCanvasExplosion<
300
357
  node,
301
358
  from: { ...node.position },
302
359
  to: originalPosition,
303
- trajectory: linearTrajectory,
360
+ trajectory: linearPositionTrajectory,
304
361
  duration,
305
362
  easing
306
363
  });
@@ -315,6 +372,30 @@ export function createCanvasExplosion<
315
372
  defaultDuration: duration,
316
373
  defaultEasing: easing,
317
374
  onUpdate: () => {
375
+ const edgeIdSet = new Set(snapshot.childEdgeIds);
376
+ const childEdgesInGraph = graph.edges.filter((e) => edgeIdSet.has(e.id));
377
+ if (childEdgesInGraph.length > 0) {
378
+ childEdgesInGraph.forEach((edge) => {
379
+ const child = activeChildNodes.find((c) => c.id === edge.target);
380
+ const childOpacity = (child?.data as any)?.opacity ?? 0;
381
+ const currentStyle = (edge.style || '').replace(/opacity:\s*[^;]+;?/g, '').trim();
382
+ edge.style = `${currentStyle ? currentStyle + '; ' : ''}opacity: ${childOpacity};`;
383
+ });
384
+ graph.setEdges([...graph.edges]);
385
+ }
386
+
387
+ // Sync any mismatched node references in graph.nodes from transitions
388
+ transitions.forEach((t) => {
389
+ const graphNode = graph.nodes.find((n) => n.id === t.node.id);
390
+ if (graphNode && graphNode !== t.node) {
391
+ graphNode.position = { ...t.node.position };
392
+ graphNode.style = t.node.style;
393
+ if (t.node.data) {
394
+ graphNode.data = { ...graphNode.data, ...t.node.data };
395
+ }
396
+ }
397
+ });
398
+
318
399
  graph.setNodes([...graph.nodes]);
319
400
  },
320
401
  onComplete: () => {
@@ -327,6 +408,14 @@ export function createCanvasExplosion<
327
408
  graph.removeEdges(edgesToRemove, false);
328
409
  }
329
410
 
411
+ snapshot.displacedNodes.forEach(({ id, originalPosition }) => {
412
+ const graphNode = graph.nodes.find((n) => n.id === id);
413
+ if (graphNode) {
414
+ graphNode.position = { ...originalPosition };
415
+ }
416
+ });
417
+ graph.setNodes([...graph.nodes]);
418
+
330
419
  snapshots.delete(parentId);
331
420
  explodedNodeIds = explodedNodeIds.filter((id) => id !== parentId);
332
421
  activeAnimationCancel = null;
@@ -26,6 +26,23 @@ export const linearTrajectory: TrajectoryFunction = (
26
26
  };
27
27
  };
28
28
 
29
+ /**
30
+ * Linear position trajectory: pure position interpolation without altering scale or opacity.
31
+ * Used for displaced sibling nodes to ensure their visibility remains unaltered.
32
+ */
33
+ export const linearPositionTrajectory: TrajectoryFunction = (
34
+ origin: XYPosition,
35
+ target: XYPosition,
36
+ progress: number
37
+ ): TrajectoryPoint => {
38
+ return {
39
+ position: {
40
+ x: origin.x + (target.x - origin.x) * progress,
41
+ y: origin.y + (target.y - origin.y) * progress
42
+ }
43
+ };
44
+ };
45
+
29
46
  /**
30
47
  * Creates a fan-out trajectory where nodes arc outward from origin to target.
31
48
  * Matches the curved distribution shown in multi-node branching diagrams.
@@ -161,6 +178,8 @@ export function runMultiNodeTransition<TNode extends CanvasNode = CanvasNode>(
161
178
  }
162
179
  if (point.opacity !== undefined) {
163
180
  (item.node.data as any).opacity = point.opacity;
181
+ const currentStyle = (item.node.style || '').replace(/opacity:\s*[^;]+;?/g, '').trim();
182
+ item.node.style = `${currentStyle ? currentStyle + '; ' : ''}opacity: ${point.opacity};`;
164
183
  }
165
184
  }
166
185
 
@@ -48,6 +48,7 @@ export {
48
48
  // Trajectory calculation & multi-node transitions
49
49
  export {
50
50
  linearTrajectory,
51
+ linearPositionTrajectory,
51
52
  createFanOutTrajectory,
52
53
  createBezierTrajectory,
53
54
  runMultiNodeTransition