@bian-womp/spark-workbench 0.3.90 → 0.3.92
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/cjs/index.cjs +19 -6
- package/lib/cjs/index.cjs.map +1 -1
- package/lib/cjs/src/misc/layout.d.ts.map +1 -1
- package/lib/cjs/src/misc/mapping.d.ts.map +1 -1
- package/lib/cjs/src/misc/value.d.ts +2 -1
- package/lib/cjs/src/misc/value.d.ts.map +1 -1
- package/lib/esm/index.js +19 -6
- package/lib/esm/index.js.map +1 -1
- package/lib/esm/src/misc/layout.d.ts.map +1 -1
- package/lib/esm/src/misc/mapping.d.ts.map +1 -1
- package/lib/esm/src/misc/value.d.ts +2 -1
- package/lib/esm/src/misc/value.d.ts.map +1 -1
- package/package.json +4 -4
- package/lib/src/adapters/cli/index.d.ts +0 -22
- package/lib/src/adapters/cli/index.d.ts.map +0 -1
- package/lib/src/adapters/cli/index.js +0 -50
- package/lib/src/adapters/cli/index.js.map +0 -1
- package/lib/src/core/AbstractWorkbench.d.ts +0 -40
- package/lib/src/core/AbstractWorkbench.d.ts.map +0 -1
- package/lib/src/core/AbstractWorkbench.js +0 -15
- package/lib/src/core/AbstractWorkbench.js.map +0 -1
- package/lib/src/core/InMemoryWorkbench.d.ts +0 -304
- package/lib/src/core/InMemoryWorkbench.d.ts.map +0 -1
- package/lib/src/core/InMemoryWorkbench.js +0 -1016
- package/lib/src/core/InMemoryWorkbench.js.map +0 -1
- package/lib/src/core/contracts.d.ts +0 -172
- package/lib/src/core/contracts.d.ts.map +0 -1
- package/lib/src/core/contracts.js +0 -2
- package/lib/src/core/contracts.js.map +0 -1
- package/lib/src/core/ui-extensions.d.ts +0 -85
- package/lib/src/core/ui-extensions.d.ts.map +0 -1
- package/lib/src/core/ui-extensions.js +0 -111
- package/lib/src/core/ui-extensions.js.map +0 -1
- package/lib/src/examples/cli.d.ts +0 -2
- package/lib/src/examples/cli.d.ts.map +0 -1
- package/lib/src/examples/cli.js +0 -244
- package/lib/src/examples/cli.js.map +0 -1
- package/lib/src/examples/reactflow/App.d.ts +0 -2
- package/lib/src/examples/reactflow/App.d.ts.map +0 -1
- package/lib/src/examples/reactflow/App.js +0 -20
- package/lib/src/examples/reactflow/App.js.map +0 -1
- package/lib/src/index.d.ts +0 -30
- package/lib/src/index.d.ts.map +0 -1
- package/lib/src/index.js +0 -30
- package/lib/src/index.js.map +0 -1
- package/lib/src/misc/DebugEvents.d.ts +0 -7
- package/lib/src/misc/DebugEvents.d.ts.map +0 -1
- package/lib/src/misc/DebugEvents.js +0 -51
- package/lib/src/misc/DebugEvents.js.map +0 -1
- package/lib/src/misc/DefaultEdge.d.ts +0 -5
- package/lib/src/misc/DefaultEdge.d.ts.map +0 -1
- package/lib/src/misc/DefaultEdge.js +0 -15
- package/lib/src/misc/DefaultEdge.js.map +0 -1
- package/lib/src/misc/DefaultNode.d.ts +0 -5
- package/lib/src/misc/DefaultNode.d.ts.map +0 -1
- package/lib/src/misc/DefaultNode.js +0 -25
- package/lib/src/misc/DefaultNode.js.map +0 -1
- package/lib/src/misc/DefaultNodeContent.d.ts +0 -4
- package/lib/src/misc/DefaultNodeContent.d.ts.map +0 -1
- package/lib/src/misc/DefaultNodeContent.js +0 -58
- package/lib/src/misc/DefaultNodeContent.js.map +0 -1
- package/lib/src/misc/DefaultNodeHeader.d.ts +0 -13
- package/lib/src/misc/DefaultNodeHeader.d.ts.map +0 -1
- package/lib/src/misc/DefaultNodeHeader.js +0 -78
- package/lib/src/misc/DefaultNodeHeader.js.map +0 -1
- package/lib/src/misc/Inspector.d.ts +0 -12
- package/lib/src/misc/Inspector.d.ts.map +0 -1
- package/lib/src/misc/Inspector.js +0 -253
- package/lib/src/misc/Inspector.js.map +0 -1
- package/lib/src/misc/IssueBadge.d.ts +0 -7
- package/lib/src/misc/IssueBadge.d.ts.map +0 -1
- package/lib/src/misc/IssueBadge.js +0 -7
- package/lib/src/misc/IssueBadge.js.map +0 -1
- package/lib/src/misc/KeyboardShortcutToast.d.ts +0 -16
- package/lib/src/misc/KeyboardShortcutToast.d.ts.map +0 -1
- package/lib/src/misc/KeyboardShortcutToast.js +0 -40
- package/lib/src/misc/KeyboardShortcutToast.js.map +0 -1
- package/lib/src/misc/NodeHandles.d.ts +0 -18
- package/lib/src/misc/NodeHandles.d.ts.map +0 -1
- package/lib/src/misc/NodeHandles.js +0 -67
- package/lib/src/misc/NodeHandles.js.map +0 -1
- package/lib/src/misc/SelectionActiveSync.d.ts +0 -10
- package/lib/src/misc/SelectionActiveSync.d.ts.map +0 -1
- package/lib/src/misc/SelectionActiveSync.js +0 -21
- package/lib/src/misc/SelectionActiveSync.js.map +0 -1
- package/lib/src/misc/WorkbenchCanvas.d.ts +0 -23
- package/lib/src/misc/WorkbenchCanvas.d.ts.map +0 -1
- package/lib/src/misc/WorkbenchCanvas.js +0 -669
- package/lib/src/misc/WorkbenchCanvas.js.map +0 -1
- package/lib/src/misc/WorkbenchStudio.d.ts +0 -43
- package/lib/src/misc/WorkbenchStudio.d.ts.map +0 -1
- package/lib/src/misc/WorkbenchStudio.js +0 -463
- package/lib/src/misc/WorkbenchStudio.js.map +0 -1
- package/lib/src/misc/constants.d.ts +0 -4
- package/lib/src/misc/constants.d.ts.map +0 -1
- package/lib/src/misc/constants.js +0 -5
- package/lib/src/misc/constants.js.map +0 -1
- package/lib/src/misc/context/WorkbenchContext.d.ts +0 -133
- package/lib/src/misc/context/WorkbenchContext.d.ts.map +0 -1
- package/lib/src/misc/context/WorkbenchContext.js +0 -9
- package/lib/src/misc/context/WorkbenchContext.js.map +0 -1
- package/lib/src/misc/context/WorkbenchContext.provider.d.ts +0 -12
- package/lib/src/misc/context/WorkbenchContext.provider.d.ts.map +0 -1
- package/lib/src/misc/context/WorkbenchContext.provider.js +0 -995
- package/lib/src/misc/context/WorkbenchContext.provider.js.map +0 -1
- package/lib/src/misc/context-menu/ContextMenuButton.d.ts +0 -8
- package/lib/src/misc/context-menu/ContextMenuButton.d.ts.map +0 -1
- package/lib/src/misc/context-menu/ContextMenuButton.js +0 -10
- package/lib/src/misc/context-menu/ContextMenuButton.js.map +0 -1
- package/lib/src/misc/context-menu/ContextMenuHandlers.d.ts +0 -85
- package/lib/src/misc/context-menu/ContextMenuHandlers.d.ts.map +0 -1
- package/lib/src/misc/context-menu/ContextMenuHandlers.js +0 -2
- package/lib/src/misc/context-menu/ContextMenuHandlers.js.map +0 -1
- package/lib/src/misc/context-menu/ContextMenuHelpers.d.ts +0 -45
- package/lib/src/misc/context-menu/ContextMenuHelpers.d.ts.map +0 -1
- package/lib/src/misc/context-menu/ContextMenuHelpers.js +0 -182
- package/lib/src/misc/context-menu/ContextMenuHelpers.js.map +0 -1
- package/lib/src/misc/context-menu/DefaultContextMenu.d.ts +0 -3
- package/lib/src/misc/context-menu/DefaultContextMenu.d.ts.map +0 -1
- package/lib/src/misc/context-menu/DefaultContextMenu.js +0 -111
- package/lib/src/misc/context-menu/DefaultContextMenu.js.map +0 -1
- package/lib/src/misc/context-menu/NodeContextMenu.d.ts +0 -3
- package/lib/src/misc/context-menu/NodeContextMenu.d.ts.map +0 -1
- package/lib/src/misc/context-menu/NodeContextMenu.js +0 -51
- package/lib/src/misc/context-menu/NodeContextMenu.js.map +0 -1
- package/lib/src/misc/context-menu/SelectionContextMenu.d.ts +0 -3
- package/lib/src/misc/context-menu/SelectionContextMenu.d.ts.map +0 -1
- package/lib/src/misc/context-menu/SelectionContextMenu.js +0 -47
- package/lib/src/misc/context-menu/SelectionContextMenu.js.map +0 -1
- package/lib/src/misc/hooks.d.ts +0 -18
- package/lib/src/misc/hooks.d.ts.map +0 -1
- package/lib/src/misc/hooks.js +0 -275
- package/lib/src/misc/hooks.js.map +0 -1
- package/lib/src/misc/layout.d.ts +0 -117
- package/lib/src/misc/layout.d.ts.map +0 -1
- package/lib/src/misc/layout.js +0 -205
- package/lib/src/misc/layout.js.map +0 -1
- package/lib/src/misc/load.d.ts +0 -5
- package/lib/src/misc/load.d.ts.map +0 -1
- package/lib/src/misc/load.js +0 -106
- package/lib/src/misc/load.js.map +0 -1
- package/lib/src/misc/mapping.d.ts +0 -128
- package/lib/src/misc/mapping.d.ts.map +0 -1
- package/lib/src/misc/mapping.js +0 -270
- package/lib/src/misc/mapping.js.map +0 -1
- package/lib/src/misc/merge-utils.d.ts +0 -12
- package/lib/src/misc/merge-utils.d.ts.map +0 -1
- package/lib/src/misc/merge-utils.js +0 -51
- package/lib/src/misc/merge-utils.js.map +0 -1
- package/lib/src/misc/thumbnail-utils.d.ts +0 -53
- package/lib/src/misc/thumbnail-utils.d.ts.map +0 -1
- package/lib/src/misc/thumbnail-utils.js +0 -629
- package/lib/src/misc/thumbnail-utils.js.map +0 -1
- package/lib/src/misc/types.d.ts +0 -18
- package/lib/src/misc/types.d.ts.map +0 -1
- package/lib/src/misc/types.js +0 -2
- package/lib/src/misc/types.js.map +0 -1
- package/lib/src/misc/value.d.ts +0 -16
- package/lib/src/misc/value.d.ts.map +0 -1
- package/lib/src/misc/value.js +0 -114
- package/lib/src/misc/value.js.map +0 -1
- package/lib/src/misc/viewport-utils.d.ts +0 -6
- package/lib/src/misc/viewport-utils.d.ts.map +0 -1
- package/lib/src/misc/viewport-utils.js +0 -18
- package/lib/src/misc/viewport-utils.js.map +0 -1
- package/lib/src/runtime/AbstractGraphRunner.d.ts +0 -61
- package/lib/src/runtime/AbstractGraphRunner.d.ts.map +0 -1
- package/lib/src/runtime/AbstractGraphRunner.js +0 -63
- package/lib/src/runtime/AbstractGraphRunner.js.map +0 -1
- package/lib/src/runtime/IGraphRunner.d.ts +0 -100
- package/lib/src/runtime/IGraphRunner.d.ts.map +0 -1
- package/lib/src/runtime/IGraphRunner.js +0 -2
- package/lib/src/runtime/IGraphRunner.js.map +0 -1
- package/lib/src/runtime/LocalGraphRunner.d.ts +0 -60
- package/lib/src/runtime/LocalGraphRunner.d.ts.map +0 -1
- package/lib/src/runtime/LocalGraphRunner.js +0 -294
- package/lib/src/runtime/LocalGraphRunner.js.map +0 -1
- package/lib/src/runtime/RemoteGraphRunner.d.ts +0 -109
- package/lib/src/runtime/RemoteGraphRunner.d.ts.map +0 -1
- package/lib/src/runtime/RemoteGraphRunner.js +0 -696
- package/lib/src/runtime/RemoteGraphRunner.js.map +0 -1
|
@@ -1,629 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Flow thumbnail capture utility
|
|
3
|
-
* Captures React Flow canvas as SVG image
|
|
4
|
-
*/
|
|
5
|
-
// ============================================================================
|
|
6
|
-
// Utility Functions
|
|
7
|
-
// ============================================================================
|
|
8
|
-
/**
|
|
9
|
-
* Parses CSS transform string to extract translate and scale values
|
|
10
|
-
*/
|
|
11
|
-
function parseViewportTransform(transform) {
|
|
12
|
-
let translateX = 0;
|
|
13
|
-
let translateY = 0;
|
|
14
|
-
let scale = 1;
|
|
15
|
-
if (transform && transform !== "none") {
|
|
16
|
-
// Try translate() scale() format first
|
|
17
|
-
const translateMatch = transform.match(/translate\(([^,]+)px,\s*([^)]+)px\)/);
|
|
18
|
-
const scaleMatch = transform.match(/scale\(([^)]+)\)/);
|
|
19
|
-
if (translateMatch) {
|
|
20
|
-
translateX = parseFloat(translateMatch[1]);
|
|
21
|
-
translateY = parseFloat(translateMatch[2]);
|
|
22
|
-
}
|
|
23
|
-
if (scaleMatch) {
|
|
24
|
-
scale = parseFloat(scaleMatch[1]);
|
|
25
|
-
}
|
|
26
|
-
// Fallback to matrix format
|
|
27
|
-
if (!translateMatch) {
|
|
28
|
-
const matrixMatch = transform.match(/matrix\(([^)]+)\)/);
|
|
29
|
-
if (matrixMatch) {
|
|
30
|
-
const values = matrixMatch[1].split(",").map((v) => parseFloat(v.trim()));
|
|
31
|
-
if (values.length >= 6) {
|
|
32
|
-
scale = Math.sqrt(values[0] * values[0] + values[1] * values[1]);
|
|
33
|
-
translateX = values[4];
|
|
34
|
-
translateY = values[5];
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
return { translateX, translateY, scale };
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* Calculates visible viewport bounds in flow coordinates
|
|
43
|
-
*/
|
|
44
|
-
function calculateVisibleBounds(viewportRect, transform) {
|
|
45
|
-
const { translateX, translateY, scale } = transform;
|
|
46
|
-
// Guard against division by zero
|
|
47
|
-
if (scale === 0) {
|
|
48
|
-
console.warn("[flowThumbnail] Viewport scale is 0, using default bounds");
|
|
49
|
-
return {
|
|
50
|
-
minX: -translateX,
|
|
51
|
-
minY: -translateY,
|
|
52
|
-
maxX: viewportRect.width - translateX,
|
|
53
|
-
maxY: viewportRect.height - translateY,
|
|
54
|
-
};
|
|
55
|
-
}
|
|
56
|
-
// Screen to flow: (screenX - translateX) / scale
|
|
57
|
-
return {
|
|
58
|
-
minX: (0 - translateX) / scale,
|
|
59
|
-
minY: (0 - translateY) / scale,
|
|
60
|
-
maxX: (viewportRect.width - translateX) / scale,
|
|
61
|
-
maxY: (viewportRect.height - translateY) / scale,
|
|
62
|
-
};
|
|
63
|
-
}
|
|
64
|
-
/**
|
|
65
|
-
* Parses border radius string (px or rem) to pixels
|
|
66
|
-
*/
|
|
67
|
-
function parseBorderRadius(borderRadiusStr) {
|
|
68
|
-
if (!borderRadiusStr || borderRadiusStr === "0px") {
|
|
69
|
-
return 8; // default
|
|
70
|
-
}
|
|
71
|
-
const match = borderRadiusStr.match(/([\d.]+)(px|rem)/);
|
|
72
|
-
if (match) {
|
|
73
|
-
const value = parseFloat(match[1]);
|
|
74
|
-
const unit = match[2];
|
|
75
|
-
// Convert rem to px (assuming 16px base) or use px directly
|
|
76
|
-
return unit === "rem" ? value * 16 : value;
|
|
77
|
-
}
|
|
78
|
-
// Try direct parseFloat as fallback
|
|
79
|
-
const parsed = parseFloat(borderRadiusStr);
|
|
80
|
-
return isNaN(parsed) ? 8 : parsed;
|
|
81
|
-
}
|
|
82
|
-
/**
|
|
83
|
-
* Extracts stroke color from element, with fallback
|
|
84
|
-
*/
|
|
85
|
-
function extractStrokeColor(element) {
|
|
86
|
-
if (element instanceof SVGPathElement) {
|
|
87
|
-
return element.getAttribute("stroke") || window.getComputedStyle(element).stroke || "#b1b1b7";
|
|
88
|
-
}
|
|
89
|
-
const style = window.getComputedStyle(element);
|
|
90
|
-
return (style.borderColor || style.borderTopColor || "#6b7280" // gray-500 default
|
|
91
|
-
);
|
|
92
|
-
}
|
|
93
|
-
/**
|
|
94
|
-
* Extracts stroke/border width from element, ensuring minimum value
|
|
95
|
-
*/
|
|
96
|
-
function extractStrokeWidth(element, minWidth = 1) {
|
|
97
|
-
if (element instanceof SVGPathElement) {
|
|
98
|
-
const width = parseFloat(element.getAttribute("stroke-width") || "0") ||
|
|
99
|
-
parseFloat(window.getComputedStyle(element).strokeWidth || "2");
|
|
100
|
-
return width > 0 ? width : minWidth;
|
|
101
|
-
}
|
|
102
|
-
const style = window.getComputedStyle(element);
|
|
103
|
-
const width = parseFloat(style.borderWidth || style.borderTopWidth || "0");
|
|
104
|
-
return width > 0 ? width : minWidth;
|
|
105
|
-
}
|
|
106
|
-
/**
|
|
107
|
-
* Checks if a rectangle intersects with visible bounds
|
|
108
|
-
*/
|
|
109
|
-
function isRectVisible(x, y, width, height, bounds) {
|
|
110
|
-
return x + width >= bounds.minX && x <= bounds.maxX && y + height >= bounds.minY && y <= bounds.maxY;
|
|
111
|
-
}
|
|
112
|
-
/**
|
|
113
|
-
* Parses path data to get bounding box
|
|
114
|
-
* Handles M (moveTo), L (lineTo), C (cubic Bezier), Q (quadratic Bezier), and H/V (horizontal/vertical) commands
|
|
115
|
-
*/
|
|
116
|
-
function getPathBounds(pathData) {
|
|
117
|
-
let minX = Infinity;
|
|
118
|
-
let minY = Infinity;
|
|
119
|
-
let maxX = -Infinity;
|
|
120
|
-
let maxY = -Infinity;
|
|
121
|
-
// Match coordinates from various path commands: M, L, C, Q, T, S, H, V
|
|
122
|
-
// Pattern matches: command letter followed by coordinate pairs
|
|
123
|
-
const coordPattern = /[MLCQTSHV](-?\d+\.?\d*),(-?\d+\.?\d*)/g;
|
|
124
|
-
const coords = pathData.match(coordPattern);
|
|
125
|
-
if (coords) {
|
|
126
|
-
coords.forEach((coord) => {
|
|
127
|
-
const match = coord.match(/(-?\d+\.?\d*),(-?\d+\.?\d*)/);
|
|
128
|
-
if (match) {
|
|
129
|
-
const x = parseFloat(match[1]);
|
|
130
|
-
const y = parseFloat(match[2]);
|
|
131
|
-
if (!isNaN(x) && !isNaN(y)) {
|
|
132
|
-
minX = Math.min(minX, x);
|
|
133
|
-
minY = Math.min(minY, y);
|
|
134
|
-
maxX = Math.max(maxX, x);
|
|
135
|
-
maxY = Math.max(maxY, y);
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
});
|
|
139
|
-
}
|
|
140
|
-
return { minX, minY, maxX, maxY };
|
|
141
|
-
}
|
|
142
|
-
// ============================================================================
|
|
143
|
-
// Edge Extraction
|
|
144
|
-
// ============================================================================
|
|
145
|
-
/**
|
|
146
|
-
* Extracts visible edge paths from React Flow viewport
|
|
147
|
-
*/
|
|
148
|
-
function extractEdgePaths(viewport, visibleBounds) {
|
|
149
|
-
const edges = [];
|
|
150
|
-
let minX = Infinity;
|
|
151
|
-
let minY = Infinity;
|
|
152
|
-
let maxX = -Infinity;
|
|
153
|
-
let maxY = -Infinity;
|
|
154
|
-
const edgePathElements = viewport.querySelectorAll(".react-flow__edge-path");
|
|
155
|
-
edgePathElements.forEach((pathEl) => {
|
|
156
|
-
const pathData = pathEl.getAttribute("d");
|
|
157
|
-
if (!pathData)
|
|
158
|
-
return;
|
|
159
|
-
const pathBounds = getPathBounds(pathData);
|
|
160
|
-
// Only include edge if it intersects with visible viewport (or if ignoring viewport)
|
|
161
|
-
if (!visibleBounds ||
|
|
162
|
-
(pathBounds.maxX >= visibleBounds.minX &&
|
|
163
|
-
pathBounds.minX <= visibleBounds.maxX &&
|
|
164
|
-
pathBounds.maxY >= visibleBounds.minY &&
|
|
165
|
-
pathBounds.minY <= visibleBounds.maxY)) {
|
|
166
|
-
edges.push({
|
|
167
|
-
d: pathData,
|
|
168
|
-
stroke: extractStrokeColor(pathEl),
|
|
169
|
-
strokeWidth: extractStrokeWidth(pathEl, 2),
|
|
170
|
-
});
|
|
171
|
-
// Update bounding box
|
|
172
|
-
minX = Math.min(minX, pathBounds.minX);
|
|
173
|
-
minY = Math.min(minY, pathBounds.minY);
|
|
174
|
-
maxX = Math.max(maxX, pathBounds.maxX);
|
|
175
|
-
maxY = Math.max(maxY, pathBounds.maxY);
|
|
176
|
-
}
|
|
177
|
-
});
|
|
178
|
-
return { edges, bounds: { minX, minY, maxX, maxY } };
|
|
179
|
-
}
|
|
180
|
-
// ============================================================================
|
|
181
|
-
// Node Extraction
|
|
182
|
-
// ============================================================================
|
|
183
|
-
/**
|
|
184
|
-
* Extracts node position from transform style
|
|
185
|
-
*/
|
|
186
|
-
function extractNodePosition(nodeEl) {
|
|
187
|
-
const transformStyle = nodeEl.style.transform || "";
|
|
188
|
-
const translateMatch = transformStyle.match(/translate\(([^,]+)px,\s*([^)]+)px\)/);
|
|
189
|
-
if (translateMatch) {
|
|
190
|
-
return {
|
|
191
|
-
x: parseFloat(translateMatch[1]),
|
|
192
|
-
y: parseFloat(translateMatch[2]),
|
|
193
|
-
};
|
|
194
|
-
}
|
|
195
|
-
return { x: 0, y: 0 };
|
|
196
|
-
}
|
|
197
|
-
/**
|
|
198
|
-
* Extracts node dimensions from inline styles
|
|
199
|
-
*/
|
|
200
|
-
function extractNodeDimensions(nodeEl) {
|
|
201
|
-
const widthMatch = nodeEl.style.width?.match(/(\d+)px/);
|
|
202
|
-
const heightMatch = nodeEl.style.height?.match(/(\d+)px/);
|
|
203
|
-
return {
|
|
204
|
-
width: widthMatch ? parseFloat(widthMatch[1]) : 150,
|
|
205
|
-
height: heightMatch ? parseFloat(heightMatch[1]) : 40,
|
|
206
|
-
};
|
|
207
|
-
}
|
|
208
|
-
/**
|
|
209
|
-
* Extracts node styles (colors, border, radius) from computed styles
|
|
210
|
-
*/
|
|
211
|
-
function extractNodeStyles(nodeContent, nodeBackgroundColor) {
|
|
212
|
-
const computedStyle = window.getComputedStyle(nodeContent);
|
|
213
|
-
// Use provided background color or default gray background for nodes in thumbnail
|
|
214
|
-
const fill = nodeBackgroundColor || "#f3f4f6"; // gray-100 equivalent
|
|
215
|
-
const stroke = extractStrokeColor(nodeContent);
|
|
216
|
-
const strokeWidth = extractStrokeWidth(nodeContent, 1);
|
|
217
|
-
const borderRadiusStr = computedStyle.borderRadius || "8px";
|
|
218
|
-
const rx = parseBorderRadius(borderRadiusStr);
|
|
219
|
-
const ry = rx; // Use same radius for both x and y
|
|
220
|
-
return { fill, stroke, strokeWidth, rx, ry };
|
|
221
|
-
}
|
|
222
|
-
/**
|
|
223
|
-
* Determines if a handle is a source (output) or target (input)
|
|
224
|
-
*/
|
|
225
|
-
function isHandleSource(handleEl) {
|
|
226
|
-
return (handleEl.classList.contains("react-flow__handle-right") || handleEl.classList.contains("react-flow__handle-source"));
|
|
227
|
-
}
|
|
228
|
-
/**
|
|
229
|
-
* Extracts handle position and calculates absolute coordinates
|
|
230
|
-
*/
|
|
231
|
-
function extractHandlePosition(handleEl, nodeX, nodeY, nodeWidth, isSource) {
|
|
232
|
-
const handleStyle = window.getComputedStyle(handleEl);
|
|
233
|
-
const handleTop = parseFloat(handleStyle.top || "0");
|
|
234
|
-
const handleLeft = handleStyle.left;
|
|
235
|
-
const handleRight = handleStyle.right;
|
|
236
|
-
const handleY = nodeY + handleTop;
|
|
237
|
-
let handleX;
|
|
238
|
-
if (isSource) {
|
|
239
|
-
// Source handles are on the right edge
|
|
240
|
-
if (handleRight !== "auto" && handleRight !== "") {
|
|
241
|
-
const rightValue = parseFloat(handleRight) || 0;
|
|
242
|
-
handleX = nodeX + nodeWidth + rightValue;
|
|
243
|
-
}
|
|
244
|
-
else {
|
|
245
|
-
handleX = nodeX + nodeWidth;
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
else {
|
|
249
|
-
// Target handles are on the left edge
|
|
250
|
-
if (handleLeft !== "auto" && handleLeft !== "") {
|
|
251
|
-
const leftValue = parseFloat(handleLeft) || 0;
|
|
252
|
-
handleX = nodeX + leftValue;
|
|
253
|
-
}
|
|
254
|
-
else {
|
|
255
|
-
handleX = nodeX;
|
|
256
|
-
}
|
|
257
|
-
}
|
|
258
|
-
return { x: handleX, y: handleY };
|
|
259
|
-
}
|
|
260
|
-
/**
|
|
261
|
-
* Extracts handles from a node element
|
|
262
|
-
*/
|
|
263
|
-
function extractNodeHandles(nodeEl, nodeX, nodeY, nodeWidth) {
|
|
264
|
-
const handles = [];
|
|
265
|
-
const handleElements = nodeEl.querySelectorAll(".react-flow__handle");
|
|
266
|
-
handleElements.forEach((handleEl) => {
|
|
267
|
-
const handleStyle = window.getComputedStyle(handleEl);
|
|
268
|
-
const handleWidth = parseFloat(handleStyle.width || "12");
|
|
269
|
-
const handleHeight = parseFloat(handleStyle.height || "12");
|
|
270
|
-
const isSource = isHandleSource(handleEl);
|
|
271
|
-
const position = extractHandlePosition(handleEl, nodeX, nodeY, nodeWidth, isSource);
|
|
272
|
-
handles.push({
|
|
273
|
-
x: position.x,
|
|
274
|
-
y: position.y,
|
|
275
|
-
width: handleWidth,
|
|
276
|
-
height: handleHeight,
|
|
277
|
-
fill: handleStyle.backgroundColor || "rgba(255, 255, 255, 0.5)",
|
|
278
|
-
stroke: extractStrokeColor(handleEl),
|
|
279
|
-
strokeWidth: extractStrokeWidth(handleEl, 1),
|
|
280
|
-
type: isSource ? "source" : "target",
|
|
281
|
-
});
|
|
282
|
-
});
|
|
283
|
-
return handles;
|
|
284
|
-
}
|
|
285
|
-
/**
|
|
286
|
-
* Extracts node title text and position
|
|
287
|
-
*/
|
|
288
|
-
function extractNodeTitle(nodeEl, nodeX, nodeY) {
|
|
289
|
-
const titleElement = nodeEl.querySelector(".react-flow__node-title");
|
|
290
|
-
if (!titleElement)
|
|
291
|
-
return undefined;
|
|
292
|
-
const titleText = titleElement.textContent || titleElement.innerText || "";
|
|
293
|
-
if (!titleText.trim())
|
|
294
|
-
return undefined;
|
|
295
|
-
const titleStyle = window.getComputedStyle(titleElement);
|
|
296
|
-
const titleRect = titleElement.getBoundingClientRect();
|
|
297
|
-
const nodeRect = nodeEl.getBoundingClientRect();
|
|
298
|
-
// Calculate title position relative to node (in flow coordinates)
|
|
299
|
-
const titleRelativeX = titleRect.left - nodeRect.left;
|
|
300
|
-
const titleRelativeY = titleRect.top - nodeRect.top;
|
|
301
|
-
// Get font properties
|
|
302
|
-
const fontSize = parseFloat(titleStyle.fontSize || "14");
|
|
303
|
-
const fill = titleStyle.color || "#374151"; // gray-700 default
|
|
304
|
-
const fontWeight = titleStyle.fontWeight || "600"; // bold default
|
|
305
|
-
// Calculate text position (SVG text uses baseline)
|
|
306
|
-
const lineHeight = parseFloat(titleStyle.lineHeight || String(fontSize * 1.2));
|
|
307
|
-
const textBaselineOffset = lineHeight * 0.8; // Approximate baseline offset
|
|
308
|
-
return {
|
|
309
|
-
text: titleText.trim(),
|
|
310
|
-
x: nodeX + titleRelativeX,
|
|
311
|
-
y: nodeY + titleRelativeY + textBaselineOffset,
|
|
312
|
-
fontSize,
|
|
313
|
-
fill,
|
|
314
|
-
fontWeight,
|
|
315
|
-
};
|
|
316
|
-
}
|
|
317
|
-
/**
|
|
318
|
-
* Extracts visible nodes from React Flow viewport
|
|
319
|
-
*/
|
|
320
|
-
function extractNodes(viewport, visibleBounds, options = {}) {
|
|
321
|
-
const { exportHandles = true, exportNodeTitle = true, nodeBackgroundColor } = options;
|
|
322
|
-
const nodes = [];
|
|
323
|
-
let minX = Infinity;
|
|
324
|
-
let minY = Infinity;
|
|
325
|
-
let maxX = -Infinity;
|
|
326
|
-
let maxY = -Infinity;
|
|
327
|
-
const nodeElements = viewport.querySelectorAll(".react-flow__node");
|
|
328
|
-
nodeElements.forEach((nodeEl) => {
|
|
329
|
-
const position = extractNodePosition(nodeEl);
|
|
330
|
-
const dimensions = extractNodeDimensions(nodeEl);
|
|
331
|
-
// Get the actual node content div (first child)
|
|
332
|
-
const nodeContent = nodeEl.firstElementChild;
|
|
333
|
-
if (!nodeContent)
|
|
334
|
-
return;
|
|
335
|
-
const styles = extractNodeStyles(nodeContent, nodeBackgroundColor);
|
|
336
|
-
const handles = exportHandles ? extractNodeHandles(nodeEl, position.x, position.y, dimensions.width) : [];
|
|
337
|
-
const title = exportNodeTitle ? extractNodeTitle(nodeEl, position.x, position.y) : undefined;
|
|
338
|
-
// Only include node if it's within visible viewport (or if ignoring viewport)
|
|
339
|
-
if (!visibleBounds || isRectVisible(position.x, position.y, dimensions.width, dimensions.height, visibleBounds)) {
|
|
340
|
-
nodes.push({
|
|
341
|
-
x: position.x,
|
|
342
|
-
y: position.y,
|
|
343
|
-
width: dimensions.width,
|
|
344
|
-
height: dimensions.height,
|
|
345
|
-
...styles,
|
|
346
|
-
handles,
|
|
347
|
-
title,
|
|
348
|
-
});
|
|
349
|
-
// Update bounding box
|
|
350
|
-
minX = Math.min(minX, position.x);
|
|
351
|
-
minY = Math.min(minY, position.y);
|
|
352
|
-
maxX = Math.max(maxX, position.x + dimensions.width);
|
|
353
|
-
maxY = Math.max(maxY, position.y + dimensions.height);
|
|
354
|
-
// Update bounding box to include handles
|
|
355
|
-
handles.forEach((handle) => {
|
|
356
|
-
minX = Math.min(minX, handle.x);
|
|
357
|
-
minY = Math.min(minY, handle.y);
|
|
358
|
-
maxX = Math.max(maxX, handle.x + handle.width);
|
|
359
|
-
maxY = Math.max(maxY, handle.y + handle.height);
|
|
360
|
-
});
|
|
361
|
-
}
|
|
362
|
-
});
|
|
363
|
-
return { nodes, bounds: { minX, minY, maxX, maxY } };
|
|
364
|
-
}
|
|
365
|
-
// ============================================================================
|
|
366
|
-
// SVG Rendering
|
|
367
|
-
// ============================================================================
|
|
368
|
-
/**
|
|
369
|
-
* Creates SVG element with dot pattern background (matching React Flow)
|
|
370
|
-
*/
|
|
371
|
-
function createSVGElement(width, height, options = {}) {
|
|
372
|
-
const { exportBackgroundPattern = true, backgroundPatternColor = "#f1f1f1", backgroundColor = "#ffffff" } = options;
|
|
373
|
-
const svg = document.createElementNS("http://www.w3.org/2000/svg", "svg");
|
|
374
|
-
svg.setAttribute("width", String(width));
|
|
375
|
-
svg.setAttribute("height", String(height));
|
|
376
|
-
svg.setAttribute("xmlns", "http://www.w3.org/2000/svg");
|
|
377
|
-
// Create background rectangle with configurable background color
|
|
378
|
-
const bgRect = document.createElementNS("http://www.w3.org/2000/svg", "rect");
|
|
379
|
-
bgRect.setAttribute("width", String(width));
|
|
380
|
-
bgRect.setAttribute("height", String(height));
|
|
381
|
-
bgRect.setAttribute("fill", backgroundColor);
|
|
382
|
-
svg.appendChild(bgRect);
|
|
383
|
-
// Create dot pattern if enabled
|
|
384
|
-
if (exportBackgroundPattern) {
|
|
385
|
-
// Create defs section for patterns
|
|
386
|
-
const defs = document.createElementNS("http://www.w3.org/2000/svg", "defs");
|
|
387
|
-
// Create dot pattern (matching React Flow's BackgroundVariant.Dots)
|
|
388
|
-
// React Flow uses gap={12} and size={1} by default
|
|
389
|
-
const pattern = document.createElementNS("http://www.w3.org/2000/svg", "pattern");
|
|
390
|
-
pattern.setAttribute("id", "dot-pattern");
|
|
391
|
-
pattern.setAttribute("x", "0");
|
|
392
|
-
pattern.setAttribute("y", "0");
|
|
393
|
-
pattern.setAttribute("width", "24"); // gap between dots (matching React Flow default)
|
|
394
|
-
pattern.setAttribute("height", "24");
|
|
395
|
-
pattern.setAttribute("patternUnits", "userSpaceOnUse");
|
|
396
|
-
// Create a circle for the dot (centered in the pattern cell)
|
|
397
|
-
const circle = document.createElementNS("http://www.w3.org/2000/svg", "circle");
|
|
398
|
-
circle.setAttribute("cx", "12"); // Center of 24x24 pattern cell
|
|
399
|
-
circle.setAttribute("cy", "12");
|
|
400
|
-
circle.setAttribute("r", "1"); // dot radius = 1 (matching React Flow size={1})
|
|
401
|
-
circle.setAttribute("fill", backgroundPatternColor);
|
|
402
|
-
pattern.appendChild(circle);
|
|
403
|
-
defs.appendChild(pattern);
|
|
404
|
-
svg.appendChild(defs);
|
|
405
|
-
// Create pattern overlay rectangle
|
|
406
|
-
const patternRect = document.createElementNS("http://www.w3.org/2000/svg", "rect");
|
|
407
|
-
patternRect.setAttribute("width", String(width));
|
|
408
|
-
patternRect.setAttribute("height", String(height));
|
|
409
|
-
patternRect.setAttribute("fill", "url(#dot-pattern)");
|
|
410
|
-
svg.appendChild(patternRect);
|
|
411
|
-
}
|
|
412
|
-
// Create group with transform
|
|
413
|
-
const group = document.createElementNS("http://www.w3.org/2000/svg", "g");
|
|
414
|
-
svg.appendChild(group);
|
|
415
|
-
return { svg, group };
|
|
416
|
-
}
|
|
417
|
-
/**
|
|
418
|
-
* Renders a node rectangle to SVG group
|
|
419
|
-
*/
|
|
420
|
-
function renderNodeRect(group, node) {
|
|
421
|
-
const rectEl = document.createElementNS("http://www.w3.org/2000/svg", "rect");
|
|
422
|
-
rectEl.setAttribute("x", String(node.x));
|
|
423
|
-
rectEl.setAttribute("y", String(node.y));
|
|
424
|
-
rectEl.setAttribute("width", String(node.width));
|
|
425
|
-
rectEl.setAttribute("height", String(node.height));
|
|
426
|
-
rectEl.setAttribute("rx", String(node.rx));
|
|
427
|
-
rectEl.setAttribute("ry", String(node.ry));
|
|
428
|
-
rectEl.setAttribute("fill", node.fill);
|
|
429
|
-
rectEl.setAttribute("stroke", node.stroke);
|
|
430
|
-
rectEl.setAttribute("stroke-width", String(node.strokeWidth));
|
|
431
|
-
group.appendChild(rectEl);
|
|
432
|
-
}
|
|
433
|
-
/**
|
|
434
|
-
* Renders a handle to SVG group
|
|
435
|
-
*/
|
|
436
|
-
function renderHandle(group, handle) {
|
|
437
|
-
const handleEl = document.createElementNS("http://www.w3.org/2000/svg", "rect");
|
|
438
|
-
// Handles are centered on edges
|
|
439
|
-
handleEl.setAttribute("x", String(handle.x - handle.width / 2));
|
|
440
|
-
handleEl.setAttribute("y", String(handle.y - handle.height / 2));
|
|
441
|
-
handleEl.setAttribute("width", String(handle.width));
|
|
442
|
-
handleEl.setAttribute("height", String(handle.height));
|
|
443
|
-
handleEl.setAttribute("rx", String(handle.width / 2)); // Make handles circular/rounded
|
|
444
|
-
handleEl.setAttribute("ry", String(handle.height / 2));
|
|
445
|
-
handleEl.setAttribute("fill", handle.fill);
|
|
446
|
-
handleEl.setAttribute("stroke", handle.stroke);
|
|
447
|
-
handleEl.setAttribute("stroke-width", String(handle.strokeWidth));
|
|
448
|
-
group.appendChild(handleEl);
|
|
449
|
-
}
|
|
450
|
-
/**
|
|
451
|
-
* Renders node title text to SVG group
|
|
452
|
-
*/
|
|
453
|
-
function renderNodeTitle(group, title) {
|
|
454
|
-
const textEl = document.createElementNS("http://www.w3.org/2000/svg", "text");
|
|
455
|
-
textEl.setAttribute("x", String(title.x));
|
|
456
|
-
textEl.setAttribute("y", String(title.y));
|
|
457
|
-
textEl.setAttribute("font-size", String(title.fontSize));
|
|
458
|
-
textEl.setAttribute("fill", title.fill);
|
|
459
|
-
textEl.setAttribute("font-weight", title.fontWeight);
|
|
460
|
-
textEl.setAttribute("font-family", "system-ui, -apple-system, sans-serif");
|
|
461
|
-
textEl.textContent = title.text;
|
|
462
|
-
group.appendChild(textEl);
|
|
463
|
-
}
|
|
464
|
-
/**
|
|
465
|
-
* Renders an edge path to SVG group
|
|
466
|
-
*/
|
|
467
|
-
function renderEdgePath(group, edge) {
|
|
468
|
-
const pathEl = document.createElementNS("http://www.w3.org/2000/svg", "path");
|
|
469
|
-
pathEl.setAttribute("d", edge.d);
|
|
470
|
-
pathEl.setAttribute("fill", "none");
|
|
471
|
-
pathEl.setAttribute("stroke", edge.stroke);
|
|
472
|
-
pathEl.setAttribute("stroke-width", String(edge.strokeWidth));
|
|
473
|
-
group.appendChild(pathEl);
|
|
474
|
-
}
|
|
475
|
-
/**
|
|
476
|
-
* Renders all nodes, handles, titles, and edges to SVG group
|
|
477
|
-
*/
|
|
478
|
-
function renderContentToSVG(group, nodes, edges, transformX, transformY, options = {}) {
|
|
479
|
-
const { exportHandles = true, exportNodeTitle = true } = options;
|
|
480
|
-
group.setAttribute("transform", `translate(${transformX}, ${transformY})`);
|
|
481
|
-
// Render nodes
|
|
482
|
-
nodes.forEach((node) => {
|
|
483
|
-
renderNodeRect(group, node);
|
|
484
|
-
if (exportHandles) {
|
|
485
|
-
node.handles.forEach((handle) => renderHandle(group, handle));
|
|
486
|
-
}
|
|
487
|
-
if (exportNodeTitle && node.title) {
|
|
488
|
-
renderNodeTitle(group, node.title);
|
|
489
|
-
}
|
|
490
|
-
});
|
|
491
|
-
// Render edges
|
|
492
|
-
edges.forEach((edge) => renderEdgePath(group, edge));
|
|
493
|
-
}
|
|
494
|
-
// ============================================================================
|
|
495
|
-
// Main Capture Function
|
|
496
|
-
// ============================================================================
|
|
497
|
-
/**
|
|
498
|
-
* Captures a React Flow container element as an SVG image and returns data URL
|
|
499
|
-
* @param containerElement - The React Flow container DOM element
|
|
500
|
-
* @param options - Options for thumbnail capture
|
|
501
|
-
* @returns Promise resolving to SVG data URL string, or null if capture fails
|
|
502
|
-
*/
|
|
503
|
-
export async function captureCanvasThumbnail(containerElement, options = {}) {
|
|
504
|
-
const { ignoreViewport = true, padding = 40, exportHandles = true, exportNodeTitle = true, exportBackgroundPattern = true, nodeBackgroundColor, backgroundPatternColor, backgroundColor, } = options;
|
|
505
|
-
if (!containerElement) {
|
|
506
|
-
console.warn("[flowThumbnail] Container element is null");
|
|
507
|
-
return null;
|
|
508
|
-
}
|
|
509
|
-
try {
|
|
510
|
-
// Find the React Flow viewport element
|
|
511
|
-
const reactFlowViewport = containerElement.querySelector(".react-flow__viewport");
|
|
512
|
-
if (!reactFlowViewport) {
|
|
513
|
-
console.warn("[flowThumbnail] React Flow viewport not found");
|
|
514
|
-
return null;
|
|
515
|
-
}
|
|
516
|
-
// Parse viewport transform
|
|
517
|
-
const viewportStyle = window.getComputedStyle(reactFlowViewport);
|
|
518
|
-
const viewportTransform = viewportStyle.transform || viewportStyle.getPropertyValue("transform");
|
|
519
|
-
const transform = parseViewportTransform(viewportTransform);
|
|
520
|
-
// Calculate visible bounds (null if ignoring viewport)
|
|
521
|
-
const viewportRect = reactFlowViewport.getBoundingClientRect();
|
|
522
|
-
const visibleBounds = ignoreViewport ? null : calculateVisibleBounds(viewportRect, transform);
|
|
523
|
-
// Extract edges and nodes (pass null bounds if ignoring viewport to get all)
|
|
524
|
-
const { edges, bounds: edgeBounds } = extractEdgePaths(reactFlowViewport, visibleBounds);
|
|
525
|
-
const { nodes, bounds: nodeBounds } = extractNodes(reactFlowViewport, visibleBounds, {
|
|
526
|
-
exportHandles,
|
|
527
|
-
exportNodeTitle,
|
|
528
|
-
nodeBackgroundColor,
|
|
529
|
-
});
|
|
530
|
-
// Calculate overall bounding box
|
|
531
|
-
// Handle case where one or both bounds might be Infinity (no content)
|
|
532
|
-
let minX = Infinity;
|
|
533
|
-
let minY = Infinity;
|
|
534
|
-
let maxX = -Infinity;
|
|
535
|
-
let maxY = -Infinity;
|
|
536
|
-
if (edgeBounds.minX !== Infinity) {
|
|
537
|
-
minX = Math.min(minX, edgeBounds.minX);
|
|
538
|
-
minY = Math.min(minY, edgeBounds.minY);
|
|
539
|
-
maxX = Math.max(maxX, edgeBounds.maxX);
|
|
540
|
-
maxY = Math.max(maxY, edgeBounds.maxY);
|
|
541
|
-
}
|
|
542
|
-
if (nodeBounds.minX !== Infinity) {
|
|
543
|
-
minX = Math.min(minX, nodeBounds.minX);
|
|
544
|
-
minY = Math.min(minY, nodeBounds.minY);
|
|
545
|
-
maxX = Math.max(maxX, nodeBounds.maxX);
|
|
546
|
-
maxY = Math.max(maxY, nodeBounds.maxY);
|
|
547
|
-
}
|
|
548
|
-
// If no content found, return null
|
|
549
|
-
if (minX === Infinity || (nodes.length === 0 && edges.length === 0)) {
|
|
550
|
-
if (ignoreViewport) {
|
|
551
|
-
console.warn("[flowThumbnail] No content found in graph");
|
|
552
|
-
return null;
|
|
553
|
-
}
|
|
554
|
-
// Fallback to visible viewport bounds if not ignoring viewport
|
|
555
|
-
minX = visibleBounds.minX;
|
|
556
|
-
minY = visibleBounds.minY;
|
|
557
|
-
maxX = visibleBounds.maxX;
|
|
558
|
-
maxY = visibleBounds.maxY;
|
|
559
|
-
}
|
|
560
|
-
// Calculate content bounds with padding if ignoring viewport
|
|
561
|
-
let contentMinX;
|
|
562
|
-
let contentMinY;
|
|
563
|
-
let contentMaxX;
|
|
564
|
-
let contentMaxY;
|
|
565
|
-
if (ignoreViewport) {
|
|
566
|
-
// Add padding when exporting whole graph
|
|
567
|
-
contentMinX = minX - padding;
|
|
568
|
-
contentMinY = minY - padding;
|
|
569
|
-
contentMaxX = maxX + padding;
|
|
570
|
-
contentMaxY = maxY + padding;
|
|
571
|
-
}
|
|
572
|
-
else {
|
|
573
|
-
// Use the visible viewport bounds exactly (what the user sees)
|
|
574
|
-
contentMinX = visibleBounds.minX;
|
|
575
|
-
contentMinY = visibleBounds.minY;
|
|
576
|
-
contentMaxX = visibleBounds.maxX;
|
|
577
|
-
contentMaxY = visibleBounds.maxY;
|
|
578
|
-
}
|
|
579
|
-
const contentWidth = contentMaxX - contentMinX;
|
|
580
|
-
const contentHeight = contentMaxY - contentMinY;
|
|
581
|
-
// Create SVG with options
|
|
582
|
-
const { svg, group } = createSVGElement(contentWidth, contentHeight, {
|
|
583
|
-
exportBackgroundPattern,
|
|
584
|
-
backgroundPatternColor,
|
|
585
|
-
backgroundColor,
|
|
586
|
-
});
|
|
587
|
-
// Render content with options
|
|
588
|
-
renderContentToSVG(group, nodes, edges, -contentMinX, -contentMinY, {
|
|
589
|
-
exportHandles,
|
|
590
|
-
exportNodeTitle,
|
|
591
|
-
});
|
|
592
|
-
// Serialize SVG to string
|
|
593
|
-
const serializer = new XMLSerializer();
|
|
594
|
-
const svgString = serializer.serializeToString(svg);
|
|
595
|
-
// Return SVG data URL
|
|
596
|
-
const svgDataUrl = `data:image/svg+xml;base64,${btoa(unescape(encodeURIComponent(svgString)))}`;
|
|
597
|
-
return svgDataUrl;
|
|
598
|
-
}
|
|
599
|
-
catch (error) {
|
|
600
|
-
console.error("[flowThumbnail] Failed to capture thumbnail:", error);
|
|
601
|
-
return null;
|
|
602
|
-
}
|
|
603
|
-
}
|
|
604
|
-
/**
|
|
605
|
-
* Captures a React Flow container element as an SVG image and downloads it
|
|
606
|
-
* @param containerElement - The React Flow container DOM element
|
|
607
|
-
* @param options - Options for thumbnail capture
|
|
608
|
-
* @returns Promise resolving to true if successful, false otherwise
|
|
609
|
-
*/
|
|
610
|
-
export async function downloadCanvasThumbnail(containerElement, options = {}) {
|
|
611
|
-
const svgDataUrl = await captureCanvasThumbnail(containerElement, options);
|
|
612
|
-
if (!svgDataUrl) {
|
|
613
|
-
return false;
|
|
614
|
-
}
|
|
615
|
-
// Create blob and download
|
|
616
|
-
const base64Data = svgDataUrl.split(",")[1];
|
|
617
|
-
const svgString = atob(base64Data);
|
|
618
|
-
const blob = new Blob([svgString], { type: "image/svg+xml" });
|
|
619
|
-
const url = URL.createObjectURL(blob);
|
|
620
|
-
const link = document.createElement("a");
|
|
621
|
-
link.href = url;
|
|
622
|
-
link.download = `flow-thumbnail-${Date.now()}.svg`;
|
|
623
|
-
document.body.appendChild(link);
|
|
624
|
-
link.click();
|
|
625
|
-
document.body.removeChild(link);
|
|
626
|
-
URL.revokeObjectURL(url);
|
|
627
|
-
return true;
|
|
628
|
-
}
|
|
629
|
-
//# sourceMappingURL=thumbnail-utils.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"thumbnail-utils.js","sourceRoot":"","sources":["../../../src/misc/thumbnail-utils.ts"],"names":[],"mappings":"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"}
|