@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
@@ -10,301 +10,330 @@
10
10
  -->
11
11
 
12
12
  <script lang="ts">
13
- import { onMount } from 'svelte';
14
-
15
- /**
16
- * Configuration props for the MainLayout component
17
- */
18
- interface Props {
19
- /** Height of the header in pixels */
20
- headerHeight?: number;
21
- /** Height of the footer in pixels */
22
- footerHeight?: number;
23
- /** Whether to show the header */
24
- showHeader?: boolean;
25
- /** Whether to show the footer */
26
- showFooter?: boolean;
27
- /** Whether to show the left sidebar */
28
- showLeftSidebar?: boolean;
29
- /** Whether to show the right sidebar */
30
- showRightSidebar?: boolean;
31
- /** Whether to show the bottom panel */
32
- showBottomPanel?: boolean;
33
- /** Initial width of the left sidebar in pixels */
34
- leftSidebarWidth?: number;
35
- /** Initial width of the right sidebar in pixels */
36
- rightSidebarWidth?: number;
37
- /** Initial height of the bottom panel in pixels */
38
- bottomPanelHeight?: number;
39
- /** Minimum width for left sidebar in pixels */
40
- leftSidebarMinWidth?: number;
41
- /** Maximum width for left sidebar in pixels */
42
- leftSidebarMaxWidth?: number;
43
- /** Minimum width for right sidebar in pixels */
44
- rightSidebarMinWidth?: number;
45
- /** Maximum width for right sidebar in pixels */
46
- rightSidebarMaxWidth?: number;
47
- /** Minimum height for bottom panel in pixels */
48
- bottomPanelMinHeight?: number;
49
- /** Maximum height for bottom panel in pixels */
50
- bottomPanelMaxHeight?: number;
51
- /** Whether to enable split pane resizing for left sidebar */
52
- enableLeftSplitPane?: boolean;
53
- /** Whether to enable split pane resizing for right sidebar */
54
- enableRightSplitPane?: boolean;
55
- /** Whether to enable split pane resizing for bottom panel */
56
- enableBottomSplitPane?: boolean;
57
- /** Background color for the main layout */
58
- backgroundColor?: string;
59
- /** Custom CSS class for the layout container */
60
- class?: string;
61
- /** Slot for header content */
62
- header?: import('svelte').Snippet;
63
- /** Slot for left sidebar content */
64
- leftSidebar?: import('svelte').Snippet;
65
- /** Slot for right sidebar content */
66
- rightSidebar?: import('svelte').Snippet;
67
- /** Slot for bottom panel content */
68
- bottomPanel?: import('svelte').Snippet;
69
- /** Slot for footer content */
70
- footer?: import('svelte').Snippet;
71
- /** Slot for main content (default slot) */
72
- children?: import('svelte').Snippet;
73
- }
74
-
75
- let {
76
- headerHeight = 60,
77
- footerHeight = 48,
78
- showHeader = true,
79
- showFooter = false,
80
- showLeftSidebar = true,
81
- showRightSidebar = true,
82
- showBottomPanel = false,
83
- leftSidebarWidth: initialLeftWidth = 280,
84
- rightSidebarWidth: initialRightWidth = 320,
85
- bottomPanelHeight: initialBottomHeight = 300,
86
- leftSidebarMinWidth = 200,
87
- leftSidebarMaxWidth = 500,
88
- rightSidebarMinWidth = 200,
89
- rightSidebarMaxWidth = 500,
90
- bottomPanelMinHeight = 150,
91
- bottomPanelMaxHeight = 500,
92
- enableLeftSplitPane = true,
93
- enableRightSplitPane = true,
94
- enableBottomSplitPane = true,
95
- backgroundColor = 'var(--fd-layout-background)',
96
- class: customClass = '',
97
- header,
98
- leftSidebar,
99
- rightSidebar,
100
- bottomPanel,
101
- footer,
102
- children
103
- }: Props = $props();
104
-
105
- /** Current width of the left sidebar */
106
- // svelte-ignore state_referenced_locally — initial default, component owns draggable state
107
- let leftSidebarWidth = $state(initialLeftWidth);
108
-
109
- /** Current width of the right sidebar */
110
- // svelte-ignore state_referenced_locally
111
- let rightSidebarWidth = $state(initialRightWidth);
112
-
113
- /** Current height of the bottom panel */
114
- // svelte-ignore state_referenced_locally
115
- let bottomPanelHeightState = $state(initialBottomHeight);
116
-
117
- /**
118
- * Sync left sidebar width with prop changes
119
- * This allows external control (e.g., collapsed state) to update the width
120
- */
121
- $effect(() => {
122
- leftSidebarWidth = initialLeftWidth;
123
- });
124
-
125
- /** Whether the user is currently dragging the left divider */
126
- let isDraggingLeft = $state(false);
127
-
128
- /** Whether the user is currently dragging the right divider */
129
- let isDraggingRight = $state(false);
130
-
131
- /** Whether the user is currently dragging the bottom divider */
132
- let isDraggingBottom = $state(false);
133
-
134
- /** Reference to the layout container element */
135
- let layoutRef: HTMLDivElement | null = null;
136
-
137
- /** Reference to the main content wrapper for bottom panel calculations */
138
- let mainContentRef: HTMLDivElement | null = null;
139
-
140
- /**
141
- * Handles the start of a drag operation on the left divider
142
- * @param event - The mouse event that triggered the drag
143
- */
144
- function handleLeftDragStart(event: MouseEvent): void {
145
- if (!enableLeftSplitPane) return;
146
- event.preventDefault();
147
- isDraggingLeft = true;
148
- }
149
-
150
- /**
151
- * Handles the start of a drag operation on the right divider
152
- * @param event - The mouse event that triggered the drag
153
- */
154
- function handleRightDragStart(event: MouseEvent): void {
155
- if (!enableRightSplitPane) return;
156
- event.preventDefault();
157
- isDraggingRight = true;
158
- }
159
-
160
- /**
161
- * Handles the start of a drag operation on the bottom divider
162
- * @param event - The mouse event that triggered the drag
163
- */
164
- function handleBottomDragStart(event: MouseEvent): void {
165
- if (!enableBottomSplitPane) return;
166
- event.preventDefault();
167
- isDraggingBottom = true;
168
- }
169
-
170
- /**
171
- * Handles mouse movement during drag operations
172
- * Updates sidebar widths and bottom panel height based on mouse position
173
- * @param event - The mouse event during drag
174
- */
175
- function handleMouseMove(event: MouseEvent): void {
176
- if (!layoutRef) return;
177
-
178
- const layoutRect = layoutRef.getBoundingClientRect();
179
-
180
- if (isDraggingLeft) {
181
- // Calculate new width from the left edge of the layout
182
- const newWidth = event.clientX - layoutRect.left;
183
- // Clamp the width between min and max values
184
- leftSidebarWidth = Math.min(Math.max(newWidth, leftSidebarMinWidth), leftSidebarMaxWidth);
185
- }
186
-
187
- if (isDraggingRight) {
188
- // Calculate new width from the right edge of the layout
189
- const newWidth = layoutRect.right - event.clientX;
190
- // Clamp the width between min and max values
191
- rightSidebarWidth = Math.min(Math.max(newWidth, rightSidebarMinWidth), rightSidebarMaxWidth);
192
- }
193
-
194
- if (isDraggingBottom && mainContentRef) {
195
- // Calculate new height from the bottom of the main content area
196
- const mainRect = mainContentRef.getBoundingClientRect();
197
- const newHeight = mainRect.bottom - event.clientY;
198
- // Clamp the height between min and max values
199
- bottomPanelHeightState = Math.min(
200
- Math.max(newHeight, bottomPanelMinHeight),
201
- bottomPanelMaxHeight
202
- );
203
- }
204
- }
205
-
206
- /**
207
- * Handles the end of a drag operation
208
- * Resets dragging state for all dividers
209
- */
210
- function handleMouseUp(): void {
211
- isDraggingLeft = false;
212
- isDraggingRight = false;
213
- isDraggingBottom = false;
214
- }
215
-
216
- /**
217
- * Handles keyboard navigation for accessibility
218
- * Allows resizing with arrow keys when divider is focused
219
- * @param event - The keyboard event
220
- * @param side - Which divider is being adjusted
221
- */
222
- function handleKeyDown(event: KeyboardEvent, side: 'left' | 'right' | 'bottom'): void {
223
- // Check if the specific side's split pane is enabled
224
- if (side === 'left' && !enableLeftSplitPane) return;
225
- if (side === 'right' && !enableRightSplitPane) return;
226
- if (side === 'bottom' && !enableBottomSplitPane) return;
227
-
228
- const step = event.shiftKey ? 50 : 10;
229
-
230
- if (side === 'left') {
231
- if (event.key === 'ArrowRight') {
232
- event.preventDefault();
233
- leftSidebarWidth = Math.min(leftSidebarWidth + step, leftSidebarMaxWidth);
234
- } else if (event.key === 'ArrowLeft') {
235
- event.preventDefault();
236
- leftSidebarWidth = Math.max(leftSidebarWidth - step, leftSidebarMinWidth);
237
- }
238
- } else if (side === 'right') {
239
- if (event.key === 'ArrowLeft') {
240
- event.preventDefault();
241
- rightSidebarWidth = Math.min(rightSidebarWidth + step, rightSidebarMaxWidth);
242
- } else if (event.key === 'ArrowRight') {
243
- event.preventDefault();
244
- rightSidebarWidth = Math.max(rightSidebarWidth - step, rightSidebarMinWidth);
245
- }
246
- } else if (side === 'bottom') {
247
- if (event.key === 'ArrowUp') {
248
- event.preventDefault();
249
- bottomPanelHeightState = Math.min(bottomPanelHeightState + step, bottomPanelMaxHeight);
250
- } else if (event.key === 'ArrowDown') {
251
- event.preventDefault();
252
- bottomPanelHeightState = Math.max(bottomPanelHeightState - step, bottomPanelMinHeight);
253
- }
254
- }
255
- }
256
-
257
- // Set up global mouse event listeners for drag operations
258
- onMount(() => {
259
- /**
260
- * Global mouse move handler for tracking drag operations
261
- */
262
- const mouseMoveHandler = (e: MouseEvent) => {
263
- if (isDraggingLeft || isDraggingRight || isDraggingBottom) {
264
- handleMouseMove(e);
265
- }
266
- };
267
-
268
- /**
269
- * Global mouse up handler to end drag operations
270
- */
271
- const mouseUpHandler = () => {
272
- handleMouseUp();
273
- };
274
-
275
- // Attach event listeners to window for drag tracking
276
- window.addEventListener('mousemove', mouseMoveHandler);
277
- window.addEventListener('mouseup', mouseUpHandler);
278
-
279
- // Cleanup on component unmount
280
- return () => {
281
- window.removeEventListener('mousemove', mouseMoveHandler);
282
- window.removeEventListener('mouseup', mouseUpHandler);
283
- };
284
- });
285
-
286
- /** Computed CSS variable for header height */
287
- const headerHeightVar = $derived(`${headerHeight}px`);
288
-
289
- /** Computed CSS variable for footer height */
290
- const footerHeightVar = $derived(`${footerHeight}px`);
291
-
292
- /** Computed CSS variable for left sidebar width */
293
- const leftWidthVar = $derived(`${leftSidebarWidth}px`);
294
-
295
- /** Computed CSS variable for right sidebar width */
296
- const rightWidthVar = $derived(`${rightSidebarWidth}px`);
297
-
298
- /** Computed CSS variable for bottom panel height */
299
- const bottomHeightVar = $derived(`${bottomPanelHeightState}px`);
13
+ import { onMount } from "svelte";
14
+
15
+ /**
16
+ * Configuration props for the MainLayout component
17
+ */
18
+ interface Props {
19
+ /** Height of the header in pixels */
20
+ headerHeight?: number;
21
+ /** Height of the footer in pixels */
22
+ footerHeight?: number;
23
+ /** Whether to show the header */
24
+ showHeader?: boolean;
25
+ /** Whether to show the footer */
26
+ showFooter?: boolean;
27
+ /** Whether to show the left sidebar */
28
+ showLeftSidebar?: boolean;
29
+ /** Whether to show the right sidebar */
30
+ showRightSidebar?: boolean;
31
+ /** Whether to show the bottom panel */
32
+ showBottomPanel?: boolean;
33
+ /** Initial width of the left sidebar in pixels */
34
+ leftSidebarWidth?: number;
35
+ /** Initial width of the right sidebar in pixels */
36
+ rightSidebarWidth?: number;
37
+ /** Initial height of the bottom panel in pixels */
38
+ bottomPanelHeight?: number;
39
+ /** Minimum width for left sidebar in pixels */
40
+ leftSidebarMinWidth?: number;
41
+ /** Maximum width for left sidebar in pixels */
42
+ leftSidebarMaxWidth?: number;
43
+ /** Minimum width for right sidebar in pixels */
44
+ rightSidebarMinWidth?: number;
45
+ /** Maximum width for right sidebar in pixels */
46
+ rightSidebarMaxWidth?: number;
47
+ /** Minimum height for bottom panel in pixels */
48
+ bottomPanelMinHeight?: number;
49
+ /** Maximum height for bottom panel in pixels */
50
+ bottomPanelMaxHeight?: number;
51
+ /** Whether to enable split pane resizing for left sidebar */
52
+ enableLeftSplitPane?: boolean;
53
+ /** Whether to enable split pane resizing for right sidebar */
54
+ enableRightSplitPane?: boolean;
55
+ /** Whether to enable split pane resizing for bottom panel */
56
+ enableBottomSplitPane?: boolean;
57
+ /** Background color for the main layout */
58
+ backgroundColor?: string;
59
+ /** Custom CSS class for the layout container */
60
+ class?: string;
61
+ /** Slot for header content */
62
+ header?: import("svelte").Snippet;
63
+ /** Slot for left sidebar content */
64
+ leftSidebar?: import("svelte").Snippet;
65
+ /** Slot for right sidebar content */
66
+ rightSidebar?: import("svelte").Snippet;
67
+ /** Slot for bottom panel content */
68
+ bottomPanel?: import("svelte").Snippet;
69
+ /** Slot for footer content */
70
+ footer?: import("svelte").Snippet;
71
+ /** Slot for main content (default slot) */
72
+ children?: import("svelte").Snippet;
73
+ }
74
+
75
+ let {
76
+ headerHeight = 60,
77
+ footerHeight = 48,
78
+ showHeader = true,
79
+ showFooter = false,
80
+ showLeftSidebar = true,
81
+ showRightSidebar = true,
82
+ showBottomPanel = false,
83
+ leftSidebarWidth: initialLeftWidth = 280,
84
+ rightSidebarWidth: initialRightWidth = 320,
85
+ bottomPanelHeight: initialBottomHeight = 300,
86
+ leftSidebarMinWidth = 200,
87
+ leftSidebarMaxWidth = 500,
88
+ rightSidebarMinWidth = 200,
89
+ rightSidebarMaxWidth = 500,
90
+ bottomPanelMinHeight = 150,
91
+ bottomPanelMaxHeight = 500,
92
+ enableLeftSplitPane = true,
93
+ enableRightSplitPane = true,
94
+ enableBottomSplitPane = true,
95
+ backgroundColor = "var(--fd-layout-background)",
96
+ class: customClass = "",
97
+ header,
98
+ leftSidebar,
99
+ rightSidebar,
100
+ bottomPanel,
101
+ footer,
102
+ children,
103
+ }: Props = $props();
104
+
105
+ /** Current width of the left sidebar */
106
+ // svelte-ignore state_referenced_locally — initial default, component owns draggable state
107
+ let leftSidebarWidth = $state(initialLeftWidth);
108
+
109
+ /** Current width of the right sidebar */
110
+ // svelte-ignore state_referenced_locally
111
+ let rightSidebarWidth = $state(initialRightWidth);
112
+
113
+ /** Current height of the bottom panel */
114
+ // svelte-ignore state_referenced_locally
115
+ let bottomPanelHeightState = $state(initialBottomHeight);
116
+
117
+ /**
118
+ * Sync left sidebar width with prop changes
119
+ * This allows external control (e.g., collapsed state) to update the width
120
+ */
121
+ $effect(() => {
122
+ leftSidebarWidth = initialLeftWidth;
123
+ });
124
+
125
+ /** Whether the user is currently dragging the left divider */
126
+ let isDraggingLeft = $state(false);
127
+
128
+ /** Whether the user is currently dragging the right divider */
129
+ let isDraggingRight = $state(false);
130
+
131
+ /** Whether the user is currently dragging the bottom divider */
132
+ let isDraggingBottom = $state(false);
133
+
134
+ /** Reference to the layout container element */
135
+ let layoutRef: HTMLDivElement | null = null;
136
+
137
+ /** Reference to the main content wrapper for bottom panel calculations */
138
+ let mainContentRef: HTMLDivElement | null = null;
139
+
140
+ /**
141
+ * Handles the start of a drag operation on the left divider
142
+ * @param event - The mouse event that triggered the drag
143
+ */
144
+ function handleLeftDragStart(event: MouseEvent): void {
145
+ if (!enableLeftSplitPane) return;
146
+ event.preventDefault();
147
+ isDraggingLeft = true;
148
+ }
149
+
150
+ /**
151
+ * Handles the start of a drag operation on the right divider
152
+ * @param event - The mouse event that triggered the drag
153
+ */
154
+ function handleRightDragStart(event: MouseEvent): void {
155
+ if (!enableRightSplitPane) return;
156
+ event.preventDefault();
157
+ isDraggingRight = true;
158
+ }
159
+
160
+ /**
161
+ * Handles the start of a drag operation on the bottom divider
162
+ * @param event - The mouse event that triggered the drag
163
+ */
164
+ function handleBottomDragStart(event: MouseEvent): void {
165
+ if (!enableBottomSplitPane) return;
166
+ event.preventDefault();
167
+ isDraggingBottom = true;
168
+ }
169
+
170
+ /**
171
+ * Handles mouse movement during drag operations
172
+ * Updates sidebar widths and bottom panel height based on mouse position
173
+ * @param event - The mouse event during drag
174
+ */
175
+ function handleMouseMove(event: MouseEvent): void {
176
+ if (!layoutRef) return;
177
+
178
+ const layoutRect = layoutRef.getBoundingClientRect();
179
+
180
+ if (isDraggingLeft) {
181
+ // Calculate new width from the left edge of the layout
182
+ const newWidth = event.clientX - layoutRect.left;
183
+ // Clamp the width between min and max values
184
+ leftSidebarWidth = Math.min(
185
+ Math.max(newWidth, leftSidebarMinWidth),
186
+ leftSidebarMaxWidth,
187
+ );
188
+ }
189
+
190
+ if (isDraggingRight) {
191
+ // Calculate new width from the right edge of the layout
192
+ const newWidth = layoutRect.right - event.clientX;
193
+ // Clamp the width between min and max values
194
+ rightSidebarWidth = Math.min(
195
+ Math.max(newWidth, rightSidebarMinWidth),
196
+ rightSidebarMaxWidth,
197
+ );
198
+ }
199
+
200
+ if (isDraggingBottom && mainContentRef) {
201
+ // Calculate new height from the bottom of the main content area
202
+ const mainRect = mainContentRef.getBoundingClientRect();
203
+ const newHeight = mainRect.bottom - event.clientY;
204
+ // Clamp the height between min and max values
205
+ bottomPanelHeightState = Math.min(
206
+ Math.max(newHeight, bottomPanelMinHeight),
207
+ bottomPanelMaxHeight,
208
+ );
209
+ }
210
+ }
211
+
212
+ /**
213
+ * Handles the end of a drag operation
214
+ * Resets dragging state for all dividers
215
+ */
216
+ function handleMouseUp(): void {
217
+ isDraggingLeft = false;
218
+ isDraggingRight = false;
219
+ isDraggingBottom = false;
220
+ }
221
+
222
+ /**
223
+ * Handles keyboard navigation for accessibility
224
+ * Allows resizing with arrow keys when divider is focused
225
+ * @param event - The keyboard event
226
+ * @param side - Which divider is being adjusted
227
+ */
228
+ function handleKeyDown(
229
+ event: KeyboardEvent,
230
+ side: "left" | "right" | "bottom",
231
+ ): void {
232
+ // Check if the specific side's split pane is enabled
233
+ if (side === "left" && !enableLeftSplitPane) return;
234
+ if (side === "right" && !enableRightSplitPane) return;
235
+ if (side === "bottom" && !enableBottomSplitPane) return;
236
+
237
+ const step = event.shiftKey ? 50 : 10;
238
+
239
+ if (side === "left") {
240
+ if (event.key === "ArrowRight") {
241
+ event.preventDefault();
242
+ leftSidebarWidth = Math.min(
243
+ leftSidebarWidth + step,
244
+ leftSidebarMaxWidth,
245
+ );
246
+ } else if (event.key === "ArrowLeft") {
247
+ event.preventDefault();
248
+ leftSidebarWidth = Math.max(
249
+ leftSidebarWidth - step,
250
+ leftSidebarMinWidth,
251
+ );
252
+ }
253
+ } else if (side === "right") {
254
+ if (event.key === "ArrowLeft") {
255
+ event.preventDefault();
256
+ rightSidebarWidth = Math.min(
257
+ rightSidebarWidth + step,
258
+ rightSidebarMaxWidth,
259
+ );
260
+ } else if (event.key === "ArrowRight") {
261
+ event.preventDefault();
262
+ rightSidebarWidth = Math.max(
263
+ rightSidebarWidth - step,
264
+ rightSidebarMinWidth,
265
+ );
266
+ }
267
+ } else if (side === "bottom") {
268
+ if (event.key === "ArrowUp") {
269
+ event.preventDefault();
270
+ bottomPanelHeightState = Math.min(
271
+ bottomPanelHeightState + step,
272
+ bottomPanelMaxHeight,
273
+ );
274
+ } else if (event.key === "ArrowDown") {
275
+ event.preventDefault();
276
+ bottomPanelHeightState = Math.max(
277
+ bottomPanelHeightState - step,
278
+ bottomPanelMinHeight,
279
+ );
280
+ }
281
+ }
282
+ }
283
+
284
+ // Set up global mouse event listeners for drag operations
285
+ onMount(() => {
286
+ /**
287
+ * Global mouse move handler for tracking drag operations
288
+ */
289
+ const mouseMoveHandler = (e: MouseEvent) => {
290
+ if (isDraggingLeft || isDraggingRight || isDraggingBottom) {
291
+ handleMouseMove(e);
292
+ }
293
+ };
294
+
295
+ /**
296
+ * Global mouse up handler to end drag operations
297
+ */
298
+ const mouseUpHandler = () => {
299
+ handleMouseUp();
300
+ };
301
+
302
+ // Attach event listeners to window for drag tracking
303
+ window.addEventListener("mousemove", mouseMoveHandler);
304
+ window.addEventListener("mouseup", mouseUpHandler);
305
+
306
+ // Cleanup on component unmount
307
+ return () => {
308
+ window.removeEventListener("mousemove", mouseMoveHandler);
309
+ window.removeEventListener("mouseup", mouseUpHandler);
310
+ };
311
+ });
312
+
313
+ /** Computed CSS variable for header height */
314
+ const headerHeightVar = $derived(`${headerHeight}px`);
315
+
316
+ /** Computed CSS variable for footer height */
317
+ const footerHeightVar = $derived(`${footerHeight}px`);
318
+
319
+ /** Computed CSS variable for left sidebar width */
320
+ const leftWidthVar = $derived(`${leftSidebarWidth}px`);
321
+
322
+ /** Computed CSS variable for right sidebar width */
323
+ const rightWidthVar = $derived(`${rightSidebarWidth}px`);
324
+
325
+ /** Computed CSS variable for bottom panel height */
326
+ const bottomHeightVar = $derived(`${bottomPanelHeightState}px`);
300
327
  </script>
301
328
 
302
329
  <div
303
- bind:this={layoutRef}
304
- class="flowdrop-main-layout {customClass}"
305
- class:flowdrop-main-layout--dragging={isDraggingLeft || isDraggingRight || isDraggingBottom}
306
- class:flowdrop-main-layout--dragging-vertical={isDraggingBottom}
307
- style="
330
+ bind:this={layoutRef}
331
+ class="flowdrop-main-layout {customClass}"
332
+ class:flowdrop-main-layout--dragging={isDraggingLeft ||
333
+ isDraggingRight ||
334
+ isDraggingBottom}
335
+ class:flowdrop-main-layout--dragging-vertical={isDraggingBottom}
336
+ style="
308
337
  --layout-header-height: {headerHeightVar};
309
338
  --layout-footer-height: {footerHeightVar};
310
339
  --layout-left-sidebar-width: {leftWidthVar};
@@ -313,406 +342,410 @@
313
342
  --layout-background: {backgroundColor};
314
343
  "
315
344
  >
316
- <!-- Header Section -->
317
- {#if showHeader && header}
318
- <header class="flowdrop-main-layout__header">
319
- {@render header()}
320
- </header>
321
- {/if}
322
-
323
- <!-- Main Content Area -->
324
- <div class="flowdrop-main-layout__body">
325
- <!-- Left Sidebar -->
326
- {#if showLeftSidebar && leftSidebar}
327
- <aside class="flowdrop-main-layout__sidebar flowdrop-main-layout__sidebar--left">
328
- {@render leftSidebar()}
329
- </aside>
330
-
331
- <!-- Left Divider (Resizable Handle) -->
332
- {#if enableLeftSplitPane}
333
- <!-- svelte-ignore a11y_no_noninteractive_tabindex -->
334
- <!-- svelte-ignore a11y_no_noninteractive_element_interactions -->
335
- <div
336
- class="flowdrop-main-layout__divider flowdrop-main-layout__divider--left"
337
- class:flowdrop-main-layout__divider--active={isDraggingLeft}
338
- onmousedown={handleLeftDragStart}
339
- onkeydown={(e) => handleKeyDown(e, 'left')}
340
- role="separator"
341
- aria-orientation="vertical"
342
- aria-valuenow={leftSidebarWidth}
343
- aria-valuemin={leftSidebarMinWidth}
344
- aria-valuemax={leftSidebarMaxWidth}
345
- aria-label="Resize left sidebar"
346
- tabindex="0"
347
- >
348
- <div class="flowdrop-main-layout__divider-handle"></div>
349
- </div>
350
- {/if}
351
- {/if}
352
-
353
- <!-- Center Main Content Wrapper (with optional bottom panel) -->
354
- <div
355
- bind:this={mainContentRef}
356
- class="flowdrop-main-layout__main-wrapper"
357
- class:flowdrop-main-layout__main-wrapper--with-bottom={showBottomPanel && bottomPanel}
358
- >
359
- <!-- Main Content Area -->
360
- <main class="flowdrop-main-layout__main">
361
- {#if children}
362
- {@render children()}
363
- {/if}
364
- </main>
365
-
366
- <!-- Bottom Panel Divider -->
367
- {#if showBottomPanel && bottomPanel && enableBottomSplitPane}
368
- <!-- svelte-ignore a11y_no_noninteractive_tabindex -->
369
- <!-- svelte-ignore a11y_no_noninteractive_element_interactions -->
370
- <div
371
- class="flowdrop-main-layout__divider flowdrop-main-layout__divider--bottom"
372
- class:flowdrop-main-layout__divider--active={isDraggingBottom}
373
- onmousedown={handleBottomDragStart}
374
- onkeydown={(e) => handleKeyDown(e, 'bottom')}
375
- role="separator"
376
- aria-orientation="horizontal"
377
- aria-valuenow={bottomPanelHeightState}
378
- aria-valuemin={bottomPanelMinHeight}
379
- aria-valuemax={bottomPanelMaxHeight}
380
- aria-label="Resize bottom panel"
381
- tabindex="0"
382
- >
383
- <div
384
- class="flowdrop-main-layout__divider-handle flowdrop-main-layout__divider-handle--horizontal"
385
- ></div>
386
- </div>
387
- {/if}
388
-
389
- <!-- Bottom Panel -->
390
- {#if showBottomPanel && bottomPanel}
391
- <aside class="flowdrop-main-layout__panel flowdrop-main-layout__panel--bottom">
392
- {@render bottomPanel()}
393
- </aside>
394
- {/if}
395
- </div>
396
-
397
- <!-- Right Divider (Resizable Handle) -->
398
- {#if showRightSidebar && rightSidebar && enableRightSplitPane}
399
- <!-- svelte-ignore a11y_no_noninteractive_tabindex -->
400
- <!-- svelte-ignore a11y_no_noninteractive_element_interactions -->
401
- <div
402
- class="flowdrop-main-layout__divider flowdrop-main-layout__divider--right"
403
- class:flowdrop-main-layout__divider--active={isDraggingRight}
404
- onmousedown={handleRightDragStart}
405
- onkeydown={(e) => handleKeyDown(e, 'right')}
406
- role="separator"
407
- aria-orientation="vertical"
408
- aria-valuenow={rightSidebarWidth}
409
- aria-valuemin={rightSidebarMinWidth}
410
- aria-valuemax={rightSidebarMaxWidth}
411
- aria-label="Resize right sidebar"
412
- tabindex="0"
413
- >
414
- <div class="flowdrop-main-layout__divider-handle"></div>
415
- </div>
416
- {/if}
417
-
418
- <!-- Right Sidebar -->
419
- {#if showRightSidebar && rightSidebar}
420
- <aside class="flowdrop-main-layout__sidebar flowdrop-main-layout__sidebar--right">
421
- {@render rightSidebar()}
422
- </aside>
423
- {/if}
424
- </div>
425
-
426
- <!-- Footer Section -->
427
- {#if showFooter && footer}
428
- <footer class="flowdrop-main-layout__footer">
429
- {@render footer()}
430
- </footer>
431
- {/if}
345
+ <!-- Header Section -->
346
+ {#if showHeader && header}
347
+ <header class="flowdrop-main-layout__header">
348
+ {@render header()}
349
+ </header>
350
+ {/if}
351
+
352
+ <!-- Main Content Area -->
353
+ <div class="flowdrop-main-layout__body">
354
+ <!-- Left Sidebar -->
355
+ {#if showLeftSidebar && leftSidebar}
356
+ <aside
357
+ class="flowdrop-main-layout__sidebar flowdrop-main-layout__sidebar--left"
358
+ >
359
+ {@render leftSidebar()}
360
+ </aside>
361
+
362
+ <!-- Left Divider (Resizable Handle) -->
363
+ {#if enableLeftSplitPane}
364
+ <!-- svelte-ignore a11y_no_noninteractive_tabindex -->
365
+ <!-- svelte-ignore a11y_no_noninteractive_element_interactions -->
366
+ <div
367
+ class="flowdrop-main-layout__divider flowdrop-main-layout__divider--left"
368
+ class:flowdrop-main-layout__divider--active={isDraggingLeft}
369
+ onmousedown={handleLeftDragStart}
370
+ onkeydown={(e) => handleKeyDown(e, "left")}
371
+ role="separator"
372
+ aria-orientation="vertical"
373
+ aria-valuenow={leftSidebarWidth}
374
+ aria-valuemin={leftSidebarMinWidth}
375
+ aria-valuemax={leftSidebarMaxWidth}
376
+ aria-label="Resize left sidebar"
377
+ tabindex="0"
378
+ >
379
+ <div class="flowdrop-main-layout__divider-handle"></div>
380
+ </div>
381
+ {/if}
382
+ {/if}
383
+
384
+ <!-- Center Main Content Wrapper (with optional bottom panel) -->
385
+ <div
386
+ bind:this={mainContentRef}
387
+ class="flowdrop-main-layout__main-wrapper"
388
+ class:flowdrop-main-layout__main-wrapper--with-bottom={showBottomPanel &&
389
+ bottomPanel}
390
+ >
391
+ <!-- Main Content Area -->
392
+ <main class="flowdrop-main-layout__main">
393
+ {#if children}
394
+ {@render children()}
395
+ {/if}
396
+ </main>
397
+
398
+ <!-- Bottom Panel Divider -->
399
+ {#if showBottomPanel && bottomPanel && enableBottomSplitPane}
400
+ <!-- svelte-ignore a11y_no_noninteractive_tabindex -->
401
+ <!-- svelte-ignore a11y_no_noninteractive_element_interactions -->
402
+ <div
403
+ class="flowdrop-main-layout__divider flowdrop-main-layout__divider--bottom"
404
+ class:flowdrop-main-layout__divider--active={isDraggingBottom}
405
+ onmousedown={handleBottomDragStart}
406
+ onkeydown={(e) => handleKeyDown(e, "bottom")}
407
+ role="separator"
408
+ aria-orientation="horizontal"
409
+ aria-valuenow={bottomPanelHeightState}
410
+ aria-valuemin={bottomPanelMinHeight}
411
+ aria-valuemax={bottomPanelMaxHeight}
412
+ aria-label="Resize bottom panel"
413
+ tabindex="0"
414
+ >
415
+ <div
416
+ class="flowdrop-main-layout__divider-handle flowdrop-main-layout__divider-handle--horizontal"
417
+ ></div>
418
+ </div>
419
+ {/if}
420
+
421
+ <!-- Bottom Panel -->
422
+ {#if showBottomPanel && bottomPanel}
423
+ <aside
424
+ class="flowdrop-main-layout__panel flowdrop-main-layout__panel--bottom"
425
+ >
426
+ {@render bottomPanel()}
427
+ </aside>
428
+ {/if}
429
+ </div>
430
+
431
+ <!-- Right Divider (Resizable Handle) -->
432
+ {#if showRightSidebar && rightSidebar && enableRightSplitPane}
433
+ <!-- svelte-ignore a11y_no_noninteractive_tabindex -->
434
+ <!-- svelte-ignore a11y_no_noninteractive_element_interactions -->
435
+ <div
436
+ class="flowdrop-main-layout__divider flowdrop-main-layout__divider--right"
437
+ class:flowdrop-main-layout__divider--active={isDraggingRight}
438
+ onmousedown={handleRightDragStart}
439
+ onkeydown={(e) => handleKeyDown(e, "right")}
440
+ role="separator"
441
+ aria-orientation="vertical"
442
+ aria-valuenow={rightSidebarWidth}
443
+ aria-valuemin={rightSidebarMinWidth}
444
+ aria-valuemax={rightSidebarMaxWidth}
445
+ aria-label="Resize right sidebar"
446
+ tabindex="0"
447
+ >
448
+ <div class="flowdrop-main-layout__divider-handle"></div>
449
+ </div>
450
+ {/if}
451
+
452
+ <!-- Right Sidebar -->
453
+ {#if showRightSidebar && rightSidebar}
454
+ <aside
455
+ class="flowdrop-main-layout__sidebar flowdrop-main-layout__sidebar--right"
456
+ >
457
+ {@render rightSidebar()}
458
+ </aside>
459
+ {/if}
460
+ </div>
461
+
462
+ <!-- Footer Section -->
463
+ {#if showFooter && footer}
464
+ <footer class="flowdrop-main-layout__footer">
465
+ {@render footer()}
466
+ </footer>
467
+ {/if}
432
468
  </div>
433
469
 
434
470
  <style>
435
- /* Main Layout Container */
436
- .flowdrop-main-layout {
437
- display: flex;
438
- flex-direction: column;
439
- height: 100vh;
440
- width: 100%;
441
- background: var(
442
- --fd-layout-background,
443
- linear-gradient(135deg, #f9fafb 0%, #e0e7ff 50%, #c7d2fe 100%)
444
- );
445
- overflow: hidden;
446
- }
447
-
448
- /* Dark mode override for layout background */
449
- :global([data-theme='dark']) :global(.flowdrop-main-layout) {
450
- background: linear-gradient(135deg, #141418 0%, #1a1a2e 50%, #16162a 100%);
451
- }
452
-
453
- /* Disable text selection and pointer events during drag */
454
- .flowdrop-main-layout--dragging {
455
- user-select: none;
456
- cursor: col-resize;
457
- }
458
-
459
- .flowdrop-main-layout--dragging * {
460
- pointer-events: none;
461
- }
462
-
463
- .flowdrop-main-layout--dragging .flowdrop-main-layout__divider {
464
- pointer-events: auto;
465
- }
466
-
467
- /* Header Section */
468
- .flowdrop-main-layout__header {
469
- height: var(--layout-header-height);
470
- min-height: var(--layout-header-height);
471
- max-height: var(--layout-header-height);
472
- width: 100%;
473
- background-color: var(--fd-background);
474
- border-bottom: 1px solid var(--fd-border);
475
- display: flex;
476
- align-items: center;
477
- z-index: 100;
478
- }
479
-
480
- /* Main Body Container */
481
- .flowdrop-main-layout__body {
482
- flex: 1;
483
- display: flex;
484
- min-height: 0;
485
- overflow: hidden;
486
- position: relative;
487
- }
488
-
489
- /* Sidebar Base Styles */
490
- .flowdrop-main-layout__sidebar {
491
- height: 100%;
492
- background-color: var(--fd-background);
493
- overflow-y: auto;
494
- overflow-x: hidden;
495
- display: flex;
496
- flex-direction: column;
497
- z-index: 10;
498
-
499
- /* Custom scrollbar styling */
500
- scrollbar-width: thin;
501
- scrollbar-color: var(--fd-scrollbar-thumb) var(--fd-scrollbar-track);
502
- }
503
-
504
- .flowdrop-main-layout__sidebar::-webkit-scrollbar {
505
- width: 8px;
506
- }
507
-
508
- .flowdrop-main-layout__sidebar::-webkit-scrollbar-track {
509
- background: var(--fd-scrollbar-track);
510
- border-radius: 4px;
511
- }
512
-
513
- .flowdrop-main-layout__sidebar::-webkit-scrollbar-thumb {
514
- background: var(--fd-scrollbar-thumb);
515
- border-radius: 4px;
516
- }
517
-
518
- .flowdrop-main-layout__sidebar::-webkit-scrollbar-thumb:hover {
519
- background: var(--fd-scrollbar-thumb-hover);
520
- }
521
-
522
- /* Left Sidebar */
523
- .flowdrop-main-layout__sidebar--left {
524
- width: var(--layout-left-sidebar-width);
525
- min-width: var(--layout-left-sidebar-width);
526
- border-right: 1px solid var(--fd-border);
527
- box-shadow: 2px 0 4px rgba(0, 0, 0, 0.05);
528
- }
529
-
530
- /* Right Sidebar */
531
- .flowdrop-main-layout__sidebar--right {
532
- width: var(--layout-right-sidebar-width);
533
- min-width: var(--layout-right-sidebar-width);
534
- }
535
-
536
- /* Main Content Wrapper - Contains main content and optional bottom panel */
537
- .flowdrop-main-layout__main-wrapper {
538
- flex: 1;
539
- min-width: 0;
540
- display: flex;
541
- flex-direction: column;
542
- position: relative;
543
- overflow: hidden;
544
- }
545
-
546
- /* Main Content Area */
547
- .flowdrop-main-layout__main {
548
- flex: 1;
549
- min-width: 0;
550
- min-height: 0;
551
- overflow: auto;
552
- position: relative;
553
- display: flex;
554
- flex-direction: column;
555
- }
556
-
557
- /* When bottom panel is shown, main area should shrink */
558
- .flowdrop-main-layout__main-wrapper--with-bottom .flowdrop-main-layout__main {
559
- height: calc(100% - var(--layout-bottom-panel-height) - 8px);
560
- }
561
-
562
- /* Divider (Resize Handle) Base Styles */
563
- .flowdrop-main-layout__divider {
564
- width: 8px;
565
- height: 100%;
566
- display: flex;
567
- align-items: center;
568
- justify-content: center;
569
- cursor: col-resize;
570
- background-color: var(--fd-background);
571
- position: relative;
572
- z-index: 20;
573
- flex-shrink: 0;
574
- transition: background-color 0.2s ease;
575
- border-right: 1px solid var(--fd-border);
576
- border-left: 1px solid var(--fd-border);
577
- }
578
-
579
- .flowdrop-main-layout__divider:hover,
580
- .flowdrop-main-layout__divider:focus {
581
- background-color: var(--fd-primary-muted);
582
- }
583
-
584
- .flowdrop-main-layout__divider:focus {
585
- outline: none;
586
- background-color: var(--fd-primary-muted);
587
- }
588
-
589
- .flowdrop-main-layout__divider--active {
590
- background-color: var(--fd-primary-muted);
591
- }
592
-
593
- /* Divider Handle (Visual Indicator) */
594
- .flowdrop-main-layout__divider-handle {
595
- width: 4px;
596
- height: 48px;
597
- background-color: var(--fd-border-strong);
598
- border-radius: 4px;
599
- transition:
600
- background-color 0.2s ease,
601
- transform 0.2s ease;
602
- }
603
-
604
- .flowdrop-main-layout__divider:hover .flowdrop-main-layout__divider-handle,
605
- .flowdrop-main-layout__divider:focus .flowdrop-main-layout__divider-handle {
606
- background-color: var(--fd-primary);
607
- transform: scaleY(1.2);
608
- }
609
-
610
- .flowdrop-main-layout__divider--active .flowdrop-main-layout__divider-handle {
611
- background-color: var(--fd-primary-hover);
612
- transform: scaleY(1.4);
613
- }
614
-
615
- /* Bottom Divider (Horizontal) */
616
- .flowdrop-main-layout__divider--bottom {
617
- width: 100%;
618
- height: 8px;
619
- cursor: row-resize;
620
- flex-shrink: 0;
621
- border-top: 1px solid var(--fd-border);
622
- border-bottom: 1px solid var(--fd-border);
623
- border-left: none;
624
- border-right: none;
625
- }
626
-
627
- /* Horizontal Divider Handle */
628
- .flowdrop-main-layout__divider-handle--horizontal {
629
- width: 48px;
630
- height: 4px;
631
- }
632
-
633
- .flowdrop-main-layout__divider--bottom:hover .flowdrop-main-layout__divider-handle--horizontal,
634
- .flowdrop-main-layout__divider--bottom:focus .flowdrop-main-layout__divider-handle--horizontal {
635
- transform: scaleX(1.2);
636
- }
637
-
638
- .flowdrop-main-layout__divider--bottom.flowdrop-main-layout__divider--active
639
- .flowdrop-main-layout__divider-handle--horizontal {
640
- transform: scaleX(1.4);
641
- }
642
-
643
- /* Bottom Panel Styles */
644
- .flowdrop-main-layout__panel--bottom {
645
- height: var(--layout-bottom-panel-height);
646
- min-height: var(--layout-bottom-panel-height);
647
- max-height: var(--layout-bottom-panel-height);
648
- width: 100%;
649
- background-color: var(--fd-background);
650
- overflow-y: auto;
651
- overflow-x: hidden;
652
- display: flex;
653
- flex-direction: column;
654
- flex-shrink: 0;
655
- border-top: 1px solid var(--fd-border);
656
- box-shadow: 0 -2px 4px rgba(0, 0, 0, 0.05);
657
-
658
- /* Custom scrollbar styling */
659
- scrollbar-width: thin;
660
- scrollbar-color: var(--fd-scrollbar-thumb) var(--fd-scrollbar-track);
661
- }
662
-
663
- .flowdrop-main-layout__panel--bottom::-webkit-scrollbar {
664
- width: 8px;
665
- }
666
-
667
- .flowdrop-main-layout__panel--bottom::-webkit-scrollbar-track {
668
- background: var(--fd-scrollbar-track);
669
- border-radius: 4px;
670
- }
671
-
672
- .flowdrop-main-layout__panel--bottom::-webkit-scrollbar-thumb {
673
- background: var(--fd-scrollbar-thumb);
674
- border-radius: 4px;
675
- }
676
-
677
- .flowdrop-main-layout__panel--bottom::-webkit-scrollbar-thumb:hover {
678
- background: var(--fd-scrollbar-thumb-hover);
679
- }
680
-
681
- /* Vertical dragging cursor override */
682
- .flowdrop-main-layout--dragging-vertical {
683
- cursor: row-resize;
684
- }
685
-
686
- /* Footer Section */
687
- .flowdrop-main-layout__footer {
688
- height: var(--layout-footer-height);
689
- min-height: var(--layout-footer-height);
690
- max-height: var(--layout-footer-height);
691
- width: 100%;
692
- background-color: var(--fd-background);
693
- border-top: 1px solid var(--fd-border);
694
- display: flex;
695
- align-items: center;
696
- z-index: 100;
697
- box-shadow: 0 -1px 3px rgba(0, 0, 0, 0.05);
698
- }
699
-
700
- /* Responsive Adjustments */
701
- @media (max-width: 768px) {
702
- .flowdrop-main-layout__sidebar--left,
703
- .flowdrop-main-layout__sidebar--right {
704
- position: absolute;
705
- top: 0;
706
- bottom: 0;
707
- z-index: 50;
708
- }
709
-
710
- .flowdrop-main-layout__sidebar--left {
711
- left: 0;
712
- }
713
-
714
- .flowdrop-main-layout__sidebar--right {
715
- right: 0;
716
- }
717
- }
471
+ /* Main Layout Container */
472
+ .flowdrop-main-layout {
473
+ display: flex;
474
+ flex-direction: column;
475
+ height: 100vh;
476
+ width: 100%;
477
+ background: var(
478
+ --fd-layout-background,
479
+ linear-gradient(135deg, #f9fafb 0%, #e0e7ff 50%, #c7d2fe 100%)
480
+ );
481
+ overflow: hidden;
482
+ }
483
+
484
+ /* Disable text selection and pointer events during drag */
485
+ .flowdrop-main-layout--dragging {
486
+ user-select: none;
487
+ cursor: col-resize;
488
+ }
489
+
490
+ .flowdrop-main-layout--dragging * {
491
+ pointer-events: none;
492
+ }
493
+
494
+ .flowdrop-main-layout--dragging .flowdrop-main-layout__divider {
495
+ pointer-events: auto;
496
+ }
497
+
498
+ /* Header Section */
499
+ .flowdrop-main-layout__header {
500
+ height: var(--layout-header-height);
501
+ min-height: var(--layout-header-height);
502
+ max-height: var(--layout-header-height);
503
+ width: 100%;
504
+ background-color: var(--fd-background);
505
+ border-bottom: 1px solid var(--fd-border);
506
+ display: flex;
507
+ align-items: center;
508
+ z-index: 100;
509
+ }
510
+
511
+ /* Main Body Container */
512
+ .flowdrop-main-layout__body {
513
+ flex: 1;
514
+ display: flex;
515
+ min-height: 0;
516
+ overflow: hidden;
517
+ position: relative;
518
+ }
519
+
520
+ /* Sidebar Base Styles */
521
+ .flowdrop-main-layout__sidebar {
522
+ height: 100%;
523
+ background-color: var(--fd-background);
524
+ overflow-y: auto;
525
+ overflow-x: hidden;
526
+ display: flex;
527
+ flex-direction: column;
528
+ z-index: 10;
529
+
530
+ /* Custom scrollbar styling */
531
+ scrollbar-width: thin;
532
+ scrollbar-color: var(--fd-scrollbar-thumb) var(--fd-scrollbar-track);
533
+ }
534
+
535
+ .flowdrop-main-layout__sidebar::-webkit-scrollbar {
536
+ width: 8px;
537
+ }
538
+
539
+ .flowdrop-main-layout__sidebar::-webkit-scrollbar-track {
540
+ background: var(--fd-scrollbar-track);
541
+ border-radius: 4px;
542
+ }
543
+
544
+ .flowdrop-main-layout__sidebar::-webkit-scrollbar-thumb {
545
+ background: var(--fd-scrollbar-thumb);
546
+ border-radius: 4px;
547
+ }
548
+
549
+ .flowdrop-main-layout__sidebar::-webkit-scrollbar-thumb:hover {
550
+ background: var(--fd-scrollbar-thumb-hover);
551
+ }
552
+
553
+ /* Left Sidebar */
554
+ .flowdrop-main-layout__sidebar--left {
555
+ width: var(--layout-left-sidebar-width);
556
+ min-width: var(--layout-left-sidebar-width);
557
+ border-right: 1px solid var(--fd-border);
558
+ box-shadow: 2px 0 4px rgba(0, 0, 0, 0.05);
559
+ }
560
+
561
+ /* Right Sidebar */
562
+ .flowdrop-main-layout__sidebar--right {
563
+ width: var(--layout-right-sidebar-width);
564
+ min-width: var(--layout-right-sidebar-width);
565
+ }
566
+
567
+ /* Main Content Wrapper - Contains main content and optional bottom panel */
568
+ .flowdrop-main-layout__main-wrapper {
569
+ flex: 1;
570
+ min-width: 0;
571
+ display: flex;
572
+ flex-direction: column;
573
+ position: relative;
574
+ overflow: hidden;
575
+ }
576
+
577
+ /* Main Content Area */
578
+ .flowdrop-main-layout__main {
579
+ flex: 1;
580
+ min-width: 0;
581
+ min-height: 0;
582
+ overflow: auto;
583
+ position: relative;
584
+ display: flex;
585
+ flex-direction: column;
586
+ }
587
+
588
+ /* When bottom panel is shown, main area should shrink */
589
+ .flowdrop-main-layout__main-wrapper--with-bottom .flowdrop-main-layout__main {
590
+ height: calc(100% - var(--layout-bottom-panel-height) - 8px);
591
+ }
592
+
593
+ /* Divider (Resize Handle) Base Styles */
594
+ .flowdrop-main-layout__divider {
595
+ width: 8px;
596
+ height: 100%;
597
+ display: flex;
598
+ align-items: center;
599
+ justify-content: center;
600
+ cursor: col-resize;
601
+ background-color: var(--fd-background);
602
+ position: relative;
603
+ z-index: 20;
604
+ flex-shrink: 0;
605
+ transition: background-color 0.2s ease;
606
+ border-right: 1px solid var(--fd-border);
607
+ border-left: 1px solid var(--fd-border);
608
+ }
609
+
610
+ .flowdrop-main-layout__divider:hover,
611
+ .flowdrop-main-layout__divider:focus {
612
+ background-color: var(--fd-primary-muted);
613
+ }
614
+
615
+ .flowdrop-main-layout__divider:focus {
616
+ outline: none;
617
+ background-color: var(--fd-primary-muted);
618
+ }
619
+
620
+ .flowdrop-main-layout__divider--active {
621
+ background-color: var(--fd-primary-muted);
622
+ }
623
+
624
+ /* Divider Handle (Visual Indicator) */
625
+ .flowdrop-main-layout__divider-handle {
626
+ width: 4px;
627
+ height: 48px;
628
+ background-color: var(--fd-border-strong);
629
+ border-radius: 4px;
630
+ transition:
631
+ background-color 0.2s ease,
632
+ transform 0.2s ease;
633
+ }
634
+
635
+ .flowdrop-main-layout__divider:hover .flowdrop-main-layout__divider-handle,
636
+ .flowdrop-main-layout__divider:focus .flowdrop-main-layout__divider-handle {
637
+ background-color: var(--fd-primary);
638
+ transform: scaleY(1.2);
639
+ }
640
+
641
+ .flowdrop-main-layout__divider--active .flowdrop-main-layout__divider-handle {
642
+ background-color: var(--fd-primary-hover);
643
+ transform: scaleY(1.4);
644
+ }
645
+
646
+ /* Bottom Divider (Horizontal) */
647
+ .flowdrop-main-layout__divider--bottom {
648
+ width: 100%;
649
+ height: 8px;
650
+ cursor: row-resize;
651
+ flex-shrink: 0;
652
+ border-top: 1px solid var(--fd-border);
653
+ border-bottom: 1px solid var(--fd-border);
654
+ border-left: none;
655
+ border-right: none;
656
+ }
657
+
658
+ /* Horizontal Divider Handle */
659
+ .flowdrop-main-layout__divider-handle--horizontal {
660
+ width: 48px;
661
+ height: 4px;
662
+ }
663
+
664
+ .flowdrop-main-layout__divider--bottom:hover
665
+ .flowdrop-main-layout__divider-handle--horizontal,
666
+ .flowdrop-main-layout__divider--bottom:focus
667
+ .flowdrop-main-layout__divider-handle--horizontal {
668
+ transform: scaleX(1.2);
669
+ }
670
+
671
+ .flowdrop-main-layout__divider--bottom.flowdrop-main-layout__divider--active
672
+ .flowdrop-main-layout__divider-handle--horizontal {
673
+ transform: scaleX(1.4);
674
+ }
675
+
676
+ /* Bottom Panel Styles */
677
+ .flowdrop-main-layout__panel--bottom {
678
+ height: var(--layout-bottom-panel-height);
679
+ min-height: var(--layout-bottom-panel-height);
680
+ max-height: var(--layout-bottom-panel-height);
681
+ width: 100%;
682
+ background-color: var(--fd-background);
683
+ overflow-y: auto;
684
+ overflow-x: hidden;
685
+ display: flex;
686
+ flex-direction: column;
687
+ flex-shrink: 0;
688
+ border-top: 1px solid var(--fd-border);
689
+ box-shadow: 0 -2px 4px rgba(0, 0, 0, 0.05);
690
+
691
+ /* Custom scrollbar styling */
692
+ scrollbar-width: thin;
693
+ scrollbar-color: var(--fd-scrollbar-thumb) var(--fd-scrollbar-track);
694
+ }
695
+
696
+ .flowdrop-main-layout__panel--bottom::-webkit-scrollbar {
697
+ width: 8px;
698
+ }
699
+
700
+ .flowdrop-main-layout__panel--bottom::-webkit-scrollbar-track {
701
+ background: var(--fd-scrollbar-track);
702
+ border-radius: 4px;
703
+ }
704
+
705
+ .flowdrop-main-layout__panel--bottom::-webkit-scrollbar-thumb {
706
+ background: var(--fd-scrollbar-thumb);
707
+ border-radius: 4px;
708
+ }
709
+
710
+ .flowdrop-main-layout__panel--bottom::-webkit-scrollbar-thumb:hover {
711
+ background: var(--fd-scrollbar-thumb-hover);
712
+ }
713
+
714
+ /* Vertical dragging cursor override */
715
+ .flowdrop-main-layout--dragging-vertical {
716
+ cursor: row-resize;
717
+ }
718
+
719
+ /* Footer Section */
720
+ .flowdrop-main-layout__footer {
721
+ height: var(--layout-footer-height);
722
+ min-height: var(--layout-footer-height);
723
+ max-height: var(--layout-footer-height);
724
+ width: 100%;
725
+ background-color: var(--fd-background);
726
+ border-top: 1px solid var(--fd-border);
727
+ display: flex;
728
+ align-items: center;
729
+ z-index: 100;
730
+ box-shadow: 0 -1px 3px rgba(0, 0, 0, 0.05);
731
+ }
732
+
733
+ /* Responsive Adjustments */
734
+ @media (max-width: 768px) {
735
+ .flowdrop-main-layout__sidebar--left,
736
+ .flowdrop-main-layout__sidebar--right {
737
+ position: absolute;
738
+ top: 0;
739
+ bottom: 0;
740
+ z-index: 50;
741
+ }
742
+
743
+ .flowdrop-main-layout__sidebar--left {
744
+ left: 0;
745
+ }
746
+
747
+ .flowdrop-main-layout__sidebar--right {
748
+ right: 0;
749
+ }
750
+ }
718
751
  </style>