@flowdrop/flowdrop 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +252 -0
- package/dist/adapters/WorkflowAdapter.d.ts +167 -0
- package/dist/adapters/WorkflowAdapter.js +368 -0
- package/dist/adapters/agentspec/AgentSpecAdapter.d.ts +96 -0
- package/dist/adapters/agentspec/AgentSpecAdapter.js +626 -0
- package/dist/adapters/agentspec/agentAdapter.d.ts +59 -0
- package/dist/adapters/agentspec/agentAdapter.js +91 -0
- package/dist/adapters/agentspec/autoLayout.d.ts +34 -0
- package/dist/adapters/agentspec/autoLayout.js +127 -0
- package/dist/adapters/agentspec/componentTypeDefaults.d.ts +73 -0
- package/dist/adapters/agentspec/componentTypeDefaults.js +238 -0
- package/dist/adapters/agentspec/defaultNodeTypes.d.ts +53 -0
- package/dist/adapters/agentspec/defaultNodeTypes.js +561 -0
- package/dist/adapters/agentspec/index.d.ts +37 -0
- package/dist/adapters/agentspec/index.js +39 -0
- package/dist/adapters/agentspec/validator.d.ts +34 -0
- package/dist/adapters/agentspec/validator.js +169 -0
- package/dist/api/enhanced-client.d.ts +183 -0
- package/dist/api/enhanced-client.js +430 -0
- package/dist/components/App.svelte +981 -0
- package/dist/components/App.svelte.d.ts +54 -0
- package/dist/components/CanvasBanner.stories.svelte +29 -0
- package/dist/components/CanvasBanner.stories.svelte.d.ts +27 -0
- package/dist/components/CanvasBanner.svelte +57 -0
- package/dist/components/CanvasBanner.svelte.d.ts +8 -0
- package/dist/components/ConfigForm.svelte +1138 -0
- package/dist/components/ConfigForm.svelte.d.ts +44 -0
- package/dist/components/ConfigModal.svelte +188 -0
- package/dist/components/ConfigModal.svelte.d.ts +13 -0
- package/dist/components/ConfigPanel.stories.svelte +47 -0
- package/dist/components/ConfigPanel.stories.svelte.d.ts +27 -0
- package/dist/components/ConfigPanel.svelte +182 -0
- package/dist/components/ConfigPanel.svelte.d.ts +32 -0
- package/dist/components/ConnectionLine.svelte +32 -0
- package/dist/components/ConnectionLine.svelte.d.ts +3 -0
- package/dist/components/EdgeRefresher.svelte +41 -0
- package/dist/components/EdgeRefresher.svelte.d.ts +9 -0
- package/dist/components/FlowDropZone.svelte +83 -0
- package/dist/components/FlowDropZone.svelte.d.ts +13 -0
- package/dist/components/LoadingSpinner.stories.svelte +30 -0
- package/dist/components/LoadingSpinner.stories.svelte.d.ts +27 -0
- package/dist/components/LoadingSpinner.svelte +36 -0
- package/dist/components/LoadingSpinner.svelte.d.ts +8 -0
- package/dist/components/Logo.stories.svelte +22 -0
- package/dist/components/Logo.stories.svelte.d.ts +27 -0
- package/dist/components/Logo.svelte +102 -0
- package/dist/components/Logo.svelte.d.ts +26 -0
- package/dist/components/LogsSidebar.svelte +563 -0
- package/dist/components/LogsSidebar.svelte.d.ts +17 -0
- package/dist/components/MarkdownDisplay.stories.svelte +36 -0
- package/dist/components/MarkdownDisplay.stories.svelte.d.ts +27 -0
- package/dist/components/MarkdownDisplay.svelte +29 -0
- package/dist/components/MarkdownDisplay.svelte.d.ts +7 -0
- package/dist/components/Navbar.stories.svelte +53 -0
- package/dist/components/Navbar.stories.svelte.d.ts +27 -0
- package/dist/components/Navbar.svelte +726 -0
- package/dist/components/Navbar.svelte.d.ts +29 -0
- package/dist/components/NodeSidebar.svelte +762 -0
- package/dist/components/NodeSidebar.svelte.d.ts +9 -0
- package/dist/components/NodeStatusOverlay.stories.svelte +85 -0
- package/dist/components/NodeStatusOverlay.stories.svelte.d.ts +27 -0
- package/dist/components/NodeStatusOverlay.svelte +327 -0
- package/dist/components/NodeStatusOverlay.svelte.d.ts +11 -0
- package/dist/components/PipelineStatus.svelte +314 -0
- package/dist/components/PipelineStatus.svelte.d.ts +20 -0
- package/dist/components/PortCoordinateTracker.svelte +58 -0
- package/dist/components/PortCoordinateTracker.svelte.d.ts +12 -0
- package/dist/components/ReadOnlyDetails.svelte +170 -0
- package/dist/components/ReadOnlyDetails.svelte.d.ts +25 -0
- package/dist/components/SchemaForm.stories.svelte +116 -0
- package/dist/components/SchemaForm.stories.svelte.d.ts +27 -0
- package/dist/components/SchemaForm.svelte +536 -0
- package/dist/components/SchemaForm.svelte.d.ts +83 -0
- package/dist/components/SettingsModal.svelte +279 -0
- package/dist/components/SettingsModal.svelte.d.ts +23 -0
- package/dist/components/SettingsPanel.svelte +638 -0
- package/dist/components/SettingsPanel.svelte.d.ts +21 -0
- package/dist/components/StatusIcon.stories.svelte +60 -0
- package/dist/components/StatusIcon.stories.svelte.d.ts +27 -0
- package/dist/components/StatusIcon.svelte +119 -0
- package/dist/components/StatusIcon.svelte.d.ts +10 -0
- package/dist/components/StatusLabel.stories.svelte +17 -0
- package/dist/components/StatusLabel.stories.svelte.d.ts +27 -0
- package/dist/components/StatusLabel.svelte +33 -0
- package/dist/components/StatusLabel.svelte.d.ts +7 -0
- package/dist/components/ThemeToggle.stories.svelte +25 -0
- package/dist/components/ThemeToggle.stories.svelte.d.ts +27 -0
- package/dist/components/ThemeToggle.svelte +185 -0
- package/dist/components/ThemeToggle.svelte.d.ts +14 -0
- package/dist/components/UniversalNode.svelte +155 -0
- package/dist/components/UniversalNode.svelte.d.ts +15 -0
- package/dist/components/WorkflowEditor.svelte +1035 -0
- package/dist/components/WorkflowEditor.svelte.d.ts +23 -0
- package/dist/components/form/FormArray.svelte +1049 -0
- package/dist/components/form/FormArray.svelte.d.ts +22 -0
- package/dist/components/form/FormAutocomplete.svelte +1009 -0
- package/dist/components/form/FormAutocomplete.svelte.d.ts +25 -0
- package/dist/components/form/FormCheckboxGroup.stories.svelte +28 -0
- package/dist/components/form/FormCheckboxGroup.stories.svelte.d.ts +27 -0
- package/dist/components/form/FormCheckboxGroup.svelte +155 -0
- package/dist/components/form/FormCheckboxGroup.svelte.d.ts +17 -0
- package/dist/components/form/FormCodeEditor.svelte +458 -0
- package/dist/components/form/FormCodeEditor.svelte.d.ts +25 -0
- package/dist/components/form/FormField.svelte +417 -0
- package/dist/components/form/FormField.svelte.d.ts +29 -0
- package/dist/components/form/FormFieldLight.svelte +425 -0
- package/dist/components/form/FormFieldLight.svelte.d.ts +18 -0
- package/dist/components/form/FormFieldWrapper.stories.svelte +53 -0
- package/dist/components/form/FormFieldWrapper.stories.svelte.d.ts +27 -0
- package/dist/components/form/FormFieldWrapper.svelte +125 -0
- package/dist/components/form/FormFieldWrapper.svelte.d.ts +18 -0
- package/dist/components/form/FormFieldset.svelte +142 -0
- package/dist/components/form/FormFieldset.svelte.d.ts +11 -0
- package/dist/components/form/FormMarkdownEditor.svelte +752 -0
- package/dist/components/form/FormMarkdownEditor.svelte.d.ts +33 -0
- package/dist/components/form/FormNumberField.stories.svelte +36 -0
- package/dist/components/form/FormNumberField.stories.svelte.d.ts +27 -0
- package/dist/components/form/FormNumberField.svelte +112 -0
- package/dist/components/form/FormNumberField.svelte.d.ts +25 -0
- package/dist/components/form/FormRangeField.stories.svelte +31 -0
- package/dist/components/form/FormRangeField.stories.svelte.d.ts +27 -0
- package/dist/components/form/FormRangeField.svelte +246 -0
- package/dist/components/form/FormRangeField.svelte.d.ts +23 -0
- package/dist/components/form/FormSelect.stories.svelte +50 -0
- package/dist/components/form/FormSelect.stories.svelte.d.ts +27 -0
- package/dist/components/form/FormSelect.svelte +129 -0
- package/dist/components/form/FormSelect.svelte.d.ts +20 -0
- package/dist/components/form/FormTemplateEditor.svelte +825 -0
- package/dist/components/form/FormTemplateEditor.svelte.d.ts +41 -0
- package/dist/components/form/FormTextField.stories.svelte +30 -0
- package/dist/components/form/FormTextField.stories.svelte.d.ts +27 -0
- package/dist/components/form/FormTextField.svelte +91 -0
- package/dist/components/form/FormTextField.svelte.d.ts +19 -0
- package/dist/components/form/FormTextarea.stories.svelte +34 -0
- package/dist/components/form/FormTextarea.stories.svelte.d.ts +27 -0
- package/dist/components/form/FormTextarea.svelte +97 -0
- package/dist/components/form/FormTextarea.svelte.d.ts +21 -0
- package/dist/components/form/FormToggle.stories.svelte +30 -0
- package/dist/components/form/FormToggle.stories.svelte.d.ts +27 -0
- package/dist/components/form/FormToggle.svelte +126 -0
- package/dist/components/form/FormToggle.svelte.d.ts +19 -0
- package/dist/components/form/FormUISchemaRenderer.svelte +136 -0
- package/dist/components/form/FormUISchemaRenderer.svelte.d.ts +32 -0
- package/dist/components/form/index.d.ts +50 -0
- package/dist/components/form/index.js +54 -0
- package/dist/components/form/templateAutocomplete.d.ts +29 -0
- package/dist/components/form/templateAutocomplete.js +254 -0
- package/dist/components/form/types.d.ts +485 -0
- package/dist/components/form/types.js +73 -0
- package/dist/components/interrupt/ChoicePrompt.stories.svelte +52 -0
- package/dist/components/interrupt/ChoicePrompt.stories.svelte.d.ts +27 -0
- package/dist/components/interrupt/ChoicePrompt.svelte +401 -0
- package/dist/components/interrupt/ChoicePrompt.svelte.d.ts +23 -0
- package/dist/components/interrupt/ConfirmationPrompt.stories.svelte +71 -0
- package/dist/components/interrupt/ConfirmationPrompt.stories.svelte.d.ts +27 -0
- package/dist/components/interrupt/ConfirmationPrompt.svelte +292 -0
- package/dist/components/interrupt/ConfirmationPrompt.svelte.d.ts +25 -0
- package/dist/components/interrupt/FormPrompt.svelte +236 -0
- package/dist/components/interrupt/FormPrompt.svelte.d.ts +23 -0
- package/dist/components/interrupt/InterruptBubble.svelte +601 -0
- package/dist/components/interrupt/InterruptBubble.svelte.d.ts +16 -0
- package/dist/components/interrupt/ReviewPrompt.stories.svelte +67 -0
- package/dist/components/interrupt/ReviewPrompt.stories.svelte.d.ts +27 -0
- package/dist/components/interrupt/ReviewPrompt.svelte +861 -0
- package/dist/components/interrupt/ReviewPrompt.svelte.d.ts +23 -0
- package/dist/components/interrupt/TextInputPrompt.stories.svelte +47 -0
- package/dist/components/interrupt/TextInputPrompt.stories.svelte.d.ts +27 -0
- package/dist/components/interrupt/TextInputPrompt.svelte +346 -0
- package/dist/components/interrupt/TextInputPrompt.svelte.d.ts +23 -0
- package/dist/components/interrupt/index.d.ts +13 -0
- package/dist/components/interrupt/index.js +15 -0
- package/dist/components/layouts/MainLayout.svelte +718 -0
- package/dist/components/layouts/MainLayout.svelte.d.ts +62 -0
- package/dist/components/nodes/GatewayNode.stories.svelte +108 -0
- package/dist/components/nodes/GatewayNode.stories.svelte.d.ts +26 -0
- package/dist/components/nodes/GatewayNode.svelte +591 -0
- package/dist/components/nodes/GatewayNode.svelte.d.ts +15 -0
- package/dist/components/nodes/IdeaNode.stories.svelte +52 -0
- package/dist/components/nodes/IdeaNode.stories.svelte.d.ts +26 -0
- package/dist/components/nodes/IdeaNode.svelte +455 -0
- package/dist/components/nodes/IdeaNode.svelte.d.ts +24 -0
- package/dist/components/nodes/NotesNode.stories.svelte +76 -0
- package/dist/components/nodes/NotesNode.stories.svelte.d.ts +26 -0
- package/dist/components/nodes/NotesNode.svelte +378 -0
- package/dist/components/nodes/NotesNode.svelte.d.ts +24 -0
- package/dist/components/nodes/SimpleNode.stories.svelte +159 -0
- package/dist/components/nodes/SimpleNode.stories.svelte.d.ts +26 -0
- package/dist/components/nodes/SimpleNode.svelte +451 -0
- package/dist/components/nodes/SimpleNode.svelte.d.ts +25 -0
- package/dist/components/nodes/SquareNode.stories.svelte +82 -0
- package/dist/components/nodes/SquareNode.stories.svelte.d.ts +26 -0
- package/dist/components/nodes/SquareNode.svelte +407 -0
- package/dist/components/nodes/SquareNode.svelte.d.ts +25 -0
- package/dist/components/nodes/TerminalNode.stories.svelte +25 -0
- package/dist/components/nodes/TerminalNode.stories.svelte.d.ts +26 -0
- package/dist/components/nodes/TerminalNode.svelte +690 -0
- package/dist/components/nodes/TerminalNode.svelte.d.ts +25 -0
- package/dist/components/nodes/ToolNode.stories.svelte +189 -0
- package/dist/components/nodes/ToolNode.stories.svelte.d.ts +26 -0
- package/dist/components/nodes/ToolNode.svelte +471 -0
- package/dist/components/nodes/ToolNode.svelte.d.ts +36 -0
- package/dist/components/nodes/WorkflowNode.stories.svelte +55 -0
- package/dist/components/nodes/WorkflowNode.stories.svelte.d.ts +26 -0
- package/dist/components/nodes/WorkflowNode.svelte +571 -0
- package/dist/components/nodes/WorkflowNode.svelte.d.ts +15 -0
- package/dist/components/playground/ChatPanel.svelte +905 -0
- package/dist/components/playground/ChatPanel.svelte.d.ts +46 -0
- package/dist/components/playground/ExecutionLogs.svelte +488 -0
- package/dist/components/playground/ExecutionLogs.svelte.d.ts +14 -0
- package/dist/components/playground/InputCollector.svelte +444 -0
- package/dist/components/playground/InputCollector.svelte.d.ts +16 -0
- package/dist/components/playground/MessageBubble.stories.svelte +62 -0
- package/dist/components/playground/MessageBubble.stories.svelte.d.ts +27 -0
- package/dist/components/playground/MessageBubble.svelte +633 -0
- package/dist/components/playground/MessageBubble.svelte.d.ts +24 -0
- package/dist/components/playground/Playground.svelte +1075 -0
- package/dist/components/playground/Playground.svelte.d.ts +25 -0
- package/dist/components/playground/PlaygroundModal.svelte +220 -0
- package/dist/components/playground/PlaygroundModal.svelte.d.ts +25 -0
- package/dist/components/playground/SessionManager.svelte +538 -0
- package/dist/components/playground/SessionManager.svelte.d.ts +20 -0
- package/dist/config/agentSpecEndpoints.d.ts +70 -0
- package/dist/config/agentSpecEndpoints.js +65 -0
- package/dist/config/constants.d.ts +43 -0
- package/dist/config/constants.js +31 -0
- package/dist/config/defaultCategories.d.ts +7 -0
- package/dist/config/defaultCategories.js +126 -0
- package/dist/config/defaultPortConfig.d.ts +6 -0
- package/dist/config/defaultPortConfig.js +201 -0
- package/dist/config/endpoints.d.ts +160 -0
- package/dist/config/endpoints.js +146 -0
- package/dist/config/runtimeConfig.d.ts +47 -0
- package/dist/config/runtimeConfig.js +80 -0
- package/dist/core/index.d.ts +75 -0
- package/dist/core/index.js +92 -0
- package/dist/display/index.d.ts +29 -0
- package/dist/display/index.js +36 -0
- package/dist/editor/index.d.ts +95 -0
- package/dist/editor/index.js +138 -0
- package/dist/form/code.d.ts +101 -0
- package/dist/form/code.js +168 -0
- package/dist/form/fieldRegistry.d.ts +169 -0
- package/dist/form/fieldRegistry.js +152 -0
- package/dist/form/full.d.ts +56 -0
- package/dist/form/full.js +80 -0
- package/dist/form/index.d.ts +77 -0
- package/dist/form/index.js +91 -0
- package/dist/form/markdown.d.ts +69 -0
- package/dist/form/markdown.js +103 -0
- package/dist/helpers/nodeLayoutHelper.d.ts +14 -0
- package/dist/helpers/nodeLayoutHelper.js +19 -0
- package/dist/helpers/proximityConnect.d.ts +94 -0
- package/dist/helpers/proximityConnect.js +314 -0
- package/dist/helpers/workflowEditorHelper.d.ts +183 -0
- package/dist/helpers/workflowEditorHelper.js +595 -0
- package/dist/index.d.ts +37 -0
- package/dist/index.js +64 -0
- package/dist/mocks/app-environment.d.ts +8 -0
- package/dist/mocks/app-environment.js +16 -0
- package/dist/mocks/app-forms.d.ts +2 -0
- package/dist/mocks/app-forms.js +22 -0
- package/dist/mocks/app-navigation.d.ts +5 -0
- package/dist/mocks/app-navigation.js +36 -0
- package/dist/mocks/app-stores.d.ts +14 -0
- package/dist/mocks/app-stores.js +26 -0
- package/dist/playground/index.d.ts +131 -0
- package/dist/playground/index.js +172 -0
- package/dist/playground/mount.d.ts +203 -0
- package/dist/playground/mount.js +235 -0
- package/dist/registry/BaseRegistry.d.ts +92 -0
- package/dist/registry/BaseRegistry.js +124 -0
- package/dist/registry/builtinFormats.d.ts +23 -0
- package/dist/registry/builtinFormats.js +70 -0
- package/dist/registry/builtinNodes.d.ts +77 -0
- package/dist/registry/builtinNodes.js +211 -0
- package/dist/registry/index.d.ts +8 -0
- package/dist/registry/index.js +12 -0
- package/dist/registry/nodeComponentRegistry.d.ts +276 -0
- package/dist/registry/nodeComponentRegistry.js +262 -0
- package/dist/registry/plugin.d.ts +215 -0
- package/dist/registry/plugin.js +249 -0
- package/dist/registry/workflowFormatRegistry.d.ts +122 -0
- package/dist/registry/workflowFormatRegistry.js +96 -0
- package/dist/schema/index.d.ts +23 -0
- package/dist/schema/index.js +23 -0
- package/dist/schemas/v1/workflow.schema.json +1078 -0
- package/dist/services/agentSpecExecutionService.d.ts +106 -0
- package/dist/services/agentSpecExecutionService.js +334 -0
- package/dist/services/api.d.ts +115 -0
- package/dist/services/api.js +214 -0
- package/dist/services/apiVariableService.d.ts +114 -0
- package/dist/services/apiVariableService.js +338 -0
- package/dist/services/autoSaveService.d.ts +112 -0
- package/dist/services/autoSaveService.js +227 -0
- package/dist/services/categoriesApi.d.ts +14 -0
- package/dist/services/categoriesApi.js +49 -0
- package/dist/services/draftStorage.d.ts +171 -0
- package/dist/services/draftStorage.js +299 -0
- package/dist/services/dynamicSchemaService.d.ts +108 -0
- package/dist/services/dynamicSchemaService.js +444 -0
- package/dist/services/globalSave.d.ts +69 -0
- package/dist/services/globalSave.js +248 -0
- package/dist/services/historyService.d.ts +208 -0
- package/dist/services/historyService.js +321 -0
- package/dist/services/interruptService.d.ts +133 -0
- package/dist/services/interruptService.js +280 -0
- package/dist/services/nodeExecutionService.d.ts +63 -0
- package/dist/services/nodeExecutionService.js +266 -0
- package/dist/services/playgroundService.d.ts +130 -0
- package/dist/services/playgroundService.js +321 -0
- package/dist/services/portConfigApi.d.ts +14 -0
- package/dist/services/portConfigApi.js +54 -0
- package/dist/services/settingsService.d.ts +92 -0
- package/dist/services/settingsService.js +196 -0
- package/dist/services/toastService.d.ts +156 -0
- package/dist/services/toastService.js +265 -0
- package/dist/services/variableService.d.ts +141 -0
- package/dist/services/variableService.js +463 -0
- package/dist/services/workflowStorage.d.ts +37 -0
- package/dist/services/workflowStorage.js +116 -0
- package/dist/settings/index.d.ts +25 -0
- package/dist/settings/index.js +33 -0
- package/dist/stores/categoriesStore.svelte.d.ts +32 -0
- package/dist/stores/categoriesStore.svelte.js +77 -0
- package/dist/stores/editorStateMachine.svelte.d.ts +42 -0
- package/dist/stores/editorStateMachine.svelte.js +132 -0
- package/dist/stores/historyStore.svelte.d.ts +136 -0
- package/dist/stores/historyStore.svelte.js +207 -0
- package/dist/stores/interruptStore.svelte.d.ts +179 -0
- package/dist/stores/interruptStore.svelte.js +346 -0
- package/dist/stores/playgroundStore.svelte.d.ts +230 -0
- package/dist/stores/playgroundStore.svelte.js +515 -0
- package/dist/stores/portCoordinateStore.svelte.d.ts +66 -0
- package/dist/stores/portCoordinateStore.svelte.js +186 -0
- package/dist/stores/settingsStore.svelte.d.ts +158 -0
- package/dist/stores/settingsStore.svelte.js +544 -0
- package/dist/stores/workflowStore.svelte.d.ts +260 -0
- package/dist/stores/workflowStore.svelte.js +649 -0
- package/dist/stories/CanvasDecorator.svelte +49 -0
- package/dist/stories/CanvasDecorator.svelte.d.ts +8 -0
- package/dist/stories/NodeDecorator.svelte +73 -0
- package/dist/stories/NodeDecorator.svelte.d.ts +8 -0
- package/dist/stories/utils.d.ts +93 -0
- package/dist/stories/utils.js +122 -0
- package/dist/styles/base.css +1300 -0
- package/dist/styles/toast.css +35 -0
- package/dist/styles/tokens.css +475 -0
- package/dist/svelte-app.d.ts +150 -0
- package/dist/svelte-app.js +295 -0
- package/dist/types/agentspec.d.ts +318 -0
- package/dist/types/agentspec.js +48 -0
- package/dist/types/auth.d.ts +263 -0
- package/dist/types/auth.js +229 -0
- package/dist/types/config.d.ts +151 -0
- package/dist/types/config.js +7 -0
- package/dist/types/events.d.ts +190 -0
- package/dist/types/events.js +30 -0
- package/dist/types/index.d.ts +1234 -0
- package/dist/types/index.js +27 -0
- package/dist/types/interrupt.d.ts +390 -0
- package/dist/types/interrupt.js +145 -0
- package/dist/types/interruptState.d.ts +211 -0
- package/dist/types/interruptState.js +308 -0
- package/dist/types/playground.d.ts +351 -0
- package/dist/types/playground.js +95 -0
- package/dist/types/settings.d.ts +189 -0
- package/dist/types/settings.js +97 -0
- package/dist/types/uischema.d.ts +144 -0
- package/dist/types/uischema.js +51 -0
- package/dist/utils/colors.d.ts +288 -0
- package/dist/utils/colors.js +548 -0
- package/dist/utils/config.d.ts +37 -0
- package/dist/utils/config.js +226 -0
- package/dist/utils/connections.d.ts +125 -0
- package/dist/utils/connections.js +414 -0
- package/dist/utils/errors.d.ts +28 -0
- package/dist/utils/errors.js +44 -0
- package/dist/utils/fetchWithAuth.d.ts +25 -0
- package/dist/utils/fetchWithAuth.js +34 -0
- package/dist/utils/handleIds.d.ts +35 -0
- package/dist/utils/handleIds.js +58 -0
- package/dist/utils/handlePositioning.d.ts +31 -0
- package/dist/utils/handlePositioning.js +35 -0
- package/dist/utils/icons.d.ts +106 -0
- package/dist/utils/icons.js +157 -0
- package/dist/utils/logger.d.ts +47 -0
- package/dist/utils/logger.js +72 -0
- package/dist/utils/nodeStatus.d.ts +53 -0
- package/dist/utils/nodeStatus.js +183 -0
- package/dist/utils/nodeTypes.d.ts +117 -0
- package/dist/utils/nodeTypes.js +244 -0
- package/dist/utils/nodeWrapper.d.ts +39 -0
- package/dist/utils/nodeWrapper.js +62 -0
- package/dist/utils/performanceUtils.d.ts +30 -0
- package/dist/utils/performanceUtils.js +108 -0
- package/dist/utils/sanitize.d.ts +19 -0
- package/dist/utils/sanitize.js +31 -0
- package/dist/utils/uischema.d.ts +52 -0
- package/dist/utils/uischema.js +88 -0
- package/dist/utils/validation.d.ts +29 -0
- package/dist/utils/validation.js +39 -0
- package/package.json +292 -0
|
@@ -0,0 +1,762 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
Node Sidebar Component
|
|
3
|
+
Displays available node types organized by category with accordion-style groups
|
|
4
|
+
Styled with BEM syntax
|
|
5
|
+
-->
|
|
6
|
+
|
|
7
|
+
<script lang="ts">
|
|
8
|
+
import type { NodeMetadata, NodeCategory, WorkflowFormat } from '../types/index.js';
|
|
9
|
+
import LoadingSpinner from './LoadingSpinner.svelte';
|
|
10
|
+
import Icon from '@iconify/svelte';
|
|
11
|
+
import { getNodeIcon, getCategoryIcon } from '../utils/icons.js';
|
|
12
|
+
import { getCategoryColorToken } from '../utils/colors.js';
|
|
13
|
+
import { getCategoryLabel } from '../stores/categoriesStore.svelte.js';
|
|
14
|
+
import { SvelteSet } from 'svelte/reactivity';
|
|
15
|
+
import { getUiSettings, updateSettings } from '../stores/settingsStore.svelte.js';
|
|
16
|
+
|
|
17
|
+
interface Props {
|
|
18
|
+
nodes: NodeMetadata[];
|
|
19
|
+
selectedCategory?: NodeCategory;
|
|
20
|
+
activeFormat?: WorkflowFormat;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
let props: Props = $props();
|
|
24
|
+
let searchInput = $state('');
|
|
25
|
+
// svelte-ignore state_referenced_locally — initial default, user selects interactively
|
|
26
|
+
let selectedCategory = $state(props.selectedCategory || 'all');
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Toggle the sidebar collapsed state
|
|
30
|
+
* Persists the new state to settings
|
|
31
|
+
*/
|
|
32
|
+
function toggleSidebar(): void {
|
|
33
|
+
updateSettings({ ui: { sidebarCollapsed: !getUiSettings().sidebarCollapsed } });
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Check if a node is compatible with the active workflow format.
|
|
38
|
+
* Nodes without formats are universal (compatible with all formats).
|
|
39
|
+
*/
|
|
40
|
+
function isNodeCompatibleWithFormat(node: NodeMetadata): boolean {
|
|
41
|
+
if (!props.activeFormat) return true;
|
|
42
|
+
if (!node.formats || node.formats.length === 0) return true;
|
|
43
|
+
return node.formats.includes(props.activeFormat);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/** Nodes filtered by format compatibility */
|
|
47
|
+
let formatCompatibleNodes = $derived((props.nodes || []).filter(isNodeCompatibleWithFormat));
|
|
48
|
+
|
|
49
|
+
let filteredNodes = $derived(getFilteredNodes());
|
|
50
|
+
let categories = $derived(getCategories());
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Get all unique categories from node types, preserving API order
|
|
54
|
+
* Categories appear in the order their first node appears in the API response
|
|
55
|
+
*/
|
|
56
|
+
function getCategories(): NodeCategory[] {
|
|
57
|
+
if (formatCompatibleNodes.length === 0) return [];
|
|
58
|
+
// Use a Set to track uniqueness while preserving insertion order
|
|
59
|
+
const seen = new SvelteSet<NodeCategory>();
|
|
60
|
+
const orderedCategories: NodeCategory[] = [];
|
|
61
|
+
for (const node of formatCompatibleNodes) {
|
|
62
|
+
if (!seen.has(node.category)) {
|
|
63
|
+
seen.add(node.category);
|
|
64
|
+
orderedCategories.push(node.category);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return orderedCategories;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Filter node types based on search query and selected category
|
|
72
|
+
* Preserves the API order - no client-side sorting applied
|
|
73
|
+
*/
|
|
74
|
+
function getFilteredNodes(): NodeMetadata[] {
|
|
75
|
+
// Start with format-compatible nodes
|
|
76
|
+
let filtered = formatCompatibleNodes;
|
|
77
|
+
|
|
78
|
+
// Filter by category
|
|
79
|
+
if (selectedCategory !== 'all') {
|
|
80
|
+
filtered = filtered.filter((node) => node.category === selectedCategory);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// Filter by search query
|
|
84
|
+
if (searchInput.trim()) {
|
|
85
|
+
const query = searchInput.toLowerCase();
|
|
86
|
+
filtered = filtered.filter(
|
|
87
|
+
(node) =>
|
|
88
|
+
node.name.toLowerCase().includes(query) ||
|
|
89
|
+
node.description.toLowerCase().includes(query) ||
|
|
90
|
+
node.tags?.some((tag) => tag.toLowerCase().includes(query))
|
|
91
|
+
);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// Return filtered results preserving API order
|
|
95
|
+
return filtered;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Handle node type drag start - creates a new node instance
|
|
100
|
+
*/
|
|
101
|
+
function handleNodeDragStart(event: DragEvent, nodeType: NodeMetadata): void {
|
|
102
|
+
if (!event.dataTransfer) return;
|
|
103
|
+
|
|
104
|
+
// Extract initial config from configSchema with proper null checks
|
|
105
|
+
let initialConfig: Record<string, unknown> = {};
|
|
106
|
+
if (
|
|
107
|
+
nodeType.configSchema &&
|
|
108
|
+
typeof nodeType.configSchema === 'object' &&
|
|
109
|
+
nodeType.configSchema.properties &&
|
|
110
|
+
typeof nodeType.configSchema.properties === 'object'
|
|
111
|
+
) {
|
|
112
|
+
// JSON Schema format - extract defaults
|
|
113
|
+
Object.entries(nodeType.configSchema.properties).forEach(([key, prop]) => {
|
|
114
|
+
if (prop && typeof prop === 'object' && 'default' in prop) {
|
|
115
|
+
initialConfig[key] = prop.default;
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// Create a new node instance from the node type
|
|
121
|
+
const newNodeData = {
|
|
122
|
+
type: 'node',
|
|
123
|
+
nodeType: nodeType.id,
|
|
124
|
+
nodeData: {
|
|
125
|
+
label: nodeType.name,
|
|
126
|
+
config: initialConfig,
|
|
127
|
+
metadata: nodeType
|
|
128
|
+
}
|
|
129
|
+
};
|
|
130
|
+
|
|
131
|
+
const jsonData = JSON.stringify(newNodeData);
|
|
132
|
+
|
|
133
|
+
// Set the data that SvelteFlow will receive
|
|
134
|
+
event.dataTransfer.setData('application/json', jsonData);
|
|
135
|
+
event.dataTransfer.setData('text/plain', nodeType.name);
|
|
136
|
+
event.dataTransfer.effectAllowed = 'copy';
|
|
137
|
+
|
|
138
|
+
// Set drag image
|
|
139
|
+
if (event.target) {
|
|
140
|
+
const rect = (event.target as HTMLElement).getBoundingClientRect();
|
|
141
|
+
event.dataTransfer.setDragImage(event.target as HTMLElement, rect.width / 2, rect.height / 2);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Handle search input change
|
|
147
|
+
*/
|
|
148
|
+
function handleSearchChange(): void {
|
|
149
|
+
// Search is handled reactively through the derived filteredNodes
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Handle node click
|
|
154
|
+
*/
|
|
155
|
+
function handleNodeClick(nodeType: NodeMetadata): void {
|
|
156
|
+
// Handle node click - could be used for preview or configuration
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* Get category display name from the categories store.
|
|
161
|
+
* Falls back to auto-capitalizing the category machine name.
|
|
162
|
+
*/
|
|
163
|
+
function getCategoryDisplayName(category: NodeCategory): string {
|
|
164
|
+
return getCategoryLabel(category);
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* Get node types for category
|
|
169
|
+
* Preserves the API order - no client-side sorting applied
|
|
170
|
+
*/
|
|
171
|
+
function getNodesForCategory(category: NodeCategory): NodeMetadata[] {
|
|
172
|
+
return formatCompatibleNodes.filter((node) => node.category === category);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* Get filtered nodes for category
|
|
177
|
+
*/
|
|
178
|
+
function getFilteredNodesForCategory(category: NodeCategory): NodeMetadata[] {
|
|
179
|
+
let nodes = getNodesForCategory(category);
|
|
180
|
+
|
|
181
|
+
// Filter by search query
|
|
182
|
+
if (searchInput.trim()) {
|
|
183
|
+
const query = searchInput.toLowerCase();
|
|
184
|
+
nodes = nodes.filter(
|
|
185
|
+
(node) =>
|
|
186
|
+
node.name.toLowerCase().includes(query) ||
|
|
187
|
+
node.description.toLowerCase().includes(query) ||
|
|
188
|
+
node.tags?.some((tag) => tag.toLowerCase().includes(query))
|
|
189
|
+
);
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
return nodes;
|
|
193
|
+
}
|
|
194
|
+
</script>
|
|
195
|
+
|
|
196
|
+
<!-- Components Sidebar - Always Visible -->
|
|
197
|
+
<aside
|
|
198
|
+
class="flowdrop-sidebar flowdrop-sidebar--container"
|
|
199
|
+
class:flowdrop-sidebar--collapsed={getUiSettings().sidebarCollapsed}
|
|
200
|
+
class:flowdrop-sidebar--compact={getUiSettings().compactMode}
|
|
201
|
+
style:width="{getUiSettings().sidebarCollapsed ? 48 : getUiSettings().sidebarWidth}px"
|
|
202
|
+
aria-label="Components sidebar"
|
|
203
|
+
>
|
|
204
|
+
<!-- Header -->
|
|
205
|
+
<div class="flowdrop-sidebar__header">
|
|
206
|
+
<button
|
|
207
|
+
class="flowdrop-sidebar__toggle"
|
|
208
|
+
onclick={toggleSidebar}
|
|
209
|
+
aria-label={getUiSettings().sidebarCollapsed ? 'Expand sidebar' : 'Collapse sidebar'}
|
|
210
|
+
title={getUiSettings().sidebarCollapsed ? 'Expand sidebar' : 'Collapse sidebar'}
|
|
211
|
+
>
|
|
212
|
+
<Icon icon={getUiSettings().sidebarCollapsed ? 'mdi:chevron-right' : 'mdi:chevron-left'} />
|
|
213
|
+
</button>
|
|
214
|
+
{#if !getUiSettings().sidebarCollapsed}
|
|
215
|
+
<div class="flowdrop-sidebar__title">
|
|
216
|
+
<h2 class="flowdrop-text--lg flowdrop-font--bold">Components</h2>
|
|
217
|
+
</div>
|
|
218
|
+
{/if}
|
|
219
|
+
</div>
|
|
220
|
+
|
|
221
|
+
{#if !getUiSettings().sidebarCollapsed}
|
|
222
|
+
<!-- Search Section -->
|
|
223
|
+
<div class="flowdrop-sidebar__search">
|
|
224
|
+
<div class="flowdrop-join flowdrop-w--full">
|
|
225
|
+
<div class="flowdrop-join__item flowdrop-flex--1">
|
|
226
|
+
<input
|
|
227
|
+
type="text"
|
|
228
|
+
placeholder="Search components..."
|
|
229
|
+
class="flowdrop-input flowdrop-join__item flowdrop-w--full"
|
|
230
|
+
bind:value={searchInput}
|
|
231
|
+
oninput={handleSearchChange}
|
|
232
|
+
/>
|
|
233
|
+
</div>
|
|
234
|
+
<button class="flowdrop-btn flowdrop-join__item" aria-label="Search components">
|
|
235
|
+
<Icon icon="mdi:magnify" class="flowdrop-icon" />
|
|
236
|
+
</button>
|
|
237
|
+
</div>
|
|
238
|
+
</div>
|
|
239
|
+
|
|
240
|
+
<!-- Node Types List -->
|
|
241
|
+
<div class="flowdrop-sidebar__content">
|
|
242
|
+
{#if props.nodes?.length === 0}
|
|
243
|
+
<!-- No node types available -->
|
|
244
|
+
<div class="flowdrop-hero">
|
|
245
|
+
<div class="flowdrop-hero__content">
|
|
246
|
+
<div class="flowdrop-hero__icon">📦</div>
|
|
247
|
+
<h3 class="flowdrop-hero__title">No node types available</h3>
|
|
248
|
+
<p class="flowdrop-hero__description">Node type definitions will appear here</p>
|
|
249
|
+
<div class="flowdrop-mb--4">
|
|
250
|
+
<LoadingSpinner size="md" text="Loading from server..." />
|
|
251
|
+
</div>
|
|
252
|
+
</div>
|
|
253
|
+
</div>
|
|
254
|
+
{:else if searchInput.trim()}
|
|
255
|
+
<!-- Search Results -->
|
|
256
|
+
<div class="flowdrop-p--4">
|
|
257
|
+
<div class="flowdrop-divider">
|
|
258
|
+
<h3 class="flowdrop-divider__text">Search Results</h3>
|
|
259
|
+
</div>
|
|
260
|
+
{#if filteredNodes.length === 0}
|
|
261
|
+
<div class="flowdrop-hero">
|
|
262
|
+
<div class="flowdrop-hero__content">
|
|
263
|
+
<div class="flowdrop-hero__icon">🔍</div>
|
|
264
|
+
<h3 class="flowdrop-hero__title">No components found</h3>
|
|
265
|
+
<p class="flowdrop-hero__description">Try adjusting your search</p>
|
|
266
|
+
{#if props.nodes?.length === 0}
|
|
267
|
+
<div class="flowdrop-mb--4">
|
|
268
|
+
<LoadingSpinner size="sm" text="Loading components..." />
|
|
269
|
+
</div>
|
|
270
|
+
{/if}
|
|
271
|
+
</div>
|
|
272
|
+
</div>
|
|
273
|
+
{:else}
|
|
274
|
+
<div class="flowdrop-node-list">
|
|
275
|
+
{#each filteredNodes as nodeType (nodeType.id)}
|
|
276
|
+
<div
|
|
277
|
+
class="flowdrop-card flowdrop-card--compact flowdrop-node-item"
|
|
278
|
+
draggable="true"
|
|
279
|
+
ondragstart={(e) => handleNodeDragStart(e, nodeType)}
|
|
280
|
+
role="button"
|
|
281
|
+
tabindex="0"
|
|
282
|
+
>
|
|
283
|
+
<div class="flowdrop-card__body flowdrop-p--1 flowdrop-py--1">
|
|
284
|
+
<div class="flowdrop-flex flowdrop-gap--2 flowdrop-items--center">
|
|
285
|
+
<!-- Node Type Icon with Squircle Background -->
|
|
286
|
+
<span
|
|
287
|
+
class="flowdrop-node-icon"
|
|
288
|
+
style="--_icon-color: {getCategoryColorToken(nodeType.category)}"
|
|
289
|
+
>
|
|
290
|
+
<Icon icon={getNodeIcon(nodeType.icon, nodeType.category)} />
|
|
291
|
+
</span>
|
|
292
|
+
|
|
293
|
+
<!-- Node Type Info - Icon and Title only -->
|
|
294
|
+
<h4
|
|
295
|
+
class="flowdrop-text--sm flowdrop-font--medium flowdrop-truncate flowdrop-flex--1"
|
|
296
|
+
>
|
|
297
|
+
{nodeType.name}
|
|
298
|
+
</h4>
|
|
299
|
+
</div>
|
|
300
|
+
<p
|
|
301
|
+
class="flowdrop-text--xs flowdrop-text--gray flowdrop-truncate flowdrop-mt--1 flowdrop-ml--0"
|
|
302
|
+
>
|
|
303
|
+
{nodeType.description}
|
|
304
|
+
</p>
|
|
305
|
+
</div>
|
|
306
|
+
</div>
|
|
307
|
+
{/each}
|
|
308
|
+
</div>
|
|
309
|
+
{/if}
|
|
310
|
+
</div>
|
|
311
|
+
{:else}
|
|
312
|
+
<!-- Show categories with details when no search is active -->
|
|
313
|
+
<div class="flowdrop-p--4">
|
|
314
|
+
<!-- Category-specific details -->
|
|
315
|
+
<div class="flowdrop-category-list">
|
|
316
|
+
{#each categories as category (category)}
|
|
317
|
+
{@const categoryNodes = getFilteredNodesForCategory(category)}
|
|
318
|
+
{#if categoryNodes.length > 0}
|
|
319
|
+
<details class="flowdrop-details">
|
|
320
|
+
<summary class="flowdrop-details__summary">
|
|
321
|
+
<div class="flowdrop-flex flowdrop-gap--2 flowdrop-items--center">
|
|
322
|
+
<span
|
|
323
|
+
class="flowdrop-node-icon"
|
|
324
|
+
style="--_icon-color: {getCategoryColorToken(category)}"
|
|
325
|
+
>
|
|
326
|
+
<Icon icon={getCategoryIcon(category)} />
|
|
327
|
+
</span>
|
|
328
|
+
<span>{getCategoryDisplayName(category)}</span>
|
|
329
|
+
</div>
|
|
330
|
+
<div class="flowdrop-badge flowdrop-badge--secondary">
|
|
331
|
+
{categoryNodes.length}
|
|
332
|
+
</div>
|
|
333
|
+
</summary>
|
|
334
|
+
<div class="flowdrop-details__content">
|
|
335
|
+
<div class="flowdrop-node-list">
|
|
336
|
+
{#each categoryNodes as nodeType (nodeType.id)}
|
|
337
|
+
<div
|
|
338
|
+
class="flowdrop-card flowdrop-card--compact flowdrop-node-item"
|
|
339
|
+
draggable="true"
|
|
340
|
+
ondragstart={(e) => handleNodeDragStart(e, nodeType)}
|
|
341
|
+
onclick={() => handleNodeClick(nodeType)}
|
|
342
|
+
role="button"
|
|
343
|
+
tabindex="0"
|
|
344
|
+
onkeydown={(e) => {
|
|
345
|
+
if (e.key === 'Enter' || e.key === ' ') {
|
|
346
|
+
e.preventDefault();
|
|
347
|
+
handleNodeClick(nodeType);
|
|
348
|
+
}
|
|
349
|
+
}}
|
|
350
|
+
>
|
|
351
|
+
<div class="flowdrop-card__body flowdrop-p--1 flowdrop-py--1">
|
|
352
|
+
<div class="flowdrop-flex flowdrop-gap--2 flowdrop-items--center">
|
|
353
|
+
<!-- Node Type Icon with Squircle Background -->
|
|
354
|
+
<span
|
|
355
|
+
class="flowdrop-node-icon"
|
|
356
|
+
style="--_icon-color: {getCategoryColorToken(nodeType.category)}"
|
|
357
|
+
>
|
|
358
|
+
<Icon icon={getNodeIcon(nodeType.icon, nodeType.category)} />
|
|
359
|
+
</span>
|
|
360
|
+
|
|
361
|
+
<!-- Node Type Info - Icon and Title only -->
|
|
362
|
+
<h4
|
|
363
|
+
class="flowdrop-text--sm flowdrop-font--medium flowdrop-truncate flowdrop-flex--1"
|
|
364
|
+
>
|
|
365
|
+
{nodeType.name}
|
|
366
|
+
</h4>
|
|
367
|
+
</div>
|
|
368
|
+
<p
|
|
369
|
+
class="flowdrop-text--xs flowdrop-text--gray flowdrop-truncate flowdrop-mt--1 flowdrop-ml--0"
|
|
370
|
+
>
|
|
371
|
+
{nodeType.description}
|
|
372
|
+
</p>
|
|
373
|
+
</div>
|
|
374
|
+
</div>
|
|
375
|
+
{/each}
|
|
376
|
+
</div>
|
|
377
|
+
</div>
|
|
378
|
+
</details>
|
|
379
|
+
{/if}
|
|
380
|
+
{/each}
|
|
381
|
+
</div>
|
|
382
|
+
</div>
|
|
383
|
+
{/if}
|
|
384
|
+
</div>
|
|
385
|
+
|
|
386
|
+
<!-- Footer -->
|
|
387
|
+
<div class="flowdrop-sidebar__footer">
|
|
388
|
+
<div class="flowdrop-flex flowdrop-gap--4">
|
|
389
|
+
<div class="flowdrop-flex flowdrop-gap--4">
|
|
390
|
+
{#if props.nodes?.length === 0}
|
|
391
|
+
<span class="flowdrop-text--xs flowdrop-text--gray">Loading components...</span>
|
|
392
|
+
{:else}
|
|
393
|
+
<span class="flowdrop-text--xs flowdrop-text--gray"
|
|
394
|
+
>Total: {props.nodes?.length || 0} components</span
|
|
395
|
+
>
|
|
396
|
+
<span class="flowdrop-text--xs flowdrop-text--gray"
|
|
397
|
+
>Showing: {filteredNodes.length}</span
|
|
398
|
+
>
|
|
399
|
+
{/if}
|
|
400
|
+
</div>
|
|
401
|
+
</div>
|
|
402
|
+
</div>
|
|
403
|
+
{/if}
|
|
404
|
+
</aside>
|
|
405
|
+
|
|
406
|
+
<style>
|
|
407
|
+
/* Components Sidebar - Always Visible */
|
|
408
|
+
.flowdrop-sidebar {
|
|
409
|
+
height: calc(100vh - var(--fd-navbar-height)); /* Account for navbar height */
|
|
410
|
+
background-color: var(--fd-background);
|
|
411
|
+
border-right: 1px solid var(--fd-border);
|
|
412
|
+
display: flex;
|
|
413
|
+
flex-direction: column;
|
|
414
|
+
box-shadow: var(--fd-shadow-md);
|
|
415
|
+
flex-shrink: 0;
|
|
416
|
+
transition: width 0.2s ease;
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
.flowdrop-sidebar--container {
|
|
420
|
+
display: flex;
|
|
421
|
+
flex-direction: column;
|
|
422
|
+
height: 100%;
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
/* Collapsed state */
|
|
426
|
+
.flowdrop-sidebar--collapsed {
|
|
427
|
+
overflow: hidden;
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
.flowdrop-sidebar--collapsed .flowdrop-sidebar__header {
|
|
431
|
+
justify-content: center;
|
|
432
|
+
padding: 0.75rem 0.5rem;
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
/* Compact mode styles */
|
|
436
|
+
.flowdrop-sidebar--compact .flowdrop-sidebar__header {
|
|
437
|
+
padding: 0.5rem 0.75rem;
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
.flowdrop-sidebar--compact .flowdrop-sidebar__search {
|
|
441
|
+
padding: 0.5rem 0.75rem;
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
.flowdrop-sidebar--compact .flowdrop-sidebar__content {
|
|
445
|
+
padding-bottom: 2rem;
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
.flowdrop-sidebar--compact .flowdrop-sidebar__footer {
|
|
449
|
+
padding: 0.375rem 0.5rem;
|
|
450
|
+
height: 32px;
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
.flowdrop-sidebar--compact .flowdrop-node-icon {
|
|
454
|
+
width: 1.5rem;
|
|
455
|
+
height: 1.5rem;
|
|
456
|
+
font-size: var(--fd-text-xs);
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
.flowdrop-sidebar--compact .flowdrop-node-list {
|
|
460
|
+
gap: 0.25rem;
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
.flowdrop-sidebar--compact .flowdrop-category-list {
|
|
464
|
+
gap: 0.25rem;
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
/* Toggle button */
|
|
468
|
+
.flowdrop-sidebar__toggle {
|
|
469
|
+
display: flex;
|
|
470
|
+
align-items: center;
|
|
471
|
+
justify-content: center;
|
|
472
|
+
width: 2rem;
|
|
473
|
+
height: 2rem;
|
|
474
|
+
border: none;
|
|
475
|
+
background: transparent;
|
|
476
|
+
color: var(--fd-muted-foreground);
|
|
477
|
+
border-radius: var(--fd-radius-md);
|
|
478
|
+
cursor: pointer;
|
|
479
|
+
transition:
|
|
480
|
+
color var(--fd-transition-fast),
|
|
481
|
+
background-color var(--fd-transition-fast);
|
|
482
|
+
flex-shrink: 0;
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
.flowdrop-sidebar__toggle:hover {
|
|
486
|
+
color: var(--fd-foreground);
|
|
487
|
+
background-color: var(--fd-subtle);
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
.flowdrop-sidebar__toggle:focus {
|
|
491
|
+
outline: none;
|
|
492
|
+
box-shadow: 0 0 0 2px var(--fd-ring);
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
.flowdrop-sidebar__header {
|
|
496
|
+
background: var(--fd-header);
|
|
497
|
+
border-bottom: 1px solid var(--fd-border);
|
|
498
|
+
padding: 0.75rem 1rem;
|
|
499
|
+
display: flex;
|
|
500
|
+
align-items: center;
|
|
501
|
+
justify-content: space-between;
|
|
502
|
+
flex-shrink: 0;
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
.flowdrop-sidebar__title {
|
|
506
|
+
display: flex;
|
|
507
|
+
align-items: center;
|
|
508
|
+
}
|
|
509
|
+
|
|
510
|
+
.flowdrop-sidebar__title h2 {
|
|
511
|
+
font-size: 1rem;
|
|
512
|
+
font-weight: 600;
|
|
513
|
+
margin: 0;
|
|
514
|
+
color: var(--fd-foreground);
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
.flowdrop-sidebar__search {
|
|
518
|
+
padding: 0.75rem 1rem;
|
|
519
|
+
background-color: var(--fd-background);
|
|
520
|
+
border-bottom: 1px solid var(--fd-border);
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
.flowdrop-sidebar__content {
|
|
524
|
+
flex: 1;
|
|
525
|
+
overflow-y: scroll; /* Changed from auto to scroll to always show scrollbar */
|
|
526
|
+
scrollbar-width: thin;
|
|
527
|
+
scrollbar-color: var(--fd-scrollbar-thumb) var(--fd-scrollbar-track);
|
|
528
|
+
padding-bottom: 4rem; /* Add padding to ensure content is scrollable above footer */
|
|
529
|
+
min-height: 0; /* Allow flex item to shrink below content size */
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
.flowdrop-sidebar__content::-webkit-scrollbar {
|
|
533
|
+
width: 8px;
|
|
534
|
+
display: block; /* Ensure scrollbar is always visible */
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
.flowdrop-sidebar__content::-webkit-scrollbar-track {
|
|
538
|
+
background: var(--fd-scrollbar-track);
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
.flowdrop-sidebar__content::-webkit-scrollbar-thumb {
|
|
542
|
+
background: var(--fd-scrollbar-thumb);
|
|
543
|
+
border-radius: 4px;
|
|
544
|
+
min-height: 20px; /* Ensure thumb has minimum height for visibility */
|
|
545
|
+
}
|
|
546
|
+
|
|
547
|
+
.flowdrop-sidebar__content::-webkit-scrollbar-thumb:hover {
|
|
548
|
+
background: var(--fd-scrollbar-thumb-hover);
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
.flowdrop-sidebar__footer {
|
|
552
|
+
background-color: var(--fd-backdrop);
|
|
553
|
+
backdrop-filter: var(--fd-backdrop-blur);
|
|
554
|
+
border-top: 1px solid var(--fd-border);
|
|
555
|
+
padding: 0.5rem 0.75rem;
|
|
556
|
+
flex-shrink: 0; /* Prevent footer from shrinking */
|
|
557
|
+
position: relative;
|
|
558
|
+
z-index: 10; /* Ensure footer stays on top */
|
|
559
|
+
height: 40px;
|
|
560
|
+
display: flex;
|
|
561
|
+
align-items: center;
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
.flowdrop-node-list {
|
|
565
|
+
display: flex;
|
|
566
|
+
flex-direction: column;
|
|
567
|
+
gap: 0.375rem;
|
|
568
|
+
}
|
|
569
|
+
|
|
570
|
+
.flowdrop-node-item {
|
|
571
|
+
cursor: grab;
|
|
572
|
+
transition: all var(--fd-transition-fast);
|
|
573
|
+
border-radius: var(--fd-radius-md);
|
|
574
|
+
border: 1px solid transparent;
|
|
575
|
+
background-color: var(--fd-card);
|
|
576
|
+
}
|
|
577
|
+
|
|
578
|
+
.flowdrop-node-item:hover {
|
|
579
|
+
border-color: var(--fd-border);
|
|
580
|
+
background-color: var(--fd-muted);
|
|
581
|
+
box-shadow: var(--fd-shadow-sm);
|
|
582
|
+
transform: translateY(-1px);
|
|
583
|
+
}
|
|
584
|
+
|
|
585
|
+
.flowdrop-node-item:active {
|
|
586
|
+
cursor: grabbing;
|
|
587
|
+
transform: translateY(0);
|
|
588
|
+
box-shadow: none;
|
|
589
|
+
}
|
|
590
|
+
|
|
591
|
+
/* Squircle icon wrapper - Apple-style rounded square background */
|
|
592
|
+
.flowdrop-node-icon {
|
|
593
|
+
width: 2rem;
|
|
594
|
+
height: 2rem;
|
|
595
|
+
border-radius: 0.5rem;
|
|
596
|
+
background: color-mix(in srgb, var(--_icon-color) var(--fd-node-icon-bg-opacity), transparent);
|
|
597
|
+
color: var(--fd-node-icon);
|
|
598
|
+
font-size: var(--fd-text-sm);
|
|
599
|
+
display: flex;
|
|
600
|
+
align-items: center;
|
|
601
|
+
justify-content: center;
|
|
602
|
+
flex-shrink: 0;
|
|
603
|
+
transition: all var(--fd-transition-normal);
|
|
604
|
+
}
|
|
605
|
+
|
|
606
|
+
.flowdrop-node-item:hover .flowdrop-node-icon,
|
|
607
|
+
.flowdrop-details__summary:hover .flowdrop-node-icon {
|
|
608
|
+
background: color-mix(
|
|
609
|
+
in srgb,
|
|
610
|
+
var(--_icon-color) var(--fd-node-icon-bg-opacity-hover),
|
|
611
|
+
transparent
|
|
612
|
+
);
|
|
613
|
+
transform: scale(1.05);
|
|
614
|
+
}
|
|
615
|
+
|
|
616
|
+
.flowdrop-category-list {
|
|
617
|
+
display: flex;
|
|
618
|
+
flex-direction: column;
|
|
619
|
+
gap: 0.375rem;
|
|
620
|
+
}
|
|
621
|
+
|
|
622
|
+
.flowdrop-items--center {
|
|
623
|
+
align-items: center;
|
|
624
|
+
}
|
|
625
|
+
|
|
626
|
+
.flowdrop-truncate {
|
|
627
|
+
overflow: hidden;
|
|
628
|
+
text-overflow: ellipsis;
|
|
629
|
+
white-space: nowrap;
|
|
630
|
+
}
|
|
631
|
+
|
|
632
|
+
.flowdrop-card__body h4 {
|
|
633
|
+
margin: 0;
|
|
634
|
+
line-height: 1;
|
|
635
|
+
color: var(--fd-foreground);
|
|
636
|
+
}
|
|
637
|
+
|
|
638
|
+
.flowdrop-p--4 {
|
|
639
|
+
padding: 1rem;
|
|
640
|
+
}
|
|
641
|
+
|
|
642
|
+
.flowdrop-py--1 {
|
|
643
|
+
padding-top: 0.25rem;
|
|
644
|
+
padding-bottom: 0.25rem;
|
|
645
|
+
}
|
|
646
|
+
|
|
647
|
+
.flowdrop-ml--0 {
|
|
648
|
+
margin-left: 0;
|
|
649
|
+
}
|
|
650
|
+
|
|
651
|
+
/* Form Elements - Matching App Design System */
|
|
652
|
+
.flowdrop-input {
|
|
653
|
+
padding: 0.625rem 0.75rem;
|
|
654
|
+
border: 1px solid var(--fd-border-strong);
|
|
655
|
+
border-radius: var(--fd-radius-md);
|
|
656
|
+
font-size: var(--fd-text-sm);
|
|
657
|
+
color: var(--fd-foreground);
|
|
658
|
+
background-color: var(--fd-background);
|
|
659
|
+
transition:
|
|
660
|
+
border-color var(--fd-transition-normal),
|
|
661
|
+
box-shadow var(--fd-transition-normal);
|
|
662
|
+
width: 100%;
|
|
663
|
+
height: 2.5rem;
|
|
664
|
+
box-sizing: border-box;
|
|
665
|
+
}
|
|
666
|
+
|
|
667
|
+
.flowdrop-input:focus {
|
|
668
|
+
outline: none;
|
|
669
|
+
border-color: var(--fd-ring);
|
|
670
|
+
box-shadow: 0 0 0 3px color-mix(in srgb, var(--fd-ring) 20%, transparent);
|
|
671
|
+
}
|
|
672
|
+
|
|
673
|
+
.flowdrop-input::placeholder {
|
|
674
|
+
color: var(--fd-muted-foreground);
|
|
675
|
+
}
|
|
676
|
+
|
|
677
|
+
.flowdrop-btn {
|
|
678
|
+
padding: 0.625rem 0.75rem;
|
|
679
|
+
border-radius: var(--fd-radius-md);
|
|
680
|
+
font-size: var(--fd-text-sm);
|
|
681
|
+
font-weight: 500;
|
|
682
|
+
cursor: pointer;
|
|
683
|
+
transition: all var(--fd-transition-normal);
|
|
684
|
+
border: 1px solid var(--fd-border-strong);
|
|
685
|
+
display: flex;
|
|
686
|
+
align-items: center;
|
|
687
|
+
justify-content: center;
|
|
688
|
+
gap: 0.5rem;
|
|
689
|
+
background-color: var(--fd-muted);
|
|
690
|
+
color: var(--fd-foreground);
|
|
691
|
+
height: 2.5rem;
|
|
692
|
+
min-width: 2.5rem;
|
|
693
|
+
box-sizing: border-box;
|
|
694
|
+
}
|
|
695
|
+
|
|
696
|
+
.flowdrop-btn:hover {
|
|
697
|
+
background-color: var(--fd-subtle);
|
|
698
|
+
border-color: var(--fd-border-strong);
|
|
699
|
+
}
|
|
700
|
+
|
|
701
|
+
.flowdrop-btn:active {
|
|
702
|
+
background-color: var(--fd-border);
|
|
703
|
+
border-color: var(--fd-muted-foreground);
|
|
704
|
+
}
|
|
705
|
+
|
|
706
|
+
.flowdrop-btn:focus {
|
|
707
|
+
outline: none;
|
|
708
|
+
box-shadow: 0 0 0 3px color-mix(in srgb, var(--fd-ring) 20%, transparent);
|
|
709
|
+
}
|
|
710
|
+
|
|
711
|
+
.flowdrop-btn:disabled {
|
|
712
|
+
background-color: var(--fd-muted-foreground);
|
|
713
|
+
border-color: var(--fd-muted-foreground);
|
|
714
|
+
cursor: not-allowed;
|
|
715
|
+
opacity: 0.6;
|
|
716
|
+
}
|
|
717
|
+
|
|
718
|
+
/* Join component styles - Seamless integration */
|
|
719
|
+
.flowdrop-join {
|
|
720
|
+
display: flex;
|
|
721
|
+
width: 100%;
|
|
722
|
+
border-radius: var(--fd-radius-md);
|
|
723
|
+
overflow: hidden;
|
|
724
|
+
border: 1px solid var(--fd-border-strong);
|
|
725
|
+
background-color: var(--fd-background);
|
|
726
|
+
}
|
|
727
|
+
|
|
728
|
+
.flowdrop-join__item {
|
|
729
|
+
border: none;
|
|
730
|
+
border-radius: 0;
|
|
731
|
+
background-color: transparent;
|
|
732
|
+
}
|
|
733
|
+
|
|
734
|
+
.flowdrop-join__item:first-child {
|
|
735
|
+
border-right: 1px solid var(--fd-border-strong);
|
|
736
|
+
flex: 1;
|
|
737
|
+
}
|
|
738
|
+
|
|
739
|
+
.flowdrop-join__item:last-child {
|
|
740
|
+
border-left: none;
|
|
741
|
+
background-color: var(--fd-muted);
|
|
742
|
+
color: var(--fd-foreground);
|
|
743
|
+
}
|
|
744
|
+
|
|
745
|
+
.flowdrop-join__item:last-child:hover {
|
|
746
|
+
background-color: var(--fd-subtle);
|
|
747
|
+
}
|
|
748
|
+
|
|
749
|
+
.flowdrop-join:focus-within {
|
|
750
|
+
border-color: var(--fd-ring);
|
|
751
|
+
box-shadow: 0 0 0 3px color-mix(in srgb, var(--fd-ring) 20%, transparent);
|
|
752
|
+
}
|
|
753
|
+
|
|
754
|
+
/* Utility classes */
|
|
755
|
+
.flowdrop-w--full {
|
|
756
|
+
width: 100%;
|
|
757
|
+
}
|
|
758
|
+
|
|
759
|
+
.flowdrop-flex--1 {
|
|
760
|
+
flex: 1;
|
|
761
|
+
}
|
|
762
|
+
</style>
|