From d8e8d1aeda84ad1715fbe956e4236c0de2b9f554 Mon Sep 17 00:00:00 2001 From: Mark Tolmacs Date: Mon, 23 Feb 2026 11:58:54 +0100 Subject: [PATCH] fix: Distance calc with absolute distance Signed-off-by: Mark Tolmacs --- packages/element/src/collision.ts | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/packages/element/src/collision.ts b/packages/element/src/collision.ts index 992ef91551..ebcacf47b5 100644 --- a/packages/element/src/collision.ts +++ b/packages/element/src/collision.ts @@ -373,19 +373,19 @@ export const getHoveredElementForBinding = ( return candidateElements[0].element; } - const furthestDistance = candidateElements.sort( - (a, b) => a.distance - b.distance, + const closestDistance = candidateElements.sort( + (a, b) => Math.abs(a.distance) - Math.abs(b.distance), ); - const candidate = furthestDistance[furthestDistance.length - 1].element; - const [cx1, cy1, cx2, cy2] = getElementBounds(candidate, elementsMap); + const candidate = closestDistance[0]; + const [cx1, cy1, cx2, cy2] = getElementBounds(candidate.element, elementsMap); const candidateArea = Math.max( 0.00001, Math.abs(cx2 - cx1) * Math.abs(cy2 - cy1), ); - const overlaps = furthestDistance + const overlaps = closestDistance .map((c) => { - if (c.element === candidate) { + if (c.element === candidate.element) { return { ...c, overlapPercent: 0, relativeArea: 1 }; } @@ -410,7 +410,9 @@ export const getHoveredElementForBinding = ( }) .filter((c) => c.overlapPercent > 0.25 && c.relativeArea < 0.75); - return overlaps.length > 0 ? overlaps[0].element : candidate; + return candidate.distance >= 0 && overlaps.length > 0 + ? overlaps[0].element + : candidate.element; }; /**