From c44f0c61564f152763a60f07f6b5c08041fcb4d8 Mon Sep 17 00:00:00 2001 From: moklick Date: Thu, 5 Jun 2025 16:40:16 +0200 Subject: [PATCH] chore(svelte/nodewrapper): cleanup --- .../components/NodeWrapper/NodeWrapper.svelte | 36 ++++++++++--------- .../src/lib/hooks/useSvelteFlow.svelte.ts | 24 ++----------- packages/svelte/src/lib/store/index.ts | 24 ++++++++++++- packages/svelte/src/lib/store/types.ts | 4 ++- 4 files changed, 48 insertions(+), 40 deletions(-) diff --git a/packages/svelte/src/lib/components/NodeWrapper/NodeWrapper.svelte b/packages/svelte/src/lib/components/NodeWrapper/NodeWrapper.svelte index 1b5b1db7..a04f7dc7 100644 --- a/packages/svelte/src/lib/components/NodeWrapper/NodeWrapper.svelte +++ b/packages/svelte/src/lib/components/NodeWrapper/NodeWrapper.svelte @@ -6,7 +6,7 @@ isInputDOMNode, nodeHasDimensions, Position, - getNodesInside, + getNodesInside } from '@xyflow/system'; import drag from '$lib/actions/drag'; @@ -200,26 +200,30 @@ } const onFocus = () => { - if (store.disableKeyboardA11y || !store.enablePanOnFocus || !nodeRef?.matches(':focus-visible')) { + if ( + store.disableKeyboardA11y || + !store.enablePanOnFocus || + !nodeRef?.matches(':focus-visible') + ) { return; } - const width = store.width; - const height = store.height; - const viewport: [number, number, number] = [store.viewport.x, store.viewport.y, store.viewport.zoom]; - const zoom = store.viewport.zoom; - - const visibleNodes = getNodesInside(new Map([[id, node]]), { x: 0, y: 0, width, height }, viewport, true); + const { width, height, viewport } = store; - const isNodeVisible = visibleNodes.length > 0; + const withinViewport = + getNodesInside( + new Map([[id, node]]), + { x: 0, y: 0, width, height }, + [viewport.x, viewport.y, viewport.zoom], + true + ).length > 0; - if (!isNodeVisible) { - store.fitView({ - nodes: [{ id }], - duration: 100, - minZoom: zoom, - maxZoom: zoom, - }); + if (!withinViewport) { + store.setCenter( + node.position.x + (node.measured.width ?? 0) / 2, + node.position.y + (node.measured.height ?? 0) / 2, + { zoom: viewport.zoom } + ); } }; diff --git a/packages/svelte/src/lib/hooks/useSvelteFlow.svelte.ts b/packages/svelte/src/lib/hooks/useSvelteFlow.svelte.ts index 82c66064..c4869c33 100644 --- a/packages/svelte/src/lib/hooks/useSvelteFlow.svelte.ts +++ b/packages/svelte/src/lib/hooks/useSvelteFlow.svelte.ts @@ -366,28 +366,8 @@ export function useSvelteFlow $state.snapshot(store.viewport), - setCenter: async (x, y, options) => { - const nextZoom = typeof options?.zoom !== 'undefined' ? options.zoom : store.maxZoom; - const currentPanZoom = store.panZoom; - - if (!currentPanZoom) { - return Promise.resolve(false); - } - - await currentPanZoom.setViewport( - { - x: store.width / 2 - x * nextZoom, - y: store.height / 2 - y * nextZoom, - zoom: nextZoom - }, - { duration: options?.duration, ease: options?.ease, interpolate: options?.interpolate } - ); - - return Promise.resolve(true); - }, - fitView: (options?: FitViewOptions) => { - return store.fitView(options); - }, + setCenter: async (x, y, options) => store.setCenter(x, y, options), + fitView: (options?: FitViewOptions) => store.fitView(options), fitBounds: async (bounds: Rect, options?: FitBoundsOptions) => { if (!store.panZoom) { return Promise.resolve(false); diff --git a/packages/svelte/src/lib/store/index.ts b/packages/svelte/src/lib/store/index.ts index 657fdce2..a1f220bb 100644 --- a/packages/svelte/src/lib/store/index.ts +++ b/packages/svelte/src/lib/store/index.ts @@ -14,7 +14,8 @@ import { type ConnectionState, updateAbsolutePositions, snapPosition, - calculateNodePosition + calculateNodePosition, + type SetCenterOptions } from '@xyflow/system'; import type { EdgeTypes, NodeTypes, Node, Edge, FitViewOptions } from '$lib/types'; @@ -126,6 +127,26 @@ export function createStore void; setPaneClickDistance: (distance: number) => void; fitView: (options?: FitViewOptions) => Promise; + setCenter: SetCenter; updateNodePositions: UpdateNodePositions; updateNodeInternals: (updates: Map) => void; unselectNodesAndEdges: (params?: { nodes?: NodeType[]; edges?: EdgeType[] }) => void;