fix: Increase transform handle offset (#10180)

* fix: Increase transform handle offset

Signed-off-by: Mark Tolmacs <mark@lazycat.hu>

* fix: Temporarily disable transform handles for linear elements on mobile and tablets

Signed-off-by: Mark Tolmacs <mark@lazycat.hu>

* fix: Linear hidden resize

Signed-off-by: Mark Tolmacs <mark@lazycat.hu>

* disable mobielOrTablet linear element bbox completely

* fix: Test

Signed-off-by: Mark Tolmacs <mark@lazycat.hu>

* fix: Lint

Signed-off-by: Mark Tolmacs <mark@lazycat.hu>

---------

Signed-off-by: Mark Tolmacs <mark@lazycat.hu>
Co-authored-by: dwelle <5153846+dwelle@users.noreply.github.com>
This commit is contained in:
Márk Tolmács
2025-10-15 21:16:20 +02:00
committed by Mark Tolmacs
parent b228d92e9b
commit 0fc5b31008
3 changed files with 18 additions and 15 deletions

View File

@@ -2,6 +2,7 @@ import {
DEFAULT_TRANSFORM_HANDLE_SPACING, DEFAULT_TRANSFORM_HANDLE_SPACING,
isAndroid, isAndroid,
isIOS, isIOS,
isMobileOrTablet,
} from "@excalidraw/common"; } from "@excalidraw/common";
import { pointFrom, pointRotateRads } from "@excalidraw/math"; import { pointFrom, pointRotateRads } from "@excalidraw/math";
@@ -326,7 +327,7 @@ export const getTransformHandles = (
); );
}; };
export const shouldShowBoundingBox = ( export const hasBoundingBox = (
elements: readonly NonDeletedExcalidrawElement[], elements: readonly NonDeletedExcalidrawElement[],
appState: InteractiveCanvasAppState, appState: InteractiveCanvasAppState,
) => { ) => {
@@ -345,5 +346,7 @@ export const shouldShowBoundingBox = (
return true; return true;
} }
return element.points.length > 2; // on mobile/tablet we currently don't show bbox because of resize issues
// (also prob best for simplicity's sake)
return element.points.length > 2 && !isMobileOrTablet();
}; };

View File

@@ -172,7 +172,7 @@ import {
getContainerElement, getContainerElement,
isValidTextContainer, isValidTextContainer,
redrawTextBoundingBox, redrawTextBoundingBox,
shouldShowBoundingBox, hasBoundingBox,
getFrameChildren, getFrameChildren,
isCursorInFrame, isCursorInFrame,
addElementsToFrame, addElementsToFrame,
@@ -5678,7 +5678,7 @@ class App extends React.Component<AppProps, AppState> {
if ( if (
considerBoundingBox && considerBoundingBox &&
this.state.selectedElementIds[element.id] && this.state.selectedElementIds[element.id] &&
shouldShowBoundingBox([element], this.state) hasBoundingBox([element], this.state)
) { ) {
// if hitting the bounding box, return early // if hitting the bounding box, return early
// but if not, we should check for other cases as well (e.g. frame name) // but if not, we should check for other cases as well (e.g. frame name)
@@ -6597,7 +6597,13 @@ class App extends React.Component<AppProps, AppState> {
(!this.state.selectedLinearElement || (!this.state.selectedLinearElement ||
this.state.selectedLinearElement.hoverPointIndex === -1) && this.state.selectedLinearElement.hoverPointIndex === -1) &&
this.state.openDialog?.name !== "elementLinkSelector" && this.state.openDialog?.name !== "elementLinkSelector" &&
!(selectedElements.length === 1 && isElbowArrow(selectedElements[0])) !(selectedElements.length === 1 && isElbowArrow(selectedElements[0])) &&
// HACK: Disable transform handles for linear elements on mobile until a
// better way of showing them is found
!(
isLinearElement(selectedElements[0]) &&
(isMobileOrTablet() || selectedElements[0].points.length === 2)
)
) { ) {
const elementWithTransformHandleType = const elementWithTransformHandleType =
getElementWithTransformHandleType( getElementWithTransformHandleType(
@@ -7730,14 +7736,8 @@ class App extends React.Component<AppProps, AppState> {
!this.state.selectedLinearElement?.isEditing && !this.state.selectedLinearElement?.isEditing &&
!isElbowArrow(selectedElements[0]) && !isElbowArrow(selectedElements[0]) &&
!( !(
isLineElement(selectedElements[0]) && isLinearElement(selectedElements[0]) &&
LinearElementEditor.getPointIndexUnderCursor( (isMobileOrTablet() || selectedElements[0].points.length === 2)
selectedElements[0],
elementsMap,
this.state.zoom,
pointerDownState.origin.x,
pointerDownState.origin.y,
) !== -1
) && ) &&
!( !(
this.state.selectedLinearElement && this.state.selectedLinearElement &&

View File

@@ -28,7 +28,7 @@ import {
getOmitSidesForDevice, getOmitSidesForDevice,
getTransformHandles, getTransformHandles,
getTransformHandlesFromCoords, getTransformHandlesFromCoords,
shouldShowBoundingBox, hasBoundingBox,
} from "@excalidraw/element"; } from "@excalidraw/element";
import { import {
isElbowArrow, isElbowArrow,
@@ -1086,7 +1086,7 @@ const _renderInteractiveScene = ({
!appState.newElement && !appState.newElement &&
!appState.selectedLinearElement?.isEditing !appState.selectedLinearElement?.isEditing
) { ) {
const showBoundingBox = shouldShowBoundingBox(selectedElements, appState); const showBoundingBox = hasBoundingBox(selectedElements, appState);
const isSingleLinearElementSelected = const isSingleLinearElementSelected =
selectedElements.length === 1 && isLinearElement(selectedElements[0]); selectedElements.length === 1 && isLinearElement(selectedElements[0]);