@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,425 @@
1
+ <!--
2
+ FormFieldLight Component
3
+ Factory component that renders the appropriate field based on schema type.
4
+
5
+ This is the "light" version that uses the field registry for heavy components
6
+ (code editor, markdown editor, template editor) instead of static imports.
7
+
8
+ Heavy components are only loaded if registered via:
9
+ - `registerCodeEditorField()` from "@flowdrop/flowdrop/form/code"
10
+ - `registerMarkdownEditorField()` from "@flowdrop/flowdrop/form/markdown"
11
+
12
+ Features:
13
+ - Automatically selects the correct field component based on schema
14
+ - Wraps fields with FormFieldWrapper for consistent layout
15
+ - Supports all basic field types (string, number, boolean, checkbox group, range)
16
+ - Uses standard JSON Schema patterns (enum, oneOf) for select fields
17
+ - Heavy editors (code, markdown, template) require explicit registration
18
+ - Shows helpful fallback when heavy editors aren't registered
19
+
20
+ Type Resolution Order:
21
+ 1. Check field registry for custom/heavy components (highest priority)
22
+ 2. format: 'hidden' -> skip rendering (return nothing)
23
+ 3. enum with multiple: true -> FormCheckboxGroup
24
+ 4. enum -> FormSelect (simple values without labels)
25
+ 5. oneOf with const/title (labeled options) -> FormSelect
26
+ 6. format: 'multiline' -> FormTextarea
27
+ 7. format: 'range' (number/integer) -> FormRangeField
28
+ 8. type: 'string' -> FormTextField
29
+ 9. type: 'number' or 'integer' -> FormNumberField
30
+ 10. type: 'boolean' -> FormToggle
31
+ 11. type: 'array' -> FormArray
32
+ 12. fallback -> FormTextField
33
+ -->
34
+
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
+ }
219
+ </script>
220
+
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>
384
+ {/if}
385
+
386
+ <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
+ }
425
+ </style>
@@ -0,0 +1,18 @@
1
+ import type { FieldSchema } from './types.js';
2
+ interface Props {
3
+ /** Unique key/id for the field */
4
+ fieldKey: string;
5
+ /** Field schema definition */
6
+ schema: FieldSchema;
7
+ /** Current field value */
8
+ value: unknown;
9
+ /** Whether the field is required */
10
+ required?: boolean;
11
+ /** Animation delay index for staggered animations */
12
+ animationIndex?: number;
13
+ /** Callback when the field value changes */
14
+ onChange: (value: unknown) => void;
15
+ }
16
+ declare const FormFieldLight: import("svelte").Component<Props, {}, "">;
17
+ type FormFieldLight = ReturnType<typeof FormFieldLight>;
18
+ export default FormFieldLight;
@@ -0,0 +1,53 @@
1
+ <script module>
2
+ import { defineMeta } from '@storybook/addon-svelte-csf';
3
+ import FormFieldWrapper from './FormFieldWrapper.svelte';
4
+
5
+ const { Story } = defineMeta({
6
+ title: 'Form/FormFieldWrapper',
7
+ component: FormFieldWrapper,
8
+ tags: ['autodocs'],
9
+ argTypes: {
10
+ label: { control: 'text' },
11
+ required: { control: 'boolean' },
12
+ description: { control: 'text' }
13
+ },
14
+ args: {
15
+ id: 'demo-wrapper',
16
+ label: 'Field Label'
17
+ }
18
+ });
19
+ </script>
20
+
21
+ <Story name="Default" args={{ label: 'Username' }}>
22
+ <input
23
+ type="text"
24
+ id="demo-wrapper"
25
+ placeholder="Enter username"
26
+ style="width: 100%; padding: 0.625rem 0.875rem; border: 1px solid var(--fd-border); border-radius: var(--fd-radius-lg); font-size: var(--fd-text-sm);"
27
+ />
28
+ </Story>
29
+
30
+ <Story
31
+ name="With Description"
32
+ args={{
33
+ label: 'Email',
34
+ description: "We'll never share your email with anyone.",
35
+ required: true
36
+ }}
37
+ >
38
+ <input
39
+ type="email"
40
+ id="demo-wrapper"
41
+ placeholder="email@example.com"
42
+ style="width: 100%; padding: 0.625rem 0.875rem; border: 1px solid var(--fd-border); border-radius: var(--fd-radius-lg); font-size: var(--fd-text-sm);"
43
+ />
44
+ </Story>
45
+
46
+ <Story name="Required" args={{ label: 'Password', required: true }}>
47
+ <input
48
+ type="password"
49
+ id="demo-wrapper"
50
+ placeholder="Enter password"
51
+ style="width: 100%; padding: 0.625rem 0.875rem; border: 1px solid var(--fd-border); border-radius: var(--fd-radius-lg); font-size: var(--fd-text-sm);"
52
+ />
53
+ </Story>
@@ -0,0 +1,27 @@
1
+ export default FormFieldWrapper;
2
+ type FormFieldWrapper = SvelteComponent<{
3
+ [x: string]: never;
4
+ }, {
5
+ [evt: string]: CustomEvent<any>;
6
+ }, {}> & {
7
+ $$bindings?: string | undefined;
8
+ };
9
+ declare const FormFieldWrapper: $$__sveltets_2_IsomorphicComponent<{
10
+ [x: string]: never;
11
+ }, {
12
+ [evt: string]: CustomEvent<any>;
13
+ }, {}, {}, string>;
14
+ import FormFieldWrapper from './FormFieldWrapper.svelte';
15
+ interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
16
+ new (options: import("svelte").ComponentConstructorOptions<Props>): import("svelte").SvelteComponent<Props, Events, Slots> & {
17
+ $$bindings?: Bindings;
18
+ } & Exports;
19
+ (internal: unknown, props: {
20
+ $$events?: Events;
21
+ $$slots?: Slots;
22
+ }): Exports & {
23
+ $set?: any;
24
+ $on?: any;
25
+ };
26
+ z_$$bindings?: Bindings;
27
+ }
@@ -0,0 +1,125 @@
1
+ <!--
2
+ FormFieldWrapper Component
3
+ Provides consistent layout for form fields with label, description, and animations
4
+
5
+ Features:
6
+ - Proper label associations with for/id attributes
7
+ - ARIA describedby for field descriptions
8
+ - Staggered fade-in animations
9
+ - Required field indicators
10
+ -->
11
+
12
+ <script lang="ts">
13
+ import type { Snippet } from 'svelte';
14
+
15
+ interface Props {
16
+ /** Field identifier for label association */
17
+ id: string;
18
+ /** Display label text */
19
+ label: string;
20
+ /** Whether the field is required */
21
+ required?: boolean;
22
+ /** Description/help text for the field */
23
+ description?: string;
24
+ /** Animation delay in milliseconds */
25
+ animationDelay?: number;
26
+ /** Slot content for the field input */
27
+ children: Snippet;
28
+ }
29
+
30
+ let { id, label, required = false, description, animationDelay = 0, children }: Props = $props();
31
+
32
+ /**
33
+ * Computed description ID for ARIA association
34
+ */
35
+ const descriptionId = $derived(description ? `${id}-description` : undefined);
36
+ </script>
37
+
38
+ <div class="form-field" style="animation-delay: {animationDelay}ms">
39
+ <!-- Field Label -->
40
+ <label class="form-field__label" for={id}>
41
+ <span class="form-field__label-text">
42
+ {label}
43
+ </span>
44
+ {#if required}
45
+ <span class="form-field__required" aria-label="required">*</span>
46
+ {/if}
47
+ </label>
48
+
49
+ <!-- Field Input Container -->
50
+ <div class="form-field__input-wrapper">
51
+ {@render children()}
52
+ </div>
53
+
54
+ <!-- Field Description -->
55
+ {#if description}
56
+ <p id={descriptionId} class="form-field__description">
57
+ {description}
58
+ </p>
59
+ {/if}
60
+ </div>
61
+
62
+ <style>
63
+ /* ============================================
64
+ FIELD CONTAINER
65
+ ============================================ */
66
+
67
+ .form-field {
68
+ display: flex;
69
+ flex-direction: column;
70
+ gap: 0.5rem;
71
+ animation: fieldFadeIn 0.3s ease-out forwards;
72
+ opacity: 0;
73
+ transform: translateY(4px);
74
+ }
75
+
76
+ @keyframes fieldFadeIn {
77
+ to {
78
+ opacity: 1;
79
+ transform: translateY(0);
80
+ }
81
+ }
82
+
83
+ /* ============================================
84
+ LABELS
85
+ ============================================ */
86
+
87
+ .form-field__label {
88
+ display: flex;
89
+ align-items: center;
90
+ gap: 0.25rem;
91
+ font-size: 0.8125rem;
92
+ font-weight: 600;
93
+ color: var(--fd-foreground);
94
+ letter-spacing: -0.01em;
95
+ }
96
+
97
+ .form-field__label-text {
98
+ line-height: 1.4;
99
+ }
100
+
101
+ .form-field__required {
102
+ color: var(--fd-error);
103
+ font-weight: 500;
104
+ }
105
+
106
+ /* ============================================
107
+ INPUT WRAPPER
108
+ ============================================ */
109
+
110
+ .form-field__input-wrapper {
111
+ position: relative;
112
+ }
113
+
114
+ /* ============================================
115
+ FIELD DESCRIPTION
116
+ ============================================ */
117
+
118
+ .form-field__description {
119
+ margin: 0;
120
+ font-size: var(--fd-text-xs);
121
+ color: var(--fd-muted-foreground);
122
+ line-height: 1.5;
123
+ padding-left: 0.125rem;
124
+ }
125
+ </style>
@@ -0,0 +1,18 @@
1
+ import type { Snippet } from 'svelte';
2
+ interface Props {
3
+ /** Field identifier for label association */
4
+ id: string;
5
+ /** Display label text */
6
+ label: string;
7
+ /** Whether the field is required */
8
+ required?: boolean;
9
+ /** Description/help text for the field */
10
+ description?: string;
11
+ /** Animation delay in milliseconds */
12
+ animationDelay?: number;
13
+ /** Slot content for the field input */
14
+ children: Snippet;
15
+ }
16
+ declare const FormFieldWrapper: import("svelte").Component<Props, {}, "">;
17
+ type FormFieldWrapper = ReturnType<typeof FormFieldWrapper>;
18
+ export default FormFieldWrapper;