diff --git a/examples/svelte/src/routes/overview/+page.svelte b/examples/svelte/src/routes/overview/+page.svelte index 27aac391..31a8d459 100644 --- a/examples/svelte/src/routes/overview/+page.svelte +++ b/examples/svelte/src/routes/overview/+page.svelte @@ -144,9 +144,21 @@ on:connectend={(event) => console.log('on connect end', event)} on:paneclick={(event) => console.log('on pane click', event)} on:panecontextmenu={(event) => { - event.preventDefault(); console.log('on pane contextmenu', event); }} + on:nodedrag={(event) => { + console.log('on node drag', event); + }} + on:nodedragstart={(event) => { + console.log('on node drag start', event); + }} + on:nodedragstop={(event) => { + console.log('on node drag stop', event); + }} + on:nodecontextmenu={(event) => { + event.detail.event.preventDefault(); + console.log('on node contextmenu', event); + }} > diff --git a/packages/svelte/CHANGELOG.md b/packages/svelte/CHANGELOG.md index 491aa21f..30da979c 100644 --- a/packages/svelte/CHANGELOG.md +++ b/packages/svelte/CHANGELOG.md @@ -1,3 +1,8 @@ +## 0.0.21 + +- add `on:nodedragstart`, `on:nodedrag` and `on:nodedragstop` +- add `on:nodecontextmenu` + ## 0.0.20 - [breaking change] use same convention for all custom events: Always pass the original event if possible and additional data diff --git a/packages/svelte/src/lib/actions/drag/index.ts b/packages/svelte/src/lib/actions/drag/index.ts index 5a0d4436..276e319c 100644 --- a/packages/svelte/src/lib/actions/drag/index.ts +++ b/packages/svelte/src/lib/actions/drag/index.ts @@ -1,22 +1,28 @@ import { get } from 'svelte/store'; -import { XYDrag } from '@xyflow/system'; +import { XYDrag, type OnDrag } from '@xyflow/system'; import type { SvelteFlowStore } from '$lib/store/types'; -type UseDragParams = { +export type UseDragParams = { store: SvelteFlowStore; disabled?: boolean; noDragClass?: string; handleSelector?: string; nodeId?: string; isSelectable?: boolean; + onDrag?: OnDrag; + onDragStart?: OnDrag; + onDragStop?: OnDrag; }; export default function drag(domNode: Element, params: UseDragParams) { + const { store, onDrag, onDragStart, onDragStop } = params; const dragInstance = XYDrag({ domNode, + onDrag, + onDragStart, + onDragStop, getStoreItems: () => { - const { store } = params; const snapGrid = get(store.snapGrid); return { diff --git a/packages/svelte/src/lib/components/NodeWrapper/NodeWrapper.svelte b/packages/svelte/src/lib/components/NodeWrapper/NodeWrapper.svelte index 17c8e4ce..2be5c098 100644 --- a/packages/svelte/src/lib/components/NodeWrapper/NodeWrapper.svelte +++ b/packages/svelte/src/lib/components/NodeWrapper/NodeWrapper.svelte @@ -97,6 +97,15 @@ disabled: false, handleSelector: dragHandle, noDragClass: 'nodrag', + onDrag: (event, _, node, nodes) => { + dispatch('nodedrag', { event, node, nodes }); + }, + onDragStart: (event, _, node, nodes) => { + dispatch('nodedragstart', { event, node, nodes }); + }, + onDragStop: (event, _, node, nodes) => { + dispatch('nodedragstop', { event, node, nodes }); + }, store }} bind:this={nodeRef} @@ -115,6 +124,7 @@ on:mouseenter={(event) => dispatchEvent('nodemouseenter', event)} on:mouseleave={(event) => dispatchEvent('nodemouseleave', event)} on:mousemove={(event) => dispatchEvent('nodemousemove', event)} + on:contextmenu={(event) => dispatchEvent('nodecontextmenu', event)} > {/each} diff --git a/packages/svelte/src/lib/container/SvelteFlow/SvelteFlow.svelte b/packages/svelte/src/lib/container/SvelteFlow/SvelteFlow.svelte index bb359302..0b2fac70 100644 --- a/packages/svelte/src/lib/container/SvelteFlow/SvelteFlow.svelte +++ b/packages/svelte/src/lib/container/SvelteFlow/SvelteFlow.svelte @@ -154,6 +154,10 @@ on:connectstart on:connect on:connectend + on:nodedragstart + on:nodedrag + on:nodedragstop + on:nodecontextmenu /> diff --git a/packages/svelte/src/lib/container/SvelteFlow/types.ts b/packages/svelte/src/lib/container/SvelteFlow/types.ts index 97d5a3a9..1c2f6ebb 100644 --- a/packages/svelte/src/lib/container/SvelteFlow/types.ts +++ b/packages/svelte/src/lib/container/SvelteFlow/types.ts @@ -12,7 +12,8 @@ import type { CoordinateExtent, PanOnScrollMode, IsValidConnection, - HandleType + HandleType, + NodeBase } from '@xyflow/system'; import type { Edge, Node, NodeTypes, KeyDefinition, EdgeTypes } from '$lib/types'; @@ -74,4 +75,8 @@ export type SvelteFlowProps = DOMAttributes & { 'on:connectend'?: CustomEvent<{ event: MouseEvent | TouchEvent }>; 'on:paneclick'?: CustomEvent<{ event: MouseEvent | TouchEvent }>; 'on:panecontextmenu'?: CustomEvent<{ event: MouseEvent }>; + 'on:nodedragstart'?: CustomEvent<{ event: MouseEvent; node: NodeBase; nodes: NodeBase[] }>; + 'on:nodedrag'?: CustomEvent<{ event: MouseEvent; node: NodeBase; nodes: NodeBase[] }>; + 'on:nodedragstop'?: CustomEvent<{ event: MouseEvent; node: NodeBase; nodes: NodeBase[] }>; + 'on:nodecontextmenu'?: CustomEvent<{ event: MouseEvent; node: NodeBase }>; };