@pixerate/editor-svelte 0.15.2 → 0.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (149) hide show
  1. package/dist/BubbleMenu.svelte.d.ts +14 -0
  2. package/dist/BubbleMenu.svelte.d.ts.map +1 -0
  3. package/{src → dist}/EditableTextNodeEditor.svelte +1 -1
  4. package/dist/EditableTextNodeEditor.svelte.d.ts +26 -0
  5. package/dist/EditableTextNodeEditor.svelte.d.ts.map +1 -0
  6. package/dist/TemplateRenderer.svelte.d.ts +14 -0
  7. package/dist/TemplateRenderer.svelte.d.ts.map +1 -0
  8. package/dist/canvas/AgentPresenceLayer.svelte.d.ts +9 -0
  9. package/dist/canvas/AgentPresenceLayer.svelte.d.ts.map +1 -0
  10. package/dist/canvas/FloatingHorizontalScrollbar.svelte.d.ts +9 -0
  11. package/dist/canvas/FloatingHorizontalScrollbar.svelte.d.ts.map +1 -0
  12. package/dist/canvas/createCanvasClipboard.svelte.d.ts +32 -0
  13. package/dist/canvas/createCanvasClipboard.svelte.d.ts.map +1 -0
  14. package/dist/canvas/createCanvasClipboard.svelte.js +171 -0
  15. package/dist/canvas/createCanvasDisplacement.d.ts +32 -0
  16. package/dist/canvas/createCanvasDisplacement.d.ts.map +1 -0
  17. package/dist/canvas/createCanvasDisplacement.js +170 -0
  18. package/dist/canvas/createCanvasDocking.svelte.d.ts +56 -0
  19. package/dist/canvas/createCanvasDocking.svelte.d.ts.map +1 -0
  20. package/dist/canvas/createCanvasDocking.svelte.js +227 -0
  21. package/dist/canvas/createCanvasExplosion.svelte.d.ts +31 -0
  22. package/dist/canvas/createCanvasExplosion.svelte.d.ts.map +1 -0
  23. package/dist/canvas/createCanvasExplosion.svelte.js +346 -0
  24. package/dist/canvas/createCanvasGraph.svelte.d.ts +62 -0
  25. package/dist/canvas/createCanvasGraph.svelte.d.ts.map +1 -0
  26. package/dist/canvas/createCanvasGraph.svelte.js +223 -0
  27. package/dist/canvas/createCanvasInteractions.svelte.d.ts +28 -0
  28. package/dist/canvas/createCanvasInteractions.svelte.d.ts.map +1 -0
  29. package/dist/canvas/createCanvasInteractions.svelte.js +95 -0
  30. package/dist/canvas/createCanvasLayout.d.ts +22 -0
  31. package/dist/canvas/createCanvasLayout.d.ts.map +1 -0
  32. package/dist/canvas/createCanvasLayout.js +76 -0
  33. package/dist/canvas/createCanvasMultiDrag.svelte.d.ts +61 -0
  34. package/dist/canvas/createCanvasMultiDrag.svelte.d.ts.map +1 -0
  35. package/dist/canvas/createCanvasMultiDrag.svelte.js +105 -0
  36. package/dist/canvas/createCanvasNodeSync.svelte.d.ts +58 -0
  37. package/dist/canvas/createCanvasNodeSync.svelte.d.ts.map +1 -0
  38. package/dist/canvas/createCanvasNodeSync.svelte.js +82 -0
  39. package/dist/canvas/createCanvasSelection.svelte.d.ts +26 -0
  40. package/dist/canvas/createCanvasSelection.svelte.d.ts.map +1 -0
  41. package/dist/canvas/createCanvasSelection.svelte.js +26 -0
  42. package/dist/canvas/createCanvasShortcuts.d.ts +9 -0
  43. package/dist/canvas/createCanvasShortcuts.d.ts.map +1 -0
  44. package/dist/canvas/createCanvasShortcuts.js +97 -0
  45. package/dist/canvas/createCanvasTrajectory.d.ts +31 -0
  46. package/dist/canvas/createCanvasTrajectory.d.ts.map +1 -0
  47. package/dist/canvas/createCanvasTrajectory.js +141 -0
  48. package/dist/canvas/createStreamingCanvas.svelte.d.ts +19 -0
  49. package/dist/canvas/createStreamingCanvas.svelte.d.ts.map +1 -0
  50. package/dist/canvas/createStreamingCanvas.svelte.js +32 -0
  51. package/dist/canvas/index.d.ts +18 -688
  52. package/dist/canvas/index.d.ts.map +1 -0
  53. package/dist/canvas/index.js +34 -1839
  54. package/dist/canvas/types.d.ts +183 -0
  55. package/dist/canvas/types.d.ts.map +1 -0
  56. package/dist/canvas/types.js +1 -0
  57. package/dist/createNavigationGuard.svelte.d.ts +24 -0
  58. package/dist/createNavigationGuard.svelte.d.ts.map +1 -0
  59. package/dist/createNavigationGuard.svelte.js +65 -0
  60. package/dist/editor.svelte.d.ts +23 -0
  61. package/dist/editor.svelte.d.ts.map +1 -0
  62. package/dist/editor.svelte.js +41 -0
  63. package/dist/history/createHistoryShortcuts.d.ts +24 -0
  64. package/dist/history/createHistoryShortcuts.d.ts.map +1 -0
  65. package/dist/history/createHistoryShortcuts.js +57 -0
  66. package/dist/history/history.svelte.d.ts +18 -0
  67. package/dist/history/history.svelte.d.ts.map +1 -0
  68. package/dist/history/history.svelte.js +43 -0
  69. package/dist/history/index.d.ts +3 -0
  70. package/dist/history/index.d.ts.map +1 -0
  71. package/dist/history/index.js +2 -0
  72. package/{src → dist}/image-editor/ImageEditor.svelte +1 -1
  73. package/dist/image-editor/ImageEditor.svelte.d.ts +17 -0
  74. package/dist/image-editor/ImageEditor.svelte.d.ts.map +1 -0
  75. package/dist/image-editor/imageEditorState.svelte.d.ts +50 -0
  76. package/dist/image-editor/imageEditorState.svelte.d.ts.map +1 -0
  77. package/dist/image-editor/imageEditorState.svelte.js +132 -0
  78. package/dist/image-editor/index.d.ts +6 -16
  79. package/dist/image-editor/index.d.ts.map +1 -0
  80. package/dist/image-editor/index.js +2 -9
  81. package/dist/index.d.ts +20 -249
  82. package/dist/index.d.ts.map +1 -0
  83. package/dist/index.js +10 -1119
  84. package/dist/navigationGuard.d.ts +21 -0
  85. package/dist/navigationGuard.d.ts.map +1 -0
  86. package/dist/navigationGuard.js +59 -0
  87. package/{src → dist}/spreadsheet/FormulaBar.svelte +1 -1
  88. package/dist/spreadsheet/FormulaBar.svelte.d.ts +17 -0
  89. package/dist/spreadsheet/FormulaBar.svelte.d.ts.map +1 -0
  90. package/{src → dist}/spreadsheet/SpreadsheetEditor.svelte +1 -1
  91. package/dist/spreadsheet/SpreadsheetEditor.svelte.d.ts +22 -0
  92. package/dist/spreadsheet/SpreadsheetEditor.svelte.d.ts.map +1 -0
  93. package/dist/spreadsheet/index.d.ts +9 -0
  94. package/dist/spreadsheet/index.d.ts.map +1 -0
  95. package/{src/spreadsheet/index.ts → dist/spreadsheet/index.js} +1 -1
  96. package/dist/spreadsheet/spreadsheet.svelte.d.ts +33 -0
  97. package/dist/spreadsheet/spreadsheet.svelte.d.ts.map +1 -0
  98. package/dist/spreadsheet/spreadsheet.svelte.js +160 -0
  99. package/package.json +14 -16
  100. package/dist/canvas/index.js.map +0 -1
  101. package/dist/chunk-HEOI4UNF.js +0 -1191
  102. package/dist/chunk-HEOI4UNF.js.map +0 -1
  103. package/dist/image-editor/index.js.map +0 -1
  104. package/dist/index.css +0 -50
  105. package/dist/index.css.map +0 -1
  106. package/dist/index.js.map +0 -1
  107. package/src/canvas/__tests__/canvas-clipboard.test.ts +0 -154
  108. package/src/canvas/__tests__/canvas-docking.test.ts +0 -288
  109. package/src/canvas/__tests__/canvas-explosion.test.ts +0 -634
  110. package/src/canvas/__tests__/canvas-graph.test.ts +0 -159
  111. package/src/canvas/__tests__/canvas-interactions.test.ts +0 -86
  112. package/src/canvas/__tests__/canvas-layout.test.ts +0 -75
  113. package/src/canvas/__tests__/canvas-multi-drag.test.ts +0 -112
  114. package/src/canvas/__tests__/canvas-node-sync.svelte.test.ts +0 -104
  115. package/src/canvas/__tests__/canvas-shortcuts.test.ts +0 -59
  116. package/src/canvas/createCanvasClipboard.svelte.ts +0 -219
  117. package/src/canvas/createCanvasDisplacement.ts +0 -253
  118. package/src/canvas/createCanvasDocking.svelte.ts +0 -355
  119. package/src/canvas/createCanvasExplosion.svelte.ts +0 -457
  120. package/src/canvas/createCanvasGraph.svelte.ts +0 -330
  121. package/src/canvas/createCanvasInteractions.svelte.ts +0 -112
  122. package/src/canvas/createCanvasLayout.ts +0 -129
  123. package/src/canvas/createCanvasMultiDrag.svelte.ts +0 -175
  124. package/src/canvas/createCanvasNodeSync.svelte.ts +0 -150
  125. package/src/canvas/createCanvasSelection.svelte.ts +0 -51
  126. package/src/canvas/createCanvasShortcuts.ts +0 -99
  127. package/src/canvas/createCanvasTrajectory.ts +0 -207
  128. package/src/canvas/createStreamingCanvas.svelte.ts +0 -56
  129. package/src/canvas/index.d.ts +0 -688
  130. package/src/canvas/index.ts +0 -126
  131. package/src/canvas/types.ts +0 -223
  132. package/src/createNavigationGuard.svelte.ts +0 -97
  133. package/src/editor.svelte.ts +0 -65
  134. package/src/history/createHistoryShortcuts.ts +0 -95
  135. package/src/history/history.svelte.ts +0 -68
  136. package/src/history/index.ts +0 -2
  137. package/src/image-editor/imageEditorState.svelte.ts +0 -151
  138. package/src/image-editor/index.d.ts +0 -16
  139. package/src/image-editor/index.ts +0 -2
  140. package/src/index.d.ts +0 -249
  141. package/src/index.ts +0 -89
  142. package/src/navigationGuard.ts +0 -82
  143. package/src/spreadsheet/spreadsheet.svelte.ts +0 -176
  144. package/src/svelte.d.ts +0 -5
  145. /package/{src → dist}/BubbleMenu.svelte +0 -0
  146. /package/{src → dist}/TemplateRenderer.svelte +0 -0
  147. /package/{src → dist}/canvas/AgentPresenceLayer.svelte +0 -0
  148. /package/{src → dist}/canvas/FloatingHorizontalScrollbar.svelte +0 -0
  149. /package/{src → dist}/canvas/README.md +0 -0
@@ -0,0 +1,227 @@
1
+ function getNodeRect(node) {
2
+ const x = node.position?.x ?? 0;
3
+ const y = node.position?.y ?? 0;
4
+ const width = node.measured?.width ??
5
+ node.width ??
6
+ node.initialWidth ??
7
+ 0;
8
+ const height = node.measured?.height ??
9
+ node.height ??
10
+ node.initialHeight ??
11
+ 0;
12
+ return { x, y, width, height };
13
+ }
14
+ function getNodeCenter(node) {
15
+ const rect = getNodeRect(node);
16
+ return {
17
+ x: rect.x + rect.width / 2,
18
+ y: rect.y + rect.height / 2
19
+ };
20
+ }
21
+ function getDistanceSq(p1, p2) {
22
+ const dx = p1.x - p2.x;
23
+ const dy = p1.y - p2.y;
24
+ return dx * dx + dy * dy;
25
+ }
26
+ function getOverlapArea(rectA, rectB) {
27
+ const xOverlap = Math.max(0, Math.min(rectA.x + rectA.width, rectB.x + rectB.width) - Math.max(rectA.x, rectB.x));
28
+ const yOverlap = Math.max(0, Math.min(rectA.y + rectA.height, rectB.y + rectB.height) - Math.max(rectA.y, rectB.y));
29
+ return xOverlap * yOverlap;
30
+ }
31
+ function resolvePrimaryTarget(targets, draggedNode, strategy, customResolver, event) {
32
+ if (targets.length === 0)
33
+ return null;
34
+ if (targets.length === 1)
35
+ return targets[0];
36
+ if (customResolver) {
37
+ const resolved = customResolver(targets, draggedNode, event);
38
+ if (resolved !== undefined)
39
+ return resolved;
40
+ }
41
+ if (strategy === 'first') {
42
+ return targets[0];
43
+ }
44
+ if (strategy === 'pointer' && event) {
45
+ const clientX = 'clientX' in event ? event.clientX : event.touches?.[0]?.clientX;
46
+ const clientY = 'clientY' in event ? event.clientY : event.touches?.[0]?.clientY;
47
+ if (typeof clientX === 'number' && typeof clientY === 'number') {
48
+ const pointerInside = targets.filter((target) => {
49
+ const r = getNodeRect(target);
50
+ return (r.width > 0 &&
51
+ r.height > 0 &&
52
+ clientX >= r.x &&
53
+ clientX <= r.x + r.width &&
54
+ clientY >= r.y &&
55
+ clientY <= r.y + r.height);
56
+ });
57
+ if (pointerInside.length === 1)
58
+ return pointerInside[0];
59
+ if (pointerInside.length > 1) {
60
+ return pointerInside.reduce((best, cur) => {
61
+ const bestDist = getDistanceSq(getNodeCenter(best), { x: clientX, y: clientY });
62
+ const curDist = getDistanceSq(getNodeCenter(cur), { x: clientX, y: clientY });
63
+ return curDist < bestDist ? cur : best;
64
+ });
65
+ }
66
+ }
67
+ }
68
+ if (strategy === 'max-overlap') {
69
+ const draggedRect = getNodeRect(draggedNode);
70
+ let maxArea = -1;
71
+ let bestTarget = targets[0];
72
+ for (const target of targets) {
73
+ const targetRect = getNodeRect(target);
74
+ const area = getOverlapArea(draggedRect, targetRect);
75
+ if (area > maxArea) {
76
+ maxArea = area;
77
+ bestTarget = target;
78
+ }
79
+ }
80
+ return bestTarget;
81
+ }
82
+ // Strategy: 'center-point' (default)
83
+ const draggedCenter = getNodeCenter(draggedNode);
84
+ const containing = targets.filter((target) => {
85
+ const r = getNodeRect(target);
86
+ if (r.width > 0 && r.height > 0) {
87
+ return (draggedCenter.x >= r.x &&
88
+ draggedCenter.x <= r.x + r.width &&
89
+ draggedCenter.y >= r.y &&
90
+ draggedCenter.y <= r.y + r.height);
91
+ }
92
+ return false;
93
+ });
94
+ if (containing.length === 1)
95
+ return containing[0];
96
+ if (containing.length > 1) {
97
+ return containing.reduce((best, cur) => {
98
+ const bestDist = getDistanceSq(getNodeCenter(best), draggedCenter);
99
+ const curDist = getDistanceSq(getNodeCenter(cur), draggedCenter);
100
+ return curDist < bestDist ? cur : best;
101
+ });
102
+ }
103
+ return targets.reduce((best, cur) => {
104
+ const bestDist = getDistanceSq(getNodeCenter(best), draggedCenter);
105
+ const curDist = getDistanceSq(getNodeCenter(cur), draggedCenter);
106
+ return curDist < bestDist ? cur : best;
107
+ });
108
+ }
109
+ /**
110
+ * Headless Svelte 5 rune managing canvas node dragging, docking intersection, and connection tracking.
111
+ */
112
+ export function createCanvasDocking(options = {}) {
113
+ let draggedNode = $state.raw(null);
114
+ let draggedInitialPosition = $state.raw(null);
115
+ let connectingHandle = $state.raw('');
116
+ let connectingNode = $state.raw(null);
117
+ let currentHoverTargets = $state.raw(new Set());
118
+ const isDockTarget = options.isDockTarget ?? ((target) => target.type === 'boardNode');
119
+ const dockStrategy = options.dockStrategy ?? 'center-point';
120
+ const exclusiveHover = options.exclusiveHover ?? true;
121
+ function handleNodeDragStart(params) {
122
+ draggedNode = params.targetNode;
123
+ draggedInitialPosition = params.targetNode?.position ? { ...params.targetNode.position } : null;
124
+ currentHoverTargets = new Set();
125
+ }
126
+ function handleNodeDrag(params, getIntersectingNodes) {
127
+ draggedNode = params.targetNode;
128
+ if (!draggedNode)
129
+ return;
130
+ const intersecting = getIntersectingNodes(draggedNode);
131
+ const currentDockTargets = intersecting.filter(isDockTarget);
132
+ if (exclusiveHover) {
133
+ const primaryTarget = currentDockTargets.length > 0
134
+ ? resolvePrimaryTarget(currentDockTargets, draggedNode, dockStrategy, options.resolvePrimaryDockTarget, params.event)
135
+ : null;
136
+ const primaryTargetId = primaryTarget ? primaryTarget.id : null;
137
+ // Fire onDockLeave for previous targets no longer considered primary
138
+ currentHoverTargets.forEach((targetId) => {
139
+ if (targetId !== primaryTargetId) {
140
+ const leftNode = intersecting.find((n) => n.id === targetId) ?? { id: targetId };
141
+ options.onDockLeave?.(leftNode, draggedNode);
142
+ }
143
+ });
144
+ // Fire onDockHover if entering a new primary target
145
+ if (primaryTarget && !currentHoverTargets.has(primaryTarget.id)) {
146
+ options.onDockHover?.(primaryTarget, draggedNode);
147
+ }
148
+ currentHoverTargets = primaryTargetId ? new Set([primaryTargetId]) : new Set();
149
+ }
150
+ else {
151
+ const newHoverSet = new Set(currentDockTargets.map((t) => t.id));
152
+ // Check for left targets
153
+ currentHoverTargets.forEach((targetId) => {
154
+ if (!newHoverSet.has(targetId)) {
155
+ const leftNode = intersecting.find((n) => n.id === targetId) ?? { id: targetId };
156
+ options.onDockLeave?.(leftNode, draggedNode);
157
+ }
158
+ });
159
+ // Check for newly entered targets
160
+ currentDockTargets.forEach((target) => {
161
+ if (!currentHoverTargets.has(target.id)) {
162
+ options.onDockHover?.(target, draggedNode);
163
+ }
164
+ });
165
+ currentHoverTargets = newHoverSet;
166
+ }
167
+ }
168
+ function handleNodeDragStop(params, getIntersectingNodes, updateNodePosition) {
169
+ draggedNode = params.targetNode;
170
+ if (draggedNode) {
171
+ const intersecting = getIntersectingNodes(draggedNode);
172
+ const dockTargets = intersecting.filter(isDockTarget);
173
+ const dockTarget = dockTargets.length > 0
174
+ ? resolvePrimaryTarget(dockTargets, draggedNode, dockStrategy, options.resolvePrimaryDockTarget, params.event)
175
+ : null;
176
+ if (dockTarget) {
177
+ options.onDockDrop?.(dockTarget, draggedNode);
178
+ if (options.restorePositionOnDock !== false && draggedInitialPosition && updateNodePosition) {
179
+ updateNodePosition(draggedNode.id, draggedInitialPosition);
180
+ }
181
+ }
182
+ }
183
+ // Reset state
184
+ draggedNode = null;
185
+ draggedInitialPosition = null;
186
+ currentHoverTargets = new Set();
187
+ options.onSave?.();
188
+ }
189
+ function handleConnectStart(params, getNode) {
190
+ connectingHandle = params.handleType ?? '';
191
+ connectingNode = params.nodeId ? (getNode(params.nodeId) ?? null) : null;
192
+ }
193
+ function handleConnectEnd() {
194
+ connectingHandle = '';
195
+ connectingNode = null;
196
+ }
197
+ function reset() {
198
+ draggedNode = null;
199
+ draggedInitialPosition = null;
200
+ connectingHandle = '';
201
+ connectingNode = null;
202
+ currentHoverTargets = new Set();
203
+ }
204
+ return {
205
+ get draggedNode() {
206
+ return draggedNode;
207
+ },
208
+ get draggedInitialPosition() {
209
+ return draggedInitialPosition;
210
+ },
211
+ get connectingHandle() {
212
+ return connectingHandle;
213
+ },
214
+ get connectingNode() {
215
+ return connectingNode;
216
+ },
217
+ get isDragging() {
218
+ return draggedNode !== null;
219
+ },
220
+ handleNodeDragStart,
221
+ handleNodeDrag,
222
+ handleNodeDragStop,
223
+ handleConnectStart,
224
+ handleConnectEnd,
225
+ reset
226
+ };
227
+ }
@@ -0,0 +1,31 @@
1
+ import type { Rect, XYPosition } from '@xyflow/svelte';
2
+ import type { CanvasEdge, CanvasNode, CollapseNodeOptions, ExplodeNodeOptions, ExplosionSnapshot } from './types.js';
3
+ export interface CanvasGraphTarget<TNode extends CanvasNode = CanvasNode, TEdge extends CanvasEdge = CanvasEdge> {
4
+ nodes: TNode[];
5
+ edges: TEdge[];
6
+ setNodes: (nodes: TNode[], triggerCallback?: boolean) => void;
7
+ setEdges: (edges: TEdge[], triggerCallback?: boolean) => void;
8
+ addNodeOrNodes: (nodes: TNode | TNode[], animateFrom?: XYPosition, save?: boolean) => void;
9
+ addEdges: (edges: TEdge[], save?: boolean) => void;
10
+ removeNodes: (nodes: TNode[], save?: boolean) => void;
11
+ removeEdges: (edges: TEdge[], save?: boolean) => void;
12
+ createEdge?: (sourceId: string, targetId: string, options?: any) => TEdge;
13
+ onSave?: () => void;
14
+ }
15
+ export interface CreateCanvasExplosionOptions<TNode extends CanvasNode = CanvasNode> {
16
+ getNodesBounds?: (nodes: TNode[]) => Rect;
17
+ onSave?: () => void;
18
+ }
19
+ /**
20
+ * Headless Svelte 5 rune managing canvas node explosion, spatial layout displacement,
21
+ * coordinated multi-node animation paths, and reversible collapsing.
22
+ */
23
+ export declare function createCanvasExplosion<TNode extends CanvasNode = CanvasNode, TEdge extends CanvasEdge = CanvasEdge>(graph: CanvasGraphTarget<TNode, TEdge>, options?: CreateCanvasExplosionOptions<TNode>): {
24
+ readonly explodedNodeIds: string[];
25
+ isExploded: (nodeId: string) => boolean;
26
+ explodeNode: (parentId: string, explodeOptions: ExplodeNodeOptions<TNode, TEdge>) => boolean;
27
+ collapseNode: (parentId: string, collapseOptions?: CollapseNodeOptions) => boolean;
28
+ toggleExplode: (parentId: string, explodeOptions: ExplodeNodeOptions<TNode, TEdge>, collapseOptions?: CollapseNodeOptions) => boolean;
29
+ getSnapshot: (parentId: string) => ExplosionSnapshot<TNode, TEdge> | undefined;
30
+ };
31
+ //# sourceMappingURL=createCanvasExplosion.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createCanvasExplosion.svelte.d.ts","sourceRoot":"","sources":["../../src/canvas/createCanvasExplosion.svelte.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,KAAK,EACX,UAAU,EACV,UAAU,EACV,mBAAmB,EACnB,kBAAkB,EAClB,iBAAiB,EAEjB,MAAM,YAAY,CAAC;AAYpB,MAAM,WAAW,iBAAiB,CACjC,KAAK,SAAS,UAAU,GAAG,UAAU,EACrC,KAAK,SAAS,UAAU,GAAG,UAAU;IAErC,KAAK,EAAE,KAAK,EAAE,CAAC;IACf,KAAK,EAAE,KAAK,EAAE,CAAC;IACf,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,eAAe,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IAC9D,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,eAAe,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IAC9D,cAAc,EAAE,CAAC,KAAK,EAAE,KAAK,GAAG,KAAK,EAAE,EAAE,WAAW,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IAC3F,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,IAAI,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IACnD,WAAW,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,IAAI,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IACtD,WAAW,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,IAAI,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IACtD,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,KAAK,KAAK,CAAC;IAC1E,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;CACpB;AAED,MAAM,WAAW,4BAA4B,CAAC,KAAK,SAAS,UAAU,GAAG,UAAU;IAClF,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,IAAI,CAAC;IAC1C,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACpC,KAAK,SAAS,UAAU,GAAG,UAAU,EACrC,KAAK,SAAS,UAAU,GAAG,UAAU,EAErC,KAAK,EAAE,iBAAiB,CAAC,KAAK,EAAE,KAAK,CAAC,EACtC,OAAO,GAAE,4BAA4B,CAAC,KAAK,CAAM;;yBAMrB,MAAM,KAAG,OAAO;4BAKjC,MAAM,kBACA,kBAAkB,CAAC,KAAK,EAAE,KAAK,CAAC,KAC9C,OAAO;6BA2OC,MAAM,oBACC,mBAAmB,KAClC,OAAO;8BAmIC,MAAM,kBACA,kBAAkB,CAAC,KAAK,EAAE,KAAK,CAAC,oBAC9B,mBAAmB,KACnC,OAAO;4BAOqB,MAAM;EAcrC"}
@@ -0,0 +1,346 @@
1
+ import { cubicOut } from 'svelte/easing';
2
+ import { calculateDirectionalDisplacement, calculateReflowDisplacement } from './createCanvasDisplacement.js';
3
+ import { createFanOutTrajectory, linearPositionTrajectory, runMultiNodeTransition } from './createCanvasTrajectory.js';
4
+ /**
5
+ * Headless Svelte 5 rune managing canvas node explosion, spatial layout displacement,
6
+ * coordinated multi-node animation paths, and reversible collapsing.
7
+ */
8
+ export function createCanvasExplosion(graph, options = {}) {
9
+ let explodedNodeIds = $state([]);
10
+ const snapshots = new Map();
11
+ let activeAnimationCancel = null;
12
+ function isExploded(nodeId) {
13
+ return explodedNodeIds.includes(nodeId);
14
+ }
15
+ function explodeNode(parentId, explodeOptions) {
16
+ if (isExploded(parentId)) {
17
+ return false;
18
+ }
19
+ const parentNode = graph.nodes.find((n) => n.id === parentId);
20
+ if (!parentNode) {
21
+ return false;
22
+ }
23
+ const { childNodes, childEdges = [], connectParentToChildren = 'all', displacementStrategy = 'directional', directionalOptions = {}, reflowOptions = {}, trajectory, duration = 500, staggerDelay = 20, easing = cubicOut, onComplete } = explodeOptions;
24
+ if (childNodes.length === 0) {
25
+ return false;
26
+ }
27
+ // 1. Calculate displacement for existing nodes
28
+ let displacementMap;
29
+ if (displacementStrategy === 'dagre') {
30
+ displacementMap = calculateReflowDisplacement({
31
+ existingNodes: graph.nodes,
32
+ existingEdges: graph.edges,
33
+ originNode: parentNode,
34
+ childNodes,
35
+ childEdges,
36
+ getNodesBounds: options.getNodesBounds,
37
+ options: {
38
+ ...reflowOptions,
39
+ direction: reflowOptions.direction ?? 'LR'
40
+ }
41
+ });
42
+ }
43
+ else if (displacementStrategy === 'none') {
44
+ displacementMap = new Map();
45
+ }
46
+ else {
47
+ displacementMap = calculateDirectionalDisplacement({
48
+ existingNodes: graph.nodes,
49
+ originNode: parentNode,
50
+ childNodes,
51
+ getNodesBounds: options.getNodesBounds,
52
+ options: directionalOptions
53
+ });
54
+ }
55
+ // 2. Build snapshot of displaced nodes before mutating positions
56
+ const displacedNodesSnapshot = Array.from(displacementMap.entries()).map(([id]) => {
57
+ const node = graph.nodes.find((n) => n.id === id);
58
+ return {
59
+ id,
60
+ originalPosition: { ...(node?.position ?? { x: 0, y: 0 }) }
61
+ };
62
+ });
63
+ // 3. Prepare child edges & parent connection edges
64
+ const edgesToAdd = [...childEdges];
65
+ const defaultCreateEdge = (sourceId, targetId) => {
66
+ if (graph.createEdge) {
67
+ return graph.createEdge(sourceId, targetId);
68
+ }
69
+ return {
70
+ id: crypto.randomUUID(),
71
+ type: 'default',
72
+ source: sourceId,
73
+ target: targetId
74
+ };
75
+ };
76
+ if (connectParentToChildren === 'all' || connectParentToChildren === true) {
77
+ childNodes.forEach((child) => {
78
+ const exists = edgesToAdd.some((e) => e.source === parentId && e.target === child.id);
79
+ if (!exists) {
80
+ edgesToAdd.push(defaultCreateEdge(parentId, child.id));
81
+ }
82
+ });
83
+ }
84
+ else if (connectParentToChildren === 'first' && childNodes.length > 0) {
85
+ const firstChild = childNodes[0];
86
+ const exists = edgesToAdd.some((e) => e.source === parentId && e.target === firstChild.id);
87
+ if (!exists) {
88
+ edgesToAdd.push(defaultCreateEdge(parentId, firstChild.id));
89
+ }
90
+ }
91
+ const snapshot = {
92
+ parentId,
93
+ childNodeIds: childNodes.map((n) => n.id),
94
+ childEdgeIds: edgesToAdd.map((e) => e.id),
95
+ displacedNodes: displacedNodesSnapshot,
96
+ timestamp: Date.now()
97
+ };
98
+ snapshots.set(parentId, snapshot);
99
+ // 4. Position child nodes initially at origin node coordinate
100
+ const originPos = { ...parentNode.position };
101
+ const targetPositions = childNodes.map((child) => ({ ...child.position }));
102
+ childNodes.forEach((child) => {
103
+ child.position = { ...originPos };
104
+ if (!child.data)
105
+ child.data = {};
106
+ child.data.scale = 0;
107
+ child.data.opacity = 0;
108
+ const currentStyle = (child.style || '').replace(/opacity:\s*[^;]+;?/g, '').trim();
109
+ child.style = `${currentStyle ? currentStyle + '; ' : ''}opacity: 0;`;
110
+ });
111
+ edgesToAdd.forEach((edge) => {
112
+ const currentStyle = (edge.style || '').replace(/opacity:\s*[^;]+;?/g, '').trim();
113
+ edge.style = `${currentStyle ? currentStyle + '; ' : ''}opacity: 0;`;
114
+ });
115
+ // Add nodes and edges to graph without saving yet
116
+ graph.addNodeOrNodes(childNodes, undefined, false);
117
+ if (edgesToAdd.length > 0) {
118
+ graph.addEdges(edgesToAdd, false);
119
+ }
120
+ // 5. Build transition list
121
+ const chosenTrajectory = trajectory ?? createFanOutTrajectory({ curvature: 0.35 });
122
+ const transitions = [];
123
+ const effectiveStagger = duration === 0 ? 0 : staggerDelay;
124
+ // Expanding child transitions
125
+ childNodes.forEach((child, i) => {
126
+ transitions.push({
127
+ node: child,
128
+ from: originPos,
129
+ to: targetPositions[i],
130
+ trajectory: chosenTrajectory,
131
+ delay: i * effectiveStagger,
132
+ duration,
133
+ easing,
134
+ index: i,
135
+ total: childNodes.length
136
+ });
137
+ });
138
+ // Displaced node transitions
139
+ displacementMap.forEach((targetPos, nodeId) => {
140
+ const node = graph.nodes.find((n) => n.id === nodeId);
141
+ if (node) {
142
+ transitions.push({
143
+ node,
144
+ from: { ...node.position },
145
+ to: targetPos,
146
+ trajectory: linearPositionTrajectory,
147
+ duration,
148
+ easing
149
+ });
150
+ }
151
+ });
152
+ // 6. Run coordinated animation
153
+ if (activeAnimationCancel) {
154
+ activeAnimationCancel();
155
+ }
156
+ activeAnimationCancel = runMultiNodeTransition(transitions, {
157
+ defaultDuration: duration,
158
+ defaultEasing: easing,
159
+ onUpdate: () => {
160
+ if (edgesToAdd.length > 0) {
161
+ const childIdSet = new Set(childNodes.map((c) => c.id));
162
+ const childEdgesInGraph = graph.edges.filter((e) => childIdSet.has(e.target));
163
+ if (childEdgesInGraph.length > 0) {
164
+ childEdgesInGraph.forEach((edge) => {
165
+ const child = childNodes.find((c) => c.id === edge.target);
166
+ const childOpacity = child?.data?.opacity ?? 1;
167
+ const currentStyle = (edge.style || '').replace(/opacity:\s*[^;]+;?/g, '').trim();
168
+ edge.style = `${currentStyle ? currentStyle + '; ' : ''}opacity: ${childOpacity};`;
169
+ });
170
+ graph.setEdges([...graph.edges]);
171
+ }
172
+ }
173
+ // Sync any mismatched node references in graph.nodes from transitions
174
+ transitions.forEach((t) => {
175
+ const graphNode = graph.nodes.find((n) => n.id === t.node.id);
176
+ if (graphNode && graphNode !== t.node) {
177
+ graphNode.position = { ...t.node.position };
178
+ graphNode.style = t.node.style;
179
+ if (t.node.data) {
180
+ graphNode.data = { ...graphNode.data, ...t.node.data };
181
+ }
182
+ }
183
+ });
184
+ graph.setNodes([...graph.nodes]);
185
+ },
186
+ onComplete: () => {
187
+ childNodes.forEach((child, i) => {
188
+ const node = graph.nodes.find((n) => n.id === child.id);
189
+ if (node) {
190
+ node.position = { ...targetPositions[i] };
191
+ node.style = (node.style || '').replace(/opacity:\s*[^;]+;?/g, '').trim() || undefined;
192
+ if (node.data) {
193
+ node.data.opacity = 1;
194
+ }
195
+ }
196
+ });
197
+ displacementMap.forEach((targetPos, nodeId) => {
198
+ const graphNode = graph.nodes.find((n) => n.id === nodeId);
199
+ if (graphNode) {
200
+ graphNode.position = { ...targetPos };
201
+ }
202
+ });
203
+ edgesToAdd.forEach((edge) => {
204
+ const graphEdge = graph.edges.find((e) => e.id === edge.id);
205
+ if (graphEdge) {
206
+ graphEdge.style = (graphEdge.style || '').replace(/opacity:\s*[^;]+;?/g, '').trim() || undefined;
207
+ }
208
+ });
209
+ graph.setNodes([...graph.nodes]);
210
+ graph.setEdges([...graph.edges]);
211
+ explodedNodeIds = [...explodedNodeIds, parentId];
212
+ activeAnimationCancel = null;
213
+ options.onSave?.();
214
+ graph.onSave?.();
215
+ onComplete?.();
216
+ }
217
+ });
218
+ return true;
219
+ }
220
+ function collapseNode(parentId, collapseOptions = {}) {
221
+ const snapshot = snapshots.get(parentId);
222
+ if (!snapshot) {
223
+ return false;
224
+ }
225
+ const parentNode = graph.nodes.find((n) => n.id === parentId);
226
+ if (!parentNode) {
227
+ return false;
228
+ }
229
+ const { duration = 400, staggerDelay = 15, easing = cubicOut, trajectory, onComplete } = collapseOptions;
230
+ const childIdSet = new Set(snapshot.childNodeIds);
231
+ const activeChildNodes = graph.nodes.filter((n) => childIdSet.has(n.id));
232
+ const originPos = { ...parentNode.position };
233
+ // Reverse trajectory pulls nodes back toward parent while collapsing scale
234
+ const reverseTrajectory = trajectory ?? createFanOutTrajectory({
235
+ curvature: 0.2,
236
+ startScale: 1,
237
+ endScale: 0,
238
+ startOpacity: 1,
239
+ endOpacity: 0
240
+ });
241
+ const transitions = [];
242
+ const effectiveStagger = duration === 0 ? 0 : staggerDelay;
243
+ // Collapsing child transitions back into origin
244
+ activeChildNodes.forEach((child, i) => {
245
+ transitions.push({
246
+ node: child,
247
+ from: { ...child.position },
248
+ to: originPos,
249
+ trajectory: reverseTrajectory,
250
+ delay: (activeChildNodes.length - 1 - i) * effectiveStagger,
251
+ duration,
252
+ easing,
253
+ index: i,
254
+ total: activeChildNodes.length
255
+ });
256
+ });
257
+ // Displaced node restore transitions
258
+ snapshot.displacedNodes.forEach(({ id, originalPosition }) => {
259
+ const node = graph.nodes.find((n) => n.id === id);
260
+ if (node) {
261
+ transitions.push({
262
+ node,
263
+ from: { ...node.position },
264
+ to: originalPosition,
265
+ trajectory: linearPositionTrajectory,
266
+ duration,
267
+ easing
268
+ });
269
+ }
270
+ });
271
+ if (activeAnimationCancel) {
272
+ activeAnimationCancel();
273
+ }
274
+ activeAnimationCancel = runMultiNodeTransition(transitions, {
275
+ defaultDuration: duration,
276
+ defaultEasing: easing,
277
+ onUpdate: () => {
278
+ const edgeIdSet = new Set(snapshot.childEdgeIds);
279
+ const childEdgesInGraph = graph.edges.filter((e) => edgeIdSet.has(e.id));
280
+ if (childEdgesInGraph.length > 0) {
281
+ childEdgesInGraph.forEach((edge) => {
282
+ const child = activeChildNodes.find((c) => c.id === edge.target);
283
+ const childOpacity = child?.data?.opacity ?? 0;
284
+ const currentStyle = (edge.style || '').replace(/opacity:\s*[^;]+;?/g, '').trim();
285
+ edge.style = `${currentStyle ? currentStyle + '; ' : ''}opacity: ${childOpacity};`;
286
+ });
287
+ graph.setEdges([...graph.edges]);
288
+ }
289
+ // Sync any mismatched node references in graph.nodes from transitions
290
+ transitions.forEach((t) => {
291
+ const graphNode = graph.nodes.find((n) => n.id === t.node.id);
292
+ if (graphNode && graphNode !== t.node) {
293
+ graphNode.position = { ...t.node.position };
294
+ graphNode.style = t.node.style;
295
+ if (t.node.data) {
296
+ graphNode.data = { ...graphNode.data, ...t.node.data };
297
+ }
298
+ }
299
+ });
300
+ graph.setNodes([...graph.nodes]);
301
+ },
302
+ onComplete: () => {
303
+ // Animation completed: prune child nodes and edges
304
+ graph.removeNodes(activeChildNodes, false);
305
+ const edgeIdSet = new Set(snapshot.childEdgeIds);
306
+ const edgesToRemove = graph.edges.filter((e) => edgeIdSet.has(e.id));
307
+ if (edgesToRemove.length > 0) {
308
+ graph.removeEdges(edgesToRemove, false);
309
+ }
310
+ snapshot.displacedNodes.forEach(({ id, originalPosition }) => {
311
+ const graphNode = graph.nodes.find((n) => n.id === id);
312
+ if (graphNode) {
313
+ graphNode.position = { ...originalPosition };
314
+ }
315
+ });
316
+ graph.setNodes([...graph.nodes]);
317
+ snapshots.delete(parentId);
318
+ explodedNodeIds = explodedNodeIds.filter((id) => id !== parentId);
319
+ activeAnimationCancel = null;
320
+ options.onSave?.();
321
+ graph.onSave?.();
322
+ onComplete?.();
323
+ }
324
+ });
325
+ return true;
326
+ }
327
+ function toggleExplode(parentId, explodeOptions, collapseOptions) {
328
+ if (isExploded(parentId)) {
329
+ return collapseNode(parentId, collapseOptions);
330
+ }
331
+ return explodeNode(parentId, explodeOptions);
332
+ }
333
+ function getSnapshot(parentId) {
334
+ return snapshots.get(parentId);
335
+ }
336
+ return {
337
+ get explodedNodeIds() {
338
+ return explodedNodeIds;
339
+ },
340
+ isExploded,
341
+ explodeNode,
342
+ collapseNode,
343
+ toggleExplode,
344
+ getSnapshot
345
+ };
346
+ }
@@ -0,0 +1,62 @@
1
+ import { type XYPosition } from '@xyflow/svelte';
2
+ import type { CanvasNode, CanvasEdge, GraphDifferences } from './types.js';
3
+ /**
4
+ * Pure calculation of graph differences between a current state and a baseline state.
5
+ */
6
+ export declare function calculateGraphDifferences<TNode extends CanvasNode = CanvasNode, TEdge extends CanvasEdge = CanvasEdge>(currentState: {
7
+ nodes?: TNode[];
8
+ edges?: TEdge[];
9
+ }, baselineState: {
10
+ nodes?: TNode[];
11
+ edges?: TEdge[];
12
+ }): GraphDifferences<TNode, TEdge>;
13
+ /**
14
+ * Pure function to replace a node in a graph, optionally preserving its connected edges.
15
+ */
16
+ export declare function replaceNodeInGraph<TNode extends CanvasNode = CanvasNode, TEdge extends CanvasEdge = CanvasEdge>(nodes: TNode[], edges: TEdge[], oldNode: TNode, newNode: TNode, keepEdges?: boolean): {
17
+ nodes: TNode[];
18
+ edges: TEdge[];
19
+ };
20
+ export interface CreateCanvasGraphOptions<TNode extends CanvasNode = CanvasNode, TEdge extends CanvasEdge = CanvasEdge> {
21
+ initialNodes?: TNode[];
22
+ initialEdges?: TEdge[];
23
+ onNodesChange?: (nodes: TNode[]) => void;
24
+ onEdgesChange?: (edges: TEdge[]) => void;
25
+ onSave?: () => void;
26
+ createEdge?: (sourceId: string, targetId: string, options?: {
27
+ label?: string;
28
+ animated?: boolean;
29
+ data?: any;
30
+ }) => TEdge;
31
+ }
32
+ /**
33
+ * Headless Svelte 5 rune managing canvas graph state and operations.
34
+ */
35
+ export declare function createCanvasGraph<TNode extends CanvasNode = CanvasNode, TEdge extends CanvasEdge = CanvasEdge>(options?: CreateCanvasGraphOptions<TNode, TEdge>): {
36
+ nodes: TNode[];
37
+ edges: TEdge[];
38
+ setNodes: (newNodes: TNode[], triggerCallback?: boolean) => void;
39
+ setEdges: (newEdges: TEdge[], triggerCallback?: boolean) => void;
40
+ addNodeOrNodes: (nodeOrNodesToAdd: TNode | TNode[], animateFromPosition?: XYPosition, save?: boolean) => void;
41
+ addEdge: (edgeToAdd: TEdge, save?: boolean) => void;
42
+ addEdges: (edgesToAdd: TEdge[], save?: boolean) => void;
43
+ removeNodes: (nodesToRemove: TNode[], save?: boolean) => void;
44
+ removeEdges: (edgesToRemove: TEdge[], save?: boolean) => void;
45
+ replaceNode: (oldNode: TNode, newNode: TNode, save?: boolean, keepEdges?: boolean) => void;
46
+ addConnectedNodes: (params: {
47
+ nodesToAdd: TNode[];
48
+ inboundNodes?: TNode[];
49
+ outboundNodes?: TNode[];
50
+ animatedEdges?: boolean;
51
+ animateFromPosition?: XYPosition;
52
+ inboundEdgeData?: any;
53
+ outboundEdgeData?: any;
54
+ getEdgeLabel?: (source: TNode, target: TNode) => string;
55
+ }) => void;
56
+ animateNodePosition: (node: TNode, targetPosition: XYPosition, duration?: number, easing?: (t: number) => number) => void;
57
+ getDifferences: (baseline: {
58
+ nodes?: TNode[];
59
+ edges?: TEdge[];
60
+ }) => GraphDifferences<TNode, TEdge>;
61
+ };
62
+ //# sourceMappingURL=createCanvasGraph.svelte.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createCanvasGraph.svelte.d.ts","sourceRoot":"","sources":["../../src/canvas/createCanvasGraph.svelte.ts"],"names":[],"mappings":"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"}