Browse Source

support embedding scene data to PNG/SVG (#2219)

Co-authored-by: Lipis <lipiridis@gmail.com>
vanilla_orig
David Luzar 3 years ago
parent
commit
5950fa9a40
No account linked to committer's email address

+ 3
- 0
CHANGELOG.md View File

@@ -0,0 +1,3 @@
1
+## 2020-10-13
2
+
3
+- Added ability to embed scene source into exported PNG/SVG files so you can import the scene from them (open via `Load` button or drag & drop). #2219

+ 32
- 0
package-lock.json View File

@@ -5901,6 +5901,11 @@
5901 5901
         }
5902 5902
       }
5903 5903
     },
5904
+    "crc-32": {
5905
+      "version": "0.3.0",
5906
+      "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-0.3.0.tgz",
5907
+      "integrity": "sha1-aj02h/W67EH36bmf4ZU6Ll0Zd14="
5908
+    },
5904 5909
     "crc32-stream": {
5905 5910
       "version": "3.0.1",
5906 5911
       "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-3.0.1.tgz",
@@ -17341,6 +17346,28 @@
17341 17346
       "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz",
17342 17347
       "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA=="
17343 17348
     },
17349
+    "png-chunk-text": {
17350
+      "version": "1.0.0",
17351
+      "resolved": "https://registry.npmjs.org/png-chunk-text/-/png-chunk-text-1.0.0.tgz",
17352
+      "integrity": "sha1-HGAG2ONLpHHTjhycVLP1PhCF4Y8="
17353
+    },
17354
+    "png-chunks-encode": {
17355
+      "version": "1.0.0",
17356
+      "resolved": "https://registry.npmjs.org/png-chunks-encode/-/png-chunks-encode-1.0.0.tgz",
17357
+      "integrity": "sha1-2epeNcru7XgmWMGre6+npe2xqHg=",
17358
+      "requires": {
17359
+        "crc-32": "^0.3.0",
17360
+        "sliced": "^1.0.1"
17361
+      }
17362
+    },
17363
+    "png-chunks-extract": {
17364
+      "version": "1.0.0",
17365
+      "resolved": "https://registry.npmjs.org/png-chunks-extract/-/png-chunks-extract-1.0.0.tgz",
17366
+      "integrity": "sha1-+tSpBeZmUhlzUcZeNbksZDEeRy0=",
17367
+      "requires": {
17368
+        "crc-32": "^0.3.0"
17369
+      }
17370
+    },
17344 17371
     "pnp-webpack-plugin": {
17345 17372
       "version": "1.6.4",
17346 17373
       "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz",
@@ -20125,6 +20152,11 @@
20125 20152
         }
20126 20153
       }
20127 20154
     },
20155
+    "sliced": {
20156
+      "version": "1.0.1",
20157
+      "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz",
20158
+      "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E="
20159
+    },
20128 20160
     "snapdragon": {
20129 20161
       "version": "0.8.2",
20130 20162
       "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",

+ 3
- 0
package.json View File

@@ -35,6 +35,9 @@
35 35
     "nanoid": "2.1.11",
36 36
     "node-sass": "4.14.1",
37 37
     "open-color": "1.7.0",
38
+    "png-chunk-text": "1.0.0",
39
+    "png-chunks-encode": "1.0.0",
40
+    "png-chunks-extract": "1.0.0",
38 41
     "points-on-curve": "0.2.0",
39 42
     "pwacompat": "2.0.17",
40 43
     "react": "16.13.1",

+ 20
- 0
src/actions/actionExport.tsx View File

@@ -43,6 +43,26 @@ export const actionChangeExportBackground = register({
43 43
   ),
44 44
 });
45 45
 
46
+export const actionChangeExportEmbedScene = register({
47
+  name: "changeExportEmbedScene",
48
+  perform: (_elements, appState, value) => {
49
+    return {
50
+      appState: { ...appState, exportEmbedScene: value },
51
+      commitToHistory: false,
52
+    };
53
+  },
54
+  PanelComponent: ({ appState, updateData }) => (
55
+    <label title={t("labels.exportEmbedScene_details")}>
56
+      <input
57
+        type="checkbox"
58
+        checked={appState.exportEmbedScene}
59
+        onChange={(event) => updateData(event.target.checked)}
60
+      />{" "}
61
+      {t("labels.exportEmbedScene")}
62
+    </label>
63
+  ),
64
+});
65
+
46 66
 export const actionChangeShouldAddWatermark = register({
47 67
   name: "changeShouldAddWatermark",
48 68
   perform: (_elements, appState, value) => {

+ 1
- 0
src/actions/types.ts View File

@@ -44,6 +44,7 @@ export type ActionName =
44 44
   | "finalize"
45 45
   | "changeProjectName"
46 46
   | "changeExportBackground"
47
+  | "changeExportEmbedScene"
47 48
   | "changeShouldAddWatermark"
48 49
   | "saveScene"
49 50
   | "saveAsScene"

+ 2
- 0
src/appState.ts View File

@@ -25,6 +25,7 @@ export const getDefaultAppState = (): Omit<
25 25
     elementType: "selection",
26 26
     elementLocked: false,
27 27
     exportBackground: true,
28
+    exportEmbedScene: false,
28 29
     shouldAddWatermark: false,
29 30
     currentItemStrokeColor: oc.black,
30 31
     currentItemBackgroundColor: "transparent",
@@ -112,6 +113,7 @@ const APP_STATE_STORAGE_CONF = (<
112 113
   elementType: { browser: true, export: false },
113 114
   errorMessage: { browser: false, export: false },
114 115
   exportBackground: { browser: true, export: false },
116
+  exportEmbedScene: { browser: true, export: false },
115 117
   gridSize: { browser: true, export: true },
116 118
   height: { browser: false, export: false },
117 119
   isBindingEnabled: { browser: false, export: false },

+ 40
- 0
src/base64.ts View File

@@ -0,0 +1,40 @@
1
+// `btoa(unescape(encodeURIComponent(str)))` hack doesn't work in edge cases and
2
+// `unescape` API shouldn't be used anyway.
3
+// This implem is ~10x faster than using fromCharCode in a loop (in Chrome).
4
+const stringToByteString = (str: string): Promise<string> => {
5
+  return new Promise((resolve, reject) => {
6
+    const blob = new Blob([new TextEncoder().encode(str)]);
7
+    const reader = new FileReader();
8
+    reader.onload = function (event) {
9
+      if (!event.target || typeof event.target.result !== "string") {
10
+        return reject(new Error("couldn't convert to byte string"));
11
+      }
12
+      resolve(event.target.result);
13
+    };
14
+    reader.readAsBinaryString(blob);
15
+  });
16
+};
17
+
18
+function byteStringToArrayBuffer(byteString: string) {
19
+  const buffer = new ArrayBuffer(byteString.length);
20
+  const bufferView = new Uint8Array(buffer);
21
+  for (let i = 0, len = byteString.length; i < len; i++) {
22
+    bufferView[i] = byteString.charCodeAt(i);
23
+  }
24
+  return buffer;
25
+}
26
+
27
+const byteStringToString = (byteString: string) => {
28
+  return new TextDecoder("utf-8").decode(byteStringToArrayBuffer(byteString));
29
+};
30
+
31
+// -----------------------------------------------------------------------------
32
+
33
+export const stringToBase64 = async (str: string) => {
34
+  return btoa(await stringToByteString(str));
35
+};
36
+
37
+// async to align with stringToBase64
38
+export const base64ToString = async (base64: string) => {
39
+  return byteStringToString(atob(base64));
40
+};

+ 24
- 4
src/components/App.tsx View File

@@ -125,6 +125,7 @@ import {
125 125
   DEFAULT_VERTICAL_ALIGN,
126 126
   GRID_SIZE,
127 127
   LOCAL_STORAGE_KEY_COLLAB_FORCE_FLAG,
128
+  MIME_TYPES,
128 129
 } from "../constants";
129 130
 import {
130 131
   INITIAL_SCENE_UPDATE_TIMEOUT,
@@ -3788,9 +3789,28 @@ class App extends React.Component<ExcalidrawProps, AppState> {
3788 3789
   private handleCanvasOnDrop = async (
3789 3790
     event: React.DragEvent<HTMLCanvasElement>,
3790 3791
   ) => {
3791
-    const libraryShapes = event.dataTransfer.getData(
3792
-      "application/vnd.excalidrawlib+json",
3793
-    );
3792
+    try {
3793
+      const file = event.dataTransfer.files[0];
3794
+      if (file?.type === "image/png" || file?.type === "image/svg+xml") {
3795
+        const { elements, appState } = await loadFromBlob(file, this.state);
3796
+        this.syncActionResult({
3797
+          elements,
3798
+          appState: {
3799
+            ...(appState || this.state),
3800
+            isLoading: false,
3801
+          },
3802
+          commitToHistory: true,
3803
+        });
3804
+        return;
3805
+      }
3806
+    } catch (error) {
3807
+      return this.setState({
3808
+        isLoading: false,
3809
+        errorMessage: error.message,
3810
+      });
3811
+    }
3812
+
3813
+    const libraryShapes = event.dataTransfer.getData(MIME_TYPES.excalidraw);
3794 3814
     if (libraryShapes !== "") {
3795 3815
       this.addElementsFromPasteOrLibrary(
3796 3816
         JSON.parse(libraryShapes),
@@ -3835,7 +3855,7 @@ class App extends React.Component<ExcalidrawProps, AppState> {
3835 3855
           this.setState({ isLoading: false, errorMessage: error.message });
3836 3856
         });
3837 3857
     } else if (
3838
-      file?.type === "application/vnd.excalidrawlib+json" ||
3858
+      file?.type === MIME_TYPES.excalidrawlib ||
3839 3859
       file?.name.endsWith(".excalidrawlib")
3840 3860
     ) {
3841 3861
       Library.importLibrary(file)

+ 1
- 0
src/components/ExportDialog.tsx View File

@@ -156,6 +156,7 @@ const ExportModal = ({
156 156
           </Stack.Row>
157 157
         </div>
158 158
         {actionManager.renderAction("changeExportBackground")}
159
+        {actionManager.renderAction("changeExportEmbedScene")}
159 160
         {someElementIsSelected && (
160 161
           <div>
161 162
             <label>

+ 2
- 1
src/components/LibraryUnit.tsx View File

@@ -6,6 +6,7 @@ import "./LibraryUnit.scss";
6 6
 import { t } from "../i18n";
7 7
 import useIsMobile from "../is-mobile";
8 8
 import { LibraryItem } from "../types";
9
+import { MIME_TYPES } from "../constants";
9 10
 
10 11
 // fa-plus
11 12
 const PLUS_ICON = (
@@ -78,7 +79,7 @@ export const LibraryUnit = ({
78 79
         onDragStart={(event) => {
79 80
           setIsHovered(false);
80 81
           event.dataTransfer.setData(
81
-            "application/vnd.excalidrawlib+json",
82
+            MIME_TYPES.excalidrawlib,
82 83
             JSON.stringify(elements),
83 84
           );
84 85
         }}

+ 5
- 0
src/constants.ts View File

@@ -84,3 +84,8 @@ export const CANVAS_ONLY_ACTIONS = ["selectAll"];
84 84
 export const GRID_SIZE = 20; // TODO make it configurable?
85 85
 
86 86
 export const LOCAL_STORAGE_KEY_COLLAB_FORCE_FLAG = "collabLinkForceLoadFlag";
87
+
88
+export const MIME_TYPES = {
89
+  excalidraw: "application/vnd.excalidraw+json",
90
+  excalidrawlib: "application/vnd.excalidrawlib+json",
91
+};

+ 45
- 14
src/data/blob.ts View File

@@ -4,21 +4,52 @@ import { t } from "../i18n";
4 4
 import { AppState } from "../types";
5 5
 import { LibraryData, ImportedDataState } from "./types";
6 6
 import { calculateScrollCenter } from "../scene";
7
+import { MIME_TYPES } from "../constants";
8
+import { base64ToString } from "../base64";
7 9
 
8
-const loadFileContents = async (blob: any) => {
10
+export const parseFileContents = async (blob: Blob | File) => {
9 11
   let contents: string;
10
-  if ("text" in Blob) {
11
-    contents = await blob.text();
12
+  if (blob.type === "image/png") {
13
+    const { default: decodePng } = await import("png-chunks-extract");
14
+    const { default: tEXt } = await import("png-chunk-text");
15
+    const chunks = decodePng(new Uint8Array(await blob.arrayBuffer()));
16
+
17
+    const metadataChunk = chunks.find((chunk) => chunk.name === "tEXt");
18
+    if (metadataChunk) {
19
+      const metadata = tEXt.decode(metadataChunk.data);
20
+      if (metadata.keyword === MIME_TYPES.excalidraw) {
21
+        return metadata.text;
22
+      }
23
+      throw new Error(t("alerts.imageDoesNotContainScene"));
24
+    } else {
25
+      throw new Error(t("alerts.imageDoesNotContainScene"));
26
+    }
12 27
   } else {
13
-    contents = await new Promise((resolve) => {
14
-      const reader = new FileReader();
15
-      reader.readAsText(blob, "utf8");
16
-      reader.onloadend = () => {
17
-        if (reader.readyState === FileReader.DONE) {
18
-          resolve(reader.result as string);
28
+    if ("text" in Blob) {
29
+      contents = await blob.text();
30
+    } else {
31
+      contents = await new Promise((resolve) => {
32
+        const reader = new FileReader();
33
+        reader.readAsText(blob, "utf8");
34
+        reader.onloadend = () => {
35
+          if (reader.readyState === FileReader.DONE) {
36
+            resolve(reader.result as string);
37
+          }
38
+        };
39
+      });
40
+    }
41
+    if (blob.type === "image/svg+xml") {
42
+      if (contents.includes(`payload-type:${MIME_TYPES.excalidraw}`)) {
43
+        const match = contents.match(
44
+          /<!-- payload-start -->(.+?)<!-- payload-end -->/,
45
+        );
46
+        if (!match) {
47
+          throw new Error(t("alerts.imageDoesNotContainScene"));
19 48
         }
20
-      };
21
-    });
49
+        return base64ToString(match[1]);
50
+      }
51
+      throw new Error(t("alerts.imageDoesNotContainScene"));
52
+    }
22 53
   }
23 54
   return contents;
24 55
 };
@@ -33,7 +64,7 @@ export const loadFromBlob = async (
33 64
     (window as any).handle = blob.handle;
34 65
   }
35 66
 
36
-  const contents = await loadFileContents(blob);
67
+  const contents = await parseFileContents(blob);
37 68
   try {
38 69
     const data: ImportedDataState = JSON.parse(contents);
39 70
     if (data.type !== "excalidraw") {
@@ -57,8 +88,8 @@ export const loadFromBlob = async (
57 88
   }
58 89
 };
59 90
 
60
-export const loadLibraryFromBlob = async (blob: any) => {
61
-  const contents = await loadFileContents(blob);
91
+export const loadLibraryFromBlob = async (blob: Blob) => {
92
+  const contents = await parseFileContents(blob);
62 93
   const data: LibraryData = JSON.parse(contents);
63 94
   if (data.type !== "excalidrawlib") {
64 95
     throw new Error(t("alerts.couldNotLoadInvalidFile"));

+ 27
- 1
src/data/index.ts View File

@@ -19,6 +19,8 @@ import { serializeAsJSON } from "./json";
19 19
 import { ExportType } from "../scene/types";
20 20
 import { restore } from "./restore";
21 21
 import { ImportedDataState } from "./types";
22
+import { MIME_TYPES } from "../constants";
23
+import { stringToBase64 } from "../base64";
22 24
 
23 25
 export { loadFromBlob } from "./blob";
24 26
 export { saveAsJSON, loadFromJSON } from "./json";
@@ -300,11 +302,21 @@ export const exportCanvas = async (
300 302
     return window.alert(t("alerts.cannotExportEmptyCanvas"));
301 303
   }
302 304
   if (type === "svg" || type === "clipboard-svg") {
305
+    let metadata = "";
306
+
307
+    if (appState.exportEmbedScene && type === "svg") {
308
+      metadata += `<!-- payload-type:${MIME_TYPES.excalidraw} -->`;
309
+      metadata += "<!-- payload-start -->";
310
+      metadata += await stringToBase64(serializeAsJSON(elements, appState));
311
+      metadata += "<!-- payload-end -->";
312
+    }
313
+
303 314
     const tempSvg = exportToSvg(elements, {
304 315
       exportBackground,
305 316
       viewBackgroundColor,
306 317
       exportPadding,
307 318
       shouldAddWatermark,
319
+      metadata,
308 320
     });
309 321
     if (type === "svg") {
310 322
       await fileSave(new Blob([tempSvg.outerHTML], { type: "image/svg+xml" }), {
@@ -330,8 +342,22 @@ export const exportCanvas = async (
330 342
 
331 343
   if (type === "png") {
332 344
     const fileName = `${name}.png`;
333
-    tempCanvas.toBlob(async (blob: any) => {
345
+    tempCanvas.toBlob(async (blob) => {
334 346
       if (blob) {
347
+        if (appState.exportEmbedScene) {
348
+          const { default: tEXt } = await import("png-chunk-text");
349
+          const { default: encodePng } = await import("png-chunks-encode");
350
+          const { default: decodePng } = await import("png-chunks-extract");
351
+          const chunks = decodePng(new Uint8Array(await blob.arrayBuffer()));
352
+          const metadata = tEXt.encode(
353
+            MIME_TYPES.excalidraw,
354
+            serializeAsJSON(elements, appState),
355
+          );
356
+          // insert metadata before last chunk (iEND)
357
+          chunks.splice(-1, 0, metadata);
358
+          blob = new Blob([encodePng(chunks)], { type: "image/png" });
359
+        }
360
+
335 361
         await fileSave(blob, {
336 362
           fileName: fileName,
337 363
           extensions: [".png"],

+ 4
- 3
src/data/json.ts View File

@@ -6,6 +6,7 @@ import { fileOpen, fileSave } from "browser-nativefs";
6 6
 import { loadFromBlob } from "./blob";
7 7
 import { loadLibrary } from "./localStorage";
8 8
 import { Library } from "./library";
9
+import { MIME_TYPES } from "../constants";
9 10
 
10 11
 export const serializeAsJSON = (
11 12
   elements: readonly ExcalidrawElement[],
@@ -48,8 +49,8 @@ export const saveAsJSON = async (
48 49
 export const loadFromJSON = async (localAppState: AppState) => {
49 50
   const blob = await fileOpen({
50 51
     description: "Excalidraw files",
51
-    extensions: [".json", ".excalidraw"],
52
-    mimeTypes: ["application/json"],
52
+    extensions: [".json", ".excalidraw", ".png", ".svg"],
53
+    mimeTypes: ["application/json", "image/png", "image/svg+xml"],
53 54
   });
54 55
   return loadFromBlob(blob, localAppState);
55 56
 };
@@ -76,7 +77,7 @@ export const saveLibraryAsJSON = async () => {
76 77
   );
77 78
   const fileName = "library.excalidrawlib";
78 79
   const blob = new Blob([serialized], {
79
-    type: "application/vnd.excalidrawlib+json",
80
+    type: MIME_TYPES.excalidrawlib,
80 81
   });
81 82
   await fileSave(blob, {
82 83
     fileName,

+ 22
- 0
src/global.d.ts View File

@@ -41,6 +41,28 @@ type ResolutionType<T extends (...args: any) => any> = T extends (
41 41
 // https://github.com/krzkaczor/ts-essentials
42 42
 type MarkOptional<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>;
43 43
 
44
+// PNG encoding/decoding
45
+// -----------------------------------------------------------------------------
46
+type TEXtChunk = { name: "tEXt"; data: Uint8Array };
47
+
48
+declare module "png-chunk-text" {
49
+  function encode(
50
+    name: string,
51
+    value: string,
52
+  ): { name: "tEXt"; data: Uint8Array };
53
+  function decode(data: Uint8Array): { keyword: string; text: string };
54
+}
55
+declare module "png-chunks-encode" {
56
+  function encode(chunks: TEXtChunk[]): Uint8Array;
57
+  export = encode;
58
+}
59
+declare module "png-chunks-extract" {
60
+  function extract(buffer: Uint8Array): TEXtChunk[];
61
+  export = extract;
62
+}
63
+// -----------------------------------------------------------------------------
64
+
65
+// -----------------------------------------------------------------------------
44 66
 // type getter for interface's callable type
45 67
 // src: https://stackoverflow.com/a/58658851/927631
46 68
 // -----------------------------------------------------------------------------

+ 1
- 1
src/index-node.ts View File

@@ -75,7 +75,7 @@ const canvas = exportToCanvas(
75 75
 
76 76
 const fs = require("fs");
77 77
 const out = fs.createWriteStream("test.png");
78
-const stream = canvas.createPNGStream();
78
+const stream = (canvas as any).createPNGStream();
79 79
 stream.pipe(out);
80 80
 out.on("finish", () => {
81 81
   console.info("test.png was created.");

+ 5
- 1
src/locales/en.json View File

@@ -32,6 +32,8 @@
32 32
     "fontFamily": "Font family",
33 33
     "onlySelected": "Only selected",
34 34
     "withBackground": "With Background",
35
+    "exportEmbedScene": "Embed scene into exported file",
36
+    "exportEmbedScene_details": "Scene data will be saved into the exported PNG/SVG file so that the scene can be restored from it.\nWill increase exported file size.",
35 37
     "addWatermark": "Add \"Made with Excalidraw\"",
36 38
     "handDrawn": "Hand-drawn",
37 39
     "normal": "Normal",
@@ -115,7 +117,9 @@
115 117
     "uploadedSecurly": "The upload has been secured with end-to-end encryption, which means that Excalidraw server and third parties can't read the content.",
116 118
     "loadSceneOverridePrompt": "Loading external drawing will replace your existing content. Do you wish to continue?",
117 119
     "errorLoadingLibrary": "There was an error loading the third party library.",
118
-    "confirmAddLibrary": "This will add {{numShapes}} shape(s) to your library. Are you sure?"
120
+    "confirmAddLibrary": "This will add {{numShapes}} shape(s) to your library. Are you sure?",
121
+    "imageDoesNotContainScene": "Image file doesn't contain scene data. Have you enabled this during export?",
122
+    "cannotRestoreFromImage": "Scene couldn't be restored from this image file"
119 123
   },
120 124
   "toolBar": {
121 125
     "selection": "Selection",

+ 8
- 2
src/scene/export.ts View File

@@ -29,7 +29,10 @@ export const exportToCanvas = (
29 29
     viewBackgroundColor: string;
30 30
     shouldAddWatermark: boolean;
31 31
   },
32
-  createCanvas: (width: number, height: number) => any = (width, height) => {
32
+  createCanvas: (width: number, height: number) => HTMLCanvasElement = (
33
+    width,
34
+    height,
35
+  ) => {
33 36
     const tempCanvas = document.createElement("canvas");
34 37
     tempCanvas.width = width * scale;
35 38
     tempCanvas.height = height * scale;
@@ -44,7 +47,7 @@ export const exportToCanvas = (
44 47
     shouldAddWatermark,
45 48
   );
46 49
 
47
-  const tempCanvas: any = createCanvas(width, height);
50
+  const tempCanvas = createCanvas(width, height);
48 51
 
49 52
   renderScene(
50 53
     sceneElements,
@@ -81,11 +84,13 @@ export const exportToSvg = (
81 84
     exportPadding = 10,
82 85
     viewBackgroundColor,
83 86
     shouldAddWatermark,
87
+    metadata = "",
84 88
   }: {
85 89
     exportBackground: boolean;
86 90
     exportPadding?: number;
87 91
     viewBackgroundColor: string;
88 92
     shouldAddWatermark: boolean;
93
+    metadata?: string;
89 94
   },
90 95
 ): SVGSVGElement => {
91 96
   const sceneElements = getElementsAndWatermark(elements, shouldAddWatermark);
@@ -104,6 +109,7 @@ export const exportToSvg = (
104 109
 
105 110
   svgRoot.innerHTML = `
106 111
   ${SVG_EXPORT_TAG}
112
+  ${metadata}
107 113
   <defs>
108 114
     <style>
109 115
       @font-face {

+ 83
- 0
src/tests/__snapshots__/regressionTests.test.tsx.snap View File

@@ -27,6 +27,7 @@ Object {
27 27
   "elementType": "selection",
28 28
   "errorMessage": null,
29 29
   "exportBackground": true,
30
+  "exportEmbedScene": false,
30 31
   "gridSize": null,
31 32
   "height": 768,
32 33
   "isBindingEnabled": true,
@@ -473,6 +474,7 @@ Object {
473 474
   "elementType": "selection",
474 475
   "errorMessage": null,
475 476
   "exportBackground": true,
477
+  "exportEmbedScene": false,
476 478
   "gridSize": null,
477 479
   "height": 768,
478 480
   "isBindingEnabled": true,
@@ -925,6 +927,7 @@ Object {
925 927
   "elementType": "selection",
926 928
   "errorMessage": null,
927 929
   "exportBackground": true,
930
+  "exportEmbedScene": false,
928 931
   "gridSize": null,
929 932
   "height": 768,
930 933
   "isBindingEnabled": false,
@@ -1686,6 +1689,7 @@ Object {
1686 1689
   "elementType": "selection",
1687 1690
   "errorMessage": null,
1688 1691
   "exportBackground": true,
1692
+  "exportEmbedScene": false,
1689 1693
   "gridSize": null,
1690 1694
   "height": 768,
1691 1695
   "isBindingEnabled": true,
@@ -1875,6 +1879,7 @@ Object {
1875 1879
   "elementType": "selection",
1876 1880
   "errorMessage": null,
1877 1881
   "exportBackground": true,
1882
+  "exportEmbedScene": false,
1878 1883
   "gridSize": null,
1879 1884
   "height": 768,
1880 1885
   "isBindingEnabled": true,
@@ -2318,6 +2323,7 @@ Object {
2318 2323
   "elementType": "selection",
2319 2324
   "errorMessage": null,
2320 2325
   "exportBackground": true,
2326
+  "exportEmbedScene": false,
2321 2327
   "gridSize": null,
2322 2328
   "height": 768,
2323 2329
   "isBindingEnabled": true,
@@ -2556,6 +2562,7 @@ Object {
2556 2562
   "elementType": "selection",
2557 2563
   "errorMessage": null,
2558 2564
   "exportBackground": true,
2565
+  "exportEmbedScene": false,
2559 2566
   "gridSize": null,
2560 2567
   "height": 768,
2561 2568
   "isBindingEnabled": true,
@@ -2705,6 +2712,7 @@ Object {
2705 2712
   "elementType": "selection",
2706 2713
   "errorMessage": null,
2707 2714
   "exportBackground": true,
2715
+  "exportEmbedScene": false,
2708 2716
   "gridSize": null,
2709 2717
   "height": 768,
2710 2718
   "isBindingEnabled": true,
@@ -3167,6 +3175,7 @@ Object {
3167 3175
   "elementType": "selection",
3168 3176
   "errorMessage": null,
3169 3177
   "exportBackground": true,
3178
+  "exportEmbedScene": false,
3170 3179
   "gridSize": null,
3171 3180
   "height": 768,
3172 3181
   "isBindingEnabled": true,
@@ -3460,6 +3469,7 @@ Object {
3460 3469
   "elementType": "selection",
3461 3470
   "errorMessage": null,
3462 3471
   "exportBackground": true,
3472
+  "exportEmbedScene": false,
3463 3473
   "gridSize": null,
3464 3474
   "height": 768,
3465 3475
   "isBindingEnabled": true,
@@ -3649,6 +3659,7 @@ Object {
3649 3659
   "elementType": "selection",
3650 3660
   "errorMessage": null,
3651 3661
   "exportBackground": true,
3662
+  "exportEmbedScene": false,
3652 3663
   "gridSize": null,
3653 3664
   "height": 768,
3654 3665
   "isBindingEnabled": true,
@@ -3878,6 +3889,7 @@ Object {
3878 3889
   "elementType": "selection",
3879 3890
   "errorMessage": null,
3880 3891
   "exportBackground": true,
3892
+  "exportEmbedScene": false,
3881 3893
   "gridSize": null,
3882 3894
   "height": 768,
3883 3895
   "isBindingEnabled": true,
@@ -4115,6 +4127,7 @@ Object {
4115 4127
   "elementType": "selection",
4116 4128
   "errorMessage": null,
4117 4129
   "exportBackground": true,
4130
+  "exportEmbedScene": false,
4118 4131
   "gridSize": null,
4119 4132
   "height": 768,
4120 4133
   "isBindingEnabled": true,
@@ -4483,6 +4496,7 @@ Object {
4483 4496
   "elementType": "selection",
4484 4497
   "errorMessage": null,
4485 4498
   "exportBackground": true,
4499
+  "exportEmbedScene": false,
4486 4500
   "gridSize": null,
4487 4501
   "height": 768,
4488 4502
   "isBindingEnabled": true,
@@ -4763,6 +4777,7 @@ Object {
4763 4777
   "elementType": "selection",
4764 4778
   "errorMessage": null,
4765 4779
   "exportBackground": true,
4780
+  "exportEmbedScene": false,
4766 4781
   "gridSize": null,
4767 4782
   "height": 768,
4768 4783
   "isBindingEnabled": true,
@@ -5055,6 +5070,7 @@ Object {
5055 5070
   "elementType": "selection",
5056 5071
   "errorMessage": null,
5057 5072
   "exportBackground": true,
5073
+  "exportEmbedScene": false,
5058 5074
   "gridSize": null,
5059 5075
   "height": 768,
5060 5076
   "isBindingEnabled": true,
@@ -5248,6 +5264,7 @@ Object {
5248 5264
   "elementType": "selection",
5249 5265
   "errorMessage": null,
5250 5266
   "exportBackground": true,
5267
+  "exportEmbedScene": false,
5251 5268
   "gridSize": null,
5252 5269
   "height": 768,
5253 5270
   "isBindingEnabled": true,
@@ -5397,6 +5414,7 @@ Object {
5397 5414
   "elementType": "selection",
5398 5415
   "errorMessage": null,
5399 5416
   "exportBackground": true,
5417
+  "exportEmbedScene": false,
5400 5418
   "gridSize": null,
5401 5419
   "height": 768,
5402 5420
   "isBindingEnabled": true,
@@ -5835,6 +5853,7 @@ Object {
5835 5853
   "elementType": "selection",
5836 5854
   "errorMessage": null,
5837 5855
   "exportBackground": true,
5856
+  "exportEmbedScene": false,
5838 5857
   "gridSize": null,
5839 5858
   "height": 768,
5840 5859
   "isBindingEnabled": true,
@@ -6138,6 +6157,7 @@ Object {
6138 6157
   "elementType": "selection",
6139 6158
   "errorMessage": null,
6140 6159
   "exportBackground": true,
6160
+  "exportEmbedScene": false,
6141 6161
   "gridSize": null,
6142 6162
   "height": 768,
6143 6163
   "isBindingEnabled": true,
@@ -8103,6 +8123,7 @@ Object {
8103 8123
   "elementType": "selection",
8104 8124
   "errorMessage": null,
8105 8125
   "exportBackground": true,
8126
+  "exportEmbedScene": false,
8106 8127
   "gridSize": null,
8107 8128
   "height": 768,
8108 8129
   "isBindingEnabled": true,
@@ -8450,6 +8471,7 @@ Object {
8450 8471
   "elementType": "selection",
8451 8472
   "errorMessage": null,
8452 8473
   "exportBackground": true,
8474
+  "exportEmbedScene": false,
8453 8475
   "gridSize": null,
8454 8476
   "height": 768,
8455 8477
   "isBindingEnabled": true,
@@ -8690,6 +8712,7 @@ Object {
8690 8712
   "elementType": "selection",
8691 8713
   "errorMessage": null,
8692 8714
   "exportBackground": true,
8715
+  "exportEmbedScene": false,
8693 8716
   "gridSize": null,
8694 8717
   "height": 768,
8695 8718
   "isBindingEnabled": true,
@@ -8928,6 +8951,7 @@ Object {
8928 8951
   "elementType": "selection",
8929 8952
   "errorMessage": null,
8930 8953
   "exportBackground": true,
8954
+  "exportEmbedScene": false,
8931 8955
   "gridSize": null,
8932 8956
   "height": 768,
8933 8957
   "isBindingEnabled": true,
@@ -9228,6 +9252,7 @@ Object {
9228 9252
   "elementType": "selection",
9229 9253
   "errorMessage": null,
9230 9254
   "exportBackground": true,
9255
+  "exportEmbedScene": false,
9231 9256
   "gridSize": null,
9232 9257
   "height": 768,
9233 9258
   "isBindingEnabled": true,
@@ -9377,6 +9402,7 @@ Object {
9377 9402
   "elementType": "selection",
9378 9403
   "errorMessage": null,
9379 9404
   "exportBackground": true,
9405
+  "exportEmbedScene": false,
9380 9406
   "gridSize": null,
9381 9407
   "height": 768,
9382 9408
   "isBindingEnabled": true,
@@ -9526,6 +9552,7 @@ Object {
9526 9552
   "elementType": "selection",
9527 9553
   "errorMessage": null,
9528 9554
   "exportBackground": true,
9555
+  "exportEmbedScene": false,
9529 9556
   "gridSize": null,
9530 9557
   "height": 768,
9531 9558
   "isBindingEnabled": true,
@@ -9675,6 +9702,7 @@ Object {
9675 9702
   "elementType": "selection",
9676 9703
   "errorMessage": null,
9677 9704
   "exportBackground": true,
9705
+  "exportEmbedScene": false,
9678 9706
   "gridSize": null,
9679 9707
   "height": 768,
9680 9708
   "isBindingEnabled": true,
@@ -9850,6 +9878,7 @@ Object {
9850 9878
   "elementType": "selection",
9851 9879
   "errorMessage": null,
9852 9880
   "exportBackground": true,
9881
+  "exportEmbedScene": false,
9853 9882
   "gridSize": null,
9854 9883
   "height": 768,
9855 9884
   "isBindingEnabled": true,
@@ -10025,6 +10054,7 @@ Object {
10025 10054
   "elementType": "selection",
10026 10055
   "errorMessage": null,
10027 10056
   "exportBackground": true,
10057
+  "exportEmbedScene": false,
10028 10058
   "gridSize": null,
10029 10059
   "height": 768,
10030 10060
   "isBindingEnabled": true,
@@ -10200,6 +10230,7 @@ Object {
10200 10230
   "elementType": "selection",
10201 10231
   "errorMessage": null,
10202 10232
   "exportBackground": true,
10233
+  "exportEmbedScene": false,
10203 10234
   "gridSize": null,
10204 10235
   "height": 768,
10205 10236
   "isBindingEnabled": true,
@@ -10375,6 +10406,7 @@ Object {
10375 10406
   "elementType": "selection",
10376 10407
   "errorMessage": null,
10377 10408
   "exportBackground": true,
10409
+  "exportEmbedScene": false,
10378 10410
   "gridSize": null,
10379 10411
   "height": 768,
10380 10412
   "isBindingEnabled": true,
@@ -10524,6 +10556,7 @@ Object {
10524 10556
   "elementType": "selection",
10525 10557
   "errorMessage": null,
10526 10558
   "exportBackground": true,
10559
+  "exportEmbedScene": false,
10527 10560
   "gridSize": null,
10528 10561
   "height": 768,
10529 10562
   "isBindingEnabled": true,
@@ -10673,6 +10706,7 @@ Object {
10673 10706
   "elementType": "selection",
10674 10707
   "errorMessage": null,
10675 10708
   "exportBackground": true,
10709
+  "exportEmbedScene": false,
10676 10710
   "gridSize": null,
10677 10711
   "height": 768,
10678 10712
   "isBindingEnabled": true,
@@ -10848,6 +10882,7 @@ Object {
10848 10882
   "elementType": "selection",
10849 10883
   "errorMessage": null,
10850 10884
   "exportBackground": true,
10885
+  "exportEmbedScene": false,
10851 10886
   "gridSize": null,
10852 10887
   "height": 768,
10853 10888
   "isBindingEnabled": true,
@@ -10997,6 +11032,7 @@ Object {
10997 11032
   "elementType": "selection",
10998 11033
   "errorMessage": null,
10999 11034
   "exportBackground": true,
11035
+  "exportEmbedScene": false,
11000 11036
   "gridSize": null,
11001 11037
   "height": 768,
11002 11038
   "isBindingEnabled": true,
@@ -11172,6 +11208,7 @@ Object {
11172 11208
   "elementType": "selection",
11173 11209
   "errorMessage": null,
11174 11210
   "exportBackground": true,
11211
+  "exportEmbedScene": false,
11175 11212
   "gridSize": null,
11176 11213
   "height": 768,
11177 11214
   "isBindingEnabled": true,
@@ -11873,6 +11910,7 @@ Object {
11873 11910
   "elementType": "selection",
11874 11911
   "errorMessage": null,
11875 11912
   "exportBackground": true,
11913
+  "exportEmbedScene": false,
11876 11914
   "gridSize": null,
11877 11915
   "height": 768,
11878 11916
   "isBindingEnabled": true,
@@ -12111,6 +12149,7 @@ Object {
12111 12149
   "elementType": "selection",
12112 12150
   "errorMessage": null,
12113 12151
   "exportBackground": true,
12152
+  "exportEmbedScene": false,
12114 12153
   "gridSize": null,
12115 12154
   "height": 768,
12116 12155
   "isBindingEnabled": true,
@@ -12198,6 +12237,7 @@ Object {
12198 12237
   "elementType": "rectangle",
12199 12238
   "errorMessage": null,
12200 12239
   "exportBackground": true,
12240
+  "exportEmbedScene": false,
12201 12241
   "gridSize": null,
12202 12242
   "height": 768,
12203 12243
   "isBindingEnabled": true,
@@ -12283,6 +12323,7 @@ Object {
12283 12323
   "elementType": "selection",
12284 12324
   "errorMessage": null,
12285 12325
   "exportBackground": true,
12326
+  "exportEmbedScene": false,
12286 12327
   "gridSize": null,
12287 12328
   "height": 768,
12288 12329
   "isBindingEnabled": true,
@@ -13160,6 +13201,7 @@ Object {
13160 13201
   "elementType": "selection",
13161 13202
   "errorMessage": null,
13162 13203
   "exportBackground": true,
13204
+  "exportEmbedScene": false,
13163 13205
   "gridSize": null,
13164 13206
   "height": 768,
13165 13207
   "isBindingEnabled": true,
@@ -13596,6 +13638,7 @@ Object {
13596 13638
   "elementType": "selection",
13597 13639
   "errorMessage": null,
13598 13640
   "exportBackground": true,
13641
+  "exportEmbedScene": false,
13599 13642
   "gridSize": null,
13600 13643
   "height": 768,
13601 13644
   "isBindingEnabled": true,
@@ -13945,6 +13988,7 @@ Object {
13945 13988
   "elementType": "selection",
13946 13989
   "errorMessage": null,
13947 13990
   "exportBackground": true,
13991
+  "exportEmbedScene": false,
13948 13992
   "gridSize": null,
13949 13993
   "height": 768,
13950 13994
   "isBindingEnabled": true,
@@ -14211,6 +14255,7 @@ Object {
14211 14255
   "elementType": "selection",
14212 14256
   "errorMessage": null,
14213 14257
   "exportBackground": true,
14258
+  "exportEmbedScene": false,
14214 14259
   "gridSize": null,
14215 14260
   "height": 768,
14216 14261
   "isBindingEnabled": true,
@@ -14398,6 +14443,7 @@ Object {
14398 14443
   "elementType": "selection",
14399 14444
   "errorMessage": null,
14400 14445
   "exportBackground": true,
14446
+  "exportEmbedScene": false,
14401 14447
   "gridSize": null,
14402 14448
   "height": 768,
14403 14449
   "isBindingEnabled": true,
@@ -15222,6 +15268,7 @@ Object {
15222 15268
   "elementType": "selection",
15223 15269
   "errorMessage": null,
15224 15270
   "exportBackground": true,
15271
+  "exportEmbedScene": false,
15225 15272
   "gridSize": null,
15226 15273
   "height": 768,
15227 15274
   "isBindingEnabled": true,
@@ -15943,6 +15990,7 @@ Object {
15943 15990
   "elementType": "selection",
15944 15991
   "errorMessage": null,
15945 15992
   "exportBackground": true,
15993
+  "exportEmbedScene": false,
15946 15994
   "gridSize": null,
15947 15995
   "height": 768,
15948 15996
   "isBindingEnabled": true,
@@ -16565,6 +16613,7 @@ Object {
16565 16613
   "elementType": "selection",
16566 16614
   "errorMessage": null,
16567 16615
   "exportBackground": true,
16616
+  "exportEmbedScene": false,
16568 16617
   "gridSize": null,
16569 16618
   "height": 768,
16570 16619
   "isBindingEnabled": true,
@@ -17092,6 +17141,7 @@ Object {
17092 17141
   "elementType": "selection",
17093 17142
   "errorMessage": null,
17094 17143
   "exportBackground": true,
17144
+  "exportEmbedScene": false,
17095 17145
   "gridSize": null,
17096 17146
   "height": 768,
17097 17147
   "isBindingEnabled": true,
@@ -17573,6 +17623,7 @@ Object {
17573 17623
   "elementType": "selection",
17574 17624
   "errorMessage": null,
17575 17625
   "exportBackground": true,
17626
+  "exportEmbedScene": false,
17576 17627
   "gridSize": null,
17577 17628
   "height": 768,
17578 17629
   "isBindingEnabled": true,
@@ -17965,6 +18016,7 @@ Object {
17965 18016
   "elementType": "selection",
17966 18017
   "errorMessage": null,
17967 18018
   "exportBackground": true,
18019
+  "exportEmbedScene": false,
17968 18020
   "gridSize": null,
17969 18021
   "height": 768,
17970 18022
   "isBindingEnabled": true,
@@ -18272,6 +18324,7 @@ Object {
18272 18324
   "elementType": "selection",
18273 18325
   "errorMessage": null,
18274 18326
   "exportBackground": true,
18327
+  "exportEmbedScene": false,
18275 18328
   "gridSize": null,
18276 18329
   "height": 768,
18277 18330
   "isBindingEnabled": true,
@@ -18498,6 +18551,7 @@ Object {
18498 18551
   "elementType": "selection",
18499 18552
   "errorMessage": null,
18500 18553
   "exportBackground": true,
18554
+  "exportEmbedScene": false,
18501 18555
   "gridSize": null,
18502 18556
   "height": 768,
18503 18557
   "isBindingEnabled": true,
@@ -19375,6 +19429,7 @@ Object {
19375 19429
   "elementType": "selection",
19376 19430
   "errorMessage": null,
19377 19431
   "exportBackground": true,
19432
+  "exportEmbedScene": false,
19378 19433
   "gridSize": null,
19379 19434
   "height": 768,
19380 19435
   "isBindingEnabled": true,
@@ -20147,6 +20202,7 @@ Object {
20147 20202
   "elementType": "selection",
20148 20203
   "errorMessage": null,
20149 20204
   "exportBackground": true,
20205
+  "exportEmbedScene": false,
20150 20206
   "gridSize": null,
20151 20207
   "height": 768,
20152 20208
   "isBindingEnabled": true,
@@ -20818,6 +20874,7 @@ Object {
20818 20874
   "elementType": "selection",
20819 20875
   "errorMessage": null,
20820 20876
   "exportBackground": true,
20877
+  "exportEmbedScene": false,
20821 20878
   "gridSize": null,
20822 20879
   "height": 768,
20823 20880
   "isBindingEnabled": true,
@@ -21392,6 +21449,7 @@ Object {
21392 21449
   "elementType": "selection",
21393 21450
   "errorMessage": null,
21394 21451
   "exportBackground": true,
21452
+  "exportEmbedScene": false,
21395 21453
   "gridSize": null,
21396 21454
   "height": 768,
21397 21455
   "isBindingEnabled": true,
@@ -21541,6 +21599,7 @@ Object {
21541 21599
   "elementType": "selection",
21542 21600
   "errorMessage": null,
21543 21601
   "exportBackground": true,
21602
+  "exportEmbedScene": false,
21544 21603
   "gridSize": null,
21545 21604
   "height": 768,
21546 21605
   "isBindingEnabled": true,
@@ -21834,6 +21893,7 @@ Object {
21834 21893
   "elementType": "selection",
21835 21894
   "errorMessage": null,
21836 21895
   "exportBackground": true,
21896
+  "exportEmbedScene": false,
21837 21897
   "gridSize": null,
21838 21898
   "height": 768,
21839 21899
   "isBindingEnabled": true,
@@ -22127,6 +22187,7 @@ Object {
22127 22187
   "elementType": "selection",
22128 22188
   "errorMessage": null,
22129 22189
   "exportBackground": true,
22190
+  "exportEmbedScene": false,
22130 22191
   "gridSize": null,
22131 22192
   "height": 768,
22132 22193
   "isBindingEnabled": true,
@@ -22276,6 +22337,7 @@ Object {
22276 22337
   "elementType": "selection",
22277 22338
   "errorMessage": null,
22278 22339
   "exportBackground": true,
22340
+  "exportEmbedScene": false,
22279 22341
   "gridSize": null,
22280 22342
   "height": 768,
22281 22343
   "isBindingEnabled": true,
@@ -22457,6 +22519,7 @@ Object {
22457 22519
   "elementType": "selection",
22458 22520
   "errorMessage": null,
22459 22521
   "exportBackground": true,
22522
+  "exportEmbedScene": false,
22460 22523
   "gridSize": null,
22461 22524
   "height": 768,
22462 22525
   "isBindingEnabled": true,
@@ -22691,6 +22754,7 @@ Object {
22691 22754
   "elementType": "selection",
22692 22755
   "errorMessage": null,
22693 22756
   "exportBackground": true,
22757
+  "exportEmbedScene": false,
22694 22758
   "gridSize": null,
22695 22759
   "height": 768,
22696 22760
   "isBindingEnabled": true,
@@ -23000,6 +23064,7 @@ Object {
23000 23064
   "elementType": "selection",
23001 23065
   "errorMessage": null,
23002 23066
   "exportBackground": true,
23067
+  "exportEmbedScene": false,
23003 23068
   "gridSize": null,
23004 23069
   "height": 768,
23005 23070
   "isBindingEnabled": true,
@@ -23824,6 +23889,7 @@ Object {
23824 23889
   "elementType": "selection",
23825 23890
   "errorMessage": null,
23826 23891
   "exportBackground": true,
23892
+  "exportEmbedScene": false,
23827 23893
   "gridSize": null,
23828 23894
   "height": 768,
23829 23895
   "isBindingEnabled": true,
@@ -24117,6 +24183,7 @@ Object {
24117 24183
   "elementType": "selection",
24118 24184
   "errorMessage": null,
24119 24185
   "exportBackground": true,
24186
+  "exportEmbedScene": false,
24120 24187
   "gridSize": null,
24121 24188
   "height": 768,
24122 24189
   "isBindingEnabled": true,
@@ -24410,6 +24477,7 @@ Object {
24410 24477
   "elementType": "selection",
24411 24478
   "errorMessage": null,
24412 24479
   "exportBackground": true,
24480
+  "exportEmbedScene": false,
24413 24481
   "gridSize": null,
24414 24482
   "height": 768,
24415 24483
   "isBindingEnabled": true,
@@ -24774,6 +24842,7 @@ Object {
24774 24842
   "elementType": "selection",
24775 24843
   "errorMessage": null,
24776 24844
   "exportBackground": true,
24845
+  "exportEmbedScene": false,
24777 24846
   "gridSize": null,
24778 24847
   "height": 768,
24779 24848
   "isBindingEnabled": true,
@@ -24926,6 +24995,7 @@ Object {
24926 24995
   "elementType": "selection",
24927 24996
   "errorMessage": null,
24928 24997
   "exportBackground": true,
24998
+  "exportEmbedScene": false,
24929 24999
   "gridSize": null,
24930 25000
   "height": 768,
24931 25001
   "isBindingEnabled": true,
@@ -25232,6 +25302,7 @@ Object {
25232 25302
   "elementType": "selection",
25233 25303
   "errorMessage": null,
25234 25304
   "exportBackground": true,
25305
+  "exportEmbedScene": false,
25235 25306
   "gridSize": null,
25236 25307
   "height": 768,
25237 25308
   "isBindingEnabled": true,
@@ -25472,6 +25543,7 @@ Object {
25472 25543
   "elementType": "selection",
25473 25544
   "errorMessage": null,
25474 25545
   "exportBackground": true,
25546
+  "exportEmbedScene": false,
25475 25547
   "gridSize": null,
25476 25548
   "height": 768,
25477 25549
   "isBindingEnabled": true,
@@ -25784,6 +25856,7 @@ Object {
25784 25856
   "elementType": "selection",
25785 25857
   "errorMessage": null,
25786 25858
   "exportBackground": true,
25859
+  "exportEmbedScene": false,
25787 25860
   "gridSize": null,
25788 25861
   "height": 768,
25789 25862
   "isBindingEnabled": true,
@@ -25869,6 +25942,7 @@ Object {
25869 25942
   "elementType": "selection",
25870 25943
   "errorMessage": null,
25871 25944
   "exportBackground": true,
25945
+  "exportEmbedScene": false,
25872 25946
   "gridSize": null,
25873 25947
   "height": 768,
25874 25948
   "isBindingEnabled": true,
@@ -26018,6 +26092,7 @@ Object {
26018 26092
   "elementType": "selection",
26019 26093
   "errorMessage": null,
26020 26094
   "exportBackground": true,
26095
+  "exportEmbedScene": false,
26021 26096
   "gridSize": null,
26022 26097
   "height": 768,
26023 26098
   "isBindingEnabled": true,
@@ -26824,6 +26899,7 @@ Object {
26824 26899
   "elementType": "selection",
26825 26900
   "errorMessage": null,
26826 26901
   "exportBackground": true,
26902
+  "exportEmbedScene": false,
26827 26903
   "gridSize": null,
26828 26904
   "height": 768,
26829 26905
   "isBindingEnabled": true,
@@ -26909,6 +26985,7 @@ Object {
26909 26985
   "elementType": "selection",
26910 26986
   "errorMessage": null,
26911 26987
   "exportBackground": true,
26988
+  "exportEmbedScene": false,
26912 26989
   "gridSize": null,
26913 26990
   "height": 768,
26914 26991
   "isBindingEnabled": true,
@@ -27646,6 +27723,7 @@ Object {
27646 27723
   "elementType": "selection",
27647 27724
   "errorMessage": null,
27648 27725
   "exportBackground": true,
27726
+  "exportEmbedScene": false,
27649 27727
   "gridSize": null,
27650 27728
   "height": 768,
27651 27729
   "isBindingEnabled": true,
@@ -28036,6 +28114,7 @@ Object {
28036 28114
   "elementType": "selection",
28037 28115
   "errorMessage": null,
28038 28116
   "exportBackground": true,
28117
+  "exportEmbedScene": false,
28039 28118
   "gridSize": null,
28040 28119
   "height": 768,
28041 28120
   "isBindingEnabled": true,
@@ -28294,6 +28373,7 @@ Object {
28294 28373
   "elementType": "selection",
28295 28374
   "errorMessage": null,
28296 28375
   "exportBackground": true,
28376
+  "exportEmbedScene": false,
28297 28377
   "gridSize": null,
28298 28378
   "height": 768,
28299 28379
   "isBindingEnabled": true,
@@ -28381,6 +28461,7 @@ Object {
28381 28461
   "elementType": "selection",
28382 28462
   "errorMessage": null,
28383 28463
   "exportBackground": true,
28464
+  "exportEmbedScene": false,
28384 28465
   "gridSize": null,
28385 28466
   "height": 768,
28386 28467
   "isBindingEnabled": true,
@@ -28858,6 +28939,7 @@ Object {
28858 28939
   "elementType": "text",
28859 28940
   "errorMessage": null,
28860 28941
   "exportBackground": true,
28942
+  "exportEmbedScene": false,
28861 28943
   "gridSize": null,
28862 28944
   "height": 768,
28863 28945
   "isBindingEnabled": true,
@@ -28943,6 +29025,7 @@ Object {
28943 29025
   "elementType": "selection",
28944 29026
   "errorMessage": null,
28945 29027
   "exportBackground": true,
29028
+  "exportEmbedScene": false,
28946 29029
   "gridSize": null,
28947 29030
   "height": 768,
28948 29031
   "isBindingEnabled": true,

+ 1
- 0
src/types.ts View File

@@ -47,6 +47,7 @@ export type AppState = {
47 47
   elementType: typeof SHAPES[number]["value"];
48 48
   elementLocked: boolean;
49 49
   exportBackground: boolean;
50
+  exportEmbedScene: boolean;
50 51
   shouldAddWatermark: boolean;
51 52
   currentItemStrokeColor: string;
52 53
   currentItemBackgroundColor: string;

Loading…
Cancel
Save