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 @@ - + + +