diff --git a/src/element/textWysiwyg.tsx b/src/element/textWysiwyg.tsx index 4d07f4be4..f1d88ff4f 100644 --- a/src/element/textWysiwyg.tsx +++ b/src/element/textWysiwyg.tsx @@ -65,7 +65,8 @@ const getTransform = ( if (height > maxHeight && zoom.value !== 1) { translateY = (maxHeight * (zoom.value - 1)) / 2; } - return `translate(${translateX}px, ${translateY}px) scale(${zoom.value}) rotate(${degree}deg) translate(${offsetX}px, 0px)`; + const offset = offsetX !== 0 ? ` translate(${offsetX}px, 0px)` : ""; + return `translate(${translateX}px, ${translateY}px) scale(${zoom.value}) rotate(${degree}deg)${offset}`; }; const originalContainerCache: { @@ -278,6 +279,7 @@ export const textWysiwyg = ({ textElementWidth += 0.5; transformWidth += 0.5; } + // Horizontal offset in case updatedTextElement has a non-WYSIWYG subtype const offWidth = container ? Math.min( @@ -293,7 +295,11 @@ export const textWysiwyg = ({ ? offWidth / 2 : 0; const { width: w, height: h } = updatedTextElement; - + const transformOrigin = + updatedTextElement.width !== eMetrics.width || + updatedTextElement.height !== eMetrics.height + ? { transformOrigin: `${w / 2}px ${h / 2}px` } + : {}; let lineHeight = updatedTextElement.lineHeight; // In Safari the font size gets rounded off when rendering hence calculating the line height by rounding off font size @@ -315,7 +321,7 @@ export const textWysiwyg = ({ height: `${textElementHeight}px`, left: `${viewportX}px`, top: `${viewportY}px`, - transformOrigin: `${w / 2}px ${h / 2}px`, + ...transformOrigin, transform: getTransform( offsetX, transformWidth, diff --git a/src/tests/__snapshots__/linearElementEditor.test.tsx.snap b/src/tests/__snapshots__/linearElementEditor.test.tsx.snap index 0476a2823..41e9f2b12 100644 --- a/src/tests/__snapshots__/linearElementEditor.test.tsx.snap +++ b/src/tests/__snapshots__/linearElementEditor.test.tsx.snap @@ -5,7 +5,7 @@ exports[`Test Linear Elements > Test bound text element > should match styles fo class="excalidraw-wysiwyg" data-type="wysiwyg" dir="auto" - style="position: absolute; display: inline-block; min-height: 1em; backface-visibility: hidden; margin: 0px; padding: 0px; border: 0px; outline: 0; resize: none; background: transparent; overflow: hidden; z-index: var(--zIndex-wysiwyg); word-break: break-word; white-space: pre-wrap; overflow-wrap: break-word; box-sizing: content-box; width: 10.5px; height: 25px; left: 35px; top: 7.5px; transform-origin: 5px 12.5px; transform: translate(0px, 0px) scale(1) rotate(0deg) translate(0px, 0px); text-align: center; vertical-align: middle; color: rgb(30, 30, 30); opacity: 1; filter: var(--theme-filter); max-height: 992.5px; font: Emoji 20px 20px; line-height: 1.25; font-family: Virgil, Segoe UI Emoji;" + style="position: absolute; display: inline-block; min-height: 1em; backface-visibility: hidden; margin: 0px; padding: 0px; border: 0px; outline: 0; resize: none; background: transparent; overflow: hidden; z-index: var(--zIndex-wysiwyg); word-break: break-word; white-space: pre-wrap; overflow-wrap: break-word; box-sizing: content-box; width: 10.5px; height: 25px; left: 35px; top: 7.5px; transform: translate(0px, 0px) scale(1) rotate(0deg); text-align: center; vertical-align: middle; color: rgb(30, 30, 30); opacity: 1; filter: var(--theme-filter); max-height: 992.5px; font: Emoji 20px 20px; line-height: 1.25; font-family: Virgil, Segoe UI Emoji;" tabindex="0" wrap="off" />