From 1c8e8bb0f3909a3d98d9e5cff0efe032ef1ccd67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1rk=20Tolm=C3=A1cs?= Date: Mon, 9 Feb 2026 13:03:05 +0100 Subject: [PATCH] fix: Arrow update when cloned (#10747) * fix: Arrow update when cloned Signed-off-by: Mark Tolmacs * feat(editor): reduce binding gap (#10739) * feat(editor): reduce binding gap to 7px * feat(editor): reduce binding gap to 5px * feat(editor): reduce binding gap to 3px * go back to 5px * update tests * chore: Refactor Signed-off-by: Mark Tolmacs * fix: Align focus points Signed-off-by: Mark Tolmacs --------- Signed-off-by: Mark Tolmacs Co-authored-by: David Luzar <5153846+dwelle@users.noreply.github.com> --- packages/element/src/align.ts | 1 + packages/element/src/binding.ts | 12 ++++++++++-- packages/excalidraw/components/App.tsx | 4 +++- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/packages/element/src/align.ts b/packages/element/src/align.ts index 3068aee8d1..17ebc3a97c 100644 --- a/packages/element/src/align.ts +++ b/packages/element/src/align.ts @@ -43,6 +43,7 @@ export const alignElements = ( // update bound elements updateBoundElements(element, scene, { simultaneouslyUpdated: group, + indirectArrowUpdate: true, }); return updatedEle; }); diff --git a/packages/element/src/binding.ts b/packages/element/src/binding.ts index afc67d7afd..d3c4003288 100644 --- a/packages/element/src/binding.ts +++ b/packages/element/src/binding.ts @@ -1081,6 +1081,7 @@ export const updateBoundElements = ( options?: { simultaneouslyUpdated?: readonly ExcalidrawElement[]; changedElements?: Map; + indirectArrowUpdate?: boolean; }, ) => { if (!isBindableElement(changedElement)) { @@ -1100,7 +1101,7 @@ export const updateBoundElements = ( }); } - boundElementsVisitor(elementsMap, changedElement, (element) => { + const visitor = (element: ExcalidrawElement | undefined) => { if (!isArrowElement(element) || element.isDeleted) { return; } @@ -1172,7 +1173,14 @@ export const updateBoundElements = ( if (boundText && !boundText.isDeleted) { handleBindTextResize(element, scene, false); } - }); + }; + + boundElementsVisitor(elementsMap, changedElement, visitor); + + if (options?.indirectArrowUpdate) { + boundElementsVisitor(elementsMap, changedElement, visitor); + boundElementsVisitor(elementsMap, changedElement, visitor); + } }; const updateArrowBindings = ( diff --git a/packages/excalidraw/components/App.tsx b/packages/excalidraw/components/App.tsx index 88871adde2..d3b12720ca 100644 --- a/packages/excalidraw/components/App.tsx +++ b/packages/excalidraw/components/App.tsx @@ -9595,7 +9595,9 @@ class App extends React.Component { isBindableElement(element) && element.boundElements?.some((other) => other.type === "arrow") ) { - updateBoundElements(element, this.scene); + updateBoundElements(element, this.scene, { + indirectArrowUpdate: true, + }); } });