refector viewport to use signals

This commit is contained in:
peterkogo
2024-12-06 15:35:43 +01:00
parent f29898f0bd
commit 4fcde6f6bf
19 changed files with 87 additions and 90 deletions
@@ -45,7 +45,7 @@
children
}: PaneProps = $props();
const { viewport, nodes, edges } = store;
const { nodes, edges } = store;
// svelte-ignore non_reactive_update
let container: HTMLDivElement;
@@ -131,7 +131,7 @@
selectedNodes = getNodesInside(
store.nodeLookup,
nextUserSelectRect,
[$viewport.x, $viewport.y, $viewport.zoom],
[store.viewport.x, store.viewport.y, store.viewport.zoom],
store.selectionMode === SelectionMode.Partial,
true
);
@@ -1,5 +1,4 @@
<script lang="ts">
import { get } from 'svelte/store';
import { onMount, getContext, setContext } from 'svelte';
import cc from 'classcat';
import { PanOnScrollMode } from '@xyflow/system';
@@ -79,12 +78,9 @@
props,
container
});
const { viewport } = store;
const initialViewport = props.initialViewport ?? get(viewport);
store.syncNodeStores(props.nodes);
store.syncEdgeStores(props.edges);
store.syncViewport(props.viewport);
const providerContext = getContext<ProviderContext>(key);
if (providerContext) {
@@ -128,7 +124,6 @@
/>
<Zoom
{store}
{initialViewport}
{onMoveStart}
{onMove}
{onMoveEnd}
@@ -142,7 +137,7 @@
{paneClickDistance}
>
<Pane {store} {onpaneclick} {onpanecontextmenu} {panOnDrag} {selectionOnDrag}>
<ViewportComponent viewport={$viewport}>
<ViewportComponent {store}>
<EdgeRenderer
{store}
{onedgeclick}
@@ -1,13 +1,14 @@
<script lang="ts">
import type { Viewport } from '@xyflow/system';
import type { SvelteFlowStore } from '$lib/store/types';
import type { Snippet } from 'svelte';
let { viewport, children }: { viewport: Viewport; children: Snippet } = $props();
let { store, children }: { store: SvelteFlowStore; children: Snippet } = $props();
</script>
<div
class="svelte-flow__viewport xyflow__viewport"
style="transform: translate({viewport.x}px, {viewport.y}px) scale({viewport.zoom})"
style="transform: translate({store.viewport.x}px, {store.viewport.y}px) scale({store.viewport
.zoom})"
>
{@render children()}
</div>
@@ -8,7 +8,6 @@
let {
store,
initialViewport = { x: 0, y: 0, zoom: 1 },
onMoveStart,
onMove,
onMoveEnd,
@@ -27,7 +26,10 @@
let panOnScrollActive = $derived(store.panActivationKeyPressed || panOnScroll);
const onTransformChange = (transform: Transform) =>
store.viewport.set({ x: transform[0], y: transform[1], zoom: transform[2] });
(store.viewport = { x: transform[0], y: transform[1], zoom: transform[2] });
// We extract the initial value by destructuring
const { viewport: initialViewport } = store;
onMount(() => {
store.viewportInitialized = true;
@@ -1,10 +1,9 @@
import type { SvelteFlowStore } from '$lib/store/types';
import type { OnMoveStart, OnMove, OnMoveEnd, PanOnScrollMode, Viewport } from '@xyflow/system';
import type { OnMoveStart, OnMove, OnMoveEnd, PanOnScrollMode } from '@xyflow/system';
import type { Snippet } from 'svelte';
export type ZoomProps = {
store: SvelteFlowStore;
initialViewport?: Viewport;
panOnScrollMode: PanOnScrollMode;
onMove?: OnMove;
onMoveStart?: OnMoveStart;