From 23b24ea5c3985bee51ce36aaf017fa696286ef88 Mon Sep 17 00:00:00 2001 From: Aakansha Doshi Date: Thu, 16 Nov 2023 16:18:38 +0530 Subject: [PATCH 1/5] build: use caret for specifying node version to avoid major upgrades automatically (#7297) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3b4a0b776..479f33c5e 100644 --- a/package.json +++ b/package.json @@ -96,7 +96,7 @@ "vitest-canvas-mock": "0.3.2" }, "engines": { - "node": ">=18.0.0" + "node": "^18.0.0" }, "homepage": ".", "name": "excalidraw", From f8d5c2a1b69a8ebaebb6016a1de043ab3eb05557 Mon Sep 17 00:00:00 2001 From: David Luzar <5153846+dwelle@users.noreply.github.com> Date: Fri, 17 Nov 2023 14:23:19 +0100 Subject: [PATCH 2/5] build: allow a range of major node versions (#7306) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 479f33c5e..4f8e550f3 100644 --- a/package.json +++ b/package.json @@ -96,7 +96,7 @@ "vitest-canvas-mock": "0.3.2" }, "engines": { - "node": "^18.0.0" + "node": "18.0.0 - 20.x.x" }, "homepage": ".", "name": "excalidraw", From 1e37dbd60e13402b0ad413c0257508932f79a9fd Mon Sep 17 00:00:00 2001 From: David Luzar <5153846+dwelle@users.noreply.github.com> Date: Fri, 17 Nov 2023 14:37:43 +0100 Subject: [PATCH 3/5] feat: change frame resizing behavior (#7307) --- src/components/App.tsx | 33 --------------------------------- 1 file changed, 33 deletions(-) diff --git a/src/components/App.tsx b/src/components/App.tsx index 42080e831..ccb010305 100644 --- a/src/components/App.tsx +++ b/src/components/App.tsx @@ -8317,39 +8317,6 @@ class App extends React.Component { const elementsToHighlight = new Set(); selectedFrames.forEach((frame) => { - const elementsInFrame = getFrameChildren( - this.scene.getNonDeletedElements(), - frame.id, - ); - - // keep elements' positions relative to their frames on frames resizing - if (transformHandleType) { - if (transformHandleType.includes("w")) { - elementsInFrame.forEach((element) => { - mutateElement(element, { - x: - frame.x + - (frameElementsOffsetsMap.get(frame.id + element.id)?.x || 0), - y: - frame.y + - (frameElementsOffsetsMap.get(frame.id + element.id)?.y || 0), - }); - }); - } - if (transformHandleType.includes("n")) { - elementsInFrame.forEach((element) => { - mutateElement(element, { - x: - frame.x + - (frameElementsOffsetsMap.get(frame.id + element.id)?.x || 0), - y: - frame.y + - (frameElementsOffsetsMap.get(frame.id + element.id)?.y || 0), - }); - }); - } - } - getElementsInResizingFrame( this.scene.getNonDeletedElements(), frame, From 7c9cf30909c6c368407994cb25e22292b99eee5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Barnab=C3=A1s=20Moln=C3=A1r?= <38168628+barnabasmolnar@users.noreply.github.com> Date: Fri, 17 Nov 2023 15:56:19 +0100 Subject: [PATCH 4/5] fix: make zoomToFit fitToViewport account for sidebar (#7298) --- src/actions/actionCanvas.tsx | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/actions/actionCanvas.tsx b/src/actions/actionCanvas.tsx index 2194f63b1..f61f57dbd 100644 --- a/src/actions/actionCanvas.tsx +++ b/src/actions/actionCanvas.tsx @@ -265,7 +265,21 @@ export const zoomToFit = ({ 30.0, ) as NormalizedZoomValue; - scrollX = (appState.width / 2) * (1 / newZoomValue) - centerX; + let appStateWidth = appState.width; + + if (appState.openSidebar) { + const sidebarDOMElem = document.querySelector( + ".sidebar", + ) as HTMLElement | null; + const sidebarWidth = sidebarDOMElem?.offsetWidth ?? 0; + const isRTL = document.documentElement.getAttribute("dir") === "rtl"; + + appStateWidth = !isRTL + ? appState.width - sidebarWidth + : appState.width + sidebarWidth; + } + + scrollX = (appStateWidth / 2) * (1 / newZoomValue) - centerX; scrollY = (appState.height / 2) * (1 / newZoomValue) - centerY; } else { newZoomValue = zoomValueToFitBoundsOnViewport(commonBounds, { From d1e4421823913aacb353a5b52dcd158370bfa96a Mon Sep 17 00:00:00 2001 From: DanielJGeiger <1852529+DanielJGeiger@users.noreply.github.com> Date: Wed, 22 Nov 2023 15:22:49 -0600 Subject: [PATCH 5/5] feat: Expose `ActionManager.registerAction` through `ExcalidrawImperativeAPI` (#6995) * feat: Expose `ActionManager` through `ExcalidrawImperativeAPI` * Only expose `registerAction` instead of `ActionManager` --- src/components/App.tsx | 17 ++++++++++------- src/types.ts | 2 ++ 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/components/App.tsx b/src/components/App.tsx index ccb010305..0892a40a6 100644 --- a/src/components/App.tsx +++ b/src/components/App.tsx @@ -40,7 +40,7 @@ import { import { createRedoAction, createUndoAction } from "../actions/actionHistory"; import { ActionManager } from "../actions/manager"; import { actions } from "../actions/register"; -import { ActionResult } from "../actions/types"; +import { Action, ActionResult } from "../actions/types"; import { trackEvent } from "../analytics"; import { getDefaultAppState, @@ -565,6 +565,12 @@ class App extends React.Component { this.id = nanoid(); this.library = new Library(this); + this.actionManager = new ActionManager( + this.syncActionResult, + () => this.state, + () => this.scene.getElementsIncludingDeleted(), + this, + ); this.scene = new Scene(); this.canvas = document.createElement("canvas"); @@ -585,6 +591,9 @@ class App extends React.Component { getSceneElements: this.getSceneElements, getAppState: () => this.state, getFiles: () => this.files, + registerAction: (action: Action) => { + this.actionManager.registerAction(action); + }, refresh: this.refresh, setToast: this.setToast, id: this.id, @@ -614,12 +623,6 @@ class App extends React.Component { onSceneUpdated: this.onSceneUpdated, }); this.history = new History(); - this.actionManager = new ActionManager( - this.syncActionResult, - () => this.state, - () => this.scene.getElementsIncludingDeleted(), - this, - ); this.actionManager.registerAll(actions); this.actionManager.registerAction(createUndoAction(this.history)); diff --git a/src/types.ts b/src/types.ts index 8884ae491..32eb044b8 100644 --- a/src/types.ts +++ b/src/types.ts @@ -18,6 +18,7 @@ import { ExcalidrawFrameElement, ExcalidrawEmbeddableElement, } from "./element/types"; +import { Action } from "./actions/types"; import { Point as RoughPoint } from "roughjs/bin/geometry"; import { LinearElementEditor } from "./element/linearElementEditor"; import { SuggestedBinding } from "./element/binding"; @@ -621,6 +622,7 @@ export type ExcalidrawImperativeAPI = { getSceneElements: InstanceType["getSceneElements"]; getAppState: () => InstanceType["state"]; getFiles: () => InstanceType["files"]; + registerAction: (action: Action) => void; refresh: InstanceType["refresh"]; setToast: InstanceType["setToast"]; addFiles: (data: BinaryFileData[]) => void;