|  | @@ -44,6 +44,7 @@ import {
 | 
	
		
			
				|  |  |    isBindingEnabled,
 | 
	
		
			
				|  |  |  } from "../element/binding";
 | 
	
		
			
				|  |  |  import {
 | 
	
		
			
				|  |  | +  shouldShowBoundingBox,
 | 
	
		
			
				|  |  |    TransformHandles,
 | 
	
		
			
				|  |  |    TransformHandleType,
 | 
	
		
			
				|  |  |  } from "../element/transformHandles";
 | 
	
	
		
			
				|  | @@ -61,6 +62,7 @@ import {
 | 
	
		
			
				|  |  |  import { isLinearElement } from "../element/typeChecks";
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  const hasEmojiSupport = supportsEmoji();
 | 
	
		
			
				|  |  | +export const DEFAULT_SPACING = 4;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  const strokeRectWithRotation = (
 | 
	
		
			
				|  |  |    context: CanvasRenderingContext2D,
 | 
	
	
		
			
				|  | @@ -219,6 +221,7 @@ const renderLinearElementPointHighlight = (
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    context.restore();
 | 
	
		
			
				|  |  |  };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  export const _renderScene = (
 | 
	
		
			
				|  |  |    elements: readonly NonDeletedExcalidrawElement[],
 | 
	
		
			
				|  |  |    appState: AppState,
 | 
	
	
		
			
				|  | @@ -346,7 +349,6 @@ export const _renderScene = (
 | 
	
		
			
				|  |  |    ) {
 | 
	
		
			
				|  |  |      renderLinearElementPointHighlight(context, appState, renderConfig);
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |    // Paint selected elements
 | 
	
		
			
				|  |  |    if (
 | 
	
		
			
				|  |  |      renderSelection &&
 | 
	
	
		
			
				|  | @@ -354,6 +356,8 @@ export const _renderScene = (
 | 
	
		
			
				|  |  |      !appState.editingLinearElement
 | 
	
		
			
				|  |  |    ) {
 | 
	
		
			
				|  |  |      const locallySelectedElements = getSelectedElements(elements, appState);
 | 
	
		
			
				|  |  | +    const showBoundingBox = shouldShowBoundingBox(locallySelectedElements);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      const locallySelectedIds = locallySelectedElements.map(
 | 
	
		
			
				|  |  |        (element) => element.id,
 | 
	
		
			
				|  |  |      );
 | 
	
	
		
			
				|  | @@ -373,9 +377,8 @@ export const _renderScene = (
 | 
	
		
			
				|  |  |          renderConfig,
 | 
	
		
			
				|  |  |          locallySelectedElements[0] as ExcalidrawLinearElement,
 | 
	
		
			
				|  |  |        );
 | 
	
		
			
				|  |  | -      // render bounding box
 | 
	
		
			
				|  |  | -      // (unless dragging a single linear element)
 | 
	
		
			
				|  |  | -    } else if (!appState.draggingElement || !isSingleLinearElementSelected) {
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    if (showBoundingBox) {
 | 
	
		
			
				|  |  |        const selections = elements.reduce((acc, element) => {
 | 
	
		
			
				|  |  |          const selectionColors = [];
 | 
	
		
			
				|  |  |          // local user
 | 
	
	
		
			
				|  | @@ -434,12 +437,18 @@ export const _renderScene = (
 | 
	
		
			
				|  |  |          addSelectionForGroupId(appState.editingGroupId);
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  |        selections.forEach((selection) =>
 | 
	
		
			
				|  |  | -        renderSelectionBorder(context, renderConfig, selection),
 | 
	
		
			
				|  |  | +        renderSelectionBorder(
 | 
	
		
			
				|  |  | +          context,
 | 
	
		
			
				|  |  | +          renderConfig,
 | 
	
		
			
				|  |  | +          selection,
 | 
	
		
			
				|  |  | +          isSingleLinearElementSelected ? DEFAULT_SPACING * 2 : DEFAULT_SPACING,
 | 
	
		
			
				|  |  | +        ),
 | 
	
		
			
				|  |  |        );
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |      // Paint resize transformHandles
 | 
	
		
			
				|  |  |      context.save();
 | 
	
		
			
				|  |  |      context.translate(renderConfig.scrollX, renderConfig.scrollY);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      if (locallySelectedElements.length === 1) {
 | 
	
		
			
				|  |  |        context.fillStyle = oc.white;
 | 
	
		
			
				|  |  |        const transformHandles = getTransformHandles(
 | 
	
	
		
			
				|  | @@ -447,10 +456,7 @@ export const _renderScene = (
 | 
	
		
			
				|  |  |          renderConfig.zoom,
 | 
	
		
			
				|  |  |          "mouse", // when we render we don't know which pointer type so use mouse
 | 
	
		
			
				|  |  |        );
 | 
	
		
			
				|  |  | -      if (
 | 
	
		
			
				|  |  | -        !appState.viewModeEnabled &&
 | 
	
		
			
				|  |  | -        !isLinearElement(locallySelectedElements[0])
 | 
	
		
			
				|  |  | -      ) {
 | 
	
		
			
				|  |  | +      if (!appState.viewModeEnabled && showBoundingBox) {
 | 
	
		
			
				|  |  |          renderTransformHandles(
 | 
	
		
			
				|  |  |            context,
 | 
	
		
			
				|  |  |            renderConfig,
 | 
	
	
		
			
				|  | @@ -714,24 +720,21 @@ const renderTransformHandles = (
 | 
	
		
			
				|  |  |    Object.keys(transformHandles).forEach((key) => {
 | 
	
		
			
				|  |  |      const transformHandle = transformHandles[key as TransformHandleType];
 | 
	
		
			
				|  |  |      if (transformHandle !== undefined) {
 | 
	
		
			
				|  |  | +      const [x, y, width, height] = transformHandle;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |        context.save();
 | 
	
		
			
				|  |  |        context.lineWidth = 1 / renderConfig.zoom.value;
 | 
	
		
			
				|  |  |        if (key === "rotation") {
 | 
	
		
			
				|  |  | -        fillCircle(
 | 
	
		
			
				|  |  | -          context,
 | 
	
		
			
				|  |  | -          transformHandle[0] + transformHandle[2] / 2,
 | 
	
		
			
				|  |  | -          transformHandle[1] + transformHandle[3] / 2,
 | 
	
		
			
				|  |  | -          transformHandle[2] / 2,
 | 
	
		
			
				|  |  | -        );
 | 
	
		
			
				|  |  | +        fillCircle(context, x + width / 2, y + height / 2, width / 2);
 | 
	
		
			
				|  |  |        } else {
 | 
	
		
			
				|  |  |          strokeRectWithRotation(
 | 
	
		
			
				|  |  |            context,
 | 
	
		
			
				|  |  | -          transformHandle[0],
 | 
	
		
			
				|  |  | -          transformHandle[1],
 | 
	
		
			
				|  |  | -          transformHandle[2],
 | 
	
		
			
				|  |  | -          transformHandle[3],
 | 
	
		
			
				|  |  | -          transformHandle[0] + transformHandle[2] / 2,
 | 
	
		
			
				|  |  | -          transformHandle[1] + transformHandle[3] / 2,
 | 
	
		
			
				|  |  | +          x,
 | 
	
		
			
				|  |  | +          y,
 | 
	
		
			
				|  |  | +          width,
 | 
	
		
			
				|  |  | +          height,
 | 
	
		
			
				|  |  | +          x + width / 2,
 | 
	
		
			
				|  |  | +          y + height / 2,
 | 
	
		
			
				|  |  |            angle,
 | 
	
		
			
				|  |  |            true, // fill before stroke
 | 
	
		
			
				|  |  |          );
 | 
	
	
		
			
				|  | @@ -752,13 +755,14 @@ const renderSelectionBorder = (
 | 
	
		
			
				|  |  |      elementY2: number;
 | 
	
		
			
				|  |  |      selectionColors: string[];
 | 
	
		
			
				|  |  |    },
 | 
	
		
			
				|  |  | +  padding = 4,
 | 
	
		
			
				|  |  |  ) => {
 | 
	
		
			
				|  |  |    const { angle, elementX1, elementY1, elementX2, elementY2, selectionColors } =
 | 
	
		
			
				|  |  |      elementProperties;
 | 
	
		
			
				|  |  |    const elementWidth = elementX2 - elementX1;
 | 
	
		
			
				|  |  |    const elementHeight = elementY2 - elementY1;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  const dashedLinePadding = 4 / renderConfig.zoom.value;
 | 
	
		
			
				|  |  | +  const dashedLinePadding = padding / renderConfig.zoom.value;
 | 
	
		
			
				|  |  |    const dashWidth = 8 / renderConfig.zoom.value;
 | 
	
		
			
				|  |  |    const spaceWidth = 4 / renderConfig.zoom.value;
 | 
	
		
			
				|  |  |  
 |