diff --git a/core/block_svg.ts b/core/block_svg.ts index 121ffa45f..b419122ba 100644 --- a/core/block_svg.ts +++ b/core/block_svg.ts @@ -1515,13 +1515,14 @@ export class BlockSvg * or an insertion marker. * * @param sourceConnection The connection on the moving block's stack. - * @param targetConnection The connection that should stay stationary as this - * block is positioned. + * @param originalOffsetToTarget The connection original offset to the target connection + * @param originalOffsetInBlock The connection original offset in its block * @internal */ positionNearConnection( sourceConnection: RenderedConnection, - targetConnection: RenderedConnection, + originalOffsetToTarget: {x: number; y: number}, + originalOffsetInBlock: Coordinate, ) { // We only need to position the new block if it's before the existing one, // otherwise its position is set by the previous block. @@ -1529,8 +1530,12 @@ export class BlockSvg sourceConnection.type === ConnectionType.NEXT_STATEMENT || sourceConnection.type === ConnectionType.INPUT_VALUE ) { - const dx = targetConnection.x - sourceConnection.x; - const dy = targetConnection.y - sourceConnection.y; + // First move the block to match the orginal target connection position + let dx = originalOffsetToTarget.x; + let dy = originalOffsetToTarget.y; + // Then adjust its position according to the connection resize + dx += originalOffsetInBlock.x - sourceConnection.getOffsetInBlock().x; + dy += originalOffsetInBlock.y - sourceConnection.getOffsetInBlock().y; this.moveBy(dx, dy); } diff --git a/core/insertion_marker_manager.ts b/core/insertion_marker_manager.ts index 3e0af5618..e9d04f728 100644 --- a/core/insertion_marker_manager.ts +++ b/core/insertion_marker_manager.ts @@ -611,12 +611,22 @@ export class InsertionMarkerManager { insertionMarker.queueRender(); renderManagement.triggerQueuedRenders(); - // Position so that the existing block doesn't move. - insertionMarker.positionNearConnection(imConn, closest); // Connect() also renders the insertion marker. imConn.connect(closest); + const originalOffsetToTarget = { + x: closest.x - imConn.x, + y: closest.y - imConn.y, + }; + const originalOffsetInBlock = imConn.getOffsetInBlock().clone(); + const imConnConst = imConn; renderManagement.finishQueuedRenders().then(() => { + // Position so that the existing block doesn't move. + insertionMarker?.positionNearConnection( + imConnConst, + originalOffsetToTarget, + originalOffsetInBlock, + ); insertionMarker?.getSvgRoot().setAttribute('visibility', 'visible'); });