From 571e4119aba6d2306d6384ca7c50a8cb2fc92402 Mon Sep 17 00:00:00 2001 From: Mark Tolmacs Date: Wed, 27 Aug 2025 15:43:48 +0200 Subject: [PATCH] Binding highlight rotation support + image support --- packages/element/src/shape.ts | 21 ++++++++++--------- .../excalidraw/renderer/interactiveScene.ts | 10 +++++++++ 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/packages/element/src/shape.ts b/packages/element/src/shape.ts index 03c3bec16e..ae5ae6918d 100644 --- a/packages/element/src/shape.ts +++ b/packages/element/src/shape.ts @@ -119,20 +119,21 @@ export class ShapeCache { embedsValidationStatus: EmbedsValidationStatus; }, ) => { - const shape = generateElementShape( - element, - ShapeCache.rg, - renderConfig || { - isExporting: false, - canvasBackgroundColor: COLOR_PALETTE.white, - embedsValidationStatus: null, - }, - ) as Drawable; + let shape = + (ShapeCache.get(element) as Drawable | null) || + (ShapeCache.rg.rectangle(0, 0, element.width, element.height, { + roughness: 0, + strokeWidth: 2, + }) as Drawable); + + // Clone the shape from the cache + shape = { + ...shape, + }; shape.options.fill = "transparent"; shape.options.stroke = appState.theme === THEME.DARK ? "#035da1" : "#6abdfc"; - shape.options.strokeWidth = shape.options.strokeWidth * 1.1; return shape; }; diff --git a/packages/excalidraw/renderer/interactiveScene.ts b/packages/excalidraw/renderer/interactiveScene.ts index cdeb20bbee..d90f43b234 100644 --- a/packages/excalidraw/renderer/interactiveScene.ts +++ b/packages/excalidraw/renderer/interactiveScene.ts @@ -254,12 +254,22 @@ const renderBindingHighlight = ( appState: InteractiveCanvasAppState, suggestedBinding: NonNullable, ) => { + const cx = + (suggestedBinding.x + suggestedBinding.width / 2 + appState.scrollX) * + window.devicePixelRatio; + const cy = + (suggestedBinding.y + suggestedBinding.height / 2 + appState.scrollY) * + window.devicePixelRatio; context.save(); + context.translate(cx, cy); + context.rotate(suggestedBinding.angle); + context.translate(-cx, -cy); context.translate( appState.scrollX + suggestedBinding.x, appState.scrollY + suggestedBinding.y, ); + context.scale(1 / window.devicePixelRatio, 1 / window.devicePixelRatio); const drawable = ShapeCache.generateBindableElementHighlight( suggestedBinding,