@ -106,7 +106,7 @@ export const transformElements = (
updateBoundElements ( element ) ;
} else if ( transformHandleType ) {
resizeSingleElement (
pointerDownState . originalElements .get ( element . id ) as typeof element ,
pointerDownState . originalElements ,
shouldMaintainAspectRatio ,
element ,
transformHandleType ,
@ -397,7 +397,7 @@ const resizeSingleTextElement = (
} ;
export const resizeSingleElement = (
stateAtResizeStart: NonDeletedExcalidrawElement ,
originalElements: PointerDownState [ "originalElements" ] ,
shouldMaintainAspectRatio : boolean ,
element : NonDeletedExcalidrawElement ,
transformHandleDirection : TransformHandleDirection ,
@ -405,6 +405,7 @@ export const resizeSingleElement = (
pointerX : number ,
pointerY : number ,
) = > {
const stateAtResizeStart = originalElements . get ( element . id ) ! ;
// Gets bounds corners
const [ x1 , y1 , x2 , y2 ] = getResizedElementAbsoluteCoords (
stateAtResizeStart ,
@ -439,6 +440,9 @@ export const resizeSingleElement = (
let scaleX = atStartBoundsWidth / boundsCurrentWidth ;
let scaleY = atStartBoundsHeight / boundsCurrentHeight ;
let boundTextFont : { fontSize? : number ; baseline? : number } = { } ;
const boundTextElement = getBoundTextElement ( element ) ;
if ( transformHandleDirection . includes ( "e" ) ) {
scaleX = ( rotatedPointer [ 0 ] - startTopLeft [ 0 ] ) / boundsCurrentWidth ;
}
@ -452,8 +456,6 @@ export const resizeSingleElement = (
scaleY = ( startBottomRight [ 1 ] - rotatedPointer [ 1 ] ) / boundsCurrentHeight ;
}
const boundTextElement = getBoundTextElement ( element ) ;
// Linear elements dimensions differ from bounds dimensions
const eleInitialWidth = stateAtResizeStart . width ;
const eleInitialHeight = stateAtResizeStart . height ;
@ -484,10 +486,34 @@ export const resizeSingleElement = (
}
if ( boundTextElement ) {
const minWidth = getApproxMinLineWidth ( getFontString ( boundTextElement ) ) ;
const minHeight = getApproxMinLineHeight ( getFontString ( boundTextElement ) ) ;
eleNewWidth = Math . ceil ( Math . max ( eleNewWidth , minWidth ) ) ;
eleNewHeight = Math . ceil ( Math . max ( eleNewHeight , minHeight ) ) ;
const stateOfBoundTextElementAtResize = originalElements . get (
boundTextElement . id ,
) as typeof boundTextElement | undefined ;
if ( stateOfBoundTextElementAtResize ) {
boundTextFont = {
fontSize : stateOfBoundTextElementAtResize.fontSize ,
baseline : stateOfBoundTextElementAtResize.baseline ,
} ;
}
if ( shouldMaintainAspectRatio ) {
const nextFont = measureFontSizeFromWH (
boundTextElement ,
eleNewWidth - BOUND_TEXT_PADDING * 2 ,
eleNewHeight - BOUND_TEXT_PADDING * 2 ,
) ;
if ( nextFont === null ) {
return ;
}
boundTextFont = {
fontSize : nextFont.size ,
baseline : nextFont.baseline ,
} ;
} else {
const minWidth = getApproxMinLineWidth ( getFontString ( boundTextElement ) ) ;
const minHeight = getApproxMinLineHeight ( getFontString ( boundTextElement ) ) ;
eleNewWidth = Math . ceil ( Math . max ( eleNewWidth , minWidth ) ) ;
eleNewHeight = Math . ceil ( Math . max ( eleNewHeight , minHeight ) ) ;
}
}
const [ newBoundsX1 , newBoundsY1 , newBoundsX2 , newBoundsY2 ] =
@ -602,6 +628,9 @@ export const resizeSingleElement = (
newSize : { width : resizedElement.width , height : resizedElement.height } ,
} ) ;
mutateElement ( element , resizedElement ) ;
if ( boundTextElement && boundTextFont ) {
mutateElement ( boundTextElement , { fontSize : boundTextFont.fontSize } ) ;
}
handleBindTextResize ( element , transformHandleDirection ) ;
}
} ;