--- title: "Framework integration" description: "Use FlowDrop with Svelte, vanilla JS, React, Vue, Angular, or any framework." source: https://flowdrop.io/docs/editor/frameworks site: FlowDrop documentation --- # Framework integration FlowDrop is built with Svelte 5, but can be mounted into any framework via the mount API. ## Svelte (Native) Use FlowDrop components directly in Svelte: ```svelte console.log('Saved:', workflow.id)} /> ``` For SvelteKit, ensure FlowDrop runs only on the client: ```svelte {#if browser} {/if} ``` ## Vanilla JS / React / Vue / Angular Use the mount API to embed FlowDrop in any container element: ```javascript import { mountFlowDropApp } from '@flowdrop/flowdrop/editor'; import { createEndpointConfig } from '@flowdrop/flowdrop/core'; import '@flowdrop/flowdrop/styles'; const app = await mountFlowDropApp(document.getElementById('editor'), { endpointConfig: createEndpointConfig('/api/flowdrop'), eventHandlers: { onDirtyStateChange: (isDirty) => console.log('Unsaved:', isDirty), onAfterSave: async (workflow) => console.log('Saved!', workflow) } }); // Programmatic control app.save(); app.getWorkflow(); app.isDirty(); app.destroy(); ``` The returned handle also exposes `app.export()` and the mount's state container at `app.instance`. For programmatic state changes, reach through the instance — `app.instance.workflow.actions.*`, `app.instance.history.undo()`, and so on. See [Mount API](/editor/reference/mount-api) for the complete options and return value. ## API Configuration Connect to your backend by configuring endpoints: ```typescript import { createEndpointConfig } from '@flowdrop/flowdrop/core'; // Simple: just a base URL (all endpoints use defaults) const config = createEndpointConfig('/api/flowdrop'); // Custom: override specific endpoint paths const config = createEndpointConfig({ baseUrl: 'https://api.example.com', endpoints: { nodes: { list: '/nodes', get: '/nodes/{id}' }, workflows: { list: '/workflows', get: '/workflows/{id}', create: '/workflows', update: '/workflows/{id}' } } }); ``` See [Backend Implementation](/editor/integration/backend-implementation) for which endpoints to implement. ## Authentication FlowDrop supports three auth providers. Quick examples: ```typescript import { NoAuthProvider, StaticAuthProvider, CallbackAuthProvider } from '@flowdrop/flowdrop/core'; // No auth (development) authProvider: new NoAuthProvider(); // Static bearer token authProvider: new StaticAuthProvider({ type: 'bearer', token: 'your-jwt' }); // Dynamic token with refresh (enterprise) authProvider: new CallbackAuthProvider({ getToken: async () => authService.getAccessToken(), onUnauthorized: async () => authService.refreshToken() }); ``` For full details on each provider, token refresh patterns, and OAuth2 integration, see [Authentication Patterns](/editor/integration/authentication-patterns). ## Event Handlers React to all 11 editor lifecycle events: ```typescript const app = await mountFlowDropApp(container, { eventHandlers: { onWorkflowChange: (workflow, changeType) => { analytics.track('workflow_modified', { changeType }); }, onDirtyStateChange: (isDirty) => { saveButton.disabled = !isDirty; }, onBeforeSave: async (workflow) => { // Return false to cancel save }, onAfterSave: async (workflow) => { showNotification('Saved!'); }, onApiError: (error, operation) => { if (error.message.includes('401')) { redirectToLogin(); return true; // suppress default toast } } } }); ``` The mount options bag groups handlers under `eventHandlers`. The `` component instead takes the same handlers as flat `on*` props (`onAfterSave`, `onApiError`, …). For the complete event reference, see [Event System](/editor/advanced/event-system). ## Feature Flags Enable optional editor features: ```typescript const app = await mountFlowDropApp(container, { features: { autoSaveDraft: true, // default: true autoSaveDraftInterval: 30000, // default: 30 seconds showToasts: true // default: true } }); ``` ## Read-Only & Lock Modes The `mode` option controls canvas editing. `'readonly'` and `'locked'` both disable node dragging, connecting, selecting, proximity-connect, and node swap. ```typescript // Read-only: no canvas editing const app = await mountFlowDropApp(container, { mode: 'readonly' }); // Locked: same disabled interactions, distinct intent const app = await mountFlowDropApp(container, { mode: 'locked' }); ``` ## Next Steps - [Mount API](/editor/reference/mount-api) — complete mount options and return values - [Backend Implementation](/editor/integration/backend-implementation) — build the API - [Authentication Patterns](/editor/integration/authentication-patterns) — secure your integration - [Deployment](/editor/integration/deployment) — production deployment patterns - [Event System](/editor/advanced/event-system) — all 11 event handlers