From b8d1b8a5bd296026a8404577c39e9890b5c6a241 Mon Sep 17 00:00:00 2001 From: Mark Tolmacs Date: Thu, 18 Sep 2025 16:16:01 +0200 Subject: [PATCH] fix:Overlap inside binding --- packages/excalidraw/components/App.tsx | 32 +++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/packages/excalidraw/components/App.tsx b/packages/excalidraw/components/App.tsx index 14562a3a0..35bf16c41 100644 --- a/packages/excalidraw/components/App.tsx +++ b/packages/excalidraw/components/App.tsx @@ -242,6 +242,8 @@ import { calculateFixedPointForNonElbowArrowBinding, bindOrUnbindBindingElement, mutateElement, + getElementBounds, + doBoundsIntersect, } from "@excalidraw/element"; import type { GlobalPoint, LocalPoint, Radians } from "@excalidraw/math"; @@ -1078,6 +1080,31 @@ class App extends React.Component { } }; + let isOverlapping = false; + if (this.state.selectedLinearElement?.selectedPointsIndices) { + const elementsMap = this.scene.getNonDeletedElementsMap(); + const startDragged = + this.state.selectedLinearElement.selectedPointsIndices.includes(0); + const endDragged = + this.state.selectedLinearElement.selectedPointsIndices.includes( + arrow.points.length - 1, + ); + const startElement = startDragged + ? hoveredElement + : arrow.startBinding && elementsMap.get(arrow.startBinding.elementId); + const endElement = endDragged + ? hoveredElement + : arrow.endBinding && elementsMap.get(arrow.endBinding.elementId); + const startBounds = + startElement && getElementBounds(startElement, elementsMap); + const endBounds = endElement && getElementBounds(endElement, elementsMap); + isOverlapping = !!( + startBounds && + endBounds && + doBoundsIntersect(startBounds, endBounds) + ); + } + if ( !hoveredElement || (this.previousHoveredBindableElement && @@ -1099,7 +1126,10 @@ class App extends React.Component { } this.previousHoveredBindableElement = null; - } else if (!this.bindModeHandler) { + } else if ( + !this.bindModeHandler && + (!this.state.newElement || !arrow.startBinding || isOverlapping) + ) { // We are hovering a bindable element this.bindModeHandler = setTimeout(effector, BIND_MODE_TIMEOUT); }