@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,400 +8,459 @@
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, getCategoryColorToken } from '../../utils/colors.js';
15
- import { getNodeIcon } from '../../utils/icons.js';
16
- import { getConnectedHandles } from '../../stores/workflowStore.svelte.js';
17
-
18
- const props = $props<{
19
- data: {
20
- label: string;
21
- config: ConfigValues;
22
- metadata: NodeMetadata;
23
- nodeId?: string;
24
- extensions?: NodeExtensions;
25
- onConfigOpen?: (node: {
26
- id: string;
27
- type: string;
28
- data: { label: string; config: ConfigValues; metadata: NodeMetadata };
29
- }) => void;
30
- };
31
- selected?: boolean;
32
- isProcessing?: boolean;
33
- isError?: boolean;
34
- }>();
35
-
36
- /**
37
- * Get the hideUnconnectedHandles setting from extensions
38
- * Merges node type defaults with instance overrides
39
- */
40
- const hideUnconnectedHandles = $derived(() => {
41
- const typeDefault = props.data.metadata?.extensions?.ui?.hideUnconnectedHandles ?? false;
42
- const instanceOverride = props.data.extensions?.ui?.hideUnconnectedHandles;
43
- return instanceOverride ?? typeDefault;
44
- });
45
-
46
- /**
47
- * Get icon using the same resolution as WorkflowNode
48
- * Uses getNodeIcon utility with category fallback
49
- */
50
- let squareIcon = $derived(getNodeIcon(props.data.metadata?.icon, props.data.metadata?.category));
51
-
52
- /**
53
- * Get icon color using category-based color tokens for consistency
54
- * Falls back to primary color if category not available
55
- */
56
- let squareColor = $derived(getCategoryColorToken(props.data.metadata?.category));
57
-
58
- // Handle configuration sidebar - now using global ConfigSidebar
59
- function openConfigSidebar(): void {
60
- if (props.data.onConfigOpen) {
61
- // Create a WorkflowNodeType-like object for the global ConfigSidebar
62
- const nodeForConfig = {
63
- id: props.data.nodeId || 'unknown',
64
- type: 'square',
65
- data: props.data
66
- };
67
- props.data.onConfigOpen(nodeForConfig);
68
- }
69
- }
70
-
71
- // Handle double-click to open config
72
- function handleDoubleClick(): void {
73
- openConfigSidebar();
74
- }
75
-
76
- // Handle single click to open config
77
- function handleClick(): void {
78
- openConfigSidebar();
79
- }
80
-
81
- // Handle keyboard events
82
- function handleKeydown(event: KeyboardEvent): void {
83
- if (event.key === 'Enter' || event.key === ' ') {
84
- event.preventDefault();
85
- openConfigSidebar();
86
- }
87
- }
88
- /**
89
- * Check if a port is connected
90
- * @param portId - The port ID to check
91
- * @param type - Whether this is an 'input' or 'output' port
92
- * @returns true if the port is connected
93
- */
94
- function isPortConnected(portId: string, type: 'input' | 'output'): boolean {
95
- const handleId = `${props.data.nodeId}-${type}-${portId}`;
96
- return getConnectedHandles().has(handleId);
97
- }
98
-
99
- /**
100
- * Check if a trigger port should be visible
101
- * Always shows if hideUnconnectedHandles is disabled or if port is connected
102
- */
103
- function shouldShowTriggerPort(portId: string, type: 'input' | 'output'): boolean {
104
- if (!hideUnconnectedHandles()) {
105
- return true;
106
- }
107
- return isPortConnected(portId, type);
108
- }
109
-
110
- // Get first input/output ports for square node representation
111
- // Special handling for trigger ports - they should always be shown if present
112
- let triggerInputPort = $derived(
113
- props.data.metadata?.inputs?.find((port: NodePort) => port.dataType === 'trigger')
114
- );
115
- let triggerOutputPort = $derived(
116
- props.data.metadata?.outputs?.find((port: NodePort) => port.dataType === 'trigger')
117
- );
118
-
119
- // Get first non-trigger ports for data connections
120
- let firstConnectedDataInputPort = $derived(
121
- props.data.metadata?.inputs?.find(
122
- (port: NodePort) => port.dataType !== 'trigger' && isPortConnected(port.id, 'input')
123
- )
124
- );
125
-
126
- let firstDataInputPort = $derived(
127
- props.data.metadata?.inputs?.find((port: NodePort) => port.dataType !== 'trigger')
128
- );
129
-
130
- let firstConnectedDataOutputPort = $derived(
131
- props.data.metadata?.outputs?.find(
132
- (port: NodePort) => port.dataType !== 'trigger' && isPortConnected(port.id, 'output')
133
- )
134
- );
135
- let firstDataOutputPort = $derived(
136
- props.data.metadata?.outputs?.find((port: NodePort) => port.dataType !== 'trigger')
137
- );
138
-
139
- let inputPorts = $derived.by(() => {
140
- return [
141
- ...(firstConnectedDataInputPort
142
- ? [firstConnectedDataInputPort]
143
- : firstDataInputPort
144
- ? [firstDataInputPort]
145
- : []),
146
- ...(triggerInputPort && shouldShowTriggerPort(triggerInputPort.id, 'input')
147
- ? [triggerInputPort]
148
- : [])
149
- ];
150
- });
151
- let outputPorts = $derived.by(() => {
152
- return [
153
- ...(firstConnectedDataOutputPort
154
- ? [firstConnectedDataOutputPort]
155
- : firstDataOutputPort
156
- ? [firstDataOutputPort]
157
- : []),
158
- ...(triggerOutputPort && shouldShowTriggerPort(triggerOutputPort.id, 'output')
159
- ? [triggerOutputPort]
160
- : [])
161
- ];
162
- });
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 { getNodeIcon } from "../../utils/icons.js";
24
+ import { getConnectedHandles } from "../../stores/workflowStore.svelte.js";
25
+ import CogIcon from "../icons/CogIcon.svelte";
26
+ import AlertCircleIcon from "../icons/AlertCircleIcon.svelte";
27
+
28
+ const props = $props<{
29
+ data: {
30
+ label: string;
31
+ config: ConfigValues;
32
+ metadata: NodeMetadata;
33
+ nodeId?: string;
34
+ extensions?: NodeExtensions;
35
+ onConfigOpen?: (node: {
36
+ id: string;
37
+ type: string;
38
+ data: { label: string; config: ConfigValues; metadata: NodeMetadata };
39
+ }) => void;
40
+ };
41
+ selected?: boolean;
42
+ isProcessing?: boolean;
43
+ isError?: boolean;
44
+ }>();
45
+
46
+ /**
47
+ * Get the hideUnconnectedHandles setting from extensions
48
+ * Merges node type defaults with instance overrides
49
+ */
50
+ const hideUnconnectedHandles = $derived(() => {
51
+ const typeDefault =
52
+ props.data.metadata?.extensions?.ui?.hideUnconnectedHandles ?? false;
53
+ const instanceOverride = props.data.extensions?.ui?.hideUnconnectedHandles;
54
+ return instanceOverride ?? typeDefault;
55
+ });
56
+
57
+ /**
58
+ * Get icon using the same resolution as WorkflowNode
59
+ * Uses getNodeIcon utility with category fallback
60
+ */
61
+ let squareIcon = $derived(
62
+ getNodeIcon(props.data.metadata?.icon, props.data.metadata?.category),
63
+ );
64
+
65
+ /**
66
+ * Get icon color using category-based color tokens for consistency
67
+ * Falls back to primary color if category not available
68
+ */
69
+ let squareColor = $derived(
70
+ getCategoryColorToken(props.data.metadata?.category),
71
+ );
72
+
73
+ // Handle configuration sidebar - now using global ConfigSidebar
74
+ function openConfigSidebar(): void {
75
+ if (props.data.onConfigOpen) {
76
+ // Create a WorkflowNodeType-like object for the global ConfigSidebar
77
+ const nodeForConfig = {
78
+ id: props.data.nodeId || "unknown",
79
+ type: "square",
80
+ data: props.data,
81
+ };
82
+ props.data.onConfigOpen(nodeForConfig);
83
+ }
84
+ }
85
+
86
+ // Handle double-click to open config
87
+ function handleDoubleClick(): void {
88
+ openConfigSidebar();
89
+ }
90
+
91
+ // Handle single click to open config
92
+ function handleClick(): void {
93
+ openConfigSidebar();
94
+ }
95
+
96
+ // Handle keyboard events
97
+ function handleKeydown(event: KeyboardEvent): void {
98
+ if (event.key === "Enter" || event.key === " ") {
99
+ event.preventDefault();
100
+ openConfigSidebar();
101
+ }
102
+ }
103
+ /**
104
+ * Check if a port is connected
105
+ * @param portId - The port ID to check
106
+ * @param type - Whether this is an 'input' or 'output' port
107
+ * @returns true if the port is connected
108
+ */
109
+ function isPortConnected(portId: string, type: "input" | "output"): boolean {
110
+ const handleId = `${props.data.nodeId}-${type}-${portId}`;
111
+ return getConnectedHandles().has(handleId);
112
+ }
113
+
114
+ /**
115
+ * Check if a trigger port should be visible
116
+ * Always shows if hideUnconnectedHandles is disabled or if port is connected
117
+ */
118
+ function shouldShowTriggerPort(
119
+ portId: string,
120
+ type: "input" | "output",
121
+ ): boolean {
122
+ if (!hideUnconnectedHandles()) {
123
+ return true;
124
+ }
125
+ return isPortConnected(portId, type);
126
+ }
127
+
128
+ // Get first input/output ports for square node representation
129
+ // Special handling for trigger ports - they should always be shown if present
130
+ let triggerInputPort = $derived(
131
+ props.data.metadata?.inputs?.find(
132
+ (port: NodePort) => port.dataType === "trigger",
133
+ ),
134
+ );
135
+ let triggerOutputPort = $derived(
136
+ props.data.metadata?.outputs?.find(
137
+ (port: NodePort) => port.dataType === "trigger",
138
+ ),
139
+ );
140
+
141
+ // Get first non-trigger ports for data connections
142
+ let firstConnectedDataInputPort = $derived(
143
+ props.data.metadata?.inputs?.find(
144
+ (port: NodePort) =>
145
+ port.dataType !== "trigger" && isPortConnected(port.id, "input"),
146
+ ),
147
+ );
148
+
149
+ let firstDataInputPort = $derived(
150
+ props.data.metadata?.inputs?.find(
151
+ (port: NodePort) => port.dataType !== "trigger",
152
+ ),
153
+ );
154
+
155
+ let firstConnectedDataOutputPort = $derived(
156
+ props.data.metadata?.outputs?.find(
157
+ (port: NodePort) =>
158
+ port.dataType !== "trigger" && isPortConnected(port.id, "output"),
159
+ ),
160
+ );
161
+ let firstDataOutputPort = $derived(
162
+ props.data.metadata?.outputs?.find(
163
+ (port: NodePort) => port.dataType !== "trigger",
164
+ ),
165
+ );
166
+
167
+ let inputPorts = $derived.by(() => {
168
+ return [
169
+ ...(firstConnectedDataInputPort
170
+ ? [firstConnectedDataInputPort]
171
+ : firstDataInputPort
172
+ ? [firstDataInputPort]
173
+ : []),
174
+ ...(triggerInputPort &&
175
+ shouldShowTriggerPort(triggerInputPort.id, "input")
176
+ ? [triggerInputPort]
177
+ : []),
178
+ ];
179
+ });
180
+ let outputPorts = $derived.by(() => {
181
+ return [
182
+ ...(firstConnectedDataOutputPort
183
+ ? [firstConnectedDataOutputPort]
184
+ : firstDataOutputPort
185
+ ? [firstDataOutputPort]
186
+ : []),
187
+ ...(triggerOutputPort &&
188
+ shouldShowTriggerPort(triggerOutputPort.id, "output")
189
+ ? [triggerOutputPort]
190
+ : []),
191
+ ];
192
+ });
163
193
  </script>
164
194
 
165
195
  <!-- Input Handles: center at 20/40/60px (multiple of 10), 20px connection area -->
166
196
  {#each inputPorts as port, index}
167
- <Handle
168
- type="target"
169
- position={Position.Left}
170
- style="--fd-handle-fill: {getDataTypeColor(
171
- port.dataType
172
- )}; --fd-handle-border-color: var(--fd-handle-border); top: {inputPorts.length > 1
173
- ? index === 0
174
- ? 20
175
- : 60
176
- : 40}px; transform: translateY(-50%); z-index: 30;"
177
- id={`${props.data.nodeId}-input-${port.id}`}
178
- />
197
+ <Handle
198
+ type="target"
199
+ position={Position.Left}
200
+ style="--fd-handle-fill: var(--fd-port-skin-color, {getDataTypeColor(
201
+ port.dataType,
202
+ )}); --fd-handle-border-color: var(--fd-handle-border); top: {inputPorts.length >
203
+ 1
204
+ ? index === 0
205
+ ? 20
206
+ : 60
207
+ : 40}px; transform: translateY(-50%); z-index: 30;"
208
+ id={`${props.data.nodeId}-input-${port.id}`}
209
+ />
179
210
  {/each}
180
211
 
181
212
  <!-- Square Node -->
182
213
  <div
183
- class="flowdrop-square-node flowdrop-square-node--compact"
184
- class:flowdrop-square-node--selected={props.selected}
185
- class:flowdrop-square-node--processing={props.isProcessing}
186
- class:flowdrop-square-node--error={props.isError}
187
- onclick={handleClick}
188
- ondblclick={handleDoubleClick}
189
- onkeydown={handleKeydown}
190
- role="button"
191
- tabindex="0"
214
+ class="flowdrop-square-node flowdrop-square-node--compact"
215
+ class:flowdrop-square-node--selected={props.selected}
216
+ class:flowdrop-square-node--processing={props.isProcessing}
217
+ class:flowdrop-square-node--error={props.isError}
218
+ onclick={handleClick}
219
+ ondblclick={handleDoubleClick}
220
+ onkeydown={handleKeydown}
221
+ role="button"
222
+ tabindex="0"
192
223
  >
193
- <!-- Square Layout: Always compact with centered icon in squircle wrapper -->
194
- <div class="flowdrop-square-node__compact-content">
195
- <div class="flowdrop-square-node__icon-wrapper" style="--_icon-color: {squareColor}">
196
- <Icon icon={squareIcon} class="flowdrop-square-node__icon" />
197
- </div>
198
- </div>
199
-
200
- <!-- Processing indicator -->
201
- {#if props.isProcessing}
202
- <div class="flowdrop-square-node__processing">
203
- <div class="flowdrop-square-node__spinner"></div>
204
- </div>
205
- {/if}
206
-
207
- <!-- Error indicator -->
208
- {#if props.isError}
209
- <div class="flowdrop-square-node__error">
210
- <Icon icon="mdi:alert-circle" class="flowdrop-square-node__error-icon" />
211
- </div>
212
- {/if}
213
-
214
- <!-- Config button -->
215
- <button
216
- class="flowdrop-square-node__config-btn"
217
- onclick={openConfigSidebar}
218
- title="Configure node"
219
- >
220
- <Icon icon="mdi:cog" />
221
- </button>
224
+ <!-- Square Layout: Always compact with centered icon in squircle wrapper -->
225
+ <div class="flowdrop-square-node__compact-content">
226
+ <!-- Squircle icon — visibility controlled by --fd-node-icon-display -->
227
+ <div
228
+ class="flowdrop-square-node__icon-wrapper"
229
+ style="--_icon-color: {squareColor}"
230
+ >
231
+ <Icon icon={squareIcon} class="flowdrop-square-node__icon" />
232
+ </div>
233
+ <!-- Circle dot — visibility controlled by --fd-node-circle-display -->
234
+ <span
235
+ class="flowdrop-square-node__color-dot"
236
+ style="background: {getCategoryColorToken(props.data.metadata?.category)}"
237
+ ></span>
238
+ </div>
239
+
240
+ <!-- Processing indicator -->
241
+ {#if props.isProcessing}
242
+ <div class="flowdrop-square-node__processing">
243
+ <div class="flowdrop-square-node__spinner"></div>
244
+ </div>
245
+ {/if}
246
+
247
+ <!-- Error indicator -->
248
+ {#if props.isError}
249
+ <div class="flowdrop-square-node__error">
250
+ <AlertCircleIcon />
251
+ </div>
252
+ {/if}
253
+
254
+ <!-- Config button -->
255
+ <button
256
+ class="flowdrop-square-node__config-btn"
257
+ onclick={openConfigSidebar}
258
+ title="Configure node"
259
+ >
260
+ <CogIcon />
261
+ </button>
222
262
  </div>
223
263
 
224
264
  <!-- Output Handles: center at 20/40/60px (multiple of 10), 20px connection area -->
225
265
  {#each outputPorts as port, index}
226
- <Handle
227
- type="source"
228
- position={Position.Right}
229
- style="--fd-handle-fill: {getDataTypeColor(
230
- port.dataType
231
- )}; --fd-handle-border-color: var(--fd-handle-border); top: {outputPorts.length > 1
232
- ? index === 0
233
- ? 20
234
- : 60
235
- : 40}px; transform: translateY(-50%); z-index: 30;"
236
- id={`${props.data.nodeId}-output-${port.id}`}
237
- />
266
+ <Handle
267
+ type="source"
268
+ position={Position.Right}
269
+ style="--fd-handle-fill: var(--fd-port-skin-color, {getDataTypeColor(
270
+ port.dataType,
271
+ )}); --fd-handle-border-color: var(--fd-handle-border); top: {outputPorts.length >
272
+ 1
273
+ ? index === 0
274
+ ? 20
275
+ : 60
276
+ : 40}px; transform: translateY(-50%); z-index: 30;"
277
+ id={`${props.data.nodeId}-output-${port.id}`}
278
+ />
238
279
  {/each}
239
280
 
240
281
  <style>
241
- .flowdrop-square-node {
242
- position: relative;
243
- background-color: var(--fd-card);
244
- border: 1.5px solid var(--fd-node-border);
245
- border-radius: var(--fd-radius-xl);
246
- display: flex;
247
- flex-direction: column;
248
- cursor: pointer;
249
- transition: all var(--fd-transition-fast);
250
- box-shadow: var(--fd-shadow-md);
251
- overflow: visible; /* Changed from hidden to visible to allow handles to be properly accessible */
252
- z-index: 10;
253
- color: var(--fd-foreground);
254
- }
255
-
256
- /* Square layout (always compact) */
257
- .flowdrop-square-node--compact {
258
- width: var(--fd-node-square-size);
259
- height: var(--fd-node-square-size);
260
- justify-content: center;
261
- align-items: center;
262
- }
263
-
264
- .flowdrop-square-node:hover {
265
- box-shadow: var(--fd-shadow-lg);
266
- border-color: var(--fd-node-border-hover);
267
- }
268
-
269
- .flowdrop-square-node--selected {
270
- box-shadow:
271
- 0 0 0 2px var(--fd-primary-muted),
272
- var(--fd-shadow-lg);
273
- border-color: var(--fd-primary);
274
- }
275
-
276
- .flowdrop-square-node--selected:hover {
277
- box-shadow:
278
- 0 0 0 2px var(--fd-primary-muted),
279
- var(--fd-shadow-lg);
280
- border-color: var(--fd-primary);
281
- }
282
-
283
- .flowdrop-square-node:focus-visible {
284
- outline: 2px solid var(--fd-ring);
285
- outline-offset: 2px;
286
- }
287
-
288
- .flowdrop-square-node--processing {
289
- opacity: 0.7;
290
- }
291
-
292
- .flowdrop-square-node--error {
293
- border-color: var(--fd-error) !important;
294
- background-color: var(--fd-error-muted) !important;
295
- }
296
-
297
- /* Compact layout styles */
298
- .flowdrop-square-node__compact-content {
299
- display: flex;
300
- align-items: center;
301
- justify-content: center;
302
- width: 100%;
303
- height: 100%;
304
- }
305
-
306
- /* Squircle icon wrapper - matching WorkflowNode style */
307
- .flowdrop-square-node__icon-wrapper {
308
- display: flex;
309
- align-items: center;
310
- justify-content: center;
311
- width: 3rem;
312
- height: 3rem;
313
- border-radius: 0.625rem;
314
- background: color-mix(in srgb, var(--_icon-color) var(--fd-node-icon-bg-opacity), transparent);
315
- flex-shrink: 0;
316
- transition: all var(--fd-transition-normal);
317
- }
318
-
319
- .flowdrop-square-node:hover .flowdrop-square-node__icon-wrapper {
320
- background: color-mix(
321
- in srgb,
322
- var(--_icon-color) var(--fd-node-icon-bg-opacity-hover),
323
- transparent
324
- );
325
- transform: scale(1.05);
326
- }
327
-
328
- .flowdrop-square-node__icon-wrapper :global(.flowdrop-square-node__icon) {
329
- width: 1.75rem;
330
- height: 1.75rem;
331
- color: var(--fd-node-icon);
332
- }
333
-
334
- .flowdrop-square-node__processing {
335
- position: absolute;
336
- top: 4px;
337
- right: 4px;
338
- }
339
-
340
- .flowdrop-square-node__spinner {
341
- width: 12px;
342
- height: 12px;
343
- border: 1px solid color-mix(in srgb, var(--fd-foreground) 30%, transparent);
344
- border-top: 1px solid var(--fd-foreground);
345
- border-radius: 50%;
346
- animation: spin 1s linear infinite;
347
- }
348
-
349
- .flowdrop-square-node__error {
350
- position: absolute;
351
- top: 4px;
352
- right: 4px;
353
- color: var(--fd-error);
354
- }
355
-
356
- :global(.flowdrop-square-node__error-icon) {
357
- width: 12px;
358
- height: 12px;
359
- }
360
-
361
- .flowdrop-square-node__config-btn {
362
- position: absolute;
363
- top: var(--fd-space-xs);
364
- right: var(--fd-space-xs);
365
- width: 1.5rem;
366
- height: 1.5rem;
367
- background-color: var(--fd-backdrop);
368
- border: 1px solid var(--fd-border);
369
- border-radius: var(--fd-radius-sm);
370
- color: var(--fd-muted-foreground);
371
- cursor: pointer;
372
- display: flex;
373
- align-items: center;
374
- justify-content: center;
375
- opacity: 0;
376
- transition: all var(--fd-transition-normal);
377
- backdrop-filter: var(--fd-backdrop-blur);
378
- z-index: 15;
379
- font-size: var(--fd-text-sm);
380
- }
381
-
382
- .flowdrop-square-node:hover .flowdrop-square-node__config-btn {
383
- opacity: 1;
384
- }
385
-
386
- .flowdrop-square-node__config-btn:hover {
387
- background-color: var(--fd-muted);
388
- border-color: var(--fd-border-strong);
389
- color: var(--fd-foreground);
390
- }
391
-
392
- @keyframes spin {
393
- to {
394
- transform: rotate(360deg);
395
- }
396
- }
397
-
398
- /* Handle: 20px/12px from base.css; position offsets for 20px handle */
399
- :global(.svelte-flow__node-square .svelte-flow__handle) {
400
- z-index: 20 !important;
401
- pointer-events: auto !important;
402
- }
403
-
404
- :global(.svelte-flow__node-square .svelte-flow__handle:hover) {
405
- transform: translateY(-50%) scale(1.2) !important;
406
- }
282
+ .flowdrop-square-node {
283
+ position: relative;
284
+ background-color: var(--fd-card);
285
+ border: 1.5px solid var(--fd-node-border);
286
+ border-radius: var(--fd-radius-xl);
287
+ display: flex;
288
+ flex-direction: column;
289
+ cursor: pointer;
290
+ transition: all var(--fd-transition-fast);
291
+ box-shadow: var(--fd-shadow-md);
292
+ overflow: visible; /* Changed from hidden to visible to allow handles to be properly accessible */
293
+ z-index: 10;
294
+ color: var(--fd-foreground);
295
+ }
296
+
297
+ /* Square layout (always compact) */
298
+ .flowdrop-square-node--compact {
299
+ width: var(--fd-node-square-size);
300
+ height: var(--fd-node-square-size);
301
+ justify-content: center;
302
+ align-items: center;
303
+ }
304
+
305
+ .flowdrop-square-node:hover {
306
+ box-shadow: var(--fd-shadow-lg);
307
+ border-color: var(--fd-node-border-hover);
308
+ }
309
+
310
+ .flowdrop-square-node--selected {
311
+ box-shadow:
312
+ 0 0 0 2px var(--fd-primary-muted),
313
+ var(--fd-shadow-lg);
314
+ border-color: var(--fd-primary);
315
+ }
316
+
317
+ .flowdrop-square-node--selected:hover {
318
+ box-shadow:
319
+ 0 0 0 2px var(--fd-primary-muted),
320
+ var(--fd-shadow-lg);
321
+ border-color: var(--fd-primary);
322
+ }
323
+
324
+ .flowdrop-square-node:focus-visible {
325
+ outline: 2px solid var(--fd-ring);
326
+ outline-offset: 2px;
327
+ }
328
+
329
+ .flowdrop-square-node--processing {
330
+ opacity: 0.7;
331
+ }
332
+
333
+ .flowdrop-square-node--error {
334
+ border-color: var(--fd-error) !important;
335
+ background-color: var(--fd-error-muted) !important;
336
+ }
337
+
338
+ /* Compact layout styles */
339
+ .flowdrop-square-node__compact-content {
340
+ display: flex;
341
+ align-items: center;
342
+ justify-content: center;
343
+ width: 100%;
344
+ height: 100%;
345
+ }
346
+
347
+ /* Squircle icon wrapper - matching WorkflowNode style */
348
+ .flowdrop-square-node__icon-wrapper {
349
+ display: var(--fd-node-icon-display, flex);
350
+ align-items: center;
351
+ justify-content: center;
352
+ width: 3rem;
353
+ height: 3rem;
354
+ border-radius: 0.625rem;
355
+ background: color-mix(
356
+ in srgb,
357
+ var(--_icon-color) var(--fd-node-icon-bg-opacity),
358
+ transparent
359
+ );
360
+ flex-shrink: 0;
361
+ transition: all var(--fd-transition-normal);
362
+ }
363
+
364
+ .flowdrop-square-node:hover .flowdrop-square-node__icon-wrapper {
365
+ background: color-mix(
366
+ in srgb,
367
+ var(--_icon-color) var(--fd-node-icon-bg-opacity-hover),
368
+ transparent
369
+ );
370
+ transform: scale(1.05);
371
+ }
372
+
373
+ .flowdrop-square-node__icon-wrapper :global(.flowdrop-square-node__icon) {
374
+ width: 1.75rem;
375
+ height: 1.75rem;
376
+ color: var(--fd-node-icon);
377
+ }
378
+
379
+ /* Circle dot icon — shown in minimal skin via --fd-node-circle-display */
380
+ .flowdrop-square-node__color-dot {
381
+ width: 10px;
382
+ height: 10px;
383
+ border-radius: 50%;
384
+ flex-shrink: 0;
385
+ display: var(--fd-node-circle-display, none);
386
+ }
387
+
388
+ .flowdrop-square-node__processing {
389
+ position: absolute;
390
+ top: 4px;
391
+ right: 4px;
392
+ }
393
+
394
+ .flowdrop-square-node__spinner {
395
+ width: 12px;
396
+ height: 12px;
397
+ border: 1px solid color-mix(in srgb, var(--fd-foreground) 30%, transparent);
398
+ border-top: 1px solid var(--fd-foreground);
399
+ border-radius: 50%;
400
+ animation: spin 1s linear infinite;
401
+ }
402
+
403
+ .flowdrop-square-node__error {
404
+ position: absolute;
405
+ top: 4px;
406
+ right: 4px;
407
+ color: var(--fd-error);
408
+ }
409
+
410
+ .flowdrop-square-node__error :global(svg) {
411
+ width: 12px;
412
+ height: 12px;
413
+ }
414
+
415
+ .flowdrop-square-node__config-btn :global(svg) {
416
+ width: 14px;
417
+ height: 14px;
418
+ }
419
+
420
+ .flowdrop-square-node__config-btn {
421
+ position: absolute;
422
+ top: var(--fd-space-xs);
423
+ right: var(--fd-space-xs);
424
+ width: 1.5rem;
425
+ height: 1.5rem;
426
+ background-color: var(--fd-backdrop);
427
+ border: 1px solid var(--fd-border);
428
+ border-radius: var(--fd-radius-sm);
429
+ color: var(--fd-muted-foreground);
430
+ cursor: pointer;
431
+ display: flex;
432
+ align-items: center;
433
+ justify-content: center;
434
+ opacity: 0;
435
+ transition: all var(--fd-transition-normal);
436
+ backdrop-filter: var(--fd-backdrop-blur);
437
+ z-index: 15;
438
+ font-size: var(--fd-text-sm);
439
+ }
440
+
441
+ .flowdrop-square-node:hover .flowdrop-square-node__config-btn {
442
+ opacity: 1;
443
+ }
444
+
445
+ .flowdrop-square-node__config-btn:hover {
446
+ background-color: var(--fd-muted);
447
+ border-color: var(--fd-border-strong);
448
+ color: var(--fd-foreground);
449
+ }
450
+
451
+ @keyframes spin {
452
+ to {
453
+ transform: rotate(360deg);
454
+ }
455
+ }
456
+
457
+ /* Handle: 20px/12px from base.css; position offsets for 20px handle */
458
+ :global(.svelte-flow__node-square .svelte-flow__handle) {
459
+ z-index: 20 !important;
460
+ pointer-events: auto !important;
461
+ }
462
+
463
+ :global(.svelte-flow__node-square .svelte-flow__handle:hover) {
464
+ transform: translateY(-50%) scale(1.2) !important;
465
+ }
407
466
  </style>