@flowdrop/flowdrop 1.0.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 (403) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +252 -0
  3. package/dist/adapters/WorkflowAdapter.d.ts +167 -0
  4. package/dist/adapters/WorkflowAdapter.js +368 -0
  5. package/dist/adapters/agentspec/AgentSpecAdapter.d.ts +96 -0
  6. package/dist/adapters/agentspec/AgentSpecAdapter.js +626 -0
  7. package/dist/adapters/agentspec/agentAdapter.d.ts +59 -0
  8. package/dist/adapters/agentspec/agentAdapter.js +91 -0
  9. package/dist/adapters/agentspec/autoLayout.d.ts +34 -0
  10. package/dist/adapters/agentspec/autoLayout.js +127 -0
  11. package/dist/adapters/agentspec/componentTypeDefaults.d.ts +73 -0
  12. package/dist/adapters/agentspec/componentTypeDefaults.js +238 -0
  13. package/dist/adapters/agentspec/defaultNodeTypes.d.ts +53 -0
  14. package/dist/adapters/agentspec/defaultNodeTypes.js +561 -0
  15. package/dist/adapters/agentspec/index.d.ts +37 -0
  16. package/dist/adapters/agentspec/index.js +39 -0
  17. package/dist/adapters/agentspec/validator.d.ts +34 -0
  18. package/dist/adapters/agentspec/validator.js +169 -0
  19. package/dist/api/enhanced-client.d.ts +183 -0
  20. package/dist/api/enhanced-client.js +430 -0
  21. package/dist/components/App.svelte +981 -0
  22. package/dist/components/App.svelte.d.ts +54 -0
  23. package/dist/components/CanvasBanner.stories.svelte +29 -0
  24. package/dist/components/CanvasBanner.stories.svelte.d.ts +27 -0
  25. package/dist/components/CanvasBanner.svelte +57 -0
  26. package/dist/components/CanvasBanner.svelte.d.ts +8 -0
  27. package/dist/components/ConfigForm.svelte +1138 -0
  28. package/dist/components/ConfigForm.svelte.d.ts +44 -0
  29. package/dist/components/ConfigModal.svelte +188 -0
  30. package/dist/components/ConfigModal.svelte.d.ts +13 -0
  31. package/dist/components/ConfigPanel.stories.svelte +47 -0
  32. package/dist/components/ConfigPanel.stories.svelte.d.ts +27 -0
  33. package/dist/components/ConfigPanel.svelte +182 -0
  34. package/dist/components/ConfigPanel.svelte.d.ts +32 -0
  35. package/dist/components/ConnectionLine.svelte +32 -0
  36. package/dist/components/ConnectionLine.svelte.d.ts +3 -0
  37. package/dist/components/EdgeRefresher.svelte +41 -0
  38. package/dist/components/EdgeRefresher.svelte.d.ts +9 -0
  39. package/dist/components/FlowDropZone.svelte +83 -0
  40. package/dist/components/FlowDropZone.svelte.d.ts +13 -0
  41. package/dist/components/LoadingSpinner.stories.svelte +30 -0
  42. package/dist/components/LoadingSpinner.stories.svelte.d.ts +27 -0
  43. package/dist/components/LoadingSpinner.svelte +36 -0
  44. package/dist/components/LoadingSpinner.svelte.d.ts +8 -0
  45. package/dist/components/Logo.stories.svelte +22 -0
  46. package/dist/components/Logo.stories.svelte.d.ts +27 -0
  47. package/dist/components/Logo.svelte +102 -0
  48. package/dist/components/Logo.svelte.d.ts +26 -0
  49. package/dist/components/LogsSidebar.svelte +563 -0
  50. package/dist/components/LogsSidebar.svelte.d.ts +17 -0
  51. package/dist/components/MarkdownDisplay.stories.svelte +36 -0
  52. package/dist/components/MarkdownDisplay.stories.svelte.d.ts +27 -0
  53. package/dist/components/MarkdownDisplay.svelte +29 -0
  54. package/dist/components/MarkdownDisplay.svelte.d.ts +7 -0
  55. package/dist/components/Navbar.stories.svelte +53 -0
  56. package/dist/components/Navbar.stories.svelte.d.ts +27 -0
  57. package/dist/components/Navbar.svelte +726 -0
  58. package/dist/components/Navbar.svelte.d.ts +29 -0
  59. package/dist/components/NodeSidebar.svelte +762 -0
  60. package/dist/components/NodeSidebar.svelte.d.ts +9 -0
  61. package/dist/components/NodeStatusOverlay.stories.svelte +85 -0
  62. package/dist/components/NodeStatusOverlay.stories.svelte.d.ts +27 -0
  63. package/dist/components/NodeStatusOverlay.svelte +327 -0
  64. package/dist/components/NodeStatusOverlay.svelte.d.ts +11 -0
  65. package/dist/components/PipelineStatus.svelte +314 -0
  66. package/dist/components/PipelineStatus.svelte.d.ts +20 -0
  67. package/dist/components/PortCoordinateTracker.svelte +58 -0
  68. package/dist/components/PortCoordinateTracker.svelte.d.ts +12 -0
  69. package/dist/components/ReadOnlyDetails.svelte +170 -0
  70. package/dist/components/ReadOnlyDetails.svelte.d.ts +25 -0
  71. package/dist/components/SchemaForm.stories.svelte +116 -0
  72. package/dist/components/SchemaForm.stories.svelte.d.ts +27 -0
  73. package/dist/components/SchemaForm.svelte +536 -0
  74. package/dist/components/SchemaForm.svelte.d.ts +83 -0
  75. package/dist/components/SettingsModal.svelte +279 -0
  76. package/dist/components/SettingsModal.svelte.d.ts +23 -0
  77. package/dist/components/SettingsPanel.svelte +638 -0
  78. package/dist/components/SettingsPanel.svelte.d.ts +21 -0
  79. package/dist/components/StatusIcon.stories.svelte +60 -0
  80. package/dist/components/StatusIcon.stories.svelte.d.ts +27 -0
  81. package/dist/components/StatusIcon.svelte +119 -0
  82. package/dist/components/StatusIcon.svelte.d.ts +10 -0
  83. package/dist/components/StatusLabel.stories.svelte +17 -0
  84. package/dist/components/StatusLabel.stories.svelte.d.ts +27 -0
  85. package/dist/components/StatusLabel.svelte +33 -0
  86. package/dist/components/StatusLabel.svelte.d.ts +7 -0
  87. package/dist/components/ThemeToggle.stories.svelte +25 -0
  88. package/dist/components/ThemeToggle.stories.svelte.d.ts +27 -0
  89. package/dist/components/ThemeToggle.svelte +185 -0
  90. package/dist/components/ThemeToggle.svelte.d.ts +14 -0
  91. package/dist/components/UniversalNode.svelte +155 -0
  92. package/dist/components/UniversalNode.svelte.d.ts +15 -0
  93. package/dist/components/WorkflowEditor.svelte +1035 -0
  94. package/dist/components/WorkflowEditor.svelte.d.ts +23 -0
  95. package/dist/components/form/FormArray.svelte +1049 -0
  96. package/dist/components/form/FormArray.svelte.d.ts +22 -0
  97. package/dist/components/form/FormAutocomplete.svelte +1009 -0
  98. package/dist/components/form/FormAutocomplete.svelte.d.ts +25 -0
  99. package/dist/components/form/FormCheckboxGroup.stories.svelte +28 -0
  100. package/dist/components/form/FormCheckboxGroup.stories.svelte.d.ts +27 -0
  101. package/dist/components/form/FormCheckboxGroup.svelte +155 -0
  102. package/dist/components/form/FormCheckboxGroup.svelte.d.ts +17 -0
  103. package/dist/components/form/FormCodeEditor.svelte +458 -0
  104. package/dist/components/form/FormCodeEditor.svelte.d.ts +25 -0
  105. package/dist/components/form/FormField.svelte +417 -0
  106. package/dist/components/form/FormField.svelte.d.ts +29 -0
  107. package/dist/components/form/FormFieldLight.svelte +425 -0
  108. package/dist/components/form/FormFieldLight.svelte.d.ts +18 -0
  109. package/dist/components/form/FormFieldWrapper.stories.svelte +53 -0
  110. package/dist/components/form/FormFieldWrapper.stories.svelte.d.ts +27 -0
  111. package/dist/components/form/FormFieldWrapper.svelte +125 -0
  112. package/dist/components/form/FormFieldWrapper.svelte.d.ts +18 -0
  113. package/dist/components/form/FormFieldset.svelte +142 -0
  114. package/dist/components/form/FormFieldset.svelte.d.ts +11 -0
  115. package/dist/components/form/FormMarkdownEditor.svelte +752 -0
  116. package/dist/components/form/FormMarkdownEditor.svelte.d.ts +33 -0
  117. package/dist/components/form/FormNumberField.stories.svelte +36 -0
  118. package/dist/components/form/FormNumberField.stories.svelte.d.ts +27 -0
  119. package/dist/components/form/FormNumberField.svelte +112 -0
  120. package/dist/components/form/FormNumberField.svelte.d.ts +25 -0
  121. package/dist/components/form/FormRangeField.stories.svelte +31 -0
  122. package/dist/components/form/FormRangeField.stories.svelte.d.ts +27 -0
  123. package/dist/components/form/FormRangeField.svelte +246 -0
  124. package/dist/components/form/FormRangeField.svelte.d.ts +23 -0
  125. package/dist/components/form/FormSelect.stories.svelte +50 -0
  126. package/dist/components/form/FormSelect.stories.svelte.d.ts +27 -0
  127. package/dist/components/form/FormSelect.svelte +129 -0
  128. package/dist/components/form/FormSelect.svelte.d.ts +20 -0
  129. package/dist/components/form/FormTemplateEditor.svelte +825 -0
  130. package/dist/components/form/FormTemplateEditor.svelte.d.ts +41 -0
  131. package/dist/components/form/FormTextField.stories.svelte +30 -0
  132. package/dist/components/form/FormTextField.stories.svelte.d.ts +27 -0
  133. package/dist/components/form/FormTextField.svelte +91 -0
  134. package/dist/components/form/FormTextField.svelte.d.ts +19 -0
  135. package/dist/components/form/FormTextarea.stories.svelte +34 -0
  136. package/dist/components/form/FormTextarea.stories.svelte.d.ts +27 -0
  137. package/dist/components/form/FormTextarea.svelte +97 -0
  138. package/dist/components/form/FormTextarea.svelte.d.ts +21 -0
  139. package/dist/components/form/FormToggle.stories.svelte +30 -0
  140. package/dist/components/form/FormToggle.stories.svelte.d.ts +27 -0
  141. package/dist/components/form/FormToggle.svelte +126 -0
  142. package/dist/components/form/FormToggle.svelte.d.ts +19 -0
  143. package/dist/components/form/FormUISchemaRenderer.svelte +136 -0
  144. package/dist/components/form/FormUISchemaRenderer.svelte.d.ts +32 -0
  145. package/dist/components/form/index.d.ts +50 -0
  146. package/dist/components/form/index.js +54 -0
  147. package/dist/components/form/templateAutocomplete.d.ts +29 -0
  148. package/dist/components/form/templateAutocomplete.js +254 -0
  149. package/dist/components/form/types.d.ts +485 -0
  150. package/dist/components/form/types.js +73 -0
  151. package/dist/components/interrupt/ChoicePrompt.stories.svelte +52 -0
  152. package/dist/components/interrupt/ChoicePrompt.stories.svelte.d.ts +27 -0
  153. package/dist/components/interrupt/ChoicePrompt.svelte +401 -0
  154. package/dist/components/interrupt/ChoicePrompt.svelte.d.ts +23 -0
  155. package/dist/components/interrupt/ConfirmationPrompt.stories.svelte +71 -0
  156. package/dist/components/interrupt/ConfirmationPrompt.stories.svelte.d.ts +27 -0
  157. package/dist/components/interrupt/ConfirmationPrompt.svelte +292 -0
  158. package/dist/components/interrupt/ConfirmationPrompt.svelte.d.ts +25 -0
  159. package/dist/components/interrupt/FormPrompt.svelte +236 -0
  160. package/dist/components/interrupt/FormPrompt.svelte.d.ts +23 -0
  161. package/dist/components/interrupt/InterruptBubble.svelte +601 -0
  162. package/dist/components/interrupt/InterruptBubble.svelte.d.ts +16 -0
  163. package/dist/components/interrupt/ReviewPrompt.stories.svelte +67 -0
  164. package/dist/components/interrupt/ReviewPrompt.stories.svelte.d.ts +27 -0
  165. package/dist/components/interrupt/ReviewPrompt.svelte +861 -0
  166. package/dist/components/interrupt/ReviewPrompt.svelte.d.ts +23 -0
  167. package/dist/components/interrupt/TextInputPrompt.stories.svelte +47 -0
  168. package/dist/components/interrupt/TextInputPrompt.stories.svelte.d.ts +27 -0
  169. package/dist/components/interrupt/TextInputPrompt.svelte +346 -0
  170. package/dist/components/interrupt/TextInputPrompt.svelte.d.ts +23 -0
  171. package/dist/components/interrupt/index.d.ts +13 -0
  172. package/dist/components/interrupt/index.js +15 -0
  173. package/dist/components/layouts/MainLayout.svelte +718 -0
  174. package/dist/components/layouts/MainLayout.svelte.d.ts +62 -0
  175. package/dist/components/nodes/GatewayNode.stories.svelte +108 -0
  176. package/dist/components/nodes/GatewayNode.stories.svelte.d.ts +26 -0
  177. package/dist/components/nodes/GatewayNode.svelte +591 -0
  178. package/dist/components/nodes/GatewayNode.svelte.d.ts +15 -0
  179. package/dist/components/nodes/IdeaNode.stories.svelte +52 -0
  180. package/dist/components/nodes/IdeaNode.stories.svelte.d.ts +26 -0
  181. package/dist/components/nodes/IdeaNode.svelte +455 -0
  182. package/dist/components/nodes/IdeaNode.svelte.d.ts +24 -0
  183. package/dist/components/nodes/NotesNode.stories.svelte +76 -0
  184. package/dist/components/nodes/NotesNode.stories.svelte.d.ts +26 -0
  185. package/dist/components/nodes/NotesNode.svelte +378 -0
  186. package/dist/components/nodes/NotesNode.svelte.d.ts +24 -0
  187. package/dist/components/nodes/SimpleNode.stories.svelte +159 -0
  188. package/dist/components/nodes/SimpleNode.stories.svelte.d.ts +26 -0
  189. package/dist/components/nodes/SimpleNode.svelte +451 -0
  190. package/dist/components/nodes/SimpleNode.svelte.d.ts +25 -0
  191. package/dist/components/nodes/SquareNode.stories.svelte +82 -0
  192. package/dist/components/nodes/SquareNode.stories.svelte.d.ts +26 -0
  193. package/dist/components/nodes/SquareNode.svelte +407 -0
  194. package/dist/components/nodes/SquareNode.svelte.d.ts +25 -0
  195. package/dist/components/nodes/TerminalNode.stories.svelte +25 -0
  196. package/dist/components/nodes/TerminalNode.stories.svelte.d.ts +26 -0
  197. package/dist/components/nodes/TerminalNode.svelte +690 -0
  198. package/dist/components/nodes/TerminalNode.svelte.d.ts +25 -0
  199. package/dist/components/nodes/ToolNode.stories.svelte +189 -0
  200. package/dist/components/nodes/ToolNode.stories.svelte.d.ts +26 -0
  201. package/dist/components/nodes/ToolNode.svelte +471 -0
  202. package/dist/components/nodes/ToolNode.svelte.d.ts +36 -0
  203. package/dist/components/nodes/WorkflowNode.stories.svelte +55 -0
  204. package/dist/components/nodes/WorkflowNode.stories.svelte.d.ts +26 -0
  205. package/dist/components/nodes/WorkflowNode.svelte +571 -0
  206. package/dist/components/nodes/WorkflowNode.svelte.d.ts +15 -0
  207. package/dist/components/playground/ChatPanel.svelte +905 -0
  208. package/dist/components/playground/ChatPanel.svelte.d.ts +46 -0
  209. package/dist/components/playground/ExecutionLogs.svelte +488 -0
  210. package/dist/components/playground/ExecutionLogs.svelte.d.ts +14 -0
  211. package/dist/components/playground/InputCollector.svelte +444 -0
  212. package/dist/components/playground/InputCollector.svelte.d.ts +16 -0
  213. package/dist/components/playground/MessageBubble.stories.svelte +62 -0
  214. package/dist/components/playground/MessageBubble.stories.svelte.d.ts +27 -0
  215. package/dist/components/playground/MessageBubble.svelte +633 -0
  216. package/dist/components/playground/MessageBubble.svelte.d.ts +24 -0
  217. package/dist/components/playground/Playground.svelte +1075 -0
  218. package/dist/components/playground/Playground.svelte.d.ts +25 -0
  219. package/dist/components/playground/PlaygroundModal.svelte +220 -0
  220. package/dist/components/playground/PlaygroundModal.svelte.d.ts +25 -0
  221. package/dist/components/playground/SessionManager.svelte +538 -0
  222. package/dist/components/playground/SessionManager.svelte.d.ts +20 -0
  223. package/dist/config/agentSpecEndpoints.d.ts +70 -0
  224. package/dist/config/agentSpecEndpoints.js +65 -0
  225. package/dist/config/constants.d.ts +43 -0
  226. package/dist/config/constants.js +31 -0
  227. package/dist/config/defaultCategories.d.ts +7 -0
  228. package/dist/config/defaultCategories.js +126 -0
  229. package/dist/config/defaultPortConfig.d.ts +6 -0
  230. package/dist/config/defaultPortConfig.js +201 -0
  231. package/dist/config/endpoints.d.ts +160 -0
  232. package/dist/config/endpoints.js +146 -0
  233. package/dist/config/runtimeConfig.d.ts +47 -0
  234. package/dist/config/runtimeConfig.js +80 -0
  235. package/dist/core/index.d.ts +75 -0
  236. package/dist/core/index.js +92 -0
  237. package/dist/display/index.d.ts +29 -0
  238. package/dist/display/index.js +36 -0
  239. package/dist/editor/index.d.ts +95 -0
  240. package/dist/editor/index.js +138 -0
  241. package/dist/form/code.d.ts +101 -0
  242. package/dist/form/code.js +168 -0
  243. package/dist/form/fieldRegistry.d.ts +169 -0
  244. package/dist/form/fieldRegistry.js +152 -0
  245. package/dist/form/full.d.ts +56 -0
  246. package/dist/form/full.js +80 -0
  247. package/dist/form/index.d.ts +77 -0
  248. package/dist/form/index.js +91 -0
  249. package/dist/form/markdown.d.ts +69 -0
  250. package/dist/form/markdown.js +103 -0
  251. package/dist/helpers/nodeLayoutHelper.d.ts +14 -0
  252. package/dist/helpers/nodeLayoutHelper.js +19 -0
  253. package/dist/helpers/proximityConnect.d.ts +94 -0
  254. package/dist/helpers/proximityConnect.js +314 -0
  255. package/dist/helpers/workflowEditorHelper.d.ts +183 -0
  256. package/dist/helpers/workflowEditorHelper.js +595 -0
  257. package/dist/index.d.ts +37 -0
  258. package/dist/index.js +64 -0
  259. package/dist/mocks/app-environment.d.ts +8 -0
  260. package/dist/mocks/app-environment.js +16 -0
  261. package/dist/mocks/app-forms.d.ts +2 -0
  262. package/dist/mocks/app-forms.js +22 -0
  263. package/dist/mocks/app-navigation.d.ts +5 -0
  264. package/dist/mocks/app-navigation.js +36 -0
  265. package/dist/mocks/app-stores.d.ts +14 -0
  266. package/dist/mocks/app-stores.js +26 -0
  267. package/dist/playground/index.d.ts +131 -0
  268. package/dist/playground/index.js +172 -0
  269. package/dist/playground/mount.d.ts +203 -0
  270. package/dist/playground/mount.js +235 -0
  271. package/dist/registry/BaseRegistry.d.ts +92 -0
  272. package/dist/registry/BaseRegistry.js +124 -0
  273. package/dist/registry/builtinFormats.d.ts +23 -0
  274. package/dist/registry/builtinFormats.js +70 -0
  275. package/dist/registry/builtinNodes.d.ts +77 -0
  276. package/dist/registry/builtinNodes.js +211 -0
  277. package/dist/registry/index.d.ts +8 -0
  278. package/dist/registry/index.js +12 -0
  279. package/dist/registry/nodeComponentRegistry.d.ts +276 -0
  280. package/dist/registry/nodeComponentRegistry.js +262 -0
  281. package/dist/registry/plugin.d.ts +215 -0
  282. package/dist/registry/plugin.js +249 -0
  283. package/dist/registry/workflowFormatRegistry.d.ts +122 -0
  284. package/dist/registry/workflowFormatRegistry.js +96 -0
  285. package/dist/schema/index.d.ts +23 -0
  286. package/dist/schema/index.js +23 -0
  287. package/dist/schemas/v1/workflow.schema.json +1078 -0
  288. package/dist/services/agentSpecExecutionService.d.ts +106 -0
  289. package/dist/services/agentSpecExecutionService.js +334 -0
  290. package/dist/services/api.d.ts +115 -0
  291. package/dist/services/api.js +214 -0
  292. package/dist/services/apiVariableService.d.ts +114 -0
  293. package/dist/services/apiVariableService.js +338 -0
  294. package/dist/services/autoSaveService.d.ts +112 -0
  295. package/dist/services/autoSaveService.js +227 -0
  296. package/dist/services/categoriesApi.d.ts +14 -0
  297. package/dist/services/categoriesApi.js +49 -0
  298. package/dist/services/draftStorage.d.ts +171 -0
  299. package/dist/services/draftStorage.js +299 -0
  300. package/dist/services/dynamicSchemaService.d.ts +108 -0
  301. package/dist/services/dynamicSchemaService.js +444 -0
  302. package/dist/services/globalSave.d.ts +69 -0
  303. package/dist/services/globalSave.js +248 -0
  304. package/dist/services/historyService.d.ts +208 -0
  305. package/dist/services/historyService.js +321 -0
  306. package/dist/services/interruptService.d.ts +133 -0
  307. package/dist/services/interruptService.js +280 -0
  308. package/dist/services/nodeExecutionService.d.ts +63 -0
  309. package/dist/services/nodeExecutionService.js +266 -0
  310. package/dist/services/playgroundService.d.ts +130 -0
  311. package/dist/services/playgroundService.js +321 -0
  312. package/dist/services/portConfigApi.d.ts +14 -0
  313. package/dist/services/portConfigApi.js +54 -0
  314. package/dist/services/settingsService.d.ts +92 -0
  315. package/dist/services/settingsService.js +196 -0
  316. package/dist/services/toastService.d.ts +156 -0
  317. package/dist/services/toastService.js +265 -0
  318. package/dist/services/variableService.d.ts +141 -0
  319. package/dist/services/variableService.js +463 -0
  320. package/dist/services/workflowStorage.d.ts +37 -0
  321. package/dist/services/workflowStorage.js +116 -0
  322. package/dist/settings/index.d.ts +25 -0
  323. package/dist/settings/index.js +33 -0
  324. package/dist/stores/categoriesStore.svelte.d.ts +32 -0
  325. package/dist/stores/categoriesStore.svelte.js +77 -0
  326. package/dist/stores/editorStateMachine.svelte.d.ts +42 -0
  327. package/dist/stores/editorStateMachine.svelte.js +132 -0
  328. package/dist/stores/historyStore.svelte.d.ts +136 -0
  329. package/dist/stores/historyStore.svelte.js +207 -0
  330. package/dist/stores/interruptStore.svelte.d.ts +179 -0
  331. package/dist/stores/interruptStore.svelte.js +346 -0
  332. package/dist/stores/playgroundStore.svelte.d.ts +230 -0
  333. package/dist/stores/playgroundStore.svelte.js +515 -0
  334. package/dist/stores/portCoordinateStore.svelte.d.ts +66 -0
  335. package/dist/stores/portCoordinateStore.svelte.js +186 -0
  336. package/dist/stores/settingsStore.svelte.d.ts +158 -0
  337. package/dist/stores/settingsStore.svelte.js +544 -0
  338. package/dist/stores/workflowStore.svelte.d.ts +260 -0
  339. package/dist/stores/workflowStore.svelte.js +649 -0
  340. package/dist/stories/CanvasDecorator.svelte +49 -0
  341. package/dist/stories/CanvasDecorator.svelte.d.ts +8 -0
  342. package/dist/stories/NodeDecorator.svelte +73 -0
  343. package/dist/stories/NodeDecorator.svelte.d.ts +8 -0
  344. package/dist/stories/utils.d.ts +93 -0
  345. package/dist/stories/utils.js +122 -0
  346. package/dist/styles/base.css +1300 -0
  347. package/dist/styles/toast.css +35 -0
  348. package/dist/styles/tokens.css +475 -0
  349. package/dist/svelte-app.d.ts +150 -0
  350. package/dist/svelte-app.js +295 -0
  351. package/dist/types/agentspec.d.ts +318 -0
  352. package/dist/types/agentspec.js +48 -0
  353. package/dist/types/auth.d.ts +263 -0
  354. package/dist/types/auth.js +229 -0
  355. package/dist/types/config.d.ts +151 -0
  356. package/dist/types/config.js +7 -0
  357. package/dist/types/events.d.ts +190 -0
  358. package/dist/types/events.js +30 -0
  359. package/dist/types/index.d.ts +1234 -0
  360. package/dist/types/index.js +27 -0
  361. package/dist/types/interrupt.d.ts +390 -0
  362. package/dist/types/interrupt.js +145 -0
  363. package/dist/types/interruptState.d.ts +211 -0
  364. package/dist/types/interruptState.js +308 -0
  365. package/dist/types/playground.d.ts +351 -0
  366. package/dist/types/playground.js +95 -0
  367. package/dist/types/settings.d.ts +189 -0
  368. package/dist/types/settings.js +97 -0
  369. package/dist/types/uischema.d.ts +144 -0
  370. package/dist/types/uischema.js +51 -0
  371. package/dist/utils/colors.d.ts +288 -0
  372. package/dist/utils/colors.js +548 -0
  373. package/dist/utils/config.d.ts +37 -0
  374. package/dist/utils/config.js +226 -0
  375. package/dist/utils/connections.d.ts +125 -0
  376. package/dist/utils/connections.js +414 -0
  377. package/dist/utils/errors.d.ts +28 -0
  378. package/dist/utils/errors.js +44 -0
  379. package/dist/utils/fetchWithAuth.d.ts +25 -0
  380. package/dist/utils/fetchWithAuth.js +34 -0
  381. package/dist/utils/handleIds.d.ts +35 -0
  382. package/dist/utils/handleIds.js +58 -0
  383. package/dist/utils/handlePositioning.d.ts +31 -0
  384. package/dist/utils/handlePositioning.js +35 -0
  385. package/dist/utils/icons.d.ts +106 -0
  386. package/dist/utils/icons.js +157 -0
  387. package/dist/utils/logger.d.ts +47 -0
  388. package/dist/utils/logger.js +72 -0
  389. package/dist/utils/nodeStatus.d.ts +53 -0
  390. package/dist/utils/nodeStatus.js +183 -0
  391. package/dist/utils/nodeTypes.d.ts +117 -0
  392. package/dist/utils/nodeTypes.js +244 -0
  393. package/dist/utils/nodeWrapper.d.ts +39 -0
  394. package/dist/utils/nodeWrapper.js +62 -0
  395. package/dist/utils/performanceUtils.d.ts +30 -0
  396. package/dist/utils/performanceUtils.js +108 -0
  397. package/dist/utils/sanitize.d.ts +19 -0
  398. package/dist/utils/sanitize.js +31 -0
  399. package/dist/utils/uischema.d.ts +52 -0
  400. package/dist/utils/uischema.js +88 -0
  401. package/dist/utils/validation.d.ts +29 -0
  402. package/dist/utils/validation.js +39 -0
  403. package/package.json +292 -0
@@ -0,0 +1,1049 @@
1
+ <!--
2
+ FormArray Component
3
+ Dynamic array field that allows adding, removing, and reordering items
4
+ Generates sub-forms for each item based on the schema's items property
5
+
6
+ Features:
7
+ - Add/remove items with animated transitions
8
+ - Supports simple types (string, number, boolean) and complex types (objects)
9
+ - Recursively uses FormField for item rendering
10
+ - Drag handle for future reordering support
11
+ - Collapsible items for complex object arrays
12
+ - Empty state with helpful prompt
13
+
14
+ Accessibility:
15
+ - Proper ARIA labels for add/remove buttons
16
+ - Keyboard navigation support
17
+ - Screen reader friendly item descriptions
18
+ -->
19
+
20
+ <script lang="ts">
21
+ import Icon from '@iconify/svelte';
22
+ import type { FieldSchema } from './types.js';
23
+
24
+ interface Props {
25
+ /** Field identifier */
26
+ id: string;
27
+ /** Current array value */
28
+ value: unknown[];
29
+ /** Schema for array items */
30
+ itemSchema: FieldSchema;
31
+ /** Minimum number of items required */
32
+ minItems?: number;
33
+ /** Maximum number of items allowed */
34
+ maxItems?: number;
35
+ /** Label for add button */
36
+ addLabel?: string;
37
+ /** Whether the field is disabled */
38
+ disabled?: boolean;
39
+ /** Callback when value changes */
40
+ onChange: (value: unknown[]) => void;
41
+ }
42
+
43
+ let {
44
+ id,
45
+ value = [],
46
+ itemSchema,
47
+ minItems = 0,
48
+ maxItems,
49
+ addLabel = 'Add Item',
50
+ disabled = false,
51
+ onChange
52
+ }: Props = $props();
53
+
54
+ /**
55
+ * Ensure value is always an array
56
+ */
57
+ const items = $derived(Array.isArray(value) ? value : []);
58
+
59
+ /**
60
+ * Check if we can add more items
61
+ */
62
+ const canAddItem = $derived(maxItems === undefined || items.length < maxItems);
63
+
64
+ /**
65
+ * Check if we can remove items
66
+ */
67
+ const canRemoveItem = $derived(items.length > minItems);
68
+
69
+ /**
70
+ * Determine if items are simple (primitive) or complex (objects)
71
+ */
72
+ const isSimpleType = $derived(
73
+ itemSchema.type === 'string' ||
74
+ itemSchema.type === 'number' ||
75
+ itemSchema.type === 'integer' ||
76
+ itemSchema.type === 'boolean'
77
+ );
78
+
79
+ /**
80
+ * Get the default value for a new item based on schema
81
+ */
82
+ function getDefaultValue(): unknown {
83
+ if (itemSchema.default !== undefined) {
84
+ return itemSchema.default;
85
+ }
86
+
87
+ switch (itemSchema.type) {
88
+ case 'string':
89
+ return '';
90
+ case 'number':
91
+ case 'integer':
92
+ return 0;
93
+ case 'boolean':
94
+ return false;
95
+ case 'object':
96
+ // Create default object from properties
97
+ if (itemSchema.properties) {
98
+ const defaultObj: Record<string, unknown> = {};
99
+ Object.entries(itemSchema.properties).forEach(([key, propSchema]) => {
100
+ if (propSchema.default !== undefined) {
101
+ defaultObj[key] = propSchema.default;
102
+ } else {
103
+ defaultObj[key] = getDefaultForType(propSchema.type);
104
+ }
105
+ });
106
+ return defaultObj;
107
+ }
108
+ return {};
109
+ case 'array':
110
+ return [];
111
+ default:
112
+ return '';
113
+ }
114
+ }
115
+
116
+ /**
117
+ * Get default value for a specific type
118
+ */
119
+ function getDefaultForType(type: string | undefined): unknown {
120
+ switch (type) {
121
+ case 'string':
122
+ return '';
123
+ case 'number':
124
+ case 'integer':
125
+ return 0;
126
+ case 'boolean':
127
+ return false;
128
+ case 'object':
129
+ return {};
130
+ case 'array':
131
+ return [];
132
+ default:
133
+ return '';
134
+ }
135
+ }
136
+
137
+ /**
138
+ * Add a new item to the array
139
+ */
140
+ function addItem(): void {
141
+ if (!canAddItem || disabled) return;
142
+ const newValue = [...items, getDefaultValue()];
143
+ onChange(newValue);
144
+ }
145
+
146
+ /**
147
+ * Remove an item at the specified index
148
+ */
149
+ function removeItem(index: number): void {
150
+ if (!canRemoveItem || disabled) return;
151
+ const newValue = items.filter((_, i) => i !== index);
152
+ onChange(newValue);
153
+ }
154
+
155
+ /**
156
+ * Update an item at the specified index
157
+ */
158
+ function updateItem(index: number, newItemValue: unknown): void {
159
+ const newValue = items.map((item, i) => (i === index ? newItemValue : item));
160
+ onChange(newValue);
161
+ }
162
+
163
+ /**
164
+ * Update a property of an object item
165
+ */
166
+ function updateObjectProperty(index: number, propertyKey: string, propertyValue: unknown): void {
167
+ const currentItem = items[index] as Record<string, unknown>;
168
+ const updatedItem = { ...currentItem, [propertyKey]: propertyValue };
169
+ updateItem(index, updatedItem);
170
+ }
171
+
172
+ /**
173
+ * Move an item up in the array
174
+ */
175
+ function moveItemUp(index: number): void {
176
+ if (index === 0 || disabled) return;
177
+ const newValue = [...items];
178
+ [newValue[index - 1], newValue[index]] = [newValue[index], newValue[index - 1]];
179
+ onChange(newValue);
180
+ }
181
+
182
+ /**
183
+ * Move an item down in the array
184
+ */
185
+ function moveItemDown(index: number): void {
186
+ if (index === items.length - 1 || disabled) return;
187
+ const newValue = [...items];
188
+ [newValue[index], newValue[index + 1]] = [newValue[index + 1], newValue[index]];
189
+ onChange(newValue);
190
+ }
191
+
192
+ /**
193
+ * Get item label for display
194
+ */
195
+ function getItemLabel(index: number, item: unknown): string {
196
+ if (isSimpleType) {
197
+ const itemStr = String(item);
198
+ return itemStr.length > 30
199
+ ? `${itemStr.substring(0, 30)}...`
200
+ : itemStr || `Item ${index + 1}`;
201
+ }
202
+
203
+ // For objects, try to find a name/label/title property
204
+ if (typeof item === 'object' && item !== null) {
205
+ const obj = item as Record<string, unknown>;
206
+ const labelKey = Object.keys(obj).find((k) =>
207
+ ['name', 'label', 'title', 'id'].includes(k.toLowerCase())
208
+ );
209
+ if (labelKey && obj[labelKey]) {
210
+ return String(obj[labelKey]);
211
+ }
212
+ }
213
+
214
+ return `Item ${index + 1}`;
215
+ }
216
+
217
+ /**
218
+ * Track collapsed state for complex items
219
+ */
220
+ let collapsedItems = $state<Set<number>>(new Set());
221
+
222
+ /**
223
+ * Toggle collapsed state for an item
224
+ */
225
+ function toggleCollapse(index: number): void {
226
+ const newCollapsed = new Set(collapsedItems);
227
+ if (newCollapsed.has(index)) {
228
+ newCollapsed.delete(index);
229
+ } else {
230
+ newCollapsed.add(index);
231
+ }
232
+ collapsedItems = newCollapsed;
233
+ }
234
+
235
+ /**
236
+ * Check if an item is collapsed
237
+ */
238
+ function isCollapsed(index: number): boolean {
239
+ return collapsedItems.has(index);
240
+ }
241
+ </script>
242
+
243
+ <div class="form-array" class:form-array--disabled={disabled}>
244
+ <!-- Array Items -->
245
+ {#if items.length > 0}
246
+ <div class="form-array__items">
247
+ {#each items as item, index (index)}
248
+ <div
249
+ class="form-array__item"
250
+ class:form-array__item--simple={isSimpleType}
251
+ class:form-array__item--complex={!isSimpleType}
252
+ style="animation-delay: {index * 50}ms"
253
+ >
254
+ <!-- Item Header -->
255
+ <div class="form-array__item-header">
256
+ <!-- Item index/label -->
257
+ {#if !isSimpleType}
258
+ <button
259
+ type="button"
260
+ class="form-array__item-toggle"
261
+ onclick={() => toggleCollapse(index)}
262
+ aria-expanded={!isCollapsed(index)}
263
+ aria-label={isCollapsed(index) ? 'Expand item' : 'Collapse item'}
264
+ >
265
+ <Icon
266
+ icon={isCollapsed(index) ? 'heroicons:chevron-right' : 'heroicons:chevron-down'}
267
+ class="form-array__toggle-icon"
268
+ />
269
+ <span class="form-array__item-label">{getItemLabel(index, item)}</span>
270
+ </button>
271
+ {:else}
272
+ <span class="form-array__item-number">#{index + 1}</span>
273
+ {/if}
274
+
275
+ <!-- Action buttons group -->
276
+ <div class="form-array__actions">
277
+ <!-- Move Up button -->
278
+ <button
279
+ type="button"
280
+ class="form-array__action-btn form-array__action-btn--move"
281
+ onclick={() => moveItemUp(index)}
282
+ disabled={index === 0 || disabled}
283
+ aria-label="Move item {index + 1} up"
284
+ title="Move up"
285
+ >
286
+ <Icon icon="heroicons:arrow-up" />
287
+ </button>
288
+
289
+ <!-- Move Down button -->
290
+ <button
291
+ type="button"
292
+ class="form-array__action-btn form-array__action-btn--move"
293
+ onclick={() => moveItemDown(index)}
294
+ disabled={index === items.length - 1 || disabled}
295
+ aria-label="Move item {index + 1} down"
296
+ title="Move down"
297
+ >
298
+ <Icon icon="heroicons:arrow-down" />
299
+ </button>
300
+
301
+ <!-- Delete button -->
302
+ <button
303
+ type="button"
304
+ class="form-array__action-btn form-array__action-btn--delete"
305
+ onclick={() => removeItem(index)}
306
+ disabled={!canRemoveItem || disabled}
307
+ aria-label="Delete item {index + 1}"
308
+ title="Delete item"
309
+ >
310
+ <Icon icon="heroicons:trash" />
311
+ </button>
312
+ </div>
313
+ </div>
314
+
315
+ <!-- Item Content -->
316
+ <div
317
+ class="form-array__item-content"
318
+ class:form-array__item-content--collapsed={!isSimpleType && isCollapsed(index)}
319
+ >
320
+ {#if isSimpleType}
321
+ <!-- Simple type: render inline input -->
322
+ {#if itemSchema.type === 'string'}
323
+ {#if itemSchema.format === 'multiline'}
324
+ <textarea
325
+ class="form-array__input form-array__textarea"
326
+ value={String(item ?? '')}
327
+ placeholder={itemSchema.placeholder ?? ''}
328
+ rows={3}
329
+ oninput={(e) => updateItem(index, e.currentTarget.value)}
330
+ {disabled}
331
+ ></textarea>
332
+ {:else}
333
+ <input
334
+ type="text"
335
+ class="form-array__input"
336
+ value={String(item ?? '')}
337
+ placeholder={itemSchema.placeholder ?? ''}
338
+ oninput={(e) => updateItem(index, e.currentTarget.value)}
339
+ {disabled}
340
+ />
341
+ {/if}
342
+ {:else if itemSchema.type === 'number' || itemSchema.type === 'integer'}
343
+ <input
344
+ type="number"
345
+ class="form-array__input form-array__input--number"
346
+ value={item as number}
347
+ placeholder={itemSchema.placeholder ?? ''}
348
+ min={itemSchema.minimum}
349
+ max={itemSchema.maximum}
350
+ oninput={(e) => {
351
+ const val = e.currentTarget.value;
352
+ updateItem(index, val === '' ? '' : Number(val));
353
+ }}
354
+ {disabled}
355
+ />
356
+ {:else if itemSchema.type === 'boolean'}
357
+ <label class="form-array__toggle-wrapper">
358
+ <input
359
+ type="checkbox"
360
+ class="form-array__checkbox-input"
361
+ checked={Boolean(item)}
362
+ onchange={(e) => updateItem(index, e.currentTarget.checked)}
363
+ {disabled}
364
+ />
365
+ <span class="form-array__toggle-track">
366
+ <span class="form-array__toggle-thumb"></span>
367
+ </span>
368
+ <span class="form-array__toggle-label">
369
+ {item ? 'Yes' : 'No'}
370
+ </span>
371
+ </label>
372
+ {:else if itemSchema.enum}
373
+ <!-- Enum: render select -->
374
+ <select
375
+ class="form-array__select"
376
+ value={String(item ?? '')}
377
+ onchange={(e) => updateItem(index, e.currentTarget.value)}
378
+ {disabled}
379
+ >
380
+ {#each itemSchema.enum as option}
381
+ <option value={String(option)}>{String(option)}</option>
382
+ {/each}
383
+ </select>
384
+ {:else}
385
+ <!-- Fallback to text -->
386
+ <input
387
+ type="text"
388
+ class="form-array__input"
389
+ value={String(item ?? '')}
390
+ placeholder={itemSchema.placeholder ?? ''}
391
+ oninput={(e) => updateItem(index, e.currentTarget.value)}
392
+ {disabled}
393
+ />
394
+ {/if}
395
+ {:else if itemSchema.type === 'object' && itemSchema.properties}
396
+ <!-- Complex type: render sub-form for object properties -->
397
+ {#if !isCollapsed(index)}
398
+ <div class="form-array__subform">
399
+ {#each Object.entries(itemSchema.properties) as [propKey, propSchema], propIndex (propKey)}
400
+ {@const propValue = (item as Record<string, unknown>)?.[propKey]}
401
+ {@const isRequired = itemSchema.required?.includes(propKey) ?? false}
402
+ {@const propFieldSchema = propSchema as FieldSchema}
403
+
404
+ <div
405
+ class="form-array__subform-field"
406
+ style="animation-delay: {propIndex * 20}ms"
407
+ >
408
+ <label class="form-array__subform-label" for="{id}-{index}-{propKey}">
409
+ <span class="form-array__subform-label-text">
410
+ {propFieldSchema.title ?? propKey}
411
+ </span>
412
+ {#if isRequired}
413
+ <span class="form-array__required">*</span>
414
+ {/if}
415
+ </label>
416
+
417
+ <div class="form-array__subform-input">
418
+ {#if propFieldSchema.enum}
419
+ <select
420
+ id="{id}-{index}-{propKey}"
421
+ class="form-array__select"
422
+ value={String(propValue ?? '')}
423
+ onchange={(e) =>
424
+ updateObjectProperty(index, propKey, e.currentTarget.value)}
425
+ {disabled}
426
+ >
427
+ {#each propFieldSchema.enum as option}
428
+ <option value={String(option)}>{String(option)}</option>
429
+ {/each}
430
+ </select>
431
+ {:else if propFieldSchema.type === 'string' && propFieldSchema.format === 'multiline'}
432
+ <textarea
433
+ id="{id}-{index}-{propKey}"
434
+ class="form-array__input form-array__textarea"
435
+ value={String(propValue ?? '')}
436
+ placeholder={propFieldSchema.placeholder ?? ''}
437
+ rows={3}
438
+ oninput={(e) =>
439
+ updateObjectProperty(index, propKey, e.currentTarget.value)}
440
+ {disabled}
441
+ ></textarea>
442
+ {:else if propFieldSchema.type === 'string'}
443
+ <input
444
+ id="{id}-{index}-{propKey}"
445
+ type="text"
446
+ class="form-array__input"
447
+ value={String(propValue ?? '')}
448
+ placeholder={propFieldSchema.placeholder ?? ''}
449
+ oninput={(e) =>
450
+ updateObjectProperty(index, propKey, e.currentTarget.value)}
451
+ {disabled}
452
+ />
453
+ {:else if propFieldSchema.type === 'number' || propFieldSchema.type === 'integer'}
454
+ <input
455
+ id="{id}-{index}-{propKey}"
456
+ type="number"
457
+ class="form-array__input form-array__input--number"
458
+ value={propValue as number}
459
+ placeholder={propFieldSchema.placeholder ?? ''}
460
+ min={propFieldSchema.minimum}
461
+ max={propFieldSchema.maximum}
462
+ oninput={(e) => {
463
+ const val = e.currentTarget.value;
464
+ updateObjectProperty(index, propKey, val === '' ? '' : Number(val));
465
+ }}
466
+ {disabled}
467
+ />
468
+ {:else if propFieldSchema.type === 'boolean'}
469
+ <label class="form-array__toggle-wrapper">
470
+ <input
471
+ id="{id}-{index}-{propKey}"
472
+ type="checkbox"
473
+ class="form-array__checkbox-input"
474
+ checked={Boolean(propValue)}
475
+ onchange={(e) =>
476
+ updateObjectProperty(index, propKey, e.currentTarget.checked)}
477
+ {disabled}
478
+ />
479
+ <span class="form-array__toggle-track">
480
+ <span class="form-array__toggle-thumb"></span>
481
+ </span>
482
+ <span class="form-array__toggle-label">
483
+ {propValue ? 'Yes' : 'No'}
484
+ </span>
485
+ </label>
486
+ {:else}
487
+ <input
488
+ id="{id}-{index}-{propKey}"
489
+ type="text"
490
+ class="form-array__input"
491
+ value={String(propValue ?? '')}
492
+ placeholder={propFieldSchema.placeholder ?? ''}
493
+ oninput={(e) =>
494
+ updateObjectProperty(index, propKey, e.currentTarget.value)}
495
+ {disabled}
496
+ />
497
+ {/if}
498
+ </div>
499
+
500
+ {#if propFieldSchema.description && propFieldSchema.title}
501
+ <p class="form-array__subform-description">{propFieldSchema.description}</p>
502
+ {/if}
503
+ </div>
504
+ {/each}
505
+ </div>
506
+ {/if}
507
+ {:else}
508
+ <!-- Unknown complex type -->
509
+ <div class="form-array__unsupported">
510
+ <p>Complex item type "{itemSchema.type}" is not fully supported.</p>
511
+ </div>
512
+ {/if}
513
+ </div>
514
+ </div>
515
+ {/each}
516
+ </div>
517
+ {:else}
518
+ <!-- Empty State -->
519
+ <div class="form-array__empty">
520
+ <Icon icon="heroicons:squares-plus" class="form-array__empty-icon" />
521
+ <p class="form-array__empty-text">No items yet</p>
522
+ </div>
523
+ {/if}
524
+
525
+ <!-- Add Button -->
526
+ <button
527
+ type="button"
528
+ class="form-array__add-btn"
529
+ onclick={addItem}
530
+ disabled={!canAddItem || disabled}
531
+ aria-label={addLabel}
532
+ >
533
+ <Icon icon="heroicons:plus" />
534
+ <span>{addLabel}</span>
535
+ </button>
536
+
537
+ <!-- Item count and limits -->
538
+ {#if minItems > 0 || maxItems !== undefined}
539
+ <div class="form-array__info">
540
+ <span class="form-array__count">{items.length} item{items.length !== 1 ? 's' : ''}</span>
541
+ {#if minItems > 0}
542
+ <span class="form-array__limit">Min: {minItems}</span>
543
+ {/if}
544
+ {#if maxItems !== undefined}
545
+ <span class="form-array__limit">Max: {maxItems}</span>
546
+ {/if}
547
+ </div>
548
+ {/if}
549
+ </div>
550
+
551
+ <style>
552
+ /* ============================================
553
+ FORM ARRAY CONTAINER
554
+ ============================================ */
555
+
556
+ .form-array {
557
+ display: flex;
558
+ flex-direction: column;
559
+ gap: 0.75rem;
560
+ }
561
+
562
+ .form-array--disabled {
563
+ opacity: 0.6;
564
+ pointer-events: none;
565
+ }
566
+
567
+ /* ============================================
568
+ ITEMS CONTAINER
569
+ ============================================ */
570
+
571
+ .form-array__items {
572
+ display: flex;
573
+ flex-direction: column;
574
+ gap: 0.5rem;
575
+ }
576
+
577
+ /* ============================================
578
+ INDIVIDUAL ITEM
579
+ ============================================ */
580
+
581
+ .form-array__item {
582
+ display: flex;
583
+ flex-direction: column;
584
+ background-color: var(--fd-muted);
585
+ border: 1px solid var(--fd-border);
586
+ border-radius: var(--fd-radius-lg);
587
+ overflow: hidden;
588
+ animation: itemFadeIn 0.25s ease-out forwards;
589
+ opacity: 0;
590
+ transform: translateY(-8px);
591
+ }
592
+
593
+ @keyframes itemFadeIn {
594
+ to {
595
+ opacity: 1;
596
+ transform: translateY(0);
597
+ }
598
+ }
599
+
600
+ .form-array__item--simple .form-array__item-content {
601
+ padding: 0.5rem 0.75rem 0.75rem;
602
+ }
603
+
604
+ .form-array__item--complex .form-array__item-content {
605
+ padding: 0;
606
+ }
607
+
608
+ /* ============================================
609
+ ITEM HEADER
610
+ ============================================ */
611
+
612
+ .form-array__item-header {
613
+ display: flex;
614
+ align-items: center;
615
+ gap: 0.625rem;
616
+ padding: 0.625rem 0.75rem;
617
+ background-color: var(--fd-subtle);
618
+ border-bottom: 1px solid var(--fd-border);
619
+ }
620
+
621
+ .form-array__item--simple .form-array__item-header {
622
+ padding: 0.5rem 0.625rem;
623
+ }
624
+
625
+ /* ============================================
626
+ ITEM NUMBER/LABEL
627
+ ============================================ */
628
+
629
+ .form-array__item-number {
630
+ font-size: var(--fd-text-xs);
631
+ font-weight: 600;
632
+ color: var(--fd-muted-foreground);
633
+ min-width: 1.75rem;
634
+ padding: 0.125rem 0.375rem;
635
+ background-color: var(--fd-border);
636
+ border-radius: var(--fd-radius-sm);
637
+ text-align: center;
638
+ }
639
+
640
+ .form-array__item-toggle {
641
+ display: flex;
642
+ align-items: center;
643
+ gap: 0.5rem;
644
+ flex: 1;
645
+ padding: 0.375rem 0.5rem;
646
+ margin: -0.25rem;
647
+ border: 1px solid transparent;
648
+ background: transparent;
649
+ cursor: pointer;
650
+ text-align: left;
651
+ border-radius: var(--fd-radius-md);
652
+ transition: all var(--fd-transition-fast);
653
+ }
654
+
655
+ .form-array__item-toggle:hover {
656
+ background-color: var(--fd-border);
657
+ }
658
+
659
+ .form-array__item-toggle:focus-visible {
660
+ outline: none;
661
+ border-color: var(--fd-primary);
662
+ box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.2);
663
+ }
664
+
665
+ .form-array__item-toggle :global(svg) {
666
+ width: 1.125rem;
667
+ height: 1.125rem;
668
+ color: var(--fd-muted-foreground);
669
+ transition: transform var(--fd-transition-normal);
670
+ }
671
+
672
+ .form-array__item-label {
673
+ font-size: 0.8125rem;
674
+ font-weight: 600;
675
+ color: var(--fd-foreground);
676
+ }
677
+
678
+ /* ============================================
679
+ ACTION BUTTONS GROUP
680
+ ============================================ */
681
+
682
+ .form-array__actions {
683
+ display: flex;
684
+ align-items: center;
685
+ gap: 0.375rem;
686
+ margin-left: auto;
687
+ }
688
+
689
+ .form-array__action-btn {
690
+ display: flex;
691
+ align-items: center;
692
+ justify-content: center;
693
+ width: 2rem;
694
+ height: 2rem;
695
+ padding: 0;
696
+ border: 1px solid transparent;
697
+ border-radius: 0.375rem;
698
+ cursor: pointer;
699
+ transition: all 0.15s;
700
+ }
701
+
702
+ .form-array__action-btn :global(svg) {
703
+ width: 1rem;
704
+ height: 1rem;
705
+ }
706
+
707
+ .form-array__action-btn:focus-visible {
708
+ outline: none;
709
+ box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.3);
710
+ }
711
+
712
+ .form-array__action-btn:disabled {
713
+ opacity: 0.35;
714
+ cursor: not-allowed;
715
+ }
716
+
717
+ /* Move Up/Down buttons - Blue semantic color */
718
+ .form-array__action-btn--move {
719
+ background-color: var(--fd-primary-muted);
720
+ border-color: var(--fd-primary);
721
+ color: var(--fd-primary-hover);
722
+ }
723
+
724
+ .form-array__action-btn--move:hover:not(:disabled) {
725
+ background-color: var(--fd-primary-muted);
726
+ border-color: var(--fd-primary-hover);
727
+ color: var(--fd-primary-hover);
728
+ }
729
+
730
+ .form-array__action-btn--move:active:not(:disabled) {
731
+ background-color: var(--fd-primary);
732
+ }
733
+
734
+ /* Delete button - Red/Warning semantic color */
735
+ .form-array__action-btn--delete {
736
+ background-color: var(--fd-error-muted);
737
+ border-color: var(--fd-error);
738
+ color: var(--fd-error);
739
+ }
740
+
741
+ .form-array__action-btn--delete:hover:not(:disabled) {
742
+ background-color: var(--fd-error-muted);
743
+ border-color: var(--fd-error-hover);
744
+ color: var(--fd-error-hover);
745
+ }
746
+
747
+ .form-array__action-btn--delete:active:not(:disabled) {
748
+ background-color: var(--fd-error);
749
+ }
750
+
751
+ /* ============================================
752
+ ITEM CONTENT
753
+ ============================================ */
754
+
755
+ .form-array__item-content {
756
+ transition: all 0.2s ease-out;
757
+ }
758
+
759
+ .form-array__item-content--collapsed {
760
+ height: 0;
761
+ overflow: hidden;
762
+ padding: 0 !important;
763
+ }
764
+
765
+ /* ============================================
766
+ INPUTS (Simple Types)
767
+ ============================================ */
768
+
769
+ .form-array__input {
770
+ width: 100%;
771
+ padding: 0.5rem 0.75rem;
772
+ border: 1px solid var(--fd-border);
773
+ border-radius: var(--fd-radius-md);
774
+ font-size: var(--fd-text-sm);
775
+ font-family: inherit;
776
+ color: var(--fd-foreground);
777
+ background-color: var(--fd-background);
778
+ transition: all var(--fd-transition-normal);
779
+ }
780
+
781
+ .form-array__input::placeholder {
782
+ color: var(--fd-muted-foreground);
783
+ }
784
+
785
+ .form-array__input:hover {
786
+ border-color: var(--fd-border-strong);
787
+ }
788
+
789
+ .form-array__input:focus {
790
+ outline: none;
791
+ border-color: var(--fd-primary);
792
+ box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.1);
793
+ }
794
+
795
+ .form-array__input--number {
796
+ font-variant-numeric: tabular-nums;
797
+ }
798
+
799
+ .form-array__textarea {
800
+ resize: vertical;
801
+ min-height: 4rem;
802
+ line-height: 1.5;
803
+ }
804
+
805
+ .form-array__select {
806
+ width: 100%;
807
+ padding: 0.5rem 2rem 0.5rem 0.75rem;
808
+ border: 1px solid var(--fd-border);
809
+ border-radius: var(--fd-radius-md);
810
+ font-size: var(--fd-text-sm);
811
+ font-family: inherit;
812
+ color: var(--fd-foreground);
813
+ background-color: var(--fd-background);
814
+ cursor: pointer;
815
+ appearance: none;
816
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke='%239ca3af'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M19 9l-7 7-7-7'%3E%3C/path%3E%3C/svg%3E");
817
+ background-repeat: no-repeat;
818
+ background-position: right 0.5rem center;
819
+ background-size: 1rem;
820
+ }
821
+
822
+ .form-array__select:hover {
823
+ border-color: var(--fd-border-strong);
824
+ }
825
+
826
+ .form-array__select:focus {
827
+ outline: none;
828
+ border-color: var(--fd-primary);
829
+ box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.1);
830
+ }
831
+
832
+ /* ============================================
833
+ TOGGLE (Boolean in Array)
834
+ ============================================ */
835
+
836
+ .form-array__toggle-wrapper {
837
+ display: flex;
838
+ align-items: center;
839
+ gap: 0.625rem;
840
+ cursor: pointer;
841
+ }
842
+
843
+ .form-array__checkbox-input {
844
+ position: absolute;
845
+ opacity: 0;
846
+ width: 0;
847
+ height: 0;
848
+ }
849
+
850
+ .form-array__toggle-track {
851
+ position: relative;
852
+ width: 2.25rem;
853
+ height: 1.25rem;
854
+ background-color: var(--fd-border-strong);
855
+ border-radius: 0.625rem;
856
+ transition: background-color var(--fd-transition-normal);
857
+ flex-shrink: 0;
858
+ }
859
+
860
+ .form-array__toggle-thumb {
861
+ position: absolute;
862
+ top: 0.125rem;
863
+ left: 0.125rem;
864
+ width: 1rem;
865
+ height: 1rem;
866
+ background-color: var(--fd-background);
867
+ border-radius: 50%;
868
+ box-shadow: var(--fd-shadow-sm);
869
+ transition: transform var(--fd-transition-normal);
870
+ }
871
+
872
+ .form-array__checkbox-input:checked + .form-array__toggle-track {
873
+ background-color: var(--fd-primary);
874
+ }
875
+
876
+ .form-array__checkbox-input:checked + .form-array__toggle-track .form-array__toggle-thumb {
877
+ transform: translateX(1rem);
878
+ }
879
+
880
+ .form-array__toggle-label {
881
+ font-size: 0.8125rem;
882
+ color: var(--fd-muted-foreground);
883
+ }
884
+
885
+ /* ============================================
886
+ SUBFORM (Complex Types)
887
+ ============================================ */
888
+
889
+ .form-array__subform {
890
+ display: flex;
891
+ flex-direction: column;
892
+ gap: 0.75rem;
893
+ padding: 0.75rem;
894
+ background-color: var(--fd-background);
895
+ }
896
+
897
+ .form-array__subform-field {
898
+ display: flex;
899
+ flex-direction: column;
900
+ gap: 0.375rem;
901
+ animation: subfieldFadeIn 0.2s ease-out forwards;
902
+ opacity: 0;
903
+ }
904
+
905
+ @keyframes subfieldFadeIn {
906
+ to {
907
+ opacity: 1;
908
+ }
909
+ }
910
+
911
+ .form-array__subform-label {
912
+ display: flex;
913
+ align-items: center;
914
+ gap: 0.25rem;
915
+ font-size: var(--fd-text-xs);
916
+ font-weight: 600;
917
+ color: var(--fd-muted-foreground);
918
+ }
919
+
920
+ .form-array__subform-label-text {
921
+ line-height: 1.4;
922
+ }
923
+
924
+ .form-array__required {
925
+ color: var(--fd-error);
926
+ font-weight: 500;
927
+ }
928
+
929
+ .form-array__subform-description {
930
+ margin: 0;
931
+ font-size: 0.6875rem;
932
+ color: var(--fd-muted-foreground);
933
+ line-height: 1.4;
934
+ }
935
+
936
+ /* ============================================
937
+ EMPTY STATE
938
+ ============================================ */
939
+
940
+ .form-array__empty {
941
+ display: flex;
942
+ flex-direction: column;
943
+ align-items: center;
944
+ justify-content: center;
945
+ padding: 2rem 1rem;
946
+ background-color: var(--fd-muted);
947
+ border: 2px dashed var(--fd-border-strong);
948
+ border-radius: var(--fd-radius-lg);
949
+ }
950
+
951
+ .form-array__empty :global(svg) {
952
+ width: 2.5rem;
953
+ height: 2.5rem;
954
+ color: var(--fd-muted-foreground);
955
+ margin-bottom: 0.625rem;
956
+ }
957
+
958
+ .form-array__empty-text {
959
+ margin: 0;
960
+ font-size: var(--fd-text-sm);
961
+ font-weight: 500;
962
+ color: var(--fd-muted-foreground);
963
+ }
964
+
965
+ /* ============================================
966
+ ADD BUTTON
967
+ ============================================ */
968
+
969
+ .form-array__add-btn {
970
+ display: inline-flex;
971
+ align-items: center;
972
+ justify-content: center;
973
+ gap: 0.5rem;
974
+ padding: 0.625rem 1rem;
975
+ border: 1px solid var(--fd-success);
976
+ border-radius: var(--fd-radius-lg);
977
+ background-color: var(--fd-success-muted);
978
+ color: var(--fd-success-hover);
979
+ font-size: 0.8125rem;
980
+ font-weight: 600;
981
+ font-family: inherit;
982
+ cursor: pointer;
983
+ transition: all var(--fd-transition-fast);
984
+ }
985
+
986
+ .form-array__add-btn:hover:not(:disabled) {
987
+ background-color: var(--fd-success-muted);
988
+ border-color: var(--fd-success-hover);
989
+ color: var(--fd-success-hover);
990
+ }
991
+
992
+ .form-array__add-btn:focus-visible {
993
+ outline: none;
994
+ box-shadow: 0 0 0 2px rgba(34, 197, 94, 0.3);
995
+ }
996
+
997
+ .form-array__add-btn:active:not(:disabled) {
998
+ background-color: var(--fd-success);
999
+ }
1000
+
1001
+ .form-array__add-btn:disabled {
1002
+ opacity: 0.5;
1003
+ cursor: not-allowed;
1004
+ }
1005
+
1006
+ .form-array__add-btn :global(svg) {
1007
+ width: 1.125rem;
1008
+ height: 1.125rem;
1009
+ }
1010
+
1011
+ /* ============================================
1012
+ INFO BAR
1013
+ ============================================ */
1014
+
1015
+ .form-array__info {
1016
+ display: flex;
1017
+ align-items: center;
1018
+ gap: 0.75rem;
1019
+ font-size: 0.6875rem;
1020
+ color: var(--fd-muted-foreground);
1021
+ }
1022
+
1023
+ .form-array__count {
1024
+ font-weight: 500;
1025
+ }
1026
+
1027
+ .form-array__limit {
1028
+ padding: 0.125rem 0.375rem;
1029
+ background-color: var(--fd-subtle);
1030
+ border-radius: var(--fd-radius-sm);
1031
+ }
1032
+
1033
+ /* ============================================
1034
+ UNSUPPORTED TYPE
1035
+ ============================================ */
1036
+
1037
+ .form-array__unsupported {
1038
+ padding: 0.75rem;
1039
+ background-color: var(--fd-warning-muted);
1040
+ border: 1px solid var(--fd-warning);
1041
+ border-radius: var(--fd-radius-md);
1042
+ color: var(--fd-warning-hover);
1043
+ font-size: var(--fd-text-xs);
1044
+ }
1045
+
1046
+ .form-array__unsupported p {
1047
+ margin: 0;
1048
+ }
1049
+ </style>