@flowdrop/flowdrop 1.0.1 → 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 (386) 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 +179 -143
  36. package/dist/components/FlowDropEdge.svelte +147 -147
  37. package/dist/components/FlowDropEdge.svelte.d.ts +1 -1
  38. package/dist/components/FlowDropZone.svelte +63 -60
  39. package/dist/components/FlowDropZone.svelte.d.ts +1 -1
  40. package/dist/components/LoadingSpinner.stories.svelte +19 -19
  41. package/dist/components/LoadingSpinner.stories.svelte.d.ts +1 -1
  42. package/dist/components/LoadingSpinner.svelte +21 -21
  43. package/dist/components/LoadingSpinner.svelte.d.ts +1 -1
  44. package/dist/components/Logo.stories.svelte +13 -13
  45. package/dist/components/Logo.stories.svelte.d.ts +1 -1
  46. package/dist/components/Logo.svelte +101 -95
  47. package/dist/components/LogsSidebar.svelte +553 -546
  48. package/dist/components/LogsSidebar.svelte.d.ts +1 -1
  49. package/dist/components/MarkdownDisplay.stories.svelte +29 -23
  50. package/dist/components/MarkdownDisplay.stories.svelte.d.ts +1 -1
  51. package/dist/components/MarkdownDisplay.svelte +16 -14
  52. package/dist/components/Navbar.stories.svelte +43 -38
  53. package/dist/components/Navbar.stories.svelte.d.ts +1 -1
  54. package/dist/components/Navbar.svelte +760 -706
  55. package/dist/components/Navbar.svelte.d.ts +1 -1
  56. package/dist/components/NodeSidebar.svelte +900 -746
  57. package/dist/components/NodeSidebar.svelte.d.ts +3 -1
  58. package/dist/components/NodeStatusOverlay.stories.svelte +82 -70
  59. package/dist/components/NodeStatusOverlay.stories.svelte.d.ts +1 -1
  60. package/dist/components/NodeStatusOverlay.svelte +295 -280
  61. package/dist/components/NodeStatusOverlay.svelte.d.ts +3 -3
  62. package/dist/components/PipelineStatus.svelte +326 -300
  63. package/dist/components/PipelineStatus.svelte.d.ts +4 -4
  64. package/dist/components/PortCoordinateTracker.svelte +49 -47
  65. package/dist/components/PortCoordinateTracker.svelte.d.ts +1 -1
  66. package/dist/components/ReadOnlyDetails.svelte +156 -156
  67. package/dist/components/SchemaForm.stories.svelte +106 -98
  68. package/dist/components/SchemaForm.stories.svelte.d.ts +1 -1
  69. package/dist/components/SchemaForm.svelte +490 -463
  70. package/dist/components/SchemaForm.svelte.d.ts +2 -2
  71. package/dist/components/SettingsModal.svelte +226 -223
  72. package/dist/components/SettingsModal.svelte.d.ts +1 -1
  73. package/dist/components/SettingsPanel.svelte +637 -601
  74. package/dist/components/SettingsPanel.svelte.d.ts +1 -1
  75. package/dist/components/StatusIcon.stories.svelte +62 -49
  76. package/dist/components/StatusIcon.stories.svelte.d.ts +1 -1
  77. package/dist/components/StatusIcon.svelte +87 -87
  78. package/dist/components/StatusIcon.svelte.d.ts +2 -2
  79. package/dist/components/StatusLabel.stories.svelte +12 -12
  80. package/dist/components/StatusLabel.stories.svelte.d.ts +1 -1
  81. package/dist/components/StatusLabel.svelte +19 -19
  82. package/dist/components/ThemeToggle.stories.svelte +16 -16
  83. package/dist/components/ThemeToggle.stories.svelte.d.ts +1 -1
  84. package/dist/components/ThemeToggle.svelte +180 -169
  85. package/dist/components/ThemeToggle.svelte.d.ts +1 -1
  86. package/dist/components/UniversalNode.svelte +150 -138
  87. package/dist/components/UniversalNode.svelte.d.ts +3 -3
  88. package/dist/components/WorkflowEditor.svelte +1069 -1014
  89. package/dist/components/WorkflowEditor.svelte.d.ts +4 -4
  90. package/dist/components/form/FormArray.svelte +1034 -973
  91. package/dist/components/form/FormArray.svelte.d.ts +1 -1
  92. package/dist/components/form/FormAutocomplete.svelte +1021 -978
  93. package/dist/components/form/FormAutocomplete.svelte.d.ts +1 -1
  94. package/dist/components/form/FormCheckboxGroup.stories.svelte +23 -20
  95. package/dist/components/form/FormCheckboxGroup.stories.svelte.d.ts +1 -1
  96. package/dist/components/form/FormCheckboxGroup.svelte +136 -136
  97. package/dist/components/form/FormCodeEditor.svelte +452 -434
  98. package/dist/components/form/FormField.svelte +366 -355
  99. package/dist/components/form/FormField.svelte.d.ts +2 -2
  100. package/dist/components/form/FormFieldLight.svelte +400 -384
  101. package/dist/components/form/FormFieldLight.svelte.d.ts +1 -1
  102. package/dist/components/form/FormFieldWrapper.stories.svelte +42 -42
  103. package/dist/components/form/FormFieldWrapper.stories.svelte.d.ts +1 -1
  104. package/dist/components/form/FormFieldWrapper.svelte +100 -93
  105. package/dist/components/form/FormFieldWrapper.svelte.d.ts +1 -1
  106. package/dist/components/form/FormFieldset.svelte +108 -108
  107. package/dist/components/form/FormFieldset.svelte.d.ts +2 -2
  108. package/dist/components/form/FormMarkdownEditor.svelte +758 -725
  109. package/dist/components/form/FormNumberField.stories.svelte +25 -25
  110. package/dist/components/form/FormNumberField.stories.svelte.d.ts +1 -1
  111. package/dist/components/form/FormNumberField.svelte +88 -88
  112. package/dist/components/form/FormRangeField.stories.svelte +20 -20
  113. package/dist/components/form/FormRangeField.stories.svelte.d.ts +1 -1
  114. package/dist/components/form/FormRangeField.svelte +234 -226
  115. package/dist/components/form/FormSelect.stories.svelte +38 -38
  116. package/dist/components/form/FormSelect.stories.svelte.d.ts +1 -1
  117. package/dist/components/form/FormSelect.svelte +101 -101
  118. package/dist/components/form/FormSelect.svelte.d.ts +1 -1
  119. package/dist/components/form/FormTemplateEditor.svelte +847 -798
  120. package/dist/components/form/FormTemplateEditor.svelte.d.ts +1 -1
  121. package/dist/components/form/FormTextField.stories.svelte +29 -23
  122. package/dist/components/form/FormTextField.stories.svelte.d.ts +1 -1
  123. package/dist/components/form/FormTextField.svelte +68 -68
  124. package/dist/components/form/FormTextarea.stories.svelte +28 -25
  125. package/dist/components/form/FormTextarea.stories.svelte.d.ts +1 -1
  126. package/dist/components/form/FormTextarea.svelte +74 -74
  127. package/dist/components/form/FormToggle.stories.svelte +23 -20
  128. package/dist/components/form/FormToggle.stories.svelte.d.ts +1 -1
  129. package/dist/components/form/FormToggle.svelte +98 -98
  130. package/dist/components/form/FormUISchemaRenderer.svelte +120 -113
  131. package/dist/components/form/FormUISchemaRenderer.svelte.d.ts +3 -3
  132. package/dist/components/form/index.d.ts +19 -19
  133. package/dist/components/form/index.js +18 -18
  134. package/dist/components/form/templateAutocomplete.d.ts +2 -2
  135. package/dist/components/form/templateAutocomplete.js +64 -55
  136. package/dist/components/form/types.d.ts +6 -6
  137. package/dist/components/form/types.js +9 -4
  138. package/dist/components/icons/AlertCircleIcon.svelte +11 -0
  139. package/dist/components/icons/AlertCircleIcon.svelte.d.ts +26 -0
  140. package/dist/components/icons/CogIcon.svelte +11 -0
  141. package/dist/components/icons/CogIcon.svelte.d.ts +26 -0
  142. package/dist/components/interrupt/ChoicePrompt.stories.svelte +54 -38
  143. package/dist/components/interrupt/ChoicePrompt.stories.svelte.d.ts +1 -1
  144. package/dist/components/interrupt/ChoicePrompt.svelte +407 -383
  145. package/dist/components/interrupt/ChoicePrompt.svelte.d.ts +1 -1
  146. package/dist/components/interrupt/ConfirmationPrompt.stories.svelte +48 -48
  147. package/dist/components/interrupt/ConfirmationPrompt.stories.svelte.d.ts +1 -1
  148. package/dist/components/interrupt/ConfirmationPrompt.svelte +280 -274
  149. package/dist/components/interrupt/ConfirmationPrompt.svelte.d.ts +1 -1
  150. package/dist/components/interrupt/FormPrompt.svelte +223 -218
  151. package/dist/components/interrupt/FormPrompt.svelte.d.ts +1 -1
  152. package/dist/components/interrupt/InterruptBubble.svelte +617 -583
  153. package/dist/components/interrupt/InterruptBubble.svelte.d.ts +2 -2
  154. package/dist/components/interrupt/ReviewPrompt.stories.svelte +66 -56
  155. package/dist/components/interrupt/ReviewPrompt.stories.svelte.d.ts +1 -1
  156. package/dist/components/interrupt/ReviewPrompt.svelte +861 -841
  157. package/dist/components/interrupt/ReviewPrompt.svelte.d.ts +1 -1
  158. package/dist/components/interrupt/TextInputPrompt.stories.svelte +38 -33
  159. package/dist/components/interrupt/TextInputPrompt.stories.svelte.d.ts +1 -1
  160. package/dist/components/interrupt/TextInputPrompt.svelte +333 -328
  161. package/dist/components/interrupt/TextInputPrompt.svelte.d.ts +1 -1
  162. package/dist/components/interrupt/index.d.ts +5 -5
  163. package/dist/components/interrupt/index.js +5 -5
  164. package/dist/components/layouts/MainLayout.svelte +724 -691
  165. package/dist/components/layouts/MainLayout.svelte.d.ts +6 -6
  166. package/dist/components/nodes/GatewayNode.stories.svelte +100 -99
  167. package/dist/components/nodes/GatewayNode.svelte +605 -571
  168. package/dist/components/nodes/GatewayNode.svelte.d.ts +3 -3
  169. package/dist/components/nodes/IdeaNode.stories.svelte +44 -43
  170. package/dist/components/nodes/IdeaNode.svelte +451 -437
  171. package/dist/components/nodes/IdeaNode.svelte.d.ts +1 -1
  172. package/dist/components/nodes/NotesNode.stories.svelte +65 -64
  173. package/dist/components/nodes/NotesNode.svelte +380 -369
  174. package/dist/components/nodes/NotesNode.svelte.d.ts +1 -1
  175. package/dist/components/nodes/SimpleNode.stories.svelte +145 -144
  176. package/dist/components/nodes/SimpleNode.svelte +486 -424
  177. package/dist/components/nodes/SimpleNode.svelte.d.ts +1 -1
  178. package/dist/components/nodes/SquareNode.stories.svelte +73 -73
  179. package/dist/components/nodes/SquareNode.svelte +439 -380
  180. package/dist/components/nodes/SquareNode.svelte.d.ts +1 -1
  181. package/dist/components/nodes/TerminalNode.stories.svelte +13 -13
  182. package/dist/components/nodes/TerminalNode.svelte +709 -670
  183. package/dist/components/nodes/TerminalNode.svelte.d.ts +1 -1
  184. package/dist/components/nodes/ToolNode.stories.svelte +181 -180
  185. package/dist/components/nodes/ToolNode.svelte +505 -447
  186. package/dist/components/nodes/ToolNode.svelte.d.ts +1 -1
  187. package/dist/components/nodes/WorkflowNode.stories.svelte +70 -46
  188. package/dist/components/nodes/WorkflowNode.svelte +621 -551
  189. package/dist/components/nodes/WorkflowNode.svelte.d.ts +3 -3
  190. package/dist/components/playground/ChatPanel.svelte +945 -889
  191. package/dist/components/playground/ExecutionLogs.svelte +495 -472
  192. package/dist/components/playground/InputCollector.svelte +449 -428
  193. package/dist/components/playground/MessageBubble.stories.svelte +47 -47
  194. package/dist/components/playground/MessageBubble.stories.svelte.d.ts +1 -1
  195. package/dist/components/playground/MessageBubble.svelte +626 -610
  196. package/dist/components/playground/MessageBubble.svelte.d.ts +1 -1
  197. package/dist/components/playground/Playground.svelte +1088 -1057
  198. package/dist/components/playground/Playground.svelte.d.ts +3 -3
  199. package/dist/components/playground/PlaygroundModal.svelte +208 -204
  200. package/dist/components/playground/PlaygroundModal.svelte.d.ts +3 -3
  201. package/dist/components/playground/SessionManager.svelte +527 -521
  202. package/dist/components/playground/SessionManager.svelte.d.ts +1 -1
  203. package/dist/config/agentSpecEndpoints.d.ts +1 -1
  204. package/dist/config/agentSpecEndpoints.js +20 -20
  205. package/dist/config/constants.js +2 -2
  206. package/dist/config/defaultCategories.d.ts +1 -1
  207. package/dist/config/defaultCategories.js +86 -86
  208. package/dist/config/defaultPortConfig.d.ts +1 -1
  209. package/dist/config/defaultPortConfig.js +144 -144
  210. package/dist/config/endpoints.d.ts +4 -4
  211. package/dist/config/endpoints.js +65 -65
  212. package/dist/config/runtimeConfig.d.ts +2 -2
  213. package/dist/config/runtimeConfig.js +8 -8
  214. package/dist/core/index.d.ts +63 -59
  215. package/dist/core/index.js +35 -33
  216. package/dist/display/index.d.ts +2 -2
  217. package/dist/display/index.js +2 -2
  218. package/dist/editor/index.d.ts +62 -62
  219. package/dist/editor/index.js +53 -53
  220. package/dist/form/code.d.ts +5 -5
  221. package/dist/form/code.js +14 -14
  222. package/dist/form/fieldRegistry.d.ts +3 -3
  223. package/dist/form/fieldRegistry.js +11 -9
  224. package/dist/form/full.d.ts +8 -8
  225. package/dist/form/full.js +9 -9
  226. package/dist/form/index.d.ts +18 -18
  227. package/dist/form/index.js +16 -16
  228. package/dist/form/markdown.d.ts +4 -4
  229. package/dist/form/markdown.js +8 -8
  230. package/dist/helpers/proximityConnect.d.ts +3 -3
  231. package/dist/helpers/proximityConnect.js +34 -32
  232. package/dist/helpers/workflowEditorHelper.d.ts +5 -5
  233. package/dist/helpers/workflowEditorHelper.js +108 -96
  234. package/dist/index.d.ts +6 -6
  235. package/dist/index.js +6 -6
  236. package/dist/mocks/app-environment.js +2 -2
  237. package/dist/mocks/app-forms.js +9 -9
  238. package/dist/mocks/app-navigation.js +11 -11
  239. package/dist/mocks/app-stores.js +8 -8
  240. package/dist/playground/index.d.ts +19 -19
  241. package/dist/playground/index.js +16 -16
  242. package/dist/playground/mount.d.ts +3 -3
  243. package/dist/playground/mount.js +24 -24
  244. package/dist/registry/builtinFormats.js +13 -13
  245. package/dist/registry/builtinNodes.d.ts +2 -2
  246. package/dist/registry/builtinNodes.js +77 -77
  247. package/dist/registry/index.d.ts +4 -4
  248. package/dist/registry/index.js +4 -4
  249. package/dist/registry/nodeComponentRegistry.d.ts +8 -8
  250. package/dist/registry/nodeComponentRegistry.js +11 -9
  251. package/dist/registry/plugin.d.ts +2 -2
  252. package/dist/registry/plugin.js +11 -11
  253. package/dist/registry/workflowFormatRegistry.d.ts +3 -3
  254. package/dist/registry/workflowFormatRegistry.js +2 -2
  255. package/dist/schema/index.d.ts +1 -1
  256. package/dist/schema/index.js +2 -2
  257. package/dist/schemas/v1/workflow.schema.json +22 -107
  258. package/dist/services/agentSpecExecutionService.d.ts +3 -3
  259. package/dist/services/agentSpecExecutionService.js +59 -55
  260. package/dist/services/api.d.ts +2 -2
  261. package/dist/services/api.js +37 -37
  262. package/dist/services/apiVariableService.d.ts +1 -1
  263. package/dist/services/apiVariableService.js +41 -34
  264. package/dist/services/autoSaveService.js +8 -8
  265. package/dist/services/categoriesApi.d.ts +2 -2
  266. package/dist/services/categoriesApi.js +8 -8
  267. package/dist/services/draftStorage.d.ts +1 -1
  268. package/dist/services/draftStorage.js +11 -11
  269. package/dist/services/dynamicSchemaService.d.ts +1 -1
  270. package/dist/services/dynamicSchemaService.js +41 -39
  271. package/dist/services/globalSave.d.ts +2 -2
  272. package/dist/services/globalSave.js +41 -38
  273. package/dist/services/historyService.d.ts +1 -1
  274. package/dist/services/historyService.js +8 -8
  275. package/dist/services/interruptService.d.ts +1 -1
  276. package/dist/services/interruptService.js +35 -29
  277. package/dist/services/nodeExecutionService.d.ts +1 -1
  278. package/dist/services/nodeExecutionService.js +45 -44
  279. package/dist/services/playgroundService.d.ts +1 -1
  280. package/dist/services/playgroundService.js +29 -29
  281. package/dist/services/portConfigApi.d.ts +2 -2
  282. package/dist/services/portConfigApi.js +8 -8
  283. package/dist/services/settingsService.d.ts +2 -2
  284. package/dist/services/settingsService.js +25 -19
  285. package/dist/services/toastService.d.ts +4 -4
  286. package/dist/services/toastService.js +33 -33
  287. package/dist/services/variableService.d.ts +1 -1
  288. package/dist/services/variableService.js +36 -36
  289. package/dist/services/workflowStorage.d.ts +2 -2
  290. package/dist/services/workflowStorage.js +13 -13
  291. package/dist/settings/index.d.ts +7 -7
  292. package/dist/settings/index.js +6 -6
  293. package/dist/skins/default.d.ts +2 -0
  294. package/dist/skins/default.js +1 -0
  295. package/dist/skins/index.d.ts +13 -0
  296. package/dist/skins/index.js +30 -0
  297. package/dist/skins/slate.d.ts +2 -0
  298. package/dist/skins/slate.js +78 -0
  299. package/dist/stores/categoriesStore.svelte.d.ts +1 -1
  300. package/dist/stores/categoriesStore.svelte.js +5 -5
  301. package/dist/stores/editorStateMachine.svelte.d.ts +2 -2
  302. package/dist/stores/editorStateMachine.svelte.js +65 -33
  303. package/dist/stores/historyStore.svelte.d.ts +4 -4
  304. package/dist/stores/historyStore.svelte.js +4 -4
  305. package/dist/stores/interruptStore.svelte.d.ts +3 -3
  306. package/dist/stores/interruptStore.svelte.js +21 -21
  307. package/dist/stores/playgroundStore.svelte.d.ts +2 -2
  308. package/dist/stores/playgroundStore.svelte.js +25 -18
  309. package/dist/stores/portCoordinateStore.svelte.d.ts +2 -2
  310. package/dist/stores/portCoordinateStore.svelte.js +15 -8
  311. package/dist/stores/settingsStore.svelte.d.ts +2 -2
  312. package/dist/stores/settingsStore.svelte.js +62 -57
  313. package/dist/stores/workflowStore.svelte.d.ts +3 -3
  314. package/dist/stores/workflowStore.svelte.js +50 -47
  315. package/dist/stories/CanvasDecorator.svelte +35 -32
  316. package/dist/stories/CanvasDecorator.svelte.d.ts +2 -2
  317. package/dist/stories/EdgeDecorator.svelte +102 -99
  318. package/dist/stories/EdgeDecorator.svelte.d.ts +1 -1
  319. package/dist/stories/NodeDecorator.svelte +59 -53
  320. package/dist/stories/NodeDecorator.svelte.d.ts +1 -1
  321. package/dist/stories/utils.d.ts +2 -2
  322. package/dist/stories/utils.js +105 -67
  323. package/dist/styles/base.css +599 -595
  324. package/dist/styles/toast.css +14 -14
  325. package/dist/styles/tokens.css +409 -378
  326. package/dist/svelte-app.d.ts +9 -9
  327. package/dist/svelte-app.js +39 -39
  328. package/dist/themes/default.d.ts +2 -0
  329. package/dist/themes/default.js +9 -0
  330. package/dist/themes/index.d.ts +13 -0
  331. package/dist/themes/index.js +44 -0
  332. package/dist/themes/minimal.d.ts +2 -0
  333. package/dist/themes/minimal.js +11 -0
  334. package/dist/types/agentspec.d.ts +18 -18
  335. package/dist/types/agentspec.js +2 -2
  336. package/dist/types/auth.d.ts +1 -1
  337. package/dist/types/auth.js +6 -6
  338. package/dist/types/config.d.ts +6 -6
  339. package/dist/types/events.d.ts +2 -2
  340. package/dist/types/events.js +2 -2
  341. package/dist/types/index.d.ts +32 -32
  342. package/dist/types/index.js +6 -6
  343. package/dist/types/interrupt.d.ts +6 -6
  344. package/dist/types/interrupt.js +21 -21
  345. package/dist/types/interruptState.d.ts +12 -12
  346. package/dist/types/interruptState.js +66 -66
  347. package/dist/types/playground.d.ts +7 -7
  348. package/dist/types/playground.js +14 -14
  349. package/dist/types/settings.d.ts +5 -3
  350. package/dist/types/settings.js +25 -18
  351. package/dist/types/skin.d.ts +31 -0
  352. package/dist/types/skin.js +1 -0
  353. package/dist/types/theme.d.ts +35 -0
  354. package/dist/types/theme.js +1 -0
  355. package/dist/types/uischema.d.ts +4 -4
  356. package/dist/types/uischema.js +3 -3
  357. package/dist/utils/colors.d.ts +1 -1
  358. package/dist/utils/colors.js +97 -95
  359. package/dist/utils/config.d.ts +2 -2
  360. package/dist/utils/config.js +48 -48
  361. package/dist/utils/connections.d.ts +2 -2
  362. package/dist/utils/connections.js +15 -15
  363. package/dist/utils/errors.js +3 -3
  364. package/dist/utils/fetchWithAuth.d.ts +1 -1
  365. package/dist/utils/fetchWithAuth.js +2 -2
  366. package/dist/utils/handleIds.d.ts +2 -2
  367. package/dist/utils/handleIds.js +8 -8
  368. package/dist/utils/handlePositioning.d.ts +1 -1
  369. package/dist/utils/handlePositioning.js +2 -2
  370. package/dist/utils/icons.d.ts +1 -1
  371. package/dist/utils/icons.js +74 -74
  372. package/dist/utils/logger.d.ts +1 -1
  373. package/dist/utils/logger.js +7 -7
  374. package/dist/utils/nodeStatus.d.ts +1 -1
  375. package/dist/utils/nodeStatus.js +48 -48
  376. package/dist/utils/nodeTypes.d.ts +1 -1
  377. package/dist/utils/nodeTypes.js +21 -20
  378. package/dist/utils/nodeWrapper.d.ts +7 -7
  379. package/dist/utils/nodeWrapper.js +21 -19
  380. package/dist/utils/performanceUtils.d.ts +1 -1
  381. package/dist/utils/performanceUtils.js +2 -1
  382. package/dist/utils/sanitize.js +1 -1
  383. package/dist/utils/uischema.d.ts +2 -2
  384. package/dist/utils/uischema.js +8 -8
  385. package/dist/utils/validation.js +20 -8
  386. package/package.json +1 -1
@@ -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>