diff --git a/examples/svelte/src/routes/examples/two-way-viewport/Flow.svelte b/examples/svelte/src/routes/examples/two-way-viewport/Flow.svelte index 2d9d562d..0331fbda 100644 --- a/examples/svelte/src/routes/examples/two-way-viewport/Flow.svelte +++ b/examples/svelte/src/routes/examples/two-way-viewport/Flow.svelte @@ -1,5 +1,4 @@ - + diff --git a/packages/svelte/src/lib/container/SvelteFlow/SvelteFlow.svelte b/packages/svelte/src/lib/container/SvelteFlow/SvelteFlow.svelte index ab35e0d4..cb3ee9f4 100644 --- a/packages/svelte/src/lib/container/SvelteFlow/SvelteFlow.svelte +++ b/packages/svelte/src/lib/container/SvelteFlow/SvelteFlow.svelte @@ -64,6 +64,7 @@ children, nodes = $bindable([]), edges = $bindable([]), + viewport = $bindable(undefined), ...props }: SvelteFlowProps = $props(); @@ -93,6 +94,12 @@ }, set edges(newEdges) { edges = newEdges; + }, + get viewport() { + return viewport; + }, + set viewport(newViewport) { + viewport = newViewport; } }); diff --git a/packages/svelte/src/lib/container/SvelteFlow/types.ts b/packages/svelte/src/lib/container/SvelteFlow/types.ts index 69280c58..36af1aa7 100644 --- a/packages/svelte/src/lib/container/SvelteFlow/types.ts +++ b/packages/svelte/src/lib/container/SvelteFlow/types.ts @@ -35,7 +35,7 @@ import type { IsValidConnection, DefaultNodeOptions } from '$lib/types'; -import type { Writable } from 'svelte/store'; + import type { Snippet } from 'svelte'; import type { EdgeEvents, NodeEvents, NodeSelectionEvents, PaneEvents } from '$lib/types/events'; @@ -168,8 +168,8 @@ export type SvelteFlowProps = NodeEvents & * }; */ initialViewport?: Viewport; - /** Custom viewport writable to be used instead of internal one */ - viewport?: Writable; + /** Custom viewport to be used instead of internal one */ + viewport?: Viewport; /** The radius around a handle where you drop a connection line to create a new edge. * @default 20 */ diff --git a/packages/svelte/src/lib/store/initial-store.svelte.ts b/packages/svelte/src/lib/store/initial-store.svelte.ts index 6e041ed8..e021af0f 100644 --- a/packages/svelte/src/lib/store/initial-store.svelte.ts +++ b/packages/svelte/src/lib/store/initial-store.svelte.ts @@ -102,6 +102,7 @@ export const getInitialStore = (signals: StoreSignals) => { set edges(edges) { signals.edges = edges; } + nodeLookup: NodeLookup = new Map(); parentLookup: ParentLookup = new Map(); connectionLookup: ConnectionLookup = new Map(); @@ -147,7 +148,17 @@ export const getInitialStore = (signals: StoreSignals) => { nodeTypes: NodeTypes = $derived({ ...initialNodeTypes, ...signals.props.nodeTypes }); edgeTypes: EdgeTypes = $derived({ ...initialEdgeTypes, ...signals.props.edgeTypes }); - viewport: Viewport = $state(signals.props.initialViewport ?? { x: 0, y: 0, zoom: 1 }); + // _viewport is the internal viewport. We either return signals.viewport or _viewport + _viewport: Viewport = $state(signals.props.initialViewport ?? { x: 0, y: 0, zoom: 1 }); + get viewport() { + return signals.viewport ?? this._viewport; + } + set viewport(viewport: Viewport) { + if (signals.viewport) { + signals.viewport = viewport; + } + this._viewport = viewport; + } connectionMode: ConnectionMode = $derived( signals.props.connectionMode ?? ConnectionMode.Strict diff --git a/packages/svelte/src/lib/store/types.ts b/packages/svelte/src/lib/store/types.ts index dc9275b9..33ebfa89 100644 --- a/packages/svelte/src/lib/store/types.ts +++ b/packages/svelte/src/lib/store/types.ts @@ -5,7 +5,8 @@ import type { Connection, UpdateNodePositions, CoordinateExtent, - UpdateConnection + UpdateConnection, + Viewport } from '@xyflow/system'; import type { getInitialStore } from './initial-store.svelte'; @@ -42,6 +43,7 @@ export type StoreSignals = { height?: number; nodes: Node[]; edges: Edge[]; + viewport?: Viewport; }; export type SvelteFlowStoreState = ReturnType;