diff --git a/examples/react/src/examples/DragNDrop/index.tsx b/examples/react/src/examples/DragNDrop/index.tsx
index 16e9737e..a3e09d8d 100644
--- a/examples/react/src/examples/DragNDrop/index.tsx
+++ b/examples/react/src/examples/DragNDrop/index.tsx
@@ -49,9 +49,9 @@ const DnDFlow = () => {
if (reactFlowInstance) {
const type = event.dataTransfer.getData('application/reactflow');
- const position = reactFlowInstance.project({
+ const position = reactFlowInstance.screenToFlowCoordinate({
x: event.clientX,
- y: event.clientY - 40,
+ y: event.clientY,
});
const newNode: Node = {
id: getId(),
diff --git a/examples/svelte/src/components/Header/Header.svelte b/examples/svelte/src/components/Header/Header.svelte
index 26b26e1e..e842824e 100644
--- a/examples/svelte/src/components/Header/Header.svelte
+++ b/examples/svelte/src/components/Header/Header.svelte
@@ -16,7 +16,8 @@
'usesvelteflow',
'useupdatenodeinternals',
'validation',
- 'intersections'
+ 'intersections',
+ 'add-node-on-drop'
];
const onChange = (event: Event) => {
diff --git a/examples/svelte/src/routes/add-node-on-drop/+page.svelte b/examples/svelte/src/routes/add-node-on-drop/+page.svelte
new file mode 100644
index 00000000..338f964f
--- /dev/null
+++ b/examples/svelte/src/routes/add-node-on-drop/+page.svelte
@@ -0,0 +1,9 @@
+
+
+
+
+
+
diff --git a/examples/svelte/src/routes/add-node-on-drop/Flow.svelte b/examples/svelte/src/routes/add-node-on-drop/Flow.svelte
new file mode 100644
index 00000000..cd12c1a4
--- /dev/null
+++ b/examples/svelte/src/routes/add-node-on-drop/Flow.svelte
@@ -0,0 +1,115 @@
+
+
+
+
+
+ {
+ // Memorize the nodeId you start draggin a connection line from a node
+ connectingNodeId = nodeId;
+ }}
+ on:connectend={handleConnectEnd}
+ />
+
+
+
diff --git a/packages/react/src/container/Viewport/index.tsx b/packages/react/src/container/Viewport/index.tsx
index ab10bada..b0de6954 100644
--- a/packages/react/src/container/Viewport/index.tsx
+++ b/packages/react/src/container/Viewport/index.tsx
@@ -2,7 +2,6 @@ import type { ReactNode } from 'react';
import { useStore } from '../../hooks/useStore';
import type { ReactFlowState } from '../../types';
-import { Viewport } from '@xyflow/system';
const selector = (s: ReactFlowState) => `translate(${s.transform[0]}px,${s.transform[1]}px) scale(${s.transform[2]})`;
@@ -10,7 +9,7 @@ type ViewportProps = {
children: ReactNode;
};
-function Viewport({ children }: ViewportProps) {
+export default function Viewport({ children }: ViewportProps) {
const transform = useStore(selector);
return (
@@ -19,5 +18,3 @@ function Viewport({ children }: ViewportProps) {
);
}
-
-export default Viewport;
diff --git a/packages/react/src/hooks/useReactFlow.ts b/packages/react/src/hooks/useReactFlow.ts
index 45a8dbe1..f66ac38b 100644
--- a/packages/react/src/hooks/useReactFlow.ts
+++ b/packages/react/src/hooks/useReactFlow.ts
@@ -164,6 +164,8 @@ export default function useReactFlow(): ReactFlo
}
}
}
+
+ return { deletedNodes: matchingNodes, deletedEdges: matchingEdges };
}, []);
const getNodeRect = useCallback(
diff --git a/packages/react/src/hooks/useViewportHelper.ts b/packages/react/src/hooks/useViewportHelper.ts
index aded1f17..1872d414 100644
--- a/packages/react/src/hooks/useViewportHelper.ts
+++ b/packages/react/src/hooks/useViewportHelper.ts
@@ -1,5 +1,11 @@
import { useMemo } from 'react';
-import { pointToRendererPoint, getTransformForBounds, fitView, type XYPosition } from '@xyflow/system';
+import {
+ pointToRendererPoint,
+ getTransformForBounds,
+ fitView,
+ type XYPosition,
+ rendererPointToPoint,
+} from '@xyflow/system';
import { useStoreApi, useStore } from '../hooks/useStore';
import type { ViewportHelperFunctions, ReactFlowState } from '../types';
@@ -85,6 +91,36 @@ const useViewportHelper = (): ViewportHelperFunctions => {
const { transform, snapToGrid, snapGrid } = store.getState();
return pointToRendererPoint(position, transform, snapToGrid, snapGrid);
},
+ screenToFlowCoordinate: (position: XYPosition) => {
+ const { transform, snapToGrid, snapGrid, domNode } = store.getState();
+ if (domNode) {
+ const { x: domX, y: domY } = domNode.getBoundingClientRect();
+
+ const correctedPosition = {
+ x: position.x - domX,
+ y: position.y - domY,
+ };
+
+ return pointToRendererPoint(correctedPosition, transform, snapToGrid, snapGrid || [1, 1]);
+ }
+
+ return { x: 0, y: 0 };
+ },
+ flowToScreenCoordinate: (position: XYPosition) => {
+ const { transform, domNode } = store.getState();
+ if (domNode) {
+ const { x: domX, y: domY } = domNode.getBoundingClientRect();
+
+ const rendererPosition = rendererPointToPoint(position, transform);
+
+ return {
+ x: rendererPosition.x + domX,
+ y: rendererPosition.y + domY,
+ };
+ }
+
+ return { x: 0, y: 0 };
+ },
viewportInitialized: panZoomInitialized,
};
}, [panZoomInitialized]);
diff --git a/packages/react/src/types/general.ts b/packages/react/src/types/general.ts
index 8108c3dd..2b2945a6 100644
--- a/packages/react/src/types/general.ts
+++ b/packages/react/src/types/general.ts
@@ -55,5 +55,7 @@ export type ViewportHelperFunctions = {
setCenter: SetCenter;
fitBounds: FitBounds;
project: Project;
+ screenToFlowCoordinate: Project;
+ flowToScreenCoordinate: Project;
viewportInitialized: boolean;
};
diff --git a/packages/react/src/types/instance.ts b/packages/react/src/types/instance.ts
index 239d339f..531e518e 100644
--- a/packages/react/src/types/instance.ts
+++ b/packages/react/src/types/instance.ts
@@ -28,7 +28,10 @@ export namespace Instance {
export type GetEdge = (id: string) => Edge | undefined;
export type AddEdges = (payload: Edge[] | Edge) => void;
export type ToObject = () => ReactFlowJsonObject;
- export type DeleteElements = ({ nodes, edges }: DeleteElementsOptions) => void;
+ export type DeleteElements = ({ nodes, edges }: DeleteElementsOptions) => {
+ deletedNodes: Node[];
+ deletedEdges: Edge[];
+ };
export type GetIntersectingNodes = (
node: (Partial> & { id: Node['id'] }) | Rect,
partially?: boolean,
diff --git a/packages/svelte/src/lib/components/ConnectionLine/ConnectionLine.svelte b/packages/svelte/src/lib/components/ConnectionLine/ConnectionLine.svelte
index eb30d3f7..904a45d3 100644
--- a/packages/svelte/src/lib/components/ConnectionLine/ConnectionLine.svelte
+++ b/packages/svelte/src/lib/components/ConnectionLine/ConnectionLine.svelte
@@ -12,11 +12,11 @@
{#if $connection.path}
-
+
{#if !isCustomComponent}
-
+
{/if}
diff --git a/packages/svelte/src/lib/components/EdgeWrapper/EdgeWrapper.svelte b/packages/svelte/src/lib/components/EdgeWrapper/EdgeWrapper.svelte
index 81d35e49..7d609447 100644
--- a/packages/svelte/src/lib/components/EdgeWrapper/EdgeWrapper.svelte
+++ b/packages/svelte/src/lib/components/EdgeWrapper/EdgeWrapper.svelte
@@ -1,3 +1,5 @@
+
+