@bian-womp/spark-workbench 0.3.87 → 0.3.89

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 (175) hide show
  1. package/lib/cjs/index.cjs +72 -103
  2. package/lib/cjs/index.cjs.map +1 -1
  3. package/lib/cjs/src/misc/context/WorkbenchContext.provider.d.ts.map +1 -1
  4. package/lib/esm/index.js +72 -103
  5. package/lib/esm/index.js.map +1 -1
  6. package/lib/esm/src/misc/context/WorkbenchContext.provider.d.ts.map +1 -1
  7. package/lib/src/adapters/cli/index.d.ts +22 -0
  8. package/lib/src/adapters/cli/index.d.ts.map +1 -0
  9. package/lib/src/adapters/cli/index.js +50 -0
  10. package/lib/src/adapters/cli/index.js.map +1 -0
  11. package/lib/src/core/AbstractWorkbench.d.ts +40 -0
  12. package/lib/src/core/AbstractWorkbench.d.ts.map +1 -0
  13. package/lib/src/core/AbstractWorkbench.js +15 -0
  14. package/lib/src/core/AbstractWorkbench.js.map +1 -0
  15. package/lib/src/core/InMemoryWorkbench.d.ts +304 -0
  16. package/lib/src/core/InMemoryWorkbench.d.ts.map +1 -0
  17. package/lib/src/core/InMemoryWorkbench.js +1016 -0
  18. package/lib/src/core/InMemoryWorkbench.js.map +1 -0
  19. package/lib/src/core/contracts.d.ts +172 -0
  20. package/lib/src/core/contracts.d.ts.map +1 -0
  21. package/lib/src/core/contracts.js +2 -0
  22. package/lib/src/core/contracts.js.map +1 -0
  23. package/lib/src/core/ui-extensions.d.ts +85 -0
  24. package/lib/src/core/ui-extensions.d.ts.map +1 -0
  25. package/lib/src/core/ui-extensions.js +111 -0
  26. package/lib/src/core/ui-extensions.js.map +1 -0
  27. package/lib/src/examples/cli.d.ts +2 -0
  28. package/lib/src/examples/cli.d.ts.map +1 -0
  29. package/lib/src/examples/cli.js +244 -0
  30. package/lib/src/examples/cli.js.map +1 -0
  31. package/lib/src/examples/reactflow/App.d.ts +2 -0
  32. package/lib/src/examples/reactflow/App.d.ts.map +1 -0
  33. package/lib/src/examples/reactflow/App.js +20 -0
  34. package/lib/src/examples/reactflow/App.js.map +1 -0
  35. package/lib/src/index.d.ts +30 -0
  36. package/lib/src/index.d.ts.map +1 -0
  37. package/lib/src/index.js +30 -0
  38. package/lib/src/index.js.map +1 -0
  39. package/lib/src/misc/DebugEvents.d.ts +7 -0
  40. package/lib/src/misc/DebugEvents.d.ts.map +1 -0
  41. package/lib/src/misc/DebugEvents.js +51 -0
  42. package/lib/src/misc/DebugEvents.js.map +1 -0
  43. package/lib/src/misc/DefaultEdge.d.ts +5 -0
  44. package/lib/src/misc/DefaultEdge.d.ts.map +1 -0
  45. package/lib/src/misc/DefaultEdge.js +15 -0
  46. package/lib/src/misc/DefaultEdge.js.map +1 -0
  47. package/lib/src/misc/DefaultNode.d.ts +5 -0
  48. package/lib/src/misc/DefaultNode.d.ts.map +1 -0
  49. package/lib/src/misc/DefaultNode.js +25 -0
  50. package/lib/src/misc/DefaultNode.js.map +1 -0
  51. package/lib/src/misc/DefaultNodeContent.d.ts +4 -0
  52. package/lib/src/misc/DefaultNodeContent.d.ts.map +1 -0
  53. package/lib/src/misc/DefaultNodeContent.js +58 -0
  54. package/lib/src/misc/DefaultNodeContent.js.map +1 -0
  55. package/lib/src/misc/DefaultNodeHeader.d.ts +13 -0
  56. package/lib/src/misc/DefaultNodeHeader.d.ts.map +1 -0
  57. package/lib/src/misc/DefaultNodeHeader.js +78 -0
  58. package/lib/src/misc/DefaultNodeHeader.js.map +1 -0
  59. package/lib/src/misc/Inspector.d.ts +12 -0
  60. package/lib/src/misc/Inspector.d.ts.map +1 -0
  61. package/lib/src/misc/Inspector.js +253 -0
  62. package/lib/src/misc/Inspector.js.map +1 -0
  63. package/lib/src/misc/IssueBadge.d.ts +7 -0
  64. package/lib/src/misc/IssueBadge.d.ts.map +1 -0
  65. package/lib/src/misc/IssueBadge.js +7 -0
  66. package/lib/src/misc/IssueBadge.js.map +1 -0
  67. package/lib/src/misc/KeyboardShortcutToast.d.ts +16 -0
  68. package/lib/src/misc/KeyboardShortcutToast.d.ts.map +1 -0
  69. package/lib/src/misc/KeyboardShortcutToast.js +40 -0
  70. package/lib/src/misc/KeyboardShortcutToast.js.map +1 -0
  71. package/lib/src/misc/NodeHandles.d.ts +18 -0
  72. package/lib/src/misc/NodeHandles.d.ts.map +1 -0
  73. package/lib/src/misc/NodeHandles.js +67 -0
  74. package/lib/src/misc/NodeHandles.js.map +1 -0
  75. package/lib/src/misc/SelectionActiveSync.d.ts +10 -0
  76. package/lib/src/misc/SelectionActiveSync.d.ts.map +1 -0
  77. package/lib/src/misc/SelectionActiveSync.js +21 -0
  78. package/lib/src/misc/SelectionActiveSync.js.map +1 -0
  79. package/lib/src/misc/WorkbenchCanvas.d.ts +23 -0
  80. package/lib/src/misc/WorkbenchCanvas.d.ts.map +1 -0
  81. package/lib/src/misc/WorkbenchCanvas.js +669 -0
  82. package/lib/src/misc/WorkbenchCanvas.js.map +1 -0
  83. package/lib/src/misc/WorkbenchStudio.d.ts +43 -0
  84. package/lib/src/misc/WorkbenchStudio.d.ts.map +1 -0
  85. package/lib/src/misc/WorkbenchStudio.js +463 -0
  86. package/lib/src/misc/WorkbenchStudio.js.map +1 -0
  87. package/lib/src/misc/constants.d.ts +4 -0
  88. package/lib/src/misc/constants.d.ts.map +1 -0
  89. package/lib/src/misc/constants.js +5 -0
  90. package/lib/src/misc/constants.js.map +1 -0
  91. package/lib/src/misc/context/WorkbenchContext.d.ts +133 -0
  92. package/lib/src/misc/context/WorkbenchContext.d.ts.map +1 -0
  93. package/lib/src/misc/context/WorkbenchContext.js +9 -0
  94. package/lib/src/misc/context/WorkbenchContext.js.map +1 -0
  95. package/lib/src/misc/context/WorkbenchContext.provider.d.ts +12 -0
  96. package/lib/src/misc/context/WorkbenchContext.provider.d.ts.map +1 -0
  97. package/lib/src/misc/context/WorkbenchContext.provider.js +995 -0
  98. package/lib/src/misc/context/WorkbenchContext.provider.js.map +1 -0
  99. package/lib/src/misc/context-menu/ContextMenuButton.d.ts +8 -0
  100. package/lib/src/misc/context-menu/ContextMenuButton.d.ts.map +1 -0
  101. package/lib/src/misc/context-menu/ContextMenuButton.js +10 -0
  102. package/lib/src/misc/context-menu/ContextMenuButton.js.map +1 -0
  103. package/lib/src/misc/context-menu/ContextMenuHandlers.d.ts +85 -0
  104. package/lib/src/misc/context-menu/ContextMenuHandlers.d.ts.map +1 -0
  105. package/lib/src/misc/context-menu/ContextMenuHandlers.js +2 -0
  106. package/lib/src/misc/context-menu/ContextMenuHandlers.js.map +1 -0
  107. package/lib/src/misc/context-menu/ContextMenuHelpers.d.ts +45 -0
  108. package/lib/src/misc/context-menu/ContextMenuHelpers.d.ts.map +1 -0
  109. package/lib/src/misc/context-menu/ContextMenuHelpers.js +182 -0
  110. package/lib/src/misc/context-menu/ContextMenuHelpers.js.map +1 -0
  111. package/lib/src/misc/context-menu/DefaultContextMenu.d.ts +3 -0
  112. package/lib/src/misc/context-menu/DefaultContextMenu.d.ts.map +1 -0
  113. package/lib/src/misc/context-menu/DefaultContextMenu.js +111 -0
  114. package/lib/src/misc/context-menu/DefaultContextMenu.js.map +1 -0
  115. package/lib/src/misc/context-menu/NodeContextMenu.d.ts +3 -0
  116. package/lib/src/misc/context-menu/NodeContextMenu.d.ts.map +1 -0
  117. package/lib/src/misc/context-menu/NodeContextMenu.js +51 -0
  118. package/lib/src/misc/context-menu/NodeContextMenu.js.map +1 -0
  119. package/lib/src/misc/context-menu/SelectionContextMenu.d.ts +3 -0
  120. package/lib/src/misc/context-menu/SelectionContextMenu.d.ts.map +1 -0
  121. package/lib/src/misc/context-menu/SelectionContextMenu.js +47 -0
  122. package/lib/src/misc/context-menu/SelectionContextMenu.js.map +1 -0
  123. package/lib/src/misc/hooks.d.ts +18 -0
  124. package/lib/src/misc/hooks.d.ts.map +1 -0
  125. package/lib/src/misc/hooks.js +275 -0
  126. package/lib/src/misc/hooks.js.map +1 -0
  127. package/lib/src/misc/layout.d.ts +117 -0
  128. package/lib/src/misc/layout.d.ts.map +1 -0
  129. package/lib/src/misc/layout.js +205 -0
  130. package/lib/src/misc/layout.js.map +1 -0
  131. package/lib/src/misc/load.d.ts +5 -0
  132. package/lib/src/misc/load.d.ts.map +1 -0
  133. package/lib/src/misc/load.js +106 -0
  134. package/lib/src/misc/load.js.map +1 -0
  135. package/lib/src/misc/mapping.d.ts +128 -0
  136. package/lib/src/misc/mapping.d.ts.map +1 -0
  137. package/lib/src/misc/mapping.js +270 -0
  138. package/lib/src/misc/mapping.js.map +1 -0
  139. package/lib/src/misc/merge-utils.d.ts +12 -0
  140. package/lib/src/misc/merge-utils.d.ts.map +1 -0
  141. package/lib/src/misc/merge-utils.js +51 -0
  142. package/lib/src/misc/merge-utils.js.map +1 -0
  143. package/lib/src/misc/thumbnail-utils.d.ts +53 -0
  144. package/lib/src/misc/thumbnail-utils.d.ts.map +1 -0
  145. package/lib/src/misc/thumbnail-utils.js +629 -0
  146. package/lib/src/misc/thumbnail-utils.js.map +1 -0
  147. package/lib/src/misc/types.d.ts +18 -0
  148. package/lib/src/misc/types.d.ts.map +1 -0
  149. package/lib/src/misc/types.js +2 -0
  150. package/lib/src/misc/types.js.map +1 -0
  151. package/lib/src/misc/value.d.ts +16 -0
  152. package/lib/src/misc/value.d.ts.map +1 -0
  153. package/lib/src/misc/value.js +114 -0
  154. package/lib/src/misc/value.js.map +1 -0
  155. package/lib/src/misc/viewport-utils.d.ts +6 -0
  156. package/lib/src/misc/viewport-utils.d.ts.map +1 -0
  157. package/lib/src/misc/viewport-utils.js +18 -0
  158. package/lib/src/misc/viewport-utils.js.map +1 -0
  159. package/lib/src/runtime/AbstractGraphRunner.d.ts +61 -0
  160. package/lib/src/runtime/AbstractGraphRunner.d.ts.map +1 -0
  161. package/lib/src/runtime/AbstractGraphRunner.js +63 -0
  162. package/lib/src/runtime/AbstractGraphRunner.js.map +1 -0
  163. package/lib/src/runtime/IGraphRunner.d.ts +100 -0
  164. package/lib/src/runtime/IGraphRunner.d.ts.map +1 -0
  165. package/lib/src/runtime/IGraphRunner.js +2 -0
  166. package/lib/src/runtime/IGraphRunner.js.map +1 -0
  167. package/lib/src/runtime/LocalGraphRunner.d.ts +60 -0
  168. package/lib/src/runtime/LocalGraphRunner.d.ts.map +1 -0
  169. package/lib/src/runtime/LocalGraphRunner.js +294 -0
  170. package/lib/src/runtime/LocalGraphRunner.js.map +1 -0
  171. package/lib/src/runtime/RemoteGraphRunner.d.ts +109 -0
  172. package/lib/src/runtime/RemoteGraphRunner.d.ts.map +1 -0
  173. package/lib/src/runtime/RemoteGraphRunner.js +696 -0
  174. package/lib/src/runtime/RemoteGraphRunner.js.map +1 -0
  175. package/package.json +4 -4
@@ -0,0 +1,270 @@
1
+ import { getInputTypeId, isInputPrivate, getInputHandleMetadata, } from "@bian-womp/spark-graph";
2
+ import cx from "classnames";
3
+ import { formatDeclaredTypeSignature } from "./value";
4
+ import { layoutNode, createHandleBounds, createHandleLayout, estimateNodeSize, } from "./layout";
5
+ export function toReactFlow(def, positions, sizes, registry, opts) {
6
+ const EDGE_STYLE_MISSING = { stroke: "#f59e0b", strokeWidth: 2 }; // amber-500
7
+ const EDGE_STYLE_ERROR = { stroke: "#ef4444", strokeWidth: 2 };
8
+ const EDGE_STYLE_RUNNING = { stroke: "#3b82f6" };
9
+ // Build a map of valid handles per node up-front and cache handle data
10
+ const validHandleMap = {};
11
+ for (const n of def.nodes) {
12
+ const { inputs, outputs } = opts.handles[n.nodeId] || {
13
+ inputs: {},
14
+ outputs: {},
15
+ };
16
+ const inputOrder = Object.keys(inputs).filter((k) => !isInputPrivate(inputs, k));
17
+ const outputOrder = Object.keys(outputs);
18
+ validHandleMap[n.nodeId] = {
19
+ inputs: new Set(inputOrder),
20
+ outputs: new Set(outputOrder),
21
+ };
22
+ }
23
+ // Track which inputs are connected (for UI) and which handles are missing (for layout)
24
+ const connectedInputs = {};
25
+ const missingInputsByNode = {};
26
+ const missingOutputsByNode = {};
27
+ for (const e of def.edges) {
28
+ const tgtId = e.target.nodeId;
29
+ const tgtHandle = e.target.handle;
30
+ if (!connectedInputs[tgtId])
31
+ connectedInputs[tgtId] = new Set();
32
+ connectedInputs[tgtId].add(tgtHandle);
33
+ const tgtValid = !!validHandleMap[tgtId]?.inputs.has(tgtHandle);
34
+ if (!tgtValid) {
35
+ (missingInputsByNode[tgtId] || (missingInputsByNode[tgtId] = new Set())).add(tgtHandle);
36
+ }
37
+ const srcId = e.source.nodeId;
38
+ const srcHandle = e.source.handle;
39
+ const srcValid = !!validHandleMap[srcId]?.outputs.has(srcHandle);
40
+ if (!srcValid) {
41
+ (missingOutputsByNode[srcId] || (missingOutputsByNode[srcId] = new Set())).add(srcHandle);
42
+ }
43
+ }
44
+ // Get layout function overrides from UI registry
45
+ const layoutNodeOverride = opts.ui?.getLayoutNode() ?? layoutNode;
46
+ const createHandleBoundsFn = opts.ui?.getCreateHandleBounds() ?? createHandleBounds;
47
+ const createHandleLayoutFn = opts.ui?.getCreateHandleLayout() ?? createHandleLayout;
48
+ const estimateNodeSizeFn = opts.ui?.getEstimateNodeSize() ?? estimateNodeSize;
49
+ const computeLayout = (node, overrides, missingInputs, missingOutputs) => {
50
+ return layoutNodeOverride
51
+ ? layoutNodeOverride({
52
+ node,
53
+ registry,
54
+ showValues: opts.showValues,
55
+ overrides,
56
+ missingInputs,
57
+ missingOutputs,
58
+ })
59
+ : layoutNode({
60
+ node,
61
+ registry,
62
+ showValues: opts.showValues,
63
+ overrides,
64
+ missingInputs,
65
+ missingOutputs,
66
+ }, {
67
+ estimateNodeSize: estimateNodeSizeFn,
68
+ createHandleBounds: createHandleBoundsFn,
69
+ createHandleLayout: createHandleLayoutFn,
70
+ });
71
+ };
72
+ const nodes = def.nodes.map((n) => {
73
+ const effectiveHandles = opts.handles[n.nodeId] || {
74
+ inputs: {},
75
+ outputs: {},
76
+ };
77
+ const { inputs: inputSource, outputs: outputSource } = effectiveHandles;
78
+ const overrideSize = opts.getDefaultNodeSize?.(n.typeId);
79
+ const customSize = sizes?.[n.nodeId];
80
+ const sizeOverrides = customSize
81
+ ? { ...overrideSize, width: customSize.width, height: customSize.height }
82
+ : overrideSize;
83
+ const extraInputs = Array.from(missingInputsByNode[n.nodeId] || []);
84
+ const extraOutputs = Array.from(missingOutputsByNode[n.nodeId] || []);
85
+ const geom = computeLayout(n, sizeOverrides, extraInputs, extraOutputs);
86
+ const renderWidth = customSize?.width ?? geom.width;
87
+ const renderHeight = customSize?.height ?? geom.height;
88
+ const initialGeom = customSize ? computeLayout(n, overrideSize, extraInputs, extraOutputs) : geom;
89
+ const inputHandles = geom.inputOrder.map((id) => ({
90
+ id,
91
+ typeId: getInputTypeId(inputSource, id) ?? "unknown",
92
+ }));
93
+ const outputHandles = geom.outputOrder.map((id) => ({
94
+ id,
95
+ typeId: formatDeclaredTypeSignature(outputSource[id]) ?? "unknown",
96
+ }));
97
+ const handleLayout = geom.handleLayout;
98
+ const handles = geom.handles;
99
+ const handleMetadata = {};
100
+ for (const handleId of Object.keys(inputSource)) {
101
+ handleMetadata[handleId] = getInputHandleMetadata(inputSource, handleId);
102
+ }
103
+ const baseData = {
104
+ typeId: n.typeId,
105
+ params: n.params,
106
+ inputHandles,
107
+ outputHandles,
108
+ handles: opts.handles[n.nodeId],
109
+ inputConnected: Object.fromEntries(inputHandles.map((h) => [h.id, !!connectedInputs[n.nodeId]?.has(h.id)])),
110
+ handleLayout,
111
+ showValues: opts.showValues,
112
+ renderWidth,
113
+ renderHeight,
114
+ initialWidth: initialGeom.width,
115
+ initialHeight: initialGeom.height,
116
+ inputValues: opts.inputs?.[n.nodeId],
117
+ inputDefaults: {
118
+ ...opts.handles?.[n.nodeId]?.inputDefaults,
119
+ ...opts.inputDefaults?.[n.nodeId],
120
+ },
121
+ outputValues: opts.outputs?.[n.nodeId],
122
+ handleMetadata,
123
+ status: opts.nodeStatus?.[n.nodeId],
124
+ validation: {
125
+ inputs: opts.nodeValidation?.inputs?.[n.nodeId] ?? [],
126
+ outputs: opts.nodeValidation?.outputs?.[n.nodeId] ?? [],
127
+ issues: opts.nodeValidation?.issues?.[n.nodeId] ?? [],
128
+ },
129
+ toString: opts.toString,
130
+ toElement: opts.toElement,
131
+ };
132
+ const customNodeData = opts.customData?.nodes;
133
+ const mergedData = customNodeData?.[n.nodeId] ? { ...baseData, custom: customNodeData[n.nodeId] } : baseData;
134
+ return {
135
+ id: n.nodeId,
136
+ data: mergedData,
137
+ position: positions[n.nodeId] ?? { x: 0, y: 0 },
138
+ type: opts.resolveNodeType?.(n.typeId) ?? "spark-default",
139
+ selected: opts.selectedNodeIds ? opts.selectedNodeIds.has(n.nodeId) : undefined,
140
+ measured: {
141
+ width: renderWidth,
142
+ height: renderHeight,
143
+ },
144
+ handles,
145
+ width: renderWidth,
146
+ height: renderHeight,
147
+ };
148
+ });
149
+ const edges = def.edges.map((e) => {
150
+ const st = opts.edgeStatus?.[e.id];
151
+ const isRunning = (st?.activeRuns || 0) > 0;
152
+ const hasError = !!st?.lastError;
153
+ const isInvalidEdge = !!opts.edgeValidation?.[e.id];
154
+ const sourceMissing = !validHandleMap[e.source.nodeId]?.outputs.has(e.source.handle);
155
+ const targetMissing = !validHandleMap[e.target.nodeId]?.inputs.has(e.target.handle);
156
+ const isMissing = sourceMissing || targetMissing;
157
+ const style = isMissing
158
+ ? EDGE_STYLE_MISSING
159
+ : hasError || isInvalidEdge
160
+ ? EDGE_STYLE_ERROR
161
+ : isRunning
162
+ ? EDGE_STYLE_RUNNING
163
+ : undefined;
164
+ const edgeTypeId = e.typeId || undefined;
165
+ // Get handle type information from cached handles
166
+ const sourceHandles = opts.handles[e.source.nodeId];
167
+ const targetHandles = opts.handles[e.target.nodeId];
168
+ const sourceNode = def.nodes.find((n) => n.nodeId === e.source.nodeId);
169
+ const targetNode = def.nodes.find((n) => n.nodeId === e.target.nodeId);
170
+ const sourceHandleTypeId = sourceHandles?.outputs[e.source.handle]
171
+ ? (formatDeclaredTypeSignature(sourceHandles.outputs[e.source.handle]) ?? "unknown")
172
+ : "unknown";
173
+ const targetHandleTypeId = targetHandles?.inputs[e.target.handle]
174
+ ? (getInputTypeId(targetHandles.inputs, e.target.handle) ?? "unknown")
175
+ : "unknown";
176
+ const baseEdgeData = {
177
+ sourceNodeId: e.source.nodeId,
178
+ sourceNodeTypeId: sourceNode?.typeId || "unknown",
179
+ sourceHandle: e.source.handle,
180
+ sourceHandleTypeId,
181
+ targetNodeId: e.target.nodeId,
182
+ targetNodeTypeId: targetNode?.typeId || "unknown",
183
+ targetHandle: e.target.handle,
184
+ targetHandleTypeId,
185
+ edgeTypeId,
186
+ isRunning,
187
+ hasError,
188
+ isInvalid: isInvalidEdge,
189
+ isMissing,
190
+ };
191
+ const customEdgeData = opts.customData?.edges;
192
+ const mergedEdgeData = customEdgeData?.[e.id] ? { ...baseEdgeData, custom: customEdgeData[e.id] } : baseEdgeData;
193
+ return {
194
+ id: e.id,
195
+ source: e.source.nodeId,
196
+ target: e.target.nodeId,
197
+ sourceHandle: e.source.handle,
198
+ targetHandle: e.target.handle,
199
+ selected: opts.selectedEdgeIds ? opts.selectedEdgeIds.has(e.id) : undefined,
200
+ animated: isRunning && !isMissing,
201
+ style,
202
+ label: edgeTypeId,
203
+ type: "default",
204
+ data: mergedEdgeData,
205
+ };
206
+ });
207
+ return { nodes, edges };
208
+ }
209
+ // Shared node container border class composition for consistent visuals
210
+ export function getNodeBorderClassNames(args) {
211
+ const selected = !!args.selected;
212
+ const status = args.status || {};
213
+ const issues = args.validation?.issues ?? [];
214
+ const hasError = !!status.lastError;
215
+ const hasValidationError = issues.some((i) => i.level === "error");
216
+ const hasValidationWarning = !hasValidationError && issues.length > 0;
217
+ const isRunning = (status.activeRuns || 0) > 0;
218
+ const isInvalid = !!status.invalidated && !isRunning && !hasError;
219
+ // Keep border width constant to avoid layout reflow on selection toggles
220
+ const borderWidth = "border";
221
+ const borderStyle = isInvalid ? "border-dashed" : "border-solid";
222
+ const severity = hasError || hasValidationError ? "red" : hasValidationWarning ? "amber" : isRunning ? "blue" : "gray";
223
+ const borderBySeverity = {
224
+ red: "border-red-500",
225
+ amber: "border-amber-500",
226
+ blue: "border-blue-500",
227
+ gray: "border-gray-500 dark:border-gray-400",
228
+ };
229
+ const ringBySeverity = {
230
+ red: "ring-2 ring-red-300 dark:ring-red-900",
231
+ amber: "ring-2 ring-amber-300 dark:ring-amber-900",
232
+ blue: "ring-2 ring-blue-200 dark:ring-blue-900",
233
+ gray: "ring-2 ring-gray-300 dark:ring-gray-500",
234
+ };
235
+ const borderColor = borderBySeverity[severity];
236
+ const ring = isRunning
237
+ ? ringBySeverity.blue
238
+ : selected
239
+ ? ringBySeverity[severity === "blue" ? "gray" : severity]
240
+ : "";
241
+ return [borderWidth, borderStyle, borderColor, ring].join(" ").trim();
242
+ }
243
+ /**
244
+ * Shared utility to generate handle className based on validation and value state.
245
+ * - Linked handles (with inbound edges) get black borders
246
+ * - Handles with values (but not linked) get darker gray borders
247
+ * - Handles with only defaults (no value, not linked) get lighter gray borders
248
+ * - Validation errors (red/amber) take precedence over value-based styling.
249
+ */
250
+ export function getHandleClassName(args) {
251
+ const { kind, id, validation } = args;
252
+ const vIssues = (kind === "input" ? validation.inputs : validation.outputs)?.filter((v) => v.handle === id) || [];
253
+ const hasAny = vIssues.length > 0;
254
+ const hasErr = vIssues.some((v) => v.level === "error");
255
+ // Determine border color based on priority:
256
+ // 1. Validation errors (red/amber) - highest priority
257
+ // 2. Gray border
258
+ let borderColor;
259
+ if (hasAny && hasErr) {
260
+ borderColor = "!border-red-500";
261
+ }
262
+ else if (hasAny) {
263
+ borderColor = "!border-amber-500";
264
+ }
265
+ else {
266
+ borderColor = "!border-gray-500 dark:!border-gray-400";
267
+ }
268
+ return cx("!w-3 !h-3 !bg-white/50 !dark:bg-stone-900 wb-nodrag wb-nowheel", borderColor, kind === "output" && "!rounded-none");
269
+ }
270
+ //# sourceMappingURL=mapping.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mapping.js","sourceRoot":"","sources":["../../../src/misc/mapping.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { WorkbenchUIState } from "./types";
2
+ import type { GraphDefinition } from "@bian-womp/spark-protocol";
3
+ /**
4
+ * Merge UI state from source into target, remapping node IDs using nodeIdMap.
5
+ * Preserves target state and adds/updates source state with remapped IDs.
6
+ * If anchorPos and sourceDef are provided, positions will be offset relative to anchorPos.
7
+ */
8
+ export declare function mergeUIState(targetUI: WorkbenchUIState | null | undefined, sourceUI: WorkbenchUIState | null | undefined, nodeIdMap: Record<string, string>, anchorPos?: {
9
+ x: number;
10
+ y: number;
11
+ }, sourceDef?: GraphDefinition): WorkbenchUIState;
12
+ //# sourceMappingURL=merge-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge-utils.d.ts","sourceRoot":"","sources":["../../../src/misc/merge-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAGjE;;;;GAIG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,gBAAgB,GAAG,IAAI,GAAG,SAAS,EAC7C,QAAQ,EAAE,gBAAgB,GAAG,IAAI,GAAG,SAAS,EAC7C,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACjC,SAAS,CAAC,EAAE;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,EACpC,SAAS,CAAC,EAAE,eAAe,GAC1B,gBAAgB,CA2DlB"}
@@ -0,0 +1,51 @@
1
+ import { offsetImportedPositions } from "@bian-womp/spark-graph";
2
+ /**
3
+ * Merge UI state from source into target, remapping node IDs using nodeIdMap.
4
+ * Preserves target state and adds/updates source state with remapped IDs.
5
+ * If anchorPos and sourceDef are provided, positions will be offset relative to anchorPos.
6
+ */
7
+ export function mergeUIState(targetUI, sourceUI, nodeIdMap, anchorPos, sourceDef) {
8
+ const result = {
9
+ ...targetUI,
10
+ };
11
+ if (!sourceUI)
12
+ return result;
13
+ // Merge positions with optional offset
14
+ if (sourceUI.positions) {
15
+ if (anchorPos && sourceDef) {
16
+ // Apply offset when anchorPos and sourceDef are provided
17
+ result.positions = offsetImportedPositions(targetUI?.positions ?? {}, sourceUI.positions, sourceDef, nodeIdMap, anchorPos);
18
+ }
19
+ else {
20
+ // Simple remapping without offset
21
+ result.positions = {
22
+ ...(targetUI?.positions || {}),
23
+ ...Object.fromEntries(Object.entries(sourceUI.positions).map(([oldId, pos]) => [nodeIdMap[oldId] || oldId, pos])),
24
+ };
25
+ }
26
+ }
27
+ // Merge selection: remap node IDs and edge IDs
28
+ if (sourceUI.selection) {
29
+ const remappedNodes = (sourceUI.selection.nodes || []).map((id) => nodeIdMap[id] || id).filter((id) => id); // Filter out invalid mappings
30
+ const remappedEdges = sourceUI.selection.edges || []; // Edge IDs don't need remapping typically
31
+ result.selection = {
32
+ nodes: [...(targetUI?.selection?.nodes || []), ...remappedNodes],
33
+ edges: [...(targetUI?.selection?.edges || []), ...remappedEdges],
34
+ };
35
+ }
36
+ // Merge nodeNames: remap node IDs
37
+ if (sourceUI.nodeNames) {
38
+ result.nodeNames = {
39
+ ...(targetUI?.nodeNames || {}),
40
+ ...Object.fromEntries(Object.entries(sourceUI.nodeNames).map(([oldId, name]) => [nodeIdMap[oldId] || oldId, name])),
41
+ };
42
+ }
43
+ if (sourceUI.sizes) {
44
+ result.sizes = {
45
+ ...(targetUI?.sizes || {}),
46
+ ...Object.fromEntries(Object.entries(sourceUI.sizes).map(([oldId, size]) => [nodeIdMap[oldId] || oldId, size])),
47
+ };
48
+ }
49
+ return result;
50
+ }
51
+ //# sourceMappingURL=merge-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge-utils.js","sourceRoot":"","sources":["../../../src/misc/merge-utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Flow thumbnail capture utility
3
+ * Captures React Flow canvas as SVG image
4
+ */
5
+ export interface ThumbnailOptions {
6
+ /**
7
+ * If true, export the whole graph instead of just the viewport. Default: true
8
+ */
9
+ ignoreViewport?: boolean;
10
+ /**
11
+ * Padding to add when exporting whole graph (in pixels). Default: 40
12
+ */
13
+ padding?: number;
14
+ /**
15
+ * Whether to export handles. Default: true
16
+ */
17
+ exportHandles?: boolean;
18
+ /**
19
+ * Whether to export node titles. Default: true
20
+ */
21
+ exportNodeTitle?: boolean;
22
+ /**
23
+ * Whether to export background dot pattern. Default: true
24
+ */
25
+ exportBackgroundPattern?: boolean;
26
+ /**
27
+ * Background color of nodes. Default: "#f3f4f6"
28
+ */
29
+ nodeBackgroundColor?: string;
30
+ /**
31
+ * Color of background dot pattern. Default: "#f1f1f1"
32
+ */
33
+ backgroundPatternColor?: string;
34
+ /**
35
+ * Background color of the SVG. Default: "#ffffff"
36
+ */
37
+ backgroundColor?: string;
38
+ }
39
+ /**
40
+ * Captures a React Flow container element as an SVG image and returns data URL
41
+ * @param containerElement - The React Flow container DOM element
42
+ * @param options - Options for thumbnail capture
43
+ * @returns Promise resolving to SVG data URL string, or null if capture fails
44
+ */
45
+ export declare function captureCanvasThumbnail(containerElement: HTMLElement | null, options?: ThumbnailOptions): Promise<string | null>;
46
+ /**
47
+ * Captures a React Flow container element as an SVG image and downloads it
48
+ * @param containerElement - The React Flow container DOM element
49
+ * @param options - Options for thumbnail capture
50
+ * @returns Promise resolving to true if successful, false otherwise
51
+ */
52
+ export declare function downloadCanvasThumbnail(containerElement: HTMLElement | null, options?: ThumbnailOptions): Promise<boolean>;
53
+ //# sourceMappingURL=thumbnail-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"thumbnail-utils.d.ts","sourceRoot":"","sources":["../../../src/misc/thumbnail-utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA2DH,MAAM,WAAW,gBAAgB;IAC/B;;OAEG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;OAEG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;OAEG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;OAEG;IACH,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC;;OAEG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B;;OAEG;IACH,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC;;OAEG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AA0mBD;;;;;GAKG;AACH,wBAAsB,sBAAsB,CAC1C,gBAAgB,EAAE,WAAW,GAAG,IAAI,EACpC,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA4HxB;AAED;;;;;GAKG;AACH,wBAAsB,uBAAuB,CAC3C,gBAAgB,EAAE,WAAW,GAAG,IAAI,EACpC,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,OAAO,CAAC,CAoBlB"}