diff --git a/packages/svelte/src/lib/components/NodeWrapper/NodeWrapper.svelte b/packages/svelte/src/lib/components/NodeWrapper/NodeWrapper.svelte
index 03e6cc70..33530ceb 100644
--- a/packages/svelte/src/lib/components/NodeWrapper/NodeWrapper.svelte
+++ b/packages/svelte/src/lib/components/NodeWrapper/NodeWrapper.svelte
@@ -1,45 +1,18 @@
diff --git a/packages/svelte/src/lib/components/NodeWrapper/types.ts b/packages/svelte/src/lib/components/NodeWrapper/types.ts
index d80e6c88..93a3ddf1 100644
--- a/packages/svelte/src/lib/components/NodeWrapper/types.ts
+++ b/packages/svelte/src/lib/components/NodeWrapper/types.ts
@@ -5,40 +5,41 @@ export type ConnectableContext = {
value: boolean;
};
-export type NodeWrapperProps = Pick<
- Node,
- | 'id'
- | 'class'
- | 'connectable'
- | 'data'
- | 'draggable'
- | 'dragging'
- | 'selected'
- | 'selectable'
- | 'deletable'
- | 'style'
- | 'type'
- | 'sourcePosition'
- | 'targetPosition'
- | 'dragHandle'
- | 'hidden'
- | 'width'
- | 'height'
- | 'initialWidth'
- | 'initialHeight'
- | 'parentId'
-> & {
- measuredWidth?: number;
- measuredHeight?: number;
- type: string;
- positionX: number;
- positionY: number;
- 'on:nodeclick'?: (event: MouseEvent) => void;
- resizeObserver?: ResizeObserver | null;
- isParent?: boolean;
- zIndex: number;
- node: InternalNode;
- initialized: boolean;
+export type NodeWrapperProps = {
+ // Pick<
+ // Node,
+ // | 'id'
+ // | 'class'
+ // | 'connectable'
+ // | 'data'
+ // | 'draggable'
+ // | 'dragging'
+ // | 'selected'
+ // | 'selectable'
+ // | 'deletable'
+ // | 'style'
+ // | 'type'
+ // | 'sourcePosition'
+ // | 'targetPosition'
+ // | 'dragHandle'
+ // | 'hidden'
+ // | 'width'
+ // | 'height'
+ // | 'initialWidth'
+ // | 'initialHeight'
+ // | 'parentId'
+ // > & {
+ // measuredWidth?: number;
+ // measuredHeight?: number;
+ // type: string;
+ // positionX: number;
+ // positionY: number;
+ // 'on:nodeclick'?: (event: MouseEvent) => void;
+ // isParent?: boolean;
+ // zIndex: number;
+ // initialized: boolean;
+ node: Node;
nodeClickDistance?: number;
+ resizeObserver?: ResizeObserver | null;
store: SvelteFlowStore;
};
diff --git a/packages/svelte/src/lib/container/NodeRenderer/NodeRenderer.svelte b/packages/svelte/src/lib/container/NodeRenderer/NodeRenderer.svelte
index 0dc022f4..3789e4cc 100644
--- a/packages/svelte/src/lib/container/NodeRenderer/NodeRenderer.svelte
+++ b/packages/svelte/src/lib/container/NodeRenderer/NodeRenderer.svelte
@@ -1,9 +1,8 @@
{#each store.nodes as node (node.id)}
- {@const internalNode = store.nodeLookup.get(node.id)}
| ((node: Node) => Partial),
// options?: { replace: boolean }
// ) => void;
- updateNode:
- | ((id: string, nodeUpdate: Node | ((node: Node) => Node), options: { replace: true }) => void)
- | ((
- id: string,
- nodeUpdate: Partial | ((node: Node) => Partial),
- options: { replace: false }
- ) => void);
+ updateNode: (
+ id: string,
+ nodeUpdate: Partial | ((node: Node) => Partial),
+ options?: { replace: boolean }
+ ) => void;
/**
* Updates the data attribute of a node.
*
@@ -248,13 +246,11 @@ export function useSvelteFlow(): {
* @example
* updateNode('node-1', (node) => ({ position: { x: node.position.x + 10, y: node.position.y } }));
*/
- updateEdge:
- | ((id: string, edgeUpdate: Edge | ((edge: Edge) => Edge), options: { replace: true }) => void)
- | ((
- id: string,
- edgeUpdate: Partial | ((edge: Edge) => Partial),
- options?: { replace: false }
- ) => void);
+ updateEdge: (
+ id: string,
+ edgeUpdate: Partial | ((edge: Edge) => Partial),
+ options?: { replace: boolean }
+ ) => void;
toObject: () => { nodes: Node[]; edges: Edge[]; viewport: Viewport };
/**
* Returns the bounds of the given nodes or node ids.
diff --git a/packages/svelte/src/lib/store/index.ts b/packages/svelte/src/lib/store/index.ts
index 4f5de5e0..24ab10a6 100644
--- a/packages/svelte/src/lib/store/index.ts
+++ b/packages/svelte/src/lib/store/index.ts
@@ -243,6 +243,8 @@ export function createStore(signals: StoreSignals): SvelteFlowStore {
if (node.selected !== selected) {
// we need to mutate the node here in order to have the correct selected state in the drag handler
+ const internalNode = store.nodeLookup.get(node.id);
+ if (internalNode) internalNode.selected = selected;
node.selected = selected;
return { ...node };
}
diff --git a/packages/svelte/src/lib/store/initial-store.svelte.ts b/packages/svelte/src/lib/store/initial-store.svelte.ts
index 4f6f5592..7a305193 100644
--- a/packages/svelte/src/lib/store/initial-store.svelte.ts
+++ b/packages/svelte/src/lib/store/initial-store.svelte.ts
@@ -91,14 +91,13 @@ export const getInitialStore = (signals: StoreSignals) => {
connectionLookup: ConnectionLookup = new Map();
edgeLookup: EdgeLookup = new Map();
- adoptNodes: true = $derived.by(() => {
- adoptUserNodes(signals.nodes, this.nodeLookup, this.parentLookup, {
+ adoptNodes: Set = $derived.by(() => {
+ return adoptUserNodes(signals.nodes, this.nodeLookup, this.parentLookup, {
nodeExtent: this.nodeExtent,
nodeOrigin: this.nodeOrigin,
elevateNodesOnSelect: false,
checkEquality: true
});
- return true;
});
adoptEdges: true = $derived.by(() => {
updateConnectionLookup(this.connectionLookup, this.edgeLookup, signals.edges);
@@ -197,8 +196,8 @@ export const getInitialStore = (signals: StoreSignals) => {
edgesInitialized: boolean = $state(false);
viewportInitialized: boolean = $state(false);
- initialNodesLength: number = signals.nodes.length;
- initialEdgesLength: number = signals.edges.length;
+ initialNodesLength: number = signals.nodes?.length ?? 0;
+ initialEdgesLength: number = signals.edges?.length ?? 0;
initialized: boolean = $derived.by(() => {
let initialized = false;
// if it hasn't been initialised check if it's now
diff --git a/packages/system/src/utils/store.ts b/packages/system/src/utils/store.ts
index ec55759a..1db8cd8a 100644
--- a/packages/system/src/utils/store.ts
+++ b/packages/system/src/utils/store.ts
@@ -93,6 +93,7 @@ export function adoptUserNodes(
nodeLookup.clear();
parentLookup.clear();
+ const updatedChildNodes = new Set();
for (const userNode of nodes) {
let internalNode = tmpLookup.get(userNode.id);
@@ -123,9 +124,10 @@ export function adoptUserNodes(
}
if (userNode.parentId) {
- updateChildNode(internalNode, nodeLookup, parentLookup, options);
+ updateChildNode(internalNode, nodeLookup, parentLookup, options, updatedChildNodes);
}
}
+ return updatedChildNodes;
}
function updateParentLookup(
@@ -152,7 +154,8 @@ function updateChildNode(
node: InternalNodeBase,
nodeLookup: NodeLookup>,
parentLookup: ParentLookup>,
- options?: UpdateNodesOptions
+ options?: UpdateNodesOptions,
+ updatedChildNodes?: Set
) {
const { elevateNodesOnSelect, nodeOrigin, nodeExtent } = mergeObjects(defaultOptions, options);
const parentId = node.parentId!;
@@ -178,6 +181,7 @@ function updateChildNode(
positionAbsolute: positionChanged ? { x, y } : positionAbsolute,
z,
};
+ updatedChildNodes?.add(node.id);
}
}