diff --git a/packages/svelte/src/lib/store/index.ts b/packages/svelte/src/lib/store/index.ts index 24279a45..9f8d1b98 100644 --- a/packages/svelte/src/lib/store/index.ts +++ b/packages/svelte/src/lib/store/index.ts @@ -19,7 +19,8 @@ import { type UpdateConnection, type ConnectionState, type NodeOrigin, - getFitViewNodes + getFitViewNodes, + updateAbsolutePositions } from '@xyflow/system'; import type { EdgeTypes, NodeTypes, Node, Edge, FitViewOptions } from '$lib/types'; @@ -96,6 +97,7 @@ export function createStore({ function updateNodeInternals(updates: Map) { const nodeLookup = get(store.nodeLookup); + const parentLookup = get(store.parentLookup); const { changes, updatedInternals } = updateNodeInternalsSystem( updates, nodeLookup, @@ -108,6 +110,8 @@ export function createStore({ return; } + updateAbsolutePositions(nodeLookup, parentLookup, { nodeOrigin, nodeExtent }); + if (!get(store.fitViewOnInitDone) && get(store.fitViewOnInit)) { const fitViewOptions = get(store.fitViewOptions); const fitViewOnInitDone = fitViewSync({ diff --git a/packages/system/src/utils/store.ts b/packages/system/src/utils/store.ts index 73b6afc9..ec55759a 100644 --- a/packages/system/src/utils/store.ts +++ b/packages/system/src/utils/store.ts @@ -61,11 +61,14 @@ export function updateAbsolutePositions( ) { const _options = mergeObjects(defaultOptions, options); for (const node of nodeLookup.values()) { - if (!node.parentId) { - continue; + if (node.parentId) { + updateChildNode(node, nodeLookup, parentLookup, _options); + } else { + const positionWithOrigin = getNodePositionWithOrigin(node, _options.nodeOrigin); + const extent = isCoordinateExtent(node.extent) ? node.extent : _options.nodeExtent; + const clampedPosition = clampPosition(positionWithOrigin, extent, getNodeDimensions(node)); + node.internals.positionAbsolute = clampedPosition; } - - updateChildNode(node, nodeLookup, parentLookup, _options); } }