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