@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
@@ -1,355 +0,0 @@
1
- import type { XYPosition } from '@xyflow/svelte';
2
- import type { CanvasNode, CanvasDockingCallbacks, DockStrategy } from './types.js';
3
-
4
- export type { DockStrategy };
5
-
6
- export interface CreateCanvasDockingOptions<TNode extends CanvasNode = CanvasNode>
7
- extends CanvasDockingCallbacks<TNode> {
8
- isDockTarget?: (target: TNode) => boolean;
9
- restorePositionOnDock?: boolean;
10
- onSave?: () => void;
11
- /**
12
- * Disambiguation strategy when multiple candidate dock targets intersect the dragged node.
13
- * - 'center-point': (Default) Resolves the target enclosing or closest to the dragged node's center.
14
- * - 'max-overlap': Resolves the target with the greatest overlapping area.
15
- * - 'pointer': Resolves the target enclosing or closest to the mouse/touch cursor.
16
- * - 'first': Resolves the first intersecting target (legacy behavior).
17
- */
18
- dockStrategy?: DockStrategy;
19
- /**
20
- * Custom primary dock target resolution callback. If provided and returns a node, takes precedence.
21
- */
22
- resolvePrimaryDockTarget?: (
23
- targets: TNode[],
24
- draggedNode: TNode,
25
- event?: MouseEvent | TouchEvent
26
- ) => TNode | null;
27
- /**
28
- * When true (default), ensures only a single primary dock target is considered hovered at any time.
29
- * Transitioning across adjacent dock targets automatically fires onDockLeave on the previous target
30
- * and onDockHover on the new target. Set to false to allow concurrent multi-target hover.
31
- */
32
- exclusiveHover?: boolean;
33
- }
34
-
35
- interface NodeRect {
36
- x: number;
37
- y: number;
38
- width: number;
39
- height: number;
40
- }
41
-
42
- function getNodeRect(node: CanvasNode): NodeRect {
43
- const x = node.position?.x ?? 0;
44
- const y = node.position?.y ?? 0;
45
- const width =
46
- (node as any).measured?.width ??
47
- (node as any).width ??
48
- (node as any).initialWidth ??
49
- 0;
50
- const height =
51
- (node as any).measured?.height ??
52
- (node as any).height ??
53
- (node as any).initialHeight ??
54
- 0;
55
- return { x, y, width, height };
56
- }
57
-
58
- function getNodeCenter(node: CanvasNode): { x: number; y: number } {
59
- const rect = getNodeRect(node);
60
- return {
61
- x: rect.x + rect.width / 2,
62
- y: rect.y + rect.height / 2
63
- };
64
- }
65
-
66
- function getDistanceSq(p1: { x: number; y: number }, p2: { x: number; y: number }): number {
67
- const dx = p1.x - p2.x;
68
- const dy = p1.y - p2.y;
69
- return dx * dx + dy * dy;
70
- }
71
-
72
- function getOverlapArea(rectA: NodeRect, rectB: NodeRect): number {
73
- const xOverlap = Math.max(
74
- 0,
75
- Math.min(rectA.x + rectA.width, rectB.x + rectB.width) - Math.max(rectA.x, rectB.x)
76
- );
77
- const yOverlap = Math.max(
78
- 0,
79
- Math.min(rectA.y + rectA.height, rectB.y + rectB.height) - Math.max(rectA.y, rectB.y)
80
- );
81
- return xOverlap * yOverlap;
82
- }
83
-
84
- function resolvePrimaryTarget<TNode extends CanvasNode>(
85
- targets: TNode[],
86
- draggedNode: TNode,
87
- strategy: DockStrategy,
88
- customResolver?: (
89
- targets: TNode[],
90
- draggedNode: TNode,
91
- event?: MouseEvent | TouchEvent
92
- ) => TNode | null,
93
- event?: MouseEvent | TouchEvent
94
- ): TNode | null {
95
- if (targets.length === 0) return null;
96
- if (targets.length === 1) return targets[0];
97
-
98
- if (customResolver) {
99
- const resolved = customResolver(targets, draggedNode, event);
100
- if (resolved !== undefined) return resolved;
101
- }
102
-
103
- if (strategy === 'first') {
104
- return targets[0];
105
- }
106
-
107
- if (strategy === 'pointer' && event) {
108
- const clientX = 'clientX' in event ? event.clientX : event.touches?.[0]?.clientX;
109
- const clientY = 'clientY' in event ? event.clientY : event.touches?.[0]?.clientY;
110
- if (typeof clientX === 'number' && typeof clientY === 'number') {
111
- const pointerInside = targets.filter((target) => {
112
- const r = getNodeRect(target);
113
- return (
114
- r.width > 0 &&
115
- r.height > 0 &&
116
- clientX >= r.x &&
117
- clientX <= r.x + r.width &&
118
- clientY >= r.y &&
119
- clientY <= r.y + r.height
120
- );
121
- });
122
- if (pointerInside.length === 1) return pointerInside[0];
123
- if (pointerInside.length > 1) {
124
- return pointerInside.reduce((best, cur) => {
125
- const bestDist = getDistanceSq(getNodeCenter(best), { x: clientX, y: clientY });
126
- const curDist = getDistanceSq(getNodeCenter(cur), { x: clientX, y: clientY });
127
- return curDist < bestDist ? cur : best;
128
- });
129
- }
130
- }
131
- }
132
-
133
- if (strategy === 'max-overlap') {
134
- const draggedRect = getNodeRect(draggedNode);
135
- let maxArea = -1;
136
- let bestTarget = targets[0];
137
- for (const target of targets) {
138
- const targetRect = getNodeRect(target);
139
- const area = getOverlapArea(draggedRect, targetRect);
140
- if (area > maxArea) {
141
- maxArea = area;
142
- bestTarget = target;
143
- }
144
- }
145
- return bestTarget;
146
- }
147
-
148
- // Strategy: 'center-point' (default)
149
- const draggedCenter = getNodeCenter(draggedNode);
150
- const containing = targets.filter((target) => {
151
- const r = getNodeRect(target);
152
- if (r.width > 0 && r.height > 0) {
153
- return (
154
- draggedCenter.x >= r.x &&
155
- draggedCenter.x <= r.x + r.width &&
156
- draggedCenter.y >= r.y &&
157
- draggedCenter.y <= r.y + r.height
158
- );
159
- }
160
- return false;
161
- });
162
-
163
- if (containing.length === 1) return containing[0];
164
- if (containing.length > 1) {
165
- return containing.reduce((best, cur) => {
166
- const bestDist = getDistanceSq(getNodeCenter(best), draggedCenter);
167
- const curDist = getDistanceSq(getNodeCenter(cur), draggedCenter);
168
- return curDist < bestDist ? cur : best;
169
- });
170
- }
171
-
172
- return targets.reduce((best, cur) => {
173
- const bestDist = getDistanceSq(getNodeCenter(best), draggedCenter);
174
- const curDist = getDistanceSq(getNodeCenter(cur), draggedCenter);
175
- return curDist < bestDist ? cur : best;
176
- });
177
- }
178
-
179
- /**
180
- * Headless Svelte 5 rune managing canvas node dragging, docking intersection, and connection tracking.
181
- */
182
- export function createCanvasDocking<TNode extends CanvasNode = CanvasNode>(
183
- options: CreateCanvasDockingOptions<TNode> = {}
184
- ) {
185
- let draggedNode = $state.raw<TNode | null>(null);
186
- let draggedInitialPosition = $state.raw<XYPosition | null>(null);
187
- let connectingHandle = $state.raw<string>('');
188
- let connectingNode = $state.raw<TNode | null>(null);
189
- let currentHoverTargets = $state.raw<Set<string>>(new Set());
190
-
191
- const isDockTarget = options.isDockTarget ?? ((target: TNode) => (target as any).type === 'boardNode');
192
- const dockStrategy = options.dockStrategy ?? 'center-point';
193
- const exclusiveHover = options.exclusiveHover ?? true;
194
-
195
- function handleNodeDragStart(params: {
196
- targetNode: TNode | null;
197
- event?: MouseEvent | TouchEvent;
198
- }): void {
199
- draggedNode = params.targetNode;
200
- draggedInitialPosition = params.targetNode?.position ? { ...params.targetNode.position } : null;
201
- currentHoverTargets = new Set();
202
- }
203
-
204
- function handleNodeDrag(
205
- params: {
206
- targetNode: TNode | null;
207
- event?: MouseEvent | TouchEvent;
208
- },
209
- getIntersectingNodes: (node: TNode) => TNode[]
210
- ): void {
211
- draggedNode = params.targetNode;
212
- if (!draggedNode) return;
213
-
214
- const intersecting = getIntersectingNodes(draggedNode);
215
- const currentDockTargets = intersecting.filter(isDockTarget);
216
-
217
- if (exclusiveHover) {
218
- const primaryTarget =
219
- currentDockTargets.length > 0
220
- ? resolvePrimaryTarget(
221
- currentDockTargets,
222
- draggedNode,
223
- dockStrategy,
224
- options.resolvePrimaryDockTarget,
225
- params.event
226
- )
227
- : null;
228
- const primaryTargetId = primaryTarget ? primaryTarget.id : null;
229
-
230
- // Fire onDockLeave for previous targets no longer considered primary
231
- currentHoverTargets.forEach((targetId) => {
232
- if (targetId !== primaryTargetId) {
233
- const leftNode = intersecting.find((n) => n.id === targetId) ?? ({ id: targetId } as TNode);
234
- options.onDockLeave?.(leftNode, draggedNode!);
235
- }
236
- });
237
-
238
- // Fire onDockHover if entering a new primary target
239
- if (primaryTarget && !currentHoverTargets.has(primaryTarget.id)) {
240
- options.onDockHover?.(primaryTarget, draggedNode);
241
- }
242
-
243
- currentHoverTargets = primaryTargetId ? new Set([primaryTargetId]) : new Set();
244
- } else {
245
- const newHoverSet = new Set(currentDockTargets.map((t) => t.id));
246
-
247
- // Check for left targets
248
- currentHoverTargets.forEach((targetId) => {
249
- if (!newHoverSet.has(targetId)) {
250
- const leftNode = intersecting.find((n) => n.id === targetId) ?? ({ id: targetId } as TNode);
251
- options.onDockLeave?.(leftNode, draggedNode!);
252
- }
253
- });
254
-
255
- // Check for newly entered targets
256
- currentDockTargets.forEach((target) => {
257
- if (!currentHoverTargets.has(target.id)) {
258
- options.onDockHover?.(target, draggedNode!);
259
- }
260
- });
261
-
262
- currentHoverTargets = newHoverSet;
263
- }
264
- }
265
-
266
- function handleNodeDragStop(
267
- params: {
268
- targetNode: TNode | null;
269
- event?: MouseEvent | TouchEvent;
270
- },
271
- getIntersectingNodes: (node: TNode) => TNode[],
272
- updateNodePosition?: (nodeId: string, position: XYPosition) => void
273
- ): void {
274
- draggedNode = params.targetNode;
275
-
276
- if (draggedNode) {
277
- const intersecting = getIntersectingNodes(draggedNode);
278
- const dockTargets = intersecting.filter(isDockTarget);
279
- const dockTarget =
280
- dockTargets.length > 0
281
- ? resolvePrimaryTarget(
282
- dockTargets,
283
- draggedNode,
284
- dockStrategy,
285
- options.resolvePrimaryDockTarget,
286
- params.event
287
- )
288
- : null;
289
-
290
- if (dockTarget) {
291
- options.onDockDrop?.(dockTarget, draggedNode);
292
-
293
- if (options.restorePositionOnDock !== false && draggedInitialPosition && updateNodePosition) {
294
- updateNodePosition(draggedNode.id, draggedInitialPosition);
295
- }
296
- }
297
- }
298
-
299
- // Reset state
300
- draggedNode = null;
301
- draggedInitialPosition = null;
302
- currentHoverTargets = new Set();
303
-
304
- options.onSave?.();
305
- }
306
-
307
- function handleConnectStart(
308
- params: {
309
- nodeId: string | null;
310
- handleId?: string | null;
311
- handleType: 'source' | 'target' | null;
312
- },
313
- getNode: (id: string) => TNode | undefined
314
- ): void {
315
- connectingHandle = params.handleType ?? '';
316
- connectingNode = params.nodeId ? (getNode(params.nodeId) ?? null) : null;
317
- }
318
-
319
- function handleConnectEnd(): void {
320
- connectingHandle = '';
321
- connectingNode = null;
322
- }
323
-
324
- function reset(): void {
325
- draggedNode = null;
326
- draggedInitialPosition = null;
327
- connectingHandle = '';
328
- connectingNode = null;
329
- currentHoverTargets = new Set();
330
- }
331
-
332
- return {
333
- get draggedNode() {
334
- return draggedNode;
335
- },
336
- get draggedInitialPosition() {
337
- return draggedInitialPosition;
338
- },
339
- get connectingHandle() {
340
- return connectingHandle;
341
- },
342
- get connectingNode() {
343
- return connectingNode;
344
- },
345
- get isDragging() {
346
- return draggedNode !== null;
347
- },
348
- handleNodeDragStart,
349
- handleNodeDrag,
350
- handleNodeDragStop,
351
- handleConnectStart,
352
- handleConnectEnd,
353
- reset
354
- };
355
- }