diff --git a/packages/element/src/dragElements.ts b/packages/element/src/dragElements.ts index 4b17ba20c3..48678940bd 100644 --- a/packages/element/src/dragElements.ts +++ b/packages/element/src/dragElements.ts @@ -95,7 +95,7 @@ export const dragSelectedElements = ( origElements.push(origElement); } - const adjustedOffset = calculateOffset( + const adjustedOffset = calculateDragOffset( getCommonBounds(origElements), offset, snapOffset, @@ -125,7 +125,7 @@ export const dragSelectedElements = ( }); }; -const calculateOffset = ( +export const calculateDragOffset = ( commonBounds: Bounds, dragOffset: { x: number; y: number }, snapOffset: { x: number; y: number }, diff --git a/packages/excalidraw/components/App.tsx b/packages/excalidraw/components/App.tsx index c74ef73b52..8a1a841971 100644 --- a/packages/excalidraw/components/App.tsx +++ b/packages/excalidraw/components/App.tsx @@ -240,6 +240,7 @@ import { StoreDelta, type ApplyToOptions, positionElementsOnGrid, + calculateDragOffset, } from "@excalidraw/element"; import type { LocalPoint, Radians } from "@excalidraw/math"; @@ -8782,14 +8783,20 @@ class App extends React.Component { ); }); + const { x: diffX, y: diffY } = calculateDragOffset( + getCommonBounds(elementsWithDuplicates), + dragOffset, + snapOffset, + event[KEYS.CTRL_OR_CMD] ? null : this.getEffectiveGridSize(), + ); const mappedClonedElements = elementsWithDuplicates.map((el) => { if (idsOfElementsToDuplicate.has(el.id)) { const origEl = pointerDownState.originalElements.get(el.id); if (origEl) { return newElementWith(el, { - x: origEl.x, - y: origEl.y, + x: origEl.x + diffX, + y: origEl.y + diffY, }); } }