diff --git a/packages/svelte/src/lib/container/Panel.svelte b/packages/svelte/src/lib/container/Panel.svelte
new file mode 100644
index 00000000..e87917d9
--- /dev/null
+++ b/packages/svelte/src/lib/container/Panel.svelte
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/packages/svelte/src/lib/container/SvelteFlow.svelte b/packages/svelte/src/lib/container/SvelteFlow.svelte
index 67b265a8..11a659f3 100644
--- a/packages/svelte/src/lib/container/SvelteFlow.svelte
+++ b/packages/svelte/src/lib/container/SvelteFlow.svelte
@@ -47,6 +47,8 @@
+
+
\ No newline at end of file
diff --git a/packages/svelte/src/lib/plugins/Controls/Icons/Fit.svelte b/packages/svelte/src/lib/plugins/Controls/Icons/Fit.svelte
new file mode 100644
index 00000000..1b68036e
--- /dev/null
+++ b/packages/svelte/src/lib/plugins/Controls/Icons/Fit.svelte
@@ -0,0 +1,3 @@
+
\ No newline at end of file
diff --git a/packages/svelte/src/lib/plugins/Controls/Icons/Lock.svelte b/packages/svelte/src/lib/plugins/Controls/Icons/Lock.svelte
new file mode 100644
index 00000000..6205cfc7
--- /dev/null
+++ b/packages/svelte/src/lib/plugins/Controls/Icons/Lock.svelte
@@ -0,0 +1,3 @@
+
\ No newline at end of file
diff --git a/packages/svelte/src/lib/plugins/Controls/Icons/Minus.svelte b/packages/svelte/src/lib/plugins/Controls/Icons/Minus.svelte
new file mode 100644
index 00000000..dc8d310b
--- /dev/null
+++ b/packages/svelte/src/lib/plugins/Controls/Icons/Minus.svelte
@@ -0,0 +1,3 @@
+
\ No newline at end of file
diff --git a/packages/svelte/src/lib/plugins/Controls/Icons/Plus.svelte b/packages/svelte/src/lib/plugins/Controls/Icons/Plus.svelte
new file mode 100644
index 00000000..a13adbd7
--- /dev/null
+++ b/packages/svelte/src/lib/plugins/Controls/Icons/Plus.svelte
@@ -0,0 +1,3 @@
+
\ No newline at end of file
diff --git a/packages/svelte/src/lib/plugins/Controls/Icons/Unlock.svelte b/packages/svelte/src/lib/plugins/Controls/Icons/Unlock.svelte
new file mode 100644
index 00000000..2e59dbd7
--- /dev/null
+++ b/packages/svelte/src/lib/plugins/Controls/Icons/Unlock.svelte
@@ -0,0 +1,3 @@
+
\ No newline at end of file
diff --git a/packages/svelte/src/lib/plugins/Controls/index.svelte b/packages/svelte/src/lib/plugins/Controls/index.svelte
new file mode 100644
index 00000000..f8d4665d
--- /dev/null
+++ b/packages/svelte/src/lib/plugins/Controls/index.svelte
@@ -0,0 +1,89 @@
+
+
+
+ {#if showZoom}
+
+
+
+
+
+
+ {/if}
+ {#if showFitView}
+
+
+
+ {/if}
+ {#if showInteractive}
+
+ {#if isInteractive}{:else}{/if}
+
+ {/if}
+
\ No newline at end of file
diff --git a/packages/svelte/src/lib/store/index.ts b/packages/svelte/src/lib/store/index.ts
index ac038588..6a291203 100644
--- a/packages/svelte/src/lib/store/index.ts
+++ b/packages/svelte/src/lib/store/index.ts
@@ -10,9 +10,10 @@ import {
internalsSymbol,
type NodeOrigin,
type D3ZoomInstance,
- type D3SelectionInstance
+ type D3SelectionInstance,
+ type ViewportHelperFunctionOptions
} from '@reactflow/system';
-import { fitView } from '@reactflow/utils';
+import { fitView, getD3Transition } from '@reactflow/utils';
import { getDimensions, getHandleBounds } from '../../utils';
import {
@@ -48,6 +49,9 @@ type SvelteFlowStore = {
}>;
transformStore: Writable;
edgesWithDataStore: Readable;
+ zoomIn: (options?: ViewportHelperFunctionOptions) => void;
+ zoomOut: (options?: ViewportHelperFunctionOptions) => void;
+ fitView: (options?: ViewportHelperFunctionOptions) => void;
updateNodePositions: (
nodeDragItems: NodeDragItem[],
positionChanged?: boolean,
@@ -68,7 +72,10 @@ export function createStore({
const heightStore = writable(500);
const widthStore = writable(500);
const nodeOriginStore = writable(nodeOrigin);
- const d3Store = writable({ zoom: null, selection: null });
+ const d3Store = writable<{ zoom: D3ZoomInstance | null; selection: D3SelectionInstance | null }>({
+ zoom: null,
+ selection: null
+ });
let fitViewOnInitDone = false;
@@ -205,6 +212,40 @@ export function createStore({
nodesStore.set(nextNodes);
}
+ function zoomIn(options?: ViewportHelperFunctionOptions) {
+ const { zoom: d3Zoom, selection: d3Selection } = get(d3Store);
+
+ if (d3Zoom && d3Selection) {
+ d3Zoom.scaleBy(getD3Transition(d3Selection, options?.duration), 1.2);
+ }
+ }
+
+ function zoomOut(options?: ViewportHelperFunctionOptions) {
+ const { zoom: d3Zoom, selection: d3Selection } = get(d3Store);
+ if (d3Zoom && d3Selection) {
+ d3Zoom.scaleBy(getD3Transition(d3Selection, options?.duration), 1 / 1.2);
+ }
+ }
+
+ function _fitView() {
+ const { zoom: d3Zoom, selection: d3Selection } = get(d3Store);
+ if (d3Zoom && d3Selection) {
+ fitView(
+ {
+ nodes: get(nodesStore),
+ width: get(widthStore),
+ height: get(heightStore),
+ minZoom: 0.2,
+ maxZoom: 2,
+ d3Selection,
+ d3Zoom,
+ nodeOrigin: get(nodeOriginStore)
+ },
+ {}
+ );
+ }
+ }
+
return {
nodesStore,
edgesStore,
@@ -214,7 +255,10 @@ export function createStore({
widthStore,
edgesWithDataStore,
updateNodePositions,
- updateNodeDimensions
+ updateNodeDimensions,
+ zoomIn,
+ zoomOut,
+ fitView: _fitView
};
}
diff --git a/packages/svelte/src/routes/+page.svelte b/packages/svelte/src/routes/+page.svelte
index 5afcd3b8..0f89b8fe 100644
--- a/packages/svelte/src/routes/+page.svelte
+++ b/packages/svelte/src/routes/+page.svelte
@@ -1,7 +1,7 @@
-
+
+
+