@d34dman/flowdrop 0.0.60 → 0.0.62

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 (207) hide show
  1. package/README.md +6 -0
  2. package/dist/adapters/WorkflowAdapter.d.ts +1 -1
  3. package/dist/adapters/agentspec/AgentSpecAdapter.js +3 -1
  4. package/dist/api/client.d.ts +4 -0
  5. package/dist/api/client.js +6 -1
  6. package/dist/api/enhanced-client.js +7 -6
  7. package/dist/components/App.svelte +143 -219
  8. package/dist/components/CanvasBanner.stories.svelte +25 -0
  9. package/dist/components/CanvasBanner.stories.svelte.d.ts +27 -0
  10. package/dist/components/CanvasBanner.svelte +2 -2
  11. package/dist/components/ConfigForm.svelte +37 -36
  12. package/dist/components/ConfigPanel.stories.svelte +38 -0
  13. package/dist/components/ConfigPanel.stories.svelte.d.ts +27 -0
  14. package/dist/components/ConfigPanel.svelte +2 -2
  15. package/dist/components/ConnectionLine.svelte +2 -2
  16. package/dist/components/FlowDropZone.svelte +18 -2
  17. package/dist/components/FlowDropZone.svelte.d.ts +2 -0
  18. package/dist/components/LoadingSpinner.stories.svelte +30 -0
  19. package/dist/components/LoadingSpinner.stories.svelte.d.ts +27 -0
  20. package/dist/components/Logo.stories.svelte +22 -0
  21. package/dist/components/Logo.stories.svelte.d.ts +27 -0
  22. package/dist/components/Logo.svelte +33 -13
  23. package/dist/components/Logo.svelte.d.ts +1 -1
  24. package/dist/components/MarkdownDisplay.stories.svelte +21 -0
  25. package/dist/components/MarkdownDisplay.stories.svelte.d.ts +27 -0
  26. package/dist/components/MarkdownDisplay.svelte +4 -3
  27. package/dist/components/Navbar.stories.svelte +41 -0
  28. package/dist/components/Navbar.stories.svelte.d.ts +27 -0
  29. package/dist/components/Navbar.svelte +4 -4
  30. package/dist/components/NodeSidebar.svelte +12 -12
  31. package/dist/components/NodeStatusOverlay.stories.svelte +74 -0
  32. package/dist/components/NodeStatusOverlay.stories.svelte.d.ts +27 -0
  33. package/dist/components/PipelineStatus.svelte +11 -4
  34. package/dist/components/PortCoordinateTracker.svelte +1 -1
  35. package/dist/components/SchemaForm.stories.svelte +101 -0
  36. package/dist/components/SchemaForm.stories.svelte.d.ts +27 -0
  37. package/dist/components/SchemaForm.svelte +17 -12
  38. package/dist/components/SettingsModal.svelte +3 -3
  39. package/dist/components/SettingsPanel.svelte +23 -22
  40. package/dist/components/StatusIcon.stories.svelte +60 -0
  41. package/dist/components/StatusIcon.stories.svelte.d.ts +27 -0
  42. package/dist/components/StatusIcon.svelte +7 -0
  43. package/dist/components/StatusLabel.stories.svelte +17 -0
  44. package/dist/components/StatusLabel.stories.svelte.d.ts +27 -0
  45. package/dist/components/ThemeToggle.stories.svelte +25 -0
  46. package/dist/components/ThemeToggle.stories.svelte.d.ts +27 -0
  47. package/dist/components/ThemeToggle.svelte +8 -8
  48. package/dist/components/UniversalNode.svelte +1 -1
  49. package/dist/components/WorkflowEditor.svelte +298 -294
  50. package/dist/components/form/FormAutocomplete.svelte +20 -19
  51. package/dist/components/form/FormCheckboxGroup.stories.svelte +28 -0
  52. package/dist/components/form/FormCheckboxGroup.stories.svelte.d.ts +27 -0
  53. package/dist/components/form/FormField.svelte +3 -3
  54. package/dist/components/form/FormFieldLight.svelte +2 -2
  55. package/dist/components/form/FormFieldWrapper.stories.svelte +31 -0
  56. package/dist/components/form/FormFieldWrapper.stories.svelte.d.ts +27 -0
  57. package/dist/components/form/FormFieldset.svelte +7 -7
  58. package/dist/components/form/FormNumberField.stories.svelte +33 -0
  59. package/dist/components/form/FormNumberField.stories.svelte.d.ts +27 -0
  60. package/dist/components/form/FormRangeField.stories.svelte +31 -0
  61. package/dist/components/form/FormRangeField.stories.svelte.d.ts +27 -0
  62. package/dist/components/form/FormSelect.stories.svelte +50 -0
  63. package/dist/components/form/FormSelect.stories.svelte.d.ts +27 -0
  64. package/dist/components/form/FormTemplateEditor.svelte +2 -1
  65. package/dist/components/form/FormTextField.stories.svelte +30 -0
  66. package/dist/components/form/FormTextField.stories.svelte.d.ts +27 -0
  67. package/dist/components/form/FormTextarea.stories.svelte +31 -0
  68. package/dist/components/form/FormTextarea.stories.svelte.d.ts +27 -0
  69. package/dist/components/form/FormToggle.stories.svelte +30 -0
  70. package/dist/components/form/FormToggle.stories.svelte.d.ts +27 -0
  71. package/dist/components/form/FormUISchemaRenderer.svelte +1 -1
  72. package/dist/components/form/types.d.ts +15 -47
  73. package/dist/components/interrupt/ChoicePrompt.stories.svelte +43 -0
  74. package/dist/components/interrupt/ChoicePrompt.stories.svelte.d.ts +27 -0
  75. package/dist/components/interrupt/ChoicePrompt.svelte +24 -24
  76. package/dist/components/interrupt/ConfirmationPrompt.stories.svelte +49 -0
  77. package/dist/components/interrupt/ConfirmationPrompt.stories.svelte.d.ts +27 -0
  78. package/dist/components/interrupt/ConfirmationPrompt.svelte +19 -19
  79. package/dist/components/interrupt/FormPrompt.svelte +15 -15
  80. package/dist/components/interrupt/InterruptBubble.svelte +202 -236
  81. package/dist/components/interrupt/InterruptBubble.svelte.d.ts +1 -1
  82. package/dist/components/interrupt/ReviewPrompt.stories.svelte +46 -0
  83. package/dist/components/interrupt/ReviewPrompt.stories.svelte.d.ts +27 -0
  84. package/dist/components/interrupt/ReviewPrompt.svelte +842 -0
  85. package/dist/components/interrupt/ReviewPrompt.svelte.d.ts +23 -0
  86. package/dist/components/interrupt/TextInputPrompt.stories.svelte +34 -0
  87. package/dist/components/interrupt/TextInputPrompt.stories.svelte.d.ts +27 -0
  88. package/dist/components/interrupt/TextInputPrompt.svelte +21 -21
  89. package/dist/components/nodes/GatewayNode.stories.svelte +76 -0
  90. package/dist/components/nodes/GatewayNode.stories.svelte.d.ts +26 -0
  91. package/dist/components/nodes/GatewayNode.svelte +19 -17
  92. package/dist/components/nodes/IdeaNode.stories.svelte +48 -0
  93. package/dist/components/nodes/IdeaNode.stories.svelte.d.ts +26 -0
  94. package/dist/components/nodes/IdeaNode.svelte +10 -26
  95. package/dist/components/nodes/NotesNode.stories.svelte +69 -0
  96. package/dist/components/nodes/NotesNode.stories.svelte.d.ts +26 -0
  97. package/dist/components/nodes/NotesNode.svelte +8 -8
  98. package/dist/components/nodes/SimpleNode.stories.svelte +101 -0
  99. package/dist/components/nodes/SimpleNode.stories.svelte.d.ts +26 -0
  100. package/dist/components/nodes/SimpleNode.svelte +16 -24
  101. package/dist/components/nodes/SquareNode.stories.svelte +56 -0
  102. package/dist/components/nodes/SquareNode.stories.svelte.d.ts +26 -0
  103. package/dist/components/nodes/SquareNode.svelte +13 -21
  104. package/dist/components/nodes/TerminalNode.stories.svelte +25 -0
  105. package/dist/components/nodes/TerminalNode.stories.svelte.d.ts +26 -0
  106. package/dist/components/nodes/TerminalNode.svelte +6 -6
  107. package/dist/components/nodes/ToolNode.stories.svelte +71 -0
  108. package/dist/components/nodes/ToolNode.stories.svelte.d.ts +26 -0
  109. package/dist/components/nodes/ToolNode.svelte +7 -15
  110. package/dist/components/nodes/WorkflowNode.stories.svelte +50 -0
  111. package/dist/components/nodes/WorkflowNode.stories.svelte.d.ts +26 -0
  112. package/dist/components/nodes/WorkflowNode.svelte +13 -13
  113. package/dist/components/playground/ChatPanel.svelte +48 -48
  114. package/dist/components/playground/ExecutionLogs.svelte +23 -23
  115. package/dist/components/playground/InputCollector.svelte +24 -24
  116. package/dist/components/playground/MessageBubble.stories.svelte +49 -0
  117. package/dist/components/playground/MessageBubble.stories.svelte.d.ts +27 -0
  118. package/dist/components/playground/MessageBubble.svelte +49 -46
  119. package/dist/components/playground/Playground.svelte +203 -172
  120. package/dist/components/playground/PlaygroundModal.svelte +5 -5
  121. package/dist/components/playground/SessionManager.svelte +26 -26
  122. package/dist/config/constants.d.ts +22 -0
  123. package/dist/config/constants.js +22 -0
  124. package/dist/config/endpoints.d.ts +19 -0
  125. package/dist/config/runtimeConfig.js +2 -1
  126. package/dist/core/index.d.ts +5 -2
  127. package/dist/core/index.js +9 -1
  128. package/dist/editor/index.d.ts +13 -9
  129. package/dist/editor/index.js +15 -11
  130. package/dist/form/code.d.ts +2 -1
  131. package/dist/form/code.js +1 -3
  132. package/dist/form/markdown.d.ts +2 -1
  133. package/dist/form/markdown.js +1 -3
  134. package/dist/helpers/workflowEditorHelper.js +13 -9
  135. package/dist/mocks/app-forms.js +1 -0
  136. package/dist/mocks/app-navigation.js +3 -1
  137. package/dist/mocks/app-stores.d.ts +4 -4
  138. package/dist/playground/index.d.ts +5 -4
  139. package/dist/playground/index.js +15 -11
  140. package/dist/playground/mount.d.ts +20 -1
  141. package/dist/playground/mount.js +24 -6
  142. package/dist/services/agentSpecExecutionService.js +2 -1
  143. package/dist/services/api.js +10 -18
  144. package/dist/services/apiVariableService.js +2 -1
  145. package/dist/services/autoSaveService.d.ts +3 -3
  146. package/dist/services/autoSaveService.js +21 -17
  147. package/dist/services/categoriesApi.js +13 -5
  148. package/dist/services/draftStorage.js +5 -4
  149. package/dist/services/dynamicSchemaService.js +4 -4
  150. package/dist/services/globalSave.d.ts +60 -11
  151. package/dist/services/globalSave.js +160 -83
  152. package/dist/services/historyService.d.ts +2 -1
  153. package/dist/services/historyService.js +7 -3
  154. package/dist/services/interruptService.js +9 -8
  155. package/dist/services/nodeExecutionService.js +14 -6
  156. package/dist/services/playgroundService.d.ts +3 -2
  157. package/dist/services/playgroundService.js +8 -7
  158. package/dist/services/portConfigApi.js +11 -7
  159. package/dist/services/toastService.d.ts +1 -1
  160. package/dist/services/toastService.js +6 -5
  161. package/dist/services/variableService.js +3 -2
  162. package/dist/settings/index.d.ts +1 -1
  163. package/dist/settings/index.js +1 -1
  164. package/dist/stores/{categoriesStore.d.ts → categoriesStore.svelte.d.ts} +3 -3
  165. package/dist/stores/{categoriesStore.js → categoriesStore.svelte.js} +15 -18
  166. package/dist/stores/editorStateMachine.svelte.d.ts +42 -0
  167. package/dist/stores/editorStateMachine.svelte.js +132 -0
  168. package/dist/stores/{historyStore.d.ts → historyStore.svelte.d.ts} +18 -15
  169. package/dist/stores/{historyStore.js → historyStore.svelte.js} +40 -21
  170. package/dist/stores/{interruptStore.d.ts → interruptStore.svelte.d.ts} +16 -15
  171. package/dist/stores/{interruptStore.js → interruptStore.svelte.js} +85 -94
  172. package/dist/stores/{playgroundStore.d.ts → playgroundStore.svelte.d.ts} +52 -34
  173. package/dist/stores/{playgroundStore.js → playgroundStore.svelte.js} +193 -100
  174. package/dist/stores/{portCoordinateStore.d.ts → portCoordinateStore.svelte.d.ts} +10 -4
  175. package/dist/stores/{portCoordinateStore.js → portCoordinateStore.svelte.js} +38 -35
  176. package/dist/stores/{settingsStore.d.ts → settingsStore.svelte.d.ts} +45 -28
  177. package/dist/stores/{settingsStore.js → settingsStore.svelte.js} +169 -128
  178. package/dist/stores/{workflowStore.d.ts → workflowStore.svelte.d.ts} +101 -65
  179. package/dist/stores/{workflowStore.js → workflowStore.svelte.js} +285 -239
  180. package/dist/stories/CanvasDecorator.svelte +50 -0
  181. package/dist/stories/CanvasDecorator.svelte.d.ts +8 -0
  182. package/dist/stories/NodeDecorator.svelte +74 -0
  183. package/dist/stories/NodeDecorator.svelte.d.ts +8 -0
  184. package/dist/stories/utils.d.ts +93 -0
  185. package/dist/stories/utils.js +122 -0
  186. package/dist/styles/base.css +114 -61
  187. package/dist/styles/toast.css +2 -2
  188. package/dist/styles/tokens.css +250 -185
  189. package/dist/svelte-app.d.ts +0 -6
  190. package/dist/svelte-app.js +13 -31
  191. package/dist/types/index.d.ts +2 -0
  192. package/dist/types/interrupt.d.ts +89 -5
  193. package/dist/types/interrupt.js +13 -1
  194. package/dist/types/playground.d.ts +42 -1
  195. package/dist/types/playground.js +38 -0
  196. package/dist/types/settings.js +1 -1
  197. package/dist/utils/colors.js +4 -4
  198. package/dist/utils/connections.js +33 -8
  199. package/dist/utils/icons.js +1 -1
  200. package/dist/utils/logger.d.ts +47 -0
  201. package/dist/utils/logger.js +72 -0
  202. package/dist/utils/nodeWrapper.js +1 -1
  203. package/dist/utils/sanitize.d.ts +19 -0
  204. package/dist/utils/sanitize.js +31 -0
  205. package/dist/utils/validation.d.ts +29 -0
  206. package/dist/utils/validation.js +39 -0
  207. package/package.json +243 -232
@@ -0,0 +1,26 @@
1
+ export default NotesNode;
2
+ type NotesNode = SvelteComponent<{
3
+ [x: string]: never;
4
+ }, {
5
+ [evt: string]: CustomEvent<any>;
6
+ }, {}> & {
7
+ $$bindings?: string | undefined;
8
+ };
9
+ declare const NotesNode: $$__sveltets_2_IsomorphicComponent<{
10
+ [x: string]: never;
11
+ }, {
12
+ [evt: string]: CustomEvent<any>;
13
+ }, {}, {}, string>;
14
+ interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
15
+ new (options: import("svelte").ComponentConstructorOptions<Props>): import("svelte").SvelteComponent<Props, Events, Slots> & {
16
+ $$bindings?: Bindings;
17
+ } & Exports;
18
+ (internal: unknown, props: {
19
+ $$events?: Events;
20
+ $$slots?: Slots;
21
+ }): Exports & {
22
+ $set?: any;
23
+ $on?: any;
24
+ };
25
+ z_$$bindings?: Bindings;
26
+ }
@@ -231,7 +231,7 @@
231
231
 
232
232
  /* Display Mode Styles */
233
233
  .flowdrop-notes-node__content {
234
- padding: var(--fd-space-4);
234
+ padding: var(--fd-space-xl);
235
235
  height: 100%;
236
236
  display: flex;
237
237
  flex-direction: column;
@@ -248,7 +248,7 @@
248
248
  .flowdrop-notes-node__header-left {
249
249
  display: flex;
250
250
  align-items: center;
251
- gap: var(--fd-space-3);
251
+ gap: var(--fd-space-md);
252
252
  }
253
253
 
254
254
  /* Squircle icon wrapper - Apple-style rounded square background */
@@ -286,7 +286,7 @@
286
286
  }
287
287
 
288
288
  .flowdrop-notes-node__body {
289
- margin-bottom: var(--fd-space-2);
289
+ margin-bottom: var(--fd-space-xs);
290
290
  flex: 1;
291
291
  overflow-y: auto;
292
292
  color: var(--fd-muted-foreground);
@@ -300,7 +300,7 @@
300
300
  .flowdrop-notes-node__processing {
301
301
  display: flex;
302
302
  align-items: center;
303
- gap: var(--fd-space-2);
303
+ gap: var(--fd-space-xs);
304
304
  font-size: var(--fd-text-xs);
305
305
  color: var(--fd-muted-foreground);
306
306
  }
@@ -317,7 +317,7 @@
317
317
  .flowdrop-notes-node__error-indicator {
318
318
  display: flex;
319
319
  align-items: center;
320
- gap: var(--fd-space-2);
320
+ gap: var(--fd-space-xs);
321
321
  font-size: var(--fd-text-xs);
322
322
  color: var(--fd-error);
323
323
  }
@@ -335,8 +335,8 @@
335
335
 
336
336
  .flowdrop-notes-node__config-btn {
337
337
  position: absolute;
338
- top: var(--fd-space-2);
339
- right: var(--fd-space-2);
338
+ top: var(--fd-space-xs);
339
+ right: var(--fd-space-xs);
340
340
  width: 1.5rem;
341
341
  height: 1.5rem;
342
342
  background-color: var(--fd-backdrop);
@@ -372,7 +372,7 @@
372
372
  }
373
373
 
374
374
  .flowdrop-notes-node__content {
375
- padding: var(--fd-space-3);
375
+ padding: var(--fd-space-md);
376
376
  }
377
377
  }
378
378
  </style>
@@ -0,0 +1,101 @@
1
+ <script module>
2
+ import { defineMeta } from "@storybook/addon-svelte-csf";
3
+ import NodeDecorator from "../../stories/NodeDecorator.svelte";
4
+ import { createSampleNodeData } from "../../stories/utils.js";
5
+
6
+ const { Story } = defineMeta({
7
+ title: "Nodes/SimpleNode",
8
+ tags: ["autodocs"],
9
+ parameters: {
10
+ layout: "centered",
11
+ },
12
+ });
13
+ </script>
14
+
15
+ <Story name="Default">
16
+ <NodeDecorator data={createSampleNodeData({
17
+ label: "Text Input",
18
+ metadata: {
19
+ id: "text_input",
20
+ name: "Text Input",
21
+ description: "Simple text input for user data",
22
+ category: "inputs",
23
+ version: "1.0.0",
24
+ type: "simple",
25
+ supportedTypes: ["simple", "square", "default"],
26
+ icon: "mdi:text",
27
+ color: "#22c55e",
28
+ inputs: [],
29
+ outputs: [
30
+ { id: "text", name: "text", type: "output", dataType: "string", required: false, description: "The input text value" },
31
+ ],
32
+ },
33
+ })} />
34
+ </Story>
35
+
36
+ <Story name="With Icon">
37
+ <NodeDecorator data={createSampleNodeData({
38
+ label: "Notification Template",
39
+ metadata: {
40
+ id: "notification_template",
41
+ name: "Notification Template",
42
+ description: "Create notification templates with API-driven variable suggestions",
43
+ category: "outputs",
44
+ version: "1.0.0",
45
+ type: "simple",
46
+ supportedTypes: ["simple", "default"],
47
+ icon: "mdi:bell-ring",
48
+ color: "#f59e0b",
49
+ inputs: [
50
+ { id: "event", name: "Event Data", type: "input", dataType: "json", required: false, description: "Event that triggered notification" },
51
+ { id: "trigger", name: "Trigger", type: "input", dataType: "trigger", required: false, description: "Execution trigger" },
52
+ ],
53
+ outputs: [
54
+ { id: "notification", name: "Notification", type: "output", dataType: "json", required: false, description: "Formatted notification object" },
55
+ ],
56
+ },
57
+ })} />
58
+ </Story>
59
+
60
+ <Story name="Selected">
61
+ <NodeDecorator data={createSampleNodeData({
62
+ label: "Text Input",
63
+ metadata: {
64
+ id: "text_input",
65
+ name: "Text Input",
66
+ description: "Simple text input for user data",
67
+ category: "inputs",
68
+ version: "1.0.0",
69
+ type: "simple",
70
+ supportedTypes: ["simple", "square", "default"],
71
+ icon: "mdi:text",
72
+ color: "#22c55e",
73
+ inputs: [],
74
+ outputs: [
75
+ { id: "text", name: "text", type: "output", dataType: "string", required: false, description: "The input text value" },
76
+ ],
77
+ },
78
+ })} selected={true} />
79
+ </Story>
80
+
81
+ <Story name="Multiple Ports">
82
+ <NodeDecorator data={createSampleNodeData({
83
+ label: "Text Output",
84
+ metadata: {
85
+ id: "text_output",
86
+ name: "Text Output",
87
+ description: "Simple text output for displaying data",
88
+ category: "outputs",
89
+ version: "1.0.0",
90
+ type: "simple",
91
+ supportedTypes: ["square", "simple", "default"],
92
+ icon: "mdi:text-box",
93
+ color: "#ef4444",
94
+ inputs: [
95
+ { id: "text", name: "Text Input", type: "input", dataType: "string", required: false, description: "The text to output" },
96
+ { id: "trigger", name: "Trigger", type: "input", dataType: "trigger", required: false, description: "" },
97
+ ],
98
+ outputs: [],
99
+ },
100
+ })} />
101
+ </Story>
@@ -0,0 +1,26 @@
1
+ export default SimpleNode;
2
+ type SimpleNode = SvelteComponent<{
3
+ [x: string]: never;
4
+ }, {
5
+ [evt: string]: CustomEvent<any>;
6
+ }, {}> & {
7
+ $$bindings?: string | undefined;
8
+ };
9
+ declare const SimpleNode: $$__sveltets_2_IsomorphicComponent<{
10
+ [x: string]: never;
11
+ }, {
12
+ [evt: string]: CustomEvent<any>;
13
+ }, {}, {}, string>;
14
+ interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
15
+ new (options: import("svelte").ComponentConstructorOptions<Props>): import("svelte").SvelteComponent<Props, Events, Slots> & {
16
+ $$bindings?: Bindings;
17
+ } & Exports;
18
+ (internal: unknown, props: {
19
+ $$events?: Events;
20
+ $$slots?: Slots;
21
+ }): Exports & {
22
+ $set?: any;
23
+ $on?: any;
24
+ };
25
+ z_$$bindings?: Bindings;
26
+ }
@@ -9,10 +9,10 @@
9
9
 
10
10
  <script lang="ts">
11
11
  import { Position, Handle } from '@xyflow/svelte';
12
- import type { ConfigValues, NodeMetadata, NodeExtensions } from '../../types/index.js';
12
+ import type { ConfigValues, NodeMetadata, NodeExtensions, NodePort } from '../../types/index.js';
13
13
  import Icon from '@iconify/svelte';
14
14
  import { getDataTypeColor } from '../../utils/colors.js';
15
- import { connectedHandles } from '../../stores/workflowStore.js';
15
+ import { getConnectedHandles } from '../../stores/workflowStore.svelte.js';
16
16
 
17
17
  const props = $props<{
18
18
  data: {
@@ -107,7 +107,7 @@
107
107
  */
108
108
  function isPortConnected(portId: string, type: 'input' | 'output'): boolean {
109
109
  const handleId = `${props.data.nodeId}-${type}-${portId}`;
110
- return $connectedHandles.has(handleId);
110
+ return getConnectedHandles().has(handleId);
111
111
  }
112
112
 
113
113
  /**
@@ -124,30 +124,30 @@
124
124
  // Get first input/output ports for simple node representation
125
125
  // Special handling for trigger ports - they should always be shown if present
126
126
  let triggerInputPort = $derived(
127
- props.data.metadata?.inputs?.find((port) => port.dataType === 'trigger')
127
+ props.data.metadata?.inputs?.find((port: NodePort) => port.dataType === 'trigger')
128
128
  );
129
129
  let triggerOutputPort = $derived(
130
- props.data.metadata?.outputs?.find((port) => port.dataType === 'trigger')
130
+ props.data.metadata?.outputs?.find((port: NodePort) => port.dataType === 'trigger')
131
131
  );
132
132
 
133
133
  // Get first non-trigger ports for data connections
134
134
  let firstConnectedDataInputPort = $derived(
135
135
  props.data.metadata?.inputs?.find(
136
- (port) => port.dataType !== 'trigger' && isPortConnected(port.id, 'input')
136
+ (port: NodePort) => port.dataType !== 'trigger' && isPortConnected(port.id, 'input')
137
137
  )
138
138
  );
139
139
 
140
140
  let firstDataInputPort = $derived(
141
- props.data.metadata?.inputs?.find((port) => port.dataType !== 'trigger')
141
+ props.data.metadata?.inputs?.find((port: NodePort) => port.dataType !== 'trigger')
142
142
  );
143
143
 
144
144
  let firstConnectedDataOutputPort = $derived(
145
145
  props.data.metadata?.outputs?.find(
146
- (port) => port.dataType !== 'trigger' && isPortConnected(port.id, 'output')
146
+ (port: NodePort) => port.dataType !== 'trigger' && isPortConnected(port.id, 'output')
147
147
  )
148
148
  );
149
149
  let firstDataOutputPort = $derived(
150
- props.data.metadata?.outputs?.find((port) => port.dataType !== 'trigger')
150
+ props.data.metadata?.outputs?.find((port: NodePort) => port.dataType !== 'trigger')
151
151
  );
152
152
 
153
153
  let inputPorts = $derived.by(() => {
@@ -187,7 +187,7 @@
187
187
  ? index === 0
188
188
  ? 20
189
189
  : 60
190
- : 40}px; transform: translateY(-50%); margin-left: -10px; z-index: 30;"
190
+ : 40}px; transform: translateY(-50%); z-index: 30;"
191
191
  id={`${props.data.nodeId}-input-${port.id}`}
192
192
  />
193
193
  {/each}
@@ -258,7 +258,7 @@
258
258
  ? index === 0
259
259
  ? 20
260
260
  : 60
261
- : 40}px; transform: translateY(-50%); margin-right: -10px; z-index: 30;"
261
+ : 40}px; transform: translateY(-50%); z-index: 30;"
262
262
  id={`${props.data.nodeId}-output-${port.id}`}
263
263
  />
264
264
  {/each}
@@ -319,7 +319,7 @@
319
319
  }
320
320
 
321
321
  .flowdrop-simple-node__header {
322
- padding: var(--fd-space-4);
322
+ padding: var(--fd-space-xl);
323
323
  background: var(--fd-header);
324
324
  border-radius: var(--fd-radius-xl);
325
325
  }
@@ -327,7 +327,7 @@
327
327
  .flowdrop-simple-node__header-content {
328
328
  display: flex;
329
329
  align-items: center;
330
- gap: var(--fd-space-3);
330
+ gap: var(--fd-space-md);
331
331
  }
332
332
 
333
333
  /* Squircle icon wrapper - Apple-style rounded square background */
@@ -365,7 +365,7 @@
365
365
  .flowdrop-simple-node__description {
366
366
  font-size: var(--fd-text-xs);
367
367
  color: var(--fd-muted-foreground);
368
- margin: var(--fd-space-1) 0 0 0;
368
+ margin: var(--fd-space-3xs) 0 0 0;
369
369
  line-height: 1.3;
370
370
  }
371
371
 
@@ -404,8 +404,8 @@
404
404
 
405
405
  .flowdrop-simple-node__config-btn {
406
406
  position: absolute;
407
- top: var(--fd-space-2);
408
- right: var(--fd-space-2);
407
+ top: var(--fd-space-xs);
408
+ right: var(--fd-space-xs);
409
409
  width: 1.5rem;
410
410
  height: 1.5rem;
411
411
  background-color: var(--fd-backdrop);
@@ -445,14 +445,6 @@
445
445
  pointer-events: auto !important;
446
446
  }
447
447
 
448
- :global(.svelte-flow__node-simple .svelte-flow__handle-left) {
449
- left: -10px !important;
450
- }
451
-
452
- :global(.svelte-flow__node-simple .svelte-flow__handle-right) {
453
- right: -10px !important;
454
- }
455
-
456
448
  :global(.svelte-flow__node-simple .svelte-flow__handle:hover) {
457
449
  transform: translateY(-50%) scale(1.2) !important;
458
450
  }
@@ -0,0 +1,56 @@
1
+ <script module>
2
+ import { defineMeta } from "@storybook/addon-svelte-csf";
3
+ import NodeDecorator from "../../stories/NodeDecorator.svelte";
4
+ import { createSampleNodeData } from "../../stories/utils.js";
5
+
6
+ const { Story } = defineMeta({
7
+ title: "Nodes/SquareNode",
8
+ tags: ["autodocs"],
9
+ parameters: {
10
+ layout: "centered",
11
+ },
12
+ });
13
+ </script>
14
+
15
+ <Story name="Default">
16
+ <NodeDecorator data={createSampleNodeData({
17
+ label: "Text Input",
18
+ metadata: {
19
+ id: "text_input",
20
+ name: "Text Input",
21
+ description: "Simple text input for user data",
22
+ category: "inputs",
23
+ version: "1.0.0",
24
+ type: "square",
25
+ supportedTypes: ["simple", "square", "default"],
26
+ icon: "mdi:text",
27
+ color: "#22c55e",
28
+ inputs: [],
29
+ outputs: [
30
+ { id: "text", name: "text", type: "output", dataType: "string", required: false, description: "The input text value" },
31
+ ],
32
+ },
33
+ })} />
34
+ </Story>
35
+
36
+ <Story name="Selected">
37
+ <NodeDecorator data={createSampleNodeData({
38
+ label: "Text Output",
39
+ metadata: {
40
+ id: "text_output",
41
+ name: "Text Output",
42
+ description: "Simple text output for displaying data",
43
+ category: "outputs",
44
+ version: "1.0.0",
45
+ type: "square",
46
+ supportedTypes: ["square", "simple", "default"],
47
+ icon: "mdi:text-box",
48
+ color: "#ef4444",
49
+ inputs: [
50
+ { id: "text", name: "Text Input", type: "input", dataType: "string", required: false, description: "The text to output" },
51
+ { id: "trigger", name: "Trigger", type: "input", dataType: "trigger", required: false, description: "" },
52
+ ],
53
+ outputs: [],
54
+ },
55
+ })} selected={true} />
56
+ </Story>
@@ -0,0 +1,26 @@
1
+ export default SquareNode;
2
+ type SquareNode = SvelteComponent<{
3
+ [x: string]: never;
4
+ }, {
5
+ [evt: string]: CustomEvent<any>;
6
+ }, {}> & {
7
+ $$bindings?: string | undefined;
8
+ };
9
+ declare const SquareNode: $$__sveltets_2_IsomorphicComponent<{
10
+ [x: string]: never;
11
+ }, {
12
+ [evt: string]: CustomEvent<any>;
13
+ }, {}, {}, string>;
14
+ interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
15
+ new (options: import("svelte").ComponentConstructorOptions<Props>): import("svelte").SvelteComponent<Props, Events, Slots> & {
16
+ $$bindings?: Bindings;
17
+ } & Exports;
18
+ (internal: unknown, props: {
19
+ $$events?: Events;
20
+ $$slots?: Slots;
21
+ }): Exports & {
22
+ $set?: any;
23
+ $on?: any;
24
+ };
25
+ z_$$bindings?: Bindings;
26
+ }
@@ -9,11 +9,11 @@
9
9
 
10
10
  <script lang="ts">
11
11
  import { Position, Handle } from '@xyflow/svelte';
12
- import type { ConfigValues, NodeMetadata, NodeExtensions } from '../../types/index.js';
12
+ import type { ConfigValues, NodeMetadata, NodeExtensions, NodePort } from '../../types/index.js';
13
13
  import Icon from '@iconify/svelte';
14
14
  import { getDataTypeColor, getCategoryColorToken } from '../../utils/colors.js';
15
15
  import { getNodeIcon } from '../../utils/icons.js';
16
- import { connectedHandles } from '../../stores/workflowStore.js';
16
+ import { getConnectedHandles } from '../../stores/workflowStore.svelte.js';
17
17
 
18
18
  const props = $props<{
19
19
  data: {
@@ -93,7 +93,7 @@
93
93
  */
94
94
  function isPortConnected(portId: string, type: 'input' | 'output'): boolean {
95
95
  const handleId = `${props.data.nodeId}-${type}-${portId}`;
96
- return $connectedHandles.has(handleId);
96
+ return getConnectedHandles().has(handleId);
97
97
  }
98
98
 
99
99
  /**
@@ -110,30 +110,30 @@
110
110
  // Get first input/output ports for square node representation
111
111
  // Special handling for trigger ports - they should always be shown if present
112
112
  let triggerInputPort = $derived(
113
- props.data.metadata?.inputs?.find((port) => port.dataType === 'trigger')
113
+ props.data.metadata?.inputs?.find((port: NodePort) => port.dataType === 'trigger')
114
114
  );
115
115
  let triggerOutputPort = $derived(
116
- props.data.metadata?.outputs?.find((port) => port.dataType === 'trigger')
116
+ props.data.metadata?.outputs?.find((port: NodePort) => port.dataType === 'trigger')
117
117
  );
118
118
 
119
119
  // Get first non-trigger ports for data connections
120
120
  let firstConnectedDataInputPort = $derived(
121
121
  props.data.metadata?.inputs?.find(
122
- (port) => port.dataType !== 'trigger' && isPortConnected(port.id, 'input')
122
+ (port: NodePort) => port.dataType !== 'trigger' && isPortConnected(port.id, 'input')
123
123
  )
124
124
  );
125
125
 
126
126
  let firstDataInputPort = $derived(
127
- props.data.metadata?.inputs?.find((port) => port.dataType !== 'trigger')
127
+ props.data.metadata?.inputs?.find((port: NodePort) => port.dataType !== 'trigger')
128
128
  );
129
129
 
130
130
  let firstConnectedDataOutputPort = $derived(
131
131
  props.data.metadata?.outputs?.find(
132
- (port) => port.dataType !== 'trigger' && isPortConnected(port.id, 'output')
132
+ (port: NodePort) => port.dataType !== 'trigger' && isPortConnected(port.id, 'output')
133
133
  )
134
134
  );
135
135
  let firstDataOutputPort = $derived(
136
- props.data.metadata?.outputs?.find((port) => port.dataType !== 'trigger')
136
+ props.data.metadata?.outputs?.find((port: NodePort) => port.dataType !== 'trigger')
137
137
  );
138
138
 
139
139
  let inputPorts = $derived.by(() => {
@@ -173,7 +173,7 @@
173
173
  ? index === 0
174
174
  ? 20
175
175
  : 60
176
- : 40}px; transform: translateY(-50%); margin-left: -10px; z-index: 30;"
176
+ : 40}px; transform: translateY(-50%); z-index: 30;"
177
177
  id={`${props.data.nodeId}-input-${port.id}`}
178
178
  />
179
179
  {/each}
@@ -232,7 +232,7 @@
232
232
  ? index === 0
233
233
  ? 20
234
234
  : 60
235
- : 40}px; transform: translateY(-50%); margin-right: -10px; z-index: 30;"
235
+ : 40}px; transform: translateY(-50%); z-index: 30;"
236
236
  id={`${props.data.nodeId}-output-${port.id}`}
237
237
  />
238
238
  {/each}
@@ -360,8 +360,8 @@
360
360
 
361
361
  .flowdrop-square-node__config-btn {
362
362
  position: absolute;
363
- top: var(--fd-space-2);
364
- right: var(--fd-space-2);
363
+ top: var(--fd-space-xs);
364
+ right: var(--fd-space-xs);
365
365
  width: 1.5rem;
366
366
  height: 1.5rem;
367
367
  background-color: var(--fd-backdrop);
@@ -401,14 +401,6 @@
401
401
  pointer-events: auto !important;
402
402
  }
403
403
 
404
- :global(.svelte-flow__node-square .svelte-flow__handle-left) {
405
- left: -10px !important;
406
- }
407
-
408
- :global(.svelte-flow__node-square .svelte-flow__handle-right) {
409
- right: -10px !important;
410
- }
411
-
412
404
  :global(.svelte-flow__node-square .svelte-flow__handle:hover) {
413
405
  transform: translateY(-50%) scale(1.2) !important;
414
406
  }
@@ -0,0 +1,25 @@
1
+ <script module>
2
+ import { defineMeta } from "@storybook/addon-svelte-csf";
3
+ import NodeDecorator from "../../stories/NodeDecorator.svelte";
4
+ import { createTerminalNodeData } from "../../stories/utils.js";
5
+
6
+ const { Story } = defineMeta({
7
+ title: "Nodes/TerminalNode",
8
+ tags: ["autodocs"],
9
+ parameters: {
10
+ layout: "centered",
11
+ },
12
+ });
13
+ </script>
14
+
15
+ <Story name="Start">
16
+ <NodeDecorator data={createTerminalNodeData("start")} />
17
+ </Story>
18
+
19
+ <Story name="End">
20
+ <NodeDecorator data={createTerminalNodeData("end")} />
21
+ </Story>
22
+
23
+ <Story name="Exit">
24
+ <NodeDecorator data={createTerminalNodeData("exit")} />
25
+ </Story>
@@ -0,0 +1,26 @@
1
+ export default TerminalNode;
2
+ type TerminalNode = SvelteComponent<{
3
+ [x: string]: never;
4
+ }, {
5
+ [evt: string]: CustomEvent<any>;
6
+ }, {}> & {
7
+ $$bindings?: string | undefined;
8
+ };
9
+ declare const TerminalNode: $$__sveltets_2_IsomorphicComponent<{
10
+ [x: string]: never;
11
+ }, {
12
+ [evt: string]: CustomEvent<any>;
13
+ }, {}, {}, string>;
14
+ interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
15
+ new (options: import("svelte").ComponentConstructorOptions<Props>): import("svelte").SvelteComponent<Props, Events, Slots> & {
16
+ $$bindings?: Bindings;
17
+ } & Exports;
18
+ (internal: unknown, props: {
19
+ $$events?: Events;
20
+ $$slots?: Slots;
21
+ }): Exports & {
22
+ $set?: any;
23
+ $on?: any;
24
+ };
25
+ z_$$bindings?: Bindings;
26
+ }
@@ -15,7 +15,7 @@
15
15
  import { getDataTypeColor, getCategoryColorToken } from '../../utils/colors.js';
16
16
  import { getNodeIcon } from '../../utils/icons.js';
17
17
  import { getCircleHandlePosition } from '../../utils/handlePositioning.js';
18
- import { connectedHandles } from '../../stores/workflowStore.js';
18
+ import { getConnectedHandles } from '../../stores/workflowStore.svelte.js';
19
19
 
20
20
  /**
21
21
  * Terminal node variant types
@@ -156,7 +156,7 @@
156
156
  return true;
157
157
  }
158
158
  const handleId = `${props.data.nodeId}-${type}-${port.id}`;
159
- return $connectedHandles.has(handleId);
159
+ return getConnectedHandles().has(handleId);
160
160
  }
161
161
 
162
162
  /**
@@ -267,12 +267,12 @@
267
267
  /**
268
268
  * Visible input ports filtered by hideUnconnectedHandles setting
269
269
  */
270
- let visibleInputPorts = $derived(inputPorts.filter((port) => isPortVisible(port, 'input')));
270
+ let visibleInputPorts = $derived(inputPorts.filter((port: NodePort) => isPortVisible(port, 'input')));
271
271
 
272
272
  /**
273
273
  * Visible output ports filtered by hideUnconnectedHandles setting
274
274
  */
275
- let visibleOutputPorts = $derived(outputPorts.filter((port) => isPortVisible(port, 'output')));
275
+ let visibleOutputPorts = $derived(outputPorts.filter((port: NodePort) => isPortVisible(port, 'output')));
276
276
 
277
277
  /**
278
278
  * Determine if we should show inputs based on visible ports
@@ -422,7 +422,7 @@
422
422
  display: flex;
423
423
  flex-direction: column;
424
424
  align-items: center;
425
- gap: var(--fd-space-2);
425
+ gap: var(--fd-space-xs);
426
426
  cursor: pointer;
427
427
  transition: all var(--fd-transition-normal);
428
428
  z-index: 10;
@@ -558,7 +558,7 @@
558
558
  align-items: center;
559
559
  gap: 0.125rem;
560
560
  background-color: var(--fd-backdrop);
561
- padding: var(--fd-space-1) var(--fd-space-2);
561
+ padding: var(--fd-space-3xs) var(--fd-space-xs);
562
562
  border-radius: var(--fd-radius-sm);
563
563
  box-shadow: var(--fd-shadow-sm);
564
564
  max-width: 140px;