From 90fd4a95dfd7b0876954916b66a443f27d673fdd Mon Sep 17 00:00:00 2001 From: Aakansha Doshi Date: Sun, 4 Apr 2021 22:05:02 +0530 Subject: [PATCH 1/7] =?UTF-8?q?refactor:=20=20rename=20setCanvasOffsets=20?= =?UTF-8?q?to=20refresh=20and=20release=20@excalidraw/excalidraw=20v0.6.0?= =?UTF-8?q?=20=F0=9F=8E=89=20=20(#3398)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * docs: Release @excalidraw/excalidraw v0.6.0 * update * fix * Update src/packages/excalidraw/README.md Co-authored-by: David Luzar * rename setCanvasOffsets to refresh * fix * fix * typo fix Co-authored-by: David Luzar --- src/components/App.tsx | 6 +- src/packages/excalidraw/CHANGELOG.md | 8 +- src/packages/excalidraw/README.md | 149 ++++++++++++++----------- src/packages/excalidraw/README_NEXT.md | 2 +- src/packages/excalidraw/package.json | 2 +- 5 files changed, 94 insertions(+), 73 deletions(-) diff --git a/src/components/App.tsx b/src/components/App.tsx index 14df48cc0..d5c3c0a54 100644 --- a/src/components/App.tsx +++ b/src/components/App.tsx @@ -274,7 +274,7 @@ export type ExcalidrawImperativeAPI = { setScrollToContent: InstanceType["setScrollToContent"]; getSceneElements: InstanceType["getSceneElements"]; getAppState: () => InstanceType["state"]; - setCanvasOffsets: InstanceType["setCanvasOffsets"]; + refresh: InstanceType["refresh"]; importLibrary: InstanceType["importLibraryFromUrl"]; setToastMessage: InstanceType["setToastMessage"]; readyPromise: ResolvablePromise; @@ -335,7 +335,7 @@ class App extends React.Component { setScrollToContent: this.setScrollToContent, getSceneElements: this.getSceneElements, getAppState: () => this.state, - setCanvasOffsets: this.setCanvasOffsets, + refresh: this.refresh, importLibrary: this.importLibraryFromUrl, setToastMessage: this.setToastMessage, } as const; @@ -4107,7 +4107,7 @@ class App extends React.Component { } }; - public setCanvasOffsets = () => { + public refresh = () => { this.setState({ ...this.getCanvasOffsets() }); }; diff --git a/src/packages/excalidraw/CHANGELOG.md b/src/packages/excalidraw/CHANGELOG.md index dbd3437c9..c0aa17d89 100644 --- a/src/packages/excalidraw/CHANGELOG.md +++ b/src/packages/excalidraw/CHANGELOG.md @@ -12,7 +12,7 @@ The change should be grouped under one of the below section and must contain PR Please add the latest change on the top under the correct section. --> -## Unreleased +## 0.6.0 (2021-04-04) ## Excalidraw API @@ -36,6 +36,12 @@ Please add the latest change on the top under the correct section. #### BREAKING CHANGE - If you are using script tag to embed excalidraw then the name of the file will have to be updated to `excalidraw.production.min.js` instead of `excalidraw.min.js`. If you want to use dev build you can use `excalidraw.development.js` +### Refactor + +#### BREAKING CHANGE + +- Rename the API `setCanvasOffsets` exposed via [`ref`](https://github.com/excalidraw/excalidraw/blob/master/src/components/App.tsx#L265) to `refresh` [#3398](https://github.com/excalidraw/excalidraw/pull/3398). + --- ## 0.5.0 (2021-03-21) diff --git a/src/packages/excalidraw/README.md b/src/packages/excalidraw/README.md index f8c81fc6e..9d31a7a5d 100644 --- a/src/packages/excalidraw/README.md +++ b/src/packages/excalidraw/README.md @@ -16,13 +16,13 @@ or via yarn yarn add react react-dom @excalidraw/excalidraw ``` -After installation you will see a folder `excalidraw-assets` in `dist` directory which contains the assets needed for this app. +After installation you will see a folder `excalidraw-assets` and `excalidraw-assets-dev` in `dist` directory which contains the assets needed for this app in prod and dev mode respectively. -Move the folder `excalidraw-assets` to the path where your assets are served. +Move the folder `excalidraw-assets` and `excalidraw-assets-dev` to the path where your assets are served. By default it will try to load the files from `https://unpkg.com/@excalidraw/excalidraw/{currentVersion}/dist/` -If you want to load assets from a different path you can set a variable `window.EXCALIDRAW_ASSET_PATH` to the url from where you want to load the assets. +If you want to load assets from a different path you can set a variable `window.EXCALIDRAW_ASSET_PATH` depending on environment (for example if you have different URL's for dev and prod) to the url from where you want to load the assets. ### Demo @@ -45,33 +45,11 @@ import "./styles.scss"; export default function App() { const excalidrawRef = useRef(null); - const excalidrawWrapperRef = useRef(null); - const [dimensions, setDimensions] = useState({ - width: undefined, - height: undefined, - }); const [viewModeEnabled, setViewModeEnabled] = useState(false); const [zenModeEnabled, setZenModeEnabled] = useState(false); const [gridModeEnabled, setGridModeEnabled] = useState(false); - useEffect(() => { - setDimensions({ - width: excalidrawWrapperRef.current.getBoundingClientRect().width, - height: excalidrawWrapperRef.current.getBoundingClientRect().height, - }); - const onResize = () => { - setDimensions({ - width: excalidrawWrapperRef.current.getBoundingClientRect().width, - height: excalidrawWrapperRef.current.getBoundingClientRect().height, - }); - }; - - window.addEventListener("resize", onResize); - - return () => window.removeEventListener("resize", onResize); - }, [excalidrawWrapperRef]); - const updateScene = () => { const sceneData = { elements: [ @@ -144,13 +122,11 @@ export default function App() { Grid mode -
+
+ onChange={(elements, state) => { console.log("Elements :", elements, "State : ", state) } onPointerUpdate={(payload) => console.log(payload)} @@ -171,6 +147,8 @@ To view the full example visit :point_down: [![Edit excalidraw](https://codesandbox.io/static/img/play-codesandbox.svg)](https://codesandbox.io/s/excalidraw-ehlz3?fontsize=14&hidenavigation=1&theme=dark) + + Since Excalidraw doesn't support server side rendering yet so you will have to make sure the component is rendered once host is mounted. ```js @@ -184,13 +162,31 @@ export default function IndexPage() { } ``` - +The `types` are available at `@excalidraw/excalidraw/types`, you can view [example for typescript](https://codesandbox.io/s/excalidraw-types-9h2dm) #### In Browser To use it in a browser directly: -You will need to make sure `react`, `react-dom` is available as shown below. +For development use :point_down: + +```js + +``` + +For production use :point_down: + +```js + +``` + +You will need to make sure `react`, `react-dom` is available as shown in the below example. For prod please use the production versions of `react`, `react-dom`.
View Example @@ -205,7 +201,7 @@ You will need to make sure `react`, `react-dom` is available as shown below. @@ -226,33 +222,11 @@ import InitialData from "./initialData"; const App = () => { const excalidrawRef = React.useRef(null); - const excalidrawWrapperRef = React.useRef(null); - const [dimensions, setDimensions] = React.useState({ - width: undefined, - height: undefined, - }); const [viewModeEnabled, setViewModeEnabled] = React.useState(false); const [zenModeEnabled, setZenModeEnabled] = React.useState(false); const [gridModeEnabled, setGridModeEnabled] = React.useState(false); - React.useEffect(() => { - setDimensions({ - width: excalidrawWrapperRef.current.getBoundingClientRect().width, - height: excalidrawWrapperRef.current.getBoundingClientRect().height, - }); - const onResize = () => { - setDimensions({ - width: excalidrawWrapperRef.current.getBoundingClientRect().width, - height: excalidrawWrapperRef.current.getBoundingClientRect().height, - }); - }; - - window.addEventListener("resize", onResize); - - return () => window.removeEventListener("resize", onResize); - }, [excalidrawWrapperRef]); - const updateScene = () => { const sceneData = { elements: [ @@ -345,9 +319,6 @@ const App = () => { ref: excalidrawWrapperRef, }, React.createElement(Excalidraw.default, { - ref: excalidrawRef, - width: dimensions.width, - height: dimensions.height, initialData: InitialData, onChange: (elements, state) => console.log("Elements :", elements, "State : ", state), @@ -376,8 +347,6 @@ To view the full example visit :point_down: | Name | Type | Default | Description | | --- | --- | --- | --- | -| [`width`](#width) | Number | `window.innerWidth` | The width of Excalidraw component | -| [`height`](#height) | Number | `window.innerHeight` | The height of Excalidraw component | | [`onChange`](#onChange) | Function | | This callback is triggered whenever the component updates due to any change. This callback will receive the excalidraw elements and the current app state. | | [`initialData`](#initialData) |
{elements?: ExcalidrawElement[], appState?: AppState } 
| null | The initial data with which app loads. | | [`ref`](#ref) | [`createRef`](https://reactjs.org/docs/refs-and-the-dom.html#creating-refs) or [`callbackRef`](https://reactjs.org/docs/refs-and-the-dom.html#callback-refs) or
{ current: { readyPromise: resolvablePromise } }
| | Ref to be passed to Excalidraw | @@ -387,20 +356,18 @@ To view the full example visit :point_down: | [`onExportToBackend`](#onExportToBackend) | Function | | Callback triggered when link button is clicked on export dialog | | [`langCode`](#langCode) | string | `en` | Language code string | | [`renderFooter `](#renderFooter) | Function | | Function that renders custom UI footer | +| [`renderCustomStats`](#renderCustomStats) | Function | | Function that can be used to render custom stats on the stats dialog. | | [`viewModeEnabled`](#viewModeEnabled) | boolean | | This implies if the app is in view mode. | | [`zenModeEnabled`](#zenModeEnabled) | boolean | | This implies if the zen mode is enabled | | [`gridModeEnabled`](#gridModeEnabled) | boolean | | This implies if the grid mode is enabled | | [`libraryReturnUrl`](#libraryReturnUrl) | string | | What URL should [libraries.excalidraw.com](https://libraries.excalidraw.com) be installed to | | [`theme`](#theme) | `light` or `dark` | | The theme of the Excalidraw component | | [`name`](#name) | string | | Name of the drawing | +| [`UIOptions`](#UIOptions) |
{ canvasActions:  CanvasActions }
| [DEFAULT UI OPTIONS](https://github.com/excalidraw/excalidraw/blob/master/src/constants.ts#L129) | To customise UI options. Currently we support customising [`canvas actions`](#canvasActions) | -#### `width` +### Dimensions of Excalidraw -This props defines the `width` of the Excalidraw component. Defaults to `window.innerWidth` if not passed. - -#### `height` - -This props defines the `height` of the Excalidraw component. Defaults to `window.innerHeight` if not passed. +Excalidraw takes `100%` of `width` and `height` of the containing block so make sure the container in which you render Excalidraw has non zero dimensions. #### `onChange` @@ -472,7 +439,9 @@ You can pass a `ref` when you want to access some excalidraw APIs. We expose the | getAppState |
 () => AppState
| Returns current appState | | history | `{ clear: () => void }` | This is the history API. `history.clear()` will clear the history | | setScrollToContent |
 (ExcalidrawElement[]) => void 
| Scroll to the nearest element to center | -| setCanvasOffsets | `() => void` | Updates the offsets for the Excalidraw component so that the coordinates are computed correctly (for example the cursor position). You should call this API when your app changes the dimensions/position of the Excalidraw container, such as when toggling a sidebar. You don't have to call this when the position is changed on page scroll (we handled that ourselves). | +| refresh | `() => void` | Updates the offsets for the Excalidraw component so that the coordinates are computed correctly (for example the cursor position). You don't have to call this when the position is changed on page scroll or when the excalidraw container resizes (we handle that ourselves). For any other cases if the position of excalidraw is updated (example due to scroll on parent container and not page scroll) you should call this API. | +| [importLibrary](#importlibrary) | `(url: string, token?: string) => void` | Imports library from given URL | +| setToastMessage | `(message: string) => void` | This API can be used to show the toast with custom message. | #### `readyPromise` @@ -531,6 +500,10 @@ import { defaultLang, languages } from "@excalidraw/excalidraw"; A function that renders (returns JSX) custom UI footer. For example, you can use this to render a language picker that was previously being rendered by Excalidraw itself (for now, you'll need to implement your own language picker). +#### `renderCustomStats` + +A function that can be used to render custom stats (returns JSX) in the nerd stats dialog. For example you can use this prop to render the size of the elements in the storage. + #### `viewModeEnabled` This prop indicates whether the app is in `view mode`. When supplied, the value takes precedence over `intialData.appState.viewModeEnabled`, the `view mode` will be fully controlled by the host app, and users won't be able to toggle it from within the app. @@ -545,7 +518,7 @@ This prop indicates whether the shows the grid. When supplied, the value takes p #### `libraryReturnUrl` -If supplied, this URL will be used when user tries to install a library from [libraries.excalidraw.com](https://libraries.excalidraw.com). Defaults to `window.location.origin`. To install the libraries in the same tab from which it was opened, you need to set `window.name` (to any alphanumeric string) — if it's not set it will open in a new tab. +If supplied, this URL will be used when user tries to install a library from [libraries.excalidraw.com](https://libraries.excalidraw.com). Defaults to `window.location.origin + window.location.pathname`. To install the libraries in the same tab from which it was opened, you need to set `window.name` (to any alphanumeric string) — if it's not set it will open in a new tab. #### `theme` @@ -555,10 +528,52 @@ This prop controls Excalidraw's theme. When supplied, the value takes precedence This prop sets the name of the drawing which will be used when exporting the drawing. When supplied, the value takes precedence over `intialData.appState.name`, the `name` will be fully controlled by host app and the users won't be able to edit from within Excalidraw. +### `UIOptions` + +This prop can be used to customise UI of Excalidraw. Currently we support customising only [`canvasActions`](#canvasActions). It accepts the below parameters + +
+{ canvasActions:  CanvasActions }
+
+ +#### canvasActions + +| Attribute | Type | Default | Description | +| --- | --- | --- | --- | +| `changeViewBackgroundColor` | boolean | true | Implies whether to show `Background color picker` | +| `clearCanvas` | boolean | true | Implies whether to show `Clear canvas button` | +| `export` | boolean | true | Implies whether to show `Export button` | +| `loadScene` | boolean | true | Implies whether to show `Load button` | +| `saveAsScene` | boolean | true | Implies whether to show `Save as button` | +| `saveScene` | boolean | true | Implies whether to show `Save button` | +| `theme` | boolean | true | Implies whether to show `Theme toggle` | + ### Does it support collaboration ? No Excalidraw package doesn't come with collaboration, since this would have different implementations on the consumer so we expose the API's which you can use to communicate with Excalidraw as mentioned above. If you are interested in understanding how Excalidraw does it you can check it [here](https://github.com/excalidraw/excalidraw/blob/master/src/excalidraw-app/index.tsx). +### importLibrary + +Imports library from given URL. You should call this on `hashchange`, passing the `addLibrary` value if you detect it as shown below. Optionally pass a CSRF `token` to skip prompting during installation (retrievable via `token` key from the url coming from [https://libraries.excalidraw.com](https://libraries.excalidraw.com/)). + +```js +useEffect(() => { + const onHashChange = () => { + const hash = new URLSearchParams(window.location.hash.slice(1)); + const libraryUrl = hash.get("addLibrary"); + if (libraryUrl) { + excalidrawRef.current.importLibrary(libraryUrl, hash.get("token")); + } + }; + window.addEventListener("hashchange", onHashChange, false); + return () => { + window.removeEventListener("hashchange", onHashChange); + }; +}, []); +``` + +Try out the [Demo](#Demo) to see it in action. + ### Extra API's #### `getSceneVersion` diff --git a/src/packages/excalidraw/README_NEXT.md b/src/packages/excalidraw/README_NEXT.md index 6a3ed9ba4..c356864b3 100644 --- a/src/packages/excalidraw/README_NEXT.md +++ b/src/packages/excalidraw/README_NEXT.md @@ -440,7 +440,7 @@ You can pass a `ref` when you want to access some excalidraw APIs. We expose the | getAppState |
 () => AppState
| Returns current appState | | history | `{ clear: () => void }` | This is the history API. `history.clear()` will clear the history | | setScrollToContent |
 (ExcalidrawElement[]) => void 
| Scroll to the nearest element to center | -| setCanvasOffsets | `() => void` | Updates the offsets for the Excalidraw component so that the coordinates are computed correctly (for example the cursor position). You don't have to call this when the position is changed on page scroll or when the excalidraw container resizes (we handle that ourselves). For any other cases if the position of excalidraw is updated (example due to scroll on parent container and not page scroll) you should call this API. | +| refresh | `() => void` | Updates the offsets for the Excalidraw component so that the coordinates are computed correctly (for example the cursor position). You don't have to call this when the position is changed on page scroll or when the excalidraw container resizes (we handle that ourselves). For any other cases if the position of excalidraw is updated (example due to scroll on parent container and not page scroll) you should call this API. | | importLibrary | `(url: string, token?: string) => void` | Imports library from given URL. You should call this on `hashchange`, passing the `addLibrary` value if you detect it. Optionally pass a CSRF `token` to skip prompting during installation (retrievable via `token` key from the url coming from [https://libraries.excalidraw.com](https://libraries.excalidraw.com/)). | | setToastMessage | `(message: string) => void` | This API can be used to show the toast with custom message. | diff --git a/src/packages/excalidraw/package.json b/src/packages/excalidraw/package.json index d44ce1491..8124d8fc6 100644 --- a/src/packages/excalidraw/package.json +++ b/src/packages/excalidraw/package.json @@ -1,6 +1,6 @@ { "name": "@excalidraw/excalidraw", - "version": "0.5.0", + "version": "0.6.0", "main": "main.js", "types": "types/packages/excalidraw/index.d.ts", "files": [ From 189b721eed19809f0cd25e092a33d57c60e22c49 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 5 Apr 2021 20:47:02 +0530 Subject: [PATCH 2/7] chore(deps): bump @testing-library/jest-dom from 5.11.9 to 5.11.10 (#3393) Bumps [@testing-library/jest-dom](https://github.com/testing-library/jest-dom) from 5.11.9 to 5.11.10. - [Release notes](https://github.com/testing-library/jest-dom/releases) - [Changelog](https://github.com/testing-library/jest-dom/blob/main/CHANGELOG.md) - [Commits](https://github.com/testing-library/jest-dom/compare/v5.11.9...v5.11.10) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 51bf15cb2..2c747f11b 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "dependencies": { "@sentry/browser": "6.2.2", "@sentry/integrations": "6.2.1", - "@testing-library/jest-dom": "5.11.9", + "@testing-library/jest-dom": "5.11.10", "@testing-library/react": "11.2.5", "@types/jest": "26.0.22", "@types/react": "17.0.3", diff --git a/yarn.lock b/yarn.lock index 88d938f98..797a4fa5b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1879,9 +1879,9 @@ lz-string "^1.4.4" pretty-format "^26.6.2" -"@testing-library/jest-dom@5.11.9": - version "5.11.9" - resolved "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.11.9.tgz" +"@testing-library/jest-dom@5.11.10": + version "5.11.10" + resolved "https://registry.yarnpkg.com/@testing-library/jest-dom/-/jest-dom-5.11.10.tgz#1cd90715023e1627f5ed26ab3b38e6f22d77046c" dependencies: "@babel/runtime" "^7.9.2" "@types/testing-library__jest-dom" "^5.9.1" From 9733ecb3dfe4fa2f442aeddffe97707e2efc24d4 Mon Sep 17 00:00:00 2001 From: David Luzar Date: Mon, 5 Apr 2021 17:26:37 +0200 Subject: [PATCH 3/7] fix: popover positioning (#3399) --- src/components/App.tsx | 41 +- src/components/ContextMenu.tsx | 112 +- src/components/Popover.scss | 2 +- .../__snapshots__/contextmenu.test.tsx.snap | 4582 +++++++++++++++++ .../regressionTests.test.tsx.snap | 4275 --------------- src/tests/contextmenu.test.tsx | 531 ++ src/tests/regressionTests.test.tsx | 447 +- 7 files changed, 5199 insertions(+), 4791 deletions(-) create mode 100644 src/tests/__snapshots__/contextmenu.test.tsx.snap create mode 100644 src/tests/contextmenu.test.tsx diff --git a/src/components/App.tsx b/src/components/App.tsx index d5c3c0a54..5bb8d1c13 100644 --- a/src/components/App.tsx +++ b/src/components/App.tsx @@ -474,6 +474,7 @@ class App extends React.Component { UIOptions={this.props.UIOptions} />
+
{this.state.showStats && ( { const type = element ? "element" : "canvas"; + const container = this.excalidrawContainerRef.current!; + const { + top: offsetTop, + left: offsetLeft, + } = container.getBoundingClientRect(); + const left = event.clientX - offsetLeft; + const top = event.clientY - offsetTop; + if (element && !this.state.selectedElementIds[element.id]) { this.setState({ selectedElementIds: { [element.id]: true } }, () => { - this._openContextMenu(event, type); + this._openContextMenu({ top, left }, type); }); } else { - this._openContextMenu(event, type); + this._openContextMenu({ top, left }, type); } }; @@ -3774,11 +3783,11 @@ class App extends React.Component { /** @private use this.handleCanvasContextMenu */ private _openContextMenu = ( { - clientX, - clientY, + left, + top, }: { - clientX: number; - clientY: number; + left: number; + top: number; }, type: "canvas" | "element", ) => { @@ -3829,10 +3838,11 @@ class App extends React.Component { ContextMenu.push({ options: viewModeOptions, - top: clientY, - left: clientX, + top, + left, actionManager: this.actionManager, appState: this.state, + container: this.excalidrawContainerRef.current!, }); if (this.state.viewModeEnabled) { @@ -3872,10 +3882,11 @@ class App extends React.Component { actionToggleViewMode, actionToggleStats, ], - top: clientY, - left: clientX, + top, + left, actionManager: this.actionManager, appState: this.state, + container: this.excalidrawContainerRef.current!, }); return; } @@ -3883,10 +3894,11 @@ class App extends React.Component { if (this.state.viewModeEnabled) { ContextMenu.push({ options: [navigator.clipboard && actionCopy, ...options], - top: clientY, - left: clientX, + top, + left, actionManager: this.actionManager, appState: this.state, + container: this.excalidrawContainerRef.current!, }); return; } @@ -3928,10 +3940,11 @@ class App extends React.Component { actionDuplicateSelection, actionDeleteSelected, ], - top: clientY, - left: clientX, + top, + left, actionManager: this.actionManager, appState: this.state, + container: this.excalidrawContainerRef.current!, }); }; diff --git a/src/components/ContextMenu.tsx b/src/components/ContextMenu.tsx index 508502d1f..1c219b481 100644 --- a/src/components/ContextMenu.tsx +++ b/src/components/ContextMenu.tsx @@ -32,67 +32,63 @@ const ContextMenu = ({ actionManager, appState, }: ContextMenuProps) => { - const isDarkTheme = !!document - .querySelector(".excalidraw") - ?.classList.contains("theme--dark"); return ( -
- event.preventDefault()} > -
    event.preventDefault()} - > - {options.map((option, idx) => { - if (option === "separator") { - return
    ; - } + {options.map((option, idx) => { + if (option === "separator") { + return
    ; + } - const actionName = option.name; - const label = option.contextItemLabel - ? t(option.contextItemLabel) - : ""; - return ( -
  • - -
  • - ); - })} -
-
-
+ const actionName = option.name; + const label = option.contextItemLabel + ? t(option.contextItemLabel) + : ""; + return ( +
  • + +
  • + ); + })} + + ); }; -let contextMenuNode: HTMLDivElement; -const getContextMenuNode = (): HTMLDivElement => { +const contextMenuNodeByContainer = new WeakMap(); + +const getContextMenuNode = (container: HTMLElement): HTMLDivElement => { + let contextMenuNode = contextMenuNodeByContainer.get(container); if (contextMenuNode) { return contextMenuNode; } - const div = document.createElement("div"); - document.body.appendChild(div); - return (contextMenuNode = div); + contextMenuNode = document.createElement("div"); + container + .querySelector(".excalidraw-contextMenuContainer")! + .appendChild(contextMenuNode); + contextMenuNodeByContainer.set(container, contextMenuNode); + return contextMenuNode; }; type ContextMenuParams = { @@ -101,10 +97,16 @@ type ContextMenuParams = { left: ContextMenuProps["left"]; actionManager: ContextMenuProps["actionManager"]; appState: Readonly; + container: HTMLElement; }; -const handleClose = () => { - unmountComponentAtNode(getContextMenuNode()); +const handleClose = (container: HTMLElement) => { + const contextMenuNode = contextMenuNodeByContainer.get(container); + if (contextMenuNode) { + unmountComponentAtNode(contextMenuNode); + contextMenuNode.remove(); + contextMenuNodeByContainer.delete(container); + } }; export default { @@ -121,11 +123,11 @@ export default { top={params.top} left={params.left} options={options} - onCloseRequest={handleClose} + onCloseRequest={() => handleClose(params.container)} actionManager={params.actionManager} appState={params.appState} />, - getContextMenuNode(), + getContextMenuNode(params.container), ); } }, diff --git a/src/components/Popover.scss b/src/components/Popover.scss index 0428f7449..594d44e29 100644 --- a/src/components/Popover.scss +++ b/src/components/Popover.scss @@ -1,6 +1,6 @@ .excalidraw { .popover { - position: fixed; + position: absolute; z-index: 10; } } diff --git a/src/tests/__snapshots__/contextmenu.test.tsx.snap b/src/tests/__snapshots__/contextmenu.test.tsx.snap new file mode 100644 index 000000000..d5158b498 --- /dev/null +++ b/src/tests/__snapshots__/contextmenu.test.tsx.snap @@ -0,0 +1,4582 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`contextMenu element selecting 'Add to library' in context menu adds element to library: [end of test] appState 1`] = ` +Object { + "collaborators": Map {}, + "currentChartType": "bar", + "currentItemBackgroundColor": "transparent", + "currentItemEndArrowhead": "arrow", + "currentItemFillStyle": "hachure", + "currentItemFontFamily": 1, + "currentItemFontSize": 20, + "currentItemLinearStrokeSharpness": "round", + "currentItemOpacity": 100, + "currentItemRoughness": 1, + "currentItemStartArrowhead": null, + "currentItemStrokeColor": "#000000", + "currentItemStrokeSharpness": "sharp", + "currentItemStrokeStyle": "solid", + "currentItemStrokeWidth": 1, + "currentItemTextAlign": "left", + "cursorButton": "up", + "draggingElement": null, + "editingElement": null, + "editingGroupId": null, + "editingLinearElement": null, + "elementLocked": false, + "elementType": "selection", + "errorMessage": null, + "exportBackground": true, + "exportEmbedScene": false, + "exportWithDarkMode": false, + "fileHandle": null, + "gridSize": null, + "height": 100, + "isBindingEnabled": true, + "isLibraryOpen": false, + "isLoading": false, + "isResizing": false, + "isRotating": false, + "lastPointerDownWith": "mouse", + "multiElement": null, + "name": "Untitled-201933152653", + "offsetLeft": 20, + "offsetTop": 10, + "openMenu": null, + "pasteDialog": Object { + "data": null, + "shown": false, + }, + "previousSelectedElementIds": Object {}, + "resizingElement": null, + "scrollX": 0, + "scrollY": 0, + "scrolledOutside": false, + "selectedElementIds": Object { + "id0": true, + }, + "selectedGroupIds": Object {}, + "selectionElement": null, + "shouldAddWatermark": false, + "shouldCacheIgnoreZoom": false, + "showHelpDialog": false, + "showStats": false, + "startBoundElement": null, + "suggestedBindings": Array [], + "theme": "light", + "toastMessage": null, + "viewBackgroundColor": "#ffffff", + "viewModeEnabled": false, + "width": 200, + "zenModeEnabled": false, + "zoom": Object { + "translation": Object { + "x": 0, + "y": 0, + }, + "value": 1, + }, +} +`; + +exports[`contextMenu element selecting 'Add to library' in context menu adds element to library: [end of test] element 0 1`] = ` +Object { + "angle": 0, + "backgroundColor": "transparent", + "boundElementIds": null, + "fillStyle": "hachure", + "groupIds": Array [], + "height": 20, + "id": "id0", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 1278240551, + "strokeColor": "#000000", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 2, + "versionNonce": 449462985, + "width": 20, + "x": -10, + "y": 0, +} +`; + +exports[`contextMenu element selecting 'Add to library' in context menu adds element to library: [end of test] history 1`] = ` +Object { + "recording": false, + "redoStack": Array [], + "stateHistory": Array [ + Object { + "appState": Object { + "editingGroupId": null, + "editingLinearElement": null, + "name": "Untitled-201933152653", + "selectedElementIds": Object {}, + "viewBackgroundColor": "#ffffff", + }, + "elements": Array [], + }, + Object { + "appState": Object { + "editingGroupId": null, + "editingLinearElement": null, + "name": "Untitled-201933152653", + "selectedElementIds": Object { + "id0": true, + }, + "viewBackgroundColor": "#ffffff", + }, + "elements": Array [ + Object { + "angle": 0, + "backgroundColor": "transparent", + "boundElementIds": null, + "fillStyle": "hachure", + "groupIds": Array [], + "height": 20, + "id": "id0", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 1278240551, + "strokeColor": "#000000", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 2, + "versionNonce": 449462985, + "width": 20, + "x": -10, + "y": 0, + }, + ], + }, + ], +} +`; + +exports[`contextMenu element selecting 'Add to library' in context menu adds element to library: [end of test] number of elements 1`] = `1`; + +exports[`contextMenu element selecting 'Add to library' in context menu adds element to library: [end of test] number of renders 1`] = `9`; + +exports[`contextMenu element selecting 'Bring forward' in context menu brings element forward: [end of test] appState 1`] = ` +Object { + "collaborators": Map {}, + "currentChartType": "bar", + "currentItemBackgroundColor": "transparent", + "currentItemEndArrowhead": "arrow", + "currentItemFillStyle": "hachure", + "currentItemFontFamily": 1, + "currentItemFontSize": 20, + "currentItemLinearStrokeSharpness": "round", + "currentItemOpacity": 100, + "currentItemRoughness": 1, + "currentItemStartArrowhead": null, + "currentItemStrokeColor": "#000000", + "currentItemStrokeSharpness": "sharp", + "currentItemStrokeStyle": "solid", + "currentItemStrokeWidth": 1, + "currentItemTextAlign": "left", + "cursorButton": "up", + "draggingElement": null, + "editingElement": null, + "editingGroupId": null, + "editingLinearElement": null, + "elementLocked": false, + "elementType": "selection", + "errorMessage": null, + "exportBackground": true, + "exportEmbedScene": false, + "exportWithDarkMode": false, + "fileHandle": null, + "gridSize": null, + "height": 100, + "isBindingEnabled": true, + "isLibraryOpen": false, + "isLoading": false, + "isResizing": false, + "isRotating": false, + "lastPointerDownWith": "mouse", + "multiElement": null, + "name": "Untitled-201933152653", + "offsetLeft": 20, + "offsetTop": 10, + "openMenu": null, + "pasteDialog": Object { + "data": null, + "shown": false, + }, + "previousSelectedElementIds": Object {}, + "resizingElement": null, + "scrollX": 0, + "scrollY": 0, + "scrolledOutside": false, + "selectedElementIds": Object { + "id0": true, + }, + "selectedGroupIds": Object {}, + "selectionElement": null, + "shouldAddWatermark": false, + "shouldCacheIgnoreZoom": false, + "showHelpDialog": false, + "showStats": false, + "startBoundElement": null, + "suggestedBindings": Array [], + "theme": "light", + "toastMessage": null, + "viewBackgroundColor": "#ffffff", + "viewModeEnabled": false, + "width": 200, + "zenModeEnabled": false, + "zoom": Object { + "translation": Object { + "x": 0, + "y": 0, + }, + "value": 1, + }, +} +`; + +exports[`contextMenu element selecting 'Bring forward' in context menu brings element forward: [end of test] element 0 1`] = ` +Object { + "angle": 0, + "backgroundColor": "transparent", + "boundElementIds": null, + "fillStyle": "hachure", + "groupIds": Array [], + "height": 20, + "id": "id1", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 453191, + "strokeColor": "#000000", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 2, + "versionNonce": 401146281, + "width": 20, + "x": 20, + "y": 30, +} +`; + +exports[`contextMenu element selecting 'Bring forward' in context menu brings element forward: [end of test] element 1 1`] = ` +Object { + "angle": 0, + "backgroundColor": "transparent", + "boundElementIds": null, + "fillStyle": "hachure", + "groupIds": Array [], + "height": 20, + "id": "id0", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 1278240551, + "strokeColor": "#000000", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 2, + "versionNonce": 449462985, + "width": 20, + "x": -10, + "y": 0, +} +`; + +exports[`contextMenu element selecting 'Bring forward' in context menu brings element forward: [end of test] history 1`] = ` +Object { + "recording": false, + "redoStack": Array [], + "stateHistory": Array [ + Object { + "appState": Object { + "editingGroupId": null, + "editingLinearElement": null, + "name": "Untitled-201933152653", + "selectedElementIds": Object {}, + "viewBackgroundColor": "#ffffff", + }, + "elements": Array [], + }, + Object { + "appState": Object { + "editingGroupId": null, + "editingLinearElement": null, + "name": "Untitled-201933152653", + "selectedElementIds": Object { + "id0": true, + }, + "viewBackgroundColor": "#ffffff", + }, + "elements": Array [ + Object { + "angle": 0, + "backgroundColor": "transparent", + "boundElementIds": null, + "fillStyle": "hachure", + "groupIds": Array [], + "height": 20, + "id": "id0", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 1278240551, + "strokeColor": "#000000", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 2, + "versionNonce": 449462985, + "width": 20, + "x": -10, + "y": 0, + }, + ], + }, + Object { + "appState": Object { + "editingGroupId": null, + "editingLinearElement": null, + "name": "Untitled-201933152653", + "selectedElementIds": Object { + "id1": true, + }, + "viewBackgroundColor": "#ffffff", + }, + "elements": Array [ + Object { + "angle": 0, + "backgroundColor": "transparent", + "boundElementIds": null, + "fillStyle": "hachure", + "groupIds": Array [], + "height": 20, + "id": "id0", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 1278240551, + "strokeColor": "#000000", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 2, + "versionNonce": 449462985, + "width": 20, + "x": -10, + "y": 0, + }, + Object { + "angle": 0, + "backgroundColor": "transparent", + "boundElementIds": null, + "fillStyle": "hachure", + "groupIds": Array [], + "height": 20, + "id": "id1", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 453191, + "strokeColor": "#000000", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 2, + "versionNonce": 401146281, + "width": 20, + "x": 20, + "y": 30, + }, + ], + }, + Object { + "appState": Object { + "editingGroupId": null, + "editingLinearElement": null, + "name": "Untitled-201933152653", + "selectedElementIds": Object { + "id0": true, + }, + "viewBackgroundColor": "#ffffff", + }, + "elements": Array [ + Object { + "angle": 0, + "backgroundColor": "transparent", + "boundElementIds": null, + "fillStyle": "hachure", + "groupIds": Array [], + "height": 20, + "id": "id1", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 453191, + "strokeColor": "#000000", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 2, + "versionNonce": 401146281, + "width": 20, + "x": 20, + "y": 30, + }, + Object { + "angle": 0, + "backgroundColor": "transparent", + "boundElementIds": null, + "fillStyle": "hachure", + "groupIds": Array [], + "height": 20, + "id": "id0", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 1278240551, + "strokeColor": "#000000", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 2, + "versionNonce": 449462985, + "width": 20, + "x": -10, + "y": 0, + }, + ], + }, + ], +} +`; + +exports[`contextMenu element selecting 'Bring forward' in context menu brings element forward: [end of test] number of elements 1`] = `2`; + +exports[`contextMenu element selecting 'Bring forward' in context menu brings element forward: [end of test] number of renders 1`] = `15`; + +exports[`contextMenu element selecting 'Bring to front' in context menu brings element to front: [end of test] appState 1`] = ` +Object { + "collaborators": Map {}, + "currentChartType": "bar", + "currentItemBackgroundColor": "transparent", + "currentItemEndArrowhead": "arrow", + "currentItemFillStyle": "hachure", + "currentItemFontFamily": 1, + "currentItemFontSize": 20, + "currentItemLinearStrokeSharpness": "round", + "currentItemOpacity": 100, + "currentItemRoughness": 1, + "currentItemStartArrowhead": null, + "currentItemStrokeColor": "#000000", + "currentItemStrokeSharpness": "sharp", + "currentItemStrokeStyle": "solid", + "currentItemStrokeWidth": 1, + "currentItemTextAlign": "left", + "cursorButton": "up", + "draggingElement": null, + "editingElement": null, + "editingGroupId": null, + "editingLinearElement": null, + "elementLocked": false, + "elementType": "selection", + "errorMessage": null, + "exportBackground": true, + "exportEmbedScene": false, + "exportWithDarkMode": false, + "fileHandle": null, + "gridSize": null, + "height": 100, + "isBindingEnabled": true, + "isLibraryOpen": false, + "isLoading": false, + "isResizing": false, + "isRotating": false, + "lastPointerDownWith": "mouse", + "multiElement": null, + "name": "Untitled-201933152653", + "offsetLeft": 20, + "offsetTop": 10, + "openMenu": null, + "pasteDialog": Object { + "data": null, + "shown": false, + }, + "previousSelectedElementIds": Object {}, + "resizingElement": null, + "scrollX": 0, + "scrollY": 0, + "scrolledOutside": false, + "selectedElementIds": Object { + "id0": true, + }, + "selectedGroupIds": Object {}, + "selectionElement": null, + "shouldAddWatermark": false, + "shouldCacheIgnoreZoom": false, + "showHelpDialog": false, + "showStats": false, + "startBoundElement": null, + "suggestedBindings": Array [], + "theme": "light", + "toastMessage": null, + "viewBackgroundColor": "#ffffff", + "viewModeEnabled": false, + "width": 200, + "zenModeEnabled": false, + "zoom": Object { + "translation": Object { + "x": 0, + "y": 0, + }, + "value": 1, + }, +} +`; + +exports[`contextMenu element selecting 'Bring to front' in context menu brings element to front: [end of test] element 0 1`] = ` +Object { + "angle": 0, + "backgroundColor": "transparent", + "boundElementIds": null, + "fillStyle": "hachure", + "groupIds": Array [], + "height": 20, + "id": "id1", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 453191, + "strokeColor": "#000000", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 2, + "versionNonce": 401146281, + "width": 20, + "x": 20, + "y": 30, +} +`; + +exports[`contextMenu element selecting 'Bring to front' in context menu brings element to front: [end of test] element 1 1`] = ` +Object { + "angle": 0, + "backgroundColor": "transparent", + "boundElementIds": null, + "fillStyle": "hachure", + "groupIds": Array [], + "height": 20, + "id": "id0", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 1278240551, + "strokeColor": "#000000", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 2, + "versionNonce": 449462985, + "width": 20, + "x": -10, + "y": 0, +} +`; + +exports[`contextMenu element selecting 'Bring to front' in context menu brings element to front: [end of test] history 1`] = ` +Object { + "recording": false, + "redoStack": Array [], + "stateHistory": Array [ + Object { + "appState": Object { + "editingGroupId": null, + "editingLinearElement": null, + "name": "Untitled-201933152653", + "selectedElementIds": Object {}, + "viewBackgroundColor": "#ffffff", + }, + "elements": Array [], + }, + Object { + "appState": Object { + "editingGroupId": null, + "editingLinearElement": null, + "name": "Untitled-201933152653", + "selectedElementIds": Object { + "id0": true, + }, + "viewBackgroundColor": "#ffffff", + }, + "elements": Array [ + Object { + "angle": 0, + "backgroundColor": "transparent", + "boundElementIds": null, + "fillStyle": "hachure", + "groupIds": Array [], + "height": 20, + "id": "id0", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 1278240551, + "strokeColor": "#000000", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 2, + "versionNonce": 449462985, + "width": 20, + "x": -10, + "y": 0, + }, + ], + }, + Object { + "appState": Object { + "editingGroupId": null, + "editingLinearElement": null, + "name": "Untitled-201933152653", + "selectedElementIds": Object { + "id1": true, + }, + "viewBackgroundColor": "#ffffff", + }, + "elements": Array [ + Object { + "angle": 0, + "backgroundColor": "transparent", + "boundElementIds": null, + "fillStyle": "hachure", + "groupIds": Array [], + "height": 20, + "id": "id0", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 1278240551, + "strokeColor": "#000000", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 2, + "versionNonce": 449462985, + "width": 20, + "x": -10, + "y": 0, + }, + Object { + "angle": 0, + "backgroundColor": "transparent", + "boundElementIds": null, + "fillStyle": "hachure", + "groupIds": Array [], + "height": 20, + "id": "id1", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 453191, + "strokeColor": "#000000", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 2, + "versionNonce": 401146281, + "width": 20, + "x": 20, + "y": 30, + }, + ], + }, + Object { + "appState": Object { + "editingGroupId": null, + "editingLinearElement": null, + "name": "Untitled-201933152653", + "selectedElementIds": Object { + "id0": true, + }, + "viewBackgroundColor": "#ffffff", + }, + "elements": Array [ + Object { + "angle": 0, + "backgroundColor": "transparent", + "boundElementIds": null, + "fillStyle": "hachure", + "groupIds": Array [], + "height": 20, + "id": "id1", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 453191, + "strokeColor": "#000000", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 2, + "versionNonce": 401146281, + "width": 20, + "x": 20, + "y": 30, + }, + Object { + "angle": 0, + "backgroundColor": "transparent", + "boundElementIds": null, + "fillStyle": "hachure", + "groupIds": Array [], + "height": 20, + "id": "id0", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 1278240551, + "strokeColor": "#000000", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 2, + "versionNonce": 449462985, + "width": 20, + "x": -10, + "y": 0, + }, + ], + }, + ], +} +`; + +exports[`contextMenu element selecting 'Bring to front' in context menu brings element to front: [end of test] number of elements 1`] = `2`; + +exports[`contextMenu element selecting 'Bring to front' in context menu brings element to front: [end of test] number of renders 1`] = `15`; + +exports[`contextMenu element selecting 'Copy styles' in context menu copies styles: [end of test] appState 1`] = ` +Object { + "collaborators": Map {}, + "currentChartType": "bar", + "currentItemBackgroundColor": "transparent", + "currentItemEndArrowhead": "arrow", + "currentItemFillStyle": "hachure", + "currentItemFontFamily": 1, + "currentItemFontSize": 20, + "currentItemLinearStrokeSharpness": "round", + "currentItemOpacity": 100, + "currentItemRoughness": 1, + "currentItemStartArrowhead": null, + "currentItemStrokeColor": "#000000", + "currentItemStrokeSharpness": "sharp", + "currentItemStrokeStyle": "solid", + "currentItemStrokeWidth": 1, + "currentItemTextAlign": "left", + "cursorButton": "up", + "draggingElement": null, + "editingElement": null, + "editingGroupId": null, + "editingLinearElement": null, + "elementLocked": false, + "elementType": "selection", + "errorMessage": null, + "exportBackground": true, + "exportEmbedScene": false, + "exportWithDarkMode": false, + "fileHandle": null, + "gridSize": null, + "height": 100, + "isBindingEnabled": true, + "isLibraryOpen": false, + "isLoading": false, + "isResizing": false, + "isRotating": false, + "lastPointerDownWith": "mouse", + "multiElement": null, + "name": "Untitled-201933152653", + "offsetLeft": 20, + "offsetTop": 10, + "openMenu": null, + "pasteDialog": Object { + "data": null, + "shown": false, + }, + "previousSelectedElementIds": Object {}, + "resizingElement": null, + "scrollX": 0, + "scrollY": 0, + "scrolledOutside": false, + "selectedElementIds": Object { + "id0": true, + }, + "selectedGroupIds": Object {}, + "selectionElement": null, + "shouldAddWatermark": false, + "shouldCacheIgnoreZoom": false, + "showHelpDialog": false, + "showStats": false, + "startBoundElement": null, + "suggestedBindings": Array [], + "theme": "light", + "toastMessage": "Copied styles.", + "viewBackgroundColor": "#ffffff", + "viewModeEnabled": false, + "width": 200, + "zenModeEnabled": false, + "zoom": Object { + "translation": Object { + "x": 0, + "y": 0, + }, + "value": 1, + }, +} +`; + +exports[`contextMenu element selecting 'Copy styles' in context menu copies styles: [end of test] element 0 1`] = ` +Object { + "angle": 0, + "backgroundColor": "transparent", + "boundElementIds": null, + "fillStyle": "hachure", + "groupIds": Array [], + "height": 20, + "id": "id0", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 449462985, + "strokeColor": "#000000", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 2, + "versionNonce": 453191, + "width": 20, + "x": -10, + "y": 0, +} +`; + +exports[`contextMenu element selecting 'Copy styles' in context menu copies styles: [end of test] history 1`] = ` +Object { + "recording": false, + "redoStack": Array [], + "stateHistory": Array [ + Object { + "appState": Object { + "editingGroupId": null, + "editingLinearElement": null, + "name": "Untitled-201933152653", + "selectedElementIds": Object {}, + "viewBackgroundColor": "#ffffff", + }, + "elements": Array [], + }, + Object { + "appState": Object { + "editingGroupId": null, + "editingLinearElement": null, + "name": "Untitled-201933152653", + "selectedElementIds": Object {}, + "viewBackgroundColor": "#ffffff", + }, + "elements": Array [ + Object { + "angle": 0, + "backgroundColor": "transparent", + "boundElementIds": null, + "fillStyle": "hachure", + "groupIds": Array [], + "height": 0, + "id": "id0", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 449462985, + "strokeColor": "#000000", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 1, + "versionNonce": 0, + "width": 0, + "x": -10, + "y": 0, + }, + ], + }, + Object { + "appState": Object { + "editingGroupId": null, + "editingLinearElement": null, + "name": "Untitled-201933152653", + "selectedElementIds": Object { + "id0": true, + }, + "viewBackgroundColor": "#ffffff", + }, + "elements": Array [ + Object { + "angle": 0, + "backgroundColor": "transparent", + "boundElementIds": null, + "fillStyle": "hachure", + "groupIds": Array [], + "height": 20, + "id": "id0", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 449462985, + "strokeColor": "#000000", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 2, + "versionNonce": 453191, + "width": 20, + "x": -10, + "y": 0, + }, + ], + }, + ], +} +`; + +exports[`contextMenu element selecting 'Copy styles' in context menu copies styles: [end of test] number of elements 1`] = `1`; + +exports[`contextMenu element selecting 'Copy styles' in context menu copies styles: [end of test] number of renders 1`] = `10`; + +exports[`contextMenu element selecting 'Delete' in context menu deletes element: [end of test] appState 1`] = ` +Object { + "collaborators": Map {}, + "currentChartType": "bar", + "currentItemBackgroundColor": "transparent", + "currentItemEndArrowhead": "arrow", + "currentItemFillStyle": "hachure", + "currentItemFontFamily": 1, + "currentItemFontSize": 20, + "currentItemLinearStrokeSharpness": "round", + "currentItemOpacity": 100, + "currentItemRoughness": 1, + "currentItemStartArrowhead": null, + "currentItemStrokeColor": "#000000", + "currentItemStrokeSharpness": "sharp", + "currentItemStrokeStyle": "solid", + "currentItemStrokeWidth": 1, + "currentItemTextAlign": "left", + "cursorButton": "up", + "draggingElement": null, + "editingElement": null, + "editingGroupId": null, + "editingLinearElement": null, + "elementLocked": false, + "elementType": "selection", + "errorMessage": null, + "exportBackground": true, + "exportEmbedScene": false, + "exportWithDarkMode": false, + "fileHandle": null, + "gridSize": null, + "height": 100, + "isBindingEnabled": true, + "isLibraryOpen": false, + "isLoading": false, + "isResizing": false, + "isRotating": false, + "lastPointerDownWith": "mouse", + "multiElement": null, + "name": "Untitled-201933152653", + "offsetLeft": 20, + "offsetTop": 10, + "openMenu": null, + "pasteDialog": Object { + "data": null, + "shown": false, + }, + "previousSelectedElementIds": Object {}, + "resizingElement": null, + "scrollX": 0, + "scrollY": 0, + "scrolledOutside": false, + "selectedElementIds": Object {}, + "selectedGroupIds": Object {}, + "selectionElement": null, + "shouldAddWatermark": false, + "shouldCacheIgnoreZoom": false, + "showHelpDialog": false, + "showStats": false, + "startBoundElement": null, + "suggestedBindings": Array [], + "theme": "light", + "toastMessage": null, + "viewBackgroundColor": "#ffffff", + "viewModeEnabled": false, + "width": 200, + "zenModeEnabled": false, + "zoom": Object { + "translation": Object { + "x": 0, + "y": 0, + }, + "value": 1, + }, +} +`; + +exports[`contextMenu element selecting 'Delete' in context menu deletes element: [end of test] element 0 1`] = ` +Object { + "angle": 0, + "backgroundColor": "transparent", + "boundElementIds": null, + "fillStyle": "hachure", + "groupIds": Array [], + "height": 20, + "id": "id0", + "isDeleted": true, + "opacity": 100, + "roughness": 1, + "seed": 1278240551, + "strokeColor": "#000000", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 3, + "versionNonce": 453191, + "width": 20, + "x": -10, + "y": 0, +} +`; + +exports[`contextMenu element selecting 'Delete' in context menu deletes element: [end of test] history 1`] = ` +Object { + "recording": false, + "redoStack": Array [], + "stateHistory": Array [ + Object { + "appState": Object { + "editingGroupId": null, + "editingLinearElement": null, + "name": "Untitled-201933152653", + "selectedElementIds": Object {}, + "viewBackgroundColor": "#ffffff", + }, + "elements": Array [], + }, + Object { + "appState": Object { + "editingGroupId": null, + "editingLinearElement": null, + "name": "Untitled-201933152653", + "selectedElementIds": Object {}, + "viewBackgroundColor": "#ffffff", + }, + "elements": Array [ + Object { + "angle": 0, + "backgroundColor": "transparent", + "boundElementIds": null, + "fillStyle": "hachure", + "groupIds": Array [], + "height": 0, + "id": "id0", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 1278240551, + "strokeColor": "#000000", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 1, + "versionNonce": 0, + "width": 0, + "x": -10, + "y": 0, + }, + ], + }, + Object { + "appState": Object { + "editingGroupId": null, + "editingLinearElement": null, + "name": "Untitled-201933152653", + "selectedElementIds": Object { + "id0": true, + }, + "viewBackgroundColor": "#ffffff", + }, + "elements": Array [ + Object { + "angle": 0, + "backgroundColor": "transparent", + "boundElementIds": null, + "fillStyle": "hachure", + "groupIds": Array [], + "height": 20, + "id": "id0", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 1278240551, + "strokeColor": "#000000", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 2, + "versionNonce": 449462985, + "width": 20, + "x": -10, + "y": 0, + }, + ], + }, + Object { + "appState": Object { + "editingGroupId": null, + "editingLinearElement": null, + "name": "Untitled-201933152653", + "selectedElementIds": Object {}, + "viewBackgroundColor": "#ffffff", + }, + "elements": Array [ + Object { + "angle": 0, + "backgroundColor": "transparent", + "boundElementIds": null, + "fillStyle": "hachure", + "groupIds": Array [], + "height": 20, + "id": "id0", + "isDeleted": true, + "opacity": 100, + "roughness": 1, + "seed": 1278240551, + "strokeColor": "#000000", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 3, + "versionNonce": 453191, + "width": 20, + "x": -10, + "y": 0, + }, + ], + }, + ], +} +`; + +exports[`contextMenu element selecting 'Delete' in context menu deletes element: [end of test] number of elements 1`] = `1`; + +exports[`contextMenu element selecting 'Delete' in context menu deletes element: [end of test] number of renders 1`] = `10`; + +exports[`contextMenu element selecting 'Duplicate' in context menu duplicates element: [end of test] appState 1`] = ` +Object { + "collaborators": Map {}, + "currentChartType": "bar", + "currentItemBackgroundColor": "transparent", + "currentItemEndArrowhead": "arrow", + "currentItemFillStyle": "hachure", + "currentItemFontFamily": 1, + "currentItemFontSize": 20, + "currentItemLinearStrokeSharpness": "round", + "currentItemOpacity": 100, + "currentItemRoughness": 1, + "currentItemStartArrowhead": null, + "currentItemStrokeColor": "#000000", + "currentItemStrokeSharpness": "sharp", + "currentItemStrokeStyle": "solid", + "currentItemStrokeWidth": 1, + "currentItemTextAlign": "left", + "cursorButton": "up", + "draggingElement": null, + "editingElement": null, + "editingGroupId": null, + "editingLinearElement": null, + "elementLocked": false, + "elementType": "selection", + "errorMessage": null, + "exportBackground": true, + "exportEmbedScene": false, + "exportWithDarkMode": false, + "fileHandle": null, + "gridSize": null, + "height": 100, + "isBindingEnabled": true, + "isLibraryOpen": false, + "isLoading": false, + "isResizing": false, + "isRotating": false, + "lastPointerDownWith": "mouse", + "multiElement": null, + "name": "Untitled-201933152653", + "offsetLeft": 20, + "offsetTop": 10, + "openMenu": null, + "pasteDialog": Object { + "data": null, + "shown": false, + }, + "previousSelectedElementIds": Object {}, + "resizingElement": null, + "scrollX": 0, + "scrollY": 0, + "scrolledOutside": false, + "selectedElementIds": Object { + "id0_copy": true, + }, + "selectedGroupIds": Object {}, + "selectionElement": null, + "shouldAddWatermark": false, + "shouldCacheIgnoreZoom": false, + "showHelpDialog": false, + "showStats": false, + "startBoundElement": null, + "suggestedBindings": Array [], + "theme": "light", + "toastMessage": null, + "viewBackgroundColor": "#ffffff", + "viewModeEnabled": false, + "width": 200, + "zenModeEnabled": false, + "zoom": Object { + "translation": Object { + "x": 0, + "y": 0, + }, + "value": 1, + }, +} +`; + +exports[`contextMenu element selecting 'Duplicate' in context menu duplicates element: [end of test] element 0 1`] = ` +Object { + "angle": 0, + "backgroundColor": "transparent", + "boundElementIds": null, + "fillStyle": "hachure", + "groupIds": Array [], + "height": 20, + "id": "id0", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 1278240551, + "strokeColor": "#000000", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 2, + "versionNonce": 449462985, + "width": 20, + "x": -10, + "y": 0, +} +`; + +exports[`contextMenu element selecting 'Duplicate' in context menu duplicates element: [end of test] element 1 1`] = ` +Object { + "angle": 0, + "backgroundColor": "transparent", + "boundElementIds": null, + "fillStyle": "hachure", + "groupIds": Array [], + "height": 20, + "id": "id0_copy", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 453191, + "strokeColor": "#000000", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 2, + "versionNonce": 449462985, + "width": 20, + "x": 0, + "y": 10, +} +`; + +exports[`contextMenu element selecting 'Duplicate' in context menu duplicates element: [end of test] history 1`] = ` +Object { + "recording": false, + "redoStack": Array [], + "stateHistory": Array [ + Object { + "appState": Object { + "editingGroupId": null, + "editingLinearElement": null, + "name": "Untitled-201933152653", + "selectedElementIds": Object {}, + "viewBackgroundColor": "#ffffff", + }, + "elements": Array [], + }, + Object { + "appState": Object { + "editingGroupId": null, + "editingLinearElement": null, + "name": "Untitled-201933152653", + "selectedElementIds": Object {}, + "viewBackgroundColor": "#ffffff", + }, + "elements": Array [ + Object { + "angle": 0, + "backgroundColor": "transparent", + "boundElementIds": null, + "fillStyle": "hachure", + "groupIds": Array [], + "height": 0, + "id": "id0", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 1278240551, + "strokeColor": "#000000", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 1, + "versionNonce": 0, + "width": 0, + "x": -10, + "y": 0, + }, + ], + }, + Object { + "appState": Object { + "editingGroupId": null, + "editingLinearElement": null, + "name": "Untitled-201933152653", + "selectedElementIds": Object { + "id0": true, + }, + "viewBackgroundColor": "#ffffff", + }, + "elements": Array [ + Object { + "angle": 0, + "backgroundColor": "transparent", + "boundElementIds": null, + "fillStyle": "hachure", + "groupIds": Array [], + "height": 20, + "id": "id0", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 1278240551, + "strokeColor": "#000000", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 2, + "versionNonce": 449462985, + "width": 20, + "x": -10, + "y": 0, + }, + ], + }, + Object { + "appState": Object { + "editingGroupId": null, + "editingLinearElement": null, + "name": "Untitled-201933152653", + "selectedElementIds": Object { + "id0_copy": true, + }, + "viewBackgroundColor": "#ffffff", + }, + "elements": Array [ + Object { + "angle": 0, + "backgroundColor": "transparent", + "boundElementIds": null, + "fillStyle": "hachure", + "groupIds": Array [], + "height": 20, + "id": "id0", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 1278240551, + "strokeColor": "#000000", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 2, + "versionNonce": 449462985, + "width": 20, + "x": -10, + "y": 0, + }, + Object { + "angle": 0, + "backgroundColor": "transparent", + "boundElementIds": null, + "fillStyle": "hachure", + "groupIds": Array [], + "height": 20, + "id": "id0_copy", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 453191, + "strokeColor": "#000000", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 2, + "versionNonce": 449462985, + "width": 20, + "x": 0, + "y": 10, + }, + ], + }, + ], +} +`; + +exports[`contextMenu element selecting 'Duplicate' in context menu duplicates element: [end of test] number of elements 1`] = `2`; + +exports[`contextMenu element selecting 'Duplicate' in context menu duplicates element: [end of test] number of renders 1`] = `10`; + +exports[`contextMenu element selecting 'Group selection' in context menu groups selected elements: [end of test] appState 1`] = ` +Object { + "collaborators": Map {}, + "currentChartType": "bar", + "currentItemBackgroundColor": "transparent", + "currentItemEndArrowhead": "arrow", + "currentItemFillStyle": "hachure", + "currentItemFontFamily": 1, + "currentItemFontSize": 20, + "currentItemLinearStrokeSharpness": "round", + "currentItemOpacity": 100, + "currentItemRoughness": 1, + "currentItemStartArrowhead": null, + "currentItemStrokeColor": "#000000", + "currentItemStrokeSharpness": "sharp", + "currentItemStrokeStyle": "solid", + "currentItemStrokeWidth": 1, + "currentItemTextAlign": "left", + "cursorButton": "up", + "draggingElement": null, + "editingElement": null, + "editingGroupId": null, + "editingLinearElement": null, + "elementLocked": false, + "elementType": "selection", + "errorMessage": null, + "exportBackground": true, + "exportEmbedScene": false, + "exportWithDarkMode": false, + "fileHandle": null, + "gridSize": null, + "height": 100, + "isBindingEnabled": true, + "isLibraryOpen": false, + "isLoading": false, + "isResizing": false, + "isRotating": false, + "lastPointerDownWith": "mouse", + "multiElement": null, + "name": "Untitled-201933152653", + "offsetLeft": 20, + "offsetTop": 10, + "openMenu": null, + "pasteDialog": Object { + "data": null, + "shown": false, + }, + "previousSelectedElementIds": Object { + "id1": true, + }, + "resizingElement": null, + "scrollX": 0, + "scrollY": 0, + "scrolledOutside": false, + "selectedElementIds": Object { + "id0": true, + "id1": true, + "id2": true, + }, + "selectedGroupIds": Object { + "id3": true, + }, + "selectionElement": null, + "shouldAddWatermark": false, + "shouldCacheIgnoreZoom": false, + "showHelpDialog": false, + "showStats": false, + "startBoundElement": null, + "suggestedBindings": Array [], + "theme": "light", + "toastMessage": null, + "viewBackgroundColor": "#ffffff", + "viewModeEnabled": false, + "width": 200, + "zenModeEnabled": false, + "zoom": Object { + "translation": Object { + "x": 0, + "y": 0, + }, + "value": 1, + }, +} +`; + +exports[`contextMenu element selecting 'Group selection' in context menu groups selected elements: [end of test] element 0 1`] = ` +Object { + "angle": 0, + "backgroundColor": "transparent", + "boundElementIds": null, + "fillStyle": "hachure", + "groupIds": Array [ + "id3", + ], + "height": 20, + "id": "id0", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 1278240551, + "strokeColor": "#000000", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 3, + "versionNonce": 1150084233, + "width": 20, + "x": -10, + "y": 0, +} +`; + +exports[`contextMenu element selecting 'Group selection' in context menu groups selected elements: [end of test] element 1 1`] = ` +Object { + "angle": 0, + "backgroundColor": "transparent", + "boundElementIds": null, + "fillStyle": "hachure", + "groupIds": Array [ + "id3", + ], + "height": 20, + "id": "id1", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 453191, + "strokeColor": "#000000", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 3, + "versionNonce": 1116226695, + "width": 20, + "x": 20, + "y": 30, +} +`; + +exports[`contextMenu element selecting 'Group selection' in context menu groups selected elements: [end of test] history 1`] = ` +Object { + "recording": false, + "redoStack": Array [], + "stateHistory": Array [ + Object { + "appState": Object { + "editingGroupId": null, + "editingLinearElement": null, + "name": "Untitled-201933152653", + "selectedElementIds": Object {}, + "viewBackgroundColor": "#ffffff", + }, + "elements": Array [], + }, + Object { + "appState": Object { + "editingGroupId": null, + "editingLinearElement": null, + "name": "Untitled-201933152653", + "selectedElementIds": Object {}, + "viewBackgroundColor": "#ffffff", + }, + "elements": Array [ + Object { + "angle": 0, + "backgroundColor": "transparent", + "boundElementIds": null, + "fillStyle": "hachure", + "groupIds": Array [], + "height": 0, + "id": "id0", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 1278240551, + "strokeColor": "#000000", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 1, + "versionNonce": 0, + "width": 0, + "x": -10, + "y": 0, + }, + ], + }, + Object { + "appState": Object { + "editingGroupId": null, + "editingLinearElement": null, + "name": "Untitled-201933152653", + "selectedElementIds": Object { + "id0": true, + }, + "viewBackgroundColor": "#ffffff", + }, + "elements": Array [ + Object { + "angle": 0, + "backgroundColor": "transparent", + "boundElementIds": null, + "fillStyle": "hachure", + "groupIds": Array [], + "height": 20, + "id": "id0", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 1278240551, + "strokeColor": "#000000", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 2, + "versionNonce": 449462985, + "width": 20, + "x": -10, + "y": 0, + }, + ], + }, + Object { + "appState": Object { + "editingGroupId": null, + "editingLinearElement": null, + "name": "Untitled-201933152653", + "selectedElementIds": Object { + "id1": true, + }, + "viewBackgroundColor": "#ffffff", + }, + "elements": Array [ + Object { + "angle": 0, + "backgroundColor": "transparent", + "boundElementIds": null, + "fillStyle": "hachure", + "groupIds": Array [], + "height": 20, + "id": "id0", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 1278240551, + "strokeColor": "#000000", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 2, + "versionNonce": 449462985, + "width": 20, + "x": -10, + "y": 0, + }, + Object { + "angle": 0, + "backgroundColor": "transparent", + "boundElementIds": null, + "fillStyle": "hachure", + "groupIds": Array [], + "height": 20, + "id": "id1", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 453191, + "strokeColor": "#000000", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 2, + "versionNonce": 401146281, + "width": 20, + "x": 20, + "y": 30, + }, + ], + }, + Object { + "appState": Object { + "editingGroupId": null, + "editingLinearElement": null, + "name": "Untitled-201933152653", + "selectedElementIds": Object { + "id0": true, + "id1": true, + "id2": true, + }, + "viewBackgroundColor": "#ffffff", + }, + "elements": Array [ + Object { + "angle": 0, + "backgroundColor": "transparent", + "boundElementIds": null, + "fillStyle": "hachure", + "groupIds": Array [ + "id3", + ], + "height": 20, + "id": "id0", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 1278240551, + "strokeColor": "#000000", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 3, + "versionNonce": 1150084233, + "width": 20, + "x": -10, + "y": 0, + }, + Object { + "angle": 0, + "backgroundColor": "transparent", + "boundElementIds": null, + "fillStyle": "hachure", + "groupIds": Array [ + "id3", + ], + "height": 20, + "id": "id1", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 453191, + "strokeColor": "#000000", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 3, + "versionNonce": 1116226695, + "width": 20, + "x": 20, + "y": 30, + }, + ], + }, + ], +} +`; + +exports[`contextMenu element selecting 'Group selection' in context menu groups selected elements: [end of test] number of elements 1`] = `2`; + +exports[`contextMenu element selecting 'Group selection' in context menu groups selected elements: [end of test] number of renders 1`] = `16`; + +exports[`contextMenu element selecting 'Paste styles' in context menu pastes styles: [end of test] appState 1`] = ` +Object { + "collaborators": Map {}, + "currentChartType": "bar", + "currentItemBackgroundColor": "#e64980", + "currentItemEndArrowhead": "arrow", + "currentItemFillStyle": "cross-hatch", + "currentItemFontFamily": 1, + "currentItemFontSize": 20, + "currentItemLinearStrokeSharpness": "round", + "currentItemOpacity": 60, + "currentItemRoughness": 2, + "currentItemStartArrowhead": null, + "currentItemStrokeColor": "#c92a2a", + "currentItemStrokeSharpness": "sharp", + "currentItemStrokeStyle": "dotted", + "currentItemStrokeWidth": 2, + "currentItemTextAlign": "left", + "cursorButton": "up", + "draggingElement": null, + "editingElement": null, + "editingGroupId": null, + "editingLinearElement": null, + "elementLocked": false, + "elementType": "selection", + "errorMessage": null, + "exportBackground": true, + "exportEmbedScene": false, + "exportWithDarkMode": false, + "fileHandle": null, + "gridSize": null, + "height": 100, + "isBindingEnabled": true, + "isLibraryOpen": false, + "isLoading": false, + "isResizing": false, + "isRotating": false, + "lastPointerDownWith": "mouse", + "multiElement": null, + "name": "Untitled-201933152653", + "offsetLeft": 20, + "offsetTop": 10, + "openMenu": null, + "pasteDialog": Object { + "data": null, + "shown": false, + }, + "previousSelectedElementIds": Object {}, + "resizingElement": null, + "scrollX": 0, + "scrollY": 0, + "scrolledOutside": false, + "selectedElementIds": Object { + "id0": true, + }, + "selectedGroupIds": Object {}, + "selectionElement": null, + "shouldAddWatermark": false, + "shouldCacheIgnoreZoom": false, + "showHelpDialog": false, + "showStats": false, + "startBoundElement": null, + "suggestedBindings": Array [], + "theme": "light", + "toastMessage": "Copied styles.", + "viewBackgroundColor": "#ffffff", + "viewModeEnabled": false, + "width": 200, + "zenModeEnabled": false, + "zoom": Object { + "translation": Object { + "x": 0, + "y": 0, + }, + "value": 1, + }, +} +`; + +exports[`contextMenu element selecting 'Paste styles' in context menu pastes styles: [end of test] element 0 1`] = ` +Object { + "angle": 0, + "backgroundColor": "#e64980", + "boundElementIds": null, + "fillStyle": "cross-hatch", + "groupIds": Array [], + "height": 20, + "id": "id0", + "isDeleted": false, + "opacity": 60, + "roughness": 2, + "seed": 1278240551, + "strokeColor": "#c92a2a", + "strokeSharpness": "sharp", + "strokeStyle": "dotted", + "strokeWidth": 2, + "type": "rectangle", + "version": 3, + "versionNonce": 23633383, + "width": 20, + "x": -10, + "y": 0, +} +`; + +exports[`contextMenu element selecting 'Paste styles' in context menu pastes styles: [end of test] element 1 1`] = ` +Object { + "angle": 0, + "backgroundColor": "#e64980", + "boundElementIds": null, + "fillStyle": "cross-hatch", + "groupIds": Array [], + "height": 20, + "id": "id1", + "isDeleted": false, + "opacity": 60, + "roughness": 2, + "seed": 400692809, + "strokeColor": "#c92a2a", + "strokeSharpness": "sharp", + "strokeStyle": "dotted", + "strokeWidth": 2, + "type": "rectangle", + "version": 9, + "versionNonce": 1505387817, + "width": 20, + "x": 20, + "y": 30, +} +`; + +exports[`contextMenu element selecting 'Paste styles' in context menu pastes styles: [end of test] history 1`] = ` +Object { + "recording": false, + "redoStack": Array [], + "stateHistory": Array [ + Object { + "appState": Object { + "editingGroupId": null, + "editingLinearElement": null, + "name": "Untitled-201933152653", + "selectedElementIds": Object {}, + "viewBackgroundColor": "#ffffff", + }, + "elements": Array [], + }, + Object { + "appState": Object { + "editingGroupId": null, + "editingLinearElement": null, + "name": "Untitled-201933152653", + "selectedElementIds": Object {}, + "viewBackgroundColor": "#ffffff", + }, + "elements": Array [ + Object { + "angle": 0, + "backgroundColor": "transparent", + "boundElementIds": null, + "fillStyle": "hachure", + "groupIds": Array [], + "height": 0, + "id": "id0", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 1278240551, + "strokeColor": "#000000", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 1, + "versionNonce": 0, + "width": 0, + "x": -10, + "y": 0, + }, + ], + }, + Object { + "appState": Object { + "editingGroupId": null, + "editingLinearElement": null, + "name": "Untitled-201933152653", + "selectedElementIds": Object { + "id0": true, + }, + "viewBackgroundColor": "#ffffff", + }, + "elements": Array [ + Object { + "angle": 0, + "backgroundColor": "transparent", + "boundElementIds": null, + "fillStyle": "hachure", + "groupIds": Array [], + "height": 20, + "id": "id0", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 1278240551, + "strokeColor": "#000000", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 2, + "versionNonce": 449462985, + "width": 20, + "x": -10, + "y": 0, + }, + ], + }, + Object { + "appState": Object { + "editingGroupId": null, + "editingLinearElement": null, + "name": "Untitled-201933152653", + "selectedElementIds": Object { + "id1": true, + }, + "viewBackgroundColor": "#ffffff", + }, + "elements": Array [ + Object { + "angle": 0, + "backgroundColor": "transparent", + "boundElementIds": null, + "fillStyle": "hachure", + "groupIds": Array [], + "height": 20, + "id": "id0", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 1278240551, + "strokeColor": "#000000", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 2, + "versionNonce": 449462985, + "width": 20, + "x": -10, + "y": 0, + }, + Object { + "angle": 0, + "backgroundColor": "transparent", + "boundElementIds": null, + "fillStyle": "hachure", + "groupIds": Array [], + "height": 20, + "id": "id1", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 453191, + "strokeColor": "#000000", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 2, + "versionNonce": 401146281, + "width": 20, + "x": 20, + "y": 30, + }, + ], + }, + Object { + "appState": Object { + "editingGroupId": null, + "editingLinearElement": null, + "name": "Untitled-201933152653", + "selectedElementIds": Object { + "id1": true, + }, + "viewBackgroundColor": "#ffffff", + }, + "elements": Array [ + Object { + "angle": 0, + "backgroundColor": "transparent", + "boundElementIds": null, + "fillStyle": "hachure", + "groupIds": Array [], + "height": 20, + "id": "id0", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 1278240551, + "strokeColor": "#000000", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 2, + "versionNonce": 449462985, + "width": 20, + "x": -10, + "y": 0, + }, + Object { + "angle": 0, + "backgroundColor": "transparent", + "boundElementIds": null, + "fillStyle": "hachure", + "groupIds": Array [], + "height": 20, + "id": "id1", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 453191, + "strokeColor": "#c92a2a", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 3, + "versionNonce": 2019559783, + "width": 20, + "x": 20, + "y": 30, + }, + ], + }, + Object { + "appState": Object { + "editingGroupId": null, + "editingLinearElement": null, + "name": "Untitled-201933152653", + "selectedElementIds": Object { + "id1": true, + }, + "viewBackgroundColor": "#ffffff", + }, + "elements": Array [ + Object { + "angle": 0, + "backgroundColor": "transparent", + "boundElementIds": null, + "fillStyle": "hachure", + "groupIds": Array [], + "height": 20, + "id": "id0", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 1278240551, + "strokeColor": "#000000", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 2, + "versionNonce": 449462985, + "width": 20, + "x": -10, + "y": 0, + }, + Object { + "angle": 0, + "backgroundColor": "#e64980", + "boundElementIds": null, + "fillStyle": "hachure", + "groupIds": Array [], + "height": 20, + "id": "id1", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 453191, + "strokeColor": "#c92a2a", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 4, + "versionNonce": 1150084233, + "width": 20, + "x": 20, + "y": 30, + }, + ], + }, + Object { + "appState": Object { + "editingGroupId": null, + "editingLinearElement": null, + "name": "Untitled-201933152653", + "selectedElementIds": Object { + "id1": true, + }, + "viewBackgroundColor": "#ffffff", + }, + "elements": Array [ + Object { + "angle": 0, + "backgroundColor": "transparent", + "boundElementIds": null, + "fillStyle": "hachure", + "groupIds": Array [], + "height": 20, + "id": "id0", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 1278240551, + "strokeColor": "#000000", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 2, + "versionNonce": 449462985, + "width": 20, + "x": -10, + "y": 0, + }, + Object { + "angle": 0, + "backgroundColor": "#e64980", + "boundElementIds": null, + "fillStyle": "cross-hatch", + "groupIds": Array [], + "height": 20, + "id": "id1", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 453191, + "strokeColor": "#c92a2a", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 5, + "versionNonce": 1116226695, + "width": 20, + "x": 20, + "y": 30, + }, + ], + }, + Object { + "appState": Object { + "editingGroupId": null, + "editingLinearElement": null, + "name": "Untitled-201933152653", + "selectedElementIds": Object { + "id1": true, + }, + "viewBackgroundColor": "#ffffff", + }, + "elements": Array [ + Object { + "angle": 0, + "backgroundColor": "transparent", + "boundElementIds": null, + "fillStyle": "hachure", + "groupIds": Array [], + "height": 20, + "id": "id0", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 1278240551, + "strokeColor": "#000000", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 2, + "versionNonce": 449462985, + "width": 20, + "x": -10, + "y": 0, + }, + Object { + "angle": 0, + "backgroundColor": "#e64980", + "boundElementIds": null, + "fillStyle": "cross-hatch", + "groupIds": Array [], + "height": 20, + "id": "id1", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 453191, + "strokeColor": "#c92a2a", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 2, + "type": "rectangle", + "version": 6, + "versionNonce": 1014066025, + "width": 20, + "x": 20, + "y": 30, + }, + ], + }, + Object { + "appState": Object { + "editingGroupId": null, + "editingLinearElement": null, + "name": "Untitled-201933152653", + "selectedElementIds": Object { + "id1": true, + }, + "viewBackgroundColor": "#ffffff", + }, + "elements": Array [ + Object { + "angle": 0, + "backgroundColor": "transparent", + "boundElementIds": null, + "fillStyle": "hachure", + "groupIds": Array [], + "height": 20, + "id": "id0", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 1278240551, + "strokeColor": "#000000", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 2, + "versionNonce": 449462985, + "width": 20, + "x": -10, + "y": 0, + }, + Object { + "angle": 0, + "backgroundColor": "#e64980", + "boundElementIds": null, + "fillStyle": "cross-hatch", + "groupIds": Array [], + "height": 20, + "id": "id1", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 453191, + "strokeColor": "#c92a2a", + "strokeSharpness": "sharp", + "strokeStyle": "dotted", + "strokeWidth": 2, + "type": "rectangle", + "version": 7, + "versionNonce": 238820263, + "width": 20, + "x": 20, + "y": 30, + }, + ], + }, + Object { + "appState": Object { + "editingGroupId": null, + "editingLinearElement": null, + "name": "Untitled-201933152653", + "selectedElementIds": Object { + "id1": true, + }, + "viewBackgroundColor": "#ffffff", + }, + "elements": Array [ + Object { + "angle": 0, + "backgroundColor": "transparent", + "boundElementIds": null, + "fillStyle": "hachure", + "groupIds": Array [], + "height": 20, + "id": "id0", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 1278240551, + "strokeColor": "#000000", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 2, + "versionNonce": 449462985, + "width": 20, + "x": -10, + "y": 0, + }, + Object { + "angle": 0, + "backgroundColor": "#e64980", + "boundElementIds": null, + "fillStyle": "cross-hatch", + "groupIds": Array [], + "height": 20, + "id": "id1", + "isDeleted": false, + "opacity": 100, + "roughness": 2, + "seed": 400692809, + "strokeColor": "#c92a2a", + "strokeSharpness": "sharp", + "strokeStyle": "dotted", + "strokeWidth": 2, + "type": "rectangle", + "version": 8, + "versionNonce": 1604849351, + "width": 20, + "x": 20, + "y": 30, + }, + ], + }, + Object { + "appState": Object { + "editingGroupId": null, + "editingLinearElement": null, + "name": "Untitled-201933152653", + "selectedElementIds": Object { + "id1": true, + }, + "viewBackgroundColor": "#ffffff", + }, + "elements": Array [ + Object { + "angle": 0, + "backgroundColor": "transparent", + "boundElementIds": null, + "fillStyle": "hachure", + "groupIds": Array [], + "height": 20, + "id": "id0", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 1278240551, + "strokeColor": "#000000", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 2, + "versionNonce": 449462985, + "width": 20, + "x": -10, + "y": 0, + }, + Object { + "angle": 0, + "backgroundColor": "#e64980", + "boundElementIds": null, + "fillStyle": "cross-hatch", + "groupIds": Array [], + "height": 20, + "id": "id1", + "isDeleted": false, + "opacity": 60, + "roughness": 2, + "seed": 400692809, + "strokeColor": "#c92a2a", + "strokeSharpness": "sharp", + "strokeStyle": "dotted", + "strokeWidth": 2, + "type": "rectangle", + "version": 9, + "versionNonce": 1505387817, + "width": 20, + "x": 20, + "y": 30, + }, + ], + }, + Object { + "appState": Object { + "editingGroupId": null, + "editingLinearElement": null, + "name": "Untitled-201933152653", + "selectedElementIds": Object { + "id0": true, + }, + "viewBackgroundColor": "#ffffff", + }, + "elements": Array [ + Object { + "angle": 0, + "backgroundColor": "#e64980", + "boundElementIds": null, + "fillStyle": "cross-hatch", + "groupIds": Array [], + "height": 20, + "id": "id0", + "isDeleted": false, + "opacity": 60, + "roughness": 2, + "seed": 1278240551, + "strokeColor": "#c92a2a", + "strokeSharpness": "sharp", + "strokeStyle": "dotted", + "strokeWidth": 2, + "type": "rectangle", + "version": 3, + "versionNonce": 23633383, + "width": 20, + "x": -10, + "y": 0, + }, + Object { + "angle": 0, + "backgroundColor": "#e64980", + "boundElementIds": null, + "fillStyle": "cross-hatch", + "groupIds": Array [], + "height": 20, + "id": "id1", + "isDeleted": false, + "opacity": 60, + "roughness": 2, + "seed": 400692809, + "strokeColor": "#c92a2a", + "strokeSharpness": "sharp", + "strokeStyle": "dotted", + "strokeWidth": 2, + "type": "rectangle", + "version": 9, + "versionNonce": 1505387817, + "width": 20, + "x": 20, + "y": 30, + }, + ], + }, + ], +} +`; + +exports[`contextMenu element selecting 'Paste styles' in context menu pastes styles: [end of test] number of elements 1`] = `2`; + +exports[`contextMenu element selecting 'Paste styles' in context menu pastes styles: [end of test] number of renders 1`] = `25`; + +exports[`contextMenu element selecting 'Send backward' in context menu sends element backward: [end of test] appState 1`] = ` +Object { + "collaborators": Map {}, + "currentChartType": "bar", + "currentItemBackgroundColor": "transparent", + "currentItemEndArrowhead": "arrow", + "currentItemFillStyle": "hachure", + "currentItemFontFamily": 1, + "currentItemFontSize": 20, + "currentItemLinearStrokeSharpness": "round", + "currentItemOpacity": 100, + "currentItemRoughness": 1, + "currentItemStartArrowhead": null, + "currentItemStrokeColor": "#000000", + "currentItemStrokeSharpness": "sharp", + "currentItemStrokeStyle": "solid", + "currentItemStrokeWidth": 1, + "currentItemTextAlign": "left", + "cursorButton": "up", + "draggingElement": null, + "editingElement": null, + "editingGroupId": null, + "editingLinearElement": null, + "elementLocked": false, + "elementType": "selection", + "errorMessage": null, + "exportBackground": true, + "exportEmbedScene": false, + "exportWithDarkMode": false, + "fileHandle": null, + "gridSize": null, + "height": 100, + "isBindingEnabled": true, + "isLibraryOpen": false, + "isLoading": false, + "isResizing": false, + "isRotating": false, + "lastPointerDownWith": "mouse", + "multiElement": null, + "name": "Untitled-201933152653", + "offsetLeft": 20, + "offsetTop": 10, + "openMenu": null, + "pasteDialog": Object { + "data": null, + "shown": false, + }, + "previousSelectedElementIds": Object {}, + "resizingElement": null, + "scrollX": 0, + "scrollY": 0, + "scrolledOutside": false, + "selectedElementIds": Object { + "id1": true, + }, + "selectedGroupIds": Object {}, + "selectionElement": null, + "shouldAddWatermark": false, + "shouldCacheIgnoreZoom": false, + "showHelpDialog": false, + "showStats": false, + "startBoundElement": null, + "suggestedBindings": Array [], + "theme": "light", + "toastMessage": null, + "viewBackgroundColor": "#ffffff", + "viewModeEnabled": false, + "width": 200, + "zenModeEnabled": false, + "zoom": Object { + "translation": Object { + "x": 0, + "y": 0, + }, + "value": 1, + }, +} +`; + +exports[`contextMenu element selecting 'Send backward' in context menu sends element backward: [end of test] element 0 1`] = ` +Object { + "angle": 0, + "backgroundColor": "transparent", + "boundElementIds": null, + "fillStyle": "hachure", + "groupIds": Array [], + "height": 20, + "id": "id1", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 453191, + "strokeColor": "#000000", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 2, + "versionNonce": 401146281, + "width": 20, + "x": 20, + "y": 30, +} +`; + +exports[`contextMenu element selecting 'Send backward' in context menu sends element backward: [end of test] element 1 1`] = ` +Object { + "angle": 0, + "backgroundColor": "transparent", + "boundElementIds": null, + "fillStyle": "hachure", + "groupIds": Array [], + "height": 20, + "id": "id0", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 1278240551, + "strokeColor": "#000000", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 2, + "versionNonce": 449462985, + "width": 20, + "x": -10, + "y": 0, +} +`; + +exports[`contextMenu element selecting 'Send backward' in context menu sends element backward: [end of test] history 1`] = ` +Object { + "recording": false, + "redoStack": Array [], + "stateHistory": Array [ + Object { + "appState": Object { + "editingGroupId": null, + "editingLinearElement": null, + "name": "Untitled-201933152653", + "selectedElementIds": Object {}, + "viewBackgroundColor": "#ffffff", + }, + "elements": Array [], + }, + Object { + "appState": Object { + "editingGroupId": null, + "editingLinearElement": null, + "name": "Untitled-201933152653", + "selectedElementIds": Object { + "id0": true, + }, + "viewBackgroundColor": "#ffffff", + }, + "elements": Array [ + Object { + "angle": 0, + "backgroundColor": "transparent", + "boundElementIds": null, + "fillStyle": "hachure", + "groupIds": Array [], + "height": 20, + "id": "id0", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 1278240551, + "strokeColor": "#000000", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 2, + "versionNonce": 449462985, + "width": 20, + "x": -10, + "y": 0, + }, + ], + }, + Object { + "appState": Object { + "editingGroupId": null, + "editingLinearElement": null, + "name": "Untitled-201933152653", + "selectedElementIds": Object { + "id1": true, + }, + "viewBackgroundColor": "#ffffff", + }, + "elements": Array [ + Object { + "angle": 0, + "backgroundColor": "transparent", + "boundElementIds": null, + "fillStyle": "hachure", + "groupIds": Array [], + "height": 20, + "id": "id0", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 1278240551, + "strokeColor": "#000000", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 2, + "versionNonce": 449462985, + "width": 20, + "x": -10, + "y": 0, + }, + Object { + "angle": 0, + "backgroundColor": "transparent", + "boundElementIds": null, + "fillStyle": "hachure", + "groupIds": Array [], + "height": 20, + "id": "id1", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 453191, + "strokeColor": "#000000", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 2, + "versionNonce": 401146281, + "width": 20, + "x": 20, + "y": 30, + }, + ], + }, + Object { + "appState": Object { + "editingGroupId": null, + "editingLinearElement": null, + "name": "Untitled-201933152653", + "selectedElementIds": Object { + "id1": true, + }, + "viewBackgroundColor": "#ffffff", + }, + "elements": Array [ + Object { + "angle": 0, + "backgroundColor": "transparent", + "boundElementIds": null, + "fillStyle": "hachure", + "groupIds": Array [], + "height": 20, + "id": "id1", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 453191, + "strokeColor": "#000000", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 2, + "versionNonce": 401146281, + "width": 20, + "x": 20, + "y": 30, + }, + Object { + "angle": 0, + "backgroundColor": "transparent", + "boundElementIds": null, + "fillStyle": "hachure", + "groupIds": Array [], + "height": 20, + "id": "id0", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 1278240551, + "strokeColor": "#000000", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 2, + "versionNonce": 449462985, + "width": 20, + "x": -10, + "y": 0, + }, + ], + }, + ], +} +`; + +exports[`contextMenu element selecting 'Send backward' in context menu sends element backward: [end of test] number of elements 1`] = `2`; + +exports[`contextMenu element selecting 'Send backward' in context menu sends element backward: [end of test] number of renders 1`] = `14`; + +exports[`contextMenu element selecting 'Send to back' in context menu sends element to back: [end of test] appState 1`] = ` +Object { + "collaborators": Map {}, + "currentChartType": "bar", + "currentItemBackgroundColor": "transparent", + "currentItemEndArrowhead": "arrow", + "currentItemFillStyle": "hachure", + "currentItemFontFamily": 1, + "currentItemFontSize": 20, + "currentItemLinearStrokeSharpness": "round", + "currentItemOpacity": 100, + "currentItemRoughness": 1, + "currentItemStartArrowhead": null, + "currentItemStrokeColor": "#000000", + "currentItemStrokeSharpness": "sharp", + "currentItemStrokeStyle": "solid", + "currentItemStrokeWidth": 1, + "currentItemTextAlign": "left", + "cursorButton": "up", + "draggingElement": null, + "editingElement": null, + "editingGroupId": null, + "editingLinearElement": null, + "elementLocked": false, + "elementType": "selection", + "errorMessage": null, + "exportBackground": true, + "exportEmbedScene": false, + "exportWithDarkMode": false, + "fileHandle": null, + "gridSize": null, + "height": 100, + "isBindingEnabled": true, + "isLibraryOpen": false, + "isLoading": false, + "isResizing": false, + "isRotating": false, + "lastPointerDownWith": "mouse", + "multiElement": null, + "name": "Untitled-201933152653", + "offsetLeft": 20, + "offsetTop": 10, + "openMenu": null, + "pasteDialog": Object { + "data": null, + "shown": false, + }, + "previousSelectedElementIds": Object {}, + "resizingElement": null, + "scrollX": 0, + "scrollY": 0, + "scrolledOutside": false, + "selectedElementIds": Object { + "id1": true, + }, + "selectedGroupIds": Object {}, + "selectionElement": null, + "shouldAddWatermark": false, + "shouldCacheIgnoreZoom": false, + "showHelpDialog": false, + "showStats": false, + "startBoundElement": null, + "suggestedBindings": Array [], + "theme": "light", + "toastMessage": null, + "viewBackgroundColor": "#ffffff", + "viewModeEnabled": false, + "width": 200, + "zenModeEnabled": false, + "zoom": Object { + "translation": Object { + "x": 0, + "y": 0, + }, + "value": 1, + }, +} +`; + +exports[`contextMenu element selecting 'Send to back' in context menu sends element to back: [end of test] element 0 1`] = ` +Object { + "angle": 0, + "backgroundColor": "transparent", + "boundElementIds": null, + "fillStyle": "hachure", + "groupIds": Array [], + "height": 20, + "id": "id1", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 453191, + "strokeColor": "#000000", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 2, + "versionNonce": 401146281, + "width": 20, + "x": 20, + "y": 30, +} +`; + +exports[`contextMenu element selecting 'Send to back' in context menu sends element to back: [end of test] element 1 1`] = ` +Object { + "angle": 0, + "backgroundColor": "transparent", + "boundElementIds": null, + "fillStyle": "hachure", + "groupIds": Array [], + "height": 20, + "id": "id0", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 1278240551, + "strokeColor": "#000000", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 2, + "versionNonce": 449462985, + "width": 20, + "x": -10, + "y": 0, +} +`; + +exports[`contextMenu element selecting 'Send to back' in context menu sends element to back: [end of test] history 1`] = ` +Object { + "recording": false, + "redoStack": Array [], + "stateHistory": Array [ + Object { + "appState": Object { + "editingGroupId": null, + "editingLinearElement": null, + "name": "Untitled-201933152653", + "selectedElementIds": Object {}, + "viewBackgroundColor": "#ffffff", + }, + "elements": Array [], + }, + Object { + "appState": Object { + "editingGroupId": null, + "editingLinearElement": null, + "name": "Untitled-201933152653", + "selectedElementIds": Object {}, + "viewBackgroundColor": "#ffffff", + }, + "elements": Array [ + Object { + "angle": 0, + "backgroundColor": "transparent", + "boundElementIds": null, + "fillStyle": "hachure", + "groupIds": Array [], + "height": 0, + "id": "id0", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 1278240551, + "strokeColor": "#000000", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 1, + "versionNonce": 0, + "width": 0, + "x": -10, + "y": 0, + }, + ], + }, + Object { + "appState": Object { + "editingGroupId": null, + "editingLinearElement": null, + "name": "Untitled-201933152653", + "selectedElementIds": Object { + "id0": true, + }, + "viewBackgroundColor": "#ffffff", + }, + "elements": Array [ + Object { + "angle": 0, + "backgroundColor": "transparent", + "boundElementIds": null, + "fillStyle": "hachure", + "groupIds": Array [], + "height": 20, + "id": "id0", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 1278240551, + "strokeColor": "#000000", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 2, + "versionNonce": 449462985, + "width": 20, + "x": -10, + "y": 0, + }, + ], + }, + Object { + "appState": Object { + "editingGroupId": null, + "editingLinearElement": null, + "name": "Untitled-201933152653", + "selectedElementIds": Object { + "id1": true, + }, + "viewBackgroundColor": "#ffffff", + }, + "elements": Array [ + Object { + "angle": 0, + "backgroundColor": "transparent", + "boundElementIds": null, + "fillStyle": "hachure", + "groupIds": Array [], + "height": 20, + "id": "id0", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 1278240551, + "strokeColor": "#000000", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 2, + "versionNonce": 449462985, + "width": 20, + "x": -10, + "y": 0, + }, + Object { + "angle": 0, + "backgroundColor": "transparent", + "boundElementIds": null, + "fillStyle": "hachure", + "groupIds": Array [], + "height": 20, + "id": "id1", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 453191, + "strokeColor": "#000000", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 2, + "versionNonce": 401146281, + "width": 20, + "x": 20, + "y": 30, + }, + ], + }, + Object { + "appState": Object { + "editingGroupId": null, + "editingLinearElement": null, + "name": "Untitled-201933152653", + "selectedElementIds": Object { + "id1": true, + }, + "viewBackgroundColor": "#ffffff", + }, + "elements": Array [ + Object { + "angle": 0, + "backgroundColor": "transparent", + "boundElementIds": null, + "fillStyle": "hachure", + "groupIds": Array [], + "height": 20, + "id": "id1", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 453191, + "strokeColor": "#000000", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 2, + "versionNonce": 401146281, + "width": 20, + "x": 20, + "y": 30, + }, + Object { + "angle": 0, + "backgroundColor": "transparent", + "boundElementIds": null, + "fillStyle": "hachure", + "groupIds": Array [], + "height": 20, + "id": "id0", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 1278240551, + "strokeColor": "#000000", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 2, + "versionNonce": 449462985, + "width": 20, + "x": -10, + "y": 0, + }, + ], + }, + ], +} +`; + +exports[`contextMenu element selecting 'Send to back' in context menu sends element to back: [end of test] number of elements 1`] = `2`; + +exports[`contextMenu element selecting 'Send to back' in context menu sends element to back: [end of test] number of renders 1`] = `14`; + +exports[`contextMenu element selecting 'Ungroup selection' in context menu ungroups selected group: [end of test] appState 1`] = ` +Object { + "collaborators": Map {}, + "currentChartType": "bar", + "currentItemBackgroundColor": "transparent", + "currentItemEndArrowhead": "arrow", + "currentItemFillStyle": "hachure", + "currentItemFontFamily": 1, + "currentItemFontSize": 20, + "currentItemLinearStrokeSharpness": "round", + "currentItemOpacity": 100, + "currentItemRoughness": 1, + "currentItemStartArrowhead": null, + "currentItemStrokeColor": "#000000", + "currentItemStrokeSharpness": "sharp", + "currentItemStrokeStyle": "solid", + "currentItemStrokeWidth": 1, + "currentItemTextAlign": "left", + "cursorButton": "up", + "draggingElement": null, + "editingElement": null, + "editingGroupId": null, + "editingLinearElement": null, + "elementLocked": false, + "elementType": "selection", + "errorMessage": null, + "exportBackground": true, + "exportEmbedScene": false, + "exportWithDarkMode": false, + "fileHandle": null, + "gridSize": null, + "height": 100, + "isBindingEnabled": true, + "isLibraryOpen": false, + "isLoading": false, + "isResizing": false, + "isRotating": false, + "lastPointerDownWith": "mouse", + "multiElement": null, + "name": "Untitled-201933152653", + "offsetLeft": 20, + "offsetTop": 10, + "openMenu": null, + "pasteDialog": Object { + "data": null, + "shown": false, + }, + "previousSelectedElementIds": Object { + "id1": true, + }, + "resizingElement": null, + "scrollX": 0, + "scrollY": 0, + "scrolledOutside": false, + "selectedElementIds": Object { + "id0": true, + "id1": true, + "id2": true, + }, + "selectedGroupIds": Object {}, + "selectionElement": null, + "shouldAddWatermark": false, + "shouldCacheIgnoreZoom": false, + "showHelpDialog": false, + "showStats": false, + "startBoundElement": null, + "suggestedBindings": Array [], + "theme": "light", + "toastMessage": null, + "viewBackgroundColor": "#ffffff", + "viewModeEnabled": false, + "width": 200, + "zenModeEnabled": false, + "zoom": Object { + "translation": Object { + "x": 0, + "y": 0, + }, + "value": 1, + }, +} +`; + +exports[`contextMenu element selecting 'Ungroup selection' in context menu ungroups selected group: [end of test] element 0 1`] = ` +Object { + "angle": 0, + "backgroundColor": "transparent", + "boundElementIds": null, + "fillStyle": "hachure", + "groupIds": Array [], + "height": 20, + "id": "id0", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 449462985, + "strokeColor": "#000000", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 4, + "versionNonce": 238820263, + "width": 20, + "x": -10, + "y": 0, +} +`; + +exports[`contextMenu element selecting 'Ungroup selection' in context menu ungroups selected group: [end of test] element 1 1`] = ` +Object { + "angle": 0, + "backgroundColor": "transparent", + "boundElementIds": null, + "fillStyle": "hachure", + "groupIds": Array [], + "height": 20, + "id": "id1", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 401146281, + "strokeColor": "#000000", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 4, + "versionNonce": 400692809, + "width": 20, + "x": 20, + "y": 30, +} +`; + +exports[`contextMenu element selecting 'Ungroup selection' in context menu ungroups selected group: [end of test] history 1`] = ` +Object { + "recording": false, + "redoStack": Array [], + "stateHistory": Array [ + Object { + "appState": Object { + "editingGroupId": null, + "editingLinearElement": null, + "name": "Untitled-201933152653", + "selectedElementIds": Object {}, + "viewBackgroundColor": "#ffffff", + }, + "elements": Array [], + }, + Object { + "appState": Object { + "editingGroupId": null, + "editingLinearElement": null, + "name": "Untitled-201933152653", + "selectedElementIds": Object {}, + "viewBackgroundColor": "#ffffff", + }, + "elements": Array [ + Object { + "angle": 0, + "backgroundColor": "transparent", + "boundElementIds": null, + "fillStyle": "hachure", + "groupIds": Array [], + "height": 0, + "id": "id0", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 449462985, + "strokeColor": "#000000", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 1, + "versionNonce": 0, + "width": 0, + "x": -10, + "y": 0, + }, + ], + }, + Object { + "appState": Object { + "editingGroupId": null, + "editingLinearElement": null, + "name": "Untitled-201933152653", + "selectedElementIds": Object { + "id0": true, + }, + "viewBackgroundColor": "#ffffff", + }, + "elements": Array [ + Object { + "angle": 0, + "backgroundColor": "transparent", + "boundElementIds": null, + "fillStyle": "hachure", + "groupIds": Array [], + "height": 20, + "id": "id0", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 449462985, + "strokeColor": "#000000", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 2, + "versionNonce": 453191, + "width": 20, + "x": -10, + "y": 0, + }, + ], + }, + Object { + "appState": Object { + "editingGroupId": null, + "editingLinearElement": null, + "name": "Untitled-201933152653", + "selectedElementIds": Object { + "id1": true, + }, + "viewBackgroundColor": "#ffffff", + }, + "elements": Array [ + Object { + "angle": 0, + "backgroundColor": "transparent", + "boundElementIds": null, + "fillStyle": "hachure", + "groupIds": Array [], + "height": 20, + "id": "id0", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 449462985, + "strokeColor": "#000000", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 2, + "versionNonce": 453191, + "width": 20, + "x": -10, + "y": 0, + }, + Object { + "angle": 0, + "backgroundColor": "transparent", + "boundElementIds": null, + "fillStyle": "hachure", + "groupIds": Array [], + "height": 20, + "id": "id1", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 401146281, + "strokeColor": "#000000", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 2, + "versionNonce": 2019559783, + "width": 20, + "x": 20, + "y": 30, + }, + ], + }, + Object { + "appState": Object { + "editingGroupId": null, + "editingLinearElement": null, + "name": "Untitled-201933152653", + "selectedElementIds": Object { + "id0": true, + "id1": true, + "id2": true, + }, + "viewBackgroundColor": "#ffffff", + }, + "elements": Array [ + Object { + "angle": 0, + "backgroundColor": "transparent", + "boundElementIds": null, + "fillStyle": "hachure", + "groupIds": Array [ + "id3", + ], + "height": 20, + "id": "id0", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 449462985, + "strokeColor": "#000000", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 3, + "versionNonce": 1116226695, + "width": 20, + "x": -10, + "y": 0, + }, + Object { + "angle": 0, + "backgroundColor": "transparent", + "boundElementIds": null, + "fillStyle": "hachure", + "groupIds": Array [ + "id3", + ], + "height": 20, + "id": "id1", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 401146281, + "strokeColor": "#000000", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 3, + "versionNonce": 1014066025, + "width": 20, + "x": 20, + "y": 30, + }, + ], + }, + Object { + "appState": Object { + "editingGroupId": null, + "editingLinearElement": null, + "name": "Untitled-201933152653", + "selectedElementIds": Object { + "id0": true, + "id1": true, + "id2": true, + }, + "viewBackgroundColor": "#ffffff", + }, + "elements": Array [ + Object { + "angle": 0, + "backgroundColor": "transparent", + "boundElementIds": null, + "fillStyle": "hachure", + "groupIds": Array [], + "height": 20, + "id": "id0", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 449462985, + "strokeColor": "#000000", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 4, + "versionNonce": 238820263, + "width": 20, + "x": -10, + "y": 0, + }, + Object { + "angle": 0, + "backgroundColor": "transparent", + "boundElementIds": null, + "fillStyle": "hachure", + "groupIds": Array [], + "height": 20, + "id": "id1", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 401146281, + "strokeColor": "#000000", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 4, + "versionNonce": 400692809, + "width": 20, + "x": 20, + "y": 30, + }, + ], + }, + ], +} +`; + +exports[`contextMenu element selecting 'Ungroup selection' in context menu ungroups selected group: [end of test] number of elements 1`] = `2`; + +exports[`contextMenu element selecting 'Ungroup selection' in context menu ungroups selected group: [end of test] number of renders 1`] = `17`; + +exports[`contextMenu element shows 'Group selection' in context menu for multiple selected elements: [end of test] appState 1`] = ` +Object { + "collaborators": Map {}, + "currentChartType": "bar", + "currentItemBackgroundColor": "transparent", + "currentItemEndArrowhead": "arrow", + "currentItemFillStyle": "hachure", + "currentItemFontFamily": 1, + "currentItemFontSize": 20, + "currentItemLinearStrokeSharpness": "round", + "currentItemOpacity": 100, + "currentItemRoughness": 1, + "currentItemStartArrowhead": null, + "currentItemStrokeColor": "#000000", + "currentItemStrokeSharpness": "sharp", + "currentItemStrokeStyle": "solid", + "currentItemStrokeWidth": 1, + "currentItemTextAlign": "left", + "cursorButton": "up", + "draggingElement": null, + "editingElement": null, + "editingGroupId": null, + "editingLinearElement": null, + "elementLocked": false, + "elementType": "selection", + "errorMessage": null, + "exportBackground": true, + "exportEmbedScene": false, + "exportWithDarkMode": false, + "fileHandle": null, + "gridSize": null, + "height": 100, + "isBindingEnabled": true, + "isLibraryOpen": false, + "isLoading": false, + "isResizing": false, + "isRotating": false, + "lastPointerDownWith": "mouse", + "multiElement": null, + "name": "Untitled-201933152653", + "offsetLeft": 20, + "offsetTop": 10, + "openMenu": null, + "pasteDialog": Object { + "data": null, + "shown": false, + }, + "previousSelectedElementIds": Object { + "id0": true, + "id2": true, + }, + "resizingElement": null, + "scrollX": 0, + "scrollY": 0, + "scrolledOutside": false, + "selectedElementIds": Object { + "id0": true, + "id1": true, + "id2": true, + "id3": true, + }, + "selectedGroupIds": Object {}, + "selectionElement": null, + "shouldAddWatermark": false, + "shouldCacheIgnoreZoom": false, + "showHelpDialog": false, + "showStats": false, + "startBoundElement": null, + "suggestedBindings": Array [], + "theme": "light", + "toastMessage": null, + "viewBackgroundColor": "#ffffff", + "viewModeEnabled": false, + "width": 200, + "zenModeEnabled": false, + "zoom": Object { + "translation": Object { + "x": 0, + "y": 0, + }, + "value": 1, + }, +} +`; + +exports[`contextMenu element shows 'Group selection' in context menu for multiple selected elements: [end of test] element 0 1`] = ` +Object { + "angle": 0, + "backgroundColor": "transparent", + "boundElementIds": null, + "fillStyle": "hachure", + "groupIds": Array [], + "height": 10, + "id": "id0", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 1278240551, + "strokeColor": "#000000", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 2, + "versionNonce": 449462985, + "width": 10, + "x": -10, + "y": 0, +} +`; + +exports[`contextMenu element shows 'Group selection' in context menu for multiple selected elements: [end of test] element 1 1`] = ` +Object { + "angle": 0, + "backgroundColor": "transparent", + "boundElementIds": null, + "fillStyle": "hachure", + "groupIds": Array [], + "height": 10, + "id": "id1", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 453191, + "strokeColor": "#000000", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 2, + "versionNonce": 401146281, + "width": 10, + "x": 10, + "y": 0, +} +`; + +exports[`contextMenu element shows 'Group selection' in context menu for multiple selected elements: [end of test] history 1`] = ` +Object { + "recording": false, + "redoStack": Array [], + "stateHistory": Array [ + Object { + "appState": Object { + "editingGroupId": null, + "editingLinearElement": null, + "name": "Untitled-201933152653", + "selectedElementIds": Object {}, + "viewBackgroundColor": "#ffffff", + }, + "elements": Array [], + }, + Object { + "appState": Object { + "editingGroupId": null, + "editingLinearElement": null, + "name": "Untitled-201933152653", + "selectedElementIds": Object {}, + "viewBackgroundColor": "#ffffff", + }, + "elements": Array [ + Object { + "angle": 0, + "backgroundColor": "transparent", + "boundElementIds": null, + "fillStyle": "hachure", + "groupIds": Array [], + "height": 0, + "id": "id0", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 1278240551, + "strokeColor": "#000000", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 1, + "versionNonce": 0, + "width": 0, + "x": -10, + "y": 0, + }, + ], + }, + Object { + "appState": Object { + "editingGroupId": null, + "editingLinearElement": null, + "name": "Untitled-201933152653", + "selectedElementIds": Object { + "id0": true, + }, + "viewBackgroundColor": "#ffffff", + }, + "elements": Array [ + Object { + "angle": 0, + "backgroundColor": "transparent", + "boundElementIds": null, + "fillStyle": "hachure", + "groupIds": Array [], + "height": 10, + "id": "id0", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 1278240551, + "strokeColor": "#000000", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 2, + "versionNonce": 449462985, + "width": 10, + "x": -10, + "y": 0, + }, + ], + }, + Object { + "appState": Object { + "editingGroupId": null, + "editingLinearElement": null, + "name": "Untitled-201933152653", + "selectedElementIds": Object { + "id1": true, + }, + "viewBackgroundColor": "#ffffff", + }, + "elements": Array [ + Object { + "angle": 0, + "backgroundColor": "transparent", + "boundElementIds": null, + "fillStyle": "hachure", + "groupIds": Array [], + "height": 10, + "id": "id0", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 1278240551, + "strokeColor": "#000000", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 2, + "versionNonce": 449462985, + "width": 10, + "x": -10, + "y": 0, + }, + Object { + "angle": 0, + "backgroundColor": "transparent", + "boundElementIds": null, + "fillStyle": "hachure", + "groupIds": Array [], + "height": 10, + "id": "id1", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 453191, + "strokeColor": "#000000", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 2, + "versionNonce": 401146281, + "width": 10, + "x": 10, + "y": 0, + }, + ], + }, + ], +} +`; + +exports[`contextMenu element shows 'Group selection' in context menu for multiple selected elements: [end of test] number of elements 1`] = `2`; + +exports[`contextMenu element shows 'Group selection' in context menu for multiple selected elements: [end of test] number of renders 1`] = `17`; + +exports[`contextMenu element shows 'Ungroup selection' in context menu for group inside selected elements: [end of test] appState 1`] = ` +Object { + "collaborators": Map {}, + "currentChartType": "bar", + "currentItemBackgroundColor": "transparent", + "currentItemEndArrowhead": "arrow", + "currentItemFillStyle": "hachure", + "currentItemFontFamily": 1, + "currentItemFontSize": 20, + "currentItemLinearStrokeSharpness": "round", + "currentItemOpacity": 100, + "currentItemRoughness": 1, + "currentItemStartArrowhead": null, + "currentItemStrokeColor": "#000000", + "currentItemStrokeSharpness": "sharp", + "currentItemStrokeStyle": "solid", + "currentItemStrokeWidth": 1, + "currentItemTextAlign": "left", + "cursorButton": "up", + "draggingElement": null, + "editingElement": null, + "editingGroupId": null, + "editingLinearElement": null, + "elementLocked": false, + "elementType": "selection", + "errorMessage": null, + "exportBackground": true, + "exportEmbedScene": false, + "exportWithDarkMode": false, + "fileHandle": null, + "gridSize": null, + "height": 100, + "isBindingEnabled": true, + "isLibraryOpen": false, + "isLoading": false, + "isResizing": false, + "isRotating": false, + "lastPointerDownWith": "mouse", + "multiElement": null, + "name": "Untitled-201933152653", + "offsetLeft": 20, + "offsetTop": 10, + "openMenu": null, + "pasteDialog": Object { + "data": null, + "shown": false, + }, + "previousSelectedElementIds": Object { + "id0": true, + "id2": true, + }, + "resizingElement": null, + "scrollX": 0, + "scrollY": 0, + "scrolledOutside": false, + "selectedElementIds": Object { + "id0": true, + "id1": true, + "id2": true, + "id3": true, + }, + "selectedGroupIds": Object { + "id4": true, + }, + "selectionElement": null, + "shouldAddWatermark": false, + "shouldCacheIgnoreZoom": false, + "showHelpDialog": false, + "showStats": false, + "startBoundElement": null, + "suggestedBindings": Array [], + "theme": "light", + "toastMessage": null, + "viewBackgroundColor": "#ffffff", + "viewModeEnabled": false, + "width": 200, + "zenModeEnabled": false, + "zoom": Object { + "translation": Object { + "x": 0, + "y": 0, + }, + "value": 1, + }, +} +`; + +exports[`contextMenu element shows 'Ungroup selection' in context menu for group inside selected elements: [end of test] element 0 1`] = ` +Object { + "angle": 0, + "backgroundColor": "transparent", + "boundElementIds": null, + "fillStyle": "hachure", + "groupIds": Array [ + "id4", + ], + "height": 10, + "id": "id0", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 449462985, + "strokeColor": "#000000", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 3, + "versionNonce": 1014066025, + "width": 10, + "x": -10, + "y": 0, +} +`; + +exports[`contextMenu element shows 'Ungroup selection' in context menu for group inside selected elements: [end of test] element 1 1`] = ` +Object { + "angle": 0, + "backgroundColor": "transparent", + "boundElementIds": null, + "fillStyle": "hachure", + "groupIds": Array [ + "id4", + ], + "height": 10, + "id": "id1", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 401146281, + "strokeColor": "#000000", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 3, + "versionNonce": 238820263, + "width": 10, + "x": 10, + "y": 0, +} +`; + +exports[`contextMenu element shows 'Ungroup selection' in context menu for group inside selected elements: [end of test] history 1`] = ` +Object { + "recording": false, + "redoStack": Array [], + "stateHistory": Array [ + Object { + "appState": Object { + "editingGroupId": null, + "editingLinearElement": null, + "name": "Untitled-201933152653", + "selectedElementIds": Object {}, + "viewBackgroundColor": "#ffffff", + }, + "elements": Array [], + }, + Object { + "appState": Object { + "editingGroupId": null, + "editingLinearElement": null, + "name": "Untitled-201933152653", + "selectedElementIds": Object {}, + "viewBackgroundColor": "#ffffff", + }, + "elements": Array [ + Object { + "angle": 0, + "backgroundColor": "transparent", + "boundElementIds": null, + "fillStyle": "hachure", + "groupIds": Array [], + "height": 0, + "id": "id0", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 449462985, + "strokeColor": "#000000", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 1, + "versionNonce": 0, + "width": 0, + "x": -10, + "y": 0, + }, + ], + }, + Object { + "appState": Object { + "editingGroupId": null, + "editingLinearElement": null, + "name": "Untitled-201933152653", + "selectedElementIds": Object { + "id0": true, + }, + "viewBackgroundColor": "#ffffff", + }, + "elements": Array [ + Object { + "angle": 0, + "backgroundColor": "transparent", + "boundElementIds": null, + "fillStyle": "hachure", + "groupIds": Array [], + "height": 10, + "id": "id0", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 449462985, + "strokeColor": "#000000", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 2, + "versionNonce": 453191, + "width": 10, + "x": -10, + "y": 0, + }, + ], + }, + Object { + "appState": Object { + "editingGroupId": null, + "editingLinearElement": null, + "name": "Untitled-201933152653", + "selectedElementIds": Object { + "id1": true, + }, + "viewBackgroundColor": "#ffffff", + }, + "elements": Array [ + Object { + "angle": 0, + "backgroundColor": "transparent", + "boundElementIds": null, + "fillStyle": "hachure", + "groupIds": Array [], + "height": 10, + "id": "id0", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 449462985, + "strokeColor": "#000000", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 2, + "versionNonce": 453191, + "width": 10, + "x": -10, + "y": 0, + }, + Object { + "angle": 0, + "backgroundColor": "transparent", + "boundElementIds": null, + "fillStyle": "hachure", + "groupIds": Array [], + "height": 10, + "id": "id1", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 401146281, + "strokeColor": "#000000", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 2, + "versionNonce": 2019559783, + "width": 10, + "x": 10, + "y": 0, + }, + ], + }, + Object { + "appState": Object { + "editingGroupId": null, + "editingLinearElement": null, + "name": "Untitled-201933152653", + "selectedElementIds": Object { + "id0": true, + "id1": true, + "id2": true, + "id3": true, + }, + "viewBackgroundColor": "#ffffff", + }, + "elements": Array [ + Object { + "angle": 0, + "backgroundColor": "transparent", + "boundElementIds": null, + "fillStyle": "hachure", + "groupIds": Array [ + "id4", + ], + "height": 10, + "id": "id0", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 449462985, + "strokeColor": "#000000", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 3, + "versionNonce": 1014066025, + "width": 10, + "x": -10, + "y": 0, + }, + Object { + "angle": 0, + "backgroundColor": "transparent", + "boundElementIds": null, + "fillStyle": "hachure", + "groupIds": Array [ + "id4", + ], + "height": 10, + "id": "id1", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 401146281, + "strokeColor": "#000000", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 3, + "versionNonce": 238820263, + "width": 10, + "x": 10, + "y": 0, + }, + ], + }, + ], +} +`; + +exports[`contextMenu element shows 'Ungroup selection' in context menu for group inside selected elements: [end of test] number of elements 1`] = `2`; + +exports[`contextMenu element shows 'Ungroup selection' in context menu for group inside selected elements: [end of test] number of renders 1`] = `18`; + +exports[`contextMenu element shows context menu for canvas: [end of test] appState 1`] = ` +Object { + "collaborators": Map {}, + "currentChartType": "bar", + "currentItemBackgroundColor": "transparent", + "currentItemEndArrowhead": "arrow", + "currentItemFillStyle": "hachure", + "currentItemFontFamily": 1, + "currentItemFontSize": 20, + "currentItemLinearStrokeSharpness": "round", + "currentItemOpacity": 100, + "currentItemRoughness": 1, + "currentItemStartArrowhead": null, + "currentItemStrokeColor": "#000000", + "currentItemStrokeSharpness": "sharp", + "currentItemStrokeStyle": "solid", + "currentItemStrokeWidth": 1, + "currentItemTextAlign": "left", + "cursorButton": "up", + "draggingElement": null, + "editingElement": null, + "editingGroupId": null, + "editingLinearElement": null, + "elementLocked": false, + "elementType": "selection", + "errorMessage": null, + "exportBackground": true, + "exportEmbedScene": false, + "exportWithDarkMode": false, + "fileHandle": null, + "gridSize": null, + "height": 100, + "isBindingEnabled": true, + "isLibraryOpen": false, + "isLoading": false, + "isResizing": false, + "isRotating": false, + "lastPointerDownWith": "mouse", + "multiElement": null, + "name": "Untitled-201933152653", + "offsetLeft": 20, + "offsetTop": 10, + "openMenu": null, + "pasteDialog": Object { + "data": null, + "shown": false, + }, + "previousSelectedElementIds": Object {}, + "resizingElement": null, + "scrollX": 0, + "scrollY": 0, + "scrolledOutside": false, + "selectedElementIds": Object {}, + "selectedGroupIds": Object {}, + "selectionElement": null, + "shouldAddWatermark": false, + "shouldCacheIgnoreZoom": false, + "showHelpDialog": false, + "showStats": false, + "startBoundElement": null, + "suggestedBindings": Array [], + "theme": "light", + "toastMessage": null, + "viewBackgroundColor": "#ffffff", + "viewModeEnabled": false, + "width": 200, + "zenModeEnabled": false, + "zoom": Object { + "translation": Object { + "x": 0, + "y": 0, + }, + "value": 1, + }, +} +`; + +exports[`contextMenu element shows context menu for canvas: [end of test] history 1`] = ` +Object { + "recording": false, + "redoStack": Array [], + "stateHistory": Array [ + Object { + "appState": Object { + "editingGroupId": null, + "editingLinearElement": null, + "name": "Untitled-201933152653", + "selectedElementIds": Object {}, + "viewBackgroundColor": "#ffffff", + }, + "elements": Array [], + }, + ], +} +`; + +exports[`contextMenu element shows context menu for canvas: [end of test] number of elements 1`] = `0`; + +exports[`contextMenu element shows context menu for canvas: [end of test] number of renders 1`] = `3`; + +exports[`contextMenu element shows context menu for element: [end of test] appState 1`] = ` +Object { + "collaborators": Map {}, + "currentChartType": "bar", + "currentItemBackgroundColor": "transparent", + "currentItemEndArrowhead": "arrow", + "currentItemFillStyle": "hachure", + "currentItemFontFamily": 1, + "currentItemFontSize": 20, + "currentItemLinearStrokeSharpness": "round", + "currentItemOpacity": 100, + "currentItemRoughness": 1, + "currentItemStartArrowhead": null, + "currentItemStrokeColor": "#000000", + "currentItemStrokeSharpness": "sharp", + "currentItemStrokeStyle": "solid", + "currentItemStrokeWidth": 1, + "currentItemTextAlign": "left", + "cursorButton": "up", + "draggingElement": null, + "editingElement": null, + "editingGroupId": null, + "editingLinearElement": null, + "elementLocked": false, + "elementType": "selection", + "errorMessage": null, + "exportBackground": true, + "exportEmbedScene": false, + "exportWithDarkMode": false, + "fileHandle": null, + "gridSize": null, + "height": 100, + "isBindingEnabled": true, + "isLibraryOpen": false, + "isLoading": false, + "isResizing": false, + "isRotating": false, + "lastPointerDownWith": "mouse", + "multiElement": null, + "name": "Untitled-201933152653", + "offsetLeft": 20, + "offsetTop": 10, + "openMenu": null, + "pasteDialog": Object { + "data": null, + "shown": false, + }, + "previousSelectedElementIds": Object {}, + "resizingElement": null, + "scrollX": 0, + "scrollY": 0, + "scrolledOutside": false, + "selectedElementIds": Object { + "id0": true, + }, + "selectedGroupIds": Object {}, + "selectionElement": null, + "shouldAddWatermark": false, + "shouldCacheIgnoreZoom": false, + "showHelpDialog": false, + "showStats": false, + "startBoundElement": null, + "suggestedBindings": Array [], + "theme": "light", + "toastMessage": null, + "viewBackgroundColor": "#ffffff", + "viewModeEnabled": false, + "width": 200, + "zenModeEnabled": false, + "zoom": Object { + "translation": Object { + "x": 0, + "y": 0, + }, + "value": 1, + }, +} +`; + +exports[`contextMenu element shows context menu for element: [end of test] element 0 1`] = ` +Object { + "angle": 0, + "backgroundColor": "transparent", + "boundElementIds": null, + "fillStyle": "hachure", + "groupIds": Array [], + "height": 20, + "id": "id0", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 1278240551, + "strokeColor": "#000000", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 2, + "versionNonce": 449462985, + "width": 20, + "x": -10, + "y": 0, +} +`; + +exports[`contextMenu element shows context menu for element: [end of test] history 1`] = ` +Object { + "recording": false, + "redoStack": Array [], + "stateHistory": Array [ + Object { + "appState": Object { + "editingGroupId": null, + "editingLinearElement": null, + "name": "Untitled-201933152653", + "selectedElementIds": Object {}, + "viewBackgroundColor": "#ffffff", + }, + "elements": Array [], + }, + Object { + "appState": Object { + "editingGroupId": null, + "editingLinearElement": null, + "name": "Untitled-201933152653", + "selectedElementIds": Object { + "id0": true, + }, + "viewBackgroundColor": "#ffffff", + }, + "elements": Array [ + Object { + "angle": 0, + "backgroundColor": "transparent", + "boundElementIds": null, + "fillStyle": "hachure", + "groupIds": Array [], + "height": 20, + "id": "id0", + "isDeleted": false, + "opacity": 100, + "roughness": 1, + "seed": 1278240551, + "strokeColor": "#000000", + "strokeSharpness": "sharp", + "strokeStyle": "solid", + "strokeWidth": 1, + "type": "rectangle", + "version": 2, + "versionNonce": 449462985, + "width": 20, + "x": -10, + "y": 0, + }, + ], + }, + ], +} +`; + +exports[`contextMenu element shows context menu for element: [end of test] number of elements 1`] = `1`; + +exports[`contextMenu element shows context menu for element: [end of test] number of renders 1`] = `9`; diff --git a/src/tests/__snapshots__/regressionTests.test.tsx.snap b/src/tests/__snapshots__/regressionTests.test.tsx.snap index 0d7ff85db..3e8dcd9bf 100644 --- a/src/tests/__snapshots__/regressionTests.test.tsx.snap +++ b/src/tests/__snapshots__/regressionTests.test.tsx.snap @@ -12862,3435 +12862,6 @@ exports[`regression tests rerenders UI on language change: [end of test] number exports[`regression tests rerenders UI on language change: [end of test] number of renders 1`] = `9`; -exports[`regression tests selecting 'Add to library' in context menu adds element to library: [end of test] appState 1`] = ` -Object { - "collaborators": Map {}, - "currentChartType": "bar", - "currentItemBackgroundColor": "transparent", - "currentItemEndArrowhead": "arrow", - "currentItemFillStyle": "hachure", - "currentItemFontFamily": 1, - "currentItemFontSize": 20, - "currentItemLinearStrokeSharpness": "round", - "currentItemOpacity": 100, - "currentItemRoughness": 1, - "currentItemStartArrowhead": null, - "currentItemStrokeColor": "#000000", - "currentItemStrokeSharpness": "sharp", - "currentItemStrokeStyle": "solid", - "currentItemStrokeWidth": 1, - "currentItemTextAlign": "left", - "cursorButton": "up", - "draggingElement": null, - "editingElement": null, - "editingGroupId": null, - "editingLinearElement": null, - "elementLocked": false, - "elementType": "selection", - "errorMessage": null, - "exportBackground": true, - "exportEmbedScene": false, - "exportWithDarkMode": false, - "fileHandle": null, - "gridSize": null, - "height": 768, - "isBindingEnabled": true, - "isLibraryOpen": false, - "isLoading": false, - "isResizing": false, - "isRotating": false, - "lastPointerDownWith": "mouse", - "multiElement": null, - "name": "Untitled-201933152653", - "offsetLeft": 0, - "offsetTop": 0, - "openMenu": null, - "pasteDialog": Object { - "data": null, - "shown": false, - }, - "previousSelectedElementIds": Object {}, - "resizingElement": null, - "scrollX": 0, - "scrollY": 0, - "scrolledOutside": false, - "selectedElementIds": Object { - "id0": true, - }, - "selectedGroupIds": Object {}, - "selectionElement": null, - "shouldAddWatermark": false, - "shouldCacheIgnoreZoom": false, - "showHelpDialog": false, - "showStats": false, - "startBoundElement": null, - "suggestedBindings": Array [], - "theme": "light", - "toastMessage": null, - "viewBackgroundColor": "#ffffff", - "viewModeEnabled": false, - "width": 1024, - "zenModeEnabled": false, - "zoom": Object { - "translation": Object { - "x": 0, - "y": 0, - }, - "value": 1, - }, -} -`; - -exports[`regression tests selecting 'Add to library' in context menu adds element to library: [end of test] element 0 1`] = ` -Object { - "angle": 0, - "backgroundColor": "transparent", - "boundElementIds": null, - "fillStyle": "hachure", - "groupIds": Array [], - "height": 20, - "id": "id0", - "isDeleted": false, - "opacity": 100, - "roughness": 1, - "seed": 337897, - "strokeColor": "#000000", - "strokeSharpness": "sharp", - "strokeStyle": "solid", - "strokeWidth": 1, - "type": "rectangle", - "version": 2, - "versionNonce": 1278240551, - "width": 20, - "x": 10, - "y": 10, -} -`; - -exports[`regression tests selecting 'Add to library' in context menu adds element to library: [end of test] history 1`] = ` -Object { - "recording": false, - "redoStack": Array [], - "stateHistory": Array [ - Object { - "appState": Object { - "editingGroupId": null, - "editingLinearElement": null, - "name": "Untitled-201933152653", - "selectedElementIds": Object {}, - "viewBackgroundColor": "#ffffff", - }, - "elements": Array [], - }, - Object { - "appState": Object { - "editingGroupId": null, - "editingLinearElement": null, - "name": "Untitled-201933152653", - "selectedElementIds": Object { - "id0": true, - }, - "viewBackgroundColor": "#ffffff", - }, - "elements": Array [ - Object { - "angle": 0, - "backgroundColor": "transparent", - "boundElementIds": null, - "fillStyle": "hachure", - "groupIds": Array [], - "height": 20, - "id": "id0", - "isDeleted": false, - "opacity": 100, - "roughness": 1, - "seed": 337897, - "strokeColor": "#000000", - "strokeSharpness": "sharp", - "strokeStyle": "solid", - "strokeWidth": 1, - "type": "rectangle", - "version": 2, - "versionNonce": 1278240551, - "width": 20, - "x": 10, - "y": 10, - }, - ], - }, - ], -} -`; - -exports[`regression tests selecting 'Add to library' in context menu adds element to library: [end of test] number of elements 1`] = `1`; - -exports[`regression tests selecting 'Add to library' in context menu adds element to library: [end of test] number of renders 1`] = `8`; - -exports[`regression tests selecting 'Bring forward' in context menu brings element forward: [end of test] appState 1`] = ` -Object { - "collaborators": Map {}, - "currentChartType": "bar", - "currentItemBackgroundColor": "transparent", - "currentItemEndArrowhead": "arrow", - "currentItemFillStyle": "hachure", - "currentItemFontFamily": 1, - "currentItemFontSize": 20, - "currentItemLinearStrokeSharpness": "round", - "currentItemOpacity": 100, - "currentItemRoughness": 1, - "currentItemStartArrowhead": null, - "currentItemStrokeColor": "#000000", - "currentItemStrokeSharpness": "sharp", - "currentItemStrokeStyle": "solid", - "currentItemStrokeWidth": 1, - "currentItemTextAlign": "left", - "cursorButton": "up", - "draggingElement": null, - "editingElement": null, - "editingGroupId": null, - "editingLinearElement": null, - "elementLocked": false, - "elementType": "selection", - "errorMessage": null, - "exportBackground": true, - "exportEmbedScene": false, - "exportWithDarkMode": false, - "fileHandle": null, - "gridSize": null, - "height": 768, - "isBindingEnabled": true, - "isLibraryOpen": false, - "isLoading": false, - "isResizing": false, - "isRotating": false, - "lastPointerDownWith": "mouse", - "multiElement": null, - "name": "Untitled-201933152653", - "offsetLeft": 0, - "offsetTop": 0, - "openMenu": null, - "pasteDialog": Object { - "data": null, - "shown": false, - }, - "previousSelectedElementIds": Object {}, - "resizingElement": null, - "scrollX": 0, - "scrollY": 0, - "scrolledOutside": false, - "selectedElementIds": Object { - "id0": true, - }, - "selectedGroupIds": Object {}, - "selectionElement": null, - "shouldAddWatermark": false, - "shouldCacheIgnoreZoom": false, - "showHelpDialog": false, - "showStats": false, - "startBoundElement": null, - "suggestedBindings": Array [], - "theme": "light", - "toastMessage": null, - "viewBackgroundColor": "#ffffff", - "viewModeEnabled": false, - "width": 1024, - "zenModeEnabled": false, - "zoom": Object { - "translation": Object { - "x": 0, - "y": 0, - }, - "value": 1, - }, -} -`; - -exports[`regression tests selecting 'Bring forward' in context menu brings element forward: [end of test] element 0 1`] = ` -Object { - "angle": 0, - "backgroundColor": "transparent", - "boundElementIds": null, - "fillStyle": "hachure", - "groupIds": Array [], - "height": 20, - "id": "id1", - "isDeleted": false, - "opacity": 100, - "roughness": 1, - "seed": 449462985, - "strokeColor": "#000000", - "strokeSharpness": "sharp", - "strokeStyle": "solid", - "strokeWidth": 1, - "type": "rectangle", - "version": 2, - "versionNonce": 453191, - "width": 20, - "x": 40, - "y": 40, -} -`; - -exports[`regression tests selecting 'Bring forward' in context menu brings element forward: [end of test] element 1 1`] = ` -Object { - "angle": 0, - "backgroundColor": "transparent", - "boundElementIds": null, - "fillStyle": "hachure", - "groupIds": Array [], - "height": 20, - "id": "id0", - "isDeleted": false, - "opacity": 100, - "roughness": 1, - "seed": 337897, - "strokeColor": "#000000", - "strokeSharpness": "sharp", - "strokeStyle": "solid", - "strokeWidth": 1, - "type": "rectangle", - "version": 2, - "versionNonce": 1278240551, - "width": 20, - "x": 10, - "y": 10, -} -`; - -exports[`regression tests selecting 'Bring forward' in context menu brings element forward: [end of test] history 1`] = ` -Object { - "recording": false, - "redoStack": Array [], - "stateHistory": Array [ - Object { - "appState": Object { - "editingGroupId": null, - "editingLinearElement": null, - "name": "Untitled-201933152653", - "selectedElementIds": Object {}, - "viewBackgroundColor": "#ffffff", - }, - "elements": Array [], - }, - Object { - "appState": Object { - "editingGroupId": null, - "editingLinearElement": null, - "name": "Untitled-201933152653", - "selectedElementIds": Object { - "id0": true, - }, - "viewBackgroundColor": "#ffffff", - }, - "elements": Array [ - Object { - "angle": 0, - "backgroundColor": "transparent", - "boundElementIds": null, - "fillStyle": "hachure", - "groupIds": Array [], - "height": 20, - "id": "id0", - "isDeleted": false, - "opacity": 100, - "roughness": 1, - "seed": 337897, - "strokeColor": "#000000", - "strokeSharpness": "sharp", - "strokeStyle": "solid", - "strokeWidth": 1, - "type": "rectangle", - "version": 2, - "versionNonce": 1278240551, - "width": 20, - "x": 10, - "y": 10, - }, - ], - }, - Object { - "appState": Object { - "editingGroupId": null, - "editingLinearElement": null, - "name": "Untitled-201933152653", - "selectedElementIds": Object { - "id1": true, - }, - "viewBackgroundColor": "#ffffff", - }, - "elements": Array [ - Object { - "angle": 0, - "backgroundColor": "transparent", - "boundElementIds": null, - "fillStyle": "hachure", - "groupIds": Array [], - "height": 20, - "id": "id0", - "isDeleted": false, - "opacity": 100, - "roughness": 1, - "seed": 337897, - "strokeColor": "#000000", - "strokeSharpness": "sharp", - "strokeStyle": "solid", - "strokeWidth": 1, - "type": "rectangle", - "version": 2, - "versionNonce": 1278240551, - "width": 20, - "x": 10, - "y": 10, - }, - Object { - "angle": 0, - "backgroundColor": "transparent", - "boundElementIds": null, - "fillStyle": "hachure", - "groupIds": Array [], - "height": 20, - "id": "id1", - "isDeleted": false, - "opacity": 100, - "roughness": 1, - "seed": 449462985, - "strokeColor": "#000000", - "strokeSharpness": "sharp", - "strokeStyle": "solid", - "strokeWidth": 1, - "type": "rectangle", - "version": 2, - "versionNonce": 453191, - "width": 20, - "x": 40, - "y": 40, - }, - ], - }, - Object { - "appState": Object { - "editingGroupId": null, - "editingLinearElement": null, - "name": "Untitled-201933152653", - "selectedElementIds": Object { - "id0": true, - }, - "viewBackgroundColor": "#ffffff", - }, - "elements": Array [ - Object { - "angle": 0, - "backgroundColor": "transparent", - "boundElementIds": null, - "fillStyle": "hachure", - "groupIds": Array [], - "height": 20, - "id": "id1", - "isDeleted": false, - "opacity": 100, - "roughness": 1, - "seed": 449462985, - "strokeColor": "#000000", - "strokeSharpness": "sharp", - "strokeStyle": "solid", - "strokeWidth": 1, - "type": "rectangle", - "version": 2, - "versionNonce": 453191, - "width": 20, - "x": 40, - "y": 40, - }, - Object { - "angle": 0, - "backgroundColor": "transparent", - "boundElementIds": null, - "fillStyle": "hachure", - "groupIds": Array [], - "height": 20, - "id": "id0", - "isDeleted": false, - "opacity": 100, - "roughness": 1, - "seed": 337897, - "strokeColor": "#000000", - "strokeSharpness": "sharp", - "strokeStyle": "solid", - "strokeWidth": 1, - "type": "rectangle", - "version": 2, - "versionNonce": 1278240551, - "width": 20, - "x": 10, - "y": 10, - }, - ], - }, - ], -} -`; - -exports[`regression tests selecting 'Bring forward' in context menu brings element forward: [end of test] number of elements 1`] = `2`; - -exports[`regression tests selecting 'Bring forward' in context menu brings element forward: [end of test] number of renders 1`] = `14`; - -exports[`regression tests selecting 'Bring to front' in context menu brings element to front: [end of test] appState 1`] = ` -Object { - "collaborators": Map {}, - "currentChartType": "bar", - "currentItemBackgroundColor": "transparent", - "currentItemEndArrowhead": "arrow", - "currentItemFillStyle": "hachure", - "currentItemFontFamily": 1, - "currentItemFontSize": 20, - "currentItemLinearStrokeSharpness": "round", - "currentItemOpacity": 100, - "currentItemRoughness": 1, - "currentItemStartArrowhead": null, - "currentItemStrokeColor": "#000000", - "currentItemStrokeSharpness": "sharp", - "currentItemStrokeStyle": "solid", - "currentItemStrokeWidth": 1, - "currentItemTextAlign": "left", - "cursorButton": "up", - "draggingElement": null, - "editingElement": null, - "editingGroupId": null, - "editingLinearElement": null, - "elementLocked": false, - "elementType": "selection", - "errorMessage": null, - "exportBackground": true, - "exportEmbedScene": false, - "exportWithDarkMode": false, - "fileHandle": null, - "gridSize": null, - "height": 768, - "isBindingEnabled": true, - "isLibraryOpen": false, - "isLoading": false, - "isResizing": false, - "isRotating": false, - "lastPointerDownWith": "mouse", - "multiElement": null, - "name": "Untitled-201933152653", - "offsetLeft": 0, - "offsetTop": 0, - "openMenu": null, - "pasteDialog": Object { - "data": null, - "shown": false, - }, - "previousSelectedElementIds": Object {}, - "resizingElement": null, - "scrollX": 0, - "scrollY": 0, - "scrolledOutside": false, - "selectedElementIds": Object { - "id0": true, - }, - "selectedGroupIds": Object {}, - "selectionElement": null, - "shouldAddWatermark": false, - "shouldCacheIgnoreZoom": false, - "showHelpDialog": false, - "showStats": false, - "startBoundElement": null, - "suggestedBindings": Array [], - "theme": "light", - "toastMessage": null, - "viewBackgroundColor": "#ffffff", - "viewModeEnabled": false, - "width": 1024, - "zenModeEnabled": false, - "zoom": Object { - "translation": Object { - "x": 0, - "y": 0, - }, - "value": 1, - }, -} -`; - -exports[`regression tests selecting 'Bring to front' in context menu brings element to front: [end of test] element 0 1`] = ` -Object { - "angle": 0, - "backgroundColor": "transparent", - "boundElementIds": null, - "fillStyle": "hachure", - "groupIds": Array [], - "height": 20, - "id": "id1", - "isDeleted": false, - "opacity": 100, - "roughness": 1, - "seed": 449462985, - "strokeColor": "#000000", - "strokeSharpness": "sharp", - "strokeStyle": "solid", - "strokeWidth": 1, - "type": "rectangle", - "version": 2, - "versionNonce": 453191, - "width": 20, - "x": 40, - "y": 40, -} -`; - -exports[`regression tests selecting 'Bring to front' in context menu brings element to front: [end of test] element 1 1`] = ` -Object { - "angle": 0, - "backgroundColor": "transparent", - "boundElementIds": null, - "fillStyle": "hachure", - "groupIds": Array [], - "height": 20, - "id": "id0", - "isDeleted": false, - "opacity": 100, - "roughness": 1, - "seed": 337897, - "strokeColor": "#000000", - "strokeSharpness": "sharp", - "strokeStyle": "solid", - "strokeWidth": 1, - "type": "rectangle", - "version": 2, - "versionNonce": 1278240551, - "width": 20, - "x": 10, - "y": 10, -} -`; - -exports[`regression tests selecting 'Bring to front' in context menu brings element to front: [end of test] history 1`] = ` -Object { - "recording": false, - "redoStack": Array [], - "stateHistory": Array [ - Object { - "appState": Object { - "editingGroupId": null, - "editingLinearElement": null, - "name": "Untitled-201933152653", - "selectedElementIds": Object {}, - "viewBackgroundColor": "#ffffff", - }, - "elements": Array [], - }, - Object { - "appState": Object { - "editingGroupId": null, - "editingLinearElement": null, - "name": "Untitled-201933152653", - "selectedElementIds": Object { - "id0": true, - }, - "viewBackgroundColor": "#ffffff", - }, - "elements": Array [ - Object { - "angle": 0, - "backgroundColor": "transparent", - "boundElementIds": null, - "fillStyle": "hachure", - "groupIds": Array [], - "height": 20, - "id": "id0", - "isDeleted": false, - "opacity": 100, - "roughness": 1, - "seed": 337897, - "strokeColor": "#000000", - "strokeSharpness": "sharp", - "strokeStyle": "solid", - "strokeWidth": 1, - "type": "rectangle", - "version": 2, - "versionNonce": 1278240551, - "width": 20, - "x": 10, - "y": 10, - }, - ], - }, - Object { - "appState": Object { - "editingGroupId": null, - "editingLinearElement": null, - "name": "Untitled-201933152653", - "selectedElementIds": Object { - "id1": true, - }, - "viewBackgroundColor": "#ffffff", - }, - "elements": Array [ - Object { - "angle": 0, - "backgroundColor": "transparent", - "boundElementIds": null, - "fillStyle": "hachure", - "groupIds": Array [], - "height": 20, - "id": "id0", - "isDeleted": false, - "opacity": 100, - "roughness": 1, - "seed": 337897, - "strokeColor": "#000000", - "strokeSharpness": "sharp", - "strokeStyle": "solid", - "strokeWidth": 1, - "type": "rectangle", - "version": 2, - "versionNonce": 1278240551, - "width": 20, - "x": 10, - "y": 10, - }, - Object { - "angle": 0, - "backgroundColor": "transparent", - "boundElementIds": null, - "fillStyle": "hachure", - "groupIds": Array [], - "height": 20, - "id": "id1", - "isDeleted": false, - "opacity": 100, - "roughness": 1, - "seed": 449462985, - "strokeColor": "#000000", - "strokeSharpness": "sharp", - "strokeStyle": "solid", - "strokeWidth": 1, - "type": "rectangle", - "version": 2, - "versionNonce": 453191, - "width": 20, - "x": 40, - "y": 40, - }, - ], - }, - Object { - "appState": Object { - "editingGroupId": null, - "editingLinearElement": null, - "name": "Untitled-201933152653", - "selectedElementIds": Object { - "id0": true, - }, - "viewBackgroundColor": "#ffffff", - }, - "elements": Array [ - Object { - "angle": 0, - "backgroundColor": "transparent", - "boundElementIds": null, - "fillStyle": "hachure", - "groupIds": Array [], - "height": 20, - "id": "id1", - "isDeleted": false, - "opacity": 100, - "roughness": 1, - "seed": 449462985, - "strokeColor": "#000000", - "strokeSharpness": "sharp", - "strokeStyle": "solid", - "strokeWidth": 1, - "type": "rectangle", - "version": 2, - "versionNonce": 453191, - "width": 20, - "x": 40, - "y": 40, - }, - Object { - "angle": 0, - "backgroundColor": "transparent", - "boundElementIds": null, - "fillStyle": "hachure", - "groupIds": Array [], - "height": 20, - "id": "id0", - "isDeleted": false, - "opacity": 100, - "roughness": 1, - "seed": 337897, - "strokeColor": "#000000", - "strokeSharpness": "sharp", - "strokeStyle": "solid", - "strokeWidth": 1, - "type": "rectangle", - "version": 2, - "versionNonce": 1278240551, - "width": 20, - "x": 10, - "y": 10, - }, - ], - }, - ], -} -`; - -exports[`regression tests selecting 'Bring to front' in context menu brings element to front: [end of test] number of elements 1`] = `2`; - -exports[`regression tests selecting 'Bring to front' in context menu brings element to front: [end of test] number of renders 1`] = `14`; - -exports[`regression tests selecting 'Copy styles' in context menu copies styles: [end of test] appState 1`] = ` -Object { - "collaborators": Map {}, - "currentChartType": "bar", - "currentItemBackgroundColor": "transparent", - "currentItemEndArrowhead": "arrow", - "currentItemFillStyle": "hachure", - "currentItemFontFamily": 1, - "currentItemFontSize": 20, - "currentItemLinearStrokeSharpness": "round", - "currentItemOpacity": 100, - "currentItemRoughness": 1, - "currentItemStartArrowhead": null, - "currentItemStrokeColor": "#000000", - "currentItemStrokeSharpness": "sharp", - "currentItemStrokeStyle": "solid", - "currentItemStrokeWidth": 1, - "currentItemTextAlign": "left", - "cursorButton": "up", - "draggingElement": null, - "editingElement": null, - "editingGroupId": null, - "editingLinearElement": null, - "elementLocked": false, - "elementType": "selection", - "errorMessage": null, - "exportBackground": true, - "exportEmbedScene": false, - "exportWithDarkMode": false, - "fileHandle": null, - "gridSize": null, - "height": 768, - "isBindingEnabled": true, - "isLibraryOpen": false, - "isLoading": false, - "isResizing": false, - "isRotating": false, - "lastPointerDownWith": "mouse", - "multiElement": null, - "name": "Untitled-201933152653", - "offsetLeft": 0, - "offsetTop": 0, - "openMenu": null, - "pasteDialog": Object { - "data": null, - "shown": false, - }, - "previousSelectedElementIds": Object {}, - "resizingElement": null, - "scrollX": 0, - "scrollY": 0, - "scrolledOutside": false, - "selectedElementIds": Object { - "id0": true, - }, - "selectedGroupIds": Object {}, - "selectionElement": null, - "shouldAddWatermark": false, - "shouldCacheIgnoreZoom": false, - "showHelpDialog": false, - "showStats": false, - "startBoundElement": null, - "suggestedBindings": Array [], - "theme": "light", - "toastMessage": "Copied styles.", - "viewBackgroundColor": "#ffffff", - "viewModeEnabled": false, - "width": 1024, - "zenModeEnabled": false, - "zoom": Object { - "translation": Object { - "x": 0, - "y": 0, - }, - "value": 1, - }, -} -`; - -exports[`regression tests selecting 'Copy styles' in context menu copies styles: [end of test] element 0 1`] = ` -Object { - "angle": 0, - "backgroundColor": "transparent", - "boundElementIds": null, - "fillStyle": "hachure", - "groupIds": Array [], - "height": 20, - "id": "id0", - "isDeleted": false, - "opacity": 100, - "roughness": 1, - "seed": 337897, - "strokeColor": "#000000", - "strokeSharpness": "sharp", - "strokeStyle": "solid", - "strokeWidth": 1, - "type": "rectangle", - "version": 2, - "versionNonce": 1278240551, - "width": 20, - "x": 10, - "y": 10, -} -`; - -exports[`regression tests selecting 'Copy styles' in context menu copies styles: [end of test] history 1`] = ` -Object { - "recording": false, - "redoStack": Array [], - "stateHistory": Array [ - Object { - "appState": Object { - "editingGroupId": null, - "editingLinearElement": null, - "name": "Untitled-201933152653", - "selectedElementIds": Object {}, - "viewBackgroundColor": "#ffffff", - }, - "elements": Array [], - }, - Object { - "appState": Object { - "editingGroupId": null, - "editingLinearElement": null, - "name": "Untitled-201933152653", - "selectedElementIds": Object { - "id0": true, - }, - "viewBackgroundColor": "#ffffff", - }, - "elements": Array [ - Object { - "angle": 0, - "backgroundColor": "transparent", - "boundElementIds": null, - "fillStyle": "hachure", - "groupIds": Array [], - "height": 20, - "id": "id0", - "isDeleted": false, - "opacity": 100, - "roughness": 1, - "seed": 337897, - "strokeColor": "#000000", - "strokeSharpness": "sharp", - "strokeStyle": "solid", - "strokeWidth": 1, - "type": "rectangle", - "version": 2, - "versionNonce": 1278240551, - "width": 20, - "x": 10, - "y": 10, - }, - ], - }, - ], -} -`; - -exports[`regression tests selecting 'Copy styles' in context menu copies styles: [end of test] number of elements 1`] = `1`; - -exports[`regression tests selecting 'Copy styles' in context menu copies styles: [end of test] number of renders 1`] = `9`; - -exports[`regression tests selecting 'Delete' in context menu deletes element: [end of test] appState 1`] = ` -Object { - "collaborators": Map {}, - "currentChartType": "bar", - "currentItemBackgroundColor": "transparent", - "currentItemEndArrowhead": "arrow", - "currentItemFillStyle": "hachure", - "currentItemFontFamily": 1, - "currentItemFontSize": 20, - "currentItemLinearStrokeSharpness": "round", - "currentItemOpacity": 100, - "currentItemRoughness": 1, - "currentItemStartArrowhead": null, - "currentItemStrokeColor": "#000000", - "currentItemStrokeSharpness": "sharp", - "currentItemStrokeStyle": "solid", - "currentItemStrokeWidth": 1, - "currentItemTextAlign": "left", - "cursorButton": "up", - "draggingElement": null, - "editingElement": null, - "editingGroupId": null, - "editingLinearElement": null, - "elementLocked": false, - "elementType": "selection", - "errorMessage": null, - "exportBackground": true, - "exportEmbedScene": false, - "exportWithDarkMode": false, - "fileHandle": null, - "gridSize": null, - "height": 768, - "isBindingEnabled": true, - "isLibraryOpen": false, - "isLoading": false, - "isResizing": false, - "isRotating": false, - "lastPointerDownWith": "mouse", - "multiElement": null, - "name": "Untitled-201933152653", - "offsetLeft": 0, - "offsetTop": 0, - "openMenu": null, - "pasteDialog": Object { - "data": null, - "shown": false, - }, - "previousSelectedElementIds": Object {}, - "resizingElement": null, - "scrollX": 0, - "scrollY": 0, - "scrolledOutside": false, - "selectedElementIds": Object {}, - "selectedGroupIds": Object {}, - "selectionElement": null, - "shouldAddWatermark": false, - "shouldCacheIgnoreZoom": false, - "showHelpDialog": false, - "showStats": false, - "startBoundElement": null, - "suggestedBindings": Array [], - "theme": "light", - "toastMessage": null, - "viewBackgroundColor": "#ffffff", - "viewModeEnabled": false, - "width": 1024, - "zenModeEnabled": false, - "zoom": Object { - "translation": Object { - "x": 0, - "y": 0, - }, - "value": 1, - }, -} -`; - -exports[`regression tests selecting 'Delete' in context menu deletes element: [end of test] element 0 1`] = ` -Object { - "angle": 0, - "backgroundColor": "transparent", - "boundElementIds": null, - "fillStyle": "hachure", - "groupIds": Array [], - "height": 20, - "id": "id0", - "isDeleted": true, - "opacity": 100, - "roughness": 1, - "seed": 337897, - "strokeColor": "#000000", - "strokeSharpness": "sharp", - "strokeStyle": "solid", - "strokeWidth": 1, - "type": "rectangle", - "version": 3, - "versionNonce": 449462985, - "width": 20, - "x": 10, - "y": 10, -} -`; - -exports[`regression tests selecting 'Delete' in context menu deletes element: [end of test] history 1`] = ` -Object { - "recording": false, - "redoStack": Array [], - "stateHistory": Array [ - Object { - "appState": Object { - "editingGroupId": null, - "editingLinearElement": null, - "name": "Untitled-201933152653", - "selectedElementIds": Object {}, - "viewBackgroundColor": "#ffffff", - }, - "elements": Array [], - }, - Object { - "appState": Object { - "editingGroupId": null, - "editingLinearElement": null, - "name": "Untitled-201933152653", - "selectedElementIds": Object { - "id0": true, - }, - "viewBackgroundColor": "#ffffff", - }, - "elements": Array [ - Object { - "angle": 0, - "backgroundColor": "transparent", - "boundElementIds": null, - "fillStyle": "hachure", - "groupIds": Array [], - "height": 20, - "id": "id0", - "isDeleted": false, - "opacity": 100, - "roughness": 1, - "seed": 337897, - "strokeColor": "#000000", - "strokeSharpness": "sharp", - "strokeStyle": "solid", - "strokeWidth": 1, - "type": "rectangle", - "version": 2, - "versionNonce": 1278240551, - "width": 20, - "x": 10, - "y": 10, - }, - ], - }, - Object { - "appState": Object { - "editingGroupId": null, - "editingLinearElement": null, - "name": "Untitled-201933152653", - "selectedElementIds": Object {}, - "viewBackgroundColor": "#ffffff", - }, - "elements": Array [ - Object { - "angle": 0, - "backgroundColor": "transparent", - "boundElementIds": null, - "fillStyle": "hachure", - "groupIds": Array [], - "height": 20, - "id": "id0", - "isDeleted": true, - "opacity": 100, - "roughness": 1, - "seed": 337897, - "strokeColor": "#000000", - "strokeSharpness": "sharp", - "strokeStyle": "solid", - "strokeWidth": 1, - "type": "rectangle", - "version": 3, - "versionNonce": 449462985, - "width": 20, - "x": 10, - "y": 10, - }, - ], - }, - ], -} -`; - -exports[`regression tests selecting 'Delete' in context menu deletes element: [end of test] number of elements 1`] = `1`; - -exports[`regression tests selecting 'Delete' in context menu deletes element: [end of test] number of renders 1`] = `9`; - -exports[`regression tests selecting 'Duplicate' in context menu duplicates element: [end of test] appState 1`] = ` -Object { - "collaborators": Map {}, - "currentChartType": "bar", - "currentItemBackgroundColor": "transparent", - "currentItemEndArrowhead": "arrow", - "currentItemFillStyle": "hachure", - "currentItemFontFamily": 1, - "currentItemFontSize": 20, - "currentItemLinearStrokeSharpness": "round", - "currentItemOpacity": 100, - "currentItemRoughness": 1, - "currentItemStartArrowhead": null, - "currentItemStrokeColor": "#000000", - "currentItemStrokeSharpness": "sharp", - "currentItemStrokeStyle": "solid", - "currentItemStrokeWidth": 1, - "currentItemTextAlign": "left", - "cursorButton": "up", - "draggingElement": null, - "editingElement": null, - "editingGroupId": null, - "editingLinearElement": null, - "elementLocked": false, - "elementType": "selection", - "errorMessage": null, - "exportBackground": true, - "exportEmbedScene": false, - "exportWithDarkMode": false, - "fileHandle": null, - "gridSize": null, - "height": 768, - "isBindingEnabled": true, - "isLibraryOpen": false, - "isLoading": false, - "isResizing": false, - "isRotating": false, - "lastPointerDownWith": "mouse", - "multiElement": null, - "name": "Untitled-201933152653", - "offsetLeft": 0, - "offsetTop": 0, - "openMenu": null, - "pasteDialog": Object { - "data": null, - "shown": false, - }, - "previousSelectedElementIds": Object {}, - "resizingElement": null, - "scrollX": 0, - "scrollY": 0, - "scrolledOutside": false, - "selectedElementIds": Object { - "id0_copy": true, - }, - "selectedGroupIds": Object {}, - "selectionElement": null, - "shouldAddWatermark": false, - "shouldCacheIgnoreZoom": false, - "showHelpDialog": false, - "showStats": false, - "startBoundElement": null, - "suggestedBindings": Array [], - "theme": "light", - "toastMessage": null, - "viewBackgroundColor": "#ffffff", - "viewModeEnabled": false, - "width": 1024, - "zenModeEnabled": false, - "zoom": Object { - "translation": Object { - "x": 0, - "y": 0, - }, - "value": 1, - }, -} -`; - -exports[`regression tests selecting 'Duplicate' in context menu duplicates element: [end of test] element 0 1`] = ` -Object { - "angle": 0, - "backgroundColor": "transparent", - "boundElementIds": null, - "fillStyle": "hachure", - "groupIds": Array [], - "height": 20, - "id": "id0", - "isDeleted": false, - "opacity": 100, - "roughness": 1, - "seed": 337897, - "strokeColor": "#000000", - "strokeSharpness": "sharp", - "strokeStyle": "solid", - "strokeWidth": 1, - "type": "rectangle", - "version": 2, - "versionNonce": 1278240551, - "width": 20, - "x": 10, - "y": 10, -} -`; - -exports[`regression tests selecting 'Duplicate' in context menu duplicates element: [end of test] element 1 1`] = ` -Object { - "angle": 0, - "backgroundColor": "transparent", - "boundElementIds": null, - "fillStyle": "hachure", - "groupIds": Array [], - "height": 20, - "id": "id0_copy", - "isDeleted": false, - "opacity": 100, - "roughness": 1, - "seed": 449462985, - "strokeColor": "#000000", - "strokeSharpness": "sharp", - "strokeStyle": "solid", - "strokeWidth": 1, - "type": "rectangle", - "version": 2, - "versionNonce": 1278240551, - "width": 20, - "x": 20, - "y": 20, -} -`; - -exports[`regression tests selecting 'Duplicate' in context menu duplicates element: [end of test] history 1`] = ` -Object { - "recording": false, - "redoStack": Array [], - "stateHistory": Array [ - Object { - "appState": Object { - "editingGroupId": null, - "editingLinearElement": null, - "name": "Untitled-201933152653", - "selectedElementIds": Object {}, - "viewBackgroundColor": "#ffffff", - }, - "elements": Array [], - }, - Object { - "appState": Object { - "editingGroupId": null, - "editingLinearElement": null, - "name": "Untitled-201933152653", - "selectedElementIds": Object { - "id0": true, - }, - "viewBackgroundColor": "#ffffff", - }, - "elements": Array [ - Object { - "angle": 0, - "backgroundColor": "transparent", - "boundElementIds": null, - "fillStyle": "hachure", - "groupIds": Array [], - "height": 20, - "id": "id0", - "isDeleted": false, - "opacity": 100, - "roughness": 1, - "seed": 337897, - "strokeColor": "#000000", - "strokeSharpness": "sharp", - "strokeStyle": "solid", - "strokeWidth": 1, - "type": "rectangle", - "version": 2, - "versionNonce": 1278240551, - "width": 20, - "x": 10, - "y": 10, - }, - ], - }, - Object { - "appState": Object { - "editingGroupId": null, - "editingLinearElement": null, - "name": "Untitled-201933152653", - "selectedElementIds": Object { - "id0_copy": true, - }, - "viewBackgroundColor": "#ffffff", - }, - "elements": Array [ - Object { - "angle": 0, - "backgroundColor": "transparent", - "boundElementIds": null, - "fillStyle": "hachure", - "groupIds": Array [], - "height": 20, - "id": "id0", - "isDeleted": false, - "opacity": 100, - "roughness": 1, - "seed": 337897, - "strokeColor": "#000000", - "strokeSharpness": "sharp", - "strokeStyle": "solid", - "strokeWidth": 1, - "type": "rectangle", - "version": 2, - "versionNonce": 1278240551, - "width": 20, - "x": 10, - "y": 10, - }, - Object { - "angle": 0, - "backgroundColor": "transparent", - "boundElementIds": null, - "fillStyle": "hachure", - "groupIds": Array [], - "height": 20, - "id": "id0_copy", - "isDeleted": false, - "opacity": 100, - "roughness": 1, - "seed": 449462985, - "strokeColor": "#000000", - "strokeSharpness": "sharp", - "strokeStyle": "solid", - "strokeWidth": 1, - "type": "rectangle", - "version": 2, - "versionNonce": 1278240551, - "width": 20, - "x": 20, - "y": 20, - }, - ], - }, - ], -} -`; - -exports[`regression tests selecting 'Duplicate' in context menu duplicates element: [end of test] number of elements 1`] = `2`; - -exports[`regression tests selecting 'Duplicate' in context menu duplicates element: [end of test] number of renders 1`] = `9`; - -exports[`regression tests selecting 'Group selection' in context menu groups selected elements: [end of test] appState 1`] = ` -Object { - "collaborators": Map {}, - "currentChartType": "bar", - "currentItemBackgroundColor": "transparent", - "currentItemEndArrowhead": "arrow", - "currentItemFillStyle": "hachure", - "currentItemFontFamily": 1, - "currentItemFontSize": 20, - "currentItemLinearStrokeSharpness": "round", - "currentItemOpacity": 100, - "currentItemRoughness": 1, - "currentItemStartArrowhead": null, - "currentItemStrokeColor": "#000000", - "currentItemStrokeSharpness": "sharp", - "currentItemStrokeStyle": "solid", - "currentItemStrokeWidth": 1, - "currentItemTextAlign": "left", - "cursorButton": "up", - "draggingElement": null, - "editingElement": null, - "editingGroupId": null, - "editingLinearElement": null, - "elementLocked": false, - "elementType": "selection", - "errorMessage": null, - "exportBackground": true, - "exportEmbedScene": false, - "exportWithDarkMode": false, - "fileHandle": null, - "gridSize": null, - "height": 768, - "isBindingEnabled": true, - "isLibraryOpen": false, - "isLoading": false, - "isResizing": false, - "isRotating": false, - "lastPointerDownWith": "mouse", - "multiElement": null, - "name": "Untitled-201933152653", - "offsetLeft": 0, - "offsetTop": 0, - "openMenu": null, - "pasteDialog": Object { - "data": null, - "shown": false, - }, - "previousSelectedElementIds": Object { - "id1": true, - }, - "resizingElement": null, - "scrollX": 0, - "scrollY": 0, - "scrolledOutside": false, - "selectedElementIds": Object { - "id0": true, - "id1": true, - "id2": true, - }, - "selectedGroupIds": Object { - "id3": true, - }, - "selectionElement": null, - "shouldAddWatermark": false, - "shouldCacheIgnoreZoom": false, - "showHelpDialog": false, - "showStats": false, - "startBoundElement": null, - "suggestedBindings": Array [], - "theme": "light", - "toastMessage": null, - "viewBackgroundColor": "#ffffff", - "viewModeEnabled": false, - "width": 1024, - "zenModeEnabled": false, - "zoom": Object { - "translation": Object { - "x": 0, - "y": 0, - }, - "value": 1, - }, -} -`; - -exports[`regression tests selecting 'Group selection' in context menu groups selected elements: [end of test] element 0 1`] = ` -Object { - "angle": 0, - "backgroundColor": "transparent", - "boundElementIds": null, - "fillStyle": "hachure", - "groupIds": Array [ - "id3", - ], - "height": 20, - "id": "id0", - "isDeleted": false, - "opacity": 100, - "roughness": 1, - "seed": 337897, - "strokeColor": "#000000", - "strokeSharpness": "sharp", - "strokeStyle": "solid", - "strokeWidth": 1, - "type": "rectangle", - "version": 3, - "versionNonce": 2019559783, - "width": 20, - "x": 10, - "y": 10, -} -`; - -exports[`regression tests selecting 'Group selection' in context menu groups selected elements: [end of test] element 1 1`] = ` -Object { - "angle": 0, - "backgroundColor": "transparent", - "boundElementIds": null, - "fillStyle": "hachure", - "groupIds": Array [ - "id3", - ], - "height": 20, - "id": "id1", - "isDeleted": false, - "opacity": 100, - "roughness": 1, - "seed": 449462985, - "strokeColor": "#000000", - "strokeSharpness": "sharp", - "strokeStyle": "solid", - "strokeWidth": 1, - "type": "rectangle", - "version": 3, - "versionNonce": 1150084233, - "width": 20, - "x": 40, - "y": 40, -} -`; - -exports[`regression tests selecting 'Group selection' in context menu groups selected elements: [end of test] history 1`] = ` -Object { - "recording": false, - "redoStack": Array [], - "stateHistory": Array [ - Object { - "appState": Object { - "editingGroupId": null, - "editingLinearElement": null, - "name": "Untitled-201933152653", - "selectedElementIds": Object {}, - "viewBackgroundColor": "#ffffff", - }, - "elements": Array [], - }, - Object { - "appState": Object { - "editingGroupId": null, - "editingLinearElement": null, - "name": "Untitled-201933152653", - "selectedElementIds": Object { - "id0": true, - }, - "viewBackgroundColor": "#ffffff", - }, - "elements": Array [ - Object { - "angle": 0, - "backgroundColor": "transparent", - "boundElementIds": null, - "fillStyle": "hachure", - "groupIds": Array [], - "height": 20, - "id": "id0", - "isDeleted": false, - "opacity": 100, - "roughness": 1, - "seed": 337897, - "strokeColor": "#000000", - "strokeSharpness": "sharp", - "strokeStyle": "solid", - "strokeWidth": 1, - "type": "rectangle", - "version": 2, - "versionNonce": 1278240551, - "width": 20, - "x": 10, - "y": 10, - }, - ], - }, - Object { - "appState": Object { - "editingGroupId": null, - "editingLinearElement": null, - "name": "Untitled-201933152653", - "selectedElementIds": Object { - "id1": true, - }, - "viewBackgroundColor": "#ffffff", - }, - "elements": Array [ - Object { - "angle": 0, - "backgroundColor": "transparent", - "boundElementIds": null, - "fillStyle": "hachure", - "groupIds": Array [], - "height": 20, - "id": "id0", - "isDeleted": false, - "opacity": 100, - "roughness": 1, - "seed": 337897, - "strokeColor": "#000000", - "strokeSharpness": "sharp", - "strokeStyle": "solid", - "strokeWidth": 1, - "type": "rectangle", - "version": 2, - "versionNonce": 1278240551, - "width": 20, - "x": 10, - "y": 10, - }, - Object { - "angle": 0, - "backgroundColor": "transparent", - "boundElementIds": null, - "fillStyle": "hachure", - "groupIds": Array [], - "height": 20, - "id": "id1", - "isDeleted": false, - "opacity": 100, - "roughness": 1, - "seed": 449462985, - "strokeColor": "#000000", - "strokeSharpness": "sharp", - "strokeStyle": "solid", - "strokeWidth": 1, - "type": "rectangle", - "version": 2, - "versionNonce": 453191, - "width": 20, - "x": 40, - "y": 40, - }, - ], - }, - Object { - "appState": Object { - "editingGroupId": null, - "editingLinearElement": null, - "name": "Untitled-201933152653", - "selectedElementIds": Object { - "id0": true, - "id1": true, - "id2": true, - }, - "viewBackgroundColor": "#ffffff", - }, - "elements": Array [ - Object { - "angle": 0, - "backgroundColor": "transparent", - "boundElementIds": null, - "fillStyle": "hachure", - "groupIds": Array [ - "id3", - ], - "height": 20, - "id": "id0", - "isDeleted": false, - "opacity": 100, - "roughness": 1, - "seed": 337897, - "strokeColor": "#000000", - "strokeSharpness": "sharp", - "strokeStyle": "solid", - "strokeWidth": 1, - "type": "rectangle", - "version": 3, - "versionNonce": 2019559783, - "width": 20, - "x": 10, - "y": 10, - }, - Object { - "angle": 0, - "backgroundColor": "transparent", - "boundElementIds": null, - "fillStyle": "hachure", - "groupIds": Array [ - "id3", - ], - "height": 20, - "id": "id1", - "isDeleted": false, - "opacity": 100, - "roughness": 1, - "seed": 449462985, - "strokeColor": "#000000", - "strokeSharpness": "sharp", - "strokeStyle": "solid", - "strokeWidth": 1, - "type": "rectangle", - "version": 3, - "versionNonce": 1150084233, - "width": 20, - "x": 40, - "y": 40, - }, - ], - }, - ], -} -`; - -exports[`regression tests selecting 'Group selection' in context menu groups selected elements: [end of test] number of elements 1`] = `2`; - -exports[`regression tests selecting 'Group selection' in context menu groups selected elements: [end of test] number of renders 1`] = `15`; - -exports[`regression tests selecting 'Paste styles' in context menu pastes styles: [end of test] appState 1`] = ` -Object { - "collaborators": Map {}, - "currentChartType": "bar", - "currentItemBackgroundColor": "#e64980", - "currentItemEndArrowhead": "arrow", - "currentItemFillStyle": "cross-hatch", - "currentItemFontFamily": 1, - "currentItemFontSize": 20, - "currentItemLinearStrokeSharpness": "round", - "currentItemOpacity": 60, - "currentItemRoughness": 2, - "currentItemStartArrowhead": null, - "currentItemStrokeColor": "#c92a2a", - "currentItemStrokeSharpness": "sharp", - "currentItemStrokeStyle": "dotted", - "currentItemStrokeWidth": 2, - "currentItemTextAlign": "left", - "cursorButton": "up", - "draggingElement": null, - "editingElement": null, - "editingGroupId": null, - "editingLinearElement": null, - "elementLocked": false, - "elementType": "selection", - "errorMessage": null, - "exportBackground": true, - "exportEmbedScene": false, - "exportWithDarkMode": false, - "fileHandle": null, - "gridSize": null, - "height": 768, - "isBindingEnabled": true, - "isLibraryOpen": false, - "isLoading": false, - "isResizing": false, - "isRotating": false, - "lastPointerDownWith": "mouse", - "multiElement": null, - "name": "Untitled-201933152653", - "offsetLeft": 0, - "offsetTop": 0, - "openMenu": null, - "pasteDialog": Object { - "data": null, - "shown": false, - }, - "previousSelectedElementIds": Object {}, - "resizingElement": null, - "scrollX": 0, - "scrollY": 0, - "scrolledOutside": false, - "selectedElementIds": Object { - "id0": true, - }, - "selectedGroupIds": Object {}, - "selectionElement": null, - "shouldAddWatermark": false, - "shouldCacheIgnoreZoom": false, - "showHelpDialog": false, - "showStats": false, - "startBoundElement": null, - "suggestedBindings": Array [], - "theme": "light", - "toastMessage": "Copied styles.", - "viewBackgroundColor": "#ffffff", - "viewModeEnabled": false, - "width": 1024, - "zenModeEnabled": false, - "zoom": Object { - "translation": Object { - "x": 0, - "y": 0, - }, - "value": 1, - }, -} -`; - -exports[`regression tests selecting 'Paste styles' in context menu pastes styles: [end of test] element 0 1`] = ` -Object { - "angle": 0, - "backgroundColor": "#e64980", - "boundElementIds": null, - "fillStyle": "cross-hatch", - "groupIds": Array [], - "height": 20, - "id": "id0", - "isDeleted": false, - "opacity": 60, - "roughness": 2, - "seed": 337897, - "strokeColor": "#c92a2a", - "strokeSharpness": "sharp", - "strokeStyle": "dotted", - "strokeWidth": 2, - "type": "rectangle", - "version": 3, - "versionNonce": 1505387817, - "width": 20, - "x": 10, - "y": 10, -} -`; - -exports[`regression tests selecting 'Paste styles' in context menu pastes styles: [end of test] element 1 1`] = ` -Object { - "angle": 0, - "backgroundColor": "#e64980", - "boundElementIds": null, - "fillStyle": "cross-hatch", - "groupIds": Array [], - "height": 20, - "id": "id1", - "isDeleted": false, - "opacity": 60, - "roughness": 2, - "seed": 238820263, - "strokeColor": "#c92a2a", - "strokeSharpness": "sharp", - "strokeStyle": "dotted", - "strokeWidth": 2, - "type": "rectangle", - "version": 9, - "versionNonce": 1604849351, - "width": 20, - "x": 40, - "y": 40, -} -`; - -exports[`regression tests selecting 'Paste styles' in context menu pastes styles: [end of test] history 1`] = ` -Object { - "recording": false, - "redoStack": Array [], - "stateHistory": Array [ - Object { - "appState": Object { - "editingGroupId": null, - "editingLinearElement": null, - "name": "Untitled-201933152653", - "selectedElementIds": Object {}, - "viewBackgroundColor": "#ffffff", - }, - "elements": Array [], - }, - Object { - "appState": Object { - "editingGroupId": null, - "editingLinearElement": null, - "name": "Untitled-201933152653", - "selectedElementIds": Object { - "id0": true, - }, - "viewBackgroundColor": "#ffffff", - }, - "elements": Array [ - Object { - "angle": 0, - "backgroundColor": "transparent", - "boundElementIds": null, - "fillStyle": "hachure", - "groupIds": Array [], - "height": 20, - "id": "id0", - "isDeleted": false, - "opacity": 100, - "roughness": 1, - "seed": 337897, - "strokeColor": "#000000", - "strokeSharpness": "sharp", - "strokeStyle": "solid", - "strokeWidth": 1, - "type": "rectangle", - "version": 2, - "versionNonce": 1278240551, - "width": 20, - "x": 10, - "y": 10, - }, - ], - }, - Object { - "appState": Object { - "editingGroupId": null, - "editingLinearElement": null, - "name": "Untitled-201933152653", - "selectedElementIds": Object { - "id1": true, - }, - "viewBackgroundColor": "#ffffff", - }, - "elements": Array [ - Object { - "angle": 0, - "backgroundColor": "transparent", - "boundElementIds": null, - "fillStyle": "hachure", - "groupIds": Array [], - "height": 20, - "id": "id0", - "isDeleted": false, - "opacity": 100, - "roughness": 1, - "seed": 337897, - "strokeColor": "#000000", - "strokeSharpness": "sharp", - "strokeStyle": "solid", - "strokeWidth": 1, - "type": "rectangle", - "version": 2, - "versionNonce": 1278240551, - "width": 20, - "x": 10, - "y": 10, - }, - Object { - "angle": 0, - "backgroundColor": "transparent", - "boundElementIds": null, - "fillStyle": "hachure", - "groupIds": Array [], - "height": 20, - "id": "id1", - "isDeleted": false, - "opacity": 100, - "roughness": 1, - "seed": 449462985, - "strokeColor": "#000000", - "strokeSharpness": "sharp", - "strokeStyle": "solid", - "strokeWidth": 1, - "type": "rectangle", - "version": 2, - "versionNonce": 453191, - "width": 20, - "x": 40, - "y": 40, - }, - ], - }, - Object { - "appState": Object { - "editingGroupId": null, - "editingLinearElement": null, - "name": "Untitled-201933152653", - "selectedElementIds": Object { - "id1": true, - }, - "viewBackgroundColor": "#ffffff", - }, - "elements": Array [ - Object { - "angle": 0, - "backgroundColor": "transparent", - "boundElementIds": null, - "fillStyle": "hachure", - "groupIds": Array [], - "height": 20, - "id": "id0", - "isDeleted": false, - "opacity": 100, - "roughness": 1, - "seed": 337897, - "strokeColor": "#000000", - "strokeSharpness": "sharp", - "strokeStyle": "solid", - "strokeWidth": 1, - "type": "rectangle", - "version": 2, - "versionNonce": 1278240551, - "width": 20, - "x": 10, - "y": 10, - }, - Object { - "angle": 0, - "backgroundColor": "transparent", - "boundElementIds": null, - "fillStyle": "hachure", - "groupIds": Array [], - "height": 20, - "id": "id1", - "isDeleted": false, - "opacity": 100, - "roughness": 1, - "seed": 449462985, - "strokeColor": "#c92a2a", - "strokeSharpness": "sharp", - "strokeStyle": "solid", - "strokeWidth": 1, - "type": "rectangle", - "version": 3, - "versionNonce": 401146281, - "width": 20, - "x": 40, - "y": 40, - }, - ], - }, - Object { - "appState": Object { - "editingGroupId": null, - "editingLinearElement": null, - "name": "Untitled-201933152653", - "selectedElementIds": Object { - "id1": true, - }, - "viewBackgroundColor": "#ffffff", - }, - "elements": Array [ - Object { - "angle": 0, - "backgroundColor": "transparent", - "boundElementIds": null, - "fillStyle": "hachure", - "groupIds": Array [], - "height": 20, - "id": "id0", - "isDeleted": false, - "opacity": 100, - "roughness": 1, - "seed": 337897, - "strokeColor": "#000000", - "strokeSharpness": "sharp", - "strokeStyle": "solid", - "strokeWidth": 1, - "type": "rectangle", - "version": 2, - "versionNonce": 1278240551, - "width": 20, - "x": 10, - "y": 10, - }, - Object { - "angle": 0, - "backgroundColor": "#e64980", - "boundElementIds": null, - "fillStyle": "hachure", - "groupIds": Array [], - "height": 20, - "id": "id1", - "isDeleted": false, - "opacity": 100, - "roughness": 1, - "seed": 449462985, - "strokeColor": "#c92a2a", - "strokeSharpness": "sharp", - "strokeStyle": "solid", - "strokeWidth": 1, - "type": "rectangle", - "version": 4, - "versionNonce": 2019559783, - "width": 20, - "x": 40, - "y": 40, - }, - ], - }, - Object { - "appState": Object { - "editingGroupId": null, - "editingLinearElement": null, - "name": "Untitled-201933152653", - "selectedElementIds": Object { - "id1": true, - }, - "viewBackgroundColor": "#ffffff", - }, - "elements": Array [ - Object { - "angle": 0, - "backgroundColor": "transparent", - "boundElementIds": null, - "fillStyle": "hachure", - "groupIds": Array [], - "height": 20, - "id": "id0", - "isDeleted": false, - "opacity": 100, - "roughness": 1, - "seed": 337897, - "strokeColor": "#000000", - "strokeSharpness": "sharp", - "strokeStyle": "solid", - "strokeWidth": 1, - "type": "rectangle", - "version": 2, - "versionNonce": 1278240551, - "width": 20, - "x": 10, - "y": 10, - }, - Object { - "angle": 0, - "backgroundColor": "#e64980", - "boundElementIds": null, - "fillStyle": "cross-hatch", - "groupIds": Array [], - "height": 20, - "id": "id1", - "isDeleted": false, - "opacity": 100, - "roughness": 1, - "seed": 449462985, - "strokeColor": "#c92a2a", - "strokeSharpness": "sharp", - "strokeStyle": "solid", - "strokeWidth": 1, - "type": "rectangle", - "version": 5, - "versionNonce": 1150084233, - "width": 20, - "x": 40, - "y": 40, - }, - ], - }, - Object { - "appState": Object { - "editingGroupId": null, - "editingLinearElement": null, - "name": "Untitled-201933152653", - "selectedElementIds": Object { - "id1": true, - }, - "viewBackgroundColor": "#ffffff", - }, - "elements": Array [ - Object { - "angle": 0, - "backgroundColor": "transparent", - "boundElementIds": null, - "fillStyle": "hachure", - "groupIds": Array [], - "height": 20, - "id": "id0", - "isDeleted": false, - "opacity": 100, - "roughness": 1, - "seed": 337897, - "strokeColor": "#000000", - "strokeSharpness": "sharp", - "strokeStyle": "solid", - "strokeWidth": 1, - "type": "rectangle", - "version": 2, - "versionNonce": 1278240551, - "width": 20, - "x": 10, - "y": 10, - }, - Object { - "angle": 0, - "backgroundColor": "#e64980", - "boundElementIds": null, - "fillStyle": "cross-hatch", - "groupIds": Array [], - "height": 20, - "id": "id1", - "isDeleted": false, - "opacity": 100, - "roughness": 1, - "seed": 449462985, - "strokeColor": "#c92a2a", - "strokeSharpness": "sharp", - "strokeStyle": "solid", - "strokeWidth": 2, - "type": "rectangle", - "version": 6, - "versionNonce": 1116226695, - "width": 20, - "x": 40, - "y": 40, - }, - ], - }, - Object { - "appState": Object { - "editingGroupId": null, - "editingLinearElement": null, - "name": "Untitled-201933152653", - "selectedElementIds": Object { - "id1": true, - }, - "viewBackgroundColor": "#ffffff", - }, - "elements": Array [ - Object { - "angle": 0, - "backgroundColor": "transparent", - "boundElementIds": null, - "fillStyle": "hachure", - "groupIds": Array [], - "height": 20, - "id": "id0", - "isDeleted": false, - "opacity": 100, - "roughness": 1, - "seed": 337897, - "strokeColor": "#000000", - "strokeSharpness": "sharp", - "strokeStyle": "solid", - "strokeWidth": 1, - "type": "rectangle", - "version": 2, - "versionNonce": 1278240551, - "width": 20, - "x": 10, - "y": 10, - }, - Object { - "angle": 0, - "backgroundColor": "#e64980", - "boundElementIds": null, - "fillStyle": "cross-hatch", - "groupIds": Array [], - "height": 20, - "id": "id1", - "isDeleted": false, - "opacity": 100, - "roughness": 1, - "seed": 449462985, - "strokeColor": "#c92a2a", - "strokeSharpness": "sharp", - "strokeStyle": "dotted", - "strokeWidth": 2, - "type": "rectangle", - "version": 7, - "versionNonce": 1014066025, - "width": 20, - "x": 40, - "y": 40, - }, - ], - }, - Object { - "appState": Object { - "editingGroupId": null, - "editingLinearElement": null, - "name": "Untitled-201933152653", - "selectedElementIds": Object { - "id1": true, - }, - "viewBackgroundColor": "#ffffff", - }, - "elements": Array [ - Object { - "angle": 0, - "backgroundColor": "transparent", - "boundElementIds": null, - "fillStyle": "hachure", - "groupIds": Array [], - "height": 20, - "id": "id0", - "isDeleted": false, - "opacity": 100, - "roughness": 1, - "seed": 337897, - "strokeColor": "#000000", - "strokeSharpness": "sharp", - "strokeStyle": "solid", - "strokeWidth": 1, - "type": "rectangle", - "version": 2, - "versionNonce": 1278240551, - "width": 20, - "x": 10, - "y": 10, - }, - Object { - "angle": 0, - "backgroundColor": "#e64980", - "boundElementIds": null, - "fillStyle": "cross-hatch", - "groupIds": Array [], - "height": 20, - "id": "id1", - "isDeleted": false, - "opacity": 100, - "roughness": 2, - "seed": 238820263, - "strokeColor": "#c92a2a", - "strokeSharpness": "sharp", - "strokeStyle": "dotted", - "strokeWidth": 2, - "type": "rectangle", - "version": 8, - "versionNonce": 400692809, - "width": 20, - "x": 40, - "y": 40, - }, - ], - }, - Object { - "appState": Object { - "editingGroupId": null, - "editingLinearElement": null, - "name": "Untitled-201933152653", - "selectedElementIds": Object { - "id1": true, - }, - "viewBackgroundColor": "#ffffff", - }, - "elements": Array [ - Object { - "angle": 0, - "backgroundColor": "transparent", - "boundElementIds": null, - "fillStyle": "hachure", - "groupIds": Array [], - "height": 20, - "id": "id0", - "isDeleted": false, - "opacity": 100, - "roughness": 1, - "seed": 337897, - "strokeColor": "#000000", - "strokeSharpness": "sharp", - "strokeStyle": "solid", - "strokeWidth": 1, - "type": "rectangle", - "version": 2, - "versionNonce": 1278240551, - "width": 20, - "x": 10, - "y": 10, - }, - Object { - "angle": 0, - "backgroundColor": "#e64980", - "boundElementIds": null, - "fillStyle": "cross-hatch", - "groupIds": Array [], - "height": 20, - "id": "id1", - "isDeleted": false, - "opacity": 60, - "roughness": 2, - "seed": 238820263, - "strokeColor": "#c92a2a", - "strokeSharpness": "sharp", - "strokeStyle": "dotted", - "strokeWidth": 2, - "type": "rectangle", - "version": 9, - "versionNonce": 1604849351, - "width": 20, - "x": 40, - "y": 40, - }, - ], - }, - Object { - "appState": Object { - "editingGroupId": null, - "editingLinearElement": null, - "name": "Untitled-201933152653", - "selectedElementIds": Object { - "id0": true, - }, - "viewBackgroundColor": "#ffffff", - }, - "elements": Array [ - Object { - "angle": 0, - "backgroundColor": "#e64980", - "boundElementIds": null, - "fillStyle": "cross-hatch", - "groupIds": Array [], - "height": 20, - "id": "id0", - "isDeleted": false, - "opacity": 60, - "roughness": 2, - "seed": 337897, - "strokeColor": "#c92a2a", - "strokeSharpness": "sharp", - "strokeStyle": "dotted", - "strokeWidth": 2, - "type": "rectangle", - "version": 3, - "versionNonce": 1505387817, - "width": 20, - "x": 10, - "y": 10, - }, - Object { - "angle": 0, - "backgroundColor": "#e64980", - "boundElementIds": null, - "fillStyle": "cross-hatch", - "groupIds": Array [], - "height": 20, - "id": "id1", - "isDeleted": false, - "opacity": 60, - "roughness": 2, - "seed": 238820263, - "strokeColor": "#c92a2a", - "strokeSharpness": "sharp", - "strokeStyle": "dotted", - "strokeWidth": 2, - "type": "rectangle", - "version": 9, - "versionNonce": 1604849351, - "width": 20, - "x": 40, - "y": 40, - }, - ], - }, - ], -} -`; - -exports[`regression tests selecting 'Paste styles' in context menu pastes styles: [end of test] number of elements 1`] = `2`; - -exports[`regression tests selecting 'Paste styles' in context menu pastes styles: [end of test] number of renders 1`] = `24`; - -exports[`regression tests selecting 'Send backward' in context menu sends element backward: [end of test] appState 1`] = ` -Object { - "collaborators": Map {}, - "currentChartType": "bar", - "currentItemBackgroundColor": "transparent", - "currentItemEndArrowhead": "arrow", - "currentItemFillStyle": "hachure", - "currentItemFontFamily": 1, - "currentItemFontSize": 20, - "currentItemLinearStrokeSharpness": "round", - "currentItemOpacity": 100, - "currentItemRoughness": 1, - "currentItemStartArrowhead": null, - "currentItemStrokeColor": "#000000", - "currentItemStrokeSharpness": "sharp", - "currentItemStrokeStyle": "solid", - "currentItemStrokeWidth": 1, - "currentItemTextAlign": "left", - "cursorButton": "up", - "draggingElement": null, - "editingElement": null, - "editingGroupId": null, - "editingLinearElement": null, - "elementLocked": false, - "elementType": "selection", - "errorMessage": null, - "exportBackground": true, - "exportEmbedScene": false, - "exportWithDarkMode": false, - "fileHandle": null, - "gridSize": null, - "height": 768, - "isBindingEnabled": true, - "isLibraryOpen": false, - "isLoading": false, - "isResizing": false, - "isRotating": false, - "lastPointerDownWith": "mouse", - "multiElement": null, - "name": "Untitled-201933152653", - "offsetLeft": 0, - "offsetTop": 0, - "openMenu": null, - "pasteDialog": Object { - "data": null, - "shown": false, - }, - "previousSelectedElementIds": Object {}, - "resizingElement": null, - "scrollX": 0, - "scrollY": 0, - "scrolledOutside": false, - "selectedElementIds": Object { - "id1": true, - }, - "selectedGroupIds": Object {}, - "selectionElement": null, - "shouldAddWatermark": false, - "shouldCacheIgnoreZoom": false, - "showHelpDialog": false, - "showStats": false, - "startBoundElement": null, - "suggestedBindings": Array [], - "theme": "light", - "toastMessage": null, - "viewBackgroundColor": "#ffffff", - "viewModeEnabled": false, - "width": 1024, - "zenModeEnabled": false, - "zoom": Object { - "translation": Object { - "x": 0, - "y": 0, - }, - "value": 1, - }, -} -`; - -exports[`regression tests selecting 'Send backward' in context menu sends element backward: [end of test] element 0 1`] = ` -Object { - "angle": 0, - "backgroundColor": "transparent", - "boundElementIds": null, - "fillStyle": "hachure", - "groupIds": Array [], - "height": 20, - "id": "id1", - "isDeleted": false, - "opacity": 100, - "roughness": 1, - "seed": 449462985, - "strokeColor": "#000000", - "strokeSharpness": "sharp", - "strokeStyle": "solid", - "strokeWidth": 1, - "type": "rectangle", - "version": 2, - "versionNonce": 453191, - "width": 20, - "x": 40, - "y": 40, -} -`; - -exports[`regression tests selecting 'Send backward' in context menu sends element backward: [end of test] element 1 1`] = ` -Object { - "angle": 0, - "backgroundColor": "transparent", - "boundElementIds": null, - "fillStyle": "hachure", - "groupIds": Array [], - "height": 20, - "id": "id0", - "isDeleted": false, - "opacity": 100, - "roughness": 1, - "seed": 337897, - "strokeColor": "#000000", - "strokeSharpness": "sharp", - "strokeStyle": "solid", - "strokeWidth": 1, - "type": "rectangle", - "version": 2, - "versionNonce": 1278240551, - "width": 20, - "x": 10, - "y": 10, -} -`; - -exports[`regression tests selecting 'Send backward' in context menu sends element backward: [end of test] history 1`] = ` -Object { - "recording": false, - "redoStack": Array [], - "stateHistory": Array [ - Object { - "appState": Object { - "editingGroupId": null, - "editingLinearElement": null, - "name": "Untitled-201933152653", - "selectedElementIds": Object {}, - "viewBackgroundColor": "#ffffff", - }, - "elements": Array [], - }, - Object { - "appState": Object { - "editingGroupId": null, - "editingLinearElement": null, - "name": "Untitled-201933152653", - "selectedElementIds": Object { - "id0": true, - }, - "viewBackgroundColor": "#ffffff", - }, - "elements": Array [ - Object { - "angle": 0, - "backgroundColor": "transparent", - "boundElementIds": null, - "fillStyle": "hachure", - "groupIds": Array [], - "height": 20, - "id": "id0", - "isDeleted": false, - "opacity": 100, - "roughness": 1, - "seed": 337897, - "strokeColor": "#000000", - "strokeSharpness": "sharp", - "strokeStyle": "solid", - "strokeWidth": 1, - "type": "rectangle", - "version": 2, - "versionNonce": 1278240551, - "width": 20, - "x": 10, - "y": 10, - }, - ], - }, - Object { - "appState": Object { - "editingGroupId": null, - "editingLinearElement": null, - "name": "Untitled-201933152653", - "selectedElementIds": Object { - "id1": true, - }, - "viewBackgroundColor": "#ffffff", - }, - "elements": Array [ - Object { - "angle": 0, - "backgroundColor": "transparent", - "boundElementIds": null, - "fillStyle": "hachure", - "groupIds": Array [], - "height": 20, - "id": "id0", - "isDeleted": false, - "opacity": 100, - "roughness": 1, - "seed": 337897, - "strokeColor": "#000000", - "strokeSharpness": "sharp", - "strokeStyle": "solid", - "strokeWidth": 1, - "type": "rectangle", - "version": 2, - "versionNonce": 1278240551, - "width": 20, - "x": 10, - "y": 10, - }, - Object { - "angle": 0, - "backgroundColor": "transparent", - "boundElementIds": null, - "fillStyle": "hachure", - "groupIds": Array [], - "height": 20, - "id": "id1", - "isDeleted": false, - "opacity": 100, - "roughness": 1, - "seed": 449462985, - "strokeColor": "#000000", - "strokeSharpness": "sharp", - "strokeStyle": "solid", - "strokeWidth": 1, - "type": "rectangle", - "version": 2, - "versionNonce": 453191, - "width": 20, - "x": 40, - "y": 40, - }, - ], - }, - Object { - "appState": Object { - "editingGroupId": null, - "editingLinearElement": null, - "name": "Untitled-201933152653", - "selectedElementIds": Object { - "id1": true, - }, - "viewBackgroundColor": "#ffffff", - }, - "elements": Array [ - Object { - "angle": 0, - "backgroundColor": "transparent", - "boundElementIds": null, - "fillStyle": "hachure", - "groupIds": Array [], - "height": 20, - "id": "id1", - "isDeleted": false, - "opacity": 100, - "roughness": 1, - "seed": 449462985, - "strokeColor": "#000000", - "strokeSharpness": "sharp", - "strokeStyle": "solid", - "strokeWidth": 1, - "type": "rectangle", - "version": 2, - "versionNonce": 453191, - "width": 20, - "x": 40, - "y": 40, - }, - Object { - "angle": 0, - "backgroundColor": "transparent", - "boundElementIds": null, - "fillStyle": "hachure", - "groupIds": Array [], - "height": 20, - "id": "id0", - "isDeleted": false, - "opacity": 100, - "roughness": 1, - "seed": 337897, - "strokeColor": "#000000", - "strokeSharpness": "sharp", - "strokeStyle": "solid", - "strokeWidth": 1, - "type": "rectangle", - "version": 2, - "versionNonce": 1278240551, - "width": 20, - "x": 10, - "y": 10, - }, - ], - }, - ], -} -`; - -exports[`regression tests selecting 'Send backward' in context menu sends element backward: [end of test] number of elements 1`] = `2`; - -exports[`regression tests selecting 'Send backward' in context menu sends element backward: [end of test] number of renders 1`] = `13`; - -exports[`regression tests selecting 'Send to back' in context menu sends element to back: [end of test] appState 1`] = ` -Object { - "collaborators": Map {}, - "currentChartType": "bar", - "currentItemBackgroundColor": "transparent", - "currentItemEndArrowhead": "arrow", - "currentItemFillStyle": "hachure", - "currentItemFontFamily": 1, - "currentItemFontSize": 20, - "currentItemLinearStrokeSharpness": "round", - "currentItemOpacity": 100, - "currentItemRoughness": 1, - "currentItemStartArrowhead": null, - "currentItemStrokeColor": "#000000", - "currentItemStrokeSharpness": "sharp", - "currentItemStrokeStyle": "solid", - "currentItemStrokeWidth": 1, - "currentItemTextAlign": "left", - "cursorButton": "up", - "draggingElement": null, - "editingElement": null, - "editingGroupId": null, - "editingLinearElement": null, - "elementLocked": false, - "elementType": "selection", - "errorMessage": null, - "exportBackground": true, - "exportEmbedScene": false, - "exportWithDarkMode": false, - "fileHandle": null, - "gridSize": null, - "height": 768, - "isBindingEnabled": true, - "isLibraryOpen": false, - "isLoading": false, - "isResizing": false, - "isRotating": false, - "lastPointerDownWith": "mouse", - "multiElement": null, - "name": "Untitled-201933152653", - "offsetLeft": 0, - "offsetTop": 0, - "openMenu": null, - "pasteDialog": Object { - "data": null, - "shown": false, - }, - "previousSelectedElementIds": Object {}, - "resizingElement": null, - "scrollX": 0, - "scrollY": 0, - "scrolledOutside": false, - "selectedElementIds": Object { - "id1": true, - }, - "selectedGroupIds": Object {}, - "selectionElement": null, - "shouldAddWatermark": false, - "shouldCacheIgnoreZoom": false, - "showHelpDialog": false, - "showStats": false, - "startBoundElement": null, - "suggestedBindings": Array [], - "theme": "light", - "toastMessage": null, - "viewBackgroundColor": "#ffffff", - "viewModeEnabled": false, - "width": 1024, - "zenModeEnabled": false, - "zoom": Object { - "translation": Object { - "x": 0, - "y": 0, - }, - "value": 1, - }, -} -`; - -exports[`regression tests selecting 'Send to back' in context menu sends element to back: [end of test] element 0 1`] = ` -Object { - "angle": 0, - "backgroundColor": "transparent", - "boundElementIds": null, - "fillStyle": "hachure", - "groupIds": Array [], - "height": 20, - "id": "id1", - "isDeleted": false, - "opacity": 100, - "roughness": 1, - "seed": 449462985, - "strokeColor": "#000000", - "strokeSharpness": "sharp", - "strokeStyle": "solid", - "strokeWidth": 1, - "type": "rectangle", - "version": 2, - "versionNonce": 453191, - "width": 20, - "x": 40, - "y": 40, -} -`; - -exports[`regression tests selecting 'Send to back' in context menu sends element to back: [end of test] element 1 1`] = ` -Object { - "angle": 0, - "backgroundColor": "transparent", - "boundElementIds": null, - "fillStyle": "hachure", - "groupIds": Array [], - "height": 20, - "id": "id0", - "isDeleted": false, - "opacity": 100, - "roughness": 1, - "seed": 337897, - "strokeColor": "#000000", - "strokeSharpness": "sharp", - "strokeStyle": "solid", - "strokeWidth": 1, - "type": "rectangle", - "version": 2, - "versionNonce": 1278240551, - "width": 20, - "x": 10, - "y": 10, -} -`; - -exports[`regression tests selecting 'Send to back' in context menu sends element to back: [end of test] history 1`] = ` -Object { - "recording": false, - "redoStack": Array [], - "stateHistory": Array [ - Object { - "appState": Object { - "editingGroupId": null, - "editingLinearElement": null, - "name": "Untitled-201933152653", - "selectedElementIds": Object {}, - "viewBackgroundColor": "#ffffff", - }, - "elements": Array [], - }, - Object { - "appState": Object { - "editingGroupId": null, - "editingLinearElement": null, - "name": "Untitled-201933152653", - "selectedElementIds": Object { - "id0": true, - }, - "viewBackgroundColor": "#ffffff", - }, - "elements": Array [ - Object { - "angle": 0, - "backgroundColor": "transparent", - "boundElementIds": null, - "fillStyle": "hachure", - "groupIds": Array [], - "height": 20, - "id": "id0", - "isDeleted": false, - "opacity": 100, - "roughness": 1, - "seed": 337897, - "strokeColor": "#000000", - "strokeSharpness": "sharp", - "strokeStyle": "solid", - "strokeWidth": 1, - "type": "rectangle", - "version": 2, - "versionNonce": 1278240551, - "width": 20, - "x": 10, - "y": 10, - }, - ], - }, - Object { - "appState": Object { - "editingGroupId": null, - "editingLinearElement": null, - "name": "Untitled-201933152653", - "selectedElementIds": Object { - "id1": true, - }, - "viewBackgroundColor": "#ffffff", - }, - "elements": Array [ - Object { - "angle": 0, - "backgroundColor": "transparent", - "boundElementIds": null, - "fillStyle": "hachure", - "groupIds": Array [], - "height": 20, - "id": "id0", - "isDeleted": false, - "opacity": 100, - "roughness": 1, - "seed": 337897, - "strokeColor": "#000000", - "strokeSharpness": "sharp", - "strokeStyle": "solid", - "strokeWidth": 1, - "type": "rectangle", - "version": 2, - "versionNonce": 1278240551, - "width": 20, - "x": 10, - "y": 10, - }, - Object { - "angle": 0, - "backgroundColor": "transparent", - "boundElementIds": null, - "fillStyle": "hachure", - "groupIds": Array [], - "height": 20, - "id": "id1", - "isDeleted": false, - "opacity": 100, - "roughness": 1, - "seed": 449462985, - "strokeColor": "#000000", - "strokeSharpness": "sharp", - "strokeStyle": "solid", - "strokeWidth": 1, - "type": "rectangle", - "version": 2, - "versionNonce": 453191, - "width": 20, - "x": 40, - "y": 40, - }, - ], - }, - Object { - "appState": Object { - "editingGroupId": null, - "editingLinearElement": null, - "name": "Untitled-201933152653", - "selectedElementIds": Object { - "id1": true, - }, - "viewBackgroundColor": "#ffffff", - }, - "elements": Array [ - Object { - "angle": 0, - "backgroundColor": "transparent", - "boundElementIds": null, - "fillStyle": "hachure", - "groupIds": Array [], - "height": 20, - "id": "id1", - "isDeleted": false, - "opacity": 100, - "roughness": 1, - "seed": 449462985, - "strokeColor": "#000000", - "strokeSharpness": "sharp", - "strokeStyle": "solid", - "strokeWidth": 1, - "type": "rectangle", - "version": 2, - "versionNonce": 453191, - "width": 20, - "x": 40, - "y": 40, - }, - Object { - "angle": 0, - "backgroundColor": "transparent", - "boundElementIds": null, - "fillStyle": "hachure", - "groupIds": Array [], - "height": 20, - "id": "id0", - "isDeleted": false, - "opacity": 100, - "roughness": 1, - "seed": 337897, - "strokeColor": "#000000", - "strokeSharpness": "sharp", - "strokeStyle": "solid", - "strokeWidth": 1, - "type": "rectangle", - "version": 2, - "versionNonce": 1278240551, - "width": 20, - "x": 10, - "y": 10, - }, - ], - }, - ], -} -`; - -exports[`regression tests selecting 'Send to back' in context menu sends element to back: [end of test] number of elements 1`] = `2`; - -exports[`regression tests selecting 'Send to back' in context menu sends element to back: [end of test] number of renders 1`] = `13`; - -exports[`regression tests selecting 'Ungroup selection' in context menu ungroups selected group: [end of test] appState 1`] = ` -Object { - "collaborators": Map {}, - "currentChartType": "bar", - "currentItemBackgroundColor": "transparent", - "currentItemEndArrowhead": "arrow", - "currentItemFillStyle": "hachure", - "currentItemFontFamily": 1, - "currentItemFontSize": 20, - "currentItemLinearStrokeSharpness": "round", - "currentItemOpacity": 100, - "currentItemRoughness": 1, - "currentItemStartArrowhead": null, - "currentItemStrokeColor": "#000000", - "currentItemStrokeSharpness": "sharp", - "currentItemStrokeStyle": "solid", - "currentItemStrokeWidth": 1, - "currentItemTextAlign": "left", - "cursorButton": "up", - "draggingElement": null, - "editingElement": null, - "editingGroupId": null, - "editingLinearElement": null, - "elementLocked": false, - "elementType": "selection", - "errorMessage": null, - "exportBackground": true, - "exportEmbedScene": false, - "exportWithDarkMode": false, - "fileHandle": null, - "gridSize": null, - "height": 768, - "isBindingEnabled": true, - "isLibraryOpen": false, - "isLoading": false, - "isResizing": false, - "isRotating": false, - "lastPointerDownWith": "mouse", - "multiElement": null, - "name": "Untitled-201933152653", - "offsetLeft": 0, - "offsetTop": 0, - "openMenu": null, - "pasteDialog": Object { - "data": null, - "shown": false, - }, - "previousSelectedElementIds": Object { - "id1": true, - }, - "resizingElement": null, - "scrollX": 0, - "scrollY": 0, - "scrolledOutside": false, - "selectedElementIds": Object { - "id0": true, - "id1": true, - "id2": true, - }, - "selectedGroupIds": Object {}, - "selectionElement": null, - "shouldAddWatermark": false, - "shouldCacheIgnoreZoom": false, - "showHelpDialog": false, - "showStats": false, - "startBoundElement": null, - "suggestedBindings": Array [], - "theme": "light", - "toastMessage": null, - "viewBackgroundColor": "#ffffff", - "viewModeEnabled": false, - "width": 1024, - "zenModeEnabled": false, - "zoom": Object { - "translation": Object { - "x": 0, - "y": 0, - }, - "value": 1, - }, -} -`; - -exports[`regression tests selecting 'Ungroup selection' in context menu ungroups selected group: [end of test] element 0 1`] = ` -Object { - "angle": 0, - "backgroundColor": "transparent", - "boundElementIds": null, - "fillStyle": "hachure", - "groupIds": Array [], - "height": 20, - "id": "id0", - "isDeleted": false, - "opacity": 100, - "roughness": 1, - "seed": 337897, - "strokeColor": "#000000", - "strokeSharpness": "sharp", - "strokeStyle": "solid", - "strokeWidth": 1, - "type": "rectangle", - "version": 4, - "versionNonce": 1116226695, - "width": 20, - "x": 10, - "y": 10, -} -`; - -exports[`regression tests selecting 'Ungroup selection' in context menu ungroups selected group: [end of test] element 1 1`] = ` -Object { - "angle": 0, - "backgroundColor": "transparent", - "boundElementIds": null, - "fillStyle": "hachure", - "groupIds": Array [], - "height": 20, - "id": "id1", - "isDeleted": false, - "opacity": 100, - "roughness": 1, - "seed": 449462985, - "strokeColor": "#000000", - "strokeSharpness": "sharp", - "strokeStyle": "solid", - "strokeWidth": 1, - "type": "rectangle", - "version": 4, - "versionNonce": 1014066025, - "width": 20, - "x": 40, - "y": 40, -} -`; - -exports[`regression tests selecting 'Ungroup selection' in context menu ungroups selected group: [end of test] history 1`] = ` -Object { - "recording": false, - "redoStack": Array [], - "stateHistory": Array [ - Object { - "appState": Object { - "editingGroupId": null, - "editingLinearElement": null, - "name": "Untitled-201933152653", - "selectedElementIds": Object {}, - "viewBackgroundColor": "#ffffff", - }, - "elements": Array [], - }, - Object { - "appState": Object { - "editingGroupId": null, - "editingLinearElement": null, - "name": "Untitled-201933152653", - "selectedElementIds": Object { - "id0": true, - }, - "viewBackgroundColor": "#ffffff", - }, - "elements": Array [ - Object { - "angle": 0, - "backgroundColor": "transparent", - "boundElementIds": null, - "fillStyle": "hachure", - "groupIds": Array [], - "height": 20, - "id": "id0", - "isDeleted": false, - "opacity": 100, - "roughness": 1, - "seed": 337897, - "strokeColor": "#000000", - "strokeSharpness": "sharp", - "strokeStyle": "solid", - "strokeWidth": 1, - "type": "rectangle", - "version": 2, - "versionNonce": 1278240551, - "width": 20, - "x": 10, - "y": 10, - }, - ], - }, - Object { - "appState": Object { - "editingGroupId": null, - "editingLinearElement": null, - "name": "Untitled-201933152653", - "selectedElementIds": Object { - "id1": true, - }, - "viewBackgroundColor": "#ffffff", - }, - "elements": Array [ - Object { - "angle": 0, - "backgroundColor": "transparent", - "boundElementIds": null, - "fillStyle": "hachure", - "groupIds": Array [], - "height": 20, - "id": "id0", - "isDeleted": false, - "opacity": 100, - "roughness": 1, - "seed": 337897, - "strokeColor": "#000000", - "strokeSharpness": "sharp", - "strokeStyle": "solid", - "strokeWidth": 1, - "type": "rectangle", - "version": 2, - "versionNonce": 1278240551, - "width": 20, - "x": 10, - "y": 10, - }, - Object { - "angle": 0, - "backgroundColor": "transparent", - "boundElementIds": null, - "fillStyle": "hachure", - "groupIds": Array [], - "height": 20, - "id": "id1", - "isDeleted": false, - "opacity": 100, - "roughness": 1, - "seed": 449462985, - "strokeColor": "#000000", - "strokeSharpness": "sharp", - "strokeStyle": "solid", - "strokeWidth": 1, - "type": "rectangle", - "version": 2, - "versionNonce": 453191, - "width": 20, - "x": 40, - "y": 40, - }, - ], - }, - Object { - "appState": Object { - "editingGroupId": null, - "editingLinearElement": null, - "name": "Untitled-201933152653", - "selectedElementIds": Object { - "id0": true, - "id1": true, - "id2": true, - }, - "viewBackgroundColor": "#ffffff", - }, - "elements": Array [ - Object { - "angle": 0, - "backgroundColor": "transparent", - "boundElementIds": null, - "fillStyle": "hachure", - "groupIds": Array [ - "id3", - ], - "height": 20, - "id": "id0", - "isDeleted": false, - "opacity": 100, - "roughness": 1, - "seed": 337897, - "strokeColor": "#000000", - "strokeSharpness": "sharp", - "strokeStyle": "solid", - "strokeWidth": 1, - "type": "rectangle", - "version": 3, - "versionNonce": 2019559783, - "width": 20, - "x": 10, - "y": 10, - }, - Object { - "angle": 0, - "backgroundColor": "transparent", - "boundElementIds": null, - "fillStyle": "hachure", - "groupIds": Array [ - "id3", - ], - "height": 20, - "id": "id1", - "isDeleted": false, - "opacity": 100, - "roughness": 1, - "seed": 449462985, - "strokeColor": "#000000", - "strokeSharpness": "sharp", - "strokeStyle": "solid", - "strokeWidth": 1, - "type": "rectangle", - "version": 3, - "versionNonce": 1150084233, - "width": 20, - "x": 40, - "y": 40, - }, - ], - }, - Object { - "appState": Object { - "editingGroupId": null, - "editingLinearElement": null, - "name": "Untitled-201933152653", - "selectedElementIds": Object { - "id0": true, - "id1": true, - "id2": true, - }, - "viewBackgroundColor": "#ffffff", - }, - "elements": Array [ - Object { - "angle": 0, - "backgroundColor": "transparent", - "boundElementIds": null, - "fillStyle": "hachure", - "groupIds": Array [], - "height": 20, - "id": "id0", - "isDeleted": false, - "opacity": 100, - "roughness": 1, - "seed": 337897, - "strokeColor": "#000000", - "strokeSharpness": "sharp", - "strokeStyle": "solid", - "strokeWidth": 1, - "type": "rectangle", - "version": 4, - "versionNonce": 1116226695, - "width": 20, - "x": 10, - "y": 10, - }, - Object { - "angle": 0, - "backgroundColor": "transparent", - "boundElementIds": null, - "fillStyle": "hachure", - "groupIds": Array [], - "height": 20, - "id": "id1", - "isDeleted": false, - "opacity": 100, - "roughness": 1, - "seed": 449462985, - "strokeColor": "#000000", - "strokeSharpness": "sharp", - "strokeStyle": "solid", - "strokeWidth": 1, - "type": "rectangle", - "version": 4, - "versionNonce": 1014066025, - "width": 20, - "x": 40, - "y": 40, - }, - ], - }, - ], -} -`; - -exports[`regression tests selecting 'Ungroup selection' in context menu ungroups selected group: [end of test] number of elements 1`] = `2`; - -exports[`regression tests selecting 'Ungroup selection' in context menu ungroups selected group: [end of test] number of renders 1`] = `16`; - exports[`regression tests shift click on selected element should deselect it on pointer up: [end of test] appState 1`] = ` Object { "collaborators": Map {}, @@ -16982,852 +13553,6 @@ exports[`regression tests should show fill icons when element has non transparen exports[`regression tests should show fill icons when element has non transparent background: [end of test] number of renders 1`] = `12`; -exports[`regression tests shows 'Group selection' in context menu for multiple selected elements: [end of test] appState 1`] = ` -Object { - "collaborators": Map {}, - "currentChartType": "bar", - "currentItemBackgroundColor": "transparent", - "currentItemEndArrowhead": "arrow", - "currentItemFillStyle": "hachure", - "currentItemFontFamily": 1, - "currentItemFontSize": 20, - "currentItemLinearStrokeSharpness": "round", - "currentItemOpacity": 100, - "currentItemRoughness": 1, - "currentItemStartArrowhead": null, - "currentItemStrokeColor": "#000000", - "currentItemStrokeSharpness": "sharp", - "currentItemStrokeStyle": "solid", - "currentItemStrokeWidth": 1, - "currentItemTextAlign": "left", - "cursorButton": "up", - "draggingElement": null, - "editingElement": null, - "editingGroupId": null, - "editingLinearElement": null, - "elementLocked": false, - "elementType": "selection", - "errorMessage": null, - "exportBackground": true, - "exportEmbedScene": false, - "exportWithDarkMode": false, - "fileHandle": null, - "gridSize": null, - "height": 768, - "isBindingEnabled": true, - "isLibraryOpen": false, - "isLoading": false, - "isResizing": false, - "isRotating": false, - "lastPointerDownWith": "mouse", - "multiElement": null, - "name": "Untitled-201933152653", - "offsetLeft": 0, - "offsetTop": 0, - "openMenu": null, - "pasteDialog": Object { - "data": null, - "shown": false, - }, - "previousSelectedElementIds": Object { - "id0": true, - "id2": true, - }, - "resizingElement": null, - "scrollX": 0, - "scrollY": 0, - "scrolledOutside": false, - "selectedElementIds": Object { - "id0": true, - "id1": true, - "id2": true, - "id3": true, - }, - "selectedGroupIds": Object {}, - "selectionElement": null, - "shouldAddWatermark": false, - "shouldCacheIgnoreZoom": false, - "showHelpDialog": false, - "showStats": false, - "startBoundElement": null, - "suggestedBindings": Array [], - "theme": "light", - "toastMessage": null, - "viewBackgroundColor": "#ffffff", - "viewModeEnabled": false, - "width": 1024, - "zenModeEnabled": false, - "zoom": Object { - "translation": Object { - "x": 0, - "y": 0, - }, - "value": 1, - }, -} -`; - -exports[`regression tests shows 'Group selection' in context menu for multiple selected elements: [end of test] element 0 1`] = ` -Object { - "angle": 0, - "backgroundColor": "transparent", - "boundElementIds": null, - "fillStyle": "hachure", - "groupIds": Array [], - "height": 10, - "id": "id0", - "isDeleted": false, - "opacity": 100, - "roughness": 1, - "seed": 337897, - "strokeColor": "#000000", - "strokeSharpness": "sharp", - "strokeStyle": "solid", - "strokeWidth": 1, - "type": "rectangle", - "version": 2, - "versionNonce": 1278240551, - "width": 10, - "x": 10, - "y": 10, -} -`; - -exports[`regression tests shows 'Group selection' in context menu for multiple selected elements: [end of test] element 1 1`] = ` -Object { - "angle": 0, - "backgroundColor": "transparent", - "boundElementIds": null, - "fillStyle": "hachure", - "groupIds": Array [], - "height": 10, - "id": "id1", - "isDeleted": false, - "opacity": 100, - "roughness": 1, - "seed": 449462985, - "strokeColor": "#000000", - "strokeSharpness": "sharp", - "strokeStyle": "solid", - "strokeWidth": 1, - "type": "rectangle", - "version": 2, - "versionNonce": 453191, - "width": 10, - "x": 30, - "y": 10, -} -`; - -exports[`regression tests shows 'Group selection' in context menu for multiple selected elements: [end of test] history 1`] = ` -Object { - "recording": false, - "redoStack": Array [], - "stateHistory": Array [ - Object { - "appState": Object { - "editingGroupId": null, - "editingLinearElement": null, - "name": "Untitled-201933152653", - "selectedElementIds": Object {}, - "viewBackgroundColor": "#ffffff", - }, - "elements": Array [], - }, - Object { - "appState": Object { - "editingGroupId": null, - "editingLinearElement": null, - "name": "Untitled-201933152653", - "selectedElementIds": Object { - "id0": true, - }, - "viewBackgroundColor": "#ffffff", - }, - "elements": Array [ - Object { - "angle": 0, - "backgroundColor": "transparent", - "boundElementIds": null, - "fillStyle": "hachure", - "groupIds": Array [], - "height": 10, - "id": "id0", - "isDeleted": false, - "opacity": 100, - "roughness": 1, - "seed": 337897, - "strokeColor": "#000000", - "strokeSharpness": "sharp", - "strokeStyle": "solid", - "strokeWidth": 1, - "type": "rectangle", - "version": 2, - "versionNonce": 1278240551, - "width": 10, - "x": 10, - "y": 10, - }, - ], - }, - Object { - "appState": Object { - "editingGroupId": null, - "editingLinearElement": null, - "name": "Untitled-201933152653", - "selectedElementIds": Object { - "id1": true, - }, - "viewBackgroundColor": "#ffffff", - }, - "elements": Array [ - Object { - "angle": 0, - "backgroundColor": "transparent", - "boundElementIds": null, - "fillStyle": "hachure", - "groupIds": Array [], - "height": 10, - "id": "id0", - "isDeleted": false, - "opacity": 100, - "roughness": 1, - "seed": 337897, - "strokeColor": "#000000", - "strokeSharpness": "sharp", - "strokeStyle": "solid", - "strokeWidth": 1, - "type": "rectangle", - "version": 2, - "versionNonce": 1278240551, - "width": 10, - "x": 10, - "y": 10, - }, - Object { - "angle": 0, - "backgroundColor": "transparent", - "boundElementIds": null, - "fillStyle": "hachure", - "groupIds": Array [], - "height": 10, - "id": "id1", - "isDeleted": false, - "opacity": 100, - "roughness": 1, - "seed": 449462985, - "strokeColor": "#000000", - "strokeSharpness": "sharp", - "strokeStyle": "solid", - "strokeWidth": 1, - "type": "rectangle", - "version": 2, - "versionNonce": 453191, - "width": 10, - "x": 30, - "y": 10, - }, - ], - }, - ], -} -`; - -exports[`regression tests shows 'Group selection' in context menu for multiple selected elements: [end of test] number of elements 1`] = `2`; - -exports[`regression tests shows 'Group selection' in context menu for multiple selected elements: [end of test] number of renders 1`] = `16`; - -exports[`regression tests shows 'Ungroup selection' in context menu for group inside selected elements: [end of test] appState 1`] = ` -Object { - "collaborators": Map {}, - "currentChartType": "bar", - "currentItemBackgroundColor": "transparent", - "currentItemEndArrowhead": "arrow", - "currentItemFillStyle": "hachure", - "currentItemFontFamily": 1, - "currentItemFontSize": 20, - "currentItemLinearStrokeSharpness": "round", - "currentItemOpacity": 100, - "currentItemRoughness": 1, - "currentItemStartArrowhead": null, - "currentItemStrokeColor": "#000000", - "currentItemStrokeSharpness": "sharp", - "currentItemStrokeStyle": "solid", - "currentItemStrokeWidth": 1, - "currentItemTextAlign": "left", - "cursorButton": "up", - "draggingElement": null, - "editingElement": null, - "editingGroupId": null, - "editingLinearElement": null, - "elementLocked": false, - "elementType": "selection", - "errorMessage": null, - "exportBackground": true, - "exportEmbedScene": false, - "exportWithDarkMode": false, - "fileHandle": null, - "gridSize": null, - "height": 768, - "isBindingEnabled": true, - "isLibraryOpen": false, - "isLoading": false, - "isResizing": false, - "isRotating": false, - "lastPointerDownWith": "mouse", - "multiElement": null, - "name": "Untitled-201933152653", - "offsetLeft": 0, - "offsetTop": 0, - "openMenu": null, - "pasteDialog": Object { - "data": null, - "shown": false, - }, - "previousSelectedElementIds": Object { - "id0": true, - "id2": true, - }, - "resizingElement": null, - "scrollX": 0, - "scrollY": 0, - "scrolledOutside": false, - "selectedElementIds": Object { - "id0": true, - "id1": true, - "id2": true, - "id3": true, - }, - "selectedGroupIds": Object { - "id4": true, - }, - "selectionElement": null, - "shouldAddWatermark": false, - "shouldCacheIgnoreZoom": false, - "showHelpDialog": false, - "showStats": false, - "startBoundElement": null, - "suggestedBindings": Array [], - "theme": "light", - "toastMessage": null, - "viewBackgroundColor": "#ffffff", - "viewModeEnabled": false, - "width": 1024, - "zenModeEnabled": false, - "zoom": Object { - "translation": Object { - "x": 0, - "y": 0, - }, - "value": 1, - }, -} -`; - -exports[`regression tests shows 'Ungroup selection' in context menu for group inside selected elements: [end of test] element 0 1`] = ` -Object { - "angle": 0, - "backgroundColor": "transparent", - "boundElementIds": null, - "fillStyle": "hachure", - "groupIds": Array [ - "id4", - ], - "height": 10, - "id": "id0", - "isDeleted": false, - "opacity": 100, - "roughness": 1, - "seed": 337897, - "strokeColor": "#000000", - "strokeSharpness": "sharp", - "strokeStyle": "solid", - "strokeWidth": 1, - "type": "rectangle", - "version": 3, - "versionNonce": 1150084233, - "width": 10, - "x": 10, - "y": 10, -} -`; - -exports[`regression tests shows 'Ungroup selection' in context menu for group inside selected elements: [end of test] element 1 1`] = ` -Object { - "angle": 0, - "backgroundColor": "transparent", - "boundElementIds": null, - "fillStyle": "hachure", - "groupIds": Array [ - "id4", - ], - "height": 10, - "id": "id1", - "isDeleted": false, - "opacity": 100, - "roughness": 1, - "seed": 449462985, - "strokeColor": "#000000", - "strokeSharpness": "sharp", - "strokeStyle": "solid", - "strokeWidth": 1, - "type": "rectangle", - "version": 3, - "versionNonce": 1116226695, - "width": 10, - "x": 30, - "y": 10, -} -`; - -exports[`regression tests shows 'Ungroup selection' in context menu for group inside selected elements: [end of test] history 1`] = ` -Object { - "recording": false, - "redoStack": Array [], - "stateHistory": Array [ - Object { - "appState": Object { - "editingGroupId": null, - "editingLinearElement": null, - "name": "Untitled-201933152653", - "selectedElementIds": Object {}, - "viewBackgroundColor": "#ffffff", - }, - "elements": Array [], - }, - Object { - "appState": Object { - "editingGroupId": null, - "editingLinearElement": null, - "name": "Untitled-201933152653", - "selectedElementIds": Object { - "id0": true, - }, - "viewBackgroundColor": "#ffffff", - }, - "elements": Array [ - Object { - "angle": 0, - "backgroundColor": "transparent", - "boundElementIds": null, - "fillStyle": "hachure", - "groupIds": Array [], - "height": 10, - "id": "id0", - "isDeleted": false, - "opacity": 100, - "roughness": 1, - "seed": 337897, - "strokeColor": "#000000", - "strokeSharpness": "sharp", - "strokeStyle": "solid", - "strokeWidth": 1, - "type": "rectangle", - "version": 2, - "versionNonce": 1278240551, - "width": 10, - "x": 10, - "y": 10, - }, - ], - }, - Object { - "appState": Object { - "editingGroupId": null, - "editingLinearElement": null, - "name": "Untitled-201933152653", - "selectedElementIds": Object { - "id1": true, - }, - "viewBackgroundColor": "#ffffff", - }, - "elements": Array [ - Object { - "angle": 0, - "backgroundColor": "transparent", - "boundElementIds": null, - "fillStyle": "hachure", - "groupIds": Array [], - "height": 10, - "id": "id0", - "isDeleted": false, - "opacity": 100, - "roughness": 1, - "seed": 337897, - "strokeColor": "#000000", - "strokeSharpness": "sharp", - "strokeStyle": "solid", - "strokeWidth": 1, - "type": "rectangle", - "version": 2, - "versionNonce": 1278240551, - "width": 10, - "x": 10, - "y": 10, - }, - Object { - "angle": 0, - "backgroundColor": "transparent", - "boundElementIds": null, - "fillStyle": "hachure", - "groupIds": Array [], - "height": 10, - "id": "id1", - "isDeleted": false, - "opacity": 100, - "roughness": 1, - "seed": 449462985, - "strokeColor": "#000000", - "strokeSharpness": "sharp", - "strokeStyle": "solid", - "strokeWidth": 1, - "type": "rectangle", - "version": 2, - "versionNonce": 453191, - "width": 10, - "x": 30, - "y": 10, - }, - ], - }, - Object { - "appState": Object { - "editingGroupId": null, - "editingLinearElement": null, - "name": "Untitled-201933152653", - "selectedElementIds": Object { - "id0": true, - "id1": true, - "id2": true, - "id3": true, - }, - "viewBackgroundColor": "#ffffff", - }, - "elements": Array [ - Object { - "angle": 0, - "backgroundColor": "transparent", - "boundElementIds": null, - "fillStyle": "hachure", - "groupIds": Array [ - "id4", - ], - "height": 10, - "id": "id0", - "isDeleted": false, - "opacity": 100, - "roughness": 1, - "seed": 337897, - "strokeColor": "#000000", - "strokeSharpness": "sharp", - "strokeStyle": "solid", - "strokeWidth": 1, - "type": "rectangle", - "version": 3, - "versionNonce": 1150084233, - "width": 10, - "x": 10, - "y": 10, - }, - Object { - "angle": 0, - "backgroundColor": "transparent", - "boundElementIds": null, - "fillStyle": "hachure", - "groupIds": Array [ - "id4", - ], - "height": 10, - "id": "id1", - "isDeleted": false, - "opacity": 100, - "roughness": 1, - "seed": 449462985, - "strokeColor": "#000000", - "strokeSharpness": "sharp", - "strokeStyle": "solid", - "strokeWidth": 1, - "type": "rectangle", - "version": 3, - "versionNonce": 1116226695, - "width": 10, - "x": 30, - "y": 10, - }, - ], - }, - ], -} -`; - -exports[`regression tests shows 'Ungroup selection' in context menu for group inside selected elements: [end of test] number of elements 1`] = `2`; - -exports[`regression tests shows 'Ungroup selection' in context menu for group inside selected elements: [end of test] number of renders 1`] = `17`; - -exports[`regression tests shows context menu for canvas: [end of test] appState 1`] = ` -Object { - "collaborators": Map {}, - "currentChartType": "bar", - "currentItemBackgroundColor": "transparent", - "currentItemEndArrowhead": "arrow", - "currentItemFillStyle": "hachure", - "currentItemFontFamily": 1, - "currentItemFontSize": 20, - "currentItemLinearStrokeSharpness": "round", - "currentItemOpacity": 100, - "currentItemRoughness": 1, - "currentItemStartArrowhead": null, - "currentItemStrokeColor": "#000000", - "currentItemStrokeSharpness": "sharp", - "currentItemStrokeStyle": "solid", - "currentItemStrokeWidth": 1, - "currentItemTextAlign": "left", - "cursorButton": "up", - "draggingElement": null, - "editingElement": null, - "editingGroupId": null, - "editingLinearElement": null, - "elementLocked": false, - "elementType": "selection", - "errorMessage": null, - "exportBackground": true, - "exportEmbedScene": false, - "exportWithDarkMode": false, - "fileHandle": null, - "gridSize": null, - "height": 768, - "isBindingEnabled": true, - "isLibraryOpen": false, - "isLoading": false, - "isResizing": false, - "isRotating": false, - "lastPointerDownWith": "mouse", - "multiElement": null, - "name": "Untitled-201933152653", - "offsetLeft": 0, - "offsetTop": 0, - "openMenu": null, - "pasteDialog": Object { - "data": null, - "shown": false, - }, - "previousSelectedElementIds": Object {}, - "resizingElement": null, - "scrollX": 0, - "scrollY": 0, - "scrolledOutside": false, - "selectedElementIds": Object {}, - "selectedGroupIds": Object {}, - "selectionElement": null, - "shouldAddWatermark": false, - "shouldCacheIgnoreZoom": false, - "showHelpDialog": false, - "showStats": false, - "startBoundElement": null, - "suggestedBindings": Array [], - "theme": "light", - "toastMessage": null, - "viewBackgroundColor": "#ffffff", - "viewModeEnabled": false, - "width": 1024, - "zenModeEnabled": false, - "zoom": Object { - "translation": Object { - "x": 0, - "y": 0, - }, - "value": 1, - }, -} -`; - -exports[`regression tests shows context menu for canvas: [end of test] history 1`] = ` -Object { - "recording": false, - "redoStack": Array [], - "stateHistory": Array [ - Object { - "appState": Object { - "editingGroupId": null, - "editingLinearElement": null, - "name": "Untitled-201933152653", - "selectedElementIds": Object {}, - "viewBackgroundColor": "#ffffff", - }, - "elements": Array [], - }, - ], -} -`; - -exports[`regression tests shows context menu for canvas: [end of test] number of elements 1`] = `0`; - -exports[`regression tests shows context menu for canvas: [end of test] number of renders 1`] = `4`; - -exports[`regression tests shows context menu for element: [end of test] appState 1`] = ` -Object { - "collaborators": Map {}, - "currentChartType": "bar", - "currentItemBackgroundColor": "transparent", - "currentItemEndArrowhead": "arrow", - "currentItemFillStyle": "hachure", - "currentItemFontFamily": 1, - "currentItemFontSize": 20, - "currentItemLinearStrokeSharpness": "round", - "currentItemOpacity": 100, - "currentItemRoughness": 1, - "currentItemStartArrowhead": null, - "currentItemStrokeColor": "#000000", - "currentItemStrokeSharpness": "sharp", - "currentItemStrokeStyle": "solid", - "currentItemStrokeWidth": 1, - "currentItemTextAlign": "left", - "cursorButton": "up", - "draggingElement": null, - "editingElement": null, - "editingGroupId": null, - "editingLinearElement": null, - "elementLocked": false, - "elementType": "selection", - "errorMessage": null, - "exportBackground": true, - "exportEmbedScene": false, - "exportWithDarkMode": false, - "fileHandle": null, - "gridSize": null, - "height": 768, - "isBindingEnabled": true, - "isLibraryOpen": false, - "isLoading": false, - "isResizing": false, - "isRotating": false, - "lastPointerDownWith": "mouse", - "multiElement": null, - "name": "Untitled-201933152653", - "offsetLeft": 0, - "offsetTop": 0, - "openMenu": null, - "pasteDialog": Object { - "data": null, - "shown": false, - }, - "previousSelectedElementIds": Object {}, - "resizingElement": null, - "scrollX": 0, - "scrollY": 0, - "scrolledOutside": false, - "selectedElementIds": Object { - "id0": true, - }, - "selectedGroupIds": Object {}, - "selectionElement": null, - "shouldAddWatermark": false, - "shouldCacheIgnoreZoom": false, - "showHelpDialog": false, - "showStats": false, - "startBoundElement": null, - "suggestedBindings": Array [], - "theme": "light", - "toastMessage": null, - "viewBackgroundColor": "#ffffff", - "viewModeEnabled": false, - "width": 1024, - "zenModeEnabled": false, - "zoom": Object { - "translation": Object { - "x": 0, - "y": 0, - }, - "value": 1, - }, -} -`; - -exports[`regression tests shows context menu for element: [end of test] element 0 1`] = ` -Object { - "angle": 0, - "backgroundColor": "transparent", - "boundElementIds": null, - "fillStyle": "hachure", - "groupIds": Array [], - "height": 20, - "id": "id0", - "isDeleted": false, - "opacity": 100, - "roughness": 1, - "seed": 337897, - "strokeColor": "#000000", - "strokeSharpness": "sharp", - "strokeStyle": "solid", - "strokeWidth": 1, - "type": "rectangle", - "version": 2, - "versionNonce": 1278240551, - "width": 20, - "x": 10, - "y": 10, -} -`; - -exports[`regression tests shows context menu for element: [end of test] history 1`] = ` -Object { - "recording": false, - "redoStack": Array [], - "stateHistory": Array [ - Object { - "appState": Object { - "editingGroupId": null, - "editingLinearElement": null, - "name": "Untitled-201933152653", - "selectedElementIds": Object {}, - "viewBackgroundColor": "#ffffff", - }, - "elements": Array [], - }, - Object { - "appState": Object { - "editingGroupId": null, - "editingLinearElement": null, - "name": "Untitled-201933152653", - "selectedElementIds": Object { - "id0": true, - }, - "viewBackgroundColor": "#ffffff", - }, - "elements": Array [ - Object { - "angle": 0, - "backgroundColor": "transparent", - "boundElementIds": null, - "fillStyle": "hachure", - "groupIds": Array [], - "height": 20, - "id": "id0", - "isDeleted": false, - "opacity": 100, - "roughness": 1, - "seed": 337897, - "strokeColor": "#000000", - "strokeSharpness": "sharp", - "strokeStyle": "solid", - "strokeWidth": 1, - "type": "rectangle", - "version": 2, - "versionNonce": 1278240551, - "width": 20, - "x": 10, - "y": 10, - }, - ], - }, - ], -} -`; - -exports[`regression tests shows context menu for element: [end of test] number of elements 1`] = `1`; - -exports[`regression tests shows context menu for element: [end of test] number of renders 1`] = `8`; - exports[`regression tests single-clicking on a subgroup of a selected group should not alter selection: [end of test] appState 1`] = ` Object { "collaborators": Map {}, diff --git a/src/tests/contextmenu.test.tsx b/src/tests/contextmenu.test.tsx new file mode 100644 index 000000000..343ffbcc6 --- /dev/null +++ b/src/tests/contextmenu.test.tsx @@ -0,0 +1,531 @@ +import ReactDOM from "react-dom"; +import { + render, + fireEvent, + mockBoundingClientRect, + restoreOriginalGetBoundingClientRect, + GlobalTestState, + screen, + queryByText, + queryAllByText, + waitFor, +} from "./test-utils"; +import ExcalidrawApp from "../excalidraw-app"; +import * as Renderer from "../renderer/renderScene"; +import { reseed } from "../random"; +import { UI, Pointer, Keyboard } from "./helpers/ui"; +import { CODES } from "../keys"; +import { ShortcutName } from "../actions/shortcuts"; +import { copiedStyles } from "../actions/actionStyles"; +import { API } from "./helpers/api"; +import { setDateTimeForTests } from "../utils"; + +const checkpoint = (name: string) => { + expect(renderScene.mock.calls.length).toMatchSnapshot( + `[${name}] number of renders`, + ); + expect(h.state).toMatchSnapshot(`[${name}] appState`); + expect(h.history.getSnapshotForTest()).toMatchSnapshot(`[${name}] history`); + expect(h.elements.length).toMatchSnapshot(`[${name}] number of elements`); + h.elements.forEach((element, i) => + expect(element).toMatchSnapshot(`[${name}] element ${i}`), + ); +}; + +const mouse = new Pointer("mouse"); + +const queryContextMenu = () => { + return GlobalTestState.renderResult.container.querySelector(".context-menu"); +}; + +const clickLabeledElement = (label: string) => { + const element = document.querySelector(`[aria-label='${label}']`); + if (!element) { + throw new Error(`No labeled element found: ${label}`); + } + fireEvent.click(element); +}; + +// Unmount ReactDOM from root +ReactDOM.unmountComponentAtNode(document.getElementById("root")!); + +const renderScene = jest.spyOn(Renderer, "renderScene"); +beforeEach(() => { + localStorage.clear(); + renderScene.mockClear(); + reseed(7); +}); + +const { h } = window; + +describe("contextMenu element", () => { + beforeEach(async () => { + localStorage.clear(); + renderScene.mockClear(); + h.history.clear(); + reseed(7); + setDateTimeForTests("201933152653"); + + await render(); + }); + + beforeAll(() => { + mockBoundingClientRect(); + }); + + afterAll(() => { + restoreOriginalGetBoundingClientRect(); + }); + + afterEach(() => { + checkpoint("end of test"); + + mouse.reset(); + mouse.down(0, 0); + }); + + it("shows context menu for canvas", () => { + fireEvent.contextMenu(GlobalTestState.canvas, { + button: 2, + clientX: 1, + clientY: 1, + }); + const contextMenu = queryContextMenu(); + const contextMenuOptions = contextMenu?.querySelectorAll( + ".context-menu li", + ); + const expectedShortcutNames: ShortcutName[] = [ + "selectAll", + "gridMode", + "zenMode", + "viewMode", + "stats", + ]; + + expect(contextMenu).not.toBeNull(); + expect(contextMenuOptions?.length).toBe(expectedShortcutNames.length); + expectedShortcutNames.forEach((shortcutName) => { + expect( + contextMenu?.querySelector(`li[data-testid="${shortcutName}"]`), + ).not.toBeNull(); + }); + }); + + it("shows context menu for element", () => { + UI.clickTool("rectangle"); + mouse.down(10, 10); + mouse.up(20, 20); + + fireEvent.contextMenu(GlobalTestState.canvas, { + button: 2, + clientX: 1, + clientY: 1, + }); + const contextMenu = queryContextMenu(); + const contextMenuOptions = contextMenu?.querySelectorAll( + ".context-menu li", + ); + const expectedShortcutNames: ShortcutName[] = [ + "copyStyles", + "pasteStyles", + "deleteSelectedElements", + "addToLibrary", + "flipHorizontal", + "flipVertical", + "sendBackward", + "bringForward", + "sendToBack", + "bringToFront", + "duplicateSelection", + ]; + + expect(contextMenu).not.toBeNull(); + expect(contextMenuOptions?.length).toBe(expectedShortcutNames.length); + expectedShortcutNames.forEach((shortcutName) => { + expect( + contextMenu?.querySelector(`li[data-testid="${shortcutName}"]`), + ).not.toBeNull(); + }); + }); + + it("shows 'Group selection' in context menu for multiple selected elements", () => { + UI.clickTool("rectangle"); + mouse.down(10, 10); + mouse.up(10, 10); + + UI.clickTool("rectangle"); + mouse.down(10, -10); + mouse.up(10, 10); + + mouse.reset(); + mouse.click(10, 10); + Keyboard.withModifierKeys({ shift: true }, () => { + mouse.click(20, 0); + }); + + fireEvent.contextMenu(GlobalTestState.canvas, { + button: 2, + clientX: 1, + clientY: 1, + }); + + const contextMenu = queryContextMenu(); + const contextMenuOptions = contextMenu?.querySelectorAll( + ".context-menu li", + ); + const expectedShortcutNames: ShortcutName[] = [ + "copyStyles", + "pasteStyles", + "deleteSelectedElements", + "group", + "addToLibrary", + "sendBackward", + "bringForward", + "sendToBack", + "bringToFront", + "duplicateSelection", + ]; + + expect(contextMenu).not.toBeNull(); + expect(contextMenuOptions?.length).toBe(expectedShortcutNames.length); + expectedShortcutNames.forEach((shortcutName) => { + expect( + contextMenu?.querySelector(`li[data-testid="${shortcutName}"]`), + ).not.toBeNull(); + }); + }); + + it("shows 'Ungroup selection' in context menu for group inside selected elements", () => { + UI.clickTool("rectangle"); + mouse.down(10, 10); + mouse.up(10, 10); + + UI.clickTool("rectangle"); + mouse.down(10, -10); + mouse.up(10, 10); + + mouse.reset(); + mouse.click(10, 10); + Keyboard.withModifierKeys({ shift: true }, () => { + mouse.click(20, 0); + }); + + Keyboard.withModifierKeys({ ctrl: true }, () => { + Keyboard.codePress(CODES.G); + }); + + fireEvent.contextMenu(GlobalTestState.canvas, { + button: 2, + clientX: 1, + clientY: 1, + }); + + const contextMenu = queryContextMenu(); + const contextMenuOptions = contextMenu?.querySelectorAll( + ".context-menu li", + ); + const expectedShortcutNames: ShortcutName[] = [ + "copyStyles", + "pasteStyles", + "deleteSelectedElements", + "ungroup", + "addToLibrary", + "sendBackward", + "bringForward", + "sendToBack", + "bringToFront", + "duplicateSelection", + ]; + + expect(contextMenu).not.toBeNull(); + expect(contextMenuOptions?.length).toBe(expectedShortcutNames.length); + expectedShortcutNames.forEach((shortcutName) => { + expect( + contextMenu?.querySelector(`li[data-testid="${shortcutName}"]`), + ).not.toBeNull(); + }); + }); + + it("selecting 'Copy styles' in context menu copies styles", () => { + UI.clickTool("rectangle"); + mouse.down(10, 10); + mouse.up(20, 20); + + fireEvent.contextMenu(GlobalTestState.canvas, { + button: 2, + clientX: 1, + clientY: 1, + }); + const contextMenu = queryContextMenu(); + expect(copiedStyles).toBe("{}"); + fireEvent.click(queryByText(contextMenu as HTMLElement, "Copy styles")!); + expect(copiedStyles).not.toBe("{}"); + const element = JSON.parse(copiedStyles); + expect(element).toEqual(API.getSelectedElement()); + }); + + it("selecting 'Paste styles' in context menu pastes styles", () => { + UI.clickTool("rectangle"); + mouse.down(10, 10); + mouse.up(20, 20); + + UI.clickTool("rectangle"); + mouse.down(10, 10); + mouse.up(20, 20); + + // Change some styles of second rectangle + clickLabeledElement("Stroke"); + clickLabeledElement("#c92a2a"); + clickLabeledElement("Background"); + clickLabeledElement("#e64980"); + // Fill style + fireEvent.click(screen.getByTitle("Cross-hatch")); + // Stroke width + fireEvent.click(screen.getByTitle("Bold")); + // Stroke style + fireEvent.click(screen.getByTitle("Dotted")); + // Roughness + fireEvent.click(screen.getByTitle("Cartoonist")); + // Opacity + fireEvent.change(screen.getByLabelText("Opacity"), { + target: { value: "60" }, + }); + + mouse.reset(); + // Copy styles of second rectangle + fireEvent.contextMenu(GlobalTestState.canvas, { + button: 2, + clientX: 40, + clientY: 40, + }); + let contextMenu = queryContextMenu(); + fireEvent.click(queryByText(contextMenu as HTMLElement, "Copy styles")!); + const secondRect = JSON.parse(copiedStyles); + expect(secondRect.id).toBe(h.elements[1].id); + + mouse.reset(); + // Paste styles to first rectangle + fireEvent.contextMenu(GlobalTestState.canvas, { + button: 2, + clientX: 10, + clientY: 10, + }); + contextMenu = queryContextMenu(); + fireEvent.click(queryByText(contextMenu as HTMLElement, "Paste styles")!); + + const firstRect = API.getSelectedElement(); + expect(firstRect.id).toBe(h.elements[0].id); + expect(firstRect.strokeColor).toBe("#c92a2a"); + expect(firstRect.backgroundColor).toBe("#e64980"); + expect(firstRect.fillStyle).toBe("cross-hatch"); + expect(firstRect.strokeWidth).toBe(2); // Bold: 2 + expect(firstRect.strokeStyle).toBe("dotted"); + expect(firstRect.roughness).toBe(2); // Cartoonist: 2 + expect(firstRect.opacity).toBe(60); + }); + + it("selecting 'Delete' in context menu deletes element", () => { + UI.clickTool("rectangle"); + mouse.down(10, 10); + mouse.up(20, 20); + + fireEvent.contextMenu(GlobalTestState.canvas, { + button: 2, + clientX: 1, + clientY: 1, + }); + const contextMenu = queryContextMenu(); + fireEvent.click(queryAllByText(contextMenu as HTMLElement, "Delete")[0]); + expect(API.getSelectedElements()).toHaveLength(0); + expect(h.elements[0].isDeleted).toBe(true); + }); + + it("selecting 'Add to library' in context menu adds element to library", async () => { + UI.clickTool("rectangle"); + mouse.down(10, 10); + mouse.up(20, 20); + + fireEvent.contextMenu(GlobalTestState.canvas, { + button: 2, + clientX: 1, + clientY: 1, + }); + const contextMenu = queryContextMenu(); + fireEvent.click(queryByText(contextMenu as HTMLElement, "Add to library")!); + + await waitFor(() => { + const library = localStorage.getItem("excalidraw-library"); + expect(library).not.toBeNull(); + const addedElement = JSON.parse(library!)[0][0]; + expect(addedElement).toEqual(h.elements[0]); + }); + }); + + it("selecting 'Duplicate' in context menu duplicates element", () => { + UI.clickTool("rectangle"); + mouse.down(10, 10); + mouse.up(20, 20); + + fireEvent.contextMenu(GlobalTestState.canvas, { + button: 2, + clientX: 1, + clientY: 1, + }); + const contextMenu = queryContextMenu(); + fireEvent.click(queryByText(contextMenu as HTMLElement, "Duplicate")!); + expect(h.elements).toHaveLength(2); + const { id: _id0, seed: _seed0, x: _x0, y: _y0, ...rect1 } = h.elements[0]; + const { id: _id1, seed: _seed1, x: _x1, y: _y1, ...rect2 } = h.elements[1]; + expect(rect1).toEqual(rect2); + }); + + it("selecting 'Send backward' in context menu sends element backward", () => { + UI.clickTool("rectangle"); + mouse.down(10, 10); + mouse.up(20, 20); + + UI.clickTool("rectangle"); + mouse.down(10, 10); + mouse.up(20, 20); + + mouse.reset(); + fireEvent.contextMenu(GlobalTestState.canvas, { + button: 2, + clientX: 40, + clientY: 40, + }); + const contextMenu = queryContextMenu(); + const elementsBefore = h.elements; + fireEvent.click(queryByText(contextMenu as HTMLElement, "Send backward")!); + expect(elementsBefore[0].id).toEqual(h.elements[1].id); + expect(elementsBefore[1].id).toEqual(h.elements[0].id); + }); + + it("selecting 'Bring forward' in context menu brings element forward", () => { + UI.clickTool("rectangle"); + mouse.down(10, 10); + mouse.up(20, 20); + + UI.clickTool("rectangle"); + mouse.down(10, 10); + mouse.up(20, 20); + + mouse.reset(); + fireEvent.contextMenu(GlobalTestState.canvas, { + button: 2, + clientX: 10, + clientY: 10, + }); + const contextMenu = queryContextMenu(); + const elementsBefore = h.elements; + fireEvent.click(queryByText(contextMenu as HTMLElement, "Bring forward")!); + expect(elementsBefore[0].id).toEqual(h.elements[1].id); + expect(elementsBefore[1].id).toEqual(h.elements[0].id); + }); + + it("selecting 'Send to back' in context menu sends element to back", () => { + UI.clickTool("rectangle"); + mouse.down(10, 10); + mouse.up(20, 20); + + UI.clickTool("rectangle"); + mouse.down(10, 10); + mouse.up(20, 20); + + mouse.reset(); + fireEvent.contextMenu(GlobalTestState.canvas, { + button: 2, + clientX: 40, + clientY: 40, + }); + const contextMenu = queryContextMenu(); + const elementsBefore = h.elements; + fireEvent.click(queryByText(contextMenu as HTMLElement, "Send to back")!); + expect(elementsBefore[1].id).toEqual(h.elements[0].id); + }); + + it("selecting 'Bring to front' in context menu brings element to front", () => { + UI.clickTool("rectangle"); + mouse.down(10, 10); + mouse.up(20, 20); + + UI.clickTool("rectangle"); + mouse.down(10, 10); + mouse.up(20, 20); + + mouse.reset(); + fireEvent.contextMenu(GlobalTestState.canvas, { + button: 2, + clientX: 10, + clientY: 10, + }); + const contextMenu = queryContextMenu(); + const elementsBefore = h.elements; + fireEvent.click(queryByText(contextMenu as HTMLElement, "Bring to front")!); + expect(elementsBefore[0].id).toEqual(h.elements[1].id); + }); + + it("selecting 'Group selection' in context menu groups selected elements", () => { + UI.clickTool("rectangle"); + mouse.down(10, 10); + mouse.up(20, 20); + + UI.clickTool("rectangle"); + mouse.down(10, 10); + mouse.up(20, 20); + + mouse.reset(); + Keyboard.withModifierKeys({ shift: true }, () => { + mouse.click(10, 10); + }); + + fireEvent.contextMenu(GlobalTestState.canvas, { + button: 2, + clientX: 1, + clientY: 1, + }); + const contextMenu = queryContextMenu(); + fireEvent.click( + queryByText(contextMenu as HTMLElement, "Group selection")!, + ); + const selectedGroupIds = Object.keys(h.state.selectedGroupIds); + expect(h.elements[0].groupIds).toEqual(selectedGroupIds); + expect(h.elements[1].groupIds).toEqual(selectedGroupIds); + }); + + it("selecting 'Ungroup selection' in context menu ungroups selected group", () => { + UI.clickTool("rectangle"); + mouse.down(10, 10); + mouse.up(20, 20); + + UI.clickTool("rectangle"); + mouse.down(10, 10); + mouse.up(20, 20); + + mouse.reset(); + Keyboard.withModifierKeys({ shift: true }, () => { + mouse.click(10, 10); + }); + + Keyboard.withModifierKeys({ ctrl: true }, () => { + Keyboard.codePress(CODES.G); + }); + + fireEvent.contextMenu(GlobalTestState.canvas, { + button: 2, + clientX: 1, + clientY: 1, + }); + + const contextMenu = queryContextMenu(); + expect(contextMenu).not.toBeNull(); + fireEvent.click( + queryByText(contextMenu as HTMLElement, "Ungroup selection")!, + ); + + const selectedGroupIds = Object.keys(h.state.selectedGroupIds); + expect(selectedGroupIds).toHaveLength(0); + expect(h.elements[0].groupIds).toHaveLength(0); + expect(h.elements[1].groupIds).toHaveLength(0); + }); +}); diff --git a/src/tests/regressionTests.test.tsx b/src/tests/regressionTests.test.tsx index a356b9cb6..9c44a497a 100644 --- a/src/tests/regressionTests.test.tsx +++ b/src/tests/regressionTests.test.tsx @@ -1,8 +1,4 @@ -import { queryAllByText, queryByText } from "@testing-library/react"; -import React from "react"; import ReactDOM from "react-dom"; -import { copiedStyles } from "../actions/actionStyles"; -import { ShortcutName } from "../actions/shortcuts"; import { ExcalidrawElement } from "../element/types"; import { CODES, KEYS } from "../keys"; import ExcalidrawApp from "../excalidraw-app"; @@ -11,13 +7,7 @@ import * as Renderer from "../renderer/renderScene"; import { setDateTimeForTests } from "../utils"; import { API } from "./helpers/api"; import { Keyboard, Pointer, UI } from "./helpers/ui"; -import { - fireEvent, - GlobalTestState, - render, - screen, - waitFor, -} from "./test-utils"; +import { fireEvent, render, screen, waitFor } from "./test-utils"; import { defaultLang } from "../i18n"; const { h } = window; @@ -612,441 +602,6 @@ describe("regression tests", () => { expect(h.state.currentItemFontFamily).toEqual(3); // Cascadia }); - it("shows context menu for canvas", () => { - fireEvent.contextMenu(GlobalTestState.canvas, { - button: 2, - clientX: 1, - clientY: 1, - }); - const contextMenu = document.querySelector(".context-menu"); - const contextMenuOptions = document.querySelectorAll(".context-menu li"); - const expectedShortcutNames: ShortcutName[] = [ - "selectAll", - "gridMode", - "zenMode", - "viewMode", - "stats", - ]; - - expect(contextMenu).not.toBeNull(); - expect(contextMenuOptions.length).toBe(expectedShortcutNames.length); - expectedShortcutNames.forEach((shortcutName) => { - expect( - contextMenu?.querySelector(`li[data-testid="${shortcutName}"]`), - ).not.toBeNull(); - }); - }); - - it("shows context menu for element", () => { - UI.clickTool("rectangle"); - mouse.down(10, 10); - mouse.up(20, 20); - - fireEvent.contextMenu(GlobalTestState.canvas, { - button: 2, - clientX: 1, - clientY: 1, - }); - const contextMenu = document.querySelector(".context-menu"); - const contextMenuOptions = document.querySelectorAll(".context-menu li"); - const expectedShortcutNames: ShortcutName[] = [ - "copyStyles", - "pasteStyles", - "deleteSelectedElements", - "addToLibrary", - "flipHorizontal", - "flipVertical", - "sendBackward", - "bringForward", - "sendToBack", - "bringToFront", - "duplicateSelection", - ]; - - expect(contextMenu).not.toBeNull(); - expect(contextMenuOptions.length).toBe(expectedShortcutNames.length); - expectedShortcutNames.forEach((shortcutName) => { - expect( - contextMenu?.querySelector(`li[data-testid="${shortcutName}"]`), - ).not.toBeNull(); - }); - }); - - it("shows 'Group selection' in context menu for multiple selected elements", () => { - UI.clickTool("rectangle"); - mouse.down(10, 10); - mouse.up(10, 10); - - UI.clickTool("rectangle"); - mouse.down(10, -10); - mouse.up(10, 10); - - mouse.reset(); - mouse.click(10, 10); - Keyboard.withModifierKeys({ shift: true }, () => { - mouse.click(20, 0); - }); - - fireEvent.contextMenu(GlobalTestState.canvas, { - button: 2, - clientX: 1, - clientY: 1, - }); - - const contextMenu = document.querySelector(".context-menu"); - const contextMenuOptions = document.querySelectorAll(".context-menu li"); - const expectedShortcutNames: ShortcutName[] = [ - "copyStyles", - "pasteStyles", - "deleteSelectedElements", - "group", - "addToLibrary", - "sendBackward", - "bringForward", - "sendToBack", - "bringToFront", - "duplicateSelection", - ]; - - expect(contextMenu).not.toBeNull(); - expect(contextMenuOptions.length).toBe(expectedShortcutNames.length); - expectedShortcutNames.forEach((shortcutName) => { - expect( - contextMenu?.querySelector(`li[data-testid="${shortcutName}"]`), - ).not.toBeNull(); - }); - }); - - it("shows 'Ungroup selection' in context menu for group inside selected elements", () => { - UI.clickTool("rectangle"); - mouse.down(10, 10); - mouse.up(10, 10); - - UI.clickTool("rectangle"); - mouse.down(10, -10); - mouse.up(10, 10); - - mouse.reset(); - mouse.click(10, 10); - Keyboard.withModifierKeys({ shift: true }, () => { - mouse.click(20, 0); - }); - - Keyboard.withModifierKeys({ ctrl: true }, () => { - Keyboard.codePress(CODES.G); - }); - - fireEvent.contextMenu(GlobalTestState.canvas, { - button: 2, - clientX: 1, - clientY: 1, - }); - - const contextMenu = document.querySelector(".context-menu"); - const contextMenuOptions = document.querySelectorAll(".context-menu li"); - const expectedShortcutNames: ShortcutName[] = [ - "copyStyles", - "pasteStyles", - "deleteSelectedElements", - "ungroup", - "addToLibrary", - "sendBackward", - "bringForward", - "sendToBack", - "bringToFront", - "duplicateSelection", - ]; - - expect(contextMenu).not.toBeNull(); - expect(contextMenuOptions.length).toBe(expectedShortcutNames.length); - expectedShortcutNames.forEach((shortcutName) => { - expect( - contextMenu?.querySelector(`li[data-testid="${shortcutName}"]`), - ).not.toBeNull(); - }); - }); - - it("selecting 'Copy styles' in context menu copies styles", () => { - UI.clickTool("rectangle"); - mouse.down(10, 10); - mouse.up(20, 20); - - fireEvent.contextMenu(GlobalTestState.canvas, { - button: 2, - clientX: 1, - clientY: 1, - }); - const contextMenu = document.querySelector(".context-menu"); - expect(copiedStyles).toBe("{}"); - fireEvent.click(queryByText(contextMenu as HTMLElement, "Copy styles")!); - expect(copiedStyles).not.toBe("{}"); - const element = JSON.parse(copiedStyles); - expect(element).toEqual(API.getSelectedElement()); - }); - - it("selecting 'Paste styles' in context menu pastes styles", () => { - UI.clickTool("rectangle"); - mouse.down(10, 10); - mouse.up(20, 20); - - UI.clickTool("rectangle"); - mouse.down(10, 10); - mouse.up(20, 20); - - // Change some styles of second rectangle - clickLabeledElement("Stroke"); - clickLabeledElement("#c92a2a"); - clickLabeledElement("Background"); - clickLabeledElement("#e64980"); - // Fill style - fireEvent.click(screen.getByTitle("Cross-hatch")); - // Stroke width - fireEvent.click(screen.getByTitle("Bold")); - // Stroke style - fireEvent.click(screen.getByTitle("Dotted")); - // Roughness - fireEvent.click(screen.getByTitle("Cartoonist")); - // Opacity - fireEvent.change(screen.getByLabelText("Opacity"), { - target: { value: "60" }, - }); - - mouse.reset(); - // Copy styles of second rectangle - fireEvent.contextMenu(GlobalTestState.canvas, { - button: 2, - clientX: 40, - clientY: 40, - }); - let contextMenu = document.querySelector(".context-menu"); - fireEvent.click(queryByText(contextMenu as HTMLElement, "Copy styles")!); - const secondRect = JSON.parse(copiedStyles); - expect(secondRect.id).toBe(h.elements[1].id); - - mouse.reset(); - // Paste styles to first rectangle - fireEvent.contextMenu(GlobalTestState.canvas, { - button: 2, - clientX: 10, - clientY: 10, - }); - contextMenu = document.querySelector(".context-menu"); - fireEvent.click(queryByText(contextMenu as HTMLElement, "Paste styles")!); - - const firstRect = API.getSelectedElement(); - expect(firstRect.id).toBe(h.elements[0].id); - expect(firstRect.strokeColor).toBe("#c92a2a"); - expect(firstRect.backgroundColor).toBe("#e64980"); - expect(firstRect.fillStyle).toBe("cross-hatch"); - expect(firstRect.strokeWidth).toBe(2); // Bold: 2 - expect(firstRect.strokeStyle).toBe("dotted"); - expect(firstRect.roughness).toBe(2); // Cartoonist: 2 - expect(firstRect.opacity).toBe(60); - }); - - it("selecting 'Delete' in context menu deletes element", () => { - UI.clickTool("rectangle"); - mouse.down(10, 10); - mouse.up(20, 20); - - fireEvent.contextMenu(GlobalTestState.canvas, { - button: 2, - clientX: 1, - clientY: 1, - }); - const contextMenu = document.querySelector(".context-menu"); - fireEvent.click(queryAllByText(contextMenu as HTMLElement, "Delete")[0]); - expect(API.getSelectedElements()).toHaveLength(0); - expect(h.elements[0].isDeleted).toBe(true); - }); - - it("selecting 'Add to library' in context menu adds element to library", async () => { - UI.clickTool("rectangle"); - mouse.down(10, 10); - mouse.up(20, 20); - - fireEvent.contextMenu(GlobalTestState.canvas, { - button: 2, - clientX: 1, - clientY: 1, - }); - const contextMenu = document.querySelector(".context-menu"); - fireEvent.click(queryByText(contextMenu as HTMLElement, "Add to library")!); - - await waitFor(() => { - const library = localStorage.getItem("excalidraw-library"); - expect(library).not.toBeNull(); - const addedElement = JSON.parse(library!)[0][0]; - expect(addedElement).toEqual(h.elements[0]); - }); - }); - - it("selecting 'Duplicate' in context menu duplicates element", () => { - UI.clickTool("rectangle"); - mouse.down(10, 10); - mouse.up(20, 20); - - fireEvent.contextMenu(GlobalTestState.canvas, { - button: 2, - clientX: 1, - clientY: 1, - }); - const contextMenu = document.querySelector(".context-menu"); - fireEvent.click(queryByText(contextMenu as HTMLElement, "Duplicate")!); - expect(h.elements).toHaveLength(2); - const { id: _id0, seed: _seed0, x: _x0, y: _y0, ...rect1 } = h.elements[0]; - const { id: _id1, seed: _seed1, x: _x1, y: _y1, ...rect2 } = h.elements[1]; - expect(rect1).toEqual(rect2); - }); - - it("selecting 'Send backward' in context menu sends element backward", () => { - UI.clickTool("rectangle"); - mouse.down(10, 10); - mouse.up(20, 20); - - UI.clickTool("rectangle"); - mouse.down(10, 10); - mouse.up(20, 20); - - mouse.reset(); - fireEvent.contextMenu(GlobalTestState.canvas, { - button: 2, - clientX: 40, - clientY: 40, - }); - const contextMenu = document.querySelector(".context-menu"); - const elementsBefore = h.elements; - fireEvent.click(queryByText(contextMenu as HTMLElement, "Send backward")!); - expect(elementsBefore[0].id).toEqual(h.elements[1].id); - expect(elementsBefore[1].id).toEqual(h.elements[0].id); - }); - - it("selecting 'Bring forward' in context menu brings element forward", () => { - UI.clickTool("rectangle"); - mouse.down(10, 10); - mouse.up(20, 20); - - UI.clickTool("rectangle"); - mouse.down(10, 10); - mouse.up(20, 20); - - mouse.reset(); - fireEvent.contextMenu(GlobalTestState.canvas, { - button: 2, - clientX: 10, - clientY: 10, - }); - const contextMenu = document.querySelector(".context-menu"); - const elementsBefore = h.elements; - fireEvent.click(queryByText(contextMenu as HTMLElement, "Bring forward")!); - expect(elementsBefore[0].id).toEqual(h.elements[1].id); - expect(elementsBefore[1].id).toEqual(h.elements[0].id); - }); - - it("selecting 'Send to back' in context menu sends element to back", () => { - UI.clickTool("rectangle"); - mouse.down(10, 10); - mouse.up(20, 20); - - UI.clickTool("rectangle"); - mouse.down(10, 10); - mouse.up(20, 20); - - mouse.reset(); - fireEvent.contextMenu(GlobalTestState.canvas, { - button: 2, - clientX: 40, - clientY: 40, - }); - const contextMenu = document.querySelector(".context-menu"); - const elementsBefore = h.elements; - fireEvent.click(queryByText(contextMenu as HTMLElement, "Send to back")!); - expect(elementsBefore[1].id).toEqual(h.elements[0].id); - }); - - it("selecting 'Bring to front' in context menu brings element to front", () => { - UI.clickTool("rectangle"); - mouse.down(10, 10); - mouse.up(20, 20); - - UI.clickTool("rectangle"); - mouse.down(10, 10); - mouse.up(20, 20); - - mouse.reset(); - fireEvent.contextMenu(GlobalTestState.canvas, { - button: 2, - clientX: 10, - clientY: 10, - }); - const contextMenu = document.querySelector(".context-menu"); - const elementsBefore = h.elements; - fireEvent.click(queryByText(contextMenu as HTMLElement, "Bring to front")!); - expect(elementsBefore[0].id).toEqual(h.elements[1].id); - }); - - it("selecting 'Group selection' in context menu groups selected elements", () => { - UI.clickTool("rectangle"); - mouse.down(10, 10); - mouse.up(20, 20); - - UI.clickTool("rectangle"); - mouse.down(10, 10); - mouse.up(20, 20); - - mouse.reset(); - Keyboard.withModifierKeys({ shift: true }, () => { - mouse.click(10, 10); - }); - - fireEvent.contextMenu(GlobalTestState.canvas, { - button: 2, - clientX: 1, - clientY: 1, - }); - const contextMenu = document.querySelector(".context-menu"); - fireEvent.click( - queryByText(contextMenu as HTMLElement, "Group selection")!, - ); - const selectedGroupIds = Object.keys(h.state.selectedGroupIds); - expect(h.elements[0].groupIds).toEqual(selectedGroupIds); - expect(h.elements[1].groupIds).toEqual(selectedGroupIds); - }); - - it("selecting 'Ungroup selection' in context menu ungroups selected group", () => { - UI.clickTool("rectangle"); - mouse.down(10, 10); - mouse.up(20, 20); - - UI.clickTool("rectangle"); - mouse.down(10, 10); - mouse.up(20, 20); - - mouse.reset(); - Keyboard.withModifierKeys({ shift: true }, () => { - mouse.click(10, 10); - }); - - Keyboard.withModifierKeys({ ctrl: true }, () => { - Keyboard.codePress(CODES.G); - }); - - fireEvent.contextMenu(GlobalTestState.canvas, { - button: 2, - clientX: 1, - clientY: 1, - }); - const contextMenu = document.querySelector(".context-menu"); - fireEvent.click( - queryByText(contextMenu as HTMLElement, "Ungroup selection")!, - ); - - const selectedGroupIds = Object.keys(h.state.selectedGroupIds); - expect(selectedGroupIds).toHaveLength(0); - expect(h.elements[0].groupIds).toHaveLength(0); - expect(h.elements[1].groupIds).toHaveLength(0); - }); - it("deselects selected element, on pointer up, when click hits element bounding box but doesn't hit the element", () => { UI.clickTool("ellipse"); mouse.down(); From c2b40dff9275e9084d376c261df8424e026c93de Mon Sep 17 00:00:00 2001 From: Aakansha Doshi Date: Tue, 6 Apr 2021 00:38:14 +0530 Subject: [PATCH 4/7] docs: changelog tweaks and add Library updates for 0.6.0 (#3404) * docs: changelog tweaks and Library updates for 0.6.0 * update readme_next to be same as readme --- src/packages/excalidraw/CHANGELOG.md | 36 ++++++++++++++++++++++---- src/packages/excalidraw/README_NEXT.md | 31 ++++++++++++++++++---- 2 files changed, 57 insertions(+), 10 deletions(-) diff --git a/src/packages/excalidraw/CHANGELOG.md b/src/packages/excalidraw/CHANGELOG.md index c0aa17d89..f36b428f5 100644 --- a/src/packages/excalidraw/CHANGELOG.md +++ b/src/packages/excalidraw/CHANGELOG.md @@ -6,7 +6,6 @@ The change should be grouped under one of the below section and must contain PR - Features: For new features. - Fixes: For bug fixes. - Chore: Changes for non src files example package.json. -- Improvements: For any improvements. - Refactor: For any refactoring. Please add the latest change on the top under the correct section. @@ -18,21 +17,21 @@ Please add the latest change on the top under the correct section. ### Features -- Add `UIOptions` prop to customise `canvas actions` which includes customising `background color picker`, `clear canvas`, `export`, `load`, `save`, `save as` & `theme toggle` [#3364](https://github.com/excalidraw/excalidraw/pull/3364). +- Add `UIOptions` prop to customise `canvas actions` which includes customising `background color picker`, `clear canvas`, `export`, `load`, `save`, `save as` & `theme toggle` [#3364](https://github.com/excalidraw/excalidraw/pull/3364). Check the [readme](https://github.com/excalidraw/excalidraw/blob/master/src/packages/excalidraw/README.md#uioptions) for more details. - Calculate `width/height` of canvas based on excalidraw component (".excalidraw" selector) & also resize and update offsets whenever the dimensions of excalidraw component gets updated [#3379](https://github.com/excalidraw/excalidraw/pull/3379). You also don't need to add a resize handler anymore for excalidraw as its handled now in excalidraw itself. #### BREAKING CHANGE - `width/height` props have been removed. Instead now it takes `100%` of `width` and `height` of the container so you need to make sure the container in which you are rendering Excalidraw has non zero dimensions (It should have non zero width and height so Excalidraw can match the dimensions of containing block) - Calculate offsets when excalidraw container resizes using resize observer api [#3374](https://github.com/excalidraw/excalidraw/pull/3374). -- Export types for the package so now it can be used with typescript [#3337](https://github.com/excalidraw/excalidraw/pull/3337). The types are available at `@excalidraw/excalirdraw/types`. +- Export types for the package so now it can be used with typescript [#3337](https://github.com/excalidraw/excalidraw/pull/3337). The types are available at `@excalidraw/excalidraw/types`. - Add `renderCustomStats` prop to render extra stats on host, and expose `setToastMessage` API via refs which can be used to show toast with custom message [#3360](https://github.com/excalidraw/excalidraw/pull/3360). - Support passing a CSRF token when importing libraries to prevent prompting before installation. The token is passed from [https://libraries.excalidraw.com](https://libraries.excalidraw.com/) using the `token` URL key [#3329](https://github.com/excalidraw/excalidraw/pull/3329). - #### BREAKING CHANGE - Use `location.hash` when importing libraries to fix installation issues. This will require host apps to add a `hashchange` listener and call the newly exposed `excalidrawAPI.importLibrary(url)` API when applicable [#3320](https://github.com/excalidraw/excalidraw/pull/3320). + Use `location.hash` when importing libraries to fix installation issues. This will require host apps to add a `hashchange` listener and call the newly exposed `excalidrawAPI.importLibrary(url)` API when applicable [#3320](https://github.com/excalidraw/excalidraw/pull/3320). Check the [readme](https://github.com/excalidraw/excalidraw/blob/master/src/packages/excalidraw/README.md#importlibrary) for more details. - Append `location.pathname` to `libraryReturnUrl` default url [#3325](https://github.com/excalidraw/excalidraw/pull/3325). ### Build -- Expose separate builds for dev and prod and support source maps in dev build [#3330](https://github.com/excalidraw/excalidraw/pull/3330). +- Expose separate builds for dev and prod and support source maps in dev build [#3330](https://github.com/excalidraw/excalidraw/pull/3330). Check the [readme](https://github.com/excalidraw/excalidraw/blob/master/src/packages/excalidraw/README.md#installation) for more details. #### BREAKING CHANGE - If you are using script tag to embed excalidraw then the name of the file will have to be updated to `excalidraw.production.min.js` instead of `excalidraw.min.js`. If you want to use dev build you can use `excalidraw.development.js` @@ -42,6 +41,33 @@ Please add the latest change on the top under the correct section. - Rename the API `setCanvasOffsets` exposed via [`ref`](https://github.com/excalidraw/excalidraw/blob/master/src/components/App.tsx#L265) to `refresh` [#3398](https://github.com/excalidraw/excalidraw/pull/3398). +## Excalidraw Library + +### Features + +- Reopen library menu on import from file [#3383](https://github.com/excalidraw/excalidraw/pull/3383). +- Don't unnecessarily prompt when installing libraries [#3329](https://github.com/excalidraw/excalidraw/pull/3329). +- Add option to flip single element on the context menu [#2520](https://github.com/excalidraw/excalidraw/pull/2520). +- Replace fontSize and fontFamily text with icons [#2857](https://github.com/excalidraw/excalidraw/pull/2857). + +### Fixes + +- Export dialog canvas positioning [#3397](https://github.com/excalidraw/excalidraw/pull/3397). +- Don't share collab types with core [#3353](https://github.com/excalidraw/excalidraw/pull/3353). +- Support d&d of files without extension [#3168](https://github.com/excalidraw/excalidraw/pull/3168). +- Positions stats for linear elements [#3331](https://github.com/excalidraw/excalidraw/pull/3331). +- Debounce.flush invokes func even if never queued before [#3326](https://github.com/excalidraw/excalidraw/pull/3326). +- State selection state on opening contextMenu [#3333](https://github.com/excalidraw/excalidraw/pull/3333). +- Add unique key for library header to resolve dev warnings [#3316](https://github.com/excalidraw/excalidraw/pull/3316). +- disallow create text in viewMode on mobile [#3219](https://github.com/excalidraw/excalidraw/pull/3219). +- Make help toggle tabbable [#3310](https://github.com/excalidraw/excalidraw/pull/3310) +- Show Windows share icon for Windows users [#3306](https://github.com/excalidraw/excalidraw/pull/3306). +- Don't scroll to content on INIT websocket message [#3291](https://github.com/excalidraw/excalidraw/pull/3291). + +### Refactor + +- Use arrow function where possible [#3315](https://github.com/excalidraw/excalidraw/pull/3315). + --- ## 0.5.0 (2021-03-21) diff --git a/src/packages/excalidraw/README_NEXT.md b/src/packages/excalidraw/README_NEXT.md index c356864b3..9d31a7a5d 100644 --- a/src/packages/excalidraw/README_NEXT.md +++ b/src/packages/excalidraw/README_NEXT.md @@ -16,9 +16,9 @@ or via yarn yarn add react react-dom @excalidraw/excalidraw ``` -After installation you will see a folder `excalidraw-assets` and `excalidraw-dev-assets` in `dist` directory which contains the assets needed for this app in prod and dev mode respectively. +After installation you will see a folder `excalidraw-assets` and `excalidraw-assets-dev` in `dist` directory which contains the assets needed for this app in prod and dev mode respectively. -Move the folder `excalidraw-assets` and `excalidraw-dev-assets` to the path where your assets are served. +Move the folder `excalidraw-assets` and `excalidraw-assets-dev` to the path where your assets are served. By default it will try to load the files from `https://unpkg.com/@excalidraw/excalidraw/{currentVersion}/dist/` @@ -50,7 +50,6 @@ export default function App() { const [zenModeEnabled, setZenModeEnabled] = useState(false); const [gridModeEnabled, setGridModeEnabled] = useState(false); - const updateScene = () => { const sceneData = { elements: [ @@ -368,7 +367,7 @@ To view the full example visit :point_down: ### Dimensions of Excalidraw -Excalidraw takes `100%` of `width` and `height` of the containing block so you need to make sure the container in which you are rendering Excalidraw has non zero dimensions (It should have non zero width and height so Excalidraw can match the dimensions of the containing block). This is to make sure you don't have to worry about updating the offsets of dimensions when resizing Excalidraw. +Excalidraw takes `100%` of `width` and `height` of the containing block so make sure the container in which you render Excalidraw has non zero dimensions. #### `onChange` @@ -441,7 +440,7 @@ You can pass a `ref` when you want to access some excalidraw APIs. We expose the | history | `{ clear: () => void }` | This is the history API. `history.clear()` will clear the history | | setScrollToContent |
     (ExcalidrawElement[]) => void 
    | Scroll to the nearest element to center | | refresh | `() => void` | Updates the offsets for the Excalidraw component so that the coordinates are computed correctly (for example the cursor position). You don't have to call this when the position is changed on page scroll or when the excalidraw container resizes (we handle that ourselves). For any other cases if the position of excalidraw is updated (example due to scroll on parent container and not page scroll) you should call this API. | -| importLibrary | `(url: string, token?: string) => void` | Imports library from given URL. You should call this on `hashchange`, passing the `addLibrary` value if you detect it. Optionally pass a CSRF `token` to skip prompting during installation (retrievable via `token` key from the url coming from [https://libraries.excalidraw.com](https://libraries.excalidraw.com/)). | +| [importLibrary](#importlibrary) | `(url: string, token?: string) => void` | Imports library from given URL | | setToastMessage | `(message: string) => void` | This API can be used to show the toast with custom message. | #### `readyPromise` @@ -553,6 +552,28 @@ This prop can be used to customise UI of Excalidraw. Currently we support custom No Excalidraw package doesn't come with collaboration, since this would have different implementations on the consumer so we expose the API's which you can use to communicate with Excalidraw as mentioned above. If you are interested in understanding how Excalidraw does it you can check it [here](https://github.com/excalidraw/excalidraw/blob/master/src/excalidraw-app/index.tsx). +### importLibrary + +Imports library from given URL. You should call this on `hashchange`, passing the `addLibrary` value if you detect it as shown below. Optionally pass a CSRF `token` to skip prompting during installation (retrievable via `token` key from the url coming from [https://libraries.excalidraw.com](https://libraries.excalidraw.com/)). + +```js +useEffect(() => { + const onHashChange = () => { + const hash = new URLSearchParams(window.location.hash.slice(1)); + const libraryUrl = hash.get("addLibrary"); + if (libraryUrl) { + excalidrawRef.current.importLibrary(libraryUrl, hash.get("token")); + } + }; + window.addEventListener("hashchange", onHashChange, false); + return () => { + window.removeEventListener("hashchange", onHashChange); + }; +}, []); +``` + +Try out the [Demo](#Demo) to see it in action. + ### Extra API's #### `getSceneVersion` From a0899966ff489a2aaaa8ed2cf20b186d05867de8 Mon Sep 17 00:00:00 2001 From: Thang Vu <31528554+ThangHuuVu@users.noreply.github.com> Date: Tue, 6 Apr 2021 22:17:00 +0700 Subject: [PATCH 5/7] feat: enable drop event on the whole component (#3406) Co-authored-by: Thang Vu --- src/components/App.tsx | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/components/App.tsx b/src/components/App.tsx index 5bb8d1c13..a2118d914 100644 --- a/src/components/App.tsx +++ b/src/components/App.tsx @@ -409,7 +409,6 @@ class App extends React.Component { onPointerUp={this.removePointer} onPointerCancel={this.removePointer} onTouchMove={this.handleTouchMove} - onDrop={this.handleCanvasOnDrop} > {t("labels.drawingCanvas")} @@ -440,6 +439,7 @@ class App extends React.Component { "excalidraw--view-mode": viewModeEnabled, })} ref={this.excalidrawContainerRef} + onDrop={this.handleAppOnDrop} > { } }; - private handleCanvasOnDrop = async ( - event: React.DragEvent, - ) => { + private handleAppOnDrop = async (event: React.DragEvent) => { try { const file = event.dataTransfer.files[0]; if (file?.type === "image/png" || file?.type === "image/svg+xml") { From 34761200bf2f579319deecc53515d991ba3d2bb1 Mon Sep 17 00:00:00 2001 From: anumithaapollo12 <38392250+anumithaapollo12@users.noreply.github.com> Date: Tue, 6 Apr 2021 23:02:58 +0530 Subject: [PATCH 6/7] feat: Add screenshots to manifest.json (#3369) * feat: Add screenshots to manifest.json * rename screenshots --- public/manifest.json | 34 +++++++++++++++++++++- public/screenshots/collaboration.png | Bin 0 -> 29035 bytes public/screenshots/export.png | Bin 0 -> 25959 bytes public/screenshots/illustration.png | Bin 0 -> 48095 bytes public/screenshots/shapes.png | Bin 0 -> 25306 bytes public/screenshots/virtual-whiteboard.png | Bin 0 -> 27910 bytes public/screenshots/wireframe.png | Bin 0 -> 27243 bytes 7 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 public/screenshots/collaboration.png create mode 100644 public/screenshots/export.png create mode 100644 public/screenshots/illustration.png create mode 100644 public/screenshots/shapes.png create mode 100644 public/screenshots/virtual-whiteboard.png create mode 100644 public/screenshots/wireframe.png diff --git a/public/manifest.json b/public/manifest.json index cc689baef..eb97497ac 100644 --- a/public/manifest.json +++ b/public/manifest.json @@ -39,5 +39,37 @@ } ] } - } + }, + "screenshots": [ + { + "src": "/screenshots/virtual-whiteboard.png", + "type": "image/png", + "sizes": "462x945" + }, + { + "src": "/screenshots/wireframe.png", + "type": "image/png", + "sizes": "462x945" + }, + { + "src": "/screenshots/illustration.png", + "type": "image/png", + "sizes": "462x945" + }, + { + "src": "/screenshots/shapes.png", + "type": "image/png", + "sizes": "462x945" + }, + { + "src": "/screenshots/collaboration.png", + "type": "image/png", + "sizes": "462x945" + }, + { + "src": "/screenshots/export.png", + "type": "image/png", + "sizes": "462x945" + } + ] } diff --git a/public/screenshots/collaboration.png b/public/screenshots/collaboration.png new file mode 100644 index 0000000000000000000000000000000000000000..c902ac6ce7f06c877e826bb9d2799a9a94c876bd GIT binary patch literal 29035 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 literal 0 HcmV?d00001 diff --git a/public/screenshots/export.png b/public/screenshots/export.png new file mode 100644 index 0000000000000000000000000000000000000000..b25253a71dc38f42f3756b4f2dcfc1d015ef7f49 GIT binary patch literal 25959 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 XDUfX6Dcm3a)PSO_0FkeeGYkGNwyi1o literal 0 HcmV?d00001 diff --git a/public/screenshots/illustration.png b/public/screenshots/illustration.png new file mode 100644 index 0000000000000000000000000000000000000000..00d8ee6d003bf682a5bb550cd1934d29d01ddc5c GIT binary patch literal 48095 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 q^r0yx`;EQyxSXnL57_AB~M;nhtUC~>hD4iC9l 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


    #NO&!rRhP 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 Of>V?Q%G64k1^+iNjPY&& literal 0 HcmV?d00001 diff --git a/public/screenshots/wireframe.png b/public/screenshots/wireframe.png new file mode 100644 index 0000000000000000000000000000000000000000..8d284cf8603ee79baa89d4dc62b58a102467dffa GIT binary patch literal 27243 zcma&MRZtvE&@Q|LNM0bgdxE>mF7D3aZh-)c!{RQ%CAhP=dxBe#;I=?;cNQnOCnsP1 z|IMj$an96SbobOeJ=N9SH9bAi>R@?HbTV`R0D!5eAfpKYAi)6u|C1=sw)Ox3 zZ|c=mv}OOXy}$qdn>`o*|LnW`ANJqC#Kh(o5IQ`)5Rs7Lb&3*g!-P#&bT3TxH*)lmLg_4rW$k?Q|w${?p%G}&yYin!f*DnVL zM-NX=Jw1I@Rkflq*m>5DrVmCK;T3Y&lhN7oughE~K z?(TB)@-#Fw$HvBDW8+%e+Su7SArRZEo4b*bk*21mg@pxHHV!8zXH89QAt7NwK_DX| zb5vB+#Kc5KMg}u8%Nqqh1x4k7fdL6gDRFTLSvh$=KK}E|Yk7Hvj+5vA{zKE&)=^SY zCN_-b;oT=NA+UD3y|u#@CA& z8XD^B>tnJ@|F(1UP9-p^dkN@W*n0RV9a8c0=TEEr-mm>@Xy9OKiv)7hI7u1#iq#7` z>ts~rfb{Vlv+SD!<0@^Q}xDW!`@x#^4b0C z--5ZLtv!To@lW~iYIdhA$MV75$G?krf5)!>B96}jTV`CVM-9?iYqzeP)Z{$tCxk>L zhQ_BBoQ1`@|ZRY06;7iWhAw|S59X_FheEY1HOxV zX!tvHMg}`26ycp}PrnepfBB(2Ane9TIt8QOo%jVkQklsr;+2KOzzK4hg|ytu4*#D8 zV+pUm%c_Lv{ahk1)|*y!tDla8L&}nnxN+5Rx!3c)a2rO22wmdfpA}>@n&{e8pEG!- z1S{v^Y6OyWu{DgivCvOdrizqnUcr<`|1S(dsq4yoyar~rw=v7UzW|eti3nS`D|!lb z95Yp#6zGIZ?G7VkxI`UJsu=K%#n$pd!;dA^P2SE8P>oetOVtQjaP@WWrwJUUBTsY) ztwHscvE5@++xU~_fPcQ6T<)#9R`FX2%Vq8&`9iU7sx0z3Q3`$~QOw(?t%f8_FK%pYotHv72#K;`QmfKOiN8T(Aaci(?;471 z#^^X85Wh{sUDQp*o)o~mM`5?<=BuN5v77umqwj+YBkIeZ0prQTp6UlehVeV|rJmT_ zi6A9<$n`BRWE1B2Te3zG3x&hmIzh8m=#|L5%O-8Y^Y6o|@;49GJt72~mM|tKKBnO} zHcNGM5bh9YT*y`c%2$^J#wA8)p#71XFk)@3&Lc+-5Y`kh!|+E0U@dxbMxojB+}E0+ za9}9xM(m=Ht{s;pxe+01Qs(>>_TMg7?tZbkjCFFCGlA?)y=A&=dh5mNXDUz-|2$4)_GTjk5Qep?v5-q#% zT1|N>_7BUHN}@`%A&K9AXjDcxJ}>TZp z{U%GjfyfLsI+c=lmv)=}ZSXo5s-l%7!D4-;o~_@W3qdwYr_@(?`~GKeuQ7_$S{R8! zFfJaBN=to%c5@#W?1zHzN`y&wn48F%z?FR3^P6=c_j696+|*(%C#6BrSdy7Ei?-wu zZklfAF>k2mo8IuZFWB`)H{;*QoNd}4~d8n911ER(i*Mix|AIa&ZmkV z-rx3Jse%>$II$Oh?HXsmN#1-%Yuza5iSqmXHBiW%fu3}9yn{{h@@k4>KQ2V9$5Uj> zUWGK*E>zlrz$Kn=IK6sj^)SlbpAy<<qRHuR{LVspz;GW>)F z8Dt>e(Iv&SYYEKO5*t<|CLlh_@t04Da0lfr+Lp7dnK)RVlu?x3471lon5oC~Hjh7FsjqEX~wZ98t2s&t23g)#}oG&!{XhM1Q=UNfl*WFMcn7-W5se1_y*@kvooL5%F2H)f)vHUjjS&G>4R`=B2QavKN zmxPRu&pMX_3f;$I8*5A?DL3#OAKc`t`kGy%4)8i>;xbv(bpmSBWJzObWxA-E4hiI? zRM<+#8vE@#$}=bR1gP8_UaHjOINyJgOZjLu(qH2hl>081;szOy$br4-V-ZRz?;eKb z?pMl6iLX{Av_*OT!41j_ZS<_5La`6BKj#UFO3+k=r2ji()+q!&xF-zap5XBN>|{ET zDzzqZQ^YzkQR_$`_^7g_YK3szTqXrji469fFskwgqToN*aC4#btlcHN_&T%tA}JOh zvK|I556|QWce-9KOILn&Oq1nGM%p-hfl@w!rQONy`cIYB_;aXiQ8y8EIoOQX6=9^# zZ`c2GaFc9ezInK=zdo3Ip&~>& zPt|^xM}}(h2#MH+Y)_eo?=Yeejj#MBxWdjbl~zbP)`@fuDjQ)|%kk_$N0d|@qt_;w zjMHCRdKae_s!~>`n&~&jhc%c2Mhtz z6@}ekKc4|Cd@(f?;+wd<>v{qz0%pYTYt}J@!yw)in zN?bhs2l#DV2EZ}zlgBq}va=etV_5qs`Bpg&l}hcX-Uq6tzuHj*y5GNqF(v;)rh^#r z9Zqp4ufvoBd-H;Xm(!iXJp7mp@|`P$L2JYw7JS6mgq#bn>rbiq@UMG!A*J-lCx!0y z@)M9+6>Js!NFM)9!3xc-)S?8$vqnE{?qh!v0Fu3$E-3?sJkRj;iIjcXohu5$KAQJb zq^>WxCZ@|k3NG0CIJ}x{3Z_4QJl>V{_(k*Qr{FIs*h5JM3X?%eg5JF1pC!zz3WtHt z03WABry4Tte`U`5bLL;@768g6vH{v^5U$X+EbFO%(P72@_T$0ub&$nn((pXA1 z{fGGev&hj=K8p9ri`wPFWB$&(hvCUX(2s{_%KCaYjW>2Ta^3;CRsfw>)kMhlyhj~U znAi_rB!d)nX( zaEC)P^X^w0V$E5%@|&ivHn2gutpaGsLaW-*@Wv|>JH7cb>JO1F2rKbBoh-B`R|^a+ z335Lk^mx0O4m=ABC*TVGUC;its>)`qu!rub71?+>MLl{lXJ6}e8f!)R*I3FC#d_)Y z1v>QOaL=~pL#pCgFTHn&WzUV|i_4>%pNU)w81Rdp*jtHM&g24cc~8Uc35j44F$GktIGWk%9?T(BjUf z^VOFtiw<6eO#0vQpu2TwYV-S2-y6kZB{}nc)Dm6^TCdb8H(Q;IVq!MYUAS_}Q*P{T zc+^41nPW+vZA|)3``1&Y!j)^;NszSD|L?n-Vf{{8*3~pYD05Fm5>t+~A!py&o?h6u zLcg(A;-vWlhqJGAUxmu4jA=f<*=kGD*}N_d5SIqrdYhcHfdN%M-MPx&rTW1$6%)?x zWSu8FEkjRJe#JvX5UKXZ(36;!p@?|_&zucgcfc{4l|F7}zo5a%swlmDqLuh?56)*6T3!k-z;CCoIrow1%S>%~odP*vaf&s1#_> znMbdN;|aoM-N5H5Da>4XD8iF4GyQO@%QQ}WI@qaH z=-ofhq}lzUs{ECx^S!y)0MhWRDb&fVo=>5petR4&N{9Lk=QaDU1UVl?{4MWCYh#P% z(l6u@XS?~6*^0N25}N@Csy}n}m<}l&-9t-Ig}AN+R6f|arl*XM`Yr|l%N(7QTi)Crp1iS5h?6`G2=KWxR|uNWWEaW_ z>zlbbJ&q3J*dmPPwv@eR2)ulGJtgWL`K@-JoLlR_+RP}?3D@}!YtXT^IS+Y)jdVAW z5`T!HruSgslT|WCBPq07nR!Q`27v;Cg+Gk)Mu=rtJR?P|` zJ)8f%+UdwG#XF`5ssDy>*R^i znJ{?qpyrjWr)Iil7Dl4Yfpiz0sYLf!t(BZ>t71Dlwsb16|KdecJsPR|{VOl7@^@pW zFNWuvW-Y=m`!+C#LaPPkPg0SaX5<;?M z@XYL{`>&K7e0UZ$=fv_-o1iTv5gO~nomQ;dc~AbJNGGxB9NLh4b1=)m`i)OvcrRj% zhvu)&oXE8OVc#V;nTbE}`DXNBB3A&}RzAJiAZ+PS3aQBeCG&ISS#X5URHYc644)4m z1hzj96_H20UZ%Q^RsXd6G+krJG>`oJS(5n0yfjwKQs{pcaZF<|=%{G?VFRWsY#|Hpj%#un@CKzs z+6?YGy&qAxy*xizXGQ;XGawDEZ+Cc*+JA#(8nVP5jI9V6O5D<;cI`{7*#sp>`+erB ztXh$|pKeksUmWTsAwMwpL-SEUEq0r~d1Uh$E2U#zH=0UbVqHFW|k#@pa-)?!#kq1ihiGq$9*zQZ_KvRY7#YdJXiRi}V8 z_Z^?oWF-H7>0DbjB<~EZQm4Rx>!_;gFrJ|JWBzXzS=WNZ+!4hO$0(i{p@Y%f>}Nmo z3+MjEZ%RDje5A8rw);DT;Ig})SF`vzDzoXU5=Q_5*@)W$i#395 zKpiEiI3lPGk$qH#KQRg5tpbQ=*(n` z?;Xo6Y=qOKRx1fsz@^ikEa5HJ8KOdoNdKNnNcNlq67C3!))d=QTp9PlW4Woq%wC%3 zCI5$DAb$O(1UC$cLY#*}KvkJtAl!uf*OKS24}}sqilwN=u}np2g63LD3f~Cui%zR> ziX0U9jt9fY#G~Y$dKrJCY?d~5>Zf)OtQ1Ci1Z@v|eVyXPF4#*Yq%W^w0$It9GP5dy z4K!TGVv@CVQ(+B7|JzdNgwL{rfY9wzafb5-)w|cM89(N0I+DLUw>PK~E4Sd{nGS8t zv0m4r)UQGS?2MZ25i|@m?|NJmasLXlyPklzD7SKMT#E0~8s}|8iIsKV{%rhlD?2`5 zuQs!rmE#wH?ek-UFlXT^)3j&n17F?2CP1>d@~86$5GT1Kz>^XDpFY2uKCf*3dKOjw z{FEB`dEwEck1w>ZE3JiX^=#!*Aq|1CkgyXcV8k-<4UuZmjZTHLrViY_S1CD?=Gf+; zXU3FzmCqKQ#(eX%RKlD%22K02(RDoMM4(^9^{CzDuH(HuwOkXLk%teYxKbf%e!3or zl9TRGdI_ZW{ghdL`^J|F(=N;$J^Z$?V#Zs)PM4KYy!}w9r(qG&Gv(6bOmjze9@)r2 z1;RsP<;WPPS1LU_Yi`ya+jj-Np^b{B8!d4cbH}?~Kb%haz>%5NG)S?3*Q~q~R`t6t zzi}QZf#K`GW5Z^?$�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 Date: Tue, 6 Apr 2021 21:27:15 +0200 Subject: [PATCH 7/7] fix: incorrectly caching png file handle (#3407) --- src/components/ErrorDialog.tsx | 9 +-------- src/data/blob.ts | 2 +- 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/src/components/ErrorDialog.tsx b/src/components/ErrorDialog.tsx index fbd8e48cf..2886222c7 100644 --- a/src/components/ErrorDialog.tsx +++ b/src/components/ErrorDialog.tsx @@ -28,14 +28,7 @@ export const ErrorDialog = ({ onCloseRequest={handleClose} title={t("errorDialog.title")} > -
    - {message.split("\n").map((line) => ( - <> - {line} -
    - - ))} -
    +
    {message}
    )} diff --git a/src/data/blob.ts b/src/data/blob.ts index 0702436f4..0a0650388 100644 --- a/src/data/blob.ts +++ b/src/data/blob.ts @@ -95,7 +95,7 @@ export const loadFromBlob = async ( elements: clearElementsForExport(data.elements || []), appState: { theme: localAppState?.theme, - fileHandle: blob.handle ?? null, + fileHandle: (!blob.type.startsWith("image/") && blob.handle) || null, ...cleanAppStateForExport(data.appState || {}), ...(localAppState ? calculateScrollCenter(data.elements || [], localAppState, null)