@d34dman/flowdrop 0.0.61 → 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 (204) 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 +194 -129
  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 +4 -3
  139. package/dist/playground/index.js +12 -10
  140. package/dist/playground/mount.js +6 -13
  141. package/dist/services/agentSpecExecutionService.js +2 -1
  142. package/dist/services/api.js +10 -18
  143. package/dist/services/apiVariableService.js +2 -1
  144. package/dist/services/autoSaveService.d.ts +3 -3
  145. package/dist/services/autoSaveService.js +21 -17
  146. package/dist/services/categoriesApi.js +13 -5
  147. package/dist/services/draftStorage.js +5 -4
  148. package/dist/services/dynamicSchemaService.js +4 -4
  149. package/dist/services/globalSave.d.ts +60 -11
  150. package/dist/services/globalSave.js +160 -83
  151. package/dist/services/historyService.d.ts +2 -1
  152. package/dist/services/historyService.js +7 -3
  153. package/dist/services/interruptService.js +9 -8
  154. package/dist/services/nodeExecutionService.js +14 -6
  155. package/dist/services/playgroundService.js +2 -1
  156. package/dist/services/portConfigApi.js +11 -7
  157. package/dist/services/toastService.d.ts +1 -1
  158. package/dist/services/toastService.js +6 -5
  159. package/dist/services/variableService.js +3 -2
  160. package/dist/settings/index.d.ts +1 -1
  161. package/dist/settings/index.js +1 -1
  162. package/dist/stores/{categoriesStore.d.ts → categoriesStore.svelte.d.ts} +3 -3
  163. package/dist/stores/{categoriesStore.js → categoriesStore.svelte.js} +15 -18
  164. package/dist/stores/editorStateMachine.svelte.d.ts +42 -0
  165. package/dist/stores/editorStateMachine.svelte.js +132 -0
  166. package/dist/stores/{historyStore.d.ts → historyStore.svelte.d.ts} +18 -15
  167. package/dist/stores/{historyStore.js → historyStore.svelte.js} +40 -21
  168. package/dist/stores/{interruptStore.d.ts → interruptStore.svelte.d.ts} +16 -15
  169. package/dist/stores/{interruptStore.js → interruptStore.svelte.js} +85 -94
  170. package/dist/stores/{playgroundStore.d.ts → playgroundStore.svelte.d.ts} +41 -33
  171. package/dist/stores/{playgroundStore.js → playgroundStore.svelte.js} +164 -84
  172. package/dist/stores/{portCoordinateStore.d.ts → portCoordinateStore.svelte.d.ts} +10 -4
  173. package/dist/stores/{portCoordinateStore.js → portCoordinateStore.svelte.js} +38 -35
  174. package/dist/stores/{settingsStore.d.ts → settingsStore.svelte.d.ts} +45 -28
  175. package/dist/stores/{settingsStore.js → settingsStore.svelte.js} +169 -128
  176. package/dist/stores/{workflowStore.d.ts → workflowStore.svelte.d.ts} +101 -65
  177. package/dist/stores/{workflowStore.js → workflowStore.svelte.js} +285 -239
  178. package/dist/stories/CanvasDecorator.svelte +50 -0
  179. package/dist/stories/CanvasDecorator.svelte.d.ts +8 -0
  180. package/dist/stories/NodeDecorator.svelte +74 -0
  181. package/dist/stories/NodeDecorator.svelte.d.ts +8 -0
  182. package/dist/stories/utils.d.ts +93 -0
  183. package/dist/stories/utils.js +122 -0
  184. package/dist/styles/base.css +114 -61
  185. package/dist/styles/toast.css +2 -2
  186. package/dist/styles/tokens.css +250 -185
  187. package/dist/svelte-app.d.ts +0 -6
  188. package/dist/svelte-app.js +13 -31
  189. package/dist/types/index.d.ts +2 -0
  190. package/dist/types/interrupt.d.ts +89 -5
  191. package/dist/types/interrupt.js +13 -1
  192. package/dist/types/playground.d.ts +5 -0
  193. package/dist/types/settings.js +1 -1
  194. package/dist/utils/colors.js +4 -4
  195. package/dist/utils/connections.js +33 -8
  196. package/dist/utils/icons.js +1 -1
  197. package/dist/utils/logger.d.ts +47 -0
  198. package/dist/utils/logger.js +72 -0
  199. package/dist/utils/nodeWrapper.js +1 -1
  200. package/dist/utils/sanitize.d.ts +19 -0
  201. package/dist/utils/sanitize.js +31 -0
  202. package/dist/utils/validation.d.ts +29 -0
  203. package/dist/utils/validation.js +39 -0
  204. package/package.json +243 -232
@@ -0,0 +1,23 @@
1
+ import type { ReviewConfig, ReviewResolution } from '../../types/interrupt.js';
2
+ /**
3
+ * Component props
4
+ */
5
+ interface Props {
6
+ /** Review configuration from the interrupt */
7
+ config: ReviewConfig;
8
+ /** Whether this interrupt has been resolved */
9
+ isResolved: boolean;
10
+ /** The resolved value if resolved */
11
+ resolvedValue?: ReviewResolution;
12
+ /** Whether the form is currently submitting */
13
+ isSubmitting: boolean;
14
+ /** Error message if submission failed */
15
+ error?: string;
16
+ /** Username of the person who resolved the interrupt */
17
+ resolvedByUserName?: string;
18
+ /** Callback when user submits review */
19
+ onSubmit: (value: ReviewResolution) => void;
20
+ }
21
+ declare const ReviewPrompt: import("svelte").Component<Props, {}, "">;
22
+ type ReviewPrompt = ReturnType<typeof ReviewPrompt>;
23
+ export default ReviewPrompt;
@@ -0,0 +1,34 @@
1
+ <script module>
2
+ import { defineMeta } from "@storybook/addon-svelte-csf";
3
+ import TextInputPrompt from "./TextInputPrompt.svelte";
4
+ import { fn } from "storybook/test";
5
+ import { createTextConfig } from "../../stories/utils.js";
6
+
7
+ const { Story } = defineMeta({
8
+ title: "Interrupt/TextInputPrompt",
9
+ component: TextInputPrompt,
10
+ tags: ["autodocs"],
11
+ args: {
12
+ config: createTextConfig(),
13
+ isResolved: false,
14
+ isSubmitting: false,
15
+ onSubmit: fn(),
16
+ },
17
+ });
18
+ </script>
19
+
20
+ <Story name="Default" />
21
+
22
+ <Story name="Multiline" args={{
23
+ config: createTextConfig({ message: "Describe the issue in detail:", multiline: true, placeholder: "Type your description..." }),
24
+ }} />
25
+
26
+ <Story name="With Constraints" args={{
27
+ config: createTextConfig({ message: "Enter a short summary:", minLength: 10, maxLength: 100 }),
28
+ }} />
29
+
30
+ <Story name="Resolved" args={{
31
+ isResolved: true,
32
+ resolvedValue: "The workflow completed successfully with all checks passed.",
33
+ resolvedByUserName: "Charlie",
34
+ }} />
@@ -0,0 +1,27 @@
1
+ export default TextInputPrompt;
2
+ type TextInputPrompt = SvelteComponent<{
3
+ [x: string]: never;
4
+ }, {
5
+ [evt: string]: CustomEvent<any>;
6
+ }, {}> & {
7
+ $$bindings?: string | undefined;
8
+ };
9
+ declare const TextInputPrompt: $$__sveltets_2_IsomorphicComponent<{
10
+ [x: string]: never;
11
+ }, {
12
+ [evt: string]: CustomEvent<any>;
13
+ }, {}, {}, string>;
14
+ import TextInputPrompt from "./TextInputPrompt.svelte";
15
+ 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> {
16
+ new (options: import("svelte").ComponentConstructorOptions<Props>): import("svelte").SvelteComponent<Props, Events, Slots> & {
17
+ $$bindings?: Bindings;
18
+ } & Exports;
19
+ (internal: unknown, props: {
20
+ $$events?: Events;
21
+ $$slots?: Slots;
22
+ }): Exports & {
23
+ $set?: any;
24
+ $on?: any;
25
+ };
26
+ z_$$bindings?: Bindings;
27
+ }
@@ -188,7 +188,7 @@
188
188
  .text-prompt {
189
189
  display: flex;
190
190
  flex-direction: column;
191
- gap: 0.75rem;
191
+ gap: var(--fd-space-md);
192
192
  }
193
193
 
194
194
  .text-prompt--resolved {
@@ -201,20 +201,20 @@
201
201
 
202
202
  .text-prompt__message {
203
203
  margin: 0;
204
- font-size: 0.9375rem;
205
- line-height: 1.5;
204
+ font-size: var(--fd-interrupt-font-message);
205
+ line-height: var(--fd-interrupt-line-height);
206
206
  color: var(--fd-foreground);
207
207
  }
208
208
 
209
209
  .text-prompt__error {
210
210
  display: flex;
211
211
  align-items: center;
212
- gap: 0.375rem;
213
- padding: 0.5rem 0.75rem;
212
+ gap: var(--fd-space-2xs);
213
+ padding: var(--fd-space-xs) var(--fd-space-md);
214
214
  background-color: var(--fd-error-muted);
215
215
  border-radius: var(--fd-radius-md);
216
216
  color: var(--fd-error);
217
- font-size: 0.8125rem;
217
+ font-size: var(--fd-interrupt-font-error);
218
218
  }
219
219
 
220
220
  .text-prompt__input-wrapper {
@@ -225,10 +225,10 @@
225
225
  .text-prompt__input,
226
226
  .text-prompt__textarea {
227
227
  width: 100%;
228
- padding: 0.75rem 1rem;
229
- font-size: 0.9375rem;
228
+ padding: var(--fd-space-md) var(--fd-space-xl);
229
+ font-size: var(--fd-interrupt-font-message);
230
230
  font-family: inherit;
231
- line-height: 1.5;
231
+ line-height: var(--fd-interrupt-line-height);
232
232
  color: var(--fd-foreground);
233
233
  background-color: var(--fd-background);
234
234
  border: 1px solid var(--fd-border-strong);
@@ -270,7 +270,7 @@
270
270
  font-size: var(--fd-text-xs);
271
271
  color: var(--fd-muted-foreground);
272
272
  text-align: right;
273
- padding-right: 0.25rem;
273
+ padding-right: var(--fd-space-3xs);
274
274
  }
275
275
 
276
276
  .text-prompt__char-count--warning {
@@ -279,23 +279,23 @@
279
279
 
280
280
  .text-prompt__actions {
281
281
  display: flex;
282
- gap: 0.75rem;
282
+ gap: var(--fd-space-md);
283
283
  }
284
284
 
285
285
  .text-prompt__submit {
286
286
  display: inline-flex;
287
287
  align-items: center;
288
288
  justify-content: center;
289
- gap: 0.5rem;
290
- padding: 0.625rem 1.25rem;
289
+ gap: var(--fd-space-xs);
290
+ padding: var(--fd-space-sm) var(--fd-space-2xl);
291
291
  border-radius: var(--fd-radius-lg);
292
292
  font-size: var(--fd-text-sm);
293
293
  font-weight: 600;
294
294
  font-family: inherit;
295
295
  cursor: pointer;
296
- transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
296
+ transition: all var(--fd-transition-normal);
297
297
  border: none;
298
- min-height: 2.5rem;
298
+ min-height: var(--fd-interrupt-btn-min-height);
299
299
  background: var(--fd-interrupt-btn-primary-bg);
300
300
  color: var(--fd-primary-foreground);
301
301
  box-shadow: 0 1px 3px var(--fd-interrupt-btn-primary-shadow);
@@ -315,8 +315,8 @@
315
315
  }
316
316
 
317
317
  .text-prompt__spinner {
318
- width: 1rem;
319
- height: 1rem;
318
+ width: var(--fd-interrupt-spinner-size);
319
+ height: var(--fd-interrupt-spinner-size);
320
320
  border: 2px solid var(--fd-border);
321
321
  border-top-color: currentColor;
322
322
  border-radius: 50%;
@@ -333,12 +333,12 @@
333
333
  .text-prompt__resolved-badge {
334
334
  display: inline-flex;
335
335
  align-items: center;
336
- gap: 0.375rem;
337
- padding: 0.375rem 0.75rem;
336
+ gap: var(--fd-space-2xs);
337
+ padding: var(--fd-space-2xs) var(--fd-space-md);
338
338
  background-color: var(--fd-interrupt-badge-completed-bg);
339
- border-radius: 9999px;
339
+ border-radius: var(--fd-radius-full);
340
340
  color: var(--fd-interrupt-badge-completed-text);
341
- font-size: 0.75rem;
341
+ font-size: var(--fd-text-xs);
342
342
  font-weight: 500;
343
343
  align-self: flex-start;
344
344
  }
@@ -0,0 +1,76 @@
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/GatewayNode",
8
+ tags: ["autodocs"],
9
+ parameters: {
10
+ layout: "centered",
11
+ },
12
+ });
13
+ </script>
14
+
15
+ <Story name="Default">
16
+ <NodeDecorator data={createSampleNodeData({
17
+ label: "If/Else",
18
+ config: {
19
+ textInput: "",
20
+ matchText: "",
21
+ operator: "equals",
22
+ caseSensitive: false,
23
+ branches: [
24
+ { name: "True", value: true },
25
+ { name: "False", value: false },
26
+ ],
27
+ },
28
+ metadata: {
29
+ id: "if_else",
30
+ name: "If/Else",
31
+ description: "Simple conditional logic with text input, match text, and operator",
32
+ category: "logic",
33
+ version: "1.0.0",
34
+ type: "gateway",
35
+ supportedTypes: ["gateway"],
36
+ icon: "mdi:code-braces",
37
+ color: "#8b5cf6",
38
+ inputs: [
39
+ { id: "data", name: "Input Data", type: "input", dataType: "mixed", required: false, description: "Optional input data (if not using textInput config)" },
40
+ { id: "trigger", name: "Trigger", type: "input", dataType: "trigger", required: false, description: "" },
41
+ ],
42
+ outputs: [],
43
+ },
44
+ })} />
45
+ </Story>
46
+
47
+ <Story name="Multiple Branches">
48
+ <NodeDecorator data={createSampleNodeData({
49
+ label: "Switch",
50
+ config: {
51
+ defaultBranch: "default",
52
+ caseSensitive: false,
53
+ branches: [
54
+ { name: "case_1", label: "Case 1", value: "option1" },
55
+ { name: "case_2", label: "Case 2", value: "option2" },
56
+ { name: "default", label: "Default", value: "" },
57
+ ],
58
+ },
59
+ metadata: {
60
+ id: "switch",
61
+ name: "Switch",
62
+ description: "Multi-branch routing based on configurable case values",
63
+ category: "logic",
64
+ version: "1.0.0",
65
+ type: "gateway",
66
+ supportedTypes: ["gateway"],
67
+ icon: "mdi:source-branch-sync",
68
+ color: "#8b5cf6",
69
+ inputs: [
70
+ { id: "value", name: "Value", type: "input", dataType: "string", required: true, description: "The value to match against branch cases" },
71
+ { id: "trigger", name: "Trigger", type: "input", dataType: "trigger", required: false, description: "" },
72
+ ],
73
+ outputs: [],
74
+ },
75
+ })} />
76
+ </Story>
@@ -0,0 +1,26 @@
1
+ export default GatewayNode;
2
+ type GatewayNode = SvelteComponent<{
3
+ [x: string]: never;
4
+ }, {
5
+ [evt: string]: CustomEvent<any>;
6
+ }, {}> & {
7
+ $$bindings?: string | undefined;
8
+ };
9
+ declare const GatewayNode: $$__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
+ }
@@ -18,7 +18,7 @@
18
18
  getCategoryColorToken,
19
19
  getPortBackgroundColor
20
20
  } from '../../utils/colors.js';
21
- import { connectedHandles } from '../../stores/workflowStore.js';
21
+ import { getConnectedHandles } from '../../stores/workflowStore.svelte.js';
22
22
 
23
23
  interface Props {
24
24
  data: WorkflowNode['data'] & {
@@ -75,7 +75,7 @@
75
75
 
76
76
  // Check if port is connected
77
77
  const handleId = `${props.data.nodeId}-${type}-${port.id}`;
78
- return $connectedHandles.has(handleId);
78
+ return getConnectedHandles().has(handleId);
79
79
  }
80
80
 
81
81
  /**
@@ -98,12 +98,14 @@
98
98
 
99
99
  // Check if branch output is connected
100
100
  const handleId = `${props.data.nodeId}-output-${branchName}`;
101
- return $connectedHandles.has(handleId);
101
+ return getConnectedHandles().has(handleId);
102
102
  }
103
103
 
104
104
  // Gateway-specific data - branches are calculated at runtime from config
105
105
  let branches = $derived((props.data.config?.branches as Branch[]) || []);
106
- let activeBranches = $derived((props.data.executionInfo as any)?.output?.active_branches || []);
106
+ let activeBranches = $derived(
107
+ (props.data.executionInfo?.output?.active_branches as string[]) || []
108
+ );
107
109
 
108
110
  /**
109
111
  * Derived list of visible branches based on hideUnconnectedHandles setting
@@ -200,7 +202,7 @@
200
202
  position={Position.Left}
201
203
  id={`${props.data.nodeId}-input-${port.id}`}
202
204
  class="flowdrop-workflow-node__handle"
203
- style="top: 50%; transform: translateY(-50%); left: calc(-1 * (var(--fd-handle-size) / 2)); --fd-handle-fill: {getDataTypeColorToken(
205
+ style="top: 50%; transform: translateY(-50%); --fd-handle-fill: {getDataTypeColorToken(
204
206
  port.dataType
205
207
  )}; --fd-handle-border-color: var(--fd-handle-border);"
206
208
  role="button"
@@ -286,7 +288,7 @@
286
288
  position={Position.Right}
287
289
  id={`${props.data.nodeId}-output-${branch.name}`}
288
290
  class={`flowdrop-workflow-node__handle ${isActive ? 'flowdrop-workflow-node__handle--active' : ''}`}
289
- style="top: 50%; transform: translateY(-50%); right: calc(-1 * (var(--fd-handle-size) / 2)); --fd-handle-fill: {isActive
291
+ style="top: 50%; transform: translateY(-50%); --fd-handle-fill: {isActive
290
292
  ? getDataTypeColorToken('trigger')
291
293
  : getDataTypeColorToken(
292
294
  'trigger'
@@ -363,7 +365,7 @@
363
365
 
364
366
  .flowdrop-workflow-node__header {
365
367
  box-sizing: border-box;
366
- padding: var(--fd-node-header-gap) var(--fd-space-4);
368
+ padding: var(--fd-node-header-gap) var(--fd-space-xl);
367
369
  border-bottom: 1px solid var(--fd-border-muted);
368
370
  background: var(--fd-header);
369
371
  border-top-left-radius: var(--fd-radius-xl);
@@ -380,7 +382,7 @@
380
382
  .flowdrop-workflow-node__header-title {
381
383
  display: flex;
382
384
  align-items: center;
383
- gap: var(--fd-space-3);
385
+ gap: var(--fd-space-md);
384
386
  min-height: var(--fd-node-header-title-height);
385
387
  flex-shrink: 0;
386
388
  }
@@ -449,16 +451,16 @@
449
451
  align-items: center;
450
452
  gap: 0;
451
453
  min-height: var(--fd-node-port-row-height);
452
- padding: var(--fd-space-1) 0;
454
+ padding: var(--fd-space-3xs) 0;
453
455
  position: relative;
454
456
  }
455
457
 
456
458
  .flowdrop-workflow-node__port-content {
457
- padding: 0 var(--fd-space-4);
459
+ padding: 0 var(--fd-space-xl);
458
460
  }
459
461
 
460
462
  .flowdrop-badge {
461
- padding: 0.125rem var(--fd-space-1);
463
+ padding: 0.125rem var(--fd-space-3xs);
462
464
  border-radius: var(--fd-radius-sm);
463
465
  font-size: 0.625rem;
464
466
  font-weight: 500;
@@ -473,14 +475,14 @@
473
475
 
474
476
  .flowdrop-badge--sm {
475
477
  font-size: 0.625rem;
476
- padding: 0.125rem var(--fd-space-1);
478
+ padding: 0.125rem var(--fd-space-3xs);
477
479
  }
478
480
 
479
481
  .workflow-node__no-branches {
480
482
  display: flex;
481
483
  align-items: center;
482
- gap: var(--fd-space-2);
483
- padding: var(--fd-space-3);
484
+ gap: var(--fd-space-xs);
485
+ padding: var(--fd-space-md);
484
486
  background: var(--fd-warning-muted);
485
487
  border: 1px solid var(--fd-warning);
486
488
  border-radius: var(--fd-radius-lg);
@@ -508,7 +510,7 @@
508
510
  }
509
511
 
510
512
  .flowdrop-gap--2 {
511
- gap: var(--fd-space-2);
513
+ gap: var(--fd-space-xs);
512
514
  }
513
515
 
514
516
  .flowdrop-items--center {
@@ -558,8 +560,8 @@
558
560
 
559
561
  .flowdrop-workflow-node__config-btn {
560
562
  position: absolute;
561
- top: var(--fd-space-2);
562
- right: var(--fd-space-2);
563
+ top: var(--fd-space-xs);
564
+ right: var(--fd-space-xs);
563
565
  width: 1.5rem;
564
566
  height: 1.5rem;
565
567
  background-color: var(--fd-backdrop);
@@ -0,0 +1,48 @@
1
+ <script module>
2
+ import { defineMeta } from "@storybook/addon-svelte-csf";
3
+ import NodeDecorator from "../../stories/NodeDecorator.svelte";
4
+
5
+ const { Story } = defineMeta({
6
+ title: "Nodes/IdeaNode",
7
+ tags: ["autodocs"],
8
+ parameters: {
9
+ layout: "centered",
10
+ },
11
+ });
12
+ </script>
13
+
14
+ <Story name="Default">
15
+ <NodeDecorator data={{
16
+ label: "Idea",
17
+ config: {},
18
+ metadata: {
19
+ id: "idea",
20
+ name: "Idea",
21
+ description: "Planning node",
22
+ category: "helpers",
23
+ version: "1.0.0",
24
+ type: "idea",
25
+ inputs: [],
26
+ outputs: [],
27
+ },
28
+ }} />
29
+ </Story>
30
+
31
+ <Story name="With Content">
32
+ <NodeDecorator data={{
33
+ label: "Feature Idea",
34
+ config: {
35
+ content: "Add batch processing support to handle multiple items in parallel.",
36
+ },
37
+ metadata: {
38
+ id: "idea",
39
+ name: "Idea",
40
+ description: "Planning node",
41
+ category: "helpers",
42
+ version: "1.0.0",
43
+ type: "idea",
44
+ inputs: [],
45
+ outputs: [],
46
+ },
47
+ }} />
48
+ </Story>
@@ -0,0 +1,26 @@
1
+ export default IdeaNode;
2
+ type IdeaNode = SvelteComponent<{
3
+ [x: string]: never;
4
+ }, {
5
+ [evt: string]: CustomEvent<any>;
6
+ }, {}> & {
7
+ $$bindings?: string | undefined;
8
+ };
9
+ declare const IdeaNode: $$__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
+ }
@@ -151,7 +151,7 @@
151
151
  position={Position.Left}
152
152
  style="--fd-handle-fill: {getDataTypeColor(
153
153
  IDEA_DATA_TYPE
154
- )}; --fd-handle-border-color: var(--fd-handle-border); top: 40px; transform: translateY(-50%); margin-left: -10px; z-index: 30;"
154
+ )}; --fd-handle-border-color: var(--fd-handle-border); top: 40px; transform: translateY(-50%); z-index: 30;"
155
155
  id={`${props.data.nodeId}-input-left`}
156
156
  />
157
157
  {/if}
@@ -163,7 +163,7 @@
163
163
  position={Position.Top}
164
164
  style="--fd-handle-fill: {getDataTypeColor(
165
165
  IDEA_DATA_TYPE
166
- )}; --fd-handle-border-color: var(--fd-handle-border); left: 150px; transform: translateX(-50%); margin-top: -10px; z-index: 30;"
166
+ )}; --fd-handle-border-color: var(--fd-handle-border); left: 150px; transform: translateX(-50%); z-index: 30;"
167
167
  id={`${props.data.nodeId}-input-top`}
168
168
  />
169
169
  {/if}
@@ -215,7 +215,7 @@
215
215
  position={Position.Right}
216
216
  style="--fd-handle-fill: {getDataTypeColor(
217
217
  IDEA_DATA_TYPE
218
- )}; --fd-handle-border-color: var(--fd-handle-border); top: 40px; transform: translateY(-50%); margin-right: -10px; z-index: 30;"
218
+ )}; --fd-handle-border-color: var(--fd-handle-border); top: 40px; transform: translateY(-50%); z-index: 30;"
219
219
  id={`${props.data.nodeId}-output-right`}
220
220
  />
221
221
  {/if}
@@ -227,7 +227,7 @@
227
227
  position={Position.Bottom}
228
228
  style="--fd-handle-fill: {getDataTypeColor(
229
229
  IDEA_DATA_TYPE
230
- )}; --fd-handle-border-color: var(--fd-handle-border); left: 150px; transform: translateX(-50%); margin-bottom: -10px; z-index: 30;"
230
+ )}; --fd-handle-border-color: var(--fd-handle-border); left: 150px; transform: translateX(-50%); z-index: 30;"
231
231
  id={`${props.data.nodeId}-output-bottom`}
232
232
  />
233
233
  {/if}
@@ -286,7 +286,7 @@
286
286
  display: flex;
287
287
  align-items: center;
288
288
  gap: 0.625rem;
289
- padding: var(--fd-space-3) var(--fd-space-4) var(--fd-space-2);
289
+ padding: var(--fd-space-md) var(--fd-space-xl) var(--fd-space-xs);
290
290
  }
291
291
 
292
292
  .flowdrop-idea-node__icon-wrapper {
@@ -323,7 +323,7 @@
323
323
 
324
324
  /* Body section */
325
325
  .flowdrop-idea-node__body {
326
- padding: 0 var(--fd-space-4) var(--fd-space-3);
326
+ padding: 0 var(--fd-space-xl) var(--fd-space-md);
327
327
  }
328
328
 
329
329
  .flowdrop-idea-node__description {
@@ -342,8 +342,8 @@
342
342
  .flowdrop-idea-node__processing {
343
343
  display: flex;
344
344
  align-items: center;
345
- gap: var(--fd-space-2);
346
- padding: var(--fd-space-2) var(--fd-space-4);
345
+ gap: var(--fd-space-xs);
346
+ padding: var(--fd-space-xs) var(--fd-space-xl);
347
347
  font-size: var(--fd-text-xs);
348
348
  color: var(--fd-muted-foreground);
349
349
  border-top: 1px solid var(--fd-border-muted);
@@ -362,8 +362,8 @@
362
362
  .flowdrop-idea-node__error {
363
363
  display: flex;
364
364
  align-items: center;
365
- gap: var(--fd-space-2);
366
- padding: var(--fd-space-2) var(--fd-space-4);
365
+ gap: var(--fd-space-xs);
366
+ padding: var(--fd-space-xs) var(--fd-space-xl);
367
367
  font-size: var(--fd-text-xs);
368
368
  color: var(--fd-error);
369
369
  border-top: 1px solid color-mix(in srgb, var(--fd-error) 30%, transparent);
@@ -420,22 +420,6 @@
420
420
  pointer-events: auto !important;
421
421
  }
422
422
 
423
- :global(.flowdrop-idea-node .svelte-flow__handle-left) {
424
- left: -10px !important;
425
- }
426
-
427
- :global(.flowdrop-idea-node .svelte-flow__handle-right) {
428
- right: -10px !important;
429
- }
430
-
431
- :global(.flowdrop-idea-node .svelte-flow__handle-top) {
432
- top: -10px !important;
433
- }
434
-
435
- :global(.flowdrop-idea-node .svelte-flow__handle-bottom) {
436
- bottom: -10px !important;
437
- }
438
-
439
423
  :global(.flowdrop-idea-node .svelte-flow__handle-left:hover),
440
424
  :global(.flowdrop-idea-node .svelte-flow__handle-right:hover) {
441
425
  transform: translateY(-50%) scale(1.2) !important;
@@ -0,0 +1,69 @@
1
+ <script module>
2
+ import { defineMeta } from "@storybook/addon-svelte-csf";
3
+ import NodeDecorator from "../../stories/NodeDecorator.svelte";
4
+
5
+ const { Story } = defineMeta({
6
+ title: "Nodes/NotesNode",
7
+ tags: ["autodocs"],
8
+ parameters: {
9
+ layout: "centered",
10
+ },
11
+ });
12
+ </script>
13
+
14
+ <Story name="Default">
15
+ <NodeDecorator data={{
16
+ label: "Notes",
17
+ config: {},
18
+ metadata: {
19
+ id: "notes",
20
+ name: "Notes",
21
+ description: "Documentation node",
22
+ category: "helpers",
23
+ version: "1.0.0",
24
+ type: "note",
25
+ inputs: [],
26
+ outputs: [],
27
+ },
28
+ }} />
29
+ </Story>
30
+
31
+ <Story name="With Content">
32
+ <NodeDecorator data={{
33
+ label: "Notes",
34
+ config: {
35
+ content: "## Important\n\nThis workflow handles **user onboarding**.\n\n- Step 1: Validate email\n- Step 2: Create account\n- Step 3: Send welcome email",
36
+ noteType: "info",
37
+ },
38
+ metadata: {
39
+ id: "notes",
40
+ name: "Notes",
41
+ description: "Documentation node",
42
+ category: "helpers",
43
+ version: "1.0.0",
44
+ type: "note",
45
+ inputs: [],
46
+ outputs: [],
47
+ },
48
+ }} />
49
+ </Story>
50
+
51
+ <Story name="Warning">
52
+ <NodeDecorator data={{
53
+ label: "Warning",
54
+ config: {
55
+ content: "Rate limiting is applied to this API call. Max 100 requests/minute.",
56
+ noteType: "warning",
57
+ },
58
+ metadata: {
59
+ id: "notes",
60
+ name: "Notes",
61
+ description: "Documentation node",
62
+ category: "helpers",
63
+ version: "1.0.0",
64
+ type: "note",
65
+ inputs: [],
66
+ outputs: [],
67
+ },
68
+ }} />
69
+ </Story>