@flowdrop/flowdrop 1.0.1 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (385) hide show
  1. package/README.md +50 -50
  2. package/dist/adapters/WorkflowAdapter.d.ts +1 -1
  3. package/dist/adapters/WorkflowAdapter.js +25 -25
  4. package/dist/adapters/agentspec/AgentSpecAdapter.d.ts +2 -2
  5. package/dist/adapters/agentspec/AgentSpecAdapter.js +133 -122
  6. package/dist/adapters/agentspec/agentAdapter.d.ts +2 -2
  7. package/dist/adapters/agentspec/agentAdapter.js +10 -10
  8. package/dist/adapters/agentspec/autoLayout.d.ts +1 -1
  9. package/dist/adapters/agentspec/autoLayout.js +2 -2
  10. package/dist/adapters/agentspec/componentTypeDefaults.d.ts +1 -1
  11. package/dist/adapters/agentspec/componentTypeDefaults.js +120 -120
  12. package/dist/adapters/agentspec/defaultNodeTypes.d.ts +2 -2
  13. package/dist/adapters/agentspec/defaultNodeTypes.js +307 -307
  14. package/dist/adapters/agentspec/index.d.ts +10 -10
  15. package/dist/adapters/agentspec/index.js +6 -6
  16. package/dist/adapters/agentspec/validator.d.ts +2 -2
  17. package/dist/adapters/agentspec/validator.js +22 -20
  18. package/dist/api/enhanced-client.d.ts +3 -3
  19. package/dist/api/enhanced-client.js +73 -72
  20. package/dist/components/App.svelte +1090 -961
  21. package/dist/components/App.svelte.d.ts +9 -6
  22. package/dist/components/CanvasBanner.stories.svelte +23 -20
  23. package/dist/components/CanvasBanner.stories.svelte.d.ts +1 -1
  24. package/dist/components/CanvasBanner.svelte +52 -46
  25. package/dist/components/ConfigForm.svelte +1164 -1065
  26. package/dist/components/ConfigForm.svelte.d.ts +2 -2
  27. package/dist/components/ConfigModal.svelte +180 -180
  28. package/dist/components/ConfigModal.svelte.d.ts +1 -1
  29. package/dist/components/ConfigPanel.stories.svelte +35 -35
  30. package/dist/components/ConfigPanel.stories.svelte.d.ts +1 -1
  31. package/dist/components/ConfigPanel.svelte +178 -167
  32. package/dist/components/ConfigPanel.svelte.d.ts +1 -1
  33. package/dist/components/ConnectionLine.svelte +25 -25
  34. package/dist/components/EdgeRefresher.svelte +26 -26
  35. package/dist/components/FlowDropEdge.stories.svelte +179 -143
  36. package/dist/components/FlowDropEdge.svelte +147 -147
  37. package/dist/components/FlowDropEdge.svelte.d.ts +1 -1
  38. package/dist/components/FlowDropZone.svelte +63 -60
  39. package/dist/components/FlowDropZone.svelte.d.ts +1 -1
  40. package/dist/components/LoadingSpinner.stories.svelte +19 -19
  41. package/dist/components/LoadingSpinner.stories.svelte.d.ts +1 -1
  42. package/dist/components/LoadingSpinner.svelte +21 -21
  43. package/dist/components/LoadingSpinner.svelte.d.ts +1 -1
  44. package/dist/components/Logo.stories.svelte +13 -13
  45. package/dist/components/Logo.stories.svelte.d.ts +1 -1
  46. package/dist/components/Logo.svelte +101 -95
  47. package/dist/components/LogsSidebar.svelte +553 -546
  48. package/dist/components/LogsSidebar.svelte.d.ts +1 -1
  49. package/dist/components/MarkdownDisplay.stories.svelte +29 -23
  50. package/dist/components/MarkdownDisplay.stories.svelte.d.ts +1 -1
  51. package/dist/components/MarkdownDisplay.svelte +16 -14
  52. package/dist/components/Navbar.stories.svelte +43 -38
  53. package/dist/components/Navbar.stories.svelte.d.ts +1 -1
  54. package/dist/components/Navbar.svelte +760 -706
  55. package/dist/components/Navbar.svelte.d.ts +1 -1
  56. package/dist/components/NodeSidebar.svelte +905 -746
  57. package/dist/components/NodeSidebar.svelte.d.ts +5 -1
  58. package/dist/components/NodeStatusOverlay.stories.svelte +82 -70
  59. package/dist/components/NodeStatusOverlay.stories.svelte.d.ts +1 -1
  60. package/dist/components/NodeStatusOverlay.svelte +295 -280
  61. package/dist/components/NodeStatusOverlay.svelte.d.ts +3 -3
  62. package/dist/components/PipelineStatus.svelte +326 -300
  63. package/dist/components/PipelineStatus.svelte.d.ts +4 -4
  64. package/dist/components/PortCoordinateTracker.svelte +49 -47
  65. package/dist/components/PortCoordinateTracker.svelte.d.ts +1 -1
  66. package/dist/components/ReadOnlyDetails.svelte +156 -156
  67. package/dist/components/SchemaForm.stories.svelte +106 -98
  68. package/dist/components/SchemaForm.stories.svelte.d.ts +1 -1
  69. package/dist/components/SchemaForm.svelte +490 -463
  70. package/dist/components/SchemaForm.svelte.d.ts +2 -2
  71. package/dist/components/SettingsModal.svelte +226 -223
  72. package/dist/components/SettingsModal.svelte.d.ts +1 -1
  73. package/dist/components/SettingsPanel.svelte +637 -601
  74. package/dist/components/SettingsPanel.svelte.d.ts +1 -1
  75. package/dist/components/StatusIcon.stories.svelte +62 -49
  76. package/dist/components/StatusIcon.stories.svelte.d.ts +1 -1
  77. package/dist/components/StatusIcon.svelte +87 -87
  78. package/dist/components/StatusIcon.svelte.d.ts +2 -2
  79. package/dist/components/StatusLabel.stories.svelte +12 -12
  80. package/dist/components/StatusLabel.stories.svelte.d.ts +1 -1
  81. package/dist/components/StatusLabel.svelte +19 -19
  82. package/dist/components/ThemeToggle.stories.svelte +16 -16
  83. package/dist/components/ThemeToggle.stories.svelte.d.ts +1 -1
  84. package/dist/components/ThemeToggle.svelte +180 -169
  85. package/dist/components/ThemeToggle.svelte.d.ts +1 -1
  86. package/dist/components/UniversalNode.svelte +150 -138
  87. package/dist/components/UniversalNode.svelte.d.ts +3 -3
  88. package/dist/components/WorkflowEditor.svelte +1069 -1014
  89. package/dist/components/WorkflowEditor.svelte.d.ts +4 -4
  90. package/dist/components/form/FormArray.svelte +1034 -973
  91. package/dist/components/form/FormArray.svelte.d.ts +1 -1
  92. package/dist/components/form/FormAutocomplete.svelte +1021 -978
  93. package/dist/components/form/FormAutocomplete.svelte.d.ts +1 -1
  94. package/dist/components/form/FormCheckboxGroup.stories.svelte +23 -20
  95. package/dist/components/form/FormCheckboxGroup.stories.svelte.d.ts +1 -1
  96. package/dist/components/form/FormCheckboxGroup.svelte +136 -136
  97. package/dist/components/form/FormCodeEditor.svelte +452 -434
  98. package/dist/components/form/FormField.svelte +366 -355
  99. package/dist/components/form/FormField.svelte.d.ts +2 -2
  100. package/dist/components/form/FormFieldLight.svelte +400 -384
  101. package/dist/components/form/FormFieldLight.svelte.d.ts +1 -1
  102. package/dist/components/form/FormFieldWrapper.stories.svelte +42 -42
  103. package/dist/components/form/FormFieldWrapper.stories.svelte.d.ts +1 -1
  104. package/dist/components/form/FormFieldWrapper.svelte +100 -93
  105. package/dist/components/form/FormFieldWrapper.svelte.d.ts +1 -1
  106. package/dist/components/form/FormFieldset.svelte +108 -108
  107. package/dist/components/form/FormFieldset.svelte.d.ts +2 -2
  108. package/dist/components/form/FormMarkdownEditor.svelte +758 -725
  109. package/dist/components/form/FormNumberField.stories.svelte +25 -25
  110. package/dist/components/form/FormNumberField.stories.svelte.d.ts +1 -1
  111. package/dist/components/form/FormNumberField.svelte +88 -88
  112. package/dist/components/form/FormRangeField.stories.svelte +20 -20
  113. package/dist/components/form/FormRangeField.stories.svelte.d.ts +1 -1
  114. package/dist/components/form/FormRangeField.svelte +234 -226
  115. package/dist/components/form/FormSelect.stories.svelte +38 -38
  116. package/dist/components/form/FormSelect.stories.svelte.d.ts +1 -1
  117. package/dist/components/form/FormSelect.svelte +101 -101
  118. package/dist/components/form/FormSelect.svelte.d.ts +1 -1
  119. package/dist/components/form/FormTemplateEditor.svelte +847 -798
  120. package/dist/components/form/FormTemplateEditor.svelte.d.ts +1 -1
  121. package/dist/components/form/FormTextField.stories.svelte +29 -23
  122. package/dist/components/form/FormTextField.stories.svelte.d.ts +1 -1
  123. package/dist/components/form/FormTextField.svelte +68 -68
  124. package/dist/components/form/FormTextarea.stories.svelte +28 -25
  125. package/dist/components/form/FormTextarea.stories.svelte.d.ts +1 -1
  126. package/dist/components/form/FormTextarea.svelte +74 -74
  127. package/dist/components/form/FormToggle.stories.svelte +23 -20
  128. package/dist/components/form/FormToggle.stories.svelte.d.ts +1 -1
  129. package/dist/components/form/FormToggle.svelte +98 -98
  130. package/dist/components/form/FormUISchemaRenderer.svelte +120 -113
  131. package/dist/components/form/FormUISchemaRenderer.svelte.d.ts +3 -3
  132. package/dist/components/form/index.d.ts +19 -19
  133. package/dist/components/form/index.js +18 -18
  134. package/dist/components/form/templateAutocomplete.d.ts +2 -2
  135. package/dist/components/form/templateAutocomplete.js +64 -55
  136. package/dist/components/form/types.d.ts +6 -6
  137. package/dist/components/form/types.js +9 -4
  138. package/dist/components/icons/AlertCircleIcon.svelte +11 -0
  139. package/dist/components/icons/AlertCircleIcon.svelte.d.ts +26 -0
  140. package/dist/components/icons/CogIcon.svelte +11 -0
  141. package/dist/components/icons/CogIcon.svelte.d.ts +26 -0
  142. package/dist/components/interrupt/ChoicePrompt.stories.svelte +54 -38
  143. package/dist/components/interrupt/ChoicePrompt.stories.svelte.d.ts +1 -1
  144. package/dist/components/interrupt/ChoicePrompt.svelte +407 -383
  145. package/dist/components/interrupt/ChoicePrompt.svelte.d.ts +1 -1
  146. package/dist/components/interrupt/ConfirmationPrompt.stories.svelte +48 -48
  147. package/dist/components/interrupt/ConfirmationPrompt.stories.svelte.d.ts +1 -1
  148. package/dist/components/interrupt/ConfirmationPrompt.svelte +280 -274
  149. package/dist/components/interrupt/ConfirmationPrompt.svelte.d.ts +1 -1
  150. package/dist/components/interrupt/FormPrompt.svelte +223 -218
  151. package/dist/components/interrupt/FormPrompt.svelte.d.ts +1 -1
  152. package/dist/components/interrupt/InterruptBubble.svelte +617 -583
  153. package/dist/components/interrupt/InterruptBubble.svelte.d.ts +2 -2
  154. package/dist/components/interrupt/ReviewPrompt.stories.svelte +66 -56
  155. package/dist/components/interrupt/ReviewPrompt.stories.svelte.d.ts +1 -1
  156. package/dist/components/interrupt/ReviewPrompt.svelte +861 -841
  157. package/dist/components/interrupt/ReviewPrompt.svelte.d.ts +1 -1
  158. package/dist/components/interrupt/TextInputPrompt.stories.svelte +38 -33
  159. package/dist/components/interrupt/TextInputPrompt.stories.svelte.d.ts +1 -1
  160. package/dist/components/interrupt/TextInputPrompt.svelte +333 -328
  161. package/dist/components/interrupt/TextInputPrompt.svelte.d.ts +1 -1
  162. package/dist/components/interrupt/index.d.ts +5 -5
  163. package/dist/components/interrupt/index.js +5 -5
  164. package/dist/components/layouts/MainLayout.svelte +724 -691
  165. package/dist/components/layouts/MainLayout.svelte.d.ts +6 -6
  166. package/dist/components/nodes/GatewayNode.stories.svelte +100 -99
  167. package/dist/components/nodes/GatewayNode.svelte +605 -571
  168. package/dist/components/nodes/GatewayNode.svelte.d.ts +3 -3
  169. package/dist/components/nodes/IdeaNode.stories.svelte +44 -43
  170. package/dist/components/nodes/IdeaNode.svelte +451 -437
  171. package/dist/components/nodes/IdeaNode.svelte.d.ts +1 -1
  172. package/dist/components/nodes/NotesNode.stories.svelte +65 -64
  173. package/dist/components/nodes/NotesNode.svelte +380 -369
  174. package/dist/components/nodes/NotesNode.svelte.d.ts +1 -1
  175. package/dist/components/nodes/SimpleNode.stories.svelte +145 -144
  176. package/dist/components/nodes/SimpleNode.svelte +486 -424
  177. package/dist/components/nodes/SimpleNode.svelte.d.ts +1 -1
  178. package/dist/components/nodes/SquareNode.stories.svelte +73 -73
  179. package/dist/components/nodes/SquareNode.svelte +439 -380
  180. package/dist/components/nodes/SquareNode.svelte.d.ts +1 -1
  181. package/dist/components/nodes/TerminalNode.stories.svelte +13 -13
  182. package/dist/components/nodes/TerminalNode.svelte +709 -670
  183. package/dist/components/nodes/TerminalNode.svelte.d.ts +1 -1
  184. package/dist/components/nodes/ToolNode.stories.svelte +181 -180
  185. package/dist/components/nodes/ToolNode.svelte +505 -447
  186. package/dist/components/nodes/ToolNode.svelte.d.ts +1 -1
  187. package/dist/components/nodes/WorkflowNode.stories.svelte +70 -46
  188. package/dist/components/nodes/WorkflowNode.svelte +621 -551
  189. package/dist/components/nodes/WorkflowNode.svelte.d.ts +3 -3
  190. package/dist/components/playground/ChatPanel.svelte +945 -889
  191. package/dist/components/playground/ExecutionLogs.svelte +495 -472
  192. package/dist/components/playground/InputCollector.svelte +449 -428
  193. package/dist/components/playground/MessageBubble.stories.svelte +47 -47
  194. package/dist/components/playground/MessageBubble.stories.svelte.d.ts +1 -1
  195. package/dist/components/playground/MessageBubble.svelte +626 -610
  196. package/dist/components/playground/MessageBubble.svelte.d.ts +1 -1
  197. package/dist/components/playground/Playground.svelte +1088 -1057
  198. package/dist/components/playground/Playground.svelte.d.ts +3 -3
  199. package/dist/components/playground/PlaygroundModal.svelte +208 -204
  200. package/dist/components/playground/PlaygroundModal.svelte.d.ts +3 -3
  201. package/dist/components/playground/SessionManager.svelte +527 -521
  202. package/dist/components/playground/SessionManager.svelte.d.ts +1 -1
  203. package/dist/config/agentSpecEndpoints.d.ts +1 -1
  204. package/dist/config/agentSpecEndpoints.js +20 -20
  205. package/dist/config/constants.js +2 -2
  206. package/dist/config/defaultCategories.d.ts +1 -1
  207. package/dist/config/defaultCategories.js +86 -86
  208. package/dist/config/defaultPortConfig.d.ts +1 -1
  209. package/dist/config/defaultPortConfig.js +144 -144
  210. package/dist/config/endpoints.d.ts +4 -4
  211. package/dist/config/endpoints.js +65 -65
  212. package/dist/config/runtimeConfig.d.ts +2 -2
  213. package/dist/config/runtimeConfig.js +8 -8
  214. package/dist/core/index.d.ts +63 -59
  215. package/dist/core/index.js +35 -33
  216. package/dist/display/index.d.ts +2 -2
  217. package/dist/display/index.js +2 -2
  218. package/dist/editor/index.d.ts +62 -62
  219. package/dist/editor/index.js +53 -53
  220. package/dist/form/code.d.ts +5 -5
  221. package/dist/form/code.js +14 -14
  222. package/dist/form/fieldRegistry.d.ts +3 -3
  223. package/dist/form/fieldRegistry.js +11 -9
  224. package/dist/form/full.d.ts +8 -8
  225. package/dist/form/full.js +9 -9
  226. package/dist/form/index.d.ts +18 -18
  227. package/dist/form/index.js +16 -16
  228. package/dist/form/markdown.d.ts +4 -4
  229. package/dist/form/markdown.js +8 -8
  230. package/dist/helpers/proximityConnect.d.ts +3 -3
  231. package/dist/helpers/proximityConnect.js +34 -32
  232. package/dist/helpers/workflowEditorHelper.d.ts +5 -5
  233. package/dist/helpers/workflowEditorHelper.js +108 -96
  234. package/dist/index.d.ts +6 -6
  235. package/dist/index.js +6 -6
  236. package/dist/mocks/app-environment.js +2 -2
  237. package/dist/mocks/app-forms.js +9 -9
  238. package/dist/mocks/app-navigation.js +11 -11
  239. package/dist/mocks/app-stores.js +8 -8
  240. package/dist/playground/index.d.ts +19 -19
  241. package/dist/playground/index.js +16 -16
  242. package/dist/playground/mount.d.ts +3 -3
  243. package/dist/playground/mount.js +24 -24
  244. package/dist/registry/builtinFormats.js +13 -13
  245. package/dist/registry/builtinNodes.d.ts +2 -2
  246. package/dist/registry/builtinNodes.js +77 -77
  247. package/dist/registry/index.d.ts +4 -4
  248. package/dist/registry/index.js +4 -4
  249. package/dist/registry/nodeComponentRegistry.d.ts +8 -8
  250. package/dist/registry/nodeComponentRegistry.js +11 -9
  251. package/dist/registry/plugin.d.ts +2 -2
  252. package/dist/registry/plugin.js +11 -11
  253. package/dist/registry/workflowFormatRegistry.d.ts +3 -3
  254. package/dist/registry/workflowFormatRegistry.js +2 -2
  255. package/dist/schema/index.d.ts +1 -1
  256. package/dist/schema/index.js +2 -2
  257. package/dist/services/agentSpecExecutionService.d.ts +3 -3
  258. package/dist/services/agentSpecExecutionService.js +59 -55
  259. package/dist/services/api.d.ts +2 -2
  260. package/dist/services/api.js +37 -37
  261. package/dist/services/apiVariableService.d.ts +1 -1
  262. package/dist/services/apiVariableService.js +41 -34
  263. package/dist/services/autoSaveService.js +8 -8
  264. package/dist/services/categoriesApi.d.ts +2 -2
  265. package/dist/services/categoriesApi.js +8 -8
  266. package/dist/services/draftStorage.d.ts +1 -1
  267. package/dist/services/draftStorage.js +11 -11
  268. package/dist/services/dynamicSchemaService.d.ts +1 -1
  269. package/dist/services/dynamicSchemaService.js +41 -39
  270. package/dist/services/globalSave.d.ts +2 -2
  271. package/dist/services/globalSave.js +41 -38
  272. package/dist/services/historyService.d.ts +1 -1
  273. package/dist/services/historyService.js +8 -8
  274. package/dist/services/interruptService.d.ts +1 -1
  275. package/dist/services/interruptService.js +35 -29
  276. package/dist/services/nodeExecutionService.d.ts +1 -1
  277. package/dist/services/nodeExecutionService.js +45 -44
  278. package/dist/services/playgroundService.d.ts +1 -1
  279. package/dist/services/playgroundService.js +29 -29
  280. package/dist/services/portConfigApi.d.ts +2 -2
  281. package/dist/services/portConfigApi.js +8 -8
  282. package/dist/services/settingsService.d.ts +2 -2
  283. package/dist/services/settingsService.js +25 -19
  284. package/dist/services/toastService.d.ts +4 -4
  285. package/dist/services/toastService.js +33 -33
  286. package/dist/services/variableService.d.ts +1 -1
  287. package/dist/services/variableService.js +36 -36
  288. package/dist/services/workflowStorage.d.ts +2 -2
  289. package/dist/services/workflowStorage.js +13 -13
  290. package/dist/settings/index.d.ts +7 -7
  291. package/dist/settings/index.js +6 -6
  292. package/dist/skins/default.d.ts +2 -0
  293. package/dist/skins/default.js +1 -0
  294. package/dist/skins/index.d.ts +13 -0
  295. package/dist/skins/index.js +30 -0
  296. package/dist/skins/slate.d.ts +2 -0
  297. package/dist/skins/slate.js +78 -0
  298. package/dist/stores/categoriesStore.svelte.d.ts +1 -1
  299. package/dist/stores/categoriesStore.svelte.js +5 -5
  300. package/dist/stores/editorStateMachine.svelte.d.ts +2 -2
  301. package/dist/stores/editorStateMachine.svelte.js +65 -33
  302. package/dist/stores/historyStore.svelte.d.ts +4 -4
  303. package/dist/stores/historyStore.svelte.js +4 -4
  304. package/dist/stores/interruptStore.svelte.d.ts +3 -3
  305. package/dist/stores/interruptStore.svelte.js +21 -21
  306. package/dist/stores/playgroundStore.svelte.d.ts +2 -2
  307. package/dist/stores/playgroundStore.svelte.js +25 -18
  308. package/dist/stores/portCoordinateStore.svelte.d.ts +2 -2
  309. package/dist/stores/portCoordinateStore.svelte.js +15 -8
  310. package/dist/stores/settingsStore.svelte.d.ts +2 -2
  311. package/dist/stores/settingsStore.svelte.js +62 -57
  312. package/dist/stores/workflowStore.svelte.d.ts +3 -3
  313. package/dist/stores/workflowStore.svelte.js +50 -47
  314. package/dist/stories/CanvasDecorator.svelte +35 -32
  315. package/dist/stories/CanvasDecorator.svelte.d.ts +2 -2
  316. package/dist/stories/EdgeDecorator.svelte +102 -99
  317. package/dist/stories/EdgeDecorator.svelte.d.ts +1 -1
  318. package/dist/stories/NodeDecorator.svelte +59 -53
  319. package/dist/stories/NodeDecorator.svelte.d.ts +1 -1
  320. package/dist/stories/utils.d.ts +2 -2
  321. package/dist/stories/utils.js +105 -67
  322. package/dist/styles/base.css +599 -595
  323. package/dist/styles/toast.css +14 -14
  324. package/dist/styles/tokens.css +409 -378
  325. package/dist/svelte-app.d.ts +12 -9
  326. package/dist/svelte-app.js +40 -39
  327. package/dist/themes/default.d.ts +2 -0
  328. package/dist/themes/default.js +9 -0
  329. package/dist/themes/index.d.ts +13 -0
  330. package/dist/themes/index.js +44 -0
  331. package/dist/themes/minimal.d.ts +2 -0
  332. package/dist/themes/minimal.js +11 -0
  333. package/dist/types/agentspec.d.ts +18 -18
  334. package/dist/types/agentspec.js +2 -2
  335. package/dist/types/auth.d.ts +1 -1
  336. package/dist/types/auth.js +6 -6
  337. package/dist/types/config.d.ts +6 -6
  338. package/dist/types/events.d.ts +2 -2
  339. package/dist/types/events.js +2 -2
  340. package/dist/types/index.d.ts +32 -32
  341. package/dist/types/index.js +6 -6
  342. package/dist/types/interrupt.d.ts +6 -6
  343. package/dist/types/interrupt.js +21 -21
  344. package/dist/types/interruptState.d.ts +12 -12
  345. package/dist/types/interruptState.js +66 -66
  346. package/dist/types/playground.d.ts +7 -7
  347. package/dist/types/playground.js +14 -14
  348. package/dist/types/settings.d.ts +5 -3
  349. package/dist/types/settings.js +25 -18
  350. package/dist/types/skin.d.ts +31 -0
  351. package/dist/types/skin.js +1 -0
  352. package/dist/types/theme.d.ts +35 -0
  353. package/dist/types/theme.js +1 -0
  354. package/dist/types/uischema.d.ts +4 -4
  355. package/dist/types/uischema.js +3 -3
  356. package/dist/utils/colors.d.ts +1 -1
  357. package/dist/utils/colors.js +97 -95
  358. package/dist/utils/config.d.ts +2 -2
  359. package/dist/utils/config.js +48 -48
  360. package/dist/utils/connections.d.ts +2 -2
  361. package/dist/utils/connections.js +15 -15
  362. package/dist/utils/errors.js +3 -3
  363. package/dist/utils/fetchWithAuth.d.ts +1 -1
  364. package/dist/utils/fetchWithAuth.js +2 -2
  365. package/dist/utils/handleIds.d.ts +2 -2
  366. package/dist/utils/handleIds.js +8 -8
  367. package/dist/utils/handlePositioning.d.ts +1 -1
  368. package/dist/utils/handlePositioning.js +2 -2
  369. package/dist/utils/icons.d.ts +1 -1
  370. package/dist/utils/icons.js +74 -74
  371. package/dist/utils/logger.d.ts +1 -1
  372. package/dist/utils/logger.js +7 -7
  373. package/dist/utils/nodeStatus.d.ts +1 -1
  374. package/dist/utils/nodeStatus.js +48 -48
  375. package/dist/utils/nodeTypes.d.ts +1 -1
  376. package/dist/utils/nodeTypes.js +21 -20
  377. package/dist/utils/nodeWrapper.d.ts +7 -7
  378. package/dist/utils/nodeWrapper.js +21 -19
  379. package/dist/utils/performanceUtils.d.ts +1 -1
  380. package/dist/utils/performanceUtils.js +2 -1
  381. package/dist/utils/sanitize.js +1 -1
  382. package/dist/utils/uischema.d.ts +2 -2
  383. package/dist/utils/uischema.js +8 -8
  384. package/dist/utils/validation.js +20 -8
  385. package/package.json +1 -1
@@ -6,558 +6,565 @@
6
6
  -->
7
7
 
8
8
  <script lang="ts">
9
- import Icon from '@iconify/svelte';
10
- import type { WorkflowNode as WorkflowNodeType } from '../types/index.js';
11
-
12
- interface LogEntry {
13
- timestamp: string;
14
- level: string;
15
- message: string;
16
- nodeId?: string;
17
- }
18
-
19
- interface Props {
20
- isOpen: boolean;
21
- logs: LogEntry[];
22
- selectedNode?: WorkflowNodeType | null;
23
- onClose?: () => void;
24
- onClear?: () => void;
25
- }
26
-
27
- let props: Props = $props();
28
-
29
- let sidebarRef: HTMLElement | undefined = $state();
30
-
31
- // Focus management and body scroll control
32
- $effect(() => {
33
- if (props.isOpen) {
34
- // Focus management - focus the sidebar when it opens
35
- setTimeout(() => {
36
- sidebarRef?.focus();
37
- }, 100);
38
-
39
- // Prevent body scroll
40
- document.body.style.overflow = 'hidden';
41
- } else {
42
- // Restore body scroll
43
- document.body.style.overflow = '';
44
- }
45
- });
46
-
47
- /**
48
- * Handle close action
49
- */
50
- function handleClose(): void {
51
- props.onClose?.();
52
- }
53
-
54
- /**
55
- * Handle keyboard shortcuts
56
- */
57
- function handleKeydown(event: KeyboardEvent): void {
58
- if (event.key === 'Escape') {
59
- handleClose();
60
- }
61
- }
62
-
63
- /**
64
- * Get log level color
65
- * Returns CSS variable references for theme consistency
66
- */
67
- function getLogLevelColor(level: string): string {
68
- switch (level) {
69
- case 'error':
70
- return 'var(--fd-error)';
71
- case 'warning':
72
- return 'var(--fd-warning)';
73
- case 'success':
74
- return 'var(--fd-success)';
75
- case 'info':
76
- return 'var(--fd-info)';
77
- default:
78
- return 'var(--fd-muted-foreground)';
79
- }
80
- }
81
-
82
- /**
83
- * Get log level icon
84
- */
85
- function getLogLevelIcon(level: string): string {
86
- switch (level) {
87
- case 'error':
88
- return 'mdi:alert-circle';
89
- case 'warning':
90
- return 'mdi:alert';
91
- case 'success':
92
- return 'mdi:check-circle';
93
- case 'info':
94
- return 'mdi:information';
95
- default:
96
- return 'mdi:circle';
97
- }
98
- }
99
-
100
- /**
101
- * Format timestamp for display
102
- */
103
- function formatTimestamp(timestamp: string): string {
104
- const date = new Date(timestamp);
105
- return date.toLocaleTimeString('en-US', {
106
- hour12: false,
107
- hour: '2-digit',
108
- minute: '2-digit',
109
- second: '2-digit',
110
- fractionalSecondDigits: 3
111
- });
112
- }
113
-
114
- /**
115
- * Filter logs by selected node
116
- */
117
- let filteredLogs = $derived(() => {
118
- if (props.selectedNode) {
119
- return props.logs.filter((log) => log.nodeId === props.selectedNode?.id);
120
- }
121
- return props.logs;
122
- });
123
-
124
- /**
125
- * Clear logs
126
- */
127
- function clearLogs(): void {
128
- props.onClear?.();
129
- }
130
-
131
- /**
132
- * Export logs
133
- */
134
- function exportLogs(): void {
135
- const logText = filteredLogs()
136
- .map(
137
- (log) =>
138
- `[${formatTimestamp(log.timestamp)}] ${log.level.toUpperCase()}: ${log.message}${log.nodeId ? ` (Node: ${log.nodeId})` : ''}`
139
- )
140
- .join('\n');
141
-
142
- const blob = new Blob([logText], { type: 'text/plain' });
143
- const url = URL.createObjectURL(blob);
144
- const link = document.createElement('a');
145
- link.href = url;
146
- link.download = `pipeline-logs-${new Date().toISOString().split('T')[0]}.txt`;
147
- link.click();
148
- URL.revokeObjectURL(url);
149
- }
150
-
151
- // Auto-scroll to bottom when new logs arrive
152
- let logsContainer = $state<HTMLElement>();
153
- $effect(() => {
154
- if (logsContainer && props.logs.length > 0) {
155
- logsContainer.scrollTop = logsContainer.scrollHeight;
156
- }
157
- });
9
+ import Icon from "@iconify/svelte";
10
+ import type { WorkflowNode as WorkflowNodeType } from "../types/index.js";
11
+
12
+ interface LogEntry {
13
+ timestamp: string;
14
+ level: string;
15
+ message: string;
16
+ nodeId?: string;
17
+ }
18
+
19
+ interface Props {
20
+ isOpen: boolean;
21
+ logs: LogEntry[];
22
+ selectedNode?: WorkflowNodeType | null;
23
+ onClose?: () => void;
24
+ onClear?: () => void;
25
+ }
26
+
27
+ let props: Props = $props();
28
+
29
+ let sidebarRef: HTMLElement | undefined = $state();
30
+
31
+ // Focus management and body scroll control
32
+ $effect(() => {
33
+ if (props.isOpen) {
34
+ // Focus management - focus the sidebar when it opens
35
+ setTimeout(() => {
36
+ sidebarRef?.focus();
37
+ }, 100);
38
+
39
+ // Prevent body scroll
40
+ document.body.style.overflow = "hidden";
41
+ } else {
42
+ // Restore body scroll
43
+ document.body.style.overflow = "";
44
+ }
45
+ });
46
+
47
+ /**
48
+ * Handle close action
49
+ */
50
+ function handleClose(): void {
51
+ props.onClose?.();
52
+ }
53
+
54
+ /**
55
+ * Handle keyboard shortcuts
56
+ */
57
+ function handleKeydown(event: KeyboardEvent): void {
58
+ if (event.key === "Escape") {
59
+ handleClose();
60
+ }
61
+ }
62
+
63
+ /**
64
+ * Get log level color
65
+ * Returns CSS variable references for theme consistency
66
+ */
67
+ function getLogLevelColor(level: string): string {
68
+ switch (level) {
69
+ case "error":
70
+ return "var(--fd-error)";
71
+ case "warning":
72
+ return "var(--fd-warning)";
73
+ case "success":
74
+ return "var(--fd-success)";
75
+ case "info":
76
+ return "var(--fd-info)";
77
+ default:
78
+ return "var(--fd-muted-foreground)";
79
+ }
80
+ }
81
+
82
+ /**
83
+ * Get log level icon
84
+ */
85
+ function getLogLevelIcon(level: string): string {
86
+ switch (level) {
87
+ case "error":
88
+ return "mdi:alert-circle";
89
+ case "warning":
90
+ return "mdi:alert";
91
+ case "success":
92
+ return "mdi:check-circle";
93
+ case "info":
94
+ return "mdi:information";
95
+ default:
96
+ return "mdi:circle";
97
+ }
98
+ }
99
+
100
+ /**
101
+ * Format timestamp for display
102
+ */
103
+ function formatTimestamp(timestamp: string): string {
104
+ const date = new Date(timestamp);
105
+ return date.toLocaleTimeString("en-US", {
106
+ hour12: false,
107
+ hour: "2-digit",
108
+ minute: "2-digit",
109
+ second: "2-digit",
110
+ fractionalSecondDigits: 3,
111
+ });
112
+ }
113
+
114
+ /**
115
+ * Filter logs by selected node
116
+ */
117
+ let filteredLogs = $derived(() => {
118
+ if (props.selectedNode) {
119
+ return props.logs.filter((log) => log.nodeId === props.selectedNode?.id);
120
+ }
121
+ return props.logs;
122
+ });
123
+
124
+ /**
125
+ * Clear logs
126
+ */
127
+ function clearLogs(): void {
128
+ props.onClear?.();
129
+ }
130
+
131
+ /**
132
+ * Export logs
133
+ */
134
+ function exportLogs(): void {
135
+ const logText = filteredLogs()
136
+ .map(
137
+ (log) =>
138
+ `[${formatTimestamp(log.timestamp)}] ${log.level.toUpperCase()}: ${log.message}${log.nodeId ? ` (Node: ${log.nodeId})` : ""}`,
139
+ )
140
+ .join("\n");
141
+
142
+ const blob = new Blob([logText], { type: "text/plain" });
143
+ const url = URL.createObjectURL(blob);
144
+ const link = document.createElement("a");
145
+ link.href = url;
146
+ link.download = `pipeline-logs-${new Date().toISOString().split("T")[0]}.txt`;
147
+ link.click();
148
+ URL.revokeObjectURL(url);
149
+ }
150
+
151
+ // Auto-scroll to bottom when new logs arrive
152
+ let logsContainer = $state<HTMLElement>();
153
+ $effect(() => {
154
+ if (logsContainer && props.logs.length > 0) {
155
+ logsContainer.scrollTop = logsContainer.scrollHeight;
156
+ }
157
+ });
158
158
  </script>
159
159
 
160
160
  <!-- Sidebar -->
161
161
  <div
162
- bind:this={sidebarRef}
163
- class="logs-sidebar"
164
- class:logs-sidebar--open={props.isOpen}
165
- role="dialog"
166
- aria-label="Execution logs sidebar"
167
- aria-modal="true"
168
- tabindex="-1"
169
- onkeydown={handleKeydown}
162
+ bind:this={sidebarRef}
163
+ class="logs-sidebar"
164
+ class:logs-sidebar--open={props.isOpen}
165
+ role="dialog"
166
+ aria-label="Execution logs sidebar"
167
+ aria-modal="true"
168
+ tabindex="-1"
169
+ onkeydown={handleKeydown}
170
170
  >
171
- <!-- Header -->
172
- <div class="logs-sidebar__header">
173
- <div class="logs-sidebar__title-section">
174
- <h2 class="logs-sidebar__title">
175
- {#if props.selectedNode}
176
- Logs: {props.selectedNode.data.label}
177
- {:else}
178
- Execution Logs
179
- {/if}
180
- </h2>
181
- {#if props.logs.length > 0}
182
- <div class="logs-sidebar__count" title="Total log entries">
183
- <Icon icon="mdi:file-document-outline" />
184
- {props.logs.length}
185
- </div>
186
- {/if}
187
- </div>
188
- <button
189
- class="logs-sidebar__close-btn"
190
- onclick={handleClose}
191
- title="Close logs sidebar (Esc)"
192
- aria-label="Close logs sidebar"
193
- >
194
- <Icon icon="mdi:close" />
195
- </button>
196
- </div>
197
-
198
- <!-- Content -->
199
- <div class="logs-sidebar__content">
200
- <!-- Logs List -->
201
- {#if filteredLogs().length > 0}
202
- <div class="logs-sidebar__logs" bind:this={logsContainer}>
203
- {#each filteredLogs() as log, index (index)}
204
- <div
205
- class="logs-sidebar__log-entry"
206
- class:logs-sidebar__log-entry--error={log.level === 'error'}
207
- class:logs-sidebar__log-entry--warning={log.level === 'warning'}
208
- class:logs-sidebar__log-entry--success={log.level === 'success'}
209
- class:logs-sidebar__log-entry--info={log.level === 'info'}
210
- >
211
- <div class="logs-sidebar__log-header">
212
- <div class="logs-sidebar__log-level">
213
- <Icon
214
- icon={getLogLevelIcon(log.level)}
215
- style="color: {getLogLevelColor(log.level)}"
216
- />
217
- <span class="logs-sidebar__log-level-text">{log.level.toUpperCase()}</span>
218
- </div>
219
- <div class="logs-sidebar__log-timestamp">
220
- {formatTimestamp(log.timestamp)}
221
- </div>
222
- </div>
223
- <div class="logs-sidebar__log-message">
224
- {log.message}
225
- </div>
226
- {#if log.nodeId}
227
- <div class="logs-sidebar__log-node">
228
- <Icon icon="mdi:graph" />
229
- Node: {log.nodeId}
230
- </div>
231
- {/if}
232
- </div>
233
- {/each}
234
- </div>
235
- {:else}
236
- <div class="logs-sidebar__empty">
237
- <Icon icon="mdi:file-document-outline" class="logs-sidebar__empty-icon" />
238
- <p class="logs-sidebar__empty-text">
239
- {#if props.selectedNode}
240
- No logs available for this node
241
- {:else}
242
- No execution logs yet
243
- {/if}
244
- </p>
245
- </div>
246
- {/if}
247
- </div>
248
-
249
- <!-- Footer -->
250
- <div class="logs-sidebar__footer">
251
- <div class="logs-sidebar__actions">
252
- <button
253
- type="button"
254
- class="logs-sidebar__btn logs-sidebar__btn--secondary"
255
- onclick={clearLogs}
256
- disabled={props.logs.length === 0}
257
- >
258
- <Icon icon="mdi:delete" />
259
- Clear
260
- </button>
261
- <button
262
- type="button"
263
- class="logs-sidebar__btn logs-sidebar__btn--outline"
264
- onclick={exportLogs}
265
- disabled={props.logs.length === 0}
266
- >
267
- <Icon icon="mdi:download" />
268
- Export
269
- </button>
270
- </div>
271
-
272
- {#if props.logs.length > 0}
273
- <p class="logs-sidebar__info-text">
274
- {filteredLogs().length} of {props.logs.length} log entries
275
- </p>
276
- {/if}
277
- </div>
171
+ <!-- Header -->
172
+ <div class="logs-sidebar__header">
173
+ <div class="logs-sidebar__title-section">
174
+ <h2 class="logs-sidebar__title">
175
+ {#if props.selectedNode}
176
+ Logs: {props.selectedNode.data.label}
177
+ {:else}
178
+ Execution Logs
179
+ {/if}
180
+ </h2>
181
+ {#if props.logs.length > 0}
182
+ <div class="logs-sidebar__count" title="Total log entries">
183
+ <Icon icon="mdi:file-document-outline" />
184
+ {props.logs.length}
185
+ </div>
186
+ {/if}
187
+ </div>
188
+ <button
189
+ class="logs-sidebar__close-btn"
190
+ onclick={handleClose}
191
+ title="Close logs sidebar (Esc)"
192
+ aria-label="Close logs sidebar"
193
+ >
194
+ <Icon icon="mdi:close" />
195
+ </button>
196
+ </div>
197
+
198
+ <!-- Content -->
199
+ <div class="logs-sidebar__content">
200
+ <!-- Logs List -->
201
+ {#if filteredLogs().length > 0}
202
+ <div class="logs-sidebar__logs" bind:this={logsContainer}>
203
+ {#each filteredLogs() as log, index (index)}
204
+ <div
205
+ class="logs-sidebar__log-entry"
206
+ class:logs-sidebar__log-entry--error={log.level === "error"}
207
+ class:logs-sidebar__log-entry--warning={log.level === "warning"}
208
+ class:logs-sidebar__log-entry--success={log.level === "success"}
209
+ class:logs-sidebar__log-entry--info={log.level === "info"}
210
+ >
211
+ <div class="logs-sidebar__log-header">
212
+ <div class="logs-sidebar__log-level">
213
+ <Icon
214
+ icon={getLogLevelIcon(log.level)}
215
+ style="color: {getLogLevelColor(log.level)}"
216
+ />
217
+ <span class="logs-sidebar__log-level-text"
218
+ >{log.level.toUpperCase()}</span
219
+ >
220
+ </div>
221
+ <div class="logs-sidebar__log-timestamp">
222
+ {formatTimestamp(log.timestamp)}
223
+ </div>
224
+ </div>
225
+ <div class="logs-sidebar__log-message">
226
+ {log.message}
227
+ </div>
228
+ {#if log.nodeId}
229
+ <div class="logs-sidebar__log-node">
230
+ <Icon icon="mdi:graph" />
231
+ Node: {log.nodeId}
232
+ </div>
233
+ {/if}
234
+ </div>
235
+ {/each}
236
+ </div>
237
+ {:else}
238
+ <div class="logs-sidebar__empty">
239
+ <Icon
240
+ icon="mdi:file-document-outline"
241
+ class="logs-sidebar__empty-icon"
242
+ />
243
+ <p class="logs-sidebar__empty-text">
244
+ {#if props.selectedNode}
245
+ No logs available for this node
246
+ {:else}
247
+ No execution logs yet
248
+ {/if}
249
+ </p>
250
+ </div>
251
+ {/if}
252
+ </div>
253
+
254
+ <!-- Footer -->
255
+ <div class="logs-sidebar__footer">
256
+ <div class="logs-sidebar__actions">
257
+ <button
258
+ type="button"
259
+ class="logs-sidebar__btn logs-sidebar__btn--secondary"
260
+ onclick={clearLogs}
261
+ disabled={props.logs.length === 0}
262
+ >
263
+ <Icon icon="mdi:delete" />
264
+ Clear
265
+ </button>
266
+ <button
267
+ type="button"
268
+ class="logs-sidebar__btn logs-sidebar__btn--outline"
269
+ onclick={exportLogs}
270
+ disabled={props.logs.length === 0}
271
+ >
272
+ <Icon icon="mdi:download" />
273
+ Export
274
+ </button>
275
+ </div>
276
+
277
+ {#if props.logs.length > 0}
278
+ <p class="logs-sidebar__info-text">
279
+ {filteredLogs().length} of {props.logs.length} log entries
280
+ </p>
281
+ {/if}
282
+ </div>
278
283
  </div>
279
284
 
280
285
  <style>
281
- .logs-sidebar {
282
- position: fixed;
283
- top: var(--fd-navbar-height); /* Start below navbar */
284
- right: 0;
285
- width: 400px;
286
- height: calc(100vh - var(--fd-navbar-height)); /* Account for navbar height */
287
- background-color: #ffffff;
288
- border-left: 1px solid #e5e7eb;
289
- box-shadow: -4px 0 20px rgba(0, 0, 0, 0.15);
290
- transform: translateX(100%);
291
- transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);
292
- z-index: -1;
293
- display: flex;
294
- flex-direction: column;
295
- pointer-events: none;
296
- }
297
-
298
- /* Mobile responsive */
299
- @media (max-width: 768px) {
300
- .logs-sidebar {
301
- width: 100vw;
302
- border-left: none;
303
- }
304
- }
305
-
306
- @media (max-width: 480px) {
307
- .logs-sidebar {
308
- width: 100vw;
309
- }
310
- }
311
-
312
- .logs-sidebar--open {
313
- transform: translateX(0);
314
- z-index: 999;
315
- pointer-events: auto;
316
- }
317
-
318
- /* Prevent body scroll when sidebar is open */
319
- :global(body:has(.logs-sidebar--open)) {
320
- overflow: hidden;
321
- }
322
-
323
- .logs-sidebar__header {
324
- display: flex;
325
- align-items: center;
326
- justify-content: space-between;
327
- padding: 1rem 1.5rem;
328
- border-bottom: 1px solid #e5e7eb;
329
- background-color: #f9fafb;
330
- flex-shrink: 0;
331
- }
332
-
333
- .logs-sidebar__title-section {
334
- display: flex;
335
- align-items: center;
336
- gap: 0.5rem;
337
- }
338
-
339
- .logs-sidebar__title {
340
- font-size: 1.125rem;
341
- font-weight: 600;
342
- color: #111827;
343
- margin: 0;
344
- }
345
-
346
- .logs-sidebar__count {
347
- display: flex;
348
- align-items: center;
349
- gap: 0.25rem;
350
- font-size: 0.75rem;
351
- color: #6b7280;
352
- background-color: #f3f4f6;
353
- padding: 0.25rem 0.5rem;
354
- border-radius: 0.375rem;
355
- }
356
-
357
- .logs-sidebar__close-btn {
358
- display: flex;
359
- align-items: center;
360
- justify-content: center;
361
- width: 2rem;
362
- height: 2rem;
363
- border: none;
364
- background: transparent;
365
- color: #6b7280;
366
- cursor: pointer;
367
- border-radius: 0.375rem;
368
- transition: all 0.2s ease-in-out;
369
- }
370
-
371
- .logs-sidebar__close-btn:hover {
372
- background-color: #f3f4f6;
373
- color: #374151;
374
- }
375
-
376
- .logs-sidebar__content {
377
- flex: 1;
378
- overflow-y: auto;
379
- padding: 1.5rem;
380
- }
381
-
382
- .logs-sidebar__logs {
383
- display: flex;
384
- flex-direction: column;
385
- gap: 0.75rem;
386
- }
387
-
388
- .logs-sidebar__log-entry {
389
- background-color: var(--fd-muted);
390
- border: 1px solid var(--fd-border);
391
- border-radius: var(--fd-radius-lg);
392
- padding: 0.75rem;
393
- transition: all var(--fd-transition-fast);
394
- }
395
-
396
- .logs-sidebar__log-entry--error {
397
- border-left: 4px solid var(--fd-error);
398
- background-color: var(--fd-error-muted);
399
- }
400
-
401
- .logs-sidebar__log-entry--warning {
402
- border-left: 4px solid var(--fd-warning);
403
- background-color: var(--fd-warning-muted);
404
- }
405
-
406
- .logs-sidebar__log-entry--success {
407
- border-left: 4px solid var(--fd-success);
408
- background-color: var(--fd-success-muted);
409
- }
410
-
411
- .logs-sidebar__log-entry--info {
412
- border-left: 4px solid var(--fd-info);
413
- background-color: var(--fd-info-muted);
414
- }
415
-
416
- .logs-sidebar__log-header {
417
- display: flex;
418
- align-items: center;
419
- justify-content: space-between;
420
- margin-bottom: 0.5rem;
421
- }
422
-
423
- .logs-sidebar__log-level {
424
- display: flex;
425
- align-items: center;
426
- gap: 0.25rem;
427
- font-size: 0.75rem;
428
- font-weight: 600;
429
- text-transform: uppercase;
430
- letter-spacing: 0.05em;
431
- }
432
-
433
- .logs-sidebar__log-level-text {
434
- font-size: 0.75rem;
435
- font-weight: 600;
436
- }
437
-
438
- .logs-sidebar__log-timestamp {
439
- font-size: 0.75rem;
440
- color: #6b7280;
441
- font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;
442
- }
443
-
444
- .logs-sidebar__log-message {
445
- font-size: 0.875rem;
446
- color: #374151;
447
- line-height: 1.5;
448
- margin-bottom: 0.5rem;
449
- word-break: break-word;
450
- }
451
-
452
- .logs-sidebar__log-node {
453
- display: flex;
454
- align-items: center;
455
- gap: 0.25rem;
456
- font-size: 0.75rem;
457
- color: #6b7280;
458
- background-color: #ffffff;
459
- padding: 0.25rem 0.5rem;
460
- border-radius: 0.25rem;
461
- border: 1px solid #e5e7eb;
462
- width: fit-content;
463
- }
464
-
465
- .logs-sidebar__empty {
466
- display: flex;
467
- flex-direction: column;
468
- align-items: center;
469
- justify-content: center;
470
- padding: 3rem 1rem;
471
- text-align: center;
472
- color: #6b7280;
473
- }
474
-
475
- :global(.logs-sidebar__empty-icon) {
476
- font-size: 3rem;
477
- margin-bottom: 1rem;
478
- opacity: 0.5;
479
- }
480
-
481
- .logs-sidebar__empty-text {
482
- font-size: 0.875rem;
483
- margin: 0;
484
- }
485
-
486
- .logs-sidebar__footer {
487
- padding: 1rem 1.5rem;
488
- border-top: 1px solid #e5e7eb;
489
- background-color: #f9fafb;
490
- flex-shrink: 0;
491
- }
492
-
493
- .logs-sidebar__actions {
494
- display: flex;
495
- gap: 0.75rem;
496
- margin-bottom: 0.5rem;
497
- }
498
-
499
- .logs-sidebar__btn {
500
- display: flex;
501
- align-items: center;
502
- gap: 0.5rem;
503
- padding: 0.5rem 1rem;
504
- border: 1px solid;
505
- border-radius: 0.375rem;
506
- font-size: 0.875rem;
507
- font-weight: 500;
508
- cursor: pointer;
509
- transition: all 0.2s ease-in-out;
510
- flex: 1;
511
- justify-content: center;
512
- }
513
-
514
- .logs-sidebar__btn:disabled {
515
- opacity: 0.5;
516
- cursor: not-allowed;
517
- }
518
-
519
- .logs-sidebar__btn--secondary {
520
- background-color: #ef4444;
521
- border-color: #ef4444;
522
- color: #ffffff;
523
- }
524
-
525
- .logs-sidebar__btn--secondary:hover:not(:disabled) {
526
- background-color: #dc2626;
527
- border-color: #dc2626;
528
- }
529
-
530
- .logs-sidebar__btn--outline {
531
- background-color: transparent;
532
- border-color: #d1d5db;
533
- color: #374151;
534
- }
535
-
536
- .logs-sidebar__btn--outline:hover:not(:disabled) {
537
- background-color: #f3f4f6;
538
- border-color: #9ca3af;
539
- }
540
-
541
- .logs-sidebar__info-text {
542
- font-size: 0.75rem;
543
- color: #6b7280;
544
- margin: 0;
545
- text-align: center;
546
- }
547
-
548
- /* Responsive design */
549
- @media (max-width: 640px) {
550
- .logs-sidebar {
551
- width: 100vw;
552
- }
553
- }
554
-
555
- @media (max-width: 480px) {
556
- .logs-sidebar__header,
557
- .logs-sidebar__content,
558
- .logs-sidebar__footer {
559
- padding-left: 1rem;
560
- padding-right: 1rem;
561
- }
562
- }
286
+ .logs-sidebar {
287
+ position: fixed;
288
+ top: var(--fd-navbar-height); /* Start below navbar */
289
+ right: 0;
290
+ width: 400px;
291
+ height: calc(
292
+ 100vh - var(--fd-navbar-height)
293
+ ); /* Account for navbar height */
294
+ background-color: #ffffff;
295
+ border-left: 1px solid #e5e7eb;
296
+ box-shadow: -4px 0 20px rgba(0, 0, 0, 0.15);
297
+ transform: translateX(100%);
298
+ transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);
299
+ z-index: -1;
300
+ display: flex;
301
+ flex-direction: column;
302
+ pointer-events: none;
303
+ }
304
+
305
+ /* Mobile responsive */
306
+ @media (max-width: 768px) {
307
+ .logs-sidebar {
308
+ width: 100vw;
309
+ border-left: none;
310
+ }
311
+ }
312
+
313
+ @media (max-width: 480px) {
314
+ .logs-sidebar {
315
+ width: 100vw;
316
+ }
317
+ }
318
+
319
+ .logs-sidebar--open {
320
+ transform: translateX(0);
321
+ z-index: 999;
322
+ pointer-events: auto;
323
+ }
324
+
325
+ /* Prevent body scroll when sidebar is open */
326
+ :global(body:has(.logs-sidebar--open)) {
327
+ overflow: hidden;
328
+ }
329
+
330
+ .logs-sidebar__header {
331
+ display: flex;
332
+ align-items: center;
333
+ justify-content: space-between;
334
+ padding: 1rem 1.5rem;
335
+ border-bottom: 1px solid #e5e7eb;
336
+ background-color: #f9fafb;
337
+ flex-shrink: 0;
338
+ }
339
+
340
+ .logs-sidebar__title-section {
341
+ display: flex;
342
+ align-items: center;
343
+ gap: 0.5rem;
344
+ }
345
+
346
+ .logs-sidebar__title {
347
+ font-size: 1.125rem;
348
+ font-weight: 600;
349
+ color: #111827;
350
+ margin: 0;
351
+ }
352
+
353
+ .logs-sidebar__count {
354
+ display: flex;
355
+ align-items: center;
356
+ gap: 0.25rem;
357
+ font-size: 0.75rem;
358
+ color: #6b7280;
359
+ background-color: #f3f4f6;
360
+ padding: 0.25rem 0.5rem;
361
+ border-radius: 0.375rem;
362
+ }
363
+
364
+ .logs-sidebar__close-btn {
365
+ display: flex;
366
+ align-items: center;
367
+ justify-content: center;
368
+ width: 2rem;
369
+ height: 2rem;
370
+ border: none;
371
+ background: transparent;
372
+ color: #6b7280;
373
+ cursor: pointer;
374
+ border-radius: 0.375rem;
375
+ transition: all 0.2s ease-in-out;
376
+ }
377
+
378
+ .logs-sidebar__close-btn:hover {
379
+ background-color: #f3f4f6;
380
+ color: #374151;
381
+ }
382
+
383
+ .logs-sidebar__content {
384
+ flex: 1;
385
+ overflow-y: auto;
386
+ padding: 1.5rem;
387
+ }
388
+
389
+ .logs-sidebar__logs {
390
+ display: flex;
391
+ flex-direction: column;
392
+ gap: 0.75rem;
393
+ }
394
+
395
+ .logs-sidebar__log-entry {
396
+ background-color: var(--fd-muted);
397
+ border: 1px solid var(--fd-border);
398
+ border-radius: var(--fd-radius-lg);
399
+ padding: 0.75rem;
400
+ transition: all var(--fd-transition-fast);
401
+ }
402
+
403
+ .logs-sidebar__log-entry--error {
404
+ border-left: 4px solid var(--fd-error);
405
+ background-color: var(--fd-error-muted);
406
+ }
407
+
408
+ .logs-sidebar__log-entry--warning {
409
+ border-left: 4px solid var(--fd-warning);
410
+ background-color: var(--fd-warning-muted);
411
+ }
412
+
413
+ .logs-sidebar__log-entry--success {
414
+ border-left: 4px solid var(--fd-success);
415
+ background-color: var(--fd-success-muted);
416
+ }
417
+
418
+ .logs-sidebar__log-entry--info {
419
+ border-left: 4px solid var(--fd-info);
420
+ background-color: var(--fd-info-muted);
421
+ }
422
+
423
+ .logs-sidebar__log-header {
424
+ display: flex;
425
+ align-items: center;
426
+ justify-content: space-between;
427
+ margin-bottom: 0.5rem;
428
+ }
429
+
430
+ .logs-sidebar__log-level {
431
+ display: flex;
432
+ align-items: center;
433
+ gap: 0.25rem;
434
+ font-size: 0.75rem;
435
+ font-weight: 600;
436
+ text-transform: uppercase;
437
+ letter-spacing: 0.05em;
438
+ }
439
+
440
+ .logs-sidebar__log-level-text {
441
+ font-size: 0.75rem;
442
+ font-weight: 600;
443
+ }
444
+
445
+ .logs-sidebar__log-timestamp {
446
+ font-size: 0.75rem;
447
+ color: #6b7280;
448
+ font-family: "Monaco", "Menlo", "Ubuntu Mono", monospace;
449
+ }
450
+
451
+ .logs-sidebar__log-message {
452
+ font-size: 0.875rem;
453
+ color: #374151;
454
+ line-height: 1.5;
455
+ margin-bottom: 0.5rem;
456
+ word-break: break-word;
457
+ }
458
+
459
+ .logs-sidebar__log-node {
460
+ display: flex;
461
+ align-items: center;
462
+ gap: 0.25rem;
463
+ font-size: 0.75rem;
464
+ color: #6b7280;
465
+ background-color: #ffffff;
466
+ padding: 0.25rem 0.5rem;
467
+ border-radius: 0.25rem;
468
+ border: 1px solid #e5e7eb;
469
+ width: fit-content;
470
+ }
471
+
472
+ .logs-sidebar__empty {
473
+ display: flex;
474
+ flex-direction: column;
475
+ align-items: center;
476
+ justify-content: center;
477
+ padding: 3rem 1rem;
478
+ text-align: center;
479
+ color: #6b7280;
480
+ }
481
+
482
+ :global(.logs-sidebar__empty-icon) {
483
+ font-size: 3rem;
484
+ margin-bottom: 1rem;
485
+ opacity: 0.5;
486
+ }
487
+
488
+ .logs-sidebar__empty-text {
489
+ font-size: 0.875rem;
490
+ margin: 0;
491
+ }
492
+
493
+ .logs-sidebar__footer {
494
+ padding: 1rem 1.5rem;
495
+ border-top: 1px solid #e5e7eb;
496
+ background-color: #f9fafb;
497
+ flex-shrink: 0;
498
+ }
499
+
500
+ .logs-sidebar__actions {
501
+ display: flex;
502
+ gap: 0.75rem;
503
+ margin-bottom: 0.5rem;
504
+ }
505
+
506
+ .logs-sidebar__btn {
507
+ display: flex;
508
+ align-items: center;
509
+ gap: 0.5rem;
510
+ padding: 0.5rem 1rem;
511
+ border: 1px solid;
512
+ border-radius: 0.375rem;
513
+ font-size: 0.875rem;
514
+ font-weight: 500;
515
+ cursor: pointer;
516
+ transition: all 0.2s ease-in-out;
517
+ flex: 1;
518
+ justify-content: center;
519
+ }
520
+
521
+ .logs-sidebar__btn:disabled {
522
+ opacity: 0.5;
523
+ cursor: not-allowed;
524
+ }
525
+
526
+ .logs-sidebar__btn--secondary {
527
+ background-color: #ef4444;
528
+ border-color: #ef4444;
529
+ color: #ffffff;
530
+ }
531
+
532
+ .logs-sidebar__btn--secondary:hover:not(:disabled) {
533
+ background-color: #dc2626;
534
+ border-color: #dc2626;
535
+ }
536
+
537
+ .logs-sidebar__btn--outline {
538
+ background-color: transparent;
539
+ border-color: #d1d5db;
540
+ color: #374151;
541
+ }
542
+
543
+ .logs-sidebar__btn--outline:hover:not(:disabled) {
544
+ background-color: #f3f4f6;
545
+ border-color: #9ca3af;
546
+ }
547
+
548
+ .logs-sidebar__info-text {
549
+ font-size: 0.75rem;
550
+ color: #6b7280;
551
+ margin: 0;
552
+ text-align: center;
553
+ }
554
+
555
+ /* Responsive design */
556
+ @media (max-width: 640px) {
557
+ .logs-sidebar {
558
+ width: 100vw;
559
+ }
560
+ }
561
+
562
+ @media (max-width: 480px) {
563
+ .logs-sidebar__header,
564
+ .logs-sidebar__content,
565
+ .logs-sidebar__footer {
566
+ padding-left: 1rem;
567
+ padding-right: 1rem;
568
+ }
569
+ }
563
570
  </style>