@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
@@ -33,393 +33,409 @@
33
33
  -->
34
34
 
35
35
  <script lang="ts">
36
- import FormFieldWrapper from './FormFieldWrapper.svelte';
37
- import FormTextField from './FormTextField.svelte';
38
- import FormTextarea from './FormTextarea.svelte';
39
- import FormNumberField from './FormNumberField.svelte';
40
- import FormRangeField from './FormRangeField.svelte';
41
- import FormToggle from './FormToggle.svelte';
42
- import FormSelect from './FormSelect.svelte';
43
- import FormCheckboxGroup from './FormCheckboxGroup.svelte';
44
- import FormArray from './FormArray.svelte';
45
- import { fieldComponentRegistry } from '../../form/fieldRegistry.js';
46
- import { getResolvedTheme } from '../../stores/settingsStore.svelte.js';
47
- import type { FieldSchema } from './types.js';
48
- import { getSchemaOptions } from './types.js';
49
-
50
- interface Props {
51
- /** Unique key/id for the field */
52
- fieldKey: string;
53
- /** Field schema definition */
54
- schema: FieldSchema;
55
- /** Current field value */
56
- value: unknown;
57
- /** Whether the field is required */
58
- required?: boolean;
59
- /** Animation delay index for staggered animations */
60
- animationIndex?: number;
61
- /** Callback when the field value changes */
62
- onChange: (value: unknown) => void;
63
- }
64
-
65
- let { fieldKey, schema, value, required = false, animationIndex = 0, onChange }: Props = $props();
66
-
67
- /**
68
- * Computed description ID for ARIA association
69
- */
70
- const descriptionId = $derived(
71
- schema.description && schema.title ? `${fieldKey}-description` : undefined
72
- );
73
-
74
- /**
75
- * Animation delay based on index
76
- */
77
- const animationDelay = $derived(animationIndex * 30);
78
-
79
- /**
80
- * Field label - prefer title, fall back to description, then key
81
- */
82
- const fieldLabel = $derived(String(schema.title ?? schema.description ?? fieldKey));
83
-
84
- /**
85
- * Check if there's a registered custom component for this schema
86
- */
87
- const registeredComponent = $derived(fieldComponentRegistry.resolveFieldComponent(schema));
88
-
89
- /**
90
- * Determine the field type to render (for non-registered components)
91
- */
92
- const fieldType = $derived.by(() => {
93
- // If a custom component is registered, use it
94
- if (registeredComponent) {
95
- return 'registered';
96
- }
97
-
98
- // Hidden fields should not be rendered
99
- if (schema.format === 'hidden') {
100
- return 'hidden';
101
- }
102
-
103
- // Check for heavy editor formats that need registration
104
- if (schema.format === 'json' || schema.format === 'code') {
105
- return 'code-editor-fallback';
106
- }
107
-
108
- if (schema.format === 'markdown') {
109
- return 'markdown-editor-fallback';
110
- }
111
-
112
- if (schema.format === 'template') {
113
- return 'template-editor-fallback';
114
- }
115
-
116
- // Object type without specific format would use code editor
117
- if (schema.type === 'object' && !schema.format) {
118
- return 'code-editor-fallback';
119
- }
120
-
121
- // Enum with multiple selection -> checkbox group
122
- if (schema.enum && schema.multiple) {
123
- return 'checkbox-group';
124
- }
125
-
126
- // Enum with single selection -> select
127
- if (schema.enum) {
128
- return 'select-enum';
129
- }
130
-
131
- // oneOf with labeled options (standard JSON Schema) -> select
132
- // Must be checked before basic type checks since oneOf schemas often have type: 'string'
133
- if (schema.oneOf && schema.oneOf.length > 0) {
134
- return 'select-options';
135
- }
136
-
137
- // Multiline string -> textarea
138
- if (schema.type === 'string' && schema.format === 'multiline') {
139
- return 'textarea';
140
- }
141
-
142
- // Range slider for number/integer with format: "range"
143
- if ((schema.type === 'number' || schema.type === 'integer') && schema.format === 'range') {
144
- return 'range';
145
- }
146
-
147
- // String -> text field
148
- if (schema.type === 'string') {
149
- return 'text';
150
- }
151
-
152
- // Number or integer -> number field
153
- if (schema.type === 'number' || schema.type === 'integer') {
154
- return 'number';
155
- }
156
-
157
- // Boolean -> toggle
158
- if (schema.type === 'boolean') {
159
- return 'toggle';
160
- }
161
-
162
- // Array type
163
- if (schema.type === 'array') {
164
- return 'array';
165
- }
166
-
167
- // Fallback to text
168
- return 'text';
169
- });
170
-
171
- /**
172
- * Get enum options as string array for select/checkbox components
173
- */
174
- const enumOptions = $derived.by((): string[] => {
175
- if (!schema.enum) return [];
176
- return schema.enum.map((opt) => String(opt));
177
- });
178
-
179
- /**
180
- * Get select options for select-options type
181
- * Handles both oneOf (standard) and options (legacy) patterns
182
- */
183
- const selectOptions = $derived(getSchemaOptions(schema));
184
-
185
- /**
186
- * Get current value as the appropriate type
187
- */
188
- const stringValue = $derived(String(value ?? ''));
189
- const numberValue = $derived(value as number | string);
190
- const booleanValue = $derived(Boolean(value ?? schema.default ?? false));
191
- const arrayValue = $derived.by((): string[] => {
192
- if (Array.isArray(value)) {
193
- return value.map((v) => String(v));
194
- }
195
- return [];
196
- });
197
- const arrayItems = $derived.by((): unknown[] => {
198
- if (Array.isArray(value)) {
199
- return value;
200
- }
201
- return [];
202
- });
203
-
204
- /**
205
- * Get helpful message for missing editor registration
206
- */
207
- function getEditorHint(editorType: string): string {
208
- switch (editorType) {
209
- case 'code-editor-fallback':
210
- return "Code editor requires: import { registerCodeEditorField } from '@flowdrop/flowdrop/form/code'; registerCodeEditorField();";
211
- case 'markdown-editor-fallback':
212
- return "Markdown editor requires: import { registerMarkdownEditorField } from '@flowdrop/flowdrop/form/markdown'; registerMarkdownEditorField();";
213
- case 'template-editor-fallback':
214
- return "Template editor requires: import { registerTemplateEditorField } from '@flowdrop/flowdrop/form/code'; registerTemplateEditorField();";
215
- default:
216
- return 'This field type requires additional registration.';
217
- }
218
- }
36
+ import FormFieldWrapper from "./FormFieldWrapper.svelte";
37
+ import FormTextField from "./FormTextField.svelte";
38
+ import FormTextarea from "./FormTextarea.svelte";
39
+ import FormNumberField from "./FormNumberField.svelte";
40
+ import FormRangeField from "./FormRangeField.svelte";
41
+ import FormToggle from "./FormToggle.svelte";
42
+ import FormSelect from "./FormSelect.svelte";
43
+ import FormCheckboxGroup from "./FormCheckboxGroup.svelte";
44
+ import FormArray from "./FormArray.svelte";
45
+ import { fieldComponentRegistry } from "../../form/fieldRegistry.js";
46
+ import { getResolvedTheme } from "../../stores/settingsStore.svelte.js";
47
+ import type { FieldSchema } from "./types.js";
48
+ import { getSchemaOptions } from "./types.js";
49
+
50
+ interface Props {
51
+ /** Unique key/id for the field */
52
+ fieldKey: string;
53
+ /** Field schema definition */
54
+ schema: FieldSchema;
55
+ /** Current field value */
56
+ value: unknown;
57
+ /** Whether the field is required */
58
+ required?: boolean;
59
+ /** Animation delay index for staggered animations */
60
+ animationIndex?: number;
61
+ /** Callback when the field value changes */
62
+ onChange: (value: unknown) => void;
63
+ }
64
+
65
+ let {
66
+ fieldKey,
67
+ schema,
68
+ value,
69
+ required = false,
70
+ animationIndex = 0,
71
+ onChange,
72
+ }: Props = $props();
73
+
74
+ /**
75
+ * Computed description ID for ARIA association
76
+ */
77
+ const descriptionId = $derived(
78
+ schema.description && schema.title ? `${fieldKey}-description` : undefined,
79
+ );
80
+
81
+ /**
82
+ * Animation delay based on index
83
+ */
84
+ const animationDelay = $derived(animationIndex * 30);
85
+
86
+ /**
87
+ * Field label - prefer title, fall back to description, then key
88
+ */
89
+ const fieldLabel = $derived(
90
+ String(schema.title ?? schema.description ?? fieldKey),
91
+ );
92
+
93
+ /**
94
+ * Check if there's a registered custom component for this schema
95
+ */
96
+ const registeredComponent = $derived(
97
+ fieldComponentRegistry.resolveFieldComponent(schema),
98
+ );
99
+
100
+ /**
101
+ * Determine the field type to render (for non-registered components)
102
+ */
103
+ const fieldType = $derived.by(() => {
104
+ // If a custom component is registered, use it
105
+ if (registeredComponent) {
106
+ return "registered";
107
+ }
108
+
109
+ // Hidden fields should not be rendered
110
+ if (schema.format === "hidden") {
111
+ return "hidden";
112
+ }
113
+
114
+ // Check for heavy editor formats that need registration
115
+ if (schema.format === "json" || schema.format === "code") {
116
+ return "code-editor-fallback";
117
+ }
118
+
119
+ if (schema.format === "markdown") {
120
+ return "markdown-editor-fallback";
121
+ }
122
+
123
+ if (schema.format === "template") {
124
+ return "template-editor-fallback";
125
+ }
126
+
127
+ // Object type without specific format would use code editor
128
+ if (schema.type === "object" && !schema.format) {
129
+ return "code-editor-fallback";
130
+ }
131
+
132
+ // Enum with multiple selection -> checkbox group
133
+ if (schema.enum && schema.multiple) {
134
+ return "checkbox-group";
135
+ }
136
+
137
+ // Enum with single selection -> select
138
+ if (schema.enum) {
139
+ return "select-enum";
140
+ }
141
+
142
+ // oneOf with labeled options (standard JSON Schema) -> select
143
+ // Must be checked before basic type checks since oneOf schemas often have type: 'string'
144
+ if (schema.oneOf && schema.oneOf.length > 0) {
145
+ return "select-options";
146
+ }
147
+
148
+ // Multiline string -> textarea
149
+ if (schema.type === "string" && schema.format === "multiline") {
150
+ return "textarea";
151
+ }
152
+
153
+ // Range slider for number/integer with format: "range"
154
+ if (
155
+ (schema.type === "number" || schema.type === "integer") &&
156
+ schema.format === "range"
157
+ ) {
158
+ return "range";
159
+ }
160
+
161
+ // String -> text field
162
+ if (schema.type === "string") {
163
+ return "text";
164
+ }
165
+
166
+ // Number or integer -> number field
167
+ if (schema.type === "number" || schema.type === "integer") {
168
+ return "number";
169
+ }
170
+
171
+ // Boolean -> toggle
172
+ if (schema.type === "boolean") {
173
+ return "toggle";
174
+ }
175
+
176
+ // Array type
177
+ if (schema.type === "array") {
178
+ return "array";
179
+ }
180
+
181
+ // Fallback to text
182
+ return "text";
183
+ });
184
+
185
+ /**
186
+ * Get enum options as string array for select/checkbox components
187
+ */
188
+ const enumOptions = $derived.by((): string[] => {
189
+ if (!schema.enum) return [];
190
+ return schema.enum.map((opt) => String(opt));
191
+ });
192
+
193
+ /**
194
+ * Get select options for select-options type
195
+ * Handles both oneOf (standard) and options (legacy) patterns
196
+ */
197
+ const selectOptions = $derived(getSchemaOptions(schema));
198
+
199
+ /**
200
+ * Get current value as the appropriate type
201
+ */
202
+ const stringValue = $derived(String(value ?? ""));
203
+ const numberValue = $derived(value as number | string);
204
+ const booleanValue = $derived(Boolean(value ?? schema.default ?? false));
205
+ const arrayValue = $derived.by((): string[] => {
206
+ if (Array.isArray(value)) {
207
+ return value.map((v) => String(v));
208
+ }
209
+ return [];
210
+ });
211
+ const arrayItems = $derived.by((): unknown[] => {
212
+ if (Array.isArray(value)) {
213
+ return value;
214
+ }
215
+ return [];
216
+ });
217
+
218
+ /**
219
+ * Get helpful message for missing editor registration
220
+ */
221
+ function getEditorHint(editorType: string): string {
222
+ switch (editorType) {
223
+ case "code-editor-fallback":
224
+ return "Code editor requires: import { registerCodeEditorField } from '@flowdrop/flowdrop/form/code'; registerCodeEditorField();";
225
+ case "markdown-editor-fallback":
226
+ return "Markdown editor requires: import { registerMarkdownEditorField } from '@flowdrop/flowdrop/form/markdown'; registerMarkdownEditorField();";
227
+ case "template-editor-fallback":
228
+ return "Template editor requires: import { registerTemplateEditorField } from '@flowdrop/flowdrop/form/code'; registerTemplateEditorField();";
229
+ default:
230
+ return "This field type requires additional registration.";
231
+ }
232
+ }
219
233
  </script>
220
234
 
221
- {#if fieldType !== 'hidden'}
222
- <FormFieldWrapper
223
- id={fieldKey}
224
- label={fieldLabel}
225
- {required}
226
- description={schema.title ? schema.description : undefined}
227
- {animationDelay}
228
- >
229
- {#if fieldType === 'registered' && registeredComponent}
230
- <!-- Render registered custom component -->
231
- <!-- darkTheme: use schema value if explicitly set, otherwise derive from resolved theme -->
232
- <registeredComponent.component
233
- id={fieldKey}
234
- {value}
235
- placeholder={schema.placeholder ?? ''}
236
- {required}
237
- ariaDescribedBy={descriptionId}
238
- height={schema.height as string | undefined}
239
- darkTheme={schema.darkTheme ?? getResolvedTheme() === 'dark'}
240
- autoFormat={schema.autoFormat as boolean | undefined}
241
- showToolbar={schema.showToolbar as boolean | undefined}
242
- showStatusBar={schema.showStatusBar as boolean | undefined}
243
- spellChecker={schema.spellChecker as boolean | undefined}
244
- variables={schema.variables}
245
- placeholderExample={schema.placeholderExample as string | undefined}
246
- onChange={(val: unknown) => onChange(val)}
247
- />
248
- {:else if fieldType === 'checkbox-group'}
249
- <FormCheckboxGroup
250
- id={fieldKey}
251
- value={arrayValue}
252
- options={enumOptions}
253
- ariaDescribedBy={descriptionId}
254
- onChange={(val) => onChange(val)}
255
- />
256
- {:else if fieldType === 'select-enum'}
257
- <FormSelect
258
- id={fieldKey}
259
- value={stringValue}
260
- options={enumOptions}
261
- {required}
262
- ariaDescribedBy={descriptionId}
263
- onChange={(val) => onChange(val)}
264
- />
265
- {:else if fieldType === 'textarea'}
266
- <FormTextarea
267
- id={fieldKey}
268
- value={stringValue}
269
- placeholder={schema.placeholder ?? ''}
270
- {required}
271
- ariaDescribedBy={descriptionId}
272
- onChange={(val) => onChange(val)}
273
- />
274
- {:else if fieldType === 'text'}
275
- <FormTextField
276
- id={fieldKey}
277
- value={stringValue}
278
- placeholder={schema.placeholder ?? ''}
279
- {required}
280
- ariaDescribedBy={descriptionId}
281
- onChange={(val) => onChange(val)}
282
- />
283
- {:else if fieldType === 'number'}
284
- <FormNumberField
285
- id={fieldKey}
286
- value={numberValue}
287
- placeholder={schema.placeholder ?? ''}
288
- min={schema.minimum}
289
- max={schema.maximum}
290
- {required}
291
- ariaDescribedBy={descriptionId}
292
- onChange={(val) => onChange(val)}
293
- />
294
- {:else if fieldType === 'range'}
295
- <FormRangeField
296
- id={fieldKey}
297
- value={numberValue}
298
- min={schema.minimum}
299
- max={schema.maximum}
300
- step={schema.step}
301
- {required}
302
- ariaDescribedBy={descriptionId}
303
- onChange={(val) => onChange(val)}
304
- />
305
- {:else if fieldType === 'toggle'}
306
- <FormToggle
307
- id={fieldKey}
308
- value={booleanValue}
309
- ariaDescribedBy={descriptionId}
310
- onChange={(val) => onChange(val)}
311
- />
312
- {:else if fieldType === 'select-options'}
313
- <FormSelect
314
- id={fieldKey}
315
- value={stringValue}
316
- options={selectOptions}
317
- {required}
318
- ariaDescribedBy={descriptionId}
319
- onChange={(val) => onChange(val)}
320
- />
321
- {:else if fieldType === 'array' && schema.items}
322
- <FormArray
323
- id={fieldKey}
324
- value={arrayItems}
325
- itemSchema={schema.items}
326
- minItems={schema.minItems}
327
- maxItems={schema.maxItems}
328
- addLabel={`Add ${schema.items.title ?? 'Item'}`}
329
- onChange={(val) => onChange(val)}
330
- />
331
- {:else if fieldType.endsWith('-fallback')}
332
- <!-- Fallback for unregistered heavy editors -->
333
- <div class="form-field-fallback">
334
- <div class="form-field-fallback__message">
335
- <svg
336
- xmlns="http://www.w3.org/2000/svg"
337
- viewBox="0 0 20 20"
338
- fill="currentColor"
339
- class="form-field-fallback__icon"
340
- >
341
- <path
342
- fill-rule="evenodd"
343
- d="M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a.75.75 0 000 1.5h.253a.25.25 0 01.244.304l-.459 2.066A1.75 1.75 0 0010.747 15H11a.75.75 0 000-1.5h-.253a.25.25 0 01-.244-.304l.459-2.066A1.75 1.75 0 009.253 9H9z"
344
- clip-rule="evenodd"
345
- />
346
- </svg>
347
- <span>Editor component not registered</span>
348
- </div>
349
- <p class="form-field-fallback__hint">
350
- {getEditorHint(fieldType)}
351
- </p>
352
- <!-- Provide a basic textarea fallback for editing -->
353
- <FormTextarea
354
- id={fieldKey}
355
- value={typeof value === 'string' ? value : JSON.stringify(value, null, 2)}
356
- placeholder={schema.placeholder ?? 'Enter value...'}
357
- {required}
358
- ariaDescribedBy={descriptionId}
359
- onChange={(val) => {
360
- // Try to parse as JSON for object types
361
- if (schema.type === 'object' || schema.format === 'json') {
362
- try {
363
- onChange(JSON.parse(val));
364
- } catch {
365
- onChange(val);
366
- }
367
- } else {
368
- onChange(val);
369
- }
370
- }}
371
- />
372
- </div>
373
- {:else}
374
- <!-- Fallback to text input -->
375
- <FormTextField
376
- id={fieldKey}
377
- value={stringValue}
378
- placeholder={schema.placeholder ?? ''}
379
- ariaDescribedBy={descriptionId}
380
- onChange={(val) => onChange(val)}
381
- />
382
- {/if}
383
- </FormFieldWrapper>
235
+ {#if fieldType !== "hidden"}
236
+ <FormFieldWrapper
237
+ id={fieldKey}
238
+ label={fieldLabel}
239
+ {required}
240
+ description={schema.title ? schema.description : undefined}
241
+ {animationDelay}
242
+ >
243
+ {#if fieldType === "registered" && registeredComponent}
244
+ <!-- Render registered custom component -->
245
+ <!-- darkTheme: use schema value if explicitly set, otherwise derive from resolved theme -->
246
+ <registeredComponent.component
247
+ id={fieldKey}
248
+ {value}
249
+ placeholder={schema.placeholder ?? ""}
250
+ {required}
251
+ ariaDescribedBy={descriptionId}
252
+ height={schema.height as string | undefined}
253
+ darkTheme={schema.darkTheme ?? getResolvedTheme() === "dark"}
254
+ autoFormat={schema.autoFormat as boolean | undefined}
255
+ showToolbar={schema.showToolbar as boolean | undefined}
256
+ showStatusBar={schema.showStatusBar as boolean | undefined}
257
+ spellChecker={schema.spellChecker as boolean | undefined}
258
+ variables={schema.variables}
259
+ placeholderExample={schema.placeholderExample as string | undefined}
260
+ onChange={(val: unknown) => onChange(val)}
261
+ />
262
+ {:else if fieldType === "checkbox-group"}
263
+ <FormCheckboxGroup
264
+ id={fieldKey}
265
+ value={arrayValue}
266
+ options={enumOptions}
267
+ ariaDescribedBy={descriptionId}
268
+ onChange={(val) => onChange(val)}
269
+ />
270
+ {:else if fieldType === "select-enum"}
271
+ <FormSelect
272
+ id={fieldKey}
273
+ value={stringValue}
274
+ options={enumOptions}
275
+ {required}
276
+ ariaDescribedBy={descriptionId}
277
+ onChange={(val) => onChange(val)}
278
+ />
279
+ {:else if fieldType === "textarea"}
280
+ <FormTextarea
281
+ id={fieldKey}
282
+ value={stringValue}
283
+ placeholder={schema.placeholder ?? ""}
284
+ {required}
285
+ ariaDescribedBy={descriptionId}
286
+ onChange={(val) => onChange(val)}
287
+ />
288
+ {:else if fieldType === "text"}
289
+ <FormTextField
290
+ id={fieldKey}
291
+ value={stringValue}
292
+ placeholder={schema.placeholder ?? ""}
293
+ {required}
294
+ ariaDescribedBy={descriptionId}
295
+ onChange={(val) => onChange(val)}
296
+ />
297
+ {:else if fieldType === "number"}
298
+ <FormNumberField
299
+ id={fieldKey}
300
+ value={numberValue}
301
+ placeholder={schema.placeholder ?? ""}
302
+ min={schema.minimum}
303
+ max={schema.maximum}
304
+ {required}
305
+ ariaDescribedBy={descriptionId}
306
+ onChange={(val) => onChange(val)}
307
+ />
308
+ {:else if fieldType === "range"}
309
+ <FormRangeField
310
+ id={fieldKey}
311
+ value={numberValue}
312
+ min={schema.minimum}
313
+ max={schema.maximum}
314
+ step={schema.step}
315
+ {required}
316
+ ariaDescribedBy={descriptionId}
317
+ onChange={(val) => onChange(val)}
318
+ />
319
+ {:else if fieldType === "toggle"}
320
+ <FormToggle
321
+ id={fieldKey}
322
+ value={booleanValue}
323
+ ariaDescribedBy={descriptionId}
324
+ onChange={(val) => onChange(val)}
325
+ />
326
+ {:else if fieldType === "select-options"}
327
+ <FormSelect
328
+ id={fieldKey}
329
+ value={stringValue}
330
+ options={selectOptions}
331
+ {required}
332
+ ariaDescribedBy={descriptionId}
333
+ onChange={(val) => onChange(val)}
334
+ />
335
+ {:else if fieldType === "array" && schema.items}
336
+ <FormArray
337
+ id={fieldKey}
338
+ value={arrayItems}
339
+ itemSchema={schema.items}
340
+ minItems={schema.minItems}
341
+ maxItems={schema.maxItems}
342
+ addLabel={`Add ${schema.items.title ?? "Item"}`}
343
+ onChange={(val) => onChange(val)}
344
+ />
345
+ {:else if fieldType.endsWith("-fallback")}
346
+ <!-- Fallback for unregistered heavy editors -->
347
+ <div class="form-field-fallback">
348
+ <div class="form-field-fallback__message">
349
+ <svg
350
+ xmlns="http://www.w3.org/2000/svg"
351
+ viewBox="0 0 20 20"
352
+ fill="currentColor"
353
+ class="form-field-fallback__icon"
354
+ >
355
+ <path
356
+ fill-rule="evenodd"
357
+ d="M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a.75.75 0 000 1.5h.253a.25.25 0 01.244.304l-.459 2.066A1.75 1.75 0 0010.747 15H11a.75.75 0 000-1.5h-.253a.25.25 0 01-.244-.304l.459-2.066A1.75 1.75 0 009.253 9H9z"
358
+ clip-rule="evenodd"
359
+ />
360
+ </svg>
361
+ <span>Editor component not registered</span>
362
+ </div>
363
+ <p class="form-field-fallback__hint">
364
+ {getEditorHint(fieldType)}
365
+ </p>
366
+ <!-- Provide a basic textarea fallback for editing -->
367
+ <FormTextarea
368
+ id={fieldKey}
369
+ value={typeof value === "string"
370
+ ? value
371
+ : JSON.stringify(value, null, 2)}
372
+ placeholder={schema.placeholder ?? "Enter value..."}
373
+ {required}
374
+ ariaDescribedBy={descriptionId}
375
+ onChange={(val) => {
376
+ // Try to parse as JSON for object types
377
+ if (schema.type === "object" || schema.format === "json") {
378
+ try {
379
+ onChange(JSON.parse(val));
380
+ } catch {
381
+ onChange(val);
382
+ }
383
+ } else {
384
+ onChange(val);
385
+ }
386
+ }}
387
+ />
388
+ </div>
389
+ {:else}
390
+ <!-- Fallback to text input -->
391
+ <FormTextField
392
+ id={fieldKey}
393
+ value={stringValue}
394
+ placeholder={schema.placeholder ?? ""}
395
+ ariaDescribedBy={descriptionId}
396
+ onChange={(val) => onChange(val)}
397
+ />
398
+ {/if}
399
+ </FormFieldWrapper>
384
400
  {/if}
385
401
 
386
402
  <style>
387
- .form-field-fallback {
388
- display: flex;
389
- flex-direction: column;
390
- gap: 0.5rem;
391
- }
392
-
393
- .form-field-fallback__message {
394
- display: flex;
395
- align-items: center;
396
- gap: 0.5rem;
397
- padding: 0.5rem 0.75rem;
398
- background-color: var(--fd-warning-muted);
399
- border: 1px solid var(--fd-warning);
400
- border-radius: var(--fd-radius-md);
401
- color: var(--fd-warning-hover);
402
- font-size: 0.8125rem;
403
- font-weight: 500;
404
- }
405
-
406
- .form-field-fallback__icon {
407
- width: 1rem;
408
- height: 1rem;
409
- flex-shrink: 0;
410
- color: var(--fd-warning);
411
- }
412
-
413
- .form-field-fallback__hint {
414
- margin: 0;
415
- padding: 0.5rem 0.75rem;
416
- background-color: var(--fd-muted);
417
- border: 1px solid var(--fd-border);
418
- border-radius: var(--fd-radius-md);
419
- font-family: 'JetBrains Mono', 'Fira Code', 'Monaco', 'Menlo', monospace;
420
- font-size: 0.6875rem;
421
- line-height: 1.5;
422
- color: var(--fd-muted-foreground);
423
- word-break: break-word;
424
- }
403
+ .form-field-fallback {
404
+ display: flex;
405
+ flex-direction: column;
406
+ gap: 0.5rem;
407
+ }
408
+
409
+ .form-field-fallback__message {
410
+ display: flex;
411
+ align-items: center;
412
+ gap: 0.5rem;
413
+ padding: 0.5rem 0.75rem;
414
+ background-color: var(--fd-warning-muted);
415
+ border: 1px solid var(--fd-warning);
416
+ border-radius: var(--fd-radius-md);
417
+ color: var(--fd-warning-hover);
418
+ font-size: 0.8125rem;
419
+ font-weight: 500;
420
+ }
421
+
422
+ .form-field-fallback__icon {
423
+ width: 1rem;
424
+ height: 1rem;
425
+ flex-shrink: 0;
426
+ color: var(--fd-warning);
427
+ }
428
+
429
+ .form-field-fallback__hint {
430
+ margin: 0;
431
+ padding: 0.5rem 0.75rem;
432
+ background-color: var(--fd-muted);
433
+ border: 1px solid var(--fd-border);
434
+ border-radius: var(--fd-radius-md);
435
+ font-family: "JetBrains Mono", "Fira Code", "Monaco", "Menlo", monospace;
436
+ font-size: 0.6875rem;
437
+ line-height: 1.5;
438
+ color: var(--fd-muted-foreground);
439
+ word-break: break-word;
440
+ }
425
441
  </style>