From e2961bfa8cb6cf982a5b3b6d8b9eeb6d25724850 Mon Sep 17 00:00:00 2001 From: moklick Date: Wed, 1 Mar 2023 17:28:59 +0100 Subject: [PATCH] feat(svelte): add event handlers and props, rename class names --- packages/svelte/src/lib/actions/zoom/index.ts | 28 ++++-- .../lib/components/BaseEdge/BaseEdge.svelte | 8 +- .../ConnectionLine/ConnectionLine.svelte | 14 +-- .../EdgeLabelRenderer.svelte | 2 +- .../components/EdgeWrapper/EdgeWrapper.svelte | 22 +++-- .../src/lib/components/Handle/Handle.svelte | 18 +++- .../src/lib/components/Handle/handler.ts | 16 ++-- .../svelte/src/lib/components/Handle/utils.ts | 4 +- .../NodeSelection/NodeSelection.svelte | 2 +- .../components/NodeWrapper/NodeWrapper.svelte | 30 ++++--- .../src/lib/components/NodeWrapper/types.ts | 1 + .../lib/components/Selection/Selection.svelte | 8 +- .../lib/components/nodes/DefaultNode.svelte | 5 +- .../src/lib/components/nodes/InputNode.svelte | 16 +++- .../lib/components/nodes/OutputNode.svelte | 16 +++- .../EdgeRenderer/EdgeRenderer.svelte | 6 +- .../NodeRenderer/NodeRenderer.svelte | 17 +++- .../svelte/src/lib/container/Pane/Pane.svelte | 23 +++-- .../src/lib/container/Panel/Panel.svelte | 14 +-- .../container/SvelteFlow/SvelteFlow.svelte | 90 +++++++++++++++---- .../src/lib/container/SvelteFlow/index.ts | 2 +- .../src/lib/container/SvelteFlow/types.ts | 42 +++++++-- .../lib/container/Viewport/Viewport.svelte | 4 +- .../svelte/src/lib/container/Zoom/Zoom.svelte | 11 ++- packages/svelte/src/lib/index.ts | 14 +-- .../lib/plugins/Background/Background.svelte | 4 +- .../lib/plugins/Controls/ControlButton.svelte | 6 +- .../src/lib/plugins/Controls/Controls.svelte | 10 +-- .../svelte/src/lib/plugins/Controls/index.ts | 2 +- .../svelte/src/lib/plugins/Controls/types.ts | 8 +- .../src/lib/plugins/Minimap/Minimap.svelte | 6 +- .../lib/plugins/Minimap/MinimapNode.svelte | 2 +- packages/svelte/src/lib/store/index.ts | 55 +++++++++--- .../svelte/src/lib/store/initial-store.ts | 32 ++++--- packages/svelte/src/lib/store/types.ts | 6 +- packages/svelte/src/lib/types/edges.ts | 3 + packages/svelte/src/routes/+page.svelte | 25 +++++- packages/svelte/tsconfig.json | 1 + 38 files changed, 410 insertions(+), 163 deletions(-) diff --git a/packages/svelte/src/lib/actions/zoom/index.ts b/packages/svelte/src/lib/actions/zoom/index.ts index d4c49244..ddfcc3cd 100644 --- a/packages/svelte/src/lib/actions/zoom/index.ts +++ b/packages/svelte/src/lib/actions/zoom/index.ts @@ -2,7 +2,8 @@ import type { Writable } from 'svelte/store'; import { select } from 'd3-selection'; import { zoom as d3Zoom, zoomIdentity, type D3ZoomEvent } from 'd3-zoom'; -import type { D3SelectionInstance, D3ZoomInstance, Transform } from '@reactflow/system'; +import type { D3SelectionInstance, D3ZoomInstance, Transform, Viewport } from '@reactflow/system'; +import { clamp } from '@reactflow/utils'; const isWrappedWithClass = (event: any, className: string | undefined) => event.target.closest(`.${className}`); @@ -14,7 +15,8 @@ function filter(event: any, params: ZoomParams): boolean { if ( event.button === 1 && event.type === 'mousedown' && - (isWrappedWithClass(event, 'react-flow__node') || isWrappedWithClass(event, 'react-flow__edge')) + (isWrappedWithClass(event, 'svelte-flow__node') || + isWrappedWithClass(event, 'svelte-flow__edge')) ) { return true; } @@ -80,15 +82,27 @@ type ZoomParams = { transform: Writable; selecting: boolean; d3: Writable<{ zoom: D3ZoomInstance | null; selection: D3SelectionInstance | null }>; + minZoom: number; + maxZoom: number; + initialViewport: Viewport; }; export default function zoom(domNode: Element, params: ZoomParams) { - const { transform, d3 } = params; - const d3ZoomInstance = d3Zoom(); + const { transform, d3, minZoom, maxZoom, initialViewport } = params; + const d3ZoomInstance = d3Zoom().scaleExtent([minZoom, maxZoom]); const selection = select(domNode).call(d3ZoomInstance); + + const updatedTransform = zoomIdentity + .translate(initialViewport.x, initialViewport.y) + .scale(clamp(initialViewport.zoom, minZoom, maxZoom)); + const d3ZoomHandler = selection.on('wheel.zoom'); - d3ZoomInstance.transform(selection, zoomIdentity); + d3ZoomInstance.on('zoom', (event: D3ZoomEvent) => { + transform.set([event.transform.x, event.transform.y, event.transform.k]); + }); + + d3ZoomInstance.transform(selection, updatedTransform); selection.on('wheel.zoom', function (event: any, d: any) { if (isWrappedWithClass(event, 'nowheel')) { @@ -104,10 +118,6 @@ export default function zoom(domNode: Element, params: ZoomParams) { selection }); - d3ZoomInstance.on('zoom', (event: D3ZoomEvent) => { - transform.set([event.transform.x, event.transform.y, event.transform.k]); - }); - d3ZoomInstance.filter((event: any) => filter(event, params)); return { diff --git a/packages/svelte/src/lib/components/BaseEdge/BaseEdge.svelte b/packages/svelte/src/lib/components/BaseEdge/BaseEdge.svelte index e482e6cb..2bf450d1 100644 --- a/packages/svelte/src/lib/components/BaseEdge/BaseEdge.svelte +++ b/packages/svelte/src/lib/components/BaseEdge/BaseEdge.svelte @@ -11,7 +11,7 @@ export let interactionWidth: $$Props['interactionWidth'] = 20; - + {#if interactionWidth} {/if} {#if label}
{label} @@ -35,7 +35,7 @@ {/if} diff --git a/packages/svelte/src/lib/components/nodes/DefaultNode.svelte b/packages/svelte/src/lib/components/nodes/DefaultNode.svelte index 99873347..b5b10297 100644 --- a/packages/svelte/src/lib/components/nodes/DefaultNode.svelte +++ b/packages/svelte/src/lib/components/nodes/DefaultNode.svelte @@ -16,6 +16,7 @@ export let selected: $$Props['selected'] = false; - + {data?.label} - + + diff --git a/packages/svelte/src/lib/components/nodes/InputNode.svelte b/packages/svelte/src/lib/components/nodes/InputNode.svelte index 5afc07f2..fd8f09b4 100644 --- a/packages/svelte/src/lib/components/nodes/InputNode.svelte +++ b/packages/svelte/src/lib/components/nodes/InputNode.svelte @@ -1,12 +1,20 @@ {data?.label} - + diff --git a/packages/svelte/src/lib/components/nodes/OutputNode.svelte b/packages/svelte/src/lib/components/nodes/OutputNode.svelte index 87d59bf5..73a42f98 100644 --- a/packages/svelte/src/lib/components/nodes/OutputNode.svelte +++ b/packages/svelte/src/lib/components/nodes/OutputNode.svelte @@ -1,12 +1,20 @@ {data?.label} - + diff --git a/packages/svelte/src/lib/container/EdgeRenderer/EdgeRenderer.svelte b/packages/svelte/src/lib/container/EdgeRenderer/EdgeRenderer.svelte index cf26c920..a60efbb8 100644 --- a/packages/svelte/src/lib/container/EdgeRenderer/EdgeRenderer.svelte +++ b/packages/svelte/src/lib/container/EdgeRenderer/EdgeRenderer.svelte @@ -5,14 +5,14 @@ const { edgesLayouted, width, height } = useStore(); - + {#each $edgesLayouted as edge (edge.id)} - + {/each}
+
{#each $nodes as node (node.id)} - + {/each}