@flowdrop/flowdrop 1.0.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (388) hide show
  1. package/README.md +50 -50
  2. package/dist/adapters/WorkflowAdapter.d.ts +1 -1
  3. package/dist/adapters/WorkflowAdapter.js +25 -25
  4. package/dist/adapters/agentspec/AgentSpecAdapter.d.ts +2 -2
  5. package/dist/adapters/agentspec/AgentSpecAdapter.js +133 -122
  6. package/dist/adapters/agentspec/agentAdapter.d.ts +2 -2
  7. package/dist/adapters/agentspec/agentAdapter.js +10 -10
  8. package/dist/adapters/agentspec/autoLayout.d.ts +1 -1
  9. package/dist/adapters/agentspec/autoLayout.js +2 -2
  10. package/dist/adapters/agentspec/componentTypeDefaults.d.ts +1 -1
  11. package/dist/adapters/agentspec/componentTypeDefaults.js +120 -120
  12. package/dist/adapters/agentspec/defaultNodeTypes.d.ts +2 -2
  13. package/dist/adapters/agentspec/defaultNodeTypes.js +307 -307
  14. package/dist/adapters/agentspec/index.d.ts +10 -10
  15. package/dist/adapters/agentspec/index.js +6 -6
  16. package/dist/adapters/agentspec/validator.d.ts +2 -2
  17. package/dist/adapters/agentspec/validator.js +22 -20
  18. package/dist/api/enhanced-client.d.ts +3 -3
  19. package/dist/api/enhanced-client.js +73 -72
  20. package/dist/components/App.svelte +1081 -961
  21. package/dist/components/App.svelte.d.ts +9 -6
  22. package/dist/components/CanvasBanner.stories.svelte +23 -20
  23. package/dist/components/CanvasBanner.stories.svelte.d.ts +1 -1
  24. package/dist/components/CanvasBanner.svelte +46 -46
  25. package/dist/components/ConfigForm.svelte +1164 -1065
  26. package/dist/components/ConfigForm.svelte.d.ts +2 -2
  27. package/dist/components/ConfigModal.svelte +180 -180
  28. package/dist/components/ConfigModal.svelte.d.ts +1 -1
  29. package/dist/components/ConfigPanel.stories.svelte +35 -35
  30. package/dist/components/ConfigPanel.stories.svelte.d.ts +1 -1
  31. package/dist/components/ConfigPanel.svelte +178 -167
  32. package/dist/components/ConfigPanel.svelte.d.ts +1 -1
  33. package/dist/components/ConnectionLine.svelte +25 -25
  34. package/dist/components/EdgeRefresher.svelte +26 -26
  35. package/dist/components/FlowDropEdge.stories.svelte +197 -0
  36. package/dist/components/FlowDropEdge.stories.svelte.d.ts +26 -0
  37. package/dist/components/FlowDropEdge.svelte +168 -0
  38. package/dist/components/FlowDropEdge.svelte.d.ts +4 -0
  39. package/dist/components/FlowDropZone.svelte +63 -60
  40. package/dist/components/FlowDropZone.svelte.d.ts +1 -1
  41. package/dist/components/LoadingSpinner.stories.svelte +19 -19
  42. package/dist/components/LoadingSpinner.stories.svelte.d.ts +1 -1
  43. package/dist/components/LoadingSpinner.svelte +21 -21
  44. package/dist/components/LoadingSpinner.svelte.d.ts +1 -1
  45. package/dist/components/Logo.stories.svelte +13 -13
  46. package/dist/components/Logo.stories.svelte.d.ts +1 -1
  47. package/dist/components/Logo.svelte +101 -95
  48. package/dist/components/LogsSidebar.svelte +553 -546
  49. package/dist/components/LogsSidebar.svelte.d.ts +1 -1
  50. package/dist/components/MarkdownDisplay.stories.svelte +29 -23
  51. package/dist/components/MarkdownDisplay.stories.svelte.d.ts +1 -1
  52. package/dist/components/MarkdownDisplay.svelte +16 -14
  53. package/dist/components/Navbar.stories.svelte +43 -38
  54. package/dist/components/Navbar.stories.svelte.d.ts +1 -1
  55. package/dist/components/Navbar.svelte +760 -706
  56. package/dist/components/Navbar.svelte.d.ts +1 -1
  57. package/dist/components/NodeSidebar.svelte +900 -746
  58. package/dist/components/NodeSidebar.svelte.d.ts +3 -1
  59. package/dist/components/NodeStatusOverlay.stories.svelte +82 -70
  60. package/dist/components/NodeStatusOverlay.stories.svelte.d.ts +1 -1
  61. package/dist/components/NodeStatusOverlay.svelte +295 -280
  62. package/dist/components/NodeStatusOverlay.svelte.d.ts +3 -3
  63. package/dist/components/PipelineStatus.svelte +326 -300
  64. package/dist/components/PipelineStatus.svelte.d.ts +4 -4
  65. package/dist/components/PortCoordinateTracker.svelte +49 -47
  66. package/dist/components/PortCoordinateTracker.svelte.d.ts +1 -1
  67. package/dist/components/ReadOnlyDetails.svelte +156 -156
  68. package/dist/components/SchemaForm.stories.svelte +106 -98
  69. package/dist/components/SchemaForm.stories.svelte.d.ts +1 -1
  70. package/dist/components/SchemaForm.svelte +490 -463
  71. package/dist/components/SchemaForm.svelte.d.ts +2 -2
  72. package/dist/components/SettingsModal.svelte +226 -223
  73. package/dist/components/SettingsModal.svelte.d.ts +1 -1
  74. package/dist/components/SettingsPanel.svelte +637 -601
  75. package/dist/components/SettingsPanel.svelte.d.ts +1 -1
  76. package/dist/components/StatusIcon.stories.svelte +62 -49
  77. package/dist/components/StatusIcon.stories.svelte.d.ts +1 -1
  78. package/dist/components/StatusIcon.svelte +87 -87
  79. package/dist/components/StatusIcon.svelte.d.ts +2 -2
  80. package/dist/components/StatusLabel.stories.svelte +12 -12
  81. package/dist/components/StatusLabel.stories.svelte.d.ts +1 -1
  82. package/dist/components/StatusLabel.svelte +19 -19
  83. package/dist/components/ThemeToggle.stories.svelte +16 -16
  84. package/dist/components/ThemeToggle.stories.svelte.d.ts +1 -1
  85. package/dist/components/ThemeToggle.svelte +180 -169
  86. package/dist/components/ThemeToggle.svelte.d.ts +1 -1
  87. package/dist/components/UniversalNode.svelte +150 -138
  88. package/dist/components/UniversalNode.svelte.d.ts +3 -3
  89. package/dist/components/WorkflowEditor.svelte +1069 -1007
  90. package/dist/components/WorkflowEditor.svelte.d.ts +4 -4
  91. package/dist/components/form/FormArray.svelte +1034 -973
  92. package/dist/components/form/FormArray.svelte.d.ts +1 -1
  93. package/dist/components/form/FormAutocomplete.svelte +1021 -978
  94. package/dist/components/form/FormAutocomplete.svelte.d.ts +1 -1
  95. package/dist/components/form/FormCheckboxGroup.stories.svelte +23 -20
  96. package/dist/components/form/FormCheckboxGroup.stories.svelte.d.ts +1 -1
  97. package/dist/components/form/FormCheckboxGroup.svelte +136 -136
  98. package/dist/components/form/FormCodeEditor.svelte +452 -434
  99. package/dist/components/form/FormField.svelte +366 -355
  100. package/dist/components/form/FormField.svelte.d.ts +2 -2
  101. package/dist/components/form/FormFieldLight.svelte +400 -384
  102. package/dist/components/form/FormFieldLight.svelte.d.ts +1 -1
  103. package/dist/components/form/FormFieldWrapper.stories.svelte +42 -42
  104. package/dist/components/form/FormFieldWrapper.stories.svelte.d.ts +1 -1
  105. package/dist/components/form/FormFieldWrapper.svelte +100 -93
  106. package/dist/components/form/FormFieldWrapper.svelte.d.ts +1 -1
  107. package/dist/components/form/FormFieldset.svelte +108 -108
  108. package/dist/components/form/FormFieldset.svelte.d.ts +2 -2
  109. package/dist/components/form/FormMarkdownEditor.svelte +758 -725
  110. package/dist/components/form/FormNumberField.stories.svelte +25 -25
  111. package/dist/components/form/FormNumberField.stories.svelte.d.ts +1 -1
  112. package/dist/components/form/FormNumberField.svelte +88 -88
  113. package/dist/components/form/FormRangeField.stories.svelte +20 -20
  114. package/dist/components/form/FormRangeField.stories.svelte.d.ts +1 -1
  115. package/dist/components/form/FormRangeField.svelte +234 -226
  116. package/dist/components/form/FormSelect.stories.svelte +38 -38
  117. package/dist/components/form/FormSelect.stories.svelte.d.ts +1 -1
  118. package/dist/components/form/FormSelect.svelte +101 -101
  119. package/dist/components/form/FormSelect.svelte.d.ts +1 -1
  120. package/dist/components/form/FormTemplateEditor.svelte +847 -798
  121. package/dist/components/form/FormTemplateEditor.svelte.d.ts +1 -1
  122. package/dist/components/form/FormTextField.stories.svelte +29 -23
  123. package/dist/components/form/FormTextField.stories.svelte.d.ts +1 -1
  124. package/dist/components/form/FormTextField.svelte +68 -68
  125. package/dist/components/form/FormTextarea.stories.svelte +28 -25
  126. package/dist/components/form/FormTextarea.stories.svelte.d.ts +1 -1
  127. package/dist/components/form/FormTextarea.svelte +74 -74
  128. package/dist/components/form/FormToggle.stories.svelte +23 -20
  129. package/dist/components/form/FormToggle.stories.svelte.d.ts +1 -1
  130. package/dist/components/form/FormToggle.svelte +98 -98
  131. package/dist/components/form/FormUISchemaRenderer.svelte +120 -113
  132. package/dist/components/form/FormUISchemaRenderer.svelte.d.ts +3 -3
  133. package/dist/components/form/index.d.ts +19 -19
  134. package/dist/components/form/index.js +18 -18
  135. package/dist/components/form/templateAutocomplete.d.ts +2 -2
  136. package/dist/components/form/templateAutocomplete.js +64 -55
  137. package/dist/components/form/types.d.ts +6 -6
  138. package/dist/components/form/types.js +9 -4
  139. package/dist/components/icons/AlertCircleIcon.svelte +11 -0
  140. package/dist/components/icons/AlertCircleIcon.svelte.d.ts +26 -0
  141. package/dist/components/icons/CogIcon.svelte +11 -0
  142. package/dist/components/icons/CogIcon.svelte.d.ts +26 -0
  143. package/dist/components/interrupt/ChoicePrompt.stories.svelte +54 -38
  144. package/dist/components/interrupt/ChoicePrompt.stories.svelte.d.ts +1 -1
  145. package/dist/components/interrupt/ChoicePrompt.svelte +407 -383
  146. package/dist/components/interrupt/ChoicePrompt.svelte.d.ts +1 -1
  147. package/dist/components/interrupt/ConfirmationPrompt.stories.svelte +48 -48
  148. package/dist/components/interrupt/ConfirmationPrompt.stories.svelte.d.ts +1 -1
  149. package/dist/components/interrupt/ConfirmationPrompt.svelte +280 -274
  150. package/dist/components/interrupt/ConfirmationPrompt.svelte.d.ts +1 -1
  151. package/dist/components/interrupt/FormPrompt.svelte +223 -218
  152. package/dist/components/interrupt/FormPrompt.svelte.d.ts +1 -1
  153. package/dist/components/interrupt/InterruptBubble.svelte +617 -583
  154. package/dist/components/interrupt/InterruptBubble.svelte.d.ts +2 -2
  155. package/dist/components/interrupt/ReviewPrompt.stories.svelte +66 -56
  156. package/dist/components/interrupt/ReviewPrompt.stories.svelte.d.ts +1 -1
  157. package/dist/components/interrupt/ReviewPrompt.svelte +861 -841
  158. package/dist/components/interrupt/ReviewPrompt.svelte.d.ts +1 -1
  159. package/dist/components/interrupt/TextInputPrompt.stories.svelte +38 -33
  160. package/dist/components/interrupt/TextInputPrompt.stories.svelte.d.ts +1 -1
  161. package/dist/components/interrupt/TextInputPrompt.svelte +333 -328
  162. package/dist/components/interrupt/TextInputPrompt.svelte.d.ts +1 -1
  163. package/dist/components/interrupt/index.d.ts +5 -5
  164. package/dist/components/interrupt/index.js +5 -5
  165. package/dist/components/layouts/MainLayout.svelte +724 -691
  166. package/dist/components/layouts/MainLayout.svelte.d.ts +6 -6
  167. package/dist/components/nodes/GatewayNode.stories.svelte +100 -99
  168. package/dist/components/nodes/GatewayNode.svelte +605 -571
  169. package/dist/components/nodes/GatewayNode.svelte.d.ts +3 -3
  170. package/dist/components/nodes/IdeaNode.stories.svelte +44 -43
  171. package/dist/components/nodes/IdeaNode.svelte +451 -437
  172. package/dist/components/nodes/IdeaNode.svelte.d.ts +1 -1
  173. package/dist/components/nodes/NotesNode.stories.svelte +65 -64
  174. package/dist/components/nodes/NotesNode.svelte +380 -369
  175. package/dist/components/nodes/NotesNode.svelte.d.ts +1 -1
  176. package/dist/components/nodes/SimpleNode.stories.svelte +145 -144
  177. package/dist/components/nodes/SimpleNode.svelte +486 -424
  178. package/dist/components/nodes/SimpleNode.svelte.d.ts +1 -1
  179. package/dist/components/nodes/SquareNode.stories.svelte +73 -73
  180. package/dist/components/nodes/SquareNode.svelte +439 -380
  181. package/dist/components/nodes/SquareNode.svelte.d.ts +1 -1
  182. package/dist/components/nodes/TerminalNode.stories.svelte +13 -13
  183. package/dist/components/nodes/TerminalNode.svelte +709 -670
  184. package/dist/components/nodes/TerminalNode.svelte.d.ts +1 -1
  185. package/dist/components/nodes/ToolNode.stories.svelte +181 -180
  186. package/dist/components/nodes/ToolNode.svelte +505 -447
  187. package/dist/components/nodes/ToolNode.svelte.d.ts +1 -1
  188. package/dist/components/nodes/WorkflowNode.stories.svelte +70 -46
  189. package/dist/components/nodes/WorkflowNode.svelte +621 -551
  190. package/dist/components/nodes/WorkflowNode.svelte.d.ts +3 -3
  191. package/dist/components/playground/ChatPanel.svelte +945 -889
  192. package/dist/components/playground/ExecutionLogs.svelte +495 -472
  193. package/dist/components/playground/InputCollector.svelte +449 -428
  194. package/dist/components/playground/MessageBubble.stories.svelte +47 -47
  195. package/dist/components/playground/MessageBubble.stories.svelte.d.ts +1 -1
  196. package/dist/components/playground/MessageBubble.svelte +626 -610
  197. package/dist/components/playground/MessageBubble.svelte.d.ts +1 -1
  198. package/dist/components/playground/Playground.svelte +1088 -1057
  199. package/dist/components/playground/Playground.svelte.d.ts +3 -3
  200. package/dist/components/playground/PlaygroundModal.svelte +208 -204
  201. package/dist/components/playground/PlaygroundModal.svelte.d.ts +3 -3
  202. package/dist/components/playground/SessionManager.svelte +527 -521
  203. package/dist/components/playground/SessionManager.svelte.d.ts +1 -1
  204. package/dist/config/agentSpecEndpoints.d.ts +1 -1
  205. package/dist/config/agentSpecEndpoints.js +20 -20
  206. package/dist/config/constants.d.ts +8 -0
  207. package/dist/config/constants.js +10 -2
  208. package/dist/config/defaultCategories.d.ts +1 -1
  209. package/dist/config/defaultCategories.js +86 -86
  210. package/dist/config/defaultPortConfig.d.ts +1 -1
  211. package/dist/config/defaultPortConfig.js +144 -144
  212. package/dist/config/endpoints.d.ts +4 -4
  213. package/dist/config/endpoints.js +65 -65
  214. package/dist/config/runtimeConfig.d.ts +2 -2
  215. package/dist/config/runtimeConfig.js +8 -8
  216. package/dist/core/index.d.ts +63 -59
  217. package/dist/core/index.js +35 -33
  218. package/dist/display/index.d.ts +2 -2
  219. package/dist/display/index.js +2 -2
  220. package/dist/editor/index.d.ts +62 -62
  221. package/dist/editor/index.js +53 -53
  222. package/dist/form/code.d.ts +5 -5
  223. package/dist/form/code.js +14 -14
  224. package/dist/form/fieldRegistry.d.ts +3 -3
  225. package/dist/form/fieldRegistry.js +11 -9
  226. package/dist/form/full.d.ts +8 -8
  227. package/dist/form/full.js +9 -9
  228. package/dist/form/index.d.ts +18 -18
  229. package/dist/form/index.js +16 -16
  230. package/dist/form/markdown.d.ts +4 -4
  231. package/dist/form/markdown.js +8 -8
  232. package/dist/helpers/proximityConnect.d.ts +3 -3
  233. package/dist/helpers/proximityConnect.js +34 -32
  234. package/dist/helpers/workflowEditorHelper.d.ts +5 -5
  235. package/dist/helpers/workflowEditorHelper.js +108 -96
  236. package/dist/index.d.ts +6 -6
  237. package/dist/index.js +6 -6
  238. package/dist/mocks/app-environment.js +2 -2
  239. package/dist/mocks/app-forms.js +9 -9
  240. package/dist/mocks/app-navigation.js +11 -11
  241. package/dist/mocks/app-stores.js +8 -8
  242. package/dist/playground/index.d.ts +19 -19
  243. package/dist/playground/index.js +16 -16
  244. package/dist/playground/mount.d.ts +3 -3
  245. package/dist/playground/mount.js +24 -24
  246. package/dist/registry/builtinFormats.js +13 -13
  247. package/dist/registry/builtinNodes.d.ts +2 -2
  248. package/dist/registry/builtinNodes.js +77 -77
  249. package/dist/registry/index.d.ts +4 -4
  250. package/dist/registry/index.js +4 -4
  251. package/dist/registry/nodeComponentRegistry.d.ts +8 -8
  252. package/dist/registry/nodeComponentRegistry.js +11 -9
  253. package/dist/registry/plugin.d.ts +2 -2
  254. package/dist/registry/plugin.js +11 -11
  255. package/dist/registry/workflowFormatRegistry.d.ts +3 -3
  256. package/dist/registry/workflowFormatRegistry.js +2 -2
  257. package/dist/schema/index.d.ts +1 -1
  258. package/dist/schema/index.js +2 -2
  259. package/dist/schemas/v1/workflow.schema.json +22 -107
  260. package/dist/services/agentSpecExecutionService.d.ts +3 -3
  261. package/dist/services/agentSpecExecutionService.js +59 -55
  262. package/dist/services/api.d.ts +18 -4
  263. package/dist/services/api.js +46 -43
  264. package/dist/services/apiVariableService.d.ts +1 -1
  265. package/dist/services/apiVariableService.js +41 -34
  266. package/dist/services/autoSaveService.js +8 -8
  267. package/dist/services/categoriesApi.d.ts +2 -2
  268. package/dist/services/categoriesApi.js +8 -8
  269. package/dist/services/draftStorage.d.ts +1 -1
  270. package/dist/services/draftStorage.js +11 -11
  271. package/dist/services/dynamicSchemaService.d.ts +1 -1
  272. package/dist/services/dynamicSchemaService.js +41 -39
  273. package/dist/services/globalSave.d.ts +2 -2
  274. package/dist/services/globalSave.js +53 -42
  275. package/dist/services/historyService.d.ts +1 -1
  276. package/dist/services/historyService.js +8 -8
  277. package/dist/services/interruptService.d.ts +1 -1
  278. package/dist/services/interruptService.js +35 -29
  279. package/dist/services/nodeExecutionService.d.ts +1 -1
  280. package/dist/services/nodeExecutionService.js +45 -44
  281. package/dist/services/playgroundService.d.ts +1 -1
  282. package/dist/services/playgroundService.js +29 -29
  283. package/dist/services/portConfigApi.d.ts +2 -2
  284. package/dist/services/portConfigApi.js +8 -8
  285. package/dist/services/settingsService.d.ts +2 -2
  286. package/dist/services/settingsService.js +25 -19
  287. package/dist/services/toastService.d.ts +4 -4
  288. package/dist/services/toastService.js +33 -33
  289. package/dist/services/variableService.d.ts +1 -1
  290. package/dist/services/variableService.js +36 -36
  291. package/dist/services/workflowStorage.d.ts +2 -2
  292. package/dist/services/workflowStorage.js +13 -13
  293. package/dist/settings/index.d.ts +7 -7
  294. package/dist/settings/index.js +6 -6
  295. package/dist/skins/default.d.ts +2 -0
  296. package/dist/skins/default.js +1 -0
  297. package/dist/skins/index.d.ts +13 -0
  298. package/dist/skins/index.js +30 -0
  299. package/dist/skins/slate.d.ts +2 -0
  300. package/dist/skins/slate.js +78 -0
  301. package/dist/stores/categoriesStore.svelte.d.ts +1 -1
  302. package/dist/stores/categoriesStore.svelte.js +5 -5
  303. package/dist/stores/editorStateMachine.svelte.d.ts +2 -2
  304. package/dist/stores/editorStateMachine.svelte.js +65 -33
  305. package/dist/stores/historyStore.svelte.d.ts +4 -4
  306. package/dist/stores/historyStore.svelte.js +4 -4
  307. package/dist/stores/interruptStore.svelte.d.ts +3 -3
  308. package/dist/stores/interruptStore.svelte.js +21 -21
  309. package/dist/stores/playgroundStore.svelte.d.ts +2 -2
  310. package/dist/stores/playgroundStore.svelte.js +25 -18
  311. package/dist/stores/portCoordinateStore.svelte.d.ts +2 -2
  312. package/dist/stores/portCoordinateStore.svelte.js +15 -8
  313. package/dist/stores/settingsStore.svelte.d.ts +2 -2
  314. package/dist/stores/settingsStore.svelte.js +62 -57
  315. package/dist/stores/workflowStore.svelte.d.ts +3 -3
  316. package/dist/stores/workflowStore.svelte.js +50 -47
  317. package/dist/stories/CanvasDecorator.svelte +35 -32
  318. package/dist/stories/CanvasDecorator.svelte.d.ts +2 -2
  319. package/dist/stories/EdgeDecorator.svelte +125 -0
  320. package/dist/stories/EdgeDecorator.svelte.d.ts +17 -0
  321. package/dist/stories/NodeDecorator.svelte +59 -53
  322. package/dist/stories/NodeDecorator.svelte.d.ts +1 -1
  323. package/dist/stories/utils.d.ts +2 -2
  324. package/dist/stories/utils.js +105 -67
  325. package/dist/styles/base.css +599 -595
  326. package/dist/styles/toast.css +14 -14
  327. package/dist/styles/tokens.css +409 -378
  328. package/dist/svelte-app.d.ts +9 -9
  329. package/dist/svelte-app.js +39 -39
  330. package/dist/themes/default.d.ts +2 -0
  331. package/dist/themes/default.js +9 -0
  332. package/dist/themes/index.d.ts +13 -0
  333. package/dist/themes/index.js +44 -0
  334. package/dist/themes/minimal.d.ts +2 -0
  335. package/dist/themes/minimal.js +11 -0
  336. package/dist/types/agentspec.d.ts +18 -18
  337. package/dist/types/agentspec.js +2 -2
  338. package/dist/types/auth.d.ts +1 -1
  339. package/dist/types/auth.js +6 -6
  340. package/dist/types/config.d.ts +6 -6
  341. package/dist/types/events.d.ts +2 -2
  342. package/dist/types/events.js +2 -2
  343. package/dist/types/index.d.ts +32 -32
  344. package/dist/types/index.js +6 -6
  345. package/dist/types/interrupt.d.ts +6 -6
  346. package/dist/types/interrupt.js +21 -21
  347. package/dist/types/interruptState.d.ts +12 -12
  348. package/dist/types/interruptState.js +66 -66
  349. package/dist/types/playground.d.ts +7 -7
  350. package/dist/types/playground.js +14 -14
  351. package/dist/types/settings.d.ts +5 -3
  352. package/dist/types/settings.js +25 -18
  353. package/dist/types/skin.d.ts +31 -0
  354. package/dist/types/skin.js +1 -0
  355. package/dist/types/theme.d.ts +35 -0
  356. package/dist/types/theme.js +1 -0
  357. package/dist/types/uischema.d.ts +4 -4
  358. package/dist/types/uischema.js +3 -3
  359. package/dist/utils/colors.d.ts +1 -1
  360. package/dist/utils/colors.js +97 -95
  361. package/dist/utils/config.d.ts +2 -2
  362. package/dist/utils/config.js +48 -48
  363. package/dist/utils/connections.d.ts +2 -2
  364. package/dist/utils/connections.js +15 -15
  365. package/dist/utils/errors.js +3 -3
  366. package/dist/utils/fetchWithAuth.d.ts +1 -1
  367. package/dist/utils/fetchWithAuth.js +2 -2
  368. package/dist/utils/handleIds.d.ts +2 -2
  369. package/dist/utils/handleIds.js +8 -8
  370. package/dist/utils/handlePositioning.d.ts +1 -1
  371. package/dist/utils/handlePositioning.js +2 -2
  372. package/dist/utils/icons.d.ts +1 -1
  373. package/dist/utils/icons.js +74 -74
  374. package/dist/utils/logger.d.ts +1 -1
  375. package/dist/utils/logger.js +7 -7
  376. package/dist/utils/nodeStatus.d.ts +1 -1
  377. package/dist/utils/nodeStatus.js +48 -48
  378. package/dist/utils/nodeTypes.d.ts +1 -1
  379. package/dist/utils/nodeTypes.js +21 -20
  380. package/dist/utils/nodeWrapper.d.ts +7 -7
  381. package/dist/utils/nodeWrapper.js +21 -19
  382. package/dist/utils/performanceUtils.d.ts +1 -1
  383. package/dist/utils/performanceUtils.js +2 -1
  384. package/dist/utils/sanitize.js +1 -1
  385. package/dist/utils/uischema.d.ts +2 -2
  386. package/dist/utils/uischema.js +8 -8
  387. package/dist/utils/validation.js +20 -8
  388. package/package.json +296 -291
@@ -8,444 +8,506 @@
8
8
  -->
9
9
 
10
10
  <script lang="ts">
11
- import { Position, Handle } from '@xyflow/svelte';
12
- import type { ConfigValues, NodeMetadata, NodeExtensions, NodePort } from '../../types/index.js';
13
- import Icon from '@iconify/svelte';
14
- import { getDataTypeColor } from '../../utils/colors.js';
15
- import { getConnectedHandles } from '../../stores/workflowStore.svelte.js';
16
-
17
- const props = $props<{
18
- data: {
19
- label: string;
20
- config: ConfigValues;
21
- metadata: NodeMetadata;
22
- nodeId?: string;
23
- extensions?: NodeExtensions;
24
- onConfigOpen?: (node: {
25
- id: string;
26
- type: string;
27
- data: { label: string; config: ConfigValues; metadata: NodeMetadata };
28
- }) => void;
29
- };
30
- selected?: boolean;
31
- isProcessing?: boolean;
32
- isError?: boolean;
33
- }>();
34
-
35
- /**
36
- * Get the hideUnconnectedHandles setting from extensions
37
- * Merges node type defaults with instance overrides
38
- */
39
- const hideUnconnectedHandles = $derived(() => {
40
- const typeDefault = props.data.metadata?.extensions?.ui?.hideUnconnectedHandles ?? false;
41
- const instanceOverride = props.data.extensions?.ui?.hideUnconnectedHandles;
42
- return instanceOverride ?? typeDefault;
43
- });
44
-
45
- // Prioritize metadata icon over config icon for simple nodes (metadata is the node definition)
46
- let nodeIcon = $derived(
47
- (props.data.metadata?.icon as string) || (props.data.config?.icon as string) || 'mdi:square'
48
- );
49
- let nodeColor = $derived(
50
- (props.data.metadata?.color as string) || (props.data.config?.color as string) || '#6366f1'
51
- );
52
-
53
- /**
54
- * Instance-specific title override from config.
55
- * Falls back to the original label if not set.
56
- * This allows users to customize the node title per-instance via config.
57
- */
58
- const displayTitle = $derived((props.data.config?.instanceTitle as string) || props.data.label);
59
-
60
- /**
61
- * Instance-specific description override from config.
62
- * Falls back to the metadata description if not set.
63
- * This allows users to customize the node description per-instance via config.
64
- */
65
- const displayDescription = $derived(
66
- (props.data.config?.instanceDescription as string) ||
67
- props.data.metadata?.description ||
68
- 'A configurable simple node'
69
- );
70
-
71
- // Handle configuration sidebar - now using global ConfigSidebar
72
- function openConfigSidebar(): void {
73
- if (props.data.onConfigOpen) {
74
- // Create a WorkflowNodeType-like object for the global ConfigSidebar
75
- const nodeForConfig = {
76
- id: props.data.nodeId || 'unknown',
77
- type: 'simple',
78
- data: props.data
79
- };
80
- props.data.onConfigOpen(nodeForConfig);
81
- }
82
- }
83
-
84
- // Handle double-click to open config
85
- function handleDoubleClick(): void {
86
- openConfigSidebar();
87
- }
88
-
89
- // Handle single click - only handle selection, no config opening
90
- function handleClick(): void {
91
- // Node selection is handled by Svelte Flow
92
- }
93
-
94
- // Handle keyboard events
95
- function handleKeydown(event: KeyboardEvent): void {
96
- if (event.key === 'Enter' || event.key === ' ') {
97
- event.preventDefault();
98
- handleDoubleClick();
99
- }
100
- }
101
-
102
- /**
103
- * Check if a port is connected
104
- * @param portId - The port ID to check
105
- * @param type - Whether this is an 'input' or 'output' port
106
- * @returns true if the port is connected
107
- */
108
- function isPortConnected(portId: string, type: 'input' | 'output'): boolean {
109
- const handleId = `${props.data.nodeId}-${type}-${portId}`;
110
- return getConnectedHandles().has(handleId);
111
- }
112
-
113
- /**
114
- * Check if a trigger port should be visible
115
- * Always shows if hideUnconnectedHandles is disabled or if port is connected
116
- */
117
- function shouldShowTriggerPort(portId: string, type: 'input' | 'output'): boolean {
118
- if (!hideUnconnectedHandles()) {
119
- return true;
120
- }
121
- return isPortConnected(portId, type);
122
- }
123
-
124
- // Get first input/output ports for simple node representation
125
- // Special handling for trigger ports - they should always be shown if present
126
- let triggerInputPort = $derived(
127
- props.data.metadata?.inputs?.find((port: NodePort) => port.dataType === 'trigger')
128
- );
129
- let triggerOutputPort = $derived(
130
- props.data.metadata?.outputs?.find((port: NodePort) => port.dataType === 'trigger')
131
- );
132
-
133
- // Get first non-trigger ports for data connections
134
- let firstConnectedDataInputPort = $derived(
135
- props.data.metadata?.inputs?.find(
136
- (port: NodePort) => port.dataType !== 'trigger' && isPortConnected(port.id, 'input')
137
- )
138
- );
139
-
140
- let firstDataInputPort = $derived(
141
- props.data.metadata?.inputs?.find((port: NodePort) => port.dataType !== 'trigger')
142
- );
143
-
144
- let firstConnectedDataOutputPort = $derived(
145
- props.data.metadata?.outputs?.find(
146
- (port: NodePort) => port.dataType !== 'trigger' && isPortConnected(port.id, 'output')
147
- )
148
- );
149
- let firstDataOutputPort = $derived(
150
- props.data.metadata?.outputs?.find((port: NodePort) => port.dataType !== 'trigger')
151
- );
152
-
153
- let inputPorts = $derived.by(() => {
154
- return [
155
- ...(firstConnectedDataInputPort
156
- ? [firstConnectedDataInputPort]
157
- : firstDataInputPort
158
- ? [firstDataInputPort]
159
- : []),
160
- ...(triggerInputPort && shouldShowTriggerPort(triggerInputPort.id, 'input')
161
- ? [triggerInputPort]
162
- : [])
163
- ];
164
- });
165
- let outputPorts = $derived.by(() => {
166
- return [
167
- ...(firstConnectedDataOutputPort
168
- ? [firstConnectedDataOutputPort]
169
- : firstDataOutputPort
170
- ? [firstDataOutputPort]
171
- : []),
172
- ...(triggerOutputPort && shouldShowTriggerPort(triggerOutputPort.id, 'output')
173
- ? [triggerOutputPort]
174
- : [])
175
- ];
176
- });
11
+ import { Position, Handle } from "@xyflow/svelte";
12
+ import type {
13
+ ConfigValues,
14
+ NodeMetadata,
15
+ NodeExtensions,
16
+ NodePort,
17
+ } from "../../types/index.js";
18
+ import Icon from "@iconify/svelte";
19
+ import {
20
+ getDataTypeColor,
21
+ getCategoryColorToken,
22
+ } from "../../utils/colors.js";
23
+ import { getConnectedHandles } from "../../stores/workflowStore.svelte.js";
24
+ import CogIcon from "../icons/CogIcon.svelte";
25
+ import AlertCircleIcon from "../icons/AlertCircleIcon.svelte";
26
+
27
+ const props = $props<{
28
+ data: {
29
+ label: string;
30
+ config: ConfigValues;
31
+ metadata: NodeMetadata;
32
+ nodeId?: string;
33
+ extensions?: NodeExtensions;
34
+ onConfigOpen?: (node: {
35
+ id: string;
36
+ type: string;
37
+ data: { label: string; config: ConfigValues; metadata: NodeMetadata };
38
+ }) => void;
39
+ };
40
+ selected?: boolean;
41
+ isProcessing?: boolean;
42
+ isError?: boolean;
43
+ }>();
44
+
45
+ /**
46
+ * Get the hideUnconnectedHandles setting from extensions
47
+ * Merges node type defaults with instance overrides
48
+ */
49
+ const hideUnconnectedHandles = $derived(() => {
50
+ const typeDefault =
51
+ props.data.metadata?.extensions?.ui?.hideUnconnectedHandles ?? false;
52
+ const instanceOverride = props.data.extensions?.ui?.hideUnconnectedHandles;
53
+ return instanceOverride ?? typeDefault;
54
+ });
55
+
56
+ // Prioritize metadata icon over config icon for simple nodes (metadata is the node definition)
57
+ let nodeIcon = $derived(
58
+ (props.data.metadata?.icon as string) ||
59
+ (props.data.config?.icon as string) ||
60
+ "mdi:square",
61
+ );
62
+ let nodeColor = $derived(
63
+ (props.data.metadata?.color as string) ||
64
+ (props.data.config?.color as string) ||
65
+ "#6366f1",
66
+ );
67
+
68
+ /**
69
+ * Instance-specific title override from config.
70
+ * Falls back to the original label if not set.
71
+ * This allows users to customize the node title per-instance via config.
72
+ */
73
+ const displayTitle = $derived(
74
+ (props.data.config?.instanceTitle as string) || props.data.label,
75
+ );
76
+
77
+ /**
78
+ * Instance-specific description override from config.
79
+ * Falls back to the metadata description if not set.
80
+ * This allows users to customize the node description per-instance via config.
81
+ */
82
+ const displayDescription = $derived(
83
+ (props.data.config?.instanceDescription as string) ||
84
+ props.data.metadata?.description ||
85
+ "A configurable simple node",
86
+ );
87
+
88
+ // Handle configuration sidebar - now using global ConfigSidebar
89
+ function openConfigSidebar(): void {
90
+ if (props.data.onConfigOpen) {
91
+ // Create a WorkflowNodeType-like object for the global ConfigSidebar
92
+ const nodeForConfig = {
93
+ id: props.data.nodeId || "unknown",
94
+ type: "simple",
95
+ data: props.data,
96
+ };
97
+ props.data.onConfigOpen(nodeForConfig);
98
+ }
99
+ }
100
+
101
+ // Handle double-click to open config
102
+ function handleDoubleClick(): void {
103
+ openConfigSidebar();
104
+ }
105
+
106
+ // Handle single click - only handle selection, no config opening
107
+ function handleClick(): void {
108
+ // Node selection is handled by Svelte Flow
109
+ }
110
+
111
+ // Handle keyboard events
112
+ function handleKeydown(event: KeyboardEvent): void {
113
+ if (event.key === "Enter" || event.key === " ") {
114
+ event.preventDefault();
115
+ handleDoubleClick();
116
+ }
117
+ }
118
+
119
+ /**
120
+ * Check if a port is connected
121
+ * @param portId - The port ID to check
122
+ * @param type - Whether this is an 'input' or 'output' port
123
+ * @returns true if the port is connected
124
+ */
125
+ function isPortConnected(portId: string, type: "input" | "output"): boolean {
126
+ const handleId = `${props.data.nodeId}-${type}-${portId}`;
127
+ return getConnectedHandles().has(handleId);
128
+ }
129
+
130
+ /**
131
+ * Check if a trigger port should be visible
132
+ * Always shows if hideUnconnectedHandles is disabled or if port is connected
133
+ */
134
+ function shouldShowTriggerPort(
135
+ portId: string,
136
+ type: "input" | "output",
137
+ ): boolean {
138
+ if (!hideUnconnectedHandles()) {
139
+ return true;
140
+ }
141
+ return isPortConnected(portId, type);
142
+ }
143
+
144
+ // Get first input/output ports for simple node representation
145
+ // Special handling for trigger ports - they should always be shown if present
146
+ let triggerInputPort = $derived(
147
+ props.data.metadata?.inputs?.find(
148
+ (port: NodePort) => port.dataType === "trigger",
149
+ ),
150
+ );
151
+ let triggerOutputPort = $derived(
152
+ props.data.metadata?.outputs?.find(
153
+ (port: NodePort) => port.dataType === "trigger",
154
+ ),
155
+ );
156
+
157
+ // Get first non-trigger ports for data connections
158
+ let firstConnectedDataInputPort = $derived(
159
+ props.data.metadata?.inputs?.find(
160
+ (port: NodePort) =>
161
+ port.dataType !== "trigger" && isPortConnected(port.id, "input"),
162
+ ),
163
+ );
164
+
165
+ let firstDataInputPort = $derived(
166
+ props.data.metadata?.inputs?.find(
167
+ (port: NodePort) => port.dataType !== "trigger",
168
+ ),
169
+ );
170
+
171
+ let firstConnectedDataOutputPort = $derived(
172
+ props.data.metadata?.outputs?.find(
173
+ (port: NodePort) =>
174
+ port.dataType !== "trigger" && isPortConnected(port.id, "output"),
175
+ ),
176
+ );
177
+ let firstDataOutputPort = $derived(
178
+ props.data.metadata?.outputs?.find(
179
+ (port: NodePort) => port.dataType !== "trigger",
180
+ ),
181
+ );
182
+
183
+ let inputPorts = $derived.by(() => {
184
+ return [
185
+ ...(firstConnectedDataInputPort
186
+ ? [firstConnectedDataInputPort]
187
+ : firstDataInputPort
188
+ ? [firstDataInputPort]
189
+ : []),
190
+ ...(triggerInputPort &&
191
+ shouldShowTriggerPort(triggerInputPort.id, "input")
192
+ ? [triggerInputPort]
193
+ : []),
194
+ ];
195
+ });
196
+ let outputPorts = $derived.by(() => {
197
+ return [
198
+ ...(firstConnectedDataOutputPort
199
+ ? [firstConnectedDataOutputPort]
200
+ : firstDataOutputPort
201
+ ? [firstDataOutputPort]
202
+ : []),
203
+ ...(triggerOutputPort &&
204
+ shouldShowTriggerPort(triggerOutputPort.id, "output")
205
+ ? [triggerOutputPort]
206
+ : []),
207
+ ];
208
+ });
177
209
  </script>
178
210
 
179
211
  <!-- Input Handles: center at 20/40/60px (multiple of 10), 20px connection area -->
180
212
  {#each inputPorts as port, index}
181
- <Handle
182
- type="target"
183
- position={Position.Left}
184
- style="--fd-handle-fill: {getDataTypeColor(
185
- port.dataType
186
- )}; --fd-handle-border-color: var(--fd-handle-border); top: {inputPorts.length > 1
187
- ? index === 0
188
- ? 20
189
- : 60
190
- : 40}px; transform: translateY(-50%); z-index: 30;"
191
- id={`${props.data.nodeId}-input-${port.id}`}
192
- />
213
+ <Handle
214
+ type="target"
215
+ position={Position.Left}
216
+ style="--fd-handle-fill: var(--fd-port-skin-color, {getDataTypeColor(
217
+ port.dataType,
218
+ )}); --fd-handle-border-color: var(--fd-handle-border); top: {inputPorts.length >
219
+ 1
220
+ ? index === 0
221
+ ? 20
222
+ : 60
223
+ : 40}px; transform: translateY(-50%); z-index: 30;"
224
+ id={`${props.data.nodeId}-input-${port.id}`}
225
+ />
193
226
  {/each}
194
227
 
195
228
  <!-- Simple Node -->
196
229
  <div
197
- class="flowdrop-simple-node flowdrop-simple-node--normal"
198
- class:flowdrop-simple-node--selected={props.selected}
199
- class:flowdrop-simple-node--processing={props.isProcessing}
200
- class:flowdrop-simple-node--error={props.isError}
201
- onclick={handleClick}
202
- ondblclick={handleDoubleClick}
203
- onkeydown={handleKeydown}
204
- role="button"
205
- tabindex="0"
230
+ class="flowdrop-simple-node flowdrop-simple-node--normal"
231
+ class:flowdrop-simple-node--selected={props.selected}
232
+ class:flowdrop-simple-node--processing={props.isProcessing}
233
+ class:flowdrop-simple-node--error={props.isError}
234
+ onclick={handleClick}
235
+ ondblclick={handleDoubleClick}
236
+ onkeydown={handleKeydown}
237
+ role="button"
238
+ tabindex="0"
206
239
  >
207
- <div class="flowdrop-simple-node__header">
208
- <div class="flowdrop-simple-node__header-content">
209
- <!-- Node Icon with Squircle Background -->
210
- <div class="flowdrop-simple-node__icon-wrapper" style="--_icon-color: {nodeColor}">
211
- <Icon icon={nodeIcon} class="flowdrop-simple-node__icon" />
212
- </div>
213
-
214
- <!-- Node Title -->
215
- <h3 class="flowdrop-simple-node__title">
216
- {displayTitle}
217
- </h3>
218
- </div>
219
-
220
- <!-- Node Description -->
221
- <p class="flowdrop-simple-node__description">
222
- {displayDescription}
223
- </p>
224
- </div>
225
-
226
- <!-- Processing indicator -->
227
- {#if props.isProcessing}
228
- <div class="flowdrop-simple-node__processing">
229
- <div class="flowdrop-simple-node__spinner"></div>
230
- </div>
231
- {/if}
232
-
233
- <!-- Error indicator -->
234
- {#if props.isError}
235
- <div class="flowdrop-simple-node__error">
236
- <Icon icon="mdi:alert-circle" class="flowdrop-simple-node__error-icon" />
237
- </div>
238
- {/if}
239
-
240
- <!-- Config button -->
241
- <button
242
- class="flowdrop-simple-node__config-btn"
243
- onclick={openConfigSidebar}
244
- title="Configure node"
245
- >
246
- <Icon icon="mdi:cog" />
247
- </button>
240
+ <div class="flowdrop-simple-node__header">
241
+ <div class="flowdrop-simple-node__header-content">
242
+ <!-- Node Icon (squircle) visibility controlled by --fd-node-icon-display -->
243
+ <div
244
+ class="flowdrop-simple-node__icon-wrapper"
245
+ style="--_icon-color: {nodeColor}"
246
+ >
247
+ <Icon icon={nodeIcon} class="flowdrop-simple-node__icon" />
248
+ </div>
249
+ <!-- Node Icon (circle dot) — visibility controlled by --fd-node-circle-display -->
250
+ <span
251
+ class="flowdrop-simple-node__color-dot"
252
+ style="background: {getCategoryColorToken(
253
+ props.data.metadata?.category,
254
+ )}"
255
+ ></span>
256
+
257
+ <!-- Node Title -->
258
+ <h3 class="flowdrop-simple-node__title">
259
+ {displayTitle}
260
+ </h3>
261
+ </div>
262
+
263
+ <!-- Node Description -->
264
+ <p class="flowdrop-simple-node__description">
265
+ {displayDescription}
266
+ </p>
267
+ </div>
268
+
269
+ <!-- Processing indicator -->
270
+ {#if props.isProcessing}
271
+ <div class="flowdrop-simple-node__processing">
272
+ <div class="flowdrop-simple-node__spinner"></div>
273
+ </div>
274
+ {/if}
275
+
276
+ <!-- Error indicator -->
277
+ {#if props.isError}
278
+ <div class="flowdrop-simple-node__error">
279
+ <AlertCircleIcon />
280
+ </div>
281
+ {/if}
282
+
283
+ <!-- Config button -->
284
+ <button
285
+ class="flowdrop-simple-node__config-btn"
286
+ onclick={openConfigSidebar}
287
+ title="Configure node"
288
+ >
289
+ <CogIcon />
290
+ </button>
248
291
  </div>
249
292
 
250
293
  <!-- Output Handles: center at 20/40/60px (multiple of 10), 20px connection area -->
251
294
  {#each outputPorts as port, index}
252
- <Handle
253
- type="source"
254
- position={Position.Right}
255
- style="--fd-handle-fill: {getDataTypeColor(
256
- port.dataType
257
- )}; --fd-handle-border-color: var(--fd-handle-border); top: {outputPorts.length > 1
258
- ? index === 0
259
- ? 20
260
- : 60
261
- : 40}px; transform: translateY(-50%); z-index: 30;"
262
- id={`${props.data.nodeId}-output-${port.id}`}
263
- />
295
+ <Handle
296
+ type="source"
297
+ position={Position.Right}
298
+ style="--fd-handle-fill: var(--fd-port-skin-color, {getDataTypeColor(
299
+ port.dataType,
300
+ )}); --fd-handle-border-color: var(--fd-handle-border); top: {outputPorts.length >
301
+ 1
302
+ ? index === 0
303
+ ? 20
304
+ : 60
305
+ : 40}px; transform: translateY(-50%); z-index: 30;"
306
+ id={`${props.data.nodeId}-output-${port.id}`}
307
+ />
264
308
  {/each}
265
309
 
266
310
  <style>
267
- .flowdrop-simple-node {
268
- position: relative;
269
- background-color: var(--fd-card);
270
- border: 1.5px solid var(--fd-node-border);
271
- border-radius: var(--fd-radius-xl);
272
- display: flex;
273
- flex-direction: column;
274
- cursor: pointer;
275
- transition: all var(--fd-transition-fast);
276
- box-shadow: var(--fd-shadow-md);
277
- overflow: visible; /* Changed from hidden to visible to allow handles to be properly accessible */
278
- z-index: 10;
279
- color: var(--fd-foreground);
280
- }
281
-
282
- /* Normal layout (default): min-height allows variable height for longer descriptions */
283
- .flowdrop-simple-node--normal {
284
- width: var(--fd-node-default-width);
285
- min-height: var(--fd-node-simple-height);
286
- }
287
-
288
- .flowdrop-simple-node:hover {
289
- box-shadow: var(--fd-shadow-lg);
290
- border-color: var(--fd-node-border-hover);
291
- }
292
-
293
- .flowdrop-simple-node--selected {
294
- box-shadow:
295
- 0 0 0 2px var(--fd-primary-muted),
296
- var(--fd-shadow-lg);
297
- border-color: var(--fd-primary);
298
- }
299
-
300
- .flowdrop-simple-node--selected:hover {
301
- box-shadow:
302
- 0 0 0 2px var(--fd-primary-muted),
303
- var(--fd-shadow-lg);
304
- border-color: var(--fd-primary);
305
- }
306
-
307
- .flowdrop-simple-node:focus-visible {
308
- outline: 2px solid var(--fd-ring);
309
- outline-offset: 2px;
310
- }
311
-
312
- .flowdrop-simple-node--processing {
313
- opacity: 0.7;
314
- }
315
-
316
- .flowdrop-simple-node--error {
317
- border-color: var(--fd-error) !important;
318
- background-color: var(--fd-error-muted) !important;
319
- }
320
-
321
- .flowdrop-simple-node__header {
322
- padding: var(--fd-space-xl);
323
- background: var(--fd-header);
324
- border-radius: var(--fd-radius-xl);
325
- }
326
-
327
- .flowdrop-simple-node__header-content {
328
- display: flex;
329
- align-items: center;
330
- gap: var(--fd-space-md);
331
- }
332
-
333
- /* Squircle icon wrapper - Apple-style rounded square background */
334
- .flowdrop-simple-node__icon-wrapper {
335
- display: flex;
336
- align-items: center;
337
- justify-content: center;
338
- width: 2.25rem;
339
- height: 2.25rem;
340
- border-radius: 0.5rem;
341
- background: color-mix(in srgb, var(--_icon-color) var(--fd-node-icon-bg-opacity), transparent);
342
- flex-shrink: 0;
343
- transition: all var(--fd-transition-normal);
344
- }
345
-
346
- .flowdrop-simple-node:hover .flowdrop-simple-node__icon-wrapper {
347
- background: color-mix(
348
- in srgb,
349
- var(--_icon-color) var(--fd-node-icon-bg-opacity-hover),
350
- transparent
351
- );
352
- transform: scale(1.05);
353
- }
354
-
355
- .flowdrop-simple-node__title {
356
- font-size: var(--fd-text-sm);
357
- font-weight: 500;
358
- color: var(--fd-foreground);
359
- margin: 0;
360
- flex: 1;
361
- min-width: 0;
362
- line-height: 1.4;
363
- }
364
-
365
- .flowdrop-simple-node__description {
366
- font-size: var(--fd-text-xs);
367
- color: var(--fd-muted-foreground);
368
- margin: var(--fd-space-3xs) 0 0 0;
369
- line-height: 1.3;
370
- }
371
-
372
- .flowdrop-simple-node__icon-wrapper :global(.flowdrop-simple-node__icon) {
373
- width: 1.25rem;
374
- height: 1.25rem;
375
- color: var(--fd-node-icon);
376
- }
377
-
378
- .flowdrop-simple-node__processing {
379
- position: absolute;
380
- top: 4px;
381
- right: 4px;
382
- }
383
-
384
- .flowdrop-simple-node__spinner {
385
- width: 12px;
386
- height: 12px;
387
- border: 1px solid color-mix(in srgb, var(--fd-foreground) 30%, transparent);
388
- border-top: 1px solid var(--fd-foreground);
389
- border-radius: 50%;
390
- animation: spin 1s linear infinite;
391
- }
392
-
393
- .flowdrop-simple-node__error {
394
- position: absolute;
395
- top: 4px;
396
- right: 4px;
397
- color: var(--fd-error);
398
- }
399
-
400
- :global(.flowdrop-simple-node__error-icon) {
401
- width: 12px;
402
- height: 12px;
403
- }
404
-
405
- .flowdrop-simple-node__config-btn {
406
- position: absolute;
407
- top: var(--fd-space-xs);
408
- right: var(--fd-space-xs);
409
- width: 1.5rem;
410
- height: 1.5rem;
411
- background-color: var(--fd-backdrop);
412
- border: 1px solid var(--fd-border);
413
- border-radius: var(--fd-radius-sm);
414
- color: var(--fd-muted-foreground);
415
- cursor: pointer;
416
- display: flex;
417
- align-items: center;
418
- justify-content: center;
419
- opacity: 0;
420
- transition: all var(--fd-transition-normal);
421
- backdrop-filter: blur(4px);
422
- z-index: 15;
423
- font-size: var(--fd-text-sm);
424
- }
425
-
426
- .flowdrop-simple-node:hover .flowdrop-simple-node__config-btn {
427
- opacity: 1;
428
- }
429
-
430
- .flowdrop-simple-node__config-btn:hover {
431
- background-color: var(--fd-muted);
432
- border-color: var(--fd-border-strong);
433
- color: var(--fd-foreground);
434
- }
435
-
436
- @keyframes spin {
437
- to {
438
- transform: rotate(360deg);
439
- }
440
- }
441
-
442
- /* Handle: 20px/12px from base.css; position offsets for 20px handle */
443
- :global(.svelte-flow__node-simple .svelte-flow__handle) {
444
- z-index: 20 !important;
445
- pointer-events: auto !important;
446
- }
447
-
448
- :global(.svelte-flow__node-simple .svelte-flow__handle:hover) {
449
- transform: translateY(-50%) scale(1.2) !important;
450
- }
311
+ .flowdrop-simple-node {
312
+ position: relative;
313
+ background-color: var(--fd-card);
314
+ border: 1.5px solid var(--fd-node-border);
315
+ border-radius: var(--fd-radius-xl);
316
+ display: flex;
317
+ flex-direction: column;
318
+ cursor: pointer;
319
+ transition: all var(--fd-transition-fast);
320
+ box-shadow: var(--fd-shadow-md);
321
+ overflow: visible; /* Changed from hidden to visible to allow handles to be properly accessible */
322
+ z-index: 10;
323
+ color: var(--fd-foreground);
324
+ }
325
+
326
+ /* Normal layout (default): min-height allows variable height for longer descriptions */
327
+ .flowdrop-simple-node--normal {
328
+ width: var(--fd-node-default-width);
329
+ min-height: var(--fd-node-simple-height);
330
+ }
331
+
332
+ .flowdrop-simple-node:hover {
333
+ box-shadow: var(--fd-shadow-lg);
334
+ border-color: var(--fd-node-border-hover);
335
+ }
336
+
337
+ .flowdrop-simple-node--selected {
338
+ box-shadow:
339
+ 0 0 0 2px var(--fd-primary-muted),
340
+ var(--fd-shadow-lg);
341
+ border-color: var(--fd-primary);
342
+ }
343
+
344
+ .flowdrop-simple-node--selected:hover {
345
+ box-shadow:
346
+ 0 0 0 2px var(--fd-primary-muted),
347
+ var(--fd-shadow-lg);
348
+ border-color: var(--fd-primary);
349
+ }
350
+
351
+ .flowdrop-simple-node:focus-visible {
352
+ outline: 2px solid var(--fd-ring);
353
+ outline-offset: 2px;
354
+ }
355
+
356
+ .flowdrop-simple-node--processing {
357
+ opacity: 0.7;
358
+ }
359
+
360
+ .flowdrop-simple-node--error {
361
+ border-color: var(--fd-error) !important;
362
+ background-color: var(--fd-error-muted) !important;
363
+ }
364
+
365
+ .flowdrop-simple-node__header {
366
+ padding: var(--fd-space-xl);
367
+ background: var(--fd-header);
368
+ border-radius: var(--fd-radius-xl);
369
+ }
370
+
371
+ .flowdrop-simple-node__header-content {
372
+ display: flex;
373
+ align-items: center;
374
+ gap: var(--fd-space-md);
375
+ }
376
+
377
+ /* Squircle icon wrapper - Apple-style rounded square background */
378
+ .flowdrop-simple-node__icon-wrapper {
379
+ display: var(--fd-node-icon-display, flex);
380
+ align-items: center;
381
+ justify-content: center;
382
+ width: 2.25rem;
383
+ height: 2.25rem;
384
+ border-radius: 0.5rem;
385
+ background: color-mix(
386
+ in srgb,
387
+ var(--_icon-color) var(--fd-node-icon-bg-opacity),
388
+ transparent
389
+ );
390
+ flex-shrink: 0;
391
+ transition: all var(--fd-transition-normal);
392
+ }
393
+
394
+ .flowdrop-simple-node:hover .flowdrop-simple-node__icon-wrapper {
395
+ background: color-mix(
396
+ in srgb,
397
+ var(--_icon-color) var(--fd-node-icon-bg-opacity-hover),
398
+ transparent
399
+ );
400
+ transform: scale(1.05);
401
+ }
402
+
403
+ .flowdrop-simple-node__title {
404
+ font-size: var(--fd-text-sm);
405
+ font-weight: 500;
406
+ color: var(--fd-foreground);
407
+ margin: 0;
408
+ flex: 1;
409
+ min-width: 0;
410
+ line-height: 1.4;
411
+ }
412
+
413
+ .flowdrop-simple-node__description {
414
+ font-size: var(--fd-text-xs);
415
+ color: var(--fd-muted-foreground);
416
+ margin: var(--fd-space-3xs) 0 0 0;
417
+ line-height: 1.3;
418
+ }
419
+
420
+ .flowdrop-simple-node__icon-wrapper :global(.flowdrop-simple-node__icon) {
421
+ width: 1.25rem;
422
+ height: 1.25rem;
423
+ color: var(--fd-node-icon);
424
+ }
425
+
426
+ .flowdrop-simple-node__processing {
427
+ position: absolute;
428
+ top: 4px;
429
+ right: 4px;
430
+ }
431
+
432
+ .flowdrop-simple-node__spinner {
433
+ width: 12px;
434
+ height: 12px;
435
+ border: 1px solid color-mix(in srgb, var(--fd-foreground) 30%, transparent);
436
+ border-top: 1px solid var(--fd-foreground);
437
+ border-radius: 50%;
438
+ animation: spin 1s linear infinite;
439
+ }
440
+
441
+ .flowdrop-simple-node__error {
442
+ position: absolute;
443
+ top: 4px;
444
+ right: 4px;
445
+ color: var(--fd-error);
446
+ }
447
+
448
+ .flowdrop-simple-node__error :global(svg) {
449
+ width: 12px;
450
+ height: 12px;
451
+ }
452
+
453
+ .flowdrop-simple-node__config-btn :global(svg) {
454
+ width: 14px;
455
+ height: 14px;
456
+ }
457
+
458
+ .flowdrop-simple-node__config-btn {
459
+ position: absolute;
460
+ top: var(--fd-space-xs);
461
+ right: var(--fd-space-xs);
462
+ width: 1.5rem;
463
+ height: 1.5rem;
464
+ background-color: var(--fd-backdrop);
465
+ border: 1px solid var(--fd-border);
466
+ border-radius: var(--fd-radius-sm);
467
+ color: var(--fd-muted-foreground);
468
+ cursor: pointer;
469
+ display: flex;
470
+ align-items: center;
471
+ justify-content: center;
472
+ opacity: 0;
473
+ transition: all var(--fd-transition-normal);
474
+ backdrop-filter: blur(4px);
475
+ z-index: 15;
476
+ font-size: var(--fd-text-sm);
477
+ }
478
+
479
+ .flowdrop-simple-node:hover .flowdrop-simple-node__config-btn {
480
+ opacity: 1;
481
+ }
482
+
483
+ .flowdrop-simple-node__config-btn:hover {
484
+ background-color: var(--fd-muted);
485
+ border-color: var(--fd-border-strong);
486
+ color: var(--fd-foreground);
487
+ }
488
+
489
+ @keyframes spin {
490
+ to {
491
+ transform: rotate(360deg);
492
+ }
493
+ }
494
+
495
+ /* Handle: 20px/12px from base.css; position offsets for 20px handle */
496
+ :global(.svelte-flow__node-simple .svelte-flow__handle) {
497
+ z-index: 20 !important;
498
+ pointer-events: auto !important;
499
+ }
500
+
501
+ :global(.svelte-flow__node-simple .svelte-flow__handle:hover) {
502
+ transform: translateY(-50%) scale(1.2) !important;
503
+ }
504
+
505
+ /* Circle dot icon — shown in minimal skin via --fd-node-circle-display */
506
+ .flowdrop-simple-node__color-dot {
507
+ width: 10px;
508
+ height: 10px;
509
+ border-radius: 50%;
510
+ flex-shrink: 0;
511
+ display: var(--fd-node-circle-display, none);
512
+ }
451
513
  </style>